summaryrefslogtreecommitdiff
path: root/Build/source/libs/icu/icu-src/source
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2019-12-12 18:25:29 +0000
committerKarl Berry <karl@freefriends.org>2019-12-12 18:25:29 +0000
commit826971da3ef29f6034fc6a4786f88878a56c58e3 (patch)
tree023539b0120ff775316abf6a86f03c6f1f54b973 /Build/source/libs/icu/icu-src/source
parent15a740f0c75d97855e67ba5bf83612e7b29a1319 (diff)
icu-65.1, including linking upmendex with -lpthread if available
git-svn-id: svn://tug.org/texlive/trunk@53103 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/libs/icu/icu-src/source')
-rw-r--r--Build/source/libs/icu/icu-src/source/aclocal.m48
-rw-r--r--Build/source/libs/icu/icu-src/source/allinone/Build.Windows.Library.ProjectConfiguration.props8
-rw-r--r--Build/source/libs/icu/icu-src/source/allinone/Build.Windows.Library.WarningSettings.ProjectConfiguration.props26
-rw-r--r--Build/source/libs/icu/icu-src/source/allinone/Build.Windows.PlatformToolset.props26
-rw-r--r--Build/source/libs/icu/icu-src/source/allinone/Build.Windows.ProjectConfiguration.props89
-rw-r--r--Build/source/libs/icu/icu-src/source/allinone/Build.Windows.UWP.ProjectConfiguration.props41
-rw-r--r--Build/source/libs/icu/icu-src/source/allinone/allinone.sln288
-rwxr-xr-xBuild/source/libs/icu/icu-src/source/allinone/icucheck.bat10
-rw-r--r--Build/source/libs/icu/icu-src/source/common/Makefile.in5
-rw-r--r--Build/source/libs/icu/icu-src/source/common/brkeng.cpp3
-rw-r--r--Build/source/libs/icu/icu-src/source/common/brkiter.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/bytesinkutil.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/capi_helper.h97
-rw-r--r--Build/source/libs/icu/icu-src/source/common/characterproperties.cpp107
-rw-r--r--Build/source/libs/icu/icu-src/source/common/charstr.cpp23
-rw-r--r--Build/source/libs/icu/icu-src/source/common/charstr.h14
-rw-r--r--Build/source/libs/icu/icu-src/source/common/cmemory.h173
-rw-r--r--Build/source/libs/icu/icu-src/source/common/common.vcxproj136
-rw-r--r--Build/source/libs/icu/icu-src/source/common/common.vcxproj.filters48
-rw-r--r--Build/source/libs/icu/icu-src/source/common/common_uwp.vcxproj187
-rw-r--r--Build/source/libs/icu/icu-src/source/common/dictbe.cpp16
-rw-r--r--Build/source/libs/icu/icu-src/source/common/dictionarydata.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/edits.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/filteredbrk.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/hash.h40
-rw-r--r--Build/source/libs/icu/icu-src/source/common/loadednormalizer2impl.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/localebuilder.cpp468
-rw-r--r--Build/source/libs/icu/icu-src/source/common/localematcher.cpp720
-rw-r--r--Build/source/libs/icu/icu-src/source/common/localeprioritylist.cpp239
-rw-r--r--Build/source/libs/icu/icu-src/source/common/localeprioritylist.h115
-rw-r--r--Build/source/libs/icu/icu-src/source/common/localsvc.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/locavailable.cpp209
-rw-r--r--Build/source/libs/icu/icu-src/source/common/locbased.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/locdispnames.cpp57
-rw-r--r--Build/source/libs/icu/icu-src/source/common/locdistance.cpp364
-rw-r--r--Build/source/libs/icu/icu-src/source/common/locdistance.h109
-rw-r--r--Build/source/libs/icu/icu-src/source/common/locdspnm.cpp102
-rw-r--r--Build/source/libs/icu/icu-src/source/common/locid.cpp226
-rw-r--r--Build/source/libs/icu/icu-src/source/common/loclikely.cpp700
-rw-r--r--Build/source/libs/icu/icu-src/source/common/loclikelysubtags.cpp638
-rw-r--r--Build/source/libs/icu/icu-src/source/common/loclikelysubtags.h143
-rw-r--r--Build/source/libs/icu/icu-src/source/common/locmap.cpp67
-rw-r--r--Build/source/libs/icu/icu-src/source/common/locmap.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/common/locresdata.cpp29
-rw-r--r--Build/source/libs/icu/icu-src/source/common/locutil.cpp6
-rw-r--r--Build/source/libs/icu/icu-src/source/common/lsr.cpp101
-rw-r--r--Build/source/libs/icu/icu-src/source/common/lsr.h72
-rw-r--r--Build/source/libs/icu/icu-src/source/common/mutex.h72
-rw-r--r--Build/source/libs/icu/icu-src/source/common/norm2_nfc_data.h661
-rw-r--r--Build/source/libs/icu/icu-src/source/common/normalizer2impl.cpp3
-rw-r--r--Build/source/libs/icu/icu-src/source/common/normalizer2impl.h10
-rw-r--r--Build/source/libs/icu/icu-src/source/common/normlzr.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/patternprops.cpp10
-rw-r--r--Build/source/libs/icu/icu-src/source/common/patternprops.h7
-rw-r--r--Build/source/libs/icu/icu-src/source/common/propname_data.h1519
-rw-r--r--Build/source/libs/icu/icu-src/source/common/putil.cpp138
-rw-r--r--Build/source/libs/icu/icu-src/source/common/putilimp.h54
-rw-r--r--Build/source/libs/icu/icu-src/source/common/rbbi.cpp26
-rw-r--r--Build/source/libs/icu/icu-src/source/common/rbbi_cache.cpp13
-rw-r--r--Build/source/libs/icu/icu-src/source/common/rbbi_cache.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/common/rbbiscan.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/resbund.cpp3
-rw-r--r--Build/source/libs/icu/icu-src/source/common/resource.h24
-rw-r--r--Build/source/libs/icu/icu-src/source/common/restrace.cpp130
-rw-r--r--Build/source/libs/icu/icu-src/source/common/restrace.h147
-rw-r--r--Build/source/libs/icu/icu-src/source/common/schriter.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/serv.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/servls.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/servnotf.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/simpleformatter.cpp19
-rw-r--r--Build/source/libs/icu/icu-src/source/common/static_unicode_sets.cpp44
-rw-r--r--Build/source/libs/icu/icu-src/source/common/static_unicode_sets.h29
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uarrsort.cpp50
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uassert.h29
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ubidi.cpp9
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ubidi_props_data.h1108
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ubidiimp.h82
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ubidiln.cpp12
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ubiditransform.cpp10
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ubidiwrt.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ucase.cpp5
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ucase_props_data.h1501
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uchar.cpp10
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uchar_props_data.h6235
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uchriter.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ucln_cmn.cpp19
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ucln_cmn.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ucnv.cpp24
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ucnv2022.cpp15
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ucnv_bld.cpp6
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ucnv_lmb.cpp12
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ucnvbocu.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ucnvhz.cpp18
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ucnvisci.cpp12
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ucnvmbcs.cpp8
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ucnvsel.cpp38
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ucptrie.cpp33
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ucurr.cpp77
-rw-r--r--Build/source/libs/icu/icu-src/source/common/udata.cpp45
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uhash.cpp18
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uidna.cpp7
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uinvchar.cpp12
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uinvchar.h89
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ulayout_props.h46
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ulayout_props_data.h722
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uloc.cpp290
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uloc_keytype.cpp161
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uloc_tag.cpp1192
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ulocimp.h132
-rw-r--r--Build/source/libs/icu/icu-src/source/common/umapfile.cpp122
-rw-r--r--Build/source/libs/icu/icu-src/source/common/umutablecptrie.cpp404
-rw-r--r--Build/source/libs/icu/icu-src/source/common/umutex.cpp344
-rw-r--r--Build/source/libs/icu/icu-src/source/common/umutex.h377
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unames.cpp68
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/appendable.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/brkiter.h16
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/bytestream.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/bytestrie.h47
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/bytestriebuilder.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/caniter.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/casemap.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/char16ptr.h7
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/chariter.h8
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/dbbi.h6
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/docmain.h13
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/dtintrv.h12
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/edits.h7
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/errorcode.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/filteredbrk.h7
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/idna.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/localebuilder.h315
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/localematcher.h605
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/localpointer.h145
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/locdspnm.h6
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/locid.h167
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/messagepattern.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/normalizer2.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/normlzr.h11
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/parsepos.h19
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/platform.h74
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/rbbi.h19
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/rep.h9
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/resbund.h6
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/schriter.h8
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/simpleformatter.h42
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/std_string.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/strenum.h9
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/stringpiece.h35
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/stringtriebuilder.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/symtable.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/uchar.h48
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/ucharstrie.h47
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/ucharstriebuilder.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/uchriter.h8
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/uconfig.h14
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/ucpmap.h19
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/ucptrie.h116
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/ucurr.h38
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/udata.h38
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/uloc.h84
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/umachine.h36
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/umutablecptrie.h27
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/unifilt.h14
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/unifunct.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/unimatch.h3
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/uniset.h78
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/unistr.h859
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/unorm.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/uobject.h35
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/urename.h72
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/ures.h10
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/uscript.h11
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/usetiter.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/utext.h17
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/utf16.h92
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/utf8.h97
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/utf_old.h205
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/utrace.h71
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/utypes.h36
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/uvernum.h40
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unicode/uversion.h32
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unifiedcache.cpp45
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unifiedcache.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uniset.cpp490
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uniset_closure.cpp42
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uniset_props.cpp94
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unisetspan.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/common/unistr.cpp9
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uobject.cpp12
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uprops.cpp155
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uprops.h10
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uresbund.cpp311
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uresdata.cpp96
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uresdata.h76
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uresimp.h86
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uscript.cpp13
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uscript_props.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uset.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/usetiter.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/usprep.cpp5
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ustr_cnv.cpp12
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ustr_titlecase_brkiter.cpp28
-rw-r--r--Build/source/libs/icu/icu-src/source/common/ustring.cpp10
-rw-r--r--Build/source/libs/icu/icu-src/source/common/utext.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/common/util.cpp10
-rw-r--r--Build/source/libs/icu/icu-src/source/common/util.h15
-rw-r--r--Build/source/libs/icu/icu-src/source/common/utrace.cpp15
-rw-r--r--Build/source/libs/icu/icu-src/source/common/utracimp.h93
-rw-r--r--Build/source/libs/icu/icu-src/source/common/utrie.h19
-rw-r--r--Build/source/libs/icu/icu-src/source/common/utrie2.h16
-rw-r--r--Build/source/libs/icu/icu-src/source/common/utrie2_builder.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uvector.h26
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uvectr32.h26
-rw-r--r--Build/source/libs/icu/icu-src/source/common/uvectr64.h18
-rw-r--r--Build/source/libs/icu/icu-src/source/common/wintz.cpp18
-rw-r--r--Build/source/libs/icu/icu-src/source/common/wintz.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/config/dist.mk31
-rw-r--r--Build/source/libs/icu/icu-src/source/config/mh-cygwin6
-rw-r--r--Build/source/libs/icu/icu-src/source/config/mh-cygwin-msvc16
-rw-r--r--Build/source/libs/icu/icu-src/source/config/mh-cygwin646
-rw-r--r--Build/source/libs/icu/icu-src/source/config/mh-darwin2
-rw-r--r--Build/source/libs/icu/icu-src/source/config/mh-mingw30
-rw-r--r--Build/source/libs/icu/icu-src/source/config/mh-mingw6430
-rw-r--r--Build/source/libs/icu/icu-src/source/config/mh-msys-msvc12
-rw-r--r--Build/source/libs/icu/icu-src/source/config/mh-solaris2
-rw-r--r--Build/source/libs/icu/icu-src/source/config/mh-solaris-gcc2
-rw-r--r--Build/source/libs/icu/icu-src/source/config/pkgdataMakefile.in2
-rwxr-xr-xBuild/source/libs/icu/icu-src/source/configure218
-rw-r--r--Build/source/libs/icu/icu-src/source/data/BUILDRULES.py573
-rw-r--r--Build/source/libs/icu/icu-src/source/data/Makefile.in600
-rw-r--r--Build/source/libs/icu/icu-src/source/data/build.xml117
-rw-r--r--Build/source/libs/icu/icu-src/source/data/cldr-icu-readme.txt138
-rw-r--r--Build/source/libs/icu/icu-src/source/data/dtd/cldr-35.1/common/dtd/ldml.dtd3146
-rw-r--r--Build/source/libs/icu/icu-src/source/data/dtd/cldr-35.1/common/dtd/ldmlICU.dtd113
-rw-r--r--Build/source/libs/icu/icu-src/source/data/icu-coll-deprecates.xml2
-rw-r--r--Build/source/libs/icu/icu-src/source/data/icu-config.xml27
-rw-r--r--Build/source/libs/icu/icu-src/source/data/icu-locale-deprecates.xml6
-rw-r--r--Build/source/libs/icu/icu-src/source/data/icu-rbnf-deprecates.xml4
-rw-r--r--Build/source/libs/icu/icu-src/source/data/icu4j-readme.txt27
-rw-r--r--Build/source/libs/icu/icu-src/source/data/in/coll/ucadata-implicithan.icubin178456 -> 182144 bytes
-rw-r--r--Build/source/libs/icu/icu-src/source/data/in/coll/ucadata-unihan.icubin519212 -> 522900 bytes
-rw-r--r--Build/source/libs/icu/icu-src/source/data/in/icudt65l.dat (renamed from Build/source/libs/icu/icu-src/source/data/in/icudt63l.dat)bin18451232 -> 19002384 bytes
-rw-r--r--Build/source/libs/icu/icu-src/source/data/in/nfc.nrmbin34856 -> 34904 bytes
-rw-r--r--Build/source/libs/icu/icu-src/source/data/in/nfkc.nrmbin53796 -> 53852 bytes
-rw-r--r--Build/source/libs/icu/icu-src/source/data/in/nfkc_cf.nrmbin51160 -> 51236 bytes
-rw-r--r--Build/source/libs/icu/icu-src/source/data/in/pnames.icubin41268 -> 41998 bytes
-rw-r--r--Build/source/libs/icu/icu-src/source/data/in/ubidi.icubin25756 -> 26204 bytes
-rw-r--r--Build/source/libs/icu/icu-src/source/data/in/ucase.icubin28306 -> 28682 bytes
-rw-r--r--Build/source/libs/icu/icu-src/source/data/in/ulayout.icubin0 -> 13376 bytes
-rw-r--r--Build/source/libs/icu/icu-src/source/data/in/unames.icubin269616 -> 274568 bytes
-rw-r--r--Build/source/libs/icu/icu-src/source/data/in/uprops.icubin130080 -> 133040 bytes
-rw-r--r--Build/source/libs/icu/icu-src/source/data/in/uts46.nrmbin58168 -> 58416 bytes
-rw-r--r--Build/source/libs/icu/icu-src/source/data/makedata.mak861
-rw-r--r--Build/source/libs/icu/icu-src/source/data/makedata.vcxproj86
-rw-r--r--Build/source/libs/icu/icu-src/source/data/makedata.vcxproj.filters3
-rw-r--r--Build/source/libs/icu/icu-src/source/data/makedata_uwp.vcxproj87
-rw-r--r--Build/source/libs/icu/icu-src/source/data/pkgdataMakefile.in2
-rw-r--r--Build/source/libs/icu/icu-src/source/data/unidata/CaseFolding.txt13
-rw-r--r--Build/source/libs/icu/icu-src/source/data/unidata/DerivedCoreProperties.txt509
-rw-r--r--Build/source/libs/icu/icu-src/source/data/unidata/DerivedNormalizationProps.txt58
-rw-r--r--Build/source/libs/icu/icu-src/source/data/unidata/FractionalUCA.txt23139
-rw-r--r--Build/source/libs/icu/icu-src/source/data/unidata/NormalizationCorrections.txt6
-rw-r--r--Build/source/libs/icu/icu-src/source/data/unidata/NormalizationTest.txt34
-rw-r--r--Build/source/libs/icu/icu-src/source/data/unidata/SpecialCasing.txt6
-rw-r--r--Build/source/libs/icu/icu-src/source/data/unidata/UCARules.txt922
-rw-r--r--Build/source/libs/icu/icu-src/source/data/unidata/UnicodeData.txt565
-rw-r--r--Build/source/libs/icu/icu-src/source/data/unidata/changes.txt600
-rw-r--r--Build/source/libs/icu/icu-src/source/data/unidata/confusables.txt8
-rw-r--r--Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfc.txt6
-rw-r--r--Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfkc.txt4
-rw-r--r--Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfkc_cf.txt11
-rw-r--r--Build/source/libs/icu/icu-src/source/data/unidata/norm2/uts46.txt271
-rw-r--r--Build/source/libs/icu/icu-src/source/data/unidata/ppucd.txt1314
-rw-r--r--Build/source/libs/icu/icu-src/source/extra/Makefile.in2
-rw-r--r--Build/source/libs/icu/icu-src/source/extra/scrptrun/scrptrun.cpp3
-rw-r--r--Build/source/libs/icu/icu-src/source/extra/scrptrun/scrptrun.h3
-rw-r--r--Build/source/libs/icu/icu-src/source/extra/scrptrun/srtest.cpp5
-rw-r--r--Build/source/libs/icu/icu-src/source/extra/uconv/makedata.mak25
-rw-r--r--Build/source/libs/icu/icu-src/source/extra/uconv/pkgdataMakefile.in4
-rw-r--r--Build/source/libs/icu/icu-src/source/extra/uconv/uconv.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/extra/uconv/uconv.vcxproj162
-rw-r--r--Build/source/libs/icu/icu-src/source/extra/uconv/uwmsg.c1
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/Makefile.in14
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/alphaindex.cpp7
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/anytrans.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/anytrans.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/astro.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/bocsu.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/brktrans.cpp12
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/brktrans.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/buddhcal.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/buddhcal.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/calendar.cpp74
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/casetrn.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/casetrn.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/chnsecal.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/chnsecal.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/choicfmt.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/coll.cpp18
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/collationbuilder.cpp3
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/collationdatabuilder.cpp3
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/collationfcd.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/collationiterator.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/collationruleparser.cpp5
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/compactdecimalformat.cpp8
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/coptccal.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/coptccal.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/cpdtrans.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/cpdtrans.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/csdetect.cpp6
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/curramt.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/currfmt.cpp13
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/currfmt.h6
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/currunit.cpp28
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/dangical.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/dangical.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/datefmt.cpp11
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/decNumberLocal.h14
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/decimfmt.cpp912
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/double-conversion-bignum-dtoa.cpp42
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/double-conversion-bignum.cpp586
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/double-conversion-bignum.h68
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/double-conversion-cached-powers.cpp210
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/double-conversion-cached-powers.h26
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/double-conversion-diy-fp.cpp74
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/double-conversion-diy-fp.h59
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/double-conversion-double-to-string.cpp450
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/double-conversion-double-to-string.h419
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/double-conversion-fast-dtoa.cpp54
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/double-conversion-ieee.h38
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/double-conversion-string-to-double.cpp (renamed from Build/source/libs/icu/icu-src/source/i18n/double-conversion.cpp)652
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/double-conversion-string-to-double.h244
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/double-conversion-strtod.cpp146
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/double-conversion-strtod.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/double-conversion-utils.h147
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/double-conversion.h524
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/dtfmtsym.cpp53
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/dtitv_impl.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/dtitvfmt.cpp288
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/dtitvinf.cpp8
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/dtptngen.cpp186
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/erarules.cpp25
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/erarules.h11
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/esctrn.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/esctrn.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/ethpccal.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/ethpccal.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/fmtable.cpp9
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/formatted_string_builder.cpp (renamed from Build/source/libs/icu/icu-src/source/i18n/number_stringbuilder.cpp)167
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/formatted_string_builder.h253
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/formattedval_impl.h278
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/formattedval_iterimpl.cpp176
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/formattedval_sbimpl.cpp214
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/formattedvalue.cpp232
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/fphdlimp.cpp18
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/fphdlimp.h31
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/fpositer.cpp6
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/funcrepl.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/funcrepl.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/gender.cpp3
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/gregocal.cpp32
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/hebrwcal.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/hebrwcal.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/i18n.vcxproj143
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/i18n.vcxproj.filters38
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/i18n_uwp.vcxproj122
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/indiancal.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/indiancal.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/islamcal.cpp11
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/islamcal.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/japancal.cpp29
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/japancal.h11
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/listformatter.cpp59
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/measfmt.cpp716
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/measunit.cpp1162
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/measure.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/msgfmt.cpp66
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/name2uni.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/name2uni.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/nortrans.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/nortrans.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/nounit.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/nultrans.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/nultrans.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_affixutils.cpp42
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_affixutils.h13
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_asformat.cpp10
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_asformat.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_capi.cpp147
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_compact.cpp12
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_currencysymbols.cpp6
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.cpp237
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.h93
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_decimfmtprops.cpp7
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_decimfmtprops.h13
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_decnum.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_fluent.cpp151
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_formatimpl.cpp94
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_formatimpl.h28
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_grouping.cpp5
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_integerwidth.cpp5
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_longnames.cpp85
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_longnames.h15
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_mapper.cpp54
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_mapper.h13
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_microprops.h1
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_modifiers.cpp40
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_modifiers.h56
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_multiplier.cpp3
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_output.cpp57
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_padding.cpp6
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_patternmodifier.cpp81
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_patternmodifier.h34
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_patternstring.cpp146
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_patternstring.h26
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_rounding.cpp89
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_roundingutils.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_scientific.cpp15
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_scientific.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_skeletons.cpp94
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_skeletons.h15
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_stringbuilder.h152
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_types.h25
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_utils.cpp17
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_utils.h20
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/number_utypes.h53
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numfmt.cpp30
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numparse_affixes.cpp70
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numparse_affixes.h46
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numparse_compositions.cpp1
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numparse_currency.cpp1
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numparse_decimal.cpp1
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numparse_impl.cpp57
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numparse_impl.h6
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numparse_parsednumber.cpp12
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numparse_scientific.cpp65
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numparse_scientific.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numparse_stringsegment.h24
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numparse_symbols.cpp11
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numparse_symbols.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numparse_types.h122
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numrange_fluent.cpp109
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numrange_impl.cpp77
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numrange_impl.h19
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numsys.cpp120
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/numsys_impl.h12
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/olsontz.cpp43
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/olsontz.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/persncal.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/persncal.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/plurfmt.cpp17
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/plurrule.cpp21
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/quant.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/quant.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/quantityformatter.cpp39
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/quantityformatter.h24
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/rbnf.cpp53
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/rbt.cpp7
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/rbt.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/rbt_pars.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/rbt_rule.cpp6
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/rbtz.cpp6
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/regexcmp.cpp137
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/regeximp.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/region.cpp40
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/reldatefmt.cpp366
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/reldtfmt.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/reldtfmt.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/rematch.cpp170
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/remtrans.cpp6
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/remtrans.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/repattrn.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/rulebasedcollator.cpp14
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/scientificnumberformatter.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/scriptset.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/selfmt.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/simpletz.cpp5
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/smpdtfmt.cpp95
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/string_segment.cpp (renamed from Build/source/libs/icu/icu-src/source/i18n/numparse_stringsegment.cpp)7
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/string_segment.h134
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/strmatch.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/strmatch.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/strrepl.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/strrepl.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/stsearch.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/taiwncal.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/taiwncal.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/timezone.cpp165
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/titletrn.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/titletrn.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/tmunit.cpp5
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/tmutamt.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/tmutfmt.cpp12
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/tolowtrn.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/tolowtrn.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/toupptrn.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/toupptrn.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/translit.cpp24
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/transreg.cpp14
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/tridpars.cpp3
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/tzfmt.cpp25
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/tzgnames.cpp16
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/tzgnames.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/tznames.cpp8
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/tznames_impl.cpp26
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/tznames_impl.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/tzrule.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/ucal.cpp29
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/ucln_in.h1
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/ucol_res.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/udat.cpp8
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/udateintervalformat.cpp28
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/ulistformatter.cpp98
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/umsg.cpp10
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unesctrn.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unesctrn.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/uni2name.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/uni2name.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/alphaindex.h8
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/basictz.h12
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/calendar.h27
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/choicfmt.h9
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/coleitr.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/coll.h24
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/compactdecimalformat.h7
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/curramt.h7
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/currpinf.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/currunit.h21
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/datefmt.h12
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/dcfmtsym.h8
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/decimfmt.h181
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/dtfmtsym.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/dtitvfmt.h179
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/dtitvinf.h7
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/dtptngen.h15
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/dtrule.h6
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/fieldpos.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/fmtable.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/format.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/formattedvalue.h332
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/fpositer.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/gender.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/gregocal.h8
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/listformatter.h106
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/measfmt.h47
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/measunit.h2271
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/measure.h7
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/msgfmt.h37
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/nounit.h11
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/numberformatter.h644
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/numberrangeformatter.h220
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/numfmt.h22
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/numsys.h30
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/plurfmt.h17
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/plurrule.h39
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/rbnf.h28
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/rbtz.h8
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/regex.h235
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/region.h7
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/reldatefmt.h243
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/scientificnumberformatter.h9
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/search.h7
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/selfmt.h9
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/simpletz.h8
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/smpdtfmt.h11
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/sortkey.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/stsearch.h9
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/tblcoll.h11
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/timezone.h51
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/tmunit.h7
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/tmutamt.h12
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/tmutfmt.h8
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/translit.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/tzfmt.h7
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/tznames.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/tzrule.h12
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/tztrans.h6
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/ucal.h56
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/ucol.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/udat.h23
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/udateintervalformat.h100
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/udatpg.h18
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/uformattedvalue.h441
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/ulistformatter.h109
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/unirepl.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/unum.h61
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/unumberformatter.h245
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/unumsys.h1
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/upluralrules.h40
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/uregex.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/ureldatefmt.h152
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/usearch.h18
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/uspoof.h496
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/utrans.h11
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unicode/vtzone.h8
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/unum.cpp5
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/upluralrules.cpp24
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/uregex.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/usearch.cpp24
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/uspoof.cpp76
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/uspoof_impl.cpp45
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/uspoof_impl.h10
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/vtzone.cpp14
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/windtfmt.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/windtfmt.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/winnmfmt.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/winnmfmt.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/i18n/zonemeta.cpp10
-rw-r--r--Build/source/libs/icu/icu-src/source/icudefs.mk.in3
-rw-r--r--Build/source/libs/icu/icu-src/source/io/io.vcxproj132
-rw-r--r--Build/source/libs/icu/icu-src/source/io/locbund.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/io/ucln_io.cpp1
-rw-r--r--Build/source/libs/icu/icu-src/source/io/unicode/ustream.h6
-rw-r--r--Build/source/libs/icu/icu-src/source/io/uscanf_p.cpp10
-rw-r--r--Build/source/libs/icu/icu-src/source/layoutex/layoutex.vcxproj20
-rw-r--r--Build/source/libs/icu/icu-src/source/python/icutools/__init__.py4
-rw-r--r--Build/source/libs/icu/icu-src/source/python/icutools/databuilder/__init__.py16
-rw-r--r--Build/source/libs/icu/icu-src/source/python/icutools/databuilder/__main__.py347
-rw-r--r--Build/source/libs/icu/icu-src/source/python/icutools/databuilder/comment_stripper.py51
-rw-r--r--Build/source/libs/icu/icu-src/source/python/icutools/databuilder/filtration.py401
-rw-r--r--Build/source/libs/icu/icu-src/source/python/icutools/databuilder/filtration_schema.json169
-rw-r--r--Build/source/libs/icu/icu-src/source/python/icutools/databuilder/locale_dependencies.py224
-rw-r--r--Build/source/libs/icu/icu-src/source/python/icutools/databuilder/renderers/__init__.py10
-rw-r--r--Build/source/libs/icu/icu-src/source/python/icutools/databuilder/renderers/common_exec.py146
-rw-r--r--Build/source/libs/icu/icu-src/source/python/icutools/databuilder/renderers/makefile.py245
-rw-r--r--Build/source/libs/icu/icu-src/source/python/icutools/databuilder/request_types.py364
-rw-r--r--Build/source/libs/icu/icu-src/source/python/icutools/databuilder/test/__init__.py2
-rw-r--r--Build/source/libs/icu/icu-src/source/python/icutools/databuilder/test/__main__.py14
-rw-r--r--Build/source/libs/icu/icu-src/source/python/icutools/databuilder/test/filtration_test.py353
-rw-r--r--Build/source/libs/icu/icu-src/source/python/icutools/databuilder/utils.py130
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/break/break.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/cal/cal.c4
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/cal/cal.vcxproj17
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/case/case.vcxproj19
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/citer/citer.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/citer/citer.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/coll/coll.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/csdet/csdet.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/date/date.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/datefmt/datefmt.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/datefmt/main.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/dtitvfmtsample/dtitvfmtsample.vcxproj5
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/dtptngsample/dtptngsample.vcxproj5
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/layout/layout.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/legacy/legacy.vcxproj4
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/msgfmt/msgfmt.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/numfmt/numfmt.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/numfmt/util.cpp10
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/plurfmtsample/plurfmtsample.vcxproj5
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/props/props.cpp7
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/props/props.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/strsrch/strsrch.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/translit/translit.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/uciter8/uciter8.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/ucnv/ucnv.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/udata/reader.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/udata/writer.c15
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/udata/writer.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/ufortune/ufortune.vcxproj2
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/ugrep/ugrep.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/uresb/resources.vcxproj7
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/uresb/uresb.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/ustring/ustring.cpp31
-rw-r--r--Build/source/libs/icu/icu-src/source/samples/ustring/ustring.vcxproj11
-rw-r--r--Build/source/libs/icu/icu-src/source/stubdata/stubdata.vcxproj120
-rw-r--r--Build/source/libs/icu/icu-src/source/test/Makefile.in6
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/Makefile.in2
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/bocu1tst.c4
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/callcoll.c14
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/calltest.c2
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/capitst.c129
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cbiapts.c27
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cbiditst.c33
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/ccaltst.c163
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/ccapitst.c40
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cdateintervalformattest.c64
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cdattst.c55
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cdtdptst.c49
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cdtrgtst.c1
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cformtst.c4
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cformtst.h26
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.c14
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.h6
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.vcxproj129
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.vcxproj.filters3
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/citertst.c4
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cldrtest.c13
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cloctst.c381
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cloctst.h8
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cmsccoll.c12
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cmsgtst.c39
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cnmdptst.c75
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cnormtst.c7
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cnumtst.c498
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cpluralrulestest.c43
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/crelativedateformattest.c403
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/crestst.c66
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/creststn.c71
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cstrcase.c11
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cstrtest.c72
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cucdapi.c4
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/cucdtst.c89
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/currtest.c10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/custrtrn.c10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/hpmufn.c24
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/idnatest.c10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/nccbtst.c10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/ncnvtst.c8
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/nucnvtst.c112
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/putiltst.c16
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/reapits.c68
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/sorttest.c5
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/spooftest.c50
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/spreptst.c1
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/sprpdata.c3
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/tracetst.c27
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/trie2test.c6
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/trietest.c2
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/ucnvseltst.c8
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/ucptrietest.c5
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/udatatst.c7
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/uenumtst.c13
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/uformattedvaluetst.c275
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/ulistfmttest.c84
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/unumberformattertst.c80
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/usrchtst.c72
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/utexttst.c26
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/utf8tst.c12
-rw-r--r--Build/source/libs/icu/icu-src/source/test/cintltst/utmstest.c2
-rw-r--r--Build/source/libs/icu/icu-src/source/test/depstest/dependencies.py4
-rw-r--r--Build/source/libs/icu/icu-src/source/test/depstest/dependencies.txt114
-rw-r--r--Build/source/libs/icu/icu-src/source/test/depstest/depstest.py50
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/Makefile.in99
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/break_iterator_fuzzer.cpp71
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/collator_compare_fuzzer.cpp35
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/collator_rulebased_fuzzer.cpp26
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/collator_rulebased_fuzzer_seed_corpus.txtbin0 -> 316 bytes
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/converter_fuzzer.cpp55
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/fuzzer_driver.cpp20
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/fuzzer_utils.h24
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/locale_fuzzer.cpp49
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/locale_util.cpp12
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/locale_util.h12
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/number_format_fuzzer.cpp45
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/ucasemap_fuzzer.cpp72
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_canonicalize_fuzzer.cpp20
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_canonicalize_fuzzer_seed_corpus.txt30
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_for_language_tag_fuzzer.cpp21
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_for_language_tag_fuzzer_seed_corpus.txt30
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_get_name_fuzzer.cpp20
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_get_name_fuzzer_seed_corpus.txt30
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_is_right_to_left_fuzzer.cpp15
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_is_right_to_left_fuzzer_seed_corpus.txt30
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_open_keywords_fuzzer.cpp20
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_open_keywords_fuzzer_seed_corpus.txt30
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/unicode_string_codepage_create_fuzzer.cpp85
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/uregex_open_fuzzer.cpp26
-rw-r--r--Build/source/libs/icu/icu-src/source/test/fuzzer/uregex_open_fuzzer.dict102
-rw-r--r--Build/source/libs/icu/icu-src/source/test/hdrtst/Makefile.in171
-rw-r--r--Build/source/libs/icu/icu-src/source/test/hdrtst/cxxfiles.txt134
-rw-r--r--Build/source/libs/icu/icu-src/source/test/hdrtst/pfiles.txt5
-rw-r--r--Build/source/libs/icu/icu-src/source/test/hdrtst/testinternalheaders.sh4
-rwxr-xr-xBuild/source/libs/icu/icu-src/source/test/hdrtst/testtagsguards.sh94
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/Makefile.in8
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/alphaindextst.cpp73
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/apicoll.cpp10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/astrotst.cpp132
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/bytestrietest.cpp67
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/calregts.cpp116
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/calregts.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/caltest.cpp37
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/citrtest.cpp42
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/compactdecimalformattest.cpp30
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/convtest.cpp23
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/cpdtrtst.cpp8
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/csdetest.cpp136
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/dadrcal.cpp15
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/datadrivennumberformattestsuite.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/dcfmapts.cpp387
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/dcfmapts.h1
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/dcfmtest.cpp58
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/dtfmapts.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/dtfmrgts.cpp157
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/dtfmrgts.h1
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/dtfmtrtts.cpp9
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/dtfmttst.cpp168
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/dtfmttst.h1
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/dtifmtts.cpp761
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/dtifmtts.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/dtptngts.cpp239
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/dtptngts.h3
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/erarulestest.cpp3
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/formatted_string_builder_test.cpp (renamed from Build/source/libs/icu/icu-src/source/test/intltest/numbertest_stringbuilder.cpp)100
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/formattedvaluetest.cpp308
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/idnaconf.cpp13
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/idnaref.cpp23
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/incaltst.cpp430
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/incaltst.h1
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/intltest.cpp63
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/intltest.h27
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/intltest.vcxproj131
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/intltest.vcxproj.filters25
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/itformat.cpp30
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/itformat.h28
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/itrbnf.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/itspoof.cpp59
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/itutil.cpp255
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/listformattertest.cpp80
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/listformattertest.h17
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/localebuildertest.cpp1672
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/localebuildertest.h51
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/localematchertest.cpp589
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/locnmtst.cpp199
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/locnmtst.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/loctest.cpp1028
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/loctest.h20
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/measfmttest.cpp920
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/miscdtfm.cpp13
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/msfmrgts.cpp153
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/msfmrgts.h13
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/nmfmapts.cpp8
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/nmfmtrt.cpp7
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/normconf.cpp6
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/nptrans.cpp41
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/numbertest.h86
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/numbertest_affixutils.cpp13
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/numbertest_api.cpp908
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/numbertest_decimalquantity.cpp159
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/numbertest_modifiers.cpp24
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/numbertest_parse.cpp88
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/numbertest_patternmodifier.cpp38
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/numbertest_permutation.cpp198
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/numbertest_range.cpp107
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/numbertest_skeletons.cpp27
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/numfmtspectest.cpp10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/numfmtst.cpp532
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/numfmtst.h14
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/numrgts.cpp82
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/plurfmts.cpp24
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/plurults.cpp72
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/plurults.h3
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/pptest.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/punyref.cpp10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/quantityformattertest.cpp7
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/rbbiapts.cpp36
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/rbbimonkeytest.cpp20
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/rbbimonkeytest.h8
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/rbbitst.cpp132
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/regcoll.cpp24
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/regextst.cpp124
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/regextst.h1
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/reldatefmttest.cpp187
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/reptest.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/restest.cpp38
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/restsnew.cpp322
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/restsnew.h6
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/selfmts.cpp11
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/simpleformattertest.cpp17
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/simplethread.cpp275
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/simplethread.h24
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/srchtest.cpp12
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/ssearch.cpp32
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/static_unisets_test.cpp9
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/strcase.cpp6
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/string_segment_test.cpp (renamed from Build/source/libs/icu/icu-src/source/test/intltest/numbertest_stringsegment.cpp)40
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/strtest.cpp100
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/strtest.h6
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/svccoll.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/tchcfmt.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/testidna.cpp17
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/testidna.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/tmsgfmt.cpp78
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/tmsgfmt.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/transapi.cpp31
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/transrt.cpp23
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/transtst.cpp34
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/tsdate.cpp18
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/tsmthred.cpp423
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/tsmthred.h5
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/tstnorm.cpp6
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/tufmtts.cpp17
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/tzfmttst.cpp42
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/tzfmttst.h2
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/tzregts.cpp69
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/tzrulets.cpp8
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/tztest.cpp47
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/tztest.h1
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/ucharstrietest.cpp57
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/uobjtest.cpp36
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/usettest.cpp32
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/ustrtest.cpp41
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/utxttest.cpp28
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/uvectest.cpp10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/v32test.cpp10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/windttst.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/test/iotest/filetst.c4
-rw-r--r--Build/source/libs/icu/icu-src/source/test/iotest/iotest.vcxproj123
-rw-r--r--Build/source/libs/icu/icu-src/source/test/iotest/strtst.c7
-rw-r--r--Build/source/libs/icu/icu-src/source/test/letest/gendata.vcxproj4
-rw-r--r--Build/source/libs/icu/icu-src/source/test/letest/letest.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/test/letest/letest.vcxproj2
-rw-r--r--Build/source/libs/icu/icu-src/source/test/perf/DateFmtPerf/DateFmtPerf.vcxproj5
-rw-r--r--Build/source/libs/icu/icu-src/source/test/perf/charperf/charperf.vcxproj10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/perf/collationperf/collperf.cpp11
-rw-r--r--Build/source/libs/icu/icu-src/source/test/perf/collperf/collperf.vcxproj10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/perf/collperf2/collperf2.vcxproj10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/perf/convperf/convperf.cpp18
-rw-r--r--Build/source/libs/icu/icu-src/source/test/perf/convperf/convperf.vcxproj10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/perf/normperf/dtfmtrtperf.vcxproj4
-rw-r--r--Build/source/libs/icu/icu-src/source/test/perf/normperf/normperf.h8
-rw-r--r--Build/source/libs/icu/icu-src/source/test/perf/normperf/normperf.vcxproj10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/perf/strsrchperf/strsrchperf.vcxproj10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/perf/ubrkperf/ubrkperf.vcxproj10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/perf/ucnvavailperf/ucnvavailperf.vcxproj4
-rw-r--r--Build/source/libs/icu/icu-src/source/test/perf/unisetperf/unisetperf.vcxproj10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/perf/usetperf/usetperf.vcxproj10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/perf/ustrperf/stringperf.vcxproj10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/perf/utfperf/utfperf.vcxproj10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/perf/utrie2perf/utrie2perf.vcxproj10
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/BUILDRULES.py231
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/BidiTest.txt6
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/CollationTest_NON_IGNORABLE_SHORT.txt3349
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/CollationTest_SHIFTED_SHORT.txt3852
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/GraphemeBreakTest.txt231
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/IdnaTestV2.txt73
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/LineBreakTest.txt6
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/Makefile.in101
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/SentenceBreakTest.txt6
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/WordBreakTest.txt6
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/break_rules/README.md100
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/break_rules/grapheme.txt8
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line.txt42
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_cj.txt213
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_loose.txt42
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_loose_cj.txt50
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_normal.txt42
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_normal_cj.txt51
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/break_rules/readme.txt76
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/break_rules/word.txt2
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/break_rules/word_POSIX.txt2
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/filters/filtertest.txt13
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/filtertest.txt40
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/format.txt70
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/localeMatcherTest.txt1959
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/numberformattestspecification.txt453
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/numberpermutationtest.txt9103
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/pkgdataMakefile.in4
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/rbbitst.txt515
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/regextst.txt65
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/root.txt4
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/structLocale.txt754
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/testdata.mak152
-rw-r--r--Build/source/libs/icu/icu-src/source/test/testdata/tstfiles.mk12
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/ctestfw/ctest.c21
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/ctestfw/ctestfw.vcxproj130
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/escapesrc/escapesrc.cpp17
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/genbrk/genbrk.cpp6
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/genbrk/genbrk.vcxproj198
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/genccode/genccode.c15
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/genccode/genccode.vcxproj194
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/gencfu/gencfu.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/gencfu/gencfu.vcxproj187
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/gencmn/gencmn.vcxproj198
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/gencnval/gencnval.c144
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/gencnval/gencnval.vcxproj198
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/gendict/gendict.vcxproj198
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/gennorm2/gennorm2.vcxproj151
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/genrb/Makefile.in2
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/genrb/derb.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/genrb/derb.vcxproj210
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/genrb/filterrb.cpp239
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/genrb/filterrb.h180
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/genrb/genrb.cpp182
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/genrb/genrb.vcxproj198
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/genrb/genrb.vcxproj.filters6
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/genrb/parse.cpp112
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/genrb/reslist.cpp126
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/genrb/reslist.h30
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/genrb/rle.c4
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/genrb/ustr.h8
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/genren/README6
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/gensprep/gensprep.c3
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/gensprep/gensprep.vcxproj196
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/gensprep/store.c3
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/gentest/gentest.vcxproj177
-rwxr-xr-xBuild/source/libs/icu/icu-src/source/tools/icu-file-utf8-check.py22
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/icuinfo/icuinfo.cpp10
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/icuinfo/icuinfo.vcxproj130
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/icuinfo/testplug.vcxproj201
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/icupkg/icupkg.vcxproj132
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/makeconv/gencnvex.c7
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/makeconv/makeconv.cpp14
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/makeconv/makeconv.vcxproj138
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/pkgdata/pkgdata.cpp112
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/pkgdata/pkgdata.vcxproj152
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/toolutil/filetools.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_genc.cpp282
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_genc.h25
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_gencmn.cpp8
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/toolutil/pkgitems.cpp3
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/toolutil/swapimpl.cpp105
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/toolutil/toolutil.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/toolutil/toolutil.vcxproj194
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/toolutil/ucbuf.cpp4
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/toolutil/ucbuf.h4
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/toolutil/ucmstate.cpp3
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/toolutil/xmlparser.cpp2
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/tzcode/Makefile.in52
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/tzcode/icuzdump.vcxproj2
-rw-r--r--Build/source/libs/icu/icu-src/source/tools/tzcode/icuzones98
1010 files changed, 90832 insertions, 40356 deletions
diff --git a/Build/source/libs/icu/icu-src/source/aclocal.m4 b/Build/source/libs/icu/icu-src/source/aclocal.m4
index 413f50971a5..b5ee8a9d1e1 100644
--- a/Build/source/libs/icu/icu-src/source/aclocal.m4
+++ b/Build/source/libs/icu/icu-src/source/aclocal.m4
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.15 -*- Autoconf -*-
+# generated automatically by aclocal 1.15.1 -*- Autoconf -*-
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -13,7 +13,7 @@
m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
-dnl serial 11 (pkg-config-0.29.1)
+dnl serial 11 (pkg-config-0.29)
dnl
dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
@@ -55,7 +55,7 @@ dnl
dnl See the "Since" comment for each macro you use to see what version
dnl of the macros you require.
m4_defun([PKG_PREREQ],
-[m4_define([PKG_MACROS_VERSION], [0.29.1])
+[m4_define([PKG_MACROS_VERSION], [0.29])
m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
[m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
])dnl PKG_PREREQ
diff --git a/Build/source/libs/icu/icu-src/source/allinone/Build.Windows.Library.ProjectConfiguration.props b/Build/source/libs/icu/icu-src/source/allinone/Build.Windows.Library.ProjectConfiguration.props
index 07e3c1bf512..90bac19e935 100644
--- a/Build/source/libs/icu/icu-src/source/allinone/Build.Windows.Library.ProjectConfiguration.props
+++ b/Build/source/libs/icu/icu-src/source/allinone/Build.Windows.Library.ProjectConfiguration.props
@@ -7,14 +7,12 @@
<ClCompile>
<!-- ICU does not use exceptions in library code. -->
<PreprocessorDefinitions>
+ $(DefineConstants);
_HAS_EXCEPTIONS=0;
%(PreprocessorDefinitions)
</PreprocessorDefinitions>
</ClCompile>
</ItemDefinitionGroup>
- <PropertyGroup>
- <!-- Disable MSBuild warning about Linker OutputFile. -->
- <!-- Ex: MSBuild complains that the common project creates "icuuc62.dll" rather than "common.dll". However, this is intentional. -->
- <MSBuildWarningsAsMessages>MSB8012</MSBuildWarningsAsMessages>
- </PropertyGroup>
+ <!-- The following import will set various settings for compiler Warnings and Errors. -->
+ <Import Project="Build.Windows.Library.WarningSettings.ProjectConfiguration.props" />
</Project>
diff --git a/Build/source/libs/icu/icu-src/source/allinone/Build.Windows.Library.WarningSettings.ProjectConfiguration.props b/Build/source/libs/icu/icu-src/source/allinone/Build.Windows.Library.WarningSettings.ProjectConfiguration.props
new file mode 100644
index 00000000000..a00e2c43047
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/allinone/Build.Windows.Library.WarningSettings.ProjectConfiguration.props
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 and later: Unicode, Inc. and others. License & terms of use: http://www.unicode.org/copyright.html -->
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <!-- This file is used to set compiler Warning configurations that are common to *all* ICU library code (common, i18n, and io). -->
+ <!-- Note: These options are for *all* configurations for *all* library projects. -->
+ <ItemDefinitionGroup>
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <!--
+ We treat the following Warnings as Errors in the ICU library code, in order to catch/prevent
+ issues like ICU-20209, ICU-20157, ICU-13816 and others.
+
+ C4251 Need to DLL-Export template instantiations.
+ C4661 No suitable definition provided for explicit template instantiation request.
+ C4715 Not all control paths return a value.
+ C4706 Assignment within conditional expression.
+ C4005 Macro redifintion.
+ C4068 Unknown pragma.
+ C4267 Conversion from size_t to type, possible loss of data.
+ C4910 __declspec(dllexport) and extern are incompatible on an explicit instantiation.
+ C4003 Not enough parameters for macro.
+ -->
+ <TreatSpecificWarningsAsErrors>4251;4661;4715;4706;4005;4068;4267;4910;4003;%(TreatSpecificWarningsAsErrors)</TreatSpecificWarningsAsErrors>
+ </ClCompile>
+ </ItemDefinitionGroup>
+</Project>
diff --git a/Build/source/libs/icu/icu-src/source/allinone/Build.Windows.PlatformToolset.props b/Build/source/libs/icu/icu-src/source/allinone/Build.Windows.PlatformToolset.props
new file mode 100644
index 00000000000..b4777679b80
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/allinone/Build.Windows.PlatformToolset.props
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 and later: Unicode, Inc. and others. License & terms of use: http://www.unicode.org/copyright.html -->
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <!-- This file is used to set the PlatformToolset configuration option for all UWP projects. -->
+
+ <!-- Automatic PlatformToolset version selection. -->
+ <!-- If there is no DefaultPlatformToolset set, we will detect the version based on version of the build tools. -->
+ <PropertyGroup>
+ <BuildToolVersion>$(VisualStudioVersion)</BuildToolVersion>
+ <BuildToolVersion Condition="'$(BuildToolVersion)'==''">$(MSBuildToolsVersion)</BuildToolVersion>
+ <!-- Note: v140 is the Visual Studio 2015 toolset. v141 is the Visual Studio 2017 toolset. -->
+ <AutoDetectedPlatformToolset Condition="'$(BuildToolVersion)'=='14.0'">v140</AutoDetectedPlatformToolset>
+ <AutoDetectedPlatformToolset Condition="'$(BuildToolVersion)'=='15.0'">v141</AutoDetectedPlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Label="EmptyDefaultPlatformToolset">
+ <DefaultPlatformToolset Condition=" '$(DefaultPlatformToolset)' == '' ">$(AutoDetectedPlatformToolset)</DefaultPlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Label="PlatformToolset">
+ <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup>
+ <!-- Disable MSBuild warning about Linker OutputFile. -->
+ <!-- Ex: MSBuild complains that the common project creates "icuuc62.dll" rather than "common.dll". However, this is intentional. -->
+ <MSBuildWarningsAsMessages>MSB8012</MSBuildWarningsAsMessages>
+ </PropertyGroup>
+</Project>
diff --git a/Build/source/libs/icu/icu-src/source/allinone/Build.Windows.ProjectConfiguration.props b/Build/source/libs/icu/icu-src/source/allinone/Build.Windows.ProjectConfiguration.props
index 0e74cb4ff45..ab535881c79 100644
--- a/Build/source/libs/icu/icu-src/source/allinone/Build.Windows.ProjectConfiguration.props
+++ b/Build/source/libs/icu/icu-src/source/allinone/Build.Windows.ProjectConfiguration.props
@@ -12,6 +12,14 @@
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|ARM64">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -20,19 +28,52 @@
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM64">
+ <Configuration>Release</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
</ItemGroup>
- <PropertyGroup>
- <!-- This is the version of the MSVC tool-set to use. -->
- <!-- v140 is the Visual Studio 2015 toolset. -->
- <!-- v141 is the Visual Studio 2017 toolset. -->
- <PlatformToolset>v141</PlatformToolset>
+ <!-- The following import will set the PlatformToolset configuration. -->
+ <Import Project="Build.Windows.PlatformToolset.props" />
+ <!-- The following PropertyGroups are used to set the binary and lib output locations -->
+ <PropertyGroup Condition="'$(Platform)'=='Win32'">
+ <IcuBinOutputDir>bin</IcuBinOutputDir>
+ <IcuLibOutputDir>lib</IcuLibOutputDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Platform)'=='x64'">
+ <IcuBinOutputDir>bin64</IcuBinOutputDir>
+ <IcuLibOutputDir>lib64</IcuLibOutputDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Platform)'=='ARM'">
+ <IcuBinOutputDir>binARM</IcuBinOutputDir>
+ <IcuLibOutputDir>libARM</IcuLibOutputDir>
</PropertyGroup>
+ <PropertyGroup Condition="'$(Platform)'=='ARM64'">
+ <IcuBinOutputDir>binARM64</IcuBinOutputDir>
+ <IcuLibOutputDir>libARM64</IcuLibOutputDir>
+ </PropertyGroup>
+ <!-- This is the default SDK target. -->
<PropertyGroup>
- <!-- This is the default SDK target. -->
<!-- Note that the Windows 8.1 SDK is backwards compatible down-level to Windows 7, so
setting this to 8.1 does not actually imply targeting Windows 8.1. -->
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
</PropertyGroup>
+ <!-- Desktop ARM/ARM64 support requires a newer version of the Windows SDK than 8.1 -->
+ <!--
+ Note: This version must match the version below in the ARM64 section for AdditionalLibraryDirectories
+ -->
+ <PropertyGroup Condition="'$(Platform)'=='ARM'">
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
+ <WindowsSDKDesktopARMSupport>true</WindowsSDKDesktopARMSupport>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Platform)'=='ARM64'">
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
+ <WindowsSDKDesktopARM64Support>true</WindowsSDKDesktopARM64Support>
+ </PropertyGroup>
<PropertyGroup>
<!-- We need to explicitly set the target version to Windows 7. -->
<Win32_WinNTVersion>0x0601</Win32_WinNTVersion>
@@ -65,6 +106,7 @@
</ResourceCompile>
<Link>
<SuppressStartupBanner>true</SuppressStartupBanner>
+ <RandomizedBaseAddress>true</RandomizedBaseAddress>
</Link>
</ItemDefinitionGroup>
<!-- Options that are common to all 'Release' configurations for *all* projects. -->
@@ -75,12 +117,15 @@
<ClCompile>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
</Link>
</ItemDefinitionGroup>
<!-- Options that are common to all 'Debug' configurations for *all* projects. -->
@@ -126,4 +171,36 @@
<TargetMachine>MachineX64</TargetMachine>
</Link>
</ItemDefinitionGroup>
+ <!-- Options that are common to all ARM 32-bit configurations for *all* projects. -->
+ <ItemDefinitionGroup Condition="'$(Platform)'=='ARM'">
+ <Midl>
+ <TargetEnvironment>ARM</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <PreprocessorDefinitions>ARM;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <TargetMachine>MachineARM</TargetMachine>
+ <!-- The ARM64 Desktop SDK doesn't include this by default -->
+ <AdditionalDependencies>kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <!-- Note: This needs to match the same version as WindowsTargetPlatformVersion for ARM -->
+ <AdditionalLibraryDirectories>C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\um\arm</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <!-- Options that are common to all ARM 64-bit configurations for *all* projects. -->
+ <ItemDefinitionGroup Condition="'$(Platform)'=='ARM64'">
+ <Midl>
+ <TargetEnvironment>ARM64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <PreprocessorDefinitions>ARM64;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <TargetMachine>MachineARM64</TargetMachine>
+ <!-- The ARM64 Desktop SDK doesn't include this by default -->
+ <AdditionalDependencies>kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <!-- Note: This needs to match the same version as WindowsTargetPlatformVersion for ARM64 -->
+ <AdditionalLibraryDirectories>C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\um\arm64</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
</Project> \ No newline at end of file
diff --git a/Build/source/libs/icu/icu-src/source/allinone/Build.Windows.UWP.ProjectConfiguration.props b/Build/source/libs/icu/icu-src/source/allinone/Build.Windows.UWP.ProjectConfiguration.props
index 5988c73be38..359d2c2de43 100644
--- a/Build/source/libs/icu/icu-src/source/allinone/Build.Windows.UWP.ProjectConfiguration.props
+++ b/Build/source/libs/icu/icu-src/source/allinone/Build.Windows.UWP.ProjectConfiguration.props
@@ -3,20 +3,43 @@
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- This file is used to set common configuration options for all *_uwp projects. -->
<PropertyGroup>
- <!-- If not already set, use this version of the Win10 SDK -->
- <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
- <!-- If not already set, set the minimum Win10 SDK version to TH1/RTM -->
- <WindowsTargetPlatformMinVersion>10.0.10240.0</WindowsTargetPlatformMinVersion>
-
<MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>
<AppContainerApplication>true</AppContainerApplication>
<ApplicationType>Windows Store</ApplicationType>
<ApplicationTypeRevision>10.0</ApplicationTypeRevision>
</PropertyGroup>
- <PropertyGroup>
- <!-- This is the version of the MSVC tool-set to use. -->
- <!-- v141 is the Visual Studio 2017 toolset. -->
- <PlatformToolset>v141</PlatformToolset>
+ <!-- If not already set, then we will default to using the latest installed Windows 10 SDK version. -->
+ <PropertyGroup Condition="'$(WindowsTargetPlatformVersion)'==''">
+ <!-- Detect the SDK version. -->
+ <WindowsSdkInstallFolder_10 Condition="'$(WindowsSdkInstallFolder_10)' == ''">$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0@InstallationFolder)</WindowsSdkInstallFolder_10>
+ <WindowsSdkInstallFolder_10 Condition="'$(WindowsSdkInstallFolder_10)' == ''">$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0@InstallationFolder)</WindowsSdkInstallFolder_10>
+ <WindowsTargetPlatformVersion_10 Condition="'$(WindowsTargetPlatformVersion_10)' == ''">$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0@ProductVersion)</WindowsTargetPlatformVersion_10>
+ <WindowsTargetPlatformVersion_10 Condition="'$(WindowsTargetPlatformVersion_10)' == ''">$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0@ProductVersion)</WindowsTargetPlatformVersion_10>
+ <!-- Sometimes the version in the registry has the '.0' suffix, and sometimes it doesn't. Check and add it. -->
+ <WindowsTargetPlatformVersion_10 Condition="'$(WindowsTargetPlatformVersion_10)' != '' and !$(WindowsTargetPlatformVersion_10.EndsWith('.0'))">$(WindowsTargetPlatformVersion_10).0</WindowsTargetPlatformVersion_10>
+ <!-- Set the default. -->
+ <WindowsTargetPlatformVersion>$(WindowsTargetPlatformVersion_10)</WindowsTargetPlatformVersion>
+ <!-- Set the minimum Win10 SDK version to TH1/RTM. -->
+ <WindowsTargetPlatformMinVersion>10.0.10240.0</WindowsTargetPlatformMinVersion>
+ </PropertyGroup>
+ <!-- The following import will set the PlatformToolset configuration. -->
+ <Import Project="..\allinone\Build.Windows.PlatformToolset.props" />
+ <!-- The following PropertyGroups are used to set the binary and lib output locations -->
+ <PropertyGroup Condition="'$(Platform)'=='Win32'">
+ <IcuBinOutputDir>bin32uwp</IcuBinOutputDir>
+ <IcuLibOutputDir>lib32uwp</IcuLibOutputDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Platform)'=='x64'">
+ <IcuBinOutputDir>bin64uwp</IcuBinOutputDir>
+ <IcuLibOutputDir>lib64uwp</IcuLibOutputDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Platform)'=='ARM'">
+ <IcuBinOutputDir>binARMuwp</IcuBinOutputDir>
+ <IcuLibOutputDir>libARMuwp</IcuLibOutputDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Platform)'=='ARM64'">
+ <IcuBinOutputDir>binARM64uwp</IcuBinOutputDir>
+ <IcuLibOutputDir>libARM64uwp</IcuLibOutputDir>
</PropertyGroup>
<ItemDefinitionGroup>
<Midl>
diff --git a/Build/source/libs/icu/icu-src/source/allinone/allinone.sln b/Build/source/libs/icu/icu-src/source/allinone/allinone.sln
index b2b133053b3..fbbec359e48 100644
--- a/Build/source/libs/icu/icu-src/source/allinone/allinone.sln
+++ b/Build/source/libs/icu/icu-src/source/allinone/allinone.sln
@@ -197,335 +197,515 @@ EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM = Debug|ARM
+ Debug|ARM64 = Debug|ARM64
Debug|Win32 = Debug|Win32
Debug|x64 = Debug|x64
Release|ARM = Release|ARM
+ Release|ARM64 = Release|ARM64
Release|Win32 = Release|Win32
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|ARM.ActiveCfg = Debug|Win32
+ {F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|ARM64.ActiveCfg = Debug|Win32
{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|Win32.ActiveCfg = Debug|Win32
{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|Win32.Build.0 = Debug|Win32
{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|x64.ActiveCfg = Debug|x64
{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|x64.Build.0 = Debug|x64
{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|ARM.ActiveCfg = Release|Win32
+ {F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|ARM64.ActiveCfg = Release|Win32
{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|Win32.ActiveCfg = Release|Win32
{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|Win32.Build.0 = Release|Win32
{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|x64.ActiveCfg = Release|x64
{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|x64.Build.0 = Release|x64
- {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Debug|ARM.ActiveCfg = Debug|Win32
+ {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Debug|ARM.ActiveCfg = Debug|ARM
+ {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Debug|ARM.Build.0 = Debug|ARM
+ {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Debug|ARM64.Build.0 = Debug|ARM64
{3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Debug|Win32.ActiveCfg = Debug|Win32
{3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Debug|Win32.Build.0 = Debug|Win32
{3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Debug|x64.ActiveCfg = Debug|x64
{3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Debug|x64.Build.0 = Debug|x64
- {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Release|ARM.ActiveCfg = Release|Win32
+ {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Release|ARM.ActiveCfg = Release|ARM
+ {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Release|ARM.Build.0 = Release|ARM
+ {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Release|ARM64.ActiveCfg = Release|ARM64
+ {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Release|ARM64.Build.0 = Release|ARM64
{3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Release|Win32.ActiveCfg = Release|Win32
{3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Release|Win32.Build.0 = Release|Win32
{3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Release|x64.ActiveCfg = Release|x64
{3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Release|x64.Build.0 = Release|x64
- {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Debug|ARM.ActiveCfg = Debug|Win32
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Debug|ARM.ActiveCfg = Debug|ARM
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Debug|ARM.Build.0 = Debug|ARM
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Debug|ARM64.Build.0 = Debug|ARM64
{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Debug|Win32.ActiveCfg = Debug|Win32
{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Debug|Win32.Build.0 = Debug|Win32
{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Debug|x64.ActiveCfg = Debug|x64
{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Debug|x64.Build.0 = Debug|x64
- {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Release|ARM.ActiveCfg = Release|Win32
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Release|ARM.ActiveCfg = Release|ARM
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Release|ARM.Build.0 = Release|ARM
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Release|ARM64.ActiveCfg = Release|ARM64
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Release|ARM64.Build.0 = Release|ARM64
{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Release|Win32.ActiveCfg = Release|Win32
{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Release|Win32.Build.0 = Release|Win32
{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Release|x64.ActiveCfg = Release|x64
{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Release|x64.Build.0 = Release|x64
- {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Debug|ARM.ActiveCfg = Debug|Win32
+ {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Debug|ARM.ActiveCfg = Debug|ARM
+ {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Debug|ARM.Build.0 = Debug|ARM
+ {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Debug|ARM64.Build.0 = Debug|ARM64
{ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Debug|Win32.ActiveCfg = Debug|Win32
{ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Debug|Win32.Build.0 = Debug|Win32
{ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Debug|x64.ActiveCfg = Debug|x64
{ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Debug|x64.Build.0 = Debug|x64
- {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Release|ARM.ActiveCfg = Release|Win32
+ {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Release|ARM.ActiveCfg = Release|ARM
+ {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Release|ARM.Build.0 = Release|ARM
+ {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Release|ARM64.ActiveCfg = Release|ARM64
+ {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Release|ARM64.Build.0 = Release|ARM64
{ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Release|Win32.ActiveCfg = Release|Win32
{ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Release|Win32.Build.0 = Release|Win32
{ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Release|x64.ActiveCfg = Release|x64
{ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Release|x64.Build.0 = Release|x64
{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|ARM.ActiveCfg = Debug|Win32
+ {38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|ARM64.ActiveCfg = Debug|Win32
{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|Win32.ActiveCfg = Debug|Win32
{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|Win32.Build.0 = Debug|Win32
{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|x64.ActiveCfg = Debug|x64
{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|x64.Build.0 = Debug|x64
{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|ARM.ActiveCfg = Release|Win32
+ {38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|ARM64.ActiveCfg = Release|Win32
{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|Win32.ActiveCfg = Release|Win32
{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|Win32.Build.0 = Release|Win32
{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|x64.ActiveCfg = Release|x64
{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|x64.Build.0 = Release|x64
- {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Debug|ARM.ActiveCfg = Debug|Win32
+ {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Debug|ARM.ActiveCfg = Debug|ARM
+ {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Debug|ARM.Build.0 = Debug|ARM
+ {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Debug|ARM64.Build.0 = Debug|ARM64
{D3065ADB-8820-4CC7-9B6C-9510833961A3}.Debug|Win32.ActiveCfg = Debug|Win32
{D3065ADB-8820-4CC7-9B6C-9510833961A3}.Debug|Win32.Build.0 = Debug|Win32
{D3065ADB-8820-4CC7-9B6C-9510833961A3}.Debug|x64.ActiveCfg = Debug|x64
{D3065ADB-8820-4CC7-9B6C-9510833961A3}.Debug|x64.Build.0 = Debug|x64
- {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Release|ARM.ActiveCfg = Release|Win32
+ {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Release|ARM.ActiveCfg = Release|ARM
+ {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Release|ARM.Build.0 = Release|ARM
+ {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Release|ARM64.ActiveCfg = Release|ARM64
+ {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Release|ARM64.Build.0 = Release|ARM64
{D3065ADB-8820-4CC7-9B6C-9510833961A3}.Release|Win32.ActiveCfg = Release|Win32
{D3065ADB-8820-4CC7-9B6C-9510833961A3}.Release|Win32.Build.0 = Release|Win32
{D3065ADB-8820-4CC7-9B6C-9510833961A3}.Release|x64.ActiveCfg = Release|x64
{D3065ADB-8820-4CC7-9B6C-9510833961A3}.Release|x64.Build.0 = Release|x64
- {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Debug|ARM.ActiveCfg = Debug|Win32
+ {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Debug|ARM.ActiveCfg = Debug|ARM
+ {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Debug|ARM.Build.0 = Debug|ARM
+ {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Debug|ARM64.Build.0 = Debug|ARM64
{C2BE5000-7501-4E87-9724-B8D82494FAE6}.Debug|Win32.ActiveCfg = Debug|Win32
{C2BE5000-7501-4E87-9724-B8D82494FAE6}.Debug|Win32.Build.0 = Debug|Win32
{C2BE5000-7501-4E87-9724-B8D82494FAE6}.Debug|x64.ActiveCfg = Debug|x64
{C2BE5000-7501-4E87-9724-B8D82494FAE6}.Debug|x64.Build.0 = Debug|x64
- {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Release|ARM.ActiveCfg = Release|Win32
+ {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Release|ARM.ActiveCfg = Release|ARM
+ {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Release|ARM.Build.0 = Release|ARM
+ {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Release|ARM64.ActiveCfg = Release|ARM64
+ {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Release|ARM64.Build.0 = Release|ARM64
{C2BE5000-7501-4E87-9724-B8D82494FAE6}.Release|Win32.ActiveCfg = Release|Win32
{C2BE5000-7501-4E87-9724-B8D82494FAE6}.Release|Win32.Build.0 = Release|Win32
{C2BE5000-7501-4E87-9724-B8D82494FAE6}.Release|x64.ActiveCfg = Release|x64
{C2BE5000-7501-4E87-9724-B8D82494FAE6}.Release|x64.Build.0 = Release|x64
- {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Debug|ARM.ActiveCfg = Debug|Win32
+ {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Debug|ARM.ActiveCfg = Debug|ARM
+ {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Debug|ARM.Build.0 = Debug|ARM
+ {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Debug|ARM64.Build.0 = Debug|ARM64
{FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Debug|Win32.ActiveCfg = Debug|Win32
{FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Debug|Win32.Build.0 = Debug|Win32
{FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Debug|x64.ActiveCfg = Debug|x64
{FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Debug|x64.Build.0 = Debug|x64
- {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Release|ARM.ActiveCfg = Release|Win32
+ {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Release|ARM.ActiveCfg = Release|ARM
+ {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Release|ARM.Build.0 = Release|ARM
+ {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Release|ARM64.ActiveCfg = Release|ARM64
+ {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Release|ARM64.Build.0 = Release|ARM64
{FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Release|Win32.ActiveCfg = Release|Win32
{FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Release|Win32.Build.0 = Release|Win32
{FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Release|x64.ActiveCfg = Release|x64
{FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Release|x64.Build.0 = Release|x64
- {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Debug|ARM.ActiveCfg = Debug|Win32
+ {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Debug|ARM.ActiveCfg = Debug|ARM
+ {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Debug|ARM.Build.0 = Debug|ARM
+ {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Debug|ARM64.Build.0 = Debug|ARM64
{A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Debug|Win32.ActiveCfg = Debug|Win32
{A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Debug|Win32.Build.0 = Debug|Win32
{A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Debug|x64.ActiveCfg = Debug|x64
{A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Debug|x64.Build.0 = Debug|x64
- {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Release|ARM.ActiveCfg = Release|Win32
+ {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Release|ARM.ActiveCfg = Release|ARM
+ {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Release|ARM.Build.0 = Release|ARM
+ {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Release|ARM64.ActiveCfg = Release|ARM64
+ {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Release|ARM64.Build.0 = Release|ARM64
{A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Release|Win32.ActiveCfg = Release|Win32
{A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Release|Win32.Build.0 = Release|Win32
{A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Release|x64.ActiveCfg = Release|x64
{A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Release|x64.Build.0 = Release|x64
- {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Debug|ARM.ActiveCfg = Debug|Win32
+ {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Debug|ARM.ActiveCfg = Debug|ARM
+ {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Debug|ARM.Build.0 = Debug|ARM
+ {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Debug|ARM64.Build.0 = Debug|ARM64
{8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Debug|Win32.ActiveCfg = Debug|Win32
{8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Debug|Win32.Build.0 = Debug|Win32
{8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Debug|x64.ActiveCfg = Debug|x64
{8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Debug|x64.Build.0 = Debug|x64
- {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Release|ARM.ActiveCfg = Release|Win32
+ {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Release|ARM.ActiveCfg = Release|ARM
+ {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Release|ARM.Build.0 = Release|ARM
+ {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Release|ARM64.ActiveCfg = Release|ARM64
+ {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Release|ARM64.Build.0 = Release|ARM64
{8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Release|Win32.ActiveCfg = Release|Win32
{8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Release|Win32.Build.0 = Release|Win32
{8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Release|x64.ActiveCfg = Release|x64
{8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Release|x64.Build.0 = Release|x64
- {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Debug|ARM.ActiveCfg = Debug|Win32
+ {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Debug|ARM.ActiveCfg = Debug|ARM
+ {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Debug|ARM.Build.0 = Debug|ARM
+ {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Debug|ARM64.Build.0 = Debug|ARM64
{97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Debug|Win32.ActiveCfg = Debug|Win32
{97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Debug|Win32.Build.0 = Debug|Win32
{97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Debug|x64.ActiveCfg = Debug|x64
{97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Debug|x64.Build.0 = Debug|x64
- {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Release|ARM.ActiveCfg = Release|Win32
+ {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Release|ARM.ActiveCfg = Release|ARM
+ {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Release|ARM.Build.0 = Release|ARM
+ {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Release|ARM64.ActiveCfg = Release|ARM64
+ {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Release|ARM64.Build.0 = Release|ARM64
{97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Release|Win32.ActiveCfg = Release|Win32
{97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Release|Win32.Build.0 = Release|Win32
{97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Release|x64.ActiveCfg = Release|x64
{97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Release|x64.Build.0 = Release|x64
- {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Debug|ARM.ActiveCfg = Debug|Win32
+ {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Debug|ARM.ActiveCfg = Debug|ARM
+ {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Debug|ARM.Build.0 = Debug|ARM
+ {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Debug|ARM64.Build.0 = Debug|ARM64
{77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Debug|Win32.ActiveCfg = Debug|Win32
{77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Debug|Win32.Build.0 = Debug|Win32
{77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Debug|x64.ActiveCfg = Debug|x64
{77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Debug|x64.Build.0 = Debug|x64
- {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Release|ARM.ActiveCfg = Release|Win32
+ {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Release|ARM.ActiveCfg = Release|ARM
+ {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Release|ARM.Build.0 = Release|ARM
+ {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Release|ARM64.ActiveCfg = Release|ARM64
+ {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Release|ARM64.Build.0 = Release|ARM64
{77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Release|Win32.ActiveCfg = Release|Win32
{77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Release|Win32.Build.0 = Release|Win32
{77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Release|x64.ActiveCfg = Release|x64
{77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Release|x64.Build.0 = Release|x64
- {0178B127-6269-407D-B112-93877BB62776}.Debug|ARM.ActiveCfg = Debug|Win32
+ {0178B127-6269-407D-B112-93877BB62776}.Debug|ARM.ActiveCfg = Debug|ARM
+ {0178B127-6269-407D-B112-93877BB62776}.Debug|ARM.Build.0 = Debug|ARM
+ {0178B127-6269-407D-B112-93877BB62776}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {0178B127-6269-407D-B112-93877BB62776}.Debug|ARM64.Build.0 = Debug|ARM64
{0178B127-6269-407D-B112-93877BB62776}.Debug|Win32.ActiveCfg = Debug|Win32
{0178B127-6269-407D-B112-93877BB62776}.Debug|Win32.Build.0 = Debug|Win32
{0178B127-6269-407D-B112-93877BB62776}.Debug|x64.ActiveCfg = Debug|x64
{0178B127-6269-407D-B112-93877BB62776}.Debug|x64.Build.0 = Debug|x64
- {0178B127-6269-407D-B112-93877BB62776}.Release|ARM.ActiveCfg = Release|Win32
+ {0178B127-6269-407D-B112-93877BB62776}.Release|ARM.ActiveCfg = Release|ARM
+ {0178B127-6269-407D-B112-93877BB62776}.Release|ARM.Build.0 = Release|ARM
+ {0178B127-6269-407D-B112-93877BB62776}.Release|ARM64.ActiveCfg = Release|ARM64
+ {0178B127-6269-407D-B112-93877BB62776}.Release|ARM64.Build.0 = Release|ARM64
{0178B127-6269-407D-B112-93877BB62776}.Release|Win32.ActiveCfg = Release|Win32
{0178B127-6269-407D-B112-93877BB62776}.Release|Win32.Build.0 = Release|Win32
{0178B127-6269-407D-B112-93877BB62776}.Release|x64.ActiveCfg = Release|x64
{0178B127-6269-407D-B112-93877BB62776}.Release|x64.Build.0 = Release|x64
- {73632960-B3A6-464D-83A3-4B43365F19B8}.Debug|ARM.ActiveCfg = Debug|Win32
+ {73632960-B3A6-464D-83A3-4B43365F19B8}.Debug|ARM.ActiveCfg = Debug|ARM
+ {73632960-B3A6-464D-83A3-4B43365F19B8}.Debug|ARM.Build.0 = Debug|ARM
+ {73632960-B3A6-464D-83A3-4B43365F19B8}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {73632960-B3A6-464D-83A3-4B43365F19B8}.Debug|ARM64.Build.0 = Debug|ARM64
{73632960-B3A6-464D-83A3-4B43365F19B8}.Debug|Win32.ActiveCfg = Debug|Win32
{73632960-B3A6-464D-83A3-4B43365F19B8}.Debug|Win32.Build.0 = Debug|Win32
{73632960-B3A6-464D-83A3-4B43365F19B8}.Debug|x64.ActiveCfg = Debug|x64
{73632960-B3A6-464D-83A3-4B43365F19B8}.Debug|x64.Build.0 = Debug|x64
- {73632960-B3A6-464D-83A3-4B43365F19B8}.Release|ARM.ActiveCfg = Release|Win32
+ {73632960-B3A6-464D-83A3-4B43365F19B8}.Release|ARM.ActiveCfg = Release|ARM
+ {73632960-B3A6-464D-83A3-4B43365F19B8}.Release|ARM.Build.0 = Release|ARM
+ {73632960-B3A6-464D-83A3-4B43365F19B8}.Release|ARM64.ActiveCfg = Release|ARM64
+ {73632960-B3A6-464D-83A3-4B43365F19B8}.Release|ARM64.Build.0 = Release|ARM64
{73632960-B3A6-464D-83A3-4B43365F19B8}.Release|Win32.ActiveCfg = Release|Win32
{73632960-B3A6-464D-83A3-4B43365F19B8}.Release|Win32.Build.0 = Release|Win32
{73632960-B3A6-464D-83A3-4B43365F19B8}.Release|x64.ActiveCfg = Release|x64
{73632960-B3A6-464D-83A3-4B43365F19B8}.Release|x64.Build.0 = Release|x64
- {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Debug|ARM.ActiveCfg = Debug|Win32
+ {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Debug|ARM.ActiveCfg = Debug|ARM
+ {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Debug|ARM.Build.0 = Debug|ARM
+ {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Debug|ARM64.Build.0 = Debug|ARM64
{F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Debug|Win32.ActiveCfg = Debug|Win32
{F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Debug|Win32.Build.0 = Debug|Win32
{F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Debug|x64.ActiveCfg = Debug|x64
{F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Debug|x64.Build.0 = Debug|x64
- {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Release|ARM.ActiveCfg = Release|Win32
+ {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Release|ARM.ActiveCfg = Release|ARM
+ {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Release|ARM.Build.0 = Release|ARM
+ {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Release|ARM64.ActiveCfg = Release|ARM64
+ {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Release|ARM64.Build.0 = Release|ARM64
{F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Release|Win32.ActiveCfg = Release|Win32
{F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Release|Win32.Build.0 = Release|Win32
{F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Release|x64.ActiveCfg = Release|x64
{F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Release|x64.Build.0 = Release|x64
- {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Debug|ARM.ActiveCfg = Debug|Win32
+ {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Debug|ARM.ActiveCfg = Debug|ARM
+ {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Debug|ARM.Build.0 = Debug|ARM
+ {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Debug|ARM64.Build.0 = Debug|ARM64
{D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Debug|Win32.ActiveCfg = Debug|Win32
{D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Debug|Win32.Build.0 = Debug|Win32
{D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Debug|x64.ActiveCfg = Debug|x64
{D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Debug|x64.Build.0 = Debug|x64
- {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Release|ARM.ActiveCfg = Release|Win32
+ {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Release|ARM.ActiveCfg = Release|ARM
+ {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Release|ARM.Build.0 = Release|ARM
+ {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Release|ARM64.ActiveCfg = Release|ARM64
+ {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Release|ARM64.Build.0 = Release|ARM64
{D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Release|Win32.ActiveCfg = Release|Win32
{D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Release|Win32.Build.0 = Release|Win32
{D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Release|x64.ActiveCfg = Release|x64
{D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Release|x64.Build.0 = Release|x64
- {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Debug|ARM.ActiveCfg = Debug|Win32
+ {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Debug|ARM.ActiveCfg = Debug|ARM
+ {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Debug|ARM.Build.0 = Debug|ARM
+ {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Debug|ARM64.Build.0 = Debug|ARM64
{4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Debug|Win32.ActiveCfg = Debug|Win32
{4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Debug|Win32.Build.0 = Debug|Win32
{4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Debug|x64.ActiveCfg = Debug|x64
{4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Debug|x64.Build.0 = Debug|x64
- {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Release|ARM.ActiveCfg = Release|Win32
+ {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Release|ARM.ActiveCfg = Release|ARM
+ {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Release|ARM.Build.0 = Release|ARM
+ {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Release|ARM64.ActiveCfg = Release|ARM64
+ {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Release|ARM64.Build.0 = Release|ARM64
{4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Release|Win32.ActiveCfg = Release|Win32
{4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Release|Win32.Build.0 = Release|Win32
{4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Release|x64.ActiveCfg = Release|x64
{4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Release|x64.Build.0 = Release|x64
- {203EC78A-0531-43F0-A636-285439BDE025}.Debug|ARM.ActiveCfg = Debug|Win32
+ {203EC78A-0531-43F0-A636-285439BDE025}.Debug|ARM.ActiveCfg = Debug|ARM
+ {203EC78A-0531-43F0-A636-285439BDE025}.Debug|ARM.Build.0 = Debug|ARM
+ {203EC78A-0531-43F0-A636-285439BDE025}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {203EC78A-0531-43F0-A636-285439BDE025}.Debug|ARM64.Build.0 = Debug|ARM64
{203EC78A-0531-43F0-A636-285439BDE025}.Debug|Win32.ActiveCfg = Debug|Win32
{203EC78A-0531-43F0-A636-285439BDE025}.Debug|Win32.Build.0 = Debug|Win32
{203EC78A-0531-43F0-A636-285439BDE025}.Debug|x64.ActiveCfg = Debug|x64
{203EC78A-0531-43F0-A636-285439BDE025}.Debug|x64.Build.0 = Debug|x64
- {203EC78A-0531-43F0-A636-285439BDE025}.Release|ARM.ActiveCfg = Release|Win32
+ {203EC78A-0531-43F0-A636-285439BDE025}.Release|ARM.ActiveCfg = Release|ARM
+ {203EC78A-0531-43F0-A636-285439BDE025}.Release|ARM.Build.0 = Release|ARM
+ {203EC78A-0531-43F0-A636-285439BDE025}.Release|ARM64.ActiveCfg = Release|ARM64
+ {203EC78A-0531-43F0-A636-285439BDE025}.Release|ARM64.Build.0 = Release|ARM64
{203EC78A-0531-43F0-A636-285439BDE025}.Release|Win32.ActiveCfg = Release|Win32
{203EC78A-0531-43F0-A636-285439BDE025}.Release|Win32.Build.0 = Release|Win32
{203EC78A-0531-43F0-A636-285439BDE025}.Release|x64.ActiveCfg = Release|x64
{203EC78A-0531-43F0-A636-285439BDE025}.Release|x64.Build.0 = Release|x64
- {6B231032-3CB5-4EED-9210-810D666A23A0}.Debug|ARM.ActiveCfg = Debug|Win32
+ {6B231032-3CB5-4EED-9210-810D666A23A0}.Debug|ARM.ActiveCfg = Debug|ARM
+ {6B231032-3CB5-4EED-9210-810D666A23A0}.Debug|ARM.Build.0 = Debug|ARM
+ {6B231032-3CB5-4EED-9210-810D666A23A0}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {6B231032-3CB5-4EED-9210-810D666A23A0}.Debug|ARM64.Build.0 = Debug|ARM64
{6B231032-3CB5-4EED-9210-810D666A23A0}.Debug|Win32.ActiveCfg = Debug|Win32
{6B231032-3CB5-4EED-9210-810D666A23A0}.Debug|Win32.Build.0 = Debug|Win32
{6B231032-3CB5-4EED-9210-810D666A23A0}.Debug|x64.ActiveCfg = Debug|x64
{6B231032-3CB5-4EED-9210-810D666A23A0}.Debug|x64.Build.0 = Debug|x64
- {6B231032-3CB5-4EED-9210-810D666A23A0}.Release|ARM.ActiveCfg = Release|Win32
+ {6B231032-3CB5-4EED-9210-810D666A23A0}.Release|ARM.ActiveCfg = Release|ARM
+ {6B231032-3CB5-4EED-9210-810D666A23A0}.Release|ARM.Build.0 = Release|ARM
+ {6B231032-3CB5-4EED-9210-810D666A23A0}.Release|ARM64.ActiveCfg = Release|ARM64
+ {6B231032-3CB5-4EED-9210-810D666A23A0}.Release|ARM64.Build.0 = Release|ARM64
{6B231032-3CB5-4EED-9210-810D666A23A0}.Release|Win32.ActiveCfg = Release|Win32
{6B231032-3CB5-4EED-9210-810D666A23A0}.Release|Win32.Build.0 = Release|Win32
{6B231032-3CB5-4EED-9210-810D666A23A0}.Release|x64.ActiveCfg = Release|x64
{6B231032-3CB5-4EED-9210-810D666A23A0}.Release|x64.Build.0 = Release|x64
- {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Debug|ARM.ActiveCfg = Debug|Win32
+ {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Debug|ARM.ActiveCfg = Debug|ARM
+ {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Debug|ARM.Build.0 = Debug|ARM
+ {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Debug|ARM64.Build.0 = Debug|ARM64
{DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Debug|Win32.ActiveCfg = Debug|Win32
{DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Debug|Win32.Build.0 = Debug|Win32
{DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Debug|x64.ActiveCfg = Debug|x64
{DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Debug|x64.Build.0 = Debug|x64
- {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Release|ARM.ActiveCfg = Release|Win32
+ {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Release|ARM.ActiveCfg = Release|ARM
+ {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Release|ARM.Build.0 = Release|ARM
+ {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Release|ARM64.ActiveCfg = Release|ARM64
+ {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Release|ARM64.Build.0 = Release|ARM64
{DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Release|Win32.ActiveCfg = Release|Win32
{DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Release|Win32.Build.0 = Release|Win32
{DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Release|x64.ActiveCfg = Release|x64
{DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Release|x64.Build.0 = Release|x64
- {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Debug|ARM.ActiveCfg = Debug|Win32
+ {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Debug|ARM.ActiveCfg = Debug|ARM
+ {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Debug|ARM.Build.0 = Debug|ARM
+ {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Debug|ARM64.Build.0 = Debug|ARM64
{C2B04507-2521-4801-BF0D-5FD79D6D518C}.Debug|Win32.ActiveCfg = Debug|Win32
{C2B04507-2521-4801-BF0D-5FD79D6D518C}.Debug|Win32.Build.0 = Debug|Win32
{C2B04507-2521-4801-BF0D-5FD79D6D518C}.Debug|x64.ActiveCfg = Debug|x64
{C2B04507-2521-4801-BF0D-5FD79D6D518C}.Debug|x64.Build.0 = Debug|x64
- {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Release|ARM.ActiveCfg = Release|Win32
+ {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Release|ARM.ActiveCfg = Release|ARM
+ {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Release|ARM.Build.0 = Release|ARM
+ {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Release|ARM64.ActiveCfg = Release|ARM64
+ {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Release|ARM64.Build.0 = Release|ARM64
{C2B04507-2521-4801-BF0D-5FD79D6D518C}.Release|Win32.ActiveCfg = Release|Win32
{C2B04507-2521-4801-BF0D-5FD79D6D518C}.Release|Win32.Build.0 = Release|Win32
{C2B04507-2521-4801-BF0D-5FD79D6D518C}.Release|x64.ActiveCfg = Release|x64
{C2B04507-2521-4801-BF0D-5FD79D6D518C}.Release|x64.Build.0 = Release|x64
- {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Debug|ARM.ActiveCfg = Debug|Win32
+ {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Debug|ARM.ActiveCfg = Debug|ARM
+ {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Debug|ARM.Build.0 = Debug|ARM
+ {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Debug|ARM64.Build.0 = Debug|ARM64
{631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Debug|Win32.ActiveCfg = Debug|Win32
{631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Debug|Win32.Build.0 = Debug|Win32
{631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Debug|x64.ActiveCfg = Debug|x64
{631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Debug|x64.Build.0 = Debug|x64
- {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Release|ARM.ActiveCfg = Release|Win32
+ {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Release|ARM.ActiveCfg = Release|ARM
+ {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Release|ARM.Build.0 = Release|ARM
+ {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Release|ARM64.ActiveCfg = Release|ARM64
+ {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Release|ARM64.Build.0 = Release|ARM64
{631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Release|Win32.ActiveCfg = Release|Win32
{631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Release|Win32.Build.0 = Release|Win32
{631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Release|x64.ActiveCfg = Release|x64
{631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Release|x64.Build.0 = Release|x64
- {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Debug|ARM.ActiveCfg = Debug|Win32
+ {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Debug|ARM.ActiveCfg = Debug|ARM
+ {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Debug|ARM.Build.0 = Debug|ARM
+ {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Debug|ARM64.Build.0 = Debug|ARM64
{E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Debug|Win32.ActiveCfg = Debug|Win32
{E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Debug|Win32.Build.0 = Debug|Win32
{E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Debug|x64.ActiveCfg = Debug|x64
{E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Debug|x64.Build.0 = Debug|x64
- {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Release|ARM.ActiveCfg = Release|Win32
+ {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Release|ARM.ActiveCfg = Release|ARM
+ {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Release|ARM.Build.0 = Release|ARM
+ {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Release|ARM64.ActiveCfg = Release|ARM64
+ {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Release|ARM64.Build.0 = Release|ARM64
{E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Release|Win32.ActiveCfg = Release|Win32
{E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Release|Win32.Build.0 = Release|Win32
{E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Release|x64.ActiveCfg = Release|x64
{E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Release|x64.Build.0 = Release|x64
- {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Debug|ARM.ActiveCfg = Debug|Win32
+ {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Debug|ARM.ActiveCfg = Debug|ARM
+ {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Debug|ARM.Build.0 = Debug|ARM
+ {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Debug|ARM64.Build.0 = Debug|ARM64
{62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Debug|Win32.ActiveCfg = Debug|Win32
{62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Debug|Win32.Build.0 = Debug|Win32
{62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Debug|x64.ActiveCfg = Debug|x64
{62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Debug|x64.Build.0 = Debug|x64
- {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Release|ARM.ActiveCfg = Release|Win32
+ {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Release|ARM.ActiveCfg = Release|ARM
+ {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Release|ARM.Build.0 = Release|ARM
+ {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Release|ARM64.ActiveCfg = Release|ARM64
+ {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Release|ARM64.Build.0 = Release|ARM64
{62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Release|Win32.ActiveCfg = Release|Win32
{62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Release|Win32.Build.0 = Release|Win32
{62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Release|x64.ActiveCfg = Release|x64
{62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Release|x64.Build.0 = Release|x64
- {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Debug|ARM.ActiveCfg = Debug|Win32
+ {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Debug|ARM.ActiveCfg = Debug|ARM
+ {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Debug|ARM.Build.0 = Debug|ARM
+ {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Debug|ARM64.Build.0 = Debug|ARM64
{9D4211F7-2C77-439C-82F0-30A4E43BA569}.Debug|Win32.ActiveCfg = Debug|Win32
{9D4211F7-2C77-439C-82F0-30A4E43BA569}.Debug|Win32.Build.0 = Debug|Win32
{9D4211F7-2C77-439C-82F0-30A4E43BA569}.Debug|x64.ActiveCfg = Debug|x64
{9D4211F7-2C77-439C-82F0-30A4E43BA569}.Debug|x64.Build.0 = Debug|x64
- {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Release|ARM.ActiveCfg = Release|Win32
+ {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Release|ARM.ActiveCfg = Release|ARM
+ {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Release|ARM.Build.0 = Release|ARM
+ {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Release|ARM64.ActiveCfg = Release|ARM64
+ {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Release|ARM64.Build.0 = Release|ARM64
{9D4211F7-2C77-439C-82F0-30A4E43BA569}.Release|Win32.ActiveCfg = Release|Win32
{9D4211F7-2C77-439C-82F0-30A4E43BA569}.Release|Win32.Build.0 = Release|Win32
{9D4211F7-2C77-439C-82F0-30A4E43BA569}.Release|x64.ActiveCfg = Release|x64
{9D4211F7-2C77-439C-82F0-30A4E43BA569}.Release|x64.Build.0 = Release|x64
- {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Debug|ARM.ActiveCfg = Debug|Win32
+ {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Debug|ARM.ActiveCfg = Debug|ARM
+ {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Debug|ARM.Build.0 = Debug|ARM
+ {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Debug|ARM64.Build.0 = Debug|ARM64
{691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Debug|Win32.ActiveCfg = Debug|Win32
{691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Debug|Win32.Build.0 = Debug|Win32
{691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Debug|x64.ActiveCfg = Debug|x64
{691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Debug|x64.Build.0 = Debug|x64
- {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Release|ARM.ActiveCfg = Release|Win32
+ {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Release|ARM.ActiveCfg = Release|ARM
+ {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Release|ARM.Build.0 = Release|ARM
+ {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Release|ARM64.ActiveCfg = Release|ARM64
+ {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Release|ARM64.Build.0 = Release|ARM64
{691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Release|Win32.ActiveCfg = Release|Win32
{691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Release|Win32.Build.0 = Release|Win32
{691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Release|x64.ActiveCfg = Release|x64
{691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Release|x64.Build.0 = Release|x64
- {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Debug|ARM.ActiveCfg = Debug|Win32
+ {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Debug|ARM.ActiveCfg = Debug|ARM
+ {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Debug|ARM.Build.0 = Debug|ARM
+ {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Debug|ARM64.Build.0 = Debug|ARM64
{C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Debug|Win32.ActiveCfg = Debug|Win32
{C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Debug|Win32.Build.0 = Debug|Win32
{C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Debug|x64.ActiveCfg = Debug|x64
{C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Debug|x64.Build.0 = Debug|x64
- {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Release|ARM.ActiveCfg = Release|Win32
+ {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Release|ARM.ActiveCfg = Release|ARM
+ {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Release|ARM.Build.0 = Release|ARM
+ {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Release|ARM64.ActiveCfg = Release|ARM64
+ {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Release|ARM64.Build.0 = Release|ARM64
{C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Release|Win32.ActiveCfg = Release|Win32
{C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Release|Win32.Build.0 = Release|Win32
{C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Release|x64.ActiveCfg = Release|x64
{C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Release|x64.Build.0 = Release|x64
- {E7611F49-F088-4175-9446-6111444E72C8}.Debug|ARM.ActiveCfg = Debug|Win32
+ {E7611F49-F088-4175-9446-6111444E72C8}.Debug|ARM.ActiveCfg = Debug|ARM
+ {E7611F49-F088-4175-9446-6111444E72C8}.Debug|ARM.Build.0 = Debug|ARM
+ {E7611F49-F088-4175-9446-6111444E72C8}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {E7611F49-F088-4175-9446-6111444E72C8}.Debug|ARM64.Build.0 = Debug|ARM64
{E7611F49-F088-4175-9446-6111444E72C8}.Debug|Win32.ActiveCfg = Debug|Win32
{E7611F49-F088-4175-9446-6111444E72C8}.Debug|Win32.Build.0 = Debug|Win32
{E7611F49-F088-4175-9446-6111444E72C8}.Debug|x64.ActiveCfg = Debug|x64
{E7611F49-F088-4175-9446-6111444E72C8}.Debug|x64.Build.0 = Debug|x64
- {E7611F49-F088-4175-9446-6111444E72C8}.Release|ARM.ActiveCfg = Release|Win32
+ {E7611F49-F088-4175-9446-6111444E72C8}.Release|ARM.ActiveCfg = Release|ARM
+ {E7611F49-F088-4175-9446-6111444E72C8}.Release|ARM.Build.0 = Release|ARM
+ {E7611F49-F088-4175-9446-6111444E72C8}.Release|ARM64.ActiveCfg = Release|ARM64
+ {E7611F49-F088-4175-9446-6111444E72C8}.Release|ARM64.Build.0 = Release|ARM64
{E7611F49-F088-4175-9446-6111444E72C8}.Release|Win32.ActiveCfg = Release|Win32
{E7611F49-F088-4175-9446-6111444E72C8}.Release|Win32.Build.0 = Release|Win32
{E7611F49-F088-4175-9446-6111444E72C8}.Release|x64.ActiveCfg = Release|x64
{E7611F49-F088-4175-9446-6111444E72C8}.Release|x64.Build.0 = Release|x64
- {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Debug|ARM.ActiveCfg = Debug|Win32
+ {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Debug|ARM.ActiveCfg = Debug|ARM
+ {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Debug|ARM.Build.0 = Debug|ARM
+ {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Debug|ARM64.Build.0 = Debug|ARM64
{659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Debug|Win32.ActiveCfg = Debug|Win32
{659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Debug|Win32.Build.0 = Debug|Win32
{659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Debug|x64.ActiveCfg = Debug|x64
{659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Debug|x64.Build.0 = Debug|x64
- {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Release|ARM.ActiveCfg = Release|Win32
+ {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Release|ARM.ActiveCfg = Release|ARM
+ {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Release|ARM.Build.0 = Release|ARM
+ {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Release|ARM64.ActiveCfg = Release|ARM64
+ {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Release|ARM64.Build.0 = Release|ARM64
{659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Release|Win32.ActiveCfg = Release|Win32
{659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Release|Win32.Build.0 = Release|Win32
{659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Release|x64.ActiveCfg = Release|x64
{659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Release|x64.Build.0 = Release|x64
{B1D53358-37BD-48BC-B27C-68BAF1E78508}.Debug|ARM.ActiveCfg = Debug|ARM
{B1D53358-37BD-48BC-B27C-68BAF1E78508}.Debug|ARM.Build.0 = Debug|ARM
+ {B1D53358-37BD-48BC-B27C-68BAF1E78508}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {B1D53358-37BD-48BC-B27C-68BAF1E78508}.Debug|ARM64.Build.0 = Debug|ARM64
{B1D53358-37BD-48BC-B27C-68BAF1E78508}.Debug|Win32.ActiveCfg = Debug|Win32
{B1D53358-37BD-48BC-B27C-68BAF1E78508}.Debug|Win32.Build.0 = Debug|Win32
{B1D53358-37BD-48BC-B27C-68BAF1E78508}.Debug|x64.ActiveCfg = Debug|x64
{B1D53358-37BD-48BC-B27C-68BAF1E78508}.Debug|x64.Build.0 = Debug|x64
{B1D53358-37BD-48BC-B27C-68BAF1E78508}.Release|ARM.ActiveCfg = Release|ARM
{B1D53358-37BD-48BC-B27C-68BAF1E78508}.Release|ARM.Build.0 = Release|ARM
+ {B1D53358-37BD-48BC-B27C-68BAF1E78508}.Release|ARM64.ActiveCfg = Release|ARM64
+ {B1D53358-37BD-48BC-B27C-68BAF1E78508}.Release|ARM64.Build.0 = Release|ARM64
{B1D53358-37BD-48BC-B27C-68BAF1E78508}.Release|Win32.ActiveCfg = Release|Win32
{B1D53358-37BD-48BC-B27C-68BAF1E78508}.Release|Win32.Build.0 = Release|Win32
{B1D53358-37BD-48BC-B27C-68BAF1E78508}.Release|x64.ActiveCfg = Release|x64
{B1D53358-37BD-48BC-B27C-68BAF1E78508}.Release|x64.Build.0 = Release|x64
{6786C051-383B-47E0-9E82-B8B994E06A25}.Debug|ARM.ActiveCfg = Debug|ARM
{6786C051-383B-47E0-9E82-B8B994E06A25}.Debug|ARM.Build.0 = Debug|ARM
+ {6786C051-383B-47E0-9E82-B8B994E06A25}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {6786C051-383B-47E0-9E82-B8B994E06A25}.Debug|ARM64.Build.0 = Debug|ARM64
{6786C051-383B-47E0-9E82-B8B994E06A25}.Debug|Win32.ActiveCfg = Debug|Win32
{6786C051-383B-47E0-9E82-B8B994E06A25}.Debug|Win32.Build.0 = Debug|Win32
{6786C051-383B-47E0-9E82-B8B994E06A25}.Debug|x64.ActiveCfg = Debug|x64
{6786C051-383B-47E0-9E82-B8B994E06A25}.Debug|x64.Build.0 = Debug|x64
{6786C051-383B-47E0-9E82-B8B994E06A25}.Release|ARM.ActiveCfg = Release|ARM
{6786C051-383B-47E0-9E82-B8B994E06A25}.Release|ARM.Build.0 = Release|ARM
+ {6786C051-383B-47E0-9E82-B8B994E06A25}.Release|ARM64.ActiveCfg = Release|ARM64
+ {6786C051-383B-47E0-9E82-B8B994E06A25}.Release|ARM64.Build.0 = Release|ARM64
{6786C051-383B-47E0-9E82-B8B994E06A25}.Release|Win32.ActiveCfg = Release|Win32
{6786C051-383B-47E0-9E82-B8B994E06A25}.Release|Win32.Build.0 = Release|Win32
{6786C051-383B-47E0-9E82-B8B994E06A25}.Release|x64.ActiveCfg = Release|x64
{6786C051-383B-47E0-9E82-B8B994E06A25}.Release|x64.Build.0 = Release|x64
{C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Debug|ARM.ActiveCfg = Debug|ARM
{C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Debug|ARM.Build.0 = Debug|ARM
+ {C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Debug|ARM64.Build.0 = Debug|ARM64
{C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Debug|Win32.ActiveCfg = Debug|Win32
{C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Debug|Win32.Build.0 = Debug|Win32
{C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Debug|x64.ActiveCfg = Debug|x64
{C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Debug|x64.Build.0 = Debug|x64
{C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Release|ARM.ActiveCfg = Release|ARM
{C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Release|ARM.Build.0 = Release|ARM
+ {C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Release|ARM64.ActiveCfg = Release|ARM64
+ {C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Release|ARM64.Build.0 = Release|ARM64
{C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Release|Win32.ActiveCfg = Release|Win32
{C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Release|Win32.Build.0 = Release|Win32
{C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Release|x64.ActiveCfg = Release|x64
diff --git a/Build/source/libs/icu/icu-src/source/allinone/icucheck.bat b/Build/source/libs/icu/icu-src/source/allinone/icucheck.bat
index 9fc56fa03c2..1f84a6dbb9b 100755
--- a/Build/source/libs/icu/icu-src/source/allinone/icucheck.bat
+++ b/Build/source/libs/icu/icu-src/source/allinone/icucheck.bat
@@ -11,7 +11,7 @@ set ICU_ARCH=%1
set ICU_DBRL=%2
if "%1" == "" (
-echo Usage: %0 "x86 or x64" "Debug or Release"
+echo Usage: %0 "x86 or x64 or ARM or ARM64" "Debug or Release"
exit /b 1
)
@@ -25,9 +25,13 @@ set ICU_OPATH=%PATH%
set ICU_ICUDIR="%~dp0"\..\..
if "%ICU_ARCH%" == "x64" (
-set ICU_BINDIR=%~dp0\..\..\bin64
+ set ICU_BINDIR=%~dp0\..\..\bin64
+) else if "%ICU_ARCH%" == "ARM64" (
+ set ICU_BINDIR=%~dp0\..\..\binARM64
+) else if "%ICU_ARCH%" == "ARM" (
+ set ICU_BINDIR=%~dp0\..\..\binARM
) else (
-set ICU_BINDIR=%~dp0\..\..\bin
+ set ICU_BINDIR=%~dp0\..\..\bin
)
set PATH=%ICU_BINDIR%;%PATH%
diff --git a/Build/source/libs/icu/icu-src/source/common/Makefile.in b/Build/source/libs/icu/icu-src/source/common/Makefile.in
index e10d3a27d3a..d21f5d06b12 100644
--- a/Build/source/libs/icu/icu-src/source/common/Makefile.in
+++ b/Build/source/libs/icu/icu-src/source/common/Makefile.in
@@ -88,7 +88,9 @@ ucnv_u7.o ucnv_u8.o ucnv_u16.o ucnv_u32.o ucnvscsu.o ucnvbocu.o \
ucnv_ext.o ucnvmbcs.o ucnv2022.o ucnvhz.o ucnv_lmb.o ucnvisci.o ucnvdisp.o ucnv_set.o ucnv_ct.o \
resource.o uresbund.o ures_cnv.o uresdata.o resbund.o resbund_cnv.o \
ucurr.o \
+localebuilder.o localeprioritylist.o \
messagepattern.o ucat.o locmap.o uloc.o locid.o locutil.o locavailable.o locdispnames.o locdspnm.o loclikely.o locresdata.o \
+lsr.o loclikelysubtags.o locdistance.o localematcher.o \
bytestream.o stringpiece.o bytesinkutil.o \
stringtriebuilder.o bytestriebuilder.o \
bytestrie.o bytestrieiterator.o \
@@ -114,7 +116,8 @@ ulist.o uloc_tag.o icudataver.o icuplug.o \
sharedobject.o simpleformatter.o unifiedcache.o uloc_keytype.o \
ubiditransform.o \
pluralmap.o \
-static_unicode_sets.o
+static_unicode_sets.o \
+restrace.o
## Header files to install
HEADERS = $(srcdir)/unicode/*.h
diff --git a/Build/source/libs/icu/icu-src/source/common/brkeng.cpp b/Build/source/libs/icu/icu-src/source/common/brkeng.cpp
index 7144af60b24..78492db6620 100644
--- a/Build/source/libs/icu/icu-src/source/common/brkeng.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/brkeng.cpp
@@ -124,13 +124,12 @@ static void U_CALLCONV _deleteEngine(void *obj) {
U_CDECL_END
U_NAMESPACE_BEGIN
-static UMutex gBreakEngineMutex = U_MUTEX_INITIALIZER;
-
const LanguageBreakEngine *
ICULanguageBreakFactory::getEngineFor(UChar32 c) {
const LanguageBreakEngine *lbe = NULL;
UErrorCode status = U_ZERO_ERROR;
+ static UMutex gBreakEngineMutex;
Mutex m(&gBreakEngineMutex);
if (fEngines == NULL) {
diff --git a/Build/source/libs/icu/icu-src/source/common/brkiter.cpp b/Build/source/libs/icu/icu-src/source/common/brkiter.cpp
index 52e5c7cf923..3d1366a6688 100644
--- a/Build/source/libs/icu/icu-src/source/common/brkiter.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/brkiter.cpp
@@ -277,7 +277,7 @@ ICUBreakIteratorService::~ICUBreakIteratorService() {}
// defined in ucln_cmn.h
U_NAMESPACE_END
-static icu::UInitOnce gInitOnceBrkiter;
+static icu::UInitOnce gInitOnceBrkiter = U_INITONCE_INITIALIZER;
static icu::ICULocaleService* gService = NULL;
diff --git a/Build/source/libs/icu/icu-src/source/common/bytesinkutil.h b/Build/source/libs/icu/icu-src/source/common/bytesinkutil.h
index 69e4cbcd263..6808fbe6777 100644
--- a/Build/source/libs/icu/icu-src/source/common/bytesinkutil.h
+++ b/Build/source/libs/icu/icu-src/source/common/bytesinkutil.h
@@ -59,7 +59,7 @@ private:
ByteSink &sink, uint32_t options, Edits *edits);
};
-class CharStringByteSink : public ByteSink {
+class U_COMMON_API CharStringByteSink : public ByteSink {
public:
CharStringByteSink(CharString* dest);
~CharStringByteSink() override;
diff --git a/Build/source/libs/icu/icu-src/source/common/capi_helper.h b/Build/source/libs/icu/icu-src/source/common/capi_helper.h
new file mode 100644
index 00000000000..54b1db9e331
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/common/capi_helper.h
@@ -0,0 +1,97 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#ifndef __CAPI_HELPER_H__
+#define __CAPI_HELPER_H__
+
+#include "unicode/utypes.h"
+
+U_NAMESPACE_BEGIN
+
+/**
+ * An internal helper class to help convert between C and C++ APIs.
+ */
+template<typename CType, typename CPPType, int32_t kMagic>
+class IcuCApiHelper {
+ public:
+ /**
+ * Convert from the C type to the C++ type (const version).
+ */
+ static const CPPType* validate(const CType* input, UErrorCode& status);
+
+ /**
+ * Convert from the C type to the C++ type (non-const version).
+ */
+ static CPPType* validate(CType* input, UErrorCode& status);
+
+ /**
+ * Convert from the C++ type to the C type (const version).
+ */
+ const CType* exportConstForC() const;
+
+ /**
+ * Convert from the C++ type to the C type (non-const version).
+ */
+ CType* exportForC();
+
+ /**
+ * Invalidates the object.
+ */
+ ~IcuCApiHelper();
+
+ private:
+ /**
+ * While the object is valid, fMagic equals kMagic.
+ */
+ int32_t fMagic = kMagic;
+};
+
+
+template<typename CType, typename CPPType, int32_t kMagic>
+const CPPType*
+IcuCApiHelper<CType, CPPType, kMagic>::validate(const CType* input, UErrorCode& status) {
+ if (U_FAILURE(status)) {
+ return nullptr;
+ }
+ if (input == nullptr) {
+ status = U_ILLEGAL_ARGUMENT_ERROR;
+ return nullptr;
+ }
+ auto* impl = reinterpret_cast<const CPPType*>(input);
+ if (static_cast<const IcuCApiHelper<CType, CPPType, kMagic>*>(impl)->fMagic != kMagic) {
+ status = U_INVALID_FORMAT_ERROR;
+ return nullptr;
+ }
+ return impl;
+}
+
+template<typename CType, typename CPPType, int32_t kMagic>
+CPPType*
+IcuCApiHelper<CType, CPPType, kMagic>::validate(CType* input, UErrorCode& status) {
+ auto* constInput = static_cast<const CType*>(input);
+ auto* validated = validate(constInput, status);
+ return const_cast<CPPType*>(validated);
+}
+
+template<typename CType, typename CPPType, int32_t kMagic>
+const CType*
+IcuCApiHelper<CType, CPPType, kMagic>::exportConstForC() const {
+ return reinterpret_cast<const CType*>(static_cast<const CPPType*>(this));
+}
+
+template<typename CType, typename CPPType, int32_t kMagic>
+CType*
+IcuCApiHelper<CType, CPPType, kMagic>::exportForC() {
+ return reinterpret_cast<CType*>(static_cast<CPPType*>(this));
+}
+
+template<typename CType, typename CPPType, int32_t kMagic>
+IcuCApiHelper<CType, CPPType, kMagic>::~IcuCApiHelper() {
+ // head off application errors by preventing use of of deleted objects.
+ fMagic = 0;
+}
+
+
+U_NAMESPACE_END
+
+#endif // __CAPI_HELPER_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/characterproperties.cpp b/Build/source/libs/icu/icu-src/source/common/characterproperties.cpp
index 3aff85b3f11..7b50a4e2051 100644
--- a/Build/source/libs/icu/icu-src/source/common/characterproperties.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/characterproperties.cpp
@@ -23,6 +23,11 @@
#include "umutex.h"
#include "uprops.h"
+using icu::LocalPointer;
+#if !UCONFIG_NO_NORMALIZATION
+using icu::Normalizer2Factory;
+using icu::Normalizer2Impl;
+#endif
using icu::UInitOnce;
using icu::UnicodeSet;
@@ -30,17 +35,19 @@ namespace {
UBool U_CALLCONV characterproperties_cleanup();
+constexpr int32_t NUM_INCLUSIONS = UPROPS_SRC_COUNT + UCHAR_INT_LIMIT - UCHAR_INT_START;
+
struct Inclusion {
- UnicodeSet *fSet;
- UInitOnce fInitOnce;
+ UnicodeSet *fSet = nullptr;
+ UInitOnce fInitOnce = U_INITONCE_INITIALIZER;
};
-Inclusion gInclusions[UPROPS_SRC_COUNT]; // cached getInclusions()
+Inclusion gInclusions[NUM_INCLUSIONS]; // cached getInclusions()
UnicodeSet *sets[UCHAR_BINARY_LIMIT] = {};
UCPMap *maps[UCHAR_INT_LIMIT - UCHAR_INT_START] = {};
-UMutex cpMutex = U_MUTEX_INITIALIZER;
+icu::UMutex cpMutex;
//----------------------------------------------------------------
// Inclusions list
@@ -80,35 +87,22 @@ UBool U_CALLCONV characterproperties_cleanup() {
return TRUE;
}
-} // namespace
-
-U_NAMESPACE_BEGIN
-
-/*
-Reduce excessive reallocation, and make it easier to detect initialization problems.
-Usually you don't see smaller sets than this for Unicode 5.0.
-*/
-constexpr int32_t DEFAULT_INCLUSION_CAPACITY = 3072;
-
-void U_CALLCONV CharacterProperties::initInclusion(UPropertySource src, UErrorCode &errorCode) {
+void U_CALLCONV initInclusion(UPropertySource src, UErrorCode &errorCode) {
// This function is invoked only via umtx_initOnce().
- // This function is a friend of class UnicodeSet.
-
U_ASSERT(0 <= src && src < UPROPS_SRC_COUNT);
if (src == UPROPS_SRC_NONE) {
errorCode = U_INTERNAL_PROGRAM_ERROR;
return;
}
- UnicodeSet * &incl = gInclusions[src].fSet;
- U_ASSERT(incl == nullptr);
+ U_ASSERT(gInclusions[src].fSet == nullptr);
- incl = new UnicodeSet();
- if (incl == nullptr) {
+ LocalPointer<UnicodeSet> incl(new UnicodeSet());
+ if (incl.isNull()) {
errorCode = U_MEMORY_ALLOCATION_ERROR;
return;
}
USetAdder sa = {
- (USet *)incl,
+ (USet *)incl.getAlias(),
_set_add,
_set_addRange,
_set_addString,
@@ -116,7 +110,6 @@ void U_CALLCONV CharacterProperties::initInclusion(UPropertySource src, UErrorCo
nullptr // don't need removeRange()
};
- incl->ensureCapacity(DEFAULT_INCLUSION_CAPACITY, errorCode);
switch(src) {
case UPROPS_SRC_CHAR:
uchar_addPropertyStarts(&sa, &errorCode);
@@ -183,12 +176,15 @@ void U_CALLCONV CharacterProperties::initInclusion(UPropertySource src, UErrorCo
}
if (U_FAILURE(errorCode)) {
- delete incl;
- incl = nullptr;
return;
}
- // Compact for caching
+ if (incl->isBogus()) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ // Compact for caching.
incl->compact();
+ gInclusions[src].fSet = incl.orphan();
ucln_common_registerCleanup(UCLN_COMMON_CHARACTERPROPERTIES, characterproperties_cleanup);
}
@@ -199,15 +195,66 @@ const UnicodeSet *getInclusionsForSource(UPropertySource src, UErrorCode &errorC
return nullptr;
}
Inclusion &i = gInclusions[src];
- umtx_initOnce(i.fInitOnce, &CharacterProperties::initInclusion, src, errorCode);
+ umtx_initOnce(i.fInitOnce, &initInclusion, src, errorCode);
return i.fSet;
}
+void U_CALLCONV initIntPropInclusion(UProperty prop, UErrorCode &errorCode) {
+ // This function is invoked only via umtx_initOnce().
+ U_ASSERT(UCHAR_INT_START <= prop && prop < UCHAR_INT_LIMIT);
+ int32_t inclIndex = UPROPS_SRC_COUNT + prop - UCHAR_INT_START;
+ U_ASSERT(gInclusions[inclIndex].fSet == nullptr);
+ UPropertySource src = uprops_getSource(prop);
+ const UnicodeSet *incl = getInclusionsForSource(src, errorCode);
+ if (U_FAILURE(errorCode)) {
+ return;
+ }
+
+ LocalPointer<UnicodeSet> intPropIncl(new UnicodeSet(0, 0));
+ if (intPropIncl.isNull()) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ int32_t numRanges = incl->getRangeCount();
+ int32_t prevValue = 0;
+ for (int32_t i = 0; i < numRanges; ++i) {
+ UChar32 rangeEnd = incl->getRangeEnd(i);
+ for (UChar32 c = incl->getRangeStart(i); c <= rangeEnd; ++c) {
+ // TODO: Get a UCharacterProperty.IntProperty to avoid the property dispatch.
+ int32_t value = u_getIntPropertyValue(c, prop);
+ if (value != prevValue) {
+ intPropIncl->add(c);
+ prevValue = value;
+ }
+ }
+ }
+
+ if (intPropIncl->isBogus()) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ // Compact for caching.
+ intPropIncl->compact();
+ gInclusions[inclIndex].fSet = intPropIncl.orphan();
+ ucln_common_registerCleanup(UCLN_COMMON_CHARACTERPROPERTIES, characterproperties_cleanup);
+}
+
+} // namespace
+
+U_NAMESPACE_BEGIN
+
const UnicodeSet *CharacterProperties::getInclusionsForProperty(
UProperty prop, UErrorCode &errorCode) {
if (U_FAILURE(errorCode)) { return nullptr; }
- UPropertySource src = uprops_getSource(prop);
- return getInclusionsForSource(src, errorCode);
+ if (UCHAR_INT_START <= prop && prop < UCHAR_INT_LIMIT) {
+ int32_t inclIndex = UPROPS_SRC_COUNT + prop - UCHAR_INT_START;
+ Inclusion &i = gInclusions[inclIndex];
+ umtx_initOnce(i.fInitOnce, &initIntPropInclusion, prop, errorCode);
+ return i.fSet;
+ } else {
+ UPropertySource src = uprops_getSource(prop);
+ return getInclusionsForSource(src, errorCode);
+ }
}
U_NAMESPACE_END
@@ -216,7 +263,7 @@ namespace {
UnicodeSet *makeSet(UProperty property, UErrorCode &errorCode) {
if (U_FAILURE(errorCode)) { return nullptr; }
- icu::LocalPointer<UnicodeSet> set(new UnicodeSet());
+ LocalPointer<UnicodeSet> set(new UnicodeSet());
if (set.isNull()) {
errorCode = U_MEMORY_ALLOCATION_ERROR;
return nullptr;
diff --git a/Build/source/libs/icu/icu-src/source/common/charstr.cpp b/Build/source/libs/icu/icu-src/source/common/charstr.cpp
index 852cc539457..dda29dac632 100644
--- a/Build/source/libs/icu/icu-src/source/common/charstr.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/charstr.cpp
@@ -35,6 +35,17 @@ CharString& CharString::operator=(CharString&& src) U_NOEXCEPT {
return *this;
}
+char *CharString::cloneData(UErrorCode &errorCode) const {
+ if (U_FAILURE(errorCode)) { return nullptr; }
+ char *p = static_cast<char *>(uprv_malloc(len + 1));
+ if (p == nullptr) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return nullptr;
+ }
+ uprv_memcpy(p, buffer.getAlias(), len + 1);
+ return p;
+}
+
CharString &CharString::copyFrom(const CharString &s, UErrorCode &errorCode) {
if(U_SUCCESS(errorCode) && this!=&s && ensureCapacity(s.len+1, 0, errorCode)) {
len=s.len;
@@ -52,6 +63,18 @@ int32_t CharString::lastIndexOf(char c) const {
return -1;
}
+bool CharString::contains(StringPiece s) const {
+ if (s.empty()) { return false; }
+ const char *p = buffer.getAlias();
+ int32_t lastStart = len - s.length();
+ for (int32_t i = 0; i <= lastStart; ++i) {
+ if (uprv_memcmp(p + i, s.data(), s.length()) == 0) {
+ return true;
+ }
+ }
+ return false;
+}
+
CharString &CharString::truncate(int32_t newLength) {
if(newLength<0) {
newLength=0;
diff --git a/Build/source/libs/icu/icu-src/source/common/charstr.h b/Build/source/libs/icu/icu-src/source/common/charstr.h
index 1a97e01988f..23b950ed6ec 100644
--- a/Build/source/libs/icu/icu-src/source/common/charstr.h
+++ b/Build/source/libs/icu/icu-src/source/common/charstr.h
@@ -82,10 +82,24 @@ public:
const char *data() const { return buffer.getAlias(); }
char *data() { return buffer.getAlias(); }
+ /**
+ * Allocates length()+1 chars and copies the NUL-terminated data().
+ * The caller must uprv_free() the result.
+ */
+ char *cloneData(UErrorCode &errorCode) const;
+
+ bool operator==(StringPiece other) const {
+ return len == other.length() && (len == 0 || uprv_memcmp(data(), other.data(), len) == 0);
+ }
+ bool operator!=(StringPiece other) const {
+ return !operator==(other);
+ }
/** @return last index of c, or -1 if c is not in this string */
int32_t lastIndexOf(char c) const;
+ bool contains(StringPiece s) const;
+
CharString &clear() { len=0; buffer[0]=0; return *this; }
CharString &truncate(int32_t newLength);
diff --git a/Build/source/libs/icu/icu-src/source/common/cmemory.h b/Build/source/libs/icu/icu-src/source/common/cmemory.h
index f1eef4e7611..7f7fd8d0864 100644
--- a/Build/source/libs/icu/icu-src/source/common/cmemory.h
+++ b/Build/source/libs/icu/icu-src/source/common/cmemory.h
@@ -50,6 +50,7 @@
#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
#define uprv_memcmp(buffer1, buffer2, size) U_STANDARD_CPP_NAMESPACE memcmp(buffer1, buffer2,size)
+#define uprv_memchr(ptr, value, num) U_STANDARD_CPP_NAMESPACE memchr(ptr, value, num)
U_CAPI void * U_EXPORT2
uprv_malloc(size_t s) U_MALLOC_ATTR U_ALLOC_SIZE_ATTR(1);
@@ -64,37 +65,36 @@ U_CAPI void * U_EXPORT2
uprv_calloc(size_t num, size_t size) U_MALLOC_ATTR U_ALLOC_SIZE_ATTR2(1,2);
/**
- * This should align the memory properly on any machine.
- * This is very useful for the safeClone functions.
- */
-typedef union {
- long t1;
- double t2;
- void *t3;
-} UAlignedMemory;
-
-/**
* Get the least significant bits of a pointer (a memory address).
* For example, with a mask of 3, the macro gets the 2 least significant bits,
* which will be 0 if the pointer is 32-bit (4-byte) aligned.
*
- * ptrdiff_t is the most appropriate integer type to cast to.
- * size_t should work too, since on most (or all?) platforms it has the same
- * width as ptrdiff_t.
- */
-#define U_POINTER_MASK_LSB(ptr, mask) (((ptrdiff_t)(char *)(ptr)) & (mask))
-
-/**
- * Get the amount of bytes that a pointer is off by from
- * the previous UAlignedMemory-aligned pointer.
+ * uintptr_t is the most appropriate integer type to cast to.
*/
-#define U_ALIGNMENT_OFFSET(ptr) U_POINTER_MASK_LSB(ptr, sizeof(UAlignedMemory) - 1)
+#define U_POINTER_MASK_LSB(ptr, mask) ((uintptr_t)(ptr) & (mask))
/**
- * Get the amount of bytes to add to a pointer
- * in order to get the next UAlignedMemory-aligned address.
+ * Create & return an instance of "type" in statically allocated storage.
+ * e.g.
+ * static std::mutex *myMutex = STATIC_NEW(std::mutex);
+ * To destroy an object created in this way, invoke the destructor explicitly, e.g.
+ * myMutex->~mutex();
+ * DO NOT use delete.
+ * DO NOT use with class UMutex, which has specific support for static instances.
+ *
+ * STATIC_NEW is intended for use when
+ * - We want a static (or global) object.
+ * - We don't want it to ever be destructed, or to explicitly control destruction,
+ * to avoid use-after-destruction problems.
+ * - We want to avoid an ordinary heap allocated object,
+ * to avoid the possibility of memory allocation failures, and
+ * to avoid memory leak reports, from valgrind, for example.
+ * This is defined as a macro rather than a template function because each invocation
+ * must define distinct static storage for the object being returned.
*/
-#define U_ALIGNMENT_OFFSET_UP(ptr) (sizeof(UAlignedMemory) - U_ALIGNMENT_OFFSET(ptr))
+#define STATIC_NEW(type) [] () { \
+ alignas(type) static char storage[sizeof(type)]; \
+ return new(storage) type();} ()
/**
* Heap clean up function, called from u_cleanup()
@@ -122,6 +122,9 @@ uprv_deleteUObject(void *obj);
#ifdef __cplusplus
+#include <utility>
+#include "unicode/uobject.h"
+
U_NAMESPACE_BEGIN
/**
@@ -161,17 +164,6 @@ public:
* @return *this
*/
LocalMemory<T> &operator=(LocalMemory<T> &&src) U_NOEXCEPT {
- return moveFrom(src);
- }
- /**
- * Move assignment, leaves src with isNull().
- * The behavior is undefined if *this and src are the same object.
- *
- * Can be called explicitly, does not need C++11 support.
- * @param src source smart pointer
- * @return *this
- */
- LocalMemory<T> &moveFrom(LocalMemory<T> &src) U_NOEXCEPT {
uprv_free(LocalPointerBase<T>::ptr);
LocalPointerBase<T>::ptr=src.ptr;
src.ptr=NULL;
@@ -282,11 +274,18 @@ inline T *LocalMemory<T>::allocateInsteadAndCopy(int32_t newCapacity, int32_t le
*
* WARNING: MaybeStackArray only works with primitive (plain-old data) types.
* It does NOT know how to call a destructor! If you work with classes with
- * destructors, consider LocalArray in localpointer.h.
+ * destructors, consider LocalArray in localpointer.h or MemoryPool.
*/
template<typename T, int32_t stackCapacity>
class MaybeStackArray {
public:
+ // No heap allocation. Use only on the stack.
+ static void* U_EXPORT2 operator new(size_t) U_NOEXCEPT = delete;
+ static void* U_EXPORT2 operator new[](size_t) U_NOEXCEPT = delete;
+#if U_HAVE_PLACEMENT_NEW
+ static void* U_EXPORT2 operator new(size_t, void*) U_NOEXCEPT = delete;
+#endif
+
/**
* Default constructor initializes with internal T[stackCapacity] buffer.
*/
@@ -298,7 +297,7 @@ public:
*/
MaybeStackArray(int32_t newCapacity) : MaybeStackArray() {
if (capacity < newCapacity) { resize(newCapacity); }
- };
+ }
/**
* Destructor deletes the array (if owned).
*/
@@ -399,20 +398,6 @@ private:
/* No ownership transfer: No copy constructor, no assignment operator. */
MaybeStackArray(const MaybeStackArray & /*other*/) {}
void operator=(const MaybeStackArray & /*other*/) {}
-
- // No heap allocation. Use only on the stack.
- // (Declaring these functions private triggers a cascade of problems:
- // MSVC insists on exporting an instantiation of MaybeStackArray, which
- // requires that all functions be defined.
- // An empty implementation of new() is rejected, it must return a value.
- // Returning NULL is rejected by gcc for operator new.
- // The expedient thing is just not to override operator new.
- // While relatively pointless, heap allocated instances will function.
- // static void * U_EXPORT2 operator new(size_t size);
- // static void * U_EXPORT2 operator new[](size_t size);
-#if U_HAVE_PLACEMENT_NEW
- // static void * U_EXPORT2 operator new(size_t, void *ptr);
-#endif
};
template<typename T, int32_t stackCapacity>
@@ -509,6 +494,13 @@ inline T *MaybeStackArray<T, stackCapacity>::orphanOrClone(int32_t length, int32
template<typename H, typename T, int32_t stackCapacity>
class MaybeStackHeaderAndArray {
public:
+ // No heap allocation. Use only on the stack.
+ static void* U_EXPORT2 operator new(size_t) U_NOEXCEPT = delete;
+ static void* U_EXPORT2 operator new[](size_t) U_NOEXCEPT = delete;
+#if U_HAVE_PLACEMENT_NEW
+ static void* U_EXPORT2 operator new(size_t, void*) U_NOEXCEPT = delete;
+#endif
+
/**
* Default constructor initializes with internal H+T[stackCapacity] buffer.
*/
@@ -605,15 +597,6 @@ private:
/* No ownership transfer: No copy constructor, no assignment operator. */
MaybeStackHeaderAndArray(const MaybeStackHeaderAndArray & /*other*/) {}
void operator=(const MaybeStackHeaderAndArray & /*other*/) {}
-
- // No heap allocation. Use only on the stack.
- // (Declaring these functions private triggers a cascade of problems;
- // see the MaybeStackArray class for details.)
- // static void * U_EXPORT2 operator new(size_t size);
- // static void * U_EXPORT2 operator new[](size_t size);
-#if U_HAVE_PLACEMENT_NEW
- // static void * U_EXPORT2 operator new(size_t, void *ptr);
-#endif
};
template<typename H, typename T, int32_t stackCapacity>
@@ -675,6 +658,78 @@ inline H *MaybeStackHeaderAndArray<H, T, stackCapacity>::orphanOrClone(int32_t l
return p;
}
+/**
+ * A simple memory management class that creates new heap allocated objects (of
+ * any class that has a public constructor), keeps track of them and eventually
+ * deletes them all in its own destructor.
+ *
+ * A typical use-case would be code like this:
+ *
+ * MemoryPool<MyType> pool;
+ *
+ * MyType* o1 = pool.create();
+ * if (o1 != nullptr) {
+ * foo(o1);
+ * }
+ *
+ * MyType* o2 = pool.create(1, 2, 3);
+ * if (o2 != nullptr) {
+ * bar(o2);
+ * }
+ *
+ * // MemoryPool will take care of deleting the MyType objects.
+ *
+ * It doesn't do anything more than that, and is intentionally kept minimalist.
+ */
+template<typename T, int32_t stackCapacity = 8>
+class MemoryPool : public UMemory {
+public:
+ MemoryPool() : count(0), pool() {}
+
+ ~MemoryPool() {
+ for (int32_t i = 0; i < count; ++i) {
+ delete pool[i];
+ }
+ }
+
+ MemoryPool(const MemoryPool&) = delete;
+ MemoryPool& operator=(const MemoryPool&) = delete;
+
+ MemoryPool(MemoryPool&& other) U_NOEXCEPT : count(other.count),
+ pool(std::move(other.pool)) {
+ other.count = 0;
+ }
+
+ MemoryPool& operator=(MemoryPool&& other) U_NOEXCEPT {
+ count = other.count;
+ pool = std::move(other.pool);
+ other.count = 0;
+ return *this;
+ }
+
+ /**
+ * Creates a new object of typename T, by forwarding any and all arguments
+ * to the typename T constructor.
+ *
+ * @param args Arguments to be forwarded to the typename T constructor.
+ * @return A pointer to the newly created object, or nullptr on error.
+ */
+ template<typename... Args>
+ T* create(Args&&... args) {
+ int32_t capacity = pool.getCapacity();
+ if (count == capacity &&
+ pool.resize(capacity == stackCapacity ? 4 * capacity : 2 * capacity,
+ capacity) == nullptr) {
+ return nullptr;
+ }
+ return pool[count++] = new T(std::forward<Args>(args)...);
+ }
+
+private:
+ int32_t count;
+ MaybeStackArray<T*, stackCapacity> pool;
+};
+
U_NAMESPACE_END
#endif /* __cplusplus */
diff --git a/Build/source/libs/icu/icu-src/source/common/common.vcxproj b/Build/source/libs/icu/icu-src/source/common/common.vcxproj
index 7df7f15fa42..54eb011a647 100644
--- a/Build/source/libs/icu/icu-src/source/common/common.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/common/common.vcxproj
@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\allinone\Build.Windows.ProjectConfiguration.props" />
- <!-- The following import will include the library configuration options for VS projects. -->
- <Import Project="..\allinone\Build.Windows.Library.ProjectConfiguration.props" />
<PropertyGroup Label="Globals">
<ProjectGuid>{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\allinone\Build.Windows.ProjectConfiguration.props" />
+ <!-- The following import will include the library configuration options for VS projects. -->
+ <Import Project="..\allinone\Build.Windows.Library.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -35,29 +35,35 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\..\..\lib\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\..\..\lib\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
<!-- Options that are common to *all* "common" project configurations -->
<ItemDefinitionGroup>
+ <Midl>
+ <TypeLibraryName>$(OutDir)\icuuc.tlb</TypeLibraryName>
+ </Midl>
<ClCompile>
<PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;U_COMMON_IMPLEMENTATION;U_PLATFORM_USES_ONLY_WIN32_API=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<DisableLanguageExtensions>false</DisableLanguageExtensions>
<WarningLevel>Level3</WarningLevel>
+ <CompileAs>Default</CompileAs>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <PrecompiledHeaderOutputFile>$(OutDir)/icuuc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)/icuuc.pdb</ProgramDataBaseFileName>
</ClCompile>
<Link>
+ <!-- The icudt.lib is for U_ICUDATA_ENTRY_POINT -->
<AdditionalDependencies>icudt.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <BaseAddress>0x4a800000</BaseAddress>
+ <AdditionalLibraryDirectories>.\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<!-- Options that are common to all 'Debug' project configurations -->
@@ -67,6 +73,11 @@
<BrowseInformation>true</BrowseInformation>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
+ <Link>
+ <OutputFile>..\..\$(IcuBinOutputDir)\icuuc65d.dll</OutputFile>
+ <ProgramDatabaseFile>.\..\..\$(IcuLibOutputDir)\icuucd.pdb</ProgramDatabaseFile>
+ <ImportLibrary>..\..\$(IcuLibOutputDir)\icuucd.lib</ImportLibrary>
+ </Link>
</ItemDefinitionGroup>
<!-- Options that are common to all 'Release' project configurations -->
<ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
@@ -74,79 +85,10 @@
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
</ClCompile>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Midl>
- <TypeLibraryName>.\..\..\lib\icuuc.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <PrecompiledHeaderOutputFile>.\x86\Release/common.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
- </ClCompile>
- <Link>
- <OutputFile>..\..\bin\icuuc63.dll</OutputFile>
- <AdditionalLibraryDirectories>.\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\..\..\lib\icuuc.pdb</ProgramDatabaseFile>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
- <ImportLibrary>..\..\lib\icuuc.lib</ImportLibrary>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Midl>
- <TypeLibraryName>.\..\..\lib\icuucd.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <PrecompiledHeaderOutputFile>.\x86\Debug/common.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- </ClCompile>
- <Link>
- <OutputFile>..\..\bin\icuuc63d.dll</OutputFile>
- <AdditionalLibraryDirectories>.\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\..\..\lib\icuucd.pdb</ProgramDatabaseFile>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
- <ImportLibrary>..\..\lib\icuucd.lib</ImportLibrary>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Midl>
- <TypeLibraryName>.\..\..\lib64\icuuc.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <PrecompiledHeaderOutputFile>.\x64\Release/common.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- </ClCompile>
- <Link>
- <OutputFile>..\..\bin64\icuuc63.dll</OutputFile>
- <AdditionalLibraryDirectories>.\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\..\..\lib64\icuuc.pdb</ProgramDatabaseFile>
- <ImportLibrary>..\..\lib64\icuuc.lib</ImportLibrary>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Midl>
- <TypeLibraryName>.\..\..\lib64\icuucd.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <PrecompiledHeaderOutputFile>.\x64\Debug/common.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- </ClCompile>
<Link>
- <OutputFile>..\..\bin64\icuuc63d.dll</OutputFile>
- <AdditionalLibraryDirectories>.\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\..\..\lib64\icuucd.pdb</ProgramDatabaseFile>
- <ImportLibrary>..\..\lib64\icuucd.lib</ImportLibrary>
+ <OutputFile>..\..\$(IcuBinOutputDir)\icuuc65.dll</OutputFile>
+ <ProgramDatabaseFile>.\..\..\$(IcuLibOutputDir)\icuuc.pdb</ProgramDatabaseFile>
+ <ImportLibrary>..\..\$(IcuLibOutputDir)\icuuc.lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
@@ -238,14 +180,20 @@
<ClCompile Include="punycode.cpp" />
<ClCompile Include="uidna.cpp" />
<ClCompile Include="uts46.cpp" />
+ <ClCompile Include="localebuilder.cpp" />
+ <ClCompile Include="localematcher.cpp" />
+ <ClCompile Include="localeprioritylist.cpp" />
<ClCompile Include="locavailable.cpp" />
<ClCompile Include="locbased.cpp" />
<ClCompile Include="locdispnames.cpp" />
+ <ClCompile Include="locdistance.cpp" />
<ClCompile Include="locdspnm.cpp" />
<ClCompile Include="locid.cpp" />
<ClCompile Include="loclikely.cpp" />
+ <ClCompile Include="loclikelysubtags.cpp" />
<ClCompile Include="locresdata.cpp" />
<ClCompile Include="locutil.cpp" />
+ <ClCompile Include="lsr.cpp" />
<ClCompile Include="resbund.cpp" />
<ClCompile Include="resbund_cnv.cpp" />
<ClCompile Include="ucat.cpp" />
@@ -338,6 +286,7 @@
<ClCompile Include="utext.cpp" />
<ClCompile Include="utf_impl.cpp" />
<ClCompile Include="static_unicode_sets.cpp" />
+ <ClCompile Include="restrace.cpp" />
<ClInclude Include="localsvc.h" />
<ClInclude Include="msvcres.h" />
<ClInclude Include="pluralmap.h" />
@@ -405,8 +354,12 @@
<ClInclude Include="ustrfmt.h" />
<ClInclude Include="util.h" />
<ClInclude Include="punycode.h" />
+ <ClInclude Include="localeprioritylist.h" />
<ClInclude Include="locbased.h" />
+ <ClInclude Include="locdistance.h" />
+ <ClInclude Include="loclikelysubtags.h" />
<ClInclude Include="locutil.h" />
+ <ClInclude Include="lsr.h" />
<ClInclude Include="sharedobject.h" />
<ClCompile Include="sharedobject.cpp" />
<ClInclude Include="ulocimp.h" />
@@ -425,6 +378,7 @@
<ClInclude Include="propname.h" />
<ClInclude Include="ruleiter.h" />
<ClInclude Include="ucase.h" />
+ <ClInclude Include="ulayout_props.h" />
<ClInclude Include="unisetspan.h" />
<ClInclude Include="uprops.h" />
<ClInclude Include="usc_impl.h" />
@@ -444,6 +398,8 @@
<ClInclude Include="ustr_cnv.h" />
<ClInclude Include="ustr_imp.h" />
<ClInclude Include="static_unicode_sets.h" />
+ <ClInclude Include="capi_helper.h" />
+ <ClInclude Include="restrace.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="common.rc" />
diff --git a/Build/source/libs/icu/icu-src/source/common/common.vcxproj.filters b/Build/source/libs/icu/icu-src/source/common/common.vcxproj.filters
index 99ed94fbd70..5fabc6f4619 100644
--- a/Build/source/libs/icu/icu-src/source/common/common.vcxproj.filters
+++ b/Build/source/libs/icu/icu-src/source/common/common.vcxproj.filters
@@ -313,6 +313,15 @@
<ClCompile Include="uts46.cpp">
<Filter>idna</Filter>
</ClCompile>
+ <ClCompile Include="localebuilder.cpp">
+ <Filter>locales &amp; resources</Filter>
+ </ClCompile>
+ <ClCompile Include="localematcher.cpp">
+ <Filter>locales &amp; resources</Filter>
+ </ClCompile>
+ <ClCompile Include="localeprioritylist.cpp">
+ <Filter>locales &amp; resources</Filter>
+ </ClCompile>
<ClCompile Include="locavailable.cpp">
<Filter>locales &amp; resources</Filter>
</ClCompile>
@@ -322,18 +331,27 @@
<ClCompile Include="locdispnames.cpp">
<Filter>locales &amp; resources</Filter>
</ClCompile>
+ <ClCompile Include="locdistance.cpp">
+ <Filter>locales &amp; resources</Filter>
+ </ClCompile>
<ClCompile Include="locid.cpp">
<Filter>locales &amp; resources</Filter>
</ClCompile>
<ClCompile Include="loclikely.cpp">
<Filter>locales &amp; resources</Filter>
</ClCompile>
+ <ClCompile Include="loclikelysubtags.cpp">
+ <Filter>locales &amp; resources</Filter>
+ </ClCompile>
<ClCompile Include="locresdata.cpp">
<Filter>locales &amp; resources</Filter>
</ClCompile>
<ClCompile Include="locutil.cpp">
<Filter>locales &amp; resources</Filter>
</ClCompile>
+ <ClCompile Include="lsr.cpp">
+ <Filter>locales &amp; resources</Filter>
+ </ClCompile>
<ClCompile Include="resbund.cpp">
<Filter>locales &amp; resources</Filter>
</ClCompile>
@@ -616,6 +634,9 @@
<ClCompile Include="static_unicode_sets.cpp">
<Filter>formatting</Filter>
</ClCompile>
+ <ClCompile Include="restrace.cpp">
+ <Filter>data &amp; memory</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="ubidi_props.h">
@@ -810,12 +831,24 @@
<ClInclude Include="punycode.h">
<Filter>idna</Filter>
</ClInclude>
+ <ClInclude Include="localeprioritylist.h">
+ <Filter>locales &amp; resources</Filter>
+ </ClInclude>
<ClInclude Include="locbased.h">
<Filter>locales &amp; resources</Filter>
</ClInclude>
+ <ClInclude Include="locdistance.h">
+ <Filter>locales &amp; resources</Filter>
+ </ClInclude>
+ <ClInclude Include="loclikelysubtags.h">
+ <Filter>locales &amp; resources</Filter>
+ </ClInclude>
<ClInclude Include="locutil.h">
<Filter>locales &amp; resources</Filter>
</ClInclude>
+ <ClInclude Include="lsr.h">
+ <Filter>locales &amp; resources</Filter>
+ </ClInclude>
<ClInclude Include="ulocimp.h">
<Filter>locales &amp; resources</Filter>
</ClInclude>
@@ -852,6 +885,9 @@
<ClInclude Include="ucase.h">
<Filter>properties &amp; sets</Filter>
</ClInclude>
+ <ClInclude Include="ulayout_props.h">
+ <Filter>properties &amp; sets</Filter>
+ </ClInclude>
<ClInclude Include="unisetspan.h">
<Filter>properties &amp; sets</Filter>
</ClInclude>
@@ -948,6 +984,12 @@
<ClInclude Include="static_unicode_sets.h">
<Filter>formatting</Filter>
</ClInclude>
+ <ClInclude Include="capi_helper.h">
+ <Filter>data &amp; memory</Filter>
+ </ClInclude>
+ <ClInclude Include="restrace.h">
+ <Filter>data &amp; memory</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="common.rc">
@@ -1063,6 +1105,12 @@
<CustomBuild Include="unicode\uidna.h">
<Filter>idna</Filter>
</CustomBuild>
+ <CustomBuild Include="unicode\localebuilder.h">
+ <Filter>locales &amp; resources</Filter>
+ </CustomBuild>
+ <CustomBuild Include="unicode\localematcher.h">
+ <Filter>locales &amp; resources</Filter>
+ </CustomBuild>
<CustomBuild Include="unicode\locid.h">
<Filter>locales &amp; resources</Filter>
</CustomBuild>
diff --git a/Build/source/libs/icu/icu-src/source/common/common_uwp.vcxproj b/Build/source/libs/icu/icu-src/source/common/common_uwp.vcxproj
index f532cff2f89..8469178d096 100644
--- a/Build/source/libs/icu/icu-src/source/common/common_uwp.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/common/common_uwp.vcxproj
@@ -1,9 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the UWP configuration options for VS projects. -->
- <Import Project="..\allinone\Build.Windows.UWP.ProjectConfiguration.props" />
- <!-- The following import will include the library configuration options for VS projects. -->
- <Import Project="..\allinone\Build.Windows.Library.ProjectConfiguration.props" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
@@ -17,6 +13,10 @@
<Configuration>Debug</Configuration>
<Platform>ARM</Platform>
</ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|ARM64">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -29,18 +29,26 @@
<Configuration>Release</Configuration>
<Platform>ARM</Platform>
</ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM64">
+ <Configuration>Release</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{C10CF34B-3F79-430E-AD38-5A32DC0589C2}</ProjectGuid>
<Keyword>DynamicLibrary</Keyword>
<DefaultLanguage>en-US</DefaultLanguage>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+<!-- The following import will include the UWP configuration options for VS projects. -->
+ <Import Project="..\allinone\Build.Windows.UWP.ProjectConfiguration.props" />
+ <!-- The following import will include the library configuration options for VS projects. -->
+ <Import Project="..\allinone\Build.Windows.Library.ProjectConfiguration.props" />
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -51,26 +59,21 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\ReleaseUWP\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\ReleaseUWP\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\DebugUWP\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\DebugUWP\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\ReleaseUWP\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\ReleaseUWP\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\DebugUWP\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\DebugUWP\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">.\arm\ReleaseUWP\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">.\arm\ReleaseUWP\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">.\arm\DebugUWP\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">.\arm\DebugUWP\</IntDir>
- <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)UWP\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)UWP\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)UWP\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)UWP\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
<LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup>
<!-- Options that are common to *all* configurations -->
<Midl>
<MkTypLibCompatible>true</MkTypLibCompatible>
<SuppressStartupBanner>true</SuppressStartupBanner>
+ <TypeLibraryName>$(OutDir)\icuuc.tlb</TypeLibraryName>
</Midl>
<ClCompile>
<AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
@@ -89,6 +92,11 @@
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<CompileAsWinRT>false</CompileAsWinRT>
<AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+ <PrecompiledHeaderOutputFile>$(OutDir)/icuuc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)/icuuc.pdb</ProgramDataBaseFileName>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<ResourceCompile>
<Culture>0x0409</Culture>
@@ -102,6 +110,8 @@
</DataExecutionPrevention>
<TurnOffAssemblyGeneration>true</TurnOffAssemblyGeneration>
<IgnoreSpecificDefaultLibraries>vccorlib.lib;msvcrt.lib</IgnoreSpecificDefaultLibraries>
+ <!-- The icudt.lib is for U_ICUDATA_ENTRY_POINT -->
+ <AdditionalDependencies>icudt.lib;onecore.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
@@ -118,7 +128,10 @@
</ResourceCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
- <AdditionalDependencies>vccorlib.lib;WindowsApp.lib;msvcrt.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>vccorlib.lib;msvcrt.lib;vcruntime.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>..\..\$(IcuBinOutputDir)\icuuc65.dll</OutputFile>
+ <ProgramDatabaseFile>.\..\..\$(IcuLibOutputDir)\icuuc.pdb</ProgramDatabaseFile>
+ <ImportLibrary>..\..\$(IcuLibOutputDir)\icuuc.lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
@@ -132,14 +145,16 @@
<Optimization>Disabled</Optimization>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<BufferSecurityCheck>true</BufferSecurityCheck>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
- <AdditionalDependencies>vccorlibd.lib;WindowsApp.lib;msvcrtd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>vccorlibd.lib;msvcrtd.lib;vcruntimed.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>..\..\$(IcuBinOutputDir)\icuuc65d.dll</OutputFile>
+ <ProgramDatabaseFile>.\..\..\$(IcuLibOutputDir)\icuucd.pdb</ProgramDatabaseFile>
+ <ImportLibrary>..\..\$(IcuLibOutputDir)\icuucd.lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Platform)'=='Win32'">
@@ -150,6 +165,10 @@
<ClCompile>
<PreprocessorDefinitions>WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
+ <Link>
+ <!-- This is so that we can use the existing stubdata icudt.lib and not need a UWP version. -->
+ <AdditionalLibraryDirectories>.\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Platform)'=='x64'">
<!-- Options that are common to all 64-bit configurations -->
@@ -161,6 +180,8 @@
</ClCompile>
<Link>
<TargetMachine>MachineX64</TargetMachine>
+ <!-- This is so that we can use the existing stubdata icudt.lib and not need a UWP version. -->
+ <AdditionalLibraryDirectories>.\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Platform)'=='ARM'">
@@ -173,103 +194,22 @@
</ClCompile>
<Link>
<TargetMachine>MachineARM</TargetMachine>
+ <!-- This is so that we can use the existing stubdata icudt.lib and not need a UWP version. -->
+ <AdditionalLibraryDirectories>.\..\..\libARM;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
- <!-- Options that are specific to a particular configuration -->
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Midl>
- <TypeLibraryName>.\..\..\lib32uwp\icuuc.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <PrecompiledHeaderOutputFile>.\x86\ReleaseUWP/common.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\ReleaseUWP/</AssemblerListingLocation>
- <ObjectFileName>.\x86\ReleaseUWP/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\ReleaseUWP/</ProgramDataBaseFileName>
- </ClCompile>
- <Link>
- <OutputFile>..\..\bin32uwp\icuuc63.dll</OutputFile>
- <ProgramDatabaseFile>.\..\..\lib32uwp\icuuc.pdb</ProgramDatabaseFile>
- <ImportLibrary>..\..\lib32uwp\icuuc.lib</ImportLibrary>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Midl>
- <TypeLibraryName>.\..\..\lib32uwp\icuucd.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <PrecompiledHeaderOutputFile>.\x86\DebugUWP/common.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\DebugUWP/</AssemblerListingLocation>
- <ObjectFileName>.\x86\DebugUWP/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\DebugUWP/</ProgramDataBaseFileName>
- </ClCompile>
- <Link>
- <OutputFile>..\..\bin32uwp\icuuc63d.dll</OutputFile>
- <ProgramDatabaseFile>.\..\..\lib32uwp\icuucd.pdb</ProgramDatabaseFile>
- <ImportLibrary>..\..\lib32uwp\icuucd.lib</ImportLibrary>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Midl>
- <TypeLibraryName>.\..\..\lib64uwp\icuuc.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <PrecompiledHeaderOutputFile>.\x64\ReleaseUWP/common.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\ReleaseUWP/</AssemblerListingLocation>
- <ObjectFileName>.\x64\ReleaseUWP/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\ReleaseUWP/</ProgramDataBaseFileName>
- </ClCompile>
- <Link>
- <OutputFile>..\..\bin64uwp\icuuc63.dll</OutputFile>
- <ProgramDatabaseFile>.\..\..\lib64uwp\icuuc.pdb</ProgramDatabaseFile>
- <ImportLibrary>..\..\lib64uwp\icuuc.lib</ImportLibrary>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Midl>
- <TypeLibraryName>.\..\..\lib64uwp\icuucd.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <PrecompiledHeaderOutputFile>.\x64\DebugUWP/common.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\DebugUWP/</AssemblerListingLocation>
- <ObjectFileName>.\x64\DebugUWP/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\DebugUWP/</ProgramDataBaseFileName>
- </ClCompile>
- <Link>
- <OutputFile>..\..\bin64uwp\icuuc63d.dll</OutputFile>
- <ProgramDatabaseFile>.\..\..\lib64uwp\icuucd.pdb</ProgramDatabaseFile>
- <ImportLibrary>..\..\lib64uwp\icuucd.lib</ImportLibrary>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <ItemDefinitionGroup Condition="'$(Platform)'=='ARM64'">
+ <!-- Options that are common to all ARM64 configurations -->
<Midl>
- <TypeLibraryName>.\..\..\libARMuwp\icuuc.tlb</TypeLibraryName>
+ <TargetEnvironment>ARM64</TargetEnvironment>
</Midl>
<ClCompile>
- <PrecompiledHeaderOutputFile>.\ARM\ReleaseUWP/common.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\ARM\ReleaseUWP/</AssemblerListingLocation>
- <ObjectFileName>.\ARM\ReleaseUWP/</ObjectFileName>
- <ProgramDataBaseFileName>.\ARM\ReleaseUWP/</ProgramDataBaseFileName>
+ <PreprocessorDefinitions>ARM64;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
- <OutputFile>..\..\binARMuwp\icuuc63.dll</OutputFile>
- <ProgramDatabaseFile>.\..\..\libARMuwp\icuuc.pdb</ProgramDatabaseFile>
- <ImportLibrary>..\..\libARMuwp\icuuc.lib</ImportLibrary>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
- <Midl>
- <TypeLibraryName>.\..\..\libARMuwp\icuucd.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <PrecompiledHeaderOutputFile>.\ARM\DebugUWP/common.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\ARM\DebugUWP/</AssemblerListingLocation>
- <ObjectFileName>.\ARM\DebugUWP/</ObjectFileName>
- <ProgramDataBaseFileName>.\ARM\DebugUWP/</ProgramDataBaseFileName>
- </ClCompile>
- <Link>
- <OutputFile>..\..\binARMuwp\icuuc63d.dll</OutputFile>
- <ProgramDatabaseFile>.\..\..\libARMuwp\icuucd.pdb</ProgramDatabaseFile>
- <ImportLibrary>..\..\libARMuwp\icuucd.lib</ImportLibrary>
+ <TargetMachine>MachineARM64</TargetMachine>
+ <!-- This is so that we can use the existing stubdata icudt.lib and not need a UWP version. -->
+ <AdditionalLibraryDirectories>.\..\..\libARM64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
@@ -316,9 +256,7 @@
<ClCompile Include="errorcode.cpp" />
<ClCompile Include="icudataver.cpp" />
<ClCompile Include="locmap.cpp" />
- <ClCompile Include="putil.cpp">
- <CompileAsWinRT>true</CompileAsWinRT>
- </ClCompile>
+ <ClCompile Include="putil.cpp" />
<ClCompile Include="umath.cpp" />
<ClCompile Include="umutex.cpp" />
<ClCompile Include="utrace.cpp" />
@@ -364,14 +302,20 @@
<ClCompile Include="punycode.cpp" />
<ClCompile Include="uidna.cpp" />
<ClCompile Include="uts46.cpp" />
+ <ClCompile Include="localebuilder.cpp" />
+ <ClCompile Include="localematcher.cpp" />
+ <ClCompile Include="localeprioritylist.cpp" />
<ClCompile Include="locavailable.cpp" />
<ClCompile Include="locbased.cpp" />
<ClCompile Include="locdispnames.cpp" />
+ <ClCompile Include="locdistance.cpp" />
<ClCompile Include="locdspnm.cpp" />
<ClCompile Include="locid.cpp" />
<ClCompile Include="loclikely.cpp" />
+ <ClCompile Include="loclikelysubtags.cpp" />
<ClCompile Include="locresdata.cpp" />
<ClCompile Include="locutil.cpp" />
+ <ClCompile Include="lsr.cpp" />
<ClCompile Include="resbund.cpp" />
<ClCompile Include="resbund_cnv.cpp" />
<ClCompile Include="ucat.cpp" />
@@ -463,6 +407,7 @@
<ClCompile Include="utext.cpp" />
<ClCompile Include="utf_impl.cpp" />
<ClCompile Include="static_unicode_sets.cpp" />
+ <ClCompile Include="restrace.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="localsvc.h" />
@@ -532,8 +477,12 @@
<ClInclude Include="ustrfmt.h" />
<ClInclude Include="util.h" />
<ClInclude Include="punycode.h" />
+ <ClInclude Include="localeprioritylist.h" />
<ClInclude Include="locbased.h" />
+ <ClInclude Include="locdistance.h" />
+ <ClInclude Include="loclikelysubtags.h" />
<ClInclude Include="locutil.h" />
+ <ClInclude Include="lsr.h" />
<ClInclude Include="sharedobject.h" />
<ClCompile Include="sharedobject.cpp" />
<ClInclude Include="ulocimp.h" />
@@ -552,6 +501,7 @@
<ClInclude Include="propname.h" />
<ClInclude Include="ruleiter.h" />
<ClInclude Include="ucase.h" />
+ <ClInclude Include="ulayout_props.h" />
<ClInclude Include="unisetspan.h" />
<ClInclude Include="uprops.h" />
<ClInclude Include="usc_impl.h" />
@@ -570,11 +520,16 @@
<ClInclude Include="ustr_cnv.h" />
<ClInclude Include="ustr_imp.h" />
<ClInclude Include="static_unicode_sets.h" />
+ <ClInclude Include="capi_helper.h" />
+ <ClInclude Include="restrace.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="common.rc" />
</ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <Target Name="Build" Condition="'$(SkipUWP)'=='true'">
+ <Message Text="Skipping building the UWP project: $(MSBuildThisFile)" Importance="high" />
+ </Target>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" Condition="'$(SkipUWP)'!='true'" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
-</Project>
+</Project> \ No newline at end of file
diff --git a/Build/source/libs/icu/icu-src/source/common/dictbe.cpp b/Build/source/libs/icu/icu-src/source/common/dictbe.cpp
index cdef7938698..c769138ae4b 100644
--- a/Build/source/libs/icu/icu-src/source/common/dictbe.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/dictbe.cpp
@@ -7,6 +7,8 @@
*******************************************************************************
*/
+#include <utility>
+
#include "unicode/utypes.h"
#if !UCONFIG_NO_BREAK_ITERATION
@@ -101,8 +103,8 @@ private:
int32_t cpLengths[POSSIBLE_WORD_LIST_MAX]; // Word Lengths, in code points.
public:
- PossibleWord() : count(0), prefix(0), offset(-1), mark(0), current(0) {};
- ~PossibleWord() {};
+ PossibleWord() : count(0), prefix(0), offset(-1), mark(0), current(0) {}
+ ~PossibleWord() {}
// Fill the list of candidates if needed, select the longest, and return the number found
int32_t candidates( UText *text, DictionaryMatcher *dict, int32_t rangeEnd );
@@ -116,13 +118,13 @@ public:
// Return the longest prefix this candidate location shares with a dictionary word
// Return value is in code points.
- int32_t longestPrefix() { return prefix; };
+ int32_t longestPrefix() { return prefix; }
// Mark the current candidate as the one we like
- void markCurrent() { mark = current; };
+ void markCurrent() { mark = current; }
// Get length in code points of the marked word.
- int32_t markedCPLength() { return cpLengths[mark]; };
+ int32_t markedCPLength() { return cpLengths[mark]; }
};
@@ -1204,8 +1206,8 @@ CjkBreakEngine::divideUpDictionaryRange( UText *inText,
inputMap->elementAti(inString.length()) : inString.length()+rangeStart;
normalizedMap->addElement(nativeEnd, status);
- inputMap.moveFrom(normalizedMap);
- inString.moveFrom(normalizedInput);
+ inputMap = std::move(normalizedMap);
+ inString = std::move(normalizedInput);
}
int32_t numCodePts = inString.countChar32();
diff --git a/Build/source/libs/icu/icu-src/source/common/dictionarydata.h b/Build/source/libs/icu/icu-src/source/common/dictionarydata.h
index 73b7d6753ba..0d303d9a8dc 100644
--- a/Build/source/libs/icu/icu-src/source/common/dictionarydata.h
+++ b/Build/source/libs/icu/icu-src/source/common/dictionarydata.h
@@ -68,7 +68,7 @@ public:
*/
class U_COMMON_API DictionaryMatcher : public UMemory {
public:
- DictionaryMatcher() {};
+ DictionaryMatcher() {}
virtual ~DictionaryMatcher();
// this should emulate CompactTrieDictionary::matches()
/* @param text The text in which to look for matching words. Matching begins
diff --git a/Build/source/libs/icu/icu-src/source/common/edits.cpp b/Build/source/libs/icu/icu-src/source/common/edits.cpp
index 00a8d601a1c..95f0c19a728 100644
--- a/Build/source/libs/icu/icu-src/source/common/edits.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/edits.cpp
@@ -243,7 +243,7 @@ UBool Edits::growArray() {
return TRUE;
}
-UBool Edits::copyErrorTo(UErrorCode &outErrorCode) {
+UBool Edits::copyErrorTo(UErrorCode &outErrorCode) const {
if (U_FAILURE(outErrorCode)) { return TRUE; }
if (U_SUCCESS(errorCode_)) { return FALSE; }
outErrorCode = errorCode_;
diff --git a/Build/source/libs/icu/icu-src/source/common/filteredbrk.cpp b/Build/source/libs/icu/icu-src/source/common/filteredbrk.cpp
index 20c3aa82430..c07128cbce1 100644
--- a/Build/source/libs/icu/icu-src/source/common/filteredbrk.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/filteredbrk.cpp
@@ -173,7 +173,7 @@ public:
status = U_SAFECLONE_ALLOCATED_WARNING;
return clone();
}
- virtual BreakIterator* clone(void) const { return new SimpleFilteredSentenceBreakIterator(*this); }
+ virtual SimpleFilteredSentenceBreakIterator* clone() const { return new SimpleFilteredSentenceBreakIterator(*this); }
virtual UClassID getDynamicClassID(void) const { return NULL; }
virtual UBool operator==(const BreakIterator& o) const { if(this==&o) return true; return false; }
diff --git a/Build/source/libs/icu/icu-src/source/common/hash.h b/Build/source/libs/icu/icu-src/source/common/hash.h
index c6be4672015..f02cb7087a5 100644
--- a/Build/source/libs/icu/icu-src/source/common/hash.h
+++ b/Build/source/libs/icu/icu-src/source/common/hash.h
@@ -41,7 +41,7 @@ public:
* @param ignoreKeyCase If true, keys are case insensitive.
* @param status Error code
*/
- Hashtable(UBool ignoreKeyCase, UErrorCode& status);
+ inline Hashtable(UBool ignoreKeyCase, UErrorCode& status);
/**
* Construct a hashtable
@@ -49,7 +49,7 @@ public:
* @param size initial size allocation
* @param status Error code
*/
- Hashtable(UBool ignoreKeyCase, int32_t size, UErrorCode& status);
+ inline Hashtable(UBool ignoreKeyCase, int32_t size, UErrorCode& status);
/**
* Construct a hashtable
@@ -57,57 +57,57 @@ public:
* @param valueComp Comparator for comparing the values
* @param status Error code
*/
- Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status);
+ inline Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status);
/**
* Construct a hashtable
* @param status Error code
*/
- Hashtable(UErrorCode& status);
+ inline Hashtable(UErrorCode& status);
/**
* Construct a hashtable, _disregarding any error_. Use this constructor
* with caution.
*/
- Hashtable();
+ inline Hashtable();
/**
* Non-virtual destructor; make this virtual if Hashtable is subclassed
* in the future.
*/
- ~Hashtable();
+ inline ~Hashtable();
- UObjectDeleter *setValueDeleter(UObjectDeleter *fn);
+ inline UObjectDeleter *setValueDeleter(UObjectDeleter *fn);
- int32_t count() const;
+ inline int32_t count() const;
- void* put(const UnicodeString& key, void* value, UErrorCode& status);
+ inline void* put(const UnicodeString& key, void* value, UErrorCode& status);
- int32_t puti(const UnicodeString& key, int32_t value, UErrorCode& status);
+ inline int32_t puti(const UnicodeString& key, int32_t value, UErrorCode& status);
- void* get(const UnicodeString& key) const;
+ inline void* get(const UnicodeString& key) const;
- int32_t geti(const UnicodeString& key) const;
+ inline int32_t geti(const UnicodeString& key) const;
- void* remove(const UnicodeString& key);
+ inline void* remove(const UnicodeString& key);
- int32_t removei(const UnicodeString& key);
+ inline int32_t removei(const UnicodeString& key);
- void removeAll(void);
+ inline void removeAll(void);
- const UHashElement* find(const UnicodeString& key) const;
+ inline const UHashElement* find(const UnicodeString& key) const;
/**
* @param pos - must be UHASH_FIRST on first call, and untouched afterwards.
* @see uhash_nextElement
*/
- const UHashElement* nextElement(int32_t& pos) const;
+ inline const UHashElement* nextElement(int32_t& pos) const;
- UKeyComparator* setKeyComparator(UKeyComparator*keyComp);
+ inline UKeyComparator* setKeyComparator(UKeyComparator*keyComp);
- UValueComparator* setValueComparator(UValueComparator* valueComp);
+ inline UValueComparator* setValueComparator(UValueComparator* valueComp);
- UBool equals(const Hashtable& that) const;
+ inline UBool equals(const Hashtable& that) const;
private:
Hashtable(const Hashtable &other); // forbid copying of this class
Hashtable &operator=(const Hashtable &other); // forbid copying of this class
diff --git a/Build/source/libs/icu/icu-src/source/common/loadednormalizer2impl.cpp b/Build/source/libs/icu/icu-src/source/common/loadednormalizer2impl.cpp
index 82cb325b723..e4b36f1055f 100644
--- a/Build/source/libs/icu/icu-src/source/common/loadednormalizer2impl.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/loadednormalizer2impl.cpp
@@ -157,7 +157,7 @@ static void U_CALLCONV initSingletons(const char *what, UErrorCode &errorCode) {
} else if (uprv_strcmp(what, "nfkc_cf") == 0) {
nfkc_cfSingleton = Norm2AllModes::createInstance(NULL, "nfkc_cf", errorCode);
} else {
- U_ASSERT(FALSE); // Unknown singleton
+ UPRV_UNREACHABLE; // Unknown singleton
}
ucln_common_registerCleanup(UCLN_COMMON_LOADED_NORMALIZER2, uprv_loaded_normalizer2_cleanup);
}
diff --git a/Build/source/libs/icu/icu-src/source/common/localebuilder.cpp b/Build/source/libs/icu/icu-src/source/common/localebuilder.cpp
new file mode 100644
index 00000000000..1dd8131e589
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/common/localebuilder.cpp
@@ -0,0 +1,468 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include <utility>
+
+#include "bytesinkutil.h" // CharStringByteSink
+#include "charstr.h"
+#include "cstring.h"
+#include "ulocimp.h"
+#include "unicode/localebuilder.h"
+#include "unicode/locid.h"
+
+U_NAMESPACE_BEGIN
+
+#define UPRV_ISDIGIT(c) (((c) >= '0') && ((c) <= '9'))
+#define UPRV_ISALPHANUM(c) (uprv_isASCIILetter(c) || UPRV_ISDIGIT(c) )
+
+const char* kAttributeKey = "attribute";
+
+static bool _isExtensionSubtags(char key, const char* s, int32_t len) {
+ switch (uprv_tolower(key)) {
+ case 'u':
+ return ultag_isUnicodeExtensionSubtags(s, len);
+ case 't':
+ return ultag_isTransformedExtensionSubtags(s, len);
+ case 'x':
+ return ultag_isPrivateuseValueSubtags(s, len);
+ default:
+ return ultag_isExtensionSubtags(s, len);
+ }
+}
+
+LocaleBuilder::LocaleBuilder() : UObject(), status_(U_ZERO_ERROR), language_(),
+ script_(), region_(), variant_(nullptr), extensions_(nullptr)
+{
+ language_[0] = 0;
+ script_[0] = 0;
+ region_[0] = 0;
+}
+
+LocaleBuilder::~LocaleBuilder()
+{
+ delete variant_;
+ delete extensions_;
+}
+
+LocaleBuilder& LocaleBuilder::setLocale(const Locale& locale)
+{
+ clear();
+ setLanguage(locale.getLanguage());
+ setScript(locale.getScript());
+ setRegion(locale.getCountry());
+ setVariant(locale.getVariant());
+ extensions_ = locale.clone();
+ if (extensions_ == nullptr) {
+ status_ = U_MEMORY_ALLOCATION_ERROR;
+ }
+ return *this;
+}
+
+LocaleBuilder& LocaleBuilder::setLanguageTag(StringPiece tag)
+{
+ Locale l = Locale::forLanguageTag(tag, status_);
+ if (U_FAILURE(status_)) { return *this; }
+ // Because setLocale will reset status_ we need to return
+ // first if we have error in forLanguageTag.
+ setLocale(l);
+ return *this;
+}
+
+static void setField(StringPiece input, char* dest, UErrorCode& errorCode,
+ UBool (*test)(const char*, int32_t)) {
+ if (U_FAILURE(errorCode)) { return; }
+ if (input.empty()) {
+ dest[0] = '\0';
+ } else if (test(input.data(), input.length())) {
+ uprv_memcpy(dest, input.data(), input.length());
+ dest[input.length()] = '\0';
+ } else {
+ errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+ }
+}
+
+LocaleBuilder& LocaleBuilder::setLanguage(StringPiece language)
+{
+ setField(language, language_, status_, &ultag_isLanguageSubtag);
+ return *this;
+}
+
+LocaleBuilder& LocaleBuilder::setScript(StringPiece script)
+{
+ setField(script, script_, status_, &ultag_isScriptSubtag);
+ return *this;
+}
+
+LocaleBuilder& LocaleBuilder::setRegion(StringPiece region)
+{
+ setField(region, region_, status_, &ultag_isRegionSubtag);
+ return *this;
+}
+
+static void transform(char* data, int32_t len) {
+ for (int32_t i = 0; i < len; i++, data++) {
+ if (*data == '_') {
+ *data = '-';
+ } else {
+ *data = uprv_tolower(*data);
+ }
+ }
+}
+
+LocaleBuilder& LocaleBuilder::setVariant(StringPiece variant)
+{
+ if (U_FAILURE(status_)) { return *this; }
+ if (variant.empty()) {
+ delete variant_;
+ variant_ = nullptr;
+ return *this;
+ }
+ CharString* new_variant = new CharString(variant, status_);
+ if (U_FAILURE(status_)) { return *this; }
+ if (new_variant == nullptr) {
+ status_ = U_MEMORY_ALLOCATION_ERROR;
+ return *this;
+ }
+ transform(new_variant->data(), new_variant->length());
+ if (!ultag_isVariantSubtags(new_variant->data(), new_variant->length())) {
+ delete new_variant;
+ status_ = U_ILLEGAL_ARGUMENT_ERROR;
+ return *this;
+ }
+ delete variant_;
+ variant_ = new_variant;
+ return *this;
+}
+
+static bool
+_isKeywordValue(const char* key, const char* value, int32_t value_len)
+{
+ if (key[1] == '\0') {
+ // one char key
+ return (UPRV_ISALPHANUM(uprv_tolower(key[0])) &&
+ _isExtensionSubtags(key[0], value, value_len));
+ } else if (uprv_strcmp(key, kAttributeKey) == 0) {
+ // unicode attributes
+ return ultag_isUnicodeLocaleAttributes(value, value_len);
+ }
+ // otherwise: unicode extension value
+ // We need to convert from legacy key/value to unicode
+ // key/value
+ const char* unicode_locale_key = uloc_toUnicodeLocaleKey(key);
+ const char* unicode_locale_type = uloc_toUnicodeLocaleType(key, value);
+
+ return unicode_locale_key && unicode_locale_type &&
+ ultag_isUnicodeLocaleKey(unicode_locale_key, -1) &&
+ ultag_isUnicodeLocaleType(unicode_locale_type, -1);
+}
+
+static void
+_copyExtensions(const Locale& from, icu::StringEnumeration *keywords,
+ Locale& to, bool validate, UErrorCode& errorCode)
+{
+ if (U_FAILURE(errorCode)) { return; }
+ LocalPointer<icu::StringEnumeration> ownedKeywords;
+ if (keywords == nullptr) {
+ ownedKeywords.adoptInstead(from.createKeywords(errorCode));
+ if (U_FAILURE(errorCode) || ownedKeywords.isNull()) { return; }
+ keywords = ownedKeywords.getAlias();
+ }
+ const char* key;
+ while ((key = keywords->next(nullptr, errorCode)) != nullptr) {
+ CharString value;
+ CharStringByteSink sink(&value);
+ from.getKeywordValue(key, sink, errorCode);
+ if (U_FAILURE(errorCode)) { return; }
+ if (uprv_strcmp(key, kAttributeKey) == 0) {
+ transform(value.data(), value.length());
+ }
+ if (validate &&
+ !_isKeywordValue(key, value.data(), value.length())) {
+ errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
+ to.setKeywordValue(key, value.data(), errorCode);
+ if (U_FAILURE(errorCode)) { return; }
+ }
+}
+
+void static
+_clearUAttributesAndKeyType(Locale& locale, UErrorCode& errorCode)
+{
+ // Clear Unicode attributes
+ locale.setKeywordValue(kAttributeKey, "", errorCode);
+
+ // Clear all Unicode keyword values
+ LocalPointer<icu::StringEnumeration> iter(locale.createUnicodeKeywords(errorCode));
+ if (U_FAILURE(errorCode) || iter.isNull()) { return; }
+ const char* key;
+ while ((key = iter->next(nullptr, errorCode)) != nullptr) {
+ locale.setUnicodeKeywordValue(key, nullptr, errorCode);
+ }
+}
+
+static void
+_setUnicodeExtensions(Locale& locale, const CharString& value, UErrorCode& errorCode)
+{
+ // Add the unicode extensions to extensions_
+ CharString locale_str("und-u-", errorCode);
+ locale_str.append(value, errorCode);
+ _copyExtensions(
+ Locale::forLanguageTag(locale_str.data(), errorCode), nullptr,
+ locale, false, errorCode);
+}
+
+LocaleBuilder& LocaleBuilder::setExtension(char key, StringPiece value)
+{
+ if (U_FAILURE(status_)) { return *this; }
+ if (!UPRV_ISALPHANUM(key)) {
+ status_ = U_ILLEGAL_ARGUMENT_ERROR;
+ return *this;
+ }
+ CharString value_str(value, status_);
+ if (U_FAILURE(status_)) { return *this; }
+ transform(value_str.data(), value_str.length());
+ if (!value_str.isEmpty() &&
+ !_isExtensionSubtags(key, value_str.data(), value_str.length())) {
+ status_ = U_ILLEGAL_ARGUMENT_ERROR;
+ return *this;
+ }
+ if (extensions_ == nullptr) {
+ extensions_ = new Locale();
+ if (extensions_ == nullptr) {
+ status_ = U_MEMORY_ALLOCATION_ERROR;
+ return *this;
+ }
+ }
+ if (uprv_tolower(key) != 'u') {
+ // for t, x and others extension.
+ extensions_->setKeywordValue(StringPiece(&key, 1), value_str.data(),
+ status_);
+ return *this;
+ }
+ _clearUAttributesAndKeyType(*extensions_, status_);
+ if (U_FAILURE(status_)) { return *this; }
+ if (!value.empty()) {
+ _setUnicodeExtensions(*extensions_, value_str, status_);
+ }
+ return *this;
+}
+
+LocaleBuilder& LocaleBuilder::setUnicodeLocaleKeyword(
+ StringPiece key, StringPiece type)
+{
+ if (U_FAILURE(status_)) { return *this; }
+ if (!ultag_isUnicodeLocaleKey(key.data(), key.length()) ||
+ (!type.empty() &&
+ !ultag_isUnicodeLocaleType(type.data(), type.length()))) {
+ status_ = U_ILLEGAL_ARGUMENT_ERROR;
+ return *this;
+ }
+ if (extensions_ == nullptr) {
+ extensions_ = new Locale();
+ }
+ if (extensions_ == nullptr) {
+ status_ = U_MEMORY_ALLOCATION_ERROR;
+ return *this;
+ }
+ extensions_->setUnicodeKeywordValue(key, type, status_);
+ return *this;
+}
+
+LocaleBuilder& LocaleBuilder::addUnicodeLocaleAttribute(
+ StringPiece value)
+{
+ CharString value_str(value, status_);
+ if (U_FAILURE(status_)) { return *this; }
+ transform(value_str.data(), value_str.length());
+ if (!ultag_isUnicodeLocaleAttribute(value_str.data(), value_str.length())) {
+ status_ = U_ILLEGAL_ARGUMENT_ERROR;
+ return *this;
+ }
+ if (extensions_ == nullptr) {
+ extensions_ = new Locale();
+ if (extensions_ == nullptr) {
+ status_ = U_MEMORY_ALLOCATION_ERROR;
+ return *this;
+ }
+ extensions_->setKeywordValue(kAttributeKey, value_str.data(), status_);
+ return *this;
+ }
+
+ CharString attributes;
+ CharStringByteSink sink(&attributes);
+ UErrorCode localErrorCode = U_ZERO_ERROR;
+ extensions_->getKeywordValue(kAttributeKey, sink, localErrorCode);
+ if (U_FAILURE(localErrorCode)) {
+ CharString new_attributes(value_str.data(), status_);
+ // No attributes, set the attribute.
+ extensions_->setKeywordValue(kAttributeKey, new_attributes.data(), status_);
+ return *this;
+ }
+
+ transform(attributes.data(),attributes.length());
+ const char* start = attributes.data();
+ const char* limit = attributes.data() + attributes.length();
+ CharString new_attributes;
+ bool inserted = false;
+ while (start < limit) {
+ if (!inserted) {
+ int cmp = uprv_strcmp(start, value_str.data());
+ if (cmp == 0) { return *this; } // Found it in attributes: Just return
+ if (cmp > 0) {
+ if (!new_attributes.isEmpty()) new_attributes.append('_', status_);
+ new_attributes.append(value_str.data(), status_);
+ inserted = true;
+ }
+ }
+ if (!new_attributes.isEmpty()) {
+ new_attributes.append('_', status_);
+ }
+ new_attributes.append(start, status_);
+ start += uprv_strlen(start) + 1;
+ }
+ if (!inserted) {
+ if (!new_attributes.isEmpty()) {
+ new_attributes.append('_', status_);
+ }
+ new_attributes.append(value_str.data(), status_);
+ }
+ // Not yet in the attributes, set the attribute.
+ extensions_->setKeywordValue(kAttributeKey, new_attributes.data(), status_);
+ return *this;
+}
+
+LocaleBuilder& LocaleBuilder::removeUnicodeLocaleAttribute(
+ StringPiece value)
+{
+ CharString value_str(value, status_);
+ if (U_FAILURE(status_)) { return *this; }
+ transform(value_str.data(), value_str.length());
+ if (!ultag_isUnicodeLocaleAttribute(value_str.data(), value_str.length())) {
+ status_ = U_ILLEGAL_ARGUMENT_ERROR;
+ return *this;
+ }
+ if (extensions_ == nullptr) { return *this; }
+ UErrorCode localErrorCode = U_ZERO_ERROR;
+ CharString attributes;
+ CharStringByteSink sink(&attributes);
+ extensions_->getKeywordValue(kAttributeKey, sink, localErrorCode);
+ // get failure, just return
+ if (U_FAILURE(localErrorCode)) { return *this; }
+ // Do not have any attributes, just return.
+ if (attributes.isEmpty()) { return *this; }
+
+ char* p = attributes.data();
+ // Replace null terminiator in place for _ and - so later
+ // we can use uprv_strcmp to compare.
+ for (int32_t i = 0; i < attributes.length(); i++, p++) {
+ *p = (*p == '_' || *p == '-') ? '\0' : uprv_tolower(*p);
+ }
+
+ const char* start = attributes.data();
+ const char* limit = attributes.data() + attributes.length();
+ CharString new_attributes;
+ bool found = false;
+ while (start < limit) {
+ if (uprv_strcmp(start, value_str.data()) == 0) {
+ found = true;
+ } else {
+ if (!new_attributes.isEmpty()) {
+ new_attributes.append('_', status_);
+ }
+ new_attributes.append(start, status_);
+ }
+ start += uprv_strlen(start) + 1;
+ }
+ // Found the value in attributes, set the attribute.
+ if (found) {
+ extensions_->setKeywordValue(kAttributeKey, new_attributes.data(), status_);
+ }
+ return *this;
+}
+
+LocaleBuilder& LocaleBuilder::clear()
+{
+ status_ = U_ZERO_ERROR;
+ language_[0] = 0;
+ script_[0] = 0;
+ region_[0] = 0;
+ delete variant_;
+ variant_ = nullptr;
+ clearExtensions();
+ return *this;
+}
+
+LocaleBuilder& LocaleBuilder::clearExtensions()
+{
+ delete extensions_;
+ extensions_ = nullptr;
+ return *this;
+}
+
+Locale makeBogusLocale() {
+ Locale bogus;
+ bogus.setToBogus();
+ return bogus;
+}
+
+void LocaleBuilder::copyExtensionsFrom(const Locale& src, UErrorCode& errorCode)
+{
+ if (U_FAILURE(errorCode)) { return; }
+ LocalPointer<icu::StringEnumeration> keywords(src.createKeywords(errorCode));
+ if (U_FAILURE(errorCode) || keywords.isNull() || keywords->count(errorCode) == 0) {
+ // Error, or no extensions to copy.
+ return;
+ }
+ if (extensions_ == nullptr) {
+ extensions_ = new Locale();
+ if (extensions_ == nullptr) {
+ status_ = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ }
+ _copyExtensions(src, keywords.getAlias(), *extensions_, false, errorCode);
+}
+
+Locale LocaleBuilder::build(UErrorCode& errorCode)
+{
+ if (U_FAILURE(errorCode)) {
+ return makeBogusLocale();
+ }
+ if (U_FAILURE(status_)) {
+ errorCode = status_;
+ return makeBogusLocale();
+ }
+ CharString locale_str(language_, errorCode);
+ if (uprv_strlen(script_) > 0) {
+ locale_str.append('-', errorCode).append(StringPiece(script_), errorCode);
+ }
+ if (uprv_strlen(region_) > 0) {
+ locale_str.append('-', errorCode).append(StringPiece(region_), errorCode);
+ }
+ if (variant_ != nullptr) {
+ locale_str.append('-', errorCode).append(StringPiece(variant_->data()), errorCode);
+ }
+ if (U_FAILURE(errorCode)) {
+ return makeBogusLocale();
+ }
+ Locale product(locale_str.data());
+ if (extensions_ != nullptr) {
+ _copyExtensions(*extensions_, nullptr, product, true, errorCode);
+ }
+ if (U_FAILURE(errorCode)) {
+ return makeBogusLocale();
+ }
+ return product;
+}
+
+UBool LocaleBuilder::copyErrorTo(UErrorCode &outErrorCode) const {
+ if (U_FAILURE(outErrorCode)) {
+ // Do not overwrite the older error code
+ return TRUE;
+ }
+ outErrorCode = status_;
+ return U_FAILURE(outErrorCode);
+}
+
+U_NAMESPACE_END
diff --git a/Build/source/libs/icu/icu-src/source/common/localematcher.cpp b/Build/source/libs/icu/icu-src/source/common/localematcher.cpp
new file mode 100644
index 00000000000..d975fe759b4
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/common/localematcher.cpp
@@ -0,0 +1,720 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+
+// localematcher.cpp
+// created: 2019may08 Markus W. Scherer
+
+#ifndef __LOCMATCHER_H__
+#define __LOCMATCHER_H__
+
+#include "unicode/utypes.h"
+#include "unicode/localebuilder.h"
+#include "unicode/localematcher.h"
+#include "unicode/locid.h"
+#include "unicode/stringpiece.h"
+#include "unicode/uobject.h"
+#include "cstring.h"
+#include "localeprioritylist.h"
+#include "loclikelysubtags.h"
+#include "locdistance.h"
+#include "lsr.h"
+#include "uassert.h"
+#include "uhash.h"
+#include "uvector.h"
+
+#define UND_LSR LSR("und", "", "")
+
+/**
+ * Indicator for the lifetime of desired-locale objects passed into the LocaleMatcher.
+ *
+ * @draft ICU 65
+ */
+enum ULocMatchLifetime {
+ /**
+ * Locale objects are temporary.
+ * The matcher will make a copy of a locale that will be used beyond one function call.
+ *
+ * @draft ICU 65
+ */
+ ULOCMATCH_TEMPORARY_LOCALES,
+ /**
+ * Locale objects are stored at least as long as the matcher is used.
+ * The matcher will keep only a pointer to a locale that will be used beyond one function call,
+ * avoiding a copy.
+ *
+ * @draft ICU 65
+ */
+ ULOCMATCH_STORED_LOCALES // TODO: permanent? cached? clone?
+};
+#ifndef U_IN_DOXYGEN
+typedef enum ULocMatchLifetime ULocMatchLifetime;
+#endif
+
+U_NAMESPACE_BEGIN
+
+LocaleMatcher::Result::Result(LocaleMatcher::Result &&src) U_NOEXCEPT :
+ desiredLocale(src.desiredLocale),
+ supportedLocale(src.supportedLocale),
+ desiredIndex(src.desiredIndex),
+ supportedIndex(src.supportedIndex),
+ desiredIsOwned(src.desiredIsOwned) {
+ if (desiredIsOwned) {
+ src.desiredLocale = nullptr;
+ src.desiredIndex = -1;
+ src.desiredIsOwned = FALSE;
+ }
+}
+
+LocaleMatcher::Result::~Result() {
+ if (desiredIsOwned) {
+ delete desiredLocale;
+ }
+}
+
+LocaleMatcher::Result &LocaleMatcher::Result::operator=(LocaleMatcher::Result &&src) U_NOEXCEPT {
+ this->~Result();
+
+ desiredLocale = src.desiredLocale;
+ supportedLocale = src.supportedLocale;
+ desiredIndex = src.desiredIndex;
+ supportedIndex = src.supportedIndex;
+ desiredIsOwned = src.desiredIsOwned;
+
+ if (desiredIsOwned) {
+ src.desiredLocale = nullptr;
+ src.desiredIndex = -1;
+ src.desiredIsOwned = FALSE;
+ }
+ return *this;
+}
+
+Locale LocaleMatcher::Result::makeResolvedLocale(UErrorCode &errorCode) const {
+ if (U_FAILURE(errorCode) || supportedLocale == nullptr) {
+ return Locale::getRoot();
+ }
+ const Locale *bestDesired = getDesiredLocale();
+ if (bestDesired == nullptr || *supportedLocale == *bestDesired) {
+ return *supportedLocale;
+ }
+ LocaleBuilder b;
+ b.setLocale(*supportedLocale);
+
+ // Copy the region from bestDesired, if there is one.
+ const char *region = bestDesired->getCountry();
+ if (*region != 0) {
+ b.setRegion(region);
+ }
+
+ // Copy the variants from bestDesired, if there are any.
+ // Note that this will override any supportedLocale variants.
+ // For example, "sco-ulster-fonipa" + "...-fonupa" => "sco-fonupa" (replacing ulster).
+ const char *variants = bestDesired->getVariant();
+ if (*variants != 0) {
+ b.setVariant(variants);
+ }
+
+ // Copy the extensions from bestDesired, if there are any.
+ // C++ note: The following note, copied from Java, may not be true,
+ // as long as C++ copies by legacy ICU keyword, not by extension singleton.
+ // Note that this will override any supportedLocale extensions.
+ // For example, "th-u-nu-latn-ca-buddhist" + "...-u-nu-native" => "th-u-nu-native"
+ // (replacing calendar).
+ b.copyExtensionsFrom(*bestDesired, errorCode);
+ return b.build(errorCode);
+}
+
+LocaleMatcher::Builder::Builder(LocaleMatcher::Builder &&src) U_NOEXCEPT :
+ errorCode_(src.errorCode_),
+ supportedLocales_(src.supportedLocales_),
+ thresholdDistance_(src.thresholdDistance_),
+ demotion_(src.demotion_),
+ defaultLocale_(src.defaultLocale_),
+ favor_(src.favor_) {
+ src.supportedLocales_ = nullptr;
+ src.defaultLocale_ = nullptr;
+}
+
+LocaleMatcher::Builder::~Builder() {
+ delete supportedLocales_;
+ delete defaultLocale_;
+}
+
+LocaleMatcher::Builder &LocaleMatcher::Builder::operator=(LocaleMatcher::Builder &&src) U_NOEXCEPT {
+ this->~Builder();
+
+ errorCode_ = src.errorCode_;
+ supportedLocales_ = src.supportedLocales_;
+ thresholdDistance_ = src.thresholdDistance_;
+ demotion_ = src.demotion_;
+ defaultLocale_ = src.defaultLocale_;
+ favor_ = src.favor_;
+
+ src.supportedLocales_ = nullptr;
+ src.defaultLocale_ = nullptr;
+ return *this;
+}
+
+void LocaleMatcher::Builder::clearSupportedLocales() {
+ if (supportedLocales_ != nullptr) {
+ supportedLocales_->removeAllElements();
+ }
+}
+
+bool LocaleMatcher::Builder::ensureSupportedLocaleVector() {
+ if (U_FAILURE(errorCode_)) { return false; }
+ if (supportedLocales_ != nullptr) { return true; }
+ supportedLocales_ = new UVector(uprv_deleteUObject, nullptr, errorCode_);
+ if (U_FAILURE(errorCode_)) { return false; }
+ if (supportedLocales_ == nullptr) {
+ errorCode_ = U_MEMORY_ALLOCATION_ERROR;
+ return false;
+ }
+ return true;
+}
+
+LocaleMatcher::Builder &LocaleMatcher::Builder::setSupportedLocalesFromListString(
+ StringPiece locales) {
+ LocalePriorityList list(locales, errorCode_);
+ if (U_FAILURE(errorCode_)) { return *this; }
+ clearSupportedLocales();
+ if (!ensureSupportedLocaleVector()) { return *this; }
+ int32_t length = list.getLengthIncludingRemoved();
+ for (int32_t i = 0; i < length; ++i) {
+ Locale *locale = list.orphanLocaleAt(i);
+ if (locale == nullptr) { continue; }
+ supportedLocales_->addElement(locale, errorCode_);
+ if (U_FAILURE(errorCode_)) {
+ delete locale;
+ break;
+ }
+ }
+ return *this;
+}
+
+LocaleMatcher::Builder &LocaleMatcher::Builder::setSupportedLocales(Locale::Iterator &locales) {
+ if (U_FAILURE(errorCode_)) { return *this; }
+ clearSupportedLocales();
+ if (!ensureSupportedLocaleVector()) { return *this; }
+ while (locales.hasNext()) {
+ const Locale &locale = locales.next();
+ Locale *clone = locale.clone();
+ if (clone == nullptr) {
+ errorCode_ = U_MEMORY_ALLOCATION_ERROR;
+ break;
+ }
+ supportedLocales_->addElement(clone, errorCode_);
+ if (U_FAILURE(errorCode_)) {
+ delete clone;
+ break;
+ }
+ }
+ return *this;
+}
+
+LocaleMatcher::Builder &LocaleMatcher::Builder::addSupportedLocale(const Locale &locale) {
+ if (!ensureSupportedLocaleVector()) { return *this; }
+ Locale *clone = locale.clone();
+ if (clone == nullptr) {
+ errorCode_ = U_MEMORY_ALLOCATION_ERROR;
+ return *this;
+ }
+ supportedLocales_->addElement(clone, errorCode_);
+ if (U_FAILURE(errorCode_)) {
+ delete clone;
+ }
+ return *this;
+}
+
+LocaleMatcher::Builder &LocaleMatcher::Builder::setDefaultLocale(const Locale *defaultLocale) {
+ if (U_FAILURE(errorCode_)) { return *this; }
+ Locale *clone = nullptr;
+ if (defaultLocale != nullptr) {
+ clone = defaultLocale->clone();
+ if (clone == nullptr) {
+ errorCode_ = U_MEMORY_ALLOCATION_ERROR;
+ return *this;
+ }
+ }
+ delete defaultLocale_;
+ defaultLocale_ = clone;
+ return *this;
+}
+
+LocaleMatcher::Builder &LocaleMatcher::Builder::setFavorSubtag(ULocMatchFavorSubtag subtag) {
+ if (U_FAILURE(errorCode_)) { return *this; }
+ favor_ = subtag;
+ return *this;
+}
+
+LocaleMatcher::Builder &LocaleMatcher::Builder::setDemotionPerDesiredLocale(ULocMatchDemotion demotion) {
+ if (U_FAILURE(errorCode_)) { return *this; }
+ demotion_ = demotion;
+ return *this;
+}
+
+#if 0
+/**
+ * <i>Internal only!</i>
+ *
+ * @param thresholdDistance the thresholdDistance to set, with -1 = default
+ * @return this Builder object
+ * @internal
+ * @deprecated This API is ICU internal only.
+ */
+@Deprecated
+LocaleMatcher::Builder &LocaleMatcher::Builder::internalSetThresholdDistance(int32_t thresholdDistance) {
+ if (U_FAILURE(errorCode_)) { return *this; }
+ if (thresholdDistance > 100) {
+ thresholdDistance = 100;
+ }
+ thresholdDistance_ = thresholdDistance;
+ return *this;
+}
+#endif
+
+UBool LocaleMatcher::Builder::copyErrorTo(UErrorCode &outErrorCode) const {
+ if (U_FAILURE(outErrorCode)) { return TRUE; }
+ if (U_SUCCESS(errorCode_)) { return FALSE; }
+ outErrorCode = errorCode_;
+ return TRUE;
+}
+
+LocaleMatcher LocaleMatcher::Builder::build(UErrorCode &errorCode) const {
+ if (U_SUCCESS(errorCode) && U_FAILURE(errorCode_)) {
+ errorCode = errorCode_;
+ }
+ return LocaleMatcher(*this, errorCode);
+}
+
+namespace {
+
+LSR getMaximalLsrOrUnd(const XLikelySubtags &likelySubtags, const Locale &locale,
+ UErrorCode &errorCode) {
+ if (U_FAILURE(errorCode) || locale.isBogus() || *locale.getName() == 0 /* "und" */) {
+ return UND_LSR;
+ } else {
+ return likelySubtags.makeMaximizedLsrFrom(locale, errorCode);
+ }
+}
+
+int32_t hashLSR(const UHashTok token) {
+ const LSR *lsr = static_cast<const LSR *>(token.pointer);
+ return lsr->hashCode;
+}
+
+UBool compareLSRs(const UHashTok t1, const UHashTok t2) {
+ const LSR *lsr1 = static_cast<const LSR *>(t1.pointer);
+ const LSR *lsr2 = static_cast<const LSR *>(t2.pointer);
+ return *lsr1 == *lsr2;
+}
+
+bool putIfAbsent(UHashtable *lsrToIndex, const LSR &lsr, int32_t i, UErrorCode &errorCode) {
+ if (U_FAILURE(errorCode)) { return false; }
+ U_ASSERT(i > 0);
+ int32_t index = uhash_geti(lsrToIndex, &lsr);
+ if (index != 0) {
+ return false;
+ } else {
+ uhash_puti(lsrToIndex, const_cast<LSR *>(&lsr), i, &errorCode);
+ return U_SUCCESS(errorCode);
+ }
+}
+
+} // namespace
+
+LocaleMatcher::LocaleMatcher(const Builder &builder, UErrorCode &errorCode) :
+ likelySubtags(*XLikelySubtags::getSingleton(errorCode)),
+ localeDistance(*LocaleDistance::getSingleton(errorCode)),
+ thresholdDistance(builder.thresholdDistance_),
+ demotionPerDesiredLocale(0),
+ favorSubtag(builder.favor_),
+ supportedLocales(nullptr), lsrs(nullptr), supportedLocalesLength(0),
+ supportedLsrToIndex(nullptr),
+ supportedLSRs(nullptr), supportedIndexes(nullptr), supportedLSRsLength(0),
+ ownedDefaultLocale(nullptr), defaultLocale(nullptr), defaultLocaleIndex(-1) {
+ if (U_FAILURE(errorCode)) { return; }
+ if (thresholdDistance < 0) {
+ thresholdDistance = localeDistance.getDefaultScriptDistance();
+ }
+ supportedLocalesLength = builder.supportedLocales_ != nullptr ?
+ builder.supportedLocales_->size() : 0;
+ const Locale *def = builder.defaultLocale_;
+ int32_t idef = -1;
+ if (supportedLocalesLength > 0) {
+ // Store the supported locales in input order,
+ // so that when different types are used (e.g., language tag strings)
+ // we can return those by parallel index.
+ supportedLocales = static_cast<const Locale **>(
+ uprv_malloc(supportedLocalesLength * sizeof(const Locale *)));
+ // Supported LRSs in input order.
+ // In C++, we store these permanently to simplify ownership management
+ // in the hash tables. Duplicate LSRs (if any) are unused overhead.
+ lsrs = new LSR[supportedLocalesLength];
+ if (supportedLocales == nullptr || lsrs == nullptr) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ // If the constructor fails partway, we need null pointers for destructibility.
+ uprv_memset(supportedLocales, 0, supportedLocalesLength * sizeof(const Locale *));
+ // Also find the first supported locale whose LSR is
+ // the same as that for the default locale.
+ LSR builderDefaultLSR;
+ const LSR *defLSR = nullptr;
+ if (def != nullptr) {
+ builderDefaultLSR = getMaximalLsrOrUnd(likelySubtags, *def, errorCode);
+ if (U_FAILURE(errorCode)) { return; }
+ defLSR = &builderDefaultLSR;
+ }
+ for (int32_t i = 0; i < supportedLocalesLength; ++i) {
+ const Locale &locale = *static_cast<Locale *>(builder.supportedLocales_->elementAt(i));
+ supportedLocales[i] = locale.clone();
+ if (supportedLocales[i] == nullptr) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ const Locale &supportedLocale = *supportedLocales[i];
+ LSR &lsr = lsrs[i] = getMaximalLsrOrUnd(likelySubtags, supportedLocale, errorCode);
+ lsr.setHashCode();
+ if (U_FAILURE(errorCode)) { return; }
+ if (idef < 0 && defLSR != nullptr && lsr == *defLSR) {
+ idef = i;
+ defLSR = &lsr; // owned pointer to put into supportedLsrToIndex
+ if (*def == supportedLocale) {
+ def = &supportedLocale; // owned pointer to keep
+ }
+ }
+ }
+
+ // We need an unordered map from LSR to first supported locale with that LSR,
+ // and an ordered list of (LSR, supported index).
+ // We insert the supported locales in the following order:
+ // 1. Default locale, if it is supported.
+ // 2. Priority locales (aka "paradigm locales") in builder order.
+ // 3. Remaining locales in builder order.
+ // In Java, we use a LinkedHashMap for both map & ordered lists.
+ // In C++, we use separate structures.
+ // We over-allocate arrays of LSRs and indexes for simplicity.
+ // We reserve slots at the array starts for the default and paradigm locales,
+ // plus enough for all supported locales.
+ // If there are few paradigm locales and few duplicate supported LSRs,
+ // then the amount of wasted space is small.
+ supportedLsrToIndex = uhash_openSize(hashLSR, compareLSRs, uhash_compareLong,
+ supportedLocalesLength, &errorCode);
+ if (U_FAILURE(errorCode)) { return; }
+ int32_t paradigmLimit = 1 + localeDistance.getParadigmLSRsLength();
+ int32_t suppLSRsCapacity = paradigmLimit + supportedLocalesLength;
+ supportedLSRs = static_cast<const LSR **>(
+ uprv_malloc(suppLSRsCapacity * sizeof(const LSR *)));
+ supportedIndexes = static_cast<int32_t *>(
+ uprv_malloc(suppLSRsCapacity * sizeof(int32_t)));
+ if (supportedLSRs == nullptr || supportedIndexes == nullptr) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ int32_t paradigmIndex = 0;
+ int32_t otherIndex = paradigmLimit;
+ if (idef >= 0) {
+ uhash_puti(supportedLsrToIndex, const_cast<LSR *>(defLSR), idef + 1, &errorCode);
+ supportedLSRs[0] = defLSR;
+ supportedIndexes[0] = idef;
+ paradigmIndex = 1;
+ }
+ for (int32_t i = 0; i < supportedLocalesLength; ++i) {
+ if (i == idef) { continue; }
+ const Locale &locale = *supportedLocales[i];
+ const LSR &lsr = lsrs[i];
+ if (defLSR == nullptr) {
+ U_ASSERT(i == 0);
+ def = &locale;
+ defLSR = &lsr;
+ idef = 0;
+ uhash_puti(supportedLsrToIndex, const_cast<LSR *>(&lsr), 0 + 1, &errorCode);
+ supportedLSRs[0] = &lsr;
+ supportedIndexes[0] = 0;
+ paradigmIndex = 1;
+ } else if (idef >= 0 && lsr == *defLSR) {
+ // lsr == *defLSR means that this supported locale is
+ // a duplicate of the default locale.
+ // Either an explicit default locale is supported, and we added it before the loop,
+ // or there is no explicit default locale, and this is
+ // a duplicate of the first supported locale.
+ // In both cases, idef >= 0 now, so otherwise we can skip the comparison.
+ // For a duplicate, putIfAbsent() is a no-op, so nothing to do.
+ } else {
+ if (putIfAbsent(supportedLsrToIndex, lsr, i + 1, errorCode)) {
+ if (localeDistance.isParadigmLSR(lsr)) {
+ supportedLSRs[paradigmIndex] = &lsr;
+ supportedIndexes[paradigmIndex++] = i;
+ } else {
+ supportedLSRs[otherIndex] = &lsr;
+ supportedIndexes[otherIndex++] = i;
+ }
+ }
+ }
+ if (U_FAILURE(errorCode)) { return; }
+ }
+ // Squeeze out unused array slots.
+ if (paradigmIndex < paradigmLimit && paradigmLimit < otherIndex) {
+ uprv_memmove(supportedLSRs + paradigmIndex, supportedLSRs + paradigmLimit,
+ (otherIndex - paradigmLimit) * sizeof(const LSR *));
+ uprv_memmove(supportedIndexes + paradigmIndex, supportedIndexes + paradigmLimit,
+ (otherIndex - paradigmLimit) * sizeof(int32_t));
+ }
+ supportedLSRsLength = otherIndex - (paradigmLimit - paradigmIndex);
+ }
+
+ if (def != nullptr && (idef < 0 || def != supportedLocales[idef])) {
+ ownedDefaultLocale = def->clone();
+ if (ownedDefaultLocale == nullptr) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ def = ownedDefaultLocale;
+ }
+ defaultLocale = def;
+ defaultLocaleIndex = idef;
+
+ if (builder.demotion_ == ULOCMATCH_DEMOTION_REGION) {
+ demotionPerDesiredLocale = localeDistance.getDefaultDemotionPerDesiredLocale();
+ }
+}
+
+LocaleMatcher::LocaleMatcher(LocaleMatcher &&src) U_NOEXCEPT :
+ likelySubtags(src.likelySubtags),
+ localeDistance(src.localeDistance),
+ thresholdDistance(src.thresholdDistance),
+ demotionPerDesiredLocale(src.demotionPerDesiredLocale),
+ favorSubtag(src.favorSubtag),
+ supportedLocales(src.supportedLocales), lsrs(src.lsrs),
+ supportedLocalesLength(src.supportedLocalesLength),
+ supportedLsrToIndex(src.supportedLsrToIndex),
+ supportedLSRs(src.supportedLSRs),
+ supportedIndexes(src.supportedIndexes),
+ supportedLSRsLength(src.supportedLSRsLength),
+ ownedDefaultLocale(src.ownedDefaultLocale), defaultLocale(src.defaultLocale),
+ defaultLocaleIndex(src.defaultLocaleIndex) {
+ src.supportedLocales = nullptr;
+ src.lsrs = nullptr;
+ src.supportedLocalesLength = 0;
+ src.supportedLsrToIndex = nullptr;
+ src.supportedLSRs = nullptr;
+ src.supportedIndexes = nullptr;
+ src.supportedLSRsLength = 0;
+ src.ownedDefaultLocale = nullptr;
+ src.defaultLocale = nullptr;
+ src.defaultLocaleIndex = -1;
+}
+
+LocaleMatcher::~LocaleMatcher() {
+ for (int32_t i = 0; i < supportedLocalesLength; ++i) {
+ delete supportedLocales[i];
+ }
+ uprv_free(supportedLocales);
+ delete[] lsrs;
+ uhash_close(supportedLsrToIndex);
+ uprv_free(supportedLSRs);
+ uprv_free(supportedIndexes);
+ delete ownedDefaultLocale;
+}
+
+LocaleMatcher &LocaleMatcher::operator=(LocaleMatcher &&src) U_NOEXCEPT {
+ this->~LocaleMatcher();
+
+ thresholdDistance = src.thresholdDistance;
+ demotionPerDesiredLocale = src.demotionPerDesiredLocale;
+ favorSubtag = src.favorSubtag;
+ supportedLocales = src.supportedLocales;
+ lsrs = src.lsrs;
+ supportedLocalesLength = src.supportedLocalesLength;
+ supportedLsrToIndex = src.supportedLsrToIndex;
+ supportedLSRs = src.supportedLSRs;
+ supportedIndexes = src.supportedIndexes;
+ supportedLSRsLength = src.supportedLSRsLength;
+ ownedDefaultLocale = src.ownedDefaultLocale;
+ defaultLocale = src.defaultLocale;
+ defaultLocaleIndex = src.defaultLocaleIndex;
+
+ src.supportedLocales = nullptr;
+ src.lsrs = nullptr;
+ src.supportedLocalesLength = 0;
+ src.supportedLsrToIndex = nullptr;
+ src.supportedLSRs = nullptr;
+ src.supportedIndexes = nullptr;
+ src.supportedLSRsLength = 0;
+ src.ownedDefaultLocale = nullptr;
+ src.defaultLocale = nullptr;
+ src.defaultLocaleIndex = -1;
+ return *this;
+}
+
+class LocaleLsrIterator {
+public:
+ LocaleLsrIterator(const XLikelySubtags &likelySubtags, Locale::Iterator &locales,
+ ULocMatchLifetime lifetime) :
+ likelySubtags(likelySubtags), locales(locales), lifetime(lifetime) {}
+
+ ~LocaleLsrIterator() {
+ if (lifetime == ULOCMATCH_TEMPORARY_LOCALES) {
+ delete remembered;
+ }
+ }
+
+ bool hasNext() const {
+ return locales.hasNext();
+ }
+
+ LSR next(UErrorCode &errorCode) {
+ current = &locales.next();
+ return getMaximalLsrOrUnd(likelySubtags, *current, errorCode);
+ }
+
+ void rememberCurrent(int32_t desiredIndex, UErrorCode &errorCode) {
+ if (U_FAILURE(errorCode)) { return; }
+ bestDesiredIndex = desiredIndex;
+ if (lifetime == ULOCMATCH_STORED_LOCALES) {
+ remembered = current;
+ } else {
+ // ULOCMATCH_TEMPORARY_LOCALES
+ delete remembered;
+ remembered = new Locale(*current);
+ if (remembered == nullptr) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ }
+ }
+ }
+
+ const Locale *orphanRemembered() {
+ const Locale *rem = remembered;
+ remembered = nullptr;
+ return rem;
+ }
+
+ int32_t getBestDesiredIndex() const {
+ return bestDesiredIndex;
+ }
+
+private:
+ const XLikelySubtags &likelySubtags;
+ Locale::Iterator &locales;
+ ULocMatchLifetime lifetime;
+ const Locale *current = nullptr, *remembered = nullptr;
+ int32_t bestDesiredIndex = -1;
+};
+
+const Locale *LocaleMatcher::getBestMatch(const Locale &desiredLocale, UErrorCode &errorCode) const {
+ if (U_FAILURE(errorCode)) { return nullptr; }
+ int32_t suppIndex = getBestSuppIndex(
+ getMaximalLsrOrUnd(likelySubtags, desiredLocale, errorCode),
+ nullptr, errorCode);
+ return U_SUCCESS(errorCode) && suppIndex >= 0 ? supportedLocales[suppIndex] : defaultLocale;
+}
+
+const Locale *LocaleMatcher::getBestMatch(Locale::Iterator &desiredLocales,
+ UErrorCode &errorCode) const {
+ if (U_FAILURE(errorCode)) { return nullptr; }
+ if (!desiredLocales.hasNext()) {
+ return defaultLocale;
+ }
+ LocaleLsrIterator lsrIter(likelySubtags, desiredLocales, ULOCMATCH_TEMPORARY_LOCALES);
+ int32_t suppIndex = getBestSuppIndex(lsrIter.next(errorCode), &lsrIter, errorCode);
+ return U_SUCCESS(errorCode) && suppIndex >= 0 ? supportedLocales[suppIndex] : defaultLocale;
+}
+
+const Locale *LocaleMatcher::getBestMatchForListString(
+ StringPiece desiredLocaleList, UErrorCode &errorCode) const {
+ LocalePriorityList list(desiredLocaleList, errorCode);
+ LocalePriorityList::Iterator iter = list.iterator();
+ return getBestMatch(iter, errorCode);
+}
+
+LocaleMatcher::Result LocaleMatcher::getBestMatchResult(
+ const Locale &desiredLocale, UErrorCode &errorCode) const {
+ if (U_FAILURE(errorCode)) {
+ return Result(nullptr, defaultLocale, -1, defaultLocaleIndex, FALSE);
+ }
+ int32_t suppIndex = getBestSuppIndex(
+ getMaximalLsrOrUnd(likelySubtags, desiredLocale, errorCode),
+ nullptr, errorCode);
+ if (U_FAILURE(errorCode) || suppIndex < 0) {
+ return Result(nullptr, defaultLocale, -1, defaultLocaleIndex, FALSE);
+ } else {
+ return Result(&desiredLocale, supportedLocales[suppIndex], 0, suppIndex, FALSE);
+ }
+}
+
+LocaleMatcher::Result LocaleMatcher::getBestMatchResult(
+ Locale::Iterator &desiredLocales, UErrorCode &errorCode) const {
+ if (U_FAILURE(errorCode) || !desiredLocales.hasNext()) {
+ return Result(nullptr, defaultLocale, -1, defaultLocaleIndex, FALSE);
+ }
+ LocaleLsrIterator lsrIter(likelySubtags, desiredLocales, ULOCMATCH_TEMPORARY_LOCALES);
+ int32_t suppIndex = getBestSuppIndex(lsrIter.next(errorCode), &lsrIter, errorCode);
+ if (U_FAILURE(errorCode) || suppIndex < 0) {
+ return Result(nullptr, defaultLocale, -1, defaultLocaleIndex, FALSE);
+ } else {
+ return Result(lsrIter.orphanRemembered(), supportedLocales[suppIndex],
+ lsrIter.getBestDesiredIndex(), suppIndex, TRUE);
+ }
+}
+
+int32_t LocaleMatcher::getBestSuppIndex(LSR desiredLSR, LocaleLsrIterator *remainingIter,
+ UErrorCode &errorCode) const {
+ if (U_FAILURE(errorCode)) { return -1; }
+ int32_t desiredIndex = 0;
+ int32_t bestSupportedLsrIndex = -1;
+ for (int32_t bestDistance = thresholdDistance;;) {
+ // Quick check for exact maximized LSR.
+ // Returns suppIndex+1 where 0 means not found.
+ if (supportedLsrToIndex != nullptr) {
+ desiredLSR.setHashCode();
+ int32_t index = uhash_geti(supportedLsrToIndex, &desiredLSR);
+ if (index != 0) {
+ int32_t suppIndex = index - 1;
+ if (remainingIter != nullptr) {
+ remainingIter->rememberCurrent(desiredIndex, errorCode);
+ }
+ return suppIndex;
+ }
+ }
+ int32_t bestIndexAndDistance = localeDistance.getBestIndexAndDistance(
+ desiredLSR, supportedLSRs, supportedLSRsLength, bestDistance, favorSubtag);
+ if (bestIndexAndDistance >= 0) {
+ bestDistance = bestIndexAndDistance & 0xff;
+ if (remainingIter != nullptr) {
+ remainingIter->rememberCurrent(desiredIndex, errorCode);
+ if (U_FAILURE(errorCode)) { return -1; }
+ }
+ bestSupportedLsrIndex = bestIndexAndDistance >= 0 ? bestIndexAndDistance >> 8 : -1;
+ }
+ if ((bestDistance -= demotionPerDesiredLocale) <= 0) {
+ break;
+ }
+ if (remainingIter == nullptr || !remainingIter->hasNext()) {
+ break;
+ }
+ desiredLSR = remainingIter->next(errorCode);
+ if (U_FAILURE(errorCode)) { return -1; }
+ ++desiredIndex;
+ }
+ if (bestSupportedLsrIndex < 0) {
+ // no good match
+ return -1;
+ }
+ return supportedIndexes[bestSupportedLsrIndex];
+}
+
+double LocaleMatcher::internalMatch(const Locale &desired, const Locale &supported, UErrorCode &errorCode) const {
+ // Returns the inverse of the distance: That is, 1-distance(desired, supported).
+ LSR suppLSR = getMaximalLsrOrUnd(likelySubtags, supported, errorCode);
+ if (U_FAILURE(errorCode)) { return 0; }
+ const LSR *pSuppLSR = &suppLSR;
+ int32_t distance = localeDistance.getBestIndexAndDistance(
+ getMaximalLsrOrUnd(likelySubtags, desired, errorCode),
+ &pSuppLSR, 1,
+ thresholdDistance, favorSubtag) & 0xff;
+ return (100 - distance) / 100.0;
+}
+
+U_NAMESPACE_END
+
+#endif // __LOCMATCHER_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/localeprioritylist.cpp b/Build/source/libs/icu/icu-src/source/common/localeprioritylist.cpp
new file mode 100644
index 00000000000..06442fb46a8
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/common/localeprioritylist.cpp
@@ -0,0 +1,239 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+
+// localeprioritylist.cpp
+// created: 2019jul11 Markus W. Scherer
+
+#include "unicode/utypes.h"
+#include "unicode/localpointer.h"
+#include "unicode/locid.h"
+#include "unicode/stringpiece.h"
+#include "unicode/uobject.h"
+#include "charstr.h"
+#include "cmemory.h"
+#include "localeprioritylist.h"
+#include "uarrsort.h"
+#include "uassert.h"
+#include "uhash.h"
+
+U_NAMESPACE_BEGIN
+
+namespace {
+
+int32_t hashLocale(const UHashTok token) {
+ auto *locale = static_cast<const Locale *>(token.pointer);
+ return locale->hashCode();
+}
+
+UBool compareLocales(const UHashTok t1, const UHashTok t2) {
+ auto *l1 = static_cast<const Locale *>(t1.pointer);
+ auto *l2 = static_cast<const Locale *>(t2.pointer);
+ return *l1 == *l2;
+}
+
+constexpr int32_t WEIGHT_ONE = 1000;
+
+struct LocaleAndWeight {
+ Locale *locale;
+ int32_t weight; // 0..1000 = 0.0..1.0
+ int32_t index; // force stable sort
+
+ int32_t compare(const LocaleAndWeight &other) const {
+ int32_t diff = other.weight - weight; // descending: other-this
+ if (diff != 0) { return diff; }
+ return index - other.index;
+ }
+};
+
+int32_t U_CALLCONV
+compareLocaleAndWeight(const void * /*context*/, const void *left, const void *right) {
+ return static_cast<const LocaleAndWeight *>(left)->
+ compare(*static_cast<const LocaleAndWeight *>(right));
+}
+
+const char *skipSpaces(const char *p, const char *limit) {
+ while (p < limit && *p == ' ') { ++p; }
+ return p;
+}
+
+int32_t findTagLength(const char *p, const char *limit) {
+ // Look for accept-language delimiters.
+ // Leave other validation up to the Locale constructor.
+ const char *q;
+ for (q = p; q < limit; ++q) {
+ char c = *q;
+ if (c == ' ' || c == ',' || c == ';') { break; }
+ }
+ return static_cast<int32_t>(q - p);
+}
+
+/**
+ * Parses and returns a qvalue weight in millis.
+ * Advances p to after the parsed substring.
+ * Returns a negative value if parsing fails.
+ */
+int32_t parseWeight(const char *&p, const char *limit) {
+ p = skipSpaces(p, limit);
+ char c;
+ if (p == limit || ((c = *p) != '0' && c != '1')) { return -1; }
+ int32_t weight = (c - '0') * 1000;
+ if (++p == limit || *p != '.') { return weight; }
+ int32_t multiplier = 100;
+ while (++p != limit && '0' <= (c = *p) && c <= '9') {
+ c -= '0';
+ if (multiplier > 0) {
+ weight += c * multiplier;
+ multiplier /= 10;
+ } else if (multiplier == 0) {
+ // round up
+ if (c >= 5) { ++weight; }
+ multiplier = -1;
+ } // else ignore further fraction digits
+ }
+ return weight <= WEIGHT_ONE ? weight : -1; // bad if > 1.0
+}
+
+} // namespace
+
+/**
+ * Nothing but a wrapper over a MaybeStackArray of LocaleAndWeight.
+ *
+ * This wrapper exists (and is not in an anonymous namespace)
+ * so that we can forward-declare it in the header file and
+ * don't have to expose the MaybeStackArray specialization and
+ * the LocaleAndWeight to code (like the test) that #includes localeprioritylist.h.
+ * Also, otherwise we would have to do a platform-specific
+ * template export declaration of some kind for the MaybeStackArray specialization
+ * to be properly exported from the common DLL.
+ */
+struct LocaleAndWeightArray : public UMemory {
+ MaybeStackArray<LocaleAndWeight, 20> array;
+};
+
+LocalePriorityList::LocalePriorityList(StringPiece s, UErrorCode &errorCode) {
+ if (U_FAILURE(errorCode)) { return; }
+ list = new LocaleAndWeightArray();
+ if (list == nullptr) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ const char *p = s.data();
+ const char *limit = p + s.length();
+ while ((p = skipSpaces(p, limit)) != limit) {
+ if (*p == ',') { // empty range field
+ ++p;
+ continue;
+ }
+ int32_t tagLength = findTagLength(p, limit);
+ if (tagLength == 0) {
+ errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
+ CharString tag(p, tagLength, errorCode);
+ if (U_FAILURE(errorCode)) { return; }
+ Locale locale = Locale(tag.data());
+ if (locale.isBogus()) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ int32_t weight = WEIGHT_ONE;
+ if ((p = skipSpaces(p + tagLength, limit)) != limit && *p == ';') {
+ if ((p = skipSpaces(p + 1, limit)) == limit || *p != 'q' ||
+ (p = skipSpaces(p + 1, limit)) == limit || *p != '=' ||
+ (++p, (weight = parseWeight(p, limit)) < 0)) {
+ errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
+ p = skipSpaces(p, limit);
+ }
+ if (p != limit && *p != ',') { // trailing junk
+ errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
+ add(locale, weight, errorCode);
+ if (p == limit) { break; }
+ ++p;
+ }
+ sort(errorCode);
+}
+
+LocalePriorityList::~LocalePriorityList() {
+ if (list != nullptr) {
+ for (int32_t i = 0; i < listLength; ++i) {
+ delete list->array[i].locale;
+ }
+ delete list;
+ }
+ uhash_close(map);
+}
+
+const Locale *LocalePriorityList::localeAt(int32_t i) const {
+ return list->array[i].locale;
+}
+
+Locale *LocalePriorityList::orphanLocaleAt(int32_t i) {
+ if (list == nullptr) { return nullptr; }
+ LocaleAndWeight &lw = list->array[i];
+ Locale *l = lw.locale;
+ lw.locale = nullptr;
+ return l;
+}
+
+bool LocalePriorityList::add(const Locale &locale, int32_t weight, UErrorCode &errorCode) {
+ if (U_FAILURE(errorCode)) { return false; }
+ if (map == nullptr) {
+ if (weight <= 0) { return true; } // do not add q=0
+ map = uhash_open(hashLocale, compareLocales, uhash_compareLong, &errorCode);
+ if (U_FAILURE(errorCode)) { return false; }
+ }
+ LocalPointer<Locale> clone;
+ int32_t index = uhash_geti(map, &locale);
+ if (index != 0) {
+ // Duplicate: Remove the old item and append it anew.
+ LocaleAndWeight &lw = list->array[index - 1];
+ clone.adoptInstead(lw.locale);
+ lw.locale = nullptr;
+ lw.weight = 0;
+ ++numRemoved;
+ }
+ if (weight <= 0) { // do not add q=0
+ if (index != 0) {
+ // Not strictly necessary but cleaner.
+ uhash_removei(map, &locale);
+ }
+ return true;
+ }
+ if (clone.isNull()) {
+ clone.adoptInstead(locale.clone());
+ if (clone.isNull() || (clone->isBogus() && !locale.isBogus())) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return false;
+ }
+ }
+ if (listLength == list->array.getCapacity()) {
+ int32_t newCapacity = listLength < 50 ? 100 : 4 * listLength;
+ if (list->array.resize(newCapacity, listLength) == nullptr) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return false;
+ }
+ }
+ uhash_puti(map, clone.getAlias(), listLength + 1, &errorCode);
+ if (U_FAILURE(errorCode)) { return false; }
+ LocaleAndWeight &lw = list->array[listLength];
+ lw.locale = clone.orphan();
+ lw.weight = weight;
+ lw.index = listLength++;
+ if (weight < WEIGHT_ONE) { hasWeights = true; }
+ U_ASSERT(uhash_count(map) == getLength());
+ return true;
+}
+
+void LocalePriorityList::sort(UErrorCode &errorCode) {
+ // Sort by descending weights if there is a mix of weights.
+ // The comparator forces a stable sort via the item index.
+ if (U_FAILURE(errorCode) || getLength() <= 1 || !hasWeights) { return; }
+ uprv_sortArray(list->array.getAlias(), listLength, sizeof(LocaleAndWeight),
+ compareLocaleAndWeight, nullptr, FALSE, &errorCode);
+}
+
+U_NAMESPACE_END
diff --git a/Build/source/libs/icu/icu-src/source/common/localeprioritylist.h b/Build/source/libs/icu/icu-src/source/common/localeprioritylist.h
new file mode 100644
index 00000000000..80ca38a7b52
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/common/localeprioritylist.h
@@ -0,0 +1,115 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+
+// localeprioritylist.h
+// created: 2019jul11 Markus W. Scherer
+
+#ifndef __LOCALEPRIORITYLIST_H__
+#define __LOCALEPRIORITYLIST_H__
+
+#include "unicode/utypes.h"
+#include "unicode/locid.h"
+#include "unicode/stringpiece.h"
+#include "unicode/uobject.h"
+
+struct UHashtable;
+
+U_NAMESPACE_BEGIN
+
+struct LocaleAndWeightArray;
+
+/**
+ * Parses a list of locales from an accept-language string.
+ * We are a bit more lenient than the spec:
+ * We accept extra whitespace in more places, empty range fields,
+ * and any number of qvalue fraction digits.
+ *
+ * https://tools.ietf.org/html/rfc2616#section-14.4
+ * 14.4 Accept-Language
+ *
+ * Accept-Language = "Accept-Language" ":"
+ * 1#( language-range [ ";" "q" "=" qvalue ] )
+ * language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
+ *
+ * Each language-range MAY be given an associated quality value which
+ * represents an estimate of the user's preference for the languages
+ * specified by that range. The quality value defaults to "q=1". For
+ * example,
+ *
+ * Accept-Language: da, en-gb;q=0.8, en;q=0.7
+ *
+ * https://tools.ietf.org/html/rfc2616#section-3.9
+ * 3.9 Quality Values
+ *
+ * HTTP content negotiation (section 12) uses short "floating point"
+ * numbers to indicate the relative importance ("weight") of various
+ * negotiable parameters. A weight is normalized to a real number in
+ * the range 0 through 1, where 0 is the minimum and 1 the maximum
+ * value. If a parameter has a quality value of 0, then content with
+ * this parameter is `not acceptable' for the client. HTTP/1.1
+ * applications MUST NOT generate more than three digits after the
+ * decimal point. User configuration of these values SHOULD also be
+ * limited in this fashion.
+ *
+ * qvalue = ( "0" [ "." 0*3DIGIT ] )
+ * | ( "1" [ "." 0*3("0") ] )
+ */
+class U_COMMON_API LocalePriorityList : public UMemory {
+public:
+ class Iterator : public Locale::Iterator {
+ public:
+ UBool hasNext() const override { return count < length; }
+
+ const Locale &next() override {
+ for(;;) {
+ const Locale *locale = list.localeAt(index++);
+ if (locale != nullptr) {
+ ++count;
+ return *locale;
+ }
+ }
+ }
+
+ private:
+ friend class LocalePriorityList;
+
+ Iterator(const LocalePriorityList &list) : list(list), length(list.getLength()) {}
+
+ const LocalePriorityList &list;
+ int32_t index = 0;
+ int32_t count = 0;
+ const int32_t length;
+ };
+
+ LocalePriorityList(StringPiece s, UErrorCode &errorCode);
+
+ ~LocalePriorityList();
+
+ int32_t getLength() const { return listLength - numRemoved; }
+
+ int32_t getLengthIncludingRemoved() const { return listLength; }
+
+ Iterator iterator() const { return Iterator(*this); }
+
+ const Locale *localeAt(int32_t i) const;
+
+ Locale *orphanLocaleAt(int32_t i);
+
+private:
+ LocalePriorityList(const LocalePriorityList &) = delete;
+ LocalePriorityList &operator=(const LocalePriorityList &) = delete;
+
+ bool add(const Locale &locale, int32_t weight, UErrorCode &errorCode);
+
+ void sort(UErrorCode &errorCode);
+
+ LocaleAndWeightArray *list = nullptr;
+ int32_t listLength = 0;
+ int32_t numRemoved = 0;
+ bool hasWeights = false; // other than 1.0
+ UHashtable *map = nullptr;
+};
+
+U_NAMESPACE_END
+
+#endif // __LOCALEPRIORITYLIST_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/localsvc.h b/Build/source/libs/icu/icu-src/source/common/localsvc.h
index 60d447c264d..33640195135 100644
--- a/Build/source/libs/icu/icu-src/source/common/localsvc.h
+++ b/Build/source/libs/icu/icu-src/source/common/localsvc.h
@@ -12,7 +12,7 @@
#include "unicode/utypes.h"
-#if U_LOCAL_SERVICE_HOOK
+#if defined(U_LOCAL_SERVICE_HOOK) && U_LOCAL_SERVICE_HOOK
/**
* Prototype for user-supplied service hook. This function is expected to return
* a type of factory object specific to the requested service.
diff --git a/Build/source/libs/icu/icu-src/source/common/locavailable.cpp b/Build/source/libs/icu/icu-src/source/common/locavailable.cpp
index 8782d0c77e6..e8ec512e370 100644
--- a/Build/source/libs/icu/icu-src/source/common/locavailable.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/locavailable.cpp
@@ -19,11 +19,13 @@
* that then do not depend on resource bundle code and res_index bundles.
*/
+#include "unicode/errorcode.h"
#include "unicode/utypes.h"
#include "unicode/locid.h"
#include "unicode/uloc.h"
#include "unicode/ures.h"
#include "cmemory.h"
+#include "cstring.h"
#include "ucln_cmn.h"
#include "uassert.h"
#include "umutex.h"
@@ -95,87 +97,174 @@ U_NAMESPACE_USE
/* ### Constants **************************************************/
-/* These strings describe the resources we attempt to load from
- the locale ResourceBundle data file.*/
-static const char _kIndexLocaleName[] = "res_index";
-static const char _kIndexTag[] = "InstalledLocales";
+namespace {
-static char** _installedLocales = NULL;
-static int32_t _installedLocalesCount = 0;
-static icu::UInitOnce _installedLocalesInitOnce;
+// Enough capacity for the two lists in the res_index.res file
+const char** gAvailableLocaleNames[2] = {};
+int32_t gAvailableLocaleCounts[2] = {};
+icu::UInitOnce ginstalledLocalesInitOnce = U_INITONCE_INITIALIZER;
-/* ### Get available **************************************************/
+class AvailableLocalesSink : public ResourceSink {
+ public:
+ void put(const char *key, ResourceValue &value, UBool /*noFallback*/, UErrorCode &status) U_OVERRIDE {
+ ResourceTable resIndexTable = value.getTable(status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+ for (int32_t i = 0; resIndexTable.getKeyAndValue(i, key, value); ++i) {
+ ULocAvailableType type;
+ if (uprv_strcmp(key, "InstalledLocales") == 0) {
+ type = ULOC_AVAILABLE_DEFAULT;
+ } else if (uprv_strcmp(key, "AliasLocales") == 0) {
+ type = ULOC_AVAILABLE_ONLY_LEGACY_ALIASES;
+ } else {
+ // CLDRVersion, etc.
+ continue;
+ }
+ ResourceTable availableLocalesTable = value.getTable(status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+ gAvailableLocaleCounts[type] = availableLocalesTable.getSize();
+ gAvailableLocaleNames[type] = static_cast<const char**>(
+ uprv_malloc(gAvailableLocaleCounts[type] * sizeof(const char*)));
+ if (gAvailableLocaleNames[type] == nullptr) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ for (int32_t j = 0; availableLocalesTable.getKeyAndValue(j, key, value); ++j) {
+ gAvailableLocaleNames[type][j] = key;
+ }
+ }
+ }
+};
-static UBool U_CALLCONV uloc_cleanup(void) {
- char ** temp;
+class AvailableLocalesStringEnumeration : public StringEnumeration {
+ public:
+ AvailableLocalesStringEnumeration(ULocAvailableType type) : fType(type) {
+ }
- if (_installedLocales) {
- temp = _installedLocales;
- _installedLocales = NULL;
+ const char* next(int32_t *resultLength, UErrorCode&) override {
+ ULocAvailableType actualType = fType;
+ int32_t actualIndex = fIndex++;
+
+ // If the "combined" list was requested, resolve that now
+ if (fType == ULOC_AVAILABLE_WITH_LEGACY_ALIASES) {
+ int32_t defaultLocalesCount = gAvailableLocaleCounts[ULOC_AVAILABLE_DEFAULT];
+ if (actualIndex < defaultLocalesCount) {
+ actualType = ULOC_AVAILABLE_DEFAULT;
+ } else {
+ actualIndex -= defaultLocalesCount;
+ actualType = ULOC_AVAILABLE_ONLY_LEGACY_ALIASES;
+ }
+ }
- _installedLocalesCount = 0;
- _installedLocalesInitOnce.reset();
+ // Return the requested string
+ int32_t count = gAvailableLocaleCounts[actualType];
+ const char* result;
+ if (actualIndex < count) {
+ result = gAvailableLocaleNames[actualType][actualIndex];
+ if (resultLength != nullptr) {
+ *resultLength = static_cast<int32_t>(uprv_strlen(result));
+ }
+ } else {
+ result = nullptr;
+ if (resultLength != nullptr) {
+ *resultLength = 0;
+ }
+ }
+ return result;
+ }
- uprv_free(temp);
+ void reset(UErrorCode&) override {
+ fIndex = 0;
}
+
+ int32_t count(UErrorCode&) const override {
+ if (fType == ULOC_AVAILABLE_WITH_LEGACY_ALIASES) {
+ return gAvailableLocaleCounts[ULOC_AVAILABLE_DEFAULT]
+ + gAvailableLocaleCounts[ULOC_AVAILABLE_ONLY_LEGACY_ALIASES];
+ } else {
+ return gAvailableLocaleCounts[fType];
+ }
+ }
+
+ private:
+ ULocAvailableType fType;
+ int32_t fIndex = 0;
+};
+
+/* ### Get available **************************************************/
+
+static UBool U_CALLCONV uloc_cleanup(void) {
+ for (int32_t i = 0; i < UPRV_LENGTHOF(gAvailableLocaleNames); i++) {
+ uprv_free(gAvailableLocaleNames[i]);
+ gAvailableLocaleNames[i] = nullptr;
+ gAvailableLocaleCounts[i] = 0;
+ }
+ ginstalledLocalesInitOnce.reset();
return TRUE;
}
// Load Installed Locales. This function will be called exactly once
// via the initOnce mechanism.
-static void U_CALLCONV loadInstalledLocales() {
- UResourceBundle *indexLocale = NULL;
- UResourceBundle installed;
- UErrorCode status = U_ZERO_ERROR;
- int32_t i = 0;
- int32_t localeCount;
-
- U_ASSERT(_installedLocales == NULL);
- U_ASSERT(_installedLocalesCount == 0);
+static void U_CALLCONV loadInstalledLocales(UErrorCode& status) {
+ ucln_common_registerCleanup(UCLN_COMMON_ULOC, uloc_cleanup);
- _installedLocalesCount = 0;
- ures_initStackObject(&installed);
- indexLocale = ures_openDirect(NULL, _kIndexLocaleName, &status);
- ures_getByKey(indexLocale, _kIndexTag, &installed, &status);
-
- if(U_SUCCESS(status)) {
- localeCount = ures_getSize(&installed);
- _installedLocales = (char **) uprv_malloc(sizeof(char*) * (localeCount+1));
- if (_installedLocales != NULL) {
- ures_resetIterator(&installed);
- while(ures_hasNext(&installed)) {
- ures_getNextString(&installed, NULL, (const char **)&_installedLocales[i++], &status);
- }
- _installedLocales[i] = NULL;
- _installedLocalesCount = localeCount;
- ucln_common_registerCleanup(UCLN_COMMON_ULOC, uloc_cleanup);
- }
- }
- ures_close(&installed);
- ures_close(indexLocale);
+ icu::LocalUResourceBundlePointer rb(ures_openDirect(NULL, "res_index", &status));
+ AvailableLocalesSink sink;
+ ures_getAllItemsWithFallback(rb.getAlias(), "", sink, status);
}
-static void _load_installedLocales()
-{
- umtx_initOnce(_installedLocalesInitOnce, &loadInstalledLocales);
+void _load_installedLocales(UErrorCode& status) {
+ umtx_initOnce(ginstalledLocalesInitOnce, &loadInstalledLocales, status);
}
+} // namespace
+
U_CAPI const char* U_EXPORT2
-uloc_getAvailable(int32_t offset)
-{
-
- _load_installedLocales();
-
- if (offset > _installedLocalesCount)
- return NULL;
- return _installedLocales[offset];
+uloc_getAvailable(int32_t offset) {
+ icu::ErrorCode status;
+ _load_installedLocales(status);
+ if (status.isFailure()) {
+ return nullptr;
+ }
+ if (offset > gAvailableLocaleCounts[0]) {
+ // *status = U_ILLEGAL_ARGUMENT_ERROR;
+ return nullptr;
+ }
+ return gAvailableLocaleNames[0][offset];
}
U_CAPI int32_t U_EXPORT2
-uloc_countAvailable()
-{
- _load_installedLocales();
- return _installedLocalesCount;
+uloc_countAvailable() {
+ icu::ErrorCode status;
+ _load_installedLocales(status);
+ if (status.isFailure()) {
+ return 0;
+ }
+ return gAvailableLocaleCounts[0];
+}
+
+U_CAPI UEnumeration* U_EXPORT2
+uloc_openAvailableByType(ULocAvailableType type, UErrorCode* status) {
+ if (U_FAILURE(*status)) {
+ return nullptr;
+ }
+ if (type < 0 || type >= ULOC_AVAILABLE_COUNT) {
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
+ return nullptr;
+ }
+ _load_installedLocales(*status);
+ if (U_FAILURE(*status)) {
+ return nullptr;
+ }
+ LocalPointer<AvailableLocalesStringEnumeration> result(
+ new AvailableLocalesStringEnumeration(type), *status);
+ if (U_FAILURE(*status)) {
+ return nullptr;
+ }
+ return uenum_openFromStringEnumeration(result.orphan(), status);
}
diff --git a/Build/source/libs/icu/icu-src/source/common/locbased.h b/Build/source/libs/icu/icu-src/source/common/locbased.h
index 06133be1b7b..45738863b5e 100644
--- a/Build/source/libs/icu/icu-src/source/common/locbased.h
+++ b/Build/source/libs/icu/icu-src/source/common/locbased.h
@@ -22,7 +22,7 @@
* `actualLocale' of size ULOC_FULLNAME_CAPACITY
*/
#define U_LOCALE_BASED(varname, objname) \
- LocaleBased varname((objname).validLocale, (objname).actualLocale);
+ LocaleBased varname((objname).validLocale, (objname).actualLocale)
U_NAMESPACE_BEGIN
diff --git a/Build/source/libs/icu/icu-src/source/common/locdispnames.cpp b/Build/source/libs/icu/icu-src/source/common/locdispnames.cpp
index e38550274f9..d92348e31c8 100644
--- a/Build/source/libs/icu/icu-src/source/common/locdispnames.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/locdispnames.cpp
@@ -22,6 +22,7 @@
#include "unicode/utypes.h"
#include "unicode/brkiter.h"
#include "unicode/locid.h"
+#include "unicode/uenum.h"
#include "unicode/uloc.h"
#include "unicode/ures.h"
#include "unicode/ustring.h"
@@ -306,14 +307,11 @@ _getStringOrCopyKey(const char *path, const char *locale,
if(itemKey==NULL) {
/* top-level item: normal resource bundle access */
- UResourceBundle *rb;
-
- rb=ures_open(path, locale, pErrorCode);
+ icu::LocalUResourceBundlePointer rb(ures_open(path, locale, pErrorCode));
if(U_SUCCESS(*pErrorCode)) {
- s=ures_getStringByKey(rb, tableKey, &length, pErrorCode);
+ s=ures_getStringByKey(rb.getAlias(), tableKey, &length, pErrorCode);
/* see comment about closing rb near "return item;" in _res_getTableStringWithFallback() */
- ures_close(rb);
}
} else {
/* Language code should not be a number. If it is, set the error code. */
@@ -376,7 +374,12 @@ _getDisplayNameForComponent(const char *locale,
return 0;
}
if(length==0) {
- return u_terminateUChars(dest, destCapacity, 0, pErrorCode);
+ // For the display name, we treat this as unknown language (ICU-20273).
+ if (getter == uloc_getLanguage) {
+ uprv_strcpy(localeBuffer, "und");
+ } else {
+ return u_terminateUChars(dest, destCapacity, 0, pErrorCode);
+ }
}
root = tag == _kCountries ? U_ICUDATA_REGION : U_ICUDATA_LANG;
@@ -510,15 +513,14 @@ uloc_getDisplayName(const char *locale,
{
UErrorCode status = U_ZERO_ERROR;
- UResourceBundle* locbundle=ures_open(U_ICUDATA_LANG, displayLocale, &status);
- UResourceBundle* dspbundle=ures_getByKeyWithFallback(locbundle, _kLocaleDisplayPattern,
- NULL, &status);
- separator=ures_getStringByKeyWithFallback(dspbundle, _kSeparator, &sepLen, &status);
- pattern=ures_getStringByKeyWithFallback(dspbundle, _kPattern, &patLen, &status);
+ icu::LocalUResourceBundlePointer locbundle(
+ ures_open(U_ICUDATA_LANG, displayLocale, &status));
+ icu::LocalUResourceBundlePointer dspbundle(
+ ures_getByKeyWithFallback(locbundle.getAlias(), _kLocaleDisplayPattern, NULL, &status));
- ures_close(dspbundle);
- ures_close(locbundle);
+ separator=ures_getStringByKeyWithFallback(dspbundle.getAlias(), _kSeparator, &sepLen, &status);
+ pattern=ures_getStringByKeyWithFallback(dspbundle.getAlias(), _kPattern, &patLen, &status);
}
/* If we couldn't find any data, then use the defaults */
@@ -586,7 +588,7 @@ uloc_getDisplayName(const char *locale,
int32_t langPos=0; /* position in output of language substitution */
int32_t restLen=0; /* length of 'everything else' substitution */
int32_t restPos=0; /* position in output of 'everything else' substitution */
- UEnumeration* kenum = NULL; /* keyword enumeration */
+ icu::LocalUEnumerationPointer kenum; /* keyword enumeration */
/* prefix of pattern, extremely likely to be empty */
if(sub0Pos) {
@@ -639,12 +641,11 @@ uloc_getDisplayName(const char *locale,
len=uloc_getDisplayVariant(locale, displayLocale, p, cap, pErrorCode);
break;
case 3:
- kenum = uloc_openKeywords(locale, pErrorCode);
+ kenum.adoptInstead(uloc_openKeywords(locale, pErrorCode));
U_FALLTHROUGH;
default: {
- const char* kw=uenum_next(kenum, &len, pErrorCode);
+ const char* kw=uenum_next(kenum.getAlias(), &len, pErrorCode);
if (kw == NULL) {
- uenum_close(kenum);
len=0; /* mark that we didn't add a component */
subdone=TRUE;
} else {
@@ -832,18 +833,16 @@ uloc_getDisplayKeywordValue( const char* locale,
int32_t dispNameLen = 0;
const UChar *dispName = NULL;
-
- UResourceBundle *bundle = ures_open(U_ICUDATA_CURR, displayLocale, status);
- UResourceBundle *currencies = ures_getByKey(bundle, _kCurrencies, NULL, status);
- UResourceBundle *currency = ures_getByKeyWithFallback(currencies, keywordValue, NULL, status);
-
- dispName = ures_getStringByIndex(currency, UCURRENCY_DISPLAY_NAME_INDEX, &dispNameLen, status);
-
- /*close the bundles */
- ures_close(currency);
- ures_close(currencies);
- ures_close(bundle);
-
+
+ icu::LocalUResourceBundlePointer bundle(
+ ures_open(U_ICUDATA_CURR, displayLocale, status));
+ icu::LocalUResourceBundlePointer currencies(
+ ures_getByKey(bundle.getAlias(), _kCurrencies, NULL, status));
+ icu::LocalUResourceBundlePointer currency(
+ ures_getByKeyWithFallback(currencies.getAlias(), keywordValue, NULL, status));
+
+ dispName = ures_getStringByIndex(currency.getAlias(), UCURRENCY_DISPLAY_NAME_INDEX, &dispNameLen, status);
+
if(U_FAILURE(*status)){
if(*status == U_MISSING_RESOURCE_ERROR){
/* we just want to write the value over if nothing is available */
diff --git a/Build/source/libs/icu/icu-src/source/common/locdistance.cpp b/Build/source/libs/icu/icu-src/source/common/locdistance.cpp
new file mode 100644
index 00000000000..800d0eacf2b
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/common/locdistance.cpp
@@ -0,0 +1,364 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+
+// locdistance.cpp
+// created: 2019may08 Markus W. Scherer
+
+#include "unicode/utypes.h"
+#include "unicode/bytestrie.h"
+#include "unicode/localematcher.h"
+#include "unicode/locid.h"
+#include "unicode/uobject.h"
+#include "unicode/ures.h"
+#include "cstring.h"
+#include "locdistance.h"
+#include "loclikelysubtags.h"
+#include "uassert.h"
+#include "ucln_cmn.h"
+#include "uinvchar.h"
+#include "umutex.h"
+
+U_NAMESPACE_BEGIN
+
+namespace {
+
+/**
+ * Bit flag used on the last character of a subtag in the trie.
+ * Must be set consistently by the builder and the lookup code.
+ */
+constexpr int32_t END_OF_SUBTAG = 0x80;
+/** Distance value bit flag, set by the builder. */
+constexpr int32_t DISTANCE_SKIP_SCRIPT = 0x80;
+/** Distance value bit flag, set by trieNext(). */
+constexpr int32_t DISTANCE_IS_FINAL = 0x100;
+constexpr int32_t DISTANCE_IS_FINAL_OR_SKIP_SCRIPT = DISTANCE_IS_FINAL | DISTANCE_SKIP_SCRIPT;
+
+constexpr int32_t ABOVE_THRESHOLD = 100;
+
+// Indexes into array of distances.
+enum {
+ IX_DEF_LANG_DISTANCE,
+ IX_DEF_SCRIPT_DISTANCE,
+ IX_DEF_REGION_DISTANCE,
+ IX_MIN_REGION_DISTANCE,
+ IX_LIMIT
+};
+
+LocaleDistance *gLocaleDistance = nullptr;
+UInitOnce gInitOnce = U_INITONCE_INITIALIZER;
+
+UBool U_CALLCONV cleanup() {
+ delete gLocaleDistance;
+ gLocaleDistance = nullptr;
+ gInitOnce.reset();
+ return TRUE;
+}
+
+} // namespace
+
+void U_CALLCONV LocaleDistance::initLocaleDistance(UErrorCode &errorCode) {
+ // This function is invoked only via umtx_initOnce().
+ U_ASSERT(gLocaleDistance == nullptr);
+ const XLikelySubtags &likely = *XLikelySubtags::getSingleton(errorCode);
+ if (U_FAILURE(errorCode)) { return; }
+ const LocaleDistanceData &data = likely.getDistanceData();
+ if (data.distanceTrieBytes == nullptr ||
+ data.regionToPartitions == nullptr || data.partitions == nullptr ||
+ // ok if no paradigms
+ data.distances == nullptr) {
+ errorCode = U_MISSING_RESOURCE_ERROR;
+ return;
+ }
+ gLocaleDistance = new LocaleDistance(data);
+ if (gLocaleDistance == nullptr) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ ucln_common_registerCleanup(UCLN_COMMON_LOCALE_DISTANCE, cleanup);
+}
+
+const LocaleDistance *LocaleDistance::getSingleton(UErrorCode &errorCode) {
+ if (U_FAILURE(errorCode)) { return nullptr; }
+ umtx_initOnce(gInitOnce, &LocaleDistance::initLocaleDistance, errorCode);
+ return gLocaleDistance;
+}
+
+LocaleDistance::LocaleDistance(const LocaleDistanceData &data) :
+ trie(data.distanceTrieBytes),
+ regionToPartitionsIndex(data.regionToPartitions), partitionArrays(data.partitions),
+ paradigmLSRs(data.paradigms), paradigmLSRsLength(data.paradigmsLength),
+ defaultLanguageDistance(data.distances[IX_DEF_LANG_DISTANCE]),
+ defaultScriptDistance(data.distances[IX_DEF_SCRIPT_DISTANCE]),
+ defaultRegionDistance(data.distances[IX_DEF_REGION_DISTANCE]),
+ minRegionDistance(data.distances[IX_MIN_REGION_DISTANCE]) {
+ // For the default demotion value, use the
+ // default region distance between unrelated Englishes.
+ // Thus, unless demotion is turned off,
+ // a mere region difference for one desired locale
+ // is as good as a perfect match for the next following desired locale.
+ // As of CLDR 36, we have <languageMatch desired="en_*_*" supported="en_*_*" distance="5"/>.
+ LSR en("en", "Latn", "US");
+ LSR enGB("en", "Latn", "GB");
+ const LSR *p_enGB = &enGB;
+ defaultDemotionPerDesiredLocale = getBestIndexAndDistance(en, &p_enGB, 1,
+ 50, ULOCMATCH_FAVOR_LANGUAGE) & 0xff;
+}
+
+int32_t LocaleDistance::getBestIndexAndDistance(
+ const LSR &desired,
+ const LSR **supportedLSRs, int32_t supportedLSRsLength,
+ int32_t threshold, ULocMatchFavorSubtag favorSubtag) const {
+ BytesTrie iter(trie);
+ // Look up the desired language only once for all supported LSRs.
+ // Its "distance" is either a match point value of 0, or a non-match negative value.
+ // Note: The data builder verifies that there are no <*, supported> or <desired, *> rules.
+ int32_t desLangDistance = trieNext(iter, desired.language, false);
+ uint64_t desLangState = desLangDistance >= 0 && supportedLSRsLength > 1 ? iter.getState64() : 0;
+ // Index of the supported LSR with the lowest distance.
+ int32_t bestIndex = -1;
+ for (int32_t slIndex = 0; slIndex < supportedLSRsLength; ++slIndex) {
+ const LSR &supported = *supportedLSRs[slIndex];
+ bool star = false;
+ int32_t distance = desLangDistance;
+ if (distance >= 0) {
+ U_ASSERT((distance & DISTANCE_IS_FINAL) == 0);
+ if (slIndex != 0) {
+ iter.resetToState64(desLangState);
+ }
+ distance = trieNext(iter, supported.language, true);
+ }
+ // Note: The data builder verifies that there are no rules with "any" (*) language and
+ // real (non *) script or region subtags.
+ // This means that if the lookup for either language fails we can use
+ // the default distances without further lookups.
+ int32_t flags;
+ if (distance >= 0) {
+ flags = distance & DISTANCE_IS_FINAL_OR_SKIP_SCRIPT;
+ distance &= ~DISTANCE_IS_FINAL_OR_SKIP_SCRIPT;
+ } else { // <*, *>
+ if (uprv_strcmp(desired.language, supported.language) == 0) {
+ distance = 0;
+ } else {
+ distance = defaultLanguageDistance;
+ }
+ flags = 0;
+ star = true;
+ }
+ U_ASSERT(0 <= distance && distance <= 100);
+ // We implement "favor subtag" by reducing the language subtag distance
+ // (unscientifically reducing it to a quarter of the normal value),
+ // so that the script distance is relatively more important.
+ // For example, given a default language distance of 80, we reduce it to 20,
+ // which is below the default threshold of 50, which is the default script distance.
+ if (favorSubtag == ULOCMATCH_FAVOR_SCRIPT) {
+ distance >>= 2;
+ }
+ if (distance >= threshold) {
+ continue;
+ }
+
+ int32_t scriptDistance;
+ if (star || flags != 0) {
+ if (uprv_strcmp(desired.script, supported.script) == 0) {
+ scriptDistance = 0;
+ } else {
+ scriptDistance = defaultScriptDistance;
+ }
+ } else {
+ scriptDistance = getDesSuppScriptDistance(iter, iter.getState64(),
+ desired.script, supported.script);
+ flags = scriptDistance & DISTANCE_IS_FINAL;
+ scriptDistance &= ~DISTANCE_IS_FINAL;
+ }
+ distance += scriptDistance;
+ if (distance >= threshold) {
+ continue;
+ }
+
+ if (uprv_strcmp(desired.region, supported.region) == 0) {
+ // regionDistance = 0
+ } else if (star || (flags & DISTANCE_IS_FINAL) != 0) {
+ distance += defaultRegionDistance;
+ } else {
+ int32_t remainingThreshold = threshold - distance;
+ if (minRegionDistance >= remainingThreshold) {
+ continue;
+ }
+
+ // From here on we know the regions are not equal.
+ // Map each region to zero or more partitions. (zero = one non-matching string)
+ // (Each array of single-character partition strings is encoded as one string.)
+ // If either side has more than one, then we find the maximum distance.
+ // This could be optimized by adding some more structure, but probably not worth it.
+ distance += getRegionPartitionsDistance(
+ iter, iter.getState64(),
+ partitionsForRegion(desired),
+ partitionsForRegion(supported),
+ remainingThreshold);
+ }
+ if (distance < threshold) {
+ if (distance == 0) {
+ return slIndex << 8;
+ }
+ bestIndex = slIndex;
+ threshold = distance;
+ }
+ }
+ return bestIndex >= 0 ? (bestIndex << 8) | threshold : 0xffffff00 | ABOVE_THRESHOLD;
+}
+
+int32_t LocaleDistance::getDesSuppScriptDistance(
+ BytesTrie &iter, uint64_t startState, const char *desired, const char *supported) {
+ // Note: The data builder verifies that there are no <*, supported> or <desired, *> rules.
+ int32_t distance = trieNext(iter, desired, false);
+ if (distance >= 0) {
+ distance = trieNext(iter, supported, true);
+ }
+ if (distance < 0) {
+ UStringTrieResult result = iter.resetToState64(startState).next(u'*'); // <*, *>
+ U_ASSERT(USTRINGTRIE_HAS_VALUE(result));
+ if (uprv_strcmp(desired, supported) == 0) {
+ distance = 0; // same script
+ } else {
+ distance = iter.getValue();
+ U_ASSERT(distance >= 0);
+ }
+ if (result == USTRINGTRIE_FINAL_VALUE) {
+ distance |= DISTANCE_IS_FINAL;
+ }
+ }
+ return distance;
+}
+
+int32_t LocaleDistance::getRegionPartitionsDistance(
+ BytesTrie &iter, uint64_t startState,
+ const char *desiredPartitions, const char *supportedPartitions, int32_t threshold) {
+ char desired = *desiredPartitions++;
+ char supported = *supportedPartitions++;
+ U_ASSERT(desired != 0 && supported != 0);
+ // See if we have single desired/supported partitions, from NUL-terminated
+ // partition strings without explicit length.
+ bool suppLengthGt1 = *supportedPartitions != 0; // gt1: more than 1 character
+ // equivalent to: if (desLength == 1 && suppLength == 1)
+ if (*desiredPartitions == 0 && !suppLengthGt1) {
+ // Fastpath for single desired/supported partitions.
+ UStringTrieResult result = iter.next(uprv_invCharToAscii(desired) | END_OF_SUBTAG);
+ if (USTRINGTRIE_HAS_NEXT(result)) {
+ result = iter.next(uprv_invCharToAscii(supported) | END_OF_SUBTAG);
+ if (USTRINGTRIE_HAS_VALUE(result)) {
+ return iter.getValue();
+ }
+ }
+ return getFallbackRegionDistance(iter, startState);
+ }
+
+ const char *supportedStart = supportedPartitions - 1; // for restart of inner loop
+ int32_t regionDistance = 0;
+ // Fall back to * only once, not for each pair of partition strings.
+ bool star = false;
+ for (;;) {
+ // Look up each desired-partition string only once,
+ // not for each (desired, supported) pair.
+ UStringTrieResult result = iter.next(uprv_invCharToAscii(desired) | END_OF_SUBTAG);
+ if (USTRINGTRIE_HAS_NEXT(result)) {
+ uint64_t desState = suppLengthGt1 ? iter.getState64() : 0;
+ for (;;) {
+ result = iter.next(uprv_invCharToAscii(supported) | END_OF_SUBTAG);
+ int32_t d;
+ if (USTRINGTRIE_HAS_VALUE(result)) {
+ d = iter.getValue();
+ } else if (star) {
+ d = 0;
+ } else {
+ d = getFallbackRegionDistance(iter, startState);
+ star = true;
+ }
+ if (d >= threshold) {
+ return d;
+ } else if (regionDistance < d) {
+ regionDistance = d;
+ }
+ if ((supported = *supportedPartitions++) != 0) {
+ iter.resetToState64(desState);
+ } else {
+ break;
+ }
+ }
+ } else if (!star) {
+ int32_t d = getFallbackRegionDistance(iter, startState);
+ if (d >= threshold) {
+ return d;
+ } else if (regionDistance < d) {
+ regionDistance = d;
+ }
+ star = true;
+ }
+ if ((desired = *desiredPartitions++) != 0) {
+ iter.resetToState64(startState);
+ supportedPartitions = supportedStart;
+ supported = *supportedPartitions++;
+ } else {
+ break;
+ }
+ }
+ return regionDistance;
+}
+
+int32_t LocaleDistance::getFallbackRegionDistance(BytesTrie &iter, uint64_t startState) {
+#if U_DEBUG
+ UStringTrieResult result =
+#endif
+ iter.resetToState64(startState).next(u'*'); // <*, *>
+ U_ASSERT(USTRINGTRIE_HAS_VALUE(result));
+ int32_t distance = iter.getValue();
+ U_ASSERT(distance >= 0);
+ return distance;
+}
+
+int32_t LocaleDistance::trieNext(BytesTrie &iter, const char *s, bool wantValue) {
+ uint8_t c;
+ if ((c = *s) == 0) {
+ return -1; // no empty subtags in the distance data
+ }
+ for (;;) {
+ c = uprv_invCharToAscii(c);
+ // EBCDIC: If *s is not an invariant character,
+ // then c is now 0 and will simply not match anything, which is harmless.
+ uint8_t next = *++s;
+ if (next != 0) {
+ if (!USTRINGTRIE_HAS_NEXT(iter.next(c))) {
+ return -1;
+ }
+ } else {
+ // last character of this subtag
+ UStringTrieResult result = iter.next(c | END_OF_SUBTAG);
+ if (wantValue) {
+ if (USTRINGTRIE_HAS_VALUE(result)) {
+ int32_t value = iter.getValue();
+ if (result == USTRINGTRIE_FINAL_VALUE) {
+ value |= DISTANCE_IS_FINAL;
+ }
+ return value;
+ }
+ } else {
+ if (USTRINGTRIE_HAS_NEXT(result)) {
+ return 0;
+ }
+ }
+ return -1;
+ }
+ c = next;
+ }
+}
+
+UBool LocaleDistance::isParadigmLSR(const LSR &lsr) const {
+ // Linear search for a very short list (length 6 as of 2019).
+ // If there are many paradigm LSRs we should use a hash set.
+ U_ASSERT(paradigmLSRsLength <= 15);
+ for (int32_t i = 0; i < paradigmLSRsLength; ++i) {
+ if (lsr == paradigmLSRs[i]) { return true; }
+ }
+ return false;
+}
+
+U_NAMESPACE_END
diff --git a/Build/source/libs/icu/icu-src/source/common/locdistance.h b/Build/source/libs/icu/icu-src/source/common/locdistance.h
new file mode 100644
index 00000000000..7439f51c56b
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/common/locdistance.h
@@ -0,0 +1,109 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+
+// locdistance.h
+// created: 2019may08 Markus W. Scherer
+
+#ifndef __LOCDISTANCE_H__
+#define __LOCDISTANCE_H__
+
+#include "unicode/utypes.h"
+#include "unicode/bytestrie.h"
+#include "unicode/localematcher.h"
+#include "unicode/locid.h"
+#include "unicode/uobject.h"
+#include "lsr.h"
+
+U_NAMESPACE_BEGIN
+
+struct LocaleDistanceData;
+
+/**
+ * Offline-built data for LocaleMatcher.
+ * Mostly but not only the data for mapping locales to their maximized forms.
+ */
+class LocaleDistance final : public UMemory {
+public:
+ static const LocaleDistance *getSingleton(UErrorCode &errorCode);
+
+ /**
+ * Finds the supported LSR with the smallest distance from the desired one.
+ * Equivalent LSR subtags must be normalized into a canonical form.
+ *
+ * <p>Returns the index of the lowest-distance supported LSR in bits 31..8
+ * (negative if none has a distance below the threshold),
+ * and its distance (0..ABOVE_THRESHOLD) in bits 7..0.
+ */
+ int32_t getBestIndexAndDistance(const LSR &desired,
+ const LSR **supportedLSRs, int32_t supportedLSRsLength,
+ int32_t threshold, ULocMatchFavorSubtag favorSubtag) const;
+
+ int32_t getParadigmLSRsLength() const { return paradigmLSRsLength; }
+
+ UBool isParadigmLSR(const LSR &lsr) const;
+
+ int32_t getDefaultScriptDistance() const {
+ return defaultScriptDistance;
+ }
+
+ int32_t getDefaultDemotionPerDesiredLocale() const {
+ return defaultDemotionPerDesiredLocale;
+ }
+
+private:
+ LocaleDistance(const LocaleDistanceData &data);
+ LocaleDistance(const LocaleDistance &other) = delete;
+ LocaleDistance &operator=(const LocaleDistance &other) = delete;
+
+ static void initLocaleDistance(UErrorCode &errorCode);
+
+ static int32_t getDesSuppScriptDistance(BytesTrie &iter, uint64_t startState,
+ const char *desired, const char *supported);
+
+ static int32_t getRegionPartitionsDistance(
+ BytesTrie &iter, uint64_t startState,
+ const char *desiredPartitions, const char *supportedPartitions,
+ int32_t threshold);
+
+ static int32_t getFallbackRegionDistance(BytesTrie &iter, uint64_t startState);
+
+ static int32_t trieNext(BytesTrie &iter, const char *s, bool wantValue);
+
+ const char *partitionsForRegion(const LSR &lsr) const {
+ // ill-formed region -> one non-matching string
+ int32_t pIndex = regionToPartitionsIndex[lsr.regionIndex];
+ return partitionArrays[pIndex];
+ }
+
+ int32_t getDefaultRegionDistance() const {
+ return defaultRegionDistance;
+ }
+
+ // The trie maps each dlang+slang+dscript+sscript+dregion+sregion
+ // (encoded in ASCII with bit 7 set on the last character of each subtag) to a distance.
+ // There is also a trie value for each subsequence of whole subtags.
+ // One '*' is used for a (desired, supported) pair of "und", "Zzzz"/"", or "ZZ"/"".
+ BytesTrie trie;
+
+ /**
+ * Maps each region to zero or more single-character partitions.
+ */
+ const uint8_t *regionToPartitionsIndex;
+ const char **partitionArrays;
+
+ /**
+ * Used to get the paradigm region for a cluster, if there is one.
+ */
+ const LSR *paradigmLSRs;
+ int32_t paradigmLSRsLength;
+
+ int32_t defaultLanguageDistance;
+ int32_t defaultScriptDistance;
+ int32_t defaultRegionDistance;
+ int32_t minRegionDistance;
+ int32_t defaultDemotionPerDesiredLocale;
+};
+
+U_NAMESPACE_END
+
+#endif // __LOCDISTANCE_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/locdspnm.cpp b/Build/source/libs/icu/icu-src/source/common/locdspnm.cpp
index 2d9389e910a..43334f51964 100644
--- a/Build/source/libs/icu/icu-src/source/common/locdspnm.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/locdspnm.cpp
@@ -286,12 +286,12 @@ class LocaleDisplayNamesImpl : public LocaleDisplayNames {
#else
UObject* capitalizationBrkIter;
#endif
- static UMutex capitalizationBrkIterLock;
UnicodeString formatOpenParen;
UnicodeString formatReplaceOpenParen;
UnicodeString formatCloseParen;
UnicodeString formatReplaceCloseParen;
UDisplayContext nameLength;
+ UDisplayContext substitute;
// Constants for capitalization context usage types.
enum CapContextUsage {
@@ -338,7 +338,7 @@ public:
UnicodeString& result) const;
private:
UnicodeString& localeIdName(const char* localeId,
- UnicodeString& result) const;
+ UnicodeString& result, bool substitute) const;
UnicodeString& appendWithSep(UnicodeString& buffer, const UnicodeString& src) const;
UnicodeString& adjustForUsageAndContext(CapContextUsage usage, UnicodeString& result) const;
UnicodeString& scriptDisplayName(const char* script, UnicodeString& result, UBool skipAdjust) const;
@@ -352,8 +352,6 @@ private:
struct CapitalizationContextSink;
};
-UMutex LocaleDisplayNamesImpl::capitalizationBrkIterLock = U_MUTEX_INITIALIZER;
-
LocaleDisplayNamesImpl::LocaleDisplayNamesImpl(const Locale& locale,
UDialectHandling dialectHandling)
: dialectHandling(dialectHandling)
@@ -362,6 +360,7 @@ LocaleDisplayNamesImpl::LocaleDisplayNamesImpl(const Locale& locale,
, capitalizationContext(UDISPCTX_CAPITALIZATION_NONE)
, capitalizationBrkIter(NULL)
, nameLength(UDISPCTX_LENGTH_FULL)
+ , substitute(UDISPCTX_SUBSTITUTE)
{
initialize();
}
@@ -374,6 +373,7 @@ LocaleDisplayNamesImpl::LocaleDisplayNamesImpl(const Locale& locale,
, capitalizationContext(UDISPCTX_CAPITALIZATION_NONE)
, capitalizationBrkIter(NULL)
, nameLength(UDISPCTX_LENGTH_FULL)
+ , substitute(UDISPCTX_SUBSTITUTE)
{
while (length-- > 0) {
UDisplayContext value = *contexts++;
@@ -388,6 +388,9 @@ LocaleDisplayNamesImpl::LocaleDisplayNamesImpl(const Locale& locale,
case UDISPCTX_TYPE_DISPLAY_LENGTH:
nameLength = value;
break;
+ case UDISPCTX_TYPE_SUBSTITUTE_HANDLING:
+ substitute = value;
+ break;
default:
break;
}
@@ -538,6 +541,8 @@ LocaleDisplayNamesImpl::getContext(UDisplayContextType type) const {
return capitalizationContext;
case UDISPCTX_TYPE_DISPLAY_LENGTH:
return nameLength;
+ case UDISPCTX_TYPE_SUBSTITUTE_HANDLING:
+ return substitute;
default:
break;
}
@@ -552,6 +557,7 @@ LocaleDisplayNamesImpl::adjustForUsageAndContext(CapContextUsage usage,
if ( result.length() > 0 && u_islower(result.char32At(0)) && capitalizationBrkIter!= NULL &&
( capitalizationContext==UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE || fCapitalization[usage] ) ) {
// note fCapitalization[usage] won't be set unless capitalizationContext is UI_LIST_OR_MENU or STANDALONE
+ static UMutex capitalizationBrkIterLock;
Mutex lock(&capitalizationBrkIterLock);
result.toTitle(capitalizationBrkIter, locale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT);
}
@@ -585,7 +591,7 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& loc,
do { // loop construct is so we can break early out of search
if (hasScript && hasCountry) {
ncat(buffer, ULOC_FULLNAME_CAPACITY, lang, "_", script, "_", country, (char *)0);
- localeIdName(buffer, resultName);
+ localeIdName(buffer, resultName, false);
if (!resultName.isBogus()) {
hasScript = FALSE;
hasCountry = FALSE;
@@ -594,7 +600,7 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& loc,
}
if (hasScript) {
ncat(buffer, ULOC_FULLNAME_CAPACITY, lang, "_", script, (char *)0);
- localeIdName(buffer, resultName);
+ localeIdName(buffer, resultName, false);
if (!resultName.isBogus()) {
hasScript = FALSE;
break;
@@ -602,7 +608,7 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& loc,
}
if (hasCountry) {
ncat(buffer, ULOC_FULLNAME_CAPACITY, lang, "_", country, (char*)0);
- localeIdName(buffer, resultName);
+ localeIdName(buffer, resultName, false);
if (!resultName.isBogus()) {
hasCountry = FALSE;
break;
@@ -611,7 +617,11 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& loc,
} while (FALSE);
}
if (resultName.isBogus() || resultName.isEmpty()) {
- localeIdName(lang, resultName);
+ localeIdName(lang, resultName, substitute == UDISPCTX_SUBSTITUTE);
+ if (resultName.isBogus()) {
+ result.setToBogus();
+ return result;
+ }
}
UnicodeString resultRemainder;
@@ -619,13 +629,28 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& loc,
UErrorCode status = U_ZERO_ERROR;
if (hasScript) {
- resultRemainder.append(scriptDisplayName(script, temp, TRUE));
+ UnicodeString script_str = scriptDisplayName(script, temp, TRUE);
+ if (script_str.isBogus()) {
+ result.setToBogus();
+ return result;
+ }
+ resultRemainder.append(script_str);
}
if (hasCountry) {
- appendWithSep(resultRemainder, regionDisplayName(country, temp, TRUE));
+ UnicodeString region_str = regionDisplayName(country, temp, TRUE);
+ if (region_str.isBogus()) {
+ result.setToBogus();
+ return result;
+ }
+ appendWithSep(resultRemainder, region_str);
}
if (hasVariant) {
- appendWithSep(resultRemainder, variantDisplayName(variant, temp, TRUE));
+ UnicodeString variant_str = variantDisplayName(variant, temp, TRUE);
+ if (variant_str.isBogus()) {
+ result.setToBogus();
+ return result;
+ }
+ appendWithSep(resultRemainder, variant_str);
}
resultRemainder.findAndReplace(formatOpenParen, formatReplaceOpenParen);
resultRemainder.findAndReplace(formatCloseParen, formatReplaceCloseParen);
@@ -691,14 +716,18 @@ LocaleDisplayNamesImpl::localeDisplayName(const char* localeId,
// private
UnicodeString&
LocaleDisplayNamesImpl::localeIdName(const char* localeId,
- UnicodeString& result) const {
+ UnicodeString& result, bool substitute) const {
if (nameLength == UDISPCTX_LENGTH_SHORT) {
langData.getNoFallback("Languages%short", localeId, result);
if (!result.isBogus()) {
return result;
}
}
- return langData.getNoFallback("Languages", localeId, result);
+ if (substitute) {
+ return langData.get("Languages", localeId, result);
+ } else {
+ return langData.getNoFallback("Languages", localeId, result);
+ }
}
UnicodeString&
@@ -708,12 +737,16 @@ LocaleDisplayNamesImpl::languageDisplayName(const char* lang,
return result = UnicodeString(lang, -1, US_INV);
}
if (nameLength == UDISPCTX_LENGTH_SHORT) {
- langData.get("Languages%short", lang, result);
+ langData.getNoFallback("Languages%short", lang, result);
if (!result.isBogus()) {
return adjustForUsageAndContext(kCapContextUsageLanguage, result);
}
}
- langData.get("Languages", lang, result);
+ if (substitute == UDISPCTX_SUBSTITUTE) {
+ langData.get("Languages", lang, result);
+ } else {
+ langData.getNoFallback("Languages", lang, result);
+ }
return adjustForUsageAndContext(kCapContextUsageLanguage, result);
}
@@ -722,12 +755,16 @@ LocaleDisplayNamesImpl::scriptDisplayName(const char* script,
UnicodeString& result,
UBool skipAdjust) const {
if (nameLength == UDISPCTX_LENGTH_SHORT) {
- langData.get("Scripts%short", script, result);
+ langData.getNoFallback("Scripts%short", script, result);
if (!result.isBogus()) {
return skipAdjust? result: adjustForUsageAndContext(kCapContextUsageScript, result);
}
}
- langData.get("Scripts", script, result);
+ if (substitute == UDISPCTX_SUBSTITUTE) {
+ langData.get("Scripts", script, result);
+ } else {
+ langData.getNoFallback("Scripts", script, result);
+ }
return skipAdjust? result: adjustForUsageAndContext(kCapContextUsageScript, result);
}
@@ -748,12 +785,16 @@ LocaleDisplayNamesImpl::regionDisplayName(const char* region,
UnicodeString& result,
UBool skipAdjust) const {
if (nameLength == UDISPCTX_LENGTH_SHORT) {
- regionData.get("Countries%short", region, result);
+ regionData.getNoFallback("Countries%short", region, result);
if (!result.isBogus()) {
return skipAdjust? result: adjustForUsageAndContext(kCapContextUsageTerritory, result);
}
}
- regionData.get("Countries", region, result);
+ if (substitute == UDISPCTX_SUBSTITUTE) {
+ regionData.get("Countries", region, result);
+ } else {
+ regionData.getNoFallback("Countries", region, result);
+ }
return skipAdjust? result: adjustForUsageAndContext(kCapContextUsageTerritory, result);
}
@@ -769,7 +810,11 @@ LocaleDisplayNamesImpl::variantDisplayName(const char* variant,
UnicodeString& result,
UBool skipAdjust) const {
// don't have a resource for short variant names
- langData.get("Variants", variant, result);
+ if (substitute == UDISPCTX_SUBSTITUTE) {
+ langData.get("Variants", variant, result);
+ } else {
+ langData.getNoFallback("Variants", variant, result);
+ }
return skipAdjust? result: adjustForUsageAndContext(kCapContextUsageVariant, result);
}
@@ -784,7 +829,11 @@ LocaleDisplayNamesImpl::keyDisplayName(const char* key,
UnicodeString& result,
UBool skipAdjust) const {
// don't have a resource for short key names
- langData.get("Keys", key, result);
+ if (substitute == UDISPCTX_SUBSTITUTE) {
+ langData.get("Keys", key, result);
+ } else {
+ langData.getNoFallback("Keys", key, result);
+ }
return skipAdjust? result: adjustForUsageAndContext(kCapContextUsageKey, result);
}
@@ -804,9 +853,8 @@ LocaleDisplayNamesImpl::keyValueDisplayName(const char* key,
UErrorCode sts = U_ZERO_ERROR;
UnicodeString ustrValue(value, -1, US_INV);
int32_t len;
- UBool isChoice = FALSE;
const UChar *currencyName = ucurr_getName(ustrValue.getTerminatedBuffer(),
- locale.getBaseName(), UCURR_LONG_NAME, &isChoice, &len, &sts);
+ locale.getBaseName(), UCURR_LONG_NAME, nullptr /* isChoiceFormat */, &len, &sts);
if (U_FAILURE(sts)) {
// Return the value as is on failure
result = ustrValue;
@@ -817,12 +865,16 @@ LocaleDisplayNamesImpl::keyValueDisplayName(const char* key,
}
if (nameLength == UDISPCTX_LENGTH_SHORT) {
- langData.get("Types%short", key, value, result);
+ langData.getNoFallback("Types%short", key, value, result);
if (!result.isBogus()) {
return skipAdjust? result: adjustForUsageAndContext(kCapContextUsageKeyValue, result);
}
}
- langData.get("Types", key, value, result);
+ if (substitute == UDISPCTX_SUBSTITUTE) {
+ langData.get("Types", key, value, result);
+ } else {
+ langData.getNoFallback("Types", key, value, result);
+ }
return skipAdjust? result: adjustForUsageAndContext(kCapContextUsageKeyValue, result);
}
diff --git a/Build/source/libs/icu/icu-src/source/common/locid.cpp b/Build/source/libs/icu/icu-src/source/common/locid.cpp
index e0dcc8a88ec..c6d3f88fc3b 100644
--- a/Build/source/libs/icu/icu-src/source/common/locid.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/locid.cpp
@@ -38,19 +38,19 @@
#include "unicode/strenum.h"
#include "unicode/stringpiece.h"
#include "unicode/uloc.h"
-#include "putilimp.h"
-#include "mutex.h"
-#include "umutex.h"
-#include "uassert.h"
+
+#include "bytesinkutil.h"
+#include "charstr.h"
#include "cmemory.h"
#include "cstring.h"
+#include "mutex.h"
+#include "putilimp.h"
#include "uassert.h"
+#include "ucln_cmn.h"
#include "uhash.h"
#include "ulocimp.h"
-#include "ucln_cmn.h"
+#include "umutex.h"
#include "ustr_imp.h"
-#include "charstr.h"
-#include "bytesinkutil.h"
U_CDECL_BEGIN
static UBool U_CALLCONV locale_cleanup(void);
@@ -62,7 +62,7 @@ static Locale *gLocaleCache = NULL;
static UInitOnce gLocaleCacheInitOnce = U_INITONCE_INITIALIZER;
// gDefaultLocaleMutex protects all access to gDefaultLocalesHashT and gDefaultLocale.
-static UMutex gDefaultLocaleMutex = U_MUTEX_INITIALIZER;
+static UMutex gDefaultLocaleMutex;
static UHashtable *gDefaultLocalesHashT = NULL;
static Locale *gDefaultLocale = NULL;
@@ -569,9 +569,13 @@ Locale& Locale::init(const char* localeID, UBool canonicalize)
variantBegin = length;
/* after uloc_getName/canonicalize() we know that only '_' are separators */
+ /* But _ could also appeared in timezone such as "en@timezone=America/Los_Angeles" */
separator = field[0] = fullName;
fieldIdx = 1;
- while ((separator = uprv_strchr(field[fieldIdx-1], SEP_CHAR)) != 0 && fieldIdx < UPRV_LENGTHOF(field)-1) {
+ char* at = uprv_strchr(fullName, '@');
+ while ((separator = uprv_strchr(field[fieldIdx-1], SEP_CHAR)) != 0 &&
+ fieldIdx < UPRV_LENGTHOF(field)-1 &&
+ (at == nullptr || separator < at)) {
field[fieldIdx] = separator + 1;
fieldLen[fieldIdx-1] = (int32_t)(separator - field[fieldIdx-1]);
fieldIdx++;
@@ -736,46 +740,10 @@ Locale::addLikelySubtags(UErrorCode& status) {
return;
}
- // The maximized locale ID string is often longer, but there is no good
- // heuristic to estimate just how much longer. Leave that to CharString.
CharString maximizedLocaleID;
- int32_t maximizedLocaleIDCapacity = static_cast<int32_t>(uprv_strlen(fullName));
-
- char* buffer;
- int32_t reslen;
-
- for (;;) {
- buffer = maximizedLocaleID.getAppendBuffer(
- /*minCapacity=*/maximizedLocaleIDCapacity,
- /*desiredCapacityHint=*/maximizedLocaleIDCapacity,
- maximizedLocaleIDCapacity,
- status);
-
- if (U_FAILURE(status)) {
- return;
- }
-
- reslen = uloc_addLikelySubtags(
- fullName,
- buffer,
- maximizedLocaleIDCapacity,
- &status);
-
- if (status != U_BUFFER_OVERFLOW_ERROR) {
- break;
- }
-
- maximizedLocaleIDCapacity = reslen;
- status = U_ZERO_ERROR;
- }
-
- if (U_FAILURE(status)) {
- return;
- }
-
- maximizedLocaleID.append(buffer, reslen, status);
- if (status == U_STRING_NOT_TERMINATED_WARNING) {
- status = U_ZERO_ERROR; // Terminators provided by CharString.
+ {
+ CharStringByteSink sink(&maximizedLocaleID);
+ ulocimp_addLikelySubtags(fullName, sink, &status);
}
if (U_FAILURE(status)) {
@@ -794,50 +762,10 @@ Locale::minimizeSubtags(UErrorCode& status) {
return;
}
- // Except for a few edge cases (like the empty string, that is minimized to
- // "en__POSIX"), minimized locale ID strings will be either the same length
- // or shorter than their input.
CharString minimizedLocaleID;
- int32_t minimizedLocaleIDCapacity = static_cast<int32_t>(uprv_strlen(fullName));
-
- char* buffer;
- int32_t reslen;
-
- for (;;) {
- buffer = minimizedLocaleID.getAppendBuffer(
- /*minCapacity=*/minimizedLocaleIDCapacity,
- /*desiredCapacityHint=*/minimizedLocaleIDCapacity,
- minimizedLocaleIDCapacity,
- status);
-
- if (U_FAILURE(status)) {
- return;
- }
-
- reslen = uloc_minimizeSubtags(
- fullName,
- buffer,
- minimizedLocaleIDCapacity,
- &status);
-
- if (status != U_BUFFER_OVERFLOW_ERROR) {
- break;
- }
-
- // Because of the internal minimal buffer size of CharString, I can't
- // think of any input data for which this could possibly ever happen.
- // Maybe it would be better replaced with an assertion instead?
- minimizedLocaleIDCapacity = reslen;
- status = U_ZERO_ERROR;
- }
-
- if (U_FAILURE(status)) {
- return;
- }
-
- minimizedLocaleID.append(buffer, reslen, status);
- if (status == U_STRING_NOT_TERMINATED_WARNING) {
- status = U_ZERO_ERROR; // Terminators provided by CharString.
+ {
+ CharStringByteSink sink(&minimizedLocaleID);
+ ulocimp_minimizeSubtags(fullName, sink, &status);
}
if (U_FAILURE(status)) {
@@ -869,43 +797,16 @@ Locale::forLanguageTag(StringPiece tag, UErrorCode& status)
// parsing. Therefore the code here explicitly calls uloc_forLanguageTag()
// and then Locale::init(), instead of just calling the normal constructor.
- // All simple language tags will have the exact same length as ICU locale
- // ID strings as they have as BCP-47 strings (like "en_US" for "en-US").
CharString localeID;
- int32_t resultCapacity = tag.size();
-
- char* buffer;
- int32_t parsedLength, reslen;
-
- for (;;) {
- buffer = localeID.getAppendBuffer(
- /*minCapacity=*/resultCapacity,
- /*desiredCapacityHint=*/resultCapacity,
- resultCapacity,
- status);
-
- if (U_FAILURE(status)) {
- return result;
- }
-
- reslen = ulocimp_forLanguageTag(
+ int32_t parsedLength;
+ {
+ CharStringByteSink sink(&localeID);
+ ulocimp_forLanguageTag(
tag.data(),
tag.length(),
- buffer,
- resultCapacity,
+ sink,
&parsedLength,
&status);
-
- if (status != U_BUFFER_OVERFLOW_ERROR) {
- break;
- }
-
- // For all BCP-47 language tags that use extensions, the corresponding
- // ICU locale ID will be longer but uloc_forLanguageTag() does compute
- // the exact length needed so this memory reallocation will be done at
- // most once.
- resultCapacity = reslen;
- status = U_ZERO_ERROR;
}
if (U_FAILURE(status)) {
@@ -917,15 +818,6 @@ Locale::forLanguageTag(StringPiece tag, UErrorCode& status)
return result;
}
- localeID.append(buffer, reslen, status);
- if (status == U_STRING_NOT_TERMINATED_WARNING) {
- status = U_ZERO_ERROR; // Terminators provided by CharString.
- }
-
- if (U_FAILURE(status)) {
- return result;
- }
-
result.init(localeID.data(), /*canonicalize=*/FALSE);
if (result.isBogus()) {
status = U_ILLEGAL_ARGUMENT_ERROR;
@@ -945,59 +837,7 @@ Locale::toLanguageTag(ByteSink& sink, UErrorCode& status) const
return;
}
- // All simple language tags will have the exact same length as BCP-47
- // strings as they have as ICU locale IDs (like "en-US" for "en_US").
- LocalMemory<char> scratch;
- int32_t scratch_capacity = static_cast<int32_t>(uprv_strlen(fullName));
-
- if (scratch_capacity == 0) {
- scratch_capacity = 3; // "und"
- }
-
- char* buffer;
- int32_t result_capacity, reslen;
-
- for (;;) {
- if (scratch.allocateInsteadAndReset(scratch_capacity) == nullptr) {
- status = U_MEMORY_ALLOCATION_ERROR;
- return;
- }
-
- buffer = sink.GetAppendBuffer(
- /*min_capacity=*/scratch_capacity,
- /*desired_capacity_hint=*/scratch_capacity,
- scratch.getAlias(),
- scratch_capacity,
- &result_capacity);
-
- reslen = uloc_toLanguageTag(
- fullName,
- buffer,
- result_capacity,
- /*strict=*/FALSE,
- &status);
-
- if (status != U_BUFFER_OVERFLOW_ERROR) {
- break;
- }
-
- // For some very few edge cases a language tag will be longer as a
- // BCP-47 string than it is as an ICU locale ID. Most notoriously "C"
- // expands to the BCP-47 tag "en-US-u-va-posix", 16 times longer, and
- // it'll take several calls to uloc_toLanguageTag() to figure that out.
- // https://unicode-org.atlassian.net/browse/ICU-20132
- scratch_capacity = reslen;
- status = U_ZERO_ERROR;
- }
-
- if (U_FAILURE(status)) {
- return;
- }
-
- sink.Append(buffer, reslen);
- if (status == U_STRING_NOT_TERMINATED_WARNING) {
- status = U_ZERO_ERROR; // Terminators not used.
- }
+ ulocimp_toLanguageTag(fullName, sink, /*strict=*/FALSE, &status);
}
Locale U_EXPORT2
@@ -1536,12 +1376,16 @@ Locale::setUnicodeKeywordValue(StringPiece keywordName,
return;
}
- const char* legacy_value =
- uloc_toLegacyType(keywordName_nul.data(), keywordValue_nul.data());
+ const char* legacy_value = nullptr;
- if (legacy_value == nullptr) {
- status = U_ILLEGAL_ARGUMENT_ERROR;
- return;
+ if (!keywordValue_nul.isEmpty()) {
+ legacy_value =
+ uloc_toLegacyType(keywordName_nul.data(), keywordValue_nul.data());
+
+ if (legacy_value == nullptr) {
+ status = U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
}
setKeywordValue(legacy_key, legacy_value, status);
@@ -1552,5 +1396,7 @@ Locale::getBaseName() const {
return baseName;
}
+Locale::Iterator::~Iterator() = default;
+
//eof
U_NAMESPACE_END
diff --git a/Build/source/libs/icu/icu-src/source/common/loclikely.cpp b/Build/source/libs/icu/icu-src/source/common/loclikely.cpp
index 7dd07afca5a..a4a4181cb13 100644
--- a/Build/source/libs/icu/icu-src/source/common/loclikely.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/loclikely.cpp
@@ -19,6 +19,7 @@
* that then do not depend on resource bundle code and likely-subtags data.
*/
+#include "unicode/bytestream.h"
#include "unicode/utypes.h"
#include "unicode/locid.h"
#include "unicode/putil.h"
@@ -26,12 +27,21 @@
#include "unicode/uloc.h"
#include "unicode/ures.h"
#include "unicode/uscript.h"
+#include "bytesinkutil.h"
+#include "charstr.h"
#include "cmemory.h"
#include "cstring.h"
#include "ulocimp.h"
#include "ustr_imp.h"
/**
+ * These are the canonical strings for unknown languages, scripts and regions.
+ **/
+static const char* const unknownLanguage = "und";
+static const char* const unknownScript = "Zzzz";
+static const char* const unknownRegion = "ZZ";
+
+/**
* This function looks for the localeID in the likelySubtags resource.
*
* @param localeID The tag to find.
@@ -50,9 +60,22 @@ findLikelySubtags(const char* localeID,
int32_t resLen = 0;
const UChar* s = NULL;
UErrorCode tmpErr = U_ZERO_ERROR;
- UResourceBundle* subtags = ures_openDirect(NULL, "likelySubtags", &tmpErr);
+ icu::LocalUResourceBundlePointer subtags(ures_openDirect(NULL, "likelySubtags", &tmpErr));
if (U_SUCCESS(tmpErr)) {
- s = ures_getStringByKey(subtags, localeID, &resLen, &tmpErr);
+ icu::CharString und;
+ if (localeID != NULL) {
+ if (*localeID == '\0') {
+ localeID = unknownLanguage;
+ } else if (*localeID == '_') {
+ und.append(unknownLanguage, *err);
+ und.append(localeID, *err);
+ if (U_FAILURE(*err)) {
+ return NULL;
+ }
+ localeID = und.data();
+ }
+ }
+ s = ures_getStringByKey(subtags.getAlias(), localeID, &resLen, &tmpErr);
if (U_FAILURE(tmpErr)) {
/*
@@ -69,10 +92,13 @@ findLikelySubtags(const char* localeID,
}
else {
u_UCharsToChars(s, buffer, resLen + 1);
+ if (resLen >= 3 &&
+ uprv_strnicmp(buffer, unknownLanguage, 3) == 0 &&
+ (resLen == 3 || buffer[3] == '_')) {
+ uprv_memmove(buffer, buffer + 3, resLen - 3 + 1);
+ }
result = buffer;
}
-
- ures_close(subtags);
} else {
*err = tmpErr;
}
@@ -96,9 +122,10 @@ appendTag(
const char* tag,
int32_t tagLength,
char* buffer,
- int32_t* bufferLength) {
+ int32_t* bufferLength,
+ UBool withSeparator) {
- if (*bufferLength > 0) {
+ if (withSeparator) {
buffer[*bufferLength] = '_';
++(*bufferLength);
}
@@ -112,13 +139,6 @@ appendTag(
}
/**
- * These are the canonical strings for unknown languages, scripts and regions.
- **/
-static const char* const unknownLanguage = "und";
-static const char* const unknownScript = "Zzzz";
-static const char* const unknownRegion = "ZZ";
-
-/**
* Create a tag string from the supplied parameters. The lang, script and region
* parameters may be NULL pointers. If they are, their corresponding length parameters
* must be less than or equal to 0.
@@ -147,12 +167,10 @@ static const char* const unknownRegion = "ZZ";
* @param trailing Any trailing data to append to the new tag.
* @param trailingLength The length of the trailing data.
* @param alternateTags A string containing any alternate tags.
- * @param tag The output buffer.
- * @param tagCapacity The capacity of the output buffer.
+ * @param sink The output sink receiving the tag string.
* @param err A pointer to a UErrorCode for error reporting.
- * @return The length of the tag string, which may be greater than tagCapacity, or -1 on error.
**/
-static int32_t U_CALLCONV
+static void U_CALLCONV
createTagStringWithAlternates(
const char* lang,
int32_t langLength,
@@ -163,16 +181,13 @@ createTagStringWithAlternates(
const char* trailing,
int32_t trailingLength,
const char* alternateTags,
- char* tag,
- int32_t tagCapacity,
+ icu::ByteSink& sink,
UErrorCode* err) {
if (U_FAILURE(*err)) {
goto error;
}
- else if (tag == NULL ||
- tagCapacity <= 0 ||
- langLength >= ULOC_LANG_CAPACITY ||
+ else if (langLength >= ULOC_LANG_CAPACITY ||
scriptLength >= ULOC_SCRIPT_CAPACITY ||
regionLength >= ULOC_COUNTRY_CAPACITY) {
goto error;
@@ -186,7 +201,6 @@ createTagStringWithAlternates(
**/
char tagBuffer[ULOC_FULLNAME_CAPACITY];
int32_t tagLength = 0;
- int32_t capacityRemaining = tagCapacity;
UBool regionAppended = FALSE;
if (langLength > 0) {
@@ -194,18 +208,14 @@ createTagStringWithAlternates(
lang,
langLength,
tagBuffer,
- &tagLength);
+ &tagLength,
+ /*withSeparator=*/FALSE);
}
else if (alternateTags == NULL) {
/*
- * Append the value for an unknown language, if
+ * Use the empty string for an unknown language, if
* we found no language.
*/
- appendTag(
- unknownLanguage,
- (int32_t)uprv_strlen(unknownLanguage),
- tagBuffer,
- &tagLength);
}
else {
/*
@@ -226,21 +236,17 @@ createTagStringWithAlternates(
}
else if (alternateLangLength == 0) {
/*
- * Append the value for an unknown language, if
+ * Use the empty string for an unknown language, if
* we found no language.
*/
- appendTag(
- unknownLanguage,
- (int32_t)uprv_strlen(unknownLanguage),
- tagBuffer,
- &tagLength);
}
else {
appendTag(
alternateLang,
alternateLangLength,
tagBuffer,
- &tagLength);
+ &tagLength,
+ /*withSeparator=*/FALSE);
}
}
@@ -249,7 +255,8 @@ createTagStringWithAlternates(
script,
scriptLength,
tagBuffer,
- &tagLength);
+ &tagLength,
+ /*withSeparator=*/TRUE);
}
else if (alternateTags != NULL) {
/*
@@ -273,7 +280,8 @@ createTagStringWithAlternates(
alternateScript,
alternateScriptLength,
tagBuffer,
- &tagLength);
+ &tagLength,
+ /*withSeparator=*/TRUE);
}
}
@@ -282,7 +290,8 @@ createTagStringWithAlternates(
region,
regionLength,
tagBuffer,
- &tagLength);
+ &tagLength,
+ /*withSeparator=*/TRUE);
regionAppended = TRUE;
}
@@ -307,61 +316,35 @@ createTagStringWithAlternates(
alternateRegion,
alternateRegionLength,
tagBuffer,
- &tagLength);
+ &tagLength,
+ /*withSeparator=*/TRUE);
regionAppended = TRUE;
}
}
- {
- const int32_t toCopy =
- tagLength >= tagCapacity ? tagCapacity : tagLength;
-
- /**
- * Copy the partial tag from our internal buffer to the supplied
- * target.
- **/
- uprv_memcpy(
- tag,
- tagBuffer,
- toCopy);
-
- capacityRemaining -= toCopy;
- }
+ /**
+ * Copy the partial tag from our internal buffer to the supplied
+ * target.
+ **/
+ sink.Append(tagBuffer, tagLength);
if (trailingLength > 0) {
- if (*trailing != '@' && capacityRemaining > 0) {
- tag[tagLength++] = '_';
- --capacityRemaining;
- if (capacityRemaining > 0 && !regionAppended) {
+ if (*trailing != '@') {
+ sink.Append("_", 1);
+ if (!regionAppended) {
/* extra separator is required */
- tag[tagLength++] = '_';
- --capacityRemaining;
+ sink.Append("_", 1);
}
}
- if (capacityRemaining > 0) {
- /*
- * Copy the trailing data into the supplied buffer. Use uprv_memmove, since we
- * don't know if the user-supplied buffers overlap.
- */
- const int32_t toCopy =
- trailingLength >= capacityRemaining ? capacityRemaining : trailingLength;
-
- uprv_memmove(
- &tag[tagLength],
- trailing,
- toCopy);
- }
+ /*
+ * Copy the trailing data into the supplied buffer.
+ */
+ sink.Append(trailing, trailingLength);
}
- tagLength += trailingLength;
-
- return u_terminateChars(
- tag,
- tagCapacity,
- tagLength,
- err);
+ return;
}
error:
@@ -375,8 +358,6 @@ error:
U_SUCCESS(*err)) {
*err = U_ILLEGAL_ARGUMENT_ERROR;
}
-
- return -1;
}
/**
@@ -400,12 +381,10 @@ error:
* @param regionLength The length of the region tag.
* @param trailing Any trailing data to append to the new tag.
* @param trailingLength The length of the trailing data.
- * @param tag The output buffer.
- * @param tagCapacity The capacity of the output buffer.
+ * @param sink The output sink receiving the tag string.
* @param err A pointer to a UErrorCode for error reporting.
- * @return The length of the tag string, which may be greater than tagCapacity.
**/
-static int32_t U_CALLCONV
+static void U_CALLCONV
createTagString(
const char* lang,
int32_t langLength,
@@ -415,11 +394,10 @@ createTagString(
int32_t regionLength,
const char* trailing,
int32_t trailingLength,
- char* tag,
- int32_t tagCapacity,
+ icu::ByteSink& sink,
UErrorCode* err)
{
- return createTagStringWithAlternates(
+ createTagStringWithAlternates(
lang,
langLength,
script,
@@ -429,8 +407,7 @@ createTagString(
trailing,
trailingLength,
NULL,
- tag,
- tagCapacity,
+ sink,
err);
}
@@ -502,15 +479,9 @@ parseTagString(
*langLength = subtagLength;
/*
- * If no language was present, use the value of unknownLanguage
- * instead. Otherwise, move past any separator.
+ * If no language was present, use the empty string instead.
+ * Otherwise, move past any separator.
*/
- if (*langLength == 0) {
- uprv_strcpy(
- lang,
- unknownLanguage);
- *langLength = (int32_t)uprv_strlen(lang);
- }
if (_isIDSeparator(*position)) {
++position;
}
@@ -578,7 +549,7 @@ error:
goto exit;
}
-static int32_t U_CALLCONV
+static UBool U_CALLCONV
createLikelySubtagsString(
const char* lang,
int32_t langLength,
@@ -588,17 +559,14 @@ createLikelySubtagsString(
int32_t regionLength,
const char* variants,
int32_t variantsLength,
- char* tag,
- int32_t tagCapacity,
- UErrorCode* err)
-{
+ icu::ByteSink& sink,
+ UErrorCode* err) {
/**
* ULOC_FULLNAME_CAPACITY will provide enough capacity
* that we can build a string that contains the language,
* script and region code without worrying about overrunning
* the user-supplied buffer.
**/
- char tagBuffer[ULOC_FULLNAME_CAPACITY];
char likelySubtagsBuffer[ULOC_FULLNAME_CAPACITY];
if(U_FAILURE(*err)) {
@@ -612,25 +580,28 @@ createLikelySubtagsString(
const char* likelySubtags = NULL;
- createTagString(
- lang,
- langLength,
- script,
- scriptLength,
- region,
- regionLength,
- NULL,
- 0,
- tagBuffer,
- sizeof(tagBuffer),
- err);
+ icu::CharString tagBuffer;
+ {
+ icu::CharStringByteSink sink(&tagBuffer);
+ createTagString(
+ lang,
+ langLength,
+ script,
+ scriptLength,
+ region,
+ regionLength,
+ NULL,
+ 0,
+ sink,
+ err);
+ }
if(U_FAILURE(*err)) {
goto error;
}
likelySubtags =
findLikelySubtags(
- tagBuffer,
+ tagBuffer.data(),
likelySubtagsBuffer,
sizeof(likelySubtagsBuffer),
err);
@@ -642,7 +613,7 @@ createLikelySubtagsString(
/* Always use the language tag from the
maximal string, since it may be more
specific than the one provided. */
- return createTagStringWithAlternates(
+ createTagStringWithAlternates(
NULL,
0,
NULL,
@@ -652,9 +623,9 @@ createLikelySubtagsString(
variants,
variantsLength,
likelySubtags,
- tag,
- tagCapacity,
+ sink,
err);
+ return TRUE;
}
}
@@ -665,25 +636,28 @@ createLikelySubtagsString(
const char* likelySubtags = NULL;
- createTagString(
- lang,
- langLength,
- script,
- scriptLength,
- NULL,
- 0,
- NULL,
- 0,
- tagBuffer,
- sizeof(tagBuffer),
- err);
+ icu::CharString tagBuffer;
+ {
+ icu::CharStringByteSink sink(&tagBuffer);
+ createTagString(
+ lang,
+ langLength,
+ script,
+ scriptLength,
+ NULL,
+ 0,
+ NULL,
+ 0,
+ sink,
+ err);
+ }
if(U_FAILURE(*err)) {
goto error;
}
likelySubtags =
findLikelySubtags(
- tagBuffer,
+ tagBuffer.data(),
likelySubtagsBuffer,
sizeof(likelySubtagsBuffer),
err);
@@ -695,7 +669,7 @@ createLikelySubtagsString(
/* Always use the language tag from the
maximal string, since it may be more
specific than the one provided. */
- return createTagStringWithAlternates(
+ createTagStringWithAlternates(
NULL,
0,
NULL,
@@ -705,9 +679,9 @@ createLikelySubtagsString(
variants,
variantsLength,
likelySubtags,
- tag,
- tagCapacity,
+ sink,
err);
+ return TRUE;
}
}
@@ -718,25 +692,28 @@ createLikelySubtagsString(
const char* likelySubtags = NULL;
- createTagString(
- lang,
- langLength,
- NULL,
- 0,
- region,
- regionLength,
- NULL,
- 0,
- tagBuffer,
- sizeof(tagBuffer),
- err);
+ icu::CharString tagBuffer;
+ {
+ icu::CharStringByteSink sink(&tagBuffer);
+ createTagString(
+ lang,
+ langLength,
+ NULL,
+ 0,
+ region,
+ regionLength,
+ NULL,
+ 0,
+ sink,
+ err);
+ }
if(U_FAILURE(*err)) {
goto error;
}
likelySubtags =
findLikelySubtags(
- tagBuffer,
+ tagBuffer.data(),
likelySubtagsBuffer,
sizeof(likelySubtagsBuffer),
err);
@@ -748,7 +725,7 @@ createLikelySubtagsString(
/* Always use the language tag from the
maximal string, since it may be more
specific than the one provided. */
- return createTagStringWithAlternates(
+ createTagStringWithAlternates(
NULL,
0,
script,
@@ -758,9 +735,9 @@ createLikelySubtagsString(
variants,
variantsLength,
likelySubtags,
- tag,
- tagCapacity,
+ sink,
err);
+ return TRUE;
}
}
@@ -770,25 +747,28 @@ createLikelySubtagsString(
{
const char* likelySubtags = NULL;
- createTagString(
- lang,
- langLength,
- NULL,
- 0,
- NULL,
- 0,
- NULL,
- 0,
- tagBuffer,
- sizeof(tagBuffer),
- err);
+ icu::CharString tagBuffer;
+ {
+ icu::CharStringByteSink sink(&tagBuffer);
+ createTagString(
+ lang,
+ langLength,
+ NULL,
+ 0,
+ NULL,
+ 0,
+ NULL,
+ 0,
+ sink,
+ err);
+ }
if(U_FAILURE(*err)) {
goto error;
}
likelySubtags =
findLikelySubtags(
- tagBuffer,
+ tagBuffer.data(),
likelySubtagsBuffer,
sizeof(likelySubtagsBuffer),
err);
@@ -800,7 +780,7 @@ createLikelySubtagsString(
/* Always use the language tag from the
maximal string, since it may be more
specific than the one provided. */
- return createTagStringWithAlternates(
+ createTagStringWithAlternates(
NULL,
0,
script,
@@ -810,17 +790,13 @@ createLikelySubtagsString(
variants,
variantsLength,
likelySubtags,
- tag,
- tagCapacity,
+ sink,
err);
+ return TRUE;
}
}
- return u_terminateChars(
- tag,
- tagCapacity,
- 0,
- err);
+ return FALSE;
error:
@@ -828,34 +804,32 @@ error:
*err = U_ILLEGAL_ARGUMENT_ERROR;
}
- return -1;
+ return FALSE;
}
-#define CHECK_TRAILING_VARIANT_SIZE(trailing, trailingLength) \
- { int32_t count = 0; \
- int32_t i; \
- for (i = 0; i < trailingLength; i++) { \
- if (trailing[i] == '-' || trailing[i] == '_') { \
- count = 0; \
- if (count > 8) { \
- goto error; \
- } \
- } else if (trailing[i] == '@') { \
- break; \
- } else if (count > 8) { \
+#define CHECK_TRAILING_VARIANT_SIZE(trailing, trailingLength) UPRV_BLOCK_MACRO_BEGIN { \
+ int32_t count = 0; \
+ int32_t i; \
+ for (i = 0; i < trailingLength; i++) { \
+ if (trailing[i] == '-' || trailing[i] == '_') { \
+ count = 0; \
+ if (count > 8) { \
goto error; \
- } else { \
- count++; \
} \
+ } else if (trailing[i] == '@') { \
+ break; \
+ } else if (count > 8) { \
+ goto error; \
+ } else { \
+ count++; \
} \
- }
+ } \
+} UPRV_BLOCK_MACRO_END
-static int32_t
-_uloc_addLikelySubtags(const char* localeID,
- char* maximizedLocaleID,
- int32_t maximizedLocaleIDCapacity,
- UErrorCode* err)
-{
+static void
+_uloc_addLikelySubtags(const char* localeID,
+ icu::ByteSink& sink,
+ UErrorCode* err) {
char lang[ULOC_LANG_CAPACITY];
int32_t langLength = sizeof(lang);
char script[ULOC_SCRIPT_CAPACITY];
@@ -865,14 +839,12 @@ _uloc_addLikelySubtags(const char* localeID,
const char* trailing = "";
int32_t trailingLength = 0;
int32_t trailingIndex = 0;
- int32_t resultLength = 0;
+ UBool success = FALSE;
if(U_FAILURE(*err)) {
goto error;
}
- else if (localeID == NULL ||
- maximizedLocaleID == NULL ||
- maximizedLocaleIDCapacity <= 0) {
+ if (localeID == NULL) {
goto error;
}
@@ -903,7 +875,7 @@ _uloc_addLikelySubtags(const char* localeID,
CHECK_TRAILING_VARIANT_SIZE(trailing, trailingLength);
- resultLength =
+ success =
createLikelySubtagsString(
lang,
langLength,
@@ -913,55 +885,32 @@ _uloc_addLikelySubtags(const char* localeID,
regionLength,
trailing,
trailingLength,
- maximizedLocaleID,
- maximizedLocaleIDCapacity,
+ sink,
err);
- if (resultLength == 0) {
+ if (!success) {
const int32_t localIDLength = (int32_t)uprv_strlen(localeID);
/*
* If we get here, we need to return localeID.
*/
- uprv_memcpy(
- maximizedLocaleID,
- localeID,
- localIDLength <= maximizedLocaleIDCapacity ?
- localIDLength : maximizedLocaleIDCapacity);
-
- resultLength =
- u_terminateChars(
- maximizedLocaleID,
- maximizedLocaleIDCapacity,
- localIDLength,
- err);
+ sink.Append(localeID, localIDLength);
}
- return resultLength;
+ return;
error:
if (!U_FAILURE(*err)) {
*err = U_ILLEGAL_ARGUMENT_ERROR;
}
-
- return -1;
}
-static int32_t
-_uloc_minimizeSubtags(const char* localeID,
- char* minimizedLocaleID,
- int32_t minimizedLocaleIDCapacity,
- UErrorCode* err)
-{
- /**
- * ULOC_FULLNAME_CAPACITY will provide enough capacity
- * that we can build a string that contains the language,
- * script and region code without worrying about overrunning
- * the user-supplied buffer.
- **/
- char maximizedTagBuffer[ULOC_FULLNAME_CAPACITY];
- int32_t maximizedTagBufferLength = sizeof(maximizedTagBuffer);
+static void
+_uloc_minimizeSubtags(const char* localeID,
+ icu::ByteSink& sink,
+ UErrorCode* err) {
+ icu::CharString maximizedTagBuffer;
char lang[ULOC_LANG_CAPACITY];
int32_t langLength = sizeof(lang);
@@ -976,9 +925,7 @@ _uloc_minimizeSubtags(const char* localeID,
if(U_FAILURE(*err)) {
goto error;
}
- else if (localeID == NULL ||
- minimizedLocaleID == NULL ||
- minimizedLocaleIDCapacity <= 0) {
+ else if (localeID == NULL) {
goto error;
}
@@ -1011,32 +958,32 @@ _uloc_minimizeSubtags(const char* localeID,
CHECK_TRAILING_VARIANT_SIZE(trailing, trailingLength);
- createTagString(
- lang,
- langLength,
- script,
- scriptLength,
- region,
- regionLength,
- NULL,
- 0,
- maximizedTagBuffer,
- maximizedTagBufferLength,
- err);
- if(U_FAILURE(*err)) {
- goto error;
- }
+ {
+ icu::CharString base;
+ {
+ icu::CharStringByteSink sink(&base);
+ createTagString(
+ lang,
+ langLength,
+ script,
+ scriptLength,
+ region,
+ regionLength,
+ NULL,
+ 0,
+ sink,
+ err);
+ }
- /**
- * First, we need to first get the maximization
- * from AddLikelySubtags.
- **/
- maximizedTagBufferLength =
- uloc_addLikelySubtags(
- maximizedTagBuffer,
- maximizedTagBuffer,
- maximizedTagBufferLength,
- err);
+ /**
+ * First, we need to first get the maximization
+ * from AddLikelySubtags.
+ **/
+ {
+ icu::CharStringByteSink sink(&maximizedTagBuffer);
+ ulocimp_addLikelySubtags(base.data(), sink, err);
+ }
+ }
if(U_FAILURE(*err)) {
goto error;
@@ -1046,9 +993,9 @@ _uloc_minimizeSubtags(const char* localeID,
* Start first with just the language.
**/
{
- char tagBuffer[ULOC_FULLNAME_CAPACITY];
-
- const int32_t tagBufferLength =
+ icu::CharString tagBuffer;
+ {
+ icu::CharStringByteSink sink(&tagBuffer);
createLikelySubtagsString(
lang,
langLength,
@@ -1058,19 +1005,19 @@ _uloc_minimizeSubtags(const char* localeID,
0,
NULL,
0,
- tagBuffer,
- sizeof(tagBuffer),
+ sink,
err);
+ }
if(U_FAILURE(*err)) {
goto error;
}
- else if (uprv_strnicmp(
- maximizedTagBuffer,
- tagBuffer,
- tagBufferLength) == 0) {
+ else if (!tagBuffer.isEmpty() && uprv_strnicmp(
+ maximizedTagBuffer.data(),
+ tagBuffer.data(),
+ tagBuffer.length()) == 0) {
- return createTagString(
+ createTagString(
lang,
langLength,
NULL,
@@ -1079,9 +1026,9 @@ _uloc_minimizeSubtags(const char* localeID,
0,
trailing,
trailingLength,
- minimizedLocaleID,
- minimizedLocaleIDCapacity,
+ sink,
err);
+ return;
}
}
@@ -1090,9 +1037,9 @@ _uloc_minimizeSubtags(const char* localeID,
**/
if (regionLength > 0) {
- char tagBuffer[ULOC_FULLNAME_CAPACITY];
-
- const int32_t tagBufferLength =
+ icu::CharString tagBuffer;
+ {
+ icu::CharStringByteSink sink(&tagBuffer);
createLikelySubtagsString(
lang,
langLength,
@@ -1102,19 +1049,19 @@ _uloc_minimizeSubtags(const char* localeID,
regionLength,
NULL,
0,
- tagBuffer,
- sizeof(tagBuffer),
+ sink,
err);
+ }
if(U_FAILURE(*err)) {
goto error;
}
else if (uprv_strnicmp(
- maximizedTagBuffer,
- tagBuffer,
- tagBufferLength) == 0) {
+ maximizedTagBuffer.data(),
+ tagBuffer.data(),
+ tagBuffer.length()) == 0) {
- return createTagString(
+ createTagString(
lang,
langLength,
NULL,
@@ -1123,9 +1070,9 @@ _uloc_minimizeSubtags(const char* localeID,
regionLength,
trailing,
trailingLength,
- minimizedLocaleID,
- minimizedLocaleIDCapacity,
+ sink,
err);
+ return;
}
}
@@ -1135,9 +1082,9 @@ _uloc_minimizeSubtags(const char* localeID,
* maximal version that we already have.
**/
if (scriptLength > 0 && regionLength > 0) {
- char tagBuffer[ULOC_FULLNAME_CAPACITY];
-
- const int32_t tagBufferLength =
+ icu::CharString tagBuffer;
+ {
+ icu::CharStringByteSink sink(&tagBuffer);
createLikelySubtagsString(
lang,
langLength,
@@ -1147,19 +1094,19 @@ _uloc_minimizeSubtags(const char* localeID,
0,
NULL,
0,
- tagBuffer,
- sizeof(tagBuffer),
+ sink,
err);
+ }
if(U_FAILURE(*err)) {
goto error;
}
else if (uprv_strnicmp(
- maximizedTagBuffer,
- tagBuffer,
- tagBufferLength) == 0) {
+ maximizedTagBuffer.data(),
+ tagBuffer.data(),
+ tagBuffer.length()) == 0) {
- return createTagString(
+ createTagString(
lang,
langLength,
script,
@@ -1168,9 +1115,9 @@ _uloc_minimizeSubtags(const char* localeID,
0,
trailing,
trailingLength,
- minimizedLocaleID,
- minimizedLocaleIDCapacity,
+ sink,
err);
+ return;
}
}
@@ -1179,18 +1126,8 @@ _uloc_minimizeSubtags(const char* localeID,
* If we got here, return the locale ID parameter.
**/
const int32_t localeIDLength = (int32_t)uprv_strlen(localeID);
-
- uprv_memcpy(
- minimizedLocaleID,
- localeID,
- localeIDLength <= minimizedLocaleIDCapacity ?
- localeIDLength : minimizedLocaleIDCapacity);
-
- return u_terminateChars(
- minimizedLocaleID,
- minimizedLocaleIDCapacity,
- localeIDLength,
- err);
+ sink.Append(localeID, localeIDLength);
+ return;
}
error:
@@ -1198,10 +1135,6 @@ error:
if (!U_FAILURE(*err)) {
*err = U_ILLEGAL_ARGUMENT_ERROR;
}
-
- return -1;
-
-
}
static UBool
@@ -1232,51 +1165,83 @@ do_canonicalize(const char* localeID,
}
U_CAPI int32_t U_EXPORT2
-uloc_addLikelySubtags(const char* localeID,
- char* maximizedLocaleID,
- int32_t maximizedLocaleIDCapacity,
- UErrorCode* err)
-{
+uloc_addLikelySubtags(const char* localeID,
+ char* maximizedLocaleID,
+ int32_t maximizedLocaleIDCapacity,
+ UErrorCode* status) {
+ if (U_FAILURE(*status)) {
+ return 0;
+ }
+
+ icu::CheckedArrayByteSink sink(
+ maximizedLocaleID, maximizedLocaleIDCapacity);
+
+ ulocimp_addLikelySubtags(localeID, sink, status);
+ int32_t reslen = sink.NumberOfBytesAppended();
+
+ if (U_FAILURE(*status)) {
+ return sink.Overflowed() ? reslen : -1;
+ }
+
+ if (sink.Overflowed()) {
+ *status = U_BUFFER_OVERFLOW_ERROR;
+ } else {
+ u_terminateChars(
+ maximizedLocaleID, maximizedLocaleIDCapacity, reslen, status);
+ }
+
+ return reslen;
+}
+
+U_CAPI void U_EXPORT2
+ulocimp_addLikelySubtags(const char* localeID,
+ icu::ByteSink& sink,
+ UErrorCode* status) {
char localeBuffer[ULOC_FULLNAME_CAPACITY];
- if (!do_canonicalize(
- localeID,
- localeBuffer,
- sizeof(localeBuffer),
- err)) {
- return -1;
+ if (do_canonicalize(localeID, localeBuffer, sizeof localeBuffer, status)) {
+ _uloc_addLikelySubtags(localeBuffer, sink, status);
}
- else {
- return _uloc_addLikelySubtags(
- localeBuffer,
- maximizedLocaleID,
- maximizedLocaleIDCapacity,
- err);
- }
}
U_CAPI int32_t U_EXPORT2
-uloc_minimizeSubtags(const char* localeID,
- char* minimizedLocaleID,
- int32_t minimizedLocaleIDCapacity,
- UErrorCode* err)
-{
+uloc_minimizeSubtags(const char* localeID,
+ char* minimizedLocaleID,
+ int32_t minimizedLocaleIDCapacity,
+ UErrorCode* status) {
+ if (U_FAILURE(*status)) {
+ return 0;
+ }
+
+ icu::CheckedArrayByteSink sink(
+ minimizedLocaleID, minimizedLocaleIDCapacity);
+
+ ulocimp_minimizeSubtags(localeID, sink, status);
+ int32_t reslen = sink.NumberOfBytesAppended();
+
+ if (U_FAILURE(*status)) {
+ return sink.Overflowed() ? reslen : -1;
+ }
+
+ if (sink.Overflowed()) {
+ *status = U_BUFFER_OVERFLOW_ERROR;
+ } else {
+ u_terminateChars(
+ minimizedLocaleID, minimizedLocaleIDCapacity, reslen, status);
+ }
+
+ return reslen;
+}
+
+U_CAPI void U_EXPORT2
+ulocimp_minimizeSubtags(const char* localeID,
+ icu::ByteSink& sink,
+ UErrorCode* status) {
char localeBuffer[ULOC_FULLNAME_CAPACITY];
- if (!do_canonicalize(
- localeID,
- localeBuffer,
- sizeof(localeBuffer),
- err)) {
- return -1;
+ if (do_canonicalize(localeID, localeBuffer, sizeof localeBuffer, status)) {
+ _uloc_minimizeSubtags(localeBuffer, sink, status);
}
- else {
- return _uloc_minimizeSubtags(
- localeBuffer,
- minimizedLocaleID,
- minimizedLocaleIDCapacity,
- err);
- }
}
// Pairs of (language subtag, + or -) for finding out fast if common languages
@@ -1284,7 +1249,7 @@ uloc_minimizeSubtags(const char* localeID,
static const char LANG_DIR_STRING[] =
"root-en-es-pt-zh-ja-ko-de-fr-it-ar+he+fa+ru-nl-pl-th-tr-";
-// Implemented here because this calls uloc_addLikelySubtags().
+// Implemented here because this calls ulocimp_addLikelySubtags().
U_CAPI UBool U_EXPORT2
uloc_isRightToLeft(const char *locale) {
UErrorCode errorCode = U_ZERO_ERROR;
@@ -1297,26 +1262,30 @@ uloc_isRightToLeft(const char *locale) {
errorCode = U_ZERO_ERROR;
char lang[8];
int32_t langLength = uloc_getLanguage(locale, lang, UPRV_LENGTHOF(lang), &errorCode);
- if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING ||
- langLength == 0) {
+ if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING) {
return FALSE;
}
- const char* langPtr = uprv_strstr(LANG_DIR_STRING, lang);
- if (langPtr != NULL) {
- switch (langPtr[langLength]) {
- case '-': return FALSE;
- case '+': return TRUE;
- default: break; // partial match of a longer code
+ if (langLength > 0) {
+ const char* langPtr = uprv_strstr(LANG_DIR_STRING, lang);
+ if (langPtr != NULL) {
+ switch (langPtr[langLength]) {
+ case '-': return FALSE;
+ case '+': return TRUE;
+ default: break; // partial match of a longer code
+ }
}
}
// Otherwise, find the likely script.
errorCode = U_ZERO_ERROR;
- char likely[ULOC_FULLNAME_CAPACITY];
- (void)uloc_addLikelySubtags(locale, likely, UPRV_LENGTHOF(likely), &errorCode);
+ icu::CharString likely;
+ {
+ icu::CharStringByteSink sink(&likely);
+ ulocimp_addLikelySubtags(locale, sink, &errorCode);
+ }
if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING) {
return FALSE;
}
- scriptLength = uloc_getScript(likely, script, UPRV_LENGTHOF(script), &errorCode);
+ scriptLength = uloc_getScript(likely.data(), script, UPRV_LENGTHOF(script), &errorCode);
if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING ||
scriptLength == 0) {
return FALSE;
@@ -1367,11 +1336,14 @@ ulocimp_getRegionForSupplementalData(const char *localeID, UBool inferRegion,
rgLen = 0;
} else if (rgLen == 0 && inferRegion) {
// no unicode_region_subtag but inferRegion TRUE, try likely subtags
- char locBuf[ULOC_FULLNAME_CAPACITY];
rgStatus = U_ZERO_ERROR;
- (void)uloc_addLikelySubtags(localeID, locBuf, ULOC_FULLNAME_CAPACITY, &rgStatus);
+ icu::CharString locBuf;
+ {
+ icu::CharStringByteSink sink(&locBuf);
+ ulocimp_addLikelySubtags(localeID, sink, &rgStatus);
+ }
if (U_SUCCESS(rgStatus)) {
- rgLen = uloc_getCountry(locBuf, rgBuf, ULOC_RG_BUFLEN, status);
+ rgLen = uloc_getCountry(locBuf.data(), rgBuf, ULOC_RG_BUFLEN, status);
if (U_FAILURE(*status)) {
rgLen = 0;
}
diff --git a/Build/source/libs/icu/icu-src/source/common/loclikelysubtags.cpp b/Build/source/libs/icu/icu-src/source/common/loclikelysubtags.cpp
new file mode 100644
index 00000000000..d7f5e124c2c
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/common/loclikelysubtags.cpp
@@ -0,0 +1,638 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+
+// loclikelysubtags.cpp
+// created: 2019may08 Markus W. Scherer
+
+#include <utility>
+#include "unicode/utypes.h"
+#include "unicode/bytestrie.h"
+#include "unicode/localpointer.h"
+#include "unicode/locid.h"
+#include "unicode/uobject.h"
+#include "unicode/ures.h"
+#include "charstr.h"
+#include "cstring.h"
+#include "loclikelysubtags.h"
+#include "lsr.h"
+#include "uassert.h"
+#include "ucln_cmn.h"
+#include "uhash.h"
+#include "uinvchar.h"
+#include "umutex.h"
+#include "uresdata.h"
+#include "uresimp.h"
+
+U_NAMESPACE_BEGIN
+
+namespace {
+
+constexpr char PSEUDO_ACCENTS_PREFIX = '\''; // -XA, -PSACCENT
+constexpr char PSEUDO_BIDI_PREFIX = '+'; // -XB, -PSBIDI
+constexpr char PSEUDO_CRACKED_PREFIX = ','; // -XC, -PSCRACK
+
+/**
+ * Stores NUL-terminated strings with duplicate elimination.
+ * Checks for unique UTF-16 string pointers and converts to invariant characters.
+ */
+class UniqueCharStrings {
+public:
+ UniqueCharStrings(UErrorCode &errorCode) : strings(nullptr) {
+ uhash_init(&map, uhash_hashUChars, uhash_compareUChars, uhash_compareLong, &errorCode);
+ if (U_FAILURE(errorCode)) { return; }
+ strings = new CharString();
+ if (strings == nullptr) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ }
+ }
+ ~UniqueCharStrings() {
+ uhash_close(&map);
+ delete strings;
+ }
+
+ /** Returns/orphans the CharString that contains all strings. */
+ CharString *orphanCharStrings() {
+ CharString *result = strings;
+ strings = nullptr;
+ return result;
+ }
+
+ /** Adds a string and returns a unique number for it. */
+ int32_t add(const UnicodeString &s, UErrorCode &errorCode) {
+ if (U_FAILURE(errorCode)) { return 0; }
+ if (isFrozen) {
+ errorCode = U_NO_WRITE_PERMISSION;
+ return 0;
+ }
+ // The string points into the resource bundle.
+ const char16_t *p = s.getBuffer();
+ int32_t oldIndex = uhash_geti(&map, p);
+ if (oldIndex != 0) { // found duplicate
+ return oldIndex;
+ }
+ // Explicit NUL terminator for the previous string.
+ // The strings object is also terminated with one implicit NUL.
+ strings->append(0, errorCode);
+ int32_t newIndex = strings->length();
+ strings->appendInvariantChars(s, errorCode);
+ uhash_puti(&map, const_cast<char16_t *>(p), newIndex, &errorCode);
+ return newIndex;
+ }
+
+ void freeze() { isFrozen = true; }
+
+ /**
+ * Returns a string pointer for its unique number, if this object is frozen.
+ * Otherwise nullptr.
+ */
+ const char *get(int32_t i) const {
+ U_ASSERT(isFrozen);
+ return isFrozen && i > 0 ? strings->data() + i : nullptr;
+ }
+
+private:
+ UHashtable map;
+ CharString *strings;
+ bool isFrozen = false;
+};
+
+} // namespace
+
+LocaleDistanceData::LocaleDistanceData(LocaleDistanceData &&data) :
+ distanceTrieBytes(data.distanceTrieBytes),
+ regionToPartitions(data.regionToPartitions),
+ partitions(data.partitions),
+ paradigms(data.paradigms), paradigmsLength(data.paradigmsLength),
+ distances(data.distances) {
+ data.partitions = nullptr;
+ data.paradigms = nullptr;
+}
+
+LocaleDistanceData::~LocaleDistanceData() {
+ uprv_free(partitions);
+ delete[] paradigms;
+}
+
+// TODO(ICU-20777): Rename to just LikelySubtagsData.
+struct XLikelySubtagsData {
+ UResourceBundle *langInfoBundle = nullptr;
+ UniqueCharStrings strings;
+ CharStringMap languageAliases;
+ CharStringMap regionAliases;
+ const uint8_t *trieBytes = nullptr;
+ LSR *lsrs = nullptr;
+ int32_t lsrsLength = 0;
+
+ LocaleDistanceData distanceData;
+
+ XLikelySubtagsData(UErrorCode &errorCode) : strings(errorCode) {}
+
+ ~XLikelySubtagsData() {
+ ures_close(langInfoBundle);
+ delete[] lsrs;
+ }
+
+ void load(UErrorCode &errorCode) {
+ langInfoBundle = ures_openDirect(nullptr, "langInfo", &errorCode);
+ if (U_FAILURE(errorCode)) { return; }
+ StackUResourceBundle stackTempBundle;
+ ResourceDataValue value;
+ ures_getValueWithFallback(langInfoBundle, "likely", stackTempBundle.getAlias(),
+ value, errorCode);
+ ResourceTable likelyTable = value.getTable(errorCode);
+ if (U_FAILURE(errorCode)) { return; }
+
+ // Read all strings in the resource bundle and convert them to invariant char *.
+ LocalMemory<int32_t> languageIndexes, regionIndexes, lsrSubtagIndexes;
+ int32_t languagesLength = 0, regionsLength = 0, lsrSubtagsLength = 0;
+ if (!readStrings(likelyTable, "languageAliases", value,
+ languageIndexes, languagesLength, errorCode) ||
+ !readStrings(likelyTable, "regionAliases", value,
+ regionIndexes, regionsLength, errorCode) ||
+ !readStrings(likelyTable, "lsrs", value,
+ lsrSubtagIndexes,lsrSubtagsLength, errorCode)) {
+ return;
+ }
+ if ((languagesLength & 1) != 0 ||
+ (regionsLength & 1) != 0 ||
+ (lsrSubtagsLength % 3) != 0) {
+ errorCode = U_INVALID_FORMAT_ERROR;
+ return;
+ }
+ if (lsrSubtagsLength == 0) {
+ errorCode = U_MISSING_RESOURCE_ERROR;
+ return;
+ }
+
+ if (!likelyTable.findValue("trie", value)) {
+ errorCode = U_MISSING_RESOURCE_ERROR;
+ return;
+ }
+ int32_t length;
+ trieBytes = value.getBinary(length, errorCode);
+ if (U_FAILURE(errorCode)) { return; }
+
+ // Also read distance/matcher data if available,
+ // to open & keep only one resource bundle pointer
+ // and to use one single UniqueCharStrings.
+ UErrorCode matchErrorCode = U_ZERO_ERROR;
+ ures_getValueWithFallback(langInfoBundle, "match", stackTempBundle.getAlias(),
+ value, matchErrorCode);
+ LocalMemory<int32_t> partitionIndexes, paradigmSubtagIndexes;
+ int32_t partitionsLength = 0, paradigmSubtagsLength = 0;
+ if (U_SUCCESS(matchErrorCode)) {
+ ResourceTable matchTable = value.getTable(errorCode);
+ if (U_FAILURE(errorCode)) { return; }
+
+ if (matchTable.findValue("trie", value)) {
+ distanceData.distanceTrieBytes = value.getBinary(length, errorCode);
+ if (U_FAILURE(errorCode)) { return; }
+ }
+
+ if (matchTable.findValue("regionToPartitions", value)) {
+ distanceData.regionToPartitions = value.getBinary(length, errorCode);
+ if (U_FAILURE(errorCode)) { return; }
+ if (length < LSR::REGION_INDEX_LIMIT) {
+ errorCode = U_INVALID_FORMAT_ERROR;
+ return;
+ }
+ }
+
+ if (!readStrings(matchTable, "partitions", value,
+ partitionIndexes, partitionsLength, errorCode) ||
+ !readStrings(matchTable, "paradigms", value,
+ paradigmSubtagIndexes, paradigmSubtagsLength, errorCode)) {
+ return;
+ }
+ if ((paradigmSubtagsLength % 3) != 0) {
+ errorCode = U_INVALID_FORMAT_ERROR;
+ return;
+ }
+
+ if (matchTable.findValue("distances", value)) {
+ distanceData.distances = value.getIntVector(length, errorCode);
+ if (U_FAILURE(errorCode)) { return; }
+ if (length < 4) { // LocaleDistance IX_LIMIT
+ errorCode = U_INVALID_FORMAT_ERROR;
+ return;
+ }
+ }
+ } else if (matchErrorCode == U_MISSING_RESOURCE_ERROR) {
+ // ok for likely subtags
+ } else { // error other than missing resource
+ errorCode = matchErrorCode;
+ return;
+ }
+
+ // Fetch & store invariant-character versions of strings
+ // only after we have collected and de-duplicated all of them.
+ strings.freeze();
+
+ languageAliases = CharStringMap(languagesLength / 2, errorCode);
+ for (int32_t i = 0; i < languagesLength; i += 2) {
+ languageAliases.put(strings.get(languageIndexes[i]),
+ strings.get(languageIndexes[i + 1]), errorCode);
+ }
+
+ regionAliases = CharStringMap(regionsLength / 2, errorCode);
+ for (int32_t i = 0; i < regionsLength; i += 2) {
+ regionAliases.put(strings.get(regionIndexes[i]),
+ strings.get(regionIndexes[i + 1]), errorCode);
+ }
+ if (U_FAILURE(errorCode)) { return; }
+
+ lsrsLength = lsrSubtagsLength / 3;
+ lsrs = new LSR[lsrsLength];
+ if (lsrs == nullptr) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ for (int32_t i = 0, j = 0; i < lsrSubtagsLength; i += 3, ++j) {
+ lsrs[j] = LSR(strings.get(lsrSubtagIndexes[i]),
+ strings.get(lsrSubtagIndexes[i + 1]),
+ strings.get(lsrSubtagIndexes[i + 2]));
+ }
+
+ if (partitionsLength > 0) {
+ distanceData.partitions = static_cast<const char **>(
+ uprv_malloc(partitionsLength * sizeof(const char *)));
+ if (distanceData.partitions == nullptr) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ for (int32_t i = 0; i < partitionsLength; ++i) {
+ distanceData.partitions[i] = strings.get(partitionIndexes[i]);
+ }
+ }
+
+ if (paradigmSubtagsLength > 0) {
+ distanceData.paradigmsLength = paradigmSubtagsLength / 3;
+ LSR *paradigms = new LSR[distanceData.paradigmsLength];
+ if (paradigms == nullptr) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ for (int32_t i = 0, j = 0; i < paradigmSubtagsLength; i += 3, ++j) {
+ paradigms[j] = LSR(strings.get(paradigmSubtagIndexes[i]),
+ strings.get(paradigmSubtagIndexes[i + 1]),
+ strings.get(paradigmSubtagIndexes[i + 2]));
+ }
+ distanceData.paradigms = paradigms;
+ }
+ }
+
+private:
+ bool readStrings(const ResourceTable &table, const char *key, ResourceValue &value,
+ LocalMemory<int32_t> &indexes, int32_t &length, UErrorCode &errorCode) {
+ if (table.findValue(key, value)) {
+ ResourceArray stringArray = value.getArray(errorCode);
+ if (U_FAILURE(errorCode)) { return false; }
+ length = stringArray.getSize();
+ if (length == 0) { return true; }
+ int32_t *rawIndexes = indexes.allocateInsteadAndCopy(length);
+ if (rawIndexes == nullptr) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return false;
+ }
+ for (int i = 0; i < length; ++i) {
+ stringArray.getValue(i, value); // returns TRUE because i < length
+ rawIndexes[i] = strings.add(value.getUnicodeString(errorCode), errorCode);
+ if (U_FAILURE(errorCode)) { return false; }
+ }
+ }
+ return true;
+ }
+};
+
+namespace {
+
+XLikelySubtags *gLikelySubtags = nullptr;
+UInitOnce gInitOnce = U_INITONCE_INITIALIZER;
+
+UBool U_CALLCONV cleanup() {
+ delete gLikelySubtags;
+ gLikelySubtags = nullptr;
+ gInitOnce.reset();
+ return TRUE;
+}
+
+} // namespace
+
+void U_CALLCONV XLikelySubtags::initLikelySubtags(UErrorCode &errorCode) {
+ // This function is invoked only via umtx_initOnce().
+ U_ASSERT(gLikelySubtags == nullptr);
+ XLikelySubtagsData data(errorCode);
+ data.load(errorCode);
+ if (U_FAILURE(errorCode)) { return; }
+ gLikelySubtags = new XLikelySubtags(data);
+ if (gLikelySubtags == nullptr) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ ucln_common_registerCleanup(UCLN_COMMON_LIKELY_SUBTAGS, cleanup);
+}
+
+const XLikelySubtags *XLikelySubtags::getSingleton(UErrorCode &errorCode) {
+ if (U_FAILURE(errorCode)) { return nullptr; }
+ umtx_initOnce(gInitOnce, &XLikelySubtags::initLikelySubtags, errorCode);
+ return gLikelySubtags;
+}
+
+XLikelySubtags::XLikelySubtags(XLikelySubtagsData &data) :
+ langInfoBundle(data.langInfoBundle),
+ strings(data.strings.orphanCharStrings()),
+ languageAliases(std::move(data.languageAliases)),
+ regionAliases(std::move(data.regionAliases)),
+ trie(data.trieBytes),
+ lsrs(data.lsrs),
+#if U_DEBUG
+ lsrsLength(data.lsrsLength),
+#endif
+ distanceData(std::move(data.distanceData)) {
+ data.langInfoBundle = nullptr;
+ data.lsrs = nullptr;
+
+ // Cache the result of looking up language="und" encoded as "*", and "und-Zzzz" ("**").
+ UStringTrieResult result = trie.next(u'*');
+ U_ASSERT(USTRINGTRIE_HAS_NEXT(result));
+ trieUndState = trie.getState64();
+ result = trie.next(u'*');
+ U_ASSERT(USTRINGTRIE_HAS_NEXT(result));
+ trieUndZzzzState = trie.getState64();
+ result = trie.next(u'*');
+ U_ASSERT(USTRINGTRIE_HAS_VALUE(result));
+ defaultLsrIndex = trie.getValue();
+ trie.reset();
+
+ for (char16_t c = u'a'; c <= u'z'; ++c) {
+ result = trie.next(c);
+ if (result == USTRINGTRIE_NO_VALUE) {
+ trieFirstLetterStates[c - u'a'] = trie.getState64();
+ }
+ trie.reset();
+ }
+}
+
+XLikelySubtags::~XLikelySubtags() {
+ ures_close(langInfoBundle);
+ delete strings;
+ delete[] lsrs;
+}
+
+LSR XLikelySubtags::makeMaximizedLsrFrom(const Locale &locale, UErrorCode &errorCode) const {
+ const char *name = locale.getName();
+ if (uprv_isAtSign(name[0]) && name[1] == 'x' && name[2] == '=') { // name.startsWith("@x=")
+ // Private use language tag x-subtag-subtag...
+ return LSR(name, "", "");
+ }
+ return makeMaximizedLsr(locale.getLanguage(), locale.getScript(), locale.getCountry(),
+ locale.getVariant(), errorCode);
+}
+
+namespace {
+
+const char *getCanonical(const CharStringMap &aliases, const char *alias) {
+ const char *canonical = aliases.get(alias);
+ return canonical == nullptr ? alias : canonical;
+}
+
+} // namespace
+
+LSR XLikelySubtags::makeMaximizedLsr(const char *language, const char *script, const char *region,
+ const char *variant, UErrorCode &errorCode) const {
+ // Handle pseudolocales like en-XA, ar-XB, fr-PSCRACK.
+ // They should match only themselves,
+ // not other locales with what looks like the same language and script subtags.
+ char c1;
+ if (region[0] == 'X' && (c1 = region[1]) != 0 && region[2] == 0) {
+ switch (c1) {
+ case 'A':
+ return LSR(PSEUDO_ACCENTS_PREFIX, language, script, region, errorCode);
+ case 'B':
+ return LSR(PSEUDO_BIDI_PREFIX, language, script, region, errorCode);
+ case 'C':
+ return LSR(PSEUDO_CRACKED_PREFIX, language, script, region, errorCode);
+ default: // normal locale
+ break;
+ }
+ }
+
+ if (variant[0] == 'P' && variant[1] == 'S') {
+ if (uprv_strcmp(variant, "PSACCENT") == 0) {
+ return LSR(PSEUDO_ACCENTS_PREFIX, language, script,
+ *region == 0 ? "XA" : region, errorCode);
+ } else if (uprv_strcmp(variant, "PSBIDI") == 0) {
+ return LSR(PSEUDO_BIDI_PREFIX, language, script,
+ *region == 0 ? "XB" : region, errorCode);
+ } else if (uprv_strcmp(variant, "PSCRACK") == 0) {
+ return LSR(PSEUDO_CRACKED_PREFIX, language, script,
+ *region == 0 ? "XC" : region, errorCode);
+ }
+ // else normal locale
+ }
+
+ language = getCanonical(languageAliases, language);
+ // (We have no script mappings.)
+ region = getCanonical(regionAliases, region);
+ return maximize(language, script, region);
+}
+
+LSR XLikelySubtags::maximize(const char *language, const char *script, const char *region) const {
+ if (uprv_strcmp(language, "und") == 0) {
+ language = "";
+ }
+ if (uprv_strcmp(script, "Zzzz") == 0) {
+ script = "";
+ }
+ if (uprv_strcmp(region, "ZZ") == 0) {
+ region = "";
+ }
+ if (*script != 0 && *region != 0 && *language != 0) {
+ return LSR(language, script, region); // already maximized
+ }
+
+ uint32_t retainOldMask = 0;
+ BytesTrie iter(trie);
+ uint64_t state;
+ int32_t value;
+ // Small optimization: Array lookup for first language letter.
+ int32_t c0;
+ if (0 <= (c0 = uprv_lowerOrdinal(language[0])) && c0 <= 25 &&
+ language[1] != 0 && // language.length() >= 2
+ (state = trieFirstLetterStates[c0]) != 0) {
+ value = trieNext(iter.resetToState64(state), language, 1);
+ } else {
+ value = trieNext(iter, language, 0);
+ }
+ if (value >= 0) {
+ if (*language != 0) {
+ retainOldMask |= 4;
+ }
+ state = iter.getState64();
+ } else {
+ retainOldMask |= 4;
+ iter.resetToState64(trieUndState); // "und" ("*")
+ state = 0;
+ }
+
+ if (value > 0) {
+ // Intermediate or final value from just language.
+ if (value == SKIP_SCRIPT) {
+ value = 0;
+ }
+ if (*script != 0) {
+ retainOldMask |= 2;
+ }
+ } else {
+ value = trieNext(iter, script, 0);
+ if (value >= 0) {
+ if (*script != 0) {
+ retainOldMask |= 2;
+ }
+ state = iter.getState64();
+ } else {
+ retainOldMask |= 2;
+ if (state == 0) {
+ iter.resetToState64(trieUndZzzzState); // "und-Zzzz" ("**")
+ } else {
+ iter.resetToState64(state);
+ value = trieNext(iter, "", 0);
+ U_ASSERT(value >= 0);
+ state = iter.getState64();
+ }
+ }
+ }
+
+ if (value > 0) {
+ // Final value from just language or language+script.
+ if (*region != 0) {
+ retainOldMask |= 1;
+ }
+ } else {
+ value = trieNext(iter, region, 0);
+ if (value >= 0) {
+ if (*region != 0) {
+ retainOldMask |= 1;
+ }
+ } else {
+ retainOldMask |= 1;
+ if (state == 0) {
+ value = defaultLsrIndex;
+ } else {
+ iter.resetToState64(state);
+ value = trieNext(iter, "", 0);
+ U_ASSERT(value > 0);
+ }
+ }
+ }
+ U_ASSERT(value < lsrsLength);
+ const LSR &result = lsrs[value];
+
+ if (*language == 0) {
+ language = "und";
+ }
+
+ if (retainOldMask == 0) {
+ // Quickly return a copy of the lookup-result LSR
+ // without new allocation of the subtags.
+ return LSR(result.language, result.script, result.region);
+ }
+ if ((retainOldMask & 4) == 0) {
+ language = result.language;
+ }
+ if ((retainOldMask & 2) == 0) {
+ script = result.script;
+ }
+ if ((retainOldMask & 1) == 0) {
+ region = result.region;
+ }
+ return LSR(language, script, region);
+}
+
+int32_t XLikelySubtags::trieNext(BytesTrie &iter, const char *s, int32_t i) {
+ UStringTrieResult result;
+ uint8_t c;
+ if ((c = s[i]) == 0) {
+ result = iter.next(u'*');
+ } else {
+ for (;;) {
+ c = uprv_invCharToAscii(c);
+ // EBCDIC: If s[i] is not an invariant character,
+ // then c is now 0 and will simply not match anything, which is harmless.
+ uint8_t next = s[++i];
+ if (next != 0) {
+ if (!USTRINGTRIE_HAS_NEXT(iter.next(c))) {
+ return -1;
+ }
+ } else {
+ // last character of this subtag
+ result = iter.next(c | 0x80);
+ break;
+ }
+ c = next;
+ }
+ }
+ switch (result) {
+ case USTRINGTRIE_NO_MATCH: return -1;
+ case USTRINGTRIE_NO_VALUE: return 0;
+ case USTRINGTRIE_INTERMEDIATE_VALUE:
+ U_ASSERT(iter.getValue() == SKIP_SCRIPT);
+ return SKIP_SCRIPT;
+ case USTRINGTRIE_FINAL_VALUE: return iter.getValue();
+ default: return -1;
+ }
+}
+
+// TODO(ICU-20777): Switch Locale/uloc_ likely-subtags API from the old code
+// in loclikely.cpp to this new code, including activating this
+// minimizeSubtags() function. The LocaleMatcher does not minimize.
+#if 0
+LSR XLikelySubtags::minimizeSubtags(const char *languageIn, const char *scriptIn,
+ const char *regionIn, ULocale.Minimize fieldToFavor,
+ UErrorCode &errorCode) const {
+ LSR result = maximize(languageIn, scriptIn, regionIn);
+
+ // We could try just a series of checks, like:
+ // LSR result2 = addLikelySubtags(languageIn, "", "");
+ // if result.equals(result2) return result2;
+ // However, we can optimize 2 of the cases:
+ // (languageIn, "", "")
+ // (languageIn, "", regionIn)
+
+ // value00 = lookup(result.language, "", "")
+ BytesTrie iter = new BytesTrie(trie);
+ int value = trieNext(iter, result.language, 0);
+ U_ASSERT(value >= 0);
+ if (value == 0) {
+ value = trieNext(iter, "", 0);
+ U_ASSERT(value >= 0);
+ if (value == 0) {
+ value = trieNext(iter, "", 0);
+ }
+ }
+ U_ASSERT(value > 0);
+ LSR value00 = lsrs[value];
+ boolean favorRegionOk = false;
+ if (result.script.equals(value00.script)) { //script is default
+ if (result.region.equals(value00.region)) {
+ return new LSR(result.language, "", "");
+ } else if (fieldToFavor == ULocale.Minimize.FAVOR_REGION) {
+ return new LSR(result.language, "", result.region);
+ } else {
+ favorRegionOk = true;
+ }
+ }
+
+ // The last case is not as easy to optimize.
+ // Maybe do later, but for now use the straightforward code.
+ LSR result2 = maximize(languageIn, scriptIn, "");
+ if (result2.equals(result)) {
+ return new LSR(result.language, result.script, "");
+ } else if (favorRegionOk) {
+ return new LSR(result.language, "", result.region);
+ }
+ return result;
+}
+#endif
+
+U_NAMESPACE_END
diff --git a/Build/source/libs/icu/icu-src/source/common/loclikelysubtags.h b/Build/source/libs/icu/icu-src/source/common/loclikelysubtags.h
new file mode 100644
index 00000000000..8c8a08ac5e3
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/common/loclikelysubtags.h
@@ -0,0 +1,143 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+
+// loclikelysubtags.h
+// created: 2019may08 Markus W. Scherer
+
+#ifndef __LOCLIKELYSUBTAGS_H__
+#define __LOCLIKELYSUBTAGS_H__
+
+#include <utility>
+#include "unicode/utypes.h"
+#include "unicode/bytestrie.h"
+#include "unicode/locid.h"
+#include "unicode/uobject.h"
+#include "unicode/ures.h"
+#include "lsr.h"
+#include "uhash.h"
+
+U_NAMESPACE_BEGIN
+
+struct XLikelySubtagsData;
+
+/**
+ * Map of const char * keys & values.
+ * Stores pointers as is: Does not own/copy/adopt/release strings.
+ */
+class CharStringMap final : public UMemory {
+public:
+ /** Constructs an unusable non-map. */
+ CharStringMap() : map(nullptr) {}
+ CharStringMap(int32_t size, UErrorCode &errorCode) {
+ map = uhash_openSize(uhash_hashChars, uhash_compareChars, uhash_compareChars,
+ size, &errorCode);
+ }
+ CharStringMap(CharStringMap &&other) U_NOEXCEPT : map(other.map) {
+ other.map = nullptr;
+ }
+ CharStringMap(const CharStringMap &other) = delete;
+ ~CharStringMap() {
+ uhash_close(map);
+ }
+
+ CharStringMap &operator=(CharStringMap &&other) U_NOEXCEPT {
+ map = other.map;
+ other.map = nullptr;
+ return *this;
+ }
+ CharStringMap &operator=(const CharStringMap &other) = delete;
+
+ const char *get(const char *key) const { return static_cast<const char *>(uhash_get(map, key)); }
+ void put(const char *key, const char *value, UErrorCode &errorCode) {
+ uhash_put(map, const_cast<char *>(key), const_cast<char *>(value), &errorCode);
+ }
+
+private:
+ UHashtable *map;
+};
+
+struct LocaleDistanceData {
+ LocaleDistanceData() = default;
+ LocaleDistanceData(LocaleDistanceData &&data);
+ ~LocaleDistanceData();
+
+ const uint8_t *distanceTrieBytes = nullptr;
+ const uint8_t *regionToPartitions = nullptr;
+ const char **partitions = nullptr;
+ const LSR *paradigms = nullptr;
+ int32_t paradigmsLength = 0;
+ const int32_t *distances = nullptr;
+
+private:
+ LocaleDistanceData &operator=(const LocaleDistanceData &) = delete;
+};
+
+// TODO(ICU-20777): Rename to just LikelySubtags.
+class XLikelySubtags final : public UMemory {
+public:
+ ~XLikelySubtags();
+
+ static constexpr int32_t SKIP_SCRIPT = 1;
+
+ // VisibleForTesting
+ static const XLikelySubtags *getSingleton(UErrorCode &errorCode);
+
+ // VisibleForTesting
+ LSR makeMaximizedLsrFrom(const Locale &locale, UErrorCode &errorCode) const;
+
+ // TODO(ICU-20777): Switch Locale/uloc_ likely-subtags API from the old code
+ // in loclikely.cpp to this new code, including activating this
+ // minimizeSubtags() function. The LocaleMatcher does not minimize.
+#if 0
+ LSR minimizeSubtags(const char *languageIn, const char *scriptIn, const char *regionIn,
+ ULocale.Minimize fieldToFavor, UErrorCode &errorCode) const;
+#endif
+
+ // visible for LocaleDistance
+ const LocaleDistanceData &getDistanceData() const { return distanceData; }
+
+private:
+ XLikelySubtags(XLikelySubtagsData &data);
+ XLikelySubtags(const XLikelySubtags &other) = delete;
+ XLikelySubtags &operator=(const XLikelySubtags &other) = delete;
+
+ static void initLikelySubtags(UErrorCode &errorCode);
+
+ LSR makeMaximizedLsr(const char *language, const char *script, const char *region,
+ const char *variant, UErrorCode &errorCode) const;
+
+ /**
+ * Raw access to addLikelySubtags. Input must be in canonical format, eg "en", not "eng" or "EN".
+ */
+ LSR maximize(const char *language, const char *script, const char *region) const;
+
+ static int32_t trieNext(BytesTrie &iter, const char *s, int32_t i);
+
+ UResourceBundle *langInfoBundle;
+ // We could store the strings by value, except that if there were few enough strings,
+ // moving the contents could copy it to a different array,
+ // invalidating the pointers stored in the maps.
+ CharString *strings;
+ CharStringMap languageAliases;
+ CharStringMap regionAliases;
+
+ // The trie maps each lang+script+region (encoded in ASCII) to an index into lsrs.
+ // There is also a trie value for each intermediate lang and lang+script.
+ // '*' is used instead of "und", "Zzzz"/"" and "ZZ"/"".
+ BytesTrie trie;
+ uint64_t trieUndState;
+ uint64_t trieUndZzzzState;
+ int32_t defaultLsrIndex;
+ uint64_t trieFirstLetterStates[26];
+ const LSR *lsrs;
+#if U_DEBUG
+ int32_t lsrsLength;
+#endif
+
+ // distance/matcher data: see comment in XLikelySubtagsData::load()
+ LocaleDistanceData distanceData;
+};
+
+U_NAMESPACE_END
+
+#endif // __LOCLIKELYSUBTAGS_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/locmap.cpp b/Build/source/libs/icu/icu-src/source/common/locmap.cpp
index 6d62d8310c0..a6311343551 100644
--- a/Build/source/libs/icu/icu-src/source/common/locmap.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/locmap.cpp
@@ -32,18 +32,9 @@
#include "cmemory.h"
#include "unicode/uloc.h"
-#if U_PLATFORM == U_PF_WINDOWS && defined(_MSC_VER) && (_MSC_VER >= 1500)
-/*
- * TODO: It seems like we should widen this to
- * either U_PLATFORM_USES_ONLY_WIN32_API (includes MinGW)
- * or U_PLATFORM_HAS_WIN32_API (includes MinGW and Cygwin)
- * but those use gcc and won't have defined(_MSC_VER).
- * We might need to #include some Windows header and test for some version macro from there.
- * Or call some Windows function and see what it returns.
- */
-#define USE_WINDOWS_LCID_MAPPING_API
+#if U_PLATFORM_HAS_WIN32_API && UCONFIG_USE_WINDOWS_LCID_MAPPING_API
#include <windows.h>
-#include <winnls.h>
+#include <winnls.h> // LCIDToLocaleName and LocaleNameToLCID
#endif
/*
@@ -973,7 +964,7 @@ idCmp(const char* id1, const char* id2)
/**
* Searches for a Windows LCID
*
- * @param posixid the Posix style locale id.
+ * @param posixID the Posix style locale id.
* @param status gets set to U_ILLEGAL_ARGUMENT_ERROR when the Posix ID has
* no equivalent Windows LCID.
* @return the LCID
@@ -1035,7 +1026,7 @@ getPosixID(const ILcidPosixMap *this_0, uint32_t hostID)
//
/////////////////////////////////////
*/
-#ifdef USE_WINDOWS_LCID_MAPPING_API
+#if U_PLATFORM_HAS_WIN32_API && UCONFIG_USE_WINDOWS_LCID_MAPPING_API
/*
* Various language tags needs to be changed:
* quz -> qu
@@ -1053,6 +1044,7 @@ getPosixID(const ILcidPosixMap *this_0, uint32_t hostID)
}
#endif
+
U_CAPI int32_t
uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UErrorCode* status)
{
@@ -1061,8 +1053,10 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr
UBool bLookup = TRUE;
const char *pPosixID = NULL;
-#ifdef USE_WINDOWS_LCID_MAPPING_API
- char locName[LOCALE_NAME_MAX_LENGTH] = {}; // ICU name can't be longer than Windows name
+#if U_PLATFORM_HAS_WIN32_API && UCONFIG_USE_WINDOWS_LCID_MAPPING_API
+ static_assert(ULOC_FULLNAME_CAPACITY > LOCALE_NAME_MAX_LENGTH, "Windows locale names have smaller length than ICU locale names.");
+
+ char locName[LOCALE_NAME_MAX_LENGTH] = {};
// Note: Windows primary lang ID 0x92 in LCID is used for Central Kurdish and
// GetLocaleInfo() maps such LCID to "ku". However, CLDR uses "ku" for
@@ -1070,7 +1064,7 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr
// use the Windows API to resolve locale ID for this specific case.
if ((hostid & 0x3FF) != 0x92) {
int32_t tmpLen = 0;
- UChar windowsLocaleName[LOCALE_NAME_MAX_LENGTH]; // ULOC_FULLNAME_CAPACITY > LOCALE_NAME_MAX_LENGTH
+ char16_t windowsLocaleName[LOCALE_NAME_MAX_LENGTH] = {};
// Note: LOCALE_ALLOW_NEUTRAL_NAMES was enabled in Windows7+, prior versions did not handle neutral (no-region) locale names.
tmpLen = LCIDToLocaleName(hostid, (PWSTR)windowsLocaleName, UPRV_LENGTHOF(windowsLocaleName), LOCALE_ALLOW_NEUTRAL_NAMES);
@@ -1110,7 +1104,7 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr
pPosixID = locName;
}
}
-#endif // USE_WINDOWS_LCID_MAPPING_API
+#endif
if (bLookup) {
const char *pCandidate = NULL;
@@ -1163,20 +1157,15 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr
/////////////////////////////////////
*/
U_CAPI uint32_t
-uprv_convertToLCIDPlatform(const char* localeID)
+uprv_convertToLCIDPlatform(const char* localeID, UErrorCode* status)
{
- // The purpose of this function is to leverage native platform name->lcid
- // conversion functionality when available.
-#ifdef USE_WINDOWS_LCID_MAPPING_API
- DWORD nameLCIDFlags = 0;
- UErrorCode myStatus = U_ZERO_ERROR;
-
- // First check for a Windows name->LCID match, fall through to catch
- // ICU special cases, but Windows may know it already.
-#if LOCALE_ALLOW_NEUTRAL_NAMES
- nameLCIDFlags = LOCALE_ALLOW_NEUTRAL_NAMES;
-#endif /* LOCALE_ALLOW_NEUTRAL_NAMES */
+ if (U_FAILURE(*status)) {
+ return 0;
+ }
+ // The purpose of this function is to leverage the Windows platform name->lcid
+ // conversion functionality when available.
+#if U_PLATFORM_HAS_WIN32_API && UCONFIG_USE_WINDOWS_LCID_MAPPING_API
int32_t len;
char collVal[ULOC_KEYWORDS_CAPACITY] = {};
char baseName[ULOC_FULLNAME_CAPACITY] = {};
@@ -1185,8 +1174,8 @@ uprv_convertToLCIDPlatform(const char* localeID)
// Check any for keywords.
if (uprv_strchr(localeID, '@'))
{
- len = uloc_getKeywordValue(localeID, "collation", collVal, UPRV_LENGTHOF(collVal) - 1, &myStatus);
- if (U_SUCCESS(myStatus) && len > 0)
+ len = uloc_getKeywordValue(localeID, "collation", collVal, UPRV_LENGTHOF(collVal) - 1, status);
+ if (U_SUCCESS(*status) && len > 0)
{
// If it contains the keyword collation, return 0 so that the LCID lookup table will be used.
return 0;
@@ -1194,9 +1183,9 @@ uprv_convertToLCIDPlatform(const char* localeID)
else
{
// If the locale ID contains keywords other than collation, just use the base name.
- len = uloc_getBaseName(localeID, baseName, UPRV_LENGTHOF(baseName) - 1, &myStatus);
+ len = uloc_getBaseName(localeID, baseName, UPRV_LENGTHOF(baseName) - 1, status);
- if (U_SUCCESS(myStatus) && len > 0)
+ if (U_SUCCESS(*status) && len > 0)
{
baseName[len] = 0;
mylocaleID = baseName;
@@ -1206,9 +1195,9 @@ uprv_convertToLCIDPlatform(const char* localeID)
char asciiBCP47Tag[LOCALE_NAME_MAX_LENGTH] = {};
// this will change it from de_DE@collation=phonebook to de-DE-u-co-phonebk form
- (void)uloc_toLanguageTag(mylocaleID, asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &myStatus);
+ (void)uloc_toLanguageTag(mylocaleID, asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, status);
- if (U_SUCCESS(myStatus))
+ if (U_SUCCESS(*status))
{
// Need it to be UTF-16, not 8-bit
wchar_t bcp47Tag[LOCALE_NAME_MAX_LENGTH] = {};
@@ -1230,7 +1219,7 @@ uprv_convertToLCIDPlatform(const char* localeID)
{
// Ensure it's null terminated
bcp47Tag[i] = L'\0';
- LCID lcid = LocaleNameToLCID(bcp47Tag, nameLCIDFlags);
+ LCID lcid = LocaleNameToLCID(bcp47Tag, LOCALE_ALLOW_NEUTRAL_NAMES);
if (lcid > 0)
{
// Found LCID from windows, return that one, unless its completely ambiguous
@@ -1244,10 +1233,10 @@ uprv_convertToLCIDPlatform(const char* localeID)
}
}
#else
- (void)localeID; // Suppress unused variable warning.
-#endif /* USE_WINDOWS_LCID_MAPPING_API */
+ (void) localeID; // Suppress unused variable warning.
+#endif
- // No found, or not implemented on platforms without native name->lcid conversion
+ // Nothing found, or not implemented.
return 0;
}
diff --git a/Build/source/libs/icu/icu-src/source/common/locmap.h b/Build/source/libs/icu/icu-src/source/common/locmap.h
index bef62956e64..e669873a143 100644
--- a/Build/source/libs/icu/icu-src/source/common/locmap.h
+++ b/Build/source/libs/icu/icu-src/source/common/locmap.h
@@ -33,8 +33,8 @@
U_CAPI int32_t uprv_convertToPosix(uint32_t hostid, char* posixID, int32_t posixIDCapacity, UErrorCode* status);
/* Don't call these functions directly. Use uloc_getLCID instead. */
-U_CAPI uint32_t uprv_convertToLCIDPlatform(const char *localeID); // Leverage platform conversion if possible
-U_CAPI uint32_t uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status);
+U_CAPI uint32_t uprv_convertToLCIDPlatform(const char* localeID, UErrorCode* status); // Leverage platform conversion if possible
+U_CAPI uint32_t uprv_convertToLCID(const char* langID, const char* posixID, UErrorCode* status);
#endif /* LOCMAP_H */
diff --git a/Build/source/libs/icu/icu-src/source/common/locresdata.cpp b/Build/source/libs/icu/icu-src/source/common/locresdata.cpp
index 258b707334e..d1d9a4729f1 100644
--- a/Build/source/libs/icu/icu-src/source/common/locresdata.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/locresdata.cpp
@@ -49,7 +49,6 @@ uloc_getTableStringWithFallback(const char *path, const char *locale,
UErrorCode *pErrorCode)
{
/* char localeBuffer[ULOC_FULLNAME_CAPACITY*4];*/
- UResourceBundle *rb=NULL, table, subTable;
const UChar *item=NULL;
UErrorCode errorCode;
char explicitFallbackName[ULOC_FULLNAME_CAPACITY] = {0};
@@ -59,7 +58,7 @@ uloc_getTableStringWithFallback(const char *path, const char *locale,
* this falls back through the locale's chain to root
*/
errorCode=U_ZERO_ERROR;
- rb=ures_open(path, locale, &errorCode);
+ icu::LocalUResourceBundlePointer rb(ures_open(path, locale, &errorCode));
if(U_FAILURE(errorCode)) {
/* total failure, not even root could be opened */
@@ -73,24 +72,24 @@ uloc_getTableStringWithFallback(const char *path, const char *locale,
}
for(;;){
- ures_initStackObject(&table);
- ures_initStackObject(&subTable);
- ures_getByKeyWithFallback(rb, tableKey, &table, &errorCode);
+ icu::StackUResourceBundle table;
+ icu::StackUResourceBundle subTable;
+ ures_getByKeyWithFallback(rb.getAlias(), tableKey, table.getAlias(), &errorCode);
if (subTableKey != NULL) {
/*
- ures_getByKeyWithFallback(&table,subTableKey, &subTable, &errorCode);
- item = ures_getStringByKeyWithFallback(&subTable, itemKey, pLength, &errorCode);
+ ures_getByKeyWithFallback(table.getAlias(), subTableKey, subTable.getAlias(), &errorCode);
+ item = ures_getStringByKeyWithFallback(subTable.getAlias(), itemKey, pLength, &errorCode);
if(U_FAILURE(errorCode)){
*pErrorCode = errorCode;
}
break;*/
- ures_getByKeyWithFallback(&table,subTableKey, &table, &errorCode);
+ ures_getByKeyWithFallback(table.getAlias(), subTableKey, table.getAlias(), &errorCode);
}
if(U_SUCCESS(errorCode)){
- item = ures_getStringByKeyWithFallback(&table, itemKey, pLength, &errorCode);
+ item = ures_getStringByKeyWithFallback(table.getAlias(), itemKey, pLength, &errorCode);
if(U_FAILURE(errorCode)){
const char* replacement = NULL;
*pErrorCode = errorCode; /*save the errorCode*/
@@ -103,7 +102,7 @@ uloc_getTableStringWithFallback(const char *path, const char *locale,
}
/*pointer comparison is ok since uloc_getCurrentCountryID & uloc_getCurrentLanguageID return the key itself is replacement is not found*/
if(replacement!=NULL && itemKey != replacement){
- item = ures_getStringByKeyWithFallback(&table, replacement, pLength, &errorCode);
+ item = ures_getStringByKeyWithFallback(table.getAlias(), replacement, pLength, &errorCode);
if(U_SUCCESS(errorCode)){
*pErrorCode = errorCode;
break;
@@ -122,7 +121,7 @@ uloc_getTableStringWithFallback(const char *path, const char *locale,
*pErrorCode = errorCode;
errorCode = U_ZERO_ERROR;
- fallbackLocale = ures_getStringByKeyWithFallback(&table, "Fallback", &len, &errorCode);
+ fallbackLocale = ures_getStringByKeyWithFallback(table.getAlias(), "Fallback", &len, &errorCode);
if(U_FAILURE(errorCode)){
*pErrorCode = errorCode;
break;
@@ -135,8 +134,7 @@ uloc_getTableStringWithFallback(const char *path, const char *locale,
*pErrorCode = U_INTERNAL_PROGRAM_ERROR;
break;
}
- ures_close(rb);
- rb = ures_open(path, explicitFallbackName, &errorCode);
+ rb.adoptInstead(ures_open(path, explicitFallbackName, &errorCode));
if(U_FAILURE(errorCode)){
*pErrorCode = errorCode;
break;
@@ -146,10 +144,7 @@ uloc_getTableStringWithFallback(const char *path, const char *locale,
break;
}
}
- /* done with the locale string - ready to close table and rb */
- ures_close(&subTable);
- ures_close(&table);
- ures_close(rb);
+
return item;
}
diff --git a/Build/source/libs/icu/icu-src/source/common/locutil.cpp b/Build/source/libs/icu/icu-src/source/common/locutil.cpp
index 5f0bd520e37..3d9d69ff7ed 100644
--- a/Build/source/libs/icu/icu-src/source/common/locutil.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/locutil.cpp
@@ -11,6 +11,7 @@
#if !UCONFIG_NO_SERVICE || !UCONFIG_NO_TRANSLITERATION
#include "unicode/resbund.h"
+#include "unicode/uenum.h"
#include "cmemory.h"
#include "ustrfmt.h"
#include "locutil.h"
@@ -229,15 +230,14 @@ LocaleUtility::getAvailableLocaleNames(const UnicodeString& bundleID)
CharString cbundleID;
cbundleID.appendInvariantChars(bundleID, status);
const char* path = cbundleID.isEmpty() ? NULL : cbundleID.data();
- UEnumeration *uenum = ures_openAvailableLocales(path, &status);
+ icu::LocalUEnumerationPointer uenum(ures_openAvailableLocales(path, &status));
for (;;) {
- const UChar* id = uenum_unext(uenum, NULL, &status);
+ const UChar* id = uenum_unext(uenum.getAlias(), NULL, &status);
if (id == NULL) {
break;
}
htp->put(UnicodeString(id), (void*)htp, status);
}
- uenum_close(uenum);
if (U_FAILURE(status)) {
delete htp;
return NULL;
diff --git a/Build/source/libs/icu/icu-src/source/common/lsr.cpp b/Build/source/libs/icu/icu-src/source/common/lsr.cpp
new file mode 100644
index 00000000000..0c28eeda1bc
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/common/lsr.cpp
@@ -0,0 +1,101 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+
+// lsr.cpp
+// created: 2019may08 Markus W. Scherer
+
+#include "unicode/utypes.h"
+#include "charstr.h"
+#include "cmemory.h"
+#include "cstring.h"
+#include "lsr.h"
+#include "uinvchar.h"
+#include "ustr_imp.h"
+
+U_NAMESPACE_BEGIN
+
+LSR::LSR(char prefix, const char *lang, const char *scr, const char *r, UErrorCode &errorCode) :
+ language(nullptr), script(nullptr), region(r),
+ regionIndex(indexForRegion(region)) {
+ if (U_SUCCESS(errorCode)) {
+ CharString langScript;
+ langScript.append(prefix, errorCode).append(lang, errorCode).append('\0', errorCode);
+ int32_t scriptOffset = langScript.length();
+ langScript.append(prefix, errorCode).append(scr, errorCode);
+ owned = langScript.cloneData(errorCode);
+ if (U_SUCCESS(errorCode)) {
+ language = owned;
+ script = owned + scriptOffset;
+ }
+ }
+}
+
+LSR::LSR(LSR &&other) U_NOEXCEPT :
+ language(other.language), script(other.script), region(other.region), owned(other.owned),
+ regionIndex(other.regionIndex), hashCode(other.hashCode) {
+ if (owned != nullptr) {
+ other.language = other.script = "";
+ other.owned = nullptr;
+ other.hashCode = 0;
+ }
+}
+
+void LSR::deleteOwned() {
+ uprv_free(owned);
+}
+
+LSR &LSR::operator=(LSR &&other) U_NOEXCEPT {
+ this->~LSR();
+ language = other.language;
+ script = other.script;
+ region = other.region;
+ regionIndex = other.regionIndex;
+ owned = other.owned;
+ hashCode = other.hashCode;
+ if (owned != nullptr) {
+ other.language = other.script = "";
+ other.owned = nullptr;
+ other.hashCode = 0;
+ }
+ return *this;
+}
+
+UBool LSR::operator==(const LSR &other) const {
+ return
+ uprv_strcmp(language, other.language) == 0 &&
+ uprv_strcmp(script, other.script) == 0 &&
+ regionIndex == other.regionIndex &&
+ // Compare regions if both are ill-formed (and their indexes are 0).
+ (regionIndex > 0 || uprv_strcmp(region, other.region) == 0);
+}
+
+int32_t LSR::indexForRegion(const char *region) {
+ int32_t c = region[0];
+ int32_t a = c - '0';
+ if (0 <= a && a <= 9) { // digits: "419"
+ int32_t b = region[1] - '0';
+ if (b < 0 || 9 < b) { return 0; }
+ c = region[2] - '0';
+ if (c < 0 || 9 < c || region[3] != 0) { return 0; }
+ return (10 * a + b) * 10 + c + 1;
+ } else { // letters: "DE"
+ a = uprv_upperOrdinal(c);
+ if (a < 0 || 25 < a) { return 0; }
+ int32_t b = uprv_upperOrdinal(region[1]);
+ if (b < 0 || 25 < b || region[2] != 0) { return 0; }
+ return 26 * a + b + 1001;
+ }
+ return 0;
+}
+
+LSR &LSR::setHashCode() {
+ if (hashCode == 0) {
+ hashCode =
+ (ustr_hashCharsN(language, static_cast<int32_t>(uprv_strlen(language))) * 37 +
+ ustr_hashCharsN(script, static_cast<int32_t>(uprv_strlen(script)))) * 37 +
+ regionIndex;
+ }
+ return *this;
+}
+
+U_NAMESPACE_END
diff --git a/Build/source/libs/icu/icu-src/source/common/lsr.h b/Build/source/libs/icu/icu-src/source/common/lsr.h
new file mode 100644
index 00000000000..db6cf938f47
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/common/lsr.h
@@ -0,0 +1,72 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+
+// lsr.h
+// created: 2019may08 Markus W. Scherer
+
+#ifndef __LSR_H__
+#define __LSR_H__
+
+#include "unicode/utypes.h"
+#include "unicode/uobject.h"
+#include "cstring.h"
+
+U_NAMESPACE_BEGIN
+
+struct LSR final : public UMemory {
+ static constexpr int32_t REGION_INDEX_LIMIT = 1001 + 26 * 26;
+
+ const char *language;
+ const char *script;
+ const char *region;
+ char *owned = nullptr;
+ /** Index for region, 0 if ill-formed. @see indexForRegion */
+ int32_t regionIndex = 0;
+ /** Only set for LSRs that will be used in a hash table. */
+ int32_t hashCode = 0;
+
+ LSR() : language("und"), script(""), region("") {}
+
+ /** Constructor which aliases all subtag pointers. */
+ LSR(const char *lang, const char *scr, const char *r) :
+ language(lang), script(scr), region(r),
+ regionIndex(indexForRegion(region)) {}
+ /**
+ * Constructor which prepends the prefix to the language and script,
+ * copies those into owned memory, and aliases the region.
+ */
+ LSR(char prefix, const char *lang, const char *scr, const char *r, UErrorCode &errorCode);
+ LSR(LSR &&other) U_NOEXCEPT;
+ LSR(const LSR &other) = delete;
+ inline ~LSR() {
+ // Pure inline code for almost all instances.
+ if (owned != nullptr) {
+ deleteOwned();
+ }
+ }
+
+ LSR &operator=(LSR &&other) U_NOEXCEPT;
+ LSR &operator=(const LSR &other) = delete;
+
+ /**
+ * Returns a positive index (>0) for a well-formed region code.
+ * Do not rely on a particular region->index mapping; it may change.
+ * Returns 0 for ill-formed strings.
+ */
+ static int32_t indexForRegion(const char *region);
+
+ UBool operator==(const LSR &other) const;
+
+ inline UBool operator!=(const LSR &other) const {
+ return !operator==(other);
+ }
+
+ LSR &setHashCode();
+
+private:
+ void deleteOwned();
+};
+
+U_NAMESPACE_END
+
+#endif // __LSR_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/mutex.h b/Build/source/libs/icu/icu-src/source/common/mutex.h
index 47f5e080f82..44b1f90ba04 100644
--- a/Build/source/libs/icu/icu-src/source/common/mutex.h
+++ b/Build/source/libs/icu/icu-src/source/common/mutex.h
@@ -28,50 +28,48 @@
U_NAMESPACE_BEGIN
-//----------------------------------------------------------------------------
-// Code within that accesses shared static or global data should
-// should instantiate a Mutex object while doing so. You should make your own
-// private mutex where possible.
-
-// For example:
-//
-// UMutex myMutex = U_MUTEX_INITIALIZER;
-//
-// void Function(int arg1, int arg2)
-// {
-// static Object* foo; // Shared read-write object
-// Mutex mutex(&myMutex); // or no args for the global lock
-// foo->Method();
-// // When 'mutex' goes out of scope and gets destroyed here, the lock is released
-// }
-//
-// Note: Do NOT use the form 'Mutex mutex();' as that merely forward-declares a function
-// returning a Mutex. This is a common mistake which silently slips through the
-// compiler!!
-//
+/**
+ * Mutex is a helper class for convenient locking and unlocking of a UMutex.
+ *
+ * Creating a local scope Mutex will lock a UMutex, holding the lock until the Mutex
+ * goes out of scope.
+ *
+ * If no UMutex is specified, the ICU global mutex is implied.
+ *
+ * For example:
+ *
+ * static UMutex myMutex;
+ *
+ * void Function(int arg1, int arg2)
+ * {
+ * static Object* foo; // Shared read-write object
+ * Mutex mutex(&myMutex); // or no args for the global lock
+ * foo->Method();
+ * // When 'mutex' goes out of scope and gets destroyed here, the lock is released
+ * }
+ *
+ * Note: Do NOT use the form 'Mutex mutex();' as that merely forward-declares a function
+ * returning a Mutex. This is a common mistake which silently slips through the
+ * compiler!!
+ */
class U_COMMON_API Mutex : public UMemory {
public:
- inline Mutex(UMutex *mutex = NULL);
- inline ~Mutex();
+ Mutex(UMutex *mutex = nullptr) : fMutex(mutex) {
+ umtx_lock(fMutex);
+ }
+ ~Mutex() {
+ umtx_unlock(fMutex);
+ }
-private:
- UMutex *fMutex;
+ Mutex(const Mutex &other) = delete; // forbid assigning of this class
+ Mutex &operator=(const Mutex &other) = delete; // forbid copying of this class
+ void *operator new(size_t s) = delete; // forbid heap allocation. Locals only.
- Mutex(const Mutex &other); // forbid copying of this class
- Mutex &operator=(const Mutex &other); // forbid copying of this class
+private:
+ UMutex *fMutex;
};
-inline Mutex::Mutex(UMutex *mutex)
- : fMutex(mutex)
-{
- umtx_lock(fMutex);
-}
-
-inline Mutex::~Mutex()
-{
- umtx_unlock(fMutex);
-}
U_NAMESPACE_END
diff --git a/Build/source/libs/icu/icu-src/source/common/norm2_nfc_data.h b/Build/source/libs/icu/icu-src/source/common/norm2_nfc_data.h
index 82a68097385..c04bdac5ead 100644
--- a/Build/source/libs/icu/icu-src/source/common/norm2_nfc_data.h
+++ b/Build/source/libs/icu/icu-src/source/common/norm2_nfc_data.h
@@ -12,27 +12,27 @@
#ifdef INCLUDED_FROM_NORMALIZER2_CPP
static const UVersionInfo norm2_nfc_data_formatVersion={4,0,0,0};
-static const UVersionInfo norm2_nfc_data_dataVersion={0xb,0,0,0};
+static const UVersionInfo norm2_nfc_data_dataVersion={0xc,1,0,0};
static const int32_t norm2_nfc_data_indexes[Normalizer2Impl::IX_COUNT]={
-0x50,0x4ab0,0x8708,0x8808,0x8808,0x8808,0x8808,0x8808,0xc0,0x300,0xadc,0x29d0,0x3c56,0xfc00,0x1282,0x3b8c,
+0x50,0x4ae0,0x8738,0x8838,0x8838,0x8838,0x8838,0x8838,0xc0,0x300,0xadc,0x29d0,0x3c56,0xfc00,0x1282,0x3b8c,
0x3c24,0x3c56,0x300,0
};
-static const uint16_t norm2_nfc_data_trieIndex[1690]={
+static const uint16_t norm2_nfc_data_trieIndex[1712]={
0,0x40,0x7b,0xbb,0xfb,0x13a,0x17a,0x1b2,0x1f2,0x226,0x254,0x226,0x294,0x2d4,0x313,0x353,
0x393,0x3d2,0x40f,0x44e,0x226,0x226,0x488,0x4c8,0x4f8,0x530,0x226,0x570,0x59f,0x5de,0x226,0x5f3,
0x631,0x65f,0x226,0x68c,0x6cc,0x709,0x729,0x768,0x7a7,0x7e4,0x803,0x840,0x729,0x879,0x8a7,0x8e6,
-0x226,0x920,0x937,0x977,0x98e,0x9cd,0x226,0xa03,0xa23,0xa5e,0xa6a,0xaa4,0xacc,0xb09,0xb49,0xb83,
-0xb9e,0x226,0xbd9,0x226,0xc19,0xc38,0xc6e,0xcab,0x226,0x226,0x226,0x226,0x226,0xcce,0x226,0x226,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xcfa,0x226,0x226,0xd2f,
-0x226,0x226,0xd4d,0x226,0xd77,0x226,0x226,0x226,0xdb3,0xdd3,0xe13,0x226,0xe51,0xe91,0xec5,0xef1,
-0x808,0x226,0x226,0xf25,0x226,0x226,0x226,0xf65,0xfa5,0xfe5,0x1025,0x1065,0x10a5,0x10e5,0x1125,0x1165,
-0x11a5,0x226,0x226,0x11d5,0x1206,0x226,0x1236,0x1269,0x12a6,0x12e5,0x1325,0x135b,0x1389,0x226,0x226,0x226,
+0x226,0x920,0x937,0x977,0x98e,0x9cd,0x226,0xa03,0xa23,0xa5e,0xa6a,0xaa5,0xacd,0xb0a,0xb4a,0xb84,
+0xb9f,0x226,0xbda,0x226,0xc1a,0xc39,0xc6f,0xcac,0x226,0x226,0x226,0x226,0x226,0xccf,0x226,0x226,
+0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xcfb,0x226,0x226,0xd30,
+0x226,0x226,0xd4e,0x226,0xd78,0x226,0x226,0x226,0xdb4,0xdd4,0xe14,0x226,0xe52,0xe92,0xec6,0xef2,
+0x808,0x226,0x226,0xf26,0x226,0x226,0x226,0xf66,0xfa6,0xfe6,0x1026,0x1066,0x10a6,0x10e6,0x1126,0x1166,
+0x11a6,0x226,0x226,0x11d6,0x1207,0x226,0x1237,0x126a,0x12a7,0x12e6,0x1326,0x135c,0x138a,0x226,0x226,0x226,
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x13b4,0x226,0x226,0x226,0x226,
-0x226,0x226,0x226,0xcbc,0x226,0x13d1,0x226,0x1411,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
-0x1451,0x148b,0x14c9,0x1509,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
+0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x13b5,0x226,0x226,0x226,0x226,
+0x226,0x226,0x226,0xcbd,0x226,0x13d2,0x226,0x1412,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
+0x1452,0x148c,0x14ca,0x150a,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
@@ -61,20 +61,20 @@ static const uint16_t norm2_nfc_data_trieIndex[1690]={
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1548,0x1586,0x15a6,0x226,0x226,0x226,0x226,
-0x15e0,0x226,0x226,0x161c,0x164e,0x167c,0x80c,0x168f,0x226,0x226,0x169f,0x16df,0x226,0x226,0x226,0x13e3,
-0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,
-0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,
-0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,
-0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,
-0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,
-0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,
-0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,
-0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,
-0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,
-0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,
-0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x176b,0x226,
-0x17ab,0x17e6,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
+0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1549,0x1587,0x15a7,0x226,0x226,0x226,0x226,
+0x15e1,0x226,0x226,0x161d,0x164f,0x167d,0x80c,0x1690,0x226,0x226,0x16a0,0x16e0,0x226,0x226,0x226,0x13e4,
+0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,
+0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,
+0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,
+0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,
+0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,
+0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,
+0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,
+0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,
+0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,
+0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,
+0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x176c,0x226,
+0x17ac,0x17e7,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
@@ -82,53 +82,54 @@ static const uint16_t norm2_nfc_data_trieIndex[1690]={
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
-0x226,0x226,0x226,0x226,0x1826,0x1866,0x18a6,0x18e6,0x1926,0x1966,0x19a6,0x19e6,0x1a09,0x1a49,0x226,0x226,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1a69,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
-0x61f,0x62e,0x644,0x663,0x678,0x678,0x678,0x67c,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
+0x226,0x226,0x226,0x226,0x1827,0x1867,0x18a7,0x18e7,0x1927,0x1967,0x19a7,0x19e7,0x1a0a,0x1a4a,0x226,0x226,
+0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1a6a,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
+0x635,0x644,0x65a,0x679,0x68e,0x68e,0x68e,0x692,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xbd9,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
+0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xbda,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
0x226,0x226,0x226,0x226,0x226,0x226,0x54f,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x40c,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1a9c,0x226,0x226,0x1aac,0x226,0x226,0x226,0x226,
-0x226,0x226,0x226,0x226,0x226,0x226,0xdc5,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1abc,0x226,0x226,0x226,0x226,0x226,0x226,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ac6,0x54f,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x7eb,0x226,0x226,0x9ba,0x226,0x1ad6,
-0x1ae3,0x1aef,0x226,0x226,0x226,0x226,0x414,0x226,0x1afa,0x1b0a,0x226,0x226,0x226,0x7e0,0x226,0x226,
-0x226,0x226,0x1b1a,0x226,0x226,0x226,0x1b25,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
-0x226,0x1b2c,0x226,0x226,0x226,0x226,0x1b37,0x1b46,0x8f6,0x1b54,0x412,0x226,0x226,0x226,0x226,0x226,
-0x226,0x226,0x226,0x1b62,0x798,0x226,0x226,0x226,0x226,0x226,0x1b72,0x1b81,0x226,0x226,0x226,0x226,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x8d6,0x1b89,0x1b99,0x226,0x226,0x226,0x9ba,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ba3,0x226,0x226,0x226,0x226,0x226,0x226,0x7e6,0x226,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ba0,0x226,0x226,0x226,
+0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1a9d,0x226,0x226,0x1aad,0x226,0x226,0x226,0x226,
+0x226,0x226,0x226,0x226,0x226,0x226,0xdc6,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
+0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1abd,0x226,0x226,0x226,0x226,0x226,0x226,
+0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ac7,0x54f,
+0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x7eb,0x226,0x226,0x9ba,0x226,0x1ad7,
+0x1ae4,0x1af0,0x226,0x226,0x226,0x226,0x414,0x226,0x1afb,0x1b0b,0x226,0x226,0x226,0x7e0,0x226,0x226,
+0x226,0x226,0x1b1b,0x226,0x226,0x226,0x1b26,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
+0x226,0x1b2d,0x226,0x226,0x226,0x226,0x1b38,0x1b47,0x8f6,0x1b55,0x412,0x226,0x226,0x226,0x226,0x226,
+0x226,0x226,0x226,0x1b63,0x798,0x226,0x226,0x226,0x226,0x226,0x1b73,0x1b82,0x226,0x226,0x226,0x226,
+0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x8d6,0x1b8a,0x1b9a,0x226,0x226,0x226,0x9ba,
+0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ba4,0x226,0x226,0x226,0x226,0x226,0x226,0x7e6,0x226,
+0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ba1,0x226,0x226,0x226,
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x7ed,0x7ea,0x226,0x226,0x226,0x226,0x7e8,
+0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x84d,0x226,0x226,0x226,0x7ed,0x7ea,0x226,0x226,0x226,
+0x226,0x7e8,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
+0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x9ba,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
+0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xbd4,0x226,0x226,0x226,0x226,0x7ea,0x226,
+0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1bb4,0x226,
+0x226,0x226,0xebf,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1bb9,
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
-0x226,0x226,0x226,0x226,0x226,0x226,0x9ba,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xbd3,0x226,0x226,0x226,0x226,0x7ea,0x226,0x226,0x226,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1bb3,0x226,0x226,0x226,
-0xebe,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1bb8,0x226,0x226,
+0x226,0x226,0x226,0x226,0x226,0x226,0x1bc8,0x1bd8,0x1be6,0x1bf3,0x226,0x1bff,0x1c0d,0x1c1d,0x226,0x226,
+0x226,0x226,0xcea,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
+0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c2d,0x1c35,
+0x1c43,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
+0x226,0xebf,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
+0x4fc,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
+0x226,0x226,0x1c53,0x226,0x226,0x226,0x226,0x226,0x226,0x1c5f,0x226,0x226,0x226,0x226,0x226,0x226,
+0x226,0x226,0x226,0x226,0x226,0x1c6f,0x1c7f,0x1c8f,0x1c9f,0x1caf,0x1cbf,0x1ccf,0x1cdf,0x1cef,0x1cff,0x1d0f,
+0x1d1f,0x1d2f,0x1d3f,0x1d4f,0x1d5f,0x1d6f,0x1d7f,0x1d8f,0x1d9f,0x1daf,0x1dbf,0x1dcf,0x1ddf,0x1def,0x1dff,0x1e0f,
+0x1e1f,0x1e2f,0x1e3f,0x1e4f,0x1e5f,0x1e6f,0x1e7f,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
-0x226,0x226,0x226,0x226,0x1bc7,0x1bd7,0x1be5,0x1bf2,0x226,0x1bfe,0x1c0c,0x1c1c,0x226,0x226,0x226,0x226,
-0xce9,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c2c,0x1c34,0x1c42,0x226,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c52,0x226,0x226,0x226,
-0x226,0x226,0x226,0x1c5e,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c6e,
-0x1c7e,0x1c8e,0x1c9e,0x1cae,0x1cbe,0x1cce,0x1cde,0x1cee,0x1cfe,0x1d0e,0x1d1e,0x1d2e,0x1d3e,0x1d4e,0x1d5e,0x1d6e,
-0x1d7e,0x1d8e,0x1d9e,0x1dae,0x1dbe,0x1dce,0x1dde,0x1dee,0x1dfe,0x1e0e,0x1e1e,0x1e2e,0x1e3e,0x1e4e,0x1e5e,0x1e6e,
-0x1e7e,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
-0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x408,
-0x428,0xc4,0xc4,0xc4,0x448,0x457,0x46a,0x486,0x4a3,0x4bf,0x4dc,0x4f9,0x516,0x533,0xc4,0xc4,
-0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,
-0xc4,0xc4,0xc4,0x54d,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,
+0x226,0x226,0x226,0x226,0x226,0x408,0x428,0xc4,0xc4,0xc4,0x448,0x457,0x46a,0x486,0x4a3,0x4bf,
+0x4dc,0x4f9,0x518,0x535,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,
+0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x54f,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,
0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,
-0xc4,0xc4,0x564,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x56f,0x58c,0xc4,0xc4,0xc4,
-0xc4,0xc4,0xc4,0x5ac,0xc4,0xc4,0xc4,0x5bf,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,
+0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x566,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,
+0xc4,0x571,0x58e,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x5ae,0x5c2,0xc4,0xc4,0x5d5,0xc4,0xc4,
0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,
-0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x5df,0x5ff
+0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x5f5,0x615
};
-static const uint16_t norm2_nfc_data_trieData[7822]={
+static const uint16_t norm2_nfc_data_trieData[7824]={
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
@@ -299,331 +300,331 @@ static const uint16_t norm2_nfc_data_trieData[7822]={
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,0xfeec,0xfeec,1,1,1,1,1,1,1,1,0xfef4,0xfef4,0xfef4,0xfef4,
+1,1,0xfeec,0xfeec,0xfe12,1,1,1,1,1,1,1,1,0xfef4,0xfef4,0xfef4,
+0xfef4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1,1,
+1,1,0xffb8,1,0xffb8,1,0xffb0,1,1,1,1,1,1,0x2a4f,1,1,
+1,1,1,1,1,1,1,0x2a55,1,1,1,1,0x2a5b,1,1,1,
+1,0x2a61,1,1,1,1,0x2a67,1,1,1,1,1,1,1,1,1,
+1,1,1,0x2a6d,1,1,1,1,1,1,1,0xff02,0xff04,0x3c40,0xff08,0x3c48,
+0x2a72,1,0x2a78,1,0xff04,0xff04,0xff04,0xff04,1,1,0xff04,0x3c50,0xffcc,0xffcc,0xfe12,1,
+0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,0x2a7f,1,1,
+1,1,1,1,1,1,1,0x2a85,1,1,1,1,0x2a8b,1,1,1,
+1,0x2a91,1,1,1,1,0x2a97,1,1,1,1,1,1,1,1,1,
+1,1,1,0x2a9d,1,1,1,1,1,1,0xffb8,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,0xffb8,1,0xffb8,1,0xffb0,1,1,1,1,1,1,0x2a4f,1,1,1,
-1,1,1,1,1,1,0x2a55,1,1,1,1,0x2a5b,1,1,1,1,
-0x2a61,1,1,1,1,0x2a67,1,1,1,1,1,1,1,1,1,1,
-1,1,0x2a6d,1,1,1,1,1,1,1,0xff02,0xff04,0x3c40,0xff08,0x3c48,0x2a72,
-1,0x2a78,1,0xff04,0xff04,0xff04,0xff04,1,1,0xff04,0x3c50,0xffcc,0xffcc,0xfe12,1,0xffcc,
-0xffcc,1,1,1,1,1,1,1,1,1,1,1,0x2a7f,1,1,1,
-1,1,1,1,1,1,0x2a85,1,1,1,1,0x2a8b,1,1,1,1,
-0x2a91,1,1,1,1,0x2a97,1,1,1,1,1,1,1,1,1,1,
-1,1,0x2a9d,1,1,1,1,1,1,0xffb8,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,0x8c0,0x1a1f,1,1,1,1,1,1,1,0xfc00,1,1,
+1,1,1,1,1,1,0xfe0e,1,0xfe12,0xfe12,1,1,1,1,1,1,
+1,1,1,1,1,1,1,0xffb8,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,0x8c0,0x1a1f,1,1,1,1,1,1,1,0xfc00,1,1,1,
-1,1,1,1,1,0xfe0e,1,0xfe12,0xfe12,1,1,1,1,1,1,1,
-1,1,1,1,1,1,0xffb8,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,
+0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,
-0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,
+0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,
-0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12,1,
+1,1,0xfe12,1,1,1,1,1,1,1,1,1,1,0xffcc,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,0xfe12,1,1,1,1,1,1,1,1,1,1,0xffcc,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,0xffc8,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,0xffc8,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,0xffbc,0xffcc,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-0xffbc,0xffcc,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,
+0xffcc,1,1,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,
-1,1,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,
+0xffcc,0xffb8,1,1,1,1,1,0x8c4,0x1a25,0x8c8,0x1a2b,0x8cc,0x1a31,0x8d0,0x1a37,0x8d4,
+0x1a3d,1,1,0x8d8,0x1a43,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,
-0xffb8,1,1,1,1,1,0x8c4,0x1a25,0x8c8,0x1a2b,0x8cc,0x1a31,0x8d0,0x1a37,0x8d4,0x1a3d,
-1,1,0x8d8,0x1a43,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,0xfe0e,0xfc00,1,1,1,1,0x8dc,0x1a49,0x8e0,0x1a4f,
+0x8e4,0x8e8,0x1a55,0x1a5b,0x8ec,0x1a61,0xfe12,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,0xfe0e,0xfc00,1,1,1,1,0x8dc,0x1a49,0x8e0,0x1a4f,0x8e4,
-0x8e8,0x1a55,0x1a5b,0x8ec,0x1a61,0xfe12,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,0xffcc,
+0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,0xffcc,0xffcc,
-0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12,
-0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+0xfe12,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,0xfe0e,1,1,1,1,1,1,1,1,
-1,1,1,0xfe12,0xfe12,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,0xffcc,0xffcc,0xffcc,1,0xfe02,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,
-0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,1,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,1,1,
-1,1,0xffb8,1,1,1,1,1,1,0xffcc,1,1,1,0xffcc,0xffcc,1,
-1,1,1,1,1,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,
-0xffcc,0xffcc,0xffd4,0xffac,0xffb8,0xff94,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,
+1,1,1,1,1,1,1,1,0xfe0e,1,1,1,1,1,1,1,
+1,1,1,1,0xfe12,0xfe12,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,1,0xfe02,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,
+0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,1,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,1,
+1,1,1,0xffb8,1,1,1,1,1,1,0xffcc,1,1,1,0xffcc,0xffcc,
+1,1,1,1,1,1,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,
+0xffb8,0xffcc,0xffcc,0xffd4,0xffac,0xffb8,0xff94,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,
0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,
-0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffd0,0xffc8,0xffc8,0xffb8,1,
-0xffcc,0xffd2,0xffb8,0xffcc,0xffb8,0x1a66,0x1a6c,0x1a72,0x1a78,0x1a7f,0x1a85,0x1a8b,0x1a91,0x1a99,0x1aa3,0x1aaa,
-0x1ab0,0x1ab6,0x1abc,0x1ac2,0x1ac8,0x1acf,0x1ad5,0x1ada,0x1ae0,0x1ae8,0x1af2,0x1afc,0x1b06,0x1b0e,0x1b14,0x1b1a,
-0x1b20,0x1b29,0x1b33,0x1b3b,0x1b41,0x1b46,0x1b4c,0x1b52,0x1b58,0x1b5e,0x1b64,0x1b6a,0x1b70,0x1b77,0x1b7d,0x1b82,
-0x1b88,0x1b8e,0x1b94,0x1b9c,0x1ba6,0x1bae,0x1bb4,0x1bba,0x1bc0,0x1bc6,0x1bcc,0xdd8,0xde2,0x1bd4,0x1bde,0x1be6,
-0x1bec,0x1bf2,0x1bf8,0x1bfe,0x1c04,0x1c0a,0x1c10,0x1c17,0x1c1d,0x1c22,0x1c28,0x1c2e,0x1c34,0x1c3a,0x1c40,0x1c46,
-0x1c4c,0x1c54,0x1c5e,0x1c68,0x1c72,0x1c7c,0x1c86,0x1c90,0x1c9a,0x1ca3,0x1ca9,0x1caf,0x1cb5,0x1cba,0x1cc0,0xdec,
-0xdf6,0x1cc8,0x1cd2,0x1cda,0x1ce0,0x1ce6,0x1cec,0xe00,0xe0a,0x1cf4,0x1cfe,0x1d08,0x1d12,0x1d1c,0x1d26,0x1d2e,
-0x1d34,0x1d3a,0x1d40,0x1d46,0x1d4c,0x1d52,0x1d58,0x1d5e,0x1d64,0x1d6a,0x1d70,0x1d76,0x1d7c,0x1d84,0x1d8e,0x1d98,
-0x1da2,0x1daa,0x1db0,0x1db7,0x1dbd,0x1dc2,0x1dc8,0x1dce,0x1dd4,0x1dda,0x1de0,0x1de6,0x1dec,0x1df3,0x1df9,0x1dff,
-0x1e05,0x1e0b,0x1e11,0x1e16,0x1e1c,0x1e22,0x1e28,0x1e2f,0x1e35,0x1e3b,0x1e41,0x1e46,0x1e4c,0x1e52,0x1e58,1,
-0x1e5f,1,1,1,1,0xe14,0xe22,0x1e64,0x1e6a,0x1e72,0x1e7c,0x1e86,0x1e90,0x1e9a,0x1ea4,0x1eae,
-0x1eb8,0x1ec2,0x1ecc,0x1ed6,0x1ee0,0x1eea,0x1ef4,0x1efe,0x1f08,0x1f12,0x1f1c,0x1f26,0x1f30,0xe30,0xe3a,0x1f38,
-0x1f3e,0x1f44,0x1f4a,0x1f52,0x1f5c,0x1f66,0x1f70,0x1f7a,0x1f84,0x1f8e,0x1f98,0x1fa2,0x1fac,0x1fb4,0x1fba,0x1fc0,
-0x1fc6,0xe44,0xe4e,0x1fcc,0x1fd2,0x1fda,0x1fe4,0x1fee,0x1ff8,0x2002,0x200c,0x2016,0x2020,0x202a,0x2034,0x203e,
-0x2048,0x2052,0x205c,0x2066,0x2070,0x207a,0x2084,0x208e,0x2098,0x20a0,0x20a6,0x20ac,0x20b2,0x20ba,0x20c4,0x20ce,
-0x20d8,0x20e2,0x20ec,0x20f6,0x2100,0x210a,0x2114,0x211c,0x2122,0x2129,0x212f,0x2134,0x213a,0x2140,0x2146,1,
-1,1,1,1,1,0xe58,0xe6e,0xe86,0xe94,0xea2,0xeb0,0xebe,0xecc,0xed8,0xeee,0xf06,
-0xf14,0xf22,0xf30,0xf3e,0xf4c,0xf58,0xf66,0x214f,0x2159,0x2163,0x216d,1,1,0xf74,0xf82,0x2177,
-0x2181,0x218b,0x2195,1,1,0xf90,0xfa6,0xfbe,0xfcc,0xfda,0xfe8,0xff6,0x1004,0x1010,0x1026,0x103e,
-0x104c,0x105a,0x1068,0x1076,0x1084,0x1090,0x10a2,0x219f,0x21a9,0x21b3,0x21bd,0x21c7,0x21d1,0x10b4,0x10c6,0x21db,
-0x21e5,0x21ef,0x21f9,0x2203,0x220d,0x10d8,0x10e6,0x2217,0x2221,0x222b,0x2235,1,1,0x10f4,0x1102,0x223f,
-0x2249,0x2253,0x225d,1,1,0x1110,0x1122,0x2267,0x2271,0x227b,0x2285,0x228f,0x2299,1,0x1134,1,
-0x22a3,1,0x22ad,1,0x22b7,0x1146,0x115c,0x1174,0x1182,0x1190,0x119e,0x11ac,0x11ba,0x11c6,0x11dc,0x11f4,
-0x1202,0x1210,0x121e,0x122c,0x123a,0x1246,0x3b8e,0x22bf,0x3b96,0x1250,0x3b9e,0x22c5,0x3ba6,0x22cb,0x3bae,0x22d1,
-0x3bb6,0x125a,0x3bbe,1,1,0x22d8,0x22e2,0x22f1,0x2301,0x2311,0x2321,0x2331,0x2341,0x234c,0x2356,0x2365,
-0x2375,0x2385,0x2395,0x23a5,0x23b5,0x23c0,0x23ca,0x23d9,0x23e9,0x23f9,0x2409,0x2419,0x2429,0x2434,0x243e,0x244d,
-0x245d,0x246d,0x247d,0x248d,0x249d,0x24a8,0x24b2,0x24c1,0x24d1,0x24e1,0x24f1,0x2501,0x2511,0x251c,0x2526,0x2535,
-0x2545,0x2555,0x2565,0x2575,0x2585,0x258f,0x2595,0x259d,0x25a4,0x25ad,1,0x1264,0x25b7,0x25bf,0x25c5,0x25cb,
-0x3bc6,0x25d0,1,0x2aa2,0x8f0,1,0x25d7,0x25df,0x25e6,0x25ef,1,0x126e,0x25f9,0x2601,0x3bce,0x2607,
-0x3bd6,0x260c,0x2613,0x2619,0x261f,0x2625,0x262b,0x2633,0x3be0,1,1,0x263b,0x2643,0x264b,0x2651,0x2657,
-0x3bea,1,0x265d,0x2663,0x2669,0x266f,0x2675,0x267d,0x3bf4,0x2685,0x268b,0x2691,0x2699,0x26a1,0x26a7,0x26ad,
-0x3bfe,0x26b3,0x26b9,0x3c06,0x2aa7,1,1,0x26c1,0x26c8,0x26d1,1,0x1278,0x26db,0x26e3,0x3c0e,0x26e9,
-0x3c16,0x26ee,0x2aab,0x8fc,1,0xfa09,0xfa09,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,0xffcc,0xffcc,0xfe02,0xfe02,0xffcc,0xffcc,0xffcc,0xffcc,0xfe02,0xfe02,0xfe02,
-0xffcc,0xffcc,1,1,1,1,0xffcc,1,1,1,0xfe02,0xfe02,0xffcc,0xffb8,0xffcc,0xfe02,
-0xfe02,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,0x2aae,1,1,1,
-0x2ab2,0x3c1e,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,0x908,1,0x90c,1,0x910,1,1,1,1,1,
-0x26f5,0x26fb,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,0x2701,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,0x2707,0x270d,0x2713,0x914,1,0x918,1,0x91c,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,0x920,0x2719,1,1,1,0x924,0x271f,
-1,0x928,0x2725,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,0x92c,0x272b,0x930,0x2731,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,0x934,1,1,1,0x2737,1,0x938,0x273d,0x93c,1,0x2743,0x940,0x2749,1,
-1,1,0x944,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,0x274f,0x948,0x2755,1,0x94c,0x950,1,1,1,1,1,
-1,1,0x275b,0x2761,0x2767,0x276d,0x2773,0x954,0x958,0x2779,0x277f,0x95c,0x960,0x2785,0x278b,0x964,
-0x968,0x96c,0x970,1,1,0x2791,0x2797,0x974,0x978,0x279d,0x27a3,0x97c,0x980,0x27a9,0x27af,1,
-1,1,1,1,1,1,0x984,0x988,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,0x98c,1,1,1,1,1,0x990,0x994,1,
-0x998,0x27b5,0x27bb,0x27c1,0x27c7,1,1,0x99c,0x9a0,0x9a4,0x9a8,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,0x27cd,0x27d3,0x27d9,0x27df,1,
-1,1,1,1,1,0x27e5,0x27eb,0x27f1,0x27f7,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,0x2ab7,0x2abb,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-0x2abf,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffd0,0xffc8,0xffc8,0xffb8,
+1,0xffcc,0xffd2,0xffb8,0xffcc,0xffb8,0x1a66,0x1a6c,0x1a72,0x1a78,0x1a7f,0x1a85,0x1a8b,0x1a91,0x1a99,0x1aa3,
+0x1aaa,0x1ab0,0x1ab6,0x1abc,0x1ac2,0x1ac8,0x1acf,0x1ad5,0x1ada,0x1ae0,0x1ae8,0x1af2,0x1afc,0x1b06,0x1b0e,0x1b14,
+0x1b1a,0x1b20,0x1b29,0x1b33,0x1b3b,0x1b41,0x1b46,0x1b4c,0x1b52,0x1b58,0x1b5e,0x1b64,0x1b6a,0x1b70,0x1b77,0x1b7d,
+0x1b82,0x1b88,0x1b8e,0x1b94,0x1b9c,0x1ba6,0x1bae,0x1bb4,0x1bba,0x1bc0,0x1bc6,0x1bcc,0xdd8,0xde2,0x1bd4,0x1bde,
+0x1be6,0x1bec,0x1bf2,0x1bf8,0x1bfe,0x1c04,0x1c0a,0x1c10,0x1c17,0x1c1d,0x1c22,0x1c28,0x1c2e,0x1c34,0x1c3a,0x1c40,
+0x1c46,0x1c4c,0x1c54,0x1c5e,0x1c68,0x1c72,0x1c7c,0x1c86,0x1c90,0x1c9a,0x1ca3,0x1ca9,0x1caf,0x1cb5,0x1cba,0x1cc0,
+0xdec,0xdf6,0x1cc8,0x1cd2,0x1cda,0x1ce0,0x1ce6,0x1cec,0xe00,0xe0a,0x1cf4,0x1cfe,0x1d08,0x1d12,0x1d1c,0x1d26,
+0x1d2e,0x1d34,0x1d3a,0x1d40,0x1d46,0x1d4c,0x1d52,0x1d58,0x1d5e,0x1d64,0x1d6a,0x1d70,0x1d76,0x1d7c,0x1d84,0x1d8e,
+0x1d98,0x1da2,0x1daa,0x1db0,0x1db7,0x1dbd,0x1dc2,0x1dc8,0x1dce,0x1dd4,0x1dda,0x1de0,0x1de6,0x1dec,0x1df3,0x1df9,
+0x1dff,0x1e05,0x1e0b,0x1e11,0x1e16,0x1e1c,0x1e22,0x1e28,0x1e2f,0x1e35,0x1e3b,0x1e41,0x1e46,0x1e4c,0x1e52,0x1e58,
+1,0x1e5f,1,1,1,1,0xe14,0xe22,0x1e64,0x1e6a,0x1e72,0x1e7c,0x1e86,0x1e90,0x1e9a,0x1ea4,
+0x1eae,0x1eb8,0x1ec2,0x1ecc,0x1ed6,0x1ee0,0x1eea,0x1ef4,0x1efe,0x1f08,0x1f12,0x1f1c,0x1f26,0x1f30,0xe30,0xe3a,
+0x1f38,0x1f3e,0x1f44,0x1f4a,0x1f52,0x1f5c,0x1f66,0x1f70,0x1f7a,0x1f84,0x1f8e,0x1f98,0x1fa2,0x1fac,0x1fb4,0x1fba,
+0x1fc0,0x1fc6,0xe44,0xe4e,0x1fcc,0x1fd2,0x1fda,0x1fe4,0x1fee,0x1ff8,0x2002,0x200c,0x2016,0x2020,0x202a,0x2034,
+0x203e,0x2048,0x2052,0x205c,0x2066,0x2070,0x207a,0x2084,0x208e,0x2098,0x20a0,0x20a6,0x20ac,0x20b2,0x20ba,0x20c4,
+0x20ce,0x20d8,0x20e2,0x20ec,0x20f6,0x2100,0x210a,0x2114,0x211c,0x2122,0x2129,0x212f,0x2134,0x213a,0x2140,0x2146,
+1,1,1,1,1,1,0xe58,0xe6e,0xe86,0xe94,0xea2,0xeb0,0xebe,0xecc,0xed8,0xeee,
+0xf06,0xf14,0xf22,0xf30,0xf3e,0xf4c,0xf58,0xf66,0x214f,0x2159,0x2163,0x216d,1,1,0xf74,0xf82,
+0x2177,0x2181,0x218b,0x2195,1,1,0xf90,0xfa6,0xfbe,0xfcc,0xfda,0xfe8,0xff6,0x1004,0x1010,0x1026,
+0x103e,0x104c,0x105a,0x1068,0x1076,0x1084,0x1090,0x10a2,0x219f,0x21a9,0x21b3,0x21bd,0x21c7,0x21d1,0x10b4,0x10c6,
+0x21db,0x21e5,0x21ef,0x21f9,0x2203,0x220d,0x10d8,0x10e6,0x2217,0x2221,0x222b,0x2235,1,1,0x10f4,0x1102,
+0x223f,0x2249,0x2253,0x225d,1,1,0x1110,0x1122,0x2267,0x2271,0x227b,0x2285,0x228f,0x2299,1,0x1134,
+1,0x22a3,1,0x22ad,1,0x22b7,0x1146,0x115c,0x1174,0x1182,0x1190,0x119e,0x11ac,0x11ba,0x11c6,0x11dc,
+0x11f4,0x1202,0x1210,0x121e,0x122c,0x123a,0x1246,0x3b8e,0x22bf,0x3b96,0x1250,0x3b9e,0x22c5,0x3ba6,0x22cb,0x3bae,
+0x22d1,0x3bb6,0x125a,0x3bbe,1,1,0x22d8,0x22e2,0x22f1,0x2301,0x2311,0x2321,0x2331,0x2341,0x234c,0x2356,
+0x2365,0x2375,0x2385,0x2395,0x23a5,0x23b5,0x23c0,0x23ca,0x23d9,0x23e9,0x23f9,0x2409,0x2419,0x2429,0x2434,0x243e,
+0x244d,0x245d,0x246d,0x247d,0x248d,0x249d,0x24a8,0x24b2,0x24c1,0x24d1,0x24e1,0x24f1,0x2501,0x2511,0x251c,0x2526,
+0x2535,0x2545,0x2555,0x2565,0x2575,0x2585,0x258f,0x2595,0x259d,0x25a4,0x25ad,1,0x1264,0x25b7,0x25bf,0x25c5,
+0x25cb,0x3bc6,0x25d0,1,0x2aa2,0x8f0,1,0x25d7,0x25df,0x25e6,0x25ef,1,0x126e,0x25f9,0x2601,0x3bce,
+0x2607,0x3bd6,0x260c,0x2613,0x2619,0x261f,0x2625,0x262b,0x2633,0x3be0,1,1,0x263b,0x2643,0x264b,0x2651,
+0x2657,0x3bea,1,0x265d,0x2663,0x2669,0x266f,0x2675,0x267d,0x3bf4,0x2685,0x268b,0x2691,0x2699,0x26a1,0x26a7,
+0x26ad,0x3bfe,0x26b3,0x26b9,0x3c06,0x2aa7,1,1,0x26c1,0x26c8,0x26d1,1,0x1278,0x26db,0x26e3,0x3c0e,
+0x26e9,0x3c16,0x26ee,0x2aab,0x8fc,1,0xfa09,0xfa09,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,0xffcc,0xffcc,0xfe02,0xfe02,0xffcc,0xffcc,0xffcc,0xffcc,0xfe02,0xfe02,
+0xfe02,0xffcc,0xffcc,1,1,1,1,0xffcc,1,1,1,0xfe02,0xfe02,0xffcc,0xffb8,0xffcc,
+0xfe02,0xfe02,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,0x2aae,1,1,
+1,0x2ab2,0x3c1e,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,0x908,1,0x90c,1,0x910,1,1,1,1,
+1,0x26f5,0x26fb,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,0x2701,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,0x2707,0x270d,0x2713,0x914,1,0x918,1,0x91c,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,0x920,0x2719,1,1,1,0x924,
+0x271f,1,0x928,0x2725,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,0x92c,0x272b,0x930,0x2731,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,0x934,1,1,1,0x2737,1,0x938,0x273d,0x93c,1,0x2743,0x940,0x2749,
+1,1,1,0x944,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,0x274f,0x948,0x2755,1,0x94c,0x950,1,1,1,1,
+1,1,1,0x275b,0x2761,0x2767,0x276d,0x2773,0x954,0x958,0x2779,0x277f,0x95c,0x960,0x2785,0x278b,
+0x964,0x968,0x96c,0x970,1,1,0x2791,0x2797,0x974,0x978,0x279d,0x27a3,0x97c,0x980,0x27a9,0x27af,
+1,1,1,1,1,1,1,0x984,0x988,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,0x98c,1,1,1,1,1,0x990,0x994,
+1,0x998,0x27b5,0x27bb,0x27c1,0x27c7,1,1,0x99c,0x9a0,0x9a4,0x9a8,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,0x27cd,0x27d3,0x27d9,0x27df,
+1,1,1,1,1,1,0x27e5,0x27eb,0x27f1,0x27f7,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,0x2ab7,0x2abb,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,0x2abf,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,
+0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,
+0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,0xffb4,0xffc8,0xffd0,0xffbc,
+0xffc0,0xffc0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,0x9ac,1,1,1,1,0x9b0,0x27fd,0x9b4,0x2803,0x9b8,0x2809,0x9bc,0x280f,0x9c0,
+0x2815,0x9c4,0x281b,0x9c8,0x2821,0x9cc,0x2827,0x9d0,0x282d,0x9d4,0x2833,0x9d8,0x2839,0x9dc,0x283f,1,
+0x9e0,0x2845,0x9e4,0x284b,0x9e8,0x2851,1,1,1,1,1,0x9ec,0x2857,0x285d,0x9f4,0x2863,
+0x2869,0x9fc,0x286f,0x2875,0xa04,0x287b,0x2881,0xa0c,0x2887,0x288d,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x2893,1,
+1,1,1,0xfc10,0xfc10,1,1,0xa14,0x2899,1,1,1,1,1,1,1,
+0xa18,1,1,1,1,0xa1c,0x289f,0xa20,0x28a5,0xa24,0x28ab,0xa28,0x28b1,0xa2c,0x28b7,0xa30,
+0x28bd,0xa34,0x28c3,0xa38,0x28c9,0xa3c,0x28cf,0xa40,0x28d5,0xa44,0x28db,0xa48,0x28e1,1,0xa4c,0x28e7,
+0xa50,0x28ed,0xa54,0x28f3,1,1,1,1,1,0xa58,0x28f9,0x28ff,0xa60,0x2905,0x290b,0xa68,
+0x2911,0x2917,0xa70,0x291d,0x2923,0xa78,0x2929,0x292f,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,0xa80,0xa84,0xa88,0xa8c,1,0x2935,1,
+1,0x293b,0x2941,0x2947,0x294d,1,1,0xa90,0x2953,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,0xffcc,1,1,1,1,0xffcc,0xffcc,0xffcc,
+0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,
-0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,
-0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,0xffb4,0xffc8,0xffd0,0xffbc,0xffc0,
-0xffc0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,0x9ac,1,1,1,1,0x9b0,0x27fd,0x9b4,0x2803,0x9b8,0x2809,0x9bc,0x280f,0x9c0,0x2815,
-0x9c4,0x281b,0x9c8,0x2821,0x9cc,0x2827,0x9d0,0x282d,0x9d4,0x2833,0x9d8,0x2839,0x9dc,0x283f,1,0x9e0,
-0x2845,0x9e4,0x284b,0x9e8,0x2851,1,1,1,1,1,0x9ec,0x2857,0x285d,0x9f4,0x2863,0x2869,
-0x9fc,0x286f,0x2875,0xa04,0x287b,0x2881,0xa0c,0x2887,0x288d,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,0x2893,1,1,
-1,1,0xfc10,0xfc10,1,1,0xa14,0x2899,1,1,1,1,1,1,1,0xa18,
-1,1,1,1,0xa1c,0x289f,0xa20,0x28a5,0xa24,0x28ab,0xa28,0x28b1,0xa2c,0x28b7,0xa30,0x28bd,
-0xa34,0x28c3,0xa38,0x28c9,0xa3c,0x28cf,0xa40,0x28d5,0xa44,0x28db,0xa48,0x28e1,1,0xa4c,0x28e7,0xa50,
-0x28ed,0xa54,0x28f3,1,1,1,1,1,0xa58,0x28f9,0x28ff,0xa60,0x2905,0x290b,0xa68,0x2911,
-0x2917,0xa70,0x291d,0x2923,0xa78,0x2929,0x292f,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,0xa80,0xa84,0xa88,0xa8c,1,0x2935,1,1,
-0x293b,0x2941,0x2947,0x294d,1,1,0xa90,0x2953,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,0xffcc,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,
-0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,0xffcc,0xffcc,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,
+0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,
-0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,0xffb8,0xffb8,0xffb8,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,0xffb8,0xffb8,0xffb8,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12,
+0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,
-1,0xffcc,0xffcc,0xffb8,1,1,0xffcc,0xffcc,1,1,1,1,1,0xffcc,0xffcc,1,
-0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+0xffcc,1,0xffcc,0xffcc,0xffb8,1,1,0xffcc,0xffcc,1,1,1,1,1,0xffcc,0xffcc,
+1,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,0xadc,
+1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,
+0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,
+0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0xadc,0x1283,0x1283,0x1283,
0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,
-0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0xadc,0x1283,0x1283,0x1283,0x1283,
+0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,
0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,
-0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,
+0x1283,0x1283,0x1283,0x1283,0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,
0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,
-0x1283,0x1283,0x1283,0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,
-0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,0x3c56,1,0x3c56,0x3c56,0x3c56,
-0x3c56,0x3c56,0x3c56,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,0x3c56,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,0x3c56,1,1,1,1,0x3c56,
-1,1,1,0x3c56,1,0x3c56,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,0x3b87,1,0x2ac5,0x2ac9,0x2acd,0x2ad1,0x2ad5,0x2ad9,0x2add,0x2ae1,0x2ae1,0x2ae5,
-0x2ae9,0x2aed,0x2af1,0x2af5,0x2af9,0x2afd,0x2b01,0x2b05,0x2b09,0x2b0d,0x2b11,0x2b15,0x2b19,0x2b1d,0x2b21,0x2b25,
-0x2b29,0x2b2d,0x2b31,0x2b35,0x2b39,0x2b3d,0x2b41,0x2b45,0x2b49,0x2b4d,0x2b51,0x2b55,0x2b59,0x2b5d,0x2b61,0x2b65,
-0x2b69,0x2b6d,0x2b71,0x2b75,0x2b79,0x2b7d,0x2b81,0x2b85,0x2b89,0x2b8d,0x2b91,0x2b95,0x2b99,0x2b9d,0x2ba1,0x2ba5,
-0x2ba9,0x2bad,0x2bb1,0x2bb5,0x2bb9,0x2bbd,0x2bc1,0x2bc5,0x2bc9,0x2bcd,0x2bd1,0x2bd5,0x2bd9,0x2bdd,0x2be1,0x2be5,
-0x2be9,0x2bed,0x2bf1,0x2bf5,0x2bf9,0x2bfd,0x2c01,0x2c05,0x2c09,0x2c0d,0x2c11,0x2c15,0x2c19,0x2c1d,0x2c21,0x2c25,
-0x2c29,0x2c2d,0x2b11,0x2c31,0x2c35,0x2c39,0x2c3d,0x2c41,0x2c45,0x2c49,0x2c4d,0x2c51,0x2c55,0x2c59,0x2c5d,0x2c61,
-0x2c65,0x2c69,0x2c6d,0x2c71,0x2c75,0x2c79,0x2c7d,0x2c81,0x2c85,0x2c89,0x2c8d,0x2c91,0x2c95,0x2c99,0x2c9d,0x2ca1,
-0x2ca5,0x2ca9,0x2cad,0x2cb1,0x2cb5,0x2cb9,0x2cbd,0x2cc1,0x2cc5,0x2cc9,0x2ccd,0x2cd1,0x2cd5,0x2cd9,0x2cdd,0x2ce1,
-0x2ce5,0x2ce9,0x2ced,0x2cf1,0x2cf5,0x2cf9,0x2cfd,0x2d01,0x2d05,0x2d09,0x2d0d,0x2d11,0x2d15,0x2d19,0x2d1d,0x2d21,
-0x2d25,0x2d29,0x2d2d,0x2d31,0x2d35,0x2d39,0x2d3d,0x2c79,0x2d41,0x2d45,0x2d49,0x2d4d,0x2d51,0x2d55,0x2d59,0x2d5d,
-0x2c39,0x2d61,0x2d65,0x2d69,0x2d6d,0x2d71,0x2d75,0x2d79,0x2d7d,0x2d81,0x2d85,0x2d89,0x2d8d,0x2d91,0x2d95,0x2d99,
-0x2d9d,0x2da1,0x2da5,0x2da9,0x2dad,0x2b11,0x2db1,0x2db5,0x2db9,0x2dbd,0x2dc1,0x2dc5,0x2dc9,0x2dcd,0x2dd1,0x2dd5,
-0x2dd9,0x2ddd,0x2de1,0x2de5,0x2de9,0x2ded,0x2df1,0x2df5,0x2df9,0x2dfd,0x2e01,0x2e05,0x2e09,0x2e0d,0x2e11,0x2e15,
-0x2e19,0x2c41,0x2e1d,0x2e21,0x2e25,0x2e29,0x2e2d,0x2e31,0x2e35,0x2e39,0x2e3d,0x2e41,0x2e45,0x2e49,0x2e4d,0x2e51,
-0x2e55,0x2e59,0x2e5d,0x2e61,0x2e65,0x2e69,0x2e6d,0x2e71,0x2e75,0x2e79,0x2e7d,0x2e81,0x2e85,0x2e89,0x2e8d,0x2e91,
-0x2e95,0x2e99,0x2e9d,0x2ea1,0x2ea5,0x2ea9,0x2ead,0x2eb1,0x2eb5,0x2eb9,0x2ebd,0x2ec1,0x2ec5,0x2ec9,0x2ecd,0x2ed1,
-0x2ed5,0x2ed9,0x2edd,0x2ee1,1,1,0x2ee5,1,0x2ee9,1,1,0x2eed,0x2ef1,0x2ef5,0x2ef9,0x2efd,
-0x2f01,0x2f05,0x2f09,0x2f0d,0x2f11,1,0x2f15,1,0x2f19,1,1,0x2f1d,0x2f21,1,1,1,
-0x2f25,0x2f29,0x2f2d,0x2f31,0x2f35,0x2f39,0x2f3d,0x2f41,0x2f45,0x2f49,0x2f4d,0x2f51,0x2f55,0x2f59,0x2f5d,0x2f61,
-0x2f65,0x2f69,0x2f6d,0x2f71,0x2f75,0x2f79,0x2f7d,0x2f81,0x2f85,0x2f89,0x2f8d,0x2f91,0x2f95,0x2f99,0x2f9d,0x2fa1,
-0x2fa5,0x2fa9,0x2fad,0x2fb1,0x2fb5,0x2fb9,0x2fbd,0x2fc1,0x2fc5,0x2fc9,0x2fcd,0x2fd1,0x2fd5,0x2d15,0x2fd9,0x2fdd,
-0x2fe1,0x2fe5,0x2fe9,0x2fed,0x2fed,0x2ff1,0x2ff5,0x2ff9,0x2ffd,0x3001,0x3005,0x3009,0x300d,0x2f1d,0x3011,0x3015,
-0x3019,0x301d,0x3021,0x3027,1,1,0x302b,0x302f,0x3033,0x3037,0x303b,0x303f,0x3043,0x3047,0x2f55,0x304b,
-0x304f,0x3053,0x2ee5,0x3057,0x305b,0x305f,0x3063,0x3067,0x306b,0x306f,0x3073,0x3077,0x307b,0x307f,0x3083,0x2f79,
-0x3087,0x2f7d,0x308b,0x308f,0x3093,0x3097,0x309b,0x2ee9,0x2b65,0x309f,0x30a3,0x30a7,0x2c7d,0x2dd9,0x30ab,0x30af,
-0x2f99,0x30b3,0x2f9d,0x30b7,0x30bb,0x30bf,0x2ef1,0x30c3,0x30c7,0x30cb,0x30cf,0x30d3,0x2ef5,0x30d7,0x30db,0x30df,
-0x30e3,0x30e7,0x30eb,0x2fd5,0x30ef,0x30f3,0x2d15,0x30f7,0x2fe5,0x30fb,0x30ff,0x3103,0x3107,0x310b,0x2ff9,0x310f,
-0x2f19,0x3113,0x2ffd,0x2c31,0x3117,0x3001,0x311b,0x3009,0x311f,0x3123,0x3127,0x312b,0x312f,0x3011,0x2f09,0x3133,
-0x3015,0x3137,0x3019,0x313b,0x2ae1,0x313f,0x3145,0x314b,0x3151,0x3155,0x3159,0x315d,0x3163,0x3169,0x316f,0x3173,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,0x3176,0xfe34,0x317c,1,1,1,1,1,1,1,
-1,1,1,0x3182,0x3188,0x3190,0x319a,0x31a2,0x31a8,0x31ae,0x31b4,0x31ba,0x31c0,0x31c6,0x31cc,0x31d2,
-1,0x31d8,0x31de,0x31e4,0x31ea,0x31f0,1,0x31f6,1,0x31fc,0x3202,1,0x3208,0x320e,1,0x3214,
-0x321a,0x3220,0x3226,0x322c,0x3232,0x3238,0x323e,0x3244,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,
-0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,0xffb8,1,0xffcc,1,1,1,1,
-1,1,1,1,0xffcc,0xfe02,0xffb8,1,1,1,1,0xfe12,1,1,1,1,
-0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,0xffb8,0xffb8,0xffcc,0xffcc,
-0xffcc,0xffb8,0xffcc,0xffb8,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1,0xa94,
-0x2959,0xa9a,0x2963,1,1,1,1,1,0xaa0,1,1,1,1,1,0x296d,1,
-1,1,1,1,1,1,1,1,0xfe12,0xfc0e,1,1,1,1,1,1,
-1,0xfc00,1,1,1,1,1,1,0x2977,0x2981,1,0xaa6,0xaac,0xfe12,0xfe12,1,
-1,1,1,1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,
-1,1,1,1,0xfe0e,1,1,1,1,1,0xfe12,0xfe0e,1,1,1,1,
-1,1,1,1,1,0xfe0e,0xfe12,1,1,1,1,1,1,1,1,1,
-1,1,0xfe0e,0xfe0e,1,0xfc00,1,1,1,1,1,1,1,0xab2,1,1,
-1,0x298b,0x2995,0xfe12,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,
-0xffcc,1,1,1,0xfe12,1,1,1,0xfe0e,1,1,1,1,1,1,1,
-1,1,0xfc00,1,1,1,1,1,1,1,1,0xabe,0xfc00,0x299f,0x29a9,0xfc00,
-0x29b3,1,1,0xfe12,0xfe0e,1,1,1,1,1,1,1,1,1,1,1,
-1,0xad0,0xad6,0x29bd,0x29c7,1,1,1,0xfe12,0xfe0e,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,0xfe12,0xfe0e,1,1,1,1,1,
-1,1,1,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,0xfe02,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,0x324a,0x3254,0x3268,0x3280,0x3298,0x32b0,0x32c8,0xffb0,0xffb0,0xfe02,0xfe02,
-0xfe02,1,1,1,0xffc4,0xffb0,0xffb0,0xffb0,1,1,1,1,1,1,1,1,
-0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,1,1,
-1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,
-1,1,1,1,1,1,1,0x32d6,0x32e0,0x32f4,0x330c,0x3324,0x333c,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,
-0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,0xffcc,
-0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,
-1,1,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,1,1,1,1,1,
-1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xfe0e,1,1,1,1,1,0x334b,0x334f,
-0x3353,0x3357,0x335d,0x2f3d,0x3361,0x3365,0x3369,0x336d,0x2f41,0x3371,0x3375,0x3379,0x2f45,0x337f,0x3383,0x3387,
-0x338b,0x3391,0x3395,0x3399,0x339d,0x33a3,0x33a7,0x33ab,0x33af,0x302f,0x33b3,0x33b9,0x33bd,0x33c1,0x33c5,0x33c9,
-0x33cd,0x33d1,0x33d5,0x3043,0x2f49,0x2f4d,0x3047,0x33d9,0x33dd,0x2c49,0x33e1,0x2f51,0x33e5,0x33e9,0x33ed,0x33f1,
-0x33f1,0x33f1,0x33f5,0x33fb,0x33ff,0x3403,0x3407,0x340d,0x3411,0x3415,0x3419,0x341d,0x3421,0x3425,0x3429,0x342d,
-0x3431,0x3435,0x3439,0x343d,0x343d,0x304f,0x3441,0x3445,0x3449,0x344d,0x2f59,0x3451,0x3455,0x3459,0x2ead,0x345d,
-0x3461,0x3465,0x3469,0x346d,0x3471,0x3475,0x3479,0x347d,0x3483,0x3487,0x348b,0x348f,0x3493,0x3497,0x349b,0x34a1,
-0x34a7,0x34ab,0x34af,0x34b3,0x34b7,0x34bb,0x34bf,0x34c3,0x34c7,0x34c7,0x34cb,0x34d1,0x34d5,0x2c39,0x34d9,0x34dd,
-0x34e3,0x34e7,0x34eb,0x34ef,0x34f3,0x34f7,0x2f6d,0x34fb,0x34ff,0x3503,0x3509,0x350d,0x3513,0x3517,0x351b,0x351f,
-0x3523,0x3527,0x352b,0x352f,0x3533,0x3537,0x353b,0x353f,0x3545,0x3549,0x354d,0x3551,0x2b61,0x3555,0x355b,0x355f,
-0x355f,0x3565,0x3569,0x3569,0x356d,0x3571,0x3577,0x357d,0x3581,0x3585,0x3589,0x358d,0x3591,0x3595,0x3599,0x359d,
-0x35a1,0x2f71,0x35a5,0x35ab,0x35af,0x35b3,0x307f,0x35b3,0x35b7,0x2f79,0x35bb,0x35bf,0x35c3,0x35c7,0x2f7d,0x2af5,
-0x35cb,0x35cf,0x35d3,0x35d7,0x35db,0x35df,0x35e3,0x35e9,0x35ed,0x35f1,0x35f5,0x35f9,0x35fd,0x3603,0x3607,0x360b,
-0x360f,0x3613,0x3617,0x361b,0x361f,0x3623,0x2f81,0x3627,0x362b,0x3631,0x3635,0x3639,0x363d,0x2f89,0x3641,0x3645,
-0x3649,0x364d,0x3651,0x3655,0x3659,0x365d,0x2b65,0x309f,0x3661,0x3665,0x3669,0x366d,0x3673,0x3677,0x367b,0x367f,
-0x2f8d,0x3683,0x3689,0x368d,0x3691,0x3151,0x3695,0x3699,0x369d,0x36a1,0x36a5,0x36ab,0x36af,0x36b3,0x36b7,0x36bd,
-0x36c1,0x36c5,0x36c9,0x2c7d,0x36cd,0x36d1,0x36d7,0x36dd,0x36e3,0x36e7,0x36ed,0x36f1,0x36f5,0x36f9,0x36fd,0x2f91,
-0x2dd9,0x3701,0x3705,0x3709,0x370d,0x3713,0x3717,0x371b,0x371f,0x30af,0x3723,0x3727,0x372d,0x3731,0x3735,0x373b,
-0x3741,0x3745,0x30b3,0x3749,0x374d,0x3751,0x3755,0x3759,0x375d,0x3761,0x3767,0x376b,0x3771,0x3775,0x377b,0x30bb,
-0x377f,0x3783,0x3789,0x378d,0x3791,0x3797,0x379d,0x37a1,0x37a5,0x37a9,0x37ad,0x37ad,0x37b1,0x37b5,0x30c3,0x37b9,
-0x37bd,0x37c1,0x37c5,0x37c9,0x37cf,0x37d3,0x2c45,0x37d9,0x37df,0x37e3,0x37e9,0x37ef,0x37f5,0x37f9,0x30db,0x37fd,
-0x3803,0x3809,0x380f,0x3815,0x3819,0x3819,0x30df,0x3159,0x381d,0x3821,0x3825,0x3829,0x382f,0x2bad,0x30e7,0x3833,
-0x3837,0x2fbd,0x383d,0x3843,0x2f05,0x3849,0x384d,0x2fcd,0x3851,0x3855,0x3859,0x385f,0x385f,0x3865,0x3869,0x386d,
-0x3873,0x3877,0x387b,0x387f,0x3885,0x3889,0x388d,0x3891,0x3895,0x3899,0x389f,0x38a3,0x38a7,0x38ab,0x38af,0x38b3,
-0x38b7,0x38bd,0x38c3,0x38c7,0x38cd,0x38d1,0x38d7,0x38db,0x2fe5,0x38df,0x38e5,0x38eb,0x38ef,0x38f5,0x38f9,0x38ff,
-0x3903,0x3907,0x390b,0x390f,0x3913,0x3917,0x391d,0x3923,0x3929,0x3565,0x392f,0x3933,0x3937,0x393b,0x393f,0x3943,
-0x3947,0x394b,0x394f,0x3953,0x3957,0x395b,0x2c8d,0x3961,0x3965,0x3969,0x396d,0x3971,0x3975,0x2ff1,0x3979,0x397d,
-0x3981,0x3985,0x3989,0x398f,0x3995,0x399b,0x399f,0x39a3,0x39a7,0x39ab,0x39b1,0x39b5,0x39bb,0x39bf,0x39c3,0x39c9,
-0x39cf,0x39d3,0x2b99,0x39d7,0x39db,0x39df,0x39e3,0x39e7,0x39eb,0x3103,0x39ef,0x39f3,0x39f7,0x39fb,0x39ff,0x3a03,
-0x3a07,0x3a0b,0x3a0f,0x3a13,0x3a19,0x3a1d,0x3a21,0x3a25,0x3a29,0x3a2d,0x3a33,0x3a39,0x3a3d,0x3a41,0x3117,0x311b,
-0x3a45,0x3a49,0x3a4f,0x3a53,0x3a57,0x3a5b,0x3a5f,0x3a65,0x3a6b,0x3a6f,0x3a73,0x3a77,0x3a7d,0x311f,0x3a81,0x3a87,
-0x3a8d,0x3a91,0x3a95,0x3a99,0x3a9f,0x3aa3,0x3aa7,0x3aab,0x3aaf,0x3ab3,0x3ab7,0x3abb,0x3ac1,0x3ac5,0x3ac9,0x3acd,
-0x3ad3,0x3ad7,0x3adb,0x3adf,0x3ae3,0x3ae9,0x3aef,0x3af3,0x3af7,0x3afb,0x3b01,0x3b05,0x3137,0x3137,0x3b0b,0x3b0f,
-0x3b15,0x3b19,0x3b1d,0x3b21,0x3b25,0x3b29,0x3b2d,0x3b31,0x313b,0x3b37,0x3b3b,0x3b3f,0x3b43,0x3b47,0x3b4b,0x3b51,
-0x3b55,0x3b5b,0x3b61,0x3b67,0x3b6b,0x3b6f,0x3b73,0x3b77,0x3b7b,0x3b7f,0x3b83,0x3b87,1,1
+1,1,1,1,1,1,1,1,1,1,1,1,0x3c56,1,0x3c56,0x3c56,
+0x3c56,0x3c56,0x3c56,0x3c56,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,0x3c56,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,0x3c56,1,1,1,1,
+0x3c56,1,1,1,0x3c56,1,0x3c56,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,0x3b87,1,0x2ac5,0x2ac9,0x2acd,0x2ad1,0x2ad5,0x2ad9,0x2add,0x2ae1,0x2ae1,
+0x2ae5,0x2ae9,0x2aed,0x2af1,0x2af5,0x2af9,0x2afd,0x2b01,0x2b05,0x2b09,0x2b0d,0x2b11,0x2b15,0x2b19,0x2b1d,0x2b21,
+0x2b25,0x2b29,0x2b2d,0x2b31,0x2b35,0x2b39,0x2b3d,0x2b41,0x2b45,0x2b49,0x2b4d,0x2b51,0x2b55,0x2b59,0x2b5d,0x2b61,
+0x2b65,0x2b69,0x2b6d,0x2b71,0x2b75,0x2b79,0x2b7d,0x2b81,0x2b85,0x2b89,0x2b8d,0x2b91,0x2b95,0x2b99,0x2b9d,0x2ba1,
+0x2ba5,0x2ba9,0x2bad,0x2bb1,0x2bb5,0x2bb9,0x2bbd,0x2bc1,0x2bc5,0x2bc9,0x2bcd,0x2bd1,0x2bd5,0x2bd9,0x2bdd,0x2be1,
+0x2be5,0x2be9,0x2bed,0x2bf1,0x2bf5,0x2bf9,0x2bfd,0x2c01,0x2c05,0x2c09,0x2c0d,0x2c11,0x2c15,0x2c19,0x2c1d,0x2c21,
+0x2c25,0x2c29,0x2c2d,0x2b11,0x2c31,0x2c35,0x2c39,0x2c3d,0x2c41,0x2c45,0x2c49,0x2c4d,0x2c51,0x2c55,0x2c59,0x2c5d,
+0x2c61,0x2c65,0x2c69,0x2c6d,0x2c71,0x2c75,0x2c79,0x2c7d,0x2c81,0x2c85,0x2c89,0x2c8d,0x2c91,0x2c95,0x2c99,0x2c9d,
+0x2ca1,0x2ca5,0x2ca9,0x2cad,0x2cb1,0x2cb5,0x2cb9,0x2cbd,0x2cc1,0x2cc5,0x2cc9,0x2ccd,0x2cd1,0x2cd5,0x2cd9,0x2cdd,
+0x2ce1,0x2ce5,0x2ce9,0x2ced,0x2cf1,0x2cf5,0x2cf9,0x2cfd,0x2d01,0x2d05,0x2d09,0x2d0d,0x2d11,0x2d15,0x2d19,0x2d1d,
+0x2d21,0x2d25,0x2d29,0x2d2d,0x2d31,0x2d35,0x2d39,0x2d3d,0x2c79,0x2d41,0x2d45,0x2d49,0x2d4d,0x2d51,0x2d55,0x2d59,
+0x2d5d,0x2c39,0x2d61,0x2d65,0x2d69,0x2d6d,0x2d71,0x2d75,0x2d79,0x2d7d,0x2d81,0x2d85,0x2d89,0x2d8d,0x2d91,0x2d95,
+0x2d99,0x2d9d,0x2da1,0x2da5,0x2da9,0x2dad,0x2b11,0x2db1,0x2db5,0x2db9,0x2dbd,0x2dc1,0x2dc5,0x2dc9,0x2dcd,0x2dd1,
+0x2dd5,0x2dd9,0x2ddd,0x2de1,0x2de5,0x2de9,0x2ded,0x2df1,0x2df5,0x2df9,0x2dfd,0x2e01,0x2e05,0x2e09,0x2e0d,0x2e11,
+0x2e15,0x2e19,0x2c41,0x2e1d,0x2e21,0x2e25,0x2e29,0x2e2d,0x2e31,0x2e35,0x2e39,0x2e3d,0x2e41,0x2e45,0x2e49,0x2e4d,
+0x2e51,0x2e55,0x2e59,0x2e5d,0x2e61,0x2e65,0x2e69,0x2e6d,0x2e71,0x2e75,0x2e79,0x2e7d,0x2e81,0x2e85,0x2e89,0x2e8d,
+0x2e91,0x2e95,0x2e99,0x2e9d,0x2ea1,0x2ea5,0x2ea9,0x2ead,0x2eb1,0x2eb5,0x2eb9,0x2ebd,0x2ec1,0x2ec5,0x2ec9,0x2ecd,
+0x2ed1,0x2ed5,0x2ed9,0x2edd,0x2ee1,1,1,0x2ee5,1,0x2ee9,1,1,0x2eed,0x2ef1,0x2ef5,0x2ef9,
+0x2efd,0x2f01,0x2f05,0x2f09,0x2f0d,0x2f11,1,0x2f15,1,0x2f19,1,1,0x2f1d,0x2f21,1,1,
+1,0x2f25,0x2f29,0x2f2d,0x2f31,0x2f35,0x2f39,0x2f3d,0x2f41,0x2f45,0x2f49,0x2f4d,0x2f51,0x2f55,0x2f59,0x2f5d,
+0x2f61,0x2f65,0x2f69,0x2f6d,0x2f71,0x2f75,0x2f79,0x2f7d,0x2f81,0x2f85,0x2f89,0x2f8d,0x2f91,0x2f95,0x2f99,0x2f9d,
+0x2fa1,0x2fa5,0x2fa9,0x2fad,0x2fb1,0x2fb5,0x2fb9,0x2fbd,0x2fc1,0x2fc5,0x2fc9,0x2fcd,0x2fd1,0x2fd5,0x2d15,0x2fd9,
+0x2fdd,0x2fe1,0x2fe5,0x2fe9,0x2fed,0x2fed,0x2ff1,0x2ff5,0x2ff9,0x2ffd,0x3001,0x3005,0x3009,0x300d,0x2f1d,0x3011,
+0x3015,0x3019,0x301d,0x3021,0x3027,1,1,0x302b,0x302f,0x3033,0x3037,0x303b,0x303f,0x3043,0x3047,0x2f55,
+0x304b,0x304f,0x3053,0x2ee5,0x3057,0x305b,0x305f,0x3063,0x3067,0x306b,0x306f,0x3073,0x3077,0x307b,0x307f,0x3083,
+0x2f79,0x3087,0x2f7d,0x308b,0x308f,0x3093,0x3097,0x309b,0x2ee9,0x2b65,0x309f,0x30a3,0x30a7,0x2c7d,0x2dd9,0x30ab,
+0x30af,0x2f99,0x30b3,0x2f9d,0x30b7,0x30bb,0x30bf,0x2ef1,0x30c3,0x30c7,0x30cb,0x30cf,0x30d3,0x2ef5,0x30d7,0x30db,
+0x30df,0x30e3,0x30e7,0x30eb,0x2fd5,0x30ef,0x30f3,0x2d15,0x30f7,0x2fe5,0x30fb,0x30ff,0x3103,0x3107,0x310b,0x2ff9,
+0x310f,0x2f19,0x3113,0x2ffd,0x2c31,0x3117,0x3001,0x311b,0x3009,0x311f,0x3123,0x3127,0x312b,0x312f,0x3011,0x2f09,
+0x3133,0x3015,0x3137,0x3019,0x313b,0x2ae1,0x313f,0x3145,0x314b,0x3151,0x3155,0x3159,0x315d,0x3163,0x3169,0x316f,
+0x3173,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,0x3176,0xfe34,0x317c,1,1,1,1,1,1,
+1,1,1,1,0x3182,0x3188,0x3190,0x319a,0x31a2,0x31a8,0x31ae,0x31b4,0x31ba,0x31c0,0x31c6,0x31cc,
+0x31d2,1,0x31d8,0x31de,0x31e4,0x31ea,0x31f0,1,0x31f6,1,0x31fc,0x3202,1,0x3208,0x320e,1,
+0x3214,0x321a,0x3220,0x3226,0x322c,0x3232,0x3238,0x323e,0x3244,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,
+0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,0xffb8,1,0xffcc,1,1,1,
+1,1,1,1,1,0xffcc,0xfe02,0xffb8,1,1,1,1,0xfe12,1,1,1,
+1,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,0xffb8,0xffb8,0xffcc,
+0xffcc,0xffcc,0xffb8,0xffcc,0xffb8,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1,
+0xa94,0x2959,0xa9a,0x2963,1,1,1,1,1,0xaa0,1,1,1,1,1,0x296d,
+1,1,1,1,1,1,1,1,1,0xfe12,0xfc0e,1,1,1,1,1,
+1,1,0xfc00,1,1,1,1,1,1,0x2977,0x2981,1,0xaa6,0xaac,0xfe12,0xfe12,
+1,1,1,1,1,1,1,1,1,1,1,0xfe12,1,1,1,1,
+1,1,1,1,1,0xfe0e,1,1,1,1,1,0xfe12,0xfe0e,1,1,1,
+1,1,1,1,1,1,0xfe0e,0xfe12,1,1,1,1,1,1,1,1,
+1,1,1,0xfe0e,0xfe0e,1,0xfc00,1,1,1,1,1,1,1,0xab2,1,
+1,1,0x298b,0x2995,0xfe12,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,
+0xffcc,0xffcc,1,1,1,0xfe12,1,1,1,0xfe0e,1,1,1,1,1,1,
+1,1,1,0xfc00,1,1,1,1,1,1,1,1,0xabe,0xfc00,0x299f,0x29a9,
+0xfc00,0x29b3,1,1,0xfe12,0xfe0e,1,1,1,1,1,1,1,1,1,1,
+1,1,0xad0,0xad6,0x29bd,0x29c7,1,1,1,0xfe12,0xfe0e,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,0xfe12,0xfe0e,1,1,1,1,
+1,1,1,1,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,0xfe02,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,0x324a,0x3254,0x3268,0x3280,0x3298,0x32b0,0x32c8,0xffb0,0xffb0,0xfe02,
+0xfe02,0xfe02,1,1,1,0xffc4,0xffb0,0xffb0,0xffb0,1,1,1,1,1,1,1,
+1,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,1,
+1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,
+1,1,1,1,1,1,1,1,0x32d6,0x32e0,0x32f4,0x330c,0x3324,0x333c,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,
+0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,
+0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,
+1,1,1,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,1,1,1,1,
+1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xfe0e,1,1,1,1,1,0x334b,
+0x334f,0x3353,0x3357,0x335d,0x2f3d,0x3361,0x3365,0x3369,0x336d,0x2f41,0x3371,0x3375,0x3379,0x2f45,0x337f,0x3383,
+0x3387,0x338b,0x3391,0x3395,0x3399,0x339d,0x33a3,0x33a7,0x33ab,0x33af,0x302f,0x33b3,0x33b9,0x33bd,0x33c1,0x33c5,
+0x33c9,0x33cd,0x33d1,0x33d5,0x3043,0x2f49,0x2f4d,0x3047,0x33d9,0x33dd,0x2c49,0x33e1,0x2f51,0x33e5,0x33e9,0x33ed,
+0x33f1,0x33f1,0x33f1,0x33f5,0x33fb,0x33ff,0x3403,0x3407,0x340d,0x3411,0x3415,0x3419,0x341d,0x3421,0x3425,0x3429,
+0x342d,0x3431,0x3435,0x3439,0x343d,0x343d,0x304f,0x3441,0x3445,0x3449,0x344d,0x2f59,0x3451,0x3455,0x3459,0x2ead,
+0x345d,0x3461,0x3465,0x3469,0x346d,0x3471,0x3475,0x3479,0x347d,0x3483,0x3487,0x348b,0x348f,0x3493,0x3497,0x349b,
+0x34a1,0x34a7,0x34ab,0x34af,0x34b3,0x34b7,0x34bb,0x34bf,0x34c3,0x34c7,0x34c7,0x34cb,0x34d1,0x34d5,0x2c39,0x34d9,
+0x34dd,0x34e3,0x34e7,0x34eb,0x34ef,0x34f3,0x34f7,0x2f6d,0x34fb,0x34ff,0x3503,0x3509,0x350d,0x3513,0x3517,0x351b,
+0x351f,0x3523,0x3527,0x352b,0x352f,0x3533,0x3537,0x353b,0x353f,0x3545,0x3549,0x354d,0x3551,0x2b61,0x3555,0x355b,
+0x355f,0x355f,0x3565,0x3569,0x3569,0x356d,0x3571,0x3577,0x357d,0x3581,0x3585,0x3589,0x358d,0x3591,0x3595,0x3599,
+0x359d,0x35a1,0x2f71,0x35a5,0x35ab,0x35af,0x35b3,0x307f,0x35b3,0x35b7,0x2f79,0x35bb,0x35bf,0x35c3,0x35c7,0x2f7d,
+0x2af5,0x35cb,0x35cf,0x35d3,0x35d7,0x35db,0x35df,0x35e3,0x35e9,0x35ed,0x35f1,0x35f5,0x35f9,0x35fd,0x3603,0x3607,
+0x360b,0x360f,0x3613,0x3617,0x361b,0x361f,0x3623,0x2f81,0x3627,0x362b,0x3631,0x3635,0x3639,0x363d,0x2f89,0x3641,
+0x3645,0x3649,0x364d,0x3651,0x3655,0x3659,0x365d,0x2b65,0x309f,0x3661,0x3665,0x3669,0x366d,0x3673,0x3677,0x367b,
+0x367f,0x2f8d,0x3683,0x3689,0x368d,0x3691,0x3151,0x3695,0x3699,0x369d,0x36a1,0x36a5,0x36ab,0x36af,0x36b3,0x36b7,
+0x36bd,0x36c1,0x36c5,0x36c9,0x2c7d,0x36cd,0x36d1,0x36d7,0x36dd,0x36e3,0x36e7,0x36ed,0x36f1,0x36f5,0x36f9,0x36fd,
+0x2f91,0x2dd9,0x3701,0x3705,0x3709,0x370d,0x3713,0x3717,0x371b,0x371f,0x30af,0x3723,0x3727,0x372d,0x3731,0x3735,
+0x373b,0x3741,0x3745,0x30b3,0x3749,0x374d,0x3751,0x3755,0x3759,0x375d,0x3761,0x3767,0x376b,0x3771,0x3775,0x377b,
+0x30bb,0x377f,0x3783,0x3789,0x378d,0x3791,0x3797,0x379d,0x37a1,0x37a5,0x37a9,0x37ad,0x37ad,0x37b1,0x37b5,0x30c3,
+0x37b9,0x37bd,0x37c1,0x37c5,0x37c9,0x37cf,0x37d3,0x2c45,0x37d9,0x37df,0x37e3,0x37e9,0x37ef,0x37f5,0x37f9,0x30db,
+0x37fd,0x3803,0x3809,0x380f,0x3815,0x3819,0x3819,0x30df,0x3159,0x381d,0x3821,0x3825,0x3829,0x382f,0x2bad,0x30e7,
+0x3833,0x3837,0x2fbd,0x383d,0x3843,0x2f05,0x3849,0x384d,0x2fcd,0x3851,0x3855,0x3859,0x385f,0x385f,0x3865,0x3869,
+0x386d,0x3873,0x3877,0x387b,0x387f,0x3885,0x3889,0x388d,0x3891,0x3895,0x3899,0x389f,0x38a3,0x38a7,0x38ab,0x38af,
+0x38b3,0x38b7,0x38bd,0x38c3,0x38c7,0x38cd,0x38d1,0x38d7,0x38db,0x2fe5,0x38df,0x38e5,0x38eb,0x38ef,0x38f5,0x38f9,
+0x38ff,0x3903,0x3907,0x390b,0x390f,0x3913,0x3917,0x391d,0x3923,0x3929,0x3565,0x392f,0x3933,0x3937,0x393b,0x393f,
+0x3943,0x3947,0x394b,0x394f,0x3953,0x3957,0x395b,0x2c8d,0x3961,0x3965,0x3969,0x396d,0x3971,0x3975,0x2ff1,0x3979,
+0x397d,0x3981,0x3985,0x3989,0x398f,0x3995,0x399b,0x399f,0x39a3,0x39a7,0x39ab,0x39b1,0x39b5,0x39bb,0x39bf,0x39c3,
+0x39c9,0x39cf,0x39d3,0x2b99,0x39d7,0x39db,0x39df,0x39e3,0x39e7,0x39eb,0x3103,0x39ef,0x39f3,0x39f7,0x39fb,0x39ff,
+0x3a03,0x3a07,0x3a0b,0x3a0f,0x3a13,0x3a19,0x3a1d,0x3a21,0x3a25,0x3a29,0x3a2d,0x3a33,0x3a39,0x3a3d,0x3a41,0x3117,
+0x311b,0x3a45,0x3a49,0x3a4f,0x3a53,0x3a57,0x3a5b,0x3a5f,0x3a65,0x3a6b,0x3a6f,0x3a73,0x3a77,0x3a7d,0x311f,0x3a81,
+0x3a87,0x3a8d,0x3a91,0x3a95,0x3a99,0x3a9f,0x3aa3,0x3aa7,0x3aab,0x3aaf,0x3ab3,0x3ab7,0x3abb,0x3ac1,0x3ac5,0x3ac9,
+0x3acd,0x3ad3,0x3ad7,0x3adb,0x3adf,0x3ae3,0x3ae9,0x3aef,0x3af3,0x3af7,0x3afb,0x3b01,0x3b05,0x3137,0x3137,0x3b0b,
+0x3b0f,0x3b15,0x3b19,0x3b1d,0x3b21,0x3b25,0x3b29,0x3b2d,0x3b31,0x313b,0x3b37,0x3b3b,0x3b3f,0x3b43,0x3b47,0x3b4b,
+0x3b51,0x3b55,0x3b5b,0x3b61,0x3b67,0x3b6b,0x3b6f,0x3b73,0x3b77,0x3b7b,0x3b7f,0x3b83,0x3b87,1,1,1
};
static const UCPTrie norm2_nfc_data_trie={
norm2_nfc_data_trieIndex,
{ norm2_nfc_data_trieData },
- 1690, 7822,
+ 1712, 7824,
0x2fc00, 0x30,
0, 0,
0, 0,
diff --git a/Build/source/libs/icu/icu-src/source/common/normalizer2impl.cpp b/Build/source/libs/icu/icu-src/source/common/normalizer2impl.cpp
index e7ae646c41a..b2dd7ad4b86 100644
--- a/Build/source/libs/icu/icu-src/source/common/normalizer2impl.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/normalizer2impl.cpp
@@ -86,8 +86,7 @@ UChar32 codePointFromValidUTF8(const uint8_t *cpStart, const uint8_t *cpLimit) {
case 4:
return ((c&7)<<18) | ((cpStart[1]&0x3f)<<12) | ((cpStart[2]&0x3f)<<6) | (cpStart[3]&0x3f);
default:
- U_ASSERT(FALSE); // Should not occur.
- return U_SENTINEL;
+ UPRV_UNREACHABLE; // Should not occur.
}
}
diff --git a/Build/source/libs/icu/icu-src/source/common/normalizer2impl.h b/Build/source/libs/icu/icu-src/source/common/normalizer2impl.h
index 2e6aff30881..cf3015ea881 100644
--- a/Build/source/libs/icu/icu-src/source/common/normalizer2impl.h
+++ b/Build/source/libs/icu/icu-src/source/common/normalizer2impl.h
@@ -245,9 +245,7 @@ private:
*/
class U_COMMON_API Normalizer2Impl : public UObject {
public:
- Normalizer2Impl() : normTrie(NULL), fCanonIterData(NULL) {
- fCanonIterDataInitOnce.reset();
- }
+ Normalizer2Impl() : normTrie(NULL), fCanonIterData(NULL) { }
virtual ~Normalizer2Impl();
void init(const int32_t *inIndexes, const UCPTrie *inTrie,
@@ -264,7 +262,9 @@ public:
// The trie stores values for lead surrogate code *units*.
// Surrogate code *points* are inert.
uint16_t getNorm16(UChar32 c) const {
- return U_IS_LEAD(c) ? INERT : UCPTRIE_FAST_GET(normTrie, UCPTRIE_16, c);
+ return U_IS_LEAD(c) ?
+ static_cast<uint16_t>(INERT) :
+ UCPTRIE_FAST_GET(normTrie, UCPTRIE_16, c);
}
uint16_t getRawNorm16(UChar32 c) const { return UCPTRIE_FAST_GET(normTrie, UCPTRIE_16, c); }
@@ -721,7 +721,7 @@ private:
const uint16_t *extraData; // mappings and/or compositions for yesYes, yesNo & noNo characters
const uint8_t *smallFCD; // [0x100] one bit per 32 BMP code points, set if any FCD!=0
- UInitOnce fCanonIterDataInitOnce;
+ UInitOnce fCanonIterDataInitOnce = U_INITONCE_INITIALIZER;
CanonIterData *fCanonIterData;
};
diff --git a/Build/source/libs/icu/icu-src/source/common/normlzr.cpp b/Build/source/libs/icu/icu-src/source/common/normlzr.cpp
index 607660c45f1..2dea0ffc33c 100644
--- a/Build/source/libs/icu/icu-src/source/common/normlzr.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/normlzr.cpp
@@ -23,7 +23,7 @@
#include "normalizer2impl.h"
#include "uprops.h" // for uniset_getUnicode32Instance()
-#if defined(_ARM64_) && defined(move32)
+#if defined(move32)
// System can define move32 intrinsics, but the char iters define move32 method
// using same undef trick in headers, so undef here to re-enable the method.
#undef move32
diff --git a/Build/source/libs/icu/icu-src/source/common/patternprops.cpp b/Build/source/libs/icu/icu-src/source/common/patternprops.cpp
index 01e33ce109f..c38a7e276de 100644
--- a/Build/source/libs/icu/icu-src/source/common/patternprops.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/patternprops.cpp
@@ -173,6 +173,16 @@ PatternProps::skipWhiteSpace(const UChar *s, int32_t length) {
return s;
}
+int32_t
+PatternProps::skipWhiteSpace(const UnicodeString& s, int32_t start) {
+ int32_t i = start;
+ int32_t length = s.length();
+ while(i<length && isWhiteSpace(s.charAt(i))) {
+ ++i;
+ }
+ return i;
+}
+
const UChar *
PatternProps::trimWhiteSpace(const UChar *s, int32_t &length) {
if(length<=0 || (!isWhiteSpace(s[0]) && !isWhiteSpace(s[length-1]))) {
diff --git a/Build/source/libs/icu/icu-src/source/common/patternprops.h b/Build/source/libs/icu/icu-src/source/common/patternprops.h
index a42eb3c2441..b57cdeb6e53 100644
--- a/Build/source/libs/icu/icu-src/source/common/patternprops.h
+++ b/Build/source/libs/icu/icu-src/source/common/patternprops.h
@@ -17,6 +17,7 @@
#ifndef __PATTERNPROPS_H__
#define __PATTERNPROPS_H__
+#include "unicode/unistr.h"
#include "unicode/utypes.h"
U_NAMESPACE_BEGIN
@@ -64,6 +65,12 @@ public:
static const UChar *skipWhiteSpace(const UChar *s, int32_t length);
/**
+ * Skips over Pattern_White_Space starting at index start in s.
+ * @return The smallest index at or after start with a non-white space character.
+ */
+ static int32_t skipWhiteSpace(const UnicodeString &s, int32_t start);
+
+ /**
* @return s except with leading and trailing Pattern_White_Space removed and length adjusted.
*/
static const UChar *trimWhiteSpace(const UChar *s, int32_t &length);
diff --git a/Build/source/libs/icu/icu-src/source/common/propname_data.h b/Build/source/libs/icu/icu-src/source/common/propname_data.h
index 15a3301e47d..e56ccd897b9 100644
--- a/Build/source/libs/icu/icu-src/source/common/propname_data.h
+++ b/Build/source/libs/icu/icu-src/source/common/propname_data.h
@@ -13,9 +13,9 @@
U_NAMESPACE_BEGIN
-const int32_t PropNameData::indexes[8]={0x20,0x1548,0x4e03,0xa114,0xa114,0xa114,0x2f,0};
+const int32_t PropNameData::indexes[8]={0x20,0x157c,0x4f32,0xa3ee,0xa3ee,0xa3ee,0x2f,0};
-const int32_t PropNameData::valueMaps[1354]={
+const int32_t PropNameData::valueMaps[1367]={
6,0,0x41,0,0xe3,0x356,0xe3,0x36c,0xe3,0x381,0xe3,0x397,0xe3,0x3a2,0xe3,0x3c3,
0xe3,0x3d3,0xe3,0x3e2,0xe3,0x3f0,0xe3,0x414,0xe3,0x42b,0xe3,0x443,0xe3,0x45a,0xe3,0x469,
0xe3,0x478,0xe3,0x489,0xe3,0x497,0xe3,0x4a9,0xe3,0x4c3,0xe3,0x4de,0xe3,0x4f3,0xe3,0x510,
@@ -24,13 +24,13 @@ const int32_t PropNameData::valueMaps[1354]={
0xe3,0x678,0xe3,0x68c,0xe3,0x6a2,0xe3,0x6bc,0xe3,0x6d4,0xe3,0x6f0,0xe3,0x6f8,0xe3,0x700,
0xe3,0x708,0xe3,0x710,0xe3,0x719,0xe3,0x726,0xe3,0x739,0xe3,0x756,0xe3,0x773,0xe3,0x790,
0xe3,0x7ae,0xe3,0x7cc,0xe3,0x7f0,0xe3,0x7fd,0xe3,0x817,0xe3,0x82c,0xe3,0x847,0xe3,0x85e,
-0xe3,0x875,0xe3,0x897,0xe3,0x1000,0x1019,0x8b6,0x15d,0xad6,0x178,0x2c95,0xe9,0x2cb4,0x2a0,0x2df2,
-0x2b6,0x2e4c,0x2c0,0x30a9,0x2e2,0x39a4,0x34c,0x3a14,0x356,0x3cae,0x385,0x3cec,0x38d,0x474b,0x44a,0x47c9,
-0x454,0x47ee,0x45a,0x4808,0x460,0x4829,0x467,0x4843,0xe9,0x4868,0xe9,0x488e,0x46e,0x4938,0x484,0x49b1,
-0x497,0x4a63,0x4b2,0x4a9a,0x4b9,0x4c49,0x4cc,0x50c9,0x4f4,0x2000,0x2001,0x5128,0x4fc,0x3000,0x3001,0x51b4,
-0,0x4000,0x400e,0x51c6,0,0x51cf,0,0x51e9,0,0x51fa,0,0x520b,0,0x5221,0,0x522a,
-0,0x5247,0,0x5265,0,0x5283,0,0x52a1,0,0x52b7,0,0x52cb,0,0x52e1,0,0x7000,
-0x7001,0x52fa,0,0x7d6,0x12,0,1,0x12,0x20,0x7f4,0x49,0,1,7,8,9,
+0xe3,0x875,0xe3,0x897,0xe3,0x1000,0x1019,0x8b6,0x15d,0xad6,0x178,0x2df6,0xe9,0x2e15,0x2a9,0x2f53,
+0x2bf,0x2fad,0x2c9,0x320a,0x2eb,0x3b05,0x355,0x3b75,0x35f,0x3e0f,0x38e,0x3e4d,0x396,0x48f6,0x457,0x4974,
+0x461,0x4999,0x467,0x49b3,0x46d,0x49d4,0x474,0x49ee,0xe9,0x4a13,0xe9,0x4a39,0x47b,0x4ae3,0x491,0x4b5c,
+0x4a4,0x4c0e,0x4bf,0x4c45,0x4c6,0x4df4,0x4d9,0x5274,0x501,0x2000,0x2001,0x52d3,0x509,0x3000,0x3001,0x535f,
+0,0x4000,0x400e,0x5371,0,0x537a,0,0x5394,0,0x53a5,0,0x53b6,0,0x53cc,0,0x53d5,
+0,0x53f2,0,0x5410,0,0x542e,0,0x544c,0,0x5462,0,0x5476,0,0x548c,0,0x7000,
+0x7001,0x54a5,0,0x7d6,0x12,0,1,0x12,0x20,0x7f4,0x49,0,1,7,8,9,
0xa,0xb,0xc,0xd,0xe,0xf,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,
0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x54,0x5b,0x67,0x6b,0x76,
0x7a,0x81,0x82,0x84,0x85,0xc8,0xca,0xd6,0xd8,0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,
@@ -39,7 +39,7 @@ const int32_t PropNameData::valueMaps[1354]={
0x19d,0x1aa,0x1b7,0x1c4,0x1d1,0x1de,0x1eb,0x1fa,0x209,0x218,0x227,0x236,0x245,0x254,0x263,0x27d,
0x291,0x2a5,0x2c0,0x2cf,0x2d8,0x2e8,0x2f0,0x2f9,0x308,0x311,0x321,0x332,0x343,0x986,1,0,
0x17,0x8c5,0x8d6,0x8e7,0x8fb,0x912,0x92a,0x93c,0x951,0x968,0x97d,0x98d,0x99f,0x9bc,0x9d8,0x9ea,
-0xa07,0xa23,0xa3f,0xa54,0xa69,0xa83,0xa9e,0xab9,0xb28,1,0,0x124,0xae1,0xaee,0xb01,0xb29,
+0xa07,0xa23,0xa3f,0xa54,0xa69,0xa83,0xa9e,0xab9,0xb28,1,0,0x12d,0xae1,0xaee,0xb01,0xb29,
0xb47,0xb65,0xb7d,0xba8,0xbd2,0xbea,0xbfd,0xc10,0xc1f,0xc2e,0xc3d,0xc4c,0xc63,0xc74,0xc87,0xc9a,
0xca7,0xcb4,0xcc3,0xcd4,0xce9,0xcfa,0xd05,0xd0e,0xd1f,0xd30,0xd43,0xd55,0xd68,0xd7b,0xdba,0xdc7,
0xdd4,0xde1,0xdf6,0xe26,0xe40,0xe61,0xe8c,0xeaf,0xf0d,0xf34,0xf4f,0xf5e,0xf85,0xfad,0xfd0,0xff3,
@@ -58,52 +58,53 @@ const int32_t PropNameData::valueMaps[1354]={
0x2710,0x2725,0x273e,0x275f,0x2794,0x27a5,0x27d6,0x27fa,0x280b,0x2824,0x282f,0x285c,0x287e,0x28ac,0x28df,0x28ee,
0x28ff,0x291c,0x295e,0x2985,0x2992,0x29a7,0x29cb,0x29f1,0x2a2a,0x2a3b,0x2a5f,0x2a6a,0x2a77,0x2a86,0x2aab,0x2ad9,
0x2af5,0x2b12,0x2b1f,0x2b30,0x2b4e,0x2b71,0x2b8e,0x2b9b,0x2bbb,0x2bd8,0x2bf9,0x2c22,0x2c33,0x2c52,0x2c6b,0x2c84,
-0x1d4e,1,0,0x12,0x2ccb,0x2cdb,0x2cee,0x2cfe,0x2d0e,0x2d1d,0x2d2d,0x2d3f,0x2d52,0x2d64,0x2d74,0x2d84,
-0x2d93,0x2da2,0x2db2,0x2dbf,0x2dce,0x2de2,0x1e0c,1,0,6,0x2e07,0x2e12,0x2e1f,0x2e2c,0x2e39,0x2e44,
-0x1e50,1,0,0x1e,0x2e61,0x2e70,0x2e85,0x2e9a,0x2eaf,0x2ec3,0x2ed4,0x2ee8,0x2efb,0x2f0c,0x2f25,0x2f37,
-0x2f48,0x2f5c,0x2f6f,0x2f87,0x2f99,0x2fa4,0x2fb4,0x2fc2,0x2fd7,0x2fec,0x3002,0x301c,0x3032,0x3042,0x3056,0x306a,
-0x307b,0x3093,0x207b,1,0,0x66,0x30bb,0x30de,0x30e7,0x30f4,0x30ff,0x3108,0x3113,0x311c,0x3135,0x313a,
-0x3143,0x3160,0x3169,0x3176,0x317f,0x31a3,0x31aa,0x31b3,0x31c6,0x31d1,0x31da,0x31e5,0x31fe,0x3207,0x3216,0x3221,
-0x322a,0x3235,0x323e,0x3245,0x324e,0x3259,0x3262,0x327b,0x3284,0x3291,0x329c,0x32ad,0x32b8,0x32cd,0x32e4,0x32ed,
-0x32f6,0x330f,0x331a,0x3323,0x332c,0x3343,0x3360,0x336b,0x337c,0x3387,0x338e,0x339b,0x33a8,0x33d5,0x33ea,0x33f3,
-0x340e,0x3431,0x3452,0x3473,0x3498,0x34bf,0x34e0,0x3503,0x3524,0x354b,0x356c,0x3591,0x35b0,0x35cf,0x35ee,0x360b,
-0x362c,0x364d,0x3670,0x3695,0x36b4,0x36d3,0x36f4,0x371b,0x3740,0x375f,0x3780,0x37a3,0x37be,0x37d7,0x37f2,0x380b,
-0x3828,0x3843,0x3860,0x387f,0x389c,0x38b9,0x38d8,0x38f5,0x3910,0x392d,0x394a,0x397d,0x23c0,1,0,6,
-0x39b5,0x39c4,0x39d4,0x39e4,0x39f4,0x3a05,0x241e,1,0,0x2b,0x3a23,0x3a2f,0x3a3d,0x3a4c,0x3a5b,0x3a6b,
-0x3a7c,0x3a90,0x3aa5,0x3abb,0x3ace,0x3ae2,0x3af2,0x3afb,0x3b06,0x3b16,0x3b32,0x3b44,0x3b52,0x3b61,0x3b6d,0x3b82,
-0x3b96,0x3ba9,0x3bb7,0x3bcb,0x3bd9,0x3be3,0x3bf5,0x3c01,0x3c0f,0x3c1f,0x3c26,0x3c2d,0x3c34,0x3c3b,0x3c42,0x3c58,
-0x3c79,0x85e,0x3c8b,0x3c96,0x3ca5,0x2677,1,0,4,0x3cbf,0x3cca,0x3cd6,0x3ce0,0x269d,1,0,
-0xb9,0x3cf7,0x3d04,0x3d19,0x3d26,0x3d35,0x3d43,0x3d52,0x3d61,0x3d73,0x3d82,0x3d90,0x3da1,0x3db0,0x3dbf,0x3dcc,
-0x3dd8,0x3de7,0x3df6,0x3e00,0x3e0d,0x3e1a,0x3e29,0x3e37,0x3e46,0x3e52,0x3e5c,0x3e68,0x3e78,0x3e88,0x3e96,0x3ea2,
-0x3eb3,0x3ebf,0x3ecb,0x3ed9,0x3ee6,0x3ef2,0x3eff,0xcfa,0x3f0c,0x3f1a,0x3f34,0x3f3d,0x3f4b,0x3f59,0x3f65,0x3f74,
-0x3f82,0x3f90,0x3f9c,0x3fab,0x3fb9,0x3fc7,0x3fd4,0x3fe3,0x3ffe,0x400d,0x401e,0x402f,0x4042,0x4054,0x4063,0x4075,
-0x4084,0x4090,0x409b,0x1e0a,0x40a8,0x40b3,0x40be,0x40c9,0x40d4,0x40ef,0x40fa,0x4105,0x4110,0x4123,0x4137,0x4142,
-0x4151,0x4160,0x416b,0x4176,0x4183,0x4192,0x41a0,0x41ab,0x41c6,0x41d0,0x41e1,0x41f2,0x4201,0x4212,0x421d,0x4228,
-0x4233,0x423e,0x4249,0x4254,0x425f,0x4269,0x4274,0x4284,0x428f,0x429d,0x42aa,0x42b5,0x42c4,0x42d1,0x42de,0x42ed,
-0x42fa,0x430b,0x431d,0x432d,0x4338,0x434b,0x4362,0x4370,0x437d,0x4388,0x4395,0x43a6,0x43c2,0x43d8,0x43e3,0x4400,
-0x4410,0x441f,0x442a,0x4435,0x1f24,0x4441,0x444c,0x4464,0x4474,0x4483,0x4491,0x449f,0x44aa,0x44b5,0x44c9,0x44e0,
-0x44f8,0x4508,0x4518,0x4528,0x453a,0x4545,0x4550,0x455a,0x4566,0x4574,0x4587,0x4593,0x45a0,0x45ab,0x45c7,0x45d4,
-0x45e2,0x45fb,0x2824,0x460a,0x2645,0x4617,0x4625,0x4637,0x4645,0x4651,0x4661,0x2a5f,0x466f,0x467b,0x4686,0x4691,
-0x469c,0x46b0,0x46be,0x46d5,0x46e1,0x46f5,0x4703,0x4715,0x472b,0x4739,0x3000,1,0,6,0x4765,0x4778,
-0x4788,0x4796,0x47a7,0x47b7,0x305c,0x12,0,1,0x47e1,0x47e7,0x3069,0x12,0,1,0x47e1,0x47e7,
-0x3076,1,0,3,0x47e1,0x47e7,0x4820,0x308c,1,0,3,0x47e1,0x47e7,0x4820,0x30a2,1,
-0,0x12,0x48aa,0x48b4,0x48c0,0x48c7,0x48d2,0x48d7,0x48de,0x48e5,0x48ee,0x48f3,0x48f8,0x4908,0x85e,0x3c8b,
-0x4914,0x3c96,0x4924,0x3ca5,0x314b,1,0,0xf,0x48aa,0x494b,0x4955,0x495f,0x496a,0x3b61,0x4974,0x4980,
-0x4988,0x498f,0x4999,0x48c0,0x48c7,0x48d7,0x49a3,0x31d2,1,0,0x17,0x48aa,0x49c0,0x495f,0x49cc,0x49d9,
-0x49e7,0x3b61,0x49f2,0x48c0,0x4a03,0x48d7,0x4a12,0x4a20,0x85e,0x3c79,0x4a2c,0x4a3d,0x3c8b,0x4914,0x3c96,0x4924,
-0x3ca5,0x4a4e,0x32ef,1,0,3,0x4a81,0x4a89,0x4a91,0x3308,1,0,0xf,0x4aba,0x4ac1,0x4ad0,
-0x4af1,0x4b14,0x4b1f,0x4b3e,0x4b55,0x4b62,0x4b6b,0x4b8a,0x4bbd,0x4bd8,0x4c07,0x4c24,0x3398,1,0,0x24,
-0x4c67,0x4c74,0x4c87,0x4c94,0x4cc1,0x4ce6,0x4cfb,0x4d1a,0x4d3b,0x4d68,0x4da1,0x4dc4,0x4de7,0x4e14,0x4e49,0x4e70,
-0x4e99,0x4ed0,0x4eff,0x4f20,0x4f45,0x4f54,0x4f77,0x4f8e,0x4f9b,0x4faa,0x4fc7,0x4fe0,0x5003,0x5028,0x5041,0x5056,
-0x5065,0x5076,0x5083,0x50a4,0x3568,1,0,4,0x50e2,0x50ed,0x5105,0x511d,0x35a4,0x36,1,2,
-4,8,0xe,0x10,0x20,0x3e,0x40,0x80,0x100,0x1c0,0x200,0x400,0x800,0xe00,0x1000,0x2000,
-0x4000,0x7000,0x8000,0x10000,0x20000,0x40000,0x78001,0x80000,0x100000,0x200000,0x400000,0x800000,0x1000000,0x2000000,0x4000000,0x8000000,
-0xf000000,0x10000000,0x20000000,0x30f80000,0x2e61,0x2e70,0x2e85,0x2e9a,0x5156,0x2eaf,0x2ec3,0x514c,0x2ed4,0x2ee8,0x2efb,0x5167,
-0x2f0c,0x2f25,0x2f37,0x517e,0x2f48,0x2f5c,0x2f6f,0x51a7,0x2f87,0x2f99,0x2fa4,0x2fb4,0x5143,0x2fc2,0x2fd7,0x2fec,
-0x3002,0x301c,0x3032,0x3042,0x3056,0x306a,0x519d,0x307b,0x3093,0x5188
+0x2c95,0x2cde,0x2cef,0x2d08,0x2d37,0x2d64,0x2d89,0x2dcb,0x2de7,0x1e00,1,0,0x12,0x2e2c,0x2e3c,0x2e4f,
+0x2e5f,0x2e6f,0x2e7e,0x2e8e,0x2ea0,0x2eb3,0x2ec5,0x2ed5,0x2ee5,0x2ef4,0x2f03,0x2f13,0x2f20,0x2f2f,0x2f43,0x1ebe,
+1,0,6,0x2f68,0x2f73,0x2f80,0x2f8d,0x2f9a,0x2fa5,0x1f02,1,0,0x1e,0x2fc2,0x2fd1,0x2fe6,
+0x2ffb,0x3010,0x3024,0x3035,0x3049,0x305c,0x306d,0x3086,0x3098,0x30a9,0x30bd,0x30d0,0x30e8,0x30fa,0x3105,0x3115,
+0x3123,0x3138,0x314d,0x3163,0x317d,0x3193,0x31a3,0x31b7,0x31cb,0x31dc,0x31f4,0x212d,1,0,0x66,0x321c,
+0x323f,0x3248,0x3255,0x3260,0x3269,0x3274,0x327d,0x3296,0x329b,0x32a4,0x32c1,0x32ca,0x32d7,0x32e0,0x3304,0x330b,
+0x3314,0x3327,0x3332,0x333b,0x3346,0x335f,0x3368,0x3377,0x3382,0x338b,0x3396,0x339f,0x33a6,0x33af,0x33ba,0x33c3,
+0x33dc,0x33e5,0x33f2,0x33fd,0x340e,0x3419,0x342e,0x3445,0x344e,0x3457,0x3470,0x347b,0x3484,0x348d,0x34a4,0x34c1,
+0x34cc,0x34dd,0x34e8,0x34ef,0x34fc,0x3509,0x3536,0x354b,0x3554,0x356f,0x3592,0x35b3,0x35d4,0x35f9,0x3620,0x3641,
+0x3664,0x3685,0x36ac,0x36cd,0x36f2,0x3711,0x3730,0x374f,0x376c,0x378d,0x37ae,0x37d1,0x37f6,0x3815,0x3834,0x3855,
+0x387c,0x38a1,0x38c0,0x38e1,0x3904,0x391f,0x3938,0x3953,0x396c,0x3989,0x39a4,0x39c1,0x39e0,0x39fd,0x3a1a,0x3a39,
+0x3a56,0x3a71,0x3a8e,0x3aab,0x3ade,0x2472,1,0,6,0x3b16,0x3b25,0x3b35,0x3b45,0x3b55,0x3b66,0x24d0,
+1,0,0x2b,0x3b84,0x3b90,0x3b9e,0x3bad,0x3bbc,0x3bcc,0x3bdd,0x3bf1,0x3c06,0x3c1c,0x3c2f,0x3c43,0x3c53,
+0x3c5c,0x3c67,0x3c77,0x3c93,0x3ca5,0x3cb3,0x3cc2,0x3cce,0x3ce3,0x3cf7,0x3d0a,0x3d18,0x3d2c,0x3d3a,0x3d44,0x3d56,
+0x3d62,0x3d70,0x3d80,0x3d87,0x3d8e,0x3d95,0x3d9c,0x3da3,0x3db9,0x3dda,0x85e,0x3dec,0x3df7,0x3e06,0x2729,1,
+0,4,0x3e20,0x3e2b,0x3e37,0x3e41,0x274f,1,0,0xbd,0x3e58,0x3e65,0x3e7a,0x3e87,0x3e96,0x3ea4,
+0x3eb3,0x3ec2,0x3ed4,0x3ee3,0x3ef1,0x3f02,0x3f11,0x3f20,0x3f2d,0x3f39,0x3f48,0x3f57,0x3f61,0x3f6e,0x3f7b,0x3f8a,
+0x3f98,0x3fa7,0x3fb3,0x3fbd,0x3fc9,0x3fd9,0x3fe9,0x3ff7,0x4003,0x4014,0x4020,0x402c,0x403a,0x4047,0x4053,0x4060,
+0xcfa,0x406d,0x407b,0x4095,0x409e,0x40ac,0x40ba,0x40c6,0x40d5,0x40e3,0x40f1,0x40fd,0x410c,0x411a,0x4128,0x4135,
+0x4144,0x415f,0x416e,0x417f,0x4190,0x41a3,0x41b5,0x41c4,0x41d6,0x41e5,0x41f1,0x41fc,0x1e0a,0x4209,0x4214,0x421f,
+0x422a,0x4235,0x4250,0x425b,0x4266,0x4271,0x4284,0x4298,0x42a3,0x42b2,0x42c1,0x42cc,0x42d7,0x42e4,0x42f3,0x4301,
+0x430c,0x4327,0x4331,0x4342,0x4353,0x4362,0x4373,0x437e,0x4389,0x4394,0x439f,0x43aa,0x43b5,0x43c0,0x43ca,0x43d5,
+0x43e5,0x43f0,0x43fe,0x440b,0x4416,0x4425,0x4432,0x443f,0x444e,0x445b,0x446c,0x447e,0x448e,0x4499,0x44ac,0x44c3,
+0x44d1,0x44de,0x44e9,0x44f6,0x4507,0x4523,0x4539,0x4544,0x4561,0x4571,0x4580,0x458b,0x4596,0x1f24,0x45a2,0x45ad,
+0x45c5,0x45d5,0x45e4,0x45f2,0x4600,0x460b,0x4616,0x462a,0x4641,0x4659,0x4669,0x4679,0x4689,0x469b,0x46a6,0x46b1,
+0x46bb,0x46c7,0x46d5,0x46e8,0x46f4,0x4701,0x470c,0x4728,0x4735,0x4743,0x475c,0x2824,0x476b,0x2645,0x4778,0x4786,
+0x4798,0x47a6,0x47b2,0x47c2,0x2a5f,0x47d0,0x47dc,0x47e7,0x47f2,0x47fd,0x4811,0x481f,0x4836,0x4842,0x4856,0x4864,
+0x4876,0x488c,0x489a,0x48ac,0x48ba,0x48d7,0x48e9,0x30fb,1,0,6,0x4910,0x4923,0x4933,0x4941,0x4952,
+0x4962,0x3157,0x12,0,1,0x498c,0x4992,0x3164,0x12,0,1,0x498c,0x4992,0x3171,1,0,
+3,0x498c,0x4992,0x49cb,0x3187,1,0,3,0x498c,0x4992,0x49cb,0x319d,1,0,0x12,0x4a55,
+0x4a5f,0x4a6b,0x4a72,0x4a7d,0x4a82,0x4a89,0x4a90,0x4a99,0x4a9e,0x4aa3,0x4ab3,0x85e,0x3dec,0x4abf,0x3df7,0x4acf,
+0x3e06,0x3246,1,0,0xf,0x4a55,0x4af6,0x4b00,0x4b0a,0x4b15,0x3cc2,0x4b1f,0x4b2b,0x4b33,0x4b3a,0x4b44,
+0x4a6b,0x4a72,0x4a82,0x4b4e,0x32cd,1,0,0x17,0x4a55,0x4b6b,0x4b0a,0x4b77,0x4b84,0x4b92,0x3cc2,0x4b9d,
+0x4a6b,0x4bae,0x4a82,0x4bbd,0x4bcb,0x85e,0x3dda,0x4bd7,0x4be8,0x3dec,0x4abf,0x3df7,0x4acf,0x3e06,0x4bf9,0x33ea,
+1,0,3,0x4c2c,0x4c34,0x4c3c,0x3403,1,0,0xf,0x4c65,0x4c6c,0x4c7b,0x4c9c,0x4cbf,0x4cca,
+0x4ce9,0x4d00,0x4d0d,0x4d16,0x4d35,0x4d68,0x4d83,0x4db2,0x4dcf,0x3493,1,0,0x24,0x4e12,0x4e1f,0x4e32,
+0x4e3f,0x4e6c,0x4e91,0x4ea6,0x4ec5,0x4ee6,0x4f13,0x4f4c,0x4f6f,0x4f92,0x4fbf,0x4ff4,0x501b,0x5044,0x507b,0x50aa,
+0x50cb,0x50f0,0x50ff,0x5122,0x5139,0x5146,0x5155,0x5172,0x518b,0x51ae,0x51d3,0x51ec,0x5201,0x5210,0x5221,0x522e,
+0x524f,0x3663,1,0,4,0x528d,0x5298,0x52b0,0x52c8,0x369f,0x36,1,2,4,8,0xe,
+0x10,0x20,0x3e,0x40,0x80,0x100,0x1c0,0x200,0x400,0x800,0xe00,0x1000,0x2000,0x4000,0x7000,0x8000,
+0x10000,0x20000,0x40000,0x78001,0x80000,0x100000,0x200000,0x400000,0x800000,0x1000000,0x2000000,0x4000000,0x8000000,0xf000000,0x10000000,0x20000000,
+0x30f80000,0x2fc2,0x2fd1,0x2fe6,0x2ffb,0x5301,0x3010,0x3024,0x52f7,0x3035,0x3049,0x305c,0x5312,0x306d,0x3086,0x3098,
+0x5329,0x30a9,0x30bd,0x30d0,0x5352,0x30e8,0x30fa,0x3105,0x3115,0x52ee,0x3123,0x3138,0x314d,0x3163,0x317d,0x3193,
+0x31a3,0x31b7,0x31cb,0x5348,0x31dc,0x31f4,0x5333
};
-const uint8_t PropNameData::bytesTries[14523]={
+const uint8_t PropNameData::bytesTries[14774]={
0,0x15,0x6d,0xc3,0x78,0x73,0xc2,0x12,0x76,0x7a,0x76,0x6a,0x77,0xa2,0x52,0x78,
1,0x64,0x50,0x69,0x10,0x64,1,0x63,0x30,0x73,0x62,0x13,0x74,0x61,0x72,0x74,
0x63,0x60,0x16,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x61,0x13,0x69,0x67,0x69,0x74,
@@ -282,88 +283,95 @@ const uint8_t PropNameData::bytesTries[14523]={
0x61,0x72,0x61,0x74,0x6f,0x72,0x2d,2,0x6c,0x3b,0x6e,0x2b,0x72,0x13,0x61,0x62,
0x69,0x63,1,0x6c,0x30,0x6e,0x14,0x75,0x6d,0x62,0x65,0x72,0x2b,0x14,0x65,0x74,
0x74,0x65,0x72,0x3b,0x2e,1,0x6e,0x45,0x6f,0x1c,0x75,0x6e,0x64,0x61,0x72,0x79,
-0x6e,0x65,0x75,0x74,0x72,0x61,0x6c,0x45,0,0x16,0x6d,0xc7,0xfe,0x74,0xc1,0xb8,
-0x77,0x57,0x77,0x48,0x79,0x5c,0x7a,0x1d,0x61,0x6e,0x61,0x62,0x61,0x7a,0x61,0x72,
-0x73,0x71,0x75,0x61,0x72,0x65,0xa5,0x18,0x18,0x61,0x72,0x61,0x6e,0x67,0x63,0x69,
-0x74,0x69,0xa3,0xfc,0x10,0x69,2,0x6a,0x3c,0x72,0x68,0x73,0x17,0x79,0x6c,0x6c,
-0x61,0x62,0x6c,0x65,0x73,0xa3,0x48,0x12,0x69,0x6e,0x67,0xa2,0x74,0x1e,0x68,0x65,
-0x78,0x61,0x67,0x72,0x61,0x6d,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0x74,0x16,
-0x61,0x64,0x69,0x63,0x61,0x6c,0x73,0xa3,0x49,0x74,0xa2,0x59,0x75,0xa4,0x12,0x76,
-2,0x61,0x36,0x65,0x7a,0x73,0xa2,0x6c,0x12,0x73,0x75,0x70,0xa3,0x7d,1,0x69,
-0xa3,0x9f,0x72,0x1e,0x69,0x61,0x74,0x69,0x6f,0x6e,0x73,0x65,0x6c,0x65,0x63,0x74,
-0x6f,0x72,0x73,0xa2,0x6c,0x19,0x73,0x75,0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,
-0xa3,0x7d,1,0x64,0x3c,0x72,0x19,0x74,0x69,0x63,0x61,0x6c,0x66,0x6f,0x72,0x6d,
-0x73,0xa3,0x91,0x14,0x69,0x63,0x65,0x78,0x74,0xa2,0xaf,0x16,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x73,0xa3,0xaf,4,0x61,0x68,0x65,0xa2,0x8a,0x68,0xa2,0x8d,0x69,0xa2,
-0x95,0x72,0x1c,0x61,0x6e,0x73,0x70,0x6f,0x72,0x74,0x61,0x6e,0x64,0x6d,0x61,0x70,
-0xa2,0xcf,0x16,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0xcf,4,0x67,0x58,0x69,
-0x7e,0x6b,0xa2,0x58,0x6d,0xa2,0x5a,0x6e,0x12,0x67,0x75,0x74,0xa4,0x10,0x19,0x63,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x73,0xa5,0x11,2,0x61,0x2a,0x62,0x32,
-0x73,0xa3,0x60,0x12,0x6c,0x6f,0x67,0xa3,0x62,0x13,0x61,0x6e,0x77,0x61,0xa3,0x65,
-3,0x6c,0x52,0x74,0x56,0x76,0x5e,0x78,0x16,0x75,0x61,0x6e,0x6a,0x69,0x6e,0x67,
-0xa2,0x7c,0x16,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0x7c,0x10,0x65,0xa3,0x70,
-0x12,0x68,0x61,0x6d,0xa3,0xae,0x12,0x69,0x65,0x74,0xa3,0xb7,0x11,0x72,0x69,0xa3,
-0xdc,0x11,0x69,0x6c,0x49,0x13,0x6c,0x75,0x67,0x75,0x4b,0x10,0x61,1,0x61,0x24,
-0x69,0x53,0x11,0x6e,0x61,0x3d,2,0x62,0x34,0x66,0x3c,0x72,0x13,0x68,0x75,0x74,
-0x61,0xa3,0xfb,0x13,0x65,0x74,0x61,0x6e,0x57,0x14,0x69,0x6e,0x61,0x67,0x68,0xa3,
-0x90,2,0x63,0x82,0x67,0x92,0x6e,0x1f,0x69,0x66,0x69,0x65,0x64,0x63,0x61,0x6e,
-0x61,0x64,0x69,0x61,0x6e,0x61,0x62,0x6f,0x1f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,
-0x73,0x79,0x6c,0x6c,0x61,0x62,0x69,0x63,0x73,0x62,0x17,0x65,0x78,0x74,0x65,0x6e,
-0x64,0x65,0x64,0xa3,0xad,0x11,0x61,0x73,0x62,0x12,0x65,0x78,0x74,0xa3,0xad,0x15,
-0x61,0x72,0x69,0x74,0x69,0x63,0xa3,0x78,0x70,0xc2,0xf5,0x70,0xa6,0xb,0x72,0xa6,
-0xc7,0x73,7,0x6f,0xc1,0x7f,0x6f,0x76,0x70,0xa2,0x47,0x75,0xa2,0x66,0x79,1,
-0x6c,0x4c,0x72,0x12,0x69,0x61,0x63,0x3a,0x12,0x73,0x75,0x70,0xa4,0x17,0x16,0x70,
-0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa5,0x17,0x17,0x6f,0x74,0x69,0x6e,0x61,0x67,0x72,
-0x69,0xa3,0x8f,2,0x67,0x34,0x72,0x3e,0x79,0x13,0x6f,0x6d,0x62,0x6f,0xa5,0x16,
-0x13,0x64,0x69,0x61,0x6e,0xa5,0x23,0x17,0x61,0x73,0x6f,0x6d,0x70,0x65,0x6e,0x67,
-0xa3,0xda,1,0x61,0x32,0x65,0x14,0x63,0x69,0x61,0x6c,0x73,0xa3,0x56,0x12,0x63,
-0x69,0x6e,0x1f,0x67,0x6d,0x6f,0x64,0x69,0x66,0x69,0x65,0x72,0x6c,0x65,0x74,0x74,
-0x65,0x72,0x73,0x2d,2,0x6e,0x48,0x70,0x76,0x74,0x1d,0x74,0x6f,0x6e,0x73,0x69,
-0x67,0x6e,0x77,0x72,0x69,0x74,0x69,0x6e,0x67,0xa5,6,0x15,0x64,0x61,0x6e,0x65,
-0x73,0x65,0xa2,0x9b,0x12,0x73,0x75,0x70,0xa2,0xdb,0x16,0x70,0x6c,0x65,0x6d,0x65,
-0x6e,0x74,0xa3,0xdb,4,0x61,0xa2,0xa8,0x65,0x5c,0x6d,0x9e,0x70,0xa2,0x4b,0x73,
-0x13,0x79,0x6d,0x62,0x6f,0x1f,0x6c,0x73,0x61,0x6e,0x64,0x70,0x69,0x63,0x74,0x6f,
-0x67,0x72,0x61,0x70,0x68,0x73,0xa5,5,0x10,0x72,1,0x61,0x4e,0x73,0x12,0x63,
-0x72,0x69,0x1f,0x70,0x74,0x73,0x61,0x6e,0x64,0x73,0x75,0x62,0x73,0x63,0x72,0x69,
-0x70,0x74,0x73,0x73,0x14,0x6e,0x64,0x73,0x75,0x62,0x73,0x1b,0x61,0x74,0x68,0x6f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x73,0xa3,0x6a,1,0x6c,0x40,0x75,1,0x61,
-0x6e,0x6e,0x17,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xa3,0x8e,0x15,0x65,0x6d,
-0x65,0x6e,0x74,0x61,1,0x6c,0x50,0x72,0x1e,0x79,0x70,0x72,0x69,0x76,0x61,0x74,
-0x65,0x75,0x73,0x65,0x61,0x72,0x65,0x61,1,0x61,0xa3,0x6d,0x62,0xa3,0x6e,3,
-0x61,0x5c,0x6d,0x78,0x70,0xa2,0x41,0x73,0x13,0x79,0x6d,0x62,0x6f,0x1f,0x6c,0x73,
-0x61,0x6e,0x64,0x70,0x69,0x63,0x74,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa5,5,
-0x14,0x72,0x72,0x6f,0x77,0x73,2,0x61,0xa3,0x67,0x62,0xa3,0x68,0x63,0xa3,0xfa,
-0x13,0x61,0x74,0x68,0x65,0x1f,0x6d,0x61,0x74,0x69,0x63,0x61,0x6c,0x6f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x73,0xa3,0x6a,0x19,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,
-0x69,0x6f,0x6e,0xa3,0x8e,0x61,0x5a,0x68,0x84,0x69,0xa2,0x5b,0x6d,0x16,0x61,0x6c,
-0x6c,0x66,0x6f,0x72,0x6d,1,0x73,0xa3,0x54,0x76,0x16,0x61,0x72,0x69,0x61,0x6e,
-0x74,0x73,0xa3,0x54,1,0x6d,0x36,0x75,0x16,0x72,0x61,0x73,0x68,0x74,0x72,0x61,
-0xa3,0xa1,0x15,0x61,0x72,0x69,0x74,0x61,0x6e,0xa3,0xac,1,0x61,0x52,0x6f,0x13,
-0x72,0x74,0x68,0x61,0x1f,0x6e,0x64,0x66,0x6f,0x72,0x6d,0x61,0x74,0x63,0x6f,0x6e,
-0x74,0x72,0x6f,0x6c,0x73,0xa3,0xf7,1,0x72,0x2e,0x76,0x12,0x69,0x61,0x6e,0xa3,
-0x79,0x12,0x61,0x64,0x61,0xa3,0xd9,1,0x64,0x50,0x6e,0x13,0x68,0x61,0x6c,0x61,
-0x50,0x1d,0x61,0x72,0x63,0x68,0x61,0x69,0x63,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,
-0xa3,0xf9,0x13,0x64,0x68,0x61,0x6d,0xa3,0xf8,5,0x72,0x35,0x72,0x44,0x73,0x64,
-0x75,1,0x61,0xa3,0x4e,0x6e,0x17,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x71,
-0x17,0x69,0x76,0x61,0x74,0x65,0x75,0x73,0x65,0xa2,0x4e,0x13,0x61,0x72,0x65,0x61,
-0xa3,0x4e,0x1b,0x61,0x6c,0x74,0x65,0x72,0x70,0x61,0x68,0x6c,0x61,0x76,0x69,0xa3,
-0xf6,0x61,0x40,0x68,0x82,0x6c,0x19,0x61,0x79,0x69,0x6e,0x67,0x63,0x61,0x72,0x64,
-0x73,0xa3,0xcc,2,0x68,0x38,0x6c,0x4a,0x75,0x15,0x63,0x69,0x6e,0x68,0x61,0x75,
-0xa3,0xf5,0x17,0x61,0x77,0x68,0x68,0x6d,0x6f,0x6e,0x67,0xa3,0xf3,0x15,0x6d,0x79,
-0x72,0x65,0x6e,0x65,0xa3,0xf4,1,0x61,0x8e,0x6f,1,0x65,0x74,0x6e,0x16,0x65,
-0x74,0x69,0x63,0x65,0x78,0x74,0xa2,0x72,1,0x65,0x2c,0x73,0x11,0x75,0x70,0xa3,
-0x8d,0x15,0x6e,0x73,0x69,0x6f,0x6e,0x73,0xa2,0x72,0x19,0x73,0x75,0x70,0x70,0x6c,
-0x65,0x6d,0x65,0x6e,0x74,0xa3,0x8d,0x15,0x6e,0x69,0x63,0x69,0x61,0x6e,0xa3,0x97,
-1,0x67,0x3e,0x69,0x13,0x73,0x74,0x6f,0x73,0xa2,0xa6,0x13,0x64,0x69,0x73,0x63,
-0xa3,0xa6,0x12,0x73,0x70,0x61,0xa3,0x96,1,0x65,0x5c,0x75,1,0x6d,0x2a,0x6e,
-0x11,0x69,0x63,0x67,0x10,0x69,0xa2,0xc0,0x1d,0x6e,0x75,0x6d,0x65,0x72,0x61,0x6c,
-0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0xc0,0x13,0x6a,0x61,0x6e,0x67,0xa3,0xa3,
-0x6d,0xa2,0xce,0x6e,0xa8,1,0x6f,5,0x70,0x4b,0x70,0x46,0x72,0x7a,0x73,1,
-0x61,0x30,0x6d,0x13,0x61,0x6e,0x79,0x61,0xa3,0x7a,0x11,0x67,0x65,0xa5,0xf,0x18,
+0x6e,0x65,0x75,0x74,0x72,0x61,0x6c,0x45,0,0x16,0x6d,0xc8,0x94,0x74,0xc1,0xd2,
+0x77,0x61,0x77,0x48,0x79,0x70,0x7a,0x1d,0x61,0x6e,0x61,0x62,0x61,0x7a,0x61,0x72,
+0x73,0x71,0x75,0x61,0x72,0x65,0xa5,0x18,0x10,0x61,1,0x6e,0x36,0x72,0x16,0x61,
+0x6e,0x67,0x63,0x69,0x74,0x69,0xa3,0xfc,0x12,0x63,0x68,0x6f,0xa5,0x2c,0x10,0x69,
+2,0x6a,0x3c,0x72,0x68,0x73,0x17,0x79,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x73,0xa3,
+0x48,0x12,0x69,0x6e,0x67,0xa2,0x74,0x1e,0x68,0x65,0x78,0x61,0x67,0x72,0x61,0x6d,
+0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0x74,0x16,0x61,0x64,0x69,0x63,0x61,0x6c,
+0x73,0xa3,0x49,0x74,0xa2,0x59,0x75,0xa4,0x22,0x76,2,0x61,0x36,0x65,0x7a,0x73,
+0xa2,0x6c,0x12,0x73,0x75,0x70,0xa3,0x7d,1,0x69,0xa3,0x9f,0x72,0x1e,0x69,0x61,
+0x74,0x69,0x6f,0x6e,0x73,0x65,0x6c,0x65,0x63,0x74,0x6f,0x72,0x73,0xa2,0x6c,0x19,
+0x73,0x75,0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x7d,1,0x64,0x3c,0x72,
+0x19,0x74,0x69,0x63,0x61,0x6c,0x66,0x6f,0x72,0x6d,0x73,0xa3,0x91,0x14,0x69,0x63,
+0x65,0x78,0x74,0xa2,0xaf,0x16,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73,0xa3,0xaf,4,
+0x61,0x68,0x65,0xa2,0x9a,0x68,0xa2,0x9d,0x69,0xa2,0xa5,0x72,0x1c,0x61,0x6e,0x73,
+0x70,0x6f,0x72,0x74,0x61,0x6e,0x64,0x6d,0x61,0x70,0xa2,0xcf,0x16,0x73,0x79,0x6d,
+0x62,0x6f,0x6c,0x73,0xa3,0xcf,4,0x67,0x58,0x69,0x7e,0x6b,0xa2,0x58,0x6d,0xa2,
+0x5a,0x6e,0x12,0x67,0x75,0x74,0xa4,0x10,0x19,0x63,0x6f,0x6d,0x70,0x6f,0x6e,0x65,
+0x6e,0x74,0x73,0xa5,0x11,2,0x61,0x2a,0x62,0x32,0x73,0xa3,0x60,0x12,0x6c,0x6f,
+0x67,0xa3,0x62,0x13,0x61,0x6e,0x77,0x61,0xa3,0x65,3,0x6c,0x52,0x74,0x56,0x76,
+0x5e,0x78,0x16,0x75,0x61,0x6e,0x6a,0x69,0x6e,0x67,0xa2,0x7c,0x16,0x73,0x79,0x6d,
+0x62,0x6f,0x6c,0x73,0xa3,0x7c,0x10,0x65,0xa3,0x70,0x12,0x68,0x61,0x6d,0xa3,0xae,
+0x12,0x69,0x65,0x74,0xa3,0xb7,0x11,0x72,0x69,0xa3,0xdc,0x11,0x69,0x6c,0x48,0x12,
+0x73,0x75,0x70,0xa4,0x2b,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa5,0x2b,0x13,
+0x6c,0x75,0x67,0x75,0x4b,0x10,0x61,1,0x61,0x24,0x69,0x53,0x11,0x6e,0x61,0x3d,
+2,0x62,0x34,0x66,0x3c,0x72,0x13,0x68,0x75,0x74,0x61,0xa3,0xfb,0x13,0x65,0x74,
+0x61,0x6e,0x57,0x14,0x69,0x6e,0x61,0x67,0x68,0xa3,0x90,2,0x63,0x82,0x67,0x92,
+0x6e,0x1f,0x69,0x66,0x69,0x65,0x64,0x63,0x61,0x6e,0x61,0x64,0x69,0x61,0x6e,0x61,
+0x62,0x6f,0x1f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x73,0x79,0x6c,0x6c,0x61,0x62,
+0x69,0x63,0x73,0x62,0x17,0x65,0x78,0x74,0x65,0x6e,0x64,0x65,0x64,0xa3,0xad,0x11,
+0x61,0x73,0x62,0x12,0x65,0x78,0x74,0xa3,0xad,0x15,0x61,0x72,0x69,0x74,0x69,0x63,
+0xa3,0x78,0x70,0xc3,0x33,0x70,0xa6,0x49,0x72,0xa8,5,0x73,7,0x6f,0xc1,0xa6,
+0x6f,0xa2,0x51,0x70,0xa2,0x6d,0x75,0xa2,0x8c,0x79,2,0x6c,0x50,0x6d,0x62,0x72,
+0x12,0x69,0x61,0x63,0x3a,0x12,0x73,0x75,0x70,0xa4,0x17,0x16,0x70,0x6c,0x65,0x6d,
+0x65,0x6e,0x74,0xa5,0x17,0x17,0x6f,0x74,0x69,0x6e,0x61,0x67,0x72,0x69,0xa3,0x8f,
+0x14,0x62,0x6f,0x6c,0x73,0x61,0x1f,0x6e,0x64,0x70,0x69,0x63,0x74,0x6f,0x67,0x72,
+0x61,0x70,0x68,0x73,0x65,0x78,0x74,1,0x61,0xa5,0x2a,0x65,0x14,0x6e,0x64,0x65,
+0x64,0x61,0xa5,0x2a,2,0x67,0x34,0x72,0x3e,0x79,0x13,0x6f,0x6d,0x62,0x6f,0xa5,
+0x16,0x13,0x64,0x69,0x61,0x6e,0xa5,0x23,0x17,0x61,0x73,0x6f,0x6d,0x70,0x65,0x6e,
+0x67,0xa3,0xda,1,0x61,0x32,0x65,0x14,0x63,0x69,0x61,0x6c,0x73,0xa3,0x56,0x12,
+0x63,0x69,0x6e,0x1f,0x67,0x6d,0x6f,0x64,0x69,0x66,0x69,0x65,0x72,0x6c,0x65,0x74,
+0x74,0x65,0x72,0x73,0x2d,2,0x6e,0x48,0x70,0x76,0x74,0x1d,0x74,0x6f,0x6e,0x73,
+0x69,0x67,0x6e,0x77,0x72,0x69,0x74,0x69,0x6e,0x67,0xa5,6,0x15,0x64,0x61,0x6e,
+0x65,0x73,0x65,0xa2,0x9b,0x12,0x73,0x75,0x70,0xa2,0xdb,0x16,0x70,0x6c,0x65,0x6d,
+0x65,0x6e,0x74,0xa3,0xdb,4,0x61,0xa2,0xa8,0x65,0x5c,0x6d,0x9e,0x70,0xa2,0x4b,
+0x73,0x13,0x79,0x6d,0x62,0x6f,0x1f,0x6c,0x73,0x61,0x6e,0x64,0x70,0x69,0x63,0x74,
+0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa5,5,0x10,0x72,1,0x61,0x4e,0x73,0x12,
+0x63,0x72,0x69,0x1f,0x70,0x74,0x73,0x61,0x6e,0x64,0x73,0x75,0x62,0x73,0x63,0x72,
+0x69,0x70,0x74,0x73,0x73,0x14,0x6e,0x64,0x73,0x75,0x62,0x73,0x1b,0x61,0x74,0x68,
+0x6f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x73,0xa3,0x6a,1,0x6c,0x40,0x75,1,
+0x61,0x6e,0x6e,0x17,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xa3,0x8e,0x15,0x65,
+0x6d,0x65,0x6e,0x74,0x61,1,0x6c,0x50,0x72,0x1e,0x79,0x70,0x72,0x69,0x76,0x61,
+0x74,0x65,0x75,0x73,0x65,0x61,0x72,0x65,0x61,1,0x61,0xa3,0x6d,0x62,0xa3,0x6e,
+3,0x61,0x5c,0x6d,0x78,0x70,0xa2,0x41,0x73,0x13,0x79,0x6d,0x62,0x6f,0x1f,0x6c,
+0x73,0x61,0x6e,0x64,0x70,0x69,0x63,0x74,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa5,
+5,0x14,0x72,0x72,0x6f,0x77,0x73,2,0x61,0xa3,0x67,0x62,0xa3,0x68,0x63,0xa3,
+0xfa,0x13,0x61,0x74,0x68,0x65,0x1f,0x6d,0x61,0x74,0x69,0x63,0x61,0x6c,0x6f,0x70,
+0x65,0x72,0x61,0x74,0x6f,0x72,0x73,0xa3,0x6a,0x19,0x75,0x6e,0x63,0x74,0x75,0x61,
+0x74,0x69,0x6f,0x6e,0xa3,0x8e,0x61,0x88,0x68,0xa2,0x48,0x69,0xa2,0x71,0x6d,0x12,
+0x61,0x6c,0x6c,1,0x66,0x46,0x6b,0x15,0x61,0x6e,0x61,0x65,0x78,0x74,0xa4,0x29,
+0x15,0x65,0x6e,0x73,0x69,0x6f,0x6e,0xa5,0x29,0x12,0x6f,0x72,0x6d,1,0x73,0xa3,
+0x54,0x76,0x16,0x61,0x72,0x69,0x61,0x6e,0x74,0x73,0xa3,0x54,1,0x6d,0x36,0x75,
+0x16,0x72,0x61,0x73,0x68,0x74,0x72,0x61,0xa3,0xa1,0x15,0x61,0x72,0x69,0x74,0x61,
+0x6e,0xa3,0xac,1,0x61,0x52,0x6f,0x13,0x72,0x74,0x68,0x61,0x1f,0x6e,0x64,0x66,
+0x6f,0x72,0x6d,0x61,0x74,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x73,0xa3,0xf7,1,
+0x72,0x2e,0x76,0x12,0x69,0x61,0x6e,0xa3,0x79,0x12,0x61,0x64,0x61,0xa3,0xd9,1,
+0x64,0x50,0x6e,0x13,0x68,0x61,0x6c,0x61,0x50,0x1d,0x61,0x72,0x63,0x68,0x61,0x69,
+0x63,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0xa3,0xf9,0x13,0x64,0x68,0x61,0x6d,0xa3,
+0xf8,5,0x72,0x35,0x72,0x44,0x73,0x64,0x75,1,0x61,0xa3,0x4e,0x6e,0x17,0x63,
+0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x71,0x17,0x69,0x76,0x61,0x74,0x65,0x75,0x73,
+0x65,0xa2,0x4e,0x13,0x61,0x72,0x65,0x61,0xa3,0x4e,0x1b,0x61,0x6c,0x74,0x65,0x72,
+0x70,0x61,0x68,0x6c,0x61,0x76,0x69,0xa3,0xf6,0x61,0x40,0x68,0x82,0x6c,0x19,0x61,
+0x79,0x69,0x6e,0x67,0x63,0x61,0x72,0x64,0x73,0xa3,0xcc,2,0x68,0x38,0x6c,0x4a,
+0x75,0x15,0x63,0x69,0x6e,0x68,0x61,0x75,0xa3,0xf5,0x17,0x61,0x77,0x68,0x68,0x6d,
+0x6f,0x6e,0x67,0xa3,0xf3,0x15,0x6d,0x79,0x72,0x65,0x6e,0x65,0xa3,0xf4,1,0x61,
+0x8e,0x6f,1,0x65,0x74,0x6e,0x16,0x65,0x74,0x69,0x63,0x65,0x78,0x74,0xa2,0x72,
+1,0x65,0x2c,0x73,0x11,0x75,0x70,0xa3,0x8d,0x15,0x6e,0x73,0x69,0x6f,0x6e,0x73,
+0xa2,0x72,0x19,0x73,0x75,0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x8d,0x15,
+0x6e,0x69,0x63,0x69,0x61,0x6e,0xa3,0x97,1,0x67,0x3e,0x69,0x13,0x73,0x74,0x6f,
+0x73,0xa2,0xa6,0x13,0x64,0x69,0x73,0x63,0xa3,0xa6,0x12,0x73,0x70,0x61,0xa3,0x96,
+1,0x65,0x5c,0x75,1,0x6d,0x2a,0x6e,0x11,0x69,0x63,0x67,0x10,0x69,0xa2,0xc0,
+0x1d,0x6e,0x75,0x6d,0x65,0x72,0x61,0x6c,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,
+0xc0,0x13,0x6a,0x61,0x6e,0x67,0xa3,0xa3,0x6d,0xa2,0xe6,0x6e,0xa8,0x19,0x6f,6,
+0x70,0x63,0x70,0x56,0x72,0x8a,0x73,0xa2,0x4c,0x74,0x10,0x74,0x1f,0x6f,0x6d,0x61,
+0x6e,0x73,0x69,0x79,0x61,0x71,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0xa5,0x28,0x18,
0x74,0x69,0x63,0x61,0x6c,0x63,0x68,0x61,0x72,0x1f,0x61,0x63,0x74,0x65,0x72,0x72,
0x65,0x63,0x6f,0x67,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x85,1,0x69,0x46,0x6e,0x1e,
0x61,0x6d,0x65,0x6e,0x74,0x61,0x6c,0x64,0x69,0x6e,0x67,0x62,0x61,0x74,0x73,0xa3,
-0xf2,0x11,0x79,0x61,0x47,0x63,0xa2,0x71,0x67,0xa2,0x71,0x6c,1,0x63,0xa2,0x62,
+0xf2,0x11,0x79,0x61,0x47,1,0x61,0x30,0x6d,0x13,0x61,0x6e,0x79,0x61,0xa3,0x7a,
+0x11,0x67,0x65,0xa5,0xf,0x63,0xa2,0x71,0x67,0xa2,0x71,0x6c,1,0x63,0xa2,0x62,
0x64,5,0x70,0x38,0x70,0x36,0x73,0x56,0x74,0x14,0x75,0x72,0x6b,0x69,0x63,0xa3,
0xbf,0x11,0x65,0x72,1,0x6d,0x2e,0x73,0x12,0x69,0x61,0x6e,0xa3,0x8c,0x11,0x69,
0x63,0xa3,0xf1,0x10,0x6f,1,0x67,0x3a,0x75,0x18,0x74,0x68,0x61,0x72,0x61,0x62,
@@ -406,615 +414,624 @@ const uint8_t PropNameData::bytesTries[14523]={
0x69,0x76,0x65,0xa3,0xd6,0x17,0x65,0x66,0x61,0x69,0x64,0x72,0x69,0x6e,0xa5,0x21,
0x17,0x74,0x65,0x69,0x6d,0x61,0x79,0x65,0x6b,0xa2,0xb8,0x12,0x65,0x78,0x74,0xa2,
0xd5,0x16,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73,0xa3,0xd5,0x18,0x64,0x65,0x6b,0x69,
-0x6b,0x61,0x6b,0x75,0x69,0xa3,0xeb,5,0x6b,0x23,0x6b,0x4c,0x6f,0x50,0x75,1,
-0x6d,0x2c,0x73,0x11,0x68,0x75,0xa5,0x15,0x17,0x62,0x65,0x72,0x66,0x6f,0x72,0x6d,
-0x73,0x7b,0x10,0x6f,0xa3,0x92,0x14,0x62,0x6c,0x6f,0x63,0x6b,0x21,0x61,0x44,0x62,
-0x21,0x65,0x10,0x77,1,0x61,0xa5,0xe,0x74,0x14,0x61,0x69,0x6c,0x75,0x65,0xa3,
-0x8b,0x16,0x62,0x61,0x74,0x61,0x65,0x61,0x6e,0xa3,0xef,0x67,0xc4,0xe,0x6a,0xc1,
-0x95,0x6a,0xa2,0xc5,0x6b,0xa2,0xde,0x6c,4,0x61,0x54,0x65,0xa2,0x61,0x69,0xa2,
-0x78,0x6f,0xa2,0xa7,0x79,1,0x63,0x2e,0x64,0x12,0x69,0x61,0x6e,0xa3,0xa9,0x12,
-0x69,0x61,0x6e,0xa3,0xa7,1,0x6f,0x55,0x74,0x11,0x69,0x6e,1,0x31,0x82,0x65,
-0x11,0x78,0x74,4,0x61,0x5c,0x62,0x29,0x63,0xa3,0x94,0x64,0xa3,0x95,0x65,0xa2,
-0xe7,0x13,0x6e,0x64,0x65,0x64,4,0x61,0x36,0x62,0x29,0x63,0xa3,0x94,0x64,0xa3,
-0x95,0x65,0xa3,0xe7,0x26,0x18,0x64,0x64,0x69,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x6d,
-0x24,0x12,0x73,0x75,0x70,0x24,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x25,1,
-0x70,0x42,0x74,0x1d,0x74,0x65,0x72,0x6c,0x69,0x6b,0x65,0x73,0x79,0x6d,0x62,0x6f,
-0x6c,0x73,0x79,0x12,0x63,0x68,0x61,0xa3,0x9c,2,0x6d,0x2e,0x6e,0x34,0x73,0x10,
-0x75,0xa3,0xb0,0x11,0x62,0x75,0xa3,0x6f,0x12,0x65,0x61,0x72,1,0x61,0xa3,0xe8,
-0x62,1,0x69,0x38,0x73,0x17,0x79,0x6c,0x6c,0x61,0x62,0x61,0x72,0x79,0xa3,0x75,
-0x17,0x64,0x65,0x6f,0x67,0x72,0x61,0x6d,0x73,0xa3,0x76,0x1a,0x77,0x73,0x75,0x72,
-0x72,0x6f,0x67,0x61,0x74,0x65,0x73,0xa3,0x4d,0x10,0x61,1,0x6d,0x32,0x76,0x14,
-0x61,0x6e,0x65,0x73,0x65,0xa3,0xb5,0x10,0x6f,0x5c,0x12,0x65,0x78,0x74,1,0x61,
-0xa3,0xb4,0x62,0xa3,0xb9,1,0x61,0x80,0x68,3,0x61,0x3c,0x6d,0x4c,0x6f,0x64,
-0x75,0x15,0x64,0x61,0x77,0x61,0x64,0x69,0xa3,0xe6,0x16,0x72,0x6f,0x73,0x68,0x74,
-0x68,0x69,0xa3,0x89,0x11,0x65,0x72,0x68,0x16,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,
-0xa3,0x71,0x12,0x6a,0x6b,0x69,0xa3,0xe5,3,0x69,0x3a,0x6e,0x42,0x74,0xa2,0x51,
-0x79,0x13,0x61,0x68,0x6c,0x69,0xa3,0xa2,0x12,0x74,0x68,0x69,0xa3,0xc1,3,0x61,
-0x34,0x62,0x76,0x67,0x7c,0x6e,0x12,0x61,0x64,0x61,0x4d,1,0x65,0x40,0x73,0x11,
-0x75,0x70,0xa2,0xcb,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0xcb,0x11,0x78,
-0x74,1,0x61,0xa5,0x13,0x65,0x14,0x6e,0x64,0x65,0x64,0x61,0xa5,0x13,0x11,0x75,
-0x6e,0xa3,0x42,0x11,0x78,0x69,0x96,0x17,0x72,0x61,0x64,0x69,0x63,0x61,0x6c,0x73,
-0x97,0x14,0x61,0x6b,0x61,0x6e,0x61,0x9e,1,0x65,0x4c,0x70,0x10,0x68,0x1f,0x6f,
-0x6e,0x65,0x74,0x69,0x63,0x65,0x78,0x74,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73,0xa3,
-0x6b,0x11,0x78,0x74,0xa3,0x6b,0x67,0xa2,0xb5,0x68,0xa4,0x84,0x69,3,0x64,0x4c,
-0x6d,0xa2,0x55,0x6e,0xa2,0x62,0x70,0x13,0x61,0x65,0x78,0x74,0x2a,0x16,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x73,0x2b,1,0x63,0x99,0x65,0x17,0x6f,0x67,0x72,0x61,0x70,
-0x68,0x69,0x63,1,0x64,0x56,0x73,0x15,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa4,0xb,
-0x1d,0x61,0x6e,0x64,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xa5,
-0xb,0x13,0x65,0x73,0x63,0x72,0x1f,0x69,0x70,0x74,0x69,0x6f,0x6e,0x63,0x68,0x61,
-0x72,0x61,0x63,0x74,0x65,0x72,0x73,0x99,0x1c,0x70,0x65,0x72,0x69,0x61,0x6c,0x61,
-0x72,0x61,0x6d,0x61,0x69,0x63,0xa3,0xba,1,0x64,0x62,0x73,0x1b,0x63,0x72,0x69,
-0x70,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x70,0x61,1,0x68,0x32,0x72,0x14,0x74,0x68,
-0x69,0x61,0x6e,0xa3,0xbd,0x13,0x6c,0x61,0x76,0x69,0xa3,0xbe,0x11,0x69,0x63,1,
-0x6e,0x3e,0x73,0x1a,0x69,0x79,0x61,0x71,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0xa5,
-0x1e,0x19,0x75,0x6d,0x62,0x65,0x72,0x66,0x6f,0x72,0x6d,0x73,0xa3,0xb2,4,0x65,
-0x74,0x6c,0xa2,0x82,0x6f,0xa2,0x9a,0x72,0xa2,0x9e,0x75,2,0x6a,0x34,0x6e,0x3e,
-0x72,0x14,0x6d,0x75,0x6b,0x68,0x69,0x43,0x14,0x61,0x72,0x61,0x74,0x69,0x45,0x18,
-0x6a,0x61,0x6c,0x61,0x67,0x6f,0x6e,0x64,0x69,0xa5,0x1c,1,0x6e,0xa2,0x46,0x6f,
-1,0x6d,0x6e,0x72,0x13,0x67,0x69,0x61,0x6e,0x5a,1,0x65,0x40,0x73,0x11,0x75,
-0x70,0xa2,0x87,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x87,0x11,0x78,0x74,
-0xa4,0x1b,0x14,0x65,0x6e,0x64,0x65,0x64,0xa5,0x1b,0x1a,0x65,0x74,0x72,0x69,0x63,
-0x73,0x68,0x61,0x70,0x65,0x73,0x8c,0x12,0x65,0x78,0x74,0xa2,0xe3,0x14,0x65,0x6e,
-0x64,0x65,0x64,0xa3,0xe3,0x1e,0x65,0x72,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,0x75,
-0x61,0x74,0x69,0x6f,0x6e,0x71,0x17,0x61,0x67,0x6f,0x6c,0x69,0x74,0x69,0x63,0xa2,
-0x88,0x12,0x73,0x75,0x70,0xa4,0xa,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa5,
-0xa,0x13,0x74,0x68,0x69,0x63,0xa3,0x59,1,0x61,0x5c,0x65,0x11,0x65,0x6b,0x30,
-1,0x61,0x38,0x65,0x11,0x78,0x74,0x6e,0x14,0x65,0x6e,0x64,0x65,0x64,0x6f,0x17,
-0x6e,0x64,0x63,0x6f,0x70,0x74,0x69,0x63,0x31,0x13,0x6e,0x74,0x68,0x61,0xa3,0xe4,
-2,0x61,0xa2,0x48,0x65,0xa2,0xdf,0x69,1,0x67,0x30,0x72,0x14,0x61,0x67,0x61,
-0x6e,0x61,0x9d,0x10,0x68,1,0x70,0x3a,0x73,0x18,0x75,0x72,0x72,0x6f,0x67,0x61,
-0x74,0x65,0x73,0xa3,0x4b,1,0x72,0x3c,0x75,0x19,0x73,0x75,0x72,0x72,0x6f,0x67,
-0x61,0x74,0x65,0x73,0xa3,0x4c,0x11,0x69,0x76,0x1f,0x61,0x74,0x65,0x75,0x73,0x65,
-0x73,0x75,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x73,0xa3,0x4c,2,0x6c,0x32,0x6e,
-0x9a,0x74,0x12,0x72,0x61,0x6e,0xa5,2,0x10,0x66,2,0x61,0x58,0x6d,0x70,0x77,
-0x14,0x69,0x64,0x74,0x68,0x61,0x1f,0x6e,0x64,0x66,0x75,0x6c,0x6c,0x77,0x69,0x64,
-0x74,0x68,0x66,0x6f,0x72,0x6d,0x73,0xa3,0x57,0x1a,0x6e,0x64,0x66,0x75,0x6c,0x6c,
-0x66,0x6f,0x72,0x6d,0x73,0xa3,0x57,0x13,0x61,0x72,0x6b,0x73,0xa3,0x52,2,0x67,
-0x34,0x69,0xa2,0x45,0x75,0x12,0x6e,0x6f,0x6f,0xa3,0x63,0x11,0x75,0x6c,0xa2,0x4a,
-2,0x63,0x3c,0x6a,0x5e,0x73,0x17,0x79,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x73,0xa3,
-0x4a,0x1f,0x6f,0x6d,0x70,0x61,0x74,0x69,0x62,0x69,0x6c,0x69,0x74,0x79,0x6a,0x61,
-0x6d,0x6f,0xa3,0x41,0x12,0x61,0x6d,0x6f,0x5c,0x17,0x65,0x78,0x74,0x65,0x6e,0x64,
-0x65,0x64,1,0x61,0xa3,0xb4,0x62,0xa3,0xb9,0x19,0x66,0x69,0x72,0x6f,0x68,0x69,
-0x6e,0x67,0x79,0x61,0xa5,0x1d,0x13,0x62,0x72,0x65,0x77,0x37,0x61,0xa2,0xe9,0x62,
-0xa6,0x29,0x63,0xa6,0xfe,0x64,0xac,0x8a,0x65,5,0x6d,0xa2,0x6d,0x86,0x6e,0x96,
-0x74,0x15,0x68,0x69,0x6f,0x70,0x69,0x63,0x5e,1,0x65,0x40,0x73,0x11,0x75,0x70,
-0xa2,0x86,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x86,0x11,0x78,0x74,0xa2,
-0x85,1,0x61,0xa3,0xc8,0x65,0x13,0x6e,0x64,0x65,0x64,0xa2,0x85,0x10,0x61,0xa3,
-0xc8,0x16,0x6f,0x74,0x69,0x63,0x6f,0x6e,0x73,0xa3,0xce,0x15,0x63,0x6c,0x6f,0x73,
-0x65,0x64,2,0x61,0x5a,0x63,0x9e,0x69,0x1c,0x64,0x65,0x6f,0x67,0x72,0x61,0x70,
-0x68,0x69,0x63,0x73,0x75,0x70,0xa2,0xc4,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,
-0xa3,0xc4,0x16,0x6c,0x70,0x68,0x61,0x6e,0x75,0x6d,0x86,1,0x65,0x2c,0x73,0x11,
-0x75,0x70,0xa3,0xc3,0x13,0x72,0x69,0x63,0x73,0x86,0x18,0x75,0x70,0x70,0x6c,0x65,
-0x6d,0x65,0x6e,0x74,0xa3,0xc3,0x11,0x6a,0x6b,0xa2,0x44,0x1f,0x6c,0x65,0x74,0x74,
-0x65,0x72,0x73,0x61,0x6e,0x64,0x6d,0x6f,0x6e,0x74,0x68,0x73,0xa3,0x44,0x61,0x36,
-0x67,0x62,0x6c,0x14,0x62,0x61,0x73,0x61,0x6e,0xa3,0xe2,0x13,0x72,0x6c,0x79,0x64,
+0x6b,0x61,0x6b,0x75,0x69,0xa3,0xeb,6,0x6b,0x3b,0x6b,0x56,0x6f,0x5a,0x75,0x64,
+0x79,0x11,0x69,0x61,0x1f,0x6b,0x65,0x6e,0x67,0x70,0x75,0x61,0x63,0x68,0x75,0x65,
+0x68,0x6d,0x6f,0x6e,0x67,0xa5,0x27,0x10,0x6f,0xa3,0x92,0x14,0x62,0x6c,0x6f,0x63,
+0x6b,0x21,1,0x6d,0x2c,0x73,0x11,0x68,0x75,0xa5,0x15,0x17,0x62,0x65,0x72,0x66,
+0x6f,0x72,0x6d,0x73,0x7b,0x61,0x44,0x62,0x21,0x65,0x10,0x77,1,0x61,0xa5,0xe,
+0x74,0x14,0x61,0x69,0x6c,0x75,0x65,0xa3,0x8b,1,0x62,0x38,0x6e,0x17,0x64,0x69,
+0x6e,0x61,0x67,0x61,0x72,0x69,0xa5,0x26,0x15,0x61,0x74,0x61,0x65,0x61,0x6e,0xa3,
+0xef,0x67,0xc4,0xe,0x6a,0xc1,0x95,0x6a,0xa2,0xc5,0x6b,0xa2,0xde,0x6c,4,0x61,
+0x54,0x65,0xa2,0x61,0x69,0xa2,0x78,0x6f,0xa2,0xa7,0x79,1,0x63,0x2e,0x64,0x12,
+0x69,0x61,0x6e,0xa3,0xa9,0x12,0x69,0x61,0x6e,0xa3,0xa7,1,0x6f,0x55,0x74,0x11,
+0x69,0x6e,1,0x31,0x82,0x65,0x11,0x78,0x74,4,0x61,0x5c,0x62,0x29,0x63,0xa3,
+0x94,0x64,0xa3,0x95,0x65,0xa2,0xe7,0x13,0x6e,0x64,0x65,0x64,4,0x61,0x36,0x62,
+0x29,0x63,0xa3,0x94,0x64,0xa3,0x95,0x65,0xa3,0xe7,0x26,0x18,0x64,0x64,0x69,0x74,
+0x69,0x6f,0x6e,0x61,0x6c,0x6d,0x24,0x12,0x73,0x75,0x70,0x24,0x16,0x70,0x6c,0x65,
+0x6d,0x65,0x6e,0x74,0x25,1,0x70,0x42,0x74,0x1d,0x74,0x65,0x72,0x6c,0x69,0x6b,
+0x65,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0x79,0x12,0x63,0x68,0x61,0xa3,0x9c,2,
+0x6d,0x2e,0x6e,0x34,0x73,0x10,0x75,0xa3,0xb0,0x11,0x62,0x75,0xa3,0x6f,0x12,0x65,
+0x61,0x72,1,0x61,0xa3,0xe8,0x62,1,0x69,0x38,0x73,0x17,0x79,0x6c,0x6c,0x61,
+0x62,0x61,0x72,0x79,0xa3,0x75,0x17,0x64,0x65,0x6f,0x67,0x72,0x61,0x6d,0x73,0xa3,
+0x76,0x1a,0x77,0x73,0x75,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x73,0xa3,0x4d,0x10,
+0x61,1,0x6d,0x32,0x76,0x14,0x61,0x6e,0x65,0x73,0x65,0xa3,0xb5,0x10,0x6f,0x5c,
+0x12,0x65,0x78,0x74,1,0x61,0xa3,0xb4,0x62,0xa3,0xb9,1,0x61,0x80,0x68,3,
+0x61,0x3c,0x6d,0x4c,0x6f,0x64,0x75,0x15,0x64,0x61,0x77,0x61,0x64,0x69,0xa3,0xe6,
+0x16,0x72,0x6f,0x73,0x68,0x74,0x68,0x69,0xa3,0x89,0x11,0x65,0x72,0x68,0x16,0x73,
+0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0x71,0x12,0x6a,0x6b,0x69,0xa3,0xe5,3,0x69,
+0x3a,0x6e,0x42,0x74,0xa2,0x51,0x79,0x13,0x61,0x68,0x6c,0x69,0xa3,0xa2,0x12,0x74,
+0x68,0x69,0xa3,0xc1,3,0x61,0x34,0x62,0x76,0x67,0x7c,0x6e,0x12,0x61,0x64,0x61,
+0x4d,1,0x65,0x40,0x73,0x11,0x75,0x70,0xa2,0xcb,0x16,0x70,0x6c,0x65,0x6d,0x65,
+0x6e,0x74,0xa3,0xcb,0x11,0x78,0x74,1,0x61,0xa5,0x13,0x65,0x14,0x6e,0x64,0x65,
+0x64,0x61,0xa5,0x13,0x11,0x75,0x6e,0xa3,0x42,0x11,0x78,0x69,0x96,0x17,0x72,0x61,
+0x64,0x69,0x63,0x61,0x6c,0x73,0x97,0x14,0x61,0x6b,0x61,0x6e,0x61,0x9e,1,0x65,
+0x4c,0x70,0x10,0x68,0x1f,0x6f,0x6e,0x65,0x74,0x69,0x63,0x65,0x78,0x74,0x65,0x6e,
+0x73,0x69,0x6f,0x6e,0x73,0xa3,0x6b,0x11,0x78,0x74,0xa3,0x6b,0x67,0xa2,0xb5,0x68,
+0xa4,0x84,0x69,3,0x64,0x4c,0x6d,0xa2,0x55,0x6e,0xa2,0x62,0x70,0x13,0x61,0x65,
+0x78,0x74,0x2a,0x16,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73,0x2b,1,0x63,0x99,0x65,
+0x17,0x6f,0x67,0x72,0x61,0x70,0x68,0x69,0x63,1,0x64,0x56,0x73,0x15,0x79,0x6d,
+0x62,0x6f,0x6c,0x73,0xa4,0xb,0x1d,0x61,0x6e,0x64,0x70,0x75,0x6e,0x63,0x74,0x75,
+0x61,0x74,0x69,0x6f,0x6e,0xa5,0xb,0x13,0x65,0x73,0x63,0x72,0x1f,0x69,0x70,0x74,
+0x69,0x6f,0x6e,0x63,0x68,0x61,0x72,0x61,0x63,0x74,0x65,0x72,0x73,0x99,0x1c,0x70,
+0x65,0x72,0x69,0x61,0x6c,0x61,0x72,0x61,0x6d,0x61,0x69,0x63,0xa3,0xba,1,0x64,
+0x62,0x73,0x1b,0x63,0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x70,0x61,1,
+0x68,0x32,0x72,0x14,0x74,0x68,0x69,0x61,0x6e,0xa3,0xbd,0x13,0x6c,0x61,0x76,0x69,
+0xa3,0xbe,0x11,0x69,0x63,1,0x6e,0x3e,0x73,0x1a,0x69,0x79,0x61,0x71,0x6e,0x75,
+0x6d,0x62,0x65,0x72,0x73,0xa5,0x1e,0x19,0x75,0x6d,0x62,0x65,0x72,0x66,0x6f,0x72,
+0x6d,0x73,0xa3,0xb2,4,0x65,0x74,0x6c,0xa2,0x82,0x6f,0xa2,0x9a,0x72,0xa2,0x9e,
+0x75,2,0x6a,0x34,0x6e,0x3e,0x72,0x14,0x6d,0x75,0x6b,0x68,0x69,0x43,0x14,0x61,
+0x72,0x61,0x74,0x69,0x45,0x18,0x6a,0x61,0x6c,0x61,0x67,0x6f,0x6e,0x64,0x69,0xa5,
+0x1c,1,0x6e,0xa2,0x46,0x6f,1,0x6d,0x6e,0x72,0x13,0x67,0x69,0x61,0x6e,0x5a,
+1,0x65,0x40,0x73,0x11,0x75,0x70,0xa2,0x87,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,
+0x74,0xa3,0x87,0x11,0x78,0x74,0xa4,0x1b,0x14,0x65,0x6e,0x64,0x65,0x64,0xa5,0x1b,
+0x1a,0x65,0x74,0x72,0x69,0x63,0x73,0x68,0x61,0x70,0x65,0x73,0x8c,0x12,0x65,0x78,
+0x74,0xa2,0xe3,0x14,0x65,0x6e,0x64,0x65,0x64,0xa3,0xe3,0x1e,0x65,0x72,0x61,0x6c,
+0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x71,0x17,0x61,0x67,0x6f,
+0x6c,0x69,0x74,0x69,0x63,0xa2,0x88,0x12,0x73,0x75,0x70,0xa4,0xa,0x16,0x70,0x6c,
+0x65,0x6d,0x65,0x6e,0x74,0xa5,0xa,0x13,0x74,0x68,0x69,0x63,0xa3,0x59,1,0x61,
+0x5c,0x65,0x11,0x65,0x6b,0x30,1,0x61,0x38,0x65,0x11,0x78,0x74,0x6e,0x14,0x65,
+0x6e,0x64,0x65,0x64,0x6f,0x17,0x6e,0x64,0x63,0x6f,0x70,0x74,0x69,0x63,0x31,0x13,
+0x6e,0x74,0x68,0x61,0xa3,0xe4,2,0x61,0xa2,0x48,0x65,0xa2,0xdf,0x69,1,0x67,
+0x30,0x72,0x14,0x61,0x67,0x61,0x6e,0x61,0x9d,0x10,0x68,1,0x70,0x3a,0x73,0x18,
+0x75,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x73,0xa3,0x4b,1,0x72,0x3c,0x75,0x19,
+0x73,0x75,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x73,0xa3,0x4c,0x11,0x69,0x76,0x1f,
+0x61,0x74,0x65,0x75,0x73,0x65,0x73,0x75,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x73,
+0xa3,0x4c,2,0x6c,0x32,0x6e,0x9a,0x74,0x12,0x72,0x61,0x6e,0xa5,2,0x10,0x66,
+2,0x61,0x58,0x6d,0x70,0x77,0x14,0x69,0x64,0x74,0x68,0x61,0x1f,0x6e,0x64,0x66,
+0x75,0x6c,0x6c,0x77,0x69,0x64,0x74,0x68,0x66,0x6f,0x72,0x6d,0x73,0xa3,0x57,0x1a,
+0x6e,0x64,0x66,0x75,0x6c,0x6c,0x66,0x6f,0x72,0x6d,0x73,0xa3,0x57,0x13,0x61,0x72,
+0x6b,0x73,0xa3,0x52,2,0x67,0x34,0x69,0xa2,0x45,0x75,0x12,0x6e,0x6f,0x6f,0xa3,
+0x63,0x11,0x75,0x6c,0xa2,0x4a,2,0x63,0x3c,0x6a,0x5e,0x73,0x17,0x79,0x6c,0x6c,
+0x61,0x62,0x6c,0x65,0x73,0xa3,0x4a,0x1f,0x6f,0x6d,0x70,0x61,0x74,0x69,0x62,0x69,
+0x6c,0x69,0x74,0x79,0x6a,0x61,0x6d,0x6f,0xa3,0x41,0x12,0x61,0x6d,0x6f,0x5c,0x17,
+0x65,0x78,0x74,0x65,0x6e,0x64,0x65,0x64,1,0x61,0xa3,0xb4,0x62,0xa3,0xb9,0x19,
+0x66,0x69,0x72,0x6f,0x68,0x69,0x6e,0x67,0x79,0x61,0xa5,0x1d,0x13,0x62,0x72,0x65,
+0x77,0x37,0x61,0xa4,5,0x62,0xa6,0x45,0x63,0xa8,0x1a,0x64,0xac,0xa6,0x65,5,
+0x6d,0xa2,0x6d,0x86,0x6e,0x96,0x74,0x15,0x68,0x69,0x6f,0x70,0x69,0x63,0x5e,1,
+0x65,0x40,0x73,0x11,0x75,0x70,0xa2,0x86,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,
+0xa3,0x86,0x11,0x78,0x74,0xa2,0x85,1,0x61,0xa3,0xc8,0x65,0x13,0x6e,0x64,0x65,
+0x64,0xa2,0x85,0x10,0x61,0xa3,0xc8,0x16,0x6f,0x74,0x69,0x63,0x6f,0x6e,0x73,0xa3,
+0xce,0x15,0x63,0x6c,0x6f,0x73,0x65,0x64,2,0x61,0x5a,0x63,0x9e,0x69,0x1c,0x64,
+0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x75,0x70,0xa2,0xc4,0x16,0x70,
+0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0xc4,0x16,0x6c,0x70,0x68,0x61,0x6e,0x75,0x6d,
+0x86,1,0x65,0x2c,0x73,0x11,0x75,0x70,0xa3,0xc3,0x13,0x72,0x69,0x63,0x73,0x86,
+0x18,0x75,0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0xc3,0x11,0x6a,0x6b,0xa2,
+0x44,0x1f,0x6c,0x65,0x74,0x74,0x65,0x72,0x73,0x61,0x6e,0x64,0x6d,0x6f,0x6e,0x74,
+0x68,0x73,0xa3,0x44,0x61,0x4a,0x67,0x76,0x6c,1,0x62,0x30,0x79,0x13,0x6d,0x61,
+0x69,0x63,0xa5,0x25,0x13,0x61,0x73,0x61,0x6e,0xa3,0xe2,0x13,0x72,0x6c,0x79,0x64,
0x1f,0x79,0x6e,0x61,0x73,0x74,0x69,0x63,0x63,0x75,0x6e,0x65,0x69,0x66,0x6f,0x72,
-0x6d,0xa5,1,0x10,0x79,0x1f,0x70,0x74,0x69,0x61,0x6e,0x68,0x69,0x65,0x72,0x6f,
-0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0xc2,7,0x6e,0xc0,0xe5,0x6e,0x3e,0x72,0xa2,
-0x5d,0x73,0xa2,0xd8,0x76,0x14,0x65,0x73,0x74,0x61,0x6e,0xa3,0xbc,1,0x61,0x92,
-0x63,0x13,0x69,0x65,0x6e,0x74,1,0x67,0x34,0x73,0x15,0x79,0x6d,0x62,0x6f,0x6c,
-0x73,0xa3,0xa5,0x13,0x72,0x65,0x65,0x6b,1,0x6d,0x34,0x6e,0x15,0x75,0x6d,0x62,
-0x65,0x72,0x73,0xa3,0x7f,0x13,0x75,0x73,0x69,0x63,0xa2,0x7e,0x19,0x61,0x6c,0x6e,
-0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0xa3,0x7e,0x10,0x74,0x1f,0x6f,0x6c,0x69,0x61,
-0x6e,0x68,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0xfe,2,0x61,
-0x32,0x6d,0xa2,0x71,0x72,0x12,0x6f,0x77,0x73,0x7d,0x12,0x62,0x69,0x63,0x38,3,
-0x65,0x4a,0x6d,0x66,0x70,0xa2,0x43,0x73,0x11,0x75,0x70,0xa2,0x80,0x16,0x70,0x6c,
-0x65,0x6d,0x65,0x6e,0x74,0xa3,0x80,0x11,0x78,0x74,1,0x61,0xa3,0xd2,0x65,0x14,
-0x6e,0x64,0x65,0x64,0x61,0xa3,0xd2,0x12,0x61,0x74,0x68,0xa2,0xd3,0x18,0x65,0x6d,
-0x61,0x74,0x69,0x63,0x61,0x6c,0x61,0x1f,0x6c,0x70,0x68,0x61,0x62,0x65,0x74,0x69,
-0x63,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0xd3,1,0x66,0x42,0x72,0x1e,0x65,
-0x73,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x66,0x6f,0x72,0x6d,0x73,1,0x61,
-0xa3,0x51,0x62,0xa3,0x55,0x14,0x65,0x6e,0x69,0x61,0x6e,0x35,0x12,0x63,0x69,0x69,
-0x23,0x64,0x9e,0x65,0xa2,0x42,0x68,0xa2,0x4d,0x6c,1,0x63,0x62,0x70,0x17,0x68,
-0x61,0x62,0x65,0x74,0x69,0x63,0x70,1,0x66,0xa3,0x50,0x72,0x1e,0x65,0x73,0x65,
-0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x66,0x6f,0x72,0x6d,0x73,0xa3,0x50,0x16,0x68,
-0x65,0x6d,0x69,0x63,0x61,0x6c,0xa2,0xd0,0x16,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,
-0xa3,0xd0,0x12,0x6c,0x61,0x6d,0xa5,7,0x1a,0x67,0x65,0x61,0x6e,0x6e,0x75,0x6d,
-0x62,0x65,0x72,0x73,0xa3,0x77,0x11,0x6f,0x6d,0xa3,0xfd,7,0x6f,0x71,0x6f,0x64,
-0x72,0xa2,0x41,0x75,0xa2,0x58,0x79,0x1b,0x7a,0x61,0x6e,0x74,0x69,0x6e,0x65,0x6d,
-0x75,0x73,0x69,0x63,0xa2,0x5b,0x18,0x61,0x6c,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,
-0xa3,0x5b,1,0x70,0x34,0x78,0x16,0x64,0x72,0x61,0x77,0x69,0x6e,0x67,0x89,0x14,
-0x6f,0x6d,0x6f,0x66,0x6f,0xa0,0x12,0x65,0x78,0x74,0xa2,0x43,0x14,0x65,0x6e,0x64,
-0x65,0x64,0xa3,0x43,0x10,0x61,1,0x68,0x40,0x69,0x12,0x6c,0x6c,0x65,0x92,0x17,
-0x70,0x61,0x74,0x74,0x65,0x72,0x6e,0x73,0x93,0x11,0x6d,0x69,0xa3,0xc9,1,0x67,
-0x2c,0x68,0x11,0x69,0x64,0xa3,0x64,0x14,0x69,0x6e,0x65,0x73,0x65,0xa3,0x81,0x61,
-0x48,0x65,0xa2,0x4e,0x68,0xa2,0x52,0x6c,0x1a,0x6f,0x63,0x6b,0x65,0x6c,0x65,0x6d,
-0x65,0x6e,0x74,0x73,0x8b,3,0x6c,0x34,0x6d,0x40,0x73,0x66,0x74,0x11,0x61,0x6b,
-0xa3,0xc7,0x14,0x69,0x6e,0x65,0x73,0x65,0xa3,0x93,0x11,0x75,0x6d,0xa2,0xb1,0x12,
-0x73,0x75,0x70,0xa2,0xca,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0xca,1,
-0x69,0x30,0x73,0x13,0x61,0x76,0x61,0x68,0xa3,0xdd,0x15,0x63,0x6c,0x61,0x74,0x69,
-0x6e,0x23,0x14,0x6e,0x67,0x61,0x6c,0x69,0x41,0x16,0x61,0x69,0x6b,0x73,0x75,0x6b,
-0x69,0xa5,8,5,0x6f,0xc1,0x4c,0x6f,0xa2,0x55,0x75,0xa4,0x10,0x79,1,0x70,
-0x9c,0x72,0x14,0x69,0x6c,0x6c,0x69,0x63,0x32,1,0x65,0x4c,0x73,0x11,0x75,0x70,
-0xa2,0x61,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa2,0x61,0x12,0x61,0x72,0x79,
-0xa3,0x61,0x11,0x78,0x74,3,0x61,0xa3,0x9e,0x62,0xa3,0xa0,0x63,0xa5,9,0x65,
-0x13,0x6e,0x64,0x65,0x64,2,0x61,0xa3,0x9e,0x62,0xa3,0xa0,0x63,0xa5,9,0x1c,
-0x72,0x69,0x6f,0x74,0x73,0x79,0x6c,0x6c,0x61,0x62,0x61,0x72,0x79,0xa3,0x7b,3,
-0x6d,0x5a,0x6e,0xa2,0x95,0x70,0xa2,0xa0,0x75,0x17,0x6e,0x74,0x69,0x6e,0x67,0x72,
-0x6f,0x64,0xa2,0x9a,0x17,0x6e,0x75,0x6d,0x65,0x72,0x61,0x6c,0x73,0xa3,0x9a,2,
-0x62,0x3a,0x6d,0xa2,0x5f,0x70,0x15,0x61,0x74,0x6a,0x61,0x6d,0x6f,0xa3,0x41,0x14,
-0x69,0x6e,0x69,0x6e,0x67,2,0x64,0x46,0x68,0x9e,0x6d,0x1d,0x61,0x72,0x6b,0x73,
-0x66,0x6f,0x72,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0x77,0x1e,0x69,0x61,0x63,0x72,
-0x69,0x74,0x69,0x63,0x61,0x6c,0x6d,0x61,0x72,0x6b,0x73,0x2e,2,0x65,0x40,0x66,
-0xa6,0x2a,0x73,0x18,0x75,0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x83,0x16,
-0x78,0x74,0x65,0x6e,0x64,0x65,0x64,0xa3,0xe0,0x17,0x61,0x6c,0x66,0x6d,0x61,0x72,
-0x6b,0x73,0xa3,0x52,0x11,0x6f,0x6e,0x1f,0x69,0x6e,0x64,0x69,0x63,0x6e,0x75,0x6d,
-0x62,0x65,0x72,0x66,0x6f,0x72,0x6d,0x73,0xa3,0xb2,0x1b,0x74,0x72,0x6f,0x6c,0x70,
-0x69,0x63,0x74,0x75,0x72,0x65,0x73,0x83,0x12,0x74,0x69,0x63,0xa2,0x84,0x1b,0x65,
-0x70,0x61,0x63,0x74,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0xa3,0xdf,1,0x6e,0x3e,
-0x72,0x1b,0x72,0x65,0x6e,0x63,0x79,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0x75,0x15,
-0x65,0x69,0x66,0x6f,0x72,0x6d,0xa2,0x98,0x16,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,
-0xa2,0x99,0x1d,0x61,0x6e,0x64,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,
-0x6e,0xa3,0x99,0x61,0xa2,0xdb,0x68,0xa4,5,0x6a,0x10,0x6b,0xa2,0x47,4,0x63,
-0x86,0x65,0xa2,0x7d,0x72,0xa2,0x92,0x73,0xa2,0xa4,0x75,0x1f,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x69,0x64,0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa2,0x47,0x18,0x65,
-0x78,0x74,0x65,0x6e,0x73,0x69,0x6f,0x6e,5,0x64,0x65,0x64,0xa3,0xd1,0x65,0xa5,
-0,0x66,0xa5,0x12,0x14,0x6f,0x6d,0x70,0x61,0x74,0xa2,0x45,1,0x66,0x96,0x69,
-1,0x62,0x44,0x64,0x17,0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa2,0x4f,0x12,
-0x73,0x75,0x70,0xa3,0x5f,0x14,0x69,0x6c,0x69,0x74,0x79,0xa2,0x45,1,0x66,0x54,
-0x69,0x18,0x64,0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa2,0x4f,0x19,0x73,0x75,
-0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x5f,0x13,0x6f,0x72,0x6d,0x73,0xa3,
-0x53,0x11,0x78,0x74,5,0x64,9,0x64,0xa3,0xd1,0x65,0xa5,0,0x66,0xa5,0x12,
-0x61,0xa3,0x46,0x62,0xa3,0x5e,0x63,0xa3,0xc5,0x19,0x61,0x64,0x69,0x63,0x61,0x6c,
-0x73,0x73,0x75,0x70,0x94,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x95,1,0x74,
-0x50,0x79,0x14,0x6d,0x62,0x6f,0x6c,0x73,0x9a,0x1d,0x61,0x6e,0x64,0x70,0x75,0x6e,
-0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x9b,0x14,0x72,0x6f,0x6b,0x65,0x73,0xa3,
-0x82,2,0x6e,0x48,0x72,0x64,0x75,0x1d,0x63,0x61,0x73,0x69,0x61,0x6e,0x61,0x6c,
-0x62,0x61,0x6e,0x69,0x61,0x6e,0xa3,0xde,0x1d,0x61,0x64,0x69,0x61,0x6e,0x73,0x79,
-0x6c,0x6c,0x61,0x62,0x69,0x63,0x73,0x63,0x12,0x69,0x61,0x6e,0xa3,0xa8,1,0x61,
-0x6c,0x65,1,0x72,0x38,0x73,0x17,0x73,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa5,
-0x19,0x13,0x6f,0x6b,0x65,0x65,0x60,0x12,0x73,0x75,0x70,0xa2,0xff,0x16,0x70,0x6c,
-0x65,0x6d,0x65,0x6e,0x74,0xa3,0xff,1,0x6b,0x26,0x6d,0xa3,0xa4,0x11,0x6d,0x61,
-0xa3,0xd4,3,0x65,0x3e,0x69,0x7e,0x6f,0xa2,0x5d,0x75,0x15,0x70,0x6c,0x6f,0x79,
-0x61,0x6e,0xa3,0xe1,1,0x73,0x50,0x76,0x16,0x61,0x6e,0x61,0x67,0x61,0x72,0x69,
-0x3e,0x12,0x65,0x78,0x74,0xa2,0xb3,0x14,0x65,0x6e,0x64,0x65,0x64,0xa3,0xb3,0x13,
-0x65,0x72,0x65,0x74,0xa3,0x5a,1,0x61,0x30,0x6e,0x14,0x67,0x62,0x61,0x74,0x73,
-0x91,0x18,0x63,0x72,0x69,0x74,0x69,0x63,0x61,0x6c,0x73,0x2e,2,0x65,0x30,0x66,
-0x36,0x73,0x11,0x75,0x70,0xa3,0x83,0x11,0x78,0x74,0xa3,0xe0,0x18,0x6f,0x72,0x73,
-0x79,0x6d,0x62,0x6f,0x6c,0x73,0x77,1,0x67,0x3e,0x6d,0x12,0x69,0x6e,0x6f,0xa2,
-0xab,0x14,0x74,0x69,0x6c,0x65,0x73,0xa3,0xab,0x11,0x72,0x61,0xa5,0x1a,8,0x6d,
-0x5f,0x6d,0x3a,0x6e,0x48,0x73,0x7a,0x76,0xa2,0x4b,0x77,0x12,0x69,0x64,0x65,0x43,
-0x11,0x65,0x64,0x32,0x12,0x69,0x61,0x6c,0x33,2,0x61,0x40,0x62,0x37,0x6f,1,
-0x62,0x28,0x6e,0x10,0x65,0x21,0x13,0x72,0x65,0x61,0x6b,0x37,0x10,0x72,0x34,0x12,
-0x72,0x6f,0x77,0x35,2,0x6d,0x38,0x71,0x46,0x75,1,0x62,0x3d,0x70,0x3e,0x11,
-0x65,0x72,0x3f,1,0x61,0x24,0x6c,0x39,0x11,0x6c,0x6c,0x39,1,0x72,0x3b,0x75,
-0x12,0x61,0x72,0x65,0x3b,0x12,0x65,0x72,0x74,0x40,0x13,0x69,0x63,0x61,0x6c,0x41,
-0x63,0x58,0x65,0x92,0x66,0x96,0x69,1,0x6e,0x36,0x73,0x10,0x6f,0x30,0x14,0x6c,
-0x61,0x74,0x65,0x64,0x31,0x11,0x69,0x74,0x2e,0x12,0x69,0x61,0x6c,0x2f,2,0x61,
-0x36,0x69,0x48,0x6f,0x10,0x6d,0x24,0x12,0x70,0x61,0x74,0x25,0x10,0x6e,0x22,0x15,
-0x6f,0x6e,0x69,0x63,0x61,0x6c,0x23,0x13,0x72,0x63,0x6c,0x65,0x27,0x11,0x6e,0x63,
-0x27,2,0x69,0x3a,0x6f,0x44,0x72,0x10,0x61,0x2c,0x14,0x63,0x74,0x69,0x6f,0x6e,
-0x2d,0x10,0x6e,0x28,0x11,0x61,0x6c,0x29,0x11,0x6e,0x74,0x2b,4,0x61,0x3a,0x66,
-0x4c,0x68,0x5e,0x6e,0x70,0x77,0x2a,0x12,0x69,0x64,0x65,0x2b,0x22,0x17,0x6d,0x62,
-0x69,0x67,0x75,0x6f,0x75,0x73,0x23,0x26,0x17,0x75,0x6c,0x6c,0x77,0x69,0x64,0x74,
-0x68,0x27,0x24,0x17,0x61,0x6c,0x66,0x77,0x69,0x64,0x74,0x68,0x25,0x20,1,0x61,
-0x30,0x65,0x14,0x75,0x74,0x72,0x61,0x6c,0x21,0x28,0x13,0x72,0x72,0x6f,0x77,0x29,
-0xd,0x6e,0xc0,0xfb,0x73,0x6d,0x73,0x3a,0x74,0x98,0x75,0xa2,0x49,0x7a,2,0x6c,
-0x3b,0x70,0x3d,0x73,0x39,5,0x6f,0x28,0x6f,0x57,0x70,0x34,0x75,0x16,0x72,0x72,
-0x6f,0x67,0x61,0x74,0x65,0x45,0x11,0x61,0x63,1,0x65,0x32,0x69,0x15,0x6e,0x67,
-0x6d,0x61,0x72,0x6b,0x31,0x18,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x39,
-0x63,0x53,0x6b,0x55,0x6d,0x51,0x1d,0x69,0x74,0x6c,0x65,0x63,0x61,0x73,0x65,0x6c,
-0x65,0x74,0x74,0x65,0x72,0x27,1,0x6e,0x40,0x70,0x1c,0x70,0x65,0x72,0x63,0x61,
-0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x23,0x17,0x61,0x73,0x73,0x69,0x67,0x6e,
-0x65,0x64,0x21,0x6e,0x8a,0x6f,0xa2,0x47,0x70,8,0x66,0x14,0x66,0x5b,0x69,0x59,
-0x6f,0x4f,0x72,0x24,0x73,0x49,0x17,0x69,0x76,0x61,0x74,0x65,0x75,0x73,0x65,0x43,
-0x61,0x2c,0x63,0x4d,0x64,0x47,0x65,0x4b,0x1f,0x72,0x61,0x67,0x72,0x61,0x70,0x68,
-0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x3d,2,0x64,0x33,0x6c,0x35,0x6f,
-0x36,0x1b,0x6e,0x73,0x70,0x61,0x63,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0x2d,1,
-0x70,0x7c,0x74,0x12,0x68,0x65,0x72,3,0x6c,0x38,0x6e,0x42,0x70,0x4c,0x73,0x14,
-0x79,0x6d,0x62,0x6f,0x6c,0x57,0x14,0x65,0x74,0x74,0x65,0x72,0x2b,0x14,0x75,0x6d,
-0x62,0x65,0x72,0x37,0x19,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x4f,
-0x1c,0x65,0x6e,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x49,0x66,
-0x9e,0x66,0x88,0x69,0xa2,0x4b,0x6c,0xa2,0x5c,0x6d,4,0x61,0x60,0x63,0x31,0x65,
-0x2f,0x6e,0x2d,0x6f,0x15,0x64,0x69,0x66,0x69,0x65,0x72,1,0x6c,0x30,0x73,0x14,
-0x79,0x6d,0x62,0x6f,0x6c,0x55,0x14,0x65,0x74,0x74,0x65,0x72,0x29,0x17,0x74,0x68,
-0x73,0x79,0x6d,0x62,0x6f,0x6c,0x51,1,0x69,0x2e,0x6f,0x13,0x72,0x6d,0x61,0x74,
-0x41,0x1d,0x6e,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,
-0x5b,0x10,0x6e,0x1f,0x69,0x74,0x69,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,
-0x74,0x69,0x6f,0x6e,0x59,6,0x6d,0x18,0x6d,0x29,0x6f,0x28,0x74,0x27,0x75,0x23,
-0x2a,0x1c,0x77,0x65,0x72,0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x25,
-0x65,0x28,0x69,0x3c,0x6c,0x25,0x19,0x74,0x74,0x65,0x72,0x6e,0x75,0x6d,0x62,0x65,
-0x72,0x35,0x1a,0x6e,0x65,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x3b,0x63,
-0x44,0x64,0xa2,0x60,0x65,0x1b,0x6e,0x63,0x6c,0x6f,0x73,0x69,0x6e,0x67,0x6d,0x61,
-0x72,0x6b,0x2f,6,0x6e,0x39,0x6e,0x46,0x6f,0x4e,0x73,0x45,0x75,0x1b,0x72,0x72,
-0x65,0x6e,0x63,0x79,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x53,0x20,0x12,0x74,0x72,0x6c,
-0x3f,0x42,0x10,0x6e,1,0x6e,0x2c,0x74,0x12,0x72,0x6f,0x6c,0x3f,0x1f,0x65,0x63,
-0x74,0x6f,0x72,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x4d,0x63,
-0x3f,0x66,0x41,0x6c,0x1d,0x6f,0x73,0x65,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,
-0x69,0x6f,0x6e,0x4b,2,0x61,0x30,0x65,0x4a,0x69,0x12,0x67,0x69,0x74,0x33,0x1c,
-0x73,0x68,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x47,0x1a,0x63,
-0x69,0x6d,0x61,0x6c,0x6e,0x75,0x6d,0x62,0x65,0x72,0x33,0,0x12,0x6d,0xc2,0x3f,
-0x73,0xa1,0x73,0x4e,0x74,0xa2,0x56,0x77,0xa2,0x72,0x79,0xa2,0x73,0x7a,1,0x61,
-0x2c,0x68,0x12,0x61,0x69,0x6e,0x8b,0x11,0x69,0x6e,0x85,5,0x74,0x22,0x74,0x38,
-0x77,0x4c,0x79,0x16,0x72,0x69,0x61,0x63,0x77,0x61,0x77,0x6f,0x18,0x72,0x61,0x69,
-0x67,0x68,0x74,0x77,0x61,0x77,0xa3,0x55,0x15,0x61,0x73,0x68,0x6b,0x61,0x66,0x6d,
-0x61,0x2e,0x65,0x38,0x68,0x11,0x69,0x6e,0x6b,0x10,0x64,0x62,0x11,0x68,0x65,0x65,
-1,0x65,0x2e,0x6d,0x13,0x6b,0x61,0x74,0x68,0x69,0x10,0x6e,0x67,1,0x61,0x4e,
-0x65,1,0x68,0x28,0x74,0x10,0x68,0x77,0x16,0x6d,0x61,0x72,0x62,0x75,0x74,0x61,
-0x74,0x13,0x67,0x6f,0x61,0x6c,0x3d,1,0x68,0x71,0x77,0x73,0x11,0x61,0x77,0x79,
-1,0x65,0x32,0x75,0x11,0x64,0x68,0x80,0x11,0x68,0x65,0x83,0x10,0x68,0x7a,1,
-0x62,0x34,0x77,0x16,0x69,0x74,0x68,0x74,0x61,0x69,0x6c,0x7f,0x14,0x61,0x72,0x72,
-0x65,0x65,0x7d,0x6d,0x6c,0x6e,0xa4,0x6b,0x70,0xa4,0x88,0x71,0xa4,0x88,0x72,1,
-0x65,0x38,0x6f,0x18,0x68,0x69,0x6e,0x67,0x79,0x61,0x79,0x65,0x68,0x93,1,0x68,
-0x5f,0x76,0x16,0x65,0x72,0x73,0x65,0x64,0x70,0x65,0x61,2,0x61,0x2e,0x65,0xa4,
-0x3e,0x69,0x10,0x6d,0x53,1,0x6c,0xa2,0xe7,0x6e,0x16,0x69,0x63,0x68,0x61,0x65,
-0x61,0x6e,0,0x12,0x6e,0x76,0x73,0x51,0x73,0x3e,0x74,0x5c,0x77,0xa0,0x79,0xa2,
-0x42,0x7a,0x13,0x61,0x79,0x69,0x6e,0xa3,0x54,0x10,0x61,1,0x64,0x2e,0x6d,0x12,
-0x65,0x6b,0x68,0xa3,0x4c,0x11,0x68,0x65,0xa3,0x4b,3,0x61,0x38,0x65,0x3c,0x68,
-0x4a,0x77,0x13,0x65,0x6e,0x74,0x79,0xa3,0x51,0x10,0x77,0xa3,0x4d,1,0x6e,0xa3,
-0x4e,0x74,0x10,0x68,0xa3,0x4f,0x14,0x61,0x6d,0x65,0x64,0x68,0xa3,0x50,0x11,0x61,
-0x77,0xa3,0x52,0x12,0x6f,0x64,0x68,0xa3,0x53,0x6e,0x3a,0x6f,0x40,0x70,0x46,0x71,
-0x4a,0x72,0x12,0x65,0x73,0x68,0xa3,0x4a,0x11,0x75,0x6e,0xa3,0x46,0x11,0x6e,0x65,
-0xa3,0x47,0x10,0x65,0xa3,0x48,0x12,0x6f,0x70,0x68,0xa3,0x49,0x67,0x33,0x67,0x38,
-0x68,0x40,0x6b,0x5e,0x6c,0x66,0x6d,0x11,0x65,0x6d,0xa3,0x45,0x13,0x69,0x6d,0x65,
-0x6c,0xa1,1,0x65,0x32,0x75,0x14,0x6e,0x64,0x72,0x65,0x64,0xa3,0x42,0x11,0x74,
-0x68,0xa3,0x41,0x12,0x61,0x70,0x68,0xa3,0x43,0x14,0x61,0x6d,0x65,0x64,0x68,0xa3,
-0x44,0x61,0x34,0x62,0x4a,0x64,0x50,0x66,0x12,0x69,0x76,0x65,0x9f,1,0x6c,0x2a,
-0x79,0x11,0x69,0x6e,0x97,0x12,0x65,0x70,0x68,0x95,0x12,0x65,0x74,0x68,0x99,1,
-0x61,0x30,0x68,0x14,0x61,0x6d,0x65,0x64,0x68,0x9d,0x13,0x6c,0x65,0x74,0x68,0x9b,
-0x15,0x61,0x79,0x61,0x6c,0x61,0x6d,6,0x6e,0x2c,0x6e,0x34,0x72,0x5e,0x73,0x62,
-0x74,0x11,0x74,0x61,0xa3,0x63,2,0x67,0x2e,0x6e,0x32,0x79,0x10,0x61,0xa3,0x60,
-0x10,0x61,0xa3,0x5d,1,0x61,0xa3,0x5e,0x6e,0x10,0x61,0xa3,0x5f,0x10,0x61,0xa3,
-0x61,0x11,0x73,0x61,0xa3,0x62,0x62,0x3c,0x6a,0x42,0x6c,0x10,0x6c,1,0x61,0xa3,
-0x5b,0x6c,0x10,0x61,0xa3,0x5c,0x11,0x68,0x61,0xa3,0x59,0x10,0x61,0xa3,0x5a,0x11,
-0x65,0x6d,0x51,2,0x6f,0x2c,0x75,0x50,0x79,0x10,0x61,0x91,1,0x6a,0x28,0x6f,
-0x10,0x6e,0x55,0x1a,0x6f,0x69,0x6e,0x69,0x6e,0x67,0x67,0x72,0x6f,0x75,0x70,0x21,
-0x10,0x6e,0x57,0x10,0x65,0x59,0x10,0x61,1,0x66,0x5b,0x70,0x10,0x68,0x5d,0x66,
-0x9a,0x66,0x42,0x67,0x7a,0x68,0x8a,0x6b,0xa2,0x75,0x6c,0x11,0x61,0x6d,0x4c,0x12,
-0x61,0x64,0x68,0x4f,2,0x61,0x3e,0x65,0x4a,0x69,0x19,0x6e,0x61,0x6c,0x73,0x65,
-0x6d,0x6b,0x61,0x74,0x68,0x35,0x15,0x72,0x73,0x69,0x79,0x65,0x68,0x8f,0x86,0x10,
-0x68,0x33,0x10,0x61,1,0x66,0x37,0x6d,0x11,0x61,0x6c,0x39,1,0x61,0x40,0x65,
-0x3e,1,0x68,0x28,0x74,0x10,0x68,0x45,0x40,0x13,0x67,0x6f,0x61,0x6c,0x43,2,
-0x68,0x3b,0x6d,0x5c,0x6e,0x1a,0x69,0x66,0x69,0x72,0x6f,0x68,0x69,0x6e,0x67,0x79,
-0x61,1,0x6b,0x2a,0x70,0x10,0x61,0xa3,0x65,0x15,0x69,0x6e,0x6e,0x61,0x79,0x61,
-0xa3,0x64,0x1a,0x7a,0x61,0x6f,0x6e,0x68,0x65,0x68,0x67,0x6f,0x61,0x6c,0x3d,2,
-0x61,0x3a,0x68,0x44,0x6e,0x17,0x6f,0x74,0x74,0x65,0x64,0x68,0x65,0x68,0x4b,1,
-0x66,0x47,0x70,0x10,0x68,0x49,0x12,0x61,0x70,0x68,0x89,0x61,0x2e,0x62,0x8a,0x64,
-0xa2,0x51,0x65,0x31,2,0x66,0x3c,0x69,0x70,0x6c,1,0x61,0x28,0x65,0x10,0x66,
-0x27,0x11,0x70,0x68,0x25,0x14,0x72,0x69,0x63,0x61,0x6e,2,0x66,0x30,0x6e,0x36,
-0x71,0x11,0x61,0x66,0xa3,0x58,0x11,0x65,0x68,0xa3,0x56,0x12,0x6f,0x6f,0x6e,0xa3,
-0x57,0x10,0x6e,0x23,1,0x65,0x4a,0x75,0x10,0x72,0x1f,0x75,0x73,0x68,0x61,0x73,
-0x6b,0x69,0x79,0x65,0x68,0x62,0x61,0x72,0x72,0x65,0x65,0x8d,1,0x68,0x29,0x74,
-0x10,0x68,0x2b,0x11,0x61,0x6c,0x2c,0x16,0x61,0x74,0x68,0x72,0x69,0x73,0x68,0x2f,
-7,0x6e,0x2e,0x6e,0x2c,0x72,0x3e,0x74,0x56,0x75,0x21,0x18,0x6f,0x6e,0x6a,0x6f,
-0x69,0x6e,0x69,0x6e,0x67,0x21,0x28,0x1a,0x69,0x67,0x68,0x74,0x6a,0x6f,0x69,0x6e,
-0x69,0x6e,0x67,0x29,0x2a,0x19,0x72,0x61,0x6e,0x73,0x70,0x61,0x72,0x65,0x6e,0x74,
-0x2b,0x63,0x23,0x64,0x40,0x6a,0x56,0x6c,0x26,0x19,0x65,0x66,0x74,0x6a,0x6f,0x69,
-0x6e,0x69,0x6e,0x67,0x27,0x24,0x19,0x75,0x61,0x6c,0x6a,0x6f,0x69,0x6e,0x69,0x6e,
-0x67,0x25,0x19,0x6f,0x69,0x6e,0x63,0x61,0x75,0x73,0x69,0x6e,0x67,0x23,0,0x13,
-0x6e,0xc0,0xd0,0x73,0x49,0x73,0x48,0x75,0x78,0x77,0x84,0x78,0x9c,0x7a,0x10,0x77,
-0x58,1,0x6a,0x75,0x73,0x13,0x70,0x61,0x63,0x65,0x59,4,0x61,0x51,0x67,0x53,
-0x70,0x28,0x75,0x30,0x79,0x57,0x54,0x12,0x61,0x63,0x65,0x55,0x16,0x72,0x72,0x6f,
-0x67,0x61,0x74,0x65,0x53,0x15,0x6e,0x6b,0x6e,0x6f,0x77,0x6e,0x21,1,0x6a,0x5d,
-0x6f,0x17,0x72,0x64,0x6a,0x6f,0x69,0x6e,0x65,0x72,0x5d,0x10,0x78,0x21,0x6e,0x60,
-0x6f,0xa2,0x41,0x70,0xa2,0x50,0x71,0xa2,0x6e,0x72,1,0x65,0x24,0x69,0x6f,0x1e,
-0x67,0x69,0x6f,0x6e,0x61,0x6c,0x69,0x6e,0x64,0x69,0x63,0x61,0x74,0x6f,0x72,0x6f,
-4,0x65,0x3e,0x6c,0x5b,0x6f,0x46,0x73,0x45,0x75,0x46,0x14,0x6d,0x65,0x72,0x69,
-0x63,0x47,0x15,0x78,0x74,0x6c,0x69,0x6e,0x65,0x5b,0x17,0x6e,0x73,0x74,0x61,0x72,
-0x74,0x65,0x72,0x45,0x10,0x70,0x48,0x1c,0x65,0x6e,0x70,0x75,0x6e,0x63,0x74,0x75,
-0x61,0x74,0x69,0x6f,0x6e,0x49,1,0x6f,0x3e,0x72,0x4c,0x1a,0x65,0x66,0x69,0x78,
-0x6e,0x75,0x6d,0x65,0x72,0x69,0x63,0x4d,0x4a,0x1b,0x73,0x74,0x66,0x69,0x78,0x6e,
-0x75,0x6d,0x65,0x72,0x69,0x63,0x4b,0x10,0x75,0x4e,0x16,0x6f,0x74,0x61,0x74,0x69,
-0x6f,0x6e,0x4f,0x68,0x7b,0x68,0x50,0x69,0x86,0x6a,0xa2,0x61,0x6c,0xa2,0x65,0x6d,
-0x1c,0x61,0x6e,0x64,0x61,0x74,0x6f,0x72,0x79,0x62,0x72,0x65,0x61,0x6b,0x2d,4,
-0x32,0x5f,0x33,0x61,0x65,0x34,0x6c,0x6d,0x79,0x3a,0x13,0x70,0x68,0x65,0x6e,0x3b,
-0x19,0x62,0x72,0x65,0x77,0x6c,0x65,0x74,0x74,0x65,0x72,0x6d,2,0x64,0x28,0x6e,
-0x3c,0x73,0x41,0x3c,0x18,0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x3d,0x3e,
-1,0x66,0x3e,0x73,0x11,0x65,0x70,1,0x61,0x22,0x65,0x14,0x72,0x61,0x62,0x6c,
-0x65,0x3f,0x18,0x69,0x78,0x6e,0x75,0x6d,0x65,0x72,0x69,0x63,0x41,2,0x6c,0x63,
-0x74,0x65,0x76,0x67,1,0x66,0x43,0x69,0x15,0x6e,0x65,0x66,0x65,0x65,0x64,0x43,
-0x61,0x40,0x62,0x70,0x63,0xa2,0x55,0x65,0xa2,0xdb,0x67,0x10,0x6c,0x38,0x11,0x75,
-0x65,0x39,2,0x69,0x23,0x6c,0x34,0x6d,0x16,0x62,0x69,0x67,0x75,0x6f,0x75,0x73,
-0x23,0x24,0x17,0x70,0x68,0x61,0x62,0x65,0x74,0x69,0x63,0x25,4,0x32,0x27,0x61,
-0x29,0x62,0x2b,0x6b,0x2d,0x72,0x12,0x65,0x61,0x6b,2,0x61,0x36,0x62,0x3e,0x73,
-0x15,0x79,0x6d,0x62,0x6f,0x6c,0x73,0x57,0x13,0x66,0x74,0x65,0x72,0x29,1,0x65,
-0x2a,0x6f,0x11,0x74,0x68,0x27,0x13,0x66,0x6f,0x72,0x65,0x2b,7,0x6d,0x51,0x6d,
-0x33,0x6f,0x28,0x70,0x69,0x72,0x35,1,0x6d,0x76,0x6e,1,0x64,0x3c,0x74,0x1a,
-0x69,0x6e,0x67,0x65,0x6e,0x74,0x62,0x72,0x65,0x61,0x6b,0x2f,0x15,0x69,0x74,0x69,
-0x6f,0x6e,0x61,0x1f,0x6c,0x6a,0x61,0x70,0x61,0x6e,0x65,0x73,0x65,0x73,0x74,0x61,
-0x72,0x74,0x65,0x72,0x6b,1,0x62,0x3a,0x70,0x19,0x6c,0x65,0x78,0x63,0x6f,0x6e,
-0x74,0x65,0x78,0x74,0x51,0x18,0x69,0x6e,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0x33,
-0x61,0x6a,0x62,0x2f,0x6a,0x6b,0x6c,0x30,0x13,0x6f,0x73,0x65,0x70,1,0x61,0x38,
-0x75,0x18,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x31,0x18,0x72,0x65,0x6e,
-0x74,0x68,0x65,0x73,0x69,0x73,0x69,0x1b,0x72,0x72,0x69,0x61,0x67,0x65,0x72,0x65,
-0x74,0x75,0x72,0x6e,0x35,2,0x62,0x3e,0x6d,0x46,0x78,0x36,0x18,0x63,0x6c,0x61,
-0x6d,0x61,0x74,0x69,0x6f,0x6e,0x37,0x70,0x12,0x61,0x73,0x65,0x71,0x72,0x16,0x6f,
-0x64,0x69,0x66,0x69,0x65,0x72,0x73,1,0x64,0x42,0x6e,1,0x6f,0x32,0x75,0x26,
-0x14,0x6d,0x65,0x72,0x69,0x63,0x27,0x11,0x6e,0x65,0x21,1,0x65,0x2e,0x69,0x24,
-0x12,0x67,0x69,0x74,0x25,0x22,0x14,0x63,0x69,0x6d,0x61,0x6c,0x23,0,0x18,0x6e,
-0xc3,0xe6,0x74,0xc1,0x51,0x77,0x7a,0x77,0xa2,0x4c,0x78,0xa2,0x60,0x79,0xa2,0x6a,
-0x7a,6,0x73,0x1e,0x73,0x34,0x78,0x42,0x79,0x48,0x7a,0x11,0x7a,0x7a,0xa3,0x67,
-0x10,0x79,1,0x65,0xa3,0xae,0x6d,0xa3,0x81,0x11,0x78,0x78,0xa3,0x66,0x11,0x79,
-0x79,0x21,0x61,0x30,0x69,0x58,0x6d,0x11,0x74,0x68,0xa3,0x80,0x10,0x6e,1,0x61,
-0x26,0x62,0xa3,0xb1,0x1a,0x62,0x61,0x7a,0x61,0x72,0x73,0x71,0x75,0x61,0x72,0x65,
-0xa3,0xb1,0x11,0x6e,0x68,0x23,1,0x61,0x2c,0x6f,0x11,0x6c,0x65,0xa3,0x9b,0x11,
-0x72,0x61,0xa2,0x92,0x15,0x6e,0x67,0x63,0x69,0x74,0x69,0xa3,0x92,1,0x70,0x2c,
-0x73,0x11,0x75,0x78,0xa3,0x65,0x11,0x65,0x6f,0x9b,0x10,0x69,0x72,0x11,0x69,0x69,
-0x73,0x74,0x4a,0x75,0xa2,0xba,0x76,1,0x61,0x2c,0x69,0x11,0x73,0x70,0xa3,0x64,
-0x10,0x69,0xa2,0x63,0x10,0x69,0xa3,0x63,5,0x67,0x36,0x67,0x68,0x68,0x6c,0x69,
-2,0x62,0x3a,0x66,0x4a,0x72,0x10,0x68,0xa2,0x9e,0x12,0x75,0x74,0x61,0xa3,0x9e,
-1,0x65,0x24,0x74,0x6f,0x12,0x74,0x61,0x6e,0x6f,0x14,0x69,0x6e,0x61,0x67,0x68,
-0x99,0x11,0x6c,0x67,0x75,0x10,0x61,1,0x61,0x24,0x69,0x6d,0x6a,0x11,0x6e,0x61,
-0x6b,0x61,0x30,0x65,0xa2,0x5b,0x66,0x11,0x6e,0x67,0x99,6,0x6c,0x21,0x6c,0x32,
-0x6d,0x38,0x6e,0x44,0x76,0x10,0x74,0xa3,0x7f,1,0x65,0x89,0x75,0x97,1,0x69,
-0x24,0x6c,0x67,0x10,0x6c,0x67,0x10,0x67,0xa2,0x9a,0x11,0x75,0x74,0xa3,0x9a,0x67,
-0x36,0x69,0x52,0x6b,0x10,0x72,0xa2,0x99,0x10,0x69,0xa3,0x99,1,0x61,0x30,0x62,
-0x7a,0x13,0x61,0x6e,0x77,0x61,0x7b,0x12,0x6c,0x6f,0x67,0x75,2,0x6c,0x32,0x74,
-0x34,0x76,0x12,0x69,0x65,0x74,0xa3,0x7f,0x10,0x65,0x89,0x12,0x68,0x61,0x6d,0xa3,
-0x6a,1,0x6c,0x2a,0x6e,0x10,0x67,0xa3,0x62,0x10,0x75,0x68,0x11,0x67,0x75,0x69,
-1,0x67,0x32,0x6e,0x14,0x6b,0x6e,0x6f,0x77,0x6e,0xa3,0x67,0x11,0x61,0x72,0x8a,
-0x13,0x69,0x74,0x69,0x63,0x8b,0x71,0xc1,0x13,0x71,0xa2,0xde,0x72,0xa2,0xe3,0x73,
-6,0x69,0x8a,0x69,0x72,0x6f,0xa2,0x4c,0x75,0xa2,0x75,0x79,1,0x6c,0x46,0x72,
-4,0x63,0x65,0x65,0xa3,0x5f,0x69,0x2c,0x6a,0xa3,0x60,0x6e,0xa3,0x61,0x11,0x61,
-0x63,0x65,0x10,0x6f,0x94,0x16,0x74,0x69,0x6e,0x61,0x67,0x72,0x69,0x95,2,0x64,
-0x3c,0x67,0x4c,0x6e,1,0x64,0xa3,0x91,0x68,0x62,0x12,0x61,0x6c,0x61,0x63,0x10,
-0x64,0xa2,0xa6,0x12,0x68,0x61,0x6d,0xa3,0xa6,0x17,0x6e,0x77,0x72,0x69,0x74,0x69,
-0x6e,0x67,0xa3,0x70,2,0x67,0x3a,0x72,0x52,0x79,0x10,0x6f,0xa2,0xb0,0x12,0x6d,
-0x62,0x6f,0xa3,0xb0,1,0x64,0x26,0x6f,0xa3,0xb8,0xa2,0xb7,0x12,0x69,0x61,0x6e,
-0xa3,0xb7,0x10,0x61,0xa2,0x98,0x16,0x73,0x6f,0x6d,0x70,0x65,0x6e,0x67,0xa3,0x98,
-0x11,0x6e,0x64,0xa2,0x71,0x14,0x61,0x6e,0x65,0x73,0x65,0xa3,0x71,0x61,0x5c,0x67,
-0xa2,0x43,0x68,1,0x61,0x2a,0x72,0x10,0x64,0xa3,0x97,2,0x72,0x28,0x76,0x30,
-0x77,0x87,0x12,0x61,0x64,0x61,0xa3,0x97,0x12,0x69,0x61,0x6e,0x87,2,0x6d,0x40,
-0x72,0x58,0x75,0x10,0x72,0xa2,0x6f,0x15,0x61,0x73,0x68,0x74,0x72,0x61,0xa3,0x6f,
-1,0x61,0x26,0x72,0xa3,0x7e,0x14,0x72,0x69,0x74,0x61,0x6e,0xa3,0x7e,1,0x61,
-0xa3,0x5e,0x62,0xa3,0x85,0x11,0x6e,0x77,0xa3,0x70,0x11,0x61,0x61,1,0x63,0x2f,
-0x69,0x23,3,0x65,0x3e,0x6a,0x48,0x6f,0x4e,0x75,0x10,0x6e,1,0x69,0x24,0x72,
-0x61,0x10,0x63,0x61,0x13,0x6a,0x61,0x6e,0x67,0xa3,0x6e,0x11,0x6e,0x67,0xa3,0x6e,
-1,0x68,0x2a,0x72,0x10,0x6f,0xa3,0x5d,0x10,0x67,0xa3,0xb6,0x6e,0xa2,0x83,0x6f,
-0xa2,0xca,0x70,5,0x6c,0x1e,0x6c,0x44,0x72,0x4a,0x73,0x1b,0x61,0x6c,0x74,0x65,
-0x72,0x70,0x61,0x68,0x6c,0x61,0x76,0x69,0xa3,0x7b,0x11,0x72,0x64,0xa3,0x5c,0x11,
-0x74,0x69,0xa3,0x7d,0x61,0x7c,0x65,0xa2,0x54,0x68,3,0x61,0x3e,0x6c,0x4e,0x6e,
-0x5e,0x6f,0x16,0x65,0x6e,0x69,0x63,0x69,0x61,0x6e,0xa3,0x5b,0x10,0x67,0xa2,0x5a,
-0x12,0x73,0x70,0x61,0xa3,0x5a,2,0x69,0xa3,0x7a,0x70,0xa3,0x7b,0x76,0xa3,0x7c,
-0x10,0x78,0xa3,0x5b,2,0x68,0x3e,0x6c,0x50,0x75,0x10,0x63,0xa2,0xa5,0x14,0x69,
-0x6e,0x68,0x61,0x75,0xa3,0xa5,0x17,0x61,0x77,0x68,0x68,0x6d,0x6f,0x6e,0x67,0xa3,
-0x4b,0x10,0x6d,0xa2,0x90,0x14,0x79,0x72,0x65,0x6e,0x65,0xa3,0x90,0x11,0x72,0x6d,
-0xa3,0x59,5,0x6b,0x1e,0x6b,0x32,0x73,0x4a,0x75,0x12,0x73,0x68,0x75,0xa3,0x96,
-1,0x67,0x2e,0x6f,0xa2,0x57,0x10,0x6f,0xa3,0x57,0x10,0x62,0xa3,0x84,0x11,0x68,
-0x75,0xa3,0x96,0x61,0x42,0x62,0x60,0x65,0x10,0x77,1,0x61,0xa3,0xaa,0x74,0x14,
-0x61,0x69,0x6c,0x75,0x65,0x97,1,0x62,0x2a,0x72,0x10,0x62,0xa3,0x8e,0x15,0x61,
-0x74,0x61,0x65,0x61,0x6e,0xa3,0x8f,0x11,0x61,0x74,0xa3,0x8f,3,0x67,0x5a,0x6c,
-0x6c,0x72,0xa2,0x93,0x73,2,0x61,0x36,0x67,0x3c,0x6d,0x10,0x61,0x84,0x12,0x6e,
-0x79,0x61,0x85,0x11,0x67,0x65,0xa3,0xab,0x10,0x65,0xa3,0xab,1,0x61,0x2a,0x68,
-0x11,0x61,0x6d,0x5b,0x10,0x6d,0x5b,1,0x63,0xa2,0x60,0x64,5,0x70,0x37,0x70,
-0x36,0x73,0x54,0x74,0x14,0x75,0x72,0x6b,0x69,0x63,0xa3,0x58,0x11,0x65,0x72,1,
-0x6d,0x2c,0x73,0x12,0x69,0x61,0x6e,0x9b,0x11,0x69,0x63,0xa3,0x59,0x10,0x6f,1,
-0x67,0x3a,0x75,0x18,0x74,0x68,0x61,0x72,0x61,0x62,0x69,0x61,0x6e,0xa3,0x85,0x13,
-0x64,0x69,0x61,0x6e,0xa3,0xb8,0x68,0x42,0x69,0x54,0x6e,0x1a,0x6f,0x72,0x74,0x68,
-0x61,0x72,0x61,0x62,0x69,0x61,0x6e,0xa3,0x8e,0x17,0x75,0x6e,0x67,0x61,0x72,0x69,
-0x61,0x6e,0xa3,0x4c,0x14,0x74,0x61,0x6c,0x69,0x63,0x5d,1,0x68,0x26,0x6b,0xa3,
-0x6d,0x12,0x69,0x6b,0x69,0xa3,0x6d,2,0x69,0x2c,0x6b,0x30,0x79,0x10,0x61,0x5f,
-0x11,0x79,0x61,0x5f,0x10,0x68,0xa3,0x58,0x68,0xc2,0xef,0x6b,0xc2,0xa,0x6b,0xa4,
-0x17,0x6c,0xa4,0x98,0x6d,8,0x6f,0x46,0x6f,0x48,0x72,0x74,0x74,0x80,0x75,0x86,
-0x79,1,0x61,0x28,0x6d,0x10,0x72,0x59,0x13,0x6e,0x6d,0x61,0x72,0x59,2,0x64,
-0x2e,0x6e,0x32,0x6f,0x10,0x6e,0xa3,0x72,0x10,0x69,0xa3,0xa3,0x10,0x67,0x56,0x14,
-0x6f,0x6c,0x69,0x61,0x6e,0x57,0x10,0x6f,0xa2,0x95,0x10,0x6f,0xa3,0x95,0x11,0x65,
-0x69,0xa3,0x73,0x11,0x6c,0x74,0xa2,0xa4,0x12,0x61,0x6e,0x69,0xa3,0xa4,0x61,0x36,
-0x65,0xa2,0x67,0x69,0xa2,0xbd,0x6c,0x11,0x79,0x6d,0x55,6,0x6e,0x38,0x6e,0x32,
-0x72,0x5c,0x73,0x6c,0x79,0x10,0x61,0xa3,0x55,1,0x64,0x38,0x69,0xa2,0x79,0x15,
-0x63,0x68,0x61,0x65,0x61,0x6e,0xa3,0x79,0xa2,0x54,0x12,0x61,0x69,0x63,0xa3,0x54,
-0x10,0x63,0xa2,0xa9,0x12,0x68,0x65,0x6e,0xa3,0xa9,0x18,0x61,0x72,0x61,0x6d,0x67,
-0x6f,0x6e,0x64,0x69,0xa3,0xaf,0x68,0x36,0x6b,0x4c,0x6c,0x15,0x61,0x79,0x61,0x6c,
-0x61,0x6d,0x55,1,0x61,0x26,0x6a,0xa3,0xa0,0x13,0x6a,0x61,0x6e,0x69,0xa3,0xa0,
-0x10,0x61,0xa2,0xb4,0x12,0x73,0x61,0x72,0xa3,0xb4,3,0x64,0x78,0x65,0x94,0x6e,
-0xa2,0x42,0x72,1,0x63,0xa3,0x8d,0x6f,0xa2,0x56,0x13,0x69,0x74,0x69,0x63,1,
-0x63,0x3c,0x68,0x19,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0x56,
-0x15,0x75,0x72,0x73,0x69,0x76,0x65,0xa3,0x8d,1,0x65,0x26,0x66,0xa3,0xb5,0x16,
-0x66,0x61,0x69,0x64,0x72,0x69,0x6e,0xa3,0xb5,0x17,0x74,0x65,0x69,0x6d,0x61,0x79,
-0x65,0x6b,0xa3,0x73,0x10,0x64,0xa2,0x8c,0x17,0x65,0x6b,0x69,0x6b,0x61,0x6b,0x75,
-0x69,0xa3,0x8c,0x11,0x61,0x6f,0xa3,0x5c,5,0x6f,0x14,0x6f,0x30,0x70,0x36,0x74,
-0x11,0x68,0x69,0xa3,0x78,0x11,0x72,0x65,0xa3,0x77,0x11,0x65,0x6c,0xa3,0x8a,0x61,
-0x2e,0x68,0x98,0x6e,0x11,0x64,0x61,0x4b,4,0x69,0x3c,0x6c,0x44,0x6e,0x48,0x74,
-0x56,0x79,0x13,0x61,0x68,0x6c,0x69,0xa3,0x4f,0x12,0x74,0x68,0x69,0xa3,0x78,0x10,
-0x69,0xa3,0x4f,1,0x61,0x4d,0x6e,0x12,0x61,0x64,0x61,0x4b,0x14,0x61,0x6b,0x61,
-0x6e,0x61,0x4c,0x19,0x6f,0x72,0x68,0x69,0x72,0x61,0x67,0x61,0x6e,0x61,0x8d,3,
-0x61,0x3c,0x6d,0x4e,0x6f,0x5a,0x75,0x15,0x64,0x61,0x77,0x61,0x64,0x69,0xa3,0x91,
-0x10,0x72,0x92,0x15,0x6f,0x73,0x68,0x74,0x68,0x69,0x93,1,0x65,0x24,0x72,0x4f,
-0x10,0x72,0x4f,0x10,0x6a,0xa2,0x9d,0x11,0x6b,0x69,0xa3,0x9d,4,0x61,0x5c,0x65,
-0x90,0x69,0xa0,0x6f,0xa2,0x5d,0x79,1,0x63,0x34,0x64,0x10,0x69,0xa2,0x6c,0x11,
-0x61,0x6e,0xa3,0x6c,0x10,0x69,0xa2,0x6b,0x11,0x61,0x6e,0xa3,0x6b,2,0x6e,0x42,
-0x6f,0x46,0x74,3,0x66,0xa3,0x50,0x67,0xa3,0x51,0x69,0x24,0x6e,0x53,0x10,0x6e,
-0x53,0x10,0x61,0xa3,0x6a,0x50,0x10,0x6f,0x51,0x11,0x70,0x63,0xa2,0x52,0x11,0x68,
-0x61,0xa3,0x52,2,0x6d,0x2e,0x6e,0x36,0x73,0x10,0x75,0xa3,0x83,0x10,0x62,0x80,
-0x10,0x75,0x81,2,0x61,0xa3,0x53,0x62,0x83,0x65,0x11,0x61,0x72,1,0x61,0xa3,
-0x53,0x62,0x83,0x11,0x6d,0x61,0xa3,0x8b,0x68,0x6e,0x69,0xa2,0x91,0x6a,2,0x61,
-0x30,0x70,0x52,0x75,0x11,0x72,0x63,0xa3,0x94,1,0x6d,0x38,0x76,0x10,0x61,0xa2,
-0x4e,0x13,0x6e,0x65,0x73,0x65,0xa3,0x4e,0x10,0x6f,0xa3,0xad,0x11,0x61,0x6e,0xa3,
-0x69,6,0x6c,0x1a,0x6c,0x34,0x6d,0x3a,0x72,0x40,0x75,0x11,0x6e,0x67,0xa3,0x4c,
-0x11,0x75,0x77,0xa3,0x9c,0x11,0x6e,0x67,0xa3,0x4b,0x11,0x6b,0x74,0x8d,0x61,0x3c,
-0x65,0xa2,0x43,0x69,0x11,0x72,0x61,0x48,0x13,0x67,0x61,0x6e,0x61,0x49,1,0x6e,
-0x34,0x74,0x10,0x72,0xa2,0xa2,0x11,0x61,0x6e,0xa3,0xa2,0x42,6,0x6f,0xe,0x6f,
-0x77,0x73,0xa3,0x49,0x74,0xa3,0x4a,0x75,0x12,0x6e,0x6f,0x6f,0x77,0x62,0xa3,0xac,
-0x67,0x3e,0x69,0x42,0x19,0x66,0x69,0x72,0x6f,0x68,0x69,0x6e,0x67,0x79,0x61,0xa3,
-0xb6,0x44,0x11,0x75,0x6c,0x45,0x11,0x62,0x72,0x46,0x11,0x65,0x77,0x47,2,0x6d,
-0x2e,0x6e,0x4a,0x74,0x11,0x61,0x6c,0x5d,0x1c,0x70,0x65,0x72,0x69,0x61,0x6c,0x61,
-0x72,0x61,0x6d,0x61,0x69,0x63,0xa3,0x74,2,0x64,0x66,0x68,0x6a,0x73,0x1b,0x63,
-0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x70,0x61,1,0x68,0x32,0x72,0x14,
-0x74,0x68,0x69,0x61,0x6e,0xa3,0x7d,0x13,0x6c,0x61,0x76,0x69,0xa3,0x7a,0x10,0x73,
-0xa3,0x4d,0x15,0x65,0x72,0x69,0x74,0x65,0x64,0x23,0x64,0xc0,0xec,0x64,0xa2,0x7a,
-0x65,0xa2,0xad,0x67,4,0x65,0x82,0x6c,0x9a,0x6f,0xa2,0x46,0x72,0xa2,0x55,0x75,
-2,0x6a,0x3c,0x6e,0x4e,0x72,1,0x6d,0x24,0x75,0x41,0x13,0x75,0x6b,0x68,0x69,
-0x41,1,0x61,0x24,0x72,0x3f,0x13,0x72,0x61,0x74,0x69,0x3f,0x18,0x6a,0x61,0x6c,
-0x61,0x67,0x6f,0x6e,0x64,0x69,0xa3,0xb3,0x10,0x6f,1,0x6b,0xa3,0x48,0x72,0x38,
-0x13,0x67,0x69,0x61,0x6e,0x39,0x11,0x61,0x67,0x90,0x15,0x6f,0x6c,0x69,0x74,0x69,
-0x63,0x91,1,0x6e,0x30,0x74,0x10,0x68,0x3a,0x11,0x69,0x63,0x3b,1,0x67,0xa3,
-0xb3,0x6d,0xa3,0xaf,1,0x61,0x32,0x65,1,0x65,0x24,0x6b,0x3d,0x10,0x6b,0x3d,
-0x10,0x6e,0xa2,0x89,0x12,0x74,0x68,0x61,0xa3,0x89,3,0x65,0x42,0x6f,0x68,0x73,
-0x76,0x75,0x11,0x70,0x6c,0xa2,0x87,0x13,0x6f,0x79,0x61,0x6e,0xa3,0x87,1,0x73,
-0x38,0x76,0x10,0x61,0x34,0x15,0x6e,0x61,0x67,0x61,0x72,0x69,0x35,0x13,0x65,0x72,
-0x65,0x74,0x33,0x11,0x67,0x72,0xa2,0xb2,0x10,0x61,0xa3,0xb2,0x11,0x72,0x74,0x33,
-2,0x67,0x3a,0x6c,0x72,0x74,0x11,0x68,0x69,0x36,0x13,0x6f,0x70,0x69,0x63,0x37,
-0x10,0x79,2,0x64,0xa3,0x45,0x68,0xa3,0x46,0x70,0xa2,0x47,0x1e,0x74,0x69,0x61,
-0x6e,0x68,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0x47,0x11,0x62,
-0x61,0xa2,0x88,0x12,0x73,0x61,0x6e,0xa3,0x88,0x61,0xa2,0xa2,0x62,0xa4,7,0x63,
-6,0x6f,0x3d,0x6f,0x5a,0x70,0x76,0x75,0x7a,0x79,1,0x70,0x3e,0x72,2,0x69,
-0x2a,0x6c,0x31,0x73,0xa3,0x44,0x13,0x6c,0x6c,0x69,0x63,0x31,0x13,0x72,0x69,0x6f,
-0x74,0x7f,1,0x6d,0x30,0x70,0x10,0x74,0x2e,0x11,0x69,0x63,0x2f,0x12,0x6d,0x6f,
-0x6e,0x21,0x11,0x72,0x74,0x7f,0x16,0x6e,0x65,0x69,0x66,0x6f,0x72,0x6d,0xa3,0x65,
-0x61,0x32,0x68,0xa2,0x41,0x69,0x11,0x72,0x74,0xa3,0x43,3,0x6b,0x4c,0x6e,0x50,
-0x72,0x76,0x75,0x1d,0x63,0x61,0x73,0x69,0x61,0x6e,0x61,0x6c,0x62,0x61,0x6e,0x69,
-0x61,0x6e,0xa3,0x9f,0x10,0x6d,0xa3,0x76,1,0x61,0x24,0x73,0x71,0x1d,0x64,0x69,
-0x61,0x6e,0x61,0x62,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x71,0x10,0x69,0xa2,
-0x68,0x11,0x61,0x6e,0xa3,0x68,1,0x61,0x34,0x65,0x10,0x72,0x2c,0x13,0x6f,0x6b,
-0x65,0x65,0x2d,1,0x6b,0x26,0x6d,0xa3,0x42,0x11,0x6d,0x61,0xa3,0x76,6,0x68,
-0x4a,0x68,0x48,0x6e,0x4e,0x72,0x76,0x76,1,0x65,0x2a,0x73,0x10,0x74,0xa3,0x75,
-0x13,0x73,0x74,0x61,0x6e,0xa3,0x75,0x11,0x6f,0x6d,0xa3,0xa1,0x11,0x61,0x74,0x1f,
-0x6f,0x6c,0x69,0x61,0x6e,0x68,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,
-0xa3,0x9c,1,0x61,0x3e,0x6d,2,0x65,0x2a,0x69,0xa3,0x74,0x6e,0x27,0x13,0x6e,
-0x69,0x61,0x6e,0x27,0x10,0x62,0x24,0x11,0x69,0x63,0x25,0x64,0x30,0x66,0x44,0x67,
-0x11,0x68,0x62,0xa3,0x9f,0x10,0x6c,1,0x61,0x26,0x6d,0xa3,0xa7,0x10,0x6d,0xa3,
-0xa7,0x11,0x61,0x6b,0xa3,0x93,6,0x6c,0x3c,0x6c,0x52,0x6f,0x56,0x72,0x66,0x75,
-1,0x67,0x30,0x68,1,0x64,0x79,0x69,0x10,0x64,0x79,0x10,0x69,0x8e,0x13,0x6e,
-0x65,0x73,0x65,0x8f,0x11,0x69,0x73,0xa1,0x11,0x70,0x6f,0x2a,0x13,0x6d,0x6f,0x66,
-0x6f,0x2b,0x10,0x61,1,0x68,0x2e,0x69,0x7c,0x12,0x6c,0x6c,0x65,0x7d,0xa2,0x41,
-0x11,0x6d,0x69,0xa3,0x41,0x61,0x48,0x65,0x9c,0x68,1,0x61,0x2a,0x6b,0x10,0x73,
-0xa3,0xa8,0x15,0x69,0x6b,0x73,0x75,0x6b,0x69,0xa3,0xa8,3,0x6c,0x3a,0x6d,0x48,
-0x73,0x54,0x74,1,0x61,0x24,0x6b,0x9f,0x10,0x6b,0x9f,0x10,0x69,0x9c,0x13,0x6e,
-0x65,0x73,0x65,0x9d,0x10,0x75,0xa2,0x82,0x10,0x6d,0xa3,0x82,0x10,0x73,0xa2,0x86,
-0x13,0x61,0x76,0x61,0x68,0xa3,0x86,0x11,0x6e,0x67,0x28,0x12,0x61,0x6c,0x69,0x29,
-3,0x6c,0x42,0x6e,0x90,0x74,0xa2,0x46,0x76,0x24,0x17,0x6f,0x77,0x65,0x6c,0x6a,
-0x61,0x6d,0x6f,0x25,0x22,1,0x65,0x54,0x76,0x28,1,0x73,0x38,0x74,0x2a,0x17,
-0x73,0x79,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x2b,0x16,0x79,0x6c,0x6c,0x61,0x62,0x6c,
-0x65,0x29,0x18,0x61,0x64,0x69,0x6e,0x67,0x6a,0x61,0x6d,0x6f,0x23,1,0x61,0x21,
-0x6f,0x1a,0x74,0x61,0x70,0x70,0x6c,0x69,0x63,0x61,0x62,0x6c,0x65,0x21,0x26,0x1a,
-0x72,0x61,0x69,0x6c,0x69,0x6e,0x67,0x6a,0x61,0x6d,0x6f,0x27,1,0x6e,0x2c,0x79,
-0x22,0x11,0x65,0x73,0x23,0x20,0x10,0x6f,0x21,1,0x6e,0x2c,0x79,0x22,0x11,0x65,
-0x73,0x23,0x20,0x10,0x6f,0x21,2,0x6d,0x30,0x6e,0x3a,0x79,0x22,0x11,0x65,0x73,
-0x23,0x24,0x13,0x61,0x79,0x62,0x65,0x25,0x20,0x10,0x6f,0x21,2,0x6d,0x30,0x6e,
-0x3a,0x79,0x22,0x11,0x65,0x73,0x23,0x24,0x13,0x61,0x79,0x62,0x65,0x25,0x20,0x10,
-0x6f,0x21,0xb,0x72,0x39,0x76,0xc,0x76,0x33,0x78,0x2a,0x7a,0x11,0x77,0x6a,0x43,
-0x10,0x78,0x21,0x72,0x28,0x73,0x50,0x74,0x31,1,0x65,0x24,0x69,0x39,0x1e,0x67,
-0x69,0x6f,0x6e,0x61,0x6c,0x69,0x6e,0x64,0x69,0x63,0x61,0x74,0x6f,0x72,0x39,1,
-0x6d,0x35,0x70,0x18,0x61,0x63,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0x35,0x6c,0x1f,
-0x6c,0x3c,0x6f,0x4a,0x70,1,0x70,0x37,0x72,0x14,0x65,0x70,0x65,0x6e,0x64,0x37,
-0x28,1,0x66,0x2b,0x76,0x2c,0x10,0x74,0x2f,0x13,0x74,0x68,0x65,0x72,0x21,0x63,
-0x4c,0x65,0x64,0x67,1,0x61,0x3a,0x6c,0x19,0x75,0x65,0x61,0x66,0x74,0x65,0x72,
-0x7a,0x77,0x6a,0x41,0x10,0x7a,0x41,2,0x6e,0x23,0x6f,0x24,0x72,0x25,0x14,0x6e,
-0x74,0x72,0x6f,0x6c,0x23,2,0x62,0x34,0x6d,0x4e,0x78,0x26,0x13,0x74,0x65,0x6e,
-0x64,0x27,0x3a,1,0x61,0x24,0x67,0x3d,0x11,0x73,0x65,0x3a,0x12,0x67,0x61,0x7a,
-0x3d,0x3e,0x16,0x6f,0x64,0x69,0x66,0x69,0x65,0x72,0x3f,9,0x6e,0x4a,0x6e,0x34,
-0x6f,0x44,0x73,0x60,0x75,0x94,0x78,0x10,0x78,0x21,0x10,0x75,0x2a,0x14,0x6d,0x65,
-0x72,0x69,0x63,0x2b,1,0x6c,0x2c,0x74,0x12,0x68,0x65,0x72,0x21,0x14,0x65,0x74,
-0x74,0x65,0x72,0x2d,3,0x63,0x36,0x65,0x46,0x70,0x31,0x74,0x32,0x12,0x65,0x72,
-0x6d,0x33,0x3c,0x16,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3d,0x2e,0x10,0x70,0x2f,
-0x10,0x70,0x34,0x12,0x70,0x65,0x72,0x35,0x61,0x46,0x63,0x52,0x65,0x64,0x66,0x72,
-0x6c,2,0x65,0x2d,0x66,0x3b,0x6f,0x28,0x12,0x77,0x65,0x72,0x29,0x10,0x74,0x22,
-0x12,0x65,0x72,0x6d,0x23,1,0x6c,0x24,0x72,0x37,0x24,0x12,0x6f,0x73,0x65,0x25,
-0x10,0x78,0x38,0x13,0x74,0x65,0x6e,0x64,0x39,0x10,0x6f,0x26,0x13,0x72,0x6d,0x61,
-0x74,0x27,0,0x10,0x6c,0x88,0x72,0x40,0x72,0x36,0x73,0x5e,0x77,0x7a,0x78,0x8a,
-0x7a,0x11,0x77,0x6a,0x4b,1,0x65,0x24,0x69,0x3b,0x1e,0x67,0x69,0x6f,0x6e,0x61,
-0x6c,0x69,0x6e,0x64,0x69,0x63,0x61,0x74,0x6f,0x72,0x3b,1,0x69,0x24,0x71,0x3f,
-0x18,0x6e,0x67,0x6c,0x65,0x71,0x75,0x6f,0x74,0x65,0x3f,0x17,0x73,0x65,0x67,0x73,
-0x70,0x61,0x63,0x65,0x4d,0x10,0x78,0x21,0x6c,0x36,0x6d,0x3c,0x6e,0x76,0x6f,0x13,
-0x74,0x68,0x65,0x72,0x21,1,0x65,0x23,0x66,0x35,3,0x62,0x37,0x69,0x28,0x6c,
-0x29,0x6e,0x2b,0x10,0x64,1,0x6c,0x34,0x6e,0x11,0x75,0x6d,0x2a,0x12,0x6c,0x65,
-0x74,0x37,0x14,0x65,0x74,0x74,0x65,0x72,0x29,2,0x65,0x36,0x6c,0x39,0x75,0x2c,
-0x14,0x6d,0x65,0x72,0x69,0x63,0x2d,0x14,0x77,0x6c,0x69,0x6e,0x65,0x39,0x66,0x3f,
-0x66,0x40,0x67,0x4e,0x68,0x70,0x6b,0x10,0x61,0x26,0x15,0x74,0x61,0x6b,0x61,0x6e,
-0x61,0x27,0x10,0x6f,0x24,0x13,0x72,0x6d,0x61,0x74,0x25,1,0x61,0x3a,0x6c,0x19,
-0x75,0x65,0x61,0x66,0x74,0x65,0x72,0x7a,0x77,0x6a,0x49,0x10,0x7a,0x49,1,0x65,
-0x24,0x6c,0x3d,0x19,0x62,0x72,0x65,0x77,0x6c,0x65,0x74,0x74,0x65,0x72,0x3d,0x61,
-0x86,0x63,0x92,0x64,0x94,0x65,2,0x62,0x44,0x6d,0x5e,0x78,0x2e,0x13,0x74,0x65,
-0x6e,0x64,0x32,0x15,0x6e,0x75,0x6d,0x6c,0x65,0x74,0x2f,0x42,1,0x61,0x24,0x67,
-0x45,0x11,0x73,0x65,0x42,0x12,0x67,0x61,0x7a,0x45,0x46,0x16,0x6f,0x64,0x69,0x66,
-0x69,0x65,0x72,0x47,0x15,0x6c,0x65,0x74,0x74,0x65,0x72,0x23,0x10,0x72,0x31,1,
-0x6f,0x24,0x71,0x41,0x18,0x75,0x62,0x6c,0x65,0x71,0x75,0x6f,0x74,0x65,0x41,2,
-0x63,0x32,0x6e,0x3c,0x6f,0x22,0x12,0x70,0x65,0x6e,0x23,0x24,0x13,0x6c,0x6f,0x73,
-0x65,0x25,0x20,0x12,0x6f,0x6e,0x65,0x21,6,0x6f,0x5c,0x6f,0x4a,0x72,0x5c,0x74,
-0x64,0x76,0x1d,0x69,0x73,0x75,0x61,0x6c,0x6f,0x72,0x64,0x65,0x72,0x6c,0x65,0x66,
-0x74,0x3d,0x18,0x76,0x65,0x72,0x73,0x74,0x72,0x75,0x63,0x6b,0x2d,0x13,0x69,0x67,
-0x68,0x74,0x2f,0x11,0x6f,0x70,0x30,0x12,0x61,0x6e,0x64,2,0x62,0x32,0x6c,0x50,
-0x72,0x13,0x69,0x67,0x68,0x74,0x3b,0x14,0x6f,0x74,0x74,0x6f,0x6d,0x32,0x17,0x61,
-0x6e,0x64,0x72,0x69,0x67,0x68,0x74,0x35,0x12,0x65,0x66,0x74,0x36,0x17,0x61,0x6e,
-0x64,0x72,0x69,0x67,0x68,0x74,0x39,0x62,0x2c,0x6c,0x5c,0x6e,0x10,0x61,0x21,0x14,
-0x6f,0x74,0x74,0x6f,0x6d,0x22,0x12,0x61,0x6e,0x64,1,0x6c,0x2e,0x72,0x13,0x69,
-0x67,0x68,0x74,0x27,0x12,0x65,0x66,0x74,0x25,0x12,0x65,0x66,0x74,0x28,0x17,0x61,
-0x6e,0x64,0x72,0x69,0x67,0x68,0x74,0x2b,0xd,0x6e,0xaa,0x72,0x70,0x72,0x92,0x73,
-0xa2,0x46,0x74,0xa2,0x54,0x76,1,0x69,0x60,0x6f,0x12,0x77,0x65,0x6c,0x62,1,
-0x64,0x3a,0x69,0x19,0x6e,0x64,0x65,0x70,0x65,0x6e,0x64,0x65,0x6e,0x74,0x67,0x17,
-0x65,0x70,0x65,0x6e,0x64,0x65,0x6e,0x74,0x65,1,0x72,0x2e,0x73,0x13,0x61,0x72,
-0x67,0x61,0x61,0x12,0x61,0x6d,0x61,0x5f,0x1d,0x65,0x67,0x69,0x73,0x74,0x65,0x72,
-0x73,0x68,0x69,0x66,0x74,0x65,0x72,0x57,0x1e,0x79,0x6c,0x6c,0x61,0x62,0x6c,0x65,
-0x6d,0x6f,0x64,0x69,0x66,0x69,0x65,0x72,0x59,0x12,0x6f,0x6e,0x65,1,0x6c,0x2c,
-0x6d,0x12,0x61,0x72,0x6b,0x5d,0x14,0x65,0x74,0x74,0x65,0x72,0x5b,0x6e,0x3c,0x6f,
-0x7c,0x70,0x18,0x75,0x72,0x65,0x6b,0x69,0x6c,0x6c,0x65,0x72,0x55,1,0x6f,0x4c,
-0x75,1,0x6b,0x3c,0x6d,0x12,0x62,0x65,0x72,0x50,0x15,0x6a,0x6f,0x69,0x6e,0x65,
-0x72,0x53,0x11,0x74,0x61,0x4f,0x16,0x6e,0x6a,0x6f,0x69,0x6e,0x65,0x72,0x4d,0x13,
-0x74,0x68,0x65,0x72,0x21,0x67,0x3e,0x67,0x4a,0x69,0x64,0x6a,0x82,0x6d,0x1d,0x6f,
-0x64,0x69,0x66,0x79,0x69,0x6e,0x67,0x6c,0x65,0x74,0x74,0x65,0x72,0x4b,0x1c,0x65,
-0x6d,0x69,0x6e,0x61,0x74,0x69,0x6f,0x6e,0x6d,0x61,0x72,0x6b,0x45,0x1e,0x6e,0x76,
-0x69,0x73,0x69,0x62,0x6c,0x65,0x73,0x74,0x61,0x63,0x6b,0x65,0x72,0x47,0x14,0x6f,
-0x69,0x6e,0x65,0x72,0x49,0x61,0xa2,0xba,0x62,0xa2,0xc0,0x63,1,0x61,0xa2,0xa2,
-0x6f,0x16,0x6e,0x73,0x6f,0x6e,0x61,0x6e,0x74,0x2a,8,0x6b,0x67,0x6b,0x48,0x6d,
-0x52,0x70,0x5c,0x73,0xa2,0x42,0x77,0x19,0x69,0x74,0x68,0x73,0x74,0x61,0x63,0x6b,
-0x65,0x72,0x43,0x14,0x69,0x6c,0x6c,0x65,0x72,0x35,0x14,0x65,0x64,0x69,0x61,0x6c,
-0x37,1,0x6c,0x52,0x72,0x10,0x65,1,0x63,0x2e,0x66,0x13,0x69,0x78,0x65,0x64,
-0x3d,0x19,0x65,0x64,0x69,0x6e,0x67,0x72,0x65,0x70,0x68,0x61,0x3b,0x18,0x61,0x63,
-0x65,0x68,0x6f,0x6c,0x64,0x65,0x72,0x39,0x10,0x75,1,0x62,0x3e,0x63,0x1b,0x63,
-0x65,0x65,0x64,0x69,0x6e,0x67,0x72,0x65,0x70,0x68,0x61,0x41,0x15,0x6a,0x6f,0x69,
-0x6e,0x65,0x64,0x3f,0x64,0x4c,0x66,0x52,0x68,0x5a,0x69,0x1e,0x6e,0x69,0x74,0x69,
-0x61,0x6c,0x70,0x6f,0x73,0x74,0x66,0x69,0x78,0x65,0x64,0x33,0x12,0x65,0x61,0x64,
-0x2d,0x13,0x69,0x6e,0x61,0x6c,0x2f,0x18,0x65,0x61,0x64,0x6c,0x65,0x74,0x74,0x65,
-0x72,0x31,0x1d,0x6e,0x74,0x69,0x6c,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x6d,0x61,0x72,
-0x6b,0x29,0x16,0x76,0x61,0x67,0x72,0x61,0x68,0x61,0x23,1,0x69,0x4a,0x72,0x10,
-0x61,0x1f,0x68,0x6d,0x69,0x6a,0x6f,0x69,0x6e,0x69,0x6e,0x67,0x6e,0x75,0x6d,0x62,
-0x65,0x72,0x27,0x12,0x6e,0x64,0x75,0x25,2,0x72,0x38,0x74,0x46,0x75,0x26,0x15,
-0x70,0x72,0x69,0x67,0x68,0x74,0x27,0x20,0x15,0x6f,0x74,0x61,0x74,0x65,0x64,0x21,
-1,0x72,0x24,0x75,0x25,0x22,0x18,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x65,0x64,
-1,0x72,0x32,0x75,0x15,0x70,0x72,0x69,0x67,0x68,0x74,0x25,0x15,0x6f,0x74,0x61,
-0x74,0x65,0x64,0x23,0xd,0x6e,0xc1,0x86,0x73,0xa8,0x73,0x4c,0x74,0xa2,0x76,0x75,
-0xa2,0x83,0x7a,0xd8,0x70,0,2,0x6c,0xd9,0x20,0,0x70,0xd9,0x40,0,0x73,
-0xc3,0,0xfe,0xf,0,0,0,7,0x6f,0x3c,0x6f,0xff,8,0,0,0,
-0x70,0x3a,0x75,0x6e,0x79,0x13,0x6d,0x62,0x6f,0x6c,0xff,0xf,0,0,0,0x11,
-0x61,0x63,1,0x65,0x34,0x69,0x15,0x6e,0x67,0x6d,0x61,0x72,0x6b,0xa5,0,0x18,
-0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0xc3,0,0x16,0x72,0x72,0x6f,0x67,
-0x61,0x74,0x65,0xe1,0,0,0x63,0xff,2,0,0,0,0x65,0x38,0x6b,0xff,
-4,0,0,0,0x6d,0xff,1,0,0,0,0x16,0x70,0x61,0x72,0x61,0x74,
-0x6f,0x72,0xd9,0x70,0,0x1d,0x69,0x74,0x6c,0x65,0x63,0x61,0x73,0x65,0x6c,0x65,
-0x74,0x74,0x65,0x72,0x31,1,0x6e,0x40,0x70,0x1c,0x70,0x65,0x72,0x63,0x61,0x73,
-0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x25,0x17,0x61,0x73,0x73,0x69,0x67,0x6e,0x65,
-0x64,0x23,0x6e,0xa2,0x69,0x6f,0xa2,0x89,0x70,0xfe,0x30,0xf8,0,0,9,0x69,
-0x33,0x69,0xff,0x10,0,0,0,0x6f,0xfd,0x80,0,0,0x72,0x54,0x73,0xf9,
-0,0,0x75,0x12,0x6e,0x63,0x74,0xfe,0x30,0xf8,0,0,0x15,0x75,0x61,0x74,
-0x69,0x6f,0x6e,0xff,0x30,0xf8,0,0,0x17,0x69,0x76,0x61,0x74,0x65,0x75,0x73,
-0x65,0xdd,0,0,0x61,0x48,0x63,0xfd,0x40,0,0,0x64,0xe9,0,0,0x65,
-0xfd,0x20,0,0,0x66,0xff,0x20,0,0,0,0x1f,0x72,0x61,0x67,0x72,0x61,
-0x70,0x68,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0xd9,0x40,0,0xbe,0,
-3,0x64,0xa7,0,0x6c,0xab,0,0x6f,0x30,0x75,0x13,0x6d,0x62,0x65,0x72,0xbf,
-0,0xb2,0,0x1b,0x6e,0x73,0x70,0x61,0x63,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,
-0xa1,1,0x70,0x92,0x74,0x12,0x68,0x65,0x72,0xe6,0x80,1,3,0x6c,0x40,0x6e,
-0x4a,0x70,0x56,0x73,0x14,0x79,0x6d,0x62,0x6f,0x6c,0xff,8,0,0,0,0x14,
-0x65,0x74,0x74,0x65,0x72,0x61,0x14,0x75,0x6d,0x62,0x65,0x72,0xb3,0,0x19,0x75,
-0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xfd,0x80,0,0,0x1c,0x65,0x6e,
-0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xf9,0,0,0x66,0xc0,
-0xc4,0x66,0xa2,0x47,0x69,0xa2,0x64,0x6c,0xa2,0x79,0x6d,0xa4,0xc0,4,0x61,0x6c,
-0x63,0xa5,0,0x65,0xa3,0x80,0x6e,0xa1,0x6f,0x15,0x64,0x69,0x66,0x69,0x65,0x72,
-1,0x6c,0x38,0x73,0x14,0x79,0x6d,0x62,0x6f,0x6c,0xff,4,0,0,0,0x14,
-0x65,0x74,0x74,0x65,0x72,0x41,1,0x72,0x3c,0x74,0x16,0x68,0x73,0x79,0x6d,0x62,
-0x6f,0x6c,0xff,1,0,0,0,0x10,0x6b,0xa5,0xc0,1,0x69,0x32,0x6f,0x13,
-0x72,0x6d,0x61,0x74,0xdb,0,0,0x1d,0x6e,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,
-0x75,0x61,0x74,0x69,0x6f,0x6e,0xff,0x20,0,0,0,0x10,0x6e,0x1f,0x69,0x74,
-0x69,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xff,0x10,
-0,0,0,0x9c,7,0x6d,0x18,0x6d,0x41,0x6f,0x28,0x74,0x31,0x75,0x25,0x60,
-0x1c,0x77,0x65,0x72,0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x29,0x63,
-0x3d,0x65,0x28,0x69,0x42,0x6c,0x29,0x13,0x74,0x74,0x65,0x72,0x9c,0x15,0x6e,0x75,
-0x6d,0x62,0x65,0x72,0xab,0,0x1a,0x6e,0x65,0x73,0x65,0x70,0x61,0x72,0x61,0x74,
-0x6f,0x72,0xd9,0x20,0,0x63,0x46,0x64,0xa2,0x96,0x65,0x1b,0x6e,0x63,0x6c,0x6f,
-0x73,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0xa3,0x80,0xe6,0x80,1,7,0x6e,0x57,
-0x6e,0x52,0x6f,0x5e,0x73,0xe1,0,0,0x75,0x1b,0x72,0x72,0x65,0x6e,0x63,0x79,
-0x73,0x79,0x6d,0x62,0x6f,0x6c,0xff,2,0,0,0,0x22,0x12,0x74,0x72,0x6c,
-0xd9,0x80,0,0xdc,0,0,1,0x6d,0x62,0x6e,1,0x6e,0x30,0x74,0x12,0x72,
-0x6f,0x6c,0xd9,0x80,0,0x1f,0x65,0x63,0x74,0x6f,0x72,0x70,0x75,0x6e,0x63,0x74,
-0x75,0x61,0x74,0x69,0x6f,0x6e,0xfd,0x40,0,0,0x19,0x62,0x69,0x6e,0x69,0x6e,
-0x67,0x6d,0x61,0x72,0x6b,0xa5,0xc0,0x61,0x58,0x63,0xd9,0x80,0,0x66,0xdb,0,
-0,0x6c,0x1d,0x6f,0x73,0x65,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,
-0x6e,0xfd,0x20,0,0,0x18,0x73,0x65,0x64,0x6c,0x65,0x74,0x74,0x65,0x72,0x3d,
-2,0x61,0x32,0x65,0x50,0x69,0x12,0x67,0x69,0x74,0xa7,0,0x1c,0x73,0x68,0x70,
-0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xe9,0,0,0x1a,0x63,0x69,
-0x6d,0x61,0x6c,0x6e,0x75,0x6d,0x62,0x65,0x72,0xa7,0
+0x6d,0xa5,1,0x1f,0x79,0x70,0x74,0x69,0x61,0x6e,0x68,0x69,0x65,0x72,0x6f,0x67,
+0x6c,0x79,0x70,0x68,1,0x66,0x26,0x73,0xa3,0xc2,0x1c,0x6f,0x72,0x6d,0x61,0x74,
+0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x73,0xa5,0x24,7,0x6e,0xc0,0xe5,0x6e,0x3e,
+0x72,0xa2,0x5d,0x73,0xa2,0xd8,0x76,0x14,0x65,0x73,0x74,0x61,0x6e,0xa3,0xbc,1,
+0x61,0x92,0x63,0x13,0x69,0x65,0x6e,0x74,1,0x67,0x34,0x73,0x15,0x79,0x6d,0x62,
+0x6f,0x6c,0x73,0xa3,0xa5,0x13,0x72,0x65,0x65,0x6b,1,0x6d,0x34,0x6e,0x15,0x75,
+0x6d,0x62,0x65,0x72,0x73,0xa3,0x7f,0x13,0x75,0x73,0x69,0x63,0xa2,0x7e,0x19,0x61,
+0x6c,0x6e,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0xa3,0x7e,0x10,0x74,0x1f,0x6f,0x6c,
+0x69,0x61,0x6e,0x68,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0xfe,
+2,0x61,0x32,0x6d,0xa2,0x71,0x72,0x12,0x6f,0x77,0x73,0x7d,0x12,0x62,0x69,0x63,
+0x38,3,0x65,0x4a,0x6d,0x66,0x70,0xa2,0x43,0x73,0x11,0x75,0x70,0xa2,0x80,0x16,
+0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x80,0x11,0x78,0x74,1,0x61,0xa3,0xd2,
+0x65,0x14,0x6e,0x64,0x65,0x64,0x61,0xa3,0xd2,0x12,0x61,0x74,0x68,0xa2,0xd3,0x18,
+0x65,0x6d,0x61,0x74,0x69,0x63,0x61,0x6c,0x61,0x1f,0x6c,0x70,0x68,0x61,0x62,0x65,
+0x74,0x69,0x63,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0xd3,1,0x66,0x42,0x72,
+0x1e,0x65,0x73,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x66,0x6f,0x72,0x6d,0x73,
+1,0x61,0xa3,0x51,0x62,0xa3,0x55,0x14,0x65,0x6e,0x69,0x61,0x6e,0x35,0x12,0x63,
+0x69,0x69,0x23,0x64,0x9e,0x65,0xa2,0x42,0x68,0xa2,0x4d,0x6c,1,0x63,0x62,0x70,
+0x17,0x68,0x61,0x62,0x65,0x74,0x69,0x63,0x70,1,0x66,0xa3,0x50,0x72,0x1e,0x65,
+0x73,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x66,0x6f,0x72,0x6d,0x73,0xa3,0x50,
+0x16,0x68,0x65,0x6d,0x69,0x63,0x61,0x6c,0xa2,0xd0,0x16,0x73,0x79,0x6d,0x62,0x6f,
+0x6c,0x73,0xa3,0xd0,0x12,0x6c,0x61,0x6d,0xa5,7,0x1a,0x67,0x65,0x61,0x6e,0x6e,
+0x75,0x6d,0x62,0x65,0x72,0x73,0xa3,0x77,0x11,0x6f,0x6d,0xa3,0xfd,7,0x6f,0x71,
+0x6f,0x64,0x72,0xa2,0x41,0x75,0xa2,0x58,0x79,0x1b,0x7a,0x61,0x6e,0x74,0x69,0x6e,
+0x65,0x6d,0x75,0x73,0x69,0x63,0xa2,0x5b,0x18,0x61,0x6c,0x73,0x79,0x6d,0x62,0x6f,
+0x6c,0x73,0xa3,0x5b,1,0x70,0x34,0x78,0x16,0x64,0x72,0x61,0x77,0x69,0x6e,0x67,
+0x89,0x14,0x6f,0x6d,0x6f,0x66,0x6f,0xa0,0x12,0x65,0x78,0x74,0xa2,0x43,0x14,0x65,
+0x6e,0x64,0x65,0x64,0xa3,0x43,0x10,0x61,1,0x68,0x40,0x69,0x12,0x6c,0x6c,0x65,
+0x92,0x17,0x70,0x61,0x74,0x74,0x65,0x72,0x6e,0x73,0x93,0x11,0x6d,0x69,0xa3,0xc9,
+1,0x67,0x2c,0x68,0x11,0x69,0x64,0xa3,0x64,0x14,0x69,0x6e,0x65,0x73,0x65,0xa3,
+0x81,0x61,0x48,0x65,0xa2,0x4e,0x68,0xa2,0x52,0x6c,0x1a,0x6f,0x63,0x6b,0x65,0x6c,
+0x65,0x6d,0x65,0x6e,0x74,0x73,0x8b,3,0x6c,0x34,0x6d,0x40,0x73,0x66,0x74,0x11,
+0x61,0x6b,0xa3,0xc7,0x14,0x69,0x6e,0x65,0x73,0x65,0xa3,0x93,0x11,0x75,0x6d,0xa2,
+0xb1,0x12,0x73,0x75,0x70,0xa2,0xca,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,
+0xca,1,0x69,0x30,0x73,0x13,0x61,0x76,0x61,0x68,0xa3,0xdd,0x15,0x63,0x6c,0x61,
+0x74,0x69,0x6e,0x23,0x14,0x6e,0x67,0x61,0x6c,0x69,0x41,0x16,0x61,0x69,0x6b,0x73,
+0x75,0x6b,0x69,0xa5,8,5,0x6f,0xc1,0x4c,0x6f,0xa2,0x55,0x75,0xa4,0x10,0x79,
+1,0x70,0x9c,0x72,0x14,0x69,0x6c,0x6c,0x69,0x63,0x32,1,0x65,0x4c,0x73,0x11,
+0x75,0x70,0xa2,0x61,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa2,0x61,0x12,0x61,
+0x72,0x79,0xa3,0x61,0x11,0x78,0x74,3,0x61,0xa3,0x9e,0x62,0xa3,0xa0,0x63,0xa5,
+9,0x65,0x13,0x6e,0x64,0x65,0x64,2,0x61,0xa3,0x9e,0x62,0xa3,0xa0,0x63,0xa5,
+9,0x1c,0x72,0x69,0x6f,0x74,0x73,0x79,0x6c,0x6c,0x61,0x62,0x61,0x72,0x79,0xa3,
+0x7b,3,0x6d,0x5a,0x6e,0xa2,0x95,0x70,0xa2,0xa0,0x75,0x17,0x6e,0x74,0x69,0x6e,
+0x67,0x72,0x6f,0x64,0xa2,0x9a,0x17,0x6e,0x75,0x6d,0x65,0x72,0x61,0x6c,0x73,0xa3,
+0x9a,2,0x62,0x3a,0x6d,0xa2,0x5f,0x70,0x15,0x61,0x74,0x6a,0x61,0x6d,0x6f,0xa3,
+0x41,0x14,0x69,0x6e,0x69,0x6e,0x67,2,0x64,0x46,0x68,0x9e,0x6d,0x1d,0x61,0x72,
+0x6b,0x73,0x66,0x6f,0x72,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0x77,0x1e,0x69,0x61,
+0x63,0x72,0x69,0x74,0x69,0x63,0x61,0x6c,0x6d,0x61,0x72,0x6b,0x73,0x2e,2,0x65,
+0x40,0x66,0xa6,0x2a,0x73,0x18,0x75,0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,
+0x83,0x16,0x78,0x74,0x65,0x6e,0x64,0x65,0x64,0xa3,0xe0,0x17,0x61,0x6c,0x66,0x6d,
+0x61,0x72,0x6b,0x73,0xa3,0x52,0x11,0x6f,0x6e,0x1f,0x69,0x6e,0x64,0x69,0x63,0x6e,
+0x75,0x6d,0x62,0x65,0x72,0x66,0x6f,0x72,0x6d,0x73,0xa3,0xb2,0x1b,0x74,0x72,0x6f,
+0x6c,0x70,0x69,0x63,0x74,0x75,0x72,0x65,0x73,0x83,0x12,0x74,0x69,0x63,0xa2,0x84,
+0x1b,0x65,0x70,0x61,0x63,0x74,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0xa3,0xdf,1,
+0x6e,0x3e,0x72,0x1b,0x72,0x65,0x6e,0x63,0x79,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,
+0x75,0x15,0x65,0x69,0x66,0x6f,0x72,0x6d,0xa2,0x98,0x16,0x6e,0x75,0x6d,0x62,0x65,
+0x72,0x73,0xa2,0x99,0x1d,0x61,0x6e,0x64,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,
+0x69,0x6f,0x6e,0xa3,0x99,0x61,0xa2,0xdb,0x68,0xa4,5,0x6a,0x10,0x6b,0xa2,0x47,
+4,0x63,0x86,0x65,0xa2,0x7d,0x72,0xa2,0x92,0x73,0xa2,0xa4,0x75,0x1f,0x6e,0x69,
+0x66,0x69,0x65,0x64,0x69,0x64,0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa2,0x47,
+0x18,0x65,0x78,0x74,0x65,0x6e,0x73,0x69,0x6f,0x6e,5,0x64,0x65,0x64,0xa3,0xd1,
+0x65,0xa5,0,0x66,0xa5,0x12,0x14,0x6f,0x6d,0x70,0x61,0x74,0xa2,0x45,1,0x66,
+0x96,0x69,1,0x62,0x44,0x64,0x17,0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa2,
+0x4f,0x12,0x73,0x75,0x70,0xa3,0x5f,0x14,0x69,0x6c,0x69,0x74,0x79,0xa2,0x45,1,
+0x66,0x54,0x69,0x18,0x64,0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa2,0x4f,0x19,
+0x73,0x75,0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x5f,0x13,0x6f,0x72,0x6d,
+0x73,0xa3,0x53,0x11,0x78,0x74,5,0x64,9,0x64,0xa3,0xd1,0x65,0xa5,0,0x66,
+0xa5,0x12,0x61,0xa3,0x46,0x62,0xa3,0x5e,0x63,0xa3,0xc5,0x19,0x61,0x64,0x69,0x63,
+0x61,0x6c,0x73,0x73,0x75,0x70,0x94,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x95,
+1,0x74,0x50,0x79,0x14,0x6d,0x62,0x6f,0x6c,0x73,0x9a,0x1d,0x61,0x6e,0x64,0x70,
+0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x9b,0x14,0x72,0x6f,0x6b,0x65,
+0x73,0xa3,0x82,2,0x6e,0x48,0x72,0x64,0x75,0x1d,0x63,0x61,0x73,0x69,0x61,0x6e,
+0x61,0x6c,0x62,0x61,0x6e,0x69,0x61,0x6e,0xa3,0xde,0x1d,0x61,0x64,0x69,0x61,0x6e,
+0x73,0x79,0x6c,0x6c,0x61,0x62,0x69,0x63,0x73,0x63,0x12,0x69,0x61,0x6e,0xa3,0xa8,
+1,0x61,0x6c,0x65,1,0x72,0x38,0x73,0x17,0x73,0x73,0x79,0x6d,0x62,0x6f,0x6c,
+0x73,0xa5,0x19,0x13,0x6f,0x6b,0x65,0x65,0x60,0x12,0x73,0x75,0x70,0xa2,0xff,0x16,
+0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0xff,1,0x6b,0x26,0x6d,0xa3,0xa4,0x11,
+0x6d,0x61,0xa3,0xd4,3,0x65,0x3e,0x69,0x7e,0x6f,0xa2,0x5d,0x75,0x15,0x70,0x6c,
+0x6f,0x79,0x61,0x6e,0xa3,0xe1,1,0x73,0x50,0x76,0x16,0x61,0x6e,0x61,0x67,0x61,
+0x72,0x69,0x3e,0x12,0x65,0x78,0x74,0xa2,0xb3,0x14,0x65,0x6e,0x64,0x65,0x64,0xa3,
+0xb3,0x13,0x65,0x72,0x65,0x74,0xa3,0x5a,1,0x61,0x30,0x6e,0x14,0x67,0x62,0x61,
+0x74,0x73,0x91,0x18,0x63,0x72,0x69,0x74,0x69,0x63,0x61,0x6c,0x73,0x2e,2,0x65,
+0x30,0x66,0x36,0x73,0x11,0x75,0x70,0xa3,0x83,0x11,0x78,0x74,0xa3,0xe0,0x18,0x6f,
+0x72,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0x77,1,0x67,0x3e,0x6d,0x12,0x69,0x6e,
+0x6f,0xa2,0xab,0x14,0x74,0x69,0x6c,0x65,0x73,0xa3,0xab,0x11,0x72,0x61,0xa5,0x1a,
+8,0x6d,0x5f,0x6d,0x3a,0x6e,0x48,0x73,0x7a,0x76,0xa2,0x4b,0x77,0x12,0x69,0x64,
+0x65,0x43,0x11,0x65,0x64,0x32,0x12,0x69,0x61,0x6c,0x33,2,0x61,0x40,0x62,0x37,
+0x6f,1,0x62,0x28,0x6e,0x10,0x65,0x21,0x13,0x72,0x65,0x61,0x6b,0x37,0x10,0x72,
+0x34,0x12,0x72,0x6f,0x77,0x35,2,0x6d,0x38,0x71,0x46,0x75,1,0x62,0x3d,0x70,
+0x3e,0x11,0x65,0x72,0x3f,1,0x61,0x24,0x6c,0x39,0x11,0x6c,0x6c,0x39,1,0x72,
+0x3b,0x75,0x12,0x61,0x72,0x65,0x3b,0x12,0x65,0x72,0x74,0x40,0x13,0x69,0x63,0x61,
+0x6c,0x41,0x63,0x58,0x65,0x92,0x66,0x96,0x69,1,0x6e,0x36,0x73,0x10,0x6f,0x30,
+0x14,0x6c,0x61,0x74,0x65,0x64,0x31,0x11,0x69,0x74,0x2e,0x12,0x69,0x61,0x6c,0x2f,
+2,0x61,0x36,0x69,0x48,0x6f,0x10,0x6d,0x24,0x12,0x70,0x61,0x74,0x25,0x10,0x6e,
+0x22,0x15,0x6f,0x6e,0x69,0x63,0x61,0x6c,0x23,0x13,0x72,0x63,0x6c,0x65,0x27,0x11,
+0x6e,0x63,0x27,2,0x69,0x3a,0x6f,0x44,0x72,0x10,0x61,0x2c,0x14,0x63,0x74,0x69,
+0x6f,0x6e,0x2d,0x10,0x6e,0x28,0x11,0x61,0x6c,0x29,0x11,0x6e,0x74,0x2b,4,0x61,
+0x3a,0x66,0x4c,0x68,0x5e,0x6e,0x70,0x77,0x2a,0x12,0x69,0x64,0x65,0x2b,0x22,0x17,
+0x6d,0x62,0x69,0x67,0x75,0x6f,0x75,0x73,0x23,0x26,0x17,0x75,0x6c,0x6c,0x77,0x69,
+0x64,0x74,0x68,0x27,0x24,0x17,0x61,0x6c,0x66,0x77,0x69,0x64,0x74,0x68,0x25,0x20,
+1,0x61,0x30,0x65,0x14,0x75,0x74,0x72,0x61,0x6c,0x21,0x28,0x13,0x72,0x72,0x6f,
+0x77,0x29,0xd,0x6e,0xc0,0xfb,0x73,0x6d,0x73,0x3a,0x74,0x98,0x75,0xa2,0x49,0x7a,
+2,0x6c,0x3b,0x70,0x3d,0x73,0x39,5,0x6f,0x28,0x6f,0x57,0x70,0x34,0x75,0x16,
+0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x45,0x11,0x61,0x63,1,0x65,0x32,0x69,0x15,
+0x6e,0x67,0x6d,0x61,0x72,0x6b,0x31,0x18,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,
+0x72,0x39,0x63,0x53,0x6b,0x55,0x6d,0x51,0x1d,0x69,0x74,0x6c,0x65,0x63,0x61,0x73,
+0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x27,1,0x6e,0x40,0x70,0x1c,0x70,0x65,0x72,
+0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x23,0x17,0x61,0x73,0x73,0x69,
+0x67,0x6e,0x65,0x64,0x21,0x6e,0x8a,0x6f,0xa2,0x47,0x70,8,0x66,0x14,0x66,0x5b,
+0x69,0x59,0x6f,0x4f,0x72,0x24,0x73,0x49,0x17,0x69,0x76,0x61,0x74,0x65,0x75,0x73,
+0x65,0x43,0x61,0x2c,0x63,0x4d,0x64,0x47,0x65,0x4b,0x1f,0x72,0x61,0x67,0x72,0x61,
+0x70,0x68,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x3d,2,0x64,0x33,0x6c,
+0x35,0x6f,0x36,0x1b,0x6e,0x73,0x70,0x61,0x63,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,
+0x2d,1,0x70,0x7c,0x74,0x12,0x68,0x65,0x72,3,0x6c,0x38,0x6e,0x42,0x70,0x4c,
+0x73,0x14,0x79,0x6d,0x62,0x6f,0x6c,0x57,0x14,0x65,0x74,0x74,0x65,0x72,0x2b,0x14,
+0x75,0x6d,0x62,0x65,0x72,0x37,0x19,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,
+0x6e,0x4f,0x1c,0x65,0x6e,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,
+0x49,0x66,0x9e,0x66,0x88,0x69,0xa2,0x4b,0x6c,0xa2,0x5c,0x6d,4,0x61,0x60,0x63,
+0x31,0x65,0x2f,0x6e,0x2d,0x6f,0x15,0x64,0x69,0x66,0x69,0x65,0x72,1,0x6c,0x30,
+0x73,0x14,0x79,0x6d,0x62,0x6f,0x6c,0x55,0x14,0x65,0x74,0x74,0x65,0x72,0x29,0x17,
+0x74,0x68,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x51,1,0x69,0x2e,0x6f,0x13,0x72,0x6d,
+0x61,0x74,0x41,0x1d,0x6e,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,
+0x6f,0x6e,0x5b,0x10,0x6e,0x1f,0x69,0x74,0x69,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,
+0x75,0x61,0x74,0x69,0x6f,0x6e,0x59,6,0x6d,0x18,0x6d,0x29,0x6f,0x28,0x74,0x27,
+0x75,0x23,0x2a,0x1c,0x77,0x65,0x72,0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65,
+0x72,0x25,0x65,0x28,0x69,0x3c,0x6c,0x25,0x19,0x74,0x74,0x65,0x72,0x6e,0x75,0x6d,
+0x62,0x65,0x72,0x35,0x1a,0x6e,0x65,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,
+0x3b,0x63,0x44,0x64,0xa2,0x60,0x65,0x1b,0x6e,0x63,0x6c,0x6f,0x73,0x69,0x6e,0x67,
+0x6d,0x61,0x72,0x6b,0x2f,6,0x6e,0x39,0x6e,0x46,0x6f,0x4e,0x73,0x45,0x75,0x1b,
+0x72,0x72,0x65,0x6e,0x63,0x79,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x53,0x20,0x12,0x74,
+0x72,0x6c,0x3f,0x42,0x10,0x6e,1,0x6e,0x2c,0x74,0x12,0x72,0x6f,0x6c,0x3f,0x1f,
+0x65,0x63,0x74,0x6f,0x72,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,
+0x4d,0x63,0x3f,0x66,0x41,0x6c,0x1d,0x6f,0x73,0x65,0x70,0x75,0x6e,0x63,0x74,0x75,
+0x61,0x74,0x69,0x6f,0x6e,0x4b,2,0x61,0x30,0x65,0x4a,0x69,0x12,0x67,0x69,0x74,
+0x33,0x1c,0x73,0x68,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x47,
+0x1a,0x63,0x69,0x6d,0x61,0x6c,0x6e,0x75,0x6d,0x62,0x65,0x72,0x33,0,0x12,0x6d,
+0xc2,0x3f,0x73,0xa1,0x73,0x4e,0x74,0xa2,0x56,0x77,0xa2,0x72,0x79,0xa2,0x73,0x7a,
+1,0x61,0x2c,0x68,0x12,0x61,0x69,0x6e,0x8b,0x11,0x69,0x6e,0x85,5,0x74,0x22,
+0x74,0x38,0x77,0x4c,0x79,0x16,0x72,0x69,0x61,0x63,0x77,0x61,0x77,0x6f,0x18,0x72,
+0x61,0x69,0x67,0x68,0x74,0x77,0x61,0x77,0xa3,0x55,0x15,0x61,0x73,0x68,0x6b,0x61,
+0x66,0x6d,0x61,0x2e,0x65,0x38,0x68,0x11,0x69,0x6e,0x6b,0x10,0x64,0x62,0x11,0x68,
+0x65,0x65,1,0x65,0x2e,0x6d,0x13,0x6b,0x61,0x74,0x68,0x69,0x10,0x6e,0x67,1,
+0x61,0x4e,0x65,1,0x68,0x28,0x74,0x10,0x68,0x77,0x16,0x6d,0x61,0x72,0x62,0x75,
+0x74,0x61,0x74,0x13,0x67,0x6f,0x61,0x6c,0x3d,1,0x68,0x71,0x77,0x73,0x11,0x61,
+0x77,0x79,1,0x65,0x32,0x75,0x11,0x64,0x68,0x80,0x11,0x68,0x65,0x83,0x10,0x68,
+0x7a,1,0x62,0x34,0x77,0x16,0x69,0x74,0x68,0x74,0x61,0x69,0x6c,0x7f,0x14,0x61,
+0x72,0x72,0x65,0x65,0x7d,0x6d,0x6c,0x6e,0xa4,0x6b,0x70,0xa4,0x88,0x71,0xa4,0x88,
+0x72,1,0x65,0x38,0x6f,0x18,0x68,0x69,0x6e,0x67,0x79,0x61,0x79,0x65,0x68,0x93,
+1,0x68,0x5f,0x76,0x16,0x65,0x72,0x73,0x65,0x64,0x70,0x65,0x61,2,0x61,0x2e,
+0x65,0xa4,0x3e,0x69,0x10,0x6d,0x53,1,0x6c,0xa2,0xe7,0x6e,0x16,0x69,0x63,0x68,
+0x61,0x65,0x61,0x6e,0,0x12,0x6e,0x76,0x73,0x51,0x73,0x3e,0x74,0x5c,0x77,0xa0,
+0x79,0xa2,0x42,0x7a,0x13,0x61,0x79,0x69,0x6e,0xa3,0x54,0x10,0x61,1,0x64,0x2e,
+0x6d,0x12,0x65,0x6b,0x68,0xa3,0x4c,0x11,0x68,0x65,0xa3,0x4b,3,0x61,0x38,0x65,
+0x3c,0x68,0x4a,0x77,0x13,0x65,0x6e,0x74,0x79,0xa3,0x51,0x10,0x77,0xa3,0x4d,1,
+0x6e,0xa3,0x4e,0x74,0x10,0x68,0xa3,0x4f,0x14,0x61,0x6d,0x65,0x64,0x68,0xa3,0x50,
+0x11,0x61,0x77,0xa3,0x52,0x12,0x6f,0x64,0x68,0xa3,0x53,0x6e,0x3a,0x6f,0x40,0x70,
+0x46,0x71,0x4a,0x72,0x12,0x65,0x73,0x68,0xa3,0x4a,0x11,0x75,0x6e,0xa3,0x46,0x11,
+0x6e,0x65,0xa3,0x47,0x10,0x65,0xa3,0x48,0x12,0x6f,0x70,0x68,0xa3,0x49,0x67,0x33,
+0x67,0x38,0x68,0x40,0x6b,0x5e,0x6c,0x66,0x6d,0x11,0x65,0x6d,0xa3,0x45,0x13,0x69,
+0x6d,0x65,0x6c,0xa1,1,0x65,0x32,0x75,0x14,0x6e,0x64,0x72,0x65,0x64,0xa3,0x42,
+0x11,0x74,0x68,0xa3,0x41,0x12,0x61,0x70,0x68,0xa3,0x43,0x14,0x61,0x6d,0x65,0x64,
+0x68,0xa3,0x44,0x61,0x34,0x62,0x4a,0x64,0x50,0x66,0x12,0x69,0x76,0x65,0x9f,1,
+0x6c,0x2a,0x79,0x11,0x69,0x6e,0x97,0x12,0x65,0x70,0x68,0x95,0x12,0x65,0x74,0x68,
+0x99,1,0x61,0x30,0x68,0x14,0x61,0x6d,0x65,0x64,0x68,0x9d,0x13,0x6c,0x65,0x74,
+0x68,0x9b,0x15,0x61,0x79,0x61,0x6c,0x61,0x6d,6,0x6e,0x2c,0x6e,0x34,0x72,0x5e,
+0x73,0x62,0x74,0x11,0x74,0x61,0xa3,0x63,2,0x67,0x2e,0x6e,0x32,0x79,0x10,0x61,
+0xa3,0x60,0x10,0x61,0xa3,0x5d,1,0x61,0xa3,0x5e,0x6e,0x10,0x61,0xa3,0x5f,0x10,
+0x61,0xa3,0x61,0x11,0x73,0x61,0xa3,0x62,0x62,0x3c,0x6a,0x42,0x6c,0x10,0x6c,1,
+0x61,0xa3,0x5b,0x6c,0x10,0x61,0xa3,0x5c,0x11,0x68,0x61,0xa3,0x59,0x10,0x61,0xa3,
+0x5a,0x11,0x65,0x6d,0x51,2,0x6f,0x2c,0x75,0x50,0x79,0x10,0x61,0x91,1,0x6a,
+0x28,0x6f,0x10,0x6e,0x55,0x1a,0x6f,0x69,0x6e,0x69,0x6e,0x67,0x67,0x72,0x6f,0x75,
+0x70,0x21,0x10,0x6e,0x57,0x10,0x65,0x59,0x10,0x61,1,0x66,0x5b,0x70,0x10,0x68,
+0x5d,0x66,0x9a,0x66,0x42,0x67,0x7a,0x68,0x8a,0x6b,0xa2,0x75,0x6c,0x11,0x61,0x6d,
+0x4c,0x12,0x61,0x64,0x68,0x4f,2,0x61,0x3e,0x65,0x4a,0x69,0x19,0x6e,0x61,0x6c,
+0x73,0x65,0x6d,0x6b,0x61,0x74,0x68,0x35,0x15,0x72,0x73,0x69,0x79,0x65,0x68,0x8f,
+0x86,0x10,0x68,0x33,0x10,0x61,1,0x66,0x37,0x6d,0x11,0x61,0x6c,0x39,1,0x61,
+0x40,0x65,0x3e,1,0x68,0x28,0x74,0x10,0x68,0x45,0x40,0x13,0x67,0x6f,0x61,0x6c,
+0x43,2,0x68,0x3b,0x6d,0x5c,0x6e,0x1a,0x69,0x66,0x69,0x72,0x6f,0x68,0x69,0x6e,
+0x67,0x79,0x61,1,0x6b,0x2a,0x70,0x10,0x61,0xa3,0x65,0x15,0x69,0x6e,0x6e,0x61,
+0x79,0x61,0xa3,0x64,0x1a,0x7a,0x61,0x6f,0x6e,0x68,0x65,0x68,0x67,0x6f,0x61,0x6c,
+0x3d,2,0x61,0x3a,0x68,0x44,0x6e,0x17,0x6f,0x74,0x74,0x65,0x64,0x68,0x65,0x68,
+0x4b,1,0x66,0x47,0x70,0x10,0x68,0x49,0x12,0x61,0x70,0x68,0x89,0x61,0x2e,0x62,
+0x8a,0x64,0xa2,0x51,0x65,0x31,2,0x66,0x3c,0x69,0x70,0x6c,1,0x61,0x28,0x65,
+0x10,0x66,0x27,0x11,0x70,0x68,0x25,0x14,0x72,0x69,0x63,0x61,0x6e,2,0x66,0x30,
+0x6e,0x36,0x71,0x11,0x61,0x66,0xa3,0x58,0x11,0x65,0x68,0xa3,0x56,0x12,0x6f,0x6f,
+0x6e,0xa3,0x57,0x10,0x6e,0x23,1,0x65,0x4a,0x75,0x10,0x72,0x1f,0x75,0x73,0x68,
+0x61,0x73,0x6b,0x69,0x79,0x65,0x68,0x62,0x61,0x72,0x72,0x65,0x65,0x8d,1,0x68,
+0x29,0x74,0x10,0x68,0x2b,0x11,0x61,0x6c,0x2c,0x16,0x61,0x74,0x68,0x72,0x69,0x73,
+0x68,0x2f,7,0x6e,0x2e,0x6e,0x2c,0x72,0x3e,0x74,0x56,0x75,0x21,0x18,0x6f,0x6e,
+0x6a,0x6f,0x69,0x6e,0x69,0x6e,0x67,0x21,0x28,0x1a,0x69,0x67,0x68,0x74,0x6a,0x6f,
+0x69,0x6e,0x69,0x6e,0x67,0x29,0x2a,0x19,0x72,0x61,0x6e,0x73,0x70,0x61,0x72,0x65,
+0x6e,0x74,0x2b,0x63,0x23,0x64,0x40,0x6a,0x56,0x6c,0x26,0x19,0x65,0x66,0x74,0x6a,
+0x6f,0x69,0x6e,0x69,0x6e,0x67,0x27,0x24,0x19,0x75,0x61,0x6c,0x6a,0x6f,0x69,0x6e,
+0x69,0x6e,0x67,0x25,0x19,0x6f,0x69,0x6e,0x63,0x61,0x75,0x73,0x69,0x6e,0x67,0x23,
+0,0x13,0x6e,0xc0,0xd0,0x73,0x49,0x73,0x48,0x75,0x78,0x77,0x84,0x78,0x9c,0x7a,
+0x10,0x77,0x58,1,0x6a,0x75,0x73,0x13,0x70,0x61,0x63,0x65,0x59,4,0x61,0x51,
+0x67,0x53,0x70,0x28,0x75,0x30,0x79,0x57,0x54,0x12,0x61,0x63,0x65,0x55,0x16,0x72,
+0x72,0x6f,0x67,0x61,0x74,0x65,0x53,0x15,0x6e,0x6b,0x6e,0x6f,0x77,0x6e,0x21,1,
+0x6a,0x5d,0x6f,0x17,0x72,0x64,0x6a,0x6f,0x69,0x6e,0x65,0x72,0x5d,0x10,0x78,0x21,
+0x6e,0x60,0x6f,0xa2,0x41,0x70,0xa2,0x50,0x71,0xa2,0x6e,0x72,1,0x65,0x24,0x69,
+0x6f,0x1e,0x67,0x69,0x6f,0x6e,0x61,0x6c,0x69,0x6e,0x64,0x69,0x63,0x61,0x74,0x6f,
+0x72,0x6f,4,0x65,0x3e,0x6c,0x5b,0x6f,0x46,0x73,0x45,0x75,0x46,0x14,0x6d,0x65,
+0x72,0x69,0x63,0x47,0x15,0x78,0x74,0x6c,0x69,0x6e,0x65,0x5b,0x17,0x6e,0x73,0x74,
+0x61,0x72,0x74,0x65,0x72,0x45,0x10,0x70,0x48,0x1c,0x65,0x6e,0x70,0x75,0x6e,0x63,
+0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x49,1,0x6f,0x3e,0x72,0x4c,0x1a,0x65,0x66,
+0x69,0x78,0x6e,0x75,0x6d,0x65,0x72,0x69,0x63,0x4d,0x4a,0x1b,0x73,0x74,0x66,0x69,
+0x78,0x6e,0x75,0x6d,0x65,0x72,0x69,0x63,0x4b,0x10,0x75,0x4e,0x16,0x6f,0x74,0x61,
+0x74,0x69,0x6f,0x6e,0x4f,0x68,0x7b,0x68,0x50,0x69,0x86,0x6a,0xa2,0x61,0x6c,0xa2,
+0x65,0x6d,0x1c,0x61,0x6e,0x64,0x61,0x74,0x6f,0x72,0x79,0x62,0x72,0x65,0x61,0x6b,
+0x2d,4,0x32,0x5f,0x33,0x61,0x65,0x34,0x6c,0x6d,0x79,0x3a,0x13,0x70,0x68,0x65,
+0x6e,0x3b,0x19,0x62,0x72,0x65,0x77,0x6c,0x65,0x74,0x74,0x65,0x72,0x6d,2,0x64,
+0x28,0x6e,0x3c,0x73,0x41,0x3c,0x18,0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x69,0x63,
+0x3d,0x3e,1,0x66,0x3e,0x73,0x11,0x65,0x70,1,0x61,0x22,0x65,0x14,0x72,0x61,
+0x62,0x6c,0x65,0x3f,0x18,0x69,0x78,0x6e,0x75,0x6d,0x65,0x72,0x69,0x63,0x41,2,
+0x6c,0x63,0x74,0x65,0x76,0x67,1,0x66,0x43,0x69,0x15,0x6e,0x65,0x66,0x65,0x65,
+0x64,0x43,0x61,0x40,0x62,0x70,0x63,0xa2,0x55,0x65,0xa2,0xdb,0x67,0x10,0x6c,0x38,
+0x11,0x75,0x65,0x39,2,0x69,0x23,0x6c,0x34,0x6d,0x16,0x62,0x69,0x67,0x75,0x6f,
+0x75,0x73,0x23,0x24,0x17,0x70,0x68,0x61,0x62,0x65,0x74,0x69,0x63,0x25,4,0x32,
+0x27,0x61,0x29,0x62,0x2b,0x6b,0x2d,0x72,0x12,0x65,0x61,0x6b,2,0x61,0x36,0x62,
+0x3e,0x73,0x15,0x79,0x6d,0x62,0x6f,0x6c,0x73,0x57,0x13,0x66,0x74,0x65,0x72,0x29,
+1,0x65,0x2a,0x6f,0x11,0x74,0x68,0x27,0x13,0x66,0x6f,0x72,0x65,0x2b,7,0x6d,
+0x51,0x6d,0x33,0x6f,0x28,0x70,0x69,0x72,0x35,1,0x6d,0x76,0x6e,1,0x64,0x3c,
+0x74,0x1a,0x69,0x6e,0x67,0x65,0x6e,0x74,0x62,0x72,0x65,0x61,0x6b,0x2f,0x15,0x69,
+0x74,0x69,0x6f,0x6e,0x61,0x1f,0x6c,0x6a,0x61,0x70,0x61,0x6e,0x65,0x73,0x65,0x73,
+0x74,0x61,0x72,0x74,0x65,0x72,0x6b,1,0x62,0x3a,0x70,0x19,0x6c,0x65,0x78,0x63,
+0x6f,0x6e,0x74,0x65,0x78,0x74,0x51,0x18,0x69,0x6e,0x69,0x6e,0x67,0x6d,0x61,0x72,
+0x6b,0x33,0x61,0x6a,0x62,0x2f,0x6a,0x6b,0x6c,0x30,0x13,0x6f,0x73,0x65,0x70,1,
+0x61,0x38,0x75,0x18,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x31,0x18,0x72,
+0x65,0x6e,0x74,0x68,0x65,0x73,0x69,0x73,0x69,0x1b,0x72,0x72,0x69,0x61,0x67,0x65,
+0x72,0x65,0x74,0x75,0x72,0x6e,0x35,2,0x62,0x3e,0x6d,0x46,0x78,0x36,0x18,0x63,
+0x6c,0x61,0x6d,0x61,0x74,0x69,0x6f,0x6e,0x37,0x70,0x12,0x61,0x73,0x65,0x71,0x72,
+0x16,0x6f,0x64,0x69,0x66,0x69,0x65,0x72,0x73,1,0x64,0x42,0x6e,1,0x6f,0x32,
+0x75,0x26,0x14,0x6d,0x65,0x72,0x69,0x63,0x27,0x11,0x6e,0x65,0x21,1,0x65,0x2e,
+0x69,0x24,0x12,0x67,0x69,0x74,0x25,0x22,0x14,0x63,0x69,0x6d,0x61,0x6c,0x23,0,
+0x18,0x6e,0xc4,0x1e,0x74,0xc1,0x61,0x77,0x8a,0x77,0xa2,0x4c,0x78,0xa2,0x70,0x79,
+0xa2,0x7a,0x7a,6,0x73,0x1e,0x73,0x34,0x78,0x42,0x79,0x48,0x7a,0x11,0x7a,0x7a,
+0xa3,0x67,0x10,0x79,1,0x65,0xa3,0xae,0x6d,0xa3,0x81,0x11,0x78,0x78,0xa3,0x66,
+0x11,0x79,0x79,0x21,0x61,0x30,0x69,0x58,0x6d,0x11,0x74,0x68,0xa3,0x80,0x10,0x6e,
+1,0x61,0x26,0x62,0xa3,0xb1,0x1a,0x62,0x61,0x7a,0x61,0x72,0x73,0x71,0x75,0x61,
+0x72,0x65,0xa3,0xb1,0x11,0x6e,0x68,0x23,2,0x61,0x30,0x63,0x5a,0x6f,0x11,0x6c,
+0x65,0xa3,0x9b,1,0x6e,0x3c,0x72,0x10,0x61,0xa2,0x92,0x15,0x6e,0x67,0x63,0x69,
+0x74,0x69,0xa3,0x92,0x12,0x63,0x68,0x6f,0xa3,0xbc,0x11,0x68,0x6f,0xa3,0xbc,1,
+0x70,0x2c,0x73,0x11,0x75,0x78,0xa3,0x65,0x11,0x65,0x6f,0x9b,0x10,0x69,0x72,0x11,
+0x69,0x69,0x73,0x74,0x4a,0x75,0xa2,0xba,0x76,1,0x61,0x2c,0x69,0x11,0x73,0x70,
+0xa3,0x64,0x10,0x69,0xa2,0x63,0x10,0x69,0xa3,0x63,5,0x67,0x36,0x67,0x68,0x68,
+0x6c,0x69,2,0x62,0x3a,0x66,0x4a,0x72,0x10,0x68,0xa2,0x9e,0x12,0x75,0x74,0x61,
+0xa3,0x9e,1,0x65,0x24,0x74,0x6f,0x12,0x74,0x61,0x6e,0x6f,0x14,0x69,0x6e,0x61,
+0x67,0x68,0x99,0x11,0x6c,0x67,0x75,0x10,0x61,1,0x61,0x24,0x69,0x6d,0x6a,0x11,
+0x6e,0x61,0x6b,0x61,0x30,0x65,0xa2,0x5b,0x66,0x11,0x6e,0x67,0x99,6,0x6c,0x21,
+0x6c,0x32,0x6d,0x38,0x6e,0x44,0x76,0x10,0x74,0xa3,0x7f,1,0x65,0x89,0x75,0x97,
+1,0x69,0x24,0x6c,0x67,0x10,0x6c,0x67,0x10,0x67,0xa2,0x9a,0x11,0x75,0x74,0xa3,
+0x9a,0x67,0x36,0x69,0x52,0x6b,0x10,0x72,0xa2,0x99,0x10,0x69,0xa3,0x99,1,0x61,
+0x30,0x62,0x7a,0x13,0x61,0x6e,0x77,0x61,0x7b,0x12,0x6c,0x6f,0x67,0x75,2,0x6c,
+0x32,0x74,0x34,0x76,0x12,0x69,0x65,0x74,0xa3,0x7f,0x10,0x65,0x89,0x12,0x68,0x61,
+0x6d,0xa3,0x6a,1,0x6c,0x2a,0x6e,0x10,0x67,0xa3,0x62,0x10,0x75,0x68,0x11,0x67,
+0x75,0x69,1,0x67,0x32,0x6e,0x14,0x6b,0x6e,0x6f,0x77,0x6e,0xa3,0x67,0x11,0x61,
+0x72,0x8a,0x13,0x69,0x74,0x69,0x63,0x8b,0x71,0xc1,0x13,0x71,0xa2,0xde,0x72,0xa2,
+0xe3,0x73,6,0x69,0x8a,0x69,0x72,0x6f,0xa2,0x4c,0x75,0xa2,0x75,0x79,1,0x6c,
+0x46,0x72,4,0x63,0x65,0x65,0xa3,0x5f,0x69,0x2c,0x6a,0xa3,0x60,0x6e,0xa3,0x61,
+0x11,0x61,0x63,0x65,0x10,0x6f,0x94,0x16,0x74,0x69,0x6e,0x61,0x67,0x72,0x69,0x95,
+2,0x64,0x3c,0x67,0x4c,0x6e,1,0x64,0xa3,0x91,0x68,0x62,0x12,0x61,0x6c,0x61,
+0x63,0x10,0x64,0xa2,0xa6,0x12,0x68,0x61,0x6d,0xa3,0xa6,0x17,0x6e,0x77,0x72,0x69,
+0x74,0x69,0x6e,0x67,0xa3,0x70,2,0x67,0x3a,0x72,0x52,0x79,0x10,0x6f,0xa2,0xb0,
+0x12,0x6d,0x62,0x6f,0xa3,0xb0,1,0x64,0x26,0x6f,0xa3,0xb8,0xa2,0xb7,0x12,0x69,
+0x61,0x6e,0xa3,0xb7,0x10,0x61,0xa2,0x98,0x16,0x73,0x6f,0x6d,0x70,0x65,0x6e,0x67,
+0xa3,0x98,0x11,0x6e,0x64,0xa2,0x71,0x14,0x61,0x6e,0x65,0x73,0x65,0xa3,0x71,0x61,
+0x5c,0x67,0xa2,0x43,0x68,1,0x61,0x2a,0x72,0x10,0x64,0xa3,0x97,2,0x72,0x28,
+0x76,0x30,0x77,0x87,0x12,0x61,0x64,0x61,0xa3,0x97,0x12,0x69,0x61,0x6e,0x87,2,
+0x6d,0x40,0x72,0x58,0x75,0x10,0x72,0xa2,0x6f,0x15,0x61,0x73,0x68,0x74,0x72,0x61,
+0xa3,0x6f,1,0x61,0x26,0x72,0xa3,0x7e,0x14,0x72,0x69,0x74,0x61,0x6e,0xa3,0x7e,
+1,0x61,0xa3,0x5e,0x62,0xa3,0x85,0x11,0x6e,0x77,0xa3,0x70,0x11,0x61,0x61,1,
+0x63,0x2f,0x69,0x23,3,0x65,0x3e,0x6a,0x48,0x6f,0x4e,0x75,0x10,0x6e,1,0x69,
+0x24,0x72,0x61,0x10,0x63,0x61,0x13,0x6a,0x61,0x6e,0x67,0xa3,0x6e,0x11,0x6e,0x67,
+0xa3,0x6e,1,0x68,0x2a,0x72,0x10,0x6f,0xa3,0x5d,0x10,0x67,0xa3,0xb6,0x6e,0xa2,
+0x83,0x6f,0xa2,0xf2,0x70,5,0x6c,0x1e,0x6c,0x44,0x72,0x4a,0x73,0x1b,0x61,0x6c,
+0x74,0x65,0x72,0x70,0x61,0x68,0x6c,0x61,0x76,0x69,0xa3,0x7b,0x11,0x72,0x64,0xa3,
+0x5c,0x11,0x74,0x69,0xa3,0x7d,0x61,0x7c,0x65,0xa2,0x54,0x68,3,0x61,0x3e,0x6c,
+0x4e,0x6e,0x5e,0x6f,0x16,0x65,0x6e,0x69,0x63,0x69,0x61,0x6e,0xa3,0x5b,0x10,0x67,
+0xa2,0x5a,0x12,0x73,0x70,0x61,0xa3,0x5a,2,0x69,0xa3,0x7a,0x70,0xa3,0x7b,0x76,
+0xa3,0x7c,0x10,0x78,0xa3,0x5b,2,0x68,0x3e,0x6c,0x50,0x75,0x10,0x63,0xa2,0xa5,
+0x14,0x69,0x6e,0x68,0x61,0x75,0xa3,0xa5,0x17,0x61,0x77,0x68,0x68,0x6d,0x6f,0x6e,
+0x67,0xa3,0x4b,0x10,0x6d,0xa2,0x90,0x14,0x79,0x72,0x65,0x6e,0x65,0xa3,0x90,0x11,
+0x72,0x6d,0xa3,0x59,6,0x6b,0x36,0x6b,0x56,0x73,0x6e,0x75,0x74,0x79,0x11,0x69,
+0x61,0x1f,0x6b,0x65,0x6e,0x67,0x70,0x75,0x61,0x63,0x68,0x75,0x65,0x68,0x6d,0x6f,
+0x6e,0x67,0xa3,0xba,1,0x67,0x2e,0x6f,0xa2,0x57,0x10,0x6f,0xa3,0x57,0x10,0x62,
+0xa3,0x84,0x11,0x68,0x75,0xa3,0x96,0x12,0x73,0x68,0x75,0xa3,0x96,0x61,0x42,0x62,
+0x80,0x65,0x10,0x77,1,0x61,0xa3,0xaa,0x74,0x14,0x61,0x69,0x6c,0x75,0x65,0x97,
+2,0x62,0x2e,0x6e,0x3c,0x72,0x10,0x62,0xa3,0x8e,0x15,0x61,0x74,0x61,0x65,0x61,
+0x6e,0xa3,0x8f,0x10,0x64,0xa2,0xbb,0x16,0x69,0x6e,0x61,0x67,0x61,0x72,0x69,0xa3,
+0xbb,0x11,0x61,0x74,0xa3,0x8f,3,0x67,0x5a,0x6c,0x6c,0x72,0xa2,0x93,0x73,2,
+0x61,0x36,0x67,0x3c,0x6d,0x10,0x61,0x84,0x12,0x6e,0x79,0x61,0x85,0x11,0x67,0x65,
+0xa3,0xab,0x10,0x65,0xa3,0xab,1,0x61,0x2a,0x68,0x11,0x61,0x6d,0x5b,0x10,0x6d,
+0x5b,1,0x63,0xa2,0x60,0x64,5,0x70,0x37,0x70,0x36,0x73,0x54,0x74,0x14,0x75,
+0x72,0x6b,0x69,0x63,0xa3,0x58,0x11,0x65,0x72,1,0x6d,0x2c,0x73,0x12,0x69,0x61,
+0x6e,0x9b,0x11,0x69,0x63,0xa3,0x59,0x10,0x6f,1,0x67,0x3a,0x75,0x18,0x74,0x68,
+0x61,0x72,0x61,0x62,0x69,0x61,0x6e,0xa3,0x85,0x13,0x64,0x69,0x61,0x6e,0xa3,0xb8,
+0x68,0x42,0x69,0x54,0x6e,0x1a,0x6f,0x72,0x74,0x68,0x61,0x72,0x61,0x62,0x69,0x61,
+0x6e,0xa3,0x8e,0x17,0x75,0x6e,0x67,0x61,0x72,0x69,0x61,0x6e,0xa3,0x4c,0x14,0x74,
+0x61,0x6c,0x69,0x63,0x5d,1,0x68,0x26,0x6b,0xa3,0x6d,0x12,0x69,0x6b,0x69,0xa3,
+0x6d,2,0x69,0x2c,0x6b,0x30,0x79,0x10,0x61,0x5f,0x11,0x79,0x61,0x5f,0x10,0x68,
+0xa3,0x58,0x68,0xc2,0xf3,0x6b,0xc2,0xa,0x6b,0xa4,0x17,0x6c,0xa4,0x98,0x6d,8,
+0x6f,0x46,0x6f,0x48,0x72,0x74,0x74,0x80,0x75,0x86,0x79,1,0x61,0x28,0x6d,0x10,
+0x72,0x59,0x13,0x6e,0x6d,0x61,0x72,0x59,2,0x64,0x2e,0x6e,0x32,0x6f,0x10,0x6e,
+0xa3,0x72,0x10,0x69,0xa3,0xa3,0x10,0x67,0x56,0x14,0x6f,0x6c,0x69,0x61,0x6e,0x57,
+0x10,0x6f,0xa2,0x95,0x10,0x6f,0xa3,0x95,0x11,0x65,0x69,0xa3,0x73,0x11,0x6c,0x74,
+0xa2,0xa4,0x12,0x61,0x6e,0x69,0xa3,0xa4,0x61,0x36,0x65,0xa2,0x67,0x69,0xa2,0xbd,
+0x6c,0x11,0x79,0x6d,0x55,6,0x6e,0x38,0x6e,0x32,0x72,0x5c,0x73,0x6c,0x79,0x10,
+0x61,0xa3,0x55,1,0x64,0x38,0x69,0xa2,0x79,0x15,0x63,0x68,0x61,0x65,0x61,0x6e,
+0xa3,0x79,0xa2,0x54,0x12,0x61,0x69,0x63,0xa3,0x54,0x10,0x63,0xa2,0xa9,0x12,0x68,
+0x65,0x6e,0xa3,0xa9,0x18,0x61,0x72,0x61,0x6d,0x67,0x6f,0x6e,0x64,0x69,0xa3,0xaf,
+0x68,0x36,0x6b,0x4c,0x6c,0x15,0x61,0x79,0x61,0x6c,0x61,0x6d,0x55,1,0x61,0x26,
+0x6a,0xa3,0xa0,0x13,0x6a,0x61,0x6e,0x69,0xa3,0xa0,0x10,0x61,0xa2,0xb4,0x12,0x73,
+0x61,0x72,0xa3,0xb4,3,0x64,0x78,0x65,0x94,0x6e,0xa2,0x42,0x72,1,0x63,0xa3,
+0x8d,0x6f,0xa2,0x56,0x13,0x69,0x74,0x69,0x63,1,0x63,0x3c,0x68,0x19,0x69,0x65,
+0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0x56,0x15,0x75,0x72,0x73,0x69,0x76,
+0x65,0xa3,0x8d,1,0x65,0x26,0x66,0xa3,0xb5,0x16,0x66,0x61,0x69,0x64,0x72,0x69,
+0x6e,0xa3,0xb5,0x17,0x74,0x65,0x69,0x6d,0x61,0x79,0x65,0x6b,0xa3,0x73,0x10,0x64,
+0xa2,0x8c,0x17,0x65,0x6b,0x69,0x6b,0x61,0x6b,0x75,0x69,0xa3,0x8c,0x11,0x61,0x6f,
+0xa3,0x5c,5,0x6f,0x14,0x6f,0x30,0x70,0x36,0x74,0x11,0x68,0x69,0xa3,0x78,0x11,
+0x72,0x65,0xa3,0x77,0x11,0x65,0x6c,0xa3,0x8a,0x61,0x2e,0x68,0x98,0x6e,0x11,0x64,
+0x61,0x4b,4,0x69,0x3c,0x6c,0x44,0x6e,0x48,0x74,0x56,0x79,0x13,0x61,0x68,0x6c,
+0x69,0xa3,0x4f,0x12,0x74,0x68,0x69,0xa3,0x78,0x10,0x69,0xa3,0x4f,1,0x61,0x4d,
+0x6e,0x12,0x61,0x64,0x61,0x4b,0x14,0x61,0x6b,0x61,0x6e,0x61,0x4c,0x19,0x6f,0x72,
+0x68,0x69,0x72,0x61,0x67,0x61,0x6e,0x61,0x8d,3,0x61,0x3c,0x6d,0x4e,0x6f,0x5a,
+0x75,0x15,0x64,0x61,0x77,0x61,0x64,0x69,0xa3,0x91,0x10,0x72,0x92,0x15,0x6f,0x73,
+0x68,0x74,0x68,0x69,0x93,1,0x65,0x24,0x72,0x4f,0x10,0x72,0x4f,0x10,0x6a,0xa2,
+0x9d,0x11,0x6b,0x69,0xa3,0x9d,4,0x61,0x5c,0x65,0x90,0x69,0xa0,0x6f,0xa2,0x5d,
+0x79,1,0x63,0x34,0x64,0x10,0x69,0xa2,0x6c,0x11,0x61,0x6e,0xa3,0x6c,0x10,0x69,
+0xa2,0x6b,0x11,0x61,0x6e,0xa3,0x6b,2,0x6e,0x42,0x6f,0x46,0x74,3,0x66,0xa3,
+0x50,0x67,0xa3,0x51,0x69,0x24,0x6e,0x53,0x10,0x6e,0x53,0x10,0x61,0xa3,0x6a,0x50,
+0x10,0x6f,0x51,0x11,0x70,0x63,0xa2,0x52,0x11,0x68,0x61,0xa3,0x52,2,0x6d,0x2e,
+0x6e,0x36,0x73,0x10,0x75,0xa3,0x83,0x10,0x62,0x80,0x10,0x75,0x81,2,0x61,0xa3,
+0x53,0x62,0x83,0x65,0x11,0x61,0x72,1,0x61,0xa3,0x53,0x62,0x83,0x11,0x6d,0x61,
+0xa3,0x8b,0x68,0x6e,0x69,0xa2,0x95,0x6a,2,0x61,0x30,0x70,0x52,0x75,0x11,0x72,
+0x63,0xa3,0x94,1,0x6d,0x38,0x76,0x10,0x61,0xa2,0x4e,0x13,0x6e,0x65,0x73,0x65,
+0xa3,0x4e,0x10,0x6f,0xa3,0xad,0x11,0x61,0x6e,0xa3,0x69,6,0x6c,0x1e,0x6c,0x34,
+0x6d,0x3a,0x72,0x48,0x75,0x11,0x6e,0x67,0xa3,0x4c,0x11,0x75,0x77,0xa3,0x9c,0x10,
+0x6e,1,0x67,0xa3,0x4b,0x70,0xa3,0xba,0x11,0x6b,0x74,0x8d,0x61,0x3c,0x65,0xa2,
+0x43,0x69,0x11,0x72,0x61,0x48,0x13,0x67,0x61,0x6e,0x61,0x49,1,0x6e,0x34,0x74,
+0x10,0x72,0xa2,0xa2,0x11,0x61,0x6e,0xa3,0xa2,0x42,6,0x6f,0xe,0x6f,0x77,0x73,
+0xa3,0x49,0x74,0xa3,0x4a,0x75,0x12,0x6e,0x6f,0x6f,0x77,0x62,0xa3,0xac,0x67,0x3e,
+0x69,0x42,0x19,0x66,0x69,0x72,0x6f,0x68,0x69,0x6e,0x67,0x79,0x61,0xa3,0xb6,0x44,
+0x11,0x75,0x6c,0x45,0x11,0x62,0x72,0x46,0x11,0x65,0x77,0x47,2,0x6d,0x2e,0x6e,
+0x4a,0x74,0x11,0x61,0x6c,0x5d,0x1c,0x70,0x65,0x72,0x69,0x61,0x6c,0x61,0x72,0x61,
+0x6d,0x61,0x69,0x63,0xa3,0x74,2,0x64,0x66,0x68,0x6a,0x73,0x1b,0x63,0x72,0x69,
+0x70,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x70,0x61,1,0x68,0x32,0x72,0x14,0x74,0x68,
+0x69,0x61,0x6e,0xa3,0x7d,0x13,0x6c,0x61,0x76,0x69,0xa3,0x7a,0x10,0x73,0xa3,0x4d,
+0x15,0x65,0x72,0x69,0x74,0x65,0x64,0x23,0x64,0xc0,0xf9,0x64,0xa2,0x7a,0x65,0xa2,
+0xad,0x67,4,0x65,0x82,0x6c,0x9a,0x6f,0xa2,0x46,0x72,0xa2,0x55,0x75,2,0x6a,
+0x3c,0x6e,0x4e,0x72,1,0x6d,0x24,0x75,0x41,0x13,0x75,0x6b,0x68,0x69,0x41,1,
+0x61,0x24,0x72,0x3f,0x13,0x72,0x61,0x74,0x69,0x3f,0x18,0x6a,0x61,0x6c,0x61,0x67,
+0x6f,0x6e,0x64,0x69,0xa3,0xb3,0x10,0x6f,1,0x6b,0xa3,0x48,0x72,0x38,0x13,0x67,
+0x69,0x61,0x6e,0x39,0x11,0x61,0x67,0x90,0x15,0x6f,0x6c,0x69,0x74,0x69,0x63,0x91,
+1,0x6e,0x30,0x74,0x10,0x68,0x3a,0x11,0x69,0x63,0x3b,1,0x67,0xa3,0xb3,0x6d,
+0xa3,0xaf,1,0x61,0x32,0x65,1,0x65,0x24,0x6b,0x3d,0x10,0x6b,0x3d,0x10,0x6e,
+0xa2,0x89,0x12,0x74,0x68,0x61,0xa3,0x89,3,0x65,0x42,0x6f,0x68,0x73,0x76,0x75,
+0x11,0x70,0x6c,0xa2,0x87,0x13,0x6f,0x79,0x61,0x6e,0xa3,0x87,1,0x73,0x38,0x76,
+0x10,0x61,0x34,0x15,0x6e,0x61,0x67,0x61,0x72,0x69,0x35,0x13,0x65,0x72,0x65,0x74,
+0x33,0x11,0x67,0x72,0xa2,0xb2,0x10,0x61,0xa3,0xb2,0x11,0x72,0x74,0x33,2,0x67,
+0x3a,0x6c,0x72,0x74,0x11,0x68,0x69,0x36,0x13,0x6f,0x70,0x69,0x63,0x37,0x10,0x79,
+2,0x64,0xa3,0x45,0x68,0xa3,0x46,0x70,0xa2,0x47,0x1e,0x74,0x69,0x61,0x6e,0x68,
+0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0x47,1,0x62,0x36,0x79,
+0x10,0x6d,0xa2,0xb9,0x12,0x61,0x69,0x63,0xa3,0xb9,0x10,0x61,0xa2,0x88,0x12,0x73,
+0x61,0x6e,0xa3,0x88,0x61,0xa2,0xa2,0x62,0xa4,7,0x63,6,0x6f,0x3d,0x6f,0x5a,
+0x70,0x76,0x75,0x7a,0x79,1,0x70,0x3e,0x72,2,0x69,0x2a,0x6c,0x31,0x73,0xa3,
+0x44,0x13,0x6c,0x6c,0x69,0x63,0x31,0x13,0x72,0x69,0x6f,0x74,0x7f,1,0x6d,0x30,
+0x70,0x10,0x74,0x2e,0x11,0x69,0x63,0x2f,0x12,0x6d,0x6f,0x6e,0x21,0x11,0x72,0x74,
+0x7f,0x16,0x6e,0x65,0x69,0x66,0x6f,0x72,0x6d,0xa3,0x65,0x61,0x32,0x68,0xa2,0x41,
+0x69,0x11,0x72,0x74,0xa3,0x43,3,0x6b,0x4c,0x6e,0x50,0x72,0x76,0x75,0x1d,0x63,
+0x61,0x73,0x69,0x61,0x6e,0x61,0x6c,0x62,0x61,0x6e,0x69,0x61,0x6e,0xa3,0x9f,0x10,
+0x6d,0xa3,0x76,1,0x61,0x24,0x73,0x71,0x1d,0x64,0x69,0x61,0x6e,0x61,0x62,0x6f,
+0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x71,0x10,0x69,0xa2,0x68,0x11,0x61,0x6e,0xa3,
+0x68,1,0x61,0x34,0x65,0x10,0x72,0x2c,0x13,0x6f,0x6b,0x65,0x65,0x2d,1,0x6b,
+0x26,0x6d,0xa3,0x42,0x11,0x6d,0x61,0xa3,0x76,6,0x68,0x4a,0x68,0x48,0x6e,0x4e,
+0x72,0x76,0x76,1,0x65,0x2a,0x73,0x10,0x74,0xa3,0x75,0x13,0x73,0x74,0x61,0x6e,
+0xa3,0x75,0x11,0x6f,0x6d,0xa3,0xa1,0x11,0x61,0x74,0x1f,0x6f,0x6c,0x69,0x61,0x6e,
+0x68,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0x9c,1,0x61,0x3e,
+0x6d,2,0x65,0x2a,0x69,0xa3,0x74,0x6e,0x27,0x13,0x6e,0x69,0x61,0x6e,0x27,0x10,
+0x62,0x24,0x11,0x69,0x63,0x25,0x64,0x30,0x66,0x44,0x67,0x11,0x68,0x62,0xa3,0x9f,
+0x10,0x6c,1,0x61,0x26,0x6d,0xa3,0xa7,0x10,0x6d,0xa3,0xa7,0x11,0x61,0x6b,0xa3,
+0x93,6,0x6c,0x3c,0x6c,0x52,0x6f,0x56,0x72,0x66,0x75,1,0x67,0x30,0x68,1,
+0x64,0x79,0x69,0x10,0x64,0x79,0x10,0x69,0x8e,0x13,0x6e,0x65,0x73,0x65,0x8f,0x11,
+0x69,0x73,0xa1,0x11,0x70,0x6f,0x2a,0x13,0x6d,0x6f,0x66,0x6f,0x2b,0x10,0x61,1,
+0x68,0x2e,0x69,0x7c,0x12,0x6c,0x6c,0x65,0x7d,0xa2,0x41,0x11,0x6d,0x69,0xa3,0x41,
+0x61,0x48,0x65,0x9c,0x68,1,0x61,0x2a,0x6b,0x10,0x73,0xa3,0xa8,0x15,0x69,0x6b,
+0x73,0x75,0x6b,0x69,0xa3,0xa8,3,0x6c,0x3a,0x6d,0x48,0x73,0x54,0x74,1,0x61,
+0x24,0x6b,0x9f,0x10,0x6b,0x9f,0x10,0x69,0x9c,0x13,0x6e,0x65,0x73,0x65,0x9d,0x10,
+0x75,0xa2,0x82,0x10,0x6d,0xa3,0x82,0x10,0x73,0xa2,0x86,0x13,0x61,0x76,0x61,0x68,
+0xa3,0x86,0x11,0x6e,0x67,0x28,0x12,0x61,0x6c,0x69,0x29,3,0x6c,0x42,0x6e,0x90,
+0x74,0xa2,0x46,0x76,0x24,0x17,0x6f,0x77,0x65,0x6c,0x6a,0x61,0x6d,0x6f,0x25,0x22,
+1,0x65,0x54,0x76,0x28,1,0x73,0x38,0x74,0x2a,0x17,0x73,0x79,0x6c,0x6c,0x61,
+0x62,0x6c,0x65,0x2b,0x16,0x79,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x29,0x18,0x61,0x64,
+0x69,0x6e,0x67,0x6a,0x61,0x6d,0x6f,0x23,1,0x61,0x21,0x6f,0x1a,0x74,0x61,0x70,
+0x70,0x6c,0x69,0x63,0x61,0x62,0x6c,0x65,0x21,0x26,0x1a,0x72,0x61,0x69,0x6c,0x69,
+0x6e,0x67,0x6a,0x61,0x6d,0x6f,0x27,1,0x6e,0x2c,0x79,0x22,0x11,0x65,0x73,0x23,
+0x20,0x10,0x6f,0x21,1,0x6e,0x2c,0x79,0x22,0x11,0x65,0x73,0x23,0x20,0x10,0x6f,
+0x21,2,0x6d,0x30,0x6e,0x3a,0x79,0x22,0x11,0x65,0x73,0x23,0x24,0x13,0x61,0x79,
+0x62,0x65,0x25,0x20,0x10,0x6f,0x21,2,0x6d,0x30,0x6e,0x3a,0x79,0x22,0x11,0x65,
+0x73,0x23,0x24,0x13,0x61,0x79,0x62,0x65,0x25,0x20,0x10,0x6f,0x21,0xb,0x72,0x39,
+0x76,0xc,0x76,0x33,0x78,0x2a,0x7a,0x11,0x77,0x6a,0x43,0x10,0x78,0x21,0x72,0x28,
+0x73,0x50,0x74,0x31,1,0x65,0x24,0x69,0x39,0x1e,0x67,0x69,0x6f,0x6e,0x61,0x6c,
+0x69,0x6e,0x64,0x69,0x63,0x61,0x74,0x6f,0x72,0x39,1,0x6d,0x35,0x70,0x18,0x61,
+0x63,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0x35,0x6c,0x1f,0x6c,0x3c,0x6f,0x4a,0x70,
+1,0x70,0x37,0x72,0x14,0x65,0x70,0x65,0x6e,0x64,0x37,0x28,1,0x66,0x2b,0x76,
+0x2c,0x10,0x74,0x2f,0x13,0x74,0x68,0x65,0x72,0x21,0x63,0x4c,0x65,0x64,0x67,1,
+0x61,0x3a,0x6c,0x19,0x75,0x65,0x61,0x66,0x74,0x65,0x72,0x7a,0x77,0x6a,0x41,0x10,
+0x7a,0x41,2,0x6e,0x23,0x6f,0x24,0x72,0x25,0x14,0x6e,0x74,0x72,0x6f,0x6c,0x23,
+2,0x62,0x34,0x6d,0x4e,0x78,0x26,0x13,0x74,0x65,0x6e,0x64,0x27,0x3a,1,0x61,
+0x24,0x67,0x3d,0x11,0x73,0x65,0x3a,0x12,0x67,0x61,0x7a,0x3d,0x3e,0x16,0x6f,0x64,
+0x69,0x66,0x69,0x65,0x72,0x3f,9,0x6e,0x4a,0x6e,0x34,0x6f,0x44,0x73,0x60,0x75,
+0x94,0x78,0x10,0x78,0x21,0x10,0x75,0x2a,0x14,0x6d,0x65,0x72,0x69,0x63,0x2b,1,
+0x6c,0x2c,0x74,0x12,0x68,0x65,0x72,0x21,0x14,0x65,0x74,0x74,0x65,0x72,0x2d,3,
+0x63,0x36,0x65,0x46,0x70,0x31,0x74,0x32,0x12,0x65,0x72,0x6d,0x33,0x3c,0x16,0x6f,
+0x6e,0x74,0x69,0x6e,0x75,0x65,0x3d,0x2e,0x10,0x70,0x2f,0x10,0x70,0x34,0x12,0x70,
+0x65,0x72,0x35,0x61,0x46,0x63,0x52,0x65,0x64,0x66,0x72,0x6c,2,0x65,0x2d,0x66,
+0x3b,0x6f,0x28,0x12,0x77,0x65,0x72,0x29,0x10,0x74,0x22,0x12,0x65,0x72,0x6d,0x23,
+1,0x6c,0x24,0x72,0x37,0x24,0x12,0x6f,0x73,0x65,0x25,0x10,0x78,0x38,0x13,0x74,
+0x65,0x6e,0x64,0x39,0x10,0x6f,0x26,0x13,0x72,0x6d,0x61,0x74,0x27,0,0x10,0x6c,
+0x88,0x72,0x40,0x72,0x36,0x73,0x5e,0x77,0x7a,0x78,0x8a,0x7a,0x11,0x77,0x6a,0x4b,
+1,0x65,0x24,0x69,0x3b,0x1e,0x67,0x69,0x6f,0x6e,0x61,0x6c,0x69,0x6e,0x64,0x69,
+0x63,0x61,0x74,0x6f,0x72,0x3b,1,0x69,0x24,0x71,0x3f,0x18,0x6e,0x67,0x6c,0x65,
+0x71,0x75,0x6f,0x74,0x65,0x3f,0x17,0x73,0x65,0x67,0x73,0x70,0x61,0x63,0x65,0x4d,
+0x10,0x78,0x21,0x6c,0x36,0x6d,0x3c,0x6e,0x76,0x6f,0x13,0x74,0x68,0x65,0x72,0x21,
+1,0x65,0x23,0x66,0x35,3,0x62,0x37,0x69,0x28,0x6c,0x29,0x6e,0x2b,0x10,0x64,
+1,0x6c,0x34,0x6e,0x11,0x75,0x6d,0x2a,0x12,0x6c,0x65,0x74,0x37,0x14,0x65,0x74,
+0x74,0x65,0x72,0x29,2,0x65,0x36,0x6c,0x39,0x75,0x2c,0x14,0x6d,0x65,0x72,0x69,
+0x63,0x2d,0x14,0x77,0x6c,0x69,0x6e,0x65,0x39,0x66,0x3f,0x66,0x40,0x67,0x4e,0x68,
+0x70,0x6b,0x10,0x61,0x26,0x15,0x74,0x61,0x6b,0x61,0x6e,0x61,0x27,0x10,0x6f,0x24,
+0x13,0x72,0x6d,0x61,0x74,0x25,1,0x61,0x3a,0x6c,0x19,0x75,0x65,0x61,0x66,0x74,
+0x65,0x72,0x7a,0x77,0x6a,0x49,0x10,0x7a,0x49,1,0x65,0x24,0x6c,0x3d,0x19,0x62,
+0x72,0x65,0x77,0x6c,0x65,0x74,0x74,0x65,0x72,0x3d,0x61,0x86,0x63,0x92,0x64,0x94,
+0x65,2,0x62,0x44,0x6d,0x5e,0x78,0x2e,0x13,0x74,0x65,0x6e,0x64,0x32,0x15,0x6e,
+0x75,0x6d,0x6c,0x65,0x74,0x2f,0x42,1,0x61,0x24,0x67,0x45,0x11,0x73,0x65,0x42,
+0x12,0x67,0x61,0x7a,0x45,0x46,0x16,0x6f,0x64,0x69,0x66,0x69,0x65,0x72,0x47,0x15,
+0x6c,0x65,0x74,0x74,0x65,0x72,0x23,0x10,0x72,0x31,1,0x6f,0x24,0x71,0x41,0x18,
+0x75,0x62,0x6c,0x65,0x71,0x75,0x6f,0x74,0x65,0x41,2,0x63,0x32,0x6e,0x3c,0x6f,
+0x22,0x12,0x70,0x65,0x6e,0x23,0x24,0x13,0x6c,0x6f,0x73,0x65,0x25,0x20,0x12,0x6f,
+0x6e,0x65,0x21,6,0x6f,0x5c,0x6f,0x4a,0x72,0x5c,0x74,0x64,0x76,0x1d,0x69,0x73,
+0x75,0x61,0x6c,0x6f,0x72,0x64,0x65,0x72,0x6c,0x65,0x66,0x74,0x3d,0x18,0x76,0x65,
+0x72,0x73,0x74,0x72,0x75,0x63,0x6b,0x2d,0x13,0x69,0x67,0x68,0x74,0x2f,0x11,0x6f,
+0x70,0x30,0x12,0x61,0x6e,0x64,2,0x62,0x32,0x6c,0x50,0x72,0x13,0x69,0x67,0x68,
+0x74,0x3b,0x14,0x6f,0x74,0x74,0x6f,0x6d,0x32,0x17,0x61,0x6e,0x64,0x72,0x69,0x67,
+0x68,0x74,0x35,0x12,0x65,0x66,0x74,0x36,0x17,0x61,0x6e,0x64,0x72,0x69,0x67,0x68,
+0x74,0x39,0x62,0x2c,0x6c,0x5c,0x6e,0x10,0x61,0x21,0x14,0x6f,0x74,0x74,0x6f,0x6d,
+0x22,0x12,0x61,0x6e,0x64,1,0x6c,0x2e,0x72,0x13,0x69,0x67,0x68,0x74,0x27,0x12,
+0x65,0x66,0x74,0x25,0x12,0x65,0x66,0x74,0x28,0x17,0x61,0x6e,0x64,0x72,0x69,0x67,
+0x68,0x74,0x2b,0xd,0x6e,0xaa,0x72,0x70,0x72,0x92,0x73,0xa2,0x46,0x74,0xa2,0x54,
+0x76,1,0x69,0x60,0x6f,0x12,0x77,0x65,0x6c,0x62,1,0x64,0x3a,0x69,0x19,0x6e,
+0x64,0x65,0x70,0x65,0x6e,0x64,0x65,0x6e,0x74,0x67,0x17,0x65,0x70,0x65,0x6e,0x64,
+0x65,0x6e,0x74,0x65,1,0x72,0x2e,0x73,0x13,0x61,0x72,0x67,0x61,0x61,0x12,0x61,
+0x6d,0x61,0x5f,0x1d,0x65,0x67,0x69,0x73,0x74,0x65,0x72,0x73,0x68,0x69,0x66,0x74,
+0x65,0x72,0x57,0x1e,0x79,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x6d,0x6f,0x64,0x69,0x66,
+0x69,0x65,0x72,0x59,0x12,0x6f,0x6e,0x65,1,0x6c,0x2c,0x6d,0x12,0x61,0x72,0x6b,
+0x5d,0x14,0x65,0x74,0x74,0x65,0x72,0x5b,0x6e,0x3c,0x6f,0x7c,0x70,0x18,0x75,0x72,
+0x65,0x6b,0x69,0x6c,0x6c,0x65,0x72,0x55,1,0x6f,0x4c,0x75,1,0x6b,0x3c,0x6d,
+0x12,0x62,0x65,0x72,0x50,0x15,0x6a,0x6f,0x69,0x6e,0x65,0x72,0x53,0x11,0x74,0x61,
+0x4f,0x16,0x6e,0x6a,0x6f,0x69,0x6e,0x65,0x72,0x4d,0x13,0x74,0x68,0x65,0x72,0x21,
+0x67,0x3e,0x67,0x4a,0x69,0x64,0x6a,0x82,0x6d,0x1d,0x6f,0x64,0x69,0x66,0x79,0x69,
+0x6e,0x67,0x6c,0x65,0x74,0x74,0x65,0x72,0x4b,0x1c,0x65,0x6d,0x69,0x6e,0x61,0x74,
+0x69,0x6f,0x6e,0x6d,0x61,0x72,0x6b,0x45,0x1e,0x6e,0x76,0x69,0x73,0x69,0x62,0x6c,
+0x65,0x73,0x74,0x61,0x63,0x6b,0x65,0x72,0x47,0x14,0x6f,0x69,0x6e,0x65,0x72,0x49,
+0x61,0xa2,0xba,0x62,0xa2,0xc0,0x63,1,0x61,0xa2,0xa2,0x6f,0x16,0x6e,0x73,0x6f,
+0x6e,0x61,0x6e,0x74,0x2a,8,0x6b,0x67,0x6b,0x48,0x6d,0x52,0x70,0x5c,0x73,0xa2,
+0x42,0x77,0x19,0x69,0x74,0x68,0x73,0x74,0x61,0x63,0x6b,0x65,0x72,0x43,0x14,0x69,
+0x6c,0x6c,0x65,0x72,0x35,0x14,0x65,0x64,0x69,0x61,0x6c,0x37,1,0x6c,0x52,0x72,
+0x10,0x65,1,0x63,0x2e,0x66,0x13,0x69,0x78,0x65,0x64,0x3d,0x19,0x65,0x64,0x69,
+0x6e,0x67,0x72,0x65,0x70,0x68,0x61,0x3b,0x18,0x61,0x63,0x65,0x68,0x6f,0x6c,0x64,
+0x65,0x72,0x39,0x10,0x75,1,0x62,0x3e,0x63,0x1b,0x63,0x65,0x65,0x64,0x69,0x6e,
+0x67,0x72,0x65,0x70,0x68,0x61,0x41,0x15,0x6a,0x6f,0x69,0x6e,0x65,0x64,0x3f,0x64,
+0x4c,0x66,0x52,0x68,0x5a,0x69,0x1e,0x6e,0x69,0x74,0x69,0x61,0x6c,0x70,0x6f,0x73,
+0x74,0x66,0x69,0x78,0x65,0x64,0x33,0x12,0x65,0x61,0x64,0x2d,0x13,0x69,0x6e,0x61,
+0x6c,0x2f,0x18,0x65,0x61,0x64,0x6c,0x65,0x74,0x74,0x65,0x72,0x31,0x1d,0x6e,0x74,
+0x69,0x6c,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x6d,0x61,0x72,0x6b,0x29,0x16,0x76,0x61,
+0x67,0x72,0x61,0x68,0x61,0x23,1,0x69,0x4a,0x72,0x10,0x61,0x1f,0x68,0x6d,0x69,
+0x6a,0x6f,0x69,0x6e,0x69,0x6e,0x67,0x6e,0x75,0x6d,0x62,0x65,0x72,0x27,0x12,0x6e,
+0x64,0x75,0x25,2,0x72,0x38,0x74,0x46,0x75,0x26,0x15,0x70,0x72,0x69,0x67,0x68,
+0x74,0x27,0x20,0x15,0x6f,0x74,0x61,0x74,0x65,0x64,0x21,1,0x72,0x24,0x75,0x25,
+0x22,0x18,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x65,0x64,1,0x72,0x32,0x75,0x15,
+0x70,0x72,0x69,0x67,0x68,0x74,0x25,0x15,0x6f,0x74,0x61,0x74,0x65,0x64,0x23,0xd,
+0x6e,0xc1,0x86,0x73,0xa8,0x73,0x4c,0x74,0xa2,0x76,0x75,0xa2,0x83,0x7a,0xd8,0x70,
+0,2,0x6c,0xd9,0x20,0,0x70,0xd9,0x40,0,0x73,0xc3,0,0xfe,0xf,0,
+0,0,7,0x6f,0x3c,0x6f,0xff,8,0,0,0,0x70,0x3a,0x75,0x6e,0x79,
+0x13,0x6d,0x62,0x6f,0x6c,0xff,0xf,0,0,0,0x11,0x61,0x63,1,0x65,0x34,
+0x69,0x15,0x6e,0x67,0x6d,0x61,0x72,0x6b,0xa5,0,0x18,0x73,0x65,0x70,0x61,0x72,
+0x61,0x74,0x6f,0x72,0xc3,0,0x16,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0xe1,0,
+0,0x63,0xff,2,0,0,0,0x65,0x38,0x6b,0xff,4,0,0,0,0x6d,
+0xff,1,0,0,0,0x16,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0xd9,0x70,0,
+0x1d,0x69,0x74,0x6c,0x65,0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x31,
+1,0x6e,0x40,0x70,0x1c,0x70,0x65,0x72,0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74,
+0x65,0x72,0x25,0x17,0x61,0x73,0x73,0x69,0x67,0x6e,0x65,0x64,0x23,0x6e,0xa2,0x69,
+0x6f,0xa2,0x89,0x70,0xfe,0x30,0xf8,0,0,9,0x69,0x33,0x69,0xff,0x10,0,
+0,0,0x6f,0xfd,0x80,0,0,0x72,0x54,0x73,0xf9,0,0,0x75,0x12,0x6e,
+0x63,0x74,0xfe,0x30,0xf8,0,0,0x15,0x75,0x61,0x74,0x69,0x6f,0x6e,0xff,0x30,
+0xf8,0,0,0x17,0x69,0x76,0x61,0x74,0x65,0x75,0x73,0x65,0xdd,0,0,0x61,
+0x48,0x63,0xfd,0x40,0,0,0x64,0xe9,0,0,0x65,0xfd,0x20,0,0,0x66,
+0xff,0x20,0,0,0,0x1f,0x72,0x61,0x67,0x72,0x61,0x70,0x68,0x73,0x65,0x70,
+0x61,0x72,0x61,0x74,0x6f,0x72,0xd9,0x40,0,0xbe,0,3,0x64,0xa7,0,0x6c,
+0xab,0,0x6f,0x30,0x75,0x13,0x6d,0x62,0x65,0x72,0xbf,0,0xb2,0,0x1b,0x6e,
+0x73,0x70,0x61,0x63,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0xa1,1,0x70,0x92,0x74,
+0x12,0x68,0x65,0x72,0xe6,0x80,1,3,0x6c,0x40,0x6e,0x4a,0x70,0x56,0x73,0x14,
+0x79,0x6d,0x62,0x6f,0x6c,0xff,8,0,0,0,0x14,0x65,0x74,0x74,0x65,0x72,
+0x61,0x14,0x75,0x6d,0x62,0x65,0x72,0xb3,0,0x19,0x75,0x6e,0x63,0x74,0x75,0x61,
+0x74,0x69,0x6f,0x6e,0xfd,0x80,0,0,0x1c,0x65,0x6e,0x70,0x75,0x6e,0x63,0x74,
+0x75,0x61,0x74,0x69,0x6f,0x6e,0xf9,0,0,0x66,0xc0,0xc4,0x66,0xa2,0x47,0x69,
+0xa2,0x64,0x6c,0xa2,0x79,0x6d,0xa4,0xc0,4,0x61,0x6c,0x63,0xa5,0,0x65,0xa3,
+0x80,0x6e,0xa1,0x6f,0x15,0x64,0x69,0x66,0x69,0x65,0x72,1,0x6c,0x38,0x73,0x14,
+0x79,0x6d,0x62,0x6f,0x6c,0xff,4,0,0,0,0x14,0x65,0x74,0x74,0x65,0x72,
+0x41,1,0x72,0x3c,0x74,0x16,0x68,0x73,0x79,0x6d,0x62,0x6f,0x6c,0xff,1,0,
+0,0,0x10,0x6b,0xa5,0xc0,1,0x69,0x32,0x6f,0x13,0x72,0x6d,0x61,0x74,0xdb,
+0,0,0x1d,0x6e,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,
+0x6e,0xff,0x20,0,0,0,0x10,0x6e,0x1f,0x69,0x74,0x69,0x61,0x6c,0x70,0x75,
+0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xff,0x10,0,0,0,0x9c,7,
+0x6d,0x18,0x6d,0x41,0x6f,0x28,0x74,0x31,0x75,0x25,0x60,0x1c,0x77,0x65,0x72,0x63,
+0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x29,0x63,0x3d,0x65,0x28,0x69,0x42,
+0x6c,0x29,0x13,0x74,0x74,0x65,0x72,0x9c,0x15,0x6e,0x75,0x6d,0x62,0x65,0x72,0xab,
+0,0x1a,0x6e,0x65,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0xd9,0x20,0,
+0x63,0x46,0x64,0xa2,0x96,0x65,0x1b,0x6e,0x63,0x6c,0x6f,0x73,0x69,0x6e,0x67,0x6d,
+0x61,0x72,0x6b,0xa3,0x80,0xe6,0x80,1,7,0x6e,0x57,0x6e,0x52,0x6f,0x5e,0x73,
+0xe1,0,0,0x75,0x1b,0x72,0x72,0x65,0x6e,0x63,0x79,0x73,0x79,0x6d,0x62,0x6f,
+0x6c,0xff,2,0,0,0,0x22,0x12,0x74,0x72,0x6c,0xd9,0x80,0,0xdc,0,
+0,1,0x6d,0x62,0x6e,1,0x6e,0x30,0x74,0x12,0x72,0x6f,0x6c,0xd9,0x80,0,
+0x1f,0x65,0x63,0x74,0x6f,0x72,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,
+0x6e,0xfd,0x40,0,0,0x19,0x62,0x69,0x6e,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,
+0xa5,0xc0,0x61,0x58,0x63,0xd9,0x80,0,0x66,0xdb,0,0,0x6c,0x1d,0x6f,0x73,
+0x65,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xfd,0x20,0,0,
+0x18,0x73,0x65,0x64,0x6c,0x65,0x74,0x74,0x65,0x72,0x3d,2,0x61,0x32,0x65,0x50,
+0x69,0x12,0x67,0x69,0x74,0xa7,0,0x1c,0x73,0x68,0x70,0x75,0x6e,0x63,0x74,0x75,
+0x61,0x74,0x69,0x6f,0x6e,0xe9,0,0,0x1a,0x63,0x69,0x6d,0x61,0x6c,0x6e,0x75,
+0x6d,0x62,0x65,0x72,0xa7,0
};
-const char PropNameData::nameGroups[21265]={
+const char PropNameData::nameGroups[21692]={
2,'A','l','p','h','a',0,'A','l','p','h','a','b','e','t','i','c',0,
4,'N',0,'N','o',0,'F',0,'F','a','l','s','e',0,4,'Y',0,'Y','e','s',0,'T',0,'T','r','u','e',0,
2,'N','R',0,'N','o','t','_','R','e','o','r','d','e','r','e','d',0,
@@ -1457,9 +1474,21 @@ const char PropNameData::nameGroups[21265]={
2,'M','e','d','e','f','a','i','d','r','i','n',0,'M','e','d','e','f','a','i','d','r','i','n',0,
2,'O','l','d','_','S','o','g','d','i','a','n',0,'O','l','d','_','S','o','g','d','i','a','n',0,
2,'S','o','g','d','i','a','n',0,'S','o','g','d','i','a','n',0,
-2,'c','c','c',0,'C','a','n','o','n','i','c','a','l','_','C','o','m','b','i','n','i','n','g','_','C','l','a','s','s',0,
-2,'d','t',0,'D','e','c','o','m','p','o','s','i','t','i','o','n','_','T','y','p','e',0,
-3,'N','o','n','e',0,'N','o','n','e',0,'n','o','n','e',0,
+2,'E','g','y','p','t','i','a','n','_','H','i','e','r','o','g','l','y','p','h','_','F','o','r','m','a','t','_','C','o','n','t',
+'r','o','l','s',0,'E','g','y','p','t','i','a','n','_','H','i','e','r','o','g','l','y','p','h','_','F','o','r','m','a','t','_',
+'C','o','n','t','r','o','l','s',0,2,'E','l','y','m','a','i','c',0,'E','l','y','m','a','i','c',0,
+2,'N','a','n','d','i','n','a','g','a','r','i',0,'N','a','n','d','i','n','a','g','a','r','i',0,
+2,'N','y','i','a','k','e','n','g','_','P','u','a','c','h','u','e','_','H','m','o','n','g',0,
+'N','y','i','a','k','e','n','g','_','P','u','a','c','h','u','e','_','H','m','o','n','g',0,
+2,'O','t','t','o','m','a','n','_','S','i','y','a','q','_','N','u','m','b','e','r','s',0,'O','t','t','o','m','a','n','_','S',
+'i','y','a','q','_','N','u','m','b','e','r','s',0,2,'S','m','a','l','l','_','K','a','n','a','_','E','x','t',0,
+'S','m','a','l','l','_','K','a','n','a','_','E','x','t','e','n','s','i','o','n',0,
+2,'S','y','m','b','o','l','s','_','A','n','d','_','P','i','c','t','o','g','r','a','p','h','s','_','E','x','t','_','A',0,
+'S','y','m','b','o','l','s','_','A','n','d','_','P','i','c','t','o','g','r','a','p','h','s','_','E','x','t','e','n','d','e','d',
+'_','A',0,2,'T','a','m','i','l','_','S','u','p',0,'T','a','m','i','l','_','S','u','p','p','l','e','m','e','n','t',0,
+2,'W','a','n','c','h','o',0,'W','a','n','c','h','o',0,2,'c','c','c',0,'C','a','n','o','n','i','c','a','l','_','C','o',
+'m','b','i','n','i','n','g','_','C','l','a','s','s',0,2,'d','t',0,'D','e','c','o','m','p','o','s','i','t','i','o','n','_',
+'T','y','p','e',0,3,'N','o','n','e',0,'N','o','n','e',0,'n','o','n','e',0,
3,'C','a','n',0,'C','a','n','o','n','i','c','a','l',0,'c','a','n',0,
3,'C','o','m',0,'C','o','m','p','a','t',0,'c','o','m',0,
3,'E','n','c',0,'C','i','r','c','l','e',0,'e','n','c',0,
@@ -1738,8 +1767,10 @@ const char PropNameData::nameGroups[21265]={
2,'M','a','k','a',0,'M','a','k','a','s','a','r',0,2,'M','e','d','f',0,'M','e','d','e','f','a','i','d','r','i','n',0,
2,'R','o','h','g',0,'H','a','n','i','f','i','_','R','o','h','i','n','g','y','a',0,
2,'S','o','g','d',0,'S','o','g','d','i','a','n',0,2,'S','o','g','o',0,'O','l','d','_','S','o','g','d','i','a','n',0,
-2,'h','s','t',0,'H','a','n','g','u','l','_','S','y','l','l','a','b','l','e','_','T','y','p','e',0,
-2,'N','A',0,'N','o','t','_','A','p','p','l','i','c','a','b','l','e',0,
+2,'E','l','y','m',0,'E','l','y','m','a','i','c',0,2,'H','m','n','p',0,'N','y','i','a','k','e','n','g','_','P','u','a',
+'c','h','u','e','_','H','m','o','n','g',0,2,'N','a','n','d',0,'N','a','n','d','i','n','a','g','a','r','i',0,
+2,'W','c','h','o',0,'W','a','n','c','h','o',0,2,'h','s','t',0,'H','a','n','g','u','l','_','S','y','l','l','a','b','l',
+'e','_','T','y','p','e',0,2,'N','A',0,'N','o','t','_','A','p','p','l','i','c','a','b','l','e',0,
2,'L',0,'L','e','a','d','i','n','g','_','J','a','m','o',0,
2,'V',0,'V','o','w','e','l','_','J','a','m','o',0,2,'T',0,'T','r','a','i','l','i','n','g','_','J','a','m','o',0,
2,'L','V',0,'L','V','_','S','y','l','l','a','b','l','e',0,
diff --git a/Build/source/libs/icu/icu-src/source/common/putil.cpp b/Build/source/libs/icu/icu-src/source/common/putil.cpp
index 769309b422c..acb902220b8 100644
--- a/Build/source/libs/icu/icu-src/source/common/putil.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/putil.cpp
@@ -103,17 +103,6 @@
# include <windows.h>
# include "unicode/uloc.h"
# include "wintz.h"
-#if U_PLATFORM_HAS_WINUWP_API
-typedef PVOID LPMSG; // TODO: figure out how to get rid of this typedef
-#include <Windows.Globalization.h>
-#include <windows.system.userprofile.h>
-#include <wrl/wrappers/corewrappers.h>
-#include <wrl/client.h>
-
-using namespace ABI::Windows::Foundation;
-using namespace Microsoft::WRL;
-using namespace Microsoft::WRL::Wrappers;
-#endif
#elif U_PLATFORM == U_PF_OS400
# include <float.h>
# include <qusec.h> /* error code structure */
@@ -252,7 +241,6 @@ u_signBit(double d) {
UDate fakeClock_t0 = 0; /** Time to start the clock from **/
UDate fakeClock_dt = 0; /** Offset (fake time - real time) **/
UBool fakeClock_set = FALSE; /** True if fake clock has spun up **/
-static UMutex fakeClockMutex = U_MUTEX_INTIALIZER;
static UDate getUTCtime_real() {
struct timeval posixTime;
@@ -261,6 +249,7 @@ static UDate getUTCtime_real() {
}
static UDate getUTCtime_fake() {
+ static UMutex fakeClockMutex;
umtx_lock(&fakeClockMutex);
if(!fakeClock_set) {
UDate real = getUTCtime_real();
@@ -997,7 +986,8 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) {
/* Check each entry in the directory. */
while((dirEntry = readdir(dirp)) != NULL) {
const char* dirName = dirEntry->d_name;
- if (uprv_strcmp(dirName, SKIP1) != 0 && uprv_strcmp(dirName, SKIP2) != 0) {
+ if (uprv_strcmp(dirName, SKIP1) != 0 && uprv_strcmp(dirName, SKIP2) != 0
+ && uprv_strcmp(TZFILE_SKIP, dirName) != 0 && uprv_strcmp(TZFILE_SKIP2, dirName) != 0) {
/* Create a newpath with the new entry to test each entry in the directory. */
CharString newpath(curpath, status);
newpath.append(dirName, -1, status);
@@ -1024,7 +1014,7 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) {
*/
if (result != NULL)
break;
- } else if (uprv_strcmp(TZFILE_SKIP, dirName) != 0 && uprv_strcmp(TZFILE_SKIP2, dirName) != 0) {
+ } else {
if(compareBinaryFiles(TZDEFAULT, newpath.data(), tzInfo)) {
int32_t amountToSkip = sizeof(TZZONEINFO) - 1;
if (amountToSkip > newpath.length()) {
@@ -1078,7 +1068,7 @@ uprv_tzname(int n)
// the other code path returns a pointer to a heap location.
// If we don't have a name already, then tzname wouldn't be any
// better, so just fall back.
- return uprv_strdup("Etc/UTC");
+ return uprv_strdup("");
#endif // !U_TZNAME
#else
@@ -1317,19 +1307,18 @@ uprv_pathIsAbsolute(const char *path)
return FALSE;
}
-/* Temporary backup setting of ICU_DATA_DIR_PREFIX_ENV_VAR
- until some client wrapper makefiles are updated */
-#if U_PLATFORM_IS_DARWIN_BASED && TARGET_IPHONE_SIMULATOR
+/* Backup setting of ICU_DATA_DIR_PREFIX_ENV_VAR
+ (needed for some Darwin ICU build environments) */
+#if U_PLATFORM_IS_DARWIN_BASED && TARGET_OS_SIMULATOR
# if !defined(ICU_DATA_DIR_PREFIX_ENV_VAR)
# define ICU_DATA_DIR_PREFIX_ENV_VAR "IPHONE_SIMULATOR_ROOT"
# endif
#endif
-#if U_PLATFORM_HAS_WINUWP_API != 0
+#if defined(ICU_DATA_DIR_WINDOWS)
// Helper function to get the ICU Data Directory under the Windows directory location.
static BOOL U_CALLCONV getIcuDataDirectoryUnderWindowsDirectory(char* directoryBuffer, UINT bufferLength)
{
-#if defined(ICU_DATA_DIR_WINDOWS)
wchar_t windowsPath[MAX_PATH];
char windowsPathUtf8[MAX_PATH];
@@ -1356,7 +1345,6 @@ static BOOL U_CALLCONV getIcuDataDirectoryUnderWindowsDirectory(char* directoryB
}
}
}
-#endif
return FALSE;
}
@@ -1390,9 +1378,9 @@ static void U_CALLCONV dataDirectoryInitFn() {
*/
# if !defined(ICU_NO_USER_DATA_OVERRIDE) && !UCONFIG_NO_FILE_IO
/* First try to get the environment variable */
-# if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP does not support getenv
+# if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP does not support getenv
path=getenv("ICU_DATA");
-# endif
+# endif
# endif
/* ICU_DATA_DIR may be set as a compile option.
@@ -1421,7 +1409,7 @@ static void U_CALLCONV dataDirectoryInitFn() {
}
#endif
-#if U_PLATFORM_HAS_WINUWP_API != 0 && defined(ICU_DATA_DIR_WINDOWS)
+#if defined(ICU_DATA_DIR_WINDOWS)
char datadir_path_buffer[MAX_PATH];
if (getIcuDataDirectoryUnderWindowsDirectory(datadir_path_buffer, UPRV_LENGTHOF(datadir_path_buffer))) {
path = datadir_path_buffer;
@@ -1430,12 +1418,7 @@ static void U_CALLCONV dataDirectoryInitFn() {
if(path==NULL) {
/* It looks really bad, set it to something. */
-#if U_PLATFORM_HAS_WIN32_API
- // Windows UWP will require icudtl.dat file in same directory as icuuc.dll
- path = ".\\";
-#else
path = "";
-#endif
}
u_setDataDirectory(path);
@@ -1476,12 +1459,17 @@ static void U_CALLCONV TimeZoneDataDirInitFn(UErrorCode &status) {
const char *dir = "";
-#if U_PLATFORM_HAS_WINUWP_API != 0
- // The UWP version does not support the environment variable setting, but can possibly pick them up from the Windows directory.
+#if U_PLATFORM_HAS_WINUWP_API == 1
+// The UWP version does not support the environment variable setting.
+
+# if defined(ICU_DATA_DIR_WINDOWS)
+ // When using the Windows system data, we can possibly pick up time zone data from the Windows directory.
char datadir_path_buffer[MAX_PATH];
if (getIcuDataDirectoryUnderWindowsDirectory(datadir_path_buffer, UPRV_LENGTHOF(datadir_path_buffer))) {
dir = datadir_path_buffer;
}
+# endif
+
#else
dir = getenv("ICU_TIMEZONE_FILES_DIR");
#endif // U_PLATFORM_HAS_WINUWP_API
@@ -1575,6 +1563,10 @@ static const char *uprv_getPOSIXIDForCategory(int category)
{
/* Nothing worked. Give it a nice POSIX default value. */
posixID = "en_US_POSIX";
+ // Note: this test will not catch 'C.UTF-8',
+ // that will be handled in uprv_getDefaultLocaleID().
+ // Leave this mapping here for the uprv_getPOSIXIDForDefaultCodepage()
+ // caller which expects to see "en_US_POSIX" in many branches.
}
return posixID;
}
@@ -1633,11 +1625,7 @@ The variant cannot have dots in it.
The 'rightmost' variant (@xxx) wins.
The leftmost codepage (.xxx) wins.
*/
- char *correctedPOSIXLocale = 0;
const char* posixID = uprv_getPOSIXIDForDefaultLocale();
- const char *p;
- const char *q;
- int32_t len;
/* Format: (no spaces)
ll [ _CC ] [ . MM ] [ @ VV]
@@ -1645,38 +1633,36 @@ The leftmost codepage (.xxx) wins.
l = lang, C = ctry, M = charmap, V = variant
*/
- if (gCorrectedPOSIXLocale != NULL) {
+ if (gCorrectedPOSIXLocale != nullptr) {
return gCorrectedPOSIXLocale;
}
- if ((p = uprv_strchr(posixID, '.')) != NULL) {
- /* assume new locale can't be larger than old one? */
- correctedPOSIXLocale = static_cast<char *>(uprv_malloc(uprv_strlen(posixID)+1));
- /* Exit on memory allocation error. */
- if (correctedPOSIXLocale == NULL) {
- return NULL;
- }
- uprv_strncpy(correctedPOSIXLocale, posixID, p-posixID);
- correctedPOSIXLocale[p-posixID] = 0;
+ // Copy the ID into owned memory.
+ // Over-allocate in case we replace "C" with "en_US_POSIX" (+10), + null termination
+ char *correctedPOSIXLocale = static_cast<char *>(uprv_malloc(uprv_strlen(posixID) + 10 + 1));
+ if (correctedPOSIXLocale == nullptr) {
+ return nullptr;
+ }
+ uprv_strcpy(correctedPOSIXLocale, posixID);
- /* do not copy after the @ */
- if ((p = uprv_strchr(correctedPOSIXLocale, '@')) != NULL) {
- correctedPOSIXLocale[p-correctedPOSIXLocale] = 0;
- }
+ char *limit;
+ if ((limit = uprv_strchr(correctedPOSIXLocale, '.')) != nullptr) {
+ *limit = 0;
+ }
+ if ((limit = uprv_strchr(correctedPOSIXLocale, '@')) != nullptr) {
+ *limit = 0;
}
+ if ((uprv_strcmp("C", correctedPOSIXLocale) == 0) // no @ variant
+ || (uprv_strcmp("POSIX", correctedPOSIXLocale) == 0)) {
+ // Raw input was C.* or POSIX.*, Give it a nice POSIX default value.
+ // (The "C"/"POSIX" case is handled in uprv_getPOSIXIDForCategory())
+ uprv_strcpy(correctedPOSIXLocale, "en_US_POSIX");
+ }
+
/* Note that we scan the *uncorrected* ID. */
- if ((p = uprv_strrchr(posixID, '@')) != NULL) {
- if (correctedPOSIXLocale == NULL) {
- /* new locale can be 1 char longer than old one if @ -> __ */
- correctedPOSIXLocale = static_cast<char *>(uprv_malloc(uprv_strlen(posixID)+2));
- /* Exit on memory allocation error. */
- if (correctedPOSIXLocale == NULL) {
- return NULL;
- }
- uprv_strncpy(correctedPOSIXLocale, posixID, p-posixID);
- correctedPOSIXLocale[p-posixID] = 0;
- }
+ const char *p;
+ if ((p = uprv_strrchr(posixID, '@')) != nullptr) {
p++;
/* Take care of any special cases here.. */
@@ -1685,17 +1671,18 @@ The leftmost codepage (.xxx) wins.
/* Don't worry about no__NY. In practice, it won't appear. */
}
- if (uprv_strchr(correctedPOSIXLocale,'_') == NULL) {
+ if (uprv_strchr(correctedPOSIXLocale,'_') == nullptr) {
uprv_strcat(correctedPOSIXLocale, "__"); /* aa@b -> aa__b (note this can make the new locale 1 char longer) */
}
else {
uprv_strcat(correctedPOSIXLocale, "_"); /* aa_CC@b -> aa_CC_b */
}
- if ((q = uprv_strchr(p, '.')) != NULL) {
+ const char *q;
+ if ((q = uprv_strchr(p, '.')) != nullptr) {
/* How big will the resulting string be? */
- len = (int32_t)(uprv_strlen(correctedPOSIXLocale) + (q-p));
- uprv_strncat(correctedPOSIXLocale, p, q-p);
+ int32_t len = (int32_t)(uprv_strlen(correctedPOSIXLocale) + (q-p));
+ uprv_strncat(correctedPOSIXLocale, p, q-p); // do not include charset
correctedPOSIXLocale[len] = 0;
}
else {
@@ -1710,28 +1697,15 @@ The leftmost codepage (.xxx) wins.
*/
}
- /* Was a correction made? */
- if (correctedPOSIXLocale != NULL) {
- posixID = correctedPOSIXLocale;
- }
- else {
- /* copy it, just in case the original pointer goes away. See j2395 */
- correctedPOSIXLocale = (char *)uprv_malloc(uprv_strlen(posixID) + 1);
- /* Exit on memory allocation error. */
- if (correctedPOSIXLocale == NULL) {
- return NULL;
- }
- posixID = uprv_strcpy(correctedPOSIXLocale, posixID);
- }
-
- if (gCorrectedPOSIXLocale == NULL) {
+ if (gCorrectedPOSIXLocale == nullptr) {
gCorrectedPOSIXLocale = correctedPOSIXLocale;
gCorrectedPOSIXLocaleHeapAllocated = true;
ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup);
- correctedPOSIXLocale = NULL;
+ correctedPOSIXLocale = nullptr;
}
+ posixID = gCorrectedPOSIXLocale;
- if (correctedPOSIXLocale != NULL) { /* Was already set - clean up. */
+ if (correctedPOSIXLocale != nullptr) { /* Was already set - clean up. */
uprv_free(correctedPOSIXLocale);
}
@@ -2093,7 +2067,7 @@ int_getDefaultCodepage()
static char codepage[64];
DWORD codepageNumber = 0;
-#if U_PLATFORM_HAS_WINUWP_API > 0
+#if U_PLATFORM_HAS_WINUWP_API == 1
// UWP doesn't have a direct API to get the default ACP as Microsoft would rather
// have folks use Unicode than a "system" code page, however this is the same
// codepage as the system default locale codepage. (FWIW, the system locale is
diff --git a/Build/source/libs/icu/icu-src/source/common/putilimp.h b/Build/source/libs/icu/icu-src/source/common/putilimp.h
index 1036651fc86..d9c90cf4e75 100644
--- a/Build/source/libs/icu/icu-src/source/common/putilimp.h
+++ b/Build/source/libs/icu/icu-src/source/common/putilimp.h
@@ -179,60 +179,6 @@ typedef size_t uintptr_t;
/** @} */
/*===========================================================================*/
-/** @{ GCC built in functions for atomic memory operations */
-/*===========================================================================*/
-
-/**
- * \def U_HAVE_GCC_ATOMICS
- * @internal
- */
-#ifdef U_HAVE_GCC_ATOMICS
- /* Use the predefined value. */
-#elif U_PLATFORM == U_PF_MINGW
- #define U_HAVE_GCC_ATOMICS 0
-#elif U_GCC_MAJOR_MINOR >= 405 || defined(__clang__)
- /* TODO: Intel icc and IBM xlc on AIX also support gcc atomics. (Intel originated them.)
- * Add them for these compilers.
- * Note: Clang sets __GNUC__ defines for version 4.2, so misses the 4.4 test here.
- */
-# define U_HAVE_GCC_ATOMICS 1
-#else
-# define U_HAVE_GCC_ATOMICS 0
-#endif
-
-/** @} */
-
-/**
- * \def U_HAVE_STD_ATOMICS
- * Defines whether to use the standard C++11 <atomic> functions
- * If false, ICU will fall back to compiler or platform specific alternatives.
- * Note: support for these fall back options for atomics will be removed in a future version
- * of ICU, and the use of C++ 11 atomics will be required.
- * @internal
- */
-#ifdef U_HAVE_STD_ATOMICS
- /* Use the predefined value. */
-#else
-# define U_HAVE_STD_ATOMICS 1
-#endif
-
-/**
- * \def U_HAVE_CLANG_ATOMICS
- * Defines whether Clang c11 style built-in atomics are available.
- * These are used in preference to gcc atomics when both are available.
- */
-#ifdef U_HAVE_CLANG_ATOMICS
- /* Use the predefined value. */
-#elif __has_builtin(__c11_atomic_load) && \
- __has_builtin(__c11_atomic_store) && \
- __has_builtin(__c11_atomic_fetch_add) && \
- __has_builtin(__c11_atomic_fetch_sub)
-# define U_HAVE_CLANG_ATOMICS 1
-#else
-# define U_HAVE_CLANG_ATOMICS 0
-#endif
-
-/*===========================================================================*/
/** @{ Programs used by ICU code */
/*===========================================================================*/
diff --git a/Build/source/libs/icu/icu-src/source/common/rbbi.cpp b/Build/source/libs/icu/icu-src/source/common/rbbi.cpp
index cb3766506f4..01dae48de44 100644
--- a/Build/source/libs/icu/icu-src/source/common/rbbi.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/rbbi.cpp
@@ -30,6 +30,7 @@
#include "ucln_cmn.h"
#include "cmemory.h"
#include "cstring.h"
+#include "localsvc.h"
#include "rbbidata.h"
#include "rbbi_cache.h"
#include "rbbirb.h"
@@ -37,11 +38,6 @@
#include "umutex.h"
#include "uvectr32.h"
-// if U_LOCAL_SERVICE_HOOK is defined, then localsvc.cpp is expected to be included.
-#if U_LOCAL_SERVICE_HOOK
-#include "localsvc.h"
-#endif
-
#ifdef RBBI_DEBUG
static UBool gTrace = FALSE;
#endif
@@ -327,8 +323,8 @@ void RuleBasedBreakIterator::init(UErrorCode &status) {
// Virtual function: does the right thing with subclasses.
//
//-----------------------------------------------------------------------------
-BreakIterator*
-RuleBasedBreakIterator::clone(void) const {
+RuleBasedBreakIterator*
+RuleBasedBreakIterator::clone() const {
return new RuleBasedBreakIterator(*this);
}
@@ -356,7 +352,7 @@ RuleBasedBreakIterator::operator==(const BreakIterator& that) const {
// or have a different iteration position.
// Note that fText's position is always the same as the break iterator's position.
return FALSE;
- };
+ }
if (!(fPosition == that2.fPosition &&
fRuleStatusIndex == that2.fRuleStatusIndex &&
@@ -720,7 +716,7 @@ struct LookAheadResults {
int32_t fPositions[8];
int16_t fKeys[8];
- LookAheadResults() : fUsedSlotLimit(0), fPositions(), fKeys() {};
+ LookAheadResults() : fUsedSlotLimit(0), fPositions(), fKeys() {}
int32_t getPosition(int16_t key) {
for (int32_t i=0; i<fUsedSlotLimit; ++i) {
@@ -728,8 +724,7 @@ struct LookAheadResults {
return fPositions[i];
}
}
- U_ASSERT(FALSE);
- return -1;
+ UPRV_UNREACHABLE;
}
void setPosition(int16_t key, int32_t position) {
@@ -741,8 +736,7 @@ struct LookAheadResults {
}
}
if (i >= kMaxLookaheads) {
- U_ASSERT(FALSE);
- i = kMaxLookaheads - 1;
+ UPRV_UNREACHABLE;
}
fKeys[i] = key;
fPositions[i] = position;
@@ -1085,10 +1079,8 @@ const uint8_t *RuleBasedBreakIterator::getBinaryRules(uint32_t &length) {
}
-BreakIterator * RuleBasedBreakIterator::createBufferClone(void * /*stackBuffer*/,
- int32_t &bufferSize,
- UErrorCode &status)
-{
+RuleBasedBreakIterator *RuleBasedBreakIterator::createBufferClone(
+ void * /*stackBuffer*/, int32_t &bufferSize, UErrorCode &status) {
if (U_FAILURE(status)){
return NULL;
}
diff --git a/Build/source/libs/icu/icu-src/source/common/rbbi_cache.cpp b/Build/source/libs/icu/icu-src/source/common/rbbi_cache.cpp
index 519c6104989..4f9e83360a2 100644
--- a/Build/source/libs/icu/icu-src/source/common/rbbi_cache.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/rbbi_cache.cpp
@@ -74,9 +74,7 @@ UBool RuleBasedBreakIterator::DictionaryCache::following(int32_t fromPos, int32_
return TRUE;
}
}
- U_ASSERT(FALSE);
- fPositionInCache = -1;
- return FALSE;
+ UPRV_UNREACHABLE;
}
@@ -116,9 +114,7 @@ UBool RuleBasedBreakIterator::DictionaryCache::preceding(int32_t fromPos, int32_
return TRUE;
}
}
- U_ASSERT(FALSE);
- fPositionInCache = -1;
- return FALSE;
+ UPRV_UNREACHABLE;
}
void RuleBasedBreakIterator::DictionaryCache::populateDictionary(int32_t startPos, int32_t endPos,
@@ -388,8 +384,7 @@ UBool RuleBasedBreakIterator::BreakCache::populateNear(int32_t position, UErrorC
// Add following position(s) to the cache.
while (fBoundaries[fEndBufIdx] < position) {
if (!populateFollowing()) {
- U_ASSERT(false);
- return false;
+ UPRV_UNREACHABLE;
}
}
fBufIdx = fEndBufIdx; // Set iterator position to the end of the buffer.
@@ -524,7 +519,7 @@ UBool RuleBasedBreakIterator::BreakCache::populatePreceding(UErrorCode &status)
// The initial handleNext() only advanced by a single code point. Go again.
position = fBI->handleNext(); // Safe rules identify safe pairs.
}
- };
+ }
positionStatusIdx = fBI->fRuleStatusIndex;
}
} while (position >= fromPosition);
diff --git a/Build/source/libs/icu/icu-src/source/common/rbbi_cache.h b/Build/source/libs/icu/icu-src/source/common/rbbi_cache.h
index b4338c37490..7991d6c0c7b 100644
--- a/Build/source/libs/icu/icu-src/source/common/rbbi_cache.h
+++ b/Build/source/libs/icu/icu-src/source/common/rbbi_cache.h
@@ -95,7 +95,7 @@ class RuleBasedBreakIterator::BreakCache: public UMemory {
fTextIdx = fBI->fPosition = fBoundaries[fBufIdx];
fBI->fRuleStatusIndex = fStatuses[fBufIdx];
}
- };
+ }
void nextOL();
@@ -178,7 +178,7 @@ class RuleBasedBreakIterator::BreakCache: public UMemory {
void dumpCache();
private:
- static inline int32_t modChunkSize(int index) { return index & (CACHE_SIZE - 1); };
+ static inline int32_t modChunkSize(int index) { return index & (CACHE_SIZE - 1); }
static constexpr int32_t CACHE_SIZE = 128;
static_assert((CACHE_SIZE & (CACHE_SIZE-1)) == 0, "CACHE_SIZE must be power of two.");
diff --git a/Build/source/libs/icu/icu-src/source/common/rbbiscan.h b/Build/source/libs/icu/icu-src/source/common/rbbiscan.h
index 8bec8234e58..c51b4cf2a68 100644
--- a/Build/source/libs/icu/icu-src/source/common/rbbiscan.h
+++ b/Build/source/libs/icu/icu-src/source/common/rbbiscan.h
@@ -54,7 +54,7 @@ public:
struct RBBIRuleChar {
UChar32 fChar;
UBool fEscaped;
- RBBIRuleChar() : fChar(0), fEscaped(FALSE) {};
+ RBBIRuleChar() : fChar(0), fEscaped(FALSE) {}
};
RBBIRuleScanner(RBBIRuleBuilder *rb);
diff --git a/Build/source/libs/icu/icu-src/source/common/resbund.cpp b/Build/source/libs/icu/icu-src/source/common/resbund.cpp
index 512bd531f23..7c5063b2114 100644
--- a/Build/source/libs/icu/icu-src/source/common/resbund.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/resbund.cpp
@@ -51,6 +51,7 @@
#include "unicode/utypes.h"
#include "unicode/resbund.h"
+#include "cmemory.h"
#include "mutex.h"
#include "uassert.h"
#include "umutex.h"
@@ -376,8 +377,8 @@ void ResourceBundle::getVersion(UVersionInfo versionInfo) const {
ures_getVersion(fResource, versionInfo);
}
-static UMutex gLocaleLock = U_MUTEX_INITIALIZER;
const Locale &ResourceBundle::getLocale(void) const {
+ static UMutex gLocaleLock;
Mutex lock(&gLocaleLock);
if (fLocale != NULL) {
return *fLocale;
diff --git a/Build/source/libs/icu/icu-src/source/common/resource.h b/Build/source/libs/icu/icu-src/source/common/resource.h
index 3dbff785ef1..5199b858880 100644
--- a/Build/source/libs/icu/icu-src/source/common/resource.h
+++ b/Build/source/libs/icu/icu-src/source/common/resource.h
@@ -28,6 +28,7 @@
#include "unicode/utypes.h"
#include "unicode/unistr.h"
#include "unicode/ures.h"
+#include "restrace.h"
struct ResourceData;
@@ -47,8 +48,10 @@ public:
ResourceArray() : items16(NULL), items32(NULL), length(0) {}
/** Only for implementation use. @internal */
- ResourceArray(const uint16_t *i16, const uint32_t *i32, int32_t len) :
- items16(i16), items32(i32), length(len) {}
+ ResourceArray(const uint16_t *i16, const uint32_t *i32, int32_t len,
+ const ResourceTracer& traceInfo) :
+ items16(i16), items32(i32), length(len),
+ fTraceInfo(traceInfo) {}
/**
* @return The number of items in the array resource.
@@ -68,6 +71,7 @@ private:
const uint16_t *items16;
const uint32_t *items32;
int32_t length;
+ ResourceTracer fTraceInfo;
};
/**
@@ -80,27 +84,37 @@ public:
/** Only for implementation use. @internal */
ResourceTable(const uint16_t *k16, const int32_t *k32,
- const uint16_t *i16, const uint32_t *i32, int32_t len) :
- keys16(k16), keys32(k32), items16(i16), items32(i32), length(len) {}
+ const uint16_t *i16, const uint32_t *i32, int32_t len,
+ const ResourceTracer& traceInfo) :
+ keys16(k16), keys32(k32), items16(i16), items32(i32), length(len),
+ fTraceInfo(traceInfo) {}
/**
* @return The number of items in the array resource.
*/
int32_t getSize() const { return length; }
/**
- * @param i Array item index.
+ * @param i Table item index.
* @param key Output-only, receives the key of the i'th item.
* @param value Output-only, receives the value of the i'th item.
* @return TRUE if i is non-negative and less than getSize().
*/
UBool getKeyAndValue(int32_t i, const char *&key, ResourceValue &value) const;
+ /**
+ * @param key Key string to find in the table.
+ * @param value Output-only, receives the value of the item with that key.
+ * @return TRUE if the table contains the key.
+ */
+ UBool findValue(const char *key, ResourceValue &value) const;
+
private:
const uint16_t *keys16;
const int32_t *keys32;
const uint16_t *items16;
const uint32_t *items32;
int32_t length;
+ ResourceTracer fTraceInfo;
};
/**
diff --git a/Build/source/libs/icu/icu-src/source/common/restrace.cpp b/Build/source/libs/icu/icu-src/source/common/restrace.cpp
new file mode 100644
index 00000000000..5c6498850e2
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/common/restrace.cpp
@@ -0,0 +1,130 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include "unicode/utypes.h"
+
+#if U_ENABLE_TRACING
+
+#include "restrace.h"
+#include "charstr.h"
+#include "cstring.h"
+#include "utracimp.h"
+#include "uresimp.h"
+#include "uassert.h"
+#include "util.h"
+
+U_NAMESPACE_BEGIN
+
+ResourceTracer::~ResourceTracer() = default;
+
+void ResourceTracer::trace(const char* resType) const {
+ U_ASSERT(fResB || fParent);
+ UTRACE_ENTRY(UTRACE_UDATA_RESOURCE);
+ UErrorCode status = U_ZERO_ERROR;
+
+ CharString filePath;
+ getFilePath(filePath, status);
+
+ CharString resPath;
+ getResPath(resPath, status);
+
+ // The longest type ("intvector") is 9 chars
+ const char kSpaces[] = " ";
+ CharString format;
+ format.append(kSpaces, sizeof(kSpaces) - 1 - uprv_strlen(resType), status);
+ format.append("(%s) %s @ %s", status);
+
+ UTRACE_DATA3(UTRACE_VERBOSE,
+ format.data(),
+ resType,
+ filePath.data(),
+ resPath.data());
+ UTRACE_EXIT_STATUS(status);
+}
+
+void ResourceTracer::traceOpen() const {
+ U_ASSERT(fResB);
+ UTRACE_ENTRY(UTRACE_UDATA_BUNDLE);
+ UErrorCode status = U_ZERO_ERROR;
+
+ CharString filePath;
+ UTRACE_DATA1(UTRACE_VERBOSE, "%s", getFilePath(filePath, status).data());
+ UTRACE_EXIT_STATUS(status);
+}
+
+CharString& ResourceTracer::getFilePath(CharString& output, UErrorCode& status) const {
+ if (fResB) {
+ output.append(fResB->fData->fPath, status);
+ output.append('/', status);
+ output.append(fResB->fData->fName, status);
+ output.append(".res", status);
+ } else {
+ fParent->getFilePath(output, status);
+ }
+ return output;
+}
+
+CharString& ResourceTracer::getResPath(CharString& output, UErrorCode& status) const {
+ if (fResB) {
+ output.append('/', status);
+ output.append(fResB->fResPath, status);
+ // removing the trailing /
+ U_ASSERT(output[output.length()-1] == '/');
+ output.truncate(output.length()-1);
+ } else {
+ fParent->getResPath(output, status);
+ }
+ if (fKey) {
+ output.append('/', status);
+ output.append(fKey, status);
+ }
+ if (fIndex != -1) {
+ output.append('[', status);
+ UnicodeString indexString;
+ ICU_Utility::appendNumber(indexString, fIndex);
+ output.appendInvariantChars(indexString, status);
+ output.append(']', status);
+ }
+ return output;
+}
+
+void FileTracer::traceOpen(const char* path, const char* type, const char* name) {
+ if (uprv_strcmp(type, "res") == 0) {
+ traceOpenResFile(path, name);
+ } else {
+ traceOpenDataFile(path, type, name);
+ }
+}
+
+void FileTracer::traceOpenDataFile(const char* path, const char* type, const char* name) {
+ UTRACE_ENTRY(UTRACE_UDATA_DATA_FILE);
+ UErrorCode status = U_ZERO_ERROR;
+
+ CharString filePath;
+ filePath.append(path, status);
+ filePath.append('/', status);
+ filePath.append(name, status);
+ filePath.append('.', status);
+ filePath.append(type, status);
+
+ UTRACE_DATA1(UTRACE_VERBOSE, "%s", filePath.data());
+ UTRACE_EXIT_STATUS(status);
+}
+
+void FileTracer::traceOpenResFile(const char* path, const char* name) {
+ UTRACE_ENTRY(UTRACE_UDATA_RES_FILE);
+ UErrorCode status = U_ZERO_ERROR;
+
+ CharString filePath;
+ filePath.append(path, status);
+ filePath.append('/', status);
+ filePath.append(name, status);
+ filePath.append(".res", status);
+
+ UTRACE_DATA1(UTRACE_VERBOSE, "%s", filePath.data());
+ UTRACE_EXIT_STATUS(status);
+}
+
+U_NAMESPACE_END
+
+#endif // U_ENABLE_TRACING
diff --git a/Build/source/libs/icu/icu-src/source/common/restrace.h b/Build/source/libs/icu/icu-src/source/common/restrace.h
new file mode 100644
index 00000000000..ef29eaed578
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/common/restrace.h
@@ -0,0 +1,147 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#ifndef __RESTRACE_H__
+#define __RESTRACE_H__
+
+#include "unicode/utypes.h"
+
+#if U_ENABLE_TRACING
+
+struct UResourceBundle;
+
+U_NAMESPACE_BEGIN
+
+class CharString;
+
+/**
+ * Instances of this class store information used to trace reads from resource
+ * bundles when ICU is built with --enable-tracing.
+ *
+ * All arguments of type const UResourceBundle*, const char*, and
+ * const ResourceTracer& are stored as pointers. The caller must retain
+ * ownership for the lifetime of this ResourceTracer.
+ *
+ * Exported as U_COMMON_API for Windows because it is a value field
+ * in other exported types.
+ */
+class U_COMMON_API ResourceTracer {
+public:
+ ResourceTracer() :
+ fResB(nullptr),
+ fParent(nullptr),
+ fKey(nullptr),
+ fIndex(-1) {}
+
+ ResourceTracer(const UResourceBundle* resB) :
+ fResB(resB),
+ fParent(nullptr),
+ fKey(nullptr),
+ fIndex(-1) {}
+
+ ResourceTracer(const UResourceBundle* resB, const char* key) :
+ fResB(resB),
+ fParent(nullptr),
+ fKey(key),
+ fIndex(-1) {}
+
+ ResourceTracer(const UResourceBundle* resB, int32_t index) :
+ fResB(resB),
+ fParent(nullptr),
+ fKey(nullptr),
+ fIndex(index) {}
+
+ ResourceTracer(const ResourceTracer& parent, const char* key) :
+ fResB(nullptr),
+ fParent(&parent),
+ fKey(key),
+ fIndex(-1) {}
+
+ ResourceTracer(const ResourceTracer& parent, int32_t index) :
+ fResB(nullptr),
+ fParent(&parent),
+ fKey(nullptr),
+ fIndex(index) {}
+
+ ~ResourceTracer();
+
+ void trace(const char* type) const;
+ void traceOpen() const;
+
+ /**
+ * Calls trace() if the resB or parent provided to the constructor was
+ * non-null; otherwise, does nothing.
+ */
+ void maybeTrace(const char* type) const {
+ if (fResB || fParent) {
+ trace(type);
+ }
+ }
+
+private:
+ const UResourceBundle* fResB;
+ const ResourceTracer* fParent;
+ const char* fKey;
+ int32_t fIndex;
+
+ CharString& getFilePath(CharString& output, UErrorCode& status) const;
+
+ CharString& getResPath(CharString& output, UErrorCode& status) const;
+};
+
+/**
+ * This class provides methods to trace data file reads when ICU is built
+ * with --enable-tracing.
+ */
+class FileTracer {
+public:
+ static void traceOpen(const char* path, const char* type, const char* name);
+
+private:
+ static void traceOpenDataFile(const char* path, const char* type, const char* name);
+ static void traceOpenResFile(const char* path, const char* name);
+};
+
+U_NAMESPACE_END
+
+#else // U_ENABLE_TRACING
+
+U_NAMESPACE_BEGIN
+
+/**
+ * Default trivial implementation when --enable-tracing is not used.
+ */
+class U_COMMON_API ResourceTracer {
+public:
+ ResourceTracer() {}
+
+ ResourceTracer(const void*) {}
+
+ ResourceTracer(const void*, const char*) {}
+
+ ResourceTracer(const void*, int32_t) {}
+
+ ResourceTracer(const ResourceTracer&, const char*) {}
+
+ ResourceTracer(const ResourceTracer&, int32_t) {}
+
+ void trace(const char*) const {}
+
+ void traceOpen() const {}
+
+ void maybeTrace(const char*) const {}
+};
+
+/**
+ * Default trivial implementation when --enable-tracing is not used.
+ */
+class FileTracer {
+public:
+ static void traceOpen(const char*, const char*, const char*) {}
+};
+
+U_NAMESPACE_END
+
+#endif // U_ENABLE_TRACING
+
+#endif //__RESTRACE_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/schriter.cpp b/Build/source/libs/icu/icu-src/source/common/schriter.cpp
index f852800aaae..17b68aee9d9 100644
--- a/Build/source/libs/icu/icu-src/source/common/schriter.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/schriter.cpp
@@ -101,7 +101,7 @@ StringCharacterIterator::operator==(const ForwardCharacterIterator& that) const
&& end == realThat.end;
}
-CharacterIterator*
+StringCharacterIterator*
StringCharacterIterator::clone() const {
return new StringCharacterIterator(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/common/serv.cpp b/Build/source/libs/icu/icu-src/source/common/serv.cpp
index 619e8c7c8bd..ce545b9dbd5 100644
--- a/Build/source/libs/icu/icu-src/source/common/serv.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/serv.cpp
@@ -333,7 +333,7 @@ U_CDECL_END
******************************************************************
*/
-static UMutex lock = U_MUTEX_INITIALIZER;
+static UMutex lock;
ICUService::ICUService()
: name()
diff --git a/Build/source/libs/icu/icu-src/source/common/servls.cpp b/Build/source/libs/icu/icu-src/source/common/servls.cpp
index f4579d0eecd..81dc4f750ea 100644
--- a/Build/source/libs/icu/icu-src/source/common/servls.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/servls.cpp
@@ -26,7 +26,6 @@
U_NAMESPACE_BEGIN
-static UMutex llock = U_MUTEX_INITIALIZER;
ICULocaleService::ICULocaleService()
: fallbackLocale(Locale::getDefault())
{
@@ -264,6 +263,7 @@ ICULocaleService::validateFallbackLocale() const
{
const Locale& loc = Locale::getDefault();
ICULocaleService* ncThis = (ICULocaleService*)this;
+ static UMutex llock;
{
Mutex mutex(&llock);
if (loc != fallbackLocale) {
diff --git a/Build/source/libs/icu/icu-src/source/common/servnotf.cpp b/Build/source/libs/icu/icu-src/source/common/servnotf.cpp
index dc77c7b857d..f577795cae9 100644
--- a/Build/source/libs/icu/icu-src/source/common/servnotf.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/servnotf.cpp
@@ -21,7 +21,7 @@ U_NAMESPACE_BEGIN
EventListener::~EventListener() {}
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(EventListener)
-static UMutex notifyLock = U_MUTEX_INITIALIZER;
+static UMutex notifyLock;
ICUNotifier::ICUNotifier(void)
: listeners(NULL)
diff --git a/Build/source/libs/icu/icu-src/source/common/simpleformatter.cpp b/Build/source/libs/icu/icu-src/source/common/simpleformatter.cpp
index f866e0a1a12..76d8f54efd4 100644
--- a/Build/source/libs/icu/icu-src/source/common/simpleformatter.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/simpleformatter.cpp
@@ -246,15 +246,24 @@ UnicodeString &SimpleFormatter::formatAndReplace(
}
UnicodeString SimpleFormatter::getTextWithNoArguments(
- const UChar *compiledPattern, int32_t compiledPatternLength) {
+ const UChar *compiledPattern,
+ int32_t compiledPatternLength,
+ int32_t* offsets,
+ int32_t offsetsLength) {
+ for (int32_t i = 0; i < offsetsLength; i++) {
+ offsets[i] = -1;
+ }
int32_t capacity = compiledPatternLength - 1 -
getArgumentLimit(compiledPattern, compiledPatternLength);
UnicodeString sb(capacity, 0, 0); // Java: StringBuilder
for (int32_t i = 1; i < compiledPatternLength;) {
- int32_t segmentLength = compiledPattern[i++] - ARG_NUM_LIMIT;
- if (segmentLength > 0) {
- sb.append(compiledPattern + i, segmentLength);
- i += segmentLength;
+ int32_t n = compiledPattern[i++];
+ if (n > ARG_NUM_LIMIT) {
+ n -= ARG_NUM_LIMIT;
+ sb.append(compiledPattern + i, n);
+ i += n;
+ } else if (n < offsetsLength) {
+ offsets[n] = sb.length();
}
}
return sb;
diff --git a/Build/source/libs/icu/icu-src/source/common/static_unicode_sets.cpp b/Build/source/libs/icu/icu-src/source/common/static_unicode_sets.cpp
index 5d598a0e33b..5dab3931a70 100644
--- a/Build/source/libs/icu/icu-src/source/common/static_unicode_sets.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/static_unicode_sets.cpp
@@ -23,7 +23,7 @@ using namespace icu::unisets;
namespace {
-UnicodeSet* gUnicodeSets[COUNT] = {};
+UnicodeSet* gUnicodeSets[UNISETS_KEY_COUNT] = {};
// Save the empty instance in static memory to have well-defined behavior if a
// regular UnicodeSet cannot be allocated.
@@ -97,14 +97,28 @@ class ParseDataSink : public ResourceSink {
saveSet(isLenient ? COMMA : STRICT_COMMA, str, status);
} else if (str.indexOf(u'+') != -1) {
saveSet(PLUS_SIGN, str, status);
- } else if (str.indexOf(u'‒') != -1) {
+ } else if (str.indexOf(u'-') != -1) {
saveSet(MINUS_SIGN, str, status);
} else if (str.indexOf(u'$') != -1) {
saveSet(DOLLAR_SIGN, str, status);
} else if (str.indexOf(u'£') != -1) {
saveSet(POUND_SIGN, str, status);
- } else if (str.indexOf(u'₨') != -1) {
+ } else if (str.indexOf(u'₹') != -1) {
saveSet(RUPEE_SIGN, str, status);
+ } else if (str.indexOf(u'¥') != -1) {
+ saveSet(YEN_SIGN, str, status);
+ } else if (str.indexOf(u'₩') != -1) {
+ saveSet(WON_SIGN, str, status);
+ } else if (str.indexOf(u'%') != -1) {
+ saveSet(PERCENT_SIGN, str, status);
+ } else if (str.indexOf(u'‰') != -1) {
+ saveSet(PERMILLE_SIGN, str, status);
+ } else if (str.indexOf(u'’') != -1) {
+ saveSet(APOSTROPHE_SIGN, str, status);
+ } else {
+ // Unknown class of parse lenients
+ // TODO(ICU-20428): Make ICU automatically accept new classes?
+ U_ASSERT(FALSE);
}
if (U_FAILURE(status)) { return; }
}
@@ -122,7 +136,7 @@ UBool U_CALLCONV cleanupNumberParseUniSets() {
reinterpret_cast<UnicodeSet*>(gEmptyUnicodeSet)->~UnicodeSet();
gEmptyUnicodeSetInitialized = FALSE;
}
- for (int32_t i = 0; i < COUNT; i++) {
+ for (int32_t i = 0; i < UNISETS_KEY_COUNT; i++) {
delete gUnicodeSets[i];
gUnicodeSets[i] = nullptr;
}
@@ -155,27 +169,35 @@ void U_CALLCONV initNumberParseUniSets(UErrorCode& status) {
U_ASSERT(gUnicodeSets[STRICT_COMMA] != nullptr);
U_ASSERT(gUnicodeSets[PERIOD] != nullptr);
U_ASSERT(gUnicodeSets[STRICT_PERIOD] != nullptr);
+ U_ASSERT(gUnicodeSets[APOSTROPHE_SIGN] != nullptr);
- gUnicodeSets[OTHER_GROUPING_SEPARATORS] = new UnicodeSet(
- u"['٬‘’'\\u0020\\u00A0\\u2000-\\u200A\\u202F\\u205F\\u3000]", status);
+ LocalPointer<UnicodeSet> otherGrouping(new UnicodeSet(
+ u"[٬‘\\u0020\\u00A0\\u2000-\\u200A\\u202F\\u205F\\u3000]",
+ status
+ ), status);
+ if (U_FAILURE(status)) { return; }
+ otherGrouping->addAll(*gUnicodeSets[APOSTROPHE_SIGN]);
+ gUnicodeSets[OTHER_GROUPING_SEPARATORS] = otherGrouping.orphan();
gUnicodeSets[ALL_SEPARATORS] = computeUnion(COMMA, PERIOD, OTHER_GROUPING_SEPARATORS);
gUnicodeSets[STRICT_ALL_SEPARATORS] = computeUnion(
STRICT_COMMA, STRICT_PERIOD, OTHER_GROUPING_SEPARATORS);
U_ASSERT(gUnicodeSets[MINUS_SIGN] != nullptr);
U_ASSERT(gUnicodeSets[PLUS_SIGN] != nullptr);
+ U_ASSERT(gUnicodeSets[PERCENT_SIGN] != nullptr);
+ U_ASSERT(gUnicodeSets[PERMILLE_SIGN] != nullptr);
- gUnicodeSets[PERCENT_SIGN] = new UnicodeSet(u"[%٪]", status);
- gUnicodeSets[PERMILLE_SIGN] = new UnicodeSet(u"[‰؉]", status);
- gUnicodeSets[INFINITY_KEY] = new UnicodeSet(u"[∞]", status);
+ gUnicodeSets[INFINITY_SIGN] = new UnicodeSet(u"[∞]", status);
+ if (U_FAILURE(status)) { return; }
U_ASSERT(gUnicodeSets[DOLLAR_SIGN] != nullptr);
U_ASSERT(gUnicodeSets[POUND_SIGN] != nullptr);
U_ASSERT(gUnicodeSets[RUPEE_SIGN] != nullptr);
- gUnicodeSets[YEN_SIGN] = new UnicodeSet(u"[¥\\uffe5]", status);
+ U_ASSERT(gUnicodeSets[YEN_SIGN] != nullptr);
+ U_ASSERT(gUnicodeSets[WON_SIGN] != nullptr);
gUnicodeSets[DIGITS] = new UnicodeSet(u"[:digit:]", status);
-
+ if (U_FAILURE(status)) { return; }
gUnicodeSets[DIGITS_OR_ALL_SEPARATORS] = computeUnion(DIGITS, ALL_SEPARATORS);
gUnicodeSets[DIGITS_OR_STRICT_ALL_SEPARATORS] = computeUnion(DIGITS, STRICT_ALL_SEPARATORS);
diff --git a/Build/source/libs/icu/icu-src/source/common/static_unicode_sets.h b/Build/source/libs/icu/icu-src/source/common/static_unicode_sets.h
index 5f18b3217ea..5d90ce5908d 100644
--- a/Build/source/libs/icu/icu-src/source/common/static_unicode_sets.h
+++ b/Build/source/libs/icu/icu-src/source/common/static_unicode_sets.h
@@ -1,7 +1,17 @@
// © 2018 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
+// This file contains utilities to deal with static-allocated UnicodeSets.
+//
+// Common use case: you write a "private static final" UnicodeSet in Java, and
+// want something similarly easy in C++. Originally written for number
+// parsing, but this header can be used for other applications.
+//
+// Main entrypoint: `unisets::get(unisets::MY_SET_ID_HERE)`
+//
// This file is in common instead of i18n because it is needed by ucurr.cpp.
+//
+// Author: sffc
#include "unicode/utypes.h"
@@ -35,6 +45,7 @@ enum Key {
PERIOD,
STRICT_COMMA,
STRICT_PERIOD,
+ APOSTROPHE_SIGN,
OTHER_GROUPING_SEPARATORS,
ALL_SEPARATORS,
STRICT_ALL_SEPARATORS,
@@ -44,13 +55,14 @@ enum Key {
PLUS_SIGN,
PERCENT_SIGN,
PERMILLE_SIGN,
- INFINITY_KEY, // INFINITY is defined in cmath
+ INFINITY_SIGN,
// Currency Symbols
DOLLAR_SIGN,
POUND_SIGN,
RUPEE_SIGN,
- YEN_SIGN, // not in CLDR data, but Currency.java wants it
+ YEN_SIGN,
+ WON_SIGN,
// Other
DIGITS,
@@ -60,7 +72,7 @@ enum Key {
DIGITS_OR_STRICT_ALL_SEPARATORS,
// The number of elements in the enum.
- COUNT
+ UNISETS_KEY_COUNT
};
/**
@@ -69,6 +81,13 @@ enum Key {
*
* Exported as U_COMMON_API for ucurr.cpp
*
+ * This method is always safe and OK to chain: in the case of a memory or other
+ * error, it returns an empty set from static memory.
+ *
+ * Example:
+ *
+ * UBool hasIgnorables = unisets::get(unisets::DEFAULT_IGNORABLES)->contains(...);
+ *
* @param key The desired UnicodeSet according to the enum in this file.
* @return The requested UnicodeSet. Guaranteed to be frozen and non-null, but
* may be empty if an error occurred during data loading.
@@ -99,6 +118,7 @@ U_COMMON_API Key chooseFrom(UnicodeString str, Key key1);
*/
U_COMMON_API Key chooseFrom(UnicodeString str, Key key1, Key key2);
+// TODO: Load these from data: ICU-20108
// Unused in C++:
// Key chooseCurrency(UnicodeString str);
// Used instead:
@@ -108,8 +128,9 @@ static const struct {
} kCurrencyEntries[] = {
{DOLLAR_SIGN, u'$'},
{POUND_SIGN, u'£'},
- {RUPEE_SIGN, u'₨'},
+ {RUPEE_SIGN, u'₹'},
{YEN_SIGN, u'¥'},
+ {WON_SIGN, u'₩'},
};
} // namespace unisets
diff --git a/Build/source/libs/icu/icu-src/source/common/uarrsort.cpp b/Build/source/libs/icu/icu-src/source/common/uarrsort.cpp
index 03c4d4e7fc4..60905821649 100644
--- a/Build/source/libs/icu/icu-src/source/common/uarrsort.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uarrsort.cpp
@@ -34,6 +34,10 @@ enum {
STACK_ITEM_SIZE=200
};
+static constexpr int32_t sizeInMaxAlignTs(int32_t sizeInBytes) {
+ return (sizeInBytes + sizeof(max_align_t) - 1) / sizeof(max_align_t);
+}
+
/* UComparator convenience implementations ---------------------------------- */
U_CAPI int32_t U_EXPORT2
@@ -134,25 +138,15 @@ doInsertionSort(char *array, int32_t length, int32_t itemSize,
static void
insertionSort(char *array, int32_t length, int32_t itemSize,
UComparator *cmp, const void *context, UErrorCode *pErrorCode) {
- UAlignedMemory v[STACK_ITEM_SIZE/sizeof(UAlignedMemory)+1];
- void *pv;
- /* allocate an intermediate item variable (v) */
- if(itemSize<=STACK_ITEM_SIZE) {
- pv=v;
- } else {
- pv=uprv_malloc(itemSize);
- if(pv==NULL) {
- *pErrorCode=U_MEMORY_ALLOCATION_ERROR;
- return;
- }
+ icu::MaybeStackArray<max_align_t, sizeInMaxAlignTs(STACK_ITEM_SIZE)> v;
+ if (sizeInMaxAlignTs(itemSize) > v.getCapacity() &&
+ v.resize(sizeInMaxAlignTs(itemSize)) == nullptr) {
+ *pErrorCode = U_MEMORY_ALLOCATION_ERROR;
+ return;
}
- doInsertionSort(array, length, itemSize, cmp, context, pv);
-
- if(pv!=v) {
- uprv_free(pv);
- }
+ doInsertionSort(array, length, itemSize, cmp, context, v.getAlias());
}
/* QuickSort ---------------------------------------------------------------- */
@@ -238,26 +232,16 @@ subQuickSort(char *array, int32_t start, int32_t limit, int32_t itemSize,
static void
quickSort(char *array, int32_t length, int32_t itemSize,
UComparator *cmp, const void *context, UErrorCode *pErrorCode) {
- UAlignedMemory xw[(2*STACK_ITEM_SIZE)/sizeof(UAlignedMemory)+1];
- void *p;
-
/* allocate two intermediate item variables (x and w) */
- if(itemSize<=STACK_ITEM_SIZE) {
- p=xw;
- } else {
- p=uprv_malloc(2*itemSize);
- if(p==NULL) {
- *pErrorCode=U_MEMORY_ALLOCATION_ERROR;
- return;
- }
+ icu::MaybeStackArray<max_align_t, sizeInMaxAlignTs(STACK_ITEM_SIZE) * 2> xw;
+ if(sizeInMaxAlignTs(itemSize)*2 > xw.getCapacity() &&
+ xw.resize(sizeInMaxAlignTs(itemSize) * 2) == nullptr) {
+ *pErrorCode=U_MEMORY_ALLOCATION_ERROR;
+ return;
}
- subQuickSort(array, 0, length, itemSize,
- cmp, context, p, (char *)p+itemSize);
-
- if(p!=xw) {
- uprv_free(p);
- }
+ subQuickSort(array, 0, length, itemSize, cmp, context,
+ xw.getAlias(), xw.getAlias() + sizeInMaxAlignTs(itemSize));
}
/* uprv_sortArray() API ----------------------------------------------------- */
diff --git a/Build/source/libs/icu/icu-src/source/common/uassert.h b/Build/source/libs/icu/icu-src/source/common/uassert.h
index fd6b6c4c013..f0f7a92574b 100644
--- a/Build/source/libs/icu/icu-src/source/common/uassert.h
+++ b/Build/source/libs/icu/icu-src/source/common/uassert.h
@@ -10,25 +10,40 @@
*
* File uassert.h
*
-* Contains U_ASSERT macro
-*
-* By default, U_ASSERT just wraps the C library assert macro.
-* By changing the definition here, the assert behavior for ICU can be changed
-* without affecting other non-ICU uses of the C library assert().
+* Contains the U_ASSERT and UPRV_UNREACHABLE macros
*
******************************************************************************
*/
-
#ifndef U_ASSERT_H
#define U_ASSERT_H
+
/* utypes.h is included to get the proper define for uint8_t */
#include "unicode/utypes.h"
+/* for abort */
+#include <stdlib.h>
+
+/**
+ * \def U_ASSERT
+ * By default, U_ASSERT just wraps the C library assert macro.
+ * By changing the definition here, the assert behavior for ICU can be changed
+ * without affecting other non - ICU uses of the C library assert().
+*/
#if U_DEBUG
# include <assert.h>
# define U_ASSERT(exp) assert(exp)
#else
# define U_ASSERT(exp)
#endif
-#endif
+/**
+ * \def UPRV_UNREACHABLE
+ * This macro is used to unconditionally abort if unreachable code is ever executed.
+ * @internal
+*/
+#if defined(UPRV_UNREACHABLE)
+ // Use the predefined value.
+#else
+# define UPRV_UNREACHABLE abort()
+#endif
+#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/ubidi.cpp b/Build/source/libs/icu/icu-src/source/common/ubidi.cpp
index 4b65d491859..3ddb45721e2 100644
--- a/Build/source/libs/icu/icu-src/source/common/ubidi.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ubidi.cpp
@@ -2047,8 +2047,7 @@ processPropertySeq(UBiDi *pBiDi, LevState *pLevState, uint8_t _prop,
break;
default: /* we should never get here */
- U_ASSERT(FALSE);
- break;
+ UPRV_UNREACHABLE;
}
}
if((addLevel) || (start < start0)) {
@@ -2251,8 +2250,7 @@ resolveImplicitLevels(UBiDi *pBiDi,
start2=i;
break;
default: /* we should never get here */
- U_ASSERT(FALSE);
- break;
+ UPRV_UNREACHABLE;
}
}
}
@@ -2726,8 +2724,7 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length,
break;
default:
/* we should never get here */
- U_ASSERT(FALSE);
- break;
+ UPRV_UNREACHABLE;
}
/*
* If there are no external levels specified and there
diff --git a/Build/source/libs/icu/icu-src/source/common/ubidi_props_data.h b/Build/source/libs/icu/icu-src/source/common/ubidi_props_data.h
index 55e331b612e..70083892048 100644
--- a/Build/source/libs/icu/icu-src/source/common/ubidi_props_data.h
+++ b/Build/source/libs/icu/icu-src/source/common/ubidi_props_data.h
@@ -11,539 +11,539 @@
#ifdef INCLUDED_FROM_UBIDI_PROPS_C
-static const UVersionInfo ubidi_props_dataVersion={0xb,0,0,0};
+static const UVersionInfo ubidi_props_dataVersion={0xc,1,0,0};
-static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x647c,0x5e98,0x28,0x620,0x8c0,0x10ac0,0x10d24,0,0,0,0,0,0,0,0x6502b6};
+static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x663c,0x6058,0x28,0x620,0x8c0,0x10ac0,0x10d24,0,0,0,0,0,0,0,0x6502b6};
-static const uint16_t ubidi_props_trieIndex[12100]={
-0x36f,0x377,0x37f,0x387,0x39f,0x3a7,0x3af,0x3b7,0x38f,0x397,0x38f,0x397,0x38f,0x397,0x38f,0x397,
-0x38f,0x397,0x38f,0x397,0x3bd,0x3c5,0x3cd,0x3d5,0x3dd,0x3e5,0x3e1,0x3e9,0x3f1,0x3f9,0x3f4,0x3fc,
-0x38f,0x397,0x38f,0x397,0x404,0x40c,0x38f,0x397,0x38f,0x397,0x38f,0x397,0x412,0x41a,0x422,0x42a,
-0x432,0x43a,0x442,0x44a,0x450,0x458,0x460,0x468,0x470,0x478,0x47e,0x486,0x48e,0x496,0x49e,0x4a6,
-0x4b2,0x4ae,0x4ba,0x4c2,0x424,0x4d2,0x4da,0x4ca,0x4e2,0x4e4,0x4ec,0x4f4,0x4fc,0x4fd,0x505,0x50d,
-0x515,0x4fd,0x51d,0x522,0x515,0x4fd,0x52a,0x532,0x4fc,0x53a,0x542,0x4f4,0x547,0x38f,0x54f,0x553,
-0x55b,0x55d,0x565,0x56d,0x4fc,0x575,0x57d,0x4f4,0x406,0x581,0x505,0x4f4,0x38f,0x38f,0x589,0x38f,
-0x38f,0x58f,0x597,0x38f,0x38f,0x59b,0x5a3,0x38f,0x5a7,0x5ae,0x38f,0x5b6,0x5be,0x5c5,0x546,0x38f,
-0x38f,0x5cd,0x5d5,0x5dd,0x5e5,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x5ed,0x38f,0x5f5,0x38f,0x38f,0x38f,
-0x5fd,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x605,0x38f,0x38f,0x38f,0x60d,0x60d,0x509,0x509,0x38f,0x613,0x61b,0x5f5,
-0x631,0x623,0x623,0x639,0x640,0x629,0x38f,0x38f,0x38f,0x648,0x650,0x38f,0x38f,0x38f,0x652,0x65a,
-0x662,0x38f,0x669,0x671,0x38f,0x679,0x38f,0x38f,0x539,0x681,0x547,0x689,0x406,0x691,0x38f,0x698,
-0x38f,0x69d,0x38f,0x38f,0x38f,0x38f,0x6a3,0x6ab,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x3dd,0x6b3,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x6bb,0x6c3,0x6c7,
-0x6df,0x6e5,0x6cf,0x6d7,0x6ed,0x6f5,0x6f9,0x5c8,0x701,0x709,0x711,0x38f,0x719,0x65a,0x65a,0x65a,
-0x729,0x731,0x739,0x741,0x746,0x74e,0x756,0x721,0x75e,0x766,0x38f,0x76c,0x773,0x65a,0x65a,0x65a,
-0x65a,0x573,0x779,0x65a,0x781,0x38f,0x38f,0x657,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,
-0x65a,0x65a,0x65a,0x65a,0x65a,0x789,0x65a,0x65a,0x65a,0x65a,0x65a,0x78f,0x65a,0x65a,0x797,0x79f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x65a,0x65a,0x65a,0x65a,0x7af,0x7b7,0x7bf,0x7a7,
-0x7cf,0x7d7,0x7df,0x7e6,0x7ed,0x7f5,0x7f9,0x7c7,0x65a,0x65a,0x65a,0x801,0x807,0x65a,0x80d,0x810,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x818,0x38f,0x38f,0x38f,0x820,0x38f,0x38f,0x38f,0x3dd,
-0x828,0x830,0x835,0x38f,0x83d,0x65a,0x65a,0x65d,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x844,0x84a,
-0x85a,0x852,0x38f,0x38f,0x862,0x5fd,0x38f,0x3b6,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x65a,0x81f,
-0x3c4,0x38f,0x839,0x86a,0x38f,0x872,0x87a,0x38f,0x38f,0x38f,0x38f,0x87e,0x38f,0x38f,0x652,0x3b5,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x65a,0x65a,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x839,0x65a,0x573,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x885,0x38f,0x38f,0x88a,0x55d,0x38f,0x38f,0x5a9,0x65a,0x651,0x38f,0x38f,0x892,0x38f,0x38f,0x38f,
-0x89a,0x8a1,0x623,0x8a9,0x38f,0x38f,0x57f,0x8b1,0x38f,0x8b9,0x8c0,0x38f,0x4e2,0x8c5,0x38f,0x4fb,
-0x38f,0x8cd,0x8d5,0x4fd,0x38f,0x8d9,0x4fc,0x8e1,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x8e8,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x8fc,0x8f0,0x8f4,0x48e,0x48e,0x48e,0x48e,0x48e,
-0x48e,0x48e,0x48e,0x48e,0x48e,0x48e,0x48e,0x48e,0x48e,0x904,0x48e,0x48e,0x48e,0x48e,0x90c,0x910,
-0x918,0x920,0x924,0x92c,0x48e,0x48e,0x48e,0x930,0x938,0x37f,0x940,0x948,0x38f,0x38f,0x38f,0x950,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0xe3c,0xe3c,0xe7c,0xebc,0xe3c,0xe3c,0xe3c,0xe3c,0xe3c,0xe3c,0xef4,0xf34,0xf74,0xf84,0xfc4,0xfd0,
-0xe3c,0xe3c,0x1010,0xe3c,0xe3c,0xe3c,0x1048,0x1088,0x10c8,0x1108,0x1140,0x1180,0x11c0,0x11f8,0x1238,0x1278,
-0xa40,0xa80,0xac0,0xaff,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb37,0x1a0,0x1a0,
-0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb74,0x1a0,0x1a0,0xba9,0xbe9,0xc29,0xc69,0xca9,0xce9,
+static const uint16_t ubidi_props_trieIndex[12324]={
+0x37c,0x384,0x38c,0x394,0x3ac,0x3b4,0x3bc,0x3c4,0x39c,0x3a4,0x39c,0x3a4,0x39c,0x3a4,0x39c,0x3a4,
+0x39c,0x3a4,0x39c,0x3a4,0x3ca,0x3d2,0x3da,0x3e2,0x3ea,0x3f2,0x3ee,0x3f6,0x3fe,0x406,0x401,0x409,
+0x39c,0x3a4,0x39c,0x3a4,0x411,0x419,0x39c,0x3a4,0x39c,0x3a4,0x39c,0x3a4,0x41f,0x427,0x42f,0x437,
+0x43f,0x447,0x44f,0x457,0x45d,0x465,0x46d,0x475,0x47d,0x485,0x48b,0x493,0x49b,0x4a3,0x4ab,0x4b3,
+0x4bf,0x4bb,0x4c7,0x4cf,0x431,0x4df,0x4e7,0x4d7,0x4ef,0x4f1,0x4f9,0x501,0x509,0x50a,0x512,0x51a,
+0x522,0x50a,0x52a,0x52f,0x522,0x50a,0x537,0x53f,0x509,0x547,0x54f,0x501,0x554,0x39c,0x55c,0x560,
+0x568,0x56a,0x572,0x57a,0x509,0x582,0x58a,0x501,0x413,0x58e,0x512,0x501,0x39c,0x39c,0x596,0x39c,
+0x39c,0x59c,0x5a4,0x39c,0x39c,0x5a8,0x5b0,0x39c,0x5b4,0x5bb,0x39c,0x5c3,0x5cb,0x5d2,0x553,0x39c,
+0x39c,0x5da,0x5e2,0x5ea,0x5f2,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x5fa,0x39c,0x602,0x39c,0x39c,0x39c,
+0x60a,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x612,0x39c,0x39c,0x39c,0x61a,0x61a,0x516,0x516,0x39c,0x620,0x628,0x602,
+0x63e,0x630,0x630,0x646,0x64d,0x636,0x39c,0x39c,0x39c,0x655,0x65d,0x39c,0x39c,0x39c,0x65f,0x667,
+0x66f,0x39c,0x676,0x67e,0x39c,0x686,0x39c,0x39c,0x546,0x68e,0x554,0x696,0x413,0x69e,0x39c,0x6a5,
+0x39c,0x6aa,0x39c,0x39c,0x39c,0x39c,0x6b0,0x6b8,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x3ea,0x6c0,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x6c8,0x6d0,0x6d4,
+0x6ec,0x6f2,0x6dc,0x6e4,0x6fa,0x702,0x706,0x5d5,0x70e,0x716,0x71e,0x39c,0x726,0x667,0x667,0x667,
+0x736,0x73e,0x746,0x74e,0x753,0x75b,0x763,0x72e,0x76b,0x773,0x39c,0x779,0x780,0x667,0x667,0x667,
+0x667,0x580,0x786,0x667,0x78e,0x39c,0x39c,0x664,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,
+0x667,0x667,0x667,0x667,0x667,0x796,0x667,0x667,0x667,0x667,0x667,0x79c,0x667,0x667,0x7a4,0x7ac,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x667,0x667,0x667,0x667,0x7bc,0x7c4,0x7cc,0x7b4,
+0x7dc,0x7e4,0x7ec,0x7f3,0x7fa,0x802,0x806,0x7d4,0x667,0x667,0x667,0x80e,0x814,0x667,0x667,0x81a,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x822,0x39c,0x39c,0x39c,0x82a,0x39c,0x39c,0x39c,0x3ea,
+0x832,0x83a,0x66b,0x39c,0x83d,0x667,0x667,0x66a,0x667,0x667,0x667,0x667,0x667,0x667,0x844,0x84a,
+0x85a,0x852,0x39c,0x39c,0x862,0x60a,0x39c,0x3c3,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x667,0x829,
+0x3d1,0x39c,0x86a,0x872,0x39c,0x87a,0x882,0x39c,0x39c,0x39c,0x39c,0x886,0x39c,0x39c,0x65f,0x3c2,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x667,0x667,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x86a,0x667,0x580,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x88d,0x39c,0x39c,0x892,0x56a,0x39c,0x39c,0x5b6,0x667,0x65e,0x39c,0x39c,0x89a,0x39c,0x39c,0x39c,
+0x8a2,0x8a9,0x630,0x8b1,0x39c,0x39c,0x58c,0x8b9,0x39c,0x8c1,0x8c8,0x39c,0x4ef,0x8cd,0x39c,0x508,
+0x39c,0x8d5,0x8dd,0x50a,0x39c,0x8e1,0x509,0x8e9,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x8f0,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x904,0x8f8,0x8fc,0x49b,0x49b,0x49b,0x49b,0x49b,
+0x49b,0x49b,0x49b,0x49b,0x49b,0x49b,0x49b,0x49b,0x49b,0x90c,0x49b,0x49b,0x49b,0x49b,0x914,0x918,
+0x920,0x928,0x92c,0x934,0x49b,0x49b,0x49b,0x938,0x940,0x38c,0x948,0x950,0x39c,0x39c,0x39c,0x958,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0xe70,0xe70,0xeb0,0xef0,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xf28,0xf68,0xfa8,0xfb8,0xff8,0x1004,
+0xe70,0xe70,0x1044,0xe70,0xe70,0xe70,0x107c,0x10bc,0x10fc,0x113c,0x1174,0x11b4,0x11f4,0x122c,0x126c,0x12ac,
+0xa40,0xa80,0xac0,0xaff,0x1a0,0x1a0,0xb3f,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb68,0x1a0,0x1a0,
+0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xba8,0x1a0,0x1a0,0xbdd,0xc1d,0xc5d,0xc9d,0xcdd,0xd1d,
0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,
-0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29,
+0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d,
0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,
-0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29,
+0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d,
0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,
-0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29,
+0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d,
0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,
-0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29,
+0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d,
0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,
-0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29,
+0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d,
0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,
-0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29,
+0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d,
0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,
-0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29,
+0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d,
0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,
-0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29,
+0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d,
0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,
-0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29,
+0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d,
0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,
-0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29,
+0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d,
0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,
-0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29,
+0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d,
0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,
-0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29,
-0xd69,0xd79,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,
-0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29,
+0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d,
+0xd9d,0xdad,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,
+0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d,
0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,
-0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29,
+0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d,
0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,
-0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x958,0x38f,0x65a,0x65a,0x960,0x5fd,0x38f,0x4f5,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x968,0x38f,0x38f,0x38f,0x96f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x977,0x424,0x424,0x424,0x424,0x424,0x424,0x424,
-0x97f,0x983,0x424,0x424,0x424,0x424,0x993,0x98b,0x424,0x99b,0x424,0x424,0x9a3,0x9a9,0x424,0x424,
-0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x9b9,0x9b1,0x424,0x424,0x424,0x424,0x424,0x424,
-0x424,0x424,0x424,0x9c1,0x424,0x424,0x424,0x424,0x424,0x9c9,0x9d0,0x9d6,0x424,0x424,0x424,0x424,
-0x4fc,0x9de,0x9e5,0x9ec,0x406,0x9ef,0x38f,0x38f,0x4e2,0x9f6,0x38f,0x9fc,0x406,0xa01,0xa09,0x38f,
-0x38f,0xa0e,0x38f,0x38f,0x38f,0x38f,0x820,0xa16,0x406,0x581,0x55c,0xa1d,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x9de,0xa25,0x38f,0x38f,0xa2d,0xa35,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xa39,0xa41,0x38f,
-0x38f,0xa49,0x55c,0xa51,0x38f,0xa57,0x38f,0x38f,0x5ed,0xa5f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0xa64,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xa6c,
-0xa70,0xa78,0x38f,0xa7f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0xa86,0x38f,0x38f,0xa94,0xa8e,0x38f,0x38f,0x38f,0xa9c,0xaa4,0x38f,0xaa8,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x583,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xaae,0x38f,
-0xab4,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0xaba,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x516,0xac2,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0xac9,0xad1,0xad7,0x38f,0x38f,0x65a,0x65a,0xadf,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x65a,0x65a,0x833,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xae1,
-0x38f,0xae8,0x38f,0xae4,0x38f,0xaeb,0x38f,0xaf3,0xaf7,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x3dd,0xaff,0x3dd,0xb06,0xb0d,0xb15,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xb1d,0xb25,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x424,0x424,0x424,0x424,0x424,0x424,0xb2d,
-0x424,0xb35,0xb35,0xb3c,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,
-0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x8f4,0x48e,0x48e,0x424,
-0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x48e,0x48e,0x48e,0x48e,0x48e,0x48e,0x48e,
-0xb44,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x65a,0xb4c,0x65a,0x65a,0x65d,0xb51,0xb55,
-0x844,0xb5d,0x3b1,0x38f,0xb63,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x76a,0x38f,0x38f,0x38f,
-0x38f,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,
-0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0xb6b,
-0xb73,0x65a,0x65a,0x65a,0x65d,0x65a,0x65a,0xb7b,0x38f,0xb4c,0x65a,0xb83,0x65a,0xb8b,0x846,0x38f,
-0x38f,0xb4c,0xb8f,0x65a,0xb97,0x65a,0xb9f,0xba7,0x65a,0x38f,0x38f,0x38f,0x846,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xbaf,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,
-0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xbaf,0xbbf,0xbb7,0xbb7,0xbb7,0xbc0,0xbc0,0xbc0,
-0xbc0,0x3dd,0x3dd,0x3dd,0x3dd,0x3dd,0x3dd,0x3dd,0xbc8,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,
-0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,
-0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,
-0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,
-0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0x36e,0x36e,0x36e,0x12,0x12,0x12,0x12,
-0x12,0x12,0x12,0x12,0x12,8,7,8,9,7,0x12,0x12,0x12,0x12,0x12,0x12,
-0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,7,7,7,8,9,0xa,0xa,4,
-4,4,0xa,0xa,0x310a,0xf20a,0xa,3,6,3,6,6,2,2,2,2,
-2,2,2,2,2,2,6,0xa,0x500a,0xa,0xd00a,0xa,0xa,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0x510a,0xa,0xd20a,0xa,0xa,0xa,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0x510a,0xa,0xd20a,0xa,0x12,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0x12,0x12,0x12,0x12,
-0x12,7,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
-0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,6,0xa,4,4,
-4,4,0xa,0xa,0xa,0xa,0,0x900a,0xa,0xb2,0xa,0xa,4,4,2,2,
-0xa,0,0xa,0xa,0xa,2,0,0x900a,0xa,0xa,0xa,0xa,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0xa,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0xa,0,0,0,0,0,0,0,0,0,0,0,0,
+0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x960,0x39c,0x667,0x667,0x968,0x60a,0x39c,0x502,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x970,0x39c,0x39c,0x39c,0x977,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x97f,0x431,0x431,0x431,0x431,0x431,0x431,0x431,
+0x987,0x98b,0x431,0x431,0x431,0x431,0x99b,0x993,0x431,0x9a3,0x431,0x431,0x9ab,0x9b1,0x431,0x431,
+0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x9c1,0x9b9,0x431,0x431,0x431,0x431,0x431,0x431,
+0x431,0x431,0x431,0x9c9,0x431,0x431,0x431,0x431,0x431,0x9d1,0x9d8,0x9de,0x431,0x431,0x431,0x431,
+0x509,0x9e6,0x9ed,0x9f4,0x413,0x9f7,0x39c,0x39c,0x4ef,0x9fe,0x39c,0xa04,0x413,0xa09,0xa11,0x39c,
+0x39c,0xa16,0x39c,0x39c,0x39c,0x39c,0x82a,0xa1e,0x413,0x58e,0x569,0xa25,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x9e6,0xa2d,0x39c,0x39c,0xa35,0xa3d,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xa41,0xa49,0x39c,
+0x39c,0xa51,0x569,0xa59,0x39c,0xa5f,0x39c,0x39c,0x5fa,0xa67,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0xa6c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xa73,0x569,0xa7b,
+0xa7f,0xa87,0x39c,0xa8e,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0xa95,0x39c,0x39c,0xaa3,0xa9d,0x39c,0x39c,0x39c,0xaab,0xab3,0x39c,0xab7,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x590,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xac4,0xabf,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0xacc,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xad3,
+0x39c,0xad9,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0xa05,0x39c,0xadf,0x39c,0x39c,0xae7,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x523,0xaef,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xaf6,0xafe,0xb04,0x39c,0x39c,0x667,0x667,0xb0c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x667,0x667,0xb14,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0xb1a,0x39c,0xb21,0x39c,0xb1d,0x39c,0xb24,0x39c,0xb2c,0xb30,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x3ea,0xb38,0x3ea,
+0xb3f,0xb46,0xb4e,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xb56,0xb5e,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xad9,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0xb63,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x431,0x431,0x431,
+0x431,0x431,0x431,0xb6b,0x431,0xb73,0xb73,0xb7a,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,
+0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,
+0x8fc,0x49b,0x49b,0x431,0x431,0x49b,0x49b,0x9de,0x431,0x431,0x431,0x431,0x431,0x49b,0x49b,0x49b,
+0x49b,0x49b,0x49b,0x49b,0xb82,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x667,0xb8a,0x667,
+0x667,0x66a,0xb8f,0xb93,0x844,0xb9b,0x3be,0x39c,0xba1,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x777,0x39c,0x39c,0x39c,0x39c,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,
+0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,
+0x667,0x667,0x667,0x844,0xba9,0x667,0x667,0x667,0x66a,0x667,0x667,0xbb1,0x66c,0xb8a,0x667,0xbb9,
+0x667,0xbc1,0x846,0x39c,0x39c,0x796,0x667,0x667,0xbc5,0x667,0xbcd,0xbd3,0x667,0x667,0x667,0x66a,
+0xbd8,0xbe7,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xbdf,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xbdf,0xbf7,0xbef,0xbef,
+0xbef,0xbf8,0xbf8,0xbf8,0xbf8,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0xc00,0xbf8,0xbf8,0xbf8,
+0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,
+0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,
+0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,
+0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0x37b,0x37b,0x37b,
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,8,7,8,9,7,0x12,0x12,
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,7,7,7,8,
+9,0xa,0xa,4,4,4,0xa,0xa,0x310a,0xf20a,0xa,3,6,3,6,6,
+2,2,2,2,2,2,2,2,2,2,6,0xa,0x500a,0xa,0xd00a,0xa,
+0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0x510a,0xa,0xd20a,0xa,0xa,
+0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0x510a,0xa,0xd20a,0xa,0x12,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0,
-0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x12,0x12,0x12,0x12,0x12,7,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
+6,0xa,4,4,4,4,0xa,0xa,0xa,0xa,0,0x900a,0xa,0xb2,0xa,0xa,
+4,4,2,2,0xa,0,0xa,0xa,0xa,2,0,0x900a,0xa,0xa,0xa,0xa,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0xa,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0xa,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0xa,0xa,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xa,0xa,0,0,0,0,0,0,
-0,0,0xa,0,0,0,0,0,0xa,0xa,0,0xa,0,0,0,0,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xa,0xa,0,0,
+0,0,0,0,0,0,0xa,0,0,0,0,0,0xa,0xa,0,0xa,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0xa,0,0,0,0,0,0,0,0,0,
-0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0xa,0,0,0,0,0,
+0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0xa,0,0,0xa,0xa,4,1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0,0,0,0,0,0,0xa,0,0,0xa,0xa,4,1,0xb1,0xb1,0xb1,
0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,0xb1,1,0xb1,0xb1,1,0xb1,0xb1,1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,0xb1,1,0xb1,0xb1,1,
+0xb1,0xb1,1,0xb1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,5,5,5,5,5,5,0xa,0xa,
-0xd,4,4,0xd,6,0xd,0xa,0xa,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0xb1,0xb1,0xb1,0xd,0x8ad,0xd,0xd,0xd,0x4d,0xd,0x8d,0x8d,0x8d,0x8d,0x4d,0x8d,
-0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,
-0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x2d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,
-0x8d,0x4d,0x4d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,5,5,5,5,5,5,5,5,
-5,5,4,5,5,0xd,0x4d,0x4d,0xb1,0x8d,0x8d,0x8d,0xd,0x8d,0x8d,0x8d,
-0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,
-0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,
+1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5,
+5,5,0xa,0xa,0xd,4,4,0xd,6,0xd,0xa,0xa,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0x8ad,0xd,0xd,0xd,0x4d,0xd,0x8d,0x8d,
+0x8d,0x8d,0x4d,0x8d,0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x4d,
+0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x2d,0x4d,0x4d,0x4d,
+0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x4d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,5,5,5,5,
+5,5,5,5,5,5,4,5,5,0xd,0x4d,0x4d,0xb1,0x8d,0x8d,0x8d,
+0xd,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,
+0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d,
0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,
0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,
-0x8d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x8d,0x4d,0x8d,
-0x4d,0x4d,0x8d,0x8d,0xd,0x8d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,5,0xa,0xb1,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xb1,0xb1,0xa,0xb1,0xb1,0xb1,0xb1,0x8d,0x8d,
-2,2,2,2,2,2,2,2,2,2,0x4d,0x4d,0x4d,0xd,0xd,0x4d,
-0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xad,
-0x8d,0xb1,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,
-0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x8d,0x4d,0x8d,0x4d,0x4d,0x8d,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0xb1,0xb1,0xb1,0xd,0xd,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,
-0x4d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,
-0x4d,0x4d,0x4d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x8d,0x8d,0x4d,0x4d,0x4d,
-0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,
+0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,
+0x4d,0x8d,0x4d,0x8d,0x4d,0x4d,0x8d,0x8d,0xd,0x8d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,5,0xa,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xb1,0xb1,0xa,0xb1,0xb1,
+0xb1,0xb1,0x8d,0x8d,2,2,2,2,2,2,2,2,2,2,0x4d,0x4d,
+0x4d,0xd,0xd,0x4d,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,
+0xd,0xd,0xd,0xad,0x8d,0xb1,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d,
+0x4d,0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x8d,0x4d,
+0x8d,0x4d,0x4d,0x8d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,
+0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,
+0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x8d,
+0x8d,0x4d,0x4d,0x4d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0xd,0xd,0xd,0xd,
0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,
-0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xb1,0xb1,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,
-0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,1,1,1,1,1,1,1,1,
-1,1,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
+0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,
+0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xd,
+0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,1,1,1,1,
+1,1,1,1,1,1,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
-0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,0xa,0xa,
-0xa,0xa,0x21,1,1,0xb1,1,1,0xb1,0xb1,0xb1,0xb1,1,0xb1,0xb1,0xb1,
-1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xb1,0xb1,
-0xb1,0xb1,1,0xb1,0xb1,0xb1,0xb1,0xb1,0x81,0x41,0x41,0x41,0x41,0x41,0x81,0x81,
-0x41,0x81,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x81,0x41,1,1,
-1,0xb1,0xb1,0xb1,1,1,1,1,0x4d,0xd,0x4d,0x4d,0x4d,0x4d,0xd,0x8d,
-0x4d,0x8d,0x8d,0xd,0xd,0xd,0xd,0xd,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,0xb1,0xb1,5,0xb1,0xb1,0xb1,0xb1,0xb1,
+0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+1,1,0xa,0xa,0xa,0xa,0x21,1,1,0xb1,1,1,0xb1,0xb1,0xb1,0xb1,
+1,0xb1,0xb1,0xb1,1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,0xb1,0xb1,0xb1,0xb1,1,0xb1,0xb1,0xb1,0xb1,0xb1,0x81,0x41,0x41,0x41,
+0x41,0x41,0x81,0x81,0x41,0x81,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
+0x81,0x41,1,1,1,0xb1,0xb1,0xb1,1,1,1,1,0x4d,0xd,0x4d,0x4d,
+0x4d,0x4d,0xd,0x8d,0x4d,0x8d,0x8d,0xd,0xd,0xd,0xd,0xd,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,0xb1,0xb1,5,0xb1,
0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,
-0x4d,0x4d,0x8d,0x8d,0x8d,0xd,0x8d,0x4d,0x4d,0x8d,0x8d,0x4d,0x4d,0xd,0x4d,0x4d,
-0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,
-0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1,0,0,0,
-0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xb1,0,0,
-0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,
-0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x4d,0x4d,0x4d,0x4d,
+0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0xd,0x8d,0x4d,0x4d,0x8d,0x8d,0x4d,
+0x4d,0xd,0x4d,0x4d,0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0xd,0xd,0xd,0xd,0xd,0xd,
+0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,
+0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,
+0,0xb1,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,
+0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,
-0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,4,
-0,0,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0,0,0xb1,
-0xb1,0xb1,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0xb1,0,0,
-0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,
-0xb1,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,
+0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,
-0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,
-0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,
+0,0,0,4,0,0,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0xb1,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0,
-0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0xb1,0,
+0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0xb1,
+0xb1,0,0,0xb1,0xb1,0xb1,0,0,0,0xb1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,
+0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,
+0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0xb1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
+0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0,0xb1,0xb1,0xb1,
+0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,
+0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0,
-0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,
-0xa,0xa,0xa,0xa,0xa,4,0xa,0,0,0,0,0,0xb1,0,0,0,
-0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1,
-0xb1,0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,
-0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,4,0xa,0,0,0,0,0,
+0xb1,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0xb1,0,0,0xa0,0,0,0,0,0,0,0xa0,0,0,0,0,0,
-0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,
-0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,
-0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,4,0,0,0,0,
-0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0,
-0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,
+0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,
+0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0,
+0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xb1,0,0,0xa0,0,0,0,0,0,0,0xa0,0,
0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1,
-0,0xb1,0x310a,0xf20a,0x310a,0xf20a,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,
-0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,4,
+0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,
+0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0xb1,0,0xb1,0,0xb1,0x310a,0xf20a,0x310a,0xf20a,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,
+0xb1,0,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,
-0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,
-0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,
-0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,
-0,0,0,0,0xa,0,0,0,0,0,0,0,0,0,0,0,
+0xb1,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0,
+0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x310a,
-0xf20a,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,
+0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0,0,0,0,0,0,0xa,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,
-0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0,0,0,0,0,0,0,4,0,0xb1,0,0,0x40,0x40,0x40,0x40,
-0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
-0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xb1,0x40,0,
+0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x4a,0xa,0xa,0x2a,0xb1,
-0xb1,0xb1,0x12,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
-0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0,0,0,
-0,0,0,0,0,0xb1,0xb1,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
+0,0,0,0x310a,0xf20a,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,
+0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,4,0,0xb1,0,0,
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
-0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,
-0,0,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,
-0xa,0,0,0,0xa,0xa,0,0,0,0,0,0,0,0,0,0,
+0x40,0xb1,0x40,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x4a,
+0xa,0xa,0x2a,0xb1,0xb1,0xb1,0x12,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
+0x40,0,0,0,0,0,0,0,0,0xb1,0xb1,0x40,0x40,0x40,0x40,0x40,
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
+0x40,0x40,0x40,0x40,0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0,0,0,
+0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,
+0,0,0,0,0xa,0,0,0,0xa,0xa,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,
0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,
-0xb1,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,
-0xb1,0xb1,0xb1,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0xb1,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,
-0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0xb1,
-0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0,0,0,0xb1,0,0xb1,
-0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,
-0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xb1,0,0,0,0,0,0,
-0xb1,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0xb1,0xb1,0,0,0xb1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,
+0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,
+0xb1,0xb1,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0,0,
+0,0xb1,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xb1,0,0,
+0,0,0,0,0xb1,0,0,0,0xb1,0xb1,0,0,0,0,0,0,
0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0xa,0,0xa,0xa,0xa,0,0,
-0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0xa,0xa,0,0xa,0xa,0xa,0xa,
-6,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,0xb2,0xb2,0xb2,0xb2,
-0xb2,0x12,0x814,0x815,0x813,0x816,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,2,0,0,0,
-2,2,2,2,2,2,3,3,0xa,0x310a,0xf20a,0,9,9,9,9,
-9,9,9,9,9,9,9,0xb2,0x412,0x432,0x8a0,0x8a1,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,7,0x8ab,0x8ae,
-0x8b0,0x8ac,0x8af,6,4,4,4,4,4,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,
-0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2,2,2,3,3,
-0xa,0x310a,0xf20a,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0,0xa,
+0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0,
+0xa,0xa,0xa,0xa,6,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,
+0xb2,0xb2,0xb2,0xb2,0xb2,0x12,0x814,0x815,0x813,0x816,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,
+2,0,0,0,2,2,2,2,2,2,3,3,0xa,0x310a,0xf20a,0,
+9,9,9,9,9,9,9,9,9,9,9,0xb2,0x412,0x432,0x8a0,0x8a1,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+9,7,0x8ab,0x8ae,0x8b0,0x8ac,0x8af,6,4,4,4,4,4,0xa,0xa,0xa,
+0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2,
+2,2,3,3,0xa,0x310a,0xf20a,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
-4,4,4,4,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0xb1,0xb1,0xb1,0xb1,0xa,0xa,0,0xa,0xa,0xa,0xa,0,0xa,0xa,0,0,
-0,0,0,0,0,0,0,0,0xa,0,0xa,0xa,0xa,0,0,0,
-0,0,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0,0xa,0,0xa,0,0,
-0,0,4,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,
-0,0,0,0,0x100a,0xa,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa,
-0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,
-0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,
-0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x900a,0x900a,0x900a,0x100a,0x900a,0x900a,0x100a,0x100a,0x900a,0x900a,
-0x900a,0x900a,0x900a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0x700a,0x700a,0x700a,0xb00a,
-0xb00a,0xb00a,0xa,0xa,0xa,0x100a,3,4,0xa,0x900a,0x100a,0xa,0xa,0xa,0x100a,0x100a,
-0x100a,0x100a,0xa,0x900a,0x900a,0x900a,0x900a,0xa,0x900a,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,
-0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a,
-0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x900a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,
-0x900a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0x100a,0x100a,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,
-0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,
-0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,
-0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x900a,0x100a,
-0x900a,0x900a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,
-0x900a,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0x300a,0xf00a,0x300a,0xf00a,0x900a,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0x300a,0xf00a,
-0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,
+4,4,4,4,4,4,4,4,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0,0xa,0xa,0xa,0xa,0,
+0xa,0xa,0,0,0,0,0,0,0,0,0,0,0xa,0,0xa,0xa,
+0xa,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0,0xa,
+0,0xa,0,0,0,0,4,0,0,0,0,0,0,0,0,0,
+0,0,0xa,0xa,0,0,0,0,0x100a,0xa,0xa,0xa,0xa,0,0,0,
+0,0,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,
+0,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,
+0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x900a,0x900a,0x900a,0x100a,0x900a,0x900a,
+0x100a,0x100a,0x900a,0x900a,0x900a,0x900a,0x900a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,
+0x700a,0x700a,0x700a,0xb00a,0xb00a,0xb00a,0xa,0xa,0xa,0x100a,3,4,0xa,0x900a,0x100a,0xa,
+0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x900a,0x900a,0x900a,0x900a,0xa,0x900a,0xa,0x100a,0xa,
+0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa,
+0xa,0x100a,0xa,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x900a,0x100a,0x900a,0x100a,0x100a,
+0x100a,0x100a,0x100a,0x100a,0x900a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,
+0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,
+0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,
+0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,
+0xa,0xa,0x900a,0x100a,0x900a,0x900a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,
+0x300a,0xf00a,0x300a,0xf00a,0x900a,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x900a,0xa,0xa,0x300a,0xf00a,0xa,0xa,
+0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,
0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,2,2,2,2,
+0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,
-0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0xa,0x300a,
-0xf00a,0x310a,0xf20a,0xa,0x300a,0xf00a,0xa,0x500a,0x100a,0xd00a,0xa,0xa,0xa,0xa,0xa,0x100a,
-0x100a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x900a,0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a,
-0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a,
-0x100a,0x100a,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0x100a,0x900a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0x310a,
-0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x710a,0x320a,0xf10a,0xb20a,0x310a,0xf20a,0x310a,
-0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0x900a,0x100a,0x100a,0x100a,0x100a,0x900a,0xa,0x100a,0x900a,
-0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0x100a,
-0x300a,0xf00a,0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x300a,0xf00a,0x300a,0xf00a,0xa,
-0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0x900a,
-0x900a,0x900a,0x100a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x900a,0xa,0xa,0xa,0xa,0x100a,
-0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,
-0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa,
-0x100a,0xa,0x100a,0xa,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,
-0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0xa,
+2,2,2,2,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,
+0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0x100a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0xa,0x300a,0xf00a,0xa,0x500a,0x100a,0xd00a,0xa,0xa,
+0xa,0xa,0xa,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x900a,0x300a,0xf00a,0xa,
+0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0x100a,0xa,0x100a,0x100a,0x100a,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0x100a,0x900a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0xa,0xa,
+0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x710a,0x320a,0xf10a,
+0xb20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0x900a,0x100a,0x100a,0x100a,0x100a,
+0x900a,0xa,0x100a,0x900a,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x300a,
+0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x100a,0xa,0xa,0xa,
+0xa,0xa,0x100a,0x900a,0x900a,0x900a,0x100a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x900a,0xa,
+0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0x100a,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,
+0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,
+0x100a,0x100a,0xa,0xa,0x100a,0xa,0x100a,0xa,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,
+0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0xa,
0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,
-0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,
-0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0x300a,0xf00a,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0xa,0xa,0x100a,
+0x100a,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,
0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,
-0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,
-0x300a,0xf00a,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,
-0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,
-0x100a,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,
+0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a,
+0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,
+0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,
+0xa,0xa,0xa,0xa,0x100a,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,
0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x900a,0,
-0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0xb1,
-0xb1,0xb1,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,
-0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,
-0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,0,0,0,0,0,0xa,0xa,0xa,
+0xa,0xa,0xa,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,
+0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0xb1,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,
+0xa,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,
+0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,
0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,
@@ -555,6 +555,8 @@ static const uint16_t ubidi_props_trieIndex[12100]={
0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0xb1,0xb1,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
@@ -579,7 +581,7 @@ static const uint16_t ubidi_props_trieIndex[12100]={
0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0,0,
-0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,
+0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,
0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,
0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,
0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -683,89 +685,101 @@ static const uint16_t ubidi_props_trieIndex[12100]={
0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,
0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,
-0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa0,0xa0,0xb1,0xb1,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0,
-0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,
-0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0,0,0,0,
-0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xa0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0,
+0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xa0,0xa0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,
+0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,
+0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,
+0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0,0xa0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0,0,0,0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,
+0,0xb1,0,0xb1,0,0,0,0,0,0,0,0,4,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,4,4,4,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0xb1,0,0xb1,0xb1,0,0xb1,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0,
+0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,
+0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0xb1,0xb1,0,0,0,0xb1,0,0xb1,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,
+0xb1,0xb1,0,0,0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2,0xb2,
+0xb2,0xb2,0xb2,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,
-0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb1,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xa,0xa,0xb1,0xb1,0xb1,0xa,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xb1,0xb1,
-0xb1,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x100a,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0x100a,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0x100a,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0x100a,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x100a,
-0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,
+0,0,0,0x100a,0,0,0,0,0,0,0,0,0,0,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,2,2,2,2,2,0xb1,0xb1,0xb1,0xb1,
0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,
-0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,
-0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
-0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,
+0,0xb1,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,
-1,1,1,1,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
+0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0xb1,0xb1,
+0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,4,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1,0x41,0x41,0x41,0x41,
0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
-0x41,0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,
-0xa,0xa,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,
-0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,
-0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2,2,2,2,0xa,
+0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xa1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,
+0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xd,0xd,0xd,0xd,0xd,0xd,
+0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,2,2,2,2,
+2,2,2,2,2,2,2,0xa,0xa,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,
0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0xa,0xa,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,
-0xa,0xa,0xa,0,0,0,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0xa,0xa,0xa,0,
+0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,
+0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,
+0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,
+0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,
+0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,
+0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0,
+0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,
+0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0x12,0x12,0xa,0xa,0xa,0,
0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,
-0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0x12,0x12,0xb2,0xb2,0xb2,0xb2,
+0xa,0xa,0,0,0,0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2,
0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,
0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0x12,0xb2,0x12,0x12,
0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
@@ -876,16 +890,16 @@ static const UBiDiProps ubidi_props_singleton={
ubidi_props_jgArray2,
{
ubidi_props_trieIndex,
- ubidi_props_trieIndex+3516,
+ ubidi_props_trieIndex+3568,
NULL,
- 3516,
- 8584,
+ 3568,
+ 8756,
0x1a0,
- 0xe3c,
+ 0xe70,
0x0,
0x0,
0x110000,
- 0x2f40,
+ 0x3020,
NULL, 0, FALSE, FALSE, 0, NULL
},
{ 2,2,0,0 }
diff --git a/Build/source/libs/icu/icu-src/source/common/ubidiimp.h b/Build/source/libs/icu/icu-src/source/common/ubidiimp.h
index a5d0727495d..9746b2bc103 100644
--- a/Build/source/libs/icu/icu-src/source/common/ubidiimp.h
+++ b/Build/source/libs/icu/icu-src/source/common/ubidiimp.h
@@ -198,8 +198,8 @@ typedef struct Run {
/* in a Run, logicalStart will get this bit set if the run level is odd */
#define INDEX_ODD_BIT (1UL<<31)
-#define MAKE_INDEX_ODD_PAIR(index, level) ((index)|((int32_t)(level)<<31))
-#define ADD_ODD_BIT_FROM_LEVEL(x, level) ((x)|=((int32_t)(level)<<31))
+#define MAKE_INDEX_ODD_PAIR(index, level) ((index)|((int32_t)((level)&1)<<31))
+#define ADD_ODD_BIT_FROM_LEVEL(x, level) ((x)|=((int32_t)((level)&1)<<31))
#define REMOVE_ODD_BIT(x) ((x)&=~INDEX_ODD_BIT)
#define GET_INDEX(x) ((x)&~INDEX_ODD_BIT)
@@ -387,41 +387,49 @@ typedef union {
} BidiMemoryForAllocation;
/* Macros for initial checks at function entry */
-#define RETURN_IF_NULL_OR_FAILING_ERRCODE(pErrcode, retvalue) \
- if((pErrcode)==NULL || U_FAILURE(*pErrcode)) return retvalue
-#define RETURN_IF_NOT_VALID_PARA(bidi, errcode, retvalue) \
- if(!IS_VALID_PARA(bidi)) { \
- errcode=U_INVALID_STATE_ERROR; \
- return retvalue; \
- }
-#define RETURN_IF_NOT_VALID_PARA_OR_LINE(bidi, errcode, retvalue) \
- if(!IS_VALID_PARA_OR_LINE(bidi)) { \
- errcode=U_INVALID_STATE_ERROR; \
- return retvalue; \
- }
-#define RETURN_IF_BAD_RANGE(arg, start, limit, errcode, retvalue) \
- if((arg)<(start) || (arg)>=(limit)) { \
- (errcode)=U_ILLEGAL_ARGUMENT_ERROR; \
- return retvalue; \
- }
-
-#define RETURN_VOID_IF_NULL_OR_FAILING_ERRCODE(pErrcode) \
- if((pErrcode)==NULL || U_FAILURE(*pErrcode)) return
-#define RETURN_VOID_IF_NOT_VALID_PARA(bidi, errcode) \
- if(!IS_VALID_PARA(bidi)) { \
- errcode=U_INVALID_STATE_ERROR; \
- return; \
- }
-#define RETURN_VOID_IF_NOT_VALID_PARA_OR_LINE(bidi, errcode) \
- if(!IS_VALID_PARA_OR_LINE(bidi)) { \
- errcode=U_INVALID_STATE_ERROR; \
- return; \
- }
-#define RETURN_VOID_IF_BAD_RANGE(arg, start, limit, errcode) \
- if((arg)<(start) || (arg)>=(limit)) { \
- (errcode)=U_ILLEGAL_ARGUMENT_ERROR; \
- return; \
- }
+#define RETURN_IF_NULL_OR_FAILING_ERRCODE(pErrcode, retvalue) UPRV_BLOCK_MACRO_BEGIN { \
+ if((pErrcode)==NULL || U_FAILURE(*pErrcode)) return retvalue; \
+} UPRV_BLOCK_MACRO_END
+#define RETURN_IF_NOT_VALID_PARA(bidi, errcode, retvalue) UPRV_BLOCK_MACRO_BEGIN { \
+ if(!IS_VALID_PARA(bidi)) { \
+ errcode=U_INVALID_STATE_ERROR; \
+ return retvalue; \
+ } \
+} UPRV_BLOCK_MACRO_END
+#define RETURN_IF_NOT_VALID_PARA_OR_LINE(bidi, errcode, retvalue) UPRV_BLOCK_MACRO_BEGIN { \
+ if(!IS_VALID_PARA_OR_LINE(bidi)) { \
+ errcode=U_INVALID_STATE_ERROR; \
+ return retvalue; \
+ } \
+} UPRV_BLOCK_MACRO_END
+#define RETURN_IF_BAD_RANGE(arg, start, limit, errcode, retvalue) UPRV_BLOCK_MACRO_BEGIN { \
+ if((arg)<(start) || (arg)>=(limit)) { \
+ (errcode)=U_ILLEGAL_ARGUMENT_ERROR; \
+ return retvalue; \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define RETURN_VOID_IF_NULL_OR_FAILING_ERRCODE(pErrcode) UPRV_BLOCK_MACRO_BEGIN { \
+ if((pErrcode)==NULL || U_FAILURE(*pErrcode)) return; \
+} UPRV_BLOCK_MACRO_END
+#define RETURN_VOID_IF_NOT_VALID_PARA(bidi, errcode) UPRV_BLOCK_MACRO_BEGIN { \
+ if(!IS_VALID_PARA(bidi)) { \
+ errcode=U_INVALID_STATE_ERROR; \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
+#define RETURN_VOID_IF_NOT_VALID_PARA_OR_LINE(bidi, errcode) UPRV_BLOCK_MACRO_BEGIN { \
+ if(!IS_VALID_PARA_OR_LINE(bidi)) { \
+ errcode=U_INVALID_STATE_ERROR; \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
+#define RETURN_VOID_IF_BAD_RANGE(arg, start, limit, errcode) UPRV_BLOCK_MACRO_BEGIN { \
+ if((arg)<(start) || (arg)>=(limit)) { \
+ (errcode)=U_ILLEGAL_ARGUMENT_ERROR; \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
/* helper function to (re)allocate memory if allowed */
U_CFUNC UBool
diff --git a/Build/source/libs/icu/icu-src/source/common/ubidiln.cpp b/Build/source/libs/icu/icu-src/source/common/ubidiln.cpp
index 71c581fe1c7..3545f4e111c 100644
--- a/Build/source/libs/icu/icu-src/source/common/ubidiln.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ubidiln.cpp
@@ -517,7 +517,7 @@ reorderLine(UBiDi *pBiDi, UBiDiLevel minLevel, UBiDiLevel maxLevel) {
/* compute the runs array --------------------------------------------------- */
-static int32_t getRunFromLogicalIndex(UBiDi *pBiDi, int32_t logicalIndex, UErrorCode *pErrorCode) {
+static int32_t getRunFromLogicalIndex(UBiDi *pBiDi, int32_t logicalIndex) {
Run *runs=pBiDi->runs;
int32_t runCount=pBiDi->runCount, visualStart=0, i, length, logicalStart;
@@ -530,9 +530,7 @@ static int32_t getRunFromLogicalIndex(UBiDi *pBiDi, int32_t logicalIndex, UError
visualStart+=length;
}
/* we should never get here */
- U_ASSERT(FALSE);
- *pErrorCode = U_INVALID_STATE_ERROR;
- return 0;
+ UPRV_UNREACHABLE;
}
/*
@@ -547,7 +545,7 @@ static int32_t getRunFromLogicalIndex(UBiDi *pBiDi, int32_t logicalIndex, UError
* negative number of BiDi control characters within this run.
*/
U_CFUNC UBool
-ubidi_getRuns(UBiDi *pBiDi, UErrorCode *pErrorCode) {
+ubidi_getRuns(UBiDi *pBiDi, UErrorCode*) {
/*
* This method returns immediately if the runs are already set. This
* includes the case of length==0 (handled in setPara)..
@@ -688,7 +686,7 @@ ubidi_getRuns(UBiDi *pBiDi, UErrorCode *pErrorCode) {
*limit=start+pBiDi->insertPoints.size;
int32_t runIndex;
for(point=start; point<limit; point++) {
- runIndex=getRunFromLogicalIndex(pBiDi, point->pos, pErrorCode);
+ runIndex=getRunFromLogicalIndex(pBiDi, point->pos);
pBiDi->runs[runIndex].insertRemove|=point->flag;
}
}
@@ -699,7 +697,7 @@ ubidi_getRuns(UBiDi *pBiDi, UErrorCode *pErrorCode) {
const UChar *start=pBiDi->text, *limit=start+pBiDi->length, *pu;
for(pu=start; pu<limit; pu++) {
if(IS_BIDI_CONTROL_CHAR(*pu)) {
- runIndex=getRunFromLogicalIndex(pBiDi, (int32_t)(pu-start), pErrorCode);
+ runIndex=getRunFromLogicalIndex(pBiDi, (int32_t)(pu-start));
pBiDi->runs[runIndex].insertRemove--;
}
}
diff --git a/Build/source/libs/icu/icu-src/source/common/ubiditransform.cpp b/Build/source/libs/icu/icu-src/source/common/ubiditransform.cpp
index e6d1d9c086d..5b0d5cf96a4 100644
--- a/Build/source/libs/icu/icu-src/source/common/ubiditransform.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ubiditransform.cpp
@@ -31,11 +31,11 @@
#define SHAPE_LOGICAL U_SHAPE_TEXT_DIRECTION_LOGICAL
#define SHAPE_VISUAL U_SHAPE_TEXT_DIRECTION_VISUAL_LTR
-#define CHECK_LEN(STR, LEN, ERROR) { \
- if (LEN == 0) return 0; \
- if (LEN < -1) { *(ERROR) = U_ILLEGAL_ARGUMENT_ERROR; return 0; } \
- if (LEN == -1) LEN = u_strlen(STR); \
- }
+#define CHECK_LEN(STR, LEN, ERROR) UPRV_BLOCK_MACRO_BEGIN { \
+ if (LEN == 0) return 0; \
+ if (LEN < -1) { *(ERROR) = U_ILLEGAL_ARGUMENT_ERROR; return 0; } \
+ if (LEN == -1) LEN = u_strlen(STR); \
+} UPRV_BLOCK_MACRO_END
#define MAX_ACTIONS 7
diff --git a/Build/source/libs/icu/icu-src/source/common/ubidiwrt.cpp b/Build/source/libs/icu/icu-src/source/common/ubidiwrt.cpp
index a89099dad0e..aa4d6b544c1 100644
--- a/Build/source/libs/icu/icu-src/source/common/ubidiwrt.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ubidiwrt.cpp
@@ -40,7 +40,7 @@
* Further assumptions for all UTFs:
* - u_charMirror(c) needs the same number of code units as c
*/
-#if UTF_SIZE==8
+#if defined(UTF_SIZE) && UTF_SIZE==8
# error reimplement ubidi_writeReordered() for UTF-8, see comment above
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/ucase.cpp b/Build/source/libs/icu/icu-src/source/common/ucase.cpp
index 8414c527d49..4ec25a27a50 100644
--- a/Build/source/libs/icu/icu-src/source/common/ucase.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ucase.cpp
@@ -116,7 +116,7 @@ static const uint8_t flagsOffset[256]={
* moved to the last uint16_t of the value, use +1 for beginning of next slot
* @param value (out) int32_t or uint32_t output if hasSlot, otherwise not modified
*/
-#define GET_SLOT_VALUE(excWord, idx, pExc16, value) \
+#define GET_SLOT_VALUE(excWord, idx, pExc16, value) UPRV_BLOCK_MACRO_BEGIN { \
if(((excWord)&UCASE_EXC_DOUBLE_SLOTS)==0) { \
(pExc16)+=SLOT_OFFSET(excWord, idx); \
(value)=*pExc16; \
@@ -124,7 +124,8 @@ static const uint8_t flagsOffset[256]={
(pExc16)+=2*SLOT_OFFSET(excWord, idx); \
(value)=*pExc16++; \
(value)=((value)<<16)|*pExc16; \
- }
+ } \
+} UPRV_BLOCK_MACRO_END
/* simple case mappings ----------------------------------------------------- */
diff --git a/Build/source/libs/icu/icu-src/source/common/ucase_props_data.h b/Build/source/libs/icu/icu-src/source/common/ucase_props_data.h
index eb7d9ff9099..68554b3130c 100644
--- a/Build/source/libs/icu/icu-src/source/common/ucase_props_data.h
+++ b/Build/source/libs/icu/icu-src/source/common/ucase_props_data.h
@@ -11,145 +11,145 @@
#ifdef INCLUDED_FROM_UCASE_CPP
-static const UVersionInfo ucase_props_dataVersion={0xb,0,0,0};
+static const UVersionInfo ucase_props_dataVersion={0xc,1,0,0};
-static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x6e72,0x5e50,0x67f,0x172,0,0,0,0,0,0,0,0,0,0,3};
+static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x6fea,0x5fb8,0x687,0x172,0,0,0,0,0,0,0,0,0,0,3};
-static const uint16_t ucase_props_trieIndex[12064]={
-0x32c,0x334,0x33c,0x344,0x352,0x35a,0x362,0x36a,0x372,0x37a,0x381,0x389,0x391,0x399,0x3a1,0x3a9,
-0x3af,0x3b7,0x3bf,0x3c7,0x3cf,0x3d7,0x3df,0x3e7,0x3ef,0x3f7,0x3ff,0x407,0x40f,0x417,0x41f,0x427,
-0x42f,0x437,0x43f,0x447,0x44f,0x457,0x45f,0x467,0x463,0x46b,0x470,0x478,0x47f,0x487,0x48f,0x497,
-0x49f,0x4a7,0x4af,0x4b7,0x34b,0x353,0x4bc,0x4c4,0x4c9,0x4d1,0x4d9,0x4e1,0x4e0,0x4e8,0x4ed,0x4f5,
-0x4fd,0x504,0x508,0x34b,0x34b,0x32c,0x518,0x510,0x520,0x522,0x52a,0x532,0x536,0x537,0x53f,0x547,
-0x54f,0x537,0x557,0x55c,0x54f,0x537,0x564,0x56c,0x536,0x574,0x57c,0x584,0x58c,0x34b,0x594,0x34b,
-0x59c,0x4e2,0x5a4,0x584,0x536,0x574,0x5ab,0x584,0x5b3,0x5b5,0x53f,0x584,0x34b,0x34b,0x5bd,0x34b,
-0x34b,0x5c3,0x5ca,0x34b,0x34b,0x5ce,0x5d6,0x34b,0x5da,0x5e1,0x34b,0x5e8,0x5f0,0x5f7,0x5ff,0x34b,
-0x34b,0x604,0x60c,0x614,0x61c,0x624,0x62b,0x633,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x63b,0x34b,0x34b,0x64b,0x64b,0x643,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x653,0x653,0x543,0x543,0x34b,0x659,0x661,0x34b,
-0x669,0x34b,0x671,0x34b,0x678,0x67e,0x34b,0x34b,0x34b,0x686,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x68d,0x34b,0x694,0x69c,0x34b,0x6a4,0x34b,0x34b,0x573,0x6ac,0x6b4,0x6ba,0x5b3,0x6c2,0x34b,0x6c9,
-0x34b,0x6ce,0x34b,0x6d4,0x6dc,0x6e0,0x6e8,0x6f0,0x6f8,0x6fd,0x700,0x708,0x718,0x710,0x728,0x720,
-0x372,0x730,0x372,0x738,0x73b,0x372,0x743,0x372,0x74b,0x753,0x75b,0x763,0x76b,0x773,0x77b,0x783,
-0x78b,0x792,0x34b,0x79a,0x7a2,0x34b,0x7aa,0x7b2,0x7ba,0x7c2,0x7ca,0x7d2,0x7da,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x7dd,0x7e3,0x7e9,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x7f1,0x7f6,0x7fa,0x802,0x372,0x372,0x372,0x80a,0x812,0x819,0x34b,0x81e,0x34b,0x34b,0x34b,0x826,
-0x34b,0x66e,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x535,0x82e,0x34b,0x34b,0x835,0x34b,0x34b,0x83d,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x845,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x6d4,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x84b,0x34b,0x853,0x858,0x860,0x34b,0x34b,0x868,0x870,0x878,0x372,0x87d,0x885,0x88b,0x34b,0x892,
-0x89a,0x678,0x34b,0x34b,0x34b,0x34b,0x8a1,0x8a9,0x34b,0x8b1,0x8b8,0x34b,0x520,0x8bd,0x8c5,0x678,
-0x34b,0x8cb,0x8d3,0x8d7,0x34b,0x8df,0x8e7,0x8ef,0x34b,0x8f5,0x8f9,0x901,0x911,0x909,0x34b,0x919,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x921,0x34b,0x34b,0x34b,0x34b,0x929,0x5b3,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x92e,0x936,0x93a,0x34b,0x34b,0x34b,0x34b,0x32e,0x334,0x942,0x94a,0x951,0x4e2,0x34b,0x34b,0x959,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0xd30,0xd30,0xd48,0xd88,0xdc8,0xe04,0xe44,0xe84,0xebc,0xefc,0xf3c,0xf7c,0xfbc,0xffc,0x103c,0x107c,
-0x10bc,0x10fc,0x113c,0x117c,0x118c,0x11c0,0x11fc,0x123c,0x127c,0x12bc,0xd2c,0x12f0,0x1324,0x1364,0x1380,0x13b4,
-0x9e1,0xa11,0xa51,0xa90,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xac8,0x188,0x188,
-0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xb08,0x188,0x188,0xb3d,0xb7c,0xbbc,0xbf6,0xc2d,0x188,
+static const uint16_t ucase_props_trieIndex[12244]={
+0x336,0x33e,0x346,0x34e,0x35c,0x364,0x36c,0x374,0x37c,0x384,0x38b,0x393,0x39b,0x3a3,0x3ab,0x3b3,
+0x3b9,0x3c1,0x3c9,0x3d1,0x3d9,0x3e1,0x3e9,0x3f1,0x3f9,0x401,0x409,0x411,0x419,0x421,0x429,0x431,
+0x439,0x441,0x449,0x451,0x459,0x461,0x469,0x471,0x46d,0x475,0x47a,0x482,0x489,0x491,0x499,0x4a1,
+0x4a9,0x4b1,0x4b9,0x4c1,0x355,0x35d,0x4c6,0x4ce,0x4d3,0x4db,0x4e3,0x4eb,0x4ea,0x4f2,0x4f7,0x4ff,
+0x507,0x50e,0x512,0x355,0x355,0x336,0x522,0x51a,0x52a,0x52c,0x534,0x53c,0x540,0x541,0x549,0x551,
+0x559,0x541,0x561,0x566,0x559,0x541,0x56e,0x576,0x540,0x57e,0x586,0x58e,0x596,0x355,0x59e,0x355,
+0x5a6,0x4ec,0x5ae,0x58e,0x540,0x57e,0x5b5,0x58e,0x5bd,0x5bf,0x549,0x58e,0x355,0x355,0x5c7,0x355,
+0x355,0x5cd,0x5d4,0x355,0x355,0x5d8,0x5e0,0x355,0x5e4,0x5eb,0x355,0x5f2,0x5fa,0x601,0x609,0x355,
+0x355,0x60e,0x616,0x61e,0x626,0x62e,0x635,0x63d,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x645,0x355,0x355,0x655,0x655,0x64d,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x65d,0x65d,0x54d,0x54d,0x355,0x663,0x66b,0x355,
+0x673,0x355,0x67b,0x355,0x682,0x688,0x355,0x355,0x355,0x690,0x355,0x355,0x355,0x355,0x355,0x355,
+0x697,0x355,0x69e,0x6a6,0x355,0x6ae,0x355,0x355,0x57d,0x6b6,0x6be,0x6c4,0x5bd,0x6cc,0x355,0x6d3,
+0x355,0x6d8,0x355,0x6de,0x6e6,0x6ea,0x6f2,0x6fa,0x702,0x707,0x70a,0x712,0x722,0x71a,0x732,0x72a,
+0x37c,0x73a,0x37c,0x742,0x745,0x37c,0x74d,0x37c,0x755,0x75d,0x765,0x76d,0x775,0x77d,0x785,0x78d,
+0x795,0x79c,0x355,0x7a4,0x7ac,0x355,0x7b4,0x7bc,0x7c4,0x7cc,0x7d4,0x7dc,0x7e4,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x7e7,0x7ed,0x7f3,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x7fb,0x800,0x804,0x80c,0x37c,0x37c,0x37c,0x814,0x81c,0x823,0x355,0x828,0x355,0x355,0x355,0x830,
+0x355,0x678,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x53f,0x838,0x355,0x355,0x83f,0x355,0x355,0x847,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x84f,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x6de,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x855,0x355,0x85d,0x862,0x86a,0x355,0x355,0x872,0x87a,0x882,0x37c,0x887,0x88f,0x895,0x89d,0x89f,
+0x8a7,0x682,0x355,0x355,0x355,0x355,0x8ae,0x8b6,0x355,0x8be,0x8c5,0x355,0x52a,0x8ca,0x8d2,0x682,
+0x355,0x8d8,0x8e0,0x8e4,0x355,0x8ec,0x8f4,0x8fc,0x355,0x902,0x906,0x90e,0x91e,0x916,0x355,0x926,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x92e,0x355,0x355,0x355,0x355,0x936,0x5bd,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x93b,0x943,0x947,0x355,0x355,0x355,0x355,0x338,0x33e,0x94f,0x957,0x95e,0x4ec,0x355,0x355,0x966,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0xd58,0xd58,0xd70,0xdb0,0xdf0,0xe2c,0xe6c,0xeac,0xee4,0xf24,0xf64,0xfa4,0xfe4,0x1024,0x1064,0x10a4,
+0x10e4,0x1124,0x1164,0x11a4,0x11b4,0x11e8,0x1224,0x1264,0x12a4,0x12e4,0xd54,0x1318,0x134c,0x138c,0x13a8,0x13dc,
+0x9e1,0xa11,0xa51,0xa90,0x188,0x188,0xac8,0x188,0x188,0x188,0x188,0x188,0x188,0xaf1,0x188,0x188,
+0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xb31,0x188,0x188,0xb66,0xba5,0xbe5,0xc1f,0xc56,0x188,
0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,
0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,
0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,
@@ -174,605 +174,617 @@ static const uint16_t ucase_props_trieIndex[12064]={
0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,
0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,
0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,
-0xc6d,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x960,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x968,0x34b,0x34b,0x34b,0x96b,0x34b,0x34b,0x34b,
-0x34b,0x973,0x979,0x97d,0x34b,0x34b,0x981,0x985,0x98b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x993,0x997,0x34b,0x34b,0x34b,0x34b,0x34b,0x99f,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x9a7,0x9ab,0x9b3,0x9b7,0x34b,0x9be,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x9c5,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x536,0x9ca,0x9d1,0x5b4,0x5b3,0x9d5,0x533,0x34b,0x9dd,0x9e4,0x34b,0x9ea,0x5b3,0x9ef,0x9f7,
-0x34b,0x34b,0x9fc,0x34b,0x34b,0x34b,0x34b,0x32e,0xa04,0x5b3,0x5b5,0xa0c,0xa13,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x9ca,0xa1b,0x34b,0x34b,0xa23,0xa2b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xa2f,0xa37,
-0x34b,0x34b,0xa3f,0x4a6,0x34b,0x34b,0xa47,0x34b,0x34b,0xa4d,0xa55,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0xa5a,0x34b,0x34b,0x34b,0xa62,0xa6a,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0xa72,0xa76,0xa7e,0x34b,0xa85,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0xa8c,0x34b,0x34b,0x929,0xa94,0x34b,0x34b,0x34b,0xa9a,0xaa2,0x34b,0xaa6,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xaac,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xab2,
-0x34b,0xab8,0x573,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xa62,0xa6a,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0xabe,0x34b,0x34b,0x5b3,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xac6,0x573,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xace,0xad6,0xadc,0x34b,0x34b,0x34b,0x34b,0xae4,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xaec,0xaf4,0xaf9,
-0xaff,0xb07,0xb0f,0xb17,0xaf0,0xb1f,0xb27,0xb2f,0xb36,0xaf1,0xaec,0xaf4,0xaef,0xaff,0xaf2,0xaed,
-0xb3e,0xaf0,0xb46,0xb4e,0xb56,0xb5d,0xb49,0xb51,0xb59,0xb60,0xb4c,0xb68,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x870,0xb70,0x870,0xb77,
-0xb7e,0xb86,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xb8e,0xb96,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xb9a,0x34b,0xba2,0xbaa,
-0xbb1,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xae8,0xbb9,0xbb9,0xbbf,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x9df,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x536,0x870,0x870,
-0x870,0x34b,0x34b,0x34b,0x34b,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0xac2,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
-0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x32b,0x32b,0x32b,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,4,0,0,0,0,0,0,4,0,
-0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,
-0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0xa,0x5a,0x7a,0x1012,0x1012,0x1012,0x1012,
-0x1012,0x1012,0x1012,0xba,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0,0,0,4,0,
-4,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf9,0xf031,0x149,0xf011,0xf011,0xf011,0xf011,
-0xf011,0xf011,0xf011,0x189,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0,0,0,0,0,
+0xc96,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x96d,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x975,0x355,0x355,0x355,0x978,0x355,0x355,0x355,
+0x355,0x980,0x986,0x98a,0x355,0x355,0x98e,0x992,0x998,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x9a0,0x9a4,0x355,0x355,0x355,0x355,0x355,0x9ac,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x9b4,0x9b8,0x9c0,0x9c4,0x355,0x9cb,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x9d2,0x355,0x355,0x355,0x355,
+0x355,0x540,0x9d7,0x9de,0x5be,0x5bd,0x9e2,0x53d,0x355,0x9ea,0x9f1,0x355,0x9f7,0x5bd,0x9fc,0xa04,
+0x355,0x355,0xa09,0x355,0x355,0x355,0x355,0x338,0xa11,0x5bd,0x5bf,0xa19,0xa20,0x355,0x355,0x355,
+0x355,0x355,0x9d7,0xa28,0x355,0x355,0xa30,0xa38,0x355,0x355,0x355,0x355,0x355,0x355,0xa3c,0xa44,
+0x355,0x355,0xa4c,0x4b0,0x355,0x355,0xa54,0x355,0x355,0xa5a,0xa62,0x355,0x355,0x355,0x355,0x355,
+0x355,0xa67,0x355,0x355,0x355,0xa6f,0xa77,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0xa7f,0x975,
+0xa87,0xa8b,0xa93,0x355,0xa9a,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0xaa1,0x355,0x355,0x936,0xaa9,0x355,0x355,0x355,0xaaf,0xab7,0x355,0xabb,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0xac1,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0xac7,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0xace,0x355,0xad4,0x57d,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0xa6f,0xa77,0x355,0x355,0x355,0x355,0x355,0x355,0x678,0x355,0xada,0x355,0x355,
+0xae2,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0xae3,0x57d,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0xaeb,0xaf3,0xaf9,0x355,0x355,0x355,0x355,0xb01,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0xb09,0xb11,0xb16,0xb1c,0xb24,0xb2c,0xb34,0xb0d,0xb3c,0xb44,
+0xb4c,0xb53,0xb0e,0xb09,0xb11,0xb0c,0xb1c,0xb0f,0xb0a,0xb5b,0xb0d,0xb63,0xb6b,0xb73,0xb7a,0xb66,
+0xb6e,0xb76,0xb7d,0xb69,0xb85,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x87a,0xb8d,0x87a,0xb94,0xb9b,0xba3,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0xbab,0xbb3,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0xbb7,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x9c9,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0xbbf,0x355,0xbc7,0xbcf,0xbd6,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0xb05,
+0xbde,0xbde,0xbe4,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x9ec,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x540,0x87a,0x87a,0x87a,0x355,0x355,0x355,0x355,0x87a,0x87a,
+0x87a,0x87a,0x87a,0x87a,0x87a,0xbec,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,
+0x355,0x355,0x355,0x355,0x355,0x355,0x335,0x335,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
+0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,
+0,0,4,0,0,0,0,0,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,
+0x1012,0xa,0x5a,0x7a,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0xba,0x1012,0x1012,0x1012,0x1012,
+0x1012,0x1012,0x1012,0,0,0,4,0,4,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,
+0xf011,0xf9,0xf031,0x149,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x189,0xf011,0xf011,0xf011,0xf011,
+0xf011,0xf011,0xf011,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-4,0,1,0,0,4,0,4,0,0,0,0,4,0x1c9,0,4,
-4,0,1,0,0,0,0,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1fa,0x1012,0x1012,
-0x1012,0x1012,0x1012,0x1012,0x5a,0x5a,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0,
-0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x239,0xf011,0xf011,0xf011,0xf011,0xf011,0x2d9,0xf011,0xf011,
-0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0,
-0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x3c91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
+0,0,0,0,0,0,0,0,4,0,1,0,0,4,0,4,
+0,0,0,0,4,0x1c9,0,4,4,0,1,0,0,0,0,0,
+0x1012,0x1012,0x1012,0x1012,0x1012,0x1fa,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x5a,0x5a,0x1012,0x1012,
+0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x239,
+0xf011,0xf011,0xf011,0xf011,0xf011,0x2d9,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,
+0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x3c91,
0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
-0x31a,0xff91,0x92,0xff91,0x92,0xff91,0x31a,0xffb1,0x33a,0x389,0x92,0xff91,0x92,0xff91,0x92,0xff91,
-1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x3d9,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x31a,0xff91,0x92,0xff91,0x92,0xff91,0x31a,0xffb1,
+0x33a,0x389,0x92,0xff91,0x92,0xff91,0x92,0xff91,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,
+0xff91,0x92,0xff91,0x92,0xff91,0x3d9,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
-0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xc392,0x92,0xff91,0x92,
-0xff91,0x92,0xff91,0x459,0x6191,0x6912,0x92,0xff91,0x92,0xff91,0x6712,0x92,0xff91,0x6692,0x6692,0x92,
-0xff91,1,0x2792,0x6512,0x6592,0x92,0xff91,0x6692,0x6792,0x3091,0x6992,0x6892,0x92,0xff91,0x5191,1,
-0x6992,0x6a92,0x4111,0x6b12,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x6d12,0x92,0xff91,0x6d12,1,1,
-0x92,0xff91,0x6d12,0x92,0xff91,0x6c92,0x6c92,0x92,0xff91,0x92,0xff91,0x6d92,0x92,0xff91,1,0,
-0x92,0xff91,1,0x1c11,0,0,0,0,0x48a,0x4bb,0x4f9,0x52a,0x55b,0x599,0x5ca,0x5fb,
-0x639,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,
-0xff91,0xd891,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
-0x92,0xff91,0x92,0xff91,0x669,0x6ea,0x71b,0x759,0x92,0xff91,0xcf92,0xe412,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,0xc392,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x459,0x6191,0x6912,0x92,0xff91,
+0x92,0xff91,0x6712,0x92,0xff91,0x6692,0x6692,0x92,0xff91,1,0x2792,0x6512,0x6592,0x92,0xff91,0x6692,
+0x6792,0x3091,0x6992,0x6892,0x92,0xff91,0x5191,1,0x6992,0x6a92,0x4111,0x6b12,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x6d12,0x92,0xff91,0x6d12,1,1,0x92,0xff91,0x6d12,0x92,0xff91,0x6c92,0x6c92,0x92,
+0xff91,0x92,0xff91,0x6d92,0x92,0xff91,1,0,0x92,0xff91,1,0x1c11,0,0,0,0,
+0x48a,0x4bb,0x4f9,0x52a,0x55b,0x599,0x5ca,0x5fb,0x639,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,
+0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xd891,0x92,0xff91,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x669,0x6ea,0x71b,0x759,
+0x92,0xff91,0xcf92,0xe412,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
-0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xbf12,1,0x92,0xff91,
-0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
-1,1,1,1,1,1,0x78a,0x92,0xff91,0xae92,0x7aa,0x7c9,0x7c9,0x92,0xff91,0x9e92,
-0x2292,0x2392,0x92,0xff91,0x92,0xffb1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x7e9,0x809,0x829,0x9711,
-0x9911,1,0x9991,0x9991,1,0x9b11,1,0x9a91,0x849,1,1,1,0x9991,0x869,1,0x9891,
-1,0x889,0x8a9,1,0x97b1,0x9691,0x8a9,0x8c9,0x8e9,1,1,0x9691,1,0x909,0x9591,1,
-1,0x9511,1,1,1,1,1,1,1,0x929,1,1,0x9311,1,1,0x9311,
-1,1,1,0x949,0x9311,0xdd91,0x9391,0x9391,0xdc91,1,1,1,1,1,0x9291,1,
-0,1,1,1,1,1,1,1,1,0x969,0x989,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,5,5,0x25,5,
-5,5,5,5,5,4,4,4,0x14,4,0x14,4,5,5,4,4,
+0x92,0xff91,0x92,0xff91,0xbf12,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,1,1,1,1,1,1,0x78a,0x92,
+0xff91,0xae92,0x7aa,0x7c9,0x7c9,0x92,0xff91,0x9e92,0x2292,0x2392,0x92,0xff91,0x92,0xffb1,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,0x7e9,0x809,0x829,0x9711,0x9911,1,0x9991,0x9991,1,0x9b11,1,0x9a91,
+0x849,1,1,1,0x9991,0x869,1,0x9891,1,0x889,0x8a9,1,0x97b1,0x9691,0x8a9,0x8c9,
+0x8e9,1,1,0x9691,1,0x909,0x9591,1,1,0x9511,1,1,1,1,1,1,
+1,0x929,1,1,0x9311,1,0x949,0x9311,1,1,1,0x969,0x9311,0xdd91,0x9391,0x9391,
+0xdc91,1,1,1,1,1,0x9291,1,0,1,1,1,1,1,1,1,
+1,0x989,0x9a9,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,5,5,0x25,5,5,5,5,5,5,4,4,4,
+0x14,4,0x14,4,5,5,4,4,4,4,4,4,4,4,4,4,
+4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+4,4,4,4,5,5,5,5,5,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
-4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,
-5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
-4,4,4,4,4,4,4,4,4,4,4,4,0x54,0x54,0x44,0x44,
-0x44,0x44,0x44,0x9ac,0x54,0x44,0x54,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x54,
-0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,
-0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x74,0x64,0x64,
-0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x54,0x44,
-0x44,0x9bd,0x44,0x64,0x64,0x64,0x44,0x44,0x44,0x64,0x64,4,0x44,0x44,0x44,0x64,
-0x64,0x64,0x64,0x44,0x64,0x64,0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44,
-0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x92,0xff91,0x92,0xff91,
-4,4,0x92,0xff91,0,0,5,0x4111,0x4111,0x4111,0,0x3a12,0,0,0,0,
-4,4,0x1312,4,0x1292,0x1292,0x1292,0,0x2012,0,0x1f92,0x1f92,0xa09,0x1012,0xada,0x1012,
-0x1012,0xb1a,0x1012,0x1012,0xb5a,0xbaa,0xbfa,0x1012,0xc3a,0x1012,0x1012,0x1012,0xc7a,0xcba,0,0xcfa,
-0x1012,0x1012,0xd3a,0x1012,0x1012,0xd7a,0x1012,0x1012,0xed11,0xed91,0xed91,0xed91,0xdb9,0xf011,0xe89,0xf011,
-0xf011,0xec9,0xf011,0xf011,0xf09,0xf59,0xfa9,0xf011,0xfe9,0xf011,0xf011,0xf011,0x1029,0x1069,0x10a9,0x10d9,
-0xf011,0xf011,0x1119,0xf011,0xf011,0x1159,0xf011,0xf011,0xe011,0xe091,0xe091,0x412,0x1199,0x11c9,2,2,
-2,0x1219,0x1249,0xfc11,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
-0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x1279,0x12a9,0x391,0xc631,
-0x12da,0x1329,0,0x92,0xff91,0xfc92,0x92,0xff91,1,0xbf12,0xbf12,0xbf12,0x2812,0x2812,0x2812,0x2812,
-0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x1012,0x1012,0x135a,0x1012,
-0x139a,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x13da,0x1012,0x1012,0x141a,0x145a,0x1012,
-0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x14aa,0x1012,0x1012,0x1012,0x1012,0x1012,0xf011,0xf011,0x14e9,0xf011,
-0x1529,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x1569,0xf011,0xf011,0x15a9,0x15e9,0xf011,
-0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x1639,0xf011,0xf011,0xf011,0xf011,0xf011,0xd811,0xd811,0xd811,0xd811,
-0xd811,0xd811,0xd831,0xd811,0xd831,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0x92,0xff91,0x167a,0x16b9,
+4,4,4,4,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x9cc,0x54,0x44,0x54,0x44,
+0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64,
+0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,
+0x64,0x64,0x64,0x64,0x64,0x74,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,
+0x64,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x9dd,0x44,0x64,0x64,0x64,0x44,0x44,
+0x44,0x64,0x64,4,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x44,0x64,0x64,0x64,0x44,
+0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
+0x44,0x44,0x44,0x44,0x92,0xff91,0x92,0xff91,4,4,0x92,0xff91,0,0,5,0x4111,
+0x4111,0x4111,0,0x3a12,0,0,0,0,4,4,0x1312,4,0x1292,0x1292,0x1292,0,
+0x2012,0,0x1f92,0x1f92,0xa29,0x1012,0xafa,0x1012,0x1012,0xb3a,0x1012,0x1012,0xb7a,0xbca,0xc1a,0x1012,
+0xc5a,0x1012,0x1012,0x1012,0xc9a,0xcda,0,0xd1a,0x1012,0x1012,0xd5a,0x1012,0x1012,0xd9a,0x1012,0x1012,
+0xed11,0xed91,0xed91,0xed91,0xdd9,0xf011,0xea9,0xf011,0xf011,0xee9,0xf011,0xf011,0xf29,0xf79,0xfc9,0xf011,
+0x1009,0xf011,0xf011,0xf011,0x1049,0x1089,0x10c9,0x10f9,0xf011,0xf011,0x1139,0xf011,0xf011,0x1179,0xf011,0xf011,
+0xe011,0xe091,0xe091,0x412,0x11b9,0x11e9,2,2,2,0x1239,0x1269,0xfc11,0x92,0xff91,0x92,0xff91,
0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
-0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0x44,
-0x44,0x44,0x44,0x44,4,4,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,0x1299,0x12c9,0x391,0xc631,0x12fa,0x1349,0,0x92,0xff91,0xfc92,0x92,0xff91,
+1,0xbf12,0xbf12,0xbf12,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,
+0x2812,0x2812,0x2812,0x2812,0x1012,0x1012,0x137a,0x1012,0x13ba,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,
+0x1012,0x1012,0x13fa,0x1012,0x1012,0x143a,0x147a,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x14ca,0x1012,
+0x1012,0x1012,0x1012,0x1012,0xf011,0xf011,0x1509,0xf011,0x1549,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,
+0xf011,0xf011,0x1589,0xf011,0xf011,0x15c9,0x1609,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x1659,0xf011,
+0xf011,0xf011,0xf011,0xf011,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0xd831,0xd811,0xd831,0xd811,0xd811,0xd811,
+0xd811,0xd811,0xd811,0xd811,0x92,0xff91,0x169a,0x16d9,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0x44,0x44,0x44,0x44,0x44,4,4,0x92,0xff91,
0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
-0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x792,0x92,0xff91,0x92,
-0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xf891,0x92,0xff91,0x92,0xff91,
0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
-0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0x1812,0x1812,0x1812,
-0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,
-0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0,0,4,0,0,0,0,0,0,
-1,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,
+0x92,0xff91,0x92,0xff91,0x792,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,
+0xff91,0x92,0xff91,0xf891,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,0,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,
+0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0,
+0,4,0,0,0,0,0,0,1,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,
0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,
-0xe811,0xe811,0xe811,0x16f9,1,0,0,0,0,0,0,0,0,0x64,0x44,0x44,
-0x44,0x44,0x64,0x44,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64,
-0x64,0x64,0x64,0x64,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x44,0x64,0x64,0x64,0x64,
-0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0x64,0,0x64,0x64,0,
-0x44,0x64,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0x1719,1,0,0,0,
+0,0,0,0,0,0x64,0x44,0x44,0x44,0x44,0x64,0x44,0x44,0x44,0x64,0x64,
+0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x64,0x44,
+0x44,0x64,0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,
+0x64,0x64,0,0x64,0,0x64,0x64,0,0x44,0x64,0,0x64,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-4,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,
-4,4,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,
-0x44,0x44,0x44,0x44,0x64,0x64,0x64,0,4,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
-0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44,
-0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x64,0x44,0x44,0x64,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0x64,0,0,0,
+0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,
+0,0,0,0,4,4,4,4,4,4,0,0,0,0,0,0,
+0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0,
+4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,4,0,0x44,
-0x44,0x44,0x44,0x64,0x44,4,4,0x44,0x44,0,0x64,0x44,0x44,0x64,0,0,
+0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0x64,
+0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44,
+0x64,0x44,0x44,0x64,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,
+0x44,0x44,0x44,0x44,0x44,4,0,0x44,0x44,0x44,0x44,0x64,0x44,4,4,0x44,
+0x44,0,0x64,0x44,0x44,0x64,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,4,0,0x64,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,4,0,0x64,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x64,0x44,0x44,
+0x64,0x44,0x44,0x64,0x64,0x64,0x44,0x64,0x64,0x44,0x64,0x44,0x44,0x44,0x64,0x44,
+0x64,0x44,0x64,0x44,0x64,0x44,0x44,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x44,0x64,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x64,0x44,0x64,
-0x64,0x44,0x64,0x44,0x44,0x44,0x64,0x44,0x64,0x44,0x64,0x44,0x64,0x44,0x44,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,
+4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,
-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44,
+4,4,0,0,0,0,4,0,0,0x64,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x44,
-0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44,4,4,0,0,0,0,4,0,
-0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,4,0x44,
-0x44,0x44,0x44,0x44,4,0x44,0x44,0x44,4,0x44,0x44,0x44,0x44,0x44,0,0,
+0,0,0x44,0x44,0x44,0x44,4,0x44,0x44,0x44,0x44,0x44,4,0x44,0x44,0x44,
+4,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0x64,0x64,0x64,0,0,0,0,
-0x44,0x44,4,0x64,0x44,0x44,0x64,0x44,0x44,0x64,0x44,0x44,0x44,0x64,0x64,0x64,
-0x64,0x64,0x64,0x44,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44,
+0,0x64,0x64,0x64,0,0,0,0,0x44,0x44,4,0x64,0x44,0x44,0x64,0x44,
+0x44,0x64,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x64,0x44,
+0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0x64,0x44,0x44,0x44,0x44,
+0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,4,4,4,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
-4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,4,0,0x64,0,0,0,
+0,4,4,4,4,4,4,4,4,0,0,0,0,0x64,0,0,
+0,0x44,0x64,0x44,0x44,4,4,4,0,0,0,0,0,0,0,0,
+0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,
+0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,4,0,0x64,0,0,0,0,4,4,4,4,4,4,4,
-4,0,0,0,0,0x64,0,0,0,0x44,0x64,0x44,0x44,4,4,4,
-0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,
-0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,
+0x64,0,0,0,0,4,4,4,4,0,0,0,0,0,0,0,
+0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0x64,0,0,0,0,4,4,4,
-4,0,0,0,0,0,0,0,0,0x64,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,
+0,0,0x44,0,0,4,4,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0x44,0,0,4,4,0,
+0,0,0,0,0,4,4,0,0,0,0,4,4,0,0,4,
+4,0x64,0,0,0,4,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,4,4,0,0,0,4,0,0,
+0,0,0,0,0,0,0,0,0,4,4,4,4,4,0,4,
+4,0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,
-0,0,0,4,4,0,0,4,4,0x64,0,0,0,4,0,0,
+0,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-4,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,
-0,4,4,4,4,4,0,4,4,0,0,0,0,0x64,0,0,
+0,0,0,0,0x64,0,0,4,0,4,4,4,4,0,0,0,
+0,0,0,0,0,0x64,0,0,0,0,0,0,0,0,4,0,
+0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,
+0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0x64,0,0,4,
-0,4,4,4,4,0,0,0,0,0,0,0,0,0x64,0,0,
-0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,
-0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,
+0,0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,4,0,0,0,0,0,4,4,
+4,0,4,4,4,0x64,0,0,0,0,0,0,0,0x64,0x64,0,
+0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,
+4,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-4,0,0,0,0,0,0,0,0,0,0,0,0,0x64,0,0,
+0,0,0,0,0,0,0,0x64,0x64,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0x64,0,0,0,0,0,0,0,4,4,
+4,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,4,0,0,4,4,4,4,0x64,0x64,0x64,0,
+0,0,0,0,0,0,4,4,0x64,0x64,0x64,0x64,4,4,4,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,
+0,4,0,0,4,4,4,4,0x64,0x64,0x64,4,4,0,0,0,
+0,0,0,0,0,0,4,0,0x64,0x64,0x64,0x64,4,4,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-4,0,0,0,0,0,4,4,4,0,4,4,4,0x64,0,0,
-0,0,0,0,0,0x64,0x64,0,0,0,0,0,0,0,0,0,
-0,0,4,0,0,0,0,0,4,0x64,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,
+0,0,0,0,0,0,0,0,0x64,0x64,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,
-0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,0,
-0,0,0,0,0,0,4,4,4,0,4,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
-4,4,4,4,0x64,0x64,0x64,0,0,0,0,0,0,0,4,4,
-0x64,0x64,0x64,0x64,4,4,4,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,4,0,0,4,4,4,4,
-0x64,0x64,0,4,4,0,0,0,0,0,0,0,0,0,4,0,
-0x64,0x64,0x64,0x64,4,4,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0x64,0,0x64,0,0x64,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0x64,0x64,4,0x64,4,4,4,4,4,0x64,0x64,0x64,0x64,4,0,
-0x64,4,0x44,0x44,0x64,0,0x44,0x44,0,0,0,0,0,4,4,4,
-4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,
+0,0x64,0,0x64,0,0x64,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0x64,0x64,4,0x64,4,4,4,
+4,4,0x64,0x64,0x64,0x64,4,0,0x64,4,0x44,0x44,0x64,0,0x44,0x44,
+0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,
+0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
-4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,
-0,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,
-4,0,4,4,4,4,4,0x64,0,0x64,0x64,0,0,4,4,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,4,4,0,0,0,0,4,4,
-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,
-0,0,4,0,0,4,4,0,0,0,0,0,0,0x64,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
-0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,
-0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,
-0x177a,0x177a,0,0x177a,0,0,0,0,0,0x177a,0,0,0x1799,0x17c9,0x17f9,0x1829,
-0x1859,0x1889,0x18b9,0x18e9,0x1919,0x1949,0x1979,0x19a9,0x19d9,0x1a09,0x1a39,0x1a69,0x1a99,0x1ac9,0x1af9,0x1b29,
-0x1b59,0x1b89,0x1bb9,0x1be9,0x1c19,0x1c49,0x1c79,0x1ca9,0x1cd9,0x1d09,0x1d39,0x1d69,0x1d99,0x1dc9,0x1df9,0x1e29,
-0x1e59,0x1e89,0x1eb9,0x1ee9,0x1f19,0x1f49,0x1f79,0,4,0x1fa9,0x1fd9,0x2009,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x203a,0x203a,0x203a,0x203a,
-0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x205a,0x205a,0x205a,0x205a,
-0x205a,0x205a,0,0,0x2079,0x20a9,0x20d9,0x2109,0x2139,0x2169,0,0,0x203a,0x203a,0x203a,0x203a,
-0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,
-0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,
-0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,4,4,0,4,4,4,4,4,
-4,4,0,0,0,0,0,0,0,0,4,0,0,4,4,4,
-4,4,4,4,4,4,0x64,4,0,0,0,4,0,0,0,0,
-0,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
-4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,
+4,0,0,0,0,0,0,0,0,0,0x64,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,4,4,4,4,0,4,4,4,4,4,0x64,
+0,0x64,0x64,0,0,4,4,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+4,4,0,0,0,0,4,4,4,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,4,4,4,4,0,0,0,
+0,0,0,0,0,0,0,0,0,0,4,0,0,4,4,0,
+0,0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,4,0,0,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,
+0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,
+0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0,0x179a,0,0,0,0,
+0,0x179a,0,0,0x17b9,0x17e9,0x1819,0x1849,0x1879,0x18a9,0x18d9,0x1909,0x1939,0x1969,0x1999,0x19c9,
+0x19f9,0x1a29,0x1a59,0x1a89,0x1ab9,0x1ae9,0x1b19,0x1b49,0x1b79,0x1ba9,0x1bd9,0x1c09,0x1c39,0x1c69,0x1c99,0x1cc9,
+0x1cf9,0x1d29,0x1d59,0x1d89,0x1db9,0x1de9,0x1e19,0x1e49,0x1e79,0x1ea9,0x1ed9,0x1f09,0x1f39,0x1f69,0x1f99,0,
+4,0x1fc9,0x1ff9,0x2029,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x44,0x44,0x44,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,
+0x205a,0x205a,0x205a,0x205a,0x207a,0x207a,0x207a,0x207a,0x207a,0x207a,0,0,0x2099,0x20c9,0x20f9,0x2129,
+0x2159,0x2189,0,0,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,
+0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,
+0x205a,0x205a,0x205a,0x205a,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,4,4,0x64,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+4,4,0,4,4,4,4,4,4,4,0,0,0,0,0,0,
+0,0,4,0,0,4,4,4,4,4,4,4,4,4,0x64,4,
+0,0,0,4,0,0,0,0,0,0x44,0,0,0,0,0,0,
+0,0,0,0,0,0,0,4,4,4,4,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,4,4,4,0,0,0,0,4,
-4,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,
-0,0x64,0x44,0x64,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0x44,0x64,0,0,4,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,4,0,4,4,4,4,4,4,4,0,
-0x64,0,4,0,0,4,4,4,4,4,4,4,4,0,0,0,
-0,0,0,4,4,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0x64,
-0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,
-0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x64,4,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x64,0,4,4,4,4,4,0,4,0,0,0,
-0,0,4,0,0x60,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,4,4,4,4,0,0,
-4,4,0x60,0x64,4,4,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0x64,0,4,4,0,0,
-0,4,0,4,4,4,0x60,0x60,0,0,0,0,0,0,0,0,
-0,0,0,0,4,4,4,4,4,4,4,4,0,0,4,0x64,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,4,4,4,4,4,4,0,0,
-0x2199,0x21c9,0x21f9,0x2229,0x2259,0x22a9,0x22f9,0x2329,0x2359,0,0,0,0,0,0,0,
-0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,
-0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0,0,0x238a,0x238a,0x238a,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0x44,0x44,0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x64,0x64,0x64,0x64,
-0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0,0,0x64,0,0,
-0,0,0,0,0x44,0,0,0,0x44,0x44,0,0,0,0,0,0,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+0,0,0,0,0,0,0,0,0,0x64,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+4,4,4,0,0,0,0,4,4,0,0,0,0,0,0,0,
+0,0,4,0,0,0,0,0,0,0x64,0x44,0x64,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0x44,0x64,0,0,4,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,
+4,4,4,4,4,4,4,0,0x64,0,4,0,0,4,4,4,
+4,4,4,4,4,0,0,0,0,0,0,4,4,0x44,0x44,0x44,
+0x44,0x44,0x44,0x44,0x44,0,0,0x64,0,0,0,0,0,0,0,4,
+0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,
+0x64,0x64,0x64,0x44,0x44,0x64,4,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x64,0,4,4,
+4,4,4,0,4,0,0,0,0,0,4,0,0x60,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0x44,0x64,0x44,0x44,0x44,
+0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,4,4,4,4,0,0,4,4,0x60,0x64,4,4,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0x64,0,4,4,0,0,0,4,0,4,4,4,0x60,0x60,
+0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,
+4,4,4,4,0,0,4,0x64,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+4,4,4,4,4,4,0,0,0x21b9,0x21e9,0x2219,0x2249,0x2279,0x22c9,0x2319,0x2349,
+0x2379,0,0,0,0,0,0,0,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,
+0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,
+0x23aa,0x23aa,0x23aa,0,0,0x23aa,0x23aa,0x23aa,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x44,0x44,0x44,0,0x64,0x64,0x64,0x64,
+0x64,0x64,0x44,0x44,0x64,0x64,0x64,0x64,0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,
+0x64,0,0,0,0,0x64,0,0,0,0,0,0,0x44,0,0,0,
+0x44,0x44,0,0,0,0,0,0,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,0x25,5,5,5,5,5,5,5,5,1,1,1,1,1,
-1,1,1,1,1,1,1,1,5,0x23a9,1,1,1,0x23c9,1,1,
-5,5,5,5,0x25,5,5,5,0x25,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,0x21,1,1,1,1,5,5,5,5,5,
-0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
-0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0,0x44,0x64,0x64,0x44,0x64,
-0x44,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x64,
-0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
-0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xffb1,0x92,0xff91,
+5,5,5,5,5,5,5,5,5,5,0x25,5,5,5,5,5,
+5,5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,
+5,0x23c9,1,1,1,0x23e9,1,1,5,5,5,5,0x25,5,5,5,
+0x25,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,0x2409,1,1,1,1,1,1,1,0x21,1,
+1,1,1,5,5,5,5,5,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
+0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64,
+0x64,0x64,0,0x44,0x64,0x64,0x44,0x64,0x44,0x44,0x64,0x44,0x44,0x44,0x44,0x44,
+0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
+0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,0x92,0xffb1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x242a,0x2469,0x92,0xff91,0x92,0xff91,0x92,0xff91,
0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
-0x23ea,0x2429,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x24a9,0x2529,0x25a9,0x2629,0x26a9,0x2729,
+1,1,0x275a,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xffb1,
0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
-0x92,0xff91,0x2469,0x24e9,0x2569,0x25e9,0x2669,0x26e9,1,1,0x271a,1,0x92,0xff91,0x92,0xff91,
-0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xffb1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
-0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x411,0x411,0x411,0x411,
-0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411,
-0x411,0x411,0,0,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0,0,0x411,0x411,0x411,0x411,
-0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411,
-0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411,
-0x411,0x411,0,0,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0,0,0x2769,0x411,0x27e9,0x411,
-0x2899,0x411,0x2949,0x411,0,0xfc12,0,0xfc12,0,0xfc12,0,0xfc12,0x411,0x411,0x411,0x411,
-0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0x2511,0x2511,0x2b11,0x2b11,
-0x2b11,0x2b11,0x3211,0x3211,0x4011,0x4011,0x3811,0x3811,0x3f11,0x3f11,0,0,0x29f9,0x2a69,0x2ad9,0x2b49,
-0x2bb9,0x2c29,0x2c99,0x2d09,0x2d7b,0x2deb,0x2e5b,0x2ecb,0x2f3b,0x2fab,0x301b,0x308b,0x30f9,0x3169,0x31d9,0x3249,
-0x32b9,0x3329,0x3399,0x3409,0x347b,0x34eb,0x355b,0x35cb,0x363b,0x36ab,0x371b,0x378b,0x37f9,0x3869,0x38d9,0x3949,
-0x39b9,0x3a29,0x3a99,0x3b09,0x3b7b,0x3beb,0x3c5b,0x3ccb,0x3d3b,0x3dab,0x3e1b,0x3e8b,0x411,0x411,0x3ef9,0x3f79,
-0x3fe9,0,0x4069,0x40e9,0xfc12,0xfc12,0xdb12,0xdb12,0x419b,4,0x4209,4,4,4,0x4259,0x42d9,
-0x4349,0,0x43c9,0x4449,0xd512,0xd512,0xd512,0xd512,0x44fb,4,4,4,0x411,0x411,0x4569,0x4619,
-0,0,0x46e9,0x4769,0xfc12,0xfc12,0xce12,0xce12,0,4,4,4,0x411,0x411,0x4819,0x48c9,
-0x4999,0x391,0x4a19,0x4a99,0xfc12,0xfc12,0xc812,0xc812,0xfc92,4,4,4,0,0,0x4b49,0x4bc9,
-0x4c39,0,0x4cb9,0x4d39,0xc012,0xc012,0xc112,0xc112,0x4deb,4,4,0,0,0,0,0,
-0,0,0,0,0,0,0,4,4,4,4,4,0,0,0,0,
-0,0,0,0,4,4,0,0,0,0,0,0,4,0,0,4,
-0,0,4,4,4,4,4,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,4,4,4,4,4,0,4,4,
-4,4,4,4,4,4,4,4,0,0x25,0,0,0,0,0,0,
-0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
-5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44,
-0x64,0x64,0x64,0x44,0x44,4,4,4,4,0x44,4,4,4,0x64,0x64,0x44,
-0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,2,
-0,0,1,2,2,2,1,1,2,2,2,1,0,2,0,0,
-0,2,2,2,2,2,0,0,0,0,0,0,2,0,0x4e5a,0,
-2,0,0x4e9a,0x4eda,2,2,0,1,2,2,0xe12,2,1,0,0,0,
-0,1,0,0,1,1,2,2,0,0,0,0,0,2,1,1,
-0x21,0x21,0,0,0,0,0xf211,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,
-0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,
-0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0,0,0,0x92,0xff91,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,
-0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xf311,0xf311,0xf311,0xf311,
-0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,
+0x92,0xff91,0x92,0xff91,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,
+0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411,0x411,0x411,0,0,0xfc12,0xfc12,0xfc12,0xfc12,
+0xfc12,0xfc12,0,0,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,
+0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,
+0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411,0x411,0x411,0,0,0xfc12,0xfc12,0xfc12,0xfc12,
+0xfc12,0xfc12,0,0,0x27a9,0x411,0x2829,0x411,0x28d9,0x411,0x2989,0x411,0,0xfc12,0,0xfc12,
+0,0xfc12,0,0xfc12,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,
+0xfc12,0xfc12,0xfc12,0xfc12,0x2511,0x2511,0x2b11,0x2b11,0x2b11,0x2b11,0x3211,0x3211,0x4011,0x4011,0x3811,0x3811,
+0x3f11,0x3f11,0,0,0x2a39,0x2aa9,0x2b19,0x2b89,0x2bf9,0x2c69,0x2cd9,0x2d49,0x2dbb,0x2e2b,0x2e9b,0x2f0b,
+0x2f7b,0x2feb,0x305b,0x30cb,0x3139,0x31a9,0x3219,0x3289,0x32f9,0x3369,0x33d9,0x3449,0x34bb,0x352b,0x359b,0x360b,
+0x367b,0x36eb,0x375b,0x37cb,0x3839,0x38a9,0x3919,0x3989,0x39f9,0x3a69,0x3ad9,0x3b49,0x3bbb,0x3c2b,0x3c9b,0x3d0b,
+0x3d7b,0x3deb,0x3e5b,0x3ecb,0x411,0x411,0x3f39,0x3fb9,0x4029,0,0x40a9,0x4129,0xfc12,0xfc12,0xdb12,0xdb12,
+0x41db,4,0x4249,4,4,4,0x4299,0x4319,0x4389,0,0x4409,0x4489,0xd512,0xd512,0xd512,0xd512,
+0x453b,4,4,4,0x411,0x411,0x45a9,0x4659,0,0,0x4729,0x47a9,0xfc12,0xfc12,0xce12,0xce12,
+0,4,4,4,0x411,0x411,0x4859,0x4909,0x49d9,0x391,0x4a59,0x4ad9,0xfc12,0xfc12,0xc812,0xc812,
+0xfc92,4,4,4,0,0,0x4b89,0x4c09,0x4c79,0,0x4cf9,0x4d79,0xc012,0xc012,0xc112,0xc112,
+0x4e2b,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4,
+4,4,4,4,0,0,0,0,0,0,0,0,4,4,0,0,
+0,0,0,0,4,0,0,4,0,0,4,4,4,4,4,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,
+0,0x25,0,0,0,0,0,0,0,0,0,0,0,0,0,5,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x44,0x44,4,4,4,
+4,0x44,4,4,4,0x64,0x64,0x44,0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,
+0x44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,0,0,0,0,2,0,0,1,2,2,2,1,1,
+2,2,2,1,0,2,0,0,0,2,2,2,2,2,0,0,
+0,0,0,0,2,0,0x4e9a,0,2,0,0x4eda,0x4f1a,2,2,0,1,
+2,2,0xe12,2,1,0,0,0,0,1,0,0,1,1,2,2,
+0,0,0,0,0,2,1,1,0x21,0x21,0,0,0,0,0xf211,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,
+0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,
+0,0,0,0x92,0xff91,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,
+0xd12,0xd12,0xd12,0xd12,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,
+0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x1812,0x1812,0x1812,0x1812,
0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,
-0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,
+0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0,
0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,
-0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0,0x92,0xff91,0x4f1a,0x4f3a,0x4f5a,0x4f79,0x4f99,0x92,
-0xff91,0x92,0xff91,0x92,0xff91,0x4fba,0x4fda,0x4ffa,0x501a,1,0x92,0xff91,1,0x92,0xff91,1,
-1,1,1,1,0x25,5,0x503a,0x503a,0x92,0xff91,0x92,0xff91,1,0,0,0,
-0,0,0,0x92,0xff91,0x92,0xff91,0x44,0x44,0x44,0x92,0xff91,0,0,0,0,
-0,0,0,0,0,0,0,0,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,
-0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,
-0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0,0x5059,0,0,0,0,
-0,0x5059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
+0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0,
+0x92,0xff91,0x4f5a,0x4f7a,0x4f9a,0x4fb9,0x4fd9,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x4ffa,0x501a,0x503a,
+0x505a,1,0x92,0xff91,1,0x92,0xff91,1,1,1,1,1,0x25,5,0x507a,0x507a,
+0x92,0xff91,0x92,0xff91,1,0,0,0,0,0,0,0x92,0xff91,0x92,0xff91,0x44,
+0x44,0x44,0x92,0xff91,0,0,0,0,0,0,0,0,0,0,0,0,
+0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,
+0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,
+0x5099,0x5099,0,0x5099,0,0,0,0,0,0x5099,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,
0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
-0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,
-0,0,0x64,0x64,0x64,0x64,0x60,0x60,0,4,4,4,4,4,0,0,
-0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,0x64,4,
-4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0x92,0xff91,0x92,0xff91,
-0x92,0xff91,0x92,0xff91,0x92,0xff91,0x507a,0x50b9,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
-0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0x44,
-4,4,4,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,4,
-0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
-0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,5,5,0x44,0x44,
+0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
+0,0,0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x60,0x60,
+0,4,4,4,4,4,0,0,0,0,0,4,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+0,0,0,0,0,0x64,0x64,4,4,4,4,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,4,4,4,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x50ba,0x50f9,
+0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0x44,4,4,4,0,0x44,0x44,0x44,0x44,
+0x44,0x44,0x44,0x44,0x44,0x44,0,4,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,5,5,0x44,0x44,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x44,0x44,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
-4,4,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
-1,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
-0x92,0xff91,0x92,0xff91,5,1,1,1,1,1,1,1,1,0x92,0xff91,0x92,
-0xff91,0x50fa,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,4,4,4,0x92,
-0xff91,0x511a,1,0,0x92,0xff91,0x92,0xff91,1,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,
-0x92,0xff91,0x92,0xff91,0x92,0xff91,0x513a,0x515a,0x517a,0x519a,0x513a,1,0x51ba,0x51da,0x51fa,0x521a,
-0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-5,5,1,0,0,0,0,0,0,0,4,0,0,0,0x64,0,
-0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0x64,4,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
-0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,
-0,0,0,4,0,0,0,0,0,0,4,4,4,4,4,0x64,
-0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,
-4,4,0,0x60,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0x64,0,0,4,4,4,4,0,0,
-4,0,0,0,0x60,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,4,4,4,4,4,4,0,0,4,4,0,
-0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4,
-0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
-0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0x44,0,0x44,0x44,
-0x64,0,0,0x44,0x44,0,0,0,0,0,0x44,0x44,0,0x44,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,4,
-4,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,0x5239,1,1,1,1,1,1,1,4,
-5,5,5,5,1,1,1,1,1,1,0,0,0,0,0,0,
-0,0,0,0,0x5259,0x5289,0x52b9,0x52e9,0x5319,0x5349,0x5379,0x53a9,0x53d9,0x5409,0x5439,0x5469,
-0x5499,0x54c9,0x54f9,0x5529,0x5b59,0x5b89,0x5bb9,0x5be9,0x5c19,0x5c49,0x5c79,0x5ca9,0x5cd9,0x5d09,0x5d39,0x5d69,
-0x5d99,0x5dc9,0x5df9,0x5e29,0x5e59,0x5e89,0x5eb9,0x5ee9,0x5f19,0x5f49,0x5f79,0x5fa9,0x5fd9,0x6009,0x6039,0x6069,
-0x6099,0x60c9,0x60f9,0x6129,0x5559,0x5589,0x55b9,0x55e9,0x5619,0x5649,0x5679,0x56a9,0x56d9,0x5709,0x5739,0x5769,
-0x5799,0x57c9,0x57f9,0x5829,0x5859,0x5889,0x58b9,0x58e9,0x5919,0x5949,0x5979,0x59a9,0x59d9,0x5a09,0x5a39,0x5a69,
-0x5a99,0x5ac9,0x5af9,0x5b29,0,0,0,0,0,4,0,0,4,0,0,0,
-0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x6159,0x61d9,0x6259,0x62d9,0x6389,0x6439,0x64d9,0,0,0,0,0,
-0,0,0,0,0,0,0,0x6579,0x65f9,0x6679,0x66f9,0x6779,0,0,0,0,
-0,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,
-4,4,4,4,4,4,4,4,0,0,0,4,0,0,0,0,
-0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,
-0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,4,0,0,4,0,0,
-0,0,0,0,0,0,0,0,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,
+4,4,4,4,4,4,4,4,4,4,0x92,0xff91,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,1,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,5,1,1,1,
+1,1,1,1,1,0x92,0xff91,0x92,0xff91,0x513a,0x92,0xff91,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,4,4,4,0x92,0xff91,0x515a,1,0,0x92,0xff91,0x92,0xff91,
+0x1811,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x517a,0x519a,
+0x51ba,0x51da,0x517a,1,0x51fa,0x521a,0x523a,0x525a,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
+0x92,0xff91,0x92,0xff91,0,0,0x92,0xff91,0xe812,0x527a,0x529a,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,5,5,1,0,0,0,0,0,0,0,4,0,
+0,0,0x64,0,0,0,0,4,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x64,4,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
+0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,
+0,0,0,0,0,0,0,4,0,0,0,0,0,0,4,4,
+4,4,4,0x64,0x64,0x64,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,
+4,4,4,4,4,4,0,0x60,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0x64,0,0,4,4,
+4,4,0,0,4,4,0,0,0x60,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,0,
+0,4,4,0,0,4,4,0,0,0,0,0,0,0,0,0,
+0,0,0,4,0,0,0,0,0,0,0,0,4,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x44,0,0x44,0x44,0x64,0,0,0x44,0x44,0,0,0,0,0,0x44,0x44,
+0,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,
+0,0,0,4,4,0,0x64,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,0x52b9,1,1,1,1,
+1,1,1,4,5,5,5,5,1,1,1,1,1,1,1,1,
+0,0,0,0,0,0,0,0,0x52d9,0x5309,0x5339,0x5369,0x5399,0x53c9,0x53f9,0x5429,
+0x5459,0x5489,0x54b9,0x54e9,0x5519,0x5549,0x5579,0x55a9,0x5bd9,0x5c09,0x5c39,0x5c69,0x5c99,0x5cc9,0x5cf9,0x5d29,
+0x5d59,0x5d89,0x5db9,0x5de9,0x5e19,0x5e49,0x5e79,0x5ea9,0x5ed9,0x5f09,0x5f39,0x5f69,0x5f99,0x5fc9,0x5ff9,0x6029,
+0x6059,0x6089,0x60b9,0x60e9,0x6119,0x6149,0x6179,0x61a9,0x55d9,0x5609,0x5639,0x5669,0x5699,0x56c9,0x56f9,0x5729,
+0x5759,0x5789,0x57b9,0x57e9,0x5819,0x5849,0x5879,0x58a9,0x58d9,0x5909,0x5939,0x5969,0x5999,0x59c9,0x59f9,0x5a29,
+0x5a59,0x5a89,0x5ab9,0x5ae9,0x5b19,0x5b49,0x5b79,0x5ba9,0,0,0,0,0,4,0,0,
+4,0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x61d9,0x6259,0x62d9,0x6359,0x6409,0x64b9,0x6559,0,
+0,0,0,0,0,0,0,0,0,0,0,0x65f9,0x6679,0x66f9,0x6779,0x67f9,
+0,0,0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,
+4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,4,
+0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,
+0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,
+0,4,0,0,0,0,0,0,0,0,0,0,0,0x1012,0x1012,0x1012,
0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,
-0x1012,0x1012,0x1012,0,0,0,4,0,4,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,
+0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0,0,0,4,0,4,0xf011,0xf011,0xf011,
0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,
-0xf011,0xf011,0xf011,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,
+0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,0,0,
-0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0x1412,0x1412,0x1412,0x1412,
+0,0x64,0,0,0x64,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,
+0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,
0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,
-0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0xec11,0xec11,0xec11,0xec11,
0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,
-0xec11,0xec11,0xec11,0xec11,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,
-0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0,0,0,0,0xec11,0xec11,0xec11,0xec11,
+0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,
+0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0,0,0,0,
0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,
-0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0,0,0,0,0,4,4,4,
-0,4,4,0,0,0,0,0,4,0x64,4,0x44,0,0,0,0,
+0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0,0,0,0,
+0,4,4,4,0,4,4,0,0,0,0,0,4,0x64,4,0x44,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x44,0x64,0x64,0,0,0,0,0x64,0,0,0,0,
-0,0x44,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0x2012,0x2012,0x2012,0x2012,
+0,0,0,0,0,0,0,0,0x44,0x64,0x64,0,0,0,0,0x64,
+0,0,0,0,0,0x44,0x64,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,
0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,
-0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0xe011,0xe011,0xe011,0xe011,
+0x2012,0x2012,0x2012,0,0,0,0,0,0,0,0,0,0,0,0,0,
0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,
-0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0x64,0x64,0x44,0x44,0x44,0x64,
-0x44,0x64,0x64,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,
+0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,
+0xe011,0xe011,0xe011,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,0x64,
+0x44,0x44,0x44,0x64,0x44,0x64,0x64,0x64,0x64,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-4,4,4,4,4,4,4,4,4,4,0x64,0,0,0,0,0,
+0,0,0,0,4,4,4,4,4,4,4,4,4,4,0x64,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,4,4,4,4,0,0,0x64,0x64,0,
-0,4,0,0,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,0,
+0,0x64,0x64,0,0,4,0,0,0x44,0x44,0x44,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,4,4,4,4,4,0,4,4,4,
-4,4,4,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0x64,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,
+0,4,4,4,4,4,4,0x64,0x64,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,4,4,4,4,4,4,4,4,4,0,0x60,0,0,0,
-0,0,0,0,0,4,0x64,4,4,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
-4,4,0,0,4,0x60,0x64,4,0,0,0,0,0,0,4,0,
-0,0,0,4,4,4,4,4,4,0x64,0x64,0,0,0,0,0,
+0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,0,
+0x60,0,0,0,0,0,0,0,0,4,0x64,4,4,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-4,0,0,0,0,0,0,0,0,0,0,0,0,0x60,0,0,
+0,0,0,4,4,4,0,0,4,0x60,0x64,4,0,0,0,0,
+0,0,4,0,0,0,0,4,4,4,4,4,4,0x64,0x64,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0x44,0x44,0x44,0x44,
-0x44,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,4,
-4,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0x44,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
-4,4,4,4,4,0,4,0,0,0,0,4,4,0,0x64,0x64,
+0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,
+0,0x60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,
+0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0x64,4,4,0,0x64,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x44,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,
-4,4,0,0,0,0,0,0,4,4,0,0x64,0x64,0,0,0,
+0,0,0,4,4,4,4,4,4,0,4,0,0,0,0,4,
+4,0,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
-4,4,4,4,4,4,4,0,0,4,0,0x64,0,0,0,0,
-0,0,0,0,0,0,0,4,0,4,0,0,4,4,4,4,
-4,4,0x60,0x64,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,4,4,4,4,0,0,0,0,0,0,4,4,0,0x64,
+0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,4,4,4,0,0,4,4,4,4,0,4,4,4,4,0x64,
+0,0,0,4,4,4,4,4,4,4,4,0,0,4,0,0x64,
+0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,0,
+4,4,4,4,4,4,0x60,0x64,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,
-0,0x64,0x64,0,0,0,0,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,
+0,0,0,0,0,4,4,4,0,0,4,4,4,4,0,4,
+4,4,4,0x64,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,
+4,4,4,4,0,0x64,0x64,0,0,0,0,0,0x1012,0x1012,0x1012,0x1012,
0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,
-0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,
+0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0xf011,0xf011,0xf011,0xf011,
0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,
-0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0,4,4,4,4,4,4,4,
-4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,4,0x64,4,4,4,
-4,0,0,4,4,4,4,0,0,0,0,0,0,0,0,0x64,
-0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,0,
-0,4,4,4,0,0,0,0,0,0,0,0,0,0,4,4,
-4,4,4,4,4,4,4,4,4,4,4,0,4,0x64,0,0,
+0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-4,4,4,4,4,4,4,0,4,4,4,4,4,4,0,0x64,
-4,4,4,4,4,4,4,4,0,0,4,4,4,4,4,4,
-4,0,4,4,0,4,4,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,0,
-0,0,4,0,4,4,0,4,4,4,0x64,4,0x64,0x64,0,4,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,4,4,0,0,0,4,0,0x64,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,
+4,4,4,4,0,0,4,4,0,0,0,0,0,4,4,4,
+4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
+0x64,4,4,4,4,0,0,4,4,4,4,0,0,0,0,0,
+0,0,0,0x64,0,0,0,0,0,0,0,0,0,4,4,4,
+4,4,4,0,0,4,4,4,0,0,0,0,0,0,0,0,
+0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,0,
+4,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,4,4,4,4,4,4,4,0,4,4,4,4,
+4,4,0,0x64,4,4,4,4,4,4,4,4,0,0,4,4,
+4,4,4,4,4,0,4,4,0,4,4,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,
+4,4,4,0,0,0,4,0,4,4,0,4,4,4,0x64,4,
+0x64,0x64,0,4,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,
+0,4,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,
+4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x64,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,
-4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,
+4,4,4,4,4,4,4,4,4,4,0,4,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,4,0x64,0,0,0,0,0,0,0x60,0x60,0x64,
-0x64,0x64,0,0,0,0x60,0x60,0x60,0x60,0x60,0x60,4,4,4,4,4,
-4,4,4,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0x44,0x44,0x44,
-0x44,0x44,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,4,0x64,0,0,0,0,0,
+0,0x60,0x60,0x64,0x64,0x64,0,0,0,0x60,0x60,0x60,0x60,0x60,0x60,4,
+4,4,4,4,4,4,4,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,
+0,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,
+0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0x44,0x44,0x44,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,
-1,1,0x21,0x21,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,1,1,1,1,1,1,1,0,0x21,0x21,1,1,1,1,
-1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
+0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,
1,1,1,1,1,1,0x21,0x21,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,2,0,2,2,0,0,2,0,
-0,2,2,0,0,2,2,2,2,0,2,2,2,2,2,2,
-2,2,1,1,1,1,0,1,0,1,0x21,0x21,1,1,1,1,
-0,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,
-2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,
-2,2,0,2,2,2,2,0,0,2,2,2,2,2,2,2,
-2,0,2,2,2,2,2,2,2,0,1,1,1,1,1,1,
-1,1,0x21,0x21,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,2,2,0,2,2,2,2,0,2,2,2,2,
-2,0,2,0,0,0,2,2,2,2,2,2,2,0,1,1,
-1,1,1,1,1,1,0x21,0x21,1,1,1,1,1,1,1,1,
-1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,2,1,1,1,1,1,1,0,0,
+2,2,2,2,2,2,1,1,1,1,1,1,1,0,0x21,0x21,
+1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,2,2,0,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,0,1,1,1,1,1,1,2,2,2,2,2,2,
+2,2,1,1,1,1,1,1,1,1,0x21,0x21,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,2,0,2,2,
+0,0,2,0,0,2,2,0,0,2,2,2,2,0,2,2,
+2,2,2,2,2,2,1,1,1,1,0,1,0,1,0x21,0x21,
+1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,
+1,1,1,1,2,2,0,2,2,2,2,0,0,2,2,2,
+2,2,2,2,2,0,2,2,2,2,2,2,2,0,1,1,
+1,1,1,1,1,1,0x21,0x21,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,2,2,0,2,2,2,2,0,
+2,2,2,2,2,0,2,0,0,0,2,2,2,2,2,2,
+2,0,1,1,1,1,1,1,1,1,0x21,0x21,1,1,1,1,
+1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,
+1,1,0,0,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,0,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,0,1,1,1,1,1,1,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-1,1,1,0,1,1,1,1,1,1,2,1,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
-4,4,4,4,4,4,4,0,0,0,0,4,4,4,4,4,
-4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,
-0,4,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
+2,2,2,2,2,2,2,0,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,
+1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,1,1,1,0,1,1,1,1,1,1,2,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,4,4,4,4,4,0,4,4,4,4,4,4,4,
-4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,
-0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
-0x44,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0x44,0x44,0,0x44,0x44,
-0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,
-0,0,0,0,0,0,0,0,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,
+0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,
+4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,4,
+4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,
+0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,
+4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,4,4,4,4,4,0,4,4,4,
+4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,
+0x44,0x44,0x44,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
+0x44,0x44,0x44,0x44,0x44,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0x44,
+0x44,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,
+0x44,0x44,0x44,4,4,4,4,4,4,4,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,
+0x64,0x64,0x64,0,0,0,0,0,0,0,0,0,0x1112,0x1112,0x1112,0x1112,
0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,
-0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,
+0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0xef11,0xef11,
0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,
-0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0,
+0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0x44,0x44,0x44,0x44,
+0x44,0x44,0x64,4,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,
+2,2,0,0,0,0,0,0,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,
-0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0
};
-static const uint16_t ucase_props_exceptions[1663]={
+static const uint16_t ucase_props_exceptions[1671]={
0xc850,0x20,2,0x130,0x131,0x4810,0x20,0x841,0x6b,1,0x212a,0x841,0x73,1,0x17f,0x5c50,
0x20,2,0x130,0x131,0x844,0x4b,1,0x212a,0x844,0x53,1,0x17f,0x806,0x3bc,0x39c,0x841,
0xe5,1,0x212b,0x8c0,1,0x2220,0x73,0x73,0x53,0x53,0x53,0x73,0x1e9e,0x844,0xc5,1,
@@ -782,101 +794,102 @@ static const uint16_t ucase_props_exceptions[1663]={
0x1cc,0x1ca,0x1cb,0x80c,0x1ca,0x1cb,0x880,0x2220,0x6a,0x30c,0x4a,0x30c,0x4a,0x30c,0x809,0x1f3,
0x1f2,0x80d,0x1f3,0x1f1,0x1f2,0x80c,0x1f1,0x1f2,0x810,0x2a2b,0x810,0x2a28,0x810,0x2a3f,0x810,0x2a1f,
0x810,0x2a1c,0x810,0x2a1e,0x810,0xa54f,0x810,0xa54b,0x810,0xa528,0x810,0xa544,0x810,0x29f7,0x810,0xa541,
-0x810,0x29fd,0x810,0x29e7,0x810,0xa52a,0x1810,0xa515,0x810,0xa512,0x6800,0x3846,0x3b9,0x399,1,0x1fbe,
-0x8c0,1,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308,0x301,0x1fd3,0x841,0x3b2,1,
-0x3d0,0x841,0x3b5,1,0x3f5,0x841,0x3b8,2,0x3d1,0x3f4,0x841,0x3b9,2,0x345,0x1fbe,0x841,
-0x3ba,1,0x3f0,0x841,0x3bc,1,0xb5,0x841,0x3c0,1,0x3d6,0x841,0x3c1,1,0x3f1,0x4850,
-0x20,1,0x3c2,0x841,0x3c6,1,0x3d5,0x841,0x3c9,1,0x2126,0x8c0,1,0x3330,0x3c5,0x308,
-0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x1fe3,0x844,0x392,1,0x3d0,0x844,0x395,1,0x3f5,
-0x844,0x398,2,0x3d1,0x3f4,0x844,0x399,2,0x345,0x1fbe,0x844,0x39a,1,0x3f0,0x844,0x39c,
-1,0xb5,0x844,0x3a0,1,0x3d6,0x844,0x3a1,1,0x3f1,0x806,0x3c3,0x3a3,0x844,0x3a3,1,
-0x3c2,0x844,0x3a6,1,0x3d5,0x844,0x3a9,1,0x2126,0x806,0x3b2,0x392,0x846,0x3b8,0x398,1,
-0x3f4,0x806,0x3c6,0x3a6,0x806,0x3c0,0x3a0,0x806,0x3ba,0x39a,0x806,0x3c1,0x3a1,0x841,0x3b8,2,
-0x398,0x3d1,0x806,0x3b5,0x395,0x841,0x432,1,0x1c80,0x841,0x434,1,0x1c81,0x841,0x43e,1,
-0x1c82,0x841,0x441,1,0x1c83,0x841,0x442,2,0x1c84,0x1c85,0x841,0x44a,1,0x1c86,0x844,0x412,
-1,0x1c80,0x844,0x414,1,0x1c81,0x844,0x41e,1,0x1c82,0x844,0x421,1,0x1c83,0x844,0x422,
-2,0x1c84,0x1c85,0x844,0x42a,1,0x1c86,0x841,0x463,1,0x1c87,0x844,0x462,1,0x1c87,0x880,
-0x2220,0x565,0x582,0x535,0x552,0x535,0x582,0x810,0x1c60,0x80c,0x1c90,0x10d0,0x80c,0x1c91,0x10d1,0x80c,
-0x1c92,0x10d2,0x80c,0x1c93,0x10d3,0x80c,0x1c94,0x10d4,0x80c,0x1c95,0x10d5,0x80c,0x1c96,0x10d6,0x80c,0x1c97,
-0x10d7,0x80c,0x1c98,0x10d8,0x80c,0x1c99,0x10d9,0x80c,0x1c9a,0x10da,0x80c,0x1c9b,0x10db,0x80c,0x1c9c,0x10dc,
-0x80c,0x1c9d,0x10dd,0x80c,0x1c9e,0x10de,0x80c,0x1c9f,0x10df,0x80c,0x1ca0,0x10e0,0x80c,0x1ca1,0x10e1,0x80c,
-0x1ca2,0x10e2,0x80c,0x1ca3,0x10e3,0x80c,0x1ca4,0x10e4,0x80c,0x1ca5,0x10e5,0x80c,0x1ca6,0x10e6,0x80c,0x1ca7,
-0x10e7,0x80c,0x1ca8,0x10e8,0x80c,0x1ca9,0x10e9,0x80c,0x1caa,0x10ea,0x80c,0x1cab,0x10eb,0x80c,0x1cac,0x10ec,
-0x80c,0x1cad,0x10ed,0x80c,0x1cae,0x10ee,0x80c,0x1caf,0x10ef,0x80c,0x1cb0,0x10f0,0x80c,0x1cb1,0x10f1,0x80c,
-0x1cb2,0x10f2,0x80c,0x1cb3,0x10f3,0x80c,0x1cb4,0x10f4,0x80c,0x1cb5,0x10f5,0x80c,0x1cb6,0x10f6,0x80c,0x1cb7,
-0x10f7,0x80c,0x1cb8,0x10f8,0x80c,0x1cb9,0x10f9,0x80c,0x1cba,0x10fa,0x80c,0x1cbd,0x10fd,0x80c,0x1cbe,0x10fe,
-0x80c,0x1cbf,0x10ff,0xa10,0x97d0,0xa10,8,0x806,0x13f0,0x13f0,0x806,0x13f1,0x13f1,0x806,0x13f2,0x13f2,
-0x806,0x13f3,0x13f3,0x806,0x13f4,0x13f4,0x806,0x13f5,0x13f5,0x806,0x432,0x412,0x806,0x434,0x414,0x806,
-0x43e,0x41e,0x806,0x441,0x421,0x846,0x442,0x422,1,0x1c85,0x846,0x442,0x422,1,0x1c84,0x806,
-0x44a,0x42a,0x806,0x463,0x462,0x806,0xa64b,0xa64a,0xc10,0xbc0,0x810,0x8a04,0x810,0xee6,0x841,0x1e61,
-1,0x1e9b,0x844,0x1e60,1,0x1e9b,0x880,0x2220,0x68,0x331,0x48,0x331,0x48,0x331,0x880,0x2220,
-0x74,0x308,0x54,0x308,0x54,0x308,0x880,0x2220,0x77,0x30a,0x57,0x30a,0x57,0x30a,0x880,0x2220,
-0x79,0x30a,0x59,0x30a,0x59,0x30a,0x880,0x2220,0x61,0x2be,0x41,0x2be,0x41,0x2be,0x806,0x1e61,
-0x1e60,0xc90,0x1dbf,0x20,0x73,0x73,0x880,0x2220,0x3c5,0x313,0x3a5,0x313,0x3a5,0x313,0x880,0x3330,
-0x3c5,0x313,0x300,0x3a5,0x313,0x300,0x3a5,0x313,0x300,0x880,0x3330,0x3c5,0x313,0x301,0x3a5,0x313,
-0x301,0x3a5,0x313,0x301,0x880,0x3330,0x3c5,0x313,0x342,0x3a5,0x313,0x342,0x3a5,0x313,0x342,0x890,
-8,0x220,0x1f00,0x3b9,0x1f08,0x399,0x890,8,0x220,0x1f01,0x3b9,0x1f09,0x399,0x890,8,0x220,
-0x1f02,0x3b9,0x1f0a,0x399,0x890,8,0x220,0x1f03,0x3b9,0x1f0b,0x399,0x890,8,0x220,0x1f04,0x3b9,
-0x1f0c,0x399,0x890,8,0x220,0x1f05,0x3b9,0x1f0d,0x399,0x890,8,0x220,0x1f06,0x3b9,0x1f0e,0x399,
-0x890,8,0x220,0x1f07,0x3b9,0x1f0f,0x399,0xc90,8,0x220,0x1f00,0x3b9,0x1f08,0x399,0xc90,8,
-0x220,0x1f01,0x3b9,0x1f09,0x399,0xc90,8,0x220,0x1f02,0x3b9,0x1f0a,0x399,0xc90,8,0x220,0x1f03,
-0x3b9,0x1f0b,0x399,0xc90,8,0x220,0x1f04,0x3b9,0x1f0c,0x399,0xc90,8,0x220,0x1f05,0x3b9,0x1f0d,
-0x399,0xc90,8,0x220,0x1f06,0x3b9,0x1f0e,0x399,0xc90,8,0x220,0x1f07,0x3b9,0x1f0f,0x399,0x890,
-8,0x220,0x1f20,0x3b9,0x1f28,0x399,0x890,8,0x220,0x1f21,0x3b9,0x1f29,0x399,0x890,8,0x220,
-0x1f22,0x3b9,0x1f2a,0x399,0x890,8,0x220,0x1f23,0x3b9,0x1f2b,0x399,0x890,8,0x220,0x1f24,0x3b9,
-0x1f2c,0x399,0x890,8,0x220,0x1f25,0x3b9,0x1f2d,0x399,0x890,8,0x220,0x1f26,0x3b9,0x1f2e,0x399,
-0x890,8,0x220,0x1f27,0x3b9,0x1f2f,0x399,0xc90,8,0x220,0x1f20,0x3b9,0x1f28,0x399,0xc90,8,
-0x220,0x1f21,0x3b9,0x1f29,0x399,0xc90,8,0x220,0x1f22,0x3b9,0x1f2a,0x399,0xc90,8,0x220,0x1f23,
-0x3b9,0x1f2b,0x399,0xc90,8,0x220,0x1f24,0x3b9,0x1f2c,0x399,0xc90,8,0x220,0x1f25,0x3b9,0x1f2d,
-0x399,0xc90,8,0x220,0x1f26,0x3b9,0x1f2e,0x399,0xc90,8,0x220,0x1f27,0x3b9,0x1f2f,0x399,0x890,
-8,0x220,0x1f60,0x3b9,0x1f68,0x399,0x890,8,0x220,0x1f61,0x3b9,0x1f69,0x399,0x890,8,0x220,
-0x1f62,0x3b9,0x1f6a,0x399,0x890,8,0x220,0x1f63,0x3b9,0x1f6b,0x399,0x890,8,0x220,0x1f64,0x3b9,
-0x1f6c,0x399,0x890,8,0x220,0x1f65,0x3b9,0x1f6d,0x399,0x890,8,0x220,0x1f66,0x3b9,0x1f6e,0x399,
-0x890,8,0x220,0x1f67,0x3b9,0x1f6f,0x399,0xc90,8,0x220,0x1f60,0x3b9,0x1f68,0x399,0xc90,8,
-0x220,0x1f61,0x3b9,0x1f69,0x399,0xc90,8,0x220,0x1f62,0x3b9,0x1f6a,0x399,0xc90,8,0x220,0x1f63,
-0x3b9,0x1f6b,0x399,0xc90,8,0x220,0x1f64,0x3b9,0x1f6c,0x399,0xc90,8,0x220,0x1f65,0x3b9,0x1f6d,
-0x399,0xc90,8,0x220,0x1f66,0x3b9,0x1f6e,0x399,0xc90,8,0x220,0x1f67,0x3b9,0x1f6f,0x399,0x880,
-0x2220,0x1f70,0x3b9,0x1fba,0x399,0x1fba,0x345,0x890,9,0x220,0x3b1,0x3b9,0x391,0x399,0x880,0x2220,
-0x3ac,0x3b9,0x386,0x399,0x386,0x345,0x880,0x2220,0x3b1,0x342,0x391,0x342,0x391,0x342,0x880,0x3330,
-0x3b1,0x342,0x3b9,0x391,0x342,0x399,0x391,0x342,0x345,0xc90,9,0x220,0x3b1,0x3b9,0x391,0x399,
-0x846,0x3b9,0x399,1,0x345,0x880,0x2220,0x1f74,0x3b9,0x1fca,0x399,0x1fca,0x345,0x890,9,0x220,
-0x3b7,0x3b9,0x397,0x399,0x880,0x2220,0x3ae,0x3b9,0x389,0x399,0x389,0x345,0x880,0x2220,0x3b7,0x342,
-0x397,0x342,0x397,0x342,0x880,0x3330,0x3b7,0x342,0x3b9,0x397,0x342,0x399,0x397,0x342,0x345,0xc90,
-9,0x220,0x3b7,0x3b9,0x397,0x399,0x880,0x3330,0x3b9,0x308,0x300,0x399,0x308,0x300,0x399,0x308,
-0x300,0x8c0,1,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308,0x301,0x390,0x880,0x2220,
-0x3b9,0x342,0x399,0x342,0x399,0x342,0x880,0x3330,0x3b9,0x308,0x342,0x399,0x308,0x342,0x399,0x308,
-0x342,0x880,0x3330,0x3c5,0x308,0x300,0x3a5,0x308,0x300,0x3a5,0x308,0x300,0x8c0,1,0x3330,0x3c5,
-0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x3b0,0x880,0x2220,0x3c1,0x313,0x3a1,0x313,0x3a1,
-0x313,0x880,0x2220,0x3c5,0x342,0x3a5,0x342,0x3a5,0x342,0x880,0x3330,0x3c5,0x308,0x342,0x3a5,0x308,
-0x342,0x3a5,0x308,0x342,0x880,0x2220,0x1f7c,0x3b9,0x1ffa,0x399,0x1ffa,0x345,0x890,9,0x220,0x3c9,
-0x3b9,0x3a9,0x399,0x880,0x2220,0x3ce,0x3b9,0x38f,0x399,0x38f,0x345,0x880,0x2220,0x3c9,0x342,0x3a9,
-0x342,0x3a9,0x342,0x880,0x3330,0x3c9,0x342,0x3b9,0x3a9,0x342,0x399,0x3a9,0x342,0x345,0xc90,9,
-0x220,0x3c9,0x3b9,0x3a9,0x399,0xc50,0x1d5d,1,0x3a9,0xc50,0x20bf,1,0x4b,0xc50,0x2046,1,
-0xc5,0xc10,0x29f7,0xc10,0xee6,0xc10,0x29e7,0xc10,0x2a2b,0xc10,0x2a28,0xc10,0x2a1c,0xc10,0x29fd,0xc10,
-0x2a1f,0xc10,0x2a1e,0xc10,0x2a3f,0xc10,0x1c60,0x841,0xa64b,1,0x1c88,0x844,0xa64a,1,0x1c88,0xc10,
-0x8a04,0xc10,0xa528,0xc10,0xa544,0xc10,0xa54f,0xc10,0xa54b,0xc10,0xa541,0xc10,0xa512,0xc10,0xa52a,0xc10,
-0xa515,0x810,0x3a0,0xc10,0x3a0,0x806,0x13a0,0x13a0,0x806,0x13a1,0x13a1,0x806,0x13a2,0x13a2,0x806,0x13a3,
-0x13a3,0x806,0x13a4,0x13a4,0x806,0x13a5,0x13a5,0x806,0x13a6,0x13a6,0x806,0x13a7,0x13a7,0x806,0x13a8,0x13a8,
-0x806,0x13a9,0x13a9,0x806,0x13aa,0x13aa,0x806,0x13ab,0x13ab,0x806,0x13ac,0x13ac,0x806,0x13ad,0x13ad,0x806,
-0x13ae,0x13ae,0x806,0x13af,0x13af,0x806,0x13b0,0x13b0,0x806,0x13b1,0x13b1,0x806,0x13b2,0x13b2,0x806,0x13b3,
-0x13b3,0x806,0x13b4,0x13b4,0x806,0x13b5,0x13b5,0x806,0x13b6,0x13b6,0x806,0x13b7,0x13b7,0x806,0x13b8,0x13b8,
-0x806,0x13b9,0x13b9,0x806,0x13ba,0x13ba,0x806,0x13bb,0x13bb,0x806,0x13bc,0x13bc,0x806,0x13bd,0x13bd,0x806,
-0x13be,0x13be,0x806,0x13bf,0x13bf,0x806,0x13c0,0x13c0,0x806,0x13c1,0x13c1,0x806,0x13c2,0x13c2,0x806,0x13c3,
-0x13c3,0x806,0x13c4,0x13c4,0x806,0x13c5,0x13c5,0x806,0x13c6,0x13c6,0x806,0x13c7,0x13c7,0x806,0x13c8,0x13c8,
-0x806,0x13c9,0x13c9,0x806,0x13ca,0x13ca,0x806,0x13cb,0x13cb,0x806,0x13cc,0x13cc,0x806,0x13cd,0x13cd,0x806,
-0x13ce,0x13ce,0x806,0x13cf,0x13cf,0x806,0x13d0,0x13d0,0x806,0x13d1,0x13d1,0x806,0x13d2,0x13d2,0x806,0x13d3,
-0x13d3,0x806,0x13d4,0x13d4,0x806,0x13d5,0x13d5,0x806,0x13d6,0x13d6,0x806,0x13d7,0x13d7,0x806,0x13d8,0x13d8,
-0x806,0x13d9,0x13d9,0x806,0x13da,0x13da,0x806,0x13db,0x13db,0x806,0x13dc,0x13dc,0x806,0x13dd,0x13dd,0x806,
-0x13de,0x13de,0x806,0x13df,0x13df,0x806,0x13e0,0x13e0,0x806,0x13e1,0x13e1,0x806,0x13e2,0x13e2,0x806,0x13e3,
-0x13e3,0x806,0x13e4,0x13e4,0x806,0x13e5,0x13e5,0x806,0x13e6,0x13e6,0x806,0x13e7,0x13e7,0x806,0x13e8,0x13e8,
-0x806,0x13e9,0x13e9,0x806,0x13ea,0x13ea,0x806,0x13eb,0x13eb,0x806,0x13ec,0x13ec,0x806,0x13ed,0x13ed,0x806,
-0x13ee,0x13ee,0x806,0x13ef,0x13ef,0x880,0x2220,0x66,0x66,0x46,0x46,0x46,0x66,0x880,0x2220,0x66,
-0x69,0x46,0x49,0x46,0x69,0x880,0x2220,0x66,0x6c,0x46,0x4c,0x46,0x6c,0x880,0x3330,0x66,
-0x66,0x69,0x46,0x46,0x49,0x46,0x66,0x69,0x880,0x3330,0x66,0x66,0x6c,0x46,0x46,0x4c,
-0x46,0x66,0x6c,0x8c0,1,0x2220,0x73,0x74,0x53,0x54,0x53,0x74,0xfb06,0x8c0,1,0x2220,
-0x73,0x74,0x53,0x54,0x53,0x74,0xfb05,0x880,0x2220,0x574,0x576,0x544,0x546,0x544,0x576,0x880,
-0x2220,0x574,0x565,0x544,0x535,0x544,0x565,0x880,0x2220,0x574,0x56b,0x544,0x53b,0x544,0x56b,0x880,
-0x2220,0x57e,0x576,0x54e,0x546,0x54e,0x576,0x880,0x2220,0x574,0x56d,0x544,0x53d,0x544,0x56d
+0x810,0x29fd,0x810,0x29e7,0x810,0xa543,0x810,0xa52a,0x1810,0xa515,0x810,0xa512,0x6800,0x3846,0x3b9,0x399,
+1,0x1fbe,0x8c0,1,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308,0x301,0x1fd3,0x841,
+0x3b2,1,0x3d0,0x841,0x3b5,1,0x3f5,0x841,0x3b8,2,0x3d1,0x3f4,0x841,0x3b9,2,0x345,
+0x1fbe,0x841,0x3ba,1,0x3f0,0x841,0x3bc,1,0xb5,0x841,0x3c0,1,0x3d6,0x841,0x3c1,1,
+0x3f1,0x4850,0x20,1,0x3c2,0x841,0x3c6,1,0x3d5,0x841,0x3c9,1,0x2126,0x8c0,1,0x3330,
+0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x1fe3,0x844,0x392,1,0x3d0,0x844,0x395,
+1,0x3f5,0x844,0x398,2,0x3d1,0x3f4,0x844,0x399,2,0x345,0x1fbe,0x844,0x39a,1,0x3f0,
+0x844,0x39c,1,0xb5,0x844,0x3a0,1,0x3d6,0x844,0x3a1,1,0x3f1,0x806,0x3c3,0x3a3,0x844,
+0x3a3,1,0x3c2,0x844,0x3a6,1,0x3d5,0x844,0x3a9,1,0x2126,0x806,0x3b2,0x392,0x846,0x3b8,
+0x398,1,0x3f4,0x806,0x3c6,0x3a6,0x806,0x3c0,0x3a0,0x806,0x3ba,0x39a,0x806,0x3c1,0x3a1,0x841,
+0x3b8,2,0x398,0x3d1,0x806,0x3b5,0x395,0x841,0x432,1,0x1c80,0x841,0x434,1,0x1c81,0x841,
+0x43e,1,0x1c82,0x841,0x441,1,0x1c83,0x841,0x442,2,0x1c84,0x1c85,0x841,0x44a,1,0x1c86,
+0x844,0x412,1,0x1c80,0x844,0x414,1,0x1c81,0x844,0x41e,1,0x1c82,0x844,0x421,1,0x1c83,
+0x844,0x422,2,0x1c84,0x1c85,0x844,0x42a,1,0x1c86,0x841,0x463,1,0x1c87,0x844,0x462,1,
+0x1c87,0x880,0x2220,0x565,0x582,0x535,0x552,0x535,0x582,0x810,0x1c60,0x80c,0x1c90,0x10d0,0x80c,0x1c91,
+0x10d1,0x80c,0x1c92,0x10d2,0x80c,0x1c93,0x10d3,0x80c,0x1c94,0x10d4,0x80c,0x1c95,0x10d5,0x80c,0x1c96,0x10d6,
+0x80c,0x1c97,0x10d7,0x80c,0x1c98,0x10d8,0x80c,0x1c99,0x10d9,0x80c,0x1c9a,0x10da,0x80c,0x1c9b,0x10db,0x80c,
+0x1c9c,0x10dc,0x80c,0x1c9d,0x10dd,0x80c,0x1c9e,0x10de,0x80c,0x1c9f,0x10df,0x80c,0x1ca0,0x10e0,0x80c,0x1ca1,
+0x10e1,0x80c,0x1ca2,0x10e2,0x80c,0x1ca3,0x10e3,0x80c,0x1ca4,0x10e4,0x80c,0x1ca5,0x10e5,0x80c,0x1ca6,0x10e6,
+0x80c,0x1ca7,0x10e7,0x80c,0x1ca8,0x10e8,0x80c,0x1ca9,0x10e9,0x80c,0x1caa,0x10ea,0x80c,0x1cab,0x10eb,0x80c,
+0x1cac,0x10ec,0x80c,0x1cad,0x10ed,0x80c,0x1cae,0x10ee,0x80c,0x1caf,0x10ef,0x80c,0x1cb0,0x10f0,0x80c,0x1cb1,
+0x10f1,0x80c,0x1cb2,0x10f2,0x80c,0x1cb3,0x10f3,0x80c,0x1cb4,0x10f4,0x80c,0x1cb5,0x10f5,0x80c,0x1cb6,0x10f6,
+0x80c,0x1cb7,0x10f7,0x80c,0x1cb8,0x10f8,0x80c,0x1cb9,0x10f9,0x80c,0x1cba,0x10fa,0x80c,0x1cbd,0x10fd,0x80c,
+0x1cbe,0x10fe,0x80c,0x1cbf,0x10ff,0xa10,0x97d0,0xa10,8,0x806,0x13f0,0x13f0,0x806,0x13f1,0x13f1,0x806,
+0x13f2,0x13f2,0x806,0x13f3,0x13f3,0x806,0x13f4,0x13f4,0x806,0x13f5,0x13f5,0x806,0x432,0x412,0x806,0x434,
+0x414,0x806,0x43e,0x41e,0x806,0x441,0x421,0x846,0x442,0x422,1,0x1c85,0x846,0x442,0x422,1,
+0x1c84,0x806,0x44a,0x42a,0x806,0x463,0x462,0x806,0xa64b,0xa64a,0xc10,0xbc0,0x810,0x8a04,0x810,0xee6,
+0x810,0x8a38,0x841,0x1e61,1,0x1e9b,0x844,0x1e60,1,0x1e9b,0x880,0x2220,0x68,0x331,0x48,0x331,
+0x48,0x331,0x880,0x2220,0x74,0x308,0x54,0x308,0x54,0x308,0x880,0x2220,0x77,0x30a,0x57,0x30a,
+0x57,0x30a,0x880,0x2220,0x79,0x30a,0x59,0x30a,0x59,0x30a,0x880,0x2220,0x61,0x2be,0x41,0x2be,
+0x41,0x2be,0x806,0x1e61,0x1e60,0xc90,0x1dbf,0x20,0x73,0x73,0x880,0x2220,0x3c5,0x313,0x3a5,0x313,
+0x3a5,0x313,0x880,0x3330,0x3c5,0x313,0x300,0x3a5,0x313,0x300,0x3a5,0x313,0x300,0x880,0x3330,0x3c5,
+0x313,0x301,0x3a5,0x313,0x301,0x3a5,0x313,0x301,0x880,0x3330,0x3c5,0x313,0x342,0x3a5,0x313,0x342,
+0x3a5,0x313,0x342,0x890,8,0x220,0x1f00,0x3b9,0x1f08,0x399,0x890,8,0x220,0x1f01,0x3b9,0x1f09,
+0x399,0x890,8,0x220,0x1f02,0x3b9,0x1f0a,0x399,0x890,8,0x220,0x1f03,0x3b9,0x1f0b,0x399,0x890,
+8,0x220,0x1f04,0x3b9,0x1f0c,0x399,0x890,8,0x220,0x1f05,0x3b9,0x1f0d,0x399,0x890,8,0x220,
+0x1f06,0x3b9,0x1f0e,0x399,0x890,8,0x220,0x1f07,0x3b9,0x1f0f,0x399,0xc90,8,0x220,0x1f00,0x3b9,
+0x1f08,0x399,0xc90,8,0x220,0x1f01,0x3b9,0x1f09,0x399,0xc90,8,0x220,0x1f02,0x3b9,0x1f0a,0x399,
+0xc90,8,0x220,0x1f03,0x3b9,0x1f0b,0x399,0xc90,8,0x220,0x1f04,0x3b9,0x1f0c,0x399,0xc90,8,
+0x220,0x1f05,0x3b9,0x1f0d,0x399,0xc90,8,0x220,0x1f06,0x3b9,0x1f0e,0x399,0xc90,8,0x220,0x1f07,
+0x3b9,0x1f0f,0x399,0x890,8,0x220,0x1f20,0x3b9,0x1f28,0x399,0x890,8,0x220,0x1f21,0x3b9,0x1f29,
+0x399,0x890,8,0x220,0x1f22,0x3b9,0x1f2a,0x399,0x890,8,0x220,0x1f23,0x3b9,0x1f2b,0x399,0x890,
+8,0x220,0x1f24,0x3b9,0x1f2c,0x399,0x890,8,0x220,0x1f25,0x3b9,0x1f2d,0x399,0x890,8,0x220,
+0x1f26,0x3b9,0x1f2e,0x399,0x890,8,0x220,0x1f27,0x3b9,0x1f2f,0x399,0xc90,8,0x220,0x1f20,0x3b9,
+0x1f28,0x399,0xc90,8,0x220,0x1f21,0x3b9,0x1f29,0x399,0xc90,8,0x220,0x1f22,0x3b9,0x1f2a,0x399,
+0xc90,8,0x220,0x1f23,0x3b9,0x1f2b,0x399,0xc90,8,0x220,0x1f24,0x3b9,0x1f2c,0x399,0xc90,8,
+0x220,0x1f25,0x3b9,0x1f2d,0x399,0xc90,8,0x220,0x1f26,0x3b9,0x1f2e,0x399,0xc90,8,0x220,0x1f27,
+0x3b9,0x1f2f,0x399,0x890,8,0x220,0x1f60,0x3b9,0x1f68,0x399,0x890,8,0x220,0x1f61,0x3b9,0x1f69,
+0x399,0x890,8,0x220,0x1f62,0x3b9,0x1f6a,0x399,0x890,8,0x220,0x1f63,0x3b9,0x1f6b,0x399,0x890,
+8,0x220,0x1f64,0x3b9,0x1f6c,0x399,0x890,8,0x220,0x1f65,0x3b9,0x1f6d,0x399,0x890,8,0x220,
+0x1f66,0x3b9,0x1f6e,0x399,0x890,8,0x220,0x1f67,0x3b9,0x1f6f,0x399,0xc90,8,0x220,0x1f60,0x3b9,
+0x1f68,0x399,0xc90,8,0x220,0x1f61,0x3b9,0x1f69,0x399,0xc90,8,0x220,0x1f62,0x3b9,0x1f6a,0x399,
+0xc90,8,0x220,0x1f63,0x3b9,0x1f6b,0x399,0xc90,8,0x220,0x1f64,0x3b9,0x1f6c,0x399,0xc90,8,
+0x220,0x1f65,0x3b9,0x1f6d,0x399,0xc90,8,0x220,0x1f66,0x3b9,0x1f6e,0x399,0xc90,8,0x220,0x1f67,
+0x3b9,0x1f6f,0x399,0x880,0x2220,0x1f70,0x3b9,0x1fba,0x399,0x1fba,0x345,0x890,9,0x220,0x3b1,0x3b9,
+0x391,0x399,0x880,0x2220,0x3ac,0x3b9,0x386,0x399,0x386,0x345,0x880,0x2220,0x3b1,0x342,0x391,0x342,
+0x391,0x342,0x880,0x3330,0x3b1,0x342,0x3b9,0x391,0x342,0x399,0x391,0x342,0x345,0xc90,9,0x220,
+0x3b1,0x3b9,0x391,0x399,0x846,0x3b9,0x399,1,0x345,0x880,0x2220,0x1f74,0x3b9,0x1fca,0x399,0x1fca,
+0x345,0x890,9,0x220,0x3b7,0x3b9,0x397,0x399,0x880,0x2220,0x3ae,0x3b9,0x389,0x399,0x389,0x345,
+0x880,0x2220,0x3b7,0x342,0x397,0x342,0x397,0x342,0x880,0x3330,0x3b7,0x342,0x3b9,0x397,0x342,0x399,
+0x397,0x342,0x345,0xc90,9,0x220,0x3b7,0x3b9,0x397,0x399,0x880,0x3330,0x3b9,0x308,0x300,0x399,
+0x308,0x300,0x399,0x308,0x300,0x8c0,1,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308,
+0x301,0x390,0x880,0x2220,0x3b9,0x342,0x399,0x342,0x399,0x342,0x880,0x3330,0x3b9,0x308,0x342,0x399,
+0x308,0x342,0x399,0x308,0x342,0x880,0x3330,0x3c5,0x308,0x300,0x3a5,0x308,0x300,0x3a5,0x308,0x300,
+0x8c0,1,0x3330,0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x3b0,0x880,0x2220,0x3c1,
+0x313,0x3a1,0x313,0x3a1,0x313,0x880,0x2220,0x3c5,0x342,0x3a5,0x342,0x3a5,0x342,0x880,0x3330,0x3c5,
+0x308,0x342,0x3a5,0x308,0x342,0x3a5,0x308,0x342,0x880,0x2220,0x1f7c,0x3b9,0x1ffa,0x399,0x1ffa,0x345,
+0x890,9,0x220,0x3c9,0x3b9,0x3a9,0x399,0x880,0x2220,0x3ce,0x3b9,0x38f,0x399,0x38f,0x345,0x880,
+0x2220,0x3c9,0x342,0x3a9,0x342,0x3a9,0x342,0x880,0x3330,0x3c9,0x342,0x3b9,0x3a9,0x342,0x399,0x3a9,
+0x342,0x345,0xc90,9,0x220,0x3c9,0x3b9,0x3a9,0x399,0xc50,0x1d5d,1,0x3a9,0xc50,0x20bf,1,
+0x4b,0xc50,0x2046,1,0xc5,0xc10,0x29f7,0xc10,0xee6,0xc10,0x29e7,0xc10,0x2a2b,0xc10,0x2a28,0xc10,
+0x2a1c,0xc10,0x29fd,0xc10,0x2a1f,0xc10,0x2a1e,0xc10,0x2a3f,0xc10,0x1c60,0x841,0xa64b,1,0x1c88,0x844,
+0xa64a,1,0x1c88,0xc10,0x8a04,0xc10,0xa528,0xc10,0xa544,0xc10,0xa54f,0xc10,0xa54b,0xc10,0xa541,0xc10,
+0xa512,0xc10,0xa52a,0xc10,0xa515,0x810,0x3a0,0xc10,0xa543,0xc10,0x8a38,0xc10,0x3a0,0x806,0x13a0,0x13a0,
+0x806,0x13a1,0x13a1,0x806,0x13a2,0x13a2,0x806,0x13a3,0x13a3,0x806,0x13a4,0x13a4,0x806,0x13a5,0x13a5,0x806,
+0x13a6,0x13a6,0x806,0x13a7,0x13a7,0x806,0x13a8,0x13a8,0x806,0x13a9,0x13a9,0x806,0x13aa,0x13aa,0x806,0x13ab,
+0x13ab,0x806,0x13ac,0x13ac,0x806,0x13ad,0x13ad,0x806,0x13ae,0x13ae,0x806,0x13af,0x13af,0x806,0x13b0,0x13b0,
+0x806,0x13b1,0x13b1,0x806,0x13b2,0x13b2,0x806,0x13b3,0x13b3,0x806,0x13b4,0x13b4,0x806,0x13b5,0x13b5,0x806,
+0x13b6,0x13b6,0x806,0x13b7,0x13b7,0x806,0x13b8,0x13b8,0x806,0x13b9,0x13b9,0x806,0x13ba,0x13ba,0x806,0x13bb,
+0x13bb,0x806,0x13bc,0x13bc,0x806,0x13bd,0x13bd,0x806,0x13be,0x13be,0x806,0x13bf,0x13bf,0x806,0x13c0,0x13c0,
+0x806,0x13c1,0x13c1,0x806,0x13c2,0x13c2,0x806,0x13c3,0x13c3,0x806,0x13c4,0x13c4,0x806,0x13c5,0x13c5,0x806,
+0x13c6,0x13c6,0x806,0x13c7,0x13c7,0x806,0x13c8,0x13c8,0x806,0x13c9,0x13c9,0x806,0x13ca,0x13ca,0x806,0x13cb,
+0x13cb,0x806,0x13cc,0x13cc,0x806,0x13cd,0x13cd,0x806,0x13ce,0x13ce,0x806,0x13cf,0x13cf,0x806,0x13d0,0x13d0,
+0x806,0x13d1,0x13d1,0x806,0x13d2,0x13d2,0x806,0x13d3,0x13d3,0x806,0x13d4,0x13d4,0x806,0x13d5,0x13d5,0x806,
+0x13d6,0x13d6,0x806,0x13d7,0x13d7,0x806,0x13d8,0x13d8,0x806,0x13d9,0x13d9,0x806,0x13da,0x13da,0x806,0x13db,
+0x13db,0x806,0x13dc,0x13dc,0x806,0x13dd,0x13dd,0x806,0x13de,0x13de,0x806,0x13df,0x13df,0x806,0x13e0,0x13e0,
+0x806,0x13e1,0x13e1,0x806,0x13e2,0x13e2,0x806,0x13e3,0x13e3,0x806,0x13e4,0x13e4,0x806,0x13e5,0x13e5,0x806,
+0x13e6,0x13e6,0x806,0x13e7,0x13e7,0x806,0x13e8,0x13e8,0x806,0x13e9,0x13e9,0x806,0x13ea,0x13ea,0x806,0x13eb,
+0x13eb,0x806,0x13ec,0x13ec,0x806,0x13ed,0x13ed,0x806,0x13ee,0x13ee,0x806,0x13ef,0x13ef,0x880,0x2220,0x66,
+0x66,0x46,0x46,0x46,0x66,0x880,0x2220,0x66,0x69,0x46,0x49,0x46,0x69,0x880,0x2220,0x66,
+0x6c,0x46,0x4c,0x46,0x6c,0x880,0x3330,0x66,0x66,0x69,0x46,0x46,0x49,0x46,0x66,0x69,
+0x880,0x3330,0x66,0x66,0x6c,0x46,0x46,0x4c,0x46,0x66,0x6c,0x8c0,1,0x2220,0x73,0x74,
+0x53,0x54,0x53,0x74,0xfb06,0x8c0,1,0x2220,0x73,0x74,0x53,0x54,0x53,0x74,0xfb05,0x880,
+0x2220,0x574,0x576,0x544,0x546,0x544,0x576,0x880,0x2220,0x574,0x565,0x544,0x535,0x544,0x565,0x880,
+0x2220,0x574,0x56b,0x544,0x53b,0x544,0x56b,0x880,0x2220,0x57e,0x576,0x54e,0x546,0x54e,0x576,0x880,
+0x2220,0x574,0x56d,0x544,0x53d,0x544,0x56d
};
static const uint16_t ucase_props_unfold[370]={
@@ -913,16 +926,16 @@ static const UCaseProps ucase_props_singleton={
ucase_props_unfold,
{
ucase_props_trieIndex,
- ucase_props_trieIndex+3248,
+ ucase_props_trieIndex+3288,
NULL,
- 3248,
- 8816,
+ 3288,
+ 8956,
0x188,
- 0xd2c,
+ 0xd54,
0x0,
0x0,
0xe0800,
- 0x2f1c,
+ 0x2fd0,
NULL, 0, FALSE, FALSE, 0, NULL
},
{ 4,0,0,0 }
diff --git a/Build/source/libs/icu/icu-src/source/common/uchar.cpp b/Build/source/libs/icu/icu-src/source/common/uchar.cpp
index 1b84a1d075d..b54cd626d10 100644
--- a/Build/source/libs/icu/icu-src/source/common/uchar.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uchar.cpp
@@ -40,7 +40,7 @@
/* constants and macros for access to the data ------------------------------ */
/* getting a uint32_t properties word from the data */
-#define GET_PROPS(c, result) ((result)=UTRIE2_GET16(&propsTrie, c));
+#define GET_PROPS(c, result) ((result)=UTRIE2_GET16(&propsTrie, c))
/* API functions ------------------------------------------------------------ */
@@ -453,12 +453,18 @@ u_getNumericValue(UChar32 c) {
}
return numValue;
- } else if(ntv<UPROPS_NTV_RESERVED_START) {
+ } else if(ntv<UPROPS_NTV_FRACTION32_START) {
// fraction-20 e.g. 3/80
int32_t frac20=ntv-UPROPS_NTV_FRACTION20_START; // 0..0x17
int32_t numerator=2*(frac20&3)+1;
int32_t denominator=20<<(frac20>>2);
return (double)numerator/denominator;
+ } else if(ntv<UPROPS_NTV_RESERVED_START) {
+ // fraction-32 e.g. 3/64
+ int32_t frac32=ntv-UPROPS_NTV_FRACTION32_START; // 0..15
+ int32_t numerator=2*(frac32&3)+1;
+ int32_t denominator=32<<(frac32>>2);
+ return (double)numerator/denominator;
} else {
/* reserved */
return U_NO_NUMERIC_VALUE;
diff --git a/Build/source/libs/icu/icu-src/source/common/uchar_props_data.h b/Build/source/libs/icu/icu-src/source/common/uchar_props_data.h
index e9c231908e8..10c25b3048e 100644
--- a/Build/source/libs/icu/icu-src/source/common/uchar_props_data.h
+++ b/Build/source/libs/icu/icu-src/source/common/uchar_props_data.h
@@ -11,9 +11,9 @@
#ifdef INCLUDED_FROM_UCHAR_C
-static const UVersionInfo dataVersion={0xb,0,0,0};
+static const UVersionInfo dataVersion={0xc,1,0,0};
-static const uint16_t propsTrie_index[21452]={
+static const uint16_t propsTrie_index[21968]={
0x45d,0x465,0x46d,0x475,0x48d,0x495,0x49d,0x4a5,0x4ad,0x4b5,0x4bb,0x4c3,0x4cb,0x4d3,0x4db,0x4e3,
0x4e9,0x4f1,0x4f9,0x501,0x504,0x50c,0x514,0x51c,0x524,0x52c,0x528,0x530,0x538,0x540,0x545,0x54d,
0x555,0x55d,0x561,0x569,0x571,0x579,0x581,0x589,0x585,0x58d,0x592,0x59a,0x5a0,0x5a8,0x5b0,0x5b8,
@@ -21,29 +21,29 @@ static const uint16_t propsTrie_index[21452]={
0x635,0x62d,0x63d,0x645,0x47d,0x655,0x65d,0x64d,0x66d,0x66f,0x677,0x665,0x687,0x68d,0x695,0x67f,
0x6a5,0x6ab,0x6b3,0x69d,0x6c3,0x6c9,0x6d1,0x6bb,0x6e1,0x6e7,0x6ef,0x6d9,0x6ff,0x707,0x70f,0x6f7,
0x71f,0x725,0x72d,0x717,0x73d,0x743,0x74b,0x735,0x75b,0x760,0x768,0x753,0x778,0x77f,0x787,0x770,
-0x609,0x78f,0x797,0x47d,0x79f,0x7a7,0x7af,0x47d,0x7b7,0x7bf,0x7c7,0x7cc,0x7d4,0x7db,0x7e3,0x47d,
-0x5c8,0x7eb,0x7f3,0x7fb,0x803,0x555,0x813,0x80b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x81b,0x5c8,0x823,0x827,0x82f,0x5c8,0x835,0x5c8,0x83b,0x843,0x84b,0x555,0x555,0x853,
-0x85b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x860,0x868,0x5c8,0x5c8,0x870,0x878,0x880,0x888,0x890,0x5c8,0x898,0x8a0,0x8a8,
-0x8b8,0x5c8,0x8c0,0x8c2,0x8ca,0x8b0,0x5c8,0x8cd,0x8e1,0x8d5,0x8dd,0x8e9,0x5c8,0x8f1,0x8f7,0x8ff,
-0x907,0x5c8,0x917,0x91f,0x927,0x90f,0x47d,0x47d,0x937,0x93a,0x942,0x92f,0x952,0x94a,0x5c8,0x959,
-0x5c8,0x968,0x961,0x970,0x978,0x97c,0x984,0x98c,0x4fd,0x994,0x997,0x99d,0x9a4,0x997,0x524,0x9ac,
-0x4ad,0x4ad,0x4ad,0x4ad,0x9b4,0x4ad,0x4ad,0x4ad,0x9c4,0x9cc,0x9d4,0x9dc,0x9e4,0x9e8,0x9f0,0x9bc,
-0xa08,0xa10,0x9f8,0xa00,0xa18,0xa20,0xa28,0xa30,0xa48,0xa38,0xa40,0xa50,0xa58,0xa67,0xa6c,0xa5f,
-0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa7c,0xa84,0x8ff,0xa87,0xa8f,0xa96,0xa9b,0xaa3,
-0x8ff,0xaaa,0xaa9,0xaba,0xabd,0x8ff,0x8ff,0xab2,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0xacc,0xad4,0xac4,
-0x8ff,0x8ff,0x8ff,0xad9,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0xadf,0xae7,0x8ff,0xaef,0xaf6,
-0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0xa74,0xa74,0xa74,0xa74,0xafe,0xa74,0xb05,0xb0c,
-0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0x8ff,0xb14,0xb1b,0xb1f,0xb25,0x8ff,0xb2b,0xaa4,
-0x555,0xb3b,0xb33,0xb43,0x4ad,0x4ad,0x4ad,0xb4b,0x4fd,0xb53,0x5c8,0xb59,0xb69,0xb61,0xb61,0x524,
-0xb71,0xb79,0xb81,0x47d,0xb89,0x8ff,0x8ff,0xb90,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0xb98,0xb9e,
-0xbae,0xba6,0x609,0x5c8,0xbb6,0x85b,0x5c8,0xbbe,0xbc6,0xbca,0x5c8,0x5c8,0xbcf,0xbd7,0x8ff,0xbdf,
-0xaa4,0xbe7,0xbed,0x8ff,0xbe7,0xbf5,0x8ff,0xaa4,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,
-0xbfd,0x5c8,0x5c8,0x5c8,0xc05,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x609,0x78f,0x797,0x47d,0x79f,0x7a6,0x7ae,0x47d,0x7b6,0x7be,0x7c6,0x7cb,0x7d3,0x7da,0x7e2,0x47d,
+0x5c8,0x7ea,0x7f2,0x7fa,0x802,0x555,0x812,0x80a,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x81a,0x5c8,0x822,0x826,0x82e,0x5c8,0x834,0x5c8,0x83a,0x842,0x84a,0x555,0x555,0x852,
+0x85a,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x85f,0x867,0x5c8,0x5c8,0x86f,0x877,0x87f,0x887,0x88f,0x5c8,0x897,0x89f,0x8a7,
+0x8b7,0x5c8,0x8bf,0x8c1,0x8c9,0x8af,0x5c8,0x8cc,0x8e0,0x8d4,0x8dc,0x8e8,0x5c8,0x8f0,0x8f6,0x8fe,
+0x906,0x5c8,0x916,0x91e,0x926,0x90e,0x47d,0x47d,0x936,0x939,0x941,0x92e,0x951,0x949,0x5c8,0x958,
+0x5c8,0x967,0x960,0x96f,0x977,0x97b,0x983,0x98b,0x4fd,0x993,0x996,0x99c,0x9a3,0x996,0x524,0x9ab,
+0x4ad,0x4ad,0x4ad,0x4ad,0x9b3,0x4ad,0x4ad,0x4ad,0x9c3,0x9cb,0x9d3,0x9db,0x9e3,0x9e7,0x9ef,0x9bb,
+0xa07,0xa0f,0x9f7,0x9ff,0xa17,0xa1f,0xa27,0xa2f,0xa47,0xa37,0xa3f,0xa4f,0xa57,0xa66,0xa6b,0xa5e,
+0xa73,0xa73,0xa73,0xa73,0xa73,0xa73,0xa73,0xa73,0xa7b,0xa83,0x8fe,0xa86,0xa8e,0xa95,0xa9a,0xaa2,
+0x8fe,0xaa9,0xaa8,0xab9,0xabc,0x8fe,0x8fe,0xab1,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0xacb,0xad3,0xac3,
+0x8fe,0x8fe,0x8fe,0xad8,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0xade,0xae6,0x8fe,0xaee,0xaf5,
+0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0xa73,0xa73,0xa73,0xa73,0xafd,0xa73,0xb04,0xb0b,
+0xa73,0xa73,0xa73,0xa73,0xa73,0xa73,0xa73,0xa73,0x8fe,0xb13,0xb1a,0xb1e,0xb24,0x8fe,0x8fe,0x8fe,
+0x555,0xb34,0xb2c,0xb3c,0x4ad,0x4ad,0x4ad,0xb44,0x4fd,0xb4c,0x5c8,0xb52,0xb62,0xb5a,0xb5a,0x524,
+0xb6a,0xb72,0xb7a,0x47d,0xb82,0x8fe,0x8fe,0xb89,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0xb91,0xb97,
+0xba7,0xb9f,0x609,0x5c8,0xbaf,0x85a,0x5c8,0xbb7,0xbbf,0xbc3,0x5c8,0x5c8,0xbc8,0xbd0,0x8fe,0xbd8,
+0xaa3,0xbe0,0xbe6,0x8fe,0xbe0,0xbee,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,
+0xbf6,0x5c8,0x5c8,0x5c8,0xbfe,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0xc0b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc10,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0xc04,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc09,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
@@ -52,54 +52,54 @@ static const uint16_t propsTrie_index[21452]={
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x8cd,0x8ff,0x8ff,
-0xc18,0x5c8,0xc1b,0x5c8,0xc23,0xc29,0xc31,0xc39,0xc3e,0x5c8,0x5c8,0xc42,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc49,0x5c8,0xc50,0xc56,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc5e,0x5c8,0x5c8,0x5c8,0xc66,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x8cc,0x8fe,0x8fe,
+0xc11,0x5c8,0xc14,0x5c8,0xc1c,0xc22,0xc2a,0xc32,0xc37,0x5c8,0x5c8,0xc3b,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc42,0x5c8,0xc49,0xc4f,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc57,0x5c8,0x5c8,0x5c8,0xc5f,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc68,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc6f,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc61,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc68,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0xc76,0x5c8,0x5c8,0x5c8,0xc7d,0xc85,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0xc6f,0x5c8,0x5c8,0x5c8,0xc76,0xc7e,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc8a,0x5c8,0x5c8,0xc92,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc83,0x5c8,0x5c8,0xc8b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc96,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc8f,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc99,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc92,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc9c,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc95,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0xca2,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0xc9b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0xcaa,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0xca3,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0xcaf,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0xca8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xcb4,0x5c8,0x5c8,0x5c8,0xcb9,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xcad,0x5c8,0x5c8,0x5c8,0xcb2,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0xcc1,0xcc8,0xccc,0x5c8,0x5c8,0x5c8,0xcd3,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0xcba,0xcc1,0xcc5,0x5c8,0x5c8,0x5c8,0xccc,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xcd9,
-0xce9,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xcd2,
+0xce2,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0xce1,0x8ff,0xcf1,0x970,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0xcf6,0xcfe,0x4ad,0xd0e,0xd06,0x5c8,0x5c8,0xd16,0xd1e,0xd2e,0x4ad,0xd33,0xd3b,0xd41,0x47d,0xd26,
-0xd49,0xd51,0x5c8,0xd59,0xd69,0xd6c,0xd61,0xd74,0x61d,0xd7c,0xd83,0x8c1,0x66d,0xd93,0xd8b,0xd9b,
-0x5c8,0xda3,0xdab,0xdb3,0x5c8,0xdbb,0xdc3,0xdcb,0xdd3,0xddb,0xddf,0xde7,0x4fd,0x4fd,0x5c8,0xdef,
+0x5c8,0x5c8,0x5c8,0x5c8,0xcda,0x8fe,0xcea,0x96f,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0xcef,0xcf7,0x4ad,0xd07,0xcff,0x5c8,0x5c8,0xd0f,0xd17,0xd27,0x4ad,0xd2c,0xd34,0xd3a,0xd42,0xd1f,
+0xd4a,0xd52,0x5c8,0xd5a,0xd6a,0xd6d,0xd62,0xd75,0x61d,0xd7d,0xd84,0x8c0,0x66d,0xd94,0xd8c,0xd9c,
+0x5c8,0xda4,0xdac,0xdb4,0x5c8,0xdbc,0xdc4,0xdcc,0xdd4,0xddc,0xde0,0xde8,0x4fd,0x4fd,0x5c8,0xdf0,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
@@ -121,29 +121,29 @@ static const uint16_t propsTrie_index[21452]={
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xdf7,0xe03,0xdfb,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xdf8,0xe04,0xdfc,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,
-0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,
-0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,
-0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,
-0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,
-0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,
-0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,
-0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,
-0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,
-0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,
-0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,
-0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,
-0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,
-0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,
-0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0x5c8,0x5c8,0x5c8,0xe1b,0x5c8,0xcd4,0xe22,0xe27,
-0x5c8,0x5c8,0x5c8,0xe2f,0x5c8,0x5c8,0x8cc,0x47d,0xe45,0xe35,0xe3d,0x5c8,0x5c8,0xe4d,0xe55,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xe5a,0xe62,0x5c8,0xe66,0x5c8,0xe6c,0xe70,
-0xe78,0xe80,0xe87,0xe8f,0x5c8,0x5c8,0x5c8,0xe95,0xead,0x46d,0xeb5,0xebd,0xec2,0x8e1,0xe9d,0xea5,
-0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,
-0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,
+0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,
+0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,
+0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,
+0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,
+0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,
+0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,
+0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,
+0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,
+0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,
+0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,
+0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,
+0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,
+0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,
+0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,
+0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0x5c8,0x5c8,0x5c8,0xe1c,0x5c8,0xccd,0xe23,0xe28,
+0x5c8,0x5c8,0x5c8,0xe30,0x5c8,0x5c8,0x8cb,0x47d,0xe46,0xe36,0xe3e,0x5c8,0x5c8,0xe4e,0xe56,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xe5b,0xe63,0x5c8,0xe67,0x5c8,0xe6d,0xe71,
+0xe79,0xe81,0xe88,0xe90,0x5c8,0x5c8,0x5c8,0xe96,0xeae,0x46d,0xeb6,0xebe,0xec3,0x8e0,0xe9e,0xea6,
+0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,
+0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,
0x11f4,0x11f4,0x1234,0x1274,0x12b4,0x12ec,0x132c,0x136c,0x13a4,0x13e4,0x1410,0x1450,0x1490,0x14a0,0x14e0,0x1514,
0x1554,0x1584,0x15c4,0x1604,0x1614,0x1648,0x1680,0x16c0,0x1700,0x1740,0x1774,0x17a0,0x17e0,0x1818,0x1834,0x1874,
0xa80,0xac0,0xb00,0xb40,0xb80,0xa40,0xbc0,0xa40,0xbe2,0xa40,0xa40,0xa40,0xa40,0xc22,0x1db,0x1db,
@@ -182,118 +182,118 @@ static const uint16_t propsTrie_index[21452]={
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0xeca,0xed1,0xed9,0x47d,0x5c8,0x5c8,0x5c8,0xbd7,0xee9,0xee1,0xf00,0xef1,0xef8,0xf08,0xb85,0xf10,
-0x47d,0x47d,0x47d,0x47d,0x8c1,0x5c8,0xf18,0xf20,0x5c8,0xf28,0xf30,0xf34,0xf3c,0x5c8,0xf44,0x47d,
-0x555,0x55f,0xf4c,0x5c8,0xf50,0xf58,0xf68,0xf60,0x5c8,0xf70,0x5c8,0xf77,0x47d,0x47d,0x47d,0x47d,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xb69,0x8cd,0xe6c,0x47d,0x47d,0x47d,0x47d,
-0xf87,0xf7f,0xf8a,0xf92,0x8e1,0xf9a,0x47d,0xfa2,0xfaa,0xfb2,0x47d,0x47d,0x5c8,0xfc2,0xfca,0xfba,
-0xfda,0xfe1,0xfd2,0xfe9,0xff1,0x47d,0x1001,0xff9,0x5c8,0x1004,0x100c,0x1014,0x101c,0x1024,0x47d,0x47d,
-0x5c8,0x5c8,0x102c,0x47d,0x555,0x1034,0x4fd,0x103c,0x5c8,0x1044,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x47d,0x47d,0x47d,0x104c,0x47d,0x47d,0x47d,0x47d,0x1054,0x105c,0x1063,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x1073,0x5fe,0x107b,0x106b,0x952,0x1083,0x108b,0x1091,0x10a9,0x1099,0x10a1,0x10ad,0x952,0x10bd,0x10b5,0x10c5,
-0x10d5,0x10cd,0x47d,0x47d,0x10dc,0x10e4,0x620,0x10ec,0x10fc,0x1102,0x110a,0x10f4,0x47d,0x47d,0x47d,0x47d,
-0x5c8,0x1112,0x111a,0x47d,0x5c8,0x1122,0x112a,0x47d,0x47d,0x47d,0x47d,0x47d,0x5c8,0x1132,0x113a,0x47d,
-0x5c8,0x1142,0x114a,0x1152,0x5c8,0x1162,0x115a,0x47d,0x83b,0x116a,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x5c8,0x1172,0x47d,0x47d,0x47d,0x555,0x4fd,0x117a,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x1192,0x1182,0x118a,0x5c8,0x11a2,0x119a,0x5c8,0x8c2,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x11b8,0x11bd,0x11aa,0x11b2,0x11cd,0x11c5,0x47d,0x47d,0x11dc,0x11e0,0x11d4,0x11f0,0x11e8,0x115a,0x47d,0x47d,
-0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x11f4,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x8cc,0x47d,0x47d,0x47d,
-0x1204,0x120c,0x1214,0x11fc,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x121c,0x47d,0x47d,0x47d,0x47d,0x47d,
+0xecb,0xed2,0xeda,0x47d,0x5c8,0x5c8,0x5c8,0xbd0,0xeea,0xee2,0xf01,0xef2,0xef9,0xf09,0xb7e,0xf11,
+0x47d,0x47d,0x47d,0x47d,0x8c0,0x5c8,0xf19,0xf21,0x5c8,0xf29,0xf31,0xf35,0xf3d,0x5c8,0xf45,0x47d,
+0x555,0x55f,0xf4d,0x5c8,0xf51,0xf59,0xf69,0xf61,0x5c8,0xf71,0x5c8,0xf78,0x47d,0x47d,0x47d,0x47d,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xb62,0x8cc,0xe6d,0x47d,0x47d,0x47d,0x47d,
+0xf88,0xf80,0xf8b,0xf93,0x8e0,0xf9b,0x47d,0xfa3,0xfab,0xfb3,0x47d,0x47d,0x5c8,0xfc3,0xfcb,0xfbb,
+0xfdb,0xfe2,0xfd3,0xfea,0xff2,0x47d,0x1002,0xffa,0x5c8,0x1005,0x100d,0x1015,0x101d,0x1025,0x47d,0x47d,
+0x5c8,0x5c8,0x102d,0x47d,0x555,0x1035,0x4fd,0x103d,0x5c8,0x1045,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
+0x47d,0x47d,0x47d,0x104d,0x47d,0x47d,0x47d,0x47d,0x1055,0x105d,0x1064,0x47d,0x47d,0x47d,0x47d,0xb62,
+0x1074,0x5fe,0x107c,0x106c,0x951,0x1084,0x108c,0x1092,0x10aa,0x109a,0x10a2,0x10ae,0x951,0x10be,0x10b6,0x10c6,
+0x10d6,0x10ce,0x47d,0x47d,0x10dd,0x10e5,0x620,0x10ed,0x10fd,0x1103,0x110b,0x10f5,0x47d,0x47d,0x47d,0x47d,
+0x5c8,0x1113,0x111b,0x47d,0x5c8,0x1123,0x112b,0x47d,0x47d,0x47d,0x47d,0x47d,0x5c8,0x1133,0x113b,0x47d,
+0x5c8,0x1143,0x114b,0x1153,0x5c8,0x1163,0x115b,0x47d,0x83a,0x116b,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
+0x5c8,0x1173,0x47d,0x47d,0x47d,0x555,0x4fd,0x117b,0x47d,0x47d,0x47d,0x47d,0x47d,0x118b,0x118f,0x1183,
+0x11a7,0x1197,0x119f,0x5c8,0x11b7,0x11af,0x5c8,0x8c1,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
+0x11cd,0x11d2,0x11bf,0x11c7,0x11e2,0x11da,0x47d,0x47d,0x11f1,0x11f5,0x11e9,0x1205,0x11fd,0x115b,0x47d,0x47d,
+0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x1209,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x1219,0x1211,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x8cb,0x47d,0x47d,0x47d,
+0x1229,0x1231,0x1239,0x1221,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x1241,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x1224,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
+0x5c8,0x1249,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x1226,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
+0x5c8,0x5c8,0x5c8,0x5c8,0x1251,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x8c2,0x8e1,0x122e,0x47d,0x47d,0xe62,0x1236,0x5c8,0x123e,0x1246,0x124e,0xcd9,0x47d,
+0x5c8,0x5c8,0x5c8,0x8c1,0x8e0,0x1259,0x47d,0x47d,0xe63,0x1261,0x5c8,0x1269,0x1271,0x1279,0xcd2,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x47d,0x47d,0x47d,0x47d,0x555,0x4fd,0x1256,0x47d,0x47d,0x47d,0x5c8,0x5c8,0x125e,0x1263,0x126b,0x47d,
-0x47d,0x1273,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x47d,0x47d,0x47d,0x47d,0x555,0x4fd,0x1281,0x47d,0x47d,0x47d,0x5c8,0x5c8,0x1289,0x128e,0x1294,0x47d,
+0x47d,0x129c,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x127b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x1283,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
+0x5c8,0x12a4,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x12ac,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x8e1,0x47d,0x47d,0xe62,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xdfb,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
+0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x8e0,0x47d,0x12b1,0x12b8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xdfc,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x128b,0x1290,0x1298,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
+0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x12be,0x12c3,0x12cb,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x47d,0x47d,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0xb98,0x8ff,0x12a0,0x8ff,0x12a7,0x12af,0x12b5,
-0x8ff,0x12bb,0x8ff,0x8ff,0x12c3,0x47d,0x47d,0x47d,0x47d,0x12cb,0x8ff,0x8ff,0xaa6,0x12d3,0x47d,0x47d,
-0x47d,0x47d,0x12e3,0x12ea,0x12ef,0x12f5,0x12fd,0x1305,0x130d,0x12e7,0x1315,0x131d,0x1325,0x132a,0x12fc,0x12e3,
-0x12ea,0x12e6,0x12f5,0x1332,0x12e4,0x1335,0x12e7,0x133d,0x1345,0x134d,0x1354,0x1340,0x1348,0x1350,0x1357,0x1343,
-0x135f,0x12db,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,
-0x8ff,0x8ff,0x524,0x136f,0x524,0x1376,0x137d,0x1367,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
+0x47d,0x47d,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0xb91,0x8fe,0x12d3,0x8fe,0x12da,0x12e2,0x12e8,
+0x8fe,0x12ee,0x8fe,0x8fe,0x12f6,0x47d,0x47d,0x47d,0x47d,0x12fe,0x8fe,0x8fe,0xaa5,0x1306,0x47d,0x47d,
+0x47d,0x47d,0x1316,0x131d,0x1322,0x1328,0x1330,0x1338,0x1340,0x131a,0x1348,0x1350,0x1358,0x135d,0x132f,0x1316,
+0x131d,0x1319,0x1328,0x1365,0x1317,0x1368,0x131a,0x1370,0x1378,0x1380,0x1387,0x1373,0x137b,0x1383,0x138a,0x1376,
+0x1392,0x130e,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,
+0x8fe,0x8fe,0x524,0x13a2,0x524,0x13a9,0x13b0,0x139a,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x47d,0x47d,0x1384,0x138c,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
+0x47d,0x47d,0x13b7,0x13bf,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x5c8,0x13cf,0x13c7,0x47d,0x47d,0x47d,
+0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x5c8,0x13d7,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
+0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x13df,0x47d,0x555,0x13ef,0x13e7,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x1394,0x47d,0x555,0x13a4,0x139c,0x47d,0x47d,0x47d,
+0x47d,0x47d,0x47d,0x47d,0x47d,0x13f7,0x1407,0x13ff,0x47d,0x47d,0x1417,0x140f,0x47d,0x47d,0x47d,0x47d,
+0x47d,0x47d,0x1427,0x142f,0x1437,0x143f,0x1447,0x144f,0x47d,0x141f,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
+0x47d,0x47d,0x8fe,0x1457,0x8fe,0x8fe,0xb89,0x145c,0x1460,0xb91,0x1468,0x8fe,0x8fe,0x146d,0x8fe,0x12ed,
+0x47d,0x1475,0x147d,0x1481,0x1489,0x1491,0x47d,0x47d,0x47d,0x47d,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,
+0x8fe,0x1499,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,
+0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0xb91,0x14a1,0x8fe,0x8fe,0x8fe,0xb89,0x8fe,0x8fe,
+0x14a9,0x14b1,0x1457,0x8fe,0x14b9,0x8fe,0x14c1,0xb93,0x47d,0x47d,0x14c6,0x8fe,0x8fe,0x14ca,0x8fe,0x14d2,
+0x14d8,0x8fe,0x8fe,0x8fe,0xb89,0x14dd,0x14e3,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x47d,0x47d,0x47d,0x47d,0x47d,0x13ac,0x13bc,0x13b4,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x47d,0x47d,0x13cc,0x13d4,0x13dc,0x13e4,0x13ec,0x13f4,0x47d,0x13c4,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x47d,0x47d,0x8ff,0x13fc,0x8ff,0x8ff,0xb90,0x1401,0x1405,0xb98,0x140d,0x8ff,0x8ff,0x13fc,0x8ff,0x12ba,
-0x47d,0x1415,0x141d,0x1421,0x1429,0x1431,0x47d,0x47d,0x47d,0x47d,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,
-0x8ff,0x1439,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,
-0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x1441,0x1449,0x8ff,0x8ff,0x8ff,0xb90,0x8ff,0x8ff,
-0x1451,0x47d,0x13fc,0x8ff,0x1459,0x8ff,0x1461,0xb9a,0x47d,0x47d,0x13fc,0xaa4,0x8ff,0x1465,0x8ff,0x146d,
-0x141d,0x8ff,0x47d,0x47d,0x47d,0xb9a,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x47d,0x47d,0x1475,0x5c8,0x5c8,0x147c,0x5c8,0x5c8,0x5c8,0x1484,0x5c8,0x148c,0x5c8,0x5c8,0x5c8,0x5c8,
+0x47d,0x47d,0x14eb,0x5c8,0x5c8,0x14f2,0x5c8,0x5c8,0x5c8,0x14fa,0x5c8,0x1502,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0xc7a,0x5c8,0x5c8,0x1494,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x149c,0x14a4,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0xc73,0x5c8,0x5c8,0x150a,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x1512,0x151a,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xcb9,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xcb2,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x14ab,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x1521,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x14b2,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x1528,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x14b9,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x152f,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0xb69,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0xb62,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x14bd,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0xf50,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x1533,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0xf51,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x127f,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x153b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x14c2,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
+0x5c8,0x5c8,0x1543,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x47d,0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x14ca,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
-0x5c8,0x5c8,0x5c8,0xf50,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
+0x47d,0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x154b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,
+0x5c8,0x5c8,0x5c8,0xf51,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x47d,0x47d,0x47d,0x14da,0x14d2,0x14d2,0x14d2,0x47d,0x47d,0x47d,0x47d,0x524,0x524,0x524,0x524,0x524,
-0x524,0x524,0x14e2,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
+0x47d,0x47d,0x47d,0x155b,0x1553,0x1553,0x1553,0x47d,0x47d,0x47d,0x47d,0x524,0x524,0x524,0x524,0x524,
+0x524,0x524,0x1563,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
-0x47d,0x47d,0x47d,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,
-0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,
-0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,
-0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,
-0xe13,0xe13,0x14ea,0x45c,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,
+0x47d,0x47d,0x47d,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,
+0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,
+0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,
+0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,
+0xe14,0xe14,0x156b,0x45c,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,
0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,
0xf,0xf,0xf,0xf,0xc,0x17,0x17,0x17,0x19,0x17,0x17,0x17,0x14,0x15,0x17,0x18,
0x17,0x13,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,
@@ -469,7 +469,7 @@ static const uint16_t propsTrie_index[21452]={
0,0,8,8,8,0,8,8,8,6,0,0,5,0,0,0,
0,0,0,8,0,0,0,0,0,0,0,0,5,5,6,6,
0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,
-0,0,0,0,0x54b,0x58b,0x5cb,0x60b,0x58b,0x5cb,0x60b,0x1b,6,8,8,8,
+0,0,0,0x17,0x54b,0x58b,0x5cb,0x60b,0x58b,0x5cb,0x60b,0x1b,6,8,8,8,
6,5,5,5,5,5,5,5,5,0,5,5,5,0,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,
@@ -502,803 +502,827 @@ static const uint16_t propsTrie_index[21452]={
6,6,6,6,6,6,6,0,0,0,0,0x19,5,5,5,5,
5,5,4,6,6,6,6,6,6,6,6,0x17,0x49,0x89,0xc9,0x109,
0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0,0,0,0,0,5,5,0,
-5,0,0,5,5,0,5,0,0,5,0,0,0,0,0,0,
-5,5,5,5,0,5,5,5,5,5,5,5,0,5,5,5,
-0,5,0,5,0,0,5,5,0,5,5,5,5,6,5,5,
-6,6,6,6,6,6,0,6,6,5,0,0,5,5,5,5,
-5,0,4,0,6,6,6,6,6,6,0,0,0x49,0x89,0xc9,0x109,
-0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,5,5,5,5,5,0x1b,0x1b,0x1b,
-0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1b,
-0x17,0x1b,0x1b,0x1b,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x49,0x89,0xc9,0x109,
-0x149,0x189,0x1c9,0x209,0x249,0x289,0x344b,0x3c4b,0x444b,0x4c4b,0x544b,0x5c4b,0x644b,0x6c4b,0x744b,0x2c4b,
-0x1b,6,0x1b,6,0x1b,6,0x14,0x15,0x14,0x15,8,8,5,5,5,5,
-5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,
-0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,8,
-6,6,6,6,6,0x17,6,6,5,5,5,5,5,6,6,6,
-6,6,6,6,6,6,6,6,0,6,6,6,6,6,6,6,
+5,0,5,5,5,5,5,0,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0,5,0,5,
+5,5,5,5,5,5,5,5,5,6,5,5,6,6,6,6,
+6,6,6,6,6,5,0,0,5,5,5,5,5,0,4,0,
+6,6,6,6,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
+0x249,0x289,0,0,5,5,5,5,5,0x1b,0x1b,0x1b,0x17,0x17,0x17,0x17,
+0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1b,0x17,0x1b,0x1b,0x1b,
+6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
+0x249,0x289,0x344b,0x3c4b,0x444b,0x4c4b,0x544b,0x5c4b,0x644b,0x6c4b,0x744b,0x2c4b,0x1b,6,0x1b,6,
+0x1b,6,0x14,0x15,0x14,0x15,8,8,5,5,5,5,5,5,5,5,
+0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,0,0,0,0,6,6,6,
+6,6,6,6,6,6,6,6,6,6,6,8,6,6,6,6,
+6,0x17,6,6,5,5,5,5,5,6,6,6,6,6,6,6,
+6,6,6,6,0,6,6,6,6,6,6,6,6,6,6,6,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
-6,6,6,6,6,6,6,6,6,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x17,0x17,0x17,0x17,
-0x17,0x1b,0x1b,0x1b,0x1b,0x17,0x17,0,0,0,0,0,5,5,5,5,
-5,5,5,5,5,5,5,8,8,6,6,6,6,8,6,6,
-6,6,6,6,8,6,6,8,8,6,6,5,0x49,0x89,0xc9,0x109,
-0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5,
-5,5,8,8,6,6,5,5,5,5,6,6,6,5,8,8,
-8,5,5,8,8,8,8,8,8,8,5,5,5,6,6,6,
-6,5,5,5,5,5,5,5,5,5,5,5,5,5,6,8,
-8,6,6,8,8,8,8,8,8,6,5,8,0x49,0x89,0xc9,0x109,
-0x149,0x189,0x1c9,0x209,0x249,0x289,8,8,8,6,0x1b,0x1b,2,2,2,2,
+6,6,6,6,6,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b,
+0x1b,0x17,0x17,0,0,0,0,0,5,5,5,5,5,5,5,5,
+5,5,5,8,8,6,6,6,6,8,6,6,6,6,6,6,
+8,6,6,8,8,6,6,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
+0x249,0x289,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5,5,5,8,8,
+6,6,5,5,5,5,6,6,6,5,8,8,8,5,5,8,
+8,8,8,8,8,8,5,5,5,6,6,6,6,5,5,5,
+5,5,5,5,5,5,5,5,5,5,6,8,8,6,6,8,
+8,8,8,8,8,6,5,8,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
+0x249,0x289,8,8,8,6,0x1b,0x1b,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,0x17,4,2,2,2,1,1,1,1,
-1,1,0,1,0,0,0,0,0,1,0,0,2,2,2,2,
-2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,5,
-5,5,5,5,5,0,5,5,5,5,0,0,5,5,5,5,
-5,5,5,0,5,0,5,5,5,5,0,0,5,5,5,5,
-5,5,5,5,5,0,5,5,5,5,0,0,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5,
-5,5,0,0,5,5,5,5,5,5,5,0,5,0,5,5,
-5,5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,0,5,5,5,5,0,0,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,0,0,6,6,6,0x17,0x17,0x17,0x17,
-0x17,0x17,0x17,0x17,0x17,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,
-0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x788b,0,0,0,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,0,0,2,2,2,2,2,2,0,0,0x13,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,0x17,0x17,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-0xc,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,0x14,0x15,0,0,0,
-5,5,5,5,5,5,5,5,5,5,5,0x17,0x17,0x17,0x98a,0x9ca,
-0xa0a,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,
-5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5,
-5,5,6,6,6,0,0,0,0,0,0,0,0,0,0,0,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,6,6,6,0x17,0x17,0,0,0,0,0,0,0,0,0,
+2,2,2,0x17,4,2,2,2,1,1,1,1,1,1,0,1,
+0,0,0,0,0,1,0,0,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,5,5,5,5,5,5,5,5,
+5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,0,
+5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,5,
+5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,0,5,5,5,5,0,0,
+5,5,5,5,5,5,5,0,5,0,5,5,5,5,0,0,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,6,6,0,0,0,0,0,0,0,0,0,0,0,0,
-5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5,
-5,0,6,6,0,0,0,0,0,0,0,0,0,0,0,0,
+5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,0,0,6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+0x17,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,
+0x16cb,0x194b,0x1bcb,0x1e4b,0x788b,0,0,0,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0,0,0,0,0,0,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
+2,2,2,2,2,2,0,0,0x13,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,0x1b,0x17,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0xc,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,0x14,0x15,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,0x17,0x17,0x17,0x98a,0x9ca,0xa0a,5,5,5,
+5,5,5,5,5,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,0,5,5,5,5,6,6,
+6,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,
+6,0x17,0x17,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,
+0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,0,5,5,5,0,6,6,
+0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,6,6,8,6,6,6,6,6,6,6,8,8,
-8,8,8,8,8,8,6,8,8,6,6,6,6,6,6,6,
-6,6,6,6,0x17,0x17,0x17,4,0x17,0x17,0x17,0x19,5,6,0,0,
-0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,
-0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0,0,0,0,0,0,
-5,5,5,5,5,5,5,5,5,6,5,0,0,0,0,0,
+6,6,8,6,6,6,6,6,6,6,8,8,8,8,8,8,
+8,8,6,8,8,6,6,6,6,6,6,6,6,6,6,6,
+0x17,0x17,0x17,4,0x17,0x17,0x17,0x19,5,6,0,0,0x49,0x89,0xc9,0x109,
+0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0x54b,0x58b,0x5cb,0x60b,
+0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,6,5,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0x17,0x17,0x17,0x17,
+0x17,0x17,0x13,0x17,0x17,0x17,0x17,6,6,6,0x10,0,0x49,0x89,0xc9,0x109,
+0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,5,5,5,4,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x17,0x17,0x17,0x17,6,6,6,0x10,0,
-0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,
-5,5,5,4,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,
+0,0,0,0,5,5,5,5,5,6,6,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,0,0,0,0,0,0,0,5,5,5,5,5,6,6,5,
+5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,
+6,6,6,8,8,8,8,6,6,8,8,8,0,0,0,0,
+8,8,6,8,8,8,8,8,8,6,6,6,0,0,0,0,
+0x1b,0,0,0,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,
-0,0,0,0,6,6,6,8,8,8,8,6,6,8,8,8,
-0,0,0,0,8,8,6,8,8,8,8,8,8,6,6,6,
-0,0,0,0,0x1b,0,0,0,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,
-0x1c9,0x209,0x249,0x289,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,
+5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,
+5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,0,0,5,5,5,5,5,0,0,0,0,0,0,0,
-0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
-0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,
-0x149,0x189,0x1c9,0x209,0x249,0x289,0x30b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+5,5,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
+0x249,0x289,0x30b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,6,6,8,8,6,0,0,0x17,0x17,0x17,0x17,0x17,0x17,
-0x17,0x17,0x17,4,0x17,0x17,0x17,0x17,0x17,0x17,0,0,6,6,6,6,
-6,6,6,6,6,6,6,6,6,6,7,0,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,8,6,8,6,6,6,6,6,6,6,0,6,8,6,8,
-8,6,6,6,6,6,6,6,6,8,8,8,8,8,8,6,
-6,6,6,6,6,6,6,6,6,0,0,6,0x49,0x89,0xc9,0x109,
-0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,
-0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0x17,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,6,6,6,6,6,6,6,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,6,6,6,6,
-8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,6,8,6,6,
-6,6,6,8,6,8,8,8,8,8,6,8,8,5,5,5,
-5,5,5,5,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
-0x249,0x289,0x17,0x17,0x17,0x17,0x17,0x17,5,8,6,6,6,6,8,8,
-6,6,8,6,6,6,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
-0x249,0x289,5,5,5,5,5,5,6,6,8,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,6,8,6,6,8,8,
-8,6,8,6,6,6,8,8,0,0,0,0,0,0,0,0,
-0x17,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,
-0,5,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,
-5,5,5,5,8,8,8,8,8,8,8,8,6,6,6,6,
-6,6,6,6,8,8,6,6,0,0,0,0x17,0x17,0x17,0x17,0x17,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,4,4,4,4,4,4,0x17,0x17,
-2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,
+6,8,8,6,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,4,
+0x17,0x17,0x17,0x17,0x17,0x17,0,0,6,6,6,6,6,6,6,6,
+6,6,6,6,6,6,7,0,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,8,6,8,
+6,6,6,6,6,6,6,0,6,8,6,8,8,6,6,6,
+6,6,6,6,6,8,8,8,8,8,8,6,6,6,6,6,
+6,6,6,6,6,0,0,6,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
+0x249,0x289,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
+0x249,0x289,0,0,0,0,0,0,0x17,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,6,6,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,6,6,6,6,8,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,6,8,6,6,6,6,6,8,
+6,8,8,8,8,8,6,8,8,5,5,5,5,5,5,5,
+0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,
+0x17,0x17,0x17,0x17,5,8,6,6,6,6,8,8,6,6,8,6,
+6,6,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,
+5,5,5,5,6,6,8,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,6,8,6,6,8,8,8,6,8,6,
+6,6,8,8,0,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17,
+0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,5,5,5,
+0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,5,
+8,8,8,8,8,8,8,8,6,6,6,6,6,6,6,6,
+8,8,6,6,0,0,0,0x17,0x17,0x17,0x17,0x17,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,4,4,4,4,4,4,0x17,0x17,2,2,2,2,
+2,2,2,2,2,0,0,0,0,0,0,0,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,
-0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,
-6,6,6,0x17,6,6,6,6,6,6,6,6,6,6,6,6,
-6,8,6,6,6,6,6,6,6,5,5,5,5,6,5,5,
-5,5,8,8,6,5,5,8,6,6,0,0,0,0,0,0,
-2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,
+1,1,1,1,1,1,1,0,0,1,1,1,0x17,0x17,0x17,0x17,
+0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,6,6,6,0x17,
+6,6,6,6,6,6,6,6,6,6,6,6,6,8,6,6,
+6,6,6,6,6,5,5,5,5,6,5,5,5,5,5,5,
+6,5,5,8,6,6,5,0,0,0,0,0,2,2,2,2,
+2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
-4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,
-2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,
+4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2,
+2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,
+2,2,2,2,2,2,2,4,4,4,4,4,6,6,6,6,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
-6,6,6,6,6,6,6,6,6,6,0,6,6,6,6,6,
+6,6,6,6,6,6,0,6,6,6,6,6,1,2,1,2,
1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,
-1,2,1,2,1,2,2,2,2,2,2,2,2,2,1,2,
-2,2,2,2,2,2,2,2,1,1,1,1,1,0x1a,0x1a,0x1a,
-0,0,2,2,2,0,2,2,1,1,1,1,3,0x1a,0x1a,0,
-2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,
-2,2,2,2,2,2,0,0,1,1,1,1,1,1,0,0,
-2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,
-2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,
-2,2,2,2,2,2,0,0,1,1,1,1,1,1,0,0,
-2,2,2,2,2,2,2,2,0,1,0,1,0,1,0,1,
-2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,
-2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,
-2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,
-2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,
-2,2,2,2,2,0,2,2,1,1,1,1,3,0x1a,2,0x1a,
-0x1a,0x1a,2,2,2,0,2,2,1,1,1,1,3,0x1a,0x1a,0x1a,
-2,2,2,2,0,0,2,2,1,1,1,1,0,0x1a,0x1a,0x1a,
-0x16,0x17,0x17,0x17,0x18,0x14,0x15,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
-0x17,0x17,0x18,0x17,0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0xc,
-0x10,0x10,0x10,0x10,0x10,0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
-0x2cb,4,0,0,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18,0x18,0x14,0x15,4,
-0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x10,0x10,0x10,0x10,0x10,
-0x13,0x13,0x13,0x13,0x13,0x13,0x17,0x17,0x1c,0x1d,0x14,0x1c,0x1c,0x1d,0x14,0x1c,
-0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0xd,0xe,0x10,0x10,0x10,0x10,0x10,0xc,
-0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1c,0x1d,0x17,0x17,0x17,0x17,0x16,
-0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18,0x18,0x14,0x15,0,
-4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,
-0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,
+1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,
+2,2,2,2,1,1,1,1,1,0x1a,0x1a,0x1a,0,0,2,2,
+2,0,2,2,1,1,1,1,3,0x1a,0x1a,0,2,2,2,2,
+2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,
+2,2,0,0,1,1,1,1,1,1,0,0,2,2,2,2,
+2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,
+2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,
+2,2,0,0,1,1,1,1,1,1,0,0,2,2,2,2,
+2,2,2,2,0,1,0,1,0,1,0,1,2,2,2,2,
+2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,
+2,2,2,2,3,3,3,3,3,3,3,3,2,2,2,2,
+2,2,2,2,3,3,3,3,3,3,3,3,2,2,2,2,
+2,0,2,2,1,1,1,1,3,0x1a,2,0x1a,0x1a,0x1a,2,2,
+2,0,2,2,1,1,1,1,3,0x1a,0x1a,0x1a,2,2,2,2,
+0,0,2,2,1,1,1,1,0,0x1a,0x1a,0x1a,0x16,0x17,0x17,0x17,
+0x18,0x14,0x15,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x17,
+0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0xc,0x10,0x10,0x10,0x10,
+0x10,0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x2cb,4,0,0,
+0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18,0x18,0x14,0x15,4,0xc,0xc,0xc,0xc,
+0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x10,0x10,0x10,0x10,0x10,0x13,0x13,0x13,0x13,
+0x13,0x13,0x17,0x17,0x1c,0x1d,0x14,0x1c,0x1c,0x1d,0x14,0x1c,0x17,0x17,0x17,0x17,
+0x17,0x17,0x17,0x17,0xd,0xe,0x10,0x10,0x10,0x10,0x10,0xc,0x17,0x17,0x17,0x17,
+0x17,0x17,0x17,0x17,0x17,0x1c,0x1d,0x17,0x17,0x17,0x17,0x16,0x2cb,0x30b,0x34b,0x38b,
+0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18,0x18,0x14,0x15,0,4,4,4,4,
+4,4,4,4,4,4,4,4,4,0,0,0,0x19,0x19,0x19,0x19,
0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,
-7,6,7,7,7,6,6,6,6,6,6,6,6,6,6,6,
-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0x1b,0x1b,0x1b,0x1b,1,0x1b,1,0x1b,1,0x1b,1,1,1,1,0x1b,2,
-1,1,1,1,2,5,5,5,5,2,0x1b,0x1b,2,2,1,1,
-0x18,0x18,0x18,0x18,0x18,1,2,2,2,2,0x1b,0x18,0x1b,0x1b,2,0x1b,
-0x358b,0x360b,0x364b,0x348b,0x388b,0x350b,0x390b,0x3d0b,0x410b,0x354b,0x454b,0x35cb,0x3dcb,0x45cb,0x4dcb,0x58b,
-0x1b,0x1b,1,0x1b,0x1b,0x1b,0x1b,1,0x1b,0x1b,2,1,1,1,2,2,
-1,1,1,2,0x1b,1,0x1b,0x1b,0x18,1,1,1,1,1,0x1b,0x1b,
-0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a,0x11ca,0x1e4a,0x980a,0x784a,
-0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a,0x11ca,0x1e4a,0x980a,0x784a,
-0x784a,0x984a,0x788a,1,2,0x6ca,0x11ca,0x988a,0x78ca,0x54b,0x1b,0x1b,0,0,0,0,
-0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x18,
-0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,
-0x1b,0x1b,0x18,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,
+6,6,6,6,6,6,6,6,6,7,7,7,7,6,7,7,
+7,6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,
+1,0x1b,1,0x1b,1,0x1b,1,1,1,1,0x1b,2,1,1,1,1,
+2,5,5,5,5,2,0x1b,0x1b,2,2,1,1,0x18,0x18,0x18,0x18,
+0x18,1,2,2,2,2,0x1b,0x18,0x1b,0x1b,2,0x1b,0x358b,0x360b,0x364b,0x348b,
+0x388b,0x350b,0x390b,0x3d0b,0x410b,0x354b,0x454b,0x35cb,0x3dcb,0x45cb,0x4dcb,0x58b,0x1b,0x1b,1,0x1b,
+0x1b,0x1b,0x1b,1,0x1b,0x1b,2,1,1,1,2,2,1,1,1,2,
+0x1b,1,0x1b,0x1b,0x18,1,1,1,1,1,0x1b,0x1b,0x58a,0x5ca,0x60a,0x64a,
+0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a,0x11ca,0x1e4a,0x980a,0x784a,0x58a,0x5ca,0x60a,0x64a,
+0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a,0x11ca,0x1e4a,0x980a,0x784a,0x784a,0x984a,0x788a,1,
+2,0x6ca,0x11ca,0x988a,0x78ca,0x54b,0x1b,0x1b,0,0,0,0,0x18,0x18,0x18,0x18,
+0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x18,0x1b,0x1b,0x18,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x18,0x1b,
+0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x14,0x15,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x14,0x15,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
-0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x2cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b,
-0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,
-0x50b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b,0x3cb,
-0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,
+0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2cb,0x80b,
+0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,
+0x4cb,0x50b,0x7cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x80b,0x84b,
+0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,
+0x50b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,
-0x14,0x15,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb,
-0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,
-0x18,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
-0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,
-0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
-0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,0x14,
-0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,
-0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
-0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,
-0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
-0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x18,0x18,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x30b,0x34b,
+0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,
+0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,0x14,0x15,
+0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,
+0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
-0x18,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x18,0x18,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x18,
+0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,2,2,2,2,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,2,2,2,2,0,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,0,2,2,2,2,
-2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,1,
-1,2,2,1,2,1,2,1,2,1,1,1,1,2,1,2,
-2,1,2,2,2,2,2,2,4,4,1,1,1,2,1,2,
-2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,1,2,1,2,6,6,6,1,2,
-0,0,0,0,0,0x17,0x17,0x17,0x17,0x344b,0x17,0x17,2,2,2,2,
-2,2,0,2,0,0,0,0,0,2,0,0,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,
-0,0,0,4,0x17,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,6,5,5,5,5,5,5,5,0,5,5,5,5,
-5,5,5,0,5,5,5,5,5,5,5,0,5,5,5,5,
-5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,
-0,0,0,0,0x17,0x17,0x1c,0x1d,0x1c,0x1d,0x17,0x17,0x17,0x1c,0x1d,0x17,
-0x1c,0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x17,0x17,0x13,0x17,
-0x1c,0x1d,0x17,0x17,0x1c,0x1d,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17,
-0x17,0x17,0x17,4,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x13,
-0x17,0x17,0x17,0x17,0x13,0x17,0x14,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
-0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,
-0x74a,0x78a,6,6,6,6,8,8,0x13,4,4,4,4,4,0x1b,0x1b,
-0x7ca,0xa4a,0xcca,4,5,0x17,0x1b,0x1b,0xc,0x17,0x17,0x17,0x1b,4,5,0x54a,
-0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x1b,0x1b,0x14,0x15,0x14,0x15,
-0x14,0x15,0x14,0x15,0x13,0x14,0x15,0x15,5,5,5,5,5,5,5,5,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+1,2,1,1,1,2,2,1,2,1,2,1,2,1,1,1,
+1,2,1,2,2,1,2,2,2,2,2,2,4,4,1,1,
+1,2,1,2,2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,1,2,1,2,6,
+6,6,1,2,0,0,0,0,0,0x17,0x17,0x17,0x17,0x344b,0x17,0x17,
+2,2,2,2,2,2,0,2,0,0,0,0,0,2,0,0,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+0,0,0,0,0,0,0,4,0x17,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,6,5,5,5,5,5,5,5,0,
+5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,0,
+5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,
-0,6,6,0x1a,0x1a,4,4,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,0x17,4,4,4,5,0,0,0,0,0,5,5,5,
+0,0,0,0,0,0,0,0,0x17,0x17,0x1c,0x1d,0x1c,0x1d,0x17,0x17,
+0x17,0x1c,0x1d,0x17,0x1c,0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13,
+0x17,0x17,0x13,0x17,0x1c,0x1d,0x17,0x17,0x1c,0x1d,0x14,0x15,0x14,0x15,0x14,0x15,
+0x14,0x15,0x17,0x17,0x17,0x17,0x17,4,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+0x17,0x17,0x13,0x13,0x17,0x17,0x17,0x17,0x13,0x17,0x14,0x17,0x17,0x17,0x17,0x17,
+0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,
+0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x58a,0x5ca,0x60a,
+0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,6,6,6,6,8,8,0x13,4,4,4,
+4,4,0x1b,0x1b,0x7ca,0xa4a,0xcca,4,5,0x17,0x1b,0x1b,0xc,0x17,0x17,0x17,
+0x1b,4,5,0x54a,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x1b,0x1b,
+0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x13,0x14,0x15,0x15,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,0,0x1b,0x1b,0x58b,0x5cb,
-0x60b,0x64b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,5,5,5,5,
+5,5,5,0,0,6,6,0x1a,0x1a,4,4,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,
-0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x5cb,0x60b,0x64b,
-0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x7cb,0xa4b,0xccb,0xf4b,
-0x11cb,0x144b,0x16cb,0x194b,0x1b,0xa8b,0xacb,0xb0b,0xb4b,0xb8b,0xbcb,0xc0b,0xc4b,0xc8b,0xccb,0xd0b,
-0xd4b,0xd8b,0xdcb,0xe0b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0xe4b,0xe8b,0xecb,0xf0b,0xf4b,0xf8b,0xfcb,0x100b,0x104b,0x108b,0x10cb,
-0x110b,0x114b,0x118b,0x11cb,5,5,5,5,5,0x685,5,5,5,5,5,5,
+5,5,5,5,5,5,5,0x17,4,4,4,5,0,0,0,0,
+0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,
+0x1b,0x1b,0x58b,0x5cb,0x60b,0x64b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,0x5c5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,
+0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,0x685,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,0x705,5,5,
+0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1b,0xa8b,0xacb,0xb0b,0xb4b,0xb8b,0xbcb,0xc0b,
+0xc4b,0xc8b,0xccb,0xd0b,0xd4b,0xd8b,0xdcb,0xe0b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0xe4b,0xe8b,0xecb,0xf0b,0xf4b,0xf8b,0xfcb,
+0x100b,0x104b,0x108b,0x10cb,0x110b,0x114b,0x118b,0x11cb,5,5,5,5,5,0x685,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-0x585,5,5,0x705,5,5,5,0x7885,5,0x605,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,0x5c5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,0x785,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,0x5c5,5,5,5,5,5,5,5,
-0x685,5,0x645,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,0x685,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,0x7985,0x7c5,5,5,5,5,5,5,5,5,5,5,5,
+5,0x705,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,0x585,5,5,0x705,5,5,5,0x7885,5,0x605,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,0x7845,5,5,5,5,5,5,5,5,0x605,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,0x785,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0x5c5,5,5,5,
+5,5,5,5,0x685,5,0x645,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,0x685,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,0x1e45,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,0x7985,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,0x7985,0x7c5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,0x7a85,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,0x7845,5,5,5,5,5,5,5,5,
+0x605,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,0x685,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0x1e45,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0x7985,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,0x5c5,5,0x745,5,0x6c5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,0x7c5,5,0x7845,0xa45,0xcc5,5,5,
-5,5,5,5,0xf45,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,0x605,0x605,0x605,0x605,5,5,5,
+5,5,5,5,5,5,5,5,5,5,0x7a85,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,0x645,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,0x585,5,5,
-5,5,5,5,5,0x585,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,0x5c5,5,0x745,5,0x6c5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,0x7c5,5,0x7845,
+0xa45,0xcc5,5,5,5,5,5,5,0xf45,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,0x605,0x605,0x605,
+0x605,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x645,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,0x585,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,0x585,5,5,5,5,5,5,5,0x585,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,0x785,0xa45,5,5,5,5,5,5,5,5,5,5,5,5,
-0x585,0x5c5,0x605,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,0x585,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,0x7c5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,0x745,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,0x705,5,5,5,5,5,
+5,5,5,5,5,5,0x785,0xa45,5,5,5,5,5,5,5,5,
+5,5,5,5,0x585,0x5c5,0x605,5,0x5c5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,0x785,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,0x7c5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,0x745,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x705,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,0x1e45,5,5,5,5,5,5,5,0x645,5,
+5,5,5,5,5,5,5,5,5,5,0x785,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,0x7885,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x5c5,5,
-5,5,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,0x7845,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,0x1e45,5,5,5,5,5,
+5,5,0x645,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0x7885,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,0x6c5,5,5,5,5,5,0x1e45,5,5,5,
+5,5,0x5c5,5,5,5,5,0x5c5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,0x5c5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,0x7845,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,0x6c5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,0x6c5,5,5,5,5,5,
+0x1e45,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0x6c5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,0x545,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
-5,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,4,5,5,5,5,5,5,
-5,5,5,5,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,
-0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,4,0x17,0x17,0x17,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
-0x249,0x289,5,5,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,1,2,1,2,1,2,1,2,
+5,5,5,5,5,5,0x545,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
+5,5,5,5,5,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,4,5,5,
+5,5,5,5,5,5,5,5,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,
+0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,4,0x17,0x17,0x17,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0x49,0x89,0xc9,0x109,
+0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,1,2,1,2,
1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,
-1,2,1,2,4,4,6,6,1,2,1,2,1,2,1,2,
-1,2,1,2,1,2,5,6,7,7,7,0x17,6,6,6,6,
-6,6,6,6,6,6,0x17,4,5,5,5,5,5,5,0x58a,0x5ca,
-0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x54a,6,6,0x17,0x17,0x17,0x17,0x17,0x17,
-0,0,0,0,0,0,0,0,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,
-0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,4,
-4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,
-4,4,2,5,5,5,5,5,0x1a,0x1a,1,2,1,2,1,2,
-1,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,
-1,2,1,2,1,2,1,2,1,2,1,2,4,2,2,2,
-2,2,2,2,2,1,2,1,2,1,1,2,1,2,1,2,
-1,2,1,2,4,0x1a,0x1a,1,2,1,2,5,1,2,1,2,
-2,2,1,2,1,2,1,2,1,2,1,2,1,2,1,1,
-1,1,1,2,1,1,1,1,1,2,1,2,1,2,0,0,
-0,0,0,0,5,5,6,5,5,5,6,5,5,5,5,6,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,8,8,6,6,8,0x1b,0x1b,0x1b,0x1b,
-0,0,0,0,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0x1b,0x1b,0x19,0x1b,0,0,
-0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,0x17,0x17,0x17,0x17,0,0,0,0,
-0,0,0,0,8,8,8,8,6,6,0,0,0,0,0,0,
-0,0,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,
-0,0,0,0,8,8,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,8,8,8,8,8,8,8,8,8,8,8,8,
-6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
-6,6,5,5,5,5,5,5,0x17,0x17,0x17,5,0x17,5,5,6,
-5,5,5,5,5,5,6,6,6,6,6,6,6,6,0x17,0x17,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,6,6,6,6,6,6,6,6,6,6,6,8,8,
-0,0,0,0,0,0,0,0,0,0,0,0x17,8,0x17,0x17,0x17,
-0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,4,0x49,0x89,0xc9,0x109,
-0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,
-8,8,6,6,6,6,8,8,6,8,8,8,5,5,5,5,
-5,6,4,5,5,5,5,5,5,5,5,5,0x49,0x89,0xc9,0x109,
-0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,0,5,5,5,5,
-5,5,5,5,5,6,6,6,6,6,6,8,8,6,6,8,
-8,6,6,0,0,0,0,0,0,0,0,0,5,5,5,6,
-5,5,5,5,5,5,5,5,6,8,0,0,0x49,0x89,0xc9,0x109,
-0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0x17,0x17,0x17,0x17,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,4,5,5,5,
-5,5,5,0x1b,0x1b,0x1b,5,8,6,8,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,6,5,6,6,
-6,5,5,6,6,5,5,5,5,5,6,6,5,6,5,0,
+1,2,1,2,1,2,1,2,4,4,6,6,1,2,1,2,
+1,2,1,2,1,2,1,2,1,2,5,6,7,7,7,0x17,
+6,6,6,6,6,6,6,6,6,6,0x17,4,5,5,5,5,
+5,5,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x54a,6,6,0x17,0x17,
+0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0x1a,0x1a,0x1a,0x1a,
+0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,
+0x1a,0x1a,0x1a,4,4,4,4,4,4,4,4,4,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,5,4,4,2,5,5,5,5,5,0x1a,0x1a,1,2,
+1,2,1,2,1,2,1,2,1,2,1,2,2,2,1,2,
+1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,
+4,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,
+1,2,1,2,1,2,1,2,4,0x1a,0x1a,1,2,1,2,5,
+1,2,1,2,2,2,1,2,1,2,1,2,1,2,1,2,
+1,2,1,1,1,1,1,2,1,1,1,1,1,2,1,2,
+1,2,1,2,1,2,1,2,0,0,1,2,1,1,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,5,5,4,0x17,0x17,5,5,5,5,
-5,5,5,5,5,5,5,8,6,6,8,8,0x17,0x17,5,4,
-4,8,6,0,0,0,0,0,0,0,0,0,0,5,5,5,
-5,5,5,0,0,5,5,5,5,5,5,0,0,5,5,5,
-5,5,5,0,0,0,0,0,0,0,0,0,5,5,5,5,
-5,5,5,0,5,5,5,5,5,5,5,0,2,2,2,2,
+0,0,0,0,0,0,0,0,5,5,6,5,5,5,6,5,
+5,5,5,6,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,8,8,6,6,8,
+0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0x1b,0x1b,
+0x19,0x1b,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0x17,0x17,0x17,0x17,
+0,0,0,0,0,0,0,0,8,8,8,8,6,6,0,0,
+0,0,0,0,0,0,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
+0x249,0x289,0,0,0,0,0,0,8,8,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,8,8,8,8,8,8,8,8,
+8,8,8,8,6,6,6,6,6,6,6,6,6,6,6,6,
+6,6,6,6,6,6,5,5,5,5,5,5,0x17,0x17,0x17,5,
+0x17,5,5,6,5,5,5,5,5,5,6,6,6,6,6,6,
+6,6,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,
+6,6,8,8,0,0,0,0,0,0,0,0,0,0,0,0x17,
+8,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,4,
+0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,6,8,8,6,6,6,6,8,8,6,6,8,8,
+5,5,5,5,5,6,4,5,5,5,5,5,5,5,5,5,
+0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,0,
+5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,8,
+8,6,6,8,8,6,6,0,0,0,0,0,0,0,0,0,
+5,5,5,6,5,5,5,5,5,5,5,5,6,8,0,0,
+0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0x17,0x17,0x17,0x17,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+4,5,5,5,5,5,5,0x1b,0x1b,0x1b,5,8,6,8,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+6,5,6,6,6,5,5,6,6,5,5,5,5,5,6,6,
+5,6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,5,5,4,0x17,0x17,
+5,5,5,5,5,5,5,5,5,5,5,8,6,6,8,8,
+0x17,0x17,5,4,4,8,6,0,0,0,0,0,0,0,0,0,
+0,5,5,5,5,5,5,0,0,5,5,5,5,5,5,0,
+0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,
+5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,0,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,0x1a,4,4,4,4,2,2,2,2,
-2,2,0,0,0,0,0,0,0,0,0,0,2,2,2,2,
-2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,8,
-8,6,8,8,6,8,8,0x17,8,6,0,0,0x49,0x89,0xc9,0x109,
-0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,5,5,5,5,
-0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+2,2,2,2,2,2,2,2,2,2,2,0x1a,4,4,4,4,
+2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+5,5,5,8,8,6,8,8,6,8,8,0x17,8,6,0,0,
+0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,
+5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,
+5,5,5,5,5,5,5,0,0,0,0,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,0,0,0,0,5,5,5,5,
-5,5,5,0,0,0,0,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,0x12,0x12,0x12,0x12,
0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
-0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x11,0x11,0x11,0x11,
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
-0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,5,5,5,5,
-5,5,5,5,5,5,5,0x605,5,5,5,5,5,5,5,0x7c5,
-5,5,5,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,0x6c5,5,0x6c5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,0x7c5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,0,0,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,0x18,5,5,
-5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,
-5,0,5,0,5,5,0,5,5,0,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,2,2,2,2,2,2,2,0,0,0,0,0,
-0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0,
-0,5,6,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,
-0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,0x15,0x14,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,0,0,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-5,5,5,5,5,5,5,5,5,5,5,5,0x19,0x1b,0,0,
-6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
-0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,0x15,0x17,0,0,0,0,0,0,
-6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
-0x17,0x13,0x13,0x16,0x16,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,
-0x15,0x17,0x17,0x14,0x15,0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x17,0x17,0x17,0,
-0x17,0x17,0x17,0x17,0x13,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17,0x17,0x18,0x13,
-0x18,0x18,0x18,0,0x17,0x19,0x17,0x17,0,0,0,0,5,5,5,5,
-5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,0,0,0x10,0,0,5,5,5,5,5,5,0,0,5,5,
-5,5,5,5,0,0,5,5,5,5,5,5,0,0,5,5,
-5,0,0,0,0x19,0x19,0x18,0x1a,0x1b,0x19,0x19,0,0x1b,0x18,0x18,0x18,
-0x18,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0x10,0x10,0x10,
-0x1b,0x1b,0,0,0,0x17,0x17,0x17,0x19,0x17,0x17,0x17,0x14,0x15,0x17,0x18,
-0x17,0x13,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,
-0x18,0x18,0x18,0x17,0x1a,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0x14,
-0x18,0x15,0x18,0x14,0x15,0x17,0x14,0x15,0x17,0x17,5,5,5,5,5,5,
-5,5,5,5,4,5,5,5,5,5,5,5,5,5,5,5,
+0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+5,5,5,5,5,5,5,5,5,5,5,0x605,5,5,5,5,
+5,5,5,0x7c5,5,5,5,5,0x5c5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,0x6c5,5,0x6c5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,4,4,5,5,5,5,5,5,5,5,
-5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,
-5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,0,0,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,
-0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x17,0x17,0x17,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,
-0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,
-0x900b,0x980b,0xa00b,0xa80b,0x7ca,0x7ca,0x7ca,0x7ca,0x7ca,0xcca,0x11ca,0x11ca,0x11ca,0x11ca,0x1e4a,0x880a,
-0x980a,0x980a,0x980a,0x980a,0x980a,0x784a,0x984a,0x68a,0x11ca,0x344b,0x344b,0x388b,0x3ccb,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x54b,0x34cb,0x1b,0x1b,0x1b,0,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,
-0x34ca,0x344a,0x58a,0x68a,0x11ca,0x980a,0x984a,0x988a,0x68a,0x7ca,0x11ca,0x1e4a,0x980a,0x784a,0x984a,0x68a,
-0x7ca,0x11ca,0x1e4a,0x980a,0x784a,0x788a,0x988a,0x7ca,0x58a,0x58a,0x58a,0x5ca,0x5ca,0x5ca,0x5ca,0x68a,
-0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0,0,
+5,5,5,5,5,5,5,5,5,5,5,5,5,0x7c5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-6,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,
-0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0,0,0,0,
-0x58b,0x68b,0x7cb,0x11cb,0,0,0,0,0,0,0,0,0,5,5,5,
+5,0x18,5,5,5,5,5,5,5,5,5,5,5,5,5,0,
+5,5,5,5,5,0,5,0,5,5,0,5,5,0,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,0x1bca,5,5,5,5,5,5,5,5,0xb80a,0,0,0,0,0,
+5,5,5,5,5,5,5,5,2,2,2,2,2,2,2,0,
+0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,
+0,0,0,0,0,5,6,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,
+0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,6,6,6,6,6,0,0,0,0,0,
+5,5,5,5,5,5,5,5,5,5,0x15,0x14,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0,0,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
+0x19,0x1b,0,0,6,6,6,6,6,6,6,6,6,6,6,6,
+6,6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,0x15,0x17,0,0,
+0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6,
+6,6,6,6,0x17,0x13,0x13,0x16,0x16,0x14,0x15,0x14,0x15,0x14,0x15,0x14,
+0x15,0x14,0x15,0x14,0x15,0x17,0x17,0x14,0x15,0x17,0x17,0x17,0x17,0x16,0x16,0x16,
+0x17,0x17,0x17,0,0x17,0x17,0x17,0x17,0x13,0x14,0x15,0x14,0x15,0x14,0x15,0x17,
+0x17,0x17,0x18,0x13,0x18,0x18,0x18,0,0x17,0x19,0x17,0x17,0,0,0,0,
+5,5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0x17,
-5,5,5,5,0,0,0,0,5,5,5,5,5,5,5,5,
-0x17,0x58a,0x5ca,0x7ca,0xa4a,0x1e4a,0,0,0,0,0,0,0,0,0,0,
+5,5,5,5,5,0,0,0x10,0,0,5,5,5,5,5,5,
+0,0,5,5,5,5,5,5,0,0,5,5,5,5,5,5,
+0,0,5,5,5,0,0,0,0x19,0x19,0x18,0x1a,0x1b,0x19,0x19,0,
+0x1b,0x18,0x18,0x18,0x18,0x1b,0x1b,0,0,0,0,0,0,0,0,0,
+0,0x10,0x10,0x10,0x1b,0x1b,0,0,0,0x17,0x17,0x17,0x19,0x17,0x17,0x17,
+0x14,0x15,0x17,0x18,0x17,0x13,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
+0x249,0x289,0x17,0x17,0x18,0x18,0x18,0x17,0x1a,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,0x14,0x18,0x15,0x18,0x14,0x15,0x17,0x14,0x15,0x17,0x17,5,5,
+5,5,5,5,5,5,5,5,4,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,
-0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,0,0,0,0,2,2,2,2,2,2,2,2,
-5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-0,0,0,0,0,0,0,0,0,0,0,0x17,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,4,4,5,5,5,5,
+5,5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,0,5,5,0,0,0,5,0,0,5,5,5,5,5,
-5,5,0,0,5,0,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0x17,
-0x58b,0x5cb,0x60b,0x7cb,0xa4b,0x1e4b,0x784b,0x788b,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x1b,
-0x1b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x7cb,0xa4b,0,0,0,0,0,0,0,0x58b,
-0x5cb,0x60b,0x64b,0x64b,0x68b,0x7cb,0xa4b,0x1e4b,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,0,5,5,0,0,
-0,0,0,0x58b,0x68b,0x7cb,0xa4b,0x1e4b,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x7cb,
-0xa4b,0x1e4b,0x5cb,0x60b,0,0,0,0x17,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,0,0,0,0,0,0x17,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b,
-0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x78cb,0x80cb,0x88cb,0x90cb,0x98cb,0xa0cb,0xa8cb,0xb0cb,0xb8cb,0x36cb,0x354b,
-0x34cb,0x348b,0x46cb,0x344b,0x4ecb,0x388b,0x3ccb,0x454b,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-0,0,0,0,0x5ecb,0x344b,5,5,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,
-0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0,0,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,
-0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0x30b,0x34b,0x38b,0x3cb,0x7cb,0xa4b,0x1e4b,0x784b,
-0x344b,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
-0x17,0,0,0,0,0,0,0,5,6,6,6,0,6,6,0,
-0,0,0,0,6,6,6,6,5,5,5,5,0,5,5,5,
+5,5,5,0,5,5,0,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,0,0,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,0,0,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0xa04b,
+0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0,0,0,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x17,0x17,0x17,0,0,0,0,0x58b,
+0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,
+0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0x7ca,0x7ca,0x7ca,0x7ca,0x7ca,0xcca,0x11ca,0x11ca,
+0x11ca,0x11ca,0x1e4a,0x880a,0x980a,0x980a,0x980a,0x980a,0x980a,0x784a,0x984a,0x68a,0x11ca,0x344b,0x344b,0x388b,
+0x3ccb,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x54b,0x34cb,
+0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0,0,0,0,0x34ca,0x344a,0x58a,0x68a,0x11ca,0x980a,0x984a,0x988a,0x68a,0x7ca,0x11ca,0x1e4a,
+0x980a,0x784a,0x984a,0x68a,0x7ca,0x11ca,0x1e4a,0x980a,0x784a,0x788a,0x988a,0x7ca,0x58a,0x58a,0x58a,0x5ca,
+0x5ca,0x5ca,0x5ca,0x68a,0x1b,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,6,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,6,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,
+0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,
+0,0,0,0,0x58b,0x68b,0x7cb,0x11cb,0,0,0,0,0,0,0,0,
0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,0,0,6,6,6,0,
-0,0,0,6,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,0x1bca,5,5,5,5,5,5,5,5,0xb80a,0,
+0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,0,
+0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,0x58b,0x11cb,0x17,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,0,0x17,5,5,5,5,0,0,0,0,5,5,5,5,
+5,5,5,5,0x17,0x58a,0x5ca,0x7ca,0xa4a,0x1e4a,0,0,0,0,0,0,
+0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,5,5,5,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,0x58b,0x7cb,0xa4b,5,5,5,5,5,6,6,0,0,0,0,0x58b,
-0x68b,0x7cb,0xa4b,0x1e4b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,
-0,0,0,0,5,5,5,5,5,5,5,5,0x1b,5,5,5,
+5,5,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,
+0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,0,0,0,0,2,2,2,2,
+2,2,2,2,5,5,5,5,5,5,5,5,0,0,0,0,
+0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0x17,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+5,5,5,5,5,5,0,5,5,0,0,0,5,0,0,5,
+5,5,5,5,5,5,0,0,5,0,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b,
+5,5,0,0x17,0x58b,0x5cb,0x60b,0x7cb,0xa4b,0x1e4b,0x784b,0x788b,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b,
+5,5,5,0x1b,0x1b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x7cb,0xa4b,0,0,0,0,
+0,0,0,0x58b,0x5cb,0x60b,0x64b,0x64b,0x68b,0x7cb,0xa4b,0x1e4b,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,
+5,5,0,0,0,0,0,0x58b,0x68b,0x7cb,0xa4b,0x1e4b,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17,0,0,0,
-0,0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
-2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,0,0,0,0,0,0,0,0x58b,0x68b,0x7cb,0x11cb,0x1e4b,0x784b,
-5,5,5,5,6,6,6,6,0,0,0,0,0,0,0,0,
-0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,
-0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,
-0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x344b,0x34cb,0x348b,0x388b,0,
+5,5,0x58b,0x7cb,0xa4b,0x1e4b,0x5cb,0x60b,0,0,0,0x17,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x5cb,0x60b,
-0x64b,0x68b,0x7cb,0xa4b,0xccb,0x1e4b,0x344b,5,0,0,0,0,0,0,0,0,
+5,5,5,5,5,5,0,0,0,0,0,0x17,0xa04b,0xa84b,0xb04b,0xb84b,
+0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x78cb,0x80cb,0x88cb,0x90cb,0x98cb,0xa0cb,0xa8cb,
+0xb0cb,0xb8cb,0x36cb,0x354b,0x34cb,0x348b,0x46cb,0x344b,0x4ecb,0x388b,0x3ccb,0x454b,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,6,6,6,6,6,6,6,6,6,6,6,0x58b,0x7cb,0xa4b,
-0x1e4b,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0x144b,0x16cb,0x194b,0x1bcb,
-0x1e4b,0x784b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,6,8,6,8,5,
+5,5,5,5,0,0,0,0,0x5ecb,0x344b,5,5,0x58b,0x5cb,0x60b,0x64b,
+0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0,0,0x1e4b,0x800b,
+0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0x30b,0x34b,0x38b,0x3cb,
+0x7cb,0xa4b,0x1e4b,0x784b,0x344b,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17,
+0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,5,6,6,6,
+0,6,6,0,0,0,0,0,6,6,6,6,5,5,5,5,
+0,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,
+6,6,6,0,0,0,0,6,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,
-6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0x30b,0x34b,
-0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,8,8,8,6,
-6,6,6,8,8,6,6,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0,0,
-0,0,0,0,0,0,0,0,0,0x10,0,0,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,
+5,5,5,5,5,0x58b,0x11cb,0x17,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,0x58b,0x7cb,0xa4b,5,5,5,5,5,6,6,0,
+0,0,0,0x58b,0x68b,0x7cb,0xa4b,0x1e4b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,
+0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
+0x1b,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,0,0,0,0x17,0x17,0x17,
+0x17,0x17,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,0,0,0x58b,0x5cb,0x60b,0x64b,
+0x7cb,0xa4b,0x1e4b,0x784b,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,
+0x7cb,0xa4b,0x1e4b,0x784b,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,0,0,0,0,0,0,0,0x17,0x17,0x17,
+0x17,0,0,0,0,0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,
+0x64b,0x7cb,0xa4b,0x1e4b,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,5,5,5,5,5,5,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,0,0,0,0,0,0,0,0x58b,0x68b,
+0x7cb,0x11cb,0x1e4b,0x784b,5,5,5,5,6,6,6,6,0,0,0,0,
0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,
-0,0,0,0,5,5,5,5,5,5,5,6,6,6,6,6,
-8,6,6,6,6,6,6,6,6,0,0x49,0x89,0xc9,0x109,0x149,0x189,
-0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,5,8,8,0,0,0,0,0,
+0,0,0,0,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,
+0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x344b,
+0x34cb,0x348b,0x388b,0,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,0x58b,0x5cb,0x60b,0x64b,0x68b,0x7cb,0xa4b,0xccb,0x1e4b,0x344b,5,0,0,0,0,
0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,6,6,6,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,6,0x17,0x17,5,0,0,0,0,0,
-0,0,0,0,8,5,5,5,5,0x17,0x17,0x17,0x17,6,6,6,
-6,0x17,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,0x17,
-5,0x17,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,8,8,8,6,6,6,6,6,6,
-6,6,6,8,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,
-0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0,0,0,0,0,0,0,
+5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,
+6,0x58b,0x7cb,0xa4b,0x1e4b,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,
+0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,
+8,6,8,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+6,6,6,6,6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,
+0,0,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+8,8,8,6,6,6,6,8,8,6,6,0x17,0x17,0x10,0x17,0x17,
+0x17,0x17,0,0,0,0,0,0,0,0,0,0,0,0x10,0,0,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
+0x249,0x289,0,0,0,0,0,0,5,5,5,5,5,5,5,6,
+6,6,6,6,8,6,6,6,6,6,6,6,6,0,0x49,0x89,
+0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,5,8,8,0,
+0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,6,6,6,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,6,0x17,0x17,5,0,
+0,0,0,0,0,0,0,0,8,5,5,5,5,0x17,0x17,0x17,
+0x17,6,6,6,6,0x17,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
+0x249,0x289,5,0x17,5,0x17,0x17,0x17,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,8,8,8,6,6,
+6,6,6,6,6,6,6,8,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,
+0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0,0,0,
+0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
+5,5,5,5,8,8,8,6,6,6,8,8,6,8,6,6,
+0x17,0x17,0x17,0x17,0x17,0x17,6,0,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,0,5,0,5,5,
+5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,0,5,5,5,5,5,5,5,5,5,5,0x17,0,0,
0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
-8,8,8,6,6,6,8,8,6,8,6,6,0x17,0x17,0x17,0x17,
-0x17,0x17,6,0,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,0,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,0,5,0,5,5,5,5,0,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,
-5,5,5,5,5,5,5,5,5,0x17,0,0,0,0,0,0,
+5,5,5,5,8,8,8,6,6,6,6,6,6,6,6,0,
+0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,
+0,0,0,0,5,5,8,8,0,0,6,6,6,6,6,6,
+6,0,0,0,6,6,6,6,6,0,0,0,0,0,0,0,
+0,0,0,0,6,6,8,8,0,5,5,5,5,5,5,5,
+5,0,0,5,5,0,0,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,0,5,5,5,5,5,5,5,0,5,5,
+0,5,5,5,5,5,0,6,6,5,8,8,6,8,8,8,
+8,0,0,8,8,0,0,8,8,8,0,0,5,0,0,0,
+0,0,0,8,0,0,0,0,0,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-8,8,8,6,6,6,6,6,6,6,6,0,0,0,0,0,
-0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,
-5,5,8,8,0,0,6,6,6,6,6,6,6,0,0,0,
-6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,
-6,6,8,8,0,5,5,5,5,5,5,5,5,0,0,5,
-5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,0,5,5,5,5,5,5,5,0,5,5,0,5,5,5,
-5,5,0,6,6,5,8,8,6,8,8,8,8,0,0,8,
-8,0,0,8,8,8,0,0,5,0,0,0,0,0,0,8,
-0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,8,8,8,
-6,6,6,6,6,6,6,6,8,8,6,6,6,8,6,5,
-5,5,5,0x17,0x17,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
-0x249,0x289,0,0x17,0,0x17,6,0,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,8,8,8,6,6,6,6,6,
-6,8,6,8,8,8,8,6,6,8,6,6,5,5,0x17,5,
-0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
-0x249,0x289,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,8,8,8,6,6,6,6,0,0,
-8,8,8,8,6,6,8,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+5,8,8,8,6,6,6,6,6,6,6,6,8,8,6,6,
+6,8,6,5,5,5,5,0x17,0x17,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,
+0x149,0x189,0x1c9,0x209,0x249,0x289,0,0x17,0,0x17,6,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,8,8,8,6,
+6,6,6,6,6,8,6,8,8,8,8,6,6,8,6,6,
+5,5,0x17,5,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,
+0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,8,8,8,6,6,
+6,6,0,0,8,8,8,8,6,6,8,6,6,0x17,0x17,0x17,
0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
-5,5,5,5,6,6,0,0,5,5,5,5,5,5,5,5,
+0x17,0x17,0x17,0x17,5,5,5,5,6,6,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,8,8,8,6,
+6,6,6,6,6,6,6,8,8,6,8,6,6,0x17,0x17,0x17,
+5,0,0,0,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,
+0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0x17,0x17,0x17,0x17,
+0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,
+0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,6,8,6,8,8,6,6,6,6,
+6,6,8,6,5,0,0,0,0,0,0,0,8,8,6,6,
+6,6,8,6,6,6,6,6,0,0,0,0,0x49,0x89,0xc9,0x109,
+0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b,0x17,0x17,0x17,0x1b,5,5,5,5,
5,5,5,5,5,5,5,5,8,8,8,6,6,6,6,6,
-6,6,6,8,8,6,8,6,6,0x17,0x17,0x17,5,0,0,0,
-0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
-0x249,0x289,0,0,0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
-0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
-0x249,0x289,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
-5,5,5,6,8,6,8,8,6,6,6,6,6,6,8,6,
-0,0,0,0,0,0,0,0,8,8,6,6,6,6,8,6,
-6,6,6,6,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
-0x249,0x289,0x7cb,0xa4b,0x17,0x17,0x17,0x1b,5,5,5,5,5,5,5,5,
-5,5,5,5,8,8,8,6,6,6,6,6,6,6,6,6,
-8,6,6,0x17,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
-0x249,0x289,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0,0,0,0,0,
-0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,
-6,8,5,6,6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,6,
-0,0,0,0,0,0,0,0,5,6,6,6,6,6,6,8,
-8,6,6,6,5,5,5,5,5,6,6,6,6,6,6,6,
-6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,0x17,0x17,0x17,0,0,0,0,0,
+6,6,6,6,8,6,6,0x17,0,0,0,0,0x49,0x89,0xc9,0x109,
+0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0,
+0,0,0,0,0,0,0,0,0,0,0,5,6,5,0x17,5,
+8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,0,0,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,8,8,8,
+6,6,6,6,0,0,6,6,8,8,8,8,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,
+6,6,6,6,6,8,5,6,6,6,6,0x17,0x17,0x17,0x17,0x17,
+0x17,0x17,0x17,6,0,0,0,0,0,0,0,0,5,6,6,6,
+6,6,6,8,8,6,6,6,5,5,5,5,5,6,6,6,
+6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0x17,0x17,0x17,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,5,5,5,5,0,0,5,5,
-5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,8,
-6,6,0x17,0x17,0x17,5,0x17,0x17,5,0x17,0x17,0x17,0x17,0x17,0,0,
-0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
-0x249,0x289,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,
-0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0,0,0,0x17,0x17,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,5,
+0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,
+6,6,6,8,6,6,0x17,0x17,0x17,5,0x17,0x17,5,0x17,0x17,0x17,
+0x17,0x17,0,0,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,
+0x149,0x189,0x1c9,0x209,0x249,0x289,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,
+0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0,0,0,0x17,0x17,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,8,6,6,6,6,6,6,6,0,6,6,6,6,
-6,6,8,6,6,6,6,6,6,6,6,6,0,8,6,6,
-6,6,6,6,6,8,6,6,8,6,6,0,0,0,0,0,
-0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,0,0,6,6,6,6,6,6,6,6,6,6,
-6,6,6,6,6,6,5,6,0,0,0,0,0,0,0,0,
-0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,
-5,5,5,5,5,5,5,0,5,5,0,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,6,6,6,6,6,6,0,0,0,6,0,6,6,0,6,
-5,5,5,5,5,5,5,5,5,5,8,8,8,8,8,0,
-6,6,0,8,8,6,8,6,5,0,0,0,0,0,0,0,
-5,5,5,5,5,5,0,5,5,0,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,6,6,8,8,0x17,0x17,0,0,0,0,0,0,0,
-0x34ca,0x354a,0x34ca,0x34ca,0x344a,0x348a,0x388a,0xf4a,0x11ca,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0,
-0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0,0,
-0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x64a,
-0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,
-0x60a,0x64a,0x68a,0x5ca,0x60a,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x60a,
-0x64a,0x68a,0xc08a,0xc18a,0x58a,0x5ca,0x60a,0x60a,0x64a,0x68a,0x60a,0x60a,0x64a,0x64a,0x64a,0x64a,
-0x6ca,0x70a,0x70a,0x70a,0x74a,0x74a,0x78a,0x78a,0x78a,0x78a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x58a,
-0x5ca,0x60a,0x64a,0x64a,0x68a,0x68a,0x5ca,0x60a,0x58a,0x5ca,0x348a,0x388a,0x454a,0x348a,0x388a,0x35ca,
-5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,
+5,5,5,5,5,5,5,8,6,6,6,6,6,6,6,0,
+6,6,6,6,6,6,8,6,6,6,6,6,6,6,6,6,
+0,8,6,6,6,6,6,6,6,8,6,6,8,6,6,0,
+0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,0,0,6,6,6,6,6,6,
+6,6,6,6,6,6,6,6,6,6,5,6,0,0,0,0,
+0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,
+0,0,0,0,5,5,5,5,5,5,5,0,5,5,0,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,6,6,6,6,6,6,0,0,0,6,0,
+6,6,0,6,5,5,5,5,5,5,5,5,5,5,8,8,
+8,8,8,0,6,6,0,8,8,6,8,6,5,0,0,0,
+0,0,0,0,5,5,5,5,5,5,0,5,5,0,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,6,6,8,8,0x17,0x17,0,0,0,
+0,0,0,0,0x19,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0x17,0xcd0b,0xcc0b,0xcb0b,0xd00b,0xca0b,0xcf0b,0xcb4b,0xd04b,0xc90b,0x37cb,0x37cb,0x364b,
+0x35cb,0xc94b,0x3fcb,0x350b,0x34cb,0x344b,0x344b,0x3ccb,0xcd0b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x19,0x19,0x19,0x34ca,0x354a,0x34ca,0x34ca,0x344a,0x348a,0x388a,0xf4a,0x11ca,0x64a,0x68a,0x6ca,
+0x70a,0x74a,0x78a,0,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,
+0,0,0,0,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x60a,0x64a,0x68a,0x6ca,
+0x70a,0x74a,0x78a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,
+0x74a,0x78a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x5ca,0x60a,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,
+0x58a,0x5ca,0x60a,0x60a,0x64a,0x68a,0xc08a,0xc18a,0x58a,0x5ca,0x60a,0x60a,0x64a,0x68a,0x60a,0x60a,
+0x64a,0x64a,0x64a,0x64a,0x6ca,0x70a,0x70a,0x70a,0x74a,0x74a,0x78a,0x78a,0x78a,0x78a,0x5ca,0x60a,
+0x64a,0x68a,0x6ca,0x58a,0x5ca,0x60a,0x64a,0x64a,0x68a,0x68a,0x5ca,0x60a,0x58a,0x5ca,0x348a,0x388a,
+0x454a,0x348a,0x388a,0x35ca,5,5,5,5,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,
+0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0,0,0,
+0,0,0,0,5,5,5,5,5,5,5,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
-0x249,0x289,0,0,0,0,0x17,0x17,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,0,0,6,6,6,6,6,0x17,0,0,
-0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,0x17,
-0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b,4,4,4,4,0x17,0x1b,0,0,
-0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
-0x249,0x289,0,0x7cb,0x1e4b,0x788b,0x790b,0x798b,0x7a0b,0x7a8b,0,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-0,0,0,0,0,5,5,5,0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,
-0x74b,0x78b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0x58b,0x5cb,0x60b,0x17,
-0x17,0x17,0x17,0,0,0,0,0,5,5,5,5,5,0,0,0,
-0,0,0,0,0,0,0,0,5,8,8,8,8,8,8,8,
+0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,
+0,0,0x17,0x17,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,0,0,6,6,6,6,6,0x17,0,0,0,0,0,0,
+0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,6,6,6,6,6,6,6,0x17,0x17,0x17,0x17,0x17,
+0x1b,0x1b,0x1b,0x1b,4,4,4,4,0x17,0x1b,0,0,0,0,0,0,
+0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0x7cb,
+0x1e4b,0x788b,0x790b,0x798b,0x7a0b,0x7a8b,0,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,
+0,5,5,5,0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x80b,
+0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0x58b,0x5cb,0x60b,0x17,0x17,0x17,0x17,0,
+0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,0,
+0,0,0,6,5,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
-8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,4,
-4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,
+8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,6,
+6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,
+4,4,0x17,4,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,
-0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
-5,5,5,5,5,5,5,0,0,0,0,0,5,5,5,5,
-5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,
-5,5,5,5,5,5,5,5,5,5,0,0,0x1b,6,6,0x17,
-0x10,0x10,0x10,0x10,0,0,0,0,0,0,0,0,0,0,0,0,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,
+0,0,0,0,5,5,5,5,0,0,0,0,0,0,0,0,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,0,0,0,0,0,5,5,5,5,5,5,5,5,
+5,5,5,5,5,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,0,0,0x1b,6,6,0x17,0x10,0x10,0x10,0x10,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,8,8,6,
+6,6,0x1b,0x1b,0x1b,8,8,8,8,8,8,0x10,0x10,0x10,0x10,0x10,
+0x10,0x10,0x10,6,6,6,6,6,6,6,6,0x1b,0x1b,6,6,6,
+6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,6,6,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,8,8,6,6,6,0x1b,0x1b,0x1b,8,8,8,8,8,8,0x10,
-0x10,0x10,0x10,0x10,0x10,0x10,0x10,6,6,6,6,6,6,6,6,0x1b,
-0x1b,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,
-6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,6,6,
-6,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0x54b,0x58b,0x5cb,0x60b,
-0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,
-0,0,0,0,0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,
-0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x58b,0x5cb,
-0x60b,0x64b,0x68b,0x58b,0x68b,0,0,0,0,0,0,0,0x249,0x289,0x49,0x89,
-0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,
-0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,1,1,1,1,
+0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x1b,0x1b,6,6,6,0x1b,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,
+0x74b,0x78b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0,0,0,0,
+0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,
+0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x58b,0x5cb,0x60b,0x64b,0x68b,0x58b,
+0x68b,0,0,0,0,0,0,0,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,
+0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89,
+0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
-2,0,2,2,2,2,2,2,2,2,2,2,1,1,1,1,
+1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,2,2,2,2,2,2,2,0,2,2,
+2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,
+1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,1,0,1,1,
+0,0,1,0,0,1,1,0,0,1,1,1,1,0,1,1,
+1,1,1,1,1,1,2,2,2,2,0,2,0,2,2,2,
+2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+2,2,2,2,1,1,0,1,1,1,1,0,0,1,1,1,
+1,1,1,1,1,0,1,1,1,1,1,1,1,0,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-1,0,1,1,0,0,1,0,0,1,1,0,0,1,1,1,
-1,0,1,1,1,1,1,1,1,1,2,2,2,2,0,2,
-0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,
-2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,2,2,2,2,1,1,0,1,1,1,1,0,
-0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,
+2,2,2,2,2,2,2,2,1,1,0,1,1,1,1,0,
+1,1,1,1,1,0,1,0,0,0,1,1,1,1,1,1,
1,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,2,2,2,2,2,1,1,0,1,
-1,1,1,0,1,1,1,1,1,0,1,0,0,0,1,1,
-1,1,1,1,1,0,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,2,2,2,2,2,2,0,0,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,0x18,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0x18,
-2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x18,
+2,2,2,2,2,2,0,0,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,0x18,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,0x18,2,2,2,2,
+2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,0x18,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,0x18,2,2,2,2,2,2,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,0x18,
-2,2,2,2,2,2,1,2,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,
-0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0,6,6,6,
-6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,
-6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
-6,6,6,0x1b,0x1b,0x1b,0x1b,6,6,6,6,6,6,6,6,6,
-6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,
-6,6,6,6,6,6,6,0,6,6,6,6,6,6,6,6,
-6,6,6,6,6,6,6,6,6,0,0,6,6,6,6,6,
-6,6,0,6,6,0,6,6,6,6,6,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-5,5,5,5,5,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,
-6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0,
-2,2,2,2,6,6,6,6,6,6,6,0,0,0,0,0,
-0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17,
-1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,0x18,2,2,2,2,2,2,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,2,2,2,0x18,2,2,2,2,
+2,2,1,2,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,
+0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0,6,6,6,6,6,6,6,
+6,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,
+6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0x1b,
+0x1b,0x1b,0x1b,6,6,6,6,6,6,6,6,6,6,6,6,6,
+6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,
+6,6,6,0,6,6,6,6,6,6,6,6,6,6,6,6,
+6,6,6,6,6,0,0,6,6,6,6,6,6,6,0,6,
+6,0,6,6,6,6,6,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,
+0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,5,0x1b,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,0,0,0,6,6,6,6,
+6,6,6,4,4,4,4,4,4,4,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,6,6,6,6,0x49,0x89,0xc9,0x109,
+0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0x19,5,5,5,5,
+5,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,6,6,6,6,
+6,6,6,0,0,0,0,0,0,0,0,0,2,2,2,2,
+6,6,6,6,6,6,6,4,0,0,0,0,0x49,0x89,0xc9,0x109,
+0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17,1,1,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,
-0x78cb,0x794b,0x814b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x1b,0x34cb,0x344b,0x3ccb,
-0x19,0x58b,0x5cb,0x788b,0x78cb,0,0,0,0,0,0,0,0,0,0,0,
-0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,
-0x984b,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x78cb,0x80cb,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0x18,0x18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-0,5,5,0,5,0,0,5,0,5,5,5,5,5,5,5,
-5,5,5,0,5,5,5,5,0,5,0,5,0,0,0,0,
-0,0,5,0,0,0,0,5,0,5,0,5,0,5,5,5,
-0,5,5,0,5,0,0,5,0,5,0,5,0,5,0,5,
-0,5,5,0,5,0,0,5,5,5,5,0,5,5,5,5,
-5,5,5,0,5,5,5,5,0,5,5,5,5,0,5,0,
-5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,
-0,5,5,5,0,5,5,5,5,5,0,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,
+2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,
+0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x78cb,0x794b,0x814b,0x58b,
+0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x1b,0x34cb,0x344b,0x3ccb,0x19,0x58b,0x5cb,0x788b,
+0x78cb,0,0,0,0,0,0,0,0,0,0,0,0x16cb,0x194b,0x1bcb,0x1e4b,
+0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0xa04b,0xa84b,0xb04b,
+0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x78cb,0x80cb,0x984b,0xa04b,0xa84b,0xb04b,
+0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x1b,0x5cb,0x60b,0x64b,0x68b,0x6cb,
+0x70b,0x74b,0x78b,0x7cb,0x900b,0xa00b,0x804b,0x788b,0x344b,0x354b,0,0,0,0x58b,0x5cb,0x60b,
+0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,
+0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x18,0x18,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0,5,5,0,
+5,0,0,5,0,5,5,5,5,5,5,5,5,5,5,0,
+5,5,5,5,0,5,0,5,0,0,0,0,0,0,5,0,
+0,0,0,5,0,5,0,5,0,5,5,5,0,5,5,0,
+5,0,0,5,0,5,0,5,0,5,0,5,0,5,5,0,
+5,0,0,5,5,5,5,0,5,5,5,5,5,5,5,0,
+5,5,5,5,0,5,5,5,5,0,5,0,5,5,5,5,
+5,5,5,5,5,5,0,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,0,0,0,0,0,5,5,5,
+0,5,5,5,5,5,0,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,0,0,0,0,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,
+0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x2cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x54b,0x54b,0,0,0,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x2cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x54b,
-0x54b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,
@@ -1311,50 +1335,58 @@ static const uint16_t propsTrie_index[21452]={
0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1a,
0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,
-0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,
+0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,
0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,
+0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,
0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,
0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,
0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0,0,0,0x1b,0,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,
-0,0,0,0,5,0x705,5,5,5,5,5,5,5,5,5,5,
+0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0,
+0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,5,0x705,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,0x645,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0x645,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,0x645,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,0x645,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,0x685,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,0x685,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,0xcc5,5,5,5,5,5,5,5,5,0xf45,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,0xf45,5,5,5,
-5,5,5,5,5,5,5,5,5,5,0x6c5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,0x605,5,5,
+5,5,5,5,5,5,5,5,5,5,5,0xcc5,5,5,5,5,
+5,5,5,5,0xf45,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,0xf45,5,5,5,5,5,5,5,5,5,5,5,
+5,5,0x6c5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,0x605,5,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,0x605,5,5,5,5,5,5,
+5,0x605,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0x605,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,0x605,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,0x605,5,5,5,5,
+5,5,5,5,5,5,5,5,5,0x645,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,0x605,5,5,5,5,5,5,5,5,5,5,5,5,
-5,0x645,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,
+5,0,0,0,0,0,0,0,0,0,0,0,5,5,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,0x785,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
+0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0x785,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
-0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0,0x10,0,0,0,0,0,0,
+0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0,0x10,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,
-6,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,
+6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x11,0x11,0x11,0x11,
0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
-0x11,0x11,0x11,0x11,0x11,0x11,0,0,0,0,0,0
+0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0,0,0,0,0,0
};
static const UTrie2 propsTrie={
@@ -1362,1911 +1394,1947 @@ static const UTrie2 propsTrie={
propsTrie_index+4468,
NULL,
4468,
- 16984,
+ 17500,
0xa40,
0x11f4,
0x0,
0x0,
0x110000,
- 0x53c8,
+ 0x55cc,
NULL, 0, FALSE, FALSE, 0, NULL
};
-static const uint16_t propsVectorsTrie_index[30012]={
-0x4d5,0x4dd,0x4e5,0x4ed,0x505,0x50d,0x515,0x51d,0x525,0x52d,0x535,0x53d,0x545,0x54d,0x555,0x55d,
-0x564,0x56c,0x574,0x57c,0x57f,0x587,0x58f,0x597,0x59f,0x5a7,0x5af,0x5b7,0x5bf,0x5c7,0x5cf,0x5d7,
-0x5df,0x5e7,0x5ee,0x5f6,0x5fe,0x606,0x60e,0x616,0x61e,0x626,0x62b,0x633,0x63a,0x642,0x64a,0x652,
-0x65a,0x662,0x66a,0x672,0x679,0x681,0x689,0x691,0x699,0x6a1,0x6a9,0x6b1,0x6b9,0x6c1,0x6c9,0x6d1,
-0x19a7,0xd68,0xe47,0x6d9,0x4f5,0xeae,0xeb6,0x1b46,0x1276,0x128e,0x127e,0x1286,0x7ae,0x7b4,0x7bc,0x7c4,
-0x7cc,0x7d2,0x7da,0x7e2,0x7ea,0x7f0,0x7f8,0x800,0x808,0x80e,0x816,0x81e,0x826,0x82e,0x836,0x83d,
-0x845,0x84b,0x853,0x85b,0x863,0x869,0x871,0x879,0x881,0x1296,0x889,0x891,0x899,0x8a0,0x8a8,0x8b0,
-0x8b8,0x8bc,0x8c4,0x8cb,0x8d3,0x8db,0x8e3,0x8eb,0x15a6,0x15ae,0x8f3,0x8fb,0x903,0x90b,0x913,0x91a,
-0x160c,0x15fc,0x1604,0x18e2,0x18ea,0x12a6,0x922,0x129e,0x14f0,0x14f0,0x14f2,0x12ba,0x12bb,0x12ae,0x12b0,0x12b2,
-0x1614,0x1616,0x92a,0x1616,0x932,0x937,0x93f,0x161b,0x945,0x1616,0x94b,0x953,0xc3d,0x1623,0x1623,0x95b,
-0x1633,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,
-0x1634,0x1634,0x1634,0x162b,0x963,0x163c,0x163c,0x96b,0xb52,0xb5a,0xb62,0xb6a,0x164c,0x1644,0x973,0x97b,
-0x983,0x1656,0x165e,0x98b,0x1654,0x993,0x19af,0xd70,0xb72,0xb7a,0xb82,0xb87,0x1850,0xc70,0xc77,0x17b8,
-0xc0d,0x19b7,0xd78,0xd80,0xd88,0xd90,0xf66,0xf66,0x18a8,0x18ad,0xcab,0xcb3,0x191e,0x1926,0x1a68,0xe4f,
-0x192e,0xcfc,0xd04,0x1936,0x112a,0x11ca,0xf46,0xd98,0x17d8,0x17c0,0x17d0,0x17c8,0x1868,0x1860,0x1828,0xc1d,
-0x12c3,0x12c3,0x12c3,0x12c3,0x12c6,0x12c3,0x12c3,0x12ce,0x99b,0x12d6,0x99f,0x9a7,0x12d6,0x9af,0x9b7,0x9bf,
-0x12e6,0x12de,0x12ee,0x9c7,0x9cf,0x12f6,0x9d7,0x9df,0x12fe,0x1306,0x130e,0x1316,0x9e7,0x131e,0x1325,0x132d,
-0x1335,0x133d,0x1345,0x134d,0x1355,0x135c,0x1364,0x136c,0x1374,0x137c,0x137f,0x1381,0x1666,0x174b,0x1751,0x1898,
-0x1389,0x9ef,0x9f7,0x14a3,0x14a8,0x14ab,0x14b3,0x1391,0x14bb,0x14bb,0x13a1,0x1399,0x13a9,0x13b1,0x13b9,0x13c1,
-0x13c9,0x13d1,0x13d9,0x13e1,0x1759,0x17b0,0x18f2,0x1a48,0x13f1,0x13f8,0x1400,0x1408,0x13e9,0x1410,0x1761,0x1768,
-0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x1770,0x1773,0x1770,0x1770,0x177b,0x1782,0x1784,0x178b,
-0x1793,0x1797,0x1797,0x179a,0x1797,0x1797,0x17a0,0x1797,0x17e0,0x18a0,0x18fa,0xb8f,0xb95,0x1b7a,0xb9b,0xba0,
-0x1840,0xc4d,0xc51,0x18b5,0x1830,0x1830,0x1830,0xc25,0x1838,0xc45,0x1880,0xc9b,0xc2d,0xc35,0xc35,0x193e,
-0x1870,0x1902,0xc87,0xc8b,0x9ff,0x1676,0x1676,0xa07,0x167e,0x167e,0x167e,0x167e,0x167e,0x167e,0xa0f,0x6dd,
-0x14d8,0x14fa,0xa17,0x1502,0xa1f,0x150a,0x1512,0x151a,0xa27,0xa2c,0x1522,0x1529,0xa31,0xa39,0x1890,0xc15,
-0xa41,0x1580,0x1587,0x1531,0x158f,0x1596,0x1539,0xa49,0x1552,0x1552,0x1554,0x1541,0x1549,0x1549,0x154a,0x159e,
-0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,
-0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,
-0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,
-0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,
-0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,
-0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,
-0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,
-0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,
-0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,
-0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,
-0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,
-0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,
-0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x122b,0x17e8,0x17e8,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,
-0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x1563,0x199f,0x1233,
-0x168e,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,
-0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,
-0x1694,0x1694,0x1694,0x1694,0xa51,0x169c,0xa59,0x19bf,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,
-0x1946,0xd0c,0x195a,0x1952,0x195c,0x19c7,0x19c7,0xda0,0x1848,0x18bd,0x1912,0x1916,0x190a,0xcbb,0xcc2,0xcc5,
-0x1878,0xc93,0x18c5,0xccd,0x1964,0x1967,0xd14,0x19cf,0x1977,0x196f,0xd1c,0xda8,0x19d7,0x19db,0xdb0,0x100d,
-0x197f,0xd24,0xd2c,0x19e3,0x19f3,0x19eb,0xdb8,0xf09,0xe57,0xe5f,0x1bc1,0xfc5,0x1c66,0x1c66,0x19fb,0xdc0,
-0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,
-0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,
-0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,
-0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,
-0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,
-0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,
-0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,
-0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,
-0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,
-0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,
-0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,
-0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,
-0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,
-0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,
-0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,
-0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,
-0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,
-0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,
-0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,
-0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,
-0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,
-0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0xa61,0xdc8,0xdcb,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,
-0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,
-0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,
-0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,
-0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,
-0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,
-0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,
-0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,
-0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,
-0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,
-0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,
-0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,
-0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,
-0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,
-0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,
-0x1570,0x1578,0x17a8,0x123b,0x1888,0x1888,0x123f,0x1246,0xa69,0xa71,0xa79,0x1430,0x1437,0x143f,0xa81,0x1447,
-0x1478,0x1478,0x1420,0x1428,0x144f,0x146f,0x1470,0x1480,0x1457,0x1418,0xa89,0x145f,0xa91,0x1467,0xa99,0xa9d,
-0xca3,0x1488,0xaa5,0xaad,0x1490,0x1496,0x149b,0xab5,0xac5,0x14e0,0x14e8,0x14cb,0x14d0,0xacd,0xad5,0xabd,
-0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,
-0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15be,0x15be,0x15be,0x15be,
-0x13d4,0x13d4,0x1414,0x1454,0x1494,0x14d4,0x1514,0x1554,0x1590,0x15d0,0x15fc,0x163c,0x167c,0x16bc,0x16fc,0x173c,
-0x177c,0x17b8,0x17f8,0x1838,0x1878,0x18ac,0x18e8,0x1928,0x1968,0x19a8,0x19e4,0x1a24,0x1a64,0x1aa4,0x1ae4,0x1b24,
-0xa80,0xac0,0xb00,0xb40,0xb80,0xa40,0xbc0,0xa40,0xea8,0xa40,0xa40,0xa40,0xa40,0xc00,0x12d3,0x12d3,
-0xee8,0xf28,0xa40,0xa40,0xa40,0xa40,0xc40,0xc60,0xa40,0xa40,0xca0,0xce0,0xd20,0xd60,0xe68,0xdd8,
-0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,
-0x1213,0x1213,0x1213,0x1213,0xf68,0x1253,0x1088,0x10c8,0x1293,0x10d3,0x1313,0x1313,0x1313,0xfa8,0xfc8,0x1008,
-0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,
-0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0x1048,
+static const uint16_t propsVectorsTrie_index[30588]={
+0x4d6,0x4de,0x4e6,0x4ee,0x506,0x50e,0x516,0x51e,0x526,0x52e,0x536,0x53e,0x546,0x54e,0x556,0x55e,
+0x565,0x56d,0x575,0x57d,0x580,0x588,0x590,0x598,0x5a0,0x5a8,0x5b0,0x5b8,0x5c0,0x5c8,0x5d0,0x5d8,
+0x5e0,0x5e8,0x5ef,0x5f7,0x5ff,0x607,0x60f,0x617,0x61f,0x627,0x62c,0x634,0x63b,0x643,0x64b,0x653,
+0x65b,0x663,0x66b,0x673,0x67a,0x682,0x68a,0x692,0x69a,0x6a2,0x6aa,0x6b2,0x6ba,0x6c2,0x6ca,0x6d2,
+0x19e4,0xd43,0xe2a,0x6da,0x4f6,0xe91,0xe99,0x1b8e,0x12b7,0x12c7,0x12af,0x12bf,0x7a3,0x7a9,0x7b1,0x7b9,
+0x7c1,0x7c7,0x7cf,0x7d7,0x7df,0x7e5,0x7ed,0x7f5,0x7fd,0x803,0x80b,0x813,0x81b,0x823,0x82b,0x832,
+0x83a,0x840,0x848,0x850,0x858,0x85e,0x866,0x86e,0x876,0x12cf,0x87e,0x886,0x88e,0x895,0x89d,0x8a5,
+0x8ad,0x8b1,0x8b9,0x8c0,0x8c8,0x8d0,0x8d8,0x8e0,0x15e3,0x15eb,0x8e8,0x8f0,0x8f8,0x900,0x908,0x90f,
+0x1649,0x1639,0x1641,0x191f,0x1927,0x12df,0x917,0x12d7,0x1529,0x1529,0x152b,0x12f3,0x12f4,0x12e7,0x12e9,0x12eb,
+0x1651,0x1653,0x91f,0x1653,0x927,0x92c,0x934,0x1658,0x93a,0x1653,0x940,0x948,0xc1f,0x1660,0x1660,0x950,
+0x1670,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,
+0x1671,0x1671,0x1671,0x1668,0x958,0x1679,0x1679,0x960,0xb3f,0xb47,0xb4f,0xb57,0x1689,0x1681,0x968,0x970,
+0x978,0x1693,0x169b,0x980,0x1691,0x988,0x19ec,0xd4b,0xb5f,0xb67,0xb6f,0xb74,0x188d,0xc52,0xc59,0x17f5,
+0xbef,0x19f4,0xd53,0xd5b,0xd63,0xd6b,0xf44,0xf44,0x18e5,0x18ea,0xc8d,0xc95,0x195b,0x1963,0x1aad,0xe32,
+0x196b,0xcd7,0xcdf,0x1973,0x1101,0x11a9,0xf24,0xd73,0x1815,0x17fd,0x180d,0x1805,0x18a5,0x189d,0x1865,0xbff,
+0x12fc,0x12fc,0x12fc,0x12fc,0x12ff,0x12fc,0x12fc,0x1307,0x990,0x130f,0x994,0x99c,0x130f,0x9a4,0x9ac,0x9b4,
+0x131f,0x1317,0x1327,0x9bc,0x9c4,0x132f,0x9cc,0x9d4,0x1337,0x133f,0x1347,0x134f,0x9dc,0x1357,0x135e,0x1366,
+0x136e,0x1376,0x137e,0x1386,0x138e,0x1395,0x139d,0x13a5,0x13ad,0x13b5,0x13b8,0x13ba,0x16a3,0x1788,0x178e,0x18d5,
+0x13c2,0x9e4,0x9ec,0x14dc,0x14e1,0x14e4,0x14ec,0x13ca,0x14f4,0x14f4,0x13da,0x13d2,0x13e2,0x13ea,0x13f2,0x13fa,
+0x1402,0x140a,0x1412,0x141a,0x1796,0x17ed,0x192f,0x1a85,0x142a,0x1431,0x1439,0x1441,0x1422,0x1449,0x179e,0x17a5,
+0x16ab,0x16ab,0x16ab,0x16ab,0x16ab,0x16ab,0x16ab,0x16ab,0x17ad,0x17b0,0x17ad,0x17ad,0x17b8,0x17bf,0x17c1,0x17c8,
+0x17d0,0x17d4,0x17d4,0x17d7,0x17d4,0x17d4,0x17dd,0x17d4,0x181d,0x18dd,0x1937,0xb7c,0xb82,0x1bca,0x1bd2,0x1ca9,
+0x187d,0xc2f,0xc33,0x18f2,0x186d,0x186d,0x186d,0xc07,0x1875,0xc27,0x18bd,0xc7d,0xc0f,0xc17,0xc17,0x197b,
+0x18ad,0x193f,0xc69,0xc6d,0x9f4,0x16b3,0x16b3,0x9fc,0x16bb,0x16bb,0x16bb,0x16bb,0x16bb,0x16bb,0xa04,0x6de,
+0x1511,0x1533,0xa0c,0x153b,0xa14,0x1543,0x154b,0x1553,0xa1c,0xa21,0x155b,0x1562,0xa26,0xa2e,0x18cd,0xbf7,
+0xa36,0x15bd,0x15c4,0x156a,0x15cc,0x15d3,0x1572,0x1576,0x158f,0x158f,0x1591,0x157e,0x1586,0x1586,0x1587,0x15db,
+0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,
+0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,
+0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,
+0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,
+0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,
+0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,
+0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,
+0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,
+0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,
+0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,
+0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,
+0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,
+0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x1264,0x1825,0x1825,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,
+0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x15a0,0x19dc,0x126c,
+0x16cb,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,
+0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,
+0x16d1,0x16d1,0x16d1,0x16d1,0xa3e,0x16d9,0xa46,0x19fc,0x1987,0x1987,0x1987,0x1987,0x1987,0x1987,0x1987,0x1987,
+0x1983,0xce7,0x1997,0x198f,0x1999,0x1a04,0x1a04,0xd7b,0x1885,0x18fa,0x194f,0x1953,0x1947,0x1aa5,0xc9d,0xca0,
+0x18b5,0xc75,0x1902,0xca8,0x19a1,0x19a4,0xcef,0x1a0c,0x19b4,0x19ac,0xcf7,0xd83,0x1a14,0x1a18,0xd8b,0xfec,
+0x19bc,0xcff,0xd07,0x1a20,0x1a30,0x1a28,0xd93,0xeec,0xe3a,0xe42,0x1c19,0xfa4,0x1cc6,0x1cc6,0x1a38,0xd9b,
+0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,
+0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,
+0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,
+0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,
+0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,
+0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,
+0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,
+0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,
+0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,
+0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,
+0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,
+0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,
+0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,
+0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,
+0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,
+0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,
+0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,
+0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,
+0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,
+0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,
+0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,
+0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0xa4e,0xda3,0xda6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,
+0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,
+0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,
+0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,
+0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,
+0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,
+0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,
+0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,
+0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,
+0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,
+0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,
+0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,
+0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,
+0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,
+0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,
+0x15ad,0x15b5,0x17e5,0x1274,0x18c5,0x18c5,0x1278,0x127f,0xa56,0xa5e,0xa66,0x1469,0x1470,0x1478,0xa6e,0x1480,
+0x14b1,0x14b1,0x1459,0x1461,0x1488,0x14a8,0x14a9,0x14b9,0x1490,0x1451,0xa76,0x1498,0xa7e,0x14a0,0xa86,0xa8a,
+0xc85,0x14c1,0xa92,0xa9a,0x14c9,0x14cf,0x14d4,0xaa2,0xab2,0x1519,0x1521,0x1504,0x1509,0xaba,0xac2,0xaaa,
+0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,
+0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15fb,0x15fb,0x15fb,0x15fb,
+0x13d8,0x13d8,0x1418,0x1458,0x1498,0x14d8,0x1518,0x1558,0x1594,0x15d4,0x1600,0x1640,0x1680,0x16c0,0x1700,0x1740,
+0x1780,0x17bc,0x17fc,0x183c,0x187c,0x18b0,0x18ec,0x192c,0x196c,0x19ac,0x19e8,0x1a28,0x1a68,0x1aa8,0x1ae8,0x1b28,
+0xa80,0xac0,0xb00,0xb40,0xb80,0xa40,0xe48,0xa40,0xe6a,0xa40,0xa40,0xa40,0xa40,0xbc0,0x12d5,0x12d5,
+0xeaa,0xeea,0xa40,0xa40,0xa40,0xa40,0xf2a,0xc00,0xa40,0xa40,0xc40,0xc80,0xcc0,0xd00,0xe08,0xd78,
+0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,
+0x1215,0x1215,0x1215,0x1215,0xf6a,0x1255,0x108a,0x10ca,0x1295,0x10d5,0x1315,0x1315,0x1315,0xfaa,0xfca,0x100a,
+0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,
+0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0x104a,
0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,
-0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98,
+0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38,
0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,
-0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98,
+0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38,
0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,
-0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98,
+0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38,
0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,
-0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98,
+0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38,
0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,
-0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98,
+0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38,
0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,
-0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98,
+0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38,
0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,
-0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98,
+0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38,
0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,
-0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98,
+0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38,
0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,
-0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98,
+0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38,
0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,
-0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98,
-0xe18,0xe28,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,
-0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98,
-0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,
-0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1113,
-0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,
-0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x1153,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0xba8,0xbaf,0xbb7,0xbbf,0x17f0,0x17f0,0x17f0,0xbc7,0xbcf,0xbd2,0x1820,0x1818,0xc05,0xd34,0xd38,0xd3c,
-0x4f5,0x4f5,0x4f5,0x4f5,0xd44,0x1987,0xd4c,0xf5e,0x16a4,0xadd,0xae3,0x101d,0xbda,0x1858,0xc7f,0x4f5,
-0x16b9,0x16ac,0x16b1,0x17f8,0xbe2,0xbea,0x1168,0x116e,0x1ba9,0xf7b,0x1b99,0x6e5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x1bc9,0x1bc9,0x1bc9,0x1bc9,0x1bc9,0x1bc9,0x1bc9,0x1bc9,0x1bc9,0xfcd,0xfd5,0xfdd,0x4f5,0x4f5,0x4f5,0x4f5,
-0xbf2,0xbf5,0xdd3,0x1c11,0x1015,0x6ed,0x4f5,0x10ae,0xcd5,0xd54,0x4f5,0x4f5,0x1b56,0xf11,0xf19,0x1c51,
-0xc59,0xc60,0xc68,0x1a03,0x1bf1,0x4f5,0x1bd1,0xfed,0x1a0b,0xddb,0xde3,0xdeb,0x103d,0x6f5,0x4f5,0x4f5,
-0x1a13,0x1a13,0x6fd,0x4f5,0x1c7e,0x10c6,0x1c76,0x10ce,0x1d26,0x11e0,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0xdf3,0x4f5,0x4f5,0x4f5,0x4f5,0x1d46,0x1208,0x120f,0x705,0x4f5,0x4f5,0x4f5,0x4f5,
-0x1a70,0x1a72,0xe67,0xe6e,0x1a1b,0x1a23,0xdfb,0xf3e,0x1b4e,0xef9,0xf01,0xfe5,0x1b66,0x1b6a,0xf36,0x105d,
-0xfb0,0xfb5,0x70d,0x4f5,0x10b6,0x10be,0x1bb9,0xfbd,0xf92,0xf98,0xfa0,0xfa8,0x4f5,0x4f5,0x4f5,0x4f5,
-0x1cc6,0x1cbe,0x1158,0x1160,0x1c39,0x1c31,0x1084,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x1c21,0x1045,0x104d,0x1055,
-0x1be9,0x1be1,0xffd,0x1150,0x1b72,0xf4e,0x715,0x4f5,0x1094,0x109c,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x1d1e,0x11c2,0x71d,0x4f5,0x4f5,0x1c49,0x1c41,0x108c,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x1cf6,0x1cee,0x11b2,0x1ce6,0x11aa,0x725,0x1c19,0x1035,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x110e,0x1113,0x111b,0x1122,0x1142,0x1148,0x4f5,0x4f5,0x118e,0x1192,0x119a,0x11d2,0x11d8,0x72d,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x11f0,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,
-0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18d2,0xcdd,0xce4,0xce4,0xce4,
-0x18da,0x18da,0x18da,0xcec,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x735,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,
-0x1a2b,0x1a2b,0x1a2d,0x1a2b,0x1a35,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a38,0x1a2b,0x1a2b,0x1a2b,0x1a2b,
-0x1a2b,0x73d,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,
-0x1a7a,0xe76,0x1005,0x745,0x4f5,0x4f5,0x749,0xf56,0x1c09,0x1c01,0x1025,0x102d,0x751,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x1d3e,0x1d36,0x1200,0x4f5,0x4f5,0x4f5,0x1b5e,0x1b5e,0xf21,0xf26,0xf2e,0x4f5,0x4f5,0x113a,
-0x1a8a,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1186,0x759,0x4f5,0x75d,0x1d16,0x1d16,0x1d16,0x1d16,
-0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x11a2,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x1ba1,0x1ba1,0x1ba1,0xf6e,0xf73,0x765,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x16c1,0x16c1,0x16c1,0x16c1,0x16c1,0x16c1,0x16c1,0xaeb,0x16d1,0xaf3,0x16d2,0x16c9,0x16da,0x16e0,0x16e8,0xafb,
-0x1810,0x1810,0x76d,0x4f5,0x4f5,0x4f5,0x4f5,0x11f8,0x1800,0x1800,0xbfd,0xcf4,0x4f5,0x4f5,0x4f5,0x4f5,
-0x1719,0x1720,0xb03,0x1723,0xb0b,0xb13,0xb1b,0x171d,0xb23,0xb2b,0xb33,0x1722,0x172a,0x1719,0x1720,0x171c,
-0x1723,0x172b,0x171a,0x1721,0x171d,0xb3a,0x16f0,0x16f8,0x16ff,0x1706,0x16f3,0x16fb,0x1702,0x1709,0xb42,0x1711,
-0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,
-0x1c86,0x1c89,0x1c86,0x1c90,0x10fe,0x775,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x1132,0x77d,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x1bd9,0x1bd9,0x1bd9,0x1bd9,0x1bd9,0x1bd9,0xff5,0x4f5,0x1cb6,0x1cae,0x1106,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x781,0x1d2e,0x11e8,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0xebe,0xec6,0xece,0xed6,0xede,0xee6,0xeed,0xef1,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x789,0x1065,0x1c29,0x106b,0x1c29,0x1073,0x1078,0x107c,0x107c,
-0x10d6,0x10de,0x1cce,0x10e6,0x1ca6,0x10ee,0x10f6,0x1d06,0x11ba,0x11ba,0x11ba,0x791,0x795,0x795,0x795,0x795,
-0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,
-0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,
-0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x796,0xb4a,0x1733,0x1733,0x1733,0x79e,0x79e,0x79e,0x79e,
-0x1808,0x1808,0x1808,0x1808,0x1808,0x1808,0x1808,0x7a6,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,
-0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,
-0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,
-0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,
-0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x198f,0xd5c,0x1997,0x1997,0xd60,0xe7e,0xe86,0xe8e,
-0xe03,0x1a40,0x1a58,0xe0b,0x1a50,0xe13,0xe17,0xe1e,0xe26,0xe2d,0xe35,0xe3d,0xe3f,0xe3f,0xe3f,0xe3f,
-0x1ab1,0x1ab9,0x1ab1,0x1abf,0x1ac7,0x1a92,0x1acf,0x1ad7,0x1ab1,0x1adf,0x1ae7,0x1aee,0x1af6,0x1a9a,0x1ab1,0x1af8,
-0x1aa2,0x1aa9,0x1b00,0x1b06,0x1b8a,0x1b91,0x1b82,0x1b0e,0x1b16,0x1b1e,0x1b26,0x1bf9,0x1b2e,0x1b36,0xe96,0xe9e,
-0x1a82,0x1a82,0x1a82,0xea6,0x1bb1,0x1bb1,0xf83,0xf8a,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,
-0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c5e,0x1c59,0x1c59,0x1c59,0x10a4,0x10a6,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,
-0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,
-0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,
-0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,
-0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1176,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,
-0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x117e,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,
-0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,
-0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,
-0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,
-0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x124e,0x1217,
-0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,
-0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,
-0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x121f,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,
-0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,
-0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,
-0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,
-0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,
-0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1256,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,
-0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,
-0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,
-0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1223,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,
-0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,
-0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,
-0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,
-0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1223,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,
-0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,
-0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,
-0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,
-0x1a60,0x125e,0x1b3e,0x1b3e,0x1b3e,0x1b3e,0x1b3e,0x1b3e,0x1266,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,
-0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,
-0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,
-0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,
-0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x126e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,
-0x1d0e,0x1d0e,0x1d0e,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,
-0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,
-0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,
-0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,
-0x15de,0x15de,0x15ce,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,
-0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,
-0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,
-0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,
-0x15e6,0x15e6,0x15d6,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,
-0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,
-0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,
-0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,
-0x15de,0x15de,0x15de,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,
-0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,
-0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,
-0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,
-0x15e6,0x15e6,0x15e6,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,
-0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,
-0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,
-0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,
-0x173b,0x173b,0x173b,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,
-0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,
-0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,
-0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,
-0x1a60,0x1a60,0x1a60,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,
-0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,
-0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,
-0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,
-0x1c9e,0x1c9e,0x1c9e,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,
-0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,
-0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,
-0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,
-0x1cd6,0x1cd6,0x1cd6,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,
-0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,
-0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,
-0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,
-0x1d0e,0x1d0e,0x1d0e,0x4d4,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a3,0x2ac,0x2a6,
-0x2a6,0x2a9,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
-0x2a0,0x2a0,0x2a0,0x2a0,0x7d4,0x7ce,0x7b3,0x7aa,0x7a1,0x79e,0x795,0x7b0,0x79b,0x7a7,0x7aa,0x7c5,
-0x7bc,0x7ad,0x7d1,0x7a4,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x7b9,0x7b6,
-0x7bf,0x7bf,0x7bf,0x7ce,0x795,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7da,0x7da,0x7da,0x7da,0x7da,
-0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x79b,
-0x7a1,0x7a7,0x7cb,0x78f,0x7c8,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,
-0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x79b,
-0x7c2,0x798,0x7bf,0x2a0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38,
+0xdb8,0xdc8,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,
+0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38,
+0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,
+0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1115,
+0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,
+0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x1155,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0xb8a,0xb91,0xb99,0xba1,0x182d,0x182d,0x182d,0xba9,0xbb1,0xbb4,0x185d,0x1855,0xbe7,0xd0f,0xd13,0xd17,
+0x4f6,0x4f6,0x4f6,0x4f6,0xd1f,0x19c4,0xd27,0xf3c,0x16e1,0xaca,0xad0,0xffc,0xbbc,0x1895,0xc61,0x4f6,
+0x16f6,0x16e9,0x16ee,0x1835,0xbc4,0xbcc,0x113f,0x1145,0x1c01,0xf59,0x1bf1,0x6e6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x1c21,0x1c21,0x1c21,0x1c21,0x1c21,0x1c21,0x1c21,0x1c21,0x1c21,0xfac,0xfb4,0xfbc,0x4f6,0x4f6,0x4f6,0x4f6,
+0xbd4,0xbd7,0xdae,0x1c69,0xff4,0x6ee,0x4f6,0x108d,0xcb0,0xd2f,0x4f6,0x4f6,0x1b9e,0xef4,0xefc,0x1cb1,
+0xc3b,0xc42,0xc4a,0x1a40,0x1c49,0x4f6,0x1c29,0xfcc,0x1a48,0xdb6,0xdbe,0xdc6,0x101c,0x6f6,0x4f6,0x4f6,
+0x1a50,0x1a50,0x6fe,0x4f6,0x1cde,0x10a5,0x1cd6,0x10ad,0x1d96,0x11bf,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0xdce,0x4f6,0x4f6,0x4f6,0x4f6,0x1db6,0x11e7,0x11ee,0x706,0x4f6,0x4f6,0x4f6,0x11f6,
+0x1ab5,0x1ab7,0xe4a,0xe51,0x1a58,0x1a60,0xdd6,0xf1c,0x1b96,0xedc,0xee4,0xfc4,0x1bb6,0x1bba,0xf14,0x103c,
+0xf8f,0xf94,0x70e,0x4f6,0x1095,0x109d,0x1c11,0xf9c,0xf71,0xf77,0xf7f,0xf87,0x4f6,0x4f6,0x4f6,0x4f6,
+0x1d26,0x1d1e,0x112f,0x1137,0x1c91,0x1c89,0x1063,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1c79,0x1024,0x102c,0x1034,
+0x1c41,0x1c39,0xfdc,0x1127,0x1bc2,0xf2c,0x716,0x4f6,0x1073,0x107b,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x1d8e,0x11a1,0x71e,0x4f6,0x4f6,0x1ca1,0x1c99,0x106b,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x11fe,0x1202,0x120a,
+0x1d66,0x1d5e,0x1189,0x1d56,0x1d4e,0x726,0x1c71,0x1014,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x10e5,0x10ea,0x10f2,0x10f9,0x1119,0x111f,0x4f6,0x4f6,0x116d,0x1171,0x1179,0x11b1,0x11b7,0x72e,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x11cf,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1dce,0x1240,
+0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,
+0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190f,0xcb8,0xcbf,0xcbf,0xcbf,
+0x1917,0x1917,0x1917,0xcc7,0x1cce,0x1cce,0x1cce,0x1cce,0x1cce,0x1cce,0x736,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,
+0x1abf,0xe59,0xfe4,0x73e,0x4f6,0x4f6,0x742,0xf34,0x1c61,0x1c59,0x1004,0x100c,0x74a,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x1dae,0x1da6,0x11df,0x4f6,0x4f6,0x4f6,0x1bae,0x1bae,0xf04,0x1ba6,0xf0c,0x4f6,0x4f6,0x1111,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x1bf9,0x1bf9,0x1bf9,0xf4c,0xf51,0x752,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x16fe,0x16fe,0x16fe,0x16fe,0x16fe,0x16fe,0x16fe,0xad8,0x170e,0xae0,0x170f,0x1706,0x1717,0x171d,0x1725,0xae8,
+0x184d,0x184d,0x75a,0x4f6,0x4f6,0x4f6,0x4f6,0x11d7,0x183d,0x183d,0xbdf,0xccf,0x4f6,0x4f6,0x4f6,0x4f6,
+0x1756,0x175d,0xaf0,0x1760,0xaf8,0xb00,0xb08,0x175a,0xb10,0xb18,0xb20,0x175f,0x1767,0x1756,0x175d,0x1759,
+0x1760,0x1768,0x1757,0x175e,0x175a,0xb27,0x172d,0x1735,0x173c,0x1743,0x1730,0x1738,0x173f,0x1746,0xb2f,0x174e,
+0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,
+0x1ce6,0x1ce9,0x1ce6,0x1cf0,0x10d5,0x762,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x1109,0x76a,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1dc6,0x1212,0x772,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1dd6,0x1248,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x1c31,0x1c31,0x1c31,0x1c31,0x1c31,0x1c31,0xfd4,0x4f6,0x1d16,0x1d0e,0x10dd,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x776,0x1d9e,0x11c7,0x4f6,0x4f6,0x121a,0x121b,0x77e,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0xea1,0xea9,0xeb1,0xeb9,0xec1,0xec9,0xed0,0xed4,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x782,0x1044,0x1c81,0x104a,0x1c81,0x1052,0x1057,0x105b,0x105b,
+0x10b5,0x1d2e,0x1d36,0x10bd,0x1d06,0x10c5,0x10cd,0x1d76,0x1dbe,0x1dbe,0x1191,0x1199,0x1232,0x1238,0x1238,0x1238,
+0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,
+0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,
+0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78b,0xb37,0x1770,0x1770,0x1770,0x793,0x793,0x793,0x793,
+0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x79b,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,
+0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,
+0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,
+0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,
+0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x19cc,0xd37,0x19d4,0x19d4,0xd3b,0xe61,0xe69,0xe71,
+0xde6,0x1a7d,0x1a95,0xdee,0x1a8d,0xdf6,0xdfa,0xe01,0xe09,0xe10,0xe18,0xe20,0xe22,0xe22,0xe22,0xe22,
+0x1af6,0x1afe,0x1af6,0x1b04,0x1b0c,0x1ad7,0x1b14,0x1b1c,0x1af6,0x1b24,0x1b2c,0x1b33,0x1b3b,0x1adf,0x1af6,0x1b40,
+0x1ae7,0x1aee,0x1b48,0x1b4e,0x1be2,0x1be9,0x1bda,0x1b56,0x1b5e,0x1b66,0x1b6e,0x1c51,0x1b76,0x1b7e,0xe79,0xe81,
+0x1ac7,0x1ac7,0x1ac7,0xe89,0x1c09,0x1c09,0xf61,0xf69,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,
+0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a6a,0x1a68,0x1a72,0x1a68,0x1a68,0x1a68,
+0x1a68,0x1a68,0x1a68,0x1a75,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0xdde,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cb9,
+0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cbe,0x1cb9,0x1cb9,0x1cb9,0x1083,0x1085,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,
+0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,
+0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,
+0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,
+0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x114d,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,
+0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,
+0x1d46,0x1155,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1acf,0x1d6e,0x1d6e,0x1d6e,0x1d6e,0x1d6e,
+0x1d6e,0x1d6e,0x115d,0x1165,0x1223,0x122a,0x1d86,0x1d86,0x1d86,0x1d86,0x1d86,0x1d86,0x1d86,0x1d86,0x1d86,0x1d86,
+0x1d86,0x1181,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,
+0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,
+0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,
+0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,
+0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,
+0x1287,0x1250,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,
+0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,
+0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1258,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,
+0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,
+0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,
+0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,
+0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1780,0x1780,0x1780,0x1780,0x1780,0x1780,
+0x1780,0x1780,0x1780,0x1780,0x1780,0x1780,0x1780,0x1780,0x1780,0x1780,0x128f,0x1250,0x1250,0x1250,0x1250,0x1250,
+0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,
+0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,
+0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x125c,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,
+0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,
+0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,
+0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,
+0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x125c,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,
+0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,
+0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,
+0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,
+0x1a9d,0x1a9d,0x1a9d,0x1297,0x1b86,0x1b86,0x1b86,0x1b86,0x1b86,0x1b86,0x129f,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,
+0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,
+0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,
+0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,
+0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x12a7,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,
+0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,
+0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,
+0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,
+0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,
+0x161b,0x161b,0x161b,0x161b,0x160b,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,
+0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,
+0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,
+0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,
+0x1623,0x1623,0x1623,0x1623,0x1613,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,
+0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,
+0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,
+0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,
+0x161b,0x161b,0x161b,0x161b,0x161b,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,
+0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,
+0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,
+0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,
+0x1623,0x1623,0x1623,0x1623,0x1623,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,
+0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,
+0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,
+0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,
+0x1778,0x1778,0x1778,0x1778,0x1778,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,
+0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,
+0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,
+0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,
+0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,
+0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,
+0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,
+0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,
+0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,
+0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,
+0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,
+0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,
+0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,
+0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,
+0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,
+0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,
+0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x4d5,0x4d5,0x4d5,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,
+0x2bb,0x2be,0x2c7,0x2c1,0x2c1,0x2c4,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,
+0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x7ef,0x7e9,0x7ce,0x7c5,0x7bc,0x7b9,0x7b0,0x7cb,
+0x7b6,0x7c2,0x7c5,0x7e0,0x7d7,0x7c8,0x7ec,0x7bf,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,
+0x7ad,0x7ad,0x7d4,0x7d1,0x7da,0x7da,0x7da,0x7e9,0x7b0,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7f5,
+0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,
+0x7f5,0x7f5,0x7f5,0x7b6,0x7bc,0x7c2,0x7e6,0x7aa,0x7e3,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f2,
+0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,
+0x7f2,0x7f2,0x7f2,0x7b6,0x7dd,0x7b3,0x7da,0x2bb,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x2af,0x2af,0x2af,0x2af,0x2af,0x2be,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,
-0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,
-0x2af,0x2af,0x2af,0x2af,0x2b2,0x62a,0x7e9,0x7ec,0x630,0x7ec,0x7e6,0x627,0x61e,0x2b8,0x63c,0x2bb,
-0x7ef,0x615,0x633,0x7e3,0x62d,0x639,0x61b,0x61b,0x621,0x2b5,0x627,0x624,0x61e,0x61b,0x63c,0x2bb,
-0x618,0x618,0x618,0x62a,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x645,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,
-0x2c4,0x2c4,0x2c4,0x2c4,0x645,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x636,0x645,0x2c4,0x2c4,0x2c4,
-0x2c4,0x2c4,0x645,0x63f,0x642,0x642,0x2c1,0x2c1,0x2c1,0x2c1,0x63f,0x2c1,0x642,0x642,0x642,0x2c1,
-0x642,0x642,0x2c1,0x2c1,0x63f,0x2c1,0x642,0x642,0x2c1,0x2c1,0x2c1,0x636,0x63f,0x642,0x642,0x2c1,
-0x642,0x2c1,0x63f,0x2c1,0x2d0,0x64b,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,
-0x2d0,0x2c7,0x2d0,0x2c7,0x2cd,0x648,0x2d0,0x64b,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x64b,
-0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x651,0x648,0x2d0,0x2c7,0x2d0,0x64b,
-0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x648,0x654,0x64e,0x2d0,0x2c7,0x2d0,0x2c7,0x648,0x2d0,0x2c7,0x2d0,
-0x2c7,0x2d0,0x2c7,0x654,0x64e,0x651,0x648,0x2d0,0x64b,0x2d0,0x2c7,0x2d0,0x64b,0x657,0x651,0x648,
-0x2d0,0x64b,0x2d0,0x2c7,0x2d0,0x2c7,0x651,0x648,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,
-0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x651,0x648,0x2d0,0x2c7,0x2d0,0x64b,
-0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2d0,0x2c7,0x2d0,
-0x2c7,0x2d0,0x2c7,0x2ca,0x2d3,0x2df,0x2df,0x2d3,0x2df,0x2d3,0x2df,0x2df,0x2d3,0x2df,0x2df,0x2df,
-0x2d3,0x2d3,0x2df,0x2df,0x2df,0x2df,0x2d3,0x2df,0x2df,0x2d3,0x2df,0x2df,0x2df,0x2d3,0x2d3,0x2d3,
-0x2df,0x2df,0x2d3,0x2df,0x2e2,0x2d6,0x2df,0x2d3,0x2df,0x2d3,0x2df,0x2df,0x2d3,0x2df,0x2d3,0x2d3,
-0x2df,0x2d3,0x2df,0x2e2,0x2d6,0x2df,0x2df,0x2df,0x2d3,0x2df,0x2d3,0x2df,0x2df,0x2d3,0x2d3,0x2dc,
-0x2df,0x2d3,0x2d3,0x2d3,0x2dc,0x2dc,0x2dc,0x2dc,0x2e5,0x2e5,0x2d9,0x2e5,0x2e5,0x2d9,0x2e5,0x2e5,
-0x2d9,0x2e2,0x65a,0x2e2,0x65a,0x2e2,0x65a,0x2e2,0x65a,0x2e2,0x65a,0x2e2,0x65a,0x2e2,0x65a,0x2e2,
-0x65a,0x2d3,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2df,0x2d3,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,
-0x2e2,0x2d6,0x2e2,0x2d6,0x2d6,0x2e5,0x2e5,0x2d9,0x2e2,0x2d6,0x9c3,0x9c3,0x9c6,0x9c0,0x2e2,0x2d6,
-0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,
-0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x9c6,0x9c0,0x9c6,0x9c0,0x9c3,0x9bd,0x9c6,0x9c0,
-0xb88,0xc90,0x9c3,0x9bd,0x9c3,0x9bd,0x9c6,0x9c0,0x9c6,0x9c0,0x9c6,0x9c0,0x9c6,0x9c0,0x9c6,0x9c0,
-0x9c6,0x9c0,0x9c6,0x9c0,0xc90,0xc90,0xc90,0xd8f,0xd8f,0xd8f,0xd92,0xd92,0xd8f,0xd92,0xd92,0xd8f,
-0xd8f,0xd92,0xed3,0xed6,0xed6,0xed6,0xed6,0xed3,0xed6,0xed3,0xed6,0xed3,0xed6,0xed3,0xed6,0xed3,
-0x2e8,0x65d,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,
-0x2e8,0x65d,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,
-0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,
-0x2eb,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,
-0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0xc93,0xc93,0x303,0x303,0x303,0x303,
-0x303,0x303,0x303,0x303,0x303,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f7,0x2f7,0x2f4,0x2f4,
-0x663,0x2f4,0x2fa,0x666,0x2fd,0x666,0x666,0x666,0x2fd,0x666,0x2fa,0x2fa,0x669,0x300,0x2f4,0x2f4,
-0x2f4,0x2f4,0x2f4,0x2f4,0x660,0x660,0x660,0x660,0x2f1,0x660,0x2f4,0xb01,0x303,0x303,0x303,0x303,
-0x303,0x2ee,0x2ee,0x2ee,0x2ee,0x2ee,0x9d2,0x9d2,0x9cf,0x9cc,0x9cf,0xc96,0xc96,0xc96,0xc96,0xc96,
-0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0x66c,0x66c,0x66c,0x66c,
-0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,
-0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,
-0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,
-0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66f,0x66f,0x927,0x66f,
-0x66f,0x92a,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xc45,0xd5c,0xd5c,0xd5c,0xd5c,
-0xd5c,0xd5c,0xd5c,0xd5c,0xe9a,0xe9a,0xe9a,0xe9a,0xe9d,0xd5f,0xd5f,0xd5f,0x672,0x672,0xb07,0xc8d,
-0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xf81,0xf7e,0xf81,0xf7e,
-0x30f,0x318,0xf81,0xf7e,9,9,0x31e,0xed9,0xed9,0xed9,0x306,0x14d6,9,9,9,9,
-0x31b,0x309,0x32d,0x30c,0x32d,0x32d,0x32d,9,0x32d,9,0x32d,0x32d,0x324,0x678,0x678,0x678,
-0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,9,0x678,
-0x678,0x678,0x678,0x678,0x678,0x678,0x32d,0x32d,0x324,0x324,0x324,0x324,0x324,0x675,0x675,0x675,
-0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x321,0x675,
-0x675,0x675,0x675,0x675,0x675,0x675,0x324,0x324,0x324,0x324,0x324,0xf81,0x330,0x330,0x333,0x32d,
-0x32d,0x330,0x327,0x9d5,0xb91,0xb8e,0x32a,0x9d5,0x32a,0x9d5,0x32a,0x9d5,0x32a,0x9d5,0x315,0x312,
-0x315,0x312,0x315,0x312,0x315,0x312,0x315,0x312,0x315,0x312,0x315,0x312,0x330,0x330,0x327,0x321,
-0xb40,0xb3d,0xb8b,0xc9c,0xc99,0xc9f,0xc9c,0xc99,0xd95,0xd98,0xd98,0xd98,0x9e4,0x684,0x33f,0x342,
-0x33f,0x33f,0x33f,0x342,0x33f,0x33f,0x33f,0x33f,0x342,0x9e4,0x342,0x33f,0x681,0x681,0x681,0x681,
-0x681,0x681,0x681,0x681,0x681,0x684,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,
-0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x67b,0x67b,0x67b,0x67b,
-0x67b,0x67b,0x67b,0x67b,0x67b,0x67e,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,
-0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x9de,0x67e,0x339,0x33c,0x339,0x339,0x339,0x33c,
-0x339,0x339,0x339,0x339,0x33c,0x9de,0x33c,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,
-0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x342,0x33c,
-0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x336,0x933,0x936,0x918,0x918,0x112b,
-0x9d8,0x9d8,0xb97,0xb94,0x9e1,0x9db,0x9e1,0x9db,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,
-0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,
-0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,
-0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x342,0x33c,0x33f,0x339,0xb97,0xb94,0x33f,
-0x339,0xb97,0xb94,0x33f,0x339,0xb97,0xb94,0xedc,0x342,0x33c,0x342,0x33c,0x33f,0x339,0x342,0x33c,
-0x33f,0x339,0x342,0x33c,0x342,0x33c,0x342,0x33c,0x33f,0x339,0x342,0x33c,0x342,0x33c,0x342,0x33c,
-0x33f,0x339,0x342,0x33c,0x9e4,0x9de,0x342,0x33c,0x342,0x33c,0x342,0x33c,0x342,0x33c,0xd9e,0xd9b,
-0x342,0x33c,0xedf,0xedc,0xedf,0xedc,0xedf,0xedc,0xc06,0xc03,0xc06,0xc03,0xc06,0xc03,0xc06,0xc03,
-0xc06,0xc03,0xc06,0xc03,0xc06,0xc03,0xc06,0xc03,0xf0c,0xf09,0xf0c,0xf09,0xfff,0xffc,0xfff,0xffc,
-0xfff,0xffc,0xfff,0xffc,0xfff,0xffc,0xfff,0xffc,0xfff,0xffc,0xfff,0xffc,0x1164,0x1161,0x134a,0x1347,
-0x150f,0x150c,0x150f,0x150c,0x150f,0x150c,0x150f,0x150c,0xc,0x354,0x354,0x354,0x354,0x354,0x354,0x354,
-0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,
-0x354,0x354,0x354,0xc,0xc,0x357,0x345,0x348,0x348,0x34b,0x348,0x345,0x1917,0x34e,0x34e,0x34e,
-0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,
-0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x351,
-0x1917,0x89d,0x9e7,0xc,0xc,0x14d9,0x14d9,0x13f5,0xf,0x957,0x957,0x957,0x957,0x957,0x957,0x957,
-0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0xda1,0x957,0x957,0x957,0x957,0x957,
-0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,
-0x35a,0x35a,0xee2,0x35a,0x35a,0x35a,0x366,0x35a,0x35d,0x35a,0x35a,0x369,0x95a,0xda4,0xda7,0xda4,
-0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,
-0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,
-0x36c,0x36c,0x36c,0xf,0xf,0xf,0xf,0x191a,0x36c,0x36c,0x36c,0x363,0x360,0xf,0xf,0xf,
-0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xcb4,0xcb4,0xcb4,0xcb4,0x13f8,0x14dc,0xf8a,0xf8a,
-0xf8a,0xf87,0xf87,0xdad,0x8a3,0xcae,0xcab,0xcab,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xf84,0xf84,
-0xf84,0xf84,0xf84,0x8a0,0x14d3,0x12,0xdb0,0x8a6,0x1311,0x387,0x38a,0x38a,0x38a,0x38a,0x38a,0x387,
-0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,
-0x387,0x387,0x387,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0x8a9,0x387,0x387,0x387,0x387,0x387,0x387,0x387,
-0x387,0x387,0x387,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0xb37,0xb37,0xb37,0xca2,0xca8,
-0xca5,0xdaa,0xdaa,0xdaa,0xdaa,0xdaa,0xdaa,0x130e,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,
-0x939,0x939,0x381,0x37e,0x37b,0x378,0xb9a,0xb9a,0x91b,0x387,0x387,0x393,0x387,0x38d,0x38d,0x38d,
-0x38d,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,
-0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,
+0,0,0,0,0,0,0,0,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2d9,0x2ca,0x2ca,
+0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,
+0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2cd,0x645,0x804,0x807,0x64b,0x807,0x801,0x642,
+0x639,0x2d3,0x657,0x2d6,0x80a,0x630,0x64e,0x7fe,0x648,0x654,0x636,0x636,0x63c,0x2d0,0x642,0x63f,
+0x639,0x636,0x657,0x2d6,0x633,0x633,0x633,0x645,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x660,0x2df,
+0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x660,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x651,
+0x660,0x2df,0x2df,0x2df,0x2df,0x2df,0x660,0x65a,0x65d,0x65d,0x2dc,0x2dc,0x2dc,0x2dc,0x65a,0x2dc,
+0x65d,0x65d,0x65d,0x2dc,0x65d,0x65d,0x2dc,0x2dc,0x65a,0x2dc,0x65d,0x65d,0x2dc,0x2dc,0x2dc,0x651,
+0x65a,0x65d,0x65d,0x2dc,0x65d,0x2dc,0x65a,0x2dc,0x2eb,0x666,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,
+0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2e8,0x663,0x2eb,0x666,0x2eb,0x2e2,0x2eb,0x2e2,
+0x2eb,0x2e2,0x2eb,0x666,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x66c,0x663,
+0x2eb,0x2e2,0x2eb,0x666,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x663,0x66f,0x669,0x2eb,0x2e2,0x2eb,0x2e2,
+0x663,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x66f,0x669,0x66c,0x663,0x2eb,0x666,0x2eb,0x2e2,0x2eb,
+0x666,0x672,0x66c,0x663,0x2eb,0x666,0x2eb,0x2e2,0x2eb,0x2e2,0x66c,0x663,0x2eb,0x2e2,0x2eb,0x2e2,
+0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x66c,0x663,
+0x2eb,0x2e2,0x2eb,0x666,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,
+0x2eb,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2e5,0x2ee,0x2fa,0x2fa,0x2ee,0x2fa,0x2ee,0x2fa,0x2fa,
+0x2ee,0x2fa,0x2fa,0x2fa,0x2ee,0x2ee,0x2fa,0x2fa,0x2fa,0x2fa,0x2ee,0x2fa,0x2fa,0x2ee,0x2fa,0x2fa,
+0x2fa,0x2ee,0x2ee,0x2ee,0x2fa,0x2fa,0x2ee,0x2fa,0x2fd,0x2f1,0x2fa,0x2ee,0x2fa,0x2ee,0x2fa,0x2fa,
+0x2ee,0x2fa,0x2ee,0x2ee,0x2fa,0x2ee,0x2fa,0x2fd,0x2f1,0x2fa,0x2fa,0x2fa,0x2ee,0x2fa,0x2ee,0x2fa,
+0x2fa,0x2ee,0x2ee,0x2f7,0x2fa,0x2ee,0x2ee,0x2ee,0x2f7,0x2f7,0x2f7,0x2f7,0x300,0x300,0x2f4,0x300,
+0x300,0x2f4,0x300,0x300,0x2f4,0x2fd,0x675,0x2fd,0x675,0x2fd,0x675,0x2fd,0x675,0x2fd,0x675,0x2fd,
+0x675,0x2fd,0x675,0x2fd,0x675,0x2ee,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fa,0x2ee,0x2fd,0x2f1,
+0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2f1,0x300,0x300,0x2f4,0x2fd,0x2f1,0x9e1,0x9e1,
+0x9e4,0x9de,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,
+0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x9e4,0x9de,0x9e4,0x9de,
+0x9e1,0x9db,0x9e4,0x9de,0xba6,0xcae,0x9e1,0x9db,0x9e1,0x9db,0x9e4,0x9de,0x9e4,0x9de,0x9e4,0x9de,
+0x9e4,0x9de,0x9e4,0x9de,0x9e4,0x9de,0x9e4,0x9de,0xcae,0xcae,0xcae,0xdad,0xdad,0xdad,0xdb0,0xdb0,
+0xdad,0xdb0,0xdb0,0xdad,0xdad,0xdb0,0xeee,0xef1,0xef1,0xef1,0xef1,0xeee,0xef1,0xeee,0xef1,0xeee,
+0xef1,0xeee,0xef1,0xeee,0x303,0x678,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,
+0x303,0x303,0x303,0x303,0x303,0x678,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,
+0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,
+0x303,0x303,0x303,0x303,0x306,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,
+0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0xcb1,0xcb1,
+0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x315,0x315,0x315,0x315,0x315,0x315,0x315,
+0x312,0x312,0x30f,0x30f,0x67e,0x30f,0x315,0x681,0x318,0x681,0x681,0x681,0x318,0x681,0x315,0x315,
+0x684,0x31b,0x30f,0x30f,0x30f,0x30f,0x30f,0x30f,0x67b,0x67b,0x67b,0x67b,0x30c,0x67b,0x30f,0xb1c,
+0x31e,0x31e,0x31e,0x31e,0x31e,0x309,0x309,0x309,0x309,0x309,0x9f0,0x9f0,0x9ed,0x9ea,0x9ed,0xcb4,
+0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,
+0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,
+0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,
+0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,
+0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,
+0x68a,0x68a,0x942,0x68a,0x68a,0x945,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xc63,
+0xd7a,0xd7a,0xd7a,0xd7a,0xd7a,0xd7a,0xd7a,0xd7a,0xeb5,0xeb5,0xeb5,0xeb5,0xeb8,0xd7d,0xd7d,0xd7d,
+0x68d,0x68d,0xb22,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,
+0xf9c,0xf99,0xf9c,0xf99,0x32a,0x333,0xf9c,0xf99,9,9,0x339,0xef4,0xef4,0xef4,0x321,0x14f1,
+9,9,9,9,0x336,0x324,0x348,0x327,0x348,0x348,0x348,9,0x348,9,0x348,0x348,
+0x33f,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,
+0x693,0x693,9,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x348,0x348,0x33f,0x33f,0x33f,0x33f,
+0x33f,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,
+0x690,0x690,0x33c,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x33f,0x33f,0x33f,0x33f,0x33f,0xf9c,
+0x34b,0x34b,0x34e,0x348,0x348,0x34b,0x342,0x9f3,0xbaf,0xbac,0x345,0x9f3,0x345,0x9f3,0x345,0x9f3,
+0x345,0x9f3,0x330,0x32d,0x330,0x32d,0x330,0x32d,0x330,0x32d,0x330,0x32d,0x330,0x32d,0x330,0x32d,
+0x34b,0x34b,0x342,0x33c,0xb5e,0xb5b,0xba9,0xcba,0xcb7,0xcbd,0xcba,0xcb7,0xdb3,0xdb6,0xdb6,0xdb6,
+0xa02,0x69f,0x35a,0x35d,0x35a,0x35a,0x35a,0x35d,0x35a,0x35a,0x35a,0x35a,0x35d,0xa02,0x35d,0x35a,
+0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69f,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,
+0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,
+0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x699,0x696,0x696,0x696,0x696,0x696,0x696,
+0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x9fc,0x699,0x354,0x357,
+0x354,0x354,0x354,0x357,0x354,0x354,0x354,0x354,0x357,0x9fc,0x357,0x354,0x35a,0x354,0x35a,0x354,
+0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,
+0x35a,0x354,0x35d,0x357,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x351,0x94e,
+0x951,0x933,0x933,0x1143,0x9f6,0x9f6,0xbb5,0xbb2,0x9ff,0x9f9,0x9ff,0x9f9,0x35a,0x354,0x35a,0x354,
+0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,
+0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,
+0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x35d,0x357,0x35a,
+0x354,0xbb5,0xbb2,0x35a,0x354,0xbb5,0xbb2,0x35a,0x354,0xbb5,0xbb2,0xef7,0x35d,0x357,0x35d,0x357,
+0x35a,0x354,0x35d,0x357,0x35a,0x354,0x35d,0x357,0x35d,0x357,0x35d,0x357,0x35a,0x354,0x35d,0x357,
+0x35d,0x357,0x35d,0x357,0x35a,0x354,0x35d,0x357,0xa02,0x9fc,0x35d,0x357,0x35d,0x357,0x35d,0x357,
+0x35d,0x357,0xdbc,0xdb9,0x35d,0x357,0xefa,0xef7,0xefa,0xef7,0xefa,0xef7,0xc24,0xc21,0xc24,0xc21,
+0xc24,0xc21,0xc24,0xc21,0xc24,0xc21,0xc24,0xc21,0xc24,0xc21,0xc24,0xc21,0xf27,0xf24,0xf27,0xf24,
+0x1017,0x1014,0x1017,0x1014,0x1017,0x1014,0x1017,0x1014,0x1017,0x1014,0x1017,0x1014,0x1017,0x1014,0x1017,0x1014,
+0x117c,0x1179,0x1365,0x1362,0x152a,0x1527,0x152a,0x1527,0x152a,0x1527,0x152a,0x1527,0xc,0x36f,0x36f,0x36f,
+0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,
+0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0xc,0xc,0x372,0x360,0x363,0x363,0x366,0x363,0x360,
+0x1932,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,
+0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,
+0x369,0x369,0x369,0x36c,0x1932,0x8b8,0xa05,0xc,0xc,0x14f4,0x14f4,0x1410,0xf,0x975,0x975,0x975,
+0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0xdbf,0x975,
+0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x375,0x375,0x375,0x375,
+0x375,0x375,0x375,0x375,0x375,0x375,0xefd,0x375,0x375,0x375,0x381,0x375,0x378,0x375,0x375,0x384,
+0x978,0xdc2,0xdc5,0xdc2,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0x387,0x387,0x387,0x387,
0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,
-0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x9ed,0x9ed,0x387,0x387,
-0x387,0x387,0x387,0x9ed,0x38a,0x387,0x38a,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,
-0x387,0x387,0x387,0x9ed,0x387,0x387,0x387,0x38a,0x93c,0x387,0x372,0x372,0x372,0x372,0x372,0x372,
-0x372,0x36f,0x378,0x375,0x375,0x372,0x372,0x372,0x372,0x390,0x390,0x372,0x372,0x378,0x375,0x375,
-0x375,0x372,0xcb1,0xcb1,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x9ed,0x9ed,
-0x9ed,0x9ea,0x9ea,0xcb1,0xa02,0xa02,0xa02,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9f9,
-0x9fc,0x9f9,0x15,0xa05,0x9ff,0x9f0,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,
-0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,
-0x9ff,0xcb7,0xcb7,0xcb7,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,
-0x9f6,0x9f6,0x9f6,0x9f6,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x15,
-0x15,0xcb7,0xcb7,0xcb7,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,
-0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,
-0xe10,0xe10,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,
-0x1011,0x1011,0x1011,0x1011,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,
-0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,
-0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,
-0xa08,0xa08,0xa08,0xa08,0xa08,0xb9d,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
-0x18,0x18,0x18,0x18,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf27,0xf27,
-0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,
-0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf1b,
-0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf2a,0xf2a,0xf1e,0xf1e,0xf21,0xf30,0xf2d,0x10e,
-0x10e,0x193e,0x1941,0x1941,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x25b,
-0x25b,0x25b,0x25b,0x25b,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0xb13,0xb13,0xb16,0xb16,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,
-0x72,0x72,0x72,0x72,0x1593,0x1593,0x1593,0x1593,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,
-0x1c2,0x1c2,0x1c2,0x1590,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x164d,0x164d,0x164d,0x164d,0x164d,
-0x164d,0x164d,0x164d,0x164d,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x1686,0x1686,0x1686,
-0x1686,0x1686,0x1686,0x1686,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x177,0x177,0x177,
-0x177,0x177,0x177,0x177,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,
-0x27f,0x27f,0x27f,0x27f,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,
-0x1d7,0x1d7,0x1d7,0x1d7,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x1bc,0x1bc,
-0x1bc,0x1bc,0x1bc,0x1bc,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,
-0x264,0x264,0x264,0x264,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x18c0,0x18c3,0x18c3,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,
-0x258,0x258,0x258,0x258,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x26a,0x26a,
-0x26a,0x26a,0x26a,0x26a,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x1782,0x1782,0x1782,0x1782,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,
-0x21c,0x21c,0x21c,0x21c,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,
-0x127b,0x127b,0x127b,0x180,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1ef,0x1ef,
-0x1ef,0x1ef,0x163e,0x163e,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,
-0x158a,0x158a,0x158a,0x158a,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,
-0x1674,0x1674,0x1674,0x1674,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,
-0x24f,0x24f,0x24f,0x24f,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,
-0x1911,0x1911,0x1911,0x1911,0x16ec,0x16ec,0x16ec,0x16ec,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,
-0x204,0x204,0x204,0x204,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0xe07,0xe07,0xe04,0xe04,0xe04,0xe07,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,
-0xdb,0xdb,0xdb,0xdb,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x22b,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,
-0x179a,0x179a,0x179a,0x179a,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x181b,0x181b,0x237,0x181b,0x181b,0x237,0x181b,0x181b,0x181b,0x181b,0x181b,0x237,
-0x237,0x237,0x237,0x237,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x270,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,
-0x19a1,0x19a1,0x19a1,0x19a1,0,0,0,0,0,0,0,0,0,0,0,0,
+0x387,0x387,0x387,0x387,0x387,0x387,0x387,0xf,0xf,0xf,0xf,0x1935,0x387,0x387,0x387,0x37e,
+0x37b,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xcd2,0xcd2,0xcd2,0xcd2,
+0x1413,0x14f7,0xfa5,0xfa5,0xfa5,0xfa2,0xfa2,0xdcb,0x8be,0xccc,0xcc9,0xcc9,0xcc0,0xcc0,0xcc0,0xcc0,
+0xcc0,0xcc0,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0x8bb,0x14ee,0x12,0xdce,0x8c1,0x132c,0x3a2,0x3a5,0x3a5,
+0x3a5,0x3a5,0x3a5,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,
+0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0xfa8,0xfa8,0xfa8,0xfa8,0xfa8,0x8c4,0x3a2,0x3a2,0x3a2,
+0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0xb55,
+0xb55,0xb55,0xcc0,0xcc6,0xcc3,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0x1329,0x954,0x954,0x954,0x954,
+0x954,0x954,0x954,0x954,0x954,0x954,0x39c,0x399,0x396,0x393,0xbb8,0xbb8,0x936,0x3a2,0x3a2,0x3ae,
+0x3a2,0x3a8,0x3a8,0x3a8,0x3a8,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,
+0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,
+0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,
+0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,
+0xa0b,0xa0b,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0xa0b,0x3a5,0x3a2,0x3a5,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,
+0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0xa0b,0x3a2,0x3a2,0x3a2,0x3a5,0x957,0x3a2,0x38d,0x38d,
+0x38d,0x38d,0x38d,0x38d,0x38d,0x38a,0x393,0x390,0x390,0x38d,0x38d,0x38d,0x38d,0x3ab,0x3ab,0x38d,
+0x38d,0x393,0x390,0x390,0x390,0x38d,0xccf,0xccf,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,
+0x39f,0x39f,0xa0b,0xa0b,0xa0b,0xa08,0xa08,0xccf,0xa20,0xa20,0xa20,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,
+0xa1a,0xa1a,0xa1a,0xa17,0xa1a,0xa17,0x15,0xa23,0xa1d,0xa0e,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,
+0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,
+0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xcd5,0xcd5,0xcd5,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,
+0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,
+0xa11,0xa11,0xa11,0x15,0x15,0xcd5,0xcd5,0xcd5,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,
+0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,
+0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,
+0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,
+0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,
+0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa26,0xa26,
+0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xbbb,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,
+0xf3f,0xf3f,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,
+0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,
+0xf42,0xf42,0xf42,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf45,0xf45,0xf39,0xf39,
+0xf3c,0xf4b,0xf48,0x10e,0x10e,0x1959,0x195c,0x195c,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,
+0x18ed,0x18ed,0x18ed,0x25b,0x25b,0x25b,0x25b,0x25b,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xb2e,0xb2e,0xb31,0xb31,0xb2e,0xb2e,0xb2e,0xb2e,
+0xb2e,0xb2e,0xb2e,0xb2e,0x72,0x72,0x72,0x72,0x15ae,0x15ae,0x15ae,0x15ae,0x1c2,0x1c2,0x1c2,0x1c2,
+0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x15ab,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1668,
+0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,
+0x201,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,
+0x126f,0x177,0x177,0x177,0x177,0x177,0x177,0x177,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,
+0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,
+0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x14ca,0x14ca,0x14ca,0x14ca,0x14ca,0x14ca,0x14ca,0x14ca,
+0x14ca,0x14ca,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,
+0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x18db,0x18de,0x18de,0x258,0x258,0x258,0x258,0x258,
+0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,
+0x19a7,0x19a7,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x179d,0x179d,0x179d,0x179d,0x21c,0x21c,0x21c,0x21c,
+0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,
+0x1653,0x1653,0x1ef,0x1ef,0x1ef,0x1ef,0x1659,0x1659,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,
+0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,
+0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x1707,0x1707,0x1707,0x1707,0x204,0x204,0x204,0x204,
+0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xe25,0xe25,0xe22,0xe22,0xe22,0xe25,0xdb,0xdb,
+0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x22b,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,
+0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x1836,0x1836,0x237,0x1836,0x1836,0x237,0x1836,0x1836,
+0x1836,0x1836,0x1836,0x237,0x237,0x237,0x237,0x237,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,
+0x1a5e,0x1a5e,0x28b,0x28b,0x28b,0x28b,0x1a61,0x1a5b,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x270,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,
+0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,
+0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0x954,0x954,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,
-0x196e,0x196e,0x261,0x261,3,3,3,3,3,3,3,3,3,3,3,3,
+0,0,0,0,0,0,0x972,0x972,3,3,3,3,3,3,3,3,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
-3,3,3,3,3,3,0x954,0x954,6,6,6,6,6,6,6,6,
+3,3,3,3,3,3,3,3,3,3,0x972,0x972,6,6,6,6,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
-6,6,6,6,6,6,6,6,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,
-0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,6,6,6,6,6,6,6,6,
-6,6,6,6,6,6,6,6,0x14e2,0x3ab,0x3ba,0x3ba,0x1b,0x3c0,0x3c0,0x3c0,
-0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x1b,0x1b,0x3c0,0x3c0,0x1b,0x1b,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,
-0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x1b,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,
-0x3c0,0x1b,0x3c0,0x1b,0x1b,0x1b,0x3c0,0x3c0,0x3c0,0x3c0,0x1b,0x1b,0x3ae,0xcbd,0x3ab,0x3ba,
-0x3ba,0x3ab,0x3ab,0x3ab,0x3ab,0x1b,0x1b,0x3ba,0x3ba,0x1b,0x1b,0x3bd,0x3bd,0x3b1,0xdb6,0x1b,
-0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x3ab,0x1b,0x1b,0x1b,0x1b,0x3c3,0x3c3,0x1b,0x3c3,
-0x3c0,0x3c0,0x3ab,0x3ab,0x1b,0x1b,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,
-0x3c0,0x3c0,0x3b7,0x3b7,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b7,0x3b4,0x113a,0x187b,0x1878,0x191d,0x1b,
-0x1e,0xcc0,0x3c6,0xcc3,0x1e,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x1e,0x1e,0x1e,0x1e,0x3d2,
-0x3d2,0x1e,0x1e,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,
-0x3d2,0x1e,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x1e,0x3d2,0x3d5,0x1e,0x3d2,0x3d5,0x1e,
-0x3d2,0x3d2,0x1e,0x1e,0x3c9,0x1e,0x3cf,0x3cf,0x3cf,0x3c6,0x3c6,0x1e,0x1e,0x1e,0x1e,0x3c6,
-0x3c6,0x1e,0x1e,0x3c6,0x3c6,0x3cc,0x1e,0x1e,0x1e,0xf96,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,
-0x1e,0x3d5,0x3d5,0x3d5,0x3d2,0x1e,0x3d5,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x945,0x945,
-0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x3c6,0x3c6,0x3d2,0x3d2,0x3d2,0xf96,0x1920,0x1e,
-0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x21,0x3d8,0x3d8,0x3e1,0x21,0x3e4,0x3e4,0x3e4,
-0x3e4,0x3e4,0x3e4,0x3e4,0xccc,0x3e4,0x21,0x3e4,0x3e4,0x3e4,0x21,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,
-0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x21,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,
-0x3e4,0x21,0x3e4,0x3e4,0x21,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x21,0x21,0x3db,0x3e4,0x3e1,0x3e1,
-0x3e1,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x21,0x3d8,0x3d8,0x3e1,0x21,0x3e1,0x3e1,0x3de,0x21,0x21,
-0x3e4,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,
-0x3e4,0xccc,0xcc6,0xcc6,0x21,0x21,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,
-0x13fb,0xcc9,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x16fe,0x187e,0x187e,0x187e,0x1881,0x1881,0x1881,
-0x24,0x3e7,0x3f6,0x3f6,0x24,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x24,0x24,0x3fc,
-0x3fc,0x24,0x24,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,
-0x3fc,0x24,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x24,0x3fc,0x3fc,0x24,0xccf,0x3fc,0x3fc,
-0x3fc,0x3fc,0x24,0x24,0x3ea,0x3fc,0x3e7,0x3e7,0x3f6,0x3e7,0x3e7,0x3e7,0xf99,0x24,0x24,0x3f6,
-0x3f9,0x24,0x24,0x3f9,0x3f9,0x3ed,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x3e7,0x3e7,
-0x24,0x24,0x24,0x24,0x3ff,0x3ff,0x24,0x3fc,0x3fc,0x3fc,0xf99,0xf99,0x24,0x24,0x3f3,0x3f3,
-0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f0,0xccf,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,
-0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x27,0x27,0x402,0x40e,0x27,0x40e,0x40e,0x40e,
-0x40e,0x40e,0x40e,0x27,0x27,0x27,0x40e,0x40e,0x40e,0x27,0x40e,0x40e,0x411,0x40e,0x27,0x27,
-0x27,0x40e,0x40e,0x27,0x40e,0x27,0x40e,0x40e,0x27,0x27,0x27,0x40e,0x40e,0x27,0x27,0x27,
-0x40e,0x40e,0x40e,0x27,0x27,0x27,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0xdb9,0x40e,
-0x40e,0x40e,0x27,0x27,0x27,0x27,0x402,0x408,0x402,0x408,0x408,0x27,0x27,0x27,0x408,0x408,
-0x408,0x27,0x40b,0x40b,0x40b,0x405,0x27,0x27,0xf9c,0x27,0x27,0x27,0x27,0x27,0x27,0x402,
-0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0xed0,0x94e,0x94e,0x94e,0x94e,0x94e,
-0x94e,0x94e,0x94e,0x94e,0x94b,0x94b,0x94b,0xd89,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd5,0xcd2,0x27,
-0x27,0x27,0x27,0x27,0x14e5,0x420,0x420,0x420,0x1923,0x423,0x423,0x423,0x423,0x423,0x423,0x423,
-0x423,0x2a,0x423,0x423,0x423,0x2a,0x423,0x423,0x423,0x423,0x423,0x423,0x423,0x423,0x423,0x423,
-0x423,0x423,0x423,0x423,0x423,0x2a,0x423,0x423,0x423,0x423,0x423,0x423,0x423,0x423,0x423,0x423,
-0x14e8,0x423,0x423,0x423,0x423,0x423,0x2a,0x2a,0x2a,0xfa5,0x414,0x414,0x414,0x420,0x420,0x420,
-0x420,0x2a,0x414,0x414,0x417,0x2a,0x414,0x414,0x414,0x41a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x414,0x414,0x2a,0xfa5,0xfa5,0x1701,0x2a,0x2a,0x2a,0x2a,0x2a,0x423,0x423,0xf9f,0xf9f,
-0x2a,0x2a,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0x17be,0x14eb,0x42f,0x42f,
-0x1926,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x2d,0x435,0x435,0x435,0x2d,0x435,0x435,
-0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x2d,0x435,0x435,
-0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x2d,0x435,0x435,0x435,0x435,0x435,0x2d,0x2d,
-0xcd8,0xcdb,0x42f,0x426,0x432,0x42f,0x426,0x42f,0x42f,0x2d,0x426,0x432,0x432,0x2d,0x432,0x432,
-0x426,0x429,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x426,0x426,0x2d,0x2d,0x2d,0x2d,0x2d,
-0x2d,0x2d,0x435,0x2d,0x435,0x435,0xee8,0xee8,0x2d,0x2d,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,
-0x42c,0x42c,0x42c,0x42c,0x2d,0xeeb,0xeeb,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,
-0x2d,0x2d,0x2d,0x2d,0x1884,0x14ee,0x441,0x441,0x30,0x447,0x447,0x447,0x447,0x447,0x447,0x447,
-0x447,0x30,0x447,0x447,0x447,0x30,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,
-0x447,0x447,0x447,0x447,0x441,0x438,0x438,0x438,0xfa8,0x30,0x441,0x441,0x441,0x30,0x444,0x444,
-0x444,0x43b,0x1323,0x17c1,0x30,0x30,0x30,0x30,0x17c4,0x17c4,0x17c4,0x438,0x17c1,0x17c1,0x17c1,0x17c1,
-0x17c1,0x17c1,0x17c1,0x1704,0x447,0x447,0xfa8,0xfa8,0x30,0x30,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,
-0x43e,0x43e,0x43e,0x43e,0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0x17c1,0x17c1,0x17c1,0xfae,0xfb1,0xfb1,
-0xfb1,0xfb1,0xfb1,0xfb1,0x33,0x33,0xa17,0xa17,0x33,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,
-0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0x33,0x33,0x33,0xa1d,0xa1d,
-0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,
-0xa1d,0xa1d,0x33,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0x33,0xa1d,0x33,0x33,
-0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0x33,0x33,0x33,0xa11,0x33,0x33,0x33,0x33,0xa0e,
-0xa17,0xa17,0xa0e,0xa0e,0xa0e,0x33,0xa0e,0x33,0xa17,0xa17,0xa1a,0xa17,0xa1a,0xa1a,0xa1a,0xa0e,
-0x33,0x33,0x33,0x33,0x33,0x33,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,
-0x33,0x33,0xa17,0xa17,0xa14,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,
-0x36,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,
-0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,
-0x462,0x44d,0x462,0x45f,0x44d,0x44d,0x44d,0x44d,0x44d,0x44d,0x453,0x36,0x36,0x36,0x36,0x44a,
-0x468,0x468,0x468,0x468,0x468,0x462,0x465,0x450,0x450,0x450,0x450,0x450,0x450,0x44d,0x450,0x456,
-0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x459,0x459,0x36,0x36,0x36,0x36,
+6,6,6,6,6,6,6,6,6,6,6,6,0xd83,0xd83,0xd83,0xd83,
+0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,6,6,6,6,
+6,6,6,6,6,6,6,6,6,6,6,6,0x14fd,0x3c9,0x3d8,0x3d8,
+0x1b,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x1b,0x1b,0x3de,0x3de,0x1b,0x1b,0x3de,
+0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x1b,0x3de,0x3de,
+0x3de,0x3de,0x3de,0x3de,0x3de,0x1b,0x3de,0x1b,0x1b,0x1b,0x3de,0x3de,0x3de,0x3de,0x1b,0x1b,
+0x3cc,0xcdb,0x3c9,0x3d8,0x3d8,0x3c9,0x3c9,0x3c9,0x3c9,0x1b,0x1b,0x3d8,0x3d8,0x1b,0x1b,0x3db,
+0x3db,0x3cf,0xdd4,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x3c9,0x1b,0x1b,0x1b,0x1b,
+0x3e1,0x3e1,0x1b,0x3e1,0x3de,0x3de,0x3c9,0x3c9,0x1b,0x1b,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,
+0x95d,0x95d,0x95d,0x95d,0x3de,0x3de,0x3d5,0x3d5,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d5,0x3d2,0x1152,
+0x1896,0x1893,0x1938,0x1b,0x1e,0xcde,0x3e4,0xce1,0x1e,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x1e,
+0x1e,0x1e,0x1e,0x3f0,0x3f0,0x1e,0x1e,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,
+0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x1e,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x1e,0x3f0,0x3f3,
+0x1e,0x3f0,0x3f3,0x1e,0x3f0,0x3f0,0x1e,0x1e,0x3e7,0x1e,0x3ed,0x3ed,0x3ed,0x3e4,0x3e4,0x1e,
+0x1e,0x1e,0x1e,0x3e4,0x3e4,0x1e,0x1e,0x3e4,0x3e4,0x3ea,0x1e,0x1e,0x1e,0xfb1,0x1e,0x1e,
+0x1e,0x1e,0x1e,0x1e,0x1e,0x3f3,0x3f3,0x3f3,0x3f0,0x1e,0x3f3,0x1e,0x1e,0x1e,0x1e,0x1e,
+0x1e,0x1e,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x3e4,0x3e4,0x3f0,0x3f0,
+0x3f0,0xfb1,0x193b,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x21,0x3f6,0x3f6,0x3ff,
+0x21,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0xcea,0x402,0x21,0x402,0x402,0x402,0x21,0x402,
+0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x21,0x402,0x402,
+0x402,0x402,0x402,0x402,0x402,0x21,0x402,0x402,0x21,0x402,0x402,0x402,0x402,0x402,0x21,0x21,
+0x3f9,0x402,0x3ff,0x3ff,0x3ff,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x21,0x3f6,0x3f6,0x3ff,0x21,0x3ff,
+0x3ff,0x3fc,0x21,0x21,0x402,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,
+0x21,0x21,0x21,0x21,0x402,0xcea,0xce4,0xce4,0x21,0x21,0x963,0x963,0x963,0x963,0x963,0x963,
+0x963,0x963,0x963,0x963,0x1416,0xce7,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x1719,0x1899,0x1899,
+0x1899,0x189c,0x189c,0x189c,0x24,0x405,0x414,0x414,0x24,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,
+0x41a,0x24,0x24,0x41a,0x41a,0x24,0x24,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,
+0x41a,0x41a,0x41a,0x41a,0x41a,0x24,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x24,0x41a,0x41a,
+0x24,0xced,0x41a,0x41a,0x41a,0x41a,0x24,0x24,0x408,0x41a,0x405,0x405,0x414,0x405,0x405,0x405,
+0xfb4,0x24,0x24,0x414,0x417,0x24,0x24,0x417,0x417,0x40b,0x24,0x24,0x24,0x24,0x24,0x24,
+0x24,0x24,0x405,0x405,0x24,0x24,0x24,0x24,0x41d,0x41d,0x24,0x41a,0x41a,0x41a,0xfb4,0xfb4,
+0x24,0x24,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x40e,0xced,0x1338,0x1338,
+0x1338,0x1338,0x1338,0x1338,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x27,0x27,0x420,0x42c,
+0x27,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x27,0x27,0x27,0x42c,0x42c,0x42c,0x27,0x42c,0x42c,
+0x42f,0x42c,0x27,0x27,0x27,0x42c,0x42c,0x27,0x42c,0x27,0x42c,0x42c,0x27,0x27,0x27,0x42c,
+0x42c,0x27,0x27,0x27,0x42c,0x42c,0x42c,0x27,0x27,0x27,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,
+0x42c,0x42c,0xdd7,0x42c,0x42c,0x42c,0x27,0x27,0x27,0x27,0x420,0x426,0x420,0x426,0x426,0x27,
+0x27,0x27,0x426,0x426,0x426,0x27,0x429,0x429,0x429,0x423,0x27,0x27,0xfb7,0x27,0x27,0x27,
+0x27,0x27,0x27,0x420,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0xeeb,0x969,
+0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x966,0x966,0x966,0xda7,0xcf0,0xcf0,0xcf0,0xcf0,
+0xcf0,0xcf3,0xcf0,0x27,0x27,0x27,0x27,0x27,0x1500,0x43e,0x43e,0x43e,0x193e,0x441,0x441,0x441,
+0x441,0x441,0x441,0x441,0x441,0x2a,0x441,0x441,0x441,0x2a,0x441,0x441,0x441,0x441,0x441,0x441,
+0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x2a,0x441,0x441,0x441,0x441,0x441,0x441,
+0x441,0x441,0x441,0x441,0x1503,0x441,0x441,0x441,0x441,0x441,0x2a,0x2a,0x2a,0xfc0,0x432,0x432,
+0x432,0x43e,0x43e,0x43e,0x43e,0x2a,0x432,0x432,0x435,0x2a,0x432,0x432,0x432,0x438,0x2a,0x2a,
+0x2a,0x2a,0x2a,0x2a,0x2a,0x432,0x432,0x2a,0xfc0,0xfc0,0x171c,0x2a,0x2a,0x2a,0x2a,0x2a,
+0x441,0x441,0xfba,0xfba,0x2a,0x2a,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,
+0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x1a0a,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,
+0x17d9,0x1506,0x44a,0x44a,0x1941,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x2d,0x450,0x450,
+0x450,0x2d,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,
+0x450,0x2d,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x2d,0x450,0x450,0x450,
+0x450,0x450,0x2d,0x2d,0xcf6,0xcf9,0x44a,0x444,0x44d,0x44a,0x444,0x44a,0x44a,0x2d,0x444,0x44d,
+0x44d,0x2d,0x44d,0x44d,0x444,0x447,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x444,0x444,0x2d,
+0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x450,0x2d,0x450,0x450,0xf03,0xf03,0x2d,0x2d,0x96c,0x96c,
+0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x2d,0xf06,0xf06,0x2d,0x2d,0x2d,0x2d,0x2d,
+0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x189f,0x1509,0x45c,0x45c,0x30,0x462,0x462,0x462,
+0x462,0x462,0x462,0x462,0x462,0x30,0x462,0x462,0x462,0x30,0x462,0x462,0x462,0x462,0x462,0x462,
+0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x45c,0x453,0x453,0x453,0xfc3,0x30,0x45c,0x45c,
+0x45c,0x30,0x45f,0x45f,0x45f,0x456,0x133e,0x17dc,0x30,0x30,0x30,0x30,0x17df,0x17df,0x17df,0x453,
+0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x171f,0x462,0x462,0xfc3,0xfc3,0x30,0x30,0x459,0x459,
+0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0x17dc,0x17dc,
+0x17dc,0xfc9,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0x33,0x33,0xa35,0xa35,0x33,0xa3b,0xa3b,0xa3b,
+0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0x33,
+0x33,0x33,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,
+0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0x33,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,
+0x33,0xa3b,0x33,0x33,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0x33,0x33,0x33,0xa2f,0x33,
+0x33,0x33,0x33,0xa2c,0xa35,0xa35,0xa2c,0xa2c,0xa2c,0x33,0xa2c,0x33,0xa35,0xa35,0xa38,0xa35,
+0xa38,0xa38,0xa38,0xa2c,0x33,0x33,0x33,0x33,0x33,0x33,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,
+0x150c,0x150c,0x150c,0x150c,0x33,0x33,0xa35,0xa35,0xa32,0x33,0x33,0x33,0x33,0x33,0x33,0x33,
+0x33,0x33,0x33,0x33,0x36,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
+0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,
+0x47d,0x47d,0x47d,0x47d,0x47d,0x468,0x47d,0x47a,0x468,0x468,0x468,0x468,0x468,0x468,0x46e,0x36,
+0x36,0x36,0x36,0x465,0x483,0x483,0x483,0x483,0x483,0x47d,0x480,0x46b,0x46b,0x46b,0x46b,0x46b,
+0x46b,0x468,0x46b,0x471,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x474,0x474,
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
-0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x39,0x477,0x477,0x39,
-0x477,0x39,0x39,0x477,0x477,0x39,0x477,0x39,0x39,0x477,0x39,0x39,0x39,0x39,0x39,0x39,
-0x477,0x477,0x477,0x477,0x39,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x39,0x477,0x477,0x477,
-0x39,0x477,0x39,0x477,0x39,0x39,0x477,0x477,0x39,0x477,0x477,0x477,0x477,0x46b,0x477,0x474,
-0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x39,0x46b,0x46b,0x477,0x39,0x39,0x480,0x480,0x480,0x480,
-0x480,0x39,0x47d,0x39,0x46e,0x46e,0x46e,0x46e,0x46e,0x46b,0x39,0x39,0x471,0x471,0x471,0x471,
-0x471,0x471,0x471,0x471,0x471,0x471,0x39,0x39,0x47a,0x47a,0x13fe,0x13fe,0x39,0x39,0x39,0x39,
+0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x39,0x492,0x492,0x39,0x492,0x39,0x1a10,0x492,0x492,0x1a10,0x492,0x39,0x1a10,0x492,0x1a10,0x1a10,
+0x1a10,0x1a10,0x1a10,0x1a10,0x492,0x492,0x492,0x492,0x1a10,0x492,0x492,0x492,0x492,0x492,0x492,0x492,
+0x1a10,0x492,0x492,0x492,0x39,0x492,0x39,0x492,0x1a10,0x1a10,0x492,0x492,0x1a10,0x492,0x492,0x492,
+0x492,0x486,0x492,0x48f,0x486,0x486,0x486,0x486,0x486,0x486,0x1a0d,0x486,0x486,0x492,0x39,0x39,
+0x49b,0x49b,0x49b,0x49b,0x49b,0x39,0x498,0x39,0x489,0x489,0x489,0x489,0x489,0x486,0x39,0x39,
+0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x39,0x39,0x495,0x495,0x1419,0x1419,
+0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,
0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,
-0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x990,0x990,0x990,0x993,
-0x990,0x990,0x990,0x990,0x3c,0x990,0x990,0x990,0x990,0x993,0x990,0x990,0x990,0x990,0x993,0x990,
-0x990,0x990,0x990,0x993,0x990,0x990,0x990,0x990,0x993,0x990,0x990,0x990,0x990,0x990,0x990,0x990,
-0x990,0x990,0x990,0x990,0x990,0x993,0xa2c,0xfbd,0xfbd,0x3c,0x3c,0x3c,0x3c,0x95d,0x95d,0x960,
-0x95d,0x960,0x960,0x969,0x960,0x969,0x95d,0x95d,0x95d,0x95d,0x95d,0x98a,0x95d,0x960,0x963,0x963,
-0x966,0x96f,0x963,0x963,0x990,0x990,0x990,0x990,0x132c,0x1326,0x1326,0x1326,0x95d,0x95d,0x95d,0x960,
-0x95d,0x95d,0xa20,0x95d,0x3c,0x95d,0x95d,0x95d,0x95d,0x960,0x95d,0x95d,0x95d,0x95d,0x960,0x95d,
-0x95d,0x95d,0x95d,0x960,0x95d,0x95d,0x95d,0x95d,0x960,0x95d,0xa20,0xa20,0xa20,0x95d,0x95d,0x95d,
-0x95d,0x95d,0x95d,0x95d,0xa20,0x960,0xa20,0xa20,0xa20,0x3c,0xa29,0xa29,0xa26,0xa26,0xa26,0xa26,
-0xa26,0xa26,0xa23,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0x3c,0xfb4,0xa26,0xdbc,0xdbc,0xfb7,0xfba,
-0xfb4,0x113d,0x113d,0x113d,0x113d,0x1329,0x1329,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
+0x9ae,0x9ae,0x9ae,0x9b1,0x9ae,0x9ae,0x9ae,0x9ae,0x3c,0x9ae,0x9ae,0x9ae,0x9ae,0x9b1,0x9ae,0x9ae,
+0x9ae,0x9ae,0x9b1,0x9ae,0x9ae,0x9ae,0x9ae,0x9b1,0x9ae,0x9ae,0x9ae,0x9ae,0x9b1,0x9ae,0x9ae,0x9ae,
+0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9b1,0xa4a,0xfd8,0xfd8,0x3c,0x3c,0x3c,
+0x3c,0x97b,0x97b,0x97e,0x97b,0x97e,0x97e,0x987,0x97e,0x987,0x97b,0x97b,0x97b,0x97b,0x97b,0x9a8,
+0x97b,0x97e,0x981,0x981,0x984,0x98d,0x981,0x981,0x9ae,0x9ae,0x9ae,0x9ae,0x1347,0x1341,0x1341,0x1341,
+0x97b,0x97b,0x97b,0x97e,0x97b,0x97b,0xa3e,0x97b,0x3c,0x97b,0x97b,0x97b,0x97b,0x97e,0x97b,0x97b,
+0x97b,0x97b,0x97e,0x97b,0x97b,0x97b,0x97b,0x97e,0x97b,0x97b,0x97b,0x97b,0x97e,0x97b,0xa3e,0xa3e,
+0xa3e,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0xa3e,0x97e,0xa3e,0xa3e,0xa3e,0x3c,0xa47,0xa47,
+0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa41,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0x3c,0xfcf,0xa44,
+0xdda,0xdda,0xfd2,0xfd5,0xfcf,0x1155,0x1155,0x1155,0x1155,0x1344,0x1344,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
-0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x486,0x486,0x486,0x486,0x486,0x486,0x3f,0x1404,
-0x3f,0x3f,0x3f,0x3f,0x3f,0x1404,0x3f,0x3f,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,
-0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xdcb,
-0xa56,0x42,0xa56,0xa56,0xa56,0xa56,0x42,0x42,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0x42,
-0xa56,0x42,0xa56,0xa56,0xa56,0xa56,0x42,0x42,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xdcb,
-0xa56,0x42,0xa56,0xa56,0xa56,0xa56,0x42,0x42,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,
-0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xdcb,0xa56,0x42,0xa56,0xa56,
-0xa56,0xa56,0x42,0x42,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0x42,0xa56,0x42,0xa56,0xa56,
-0xa56,0xa56,0x42,0x42,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xdcb,0xa56,0xa56,0xa56,0xa56,
-0xa56,0xa56,0xa56,0x42,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,
-0xa56,0xa56,0xa56,0xdcb,0xa56,0x42,0xa56,0xa56,0xa56,0xa56,0x42,0x42,0xa56,0xa56,0xa56,0xa56,
-0xa56,0xa56,0xa56,0xdcb,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,
-0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0x42,0x42,0x132f,0x132f,0xdc5,0xdc8,0xa50,0xa59,0xa4d,
-0xa4d,0xa4d,0xa4d,0xa59,0xa59,0xa53,0xa53,0xa53,0xa53,0xa53,0xa53,0xa53,0xa53,0xa53,0xa4a,0xa4a,
-0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0x42,0x42,0x42,0xa5c,0xa5c,0xa5c,0xa5c,
-0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,
-0xa5c,0x170a,0x45,0x45,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x45,0x45,0xa6e,0xa71,0xa71,0xa71,
-0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,
-0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa6b,0xa68,0x48,0x48,0x48,0xa77,0xa77,0xa77,0xa77,
-0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa74,0xa74,0xa74,0xa77,0xa77,0xa77,0x14f4,0x14f4,0x14f4,
-0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0xa98,0xa98,0xa98,0xa98,
-0xa98,0xa98,0xa7a,0xa98,0xa98,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa80,0xa7d,
-0xa8f,0xa8f,0xa92,0xa9b,0xa89,0xa86,0xa8f,0xa8c,0xa9b,0xcde,0x4e,0x4e,0xa95,0xa95,0xa95,0xa95,
-0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xce1,0xce1,0xce1,0xce1,
-0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xaaa,0xaaa,0xb2e,0xb31,
-0xab0,0xb2b,0xaad,0xaaa,0xab3,0xac2,0xab6,0xac5,0xac5,0xac5,0xaa1,0x51,0xab9,0xab9,0xab9,0xab9,
-0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0x51,0x51,0x51,0x51,0x51,0x51,0xabc,0xabc,0xabc,0xabc,
-0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,
-0xabc,0xabc,0xabc,0xabc,0x1929,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0xabc,0xabc,0xabc,0xabc,
-0xabc,0xabc,0xabc,0xabc,0xabc,0xaa4,0xfde,0x51,0x51,0x51,0x51,0x51,0x1194,0x1194,0x1194,0x1194,
-0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x4a4,0x4a4,0x4a4,0x4a4,
-0x4a4,0x4a4,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a4,0x4a4,0x4a4,0x4a4,
-0x4a4,0x4a4,0x54,0x54,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x54,0x54,0x4a4,0x4a4,0x4a4,0x4a4,
-0x4a4,0x4a4,0x4a4,0x4a4,0x54,0x4a7,0x54,0x4a7,0x54,0x4a7,0x54,0x4a7,0x4a4,0x4a4,0x4a4,0x4a4,
-0x4a4,0x4a4,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a4,0x4a4,0x4a4,0x4a4,
-0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x54,0x54,0x4a4,0x4a4,0x4a4,0x4a4,
-0x4a4,0x4a4,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a4,0x4a4,0x4a4,0x4a4,
-0x4a4,0x54,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x49e,0x4a4,0x49e,0x49e,0x49b,0x4a4,0x4a4,
-0x4a4,0x54,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x49b,0x49b,0x49b,0x4a4,0x4a4,0x4a4,0x4a4,
-0x54,0x54,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x54,0x49b,0x49b,0x49b,0x4a4,0x4a4,0x4a4,0x4a4,
-0x4a4,0x4a4,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x49b,0x49b,0x49b,0x54,0x54,0x4a4,0x4a4,
-0x4a4,0x54,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a1,0x49e,0x54,0xba3,0xba6,0xba6,0xba6,
-0xfe7,0x57,0x14d0,0x14d0,0x14d0,0x14d0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4fb,0xbb8,0x5a,0x5a,
-0x6ba,0x4fb,0x4fb,0x4fb,0x4fb,0x4fb,0x501,0x513,0x501,0x50d,0x507,0x6bd,0x4f8,0x6b7,0x6b7,0x6b7,
-0x6b7,0x4f8,0x4f8,0x4f8,0x4f8,0x4f8,0x4fe,0x510,0x4fe,0x50a,0x504,0x5a,0xdd4,0xdd4,0xdd4,0xdd4,
-0xdd4,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x5a,0x5a,0x5a,0x5d,0x5d,0x5d,0x5d,
-0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x522,0x522,0x522,0x522,
-0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x51f,0x51f,0x51f,0x51f,0x522,0xad7,0xada,
-0xbbe,0xbc4,0xbc4,0xbc1,0xbc1,0xbc1,0xbc1,0xdda,0xeee,0xeee,0xeee,0xeee,0x1128,0x60,0x60,0x60,
-0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x552,0x552,0x552,0xae3,
-0xef7,0xfed,0xfed,0xfed,0xfed,0x1287,0x1710,0x1710,0x63,0x63,0x63,0x63,0x6e4,0x6e4,0x6e4,0x6e4,
-0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x55e,0x55e,0x55b,0x55b,0x55b,0x55b,0x585,0x585,0x585,0x585,
-0x585,0xaef,0xaef,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
-0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x588,0x588,0x588,0x588,
-0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,
-0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0xb0a,0xb0a,0xb0a,0xb0a,
-0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,
-0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0x6c,0xb0a,0xb0a,0xb0a,0xb0a,0xb0d,0xb0a,0xb0a,0xb0a,0xb0a,
-0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0d,
-0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0xb10,0xb10,0xb10,0xb10,
-0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,
-0xb10,0xb10,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x75,0x81c,0x816,0x81c,
-0x816,0x81c,0x816,0x81c,0x816,0x81c,0x816,0x816,0x819,0x816,0x819,0x816,0x819,0x816,0x819,0x816,
-0x819,0x816,0x819,0x816,0x819,0x816,0x819,0x816,0x819,0x816,0x819,0x816,0x816,0x816,0x816,0x81c,
-0x816,0x81c,0x816,0x81c,0x816,0x816,0x816,0x816,0x816,0x816,0x81c,0x816,0x816,0x816,0x816,0x816,
-0x819,0xc6c,0xc6c,0x75,0x75,0x930,0x930,0x8fa,0x8fa,0x81f,0x822,0xc69,0x78,0x78,0x78,0x78,
-0x78,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,
-0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x1116,0x18f3,0x19d7,
-0x7b,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,
-0x837,0x837,0x837,0x7b,0x903,0x903,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,
-0x906,0x906,0x906,0x906,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,
-0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0x13c5,0x13c5,0x13c5,0x7e,
-0x7e,0x7e,0x7e,0x7e,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,
-0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,
-0x840,0xd71,0xd71,0x81,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,
-0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,
-0x846,0x846,0x846,0x81,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,
-0xb22,0x84,0x84,0x84,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,
-0xb28,0xb28,0xb28,0xb28,0xb28,0xc75,0xb28,0xb28,0xb28,0xc75,0xb28,0x87,0x87,0x87,0x87,0x87,
-0x87,0x87,0x87,0x87,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,
-0x11bb,0x11bb,0x11bb,0x11bb,0x9b4,0x9b4,0x9b4,0x9b4,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,
-0x8a,0x8a,0x8a,0x8a,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,
-0x1230,0x1230,0x1230,0x1230,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x8d,0x8d,0x8d,0x8d,0x8d,
-0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x8d,0x8d,0x8d,0x8d,
-0x8d,0xafb,0x5d6,0x5dc,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5d9,0x5dc,0x5dc,
-0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x8d,0x5dc,0x5dc,0x5dc,0x5dc,
-0x5dc,0x8d,0x5dc,0x8d,0x5dc,0x5dc,0x8d,0x5dc,0x5dc,0x8d,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,
-0x5dc,0x5dc,0x5dc,0x5df,0x5f7,0x5f1,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,
-0x5f4,0x5fa,0x5f7,0x5f1,0x1344,0x1344,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,
-0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,
-0x5f1,0x5f7,0x5f7,0x5f1,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,
-0x90,0x90,0x90,0x90,0x5f4,0x5f1,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f1,0x5f4,0x5f1,0x5f1,
-0x5f4,0x5f4,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f4,0x5f1,0x5f1,0x5f4,0x5f1,0x5f4,0x5f4,0x5f4,0x5f1,
-0x5f4,0x5f4,0x5f4,0x5f4,0x90,0x90,0x5f4,0x5f4,0x5f4,0x5f4,0x5f1,0x5f1,0x5f4,0x5f1,0x5f1,0x5f1,
-0x5f1,0x5f4,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f4,0x5f4,0x5f4,0x5f1,0x5f1,0x90,0x90,0x90,0x90,
-0x90,0x90,0x90,0x90,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,
-0xb43,0xb43,0xb43,0xb43,0x5f7,0x5f7,0x951,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5ee,0x5ee,
-0xbfd,0xd8c,0x90,0x90,0x858,0x86a,0x867,0x86a,0x867,0xc8a,0xc8a,0xd7d,0xd7a,0x85b,0x85b,0x85b,
-0x85b,0x86d,0x86d,0x86d,0x885,0x888,0x897,0x93,0x88b,0x88e,0x89a,0x89a,0x882,0x879,0x873,0x879,
-0x873,0x879,0x873,0x876,0x876,0x891,0x891,0x894,0x891,0x891,0x891,0x93,0x891,0x87f,0x87c,0x876,
-0x93,0x93,0x93,0x93,0x603,0x60f,0x603,0xc00,0x603,0x96,0x603,0x60f,0x603,0x60f,0x603,0x60f,
-0x603,0x60f,0x603,0x60f,0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,
-0x60f,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x60c,
-0x606,0x96,0x96,0x600,0x756,0x759,0x76e,0x771,0x750,0x759,0x759,0x9c,0x738,0x73b,0x73b,0x73b,
-0x73b,0x738,0x738,0x9c,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0xafe,0xafe,0xafe,
-0x9b7,0x732,0x612,0x612,0x9c,0x780,0x75f,0x750,0x759,0x756,0x750,0x762,0x753,0x74d,0x750,0x76e,
-0x765,0x75c,0x77d,0x750,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x76b,0x768,
-0x76e,0x76e,0x76e,0x780,0x741,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,
-0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,
-0x73e,0x73e,0x73e,0x9c,0x9c,0x9c,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x9c,0x9c,0x73e,0x73e,
-0x73e,0x73e,0x73e,0x73e,0x9c,0x9c,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x9c,0x9c,0x73e,0x73e,
-0x73e,0x9c,0x9c,0x9c,0xb46,0xb46,0xb46,0xb46,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,
-0x9f,0x1890,0x1890,0x1890,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,
-0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xa2,0xa2,0xa2,0xa2,0xa2,0x165c,0x165c,0x165c,0x165c,
-0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0xb55,0xb55,0xb55,0xb55,
-0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,
-0xb55,0xb55,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xb61,0xb61,0xb61,0xb61,
-0xb61,0xb61,0xb61,0xa8,0xa8,0xff9,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,
-0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0x1716,0x1716,0x1716,0x1716,
-0x1716,0x1716,0x1716,0x1716,0x1716,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,
-0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xb79,0xb79,0xb79,0xb79,
-0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,
-0xb76,0xab,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb79,0xb79,0xb76,0xb76,
-0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,
-0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb79,0xab,0xb79,0xb79,0xab,0xab,0xb79,0xab,
-0xab,0xb79,0xb79,0xab,0xab,0xb79,0xb79,0xb79,0xb79,0xab,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,
-0xb79,0xb79,0xb76,0xb76,0xb76,0xb76,0xab,0xb76,0xab,0xb76,0xb76,0xb76,0xb76,0xd02,0xb76,0xb76,
-0xab,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb79,0xb79,0xb79,0xb79,
-0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb76,0xb76,0xb76,0xb76,
-0xb79,0xb79,0xab,0xb79,0xb79,0xb79,0xb79,0xab,0xab,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,
-0xb79,0xab,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xab,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,
-0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,
-0xb76,0xb76,0xb76,0xb76,0xb79,0xb79,0xab,0xb79,0xb79,0xb79,0xb79,0xab,0xb79,0xb79,0xb79,0xb79,
-0xb79,0xab,0xb79,0xab,0xab,0xab,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xab,0xb76,0xb76,
-0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xdef,0xdef,0xab,0xab,
-0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,
-0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb76,0xb76,0xb76,0xb70,0xb76,0xb76,0xb76,0xb76,
-0xb76,0xb76,0xf06,0xf03,0xab,0xab,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,
-0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xae,0xb7f,0xae,0xae,0xae,0xae,0xae,0xae,
+0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x4a1,0x4a1,0x4a1,0x4a1,
+0x4a1,0x4a1,0x3f,0x141f,0x3f,0x3f,0x3f,0x3f,0x3f,0x141f,0x3f,0x3f,0x49e,0x49e,0x49e,0x49e,
+0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0xa74,0xa74,0xa74,0xa74,
+0xa74,0xa74,0xa74,0xde9,0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0x42,0x42,0xa74,0xa74,0xa74,0xa74,
+0xa74,0xa74,0xa74,0x42,0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0x42,0x42,0xa74,0xa74,0xa74,0xa74,
+0xa74,0xa74,0xa74,0xde9,0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0x42,0x42,0xa74,0xa74,0xa74,0xa74,
+0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xde9,
+0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0x42,0x42,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0x42,
+0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0x42,0x42,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xde9,
+0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,
+0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xde9,0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0x42,0x42,
+0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xde9,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,
+0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0x42,0x42,0x134a,0x134a,0xde3,
+0xde6,0xa6e,0xa77,0xa6b,0xa6b,0xa6b,0xa6b,0xa77,0xa77,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,
+0xa71,0xa71,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0x42,0x42,0x42,
+0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,
+0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0x1725,0x45,0x45,0x1722,0x1722,0x1722,0x1722,0x1722,0x1722,0x45,0x45,
+0xa8c,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,
+0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa89,0xa86,0x48,0x48,0x48,
+0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa92,0xa92,0xa92,0xa95,0xa95,
+0xa95,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,
+0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xa98,0xab6,0xab6,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,
+0xa9b,0xa9b,0xa9e,0xa9b,0xaad,0xaad,0xab0,0xab9,0xaa7,0xaa4,0xaad,0xaaa,0xab9,0xcfc,0x4e,0x4e,
+0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,
+0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,
+0xac8,0xac8,0xb49,0xb4c,0xace,0xb46,0xacb,0xac8,0xad1,0xae0,0xad4,0xae3,0xae3,0xae3,0xabf,0x51,
+0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0x51,0x51,0x51,0x51,0x51,0x51,
+0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,
+0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0x1944,0x51,0x51,0x51,0x51,0x51,0x51,0x51,
+0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xac2,0xff6,0x51,0x51,0x51,0x51,0x51,
+0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,
+0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,
+0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x54,0x54,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x54,0x54,
+0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x54,0x4c2,0x54,0x4c2,0x54,0x4c2,0x54,0x4c2,
+0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,
+0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x54,0x54,
+0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,
+0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x54,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4b9,0x4bf,0x4b9,
+0x4b9,0x4b6,0x4bf,0x4bf,0x4bf,0x54,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4b6,0x4b6,0x4b6,
+0x4bf,0x4bf,0x4bf,0x4bf,0x54,0x54,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x54,0x4b6,0x4b6,0x4b6,
+0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4b6,0x4b6,0x4b6,
+0x54,0x54,0x4bf,0x4bf,0x4bf,0x54,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4bc,0x4b9,0x54,
+0xbc1,0xbc4,0xbc4,0xbc4,0xfff,0x57,0x14eb,0x14eb,0x14eb,0x14eb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,
+0x516,0xbd6,0x5a,0x5a,0x6d5,0x516,0x516,0x516,0x516,0x516,0x51c,0x52e,0x51c,0x528,0x522,0x6d8,
+0x513,0x6d2,0x6d2,0x6d2,0x6d2,0x513,0x513,0x513,0x513,0x513,0x519,0x52b,0x519,0x525,0x51f,0x5a,
+0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x5a,0x5a,0x5a,
+0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,
+0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53a,0x53a,0x53a,
+0x53a,0x53d,0xaf2,0xaf5,0xbdc,0xbe2,0xbe2,0xbdf,0xbdf,0xbdf,0xbdf,0xdf8,0xf09,0xf09,0xf09,0xf09,
+0x1140,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,
+0x56d,0x56d,0x56d,0xafe,0xf12,0x1005,0x1005,0x1005,0x1005,0x129f,0x172b,0x172b,0x63,0x63,0x63,0x63,
+0x6ff,0x6ff,0x6ff,0x6ff,0x702,0x702,0x702,0x702,0x702,0x702,0x579,0x579,0x576,0x576,0x576,0x576,
+0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0xb0a,0xb0a,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x69,0x69,0x69,0x69,0x69,
+0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,
+0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,
+0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0x6c,0xb25,0xb25,0xb25,0xb25,0xb28,
+0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,
+0xb25,0xb25,0xb25,0xb28,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,
+0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,
+0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,
+0x75,0x837,0x831,0x837,0x831,0x837,0x831,0x837,0x831,0x837,0x831,0x831,0x834,0x831,0x834,0x831,
+0x834,0x831,0x834,0x831,0x834,0x831,0x834,0x831,0x834,0x831,0x834,0x831,0x834,0x831,0x834,0x831,
+0x831,0x831,0x831,0x837,0x831,0x837,0x831,0x837,0x831,0x831,0x831,0x831,0x831,0x831,0x837,0x831,
+0x831,0x831,0x831,0x831,0x834,0xc8a,0xc8a,0x75,0x75,0x94b,0x94b,0x915,0x915,0x83a,0x83d,0xc87,
+0x78,0x78,0x78,0x78,0x78,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,
+0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,
+0x84f,0x112e,0x190e,0x19f2,0x7b,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,
+0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x7b,0x91e,0x91e,0x921,0x921,0x921,0x921,0x921,0x921,
+0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,
+0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,
+0x13e0,0x13e0,0x13e0,0x7e,0x7e,0x7e,0x7e,0x7e,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,
+0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,
+0x85b,0x85b,0x85b,0x85b,0x85b,0xd8f,0xd8f,0x81,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,
+0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0x84,0x84,0x84,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,
+0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xc93,0xb43,0xb43,0xb43,0xc93,0xb43,0x87,
+0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,
+0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x9d2,0x9d2,0x9d2,0x9d2,0x8a,0x8a,0x8a,0x8a,
+0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,
+0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x8d,
+0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x5ee,0x5ee,0x5ee,0x5ee,0x5ee,
+0x8d,0x8d,0x8d,0x8d,0x8d,0xb16,0x5f1,0x5f7,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,
+0x5fd,0x5f4,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x8d,
+0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x8d,0x5f7,0x8d,0x5f7,0x5f7,0x8d,0x5f7,0x5f7,0x8d,0x5f7,0x5f7,
+0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5fa,0x612,0x60c,0x612,0x60c,0x60f,0x615,0x612,0x60c,
+0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x135f,0x135f,0x90,0x90,0x90,0x90,0x90,0x90,
+0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x612,0x60c,0x60f,0x615,0x612,
+0x60c,0x612,0x60c,0x612,0x60c,0x612,0x612,0x60c,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,
+0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60f,0x60c,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,
+0x60c,0x60f,0x60c,0x60c,0x60f,0x60f,0x60c,0x60c,0x60c,0x60c,0x60c,0x60f,0x60c,0x60c,0x60f,0x60c,
+0x60f,0x60f,0x60f,0x60c,0x60f,0x60f,0x60f,0x60f,0x90,0x90,0x60f,0x60f,0x60f,0x60f,0x60c,0x60c,
+0x60f,0x60c,0x60c,0x60c,0x60c,0x60f,0x60c,0x60c,0x60c,0x60c,0x60c,0x60f,0x60f,0x60f,0x60c,0x60c,
+0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,
+0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0x612,0x612,0x96f,0x612,0x612,0x612,0x612,0x612,
+0x612,0x612,0x609,0x609,0xc1b,0xdaa,0x90,0x90,0x873,0x885,0x882,0x885,0x882,0xca8,0xca8,0xd9b,
+0xd98,0x876,0x876,0x876,0x876,0x888,0x888,0x888,0x8a0,0x8a3,0x8b2,0x93,0x8a6,0x8a9,0x8b5,0x8b5,
+0x89d,0x894,0x88e,0x894,0x88e,0x894,0x88e,0x891,0x891,0x8ac,0x8ac,0x8af,0x8ac,0x8ac,0x8ac,0x93,
+0x8ac,0x89a,0x897,0x891,0x93,0x93,0x93,0x93,0x61e,0x62a,0x61e,0xc1e,0x61e,0x96,0x61e,0x62a,
+0x61e,0x62a,0x61e,0x62a,0x61e,0x62a,0x61e,0x62a,0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624,
+0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x627,0x621,0x627,0x621,0x624,0x62a,0x627,0x621,0x627,
+0x621,0x627,0x621,0x627,0x621,0x96,0x96,0x61b,0x771,0x774,0x789,0x78c,0x76b,0x774,0x774,0x9c,
+0x753,0x756,0x756,0x756,0x756,0x753,0x753,0x9c,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,
+0x99,0xb19,0xb19,0xb19,0x9d5,0x74d,0x62d,0x62d,0x9c,0x79b,0x77a,0x76b,0x774,0x771,0x76b,0x77d,
+0x76e,0x768,0x76b,0x789,0x780,0x777,0x798,0x76b,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,
+0x795,0x795,0x786,0x783,0x789,0x789,0x789,0x79b,0x75c,0x759,0x759,0x759,0x759,0x759,0x759,0x759,
+0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,
+0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x9c,0x9c,0x9c,0x759,0x759,0x759,0x759,0x759,0x759,
+0x9c,0x9c,0x759,0x759,0x759,0x759,0x759,0x759,0x9c,0x9c,0x759,0x759,0x759,0x759,0x759,0x759,
+0x9c,0x9c,0x759,0x759,0x759,0x9c,0x9c,0x9c,0xb64,0xb64,0xb64,0xb64,0x9f,0x9f,0x9f,0x9f,
+0x9f,0x9f,0x9f,0x9f,0x9f,0x18ab,0x18ab,0x18ab,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,
+0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xa2,0xa2,0xa2,0xa2,0xa2,
+0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,
+0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,
+0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,
+0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xa8,0xa8,0x1011,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,
+0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,
+0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,
+0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,
+0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb94,0xb94,
+0xb94,0xb94,0xb94,0xb94,0xb94,0xab,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,
+0xb97,0xb97,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,
+0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb97,0xab,0xb97,0xb97,
+0xab,0xab,0xb97,0xab,0xab,0xb97,0xb97,0xab,0xab,0xb97,0xb97,0xb97,0xb97,0xab,0xb97,0xb97,
+0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb94,0xb94,0xb94,0xb94,0xab,0xb94,0xab,0xb94,0xb94,0xb94,
+0xb94,0xd20,0xb94,0xb94,0xab,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,
+0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,
+0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xab,0xb97,0xb97,0xb97,0xb97,0xab,0xab,0xb97,0xb97,0xb97,
+0xb97,0xb97,0xb97,0xb97,0xb97,0xab,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xab,0xb94,0xb94,
+0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,
+0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xab,0xb97,0xb97,0xb97,0xb97,0xab,
+0xb97,0xb97,0xb97,0xb97,0xb97,0xab,0xb97,0xab,0xab,0xab,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,
+0xb97,0xab,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,
+0xe0d,0xe0d,0xab,0xab,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,
+0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb94,0xb94,0xb94,0xb8e,
+0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xf21,0xf1e,0xab,0xab,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,
+0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xae,0xb9d,0xae,0xae,
0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,
-0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,
-0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xb1,0xc0f,0xc0f,0xc0f,0xc0f,0xc09,0xc09,0xc0c,0xb1,0xb1,0xb1,
-0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,
-0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc12,0xc12,0xc15,0xc7e,0xc7e,0xb4,
-0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,
-0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1b,0xc1b,0xb7,0xb7,0xb7,0xb7,
-0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,
-0xc24,0xc24,0xc24,0xc24,0xc24,0xba,0xc24,0xc24,0xc24,0xba,0xc21,0xc21,0xba,0xba,0xba,0xba,
-0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,
-0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,
-0xd14,0xd14,0xd14,0xd14,0xd14,0x1512,0x1512,0xbd,0xd05,0xd05,0xd05,0xd11,0xd11,0xd11,0xd11,0xd05,
-0xd05,0xd11,0xd11,0xd11,0xbd,0xbd,0xbd,0xbd,0xd11,0xd11,0xd05,0xd11,0xd11,0xd11,0xd11,0xd11,
-0xd11,0xd08,0xd08,0xd08,0xbd,0xbd,0xbd,0xbd,0xd0b,0xbd,0xbd,0xbd,0xd17,0xd17,0xd0e,0xd0e,
-0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,
-0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xc0,0xc0,0xd1a,0xd1a,0xd1a,0xd1a,
-0xd1a,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x1515,0x1515,0x1515,0x1515,
-0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,
-0xc3,0xc3,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,
-0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0xc3,0xc3,0x1515,0x1515,0x1515,0x1515,
-0x1515,0x1515,0x1515,0x1515,0x1515,0xc3,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1893,0x192c,
-0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x1719,0x1719,0x1719,0x1719,
-0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0xc3,
-0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xc6,0xd41,0xd41,0xd41,
-0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,
-0xd41,0xd41,0xd41,0xc6,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,
-0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xc6,0xd41,0xd41,0xc6,0xd41,0xd41,0xd41,0xd41,0xd41,
-0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xc6,0xc6,0xd41,0xd41,0xd41,0xd41,
-0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,
+0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xc2d,0xc2d,0xc2d,0xc2d,
+0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xb1,0xc2d,0xc2d,0xc2d,0xc2d,0xc27,0xc27,
+0xc2a,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xc36,0xc36,0xc36,0xc36,
+0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc30,0xc30,
+0xc33,0xc9c,0xc9c,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xc3c,0xc3c,0xc3c,0xc3c,
+0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc39,0xc39,
+0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xc42,0xc42,0xc42,0xc42,
+0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xba,0xc42,0xc42,0xc42,0xba,0xc3f,0xc3f,
+0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xd32,0xd32,0xd32,0xd32,
+0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,
+0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0x152d,0x152d,0xbd,0xd23,0xd23,0xd23,0xd2f,
+0xd2f,0xd2f,0xd2f,0xd23,0xd23,0xd2f,0xd2f,0xd2f,0xbd,0xbd,0xbd,0xbd,0xd2f,0xd2f,0xd23,0xd2f,
+0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd26,0xd26,0xd26,0xbd,0xbd,0xbd,0xbd,0xd29,0xbd,0xbd,0xbd,
+0xd35,0xd35,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd38,0xd38,0xd38,0xd38,
+0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xc0,0xc0,
+0xd38,0xd38,0xd38,0xd38,0xd38,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,
+0x1530,0x1530,0x1530,0x1530,0xc3,0xc3,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,
+0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0xc3,0xc3,
+0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xc6,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xc6,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xc6,
+0xd5f,0xd5f,0xc6,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xc6,0xc6,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,
0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,
-0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xd44,0xd44,0xd44,0xd44,
-0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,
-0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xc9,0xc9,0xc9,0xc9,0xc9,0xd86,0xd86,0xd86,0xcc,
-0xcc,0xcc,0xcc,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,
-0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xcc,0xcc,0xcc,0xd83,
-0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,
-0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,
-0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xcf,0xd47,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,
-0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,
-0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd2,0xd2,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,
-0xd50,0xd50,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,
-0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd5,0xd5,
-0xd56,0xd5,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,
-0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd5,0xd56,0xd56,0xd5,0xd5,0xd5,
-0xd56,0xd5,0xd5,0xd56,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,
-0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd8,0xd8,0xd8,0xd8,0xd8,
-0xd8,0xd8,0xd8,0xd8,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0x1518,
-0x1518,0x17ca,0x17ca,0xde,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,
-0x135,0x135,0x135,0x135,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,
-0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe13,0xe13,0xe19,0xe19,0xe13,
-0xe1,0xe1,0xe16,0xe16,0x1125,0x1125,0x1125,0x1125,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,
-0xe4,0xe4,0xe4,0xe4,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,
-0xc7b,0xc7b,0xc7b,0xc7b,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x151b,0x151b,0x151b,0x151b,0x151b,
-0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151e,0x1896,0x1896,0x1896,0x1896,0xe7,0x17cd,
-0x1350,0x1167,0xf15,0xf15,0xe2e,0xe2b,0xe2e,0xe2b,0xe2b,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0x1170,
-0x116d,0x1170,0x116d,0x116a,0x116a,0x116a,0x140d,0x140a,0xea,0xea,0xea,0xea,0xea,0xe28,0xe25,0xe25,
-0xe25,0xe22,0xe28,0xe25,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,
-0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xed,0xed,0xed,0xed,0xed,
-0xed,0xed,0xed,0xed,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xed,0xe31,0xe31,0xe31,0xe31,
-0xe31,0xe31,0xe31,0xed,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xed,0xe31,0xe31,0xe31,0xe31,
-0xe31,0xe31,0xe31,0xed,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,
-0xe37,0xe37,0xe37,0xe37,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xf0,0xf0,
-0xf0,0xf0,0xf0,0xf0,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xf3,0x1410,0xf3,0xf3,0xf3,0xf3,
-0xf3,0x1410,0xf3,0xf3,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,
-0xe94,0xe94,0xe94,0xe94,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,
-0xe40,0xe40,0xe40,0xf6,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,
-0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,
-0xe3d,0xe3d,0xe3d,0xf6,0xe52,0xe46,0xe46,0xe46,0xf9,0xe46,0xe46,0xf9,0xf9,0xf9,0xf9,0xf9,
-0xe46,0xe46,0xe46,0xe46,0xe52,0xe52,0xe52,0xe52,0xf9,0xe52,0xe52,0xe52,0xf9,0xe52,0xe52,0xe52,
-0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,
-0xe52,0xe52,0xe52,0xe52,0x1932,0x1932,0xf9,0xf9,0xe43,0xe43,0xe43,0xf9,0xf9,0xf9,0xf9,0xe49,
-0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0x192f,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
-0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe55,0xe55,0xe4c,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
-0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0x1176,0x1176,0xfc,0xfc,0xfc,0xfc,
-0xe61,0xe61,0xe61,0xe61,0xe61,0xe64,0xe64,0xe64,0xe61,0xe61,0xe64,0xe61,0xe61,0xe61,0xe61,0xe61,
-0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xe5e,0xe5e,0xe5e,0xe5e,
-0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0x1173,0xfc,0xfc,0xfc,0xe5b,0xe5b,0xe6a,0xe6a,0xe6a,0xe6a,
-0xff,0xff,0xff,0xff,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe67,0xe6a,0xe6a,0xe6a,
-0xe6a,0xe6a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1527,0x152d,0x152a,0x1875,
-0x17d0,0x1899,0x1899,0x1899,0x1899,0x1899,0x1938,0x1935,0x193b,0x1935,0x193b,0x102,0x102,0x102,0x102,0x102,
+0xc6,0xc6,0xc6,0xc6,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,
+0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xc9,
+0xc9,0xc9,0xc9,0xc9,0xda4,0xda4,0xda4,0xcc,0xcc,0xcc,0xcc,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,
+0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,
+0xd9e,0xd9e,0xd9e,0xd9e,0xcc,0xcc,0xcc,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,
+0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,
+0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xcf,0xd65,
+0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,
+0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd2,0xd2,
+0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,
+0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,
+0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd5,0xd5,0xd74,0xd5,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,
+0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,
+0xd74,0xd74,0xd5,0xd74,0xd74,0xd5,0xd5,0xd5,0xd74,0xd5,0xd5,0xd74,0xd77,0xd77,0xd77,0xd77,
+0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,
+0xd77,0xd77,0xd77,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xe28,0xe28,0xe28,0xe28,
+0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0x1533,0x1533,0x17e5,0x17e5,0xde,0x110d,0x110d,0x110d,0x110d,
+0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x135,0x135,0x135,0x135,0xe3a,0xe3a,0xe3a,0xe3a,
+0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,
+0xe3a,0xe3a,0xe3a,0xe31,0xe31,0xe37,0xe37,0xe31,0xe1,0xe1,0xe34,0xe34,0x113d,0x113d,0x113d,0x113d,
+0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xc99,0xc99,0xc99,0xc99,
+0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0x102c,0x102c,0x102c,0x102c,
+0x102c,0x102c,0x102c,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,
+0x1536,0x1539,0x18b1,0x18b1,0x18b1,0x18b1,0xe7,0x17e8,0x136b,0x117f,0xf30,0xf30,0xe4c,0xe49,0xe4c,0xe49,
+0xe49,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0x1188,0x1185,0x1188,0x1185,0x1182,0x1182,0x1182,0x1428,0x1425,
+0xea,0xea,0xea,0xea,0xea,0xe46,0xe43,0xe43,0xe43,0xe40,0xe46,0xe43,0xe4f,0xe4f,0xe4f,0xe4f,
+0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,
+0xe4f,0xe4f,0xe4f,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xe4f,0xe4f,0xe4f,0xe4f,
+0xe4f,0xe4f,0xe4f,0xed,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xed,0xe4f,0xe4f,0xe4f,0xe4f,
+0xe4f,0xe4f,0xe4f,0xed,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xed,0xe55,0xe55,0xe55,0xe55,
+0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe52,0xe52,0xe52,0xe52,
+0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xe58,0xe58,0xe58,0xe58,
+0xe58,0xe58,0xf3,0x142b,0xf3,0xf3,0xf3,0xf3,0xf3,0x142b,0xf3,0xf3,0xeaf,0xeaf,0xeaf,0xeaf,
+0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xe5e,0xe5e,0xe5e,0xe5e,
+0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xf6,0xe5b,0xe5b,0xe5b,0xe5b,
+0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,
+0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xf6,0xe70,0xe64,0xe64,0xe64,
+0xf9,0xe64,0xe64,0xf9,0xf9,0xf9,0xf9,0xf9,0xe64,0xe64,0xe64,0xe64,0xe70,0xe70,0xe70,0xe70,
+0xf9,0xe70,0xe70,0xe70,0xf9,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,
+0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0x194d,0x194d,0xf9,0xf9,
+0xe61,0xe61,0xe61,0xf9,0xf9,0xf9,0xf9,0xe67,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,
+0x194a,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe73,0xe73,
+0xe6a,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,
+0xe7f,0xe7f,0x118e,0x118e,0xfc,0xfc,0xfc,0xfc,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe82,0xe82,0xe82,
+0xe7f,0xe7f,0xe82,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xfc,0xfc,
+0xfc,0xfc,0xfc,0xfc,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0x118b,0xfc,
+0xfc,0xfc,0xe79,0xe79,0xe88,0xe88,0xe88,0xe88,0xff,0xff,0xff,0xff,0xe88,0xe88,0xe88,0xe88,
+0xe88,0xe88,0xe88,0xe88,0xe85,0xe88,0xe88,0xe88,0xe88,0xe88,0xff,0xff,0xff,0xff,0xff,0xff,
+0xff,0xff,0xff,0xff,0x1542,0x1548,0x1545,0x1890,0x17eb,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x1953,0x1950,
+0x1956,0x1950,0x1956,0x1a16,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,
0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,
-0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0xe91,0xe91,0xe91,0xe8e,
-0xe8e,0xe85,0xe85,0xe8e,0xe8b,0xe8b,0xe8b,0xe8b,0x105,0x105,0x105,0x105,0x12ed,0x12ed,0x12ed,0x12f0,
-0x12f0,0x12f0,0x12e7,0x12e7,0x12ea,0x12e7,0x159,0x159,0x159,0x159,0x159,0x159,0xe94,0xe94,0xe94,0xe94,
-0xe94,0xe94,0x141c,0x141c,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0xe97,0x1356,0x108,0x108,0x108,
-0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x1353,0xc4b,0xc4b,0xc4b,0xc4b,
-0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4e,0xec4,0xeb5,0xeaf,0xec1,
-0xebe,0xeb8,0xeb8,0xec7,0xeb2,0xebb,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0xf48,0xf48,0xf33,0xf48,
-0xf4b,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0x111,0x111,0x111,0x111,0xf42,0xf42,0xf42,0xf42,
-0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf54,0xf54,0xf39,0xf3f,0xf54,0xf54,0xf3c,0xf39,0xf39,0xf39,
-0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,
-0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0x111,0x111,0x111,0x135c,0x1359,0x135c,0x1359,
-0x135c,0x1359,0x135c,0x1359,0x135c,0x1359,0x1422,0x1539,0x1539,0x1539,0x17d3,0x1944,0x1539,0x1539,0x1722,0x1722,
-0x1722,0x171c,0x1722,0x171c,0x1947,0x1944,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,
+0x102,0x102,0x102,0x102,0xeac,0xeac,0xeac,0xea9,0xea9,0xea0,0xea0,0xea9,0xea6,0xea6,0xea6,0xea6,
+0x105,0x105,0x105,0x105,0x1308,0x1308,0x1308,0x130b,0x130b,0x130b,0x1302,0x1302,0x1305,0x1302,0x159,0x159,
+0x159,0x159,0x159,0x159,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0x1437,0x1437,0x108,0x108,0x108,0x108,
+0x108,0x108,0x108,0xeb2,0x1371,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,
+0x108,0x108,0x108,0x136e,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,
+0xc69,0xc69,0xc69,0xc6c,0xedf,0xed0,0xeca,0xedc,0xed9,0xed3,0xed3,0xee2,0xecd,0xed6,0x10b,0x10b,
+0x10b,0x10b,0x10b,0x10b,0xf63,0xf63,0xf4e,0xf63,0xf66,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,
+0x111,0x111,0x111,0x111,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf6f,0xf6f,
+0xf54,0xf5a,0xf6f,0xf6f,0xf57,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf51,
+0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,
+0xf54,0x111,0x111,0x111,0x114,0x114,0x1a1c,0x1a19,0x1a1c,0x1a1c,0x1a1c,0x114,0x114,0x114,0x114,0x114,
0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,
-0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x1536,0x1425,0x1425,0x1359,0x1050,
-0x1050,0x1050,0x1050,0x1050,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,
-0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf60,0xf60,0xf66,0xf66,0x117,0x117,0x117,0x117,
-0x117,0x117,0x117,0x117,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,
-0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf69,0xf69,0xf69,0xf69,0x117f,0x117f,
-0x11a,0x11a,0x11a,0xf6c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,
-0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x1725,0x11d,0x11d,
-0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,
+0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x1551,0x1440,0x1440,0x1374,0x1068,0x1068,0x1068,0x1068,0x1068,
+0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,
+0xf7e,0xf7e,0xf7e,0xf7e,0xf7b,0xf7b,0xf81,0xf81,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,
+0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,
+0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf84,0xf84,0xf84,0xf84,0x1197,0x1197,0x11a,0x11a,0x11a,0xf87,
+0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,
+0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1740,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,
0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,
-0xf78,0xf78,0xf78,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x120,
-0xf75,0xf75,0xf75,0xf75,0x153f,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,
-0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,
-0xf7b,0xf7b,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x123,0x123,0x123,0x123,0x123,0x123,0x123,
-0x1077,0x1077,0x1077,0x1077,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1065,0x1065,0x1065,0x1065,
-0x1065,0x1065,0x1065,0x1065,0x1074,0x1074,0x106b,0x1068,0x126,0x126,0x126,0x107a,0x107a,0x106e,0x106e,0x106e,
-0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x126,0x126,0x126,0x1077,0x1077,0x1077,
-0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,
-0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1095,0x1095,0x129,0x129,0x129,0x129,
-0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,
-0x10bc,0x10bc,0x10bc,0x10bc,0x10b6,0x17d6,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x10c2,0x10c2,
-0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,
-0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,
-0x10d4,0x10d4,0x10da,0x10dd,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x10d7,
-0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10ec,
-0x10ec,0x10e3,0x10e3,0x10ec,0x10ec,0x10e3,0x10e3,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,
-0x10ef,0x10ef,0x10ef,0x10e3,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10e3,0x10ec,0x132,0x132,
-0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x132,0x132,0x10e6,0x10f2,0x10f2,0x10f2,
-0x154e,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,
+0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0xf93,0xf93,0xf93,0x155d,
+0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x120,0xf90,0xf90,0xf90,0xf90,
+0x155a,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0xf96,0xf96,0xf96,0xf96,
+0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0x1965,0x1965,
+0x1965,0x1965,0x1965,0x1965,0x1965,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x108f,0x108f,0x108f,0x108f,
+0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,
+0x108c,0x108c,0x1083,0x1080,0x126,0x126,0x126,0x1092,0x1092,0x1086,0x1086,0x1086,0x1089,0x1089,0x1089,0x1089,
+0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x126,0x126,0x126,0x108f,0x108f,0x108f,0x1095,0x1095,0x1095,0x1095,
+0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x10aa,0x10aa,0x10aa,0x10aa,
+0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10ad,0x10ad,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,
+0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x10d4,0x10d4,0x10d4,0x10d4,
+0x10ce,0x17f1,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x10da,0x10da,0x10d1,0x10d1,0x10d1,0x10d1,
+0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x10f8,0x10f8,0x10f8,0x10f8,
+0x10f8,0x10f8,0x10f8,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10f2,0x10f5,
+0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x10ef,0x1107,0x1107,0x1107,0x1107,
+0x1107,0x1107,0x1107,0x1107,0x1107,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x1104,0x1104,0x10fb,0x10fb,0x1104,
+0x1104,0x10fb,0x10fb,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x1107,0x1107,0x1107,0x10fb,
+0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x10fb,0x1104,0x132,0x132,0x1101,0x1101,0x1101,0x1101,
+0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x132,0x132,0x10fe,0x110a,0x110a,0x110a,0x1569,0x135,0x135,0x135,
0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,
-0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,
-0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10fb,0x138,0x138,
-0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,
-0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x13b,0x13b,0x13b,
-0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,
-0x1101,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,
-0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,
-0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x141,0x141,0x141,0x141,0x141,0x1104,
-0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x144,0x144,0x144,0x144,
-0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,
-0x110d,0x110d,0x110d,0x110d,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,
-0x1185,0x1185,0x1185,0x1185,0x118e,0x1185,0x1185,0x1185,0x118e,0x1185,0x1185,0x1185,0x1185,0x1182,0x14a,0x14a,
-0x118b,0x118b,0x118b,0x118b,0x118b,0x118b,0x118b,0x1191,0x118b,0x1191,0x118b,0x118b,0x118b,0x1191,0x1191,0x14a,
-0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,
-0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,
-0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,
-0x11af,0x11af,0x11af,0x11af,0x11af,0x11ac,0x1197,0x11ac,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x150,
-0x11a0,0x11a9,0x1197,0x11a9,0x11a9,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x11ac,0x11ac,0x11ac,
-0x11ac,0x11ac,0x11ac,0x1197,0x1197,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x150,0x150,0x119a,
-0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x150,0x150,0x150,0x150,0x150,0x150,
-0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x150,0x150,0x150,0x150,0x150,0x150,
-0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11b2,0x11b5,0x11b5,0x11b5,0x11b5,0x11a3,0x11a3,0x150,0x150,
-0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1596,0x1c8,
-0x1302,0x12e1,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12d8,0x12e4,0x12d8,0x12d8,0x12ff,0x12d8,0x12d8,
-0x12d8,0x12d8,0x12de,0x14c4,0x14ca,0x14c7,0x14c7,0x1914,0x16ef,0x16ef,0x153,0x153,0x153,0x153,0x153,0x153,
-0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,
-0x11c1,0x11c1,0x11c4,0x11cd,0x11c7,0x11c7,0x11c7,0x11cd,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x156,
-0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,
-0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x15c,0x15c,0x15c,
-0x11eb,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11e2,0x11f1,0x11f1,0x11df,0x11df,0x11df,0x11df,0x15f,0x12f3,
-0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x15f,0x15f,0x15f,0x15f,0x11df,0x11df,
-0x120f,0x1203,0x120f,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,
-0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x120c,0x120c,0x1212,0x1206,0x1209,
-0x1227,0x1227,0x1227,0x1221,0x1221,0x1218,0x1221,0x1221,0x1218,0x1221,0x1221,0x122a,0x1224,0x121b,0x165,0x165,
-0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x165,0x165,0x165,0x165,0x165,0x165,
-0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x168,0x168,0x168,0x168,0x122d,0x122d,0x122d,0x122d,0x122d,
-0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,
-0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x168,0x168,0x168,0x168,0x1239,0x1239,0x1239,0x1239,
-0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,
-0x1239,0x1239,0x16b,0x1236,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1248,0x1248,0x1248,0x1248,
-0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,
-0x1248,0x1248,0x16e,0x16e,0x16e,0x1242,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x124e,0x124e,0x124e,0x124e,
-0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,
-0x124e,0x124e,0x171,0x171,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x1254,0x1254,0x1254,0x1254,
-0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x174,
-0x174,0x174,0x174,0x174,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x125a,0x125a,0x125a,0x125a,
-0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,
-0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x17a,0x1275,0x1275,0x17d,0x17d,
-0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x1953,0x17d,0x17d,0x14a3,0x14a3,0x14a3,0x14a3,
-0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x12a2,0x12a2,0x12a2,0x12a2,
-0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x155a,0x155a,0x183,0x183,0x183,0x12a2,0x12a2,0x12a2,0x12a2,
-0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x13ad,0x13ad,0x13ad,0x13ad,
-0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x1434,0x1434,0x183,0x183,0x183,0x183,0x13b3,0x13b3,0x13ad,0x13ad,
-0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x12ab,0x13ad,0x12ab,0x12ab,0x13ad,0x13b3,0x12b1,0x1854,0x1854,0x1854,0x1854,
-0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x183,0x183,0x183,0x183,0x183,0x183,0x183,
+0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x1110,0x1110,0x1110,0x1110,
+0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,
+0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1113,0x138,0x138,0x1116,0x1116,0x1116,0x1116,
+0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,
+0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x13b,0x13b,0x13b,0x1119,0x1119,0x1119,0x1119,
+0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x13e,0x13e,0x13e,
+0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x111f,0x111f,0x111f,0x111f,
+0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,
+0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x141,0x141,0x141,0x141,0x141,0x111c,0x1122,0x1122,0x1122,0x1122,
+0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x144,0x144,0x144,0x144,0x1125,0x1125,0x1125,0x1125,
+0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,
+0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x119d,0x119d,0x119d,0x119d,
+0x11a6,0x119d,0x119d,0x119d,0x11a6,0x119d,0x119d,0x119d,0x119d,0x119a,0x14a,0x14a,0x11a3,0x11a3,0x11a3,0x11a3,
+0x11a3,0x11a3,0x11a3,0x11a9,0x11a3,0x11a9,0x11a3,0x11a3,0x11a3,0x11a9,0x11a9,0x14a,0x11ac,0x11ac,0x11ac,0x11ac,
+0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,
+0x11ac,0x11ac,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x11c7,0x11c7,0x11c7,0x11c7,
+0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,
+0x11c7,0x11c4,0x11af,0x11c4,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x150,0x11b8,0x11c1,0x11af,0x11c1,
+0x11c1,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11af,
+0x11af,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x150,0x150,0x11b2,0x11be,0x11be,0x11be,0x11be,
+0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x150,0x150,0x150,0x150,0x150,0x150,0x11be,0x11be,0x11be,0x11be,
+0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x150,0x150,0x150,0x150,0x150,0x150,0x11bb,0x11bb,0x11bb,0x11bb,
+0x11bb,0x11bb,0x11bb,0x11ca,0x11cd,0x11cd,0x11cd,0x11cd,0x11bb,0x11bb,0x150,0x150,0x15b4,0x15b4,0x15b4,0x15b4,
+0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b1,0x1c8,0x131d,0x12f6,0x1314,0x1314,
+0x1314,0x1314,0x1314,0x1314,0x1314,0x12fc,0x12f9,0x12f0,0x12f0,0x131a,0x12f0,0x12f0,0x12f0,0x12f0,0x12ff,0x14df,
+0x14e5,0x14e2,0x14e2,0x192f,0x170a,0x170a,0x1a9d,0x153,0x153,0x153,0x153,0x153,0x11e2,0x11e2,0x11e2,0x11e2,
+0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11d9,0x11d9,0x11dc,0x11e5,
+0x11df,0x11df,0x11df,0x11e5,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x12de,0x12de,0x12de,0x12de,
+0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,
+0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x15c,0x15c,0x15c,0x1203,0x11f7,0x11f7,0x11f7,
+0x11f7,0x11f7,0x11f7,0x11fa,0x1209,0x1209,0x11f7,0x11f7,0x11f7,0x11f7,0x15f,0x130e,0x11fd,0x11fd,0x11fd,0x11fd,
+0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x15f,0x15f,0x15f,0x15f,0x11f7,0x11f7,0x1227,0x121b,0x1227,0x162,
+0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,
+0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x1224,0x1224,0x122a,0x121e,0x1221,0x123f,0x123f,0x123f,0x1239,
+0x1239,0x1230,0x1239,0x1239,0x1230,0x1239,0x1239,0x1242,0x123c,0x1233,0x165,0x165,0x1236,0x1236,0x1236,0x1236,
+0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x165,0x165,0x165,0x165,0x165,0x165,0x1248,0x1248,0x1248,0x1248,
+0x1248,0x1248,0x1248,0x168,0x168,0x168,0x168,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,
+0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,
+0x1245,0x1245,0x1245,0x1245,0x168,0x168,0x168,0x168,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,
+0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x16b,0x124e,
+0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,
+0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x16e,0x16e,
+0x16e,0x125a,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,
+0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x171,0x171,
+0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,
+0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x174,0x174,0x174,0x174,0x174,
+0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,
+0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,
+0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x17a,0x128d,0x128d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,
+0x17d,0x17d,0x17d,0x17d,0x17d,0x196e,0x17d,0x17d,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,
+0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,
+0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x180,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a43,
+0x1a3d,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,
+0x12ba,0x12ba,0x12ba,0x1575,0x1575,0x183,0x183,0x183,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,
+0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,
+0x13c8,0x13c8,0x144f,0x144f,0x1a1f,0x183,0x183,0x183,0x13ce,0x13ce,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,
+0x13c8,0x12c3,0x13c8,0x12c3,0x12c3,0x13c8,0x13ce,0x12c9,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,
+0x186f,0x186f,0x186f,0x186f,0x186f,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,
0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,
-0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x1365,0x1365,
-0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,
-0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x12d2,0x13ce,0x13cb,0x186,0x186,0x186,0x186,0x186,
-0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,
-0x12cc,0x12cc,0x12cf,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,
-0x12cc,0x12cc,0x12cc,0x12cf,0x12cc,0x12cc,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13cb,0x13ce,0x13ce,0x13ce,0x1857,
-0x186,0x186,0x186,0x186,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x186,0x186,0x186,
-0x186,0x186,0x186,0x186,0x13f2,0x13f2,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,
-0x186,0x186,0x186,0x186,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x186,0x186,0x186,0x186,0x186,0x186,
+0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,
+0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,
+0x1380,0x1380,0x1380,0x1380,0x12ea,0x13e9,0x13e6,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,
+0x186,0x186,0x186,0x186,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e7,0x12e4,
+0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e7,
+0x12e4,0x12e4,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e6,0x13e9,0x13e9,0x13e9,0x1872,0x186,0x186,0x186,0x186,
+0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x186,0x186,0x186,0x186,0x186,0x186,0x186,
+0x140d,0x140d,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,
+0x1914,0x1914,0x1914,0x1914,0x1914,0x1914,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,
0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,
-0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x136e,0x136e,0x136e,0x136e,
-0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,
-0x136e,0x136e,0x136e,0x136e,0x136e,0x1368,0x1368,0x1368,0x189,0x189,0x136b,0x189,0x1380,0x1380,0x1380,0x1380,
-0x1380,0x1380,0x1371,0x137a,0x1374,0x1374,0x137a,0x137a,0x137a,0x1374,0x137a,0x1374,0x1374,0x1374,0x137d,0x137d,
-0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x1377,0x1377,0x1377,0x1377,0x18f,0x1383,0x1383,0x1383,
-0x1383,0x1383,0x1383,0x18f,0x18f,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x18f,0x18f,0x1383,0x1383,0x1383,
-0x1383,0x1383,0x1383,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x1383,0x1383,0x1383,0x1383,
-0x1383,0x1383,0x1383,0x18f,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x18f,0x15f6,0x15f6,0x15f6,0x15f6,
-0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x1386,0x1386,0x1386,0x1386,
-0x1386,0x1386,0x1389,0x139b,0x139b,0x138f,0x138f,0x138f,0x138f,0x138f,0x192,0x192,0x192,0x192,0x138c,0x138c,
-0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1392,0x1392,
-0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,
-0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x155d,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,
-0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,
-0x139e,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,
-0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x198,0x198,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,
-0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x1560,0x198,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,
-0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13d7,0x198,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,
-0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,
-0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x198,0x198,
-0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x13ec,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x1575,0x1575,
-0x1575,0x1575,0x1575,0x1578,0x16e6,0x1578,0x1578,0x1578,0x17b2,0x1860,0x1860,0x189c,0x189c,0x19b,0x19b,0x19b,
-0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1575,0x1575,
-0x1575,0x1578,0x1575,0x16e3,0x16e3,0x19b,0x19b,0x19b,0x1578,0x1575,0x1575,0x1578,0x1860,0x1860,0x1860,0x18ff,
-0x18ff,0x19dd,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,
-0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x19e,0x19e,0x19e,0x19e,
-0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x1440,0x157e,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,
-0x1440,0x1440,0x1440,0x1440,0x1440,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x1737,0x1737,0x1a1,0x17e2,0x17e2,
-0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,
-0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1959,0x17df,0x17df,0x17df,0x17df,
-0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x1446,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446,
-0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,
-0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1a4,0x1446,0x1a4,0x1a4,0x1446,
-0x1a4,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1446,
-0x1a4,0x1446,0x1a4,0x1446,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1446,0x1a4,0x1a4,0x1a4,0x1a4,0x1446,
-0x1a4,0x1446,0x1a4,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1a4,0x1446,0x1a4,0x1a4,0x1446,
-0x1a4,0x1446,0x1a4,0x1446,0x1a4,0x1446,0x1a4,0x1446,0x1a4,0x1446,0x1446,0x1a4,0x1446,0x1a4,0x1a4,0x1446,
-0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1446,
-0x1a4,0x1446,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,
-0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,
-0x1446,0x1446,0x1446,0x1446,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446,
-0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,
-0x1446,0x1446,0x1446,0x1446,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,
+0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,
+0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,
+0x1389,0x1383,0x1383,0x1383,0x189,0x189,0x1386,0x189,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x138c,0x1395,
+0x138f,0x138f,0x1395,0x1395,0x1395,0x138f,0x1395,0x138f,0x138f,0x138f,0x1398,0x1398,0x18c,0x18c,0x18c,0x18c,
+0x18c,0x18c,0x18c,0x18c,0x1392,0x1392,0x1392,0x1392,0x18f,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x18f,
+0x18f,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x18f,0x18f,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x18f,
+0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x18f,
+0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x18f,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,
+0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13b6,
+0x13b6,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x192,0x192,0x192,0x192,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,
+0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,
+0x13ad,0x13ad,0x13ad,0x13ad,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,
+0x192,0x192,0x192,0x1578,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,
+0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x195,0x195,0x195,
+0x195,0x195,0x195,0x195,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,
+0x13bc,0x13bc,0x13bc,0x198,0x198,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,
+0x13bc,0x13bc,0x13bc,0x157b,0x198,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,
+0x13bc,0x13bc,0x13bc,0x13f2,0x198,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,
+0x13bc,0x13bc,0x13bc,0x13bc,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,
+0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x198,0x198,0x198,0x198,0x198,0x198,
+0x198,0x198,0x198,0x198,0x1407,0x1404,0x1404,0x1404,0x1404,0x1404,0x1590,0x1590,0x1590,0x1590,0x1590,0x1593,
+0x1701,0x1593,0x1593,0x1593,0x17cd,0x187b,0x187b,0x18b7,0x18b7,0x1a7f,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,
+0x19b,0x19b,0x19b,0x19b,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1590,0x1590,0x1590,0x1593,0x1590,0x16fe,
+0x16fe,0x19b,0x19b,0x19b,0x1593,0x1590,0x1590,0x1593,0x187b,0x187b,0x187b,0x191a,0x191a,0x19f8,0x1a7f,0x19b,
+0x19b,0x19b,0x19b,0x19b,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,
+0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,
+0x19e,0x19e,0x19e,0x19e,0x145b,0x1599,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,
+0x145b,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1752,0x1752,0x1a1,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,
+0x17fd,0x17fd,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,
+0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1974,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,
+0x17fa,0x17fa,0x17fa,0x17fa,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,
+0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,
+0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1a4,0x1461,0x1a4,0x1a4,0x1461,0x1a4,0x1461,0x1461,0x1461,
+0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1a4,0x1461,
+0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1461,0x1a4,0x1a4,0x1a4,0x1a4,0x1461,0x1a4,0x1461,0x1a4,0x1461,
+0x1a4,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1a4,0x1461,0x1a4,0x1a4,0x1461,0x1a4,0x1461,0x1a4,0x1461,
+0x1a4,0x1461,0x1a4,0x1461,0x1a4,0x1461,0x1461,0x1a4,0x1461,0x1a4,0x1a4,0x1461,0x1461,0x1461,0x1461,0x1a4,
+0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1461,
+0x1461,0x1a4,0x1461,0x1a4,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,
+0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,
+0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,
+0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,
+0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,
0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,
-0x1a4,0x1a4,0x1a4,0x1a4,0x1443,0x1443,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,
-0x1a4,0x1a4,0x1a4,0x1a4,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x1449,0x1449,0x1449,0x1449,0x1449,
-0x1458,0x1449,0x144c,0x144c,0x1449,0x1449,0x1449,0x144f,0x144f,0x1a7,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,
-0x1455,0x1455,0x1455,0x1455,0x1452,0x145e,0x145e,0x145e,0x195f,0x195c,0x195c,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,
-0x1a7,0x1a7,0x1a7,0x1a7,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,
-0x1608,0x1608,0x1608,0x1608,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x1467,
-0x1461,0x1461,0x1467,0x1467,0x1470,0x1470,0x146a,0x146d,0x146d,0x1467,0x1464,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,
-0x1aa,0x1aa,0x1aa,0x1aa,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,
-0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1ad,0x1ad,0x1ad,0x1ad,
-0x173a,0x173a,0x1473,0x1473,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,
-0x173a,0x173a,0x173a,0x173a,0x1ad,0x1ad,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,
-0x173a,0x173a,0x173a,0x173a,0x147f,0x147f,0x147f,0x147f,0x147f,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,
-0x1b0,0x1b0,0x1b0,0x1b0,0x147f,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,
-0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,
-0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,
-0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1479,0x1479,0x1479,0x1479,0x1482,0x1482,0x1482,0x1482,0x1482,
-0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1494,0x1497,0x149a,0x149a,0x1497,0x149d,0x149d,0x1488,
-0x148b,0x173d,0x1740,0x1740,0x1740,0x1584,0x1b3,0x1b3,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,
-0x148e,0x148e,0x1581,0x1746,0x1749,0x1743,0x174c,0x174c,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,
-0x14a3,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,
-0x14a0,0x14a0,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,
-0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x12fc,0x12f9,0x12fc,0x12db,0x12f9,0x12ff,0x12ff,0x1302,
-0x12ff,0x1302,0x1305,0x12f9,0x1302,0x1302,0x12f9,0x12f9,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,
-0x14b8,0x14b8,0x14b8,0x14a9,0x14b2,0x14a9,0x14b2,0x14b2,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14b5,0x14ac,
-0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,
-0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x1bf,0x1bf,0x1587,0x1587,0x1587,0x1587,0x1587,0x158d,0x1bf,0x1bf,
-0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x16f2,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,
-0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,
-0x16e9,0x16e9,0x16e9,0x16e9,0x1c5,0x1c5,0x1c5,0x1c5,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,
+0x145e,0x145e,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,
+0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1464,0x1464,0x1464,0x1464,0x1464,0x1473,0x1464,0x1467,0x1467,
+0x1464,0x1464,0x1464,0x146a,0x146a,0x1a7,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,
+0x146d,0x1479,0x1479,0x1479,0x197a,0x1977,0x1977,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,
+0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,
+0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1482,0x147c,0x147c,0x1482,0x1482,
+0x148b,0x148b,0x1485,0x1488,0x1488,0x1482,0x147f,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,
+0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,
+0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x1ad,0x1ad,0x1ad,0x1ad,0x1755,0x1755,0x148e,0x148e,
+0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,
+0x1ad,0x1ad,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,
+0x149a,0x149a,0x149a,0x149a,0x149a,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1b0,0x1b0,0x1b0,0x1b0,0x1a22,
+0x149a,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,
+0x1a25,0x1a25,0x1a25,0x1a25,0x1a25,0x1a25,0x1a25,0x1a25,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1494,
+0x1494,0x1494,0x1494,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,
+0x14af,0x14b2,0x14b5,0x14b5,0x14b2,0x14b8,0x14b8,0x14a3,0x14a6,0x1758,0x175b,0x175b,0x175b,0x159f,0x1b3,0x1b3,
+0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x159c,0x1761,0x1764,0x175e,0x1767,0x1767,
+0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,
+0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,
+0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,
+0x1317,0x1314,0x1317,0x12f3,0x1314,0x131a,0x131a,0x131d,0x131a,0x131d,0x1320,0x1314,0x131d,0x131d,0x1314,0x1314,
+0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14c4,0x14cd,0x14c4,0x14cd,0x14cd,
+0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14d0,0x14c7,0x1a2b,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,
+0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x1bf,0x1bf,
+0x15a2,0x15a2,0x15a2,0x15a2,0x15a2,0x15a8,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,
+0x170d,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,
+0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1c5,0x1c5,0x1c5,0x1c5,
0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,
-0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,
-0x15a5,0x15a5,0x15a5,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,
-0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x15a5,0x15a5,0x15a5,0x15a5,
-0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x1cb,0x1cb,0x15a2,0x159c,0x159f,0x15a8,0x15ab,0x15ab,0x15ab,0x15ab,
-0x15ab,0x15ab,0x15ab,0x15ab,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1593,0x1593,0x1593,0x1593,
-0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x15ae,0x15ae,0x15ae,0x15ae,
-0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,
-0x15ae,0x1962,0x1962,0x1962,0x1962,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,
+0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,
+0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,
+0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1cb,0x1cb,0x1cb,
+0x1cb,0x1cb,0x1cb,0x1cb,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1cb,0x1cb,
+0x15bd,0x15b7,0x15ba,0x15c3,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x1ce,0x1ce,0x1ce,0x1ce,
+0x1ce,0x1ce,0x1ce,0x1ce,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,
+0x15ae,0x15ae,0x15ae,0x15ae,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,
+0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x197d,0x197d,0x197d,0x197d,0x1d1,0x1d1,0x1d1,
+0x1d1,0x1d1,0x1d1,0x1d1,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,
0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,
-0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x174f,0x16f5,0x15b7,0x16fb,0x1d4,0x15c0,0x15c0,0x15c0,
-0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1d4,0x1d4,0x15c0,0x15c0,0x1d4,0x1d4,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,
-0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1d4,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,
-0x15c0,0x1d4,0x15c0,0x15c0,0x1d4,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1d4,0x19ec,0x16f8,0x15c0,0x15b1,0x15b7,
-0x15b1,0x15b7,0x15b7,0x15b7,0x15b7,0x1d4,0x1d4,0x15b7,0x15b7,0x1d4,0x1d4,0x15ba,0x15ba,0x15bd,0x1d4,0x1d4,
-0x1752,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x15b1,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x15c3,0x15c0,0x15c0,
-0x15c0,0x15c0,0x15b7,0x15b7,0x1d4,0x1d4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x1d4,0x1d4,0x1d4,
-0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,
-0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,
-0x15d8,0x15d8,0x1d7,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,
-0x15d2,0x15d2,0x15d2,0x15c6,0x15c6,0x15c6,0x15d2,0x15d2,0x15c6,0x15d5,0x15c9,0x15c6,0x15db,0x15db,0x15cf,0x15db,
-0x15db,0x15cc,0x17e5,0x1d7,0x15ea,0x15ea,0x15ea,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15e1,0x15e4,0x1da,
-0x1da,0x1da,0x1da,0x1da,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x1da,0x1da,
-0x1da,0x1da,0x1da,0x1da,0x1755,0x1755,0x1755,0x1755,0x15f6,0x15f3,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,
-0x1dd,0x1dd,0x1dd,0x1dd,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,
-0x177f,0x177f,0x177f,0x177f,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,
-0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,
-0x1e0,0x1e0,0x1e0,0x1e0,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,
-0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,
-0x1e0,0x1e0,0x1e0,0x1e0,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x1e0,0x1e0,0x1e0,0x1e0,
+0x1d1,0x1d1,0x1d1,0x1d1,0x176a,0x1710,0x15d2,0x1716,0x1d4,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,
+0x15db,0x1d4,0x1d4,0x15db,0x15db,0x1d4,0x1d4,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,
+0x15db,0x15db,0x15db,0x15db,0x15db,0x1d4,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x1d4,0x15db,0x15db,
+0x1d4,0x15db,0x15db,0x15db,0x15db,0x15db,0x1d4,0x1a07,0x1713,0x15db,0x15cc,0x15d2,0x15cc,0x15d2,0x15d2,0x15d2,
+0x15d2,0x1d4,0x1d4,0x15d2,0x15d2,0x1d4,0x1d4,0x15d5,0x15d5,0x15d8,0x1d4,0x1d4,0x176d,0x1d4,0x1d4,0x1d4,
+0x1d4,0x1d4,0x1d4,0x15cc,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x15de,0x15db,0x15db,0x15db,0x15db,0x15d2,0x15d2,
+0x1d4,0x1d4,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x1d4,0x1d4,0x1d4,0x15cf,0x15cf,0x15cf,0x15cf,
+0x15cf,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x15f3,0x15f3,0x15f3,0x15f3,
+0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x1d7,0x15f3,
+0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15ed,0x15ed,0x15ed,0x15e1,
+0x15e1,0x15e1,0x15ed,0x15ed,0x15e1,0x15f0,0x15e4,0x15e1,0x15f6,0x15f6,0x15ea,0x15f6,0x15f6,0x15e7,0x1800,0x1d7,
+0x1605,0x1605,0x1605,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15fc,0x15ff,0x1da,0x1da,0x1da,0x1da,0x1da,
+0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,
+0x1770,0x1770,0x1770,0x1770,0x1611,0x160e,0x1a2e,0x1a2e,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,
+0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,
+0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,
+0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,
+0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,
+0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,
+0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,
0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,
-0x1e0,0x1e0,0x1e0,0x1e0,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,
-0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x15ff,0x1602,0x1605,0x1608,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,
-0x1e3,0x1e3,0x1e3,0x1e3,0x1617,0x1617,0x1617,0x1617,0x1617,0x160b,0x160b,0x1e6,0x1e6,0x1e6,0x1e6,0x160e,
-0x160e,0x160e,0x160e,0x160e,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1611,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,
-0x1e6,0x1e6,0x1e6,0x1e6,0x1620,0x1620,0x1620,0x1620,0x1620,0x1e9,0x1e9,0x161d,0x161d,0x161d,0x161d,0x161d,
-0x161d,0x161d,0x161d,0x161d,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,
-0x1e9,0x1e9,0x1e9,0x1e9,0x1623,0x1635,0x1635,0x1629,0x1632,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,
-0x1ec,0x1ec,0x1ec,0x1ec,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x1ec,0x1ec,
-0x1ec,0x1ec,0x1ec,0x1ec,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,
-0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,
-0x163b,0x163b,0x163b,0x1ef,0x1647,0x1647,0x1647,0x1647,0x1647,0x1641,0x164a,0x1647,0x1647,0x1647,0x1647,0x1647,
-0x1647,0x1647,0x1647,0x1647,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1647,0x1647,
-0x1647,0x1647,0x1647,0x1f2,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,
-0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,
-0x1650,0x1650,0x1650,0x1f5,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,
-0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x1659,0x1659,0x1659,0x1659,0x1659,0x1f8,
-0x1f8,0x1f8,0x1f8,0x1f8,0x1674,0x1674,0x1677,0x1677,0x167a,0x166b,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,
-0x1fb,0x1fb,0x1fb,0x1fb,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1fb,0x166b,
-0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x1fb,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,
-0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1fb,0x1fb,0x1fb,0x1fb,
-0x1fb,0x1674,0x1674,0x1674,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,
-0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1fe,0x1fe,0x1fe,
-0x1fe,0x1fe,0x1fe,0x1fe,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,
-0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x1689,0x1689,0x1689,
-0x1689,0x201,0x201,0x201,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,
-0x16a7,0x16a7,0x16a7,0x168f,0x16a1,0x16a1,0x168f,0x168f,0x168f,0x168f,0x207,0x207,0x16a1,0x16a1,0x16a4,0x16a4,
-0x168f,0x168f,0x16a1,0x1695,0x1692,0x1698,0x16aa,0x16aa,0x169b,0x169b,0x169e,0x169e,0x169e,0x16aa,0x175e,0x175e,
-0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175b,0x175b,0x175b,0x175b,
-0x1758,0x1758,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,
+0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,
+0x1623,0x1623,0x1623,0x161a,0x161d,0x1620,0x1623,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,
+0x1632,0x1632,0x1632,0x1632,0x1632,0x1626,0x1626,0x1e6,0x1e6,0x1e6,0x1e6,0x1629,0x1629,0x1629,0x1629,0x1629,
+0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162c,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,
+0x163b,0x163b,0x163b,0x163b,0x163b,0x1e9,0x1e9,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,
+0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,
+0x163e,0x1650,0x1650,0x1644,0x164d,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,
+0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,
+0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,
+0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1ef,
+0x1662,0x1662,0x1662,0x1662,0x1662,0x165c,0x1665,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,
+0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x1662,0x1662,0x1662,0x1662,0x1662,0x1f2,
+0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,
+0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x1f5,
+0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,
+0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1674,0x1674,0x1674,0x1674,0x1674,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,
+0x168f,0x168f,0x1692,0x1692,0x1695,0x1686,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,
+0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x1fb,0x1686,0x1686,0x1686,0x1686,0x1686,
+0x1686,0x1686,0x1fb,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,
+0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x168f,0x168f,0x168f,
+0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,
+0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,
+0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,
+0x16a7,0x16a7,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x16a4,0x16a4,0x16a4,0x16a4,0x201,0x201,0x201,
+0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16aa,
+0x16bc,0x16bc,0x16aa,0x16aa,0x16aa,0x16aa,0x207,0x207,0x16bc,0x16bc,0x16bf,0x16bf,0x16aa,0x16aa,0x16bc,0x16b0,
+0x16ad,0x16b3,0x16c5,0x16c5,0x16b6,0x16b6,0x16b9,0x16b9,0x16b9,0x16c5,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,
+0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1776,0x1776,0x1776,0x1776,0x1773,0x1773,0x207,0x207,
0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,
-0x207,0x207,0x207,0x207,0x20a,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,
-0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,
-0x20a,0x20a,0x20a,0x20a,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,
-0x20d,0x20d,0x20d,0x20d,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,
-0x16b0,0x16b0,0x16b0,0x16b0,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16b0,0x16b0,0x16b0,0x16b0,
-0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16b0,0x16b0,0x16b0,0x16b0,
-0x16b0,0x16b0,0x16b0,0x16b0,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16b0,0x16b0,0x16b0,0x16b0,
-0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x20d,0x20d,
-0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,
+0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,
+0x20a,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,
+0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,
+0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x20d,0x20d,0x20d,0x20d,
+0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,
+0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,
+0x16cb,0x16cb,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,
+0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,
+0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,
0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,
-0x16b3,0x16c2,0x16b9,0x16b6,0x16c8,0x16c8,0x16bc,0x16c8,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,
-0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x210,0x210,0x210,0x210,0x210,0x210,
-0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,
-0x16cb,0x16cb,0x16cb,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x16d4,
-0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,
-0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1965,0x216,0x216,0x1761,0x1761,0x1761,
-0x176d,0x176d,0x1761,0x1761,0x1761,0x1761,0x176d,0x1761,0x1761,0x1761,0x1761,0x1764,0x216,0x216,0x216,0x216,
-0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x1767,0x1767,0x1773,0x1773,0x1773,0x1767,
-0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,
+0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16ce,0x16dd,0x16d4,0x16d1,
+0x16e3,0x16e3,0x16d7,0x16e3,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x16da,0x16da,0x16da,0x16da,
+0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x210,0x210,0x210,0x210,0x210,0x210,0x16e9,0x16e9,0x16e9,0x16e9,
+0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x213,
+0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x16ef,0x178b,0x178b,0x178b,0x178b,
+0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,
+0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x1980,0x216,0x216,0x177c,0x177c,0x177c,0x1788,0x1788,0x177c,0x177c,
+0x177c,0x177c,0x1788,0x177c,0x177c,0x177c,0x177c,0x177f,0x216,0x216,0x216,0x216,0x1785,0x1785,0x1785,0x1785,
+0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1782,0x1782,0x178e,0x178e,0x178e,0x1782,0x1791,0x1791,0x1791,0x1791,
+0x1791,0x1791,0x1791,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,
0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,
-0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,
-0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x21f,0x1788,0x1788,0x21f,0x21f,
-0x21f,0x21f,0x21f,0x1785,0x1785,0x1785,0x1785,0x1785,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x222,
-0x178b,0x222,0x178b,0x178b,0x178b,0x178b,0x222,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,
-0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x222,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,
-0x178b,0x178e,0x222,0x222,0x222,0x222,0x222,0x222,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,
-0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,
-0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x225,0x225,0x225,0x225,0x225,
-0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,
-0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x225,0x225,0x225,0x225,0x225,
-0x225,0x225,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x189f,0x189f,0x189f,0x189f,0x189f,0x189f,0x189f,0x189f,
-0x189f,0x189f,0x189f,0x189f,0x228,0x228,0x228,0x228,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,
-0x17bb,0x1869,0x1869,0x1869,0x1869,0x1866,0x1869,0x1905,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1869,0x1866,
-0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1869,0x1905,0x1905,0x1869,0x1869,0x1869,0x1869,0x1869,
-0x1869,0x1869,0x1866,0x1863,0x1866,0x1869,0x1869,0x228,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,
-0x1902,0x1902,0x1902,0x1902,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x228,0x228,0x19e0,0x19e0,0x19e0,0x19e0,0x228,
-0x228,0x228,0x19e0,0x228,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x228,0x228,0x228,0x228,0x228,
-0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x19e3,0x19e3,0x19e3,0x19e3,0x19e0,0x19e6,0x19e6,0x19e0,
-0x19e6,0x19e6,0x228,0x228,0x228,0x228,0x228,0x228,0x17b8,0x19e0,0x19e0,0x228,0x228,0x228,0x228,0x228,
-0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x1902,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,
-0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1902,0x1902,0x179d,0x179d,0x179d,0x179d,0x179a,0x179d,0x179d,0x17a0,
-0x17a3,0x17a0,0x17a0,0x179d,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,
-0x22b,0x22b,0x22b,0x179a,0x179a,0x179a,0x179a,0x179a,0x17f7,0x17f7,0x17f7,0x17f7,0x17ee,0x17ee,0x17ee,0x17e8,
-0x17eb,0x17eb,0x17eb,0x22e,0x22e,0x22e,0x22e,0x22e,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,
-0x17f4,0x17f4,0x22e,0x22e,0x22e,0x22e,0x17f1,0x17f1,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,
-0x1812,0x231,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,
-0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x180f,0x17fd,0x17fd,0x17fd,0x17fd,
-0x17fd,0x17fd,0x17fd,0x231,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x180f,0x1800,0x1812,0x1815,0x1815,0x1809,
-0x1806,0x1806,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x180c,0x180c,0x180c,0x180c,
-0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,
-0x1803,0x1803,0x1803,0x1803,0x1803,0x231,0x231,0x231,0x1821,0x1824,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,
-0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,
-0x1818,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,
-0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x237,
-0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,
-0x181b,0x237,0x237,0x181b,0x181b,0x181b,0x181b,0x181b,0x186c,0x1908,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,
+0x219,0x219,0x219,0x219,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,
+0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x21f,0x17a3,0x17a3,0x21f,0x21f,0x21f,0x21f,0x21f,0x17a0,
+0x17a0,0x17a0,0x17a0,0x17a0,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x222,0x17a6,0x222,0x17a6,0x17a6,
+0x17a6,0x17a6,0x222,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,
+0x17a6,0x17a6,0x222,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a9,0x222,0x222,
+0x222,0x222,0x222,0x222,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,
+0x1608,0x1608,0x1608,0x1608,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,
+0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,
+0x225,0x225,0x225,0x225,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,
+0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x17ac,0x17ac,
+0x17ac,0x17ac,0x17ac,0x17ac,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,
+0x228,0x1a85,0x1a85,0x1a88,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d6,0x1884,0x1884,0x1884,
+0x1884,0x1884,0x1884,0x1920,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,
+0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x1a85,0x228,0x19fb,0x19fb,0x19fb,0x19fb,0x228,0x228,0x228,0x19fb,0x1a85,
+0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x228,0x228,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x228,
+0x228,0x228,0x1a85,0x1a85,0x19fe,0x19fe,0x19fe,0x19fe,0x19fb,0x1a01,0x1a01,0x19fb,0x1a01,0x1a01,0x1a85,0x1a88,
+0x1a85,0x1a85,0x1a85,0x1a85,0x17d3,0x19fb,0x19fb,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x228,
+0x228,0x1a88,0x1a88,0x1a88,0x191d,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,
+0x1920,0x1920,0x191d,0x191d,0x17b8,0x17b8,0x17b8,0x17b8,0x17b5,0x17b8,0x17b8,0x17bb,0x17be,0x17bb,0x17bb,0x17b8,
+0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x17b5,
+0x17b5,0x17b5,0x17b5,0x17b5,0x1812,0x1812,0x1812,0x1812,0x1809,0x1809,0x1809,0x1803,0x1806,0x1806,0x1806,0x1a31,
+0x22e,0x22e,0x22e,0x22e,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x22e,0x22e,
+0x22e,0x22e,0x180c,0x180c,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x231,0x182d,0x182d,
+0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,
+0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182a,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x231,
+0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x182a,0x181b,0x182d,0x1830,0x1830,0x1824,0x1821,0x1821,0x231,0x231,
+0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,
+0x1827,0x1827,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,
+0x181e,0x231,0x231,0x231,0x183c,0x183f,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,
+0x1845,0x1845,0x1845,0x1845,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x234,0x234,0x234,
+0x234,0x234,0x234,0x234,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,
+0x199e,0x199e,0x199e,0x199e,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x237,0x1836,0x1836,0x1836,0x1836,
+0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x237,0x237,0x1836,
+0x1836,0x1836,0x1836,0x1836,0x1887,0x1923,0x1a8b,0x1a8e,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,
0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,
-0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,
-0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x23d,0x23d,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,
-0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x23d,0x1827,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,
-0x181e,0x1827,0x181e,0x181e,0x1827,0x181e,0x181e,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,
-0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x240,0x240,0x240,
-0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,
-0x1845,0x1845,0x1836,0x1830,0x1830,0x1845,0x1833,0x1848,0x1848,0x1848,0x1848,0x184b,0x184b,0x183f,0x183c,0x1839,
-0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x243,0x183f,0x243,0x1839,0x1968,0x243,
+0x23a,0x23a,0x23a,0x23a,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,
+0x1845,0x1845,0x1845,0x1845,0x23d,0x23d,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,
+0x1839,0x1839,0x1839,0x1839,0x23d,0x1842,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1842,0x1839,0x1839,
+0x1842,0x1839,0x1839,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x1848,0x1848,0x1848,0x1848,
+0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x240,0x240,0x240,0x240,0x240,0x240,0x240,
+0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x1860,0x1860,0x1851,0x184b,
+0x184b,0x1860,0x184e,0x1863,0x1863,0x1863,0x1863,0x1866,0x1866,0x185a,0x1857,0x1854,0x185d,0x185d,0x185d,0x185d,
+0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x243,0x185a,0x243,0x1854,0x1983,0x1a34,0x243,0x243,0x243,0x243,
0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,
-0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,
-0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,
-0x1851,0x1851,0x1851,0x1851,0x246,0x246,0x246,0x246,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,
-0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,
-0x184e,0x184e,0x184e,0x184e,0x246,0x246,0x246,0x246,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,
-0x186f,0x186f,0x186f,0x186f,0x186f,0x19e9,0x19e9,0x19e9,0x19e9,0x19e9,0x249,0x249,0x249,0x249,0x249,0x249,
-0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,
-0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x24c,0x24c,0x24c,0x24c,0x24c,
-0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,
-0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,
-0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x24f,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x252,
-0x18ae,0x18ae,0x252,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,
-0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x252,
-0x252,0x252,0x18a2,0x252,0x18a2,0x18a2,0x252,0x18a2,0x18a2,0x18a2,0x18a5,0x18a2,0x18a8,0x18a8,0x18b1,0x18a2,
-0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x18ab,0x18ab,0x18ab,0x18ab,0x18ab,0x18ab,0x18ab,0x18ab,
-0x18ab,0x18ab,0x252,0x252,0x252,0x252,0x252,0x252,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,
-0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,
-0x1911,0x1911,0x1911,0x1911,0x255,0x255,0x255,0x255,0x18c9,0x18c9,0x18c9,0x18c9,0x258,0x258,0x18cc,0x18cc,
-0x18cc,0x18cc,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18c6,
-0x18b7,0x18ba,0x18bd,0x18cf,0x18cf,0x196b,0x18c0,0x18c0,0x18de,0x18e1,0x18f0,0x18f0,0x18e1,0x18e4,0x18de,0x18db,
-0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x18c9,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18c6,
-0x18c6,0x18b4,0x18b4,0x18b4,0x18c9,0x18c9,0x18c9,0x18c9,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,
-0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,
-0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,
-0x1980,0x1980,0x1980,0x1980,0x197d,0x197d,0x197d,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,
-0x197d,0x1977,0x1974,0x197a,0x264,0x264,0x264,0x264,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,
-0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,
-0x1983,0x1983,0x1983,0x267,0x267,0x1983,0x1983,0x1983,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x26a,0x1992,
-0x1992,0x26a,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,
-0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x198f,0x198f,0x198f,0x198f,0x198f,0x26a,
-0x1986,0x1986,0x26a,0x198f,0x198f,0x1986,0x198f,0x1989,0x1992,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,
-0x199b,0x199b,0x199e,0x199e,0x1995,0x1995,0x1995,0x1995,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,
-0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,
-0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a4,0x19a1,0x19a1,0x19a1,
-0x19a4,0x19a1,0x19a1,0x19a1,0x19a1,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,
+0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x186c,0x186c,0x186c,0x186c,
+0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,
+0x246,0x246,0x246,0x246,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,
+0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,
+0x246,0x246,0x246,0x246,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,
+0x188a,0x1a04,0x1a04,0x1a04,0x1a04,0x1a04,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x249,0x249,0x249,0x249,
+0x249,0x249,0x249,0x249,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,
+0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,
+0x24c,0x24c,0x24c,0x24c,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,
+0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,
+0x1929,0x1929,0x1929,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,
+0x24f,0x24f,0x24f,0x24f,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,
+0x291,0x291,0x291,0x291,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x252,0x18c9,0x18c9,0x252,0x18c9,
+0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,
+0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x252,0x252,0x252,0x18bd,0x252,
+0x18bd,0x18bd,0x252,0x18bd,0x18bd,0x18bd,0x18c0,0x18bd,0x18c3,0x18c3,0x18cc,0x18bd,0x252,0x252,0x252,0x252,
+0x252,0x252,0x252,0x252,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x252,0x252,
+0x252,0x252,0x252,0x252,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,
+0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,
+0x255,0x255,0x255,0x255,0x18f9,0x18fc,0x190b,0x190b,0x18fc,0x18ff,0x18f9,0x18f6,0x25e,0x25e,0x25e,0x25e,
+0x25e,0x25e,0x25e,0x25e,0x18e4,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18e1,0x18e1,0x18cf,0x18cf,0x18cf,
+0x18e4,0x18e4,0x18e4,0x18e4,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,
+0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,
+0x261,0x261,0x261,0x261,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,
+0x1989,0x1989,0x261,0x261,0x1a9a,0x1a9a,0x1a9a,0x1a9a,0x294,0x294,0x294,0x294,0x1a9a,0x1a9a,0x1a9a,0x294,
+0x294,0x294,0x294,0x294,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,
+0x1998,0x1998,0x1998,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x1998,0x1992,0x198f,0x1995,
+0x264,0x264,0x264,0x264,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,
+0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x267,
+0x267,0x199e,0x199e,0x199e,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x26a,0x19ad,0x19ad,0x26a,0x19ad,0x19ad,
0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,
-0x19ad,0x19ad,0x19ad,0x19a7,0x19a7,0x19aa,0x19aa,0x19b0,0x19b0,0x273,0x273,0x273,0x273,0x273,0x273,0x273,
-0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,
-0x19b3,0x19b3,0x19b3,0x19b3,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,
-0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,
-0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b9,0x19c2,0x19b6,0x19b6,0x279,0x279,0x279,0x279,0x279,
-0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c8,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,
+0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19aa,0x19aa,0x19aa,0x19aa,0x19aa,0x26a,0x19a1,0x19a1,0x26a,0x19aa,
+0x19aa,0x19a1,0x19aa,0x19a4,0x19ad,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x19b6,0x19b6,0x19b9,0x19b9,
+0x19b0,0x19b0,0x19b0,0x19b0,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x19b3,0x19b3,0x19b3,0x19b3,
+0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x19bc,0x19bc,0x19bc,0x19bc,
+0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bf,0x19bc,0x19bc,0x19bc,0x19bf,0x19bc,0x19bc,0x19bc,
+0x19bc,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x19c8,0x19c8,0x19c8,0x19c8,
+0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c2,
+0x19c2,0x19c5,0x19c5,0x19cb,0x19cb,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x19ce,0x19ce,0x19ce,0x19ce,
+0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,
+0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x19d1,0x19d1,0x19d1,0x19d1,
0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,
-0x19d1,0x19d1,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19ce,0x19ce,0x19ce,
-0x19ce,0x19d4,0x19d4,0x19d4,0x19d4,0x19d4,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x282,0x282,0x282,0x282,
-0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,
-0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x190b,0x29d,0x29d,0x29d,
-0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x282,0x282,0x282,0x282,
-0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,
-0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x954,0x954,0xb1f,0xb1f,0xb1f,0xb1f,
-0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,
-0xb1f,0xb1f,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x18f6,0x18f6,0x18f6,0x18f6,
-0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x19da,0x19da,0x19da,0x19da,0x19da,0x288,0x288,0x288,0x288,
-0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0xc78,0xc78,0xc78,0xc78,
-0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0x12c0,0x12c0,0x12c0,0x28b,0x28b,0xeac,0xeac,0xeac,0xeac,
-0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,
-0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,
-0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,
-0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,
-0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0x28e,
-0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,
-0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,
-0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0x291,0x291,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,
-0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x294,0x294,0x294,
-0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,
-0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,
-0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x297,0x297,0x17b5,0x17b5,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,
-0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,
-0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x1131,0x396,0x396,0x3a2,0xcba,0x3a5,0x3a5,0x3a5,
-0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,
-0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a2,0x396,0x396,0x396,0x396,0x396,0x396,0x396,
-0x396,0x3a2,0x3a2,0x3a2,0x3a2,0x39c,0x1134,0x1317,0x3a5,0x921,0x924,0x399,0x399,0x1131,0x1314,0x1314,
-0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a5,0x3a5,0x396,0x396,0x8ac,0x8af,0x93f,0x93f,
-0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x39f,0xf93,0xf90,0x131a,0x131a,0x131a,0x131a,0x131a,
-0x14df,0x1137,0x1137,0xee5,0xee5,0xdb3,0xee5,0xee5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,
-0x3a5,0x3a8,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a8,0x3a5,0x3a5,0x3a8,0x3a5,0x3a5,0x3a5,
-0x3a5,0x3a5,0x1314,0x1317,0x399,0x3a5,0x3a2,0x3a2,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,
-0x447,0x1320,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,
-0x447,0x447,0x1320,0x1887,0x1887,0xfb1,0x438,0x441,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,
-0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0xba0,
-0xba0,0xdbf,0xdbf,0x8b2,0xdc2,0x1401,0x1401,0x1401,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,
-0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,
-0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x48c,0x48c,0x48c,0x114c,0x114c,0x114c,0x114c,0x114c,
-0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,
-0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,
-0x489,0x489,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x48f,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,
-0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,
-0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x498,0x492,0x498,0x492,
-0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,
-0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x492,0x492,
-0x492,0x492,0x495,0x996,0xfe1,0xfe1,0xfe4,0xfe1,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,
-0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,
-0x498,0x492,0xfe4,0xfe1,0xfe4,0xfe1,0xfe4,0xfe1,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,
-0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,
-0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x687,0x687,0x68a,0x4c2,0x696,0x693,0x693,0x690,
-0x4ec,0x4ec,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0xac8,0x699,0x4ce,0x6b1,0x6b4,0x4e3,0x699,0x4d1,0x4d1,
-0x4c2,0x4dd,0x4dd,0x687,0x4e9,0x4e6,0x68d,0x4bc,0x4b3,0x4b3,0x4b6,0x4b6,0x4b6,0x4b6,0x4b6,0x4b9,
-0x4b6,0x4b6,0x4b6,0x4ad,0x4f5,0x4f2,0x4ef,0x4ef,0x6a5,0x4d7,0x4d4,0x6a2,0x69f,0x69c,0x6ae,0x4c5,
-0x6ab,0x6ab,0x4da,0x4dd,0x6a8,0x6a8,0x4da,0x4dd,0x4bf,0x4c2,0x4c2,0x4c2,0x4e0,0x4cb,0x4c8,0xbb5,
-0xace,0xad1,0xacb,0xacb,0xacb,0xacb,0xbac,0xbac,0xbac,0xbac,0xbb2,0xce7,0xce4,0xdce,0xdd1,0xbaf,
-0xdd1,0xdd1,0xdd1,0xdd1,0xdce,0xdd1,0xdd1,0xba9,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x516,
-0x51c,0x735,0x519,0x999,0x9ba,0xad4,0xad4,0xad4,0xbbb,0xbbb,0xdd7,0xdd7,0xdd7,0xdd7,0x1155,0x1158,
-0x1158,0x1335,0x14cd,0x14f7,0x14fa,0x14fa,0x170d,0x188a,0x528,0x528,0x540,0x6c3,0x525,0x6c0,0x528,0x53d,
-0x525,0x6c3,0x537,0x540,0x540,0x540,0x537,0x537,0x540,0x540,0x540,0x6cc,0x525,0x540,0x6c6,0x525,
-0x534,0x540,0x540,0x540,0x540,0x540,0x525,0x525,0x52b,0x6c0,0x6c9,0x525,0x540,0x525,0x6cf,0x525,
-0x540,0x52e,0x546,0x6d2,0x540,0x540,0x531,0x537,0x540,0x540,0x543,0x540,0x537,0x53a,0x53a,0x53a,
-0x53a,0xae0,0xadd,0xcea,0xde0,0xbd0,0xbd3,0xbd3,0xbcd,0xbca,0xbca,0xbca,0xbca,0xbd3,0xbd0,0xbd0,
-0xbd0,0xbd0,0xbc7,0xbca,0xddd,0xef1,0xef4,0xfea,0x115b,0x115b,0x115b,0x6d8,0x6d5,0x549,0x54c,0x54c,
-0x54c,0x54c,0x54c,0x6d5,0x6d8,0x6d8,0x6d5,0x54c,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,
-0x6de,0x6de,0x6de,0x6de,0x555,0x555,0x555,0x555,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,
-0x6db,0x6db,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,
-0x558,0x561,0x561,0x55b,0x55b,0x55b,0x55e,0x558,0x55b,0x55b,0x558,0x558,0x558,0x558,0x55b,0x55b,
-0x6e1,0x6e1,0x558,0x558,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,
-0x55b,0x55e,0x55e,0x55e,0x55b,0x55b,0x6e4,0x55b,0x6e4,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,
-0x558,0x55b,0x558,0x558,0x558,0x558,0x558,0x558,0x55b,0x55b,0x558,0x6e1,0x558,0x558,0x558,0xae6,
-0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,
-0xbd6,0xbd6,0xbd6,0xbd6,0x6ea,0x564,0x6ea,0x6ea,0x567,0x564,0x564,0x6ea,0x6ea,0x567,0x564,0x6ea,
-0x567,0x564,0x564,0x6ea,0x564,0x6ea,0x573,0x570,0x564,0x6ea,0x564,0x564,0x564,0x564,0x6ea,0x564,
-0x564,0x6ea,0x6ea,0x6ea,0x6ea,0x564,0x564,0x6ea,0x567,0x6ea,0x567,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,
-0x6f0,0x56a,0x6ea,0x56a,0x56a,0x564,0x564,0x564,0x6ea,0x6ea,0x6ea,0x6ea,0x564,0x564,0x564,0x564,
-0x6ea,0x6ea,0x564,0x564,0x564,0x567,0x564,0x564,0x567,0x564,0x564,0x567,0x6ea,0x567,0x564,0x564,
-0x6ea,0x564,0x564,0x564,0x564,0x564,0x6ea,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,
-0x564,0x564,0x564,0x564,0x6ed,0x6ea,0x567,0x564,0x6ea,0x6ea,0x6ea,0x6ea,0x564,0x564,0x6ea,0x6ea,
-0x564,0x567,0x6ed,0x6ed,0x567,0x567,0x564,0x564,0x567,0x567,0x564,0x564,0x567,0x567,0x564,0x564,
-0x564,0x564,0x564,0x564,0x567,0x567,0x6ea,0x6ea,0x567,0x567,0x6ea,0x6ea,0x567,0x567,0x564,0x564,
-0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x6ea,0x564,0x564,0x564,0x6ea,0x564,0x564,
-0x564,0x564,0x564,0x564,0x564,0x6ea,0x564,0x564,0x564,0x564,0x564,0x564,0x567,0x567,0x567,0x567,
-0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x6ea,
-0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,
-0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,
-0x567,0x567,0x567,0x567,0x564,0x564,0x564,0x564,0x564,0x564,0x567,0x567,0x567,0x567,0x564,0x56d,
-0x564,0x564,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,
-0x576,0xae9,0x576,0x576,0x576,0x576,0x576,0x576,0x582,0x57f,0x582,0x57f,0x576,0x576,0x576,0x576,
-0x576,0x576,0x6f3,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x7f8,0x7f8,0x576,0x576,0x576,0x576,
-0x57c,0x57c,0x576,0x576,0x576,0x576,0x576,0x576,0x579,0x7fe,0x7fb,0x576,0x576,0x576,0x576,0x576,
-0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,
-0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0xae9,
-0xbdf,0xae9,0xae9,0xae9,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,
-0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,
-0x585,0x585,0x585,0x585,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x58b,0xc48,
-0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,
-0xc48,0xc48,0xc48,0xd62,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,
-0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x58e,0x591,0x591,0x591,0x591,0x591,0x591,0x591,
-0x591,0x591,0x591,0x591,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,
-0x591,0x591,0x591,0x591,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,
-0x705,0x705,0x705,0x705,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,
-0x708,0x708,0x708,0x708,0x594,0x594,0x708,0x708,0x708,0x708,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,
-0xbe2,0xbe2,0xbe2,0xbe2,0x70e,0x70e,0x597,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x59a,0x59a,
-0x597,0x597,0x59d,0x59d,0x59d,0x59d,0x70e,0x70e,0x59d,0x59d,0x711,0x70e,0x597,0x597,0x597,0x597,
-0x70e,0x70e,0x59d,0x59d,0x711,0x70e,0x597,0x597,0x597,0x597,0x70e,0x70e,0x70b,0x597,0x59d,0x70e,
-0x597,0x597,0x70b,0x70e,0x70e,0x70e,0x59d,0x59d,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,
-0x597,0x597,0x597,0x597,0x597,0x597,0x70e,0x70b,0x70e,0x70b,0x597,0x59d,0x59d,0x59d,0x59d,0x59d,
-0x59d,0x597,0x597,0x70b,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xbe5,0xbe5,0xbe5,0xbe8,
-0xbe8,0xc63,0xc63,0xbe5,0x5ac,0x5ac,0x5ac,0x5ac,0x5a9,0x723,0x720,0x5a3,0x5a3,0x714,0x5a3,0x5a3,
-0x5a3,0x5a3,0x71a,0x714,0x5a3,0x5a9,0x5a3,0x5a0,0xd6b,0xd6b,0xbee,0xbee,0xdec,0xaf5,0x5a6,0x5a6,
-0x717,0x5af,0x717,0x5a6,0x5a9,0x5a3,0x5a9,0x5a9,0x5a3,0x5a3,0x5a9,0x5a3,0x5a3,0x5a3,0x5a9,0x5a3,
-0x5a3,0x5a3,0x5a9,0x5a9,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a9,0x5ac,0x5ac,0x5a6,
-0x5a3,0x5a3,0x5a3,0x5a3,0x726,0x5a3,0x726,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x801,0x801,0x801,0x801,
-0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,
-0x5a3,0x5a3,0x5a3,0x5a9,0x726,0x723,0x5b2,0x726,0x714,0x71a,0x5a9,0x714,0x71d,0x714,0x714,0x5a3,
-0x714,0x723,0x5b2,0x723,0xaf5,0xaf5,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf4,
-0xbf1,0xbf1,0xde9,0xea3,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,
-0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b8,0x13bf,0x13bf,0x13bf,0x5b8,0x5b8,0x5b8,0x5b8,
-0x5b8,0x5b8,0x5b8,0x5b8,0x1503,0x5c4,0x5cd,0x5c4,0x5c4,0x13bf,0x5b8,0x5b8,0x5cd,0x5cd,0x13c2,0x13c2,
-0x5d0,0x5d0,0x5c1,0x5c7,0x5c1,0x5c1,0x5c7,0x5b8,0x5c7,0x5b8,0x5c7,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,
-0x5b8,0x5c7,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x13bf,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,
-0x5b8,0x5b8,0x5b8,0x5c7,0x5c7,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x72c,0x5b8,0x5b8,
-0x5b8,0x5b8,0x5b8,0x5b8,0x5c7,0x5b8,0x5b8,0x5c7,0x5b8,0x5b8,0x5b8,0x5b8,0x13bf,0x5b8,0x13bf,0x5b8,
-0x5b8,0x5b8,0x5b8,0x13bf,0x13bf,0x13bf,0x5b8,0x12ba,0x5b8,0x5b8,0x5b8,0x5be,0x5be,0x5be,0x5be,0x1341,
-0x1341,0x5b8,0x5bb,0x5ca,0x5cd,0x5c1,0x5c1,0x5c1,0xbfa,0xbf7,0xbfa,0xbf7,0xbfa,0xbf7,0xbfa,0xbf7,
-0xbfa,0xbf7,0xbfa,0xbf7,0xbfa,0xbf7,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,
-0x5b8,0x5c7,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,
-0x13bf,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x13bf,
-0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f4,0x5f4,0x5f4,
-0x5f4,0x5f4,0x5f4,0x5f4,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5f1,0x5f7,0x5e8,0x5eb,
-0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,
-0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5ee,0x5ee,
-0x5ee,0x5ee,0x5ee,0x5ee,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,
-0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,
-0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,
-0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,
-0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,
-0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f7,0x5f1,0x5f4,0x5fa,
-0x5f7,0x5f1,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f7,0x5f1,0x1344,0x1344,
-0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x5f7,0x5f1,0x5f7,0x5f1,
-0x5f7,0x5f1,0x5f4,0x5fa,0x5f4,0x5fa,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,
-0x5f7,0x5f1,0x5f7,0x5f1,0x5f4,0x5f7,0x5f1,0x5f4,0x5f7,0x5f1,0x5f4,0x5fa,0x5f1,0x5f1,0x5f1,0x5f1,
-0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,
-0x5f1,0x5f1,0x5f1,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f7,0x5f7,0x5f7,0x5f7,
-0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f1,0x5f1,0x5f1,
-0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f4,0x5f4,0x5f1,0x5f4,
-0x5f1,0x5f4,0x5f1,0x5f1,0x5f4,0x5f1,0x5f1,0x5f4,0x5f1,0x5f4,0x5f1,0x5f1,0x5f4,0x5f1,0x5f4,0x5f4,
-0x5f1,0x5f1,0x5f1,0x5f4,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f4,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,
-0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,
-0x5f4,0x5f4,0x5f1,0x5f1,0x5f4,0x5f1,0x5f4,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f4,0x5f4,0x5f4,0x5f4,
-0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,
-0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5fa,
-0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,
-0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,
-0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,
-0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,
-0x5fd,0x5fd,0x5fd,0x5fd,0xff6,0xff6,0xff6,0x1506,0x1506,0x1506,0x1506,0x1506,0x1506,0x1506,0x1713,0x1713,
-0x85e,0x864,0x864,0x870,0x870,0x861,0x858,0x861,0x858,0x861,0x858,0x861,0x858,0x861,0x858,0x861,
-0x60c,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x60c,
-0x606,0x609,0x60f,0x60c,0x606,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,
-0x60f,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,
-0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,
-0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,0x6f9,0x6f9,0x6f9,0x6f9,
-0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,
-0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,
-0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,
-0x6f6,0x6f6,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x702,0x6ff,
-0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6fc,0x6fc,0x6fc,0x6fc,
-0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x705,0x705,0x705,0x705,
-0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,
-0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x72f,0x72f,0x72f,0x72f,
-0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,
-0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0xc51,0x8c4,0x8be,0x8bb,
-0x8c1,0x8b8,0x744,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x8ca,0x744,0x744,0x744,
-0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,
-0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x8c7,0x8c7,
-0x74a,0x8d9,0x8dc,0x8e2,0x804,0x810,0x8f7,0x80d,0x8d0,0x8cd,0x8d0,0x8cd,0x8d6,0x8d3,0x8d6,0x8d3,
-0x8d0,0x8cd,0x80a,0x8e2,0x8d0,0x8cd,0x8d0,0x8cd,0x8d0,0x8cd,0x8d0,0x8cd,0x8e5,0x8ee,0x8eb,0x8eb,
-0x750,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,
-0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x753,0x76e,0x74d,0x774,0x777,
-0x771,0x789,0x789,0x789,0x789,0x789,0x789,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,
-0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x753,0x76e,0x74d,0x76e,0xc54,
-0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,
-0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,
-0x7f2,0x7f2,0x12b4,0x12b4,0x12b4,0x12b4,0x12b4,0x7f5,0x80a,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,
-0x80d,0x80d,0x92d,0x92d,0x92d,0x92d,0x813,0x813,0x8e8,0x8f4,0x8f4,0x8f4,0x8f4,0x8f1,0x807,0x8df,
-0xb19,0xb19,0xb19,0xc66,0xc84,0xc81,0xb34,0x8b5,0x819,0x816,0x819,0x81c,0x816,0x819,0x816,0x819,
-0x816,0x819,0x816,0x816,0x816,0x816,0x816,0x816,0x819,0x819,0x816,0x819,0x819,0x816,0x819,0x819,
-0x816,0x819,0x819,0x816,0x819,0x819,0x816,0x816,0xc87,0x82b,0x825,0x82b,0x825,0x82b,0x825,0x82b,
-0x825,0x82b,0x825,0x825,0x828,0x825,0x828,0x825,0x828,0x825,0x828,0x825,0x828,0x825,0x828,0x825,
-0x828,0x825,0x828,0x825,0x828,0x825,0x828,0x825,0x828,0x825,0x828,0x82b,0x825,0x828,0x825,0x828,
-0x825,0x828,0x825,0x825,0x825,0x825,0x825,0x825,0x828,0x828,0x825,0x828,0x828,0x825,0x828,0x828,
-0x825,0x828,0x828,0x825,0x828,0x828,0x825,0x825,0x825,0x825,0x825,0x82b,0x825,0x82b,0x825,0x82b,
-0x825,0x825,0x825,0x825,0x825,0x825,0x82b,0x825,0x825,0x825,0x825,0x825,0x828,0x82b,0x82b,0x828,
-0x828,0x828,0x828,0x8fd,0x900,0x82e,0x831,0xc6f,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,
-0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,
-0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x83a,0x837,0x837,0x837,0x837,0x837,0x837,0x837,
-0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,
-0x837,0x837,0x837,0x837,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,
-0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,
-0xd74,0xd74,0xea6,0x83d,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,
-0xd6e,0xd6e,0xd6e,0xd6e,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,
-0x846,0x846,0x846,0x846,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,
-0x912,0x912,0x912,0x912,0x912,0x849,0x849,0x849,0x849,0x849,0x849,0xd77,0xd77,0xd77,0xd77,0x915,
-0x915,0x915,0x915,0x915,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,
-0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,
-0x849,0x849,0x849,0x849,0x849,0x849,0xd77,0xd77,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,
-0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,
-0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,
-0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,
-0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,
-0x84f,0x84f,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,
-0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0x1119,0x1119,0x1119,0x1119,0x852,0x852,0x852,0x852,
+0x19d1,0x19d1,0x19d1,0x19d4,0x19dd,0x19d1,0x19d1,0x279,0x279,0x279,0x279,0x279,0x19e0,0x19e0,0x19e0,0x19e0,
+0x19e0,0x19e0,0x19e0,0x19e3,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x19ec,0x19ec,0x19ec,0x19ec,
+0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19e6,0x19e6,
+0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e9,0x19e9,0x19e9,0x19e9,0x19ef,0x19ef,0x19ef,
+0x19ef,0x19ef,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,
+0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x285,
+0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,
+0x288,0x288,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,
+0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a52,0x1a52,0x1a52,0x1a49,0x1a49,0x1a49,0x1a49,
+0x288,0x288,0x1a49,0x1a49,0x1a52,0x1a52,0x1a52,0x1a52,0x1a4c,0x1a55,0x1a4f,0x1a55,0x1a52,0x288,0x288,0x288,
+0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,
+0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,
+0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x28b,0x28b,0x28b,0x1a58,0x1a58,0x1a58,0x1a58,0x1a58,0x1a58,0x1a58,0x1a61,
+0x1a61,0x1a61,0x1a61,0x1a61,0x1a64,0x1a64,0x28b,0x28b,0x28e,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,
+0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,
+0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x28e,0x28e,0x291,0x291,0x291,0x291,
+0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x1a94,0x1a94,0x1a94,0x291,
+0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x1a97,0x1a97,0x1a97,0x1a97,
+0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,
+0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x1a9a,0x1a9a,0x1a9a,0x294,0x294,0x294,0x294,0x294,
+0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x1a9a,0x1a9a,0x1a9a,0x1a9a,0x1a9a,0x1a9a,0x294,0x294,
+0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,
+0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,
+0x1a70,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,
+0x1a6a,0x1a6a,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x1a6d,
+0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a73,0x1a73,0x1a73,0x1a73,
+0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x29a,0x29a,0x29a,0x29a,0x29a,0x1a76,
+0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,
+0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,
+0x1926,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,
+0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,
+0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x972,0x972,
+0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,
+0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x19f5,0x19f5,0x19f5,0x19f5,0x19f5,
+0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,
+0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0x12d8,0x12d8,0x12d8,0x2a6,0x2a6,
+0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,
+0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,
+0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,
+0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0xba0,0xba0,0xba0,0xba0,
+0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,
+0xba0,0xba0,0xba0,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0xba3,0xba3,0xba3,0xba3,
+0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,
+0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0x2ac,0x2ac,0x12ed,0x12ed,0x12ed,0x12ed,
+0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,
+0x12ed,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x140a,0x140a,0x140a,0x140a,
+0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,
+0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x2b2,0x2b2,0x17d0,0x17d0,0x2b5,0x2b5,
+0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x1926,0x1926,0x1926,0x1926,
+0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x3c0,0x3b4,0x3b4,0x3b4,
+0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3c0,0x3c0,0x3c0,0x3c0,0x3ba,0x114c,0x1332,0x3c3,0x93c,0x93f,0x3b1,
+0x3b1,0x1149,0x132f,0x132f,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x1149,0x3b4,0x3b4,0x3c0,
+0xcd8,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,
+0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3b4,0x3b4,
+0x8c7,0x8ca,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x3bd,0xfae,0xfab,0x1335,
+0x1335,0x1335,0x1335,0x1335,0x14fa,0x114f,0x114f,0xf00,0xf00,0xdd1,0xf00,0xf00,0x3c3,0x3c3,0x3c3,0x3c3,
+0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c6,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c6,0x3c3,0x3c3,
+0x3c6,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x132f,0x1332,0x3b7,0x3c3,0x3c0,0x3c0,0x462,0x462,0x462,0x462,
+0x462,0x462,0x462,0x462,0x462,0x133b,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,
+0x462,0x462,0x462,0x462,0x462,0x462,0x133b,0x18a2,0x18a2,0xfcc,0x453,0x45c,0x49e,0x49e,0x49e,0x49e,
+0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,
+0x49e,0x49e,0x49e,0xbbe,0xbbe,0xddd,0xddd,0x8cd,0xde0,0x141c,0x141c,0x141c,0x4a1,0x4a1,0x4a1,0x4a1,
+0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,
+0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a7,0x4a7,0x4a7,0x1164,
+0x1164,0x1164,0x1164,0x1164,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,
+0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,
+0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x4aa,0x4a7,0x4a7,0x4a7,
+0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,
+0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,
+0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,
+0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,
+0x4b3,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4b0,0x9b4,0xff9,0xff9,0xffc,0xff9,0x4b3,0x4ad,0x4b3,0x4ad,
+0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,
+0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0xffc,0xff9,0xffc,0xff9,0xffc,0xff9,0x4bf,0x4bf,0x4bf,0x4bf,
+0x4bf,0x4bf,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4bf,0x4bf,0x4bf,0x4bf,
+0x4bf,0x4bf,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x6a2,0x6a2,0x6a5,0x4dd,
+0x6b1,0x6ae,0x6ae,0x6ab,0x507,0x507,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0xb4f,0x6b4,0x4e9,0x6cc,0x6cf,
+0x4fe,0x6b4,0x4ec,0x4ec,0x4dd,0x4f8,0x4f8,0x6a2,0x504,0x501,0x6a8,0x4d7,0x4ce,0x4ce,0x4d1,0x4d1,
+0x4d1,0x4d1,0x4d1,0x4d4,0x4d1,0x4d1,0x4d1,0x4c8,0x510,0x50d,0x50a,0x50a,0x6c0,0x4f2,0x4ef,0x6bd,
+0x6ba,0x6b7,0x6c9,0x4e0,0x6c6,0x6c6,0x4f5,0x4f8,0x6c3,0x6c3,0x4f5,0x4f8,0x4da,0x4dd,0x4dd,0x4dd,
+0x4fb,0x4e6,0x4e3,0xbd3,0xae9,0xaec,0xae6,0xae6,0xae6,0xae6,0xbca,0xbca,0xbca,0xbca,0xbd0,0xd05,
+0xd02,0xdec,0xdef,0xbcd,0xdef,0xdef,0xdef,0xdef,0xdec,0xdef,0xdef,0xbc7,0x534,0x534,0x534,0x534,
+0x534,0x534,0x534,0x531,0x537,0x750,0x534,0x9b7,0x9d8,0xaef,0xaef,0xaef,0xbd9,0xbd9,0xdf5,0xdf5,
+0xdf5,0xdf5,0x116d,0x1170,0x1170,0x1350,0x14e8,0x1512,0x1515,0x1515,0x1728,0x18a5,0x543,0x543,0x55b,0x6de,
+0x540,0x6db,0x543,0x558,0x540,0x6de,0x552,0x55b,0x55b,0x55b,0x552,0x552,0x55b,0x55b,0x55b,0x6e7,
+0x540,0x55b,0x6e1,0x540,0x54f,0x55b,0x55b,0x55b,0x55b,0x55b,0x540,0x540,0x546,0x6db,0x6e4,0x540,
+0x55b,0x540,0x6ea,0x540,0x55b,0x549,0x561,0x6ed,0x55b,0x55b,0x54c,0x552,0x55b,0x55b,0x55e,0x55b,
+0x552,0x555,0x555,0x555,0x555,0xafb,0xaf8,0xd08,0xdfe,0xbee,0xbf1,0xbf1,0xbeb,0xbe8,0xbe8,0xbe8,
+0xbe8,0xbf1,0xbee,0xbee,0xbee,0xbee,0xbe5,0xbe8,0xdfb,0xf0c,0xf0f,0x1002,0x1173,0x1173,0x1173,0x6f3,
+0x6f0,0x564,0x567,0x567,0x567,0x567,0x567,0x6f0,0x6f3,0x6f3,0x6f0,0x567,0x6f9,0x6f9,0x6f9,0x6f9,
+0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x570,0x570,0x570,0x570,0x6f6,0x6f6,0x6f6,0x6f6,
+0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x576,0x576,0x576,0x576,
+0x576,0x576,0x576,0x576,0x573,0x57c,0x57c,0x576,0x576,0x576,0x579,0x573,0x576,0x576,0x573,0x573,
+0x573,0x573,0x576,0x576,0x6fc,0x6fc,0x573,0x573,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,
+0x576,0x576,0x576,0x576,0x576,0x579,0x579,0x579,0x576,0x576,0x6ff,0x576,0x6ff,0x576,0x576,0x576,
+0x576,0x576,0x576,0x576,0x573,0x576,0x573,0x573,0x573,0x573,0x573,0x573,0x576,0x576,0x573,0x6fc,
+0x573,0x573,0x573,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xbf4,0xbf4,0xbf4,0xbf4,
+0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0x705,0x57f,0x705,0x705,0x582,0x57f,0x57f,0x705,
+0x705,0x582,0x57f,0x705,0x582,0x57f,0x57f,0x705,0x57f,0x705,0x58e,0x58b,0x57f,0x705,0x57f,0x57f,
+0x57f,0x57f,0x705,0x57f,0x57f,0x705,0x705,0x705,0x705,0x57f,0x57f,0x705,0x582,0x705,0x582,0x705,
+0x705,0x705,0x705,0x705,0x70b,0x585,0x705,0x585,0x585,0x57f,0x57f,0x57f,0x705,0x705,0x705,0x705,
+0x57f,0x57f,0x57f,0x57f,0x705,0x705,0x57f,0x57f,0x57f,0x582,0x57f,0x57f,0x582,0x57f,0x57f,0x582,
+0x705,0x582,0x57f,0x57f,0x705,0x57f,0x57f,0x57f,0x57f,0x57f,0x705,0x57f,0x57f,0x57f,0x57f,0x57f,
+0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x708,0x705,0x582,0x57f,0x705,0x705,0x705,0x705,
+0x57f,0x57f,0x705,0x705,0x57f,0x582,0x708,0x708,0x582,0x582,0x57f,0x57f,0x582,0x582,0x57f,0x57f,
+0x582,0x582,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x582,0x582,0x705,0x705,0x582,0x582,0x705,0x705,
+0x582,0x582,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x705,0x57f,0x57f,
+0x57f,0x705,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x705,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,
+0x582,0x582,0x582,0x582,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,
+0x57f,0x57f,0x57f,0x705,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,
+0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,
+0x57f,0x57f,0x57f,0x57f,0x582,0x582,0x582,0x582,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x582,0x582,
+0x582,0x582,0x57f,0x588,0x57f,0x57f,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,
+0xbf7,0xbf7,0xbf7,0xbf7,0x591,0xb04,0x591,0x591,0x591,0x591,0x591,0x591,0x59d,0x59a,0x59d,0x59a,
+0x591,0x591,0x591,0x591,0x591,0x591,0x70e,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x813,0x813,
+0x591,0x591,0x591,0x591,0x597,0x597,0x591,0x591,0x591,0x591,0x591,0x591,0x594,0x819,0x816,0x591,
+0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,
+0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,
+0x591,0x591,0x591,0xb04,0xbfd,0xb04,0xb04,0xb04,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,
+0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,
+0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,
+0x717,0x717,0x5a6,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,
+0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xd80,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,
+0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x5a9,0x5ac,0x5ac,0x5ac,
+0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,
+0x720,0x720,0x720,0x720,0x5ac,0x5ac,0x5ac,0x5ac,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,
+0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,
+0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x5af,0x5af,0x723,0x723,0x723,0x723,0xc00,0xc00,
+0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0x729,0x729,0x5b2,0x726,0x726,0x726,0x726,0x726,
+0x726,0x726,0x5b5,0x5b5,0x5b2,0x5b2,0x5b8,0x5b8,0x5b8,0x5b8,0x729,0x729,0x5b8,0x5b8,0x72c,0x729,
+0x5b2,0x5b2,0x5b2,0x5b2,0x729,0x729,0x5b8,0x5b8,0x72c,0x729,0x5b2,0x5b2,0x5b2,0x5b2,0x729,0x729,
+0x726,0x5b2,0x5b8,0x729,0x5b2,0x5b2,0x726,0x729,0x729,0x729,0x5b8,0x5b8,0x5b2,0x5b2,0x5b2,0x5b2,
+0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x729,0x726,0x729,0x726,0x5b2,0x5b8,
+0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b2,0x5b2,0x726,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,
+0xc03,0xc03,0xc03,0xc06,0xc06,0xc81,0xc81,0xc03,0x5c7,0x5c7,0x5c7,0x5c7,0x5c4,0x73e,0x73b,0x5be,
+0x5be,0x72f,0x5be,0x5be,0x5be,0x5be,0x735,0x72f,0x5be,0x5c4,0x5be,0x5bb,0xd89,0xd89,0xc0c,0xc0c,
+0xe0a,0xb10,0x5c1,0x5c1,0x732,0x5ca,0x732,0x5c1,0x5c4,0x5be,0x5c4,0x5c4,0x5be,0x5be,0x5c4,0x5be,
+0x5be,0x5be,0x5c4,0x5be,0x5be,0x5be,0x5c4,0x5c4,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,
+0x5c4,0x5c7,0x5c7,0x5c1,0x5be,0x5be,0x5be,0x5be,0x741,0x5be,0x741,0x5be,0x5be,0x5be,0x5be,0x5be,
+0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x5be,0x5be,0x5be,0x5be,
+0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5c4,0x741,0x73e,0x5cd,0x741,0x72f,0x735,0x5c4,0x72f,
+0x738,0x72f,0x72f,0x5be,0x72f,0x73e,0x5cd,0x73e,0xb10,0xb10,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,
+0xc0f,0xc0f,0xc0f,0xc12,0xc0f,0xc0f,0xe07,0xebe,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,
+0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x13da,0x13da,0x13da,
+0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x151e,0x5df,0x5e8,0x5df,0x5df,0x13da,0x5d3,0x5d3,
+0x5e8,0x5e8,0x13dd,0x13dd,0x5eb,0x5eb,0x5dc,0x5e2,0x5dc,0x5dc,0x5e2,0x5d3,0x5e2,0x5d3,0x5e2,0x5d3,
+0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5e2,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x13da,0x5d3,0x5d3,0x5d3,
+0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5e2,0x5e2,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,
+0x5d3,0x747,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5e2,0x5d3,0x5d3,0x5e2,0x5d3,0x5d3,0x5d3,0x5d3,
+0x13da,0x5d3,0x13da,0x5d3,0x5d3,0x5d3,0x5d3,0x13da,0x13da,0x13da,0x5d3,0x12d2,0x5d3,0x5d3,0x5d3,0x5d9,
+0x5d9,0x5d9,0x5d9,0x135c,0x135c,0x5d3,0x5d6,0x5e5,0x5e8,0x5dc,0x5dc,0x5dc,0xc18,0xc15,0xc18,0xc15,
+0xc18,0xc15,0xc18,0xc15,0xc18,0xc15,0xc18,0xc15,0xc18,0xc15,0x744,0x744,0x744,0x744,0x744,0x744,
+0x744,0x744,0x744,0x744,0x5d3,0x5e2,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,
+0x5d3,0x5d3,0x5d3,0x5d3,0x13da,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,
+0x5d3,0x5d3,0x5d3,0x13da,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,
+0x60c,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,
+0x60c,0x612,0x603,0x606,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,
+0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,
+0x612,0x612,0x609,0x609,0x609,0x609,0x609,0x609,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,
+0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,
+0x60c,0x60c,0x60c,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,
+0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,
+0x60f,0x615,0x612,0x60c,0x612,0x60c,0x612,0x60c,0x612,0x60c,0x612,0x60c,0x612,0x60c,0x612,0x60c,
+0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,
+0x612,0x60c,0x60f,0x615,0x612,0x60c,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,
+0x612,0x60c,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,
+0x612,0x60c,0x612,0x60c,0x612,0x60c,0x60f,0x615,0x60f,0x615,0x612,0x60c,0x612,0x60c,0x612,0x60c,
+0x612,0x60c,0x612,0x60c,0x612,0x60c,0x612,0x60c,0x60f,0x612,0x60c,0x60f,0x612,0x60c,0x60f,0x615,
+0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,
+0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,
+0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,
+0x612,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,
+0x60f,0x60f,0x60c,0x60f,0x60c,0x60f,0x60c,0x60c,0x60f,0x60c,0x60c,0x60f,0x60c,0x60f,0x60c,0x60c,
+0x60f,0x60c,0x60f,0x60f,0x60c,0x60c,0x60c,0x60f,0x60c,0x60c,0x60c,0x60c,0x60c,0x60f,0x60c,0x60c,
+0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,
+0x60c,0x60c,0x60c,0x60c,0x60f,0x60f,0x60c,0x60c,0x60f,0x60c,0x60f,0x60c,0x60c,0x60c,0x60c,0x60c,
+0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,
+0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,
+0x60f,0x60f,0x60f,0x615,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,
+0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,
+0x612,0x612,0x612,0x612,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,
+0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x612,0x612,0x612,0x612,0x612,0x612,0x612,
+0x612,0x612,0x612,0x612,0x618,0x618,0x618,0x618,0x100e,0x100e,0x100e,0x1521,0x1521,0x1521,0x1521,0x1521,
+0x1521,0x1521,0x172e,0x172e,0x879,0x87f,0x87f,0x88b,0x88b,0x87c,0x873,0x87c,0x873,0x87c,0x873,0x87c,
+0x873,0x87c,0x873,0x87c,0x627,0x627,0x621,0x627,0x621,0x627,0x621,0x627,0x621,0x627,0x621,0x624,
+0x62a,0x627,0x621,0x627,0x621,0x624,0x62a,0x627,0x621,0x627,0x621,0x624,0x62a,0x627,0x621,0x624,
+0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x627,0x621,0x627,0x621,0x627,0x621,0x627,0x621,0x624,
+0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624,
+0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624,
+0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,
+0x714,0x714,0x714,0x714,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,
+0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,
+0x711,0x711,0x711,0x711,0x711,0x711,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,
+0x71a,0x71a,0x71d,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,
+0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,
+0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,
+0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,
+0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,
+0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,
+0xc6f,0x8df,0x8d9,0x8d6,0x8dc,0x8d3,0x75f,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,
+0x8e5,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,
+0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,
+0x75f,0x75f,0x8e2,0x8e2,0x765,0x8f4,0x8f7,0x8fd,0x81f,0x82b,0x912,0x828,0x8eb,0x8e8,0x8eb,0x8e8,
+0x8f1,0x8ee,0x8f1,0x8ee,0x8eb,0x8e8,0x825,0x8fd,0x8eb,0x8e8,0x8eb,0x8e8,0x8eb,0x8e8,0x8eb,0x8e8,
+0x900,0x909,0x906,0x906,0x76b,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,
+0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x76e,
+0x789,0x768,0x78f,0x792,0x78c,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x79e,0x79e,0x79e,0x79e,0x79e,
+0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x76e,
+0x789,0x768,0x789,0xc72,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,
+0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,
+0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x810,0x825,0x828,0x828,0x828,
+0x828,0x828,0x828,0x828,0x828,0x828,0x948,0x948,0x948,0x948,0x82e,0x82e,0x903,0x90f,0x90f,0x90f,
+0x90f,0x90c,0x822,0x8fa,0xb34,0xb34,0xb34,0xc84,0xca2,0xc9f,0xb52,0x8d0,0x834,0x831,0x834,0x837,
+0x831,0x834,0x831,0x834,0x831,0x834,0x831,0x831,0x831,0x831,0x831,0x831,0x834,0x834,0x831,0x834,
+0x834,0x831,0x834,0x834,0x831,0x834,0x834,0x831,0x834,0x834,0x831,0x831,0xca5,0x846,0x840,0x846,
+0x840,0x846,0x840,0x846,0x840,0x846,0x840,0x840,0x843,0x840,0x843,0x840,0x843,0x840,0x843,0x840,
+0x843,0x840,0x843,0x840,0x843,0x840,0x843,0x840,0x843,0x840,0x843,0x840,0x843,0x840,0x843,0x846,
+0x840,0x843,0x840,0x843,0x840,0x843,0x840,0x840,0x840,0x840,0x840,0x840,0x843,0x843,0x840,0x843,
+0x843,0x840,0x843,0x843,0x840,0x843,0x843,0x840,0x843,0x843,0x840,0x840,0x840,0x840,0x840,0x846,
+0x840,0x846,0x840,0x846,0x840,0x840,0x840,0x840,0x840,0x840,0x846,0x840,0x840,0x840,0x840,0x840,
+0x843,0x846,0x846,0x843,0x843,0x843,0x843,0x918,0x91b,0x849,0x84c,0xc8d,0x852,0x852,0x852,0x852,
0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,
-0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x855,0x855,
-0x852,0x855,0x852,0x855,0x855,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x855,
-0x852,0x855,0x852,0x855,0x855,0x852,0x852,0x855,0x855,0x855,0x852,0x852,0x852,0x852,0x14be,0x14be,
-0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,
-0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,
-0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,
-0x12f6,0x12f6,0x12f6,0x12f6,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0xd6e,0xc72,0xc72,0xc72,
-0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0x90c,0x90c,0x90c,0x90c,
-0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,
-0x90c,0x90c,0x90c,0x90f,0x90c,0x90f,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,
-0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,
-0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,
-0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,
-0x912,0x912,0x912,0x912,0x912,0x912,0x912,0xd77,0x990,0x972,0x972,0x972,0x972,0x96c,0x972,0x972,
-0x984,0x972,0x972,0x96f,0x97b,0x981,0x981,0x981,0x981,0x981,0x984,0x96c,0x978,0x96c,0x96c,0x96c,
-0x963,0x963,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,
-0x987,0x987,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96f,0x963,0x96c,0x963,
-0x96c,0x963,0x97e,0x975,0x97e,0x975,0x98d,0x98d,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,
-0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,
-0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,
-0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,
-0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,
-0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,
-0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,
-0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,
-0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9a5,0x9a5,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,
-0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,
-0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9a8,0x9a8,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,
-0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,
-0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,
-0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,
-0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9b1,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,
-0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,
-0x9b4,0x9b4,0x9b4,0x9b4,0x9b1,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,
-0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,
-0xa41,0xa41,0xfdb,0xa41,0xa41,0xa41,0xa44,0xa41,0xfdb,0xa41,0xa41,0xfd2,0xa3b,0xa2f,0xa2f,0xa2f,
-0xa2f,0xa3e,0xa2f,0xfc0,0xfc0,0xfc0,0xa2f,0xa32,0xa3b,0xa35,0xfc6,0xfd5,0xfd5,0xfc0,0xfc0,0xfdb,
-0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xa47,0xa47,0xa38,0xa38,0xa38,0xa38,
-0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa3e,0xa3e,0xa2f,0xa2f,0xfdb,0xfdb,0xfdb,0xfdb,0xfc0,0xfc0,
-0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,
-0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,
-0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xdcb,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,
-0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,
-0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xdcb,0xa56,0xa56,0xa56,0xa56,
-0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa5c,0xa5c,0xa5c,0xa5c,
-0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,
-0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa62,0xa62,0xa62,0xa62,
-0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa5f,0xa65,0xa62,0xa62,0xa62,0xa62,0xa62,
-0xa62,0xa62,0xa62,0x1152,0x1152,0x1152,0x1152,0x1152,0x1152,0x1152,0x1152,0x1152,0x114f,0xa62,0xa62,0xa62,
-0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,
-0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,
-0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,
-0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,
-0xa9b,0xa9b,0xa9b,0xa9e,0xa9e,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,
-0xa9b,0xa9b,0xa9b,0xa9b,0xa83,0xa83,0xa98,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa98,0xa98,
-0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,
-0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,
-0xabc,0xabc,0xabc,0xabc,0xabc,0xaa7,0xaa7,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,
-0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,
-0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabf,0xabc,0xabc,0xabc,0xabc,
-0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,
-0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,
-0xaec,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,
-0xae9,0xae9,0xae9,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,
-0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,
-0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,
-0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,
-0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,
-0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,
-0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,
-0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,
-0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,
-0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb25,0xb22,0xb22,
-0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,
-0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,
-0xb28,0xb28,0xc75,0xc75,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,
-0xb28,0xb28,0xb28,0xb28,0xc75,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,
-0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,
-0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0x1509,
-0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xcff,0xcff,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,
-0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,
-0xb4f,0xb4f,0xcfc,0xcfc,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,
-0xd4d,0xd4d,0xd4d,0xd4d,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,
-0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,
-0xb52,0xb52,0xb52,0xb52,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,
-0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,
-0xb55,0xb55,0xb55,0xb55,0xb64,0xb64,0xb64,0xb64,0xb64,0xb5b,0xb67,0xb6d,0xb6d,0xb6d,0xb61,0xb61,
-0xb61,0xb6a,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb6d,
-0xb6d,0xb6d,0xb6d,0xb6d,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,
-0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,
-0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb64,0xb64,0xb6d,0xb6d,0xb6d,0xb61,0xb61,0xb6d,0xb6d,0xb6d,
-0xb6d,0xb6d,0xb6d,0xb6d,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,
-0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb6d,0xb6d,0xb6d,0xb6d,0xb61,0xb61,
-0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb64,0xb64,0xb64,0xb64,0xb64,
-0xb64,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,
-0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0x1716,0x1716,
-0xb79,0xb70,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,
-0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb70,0xb76,0xb76,0xb76,0xb76,
-0xb76,0xb76,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,
-0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb70,0xb76,0xb76,0xb76,0xb76,
-0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,
-0xb76,0xb70,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,
-0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb70,0xb76,0xb76,
-0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,
-0xb76,0xb76,0xb76,0xb76,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,
+0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x855,0x852,0x852,0x852,
+0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,
+0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,
+0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,
+0x85e,0x85e,0x85e,0x85e,0xd92,0xd92,0xec1,0x858,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,
+0x924,0x924,0x924,0x924,0xd8c,0xd8c,0xd8c,0xd8c,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,
+0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,
+0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x1aa3,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,
+0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x864,0x864,0x864,0x864,0x864,0x864,0xd95,
+0xd95,0xd95,0xd95,0x930,0x930,0x930,0x930,0x930,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,
+0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,
+0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0xd95,0xd95,0x867,0x867,0x867,0x867,
+0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,
+0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x92d,0x92d,0x92d,0x92d,
+0x92d,0x92d,0x92d,0x92d,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,
+0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,
+0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,
+0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0x1131,0x1131,0x1131,0x1131,
+0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,
+0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,
+0x86d,0x86d,0x870,0x870,0x86d,0x870,0x86d,0x870,0x870,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,
+0x86d,0x86d,0x86d,0x870,0x86d,0x870,0x86d,0x870,0x870,0x86d,0x86d,0x870,0x870,0x870,0x86d,0x86d,
+0x86d,0x86d,0x14d9,0x14d9,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,
+0xc96,0xc96,0xc96,0xc96,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,
+0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,
+0x924,0x924,0x924,0x924,0x1311,0x1311,0x1311,0x1311,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,
+0xd8c,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,
+0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,
+0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x92a,0x927,0x92a,0x927,0x927,0x927,0x927,0x927,0x927,
+0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0xc90,0xc90,0xc90,
+0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0x92d,0x92d,0x92d,0x92d,
+0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,
+0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0xd95,0x9ae,0x990,0x990,0x990,
+0x990,0x98a,0x990,0x990,0x9a2,0x990,0x990,0x98d,0x999,0x99f,0x99f,0x99f,0x99f,0x99f,0x9a2,0x98a,
+0x996,0x98a,0x98a,0x98a,0x981,0x981,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x9a5,0x9a5,0x9a5,0x9a5,
+0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,
+0x98d,0x981,0x98a,0x981,0x98a,0x981,0x99c,0x993,0x99c,0x993,0x9ab,0x9ab,0x9ba,0x9ba,0x9ba,0x9ba,
+0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,
+0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9bd,0x9bd,0x9bd,0x9bd,
+0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,
+0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9c0,0x9c0,0x9c0,0x9c0,
+0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,
+0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c9,0x9c9,0x9c9,0x9c9,
+0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,
+0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c3,0x9c3,0x9cc,0x9cc,0x9cc,0x9cc,
+0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,
+0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9c6,0x9c6,0x9c9,0x9c9,0x9c9,0x9c9,
+0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,
+0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9cc,0x9cc,0x9cc,0x9cc,
+0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,
+0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cf,0x9d2,0x9d2,0x9d2,
+0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,
+0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9cf,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,
+0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,
+0x9d2,0x9d2,0x9d2,0x9d2,0xa5f,0xa5f,0xff3,0xa5f,0xa5f,0xa5f,0xa62,0xa5f,0xff3,0xa5f,0xa5f,0xfea,
+0xa59,0xa4d,0xa4d,0xa4d,0xa4d,0xa5c,0xa4d,0xfdb,0xfdb,0xfdb,0xa4d,0xa50,0xa59,0xa53,0xfe1,0xfed,
+0xfed,0xfdb,0xfdb,0xff3,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xa65,0xa65,
+0xa56,0xa56,0xa56,0xa56,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5c,0xa5c,0xa4d,0xa4d,0xff3,0xff3,
+0xff3,0xff3,0xfdb,0xfdb,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,
+0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,
+0xa5f,0xa5f,0xa5f,0xa5f,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xde9,0xa74,0xa74,0xa74,0xa74,
+0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,
+0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xde9,
+0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,
+0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,
+0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,
+0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa7d,0xa83,0xa80,
+0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0x116a,0x116a,0x116a,0x116a,0x116a,0x116a,0x116a,0x116a,0x116a,
+0x1167,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,
+0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,
+0xa80,0xa80,0xa80,0xa80,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,
+0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,
+0xa95,0xa95,0xa95,0xa95,0xab9,0xab9,0xab9,0xabc,0xabc,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,
+0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xaa1,0xaa1,0xab6,0xa98,0xa98,0xa98,0xa98,0xa98,
+0xa98,0xa98,0xab6,0xab6,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,
+0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,
+0xab9,0xab9,0xab9,0xab9,0xada,0xada,0xada,0xada,0xada,0xac5,0xac5,0xada,0xada,0xada,0xada,0xada,
+0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,
+0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xadd,
+0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,
+0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xb04,0xb04,0xb04,0xb04,
+0xb04,0xb04,0xb04,0xb04,0xb07,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,
+0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xb13,0xb13,0xb13,0xb13,
+0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,
+0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb25,0xb25,0xb25,0xb25,
+0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,
+0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb2b,0xb2b,0xb2b,0xb2b,
+0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,
+0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb3a,0xb3a,0xb3a,0xb3a,
+0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,
+0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3d,0xb3d,0xb3d,0xb3d,
+0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,
+0xb3d,0xb40,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,
+0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,
+0xb3d,0xb3d,0xb3d,0xb3d,0xb43,0xb43,0xc93,0xc93,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,
+0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xc93,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,
+0xb43,0xb43,0xb43,0xb43,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,
+0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,
+0xb67,0xb67,0xb67,0x1524,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xd1d,0xd1d,0xb6d,0xb6d,0xb6d,0xb6d,
+0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,
+0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xd1a,0xd1a,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,
+0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,
+0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,
+0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,
0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,
-0xb73,0xb73,0xb73,0xb73,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,
-0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb76,0xb76,
-0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,
-0xb76,0xb76,0xb76,0xb76,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,
-0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb76,0xb76,
-0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,
-0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb79,0xb79,0xb79,0xb79,0xb7c,0xb7c,0xb7c,0xb7c,
-0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,
-0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb82,0xb82,0xb82,0xb82,
-0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,
-0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb85,0xb85,0xb85,0xb85,
-0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,
-0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xbdf,0xbdf,0xbdf,0xbdf,
-0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,
-0xbdf,0xbdf,0xbdc,0xbdf,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,
-0xbdc,0xbdc,0xbdc,0xced,0xcf0,0xde3,0xde3,0xde3,0xde3,0xde3,0xde3,0xde3,0xde3,0xde3,0xde3,0xde3,
-0xefd,0xefd,0xefd,0xefd,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbeb,0xbeb,0xbeb,0xbeb,0xcf3,0xcf3,
-0xcf3,0xcf3,0xcf3,0xcf3,0xcf6,0xcf6,0xde9,0xea0,0xde9,0xde9,0xde9,0xde9,0xde6,0xde9,0xde6,0xde9,
-0xde9,0xff0,0x128a,0x128a,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf8,0xdf5,0xf0f,0xf0f,0xf0f,0xf0f,0x1407,
-0x1002,0x1407,0x134d,0x134d,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,
-0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc5a,0xc57,0xc5a,0xc57,0xc5a,0xc57,0x1113,0x1110,0x1008,0x1005,
-0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,
-0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,
-0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,
-0xc30,0xc30,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc33,0xc33,0xc33,0xc39,
-0xc36,0xc60,0xc5d,0xc39,0xc36,0xc39,0xc36,0xc39,0xc36,0xc39,0xc36,0xc39,0xc36,0xc39,0xc36,0xc39,
-0xc36,0xc39,0xc36,0xc39,0xc36,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,
-0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,
-0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc39,0xc36,0xc39,0xc36,0xc33,0xc33,0xc33,0xc33,
-0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,
-0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc39,0xc36,0xc33,0xc33,0xc3c,0xc3c,0xc3c,0xc3c,
-0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc42,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,
-0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,
-0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc42,0xc42,0xc42,0xc3c,
-0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,
-0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3f,0xc3c,0xc3c,0xc3c,
-0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,
-0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,
-0xcf9,0xd68,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xea0,0xea0,0xde6,0xde6,0xde6,0xde6,
-0xde9,0xde9,0xf00,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0x12b7,0x12b7,0x128d,
-0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,
-0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,
-0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd23,0xd23,0xd23,0xd23,0xd23,0xd20,0xd35,0xd35,0xd35,0xd2f,
-0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd2f,0xd35,0xd35,0xd35,0xd35,
-0xd29,0xd29,0xd32,0xd32,0xd32,0xd32,0xd26,0xd26,0xd26,0xd26,0xd26,0xd2c,0xdfe,0xdfe,0xdfe,0xdfe,
-0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfb,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,
-0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd2f,0xd35,
-0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd29,0xd29,0xd29,
-0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,
-0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,
-0xd38,0xd38,0xd38,0xd38,0xd38,0xd3b,0xd3b,0xd3b,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xe01,0xe01,
-0xe01,0xe01,0xe01,0xe01,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0x111c,0x111c,0x100b,0x100b,0x100b,
-0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,
-0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,
-0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,
-0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,
-0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,
-0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,
-0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,
-0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,
-0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,
-0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,
-0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,
-0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,
-0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,
-0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,
-0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,
-0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,
-0xecd,0xecd,0xe1f,0xe1f,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0x1017,0x1017,0x1017,0x1017,0x1017,
-0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,
-0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,
-0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,
-0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,
-0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,
-0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,
-0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,
+0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb82,0xb82,0xb82,0xb82,0xb82,0xb79,0xb85,0xb8b,
+0xb8b,0xb8b,0xb7f,0xb7f,0xb7f,0xb88,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb76,0xb76,0xb76,0xb76,0xb76,
+0xb76,0xb76,0xb76,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,
+0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,
+0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb82,0xb82,0xb8b,0xb8b,0xb8b,0xb7f,
+0xb7f,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,
+0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb8b,0xb8b,
+0xb8b,0xb8b,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb82,
+0xb82,0xb82,0xb82,0xb82,0xb82,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,
+0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,
+0xb7f,0xb7f,0x1731,0x1731,0xb97,0xb8e,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,
+0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb8e,
+0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,
+0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb8e,
+0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,
+0xb94,0xb94,0xb94,0xb94,0xb94,0xb8e,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xb97,0xb97,
+0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,
+0xb97,0xb8e,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,
+0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,
+0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,
+0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,
+0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,
+0xb97,0xb97,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,
+0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,
+0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,
+0xb97,0xb97,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,
+0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xb97,0xb97,
+0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,
+0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,
+0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,
+0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,
+0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,
+0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,
+0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,
+0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfa,0xbfd,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,
+0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xd0b,0xd0e,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,
+0xe01,0xe01,0xe01,0xe01,0xf18,0xf18,0xf18,0xf18,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc09,0xc09,
+0xc09,0xc09,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd14,0xd14,0xe07,0xebb,0xe07,0xe07,0xe07,0xe07,
+0xe04,0xe07,0xe04,0xe07,0xe07,0x1008,0x12a2,0x12a2,0xe10,0xe10,0xe10,0xe10,0xe10,0xe16,0xe13,0xf2a,
+0xf2a,0xf2a,0xf2a,0x1422,0x101a,0x1422,0x1368,0x1368,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,
+0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc78,0xc75,0xc78,0xc75,0xc78,0xc75,
+0x112b,0x1128,0x1020,0x101d,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,
+0xc48,0xc48,0xc48,0xc48,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,
+0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,
+0xc4b,0xc4b,0xc4b,0xc4b,0xc4e,0xc4e,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,
+0xc51,0xc51,0xc51,0xc57,0xc54,0xc7e,0xc7b,0xc57,0xc54,0xc57,0xc54,0xc57,0xc54,0xc57,0xc54,0xc57,
+0xc54,0xc57,0xc54,0xc57,0xc54,0xc57,0xc54,0xc57,0xc54,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,
+0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,
+0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc57,0xc54,0xc57,0xc54,
+0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,
+0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc57,0xc54,0xc51,0xc51,
+0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc60,0xc5a,0xc5a,0xc5a,
+0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,
+0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,
+0xc60,0xc60,0xc60,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,
+0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,
+0xc5d,0xc5a,0xc5a,0xc5a,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,
+0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,
+0xc96,0xc96,0xc96,0xc96,0xd17,0xd86,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xebb,0xebb,
+0xe04,0xe04,0xe04,0xe04,0xe07,0xe07,0xf1b,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,
+0x1008,0x12cf,0x12cf,0x12a5,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,
+0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,
+0xd3b,0xd3b,0xd3b,0xd3b,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd41,0xd41,0xd41,0xd41,0xd41,0xd3e,
+0xd53,0xd53,0xd53,0xd4d,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd4d,
+0xd53,0xd53,0xd53,0xd53,0xd47,0xd47,0xd50,0xd50,0xd50,0xd50,0xd44,0xd44,0xd44,0xd44,0xd44,0xd4a,
+0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe19,0xe1c,0xe1c,0xe1c,
+0xe1c,0xe1c,0xe1c,0xe1c,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,
+0xd53,0xd53,0xd4d,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,
+0xd53,0xd47,0xd47,0xd47,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,
+0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,
+0xd4a,0xd4a,0xd4a,0xd4a,0xd56,0xd56,0xd56,0xd56,0xd56,0xd59,0xd59,0xd59,0xd56,0xd56,0xd56,0xd56,
+0xd56,0xd56,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0x1134,
+0x1134,0x1023,0x1023,0x1023,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,
+0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,
+0xd5c,0xd5c,0xd5c,0xd5c,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,
+0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,
+0xd62,0xd62,0xd62,0xd62,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,
+0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,
+0xd6b,0xd6b,0xd6b,0xd6b,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,
+0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,
+0xd77,0xd77,0xd77,0xd77,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,
+0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,
+0xd83,0xd83,0xd83,0xd83,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,
+0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,
+0xe25,0xe25,0xe25,0xe25,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,
+0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,
+0xe28,0xe28,0xe28,0xe28,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,
+0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,
+0xe2b,0xe2b,0xe2b,0xe2b,0xee8,0xee8,0xe3d,0xe3d,0xf30,0xf30,0xf30,0xf30,0xf30,0xf30,0xf30,0x102f,
+0x102f,0x102f,0x102f,0x102f,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,
+0x102c,0x102c,0x102c,0x102c,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,
+0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,
+0xe4c,0xe49,0xe4c,0xe49,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,
0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,
-0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xf18,0xf18,0xf18,0xf18,0x101a,0x101a,0x101a,0x101a,0x101a,
-0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,
-0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,
-0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,
-0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,
-0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,
-0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe6d,
-0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,
-0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe73,0xe73,0xe73,0xe73,0xe73,
-0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe79,0xe79,
-0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe76,0xe7f,0x1026,0x1020,0x102f,0x101d,0xe7c,0xe7c,0x101d,0x101d,
-0xe91,0xe91,0xe82,0xe91,0xe91,0xe91,0xe88,0xe91,0xe91,0xe91,0xe91,0xe82,0xe91,0xe91,0xe91,0xe91,
+0xe58,0xe58,0xe58,0xe58,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,
+0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,
+0xe5e,0xe5e,0xe5e,0xe5e,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,
+0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xf33,0xf33,0xf33,0xf33,0x1032,
+0x1032,0x1032,0x1032,0x1032,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,
+0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,
+0xe7f,0xe7f,0xe7f,0xe7f,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,
+0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,
+0xe88,0xe88,0xe88,0xe88,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,
0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,
-0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,
-0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,
-0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,
+0xe91,0xe91,0xe91,0xe8b,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,
+0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe91,
+0xe91,0xe91,0xe91,0xe91,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,
+0xe9a,0xe9a,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe94,0xe9d,0x103e,0x1038,0x1047,0x1035,
+0xe9a,0xe9a,0x1035,0x1035,0xeac,0xeac,0xea0,0xeac,0xeac,0xeac,0xea3,0xeac,0xeac,0xeac,0xeac,0xea0,
0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,
-0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,
+0xeac,0xeac,0xeac,0xeac,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,
+0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,
+0xeaf,0xeaf,0xeaf,0xeaf,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,
+0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,
+0xec7,0xec7,0xec7,0xec7,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,
+0xee5,0xee5,0xee5,0xee5,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,
+0x113d,0x113d,0x113d,0x113d,0xf18,0xf18,0xf18,0xf15,0xf15,0xf15,0xf15,0xf15,0x1176,0x13d1,0x13d1,0x13d1,
+0x13d1,0x1353,0x1353,0x1353,0x13d4,0x1356,0x1356,0x13d4,0x1518,0x1518,0x1518,0x1518,0x151b,0x151b,0x151b,0x17e2,
+0x17e2,0x17e2,0x17e2,0x18a8,0xf2d,0xf2d,0xf2d,0xf2d,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,
+0x1023,0x1023,0x1023,0x1023,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,
+0x1026,0x1026,0x1026,0x1026,0xf4e,0xf4e,0xf4e,0xf4e,0xf60,0xf69,0xf6c,0xf69,0xf6c,0xf69,0xf6c,0xf69,
+0xf6c,0xf69,0xf6c,0xf69,0xf69,0xf69,0xf6c,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,
+0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf51,0xf4e,0xf4e,0xf4e,
+0xf4e,0xf4e,0xf4e,0xf63,0xf4e,0xf63,0xf60,0xf60,0xf75,0xf72,0xf75,0xf75,0xf75,0xf72,0xf72,0xf75,
+0xf72,0xf75,0xf72,0xf75,0xf72,0x1059,0x1059,0x1059,0x1194,0x1050,0x1059,0x1050,0xf72,0xf75,0xf72,0xf72,
+0x1050,0x1050,0x1050,0x1050,0x1053,0x1056,0x1194,0x1194,0xf78,0xf78,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,
+0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x1062,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,
+0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,
+0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,
+0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,
+0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,
+0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0x1557,0x1557,0x1557,0x1557,0x1557,
+0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0xf93,0xf93,0xf93,0xf93,
+0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,
+0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xfdb,0xff3,0xfea,0xff0,
+0xff0,0xff3,0xff3,0xfea,0xfea,0xff0,0xff0,0xff0,0xff0,0xff0,0xff3,0xff3,0xff3,0xfdb,0xfdb,0xfdb,
+0xfdb,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xfdb,0xfea,
+0xfed,0xfdb,0xfdb,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xfde,0xff3,0xff0,0xfe7,0xfe7,0xfe7,0xfe7,
+0xfe7,0xfe7,0xfe7,0xfe7,0xfe7,0xfe7,0x115e,0x115e,0x115b,0x1158,0xfe4,0xfe4,0x100b,0x100b,0x100b,0x100b,
+0x12cf,0x12cf,0x12a5,0x12a5,0x12ab,0x12a2,0x12a2,0x12a2,0x12a2,0x12a5,0x13d7,0x12ab,0x12a5,0x12ab,0x12a2,0x12ab,
+0x12cf,0x12a2,0x12a2,0x12a2,0x12a5,0x12a5,0x12a2,0x12a2,0x12a5,0x12a2,0x12a2,0x12a5,0x1026,0x1026,0x1026,0x1026,
+0x1026,0x1023,0x1023,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1530,0x1530,0x1530,0x1134,0x1023,0x1023,0x1023,
+0x1023,0x12db,0x12b4,0x12b4,0x12b4,0x12b4,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1044,0x1044,0x1041,0x103b,
+0x1041,0x103b,0x1041,0x103b,0x1041,0x103b,0x1038,0x1038,0x1038,0x1038,0x104d,0x104a,0x1038,0x1191,0x142e,0x1431,
+0x1431,0x142e,0x142e,0x142e,0x142e,0x142e,0x1434,0x1434,0x154b,0x153f,0x153f,0x153c,0x106b,0x1062,0x106b,0x1062,
+0x106b,0x1062,0x106b,0x1062,0x105f,0x105c,0x105c,0x106b,0x1062,0x1377,0x1374,0x173a,0x1377,0x1374,0x143d,0x143a,
+0x154e,0x154e,0x1554,0x154e,0x1554,0x154e,0x1554,0x154e,0x1554,0x154e,0x1554,0x154e,0x106b,0x1062,0x106b,0x1062,
+0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,
+0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x1065,0x1062,0x1062,0x1062,
+0x1062,0x1062,0x1062,0x1062,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x106b,0x1062,0x106e,0x106e,0x1074,0x107a,
+0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,
+0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x1074,0x106e,0x106e,
+0x106e,0x106e,0x1074,0x1074,0x106e,0x106e,0x1077,0x1446,0x1443,0x1443,0x107a,0x107a,0x1071,0x1071,0x1071,0x1071,
+0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x108f,0x108f,0x108f,0x108f,
+0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,
+0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x1098,0x1098,0x1098,0x1098,
+0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,
+0x1098,0x1098,0x1098,0x1098,0x109b,0x109b,0x109b,0x109e,0x109b,0x109b,0x10a1,0x10a1,0x10a4,0x10a4,0x10a4,0x10a4,
+0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,
+0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10ad,0x10ad,0x10ad,0x10ad,
+0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10b0,0x10a7,0x10b6,0x10b3,0x10ad,0x10ad,0x10ad,0x10ad,
+0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,
+0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x137d,0x137a,0x10c8,0x10c2,
+0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c5,0x1146,0x10b9,0x10b9,0x10b9,0x10bf,
+0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x10bc,0x10bc,0x10bf,0x10cb,0x10c8,0x10c2,0x10c8,0x10c2,
+0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,
+0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x1563,0x1560,0x1563,0x1560,
+0x1566,0x1566,0x1743,0x144c,0x10d4,0x10d4,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,
+0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,
+0x10d7,0x10d7,0x10d7,0x10d7,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,
+0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10e0,0x10e0,0x10e0,0x113a,0x10e9,
+0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,
+0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,
+0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,
+0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,
+0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,
+0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,
+0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,
+0x1122,0x1122,0x1122,0x1122,0x1137,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,
+0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,
+0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,
0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,
-0xefd,0xefd,0xefd,0xefa,0xefa,0xefa,0xefa,0xefa,0x115e,0x13b6,0x13b6,0x13b6,0x13b6,0x1338,0x1338,0x1338,
-0x13b9,0x133b,0x133b,0x13b9,0x14fd,0x14fd,0x14fd,0x14fd,0x1500,0x1500,0x1500,0x17c7,0x17c7,0x17c7,0x17c7,0x188d,
-0xf12,0xf12,0xf12,0xf12,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,
-0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,
-0xf33,0xf33,0xf33,0xf33,0xf45,0xf4e,0xf51,0xf4e,0xf51,0xf4e,0xf51,0xf4e,0xf51,0xf4e,0xf51,0xf4e,
-0xf4e,0xf4e,0xf51,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,
-0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf36,0xf45,0xf33,0xf33,0xf33,0xf33,0xf33,0xf48,
-0xf33,0xf48,0xf45,0xf45,0xf5a,0xf57,0xf5a,0xf5a,0xf5a,0xf57,0xf57,0xf5a,0xf57,0xf5a,0xf57,0xf5a,
-0xf57,0x1041,0x1041,0x1041,0x117c,0x1038,0x1041,0x1038,0xf57,0xf5a,0xf57,0xf57,0x1038,0x1038,0x1038,0x1038,
-0x103b,0x103e,0x117c,0x117c,0xf5d,0xf5d,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,
-0x1053,0x104a,0x1053,0x104a,0x104a,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,
-0x1053,0x104a,0x1053,0x104a,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,
-0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,
-0xf63,0xf63,0xf63,0xf63,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,
-0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,
-0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,
-0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,
-0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,
-0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xfc0,0xfdb,0xfd2,0xfcf,0xfcf,0xfdb,0xfdb,0xfd2,
-0xfd2,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfdb,0xfdb,0xfdb,0xfc0,0xfc0,0xfc0,0xfc0,0xfdb,0xfdb,0xfdb,
-0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfc0,0xfd2,0xfd5,0xfc0,0xfc0,0xfd8,
-0xfd8,0xfd8,0xfd8,0xfd8,0xfd8,0xfc3,0xfdb,0xfd8,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,
-0xfcc,0xfcc,0x1146,0x1146,0x1143,0x1140,0xfc9,0xfc9,0xff3,0xff3,0xff3,0xff3,0x12b7,0x12b7,0x128d,0x128d,
-0x1293,0x128a,0x128a,0x128a,0x128a,0x128d,0x13bc,0x1293,0x128d,0x1293,0x128a,0x1293,0x12b7,0x128a,0x128a,0x128a,
-0x128d,0x128d,0x128a,0x128a,0x128d,0x128a,0x128a,0x128d,0x100e,0x100e,0x100e,0x100e,0x100e,0x100b,0x100b,0x100e,
-0x100e,0x100e,0x100e,0x100e,0x100e,0x1515,0x1515,0x1515,0x111c,0x100b,0x100b,0x100b,0x100b,0x12c3,0x129c,0x129c,
-0x129c,0x129c,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x102c,0x102c,0x1029,0x1023,0x1029,0x1023,0x1029,0x1023,
-0x1029,0x1023,0x1020,0x1020,0x1020,0x1020,0x1035,0x1032,0x1020,0x1179,0x1413,0x1416,0x1416,0x1413,0x1413,0x1413,
-0x1413,0x1413,0x1419,0x1419,0x1530,0x1524,0x1524,0x1521,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,
-0x1047,0x1044,0x1044,0x1053,0x104a,0x135c,0x1359,0x171f,0x135c,0x1359,0x1422,0x141f,0x1533,0x1533,0x1539,0x1533,
-0x1539,0x1533,0x1539,0x1533,0x1539,0x1533,0x1539,0x1533,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,
-0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,
-0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x104d,0x104a,0x104a,0x104a,0x104a,0x104a,0x104a,0x104a,
-0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x1053,0x104a,0x1056,0x1056,0x105c,0x1062,0x1062,0x1062,0x1062,0x1062,
-0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,
-0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x105c,0x1056,0x1056,0x1056,0x1056,0x105c,0x105c,
-0x1056,0x1056,0x105f,0x142b,0x1428,0x1428,0x1062,0x1062,0x1059,0x1059,0x1059,0x1059,0x1059,0x1059,0x1059,0x1059,
-0x1059,0x1059,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,
-0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,
-0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,
-0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,
-0x1083,0x1083,0x1083,0x1086,0x1083,0x1083,0x1089,0x1089,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,
-0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,
-0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,
-0x1095,0x1095,0x1095,0x1095,0x1098,0x108f,0x109e,0x109b,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,
-0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,
-0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1362,0x135f,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,
-0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10ad,0x112e,0x10a1,0x10a1,0x10a1,0x10a7,0x1431,0x1431,0x1431,0x1431,
-0x1431,0x1431,0x1431,0x1431,0x10a4,0x10a4,0x10a7,0x10b3,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,
-0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,
-0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x1548,0x1545,0x1548,0x1545,0x154b,0x154b,0x1728,0x1431,
-0x10bc,0x10bc,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,
-0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,
-0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10ce,0x10ce,0x10ce,0x10ce,
-0x10ce,0x10ce,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c8,0x10c8,0x10c8,0x1122,0x10d1,0x10e0,0x10e0,0x10e0,0x10e0,
-0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10cb,0x10cb,0x10cb,0x10cb,
-0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,
-0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ef,0x10ef,0x10ef,0x10ef,
-0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,
-0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x1101,0x1101,0x1101,0x1101,
-0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,
-0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x110a,0x110a,0x110a,0x110a,
-0x111f,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,
-0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110d,0x110d,0x110d,0x110d,
-0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,
-0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x1119,0x1119,0x1119,0x1119,
-0x12bd,0x12bd,0x12bd,0x12bd,0x12bd,0x12bd,0x12bd,0x12bd,0x14bb,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,
-0x17a6,0x17a6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x118e,0x118e,0x118e,0x118e,
-0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,
-0x118e,0x118e,0x1185,0x1185,0x1188,0x1188,0x118e,0x1185,0x1185,0x1185,0x1185,0x1185,0x1194,0x1194,0x1194,0x1194,
-0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,
-0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x11af,0x11af,0x11af,0x11af,
-0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,
-0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11bb,0x11bb,0x11bb,0x11bb,
-0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,
-0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11b8,0x11be,0x11ca,0x11ca,0x11ca,0x11ca,
-0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,
-0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11d0,0x11d0,0x11d0,0x11d0,
-0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x1308,0x11d6,0x130b,
-0x11d6,0x11d6,0x11d6,0x11d6,0x11d3,0x11d3,0x11d3,0x11d6,0x172b,0x172e,0x1950,0x194d,0x11d9,0x11d9,0x11d9,0x11e8,
-0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,
-0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11dc,
-0x11e8,0x11e8,0x11d9,0x11d9,0x11d9,0x11d9,0x11e8,0x11e8,0x11d9,0x11e8,0x11e8,0x11e8,0x11fa,0x11fa,0x11fa,0x11fa,
-0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fd,0x11fa,0x11fa,0x11fa,
-0x11fa,0x11fa,0x11fa,0x11f4,0x11f4,0x11f4,0x11fa,0x11f7,0x1551,0x1554,0x1557,0x1557,0x120c,0x120c,0x120c,0x120c,
-0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x1200,0x120c,0x1200,0x1200,
-0x1200,0x1215,0x1215,0x1200,0x1200,0x1215,0x120c,0x1215,0x1215,0x120c,0x1200,0x1203,0x120c,0x120c,0x120c,0x120c,
-0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,
-0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x1227,0x1227,0x1227,0x1227,
-0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,
-0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x123f,0x123f,0x123f,0x123f,
+0x1131,0x1131,0x1131,0x1131,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x14d6,0x17c1,0x17c1,0x17c1,
+0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,
+0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,
+0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x119d,0x119d,0x11a0,0x11a0,0x11a6,0x119d,0x119d,0x119d,0x119d,0x119d,
+0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,
+0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,
+0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,
+0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,
+0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,
+0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d0,0x11d6,
+0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,
+0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,
+0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,
+0x11e8,0x1323,0x11ee,0x1326,0x11ee,0x11ee,0x11ee,0x11ee,0x11eb,0x11eb,0x11eb,0x11ee,0x1746,0x1749,0x196b,0x1968,
+0x11f1,0x11f1,0x11f1,0x1200,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,
+0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,
+0x1206,0x1206,0x1206,0x11f4,0x1200,0x1200,0x11f1,0x11f1,0x11f1,0x11f1,0x1200,0x1200,0x11f1,0x11f1,0x1200,0x1200,
+0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,
+0x1215,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x120c,0x120c,0x120c,0x1212,0x120f,0x156c,0x156f,0x1572,0x1572,
+0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,
+0x1218,0x1224,0x1218,0x1218,0x1218,0x122d,0x122d,0x1218,0x1218,0x122d,0x1224,0x122d,0x122d,0x1224,0x1218,0x121b,
+0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,
+0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,
+0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,
0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,
-0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123c,0x123c,0x123c,0x1248,0x1248,0x1248,0x1248,
-0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,
-0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1257,0x1257,0x1257,0x1257,
0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,
-0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x125d,0x125d,0x126c,0x126f,
+0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1254,0x1254,0x1254,
+0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,
+0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,
0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,
-0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x1272,0x126f,0x1272,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,
-0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x1272,0x126f,0x126f,0x126f,0x126f,0x126c,0x126c,0x126c,0x1260,
-0x1260,0x1260,0x1260,0x126c,0x126c,0x1266,0x1263,0x1269,0x1269,0x1278,0x1275,0x1275,0x127b,0x127b,0x127b,0x127b,
-0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,
-0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x1281,0x1281,0x1281,0x127e,
-0x127e,0x127e,0x127b,0x127b,0x127b,0x127b,0x127e,0x127b,0x127b,0x127b,0x1281,0x127e,0x1281,0x127e,0x127b,0x127b,
-0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,
-0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x1281,0x127e,0x127e,0x127b,0x127b,0x127b,0x127b,
-0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a5,0x12a5,0x12a5,0x1284,0x1956,
-0x13b0,0x12ae,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x12ae,0x13b0,0x12ae,
-0x128d,0x128d,0x133e,0x128a,0x133e,0x133e,0x133e,0x133e,0x128a,0x1290,0x12b7,0x128a,0x128a,0x128a,0x128a,0x128a,
-0x1290,0x1293,0x12b7,0x12b7,0x1293,0x12b7,0x128a,0x1293,0x1293,0x1296,0x12b7,0x128a,0x128a,0x12b7,0x128d,0x128d,
-0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x129f,0x129f,0x129f,0x129f,0x13c8,0x13a7,
-0x12a8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x1854,0x1854,0x1854,0x1854,0x1854,
-0x13b0,0x13b0,0x12ae,0x13b0,0x13b0,0x13b0,0x12ae,0x13b0,0x13b0,0x13b0,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x13aa,
-0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x12ab,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x12ab,
-0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,
-0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,
-0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,
-0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,
-0x1395,0x1386,0x1395,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,
-0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,
-0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,
-0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,
-0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,
-0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,
-0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13d4,0x13d1,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,
-0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,
-0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,
-0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13da,0x13da,0x13dd,
-0x13dd,0x13dd,0x13dd,0x13dd,0x13da,0x13dd,0x13dd,0x13dd,0x13da,0x13dd,0x13da,0x13dd,0x13da,0x13dd,0x13dd,0x13dd,
-0x13dd,0x13dd,0x13e0,0x13dd,0x13dd,0x13dd,0x13dd,0x13da,0x13dd,0x13da,0x13da,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,
-0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13dd,
-0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13da,
-0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,
-0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,
-0x13da,0x13da,0x1563,0x1563,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,
-0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,
-0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x156f,0x1569,0x1569,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,
-0x156f,0x17a9,0x17a9,0x17a9,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x156f,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,
-0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,
-0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x156f,0x17a9,0x17a9,0x13dd,0x13dd,0x13dd,0x13dd,
-0x13dd,0x13e0,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,
-0x1569,0x1569,0x156f,0x156f,0x1569,0x156f,0x156f,0x156f,0x1566,0x1566,0x156f,0x156f,0x13dd,0x13dd,0x13e0,0x13e0,
-0x13e0,0x16da,0x13dd,0x13e0,0x13dd,0x13dd,0x13e0,0x1572,0x1572,0x156f,0x156f,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,
-0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x13dd,0x13dd,0x13dd,0x13dd,
-0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x1569,0x1569,0x156f,
-0x16da,0x156f,0x1569,0x156f,0x17a9,0x17a9,0x17a9,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x13dd,0x13dd,0x13dd,0x13dd,
-0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,
-0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x156f,0x13dd,0x156f,0x13e0,0x13e0,
-0x13dd,0x13dd,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13dd,0x13dd,0x13dd,
-0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13e0,0x13e0,
-0x13e0,0x13e0,0x13dd,0x13dd,0x13dd,0x13dd,0x13e0,0x13dd,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,
-0x13e0,0x13dd,0x13dd,0x13dd,0x13e0,0x13dd,0x13dd,0x13dd,0x13dd,0x13e0,0x13e0,0x13e0,0x13dd,0x13e0,0x13e0,0x13e0,
-0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,
-0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x16da,0x13dd,0x13dd,0x13dd,0x13dd,0x156f,0x1569,0x17a9,
-0x1437,0x1437,0x1437,0x1437,0x1563,0x1563,0x1566,0x1566,0x1566,0x156c,0x156f,0x17a9,0x17a9,0x17a9,0x17a9,0x1731,
-0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,
-0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x156f,0x156f,0x1569,0x1569,0x156f,0x1572,0x1572,0x156f,0x156f,
-0x156f,0x156f,0x185d,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x156f,0x1569,0x156f,0x1569,0x1569,0x1569,0x1569,
-0x156f,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x156f,0x1569,0x1569,0x1569,0x156f,0x1566,0x1566,0x1566,0x1566,
-0x1566,0x1566,0x156f,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x14c1,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,
-0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x14c1,0x13e3,0x13e3,0x13e3,0x14c1,0x13e3,0x14c1,
-0x13e3,0x14c1,0x13e3,0x14c1,0x13e3,0x13e3,0x13e3,0x14c1,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x14c1,0x14c1,
-0x13e3,0x13e3,0x13e3,0x13e3,0x14c1,0x13e3,0x14c1,0x14c1,0x13e3,0x13e3,0x13e3,0x13e3,0x14c1,0x13e3,0x13e3,0x13e3,
-0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x16e0,0x16e0,0x17af,0x17af,0x13e6,0x13e6,0x13e6,
-0x13e3,0x13e3,0x13e3,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,
-0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,
-0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,
-0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13ec,0x13e9,0x13e9,0x13e9,0x13e9,
-0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13ec,0x13ec,0x13ec,0x13e9,
-0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,
-0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,
-0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x17dc,0x17dc,0x17d9,0x1734,0x143d,0x143d,0x143d,0x143d,
-0x143d,0x143d,0x143a,0x143a,0x143a,0x143a,0x143a,0x143a,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,
-0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x157b,0x1449,0x1449,0x1449,0x145b,0x145b,0x145b,0x145b,0x145b,
-0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,
-0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,
+0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,
+0x1275,0x1275,0x1284,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,
+0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x128a,0x1287,0x128a,0x1287,0x1287,0x1287,
+0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x128a,0x1287,0x1287,0x1287,0x1287,
+0x1284,0x1284,0x1284,0x1278,0x1278,0x1278,0x1278,0x1284,0x1284,0x127e,0x127b,0x1281,0x1281,0x1290,0x128d,0x128d,
+0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,
+0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,
+0x1299,0x1299,0x1299,0x1296,0x1296,0x1296,0x1293,0x1293,0x1293,0x1293,0x1296,0x1293,0x1293,0x1293,0x1299,0x1296,
+0x1299,0x1296,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,
+0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1299,0x1296,0x1296,
+0x1293,0x1293,0x1293,0x1293,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12bd,
+0x12bd,0x12bd,0x129c,0x1971,0x13cb,0x12c6,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,
+0x13cb,0x12c6,0x13cb,0x12c6,0x12a5,0x12a5,0x1359,0x12a2,0x1359,0x1359,0x1359,0x1359,0x12a2,0x12a8,0x12cf,0x12a2,
+0x12a2,0x12a2,0x12a2,0x12a2,0x12a8,0x12ab,0x12cf,0x12cf,0x12ab,0x12cf,0x12a2,0x12ab,0x12ab,0x12ae,0x12cf,0x12a2,
+0x12a2,0x12cf,0x12a5,0x12a5,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x12b7,0x12b7,
+0x12b7,0x12b7,0x13e3,0x13c2,0x12c0,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x186f,
+0x186f,0x186f,0x186f,0x186f,0x13cb,0x13cb,0x12c6,0x13cb,0x13cb,0x13cb,0x12c6,0x13cb,0x13cb,0x13cb,0x12c0,0x12c0,
+0x12c0,0x12c0,0x12c0,0x13c5,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x12c3,0x13c8,0x13c8,0x13c8,0x13c8,
+0x13c8,0x13c8,0x13c8,0x12c3,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,
+0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,
+0x12ed,0x12ed,0x12ed,0x12ed,0x1377,0x1374,0x1377,0x1374,0x1377,0x1374,0x1377,0x1374,0x1377,0x1374,0x143d,0x1554,
+0x1554,0x1554,0x17ee,0x195f,0x1554,0x1554,0x173d,0x173d,0x173d,0x1737,0x173d,0x1737,0x1962,0x195f,0x1a1c,0x1a19,
+0x1a1c,0x1a19,0x1a1c,0x1a19,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,
+0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,
+0x139b,0x139b,0x139b,0x139b,0x13b0,0x13a1,0x13b0,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,
+0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,
+0x13b3,0x13b3,0x13b3,0x13b3,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13b9,0x13b9,0x13b9,0x13b9,
+0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,
+0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13bf,0x13bf,0x13bf,0x13bf,
+0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,
+0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13ef,0x13ec,0x1917,0x1917,
+0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,
+0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x13f8,0x13f8,0x13f8,0x13f8,
+0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,
+0x13f8,0x13f5,0x13f5,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f5,0x13f8,0x13f8,0x13f8,0x13f5,0x13f8,0x13f5,0x13f8,
+0x13f5,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13fb,0x13f8,0x13f8,0x13f8,0x13f8,0x13f5,0x13f8,0x13f5,0x13f5,0x13f8,
+0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f5,0x13f5,0x13f5,0x13f5,
+0x13f5,0x13f5,0x13f5,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,
+0x13f8,0x13f8,0x13f8,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f8,0x13f8,0x13f8,
+0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,
+0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x157e,0x157e,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,
+0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,
+0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x158a,0x1584,0x1584,0x158a,0x158a,0x158a,0x158a,
+0x158a,0x158a,0x158a,0x158a,0x158a,0x17c4,0x17c4,0x17c4,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x158a,0x13f8,
+0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,
+0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x158a,0x17c4,0x17c4,
+0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13fb,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,
+0x13f8,0x13f8,0x13f8,0x13f8,0x1584,0x1584,0x158a,0x158a,0x1584,0x158a,0x158a,0x158a,0x1581,0x1581,0x158a,0x158a,
+0x13f8,0x13f8,0x13fb,0x13fb,0x13fb,0x16f5,0x13f8,0x13fb,0x13f8,0x13f8,0x13fb,0x158d,0x158d,0x158a,0x158a,0x17c4,
+0x17c4,0x17c4,0x17c4,0x17c4,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,
+0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,
+0x13f8,0x1584,0x1584,0x158a,0x16f5,0x158a,0x1584,0x158a,0x17c4,0x17c4,0x17c4,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,
+0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,
+0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x158a,
+0x13f8,0x158a,0x13fb,0x13fb,0x13f8,0x13f8,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,
+0x13fb,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,
+0x13f8,0x13f8,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,
+0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13f8,0x13f8,0x13f8,0x13fb,0x13f8,0x13f8,0x13f8,0x13f8,0x13fb,0x13fb,0x13fb,
+0x13f8,0x13fb,0x13fb,0x13fb,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13fb,0x13f8,0x13fb,0x13f8,0x13f8,
+0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,
+0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x16f5,0x13f8,0x13f8,0x13f8,0x13f8,0x158a,0x1584,0x17c4,
+0x1452,0x1452,0x1452,0x1452,0x157e,0x157e,0x1581,0x1581,0x1581,0x1587,0x158a,0x17c4,0x17c4,0x17c4,0x17c4,0x174c,
+0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,
+0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x158a,0x158a,0x1584,0x1584,0x158a,0x158d,0x158d,0x158a,0x158a,
+0x158a,0x158a,0x1878,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x158a,0x1584,0x158a,0x1584,0x1584,0x1584,0x1584,
+0x158a,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x158a,0x1584,0x1584,0x1584,0x158a,0x1581,0x1581,0x1581,0x1581,
+0x1581,0x1581,0x158a,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x14dc,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,
+0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x14dc,0x13fe,0x13fe,0x13fe,0x14dc,0x13fe,0x14dc,
+0x13fe,0x14dc,0x13fe,0x14dc,0x13fe,0x13fe,0x13fe,0x14dc,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x14dc,0x14dc,
+0x13fe,0x13fe,0x13fe,0x13fe,0x14dc,0x13fe,0x14dc,0x14dc,0x13fe,0x13fe,0x13fe,0x13fe,0x14dc,0x13fe,0x13fe,0x13fe,
+0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x16fb,0x16fb,0x17ca,0x17ca,0x1401,0x1401,0x1401,
+0x13fe,0x13fe,0x13fe,0x1401,0x1401,0x1401,0x1401,0x1401,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,
+0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,
+0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,
+0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1407,0x1404,0x1404,0x1404,0x1404,
+0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1407,0x1407,0x1407,0x1404,
+0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,
+0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,
+0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x17f7,0x17f7,0x17f4,0x174f,0x1458,0x1458,0x1458,0x1458,
+0x1458,0x1458,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,
+0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1596,0x1464,0x1464,0x1464,0x1476,0x1476,0x1476,0x1476,0x1476,
0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,
-0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,
-0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,
-0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x1485,0x1485,0x1491,0x1497,0x1497,0x1497,0x1497,0x1497,
+0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,
+0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,
+0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,
0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,
-0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1491,0x1491,0x1491,0x1485,0x1485,
-0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1491,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,
-0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,
-0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,
-0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,
-0x1515,0x1515,0x192c,0x192c,0x192c,0x1515,0x1515,0x1515,0x1569,0x1569,0x156f,0x156f,0x156f,0x1569,0x1569,0x1569,
-0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x156f,0x156f,0x156f,0x1566,0x1566,0x1566,0x1566,
-0x1566,0x1566,0x1566,0x1566,0x156f,0x156f,0x156f,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x156f,
-0x1569,0x1569,0x156f,0x156f,0x156f,0x156f,0x1569,0x1569,0x1572,0x1569,0x1569,0x1569,0x1569,0x16dd,0x16dd,0x1569,
-0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x185a,0x156f,0x1569,0x1569,0x156f,0x1569,0x1569,0x1569,
-0x1569,0x1569,0x1569,0x1569,0x1569,0x156f,0x156f,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,
-0x156f,0x1569,0x1569,0x1569,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,
-0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,
-0x1593,0x1593,0x1593,0x1593,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,
-0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,
-0x15a5,0x15a5,0x15a5,0x15a5,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,
-0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,
-0x15ab,0x15ab,0x15ab,0x15ab,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,
+0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1a25,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,
+0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,
+0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x14a0,0x14a0,0x14ac,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,
+0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,
+0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14ac,0x14ac,0x14ac,0x14a0,0x14a0,
+0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14ac,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,
+0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,
+0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,
+0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,
+0x1530,0x1530,0x1947,0x1947,0x1947,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,
+0x1530,0x1a13,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x18ae,0x1947,0x1947,0x1947,0x1947,0x1947,
+0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1584,0x1584,0x158a,0x158a,0x158a,0x1584,0x1584,0x1584,
+0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x158a,0x158a,0x158a,0x1581,0x1581,0x1581,0x1581,
+0x1581,0x1581,0x1581,0x1581,0x158a,0x158a,0x158a,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x158a,
+0x1584,0x1584,0x158a,0x158a,0x158a,0x158a,0x1584,0x1584,0x158d,0x1584,0x1584,0x1584,0x1584,0x16f8,0x16f8,0x1584,
+0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1875,0x158a,0x1584,0x1584,0x158a,0x1584,0x1584,0x1584,
+0x1584,0x1584,0x1584,0x1584,0x1584,0x158a,0x158a,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,
+0x158a,0x1584,0x1584,0x1584,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,
0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,
-0x15ae,0x15ae,0x15ae,0x15ae,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,
-0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,
-0x15ed,0x15ed,0x15ed,0x15de,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,
-0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f0,
-0x15f9,0x15f9,0x15f9,0x15f9,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,
-0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,
-0x15fc,0x15fc,0x15fc,0x15fc,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x160e,0x1617,0x1617,0x1617,
+0x15ae,0x15ae,0x15ae,0x15ae,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,
+0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,
+0x15c0,0x15c0,0x15c0,0x15c0,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,
+0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,
+0x15c6,0x15c6,0x15c6,0x15c6,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,
+0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,
+0x15c9,0x15c9,0x15c9,0x15c9,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,
+0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,
+0x1608,0x1608,0x1608,0x15f9,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,
+0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x160b,
+0x1614,0x1614,0x1614,0x1614,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,
0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,
-0x1617,0x1617,0x1617,0x1617,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,
-0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,
-0x1620,0x1620,0x1620,0x1620,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,
-0x1632,0x1632,0x1632,0x1632,0x162f,0x162f,0x162f,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x162f,
-0x162f,0x1623,0x162f,0x1626,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,
+0x1617,0x1617,0x1617,0x1617,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1629,0x1632,0x1632,0x1632,
0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,
-0x1632,0x1632,0x1632,0x1632,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,
-0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,
-0x1656,0x1653,0x1653,0x1653,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,
-0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x1665,0x1665,0x1665,0x1662,0x1662,0x1662,
-0x165f,0x165f,0x165f,0x165f,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,
-0x1674,0x1674,0x1674,0x1674,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x167a,0x167a,0x166e,0x166b,0x166b,
-0x166b,0x166b,0x166b,0x166b,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,
-0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,
-0x1674,0x1674,0x1674,0x1674,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,
-0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x167d,0x167d,0x167d,0x167d,0x167d,
-0x167d,0x167d,0x167d,0x167d,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,
-0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,
-0x1683,0x1683,0x1683,0x1683,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,
-0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,
-0x16a7,0x16a7,0x16a7,0x16a7,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,
-0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,
-0x16b0,0x16b0,0x16b0,0x16b0,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,
-0x16c8,0x16c8,0x16c8,0x16c8,0x16b3,0x16c2,0x16c2,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16c2,0x16b3,0x16c5,
-0x16c5,0x16b3,0x16c5,0x16b3,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,
-0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,
-0x16c8,0x16c8,0x16c8,0x16c8,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,
-0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,
-0x16d1,0x16d1,0x16d1,0x16d1,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,
-0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,
-0x16d7,0x16d7,0x16d7,0x16d7,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,
-0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,
-0x173a,0x173a,0x173a,0x173a,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,
-0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,
-0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x177c,0x1779,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,
-0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,
-0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,
-0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,
-0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,
-0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,
-0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,
-0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,
-0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,
-0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,
+0x1632,0x1632,0x1632,0x1632,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,
+0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,
+0x163b,0x163b,0x163b,0x163b,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,
+0x164d,0x164d,0x164d,0x164d,0x164a,0x164a,0x164a,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x164a,
+0x164a,0x163e,0x164a,0x1641,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,
+0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,
+0x164d,0x164d,0x164d,0x164d,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,
+0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,
+0x1671,0x166e,0x166e,0x166e,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,
+0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x1680,0x1680,0x1680,0x167d,0x167d,0x167d,
+0x167a,0x167a,0x167a,0x167a,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,
+0x168f,0x168f,0x168f,0x168f,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1695,0x1695,0x1689,0x1686,0x1686,
+0x1686,0x1686,0x1686,0x1686,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,
+0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,
+0x168f,0x168f,0x168f,0x168f,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,
+0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x1698,0x1698,0x1698,0x1698,0x1698,
+0x1698,0x1698,0x1698,0x1698,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,
+0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,
+0x169e,0x169e,0x169e,0x169e,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,
+0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,
+0x16c2,0x16c2,0x16c2,0x16c2,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,
+0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,
+0x16cb,0x16cb,0x16cb,0x16cb,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,
+0x16e3,0x16e3,0x16e3,0x16e3,0x16ce,0x16dd,0x16dd,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16dd,0x16ce,0x16e0,
+0x16e0,0x16ce,0x16e0,0x16ce,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,
+0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,
+0x16e3,0x16e3,0x16e3,0x16e3,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,
+0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,
+0x16ec,0x16ec,0x16ec,0x16ec,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,
+0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,
+0x16f2,0x16f2,0x16f2,0x16f2,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,
+0x1734,0x1734,0x1734,0x1734,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,
+0x1947,0x1947,0x1947,0x1a13,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,
+0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,
+0x1755,0x1755,0x1755,0x1755,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,
+0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,
+0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1797,0x1794,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,
+0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,
0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,
-0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179d,0x179d,0x179d,0x179d,0x179a,
-0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179d,0x179d,0x179d,
-0x179d,0x179d,0x179d,0x179d,0x179d,0x179a,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,
+0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,
0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,
-0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,
+0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,
+0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,
+0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,
+0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,
+0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,
0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,
-0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x1866,0x1866,0x1866,
-0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,
-0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x17fa,0x17fa,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,
-0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,
-0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,
-0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,
-0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,
-0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1845,0x1845,0x1845,
-0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,
-0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,
-0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1863,0x1866,
-0x1866,0x1866,0x1866,0x1866,0x1902,0x19e0,0x19e0,0x19e0,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,
-0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1902,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,
-0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,
-0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,
-0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,
-0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,
-0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,
-0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,
-0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18d5,0x18db,0x18d8,0x18d8,0x18d8,
-0x18d8,0x18e7,0x18ed,0x18d8,0x18d8,0x18d8,0x18d8,0x18e4,0x18ea,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,
-0x18d8,0x18d8,0x18d8,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,
-0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,
-0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,
-0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x19e0,
-0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,
-0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,
-0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,
-0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,
-0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,
-0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,
-0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,
-0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,
+0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b8,0x17b8,0x17b8,0x17b8,0x17b5,
+0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b8,0x17b8,0x17b8,
+0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b5,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,
+0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,
+0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,
+0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,
+0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x1881,0x1881,0x1881,
+0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,
+0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x1815,0x1815,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,
+0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,
+0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,
+0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,
+0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,
+0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1860,0x1860,0x1860,
+0x184b,0x184b,0x184b,0x184b,0x184b,0x184b,0x184b,0x184b,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,
+0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,
+0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1884,0x1881,
+0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x1884,0x1920,0x1920,0x1884,0x1884,0x1884,0x1884,0x1884,
+0x1884,0x1884,0x1881,0x187e,0x1884,0x1884,0x1884,0x1a85,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x187e,0x1881,
+0x1881,0x1881,0x1881,0x1881,0x191d,0x19fb,0x19fb,0x19fb,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,
+0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x191d,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,
+0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,
+0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,
+0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,
+0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x18e4,0x18e4,0x18e4,0x18e4,0x1a37,0x1a37,0x18e7,0x18e7,
+0x18e7,0x18e7,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18e1,
+0x18d2,0x18d5,0x18d8,0x18ea,0x18ea,0x1986,0x18db,0x18db,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,
+0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,
+0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,
+0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x18f0,0x18f6,0x18f3,0x18f3,0x18f3,
+0x18f3,0x1902,0x1908,0x18f3,0x18f3,0x18f3,0x18f3,0x18ff,0x1905,0x18f3,0x18f3,0x18f3,0x18f3,0x18f3,0x18f3,0x18f3,
+0x18f3,0x18f3,0x18f3,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,
+0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,
+0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,
+0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x19fb,
+0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,
+0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,
+0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,
+0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,
+0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,
+0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,
0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,
-0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,
-0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,
-0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,
+0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,
+0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,
+0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,
0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,
-0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,
-0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,
-0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,
-0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,
-0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c5,0x19c5,0x19c5,0,0,0,0
+0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,
+0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,
+0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,
+0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,
+0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,
+0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,
+0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e0,0x19e0,0x19e0,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,
+0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,
+0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,
+0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,
+0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,
+0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1aa0,0x1aa0,0x1a6a,0x1aa0,0x1a6a,0x1a6a,0x1a6a,0x1a6a,
+0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a70,0x1a70,0x1a70,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,
+0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,
+0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0,0,0,0
};
static const UTrie2 propsVectorsTrie={
propsVectorsTrie_index,
- propsVectorsTrie_index+4948,
+ propsVectorsTrie_index+4952,
NULL,
- 4948,
- 25064,
+ 4952,
+ 25636,
0xa40,
- 0x13d4,
+ 0x13d8,
0x0,
0x0,
0x110000,
- 0x7538,
+ 0x7778,
NULL, 0, FALSE, FALSE, 0, NULL
};
-static const uint32_t propsVectors[6639]={
+static const uint32_t propsVectors[6822]={
0x67,0,0,0x67,0,0x4e00000,0x67,0x80000,0x20,0x867,0,0,0xa67,0,0,0xb67,
0,0,0xc67,0,0,0xd67,0,0,0xe67,0,0,0x1067,0,0,0x1167,0,
0,0x1267,0,0,0x1367,0,0,0x1467,0,0,0x1567,0,0,0x1667,0,0,
@@ -3307,401 +3375,414 @@ static const uint32_t propsVectors[6639]={
0,0,0x11467,0,0,0x11567,0,0,0x11667,0,0,0x11767,0,0,0x11867,0,
0,0x11967,0,0x4e00000,0x11a67,0,0,0x11b67,0,0,0x11c67,0,0,0x11d67,0,0,
0x11e67,0,0,0x11f67,0,0,0x12067,0,0,0x12167,0,0,0x12267,0,0,0x12367,
-0,0,0xa0067,0,0xe00000,0xa4667,0,0xe00000,0xa4767,0,0xe00000,0xa4f67,0,0xe00000,0xa5e67,0,
-0xe00000,0xa5f67,0,0xe00000,0xac567,0,0xe00000,0xad167,0,0xe00000,0xb0067,0,0xe00000,0xb1267,0,0xe00000,
-0x11000100,0,0x900020,0x11000100,0x40000001,0x440020,0x11000100,0x40000001,0x643020,0x11000100,0x40000001,0xa5a040,0x11000100,0x40000001,0x116a8a0,0x11000200,
-0,0x900020,0x11000200,0x4000001,0xc4000b,0x11000200,0x7c00100,0x220402,0x11000200,0x24000000,0x14200000,0x11000200,0x24000008,0x1710000,0x11000200,0x40000001,
-0x1d3b020,0x11000219,0x7c00100,0x220401,0x11000219,0x7c00100,0x250401,0x11000319,0x7c00100,0x220401,0x11000319,0x7c00100,0x220402,0x11000319,0x7c00100,0x250400,
-0x11000319,0x7c00100,0x250401,0x11000419,0x7c00100,0x220400,0x11000419,0x7c00100,0x220401,0x11000419,0x7c00100,0x220402,0x11000419,0x7c00100,0x230400,0x11000419,
-0x7c00100,0x250400,0x11000419,0x7c00100,0x250401,0x11000419,0x7c00100,0x250402,0x11000519,0x7c00100,0x220400,0x11000519,0x7c00100,0x230400,0x11000600,0x4000400,
-0x200000,0x11000600,0x4000400,0x200002,0x11000600,0x4000400,0x200400,0x11000600,0x7c00500,0x220400,0x11000600,0x7c00500,0x230400,0x11000600,0x7c00500,0x530400,
-0x11000600,0x7c00d00,0x230400,0x11000619,0x7c00500,0x22040f,0x11000800,0x4000010,0x1001401,0x11000800,0x4000400,0x200001,0x11000800,0x6800010,0x201001,0x11000800,
-0x7c00500,0x230401,0x11000807,0x7c00100,0x220400,0x11000807,0x7c00100,0x250400,0x1100080e,0x4000400,0x200000,0x1100080e,0x4000400,0x200002,0x1100080e,0x7000500,
-0x220402,0x1100080e,0x7c00100,0x220400,0x1100080e,0x7c00100,0x220401,0x1100080e,0x7c00100,0x220402,0x1100080e,0x7c00100,0x250400,0x1100080e,0x7c00100,0x250401,
-0x1100080e,0x7c00120,0x220402,0x1100080e,0x7c00120,0x250402,0x11000908,0x4000000,0x200000,0x11000908,0x7c00100,0x220400,0x11000908,0x7c00100,0x220401,0x11000908,
-0x7c00100,0x250400,0x11000908,0x7c00100,0x250401,0x11000a03,0x4000000,0x200000,0x11000a03,0x4000000,0x200400,0x11000a03,0x4000000,0x270000,0x11000a03,0x7c00100,
-0x220400,0x11000a03,0x7c00100,0x220402,0x11000a03,0x7c00100,0x250400,0x11000a03,0x7c00500,0x230400,0x11000b13,0x2802500,0x962460,0x11000b13,0x4000000,0x200000,
-0x11000b13,0x4000000,0x201000,0x11000b13,0x4000000,0x230400,0x11000b13,0x4000002,0x400000,0x11000b13,0x4000010,0x200000,0x11000b13,0x7c00100,0x2633800,0x11000c00,
-0x80000000,0x218960,0x11000c02,0x2802100,0x962460,0x11000c02,0x2802400,0x962460,0x11000c02,0x4000000,0x200000,0x11000c02,0x4000000,0x1329400,0x11000c02,0x4000000,
-0x1329800,0x11000c02,0x4000000,0x1500000,0x11000c02,0x6800000,0x1329800,0x11000c02,0x7c00100,0x230400,0x11000c02,0x7c00100,0x230401,0x11000c02,0x7c00100,0x230402,
-0x11000c02,0x7c00500,0x230400,0x11000c02,0x7d00100,0x230400,0x11000f0a,0x2802100,0x962460,0x11000f0a,0x2802400,0x962460,0x11000f0a,0x2806400,0x962460,0x11000f0a,
-0x4000000,0x200000,0x11000f0a,0x6800100,0x962540,0x11000f0a,0x7c00100,0x230400,0x11000f0a,0x7c00100,0x230401,0x11001004,0x2802100,0x962460,0x11001004,0x2802400,
-0x962460,0x11001004,0x2806400,0x962460,0x11001004,0x4000000,0x200000,0x11001004,0x4000000,0x1500000,0x11001004,0x6800100,0x962540,0x11001004,0x6800100,0x962541,
-0x11001004,0x7c00100,0x230400,0x11001004,0x7c00100,0x230401,0x11001110,0x2802100,0x962460,0x11001110,0x2802400,0x962460,0x11001110,0x2806400,0x962460,0x11001110,
-0x6800100,0x962540,0x11001110,0x7c00100,0x230400,0x11001110,0x7c00100,0x230401,0x1100120f,0x2802100,0x962460,0x1100120f,0x2802400,0x962460,0x1100120f,0x2806400,
-0x962460,0x1100120f,0x6800100,0x962540,0x1100120f,0x7c00100,0x230400,0x1100131f,0x2802100,0x962460,0x1100131f,0x2802400,0x962460,0x1100131f,0x2806400,0x962460,
-0x1100131f,0x4000000,0x200000,0x1100131f,0x6800000,0x1329800,0x1100131f,0x6800100,0x962540,0x1100131f,0x6800100,0x962541,0x1100131f,0x7c00100,0x230400,0x1100131f,
-0x7c00100,0x230401,0x11001423,0x2802100,0x962460,0x11001423,0x2806400,0x962460,0x11001423,0x6800100,0x962540,0x11001423,0x6800100,0x962541,0x11001423,0x7c00100,
-0x230400,0x11001423,0x7c00100,0x230401,0x11001524,0x2802100,0x962460,0x11001524,0x2802100,0x962461,0x11001524,0x2806400,0x962460,0x11001524,0x6800000,0x1329800,
-0x11001524,0x6800100,0x962540,0x11001524,0x7c00100,0x230400,0x11001615,0x2802100,0x962460,0x11001615,0x2806400,0x962460,0x11001615,0x6800000,0x1329800,0x11001615,
-0x6800100,0x962540,0x11001615,0x6800100,0x962541,0x11001615,0x7c00100,0x230400,0x1100171a,0x2802100,0x962460,0x1100171a,0x2806400,0x962460,0x1100171a,0x6800000,
-0x1329800,0x1100171a,0x6800100,0x962540,0x1100171a,0x6800100,0x962541,0x1100171a,0x7c00100,0x230400,0x11001900,0x4000000,0x1600000,0x11001926,0x2802100,0x1862460,
-0x11001926,0x2802400,0x1862460,0x11001926,0x2806100,0x1862460,0x11001926,0x4000000,0x200000,0x11001926,0x4000010,0x400000,0x11001926,0x6800000,0x1329800,0x11001926,
-0x7800100,0x1830142,0x11001926,0x7c00100,0x1830000,0x11001926,0x7c00900,0x1830000,0x11001926,0x7e00100,0x1830000,0x11001a18,0x2802100,0x1862460,0x11001a18,0x2802400,
-0x1862460,0x11001a18,0x6800000,0x1329800,0x11001a18,0x7800100,0x1830142,0x11001a18,0x7c00100,0x1830000,0x11001a18,0x7c00100,0x1830002,0x11001a18,0x7c00900,0x1830000,
-0x11001a18,0x7e00100,0x1830000,0x11001d0c,0x7c00100,0x220400,0x11001d0c,0x7c00100,0x250400,0x11001e12,0x7c00100,0x2230500,0x11001e12,0x7c00100,0x2330520,0x11001e12,
-0x7c80100,0x2330520,0x11002619,0x7c00100,0x220401,0x11002619,0x7c00100,0x220402,0x11002619,0x7c00100,0x250401,0x1100270e,0x4000400,0x200001,0x1100270e,0x4000400,
-0x200002,0x1100270e,0x4000400,0x500001,0x1100270e,0x7c00100,0x220401,0x1100270e,0x7c00100,0x250401,0x11002800,0x80000,0x918820,0x11002800,0x80000,0x1c18020,
-0x11002800,0x180000,0x918820,0x11002800,0x4000001,0x445801,0x11002800,0x4000001,0x445802,0x11002800,0x4000001,0xc4000b,0x11002800,0x6800000,0x201c00,0x11002800,
-0x6800020,0x201c00,0x11002800,0x24000000,0x200000,0x11002800,0x24000000,0x200002,0x11002800,0x24000000,0x810000,0x11002800,0x24000000,0x1410000,0x11002800,0x24000000,
-0x1500000,0x11002800,0x24000000,0x1500002,0x11002800,0x24000002,0x400000,0x11002800,0x24000006,0xc0000b,0x11002800,0x24000008,0x1410000,0x11002800,0x24000008,0x1710000,
-0x11002800,0x24000020,0x1001400,0x11002800,0x24000020,0x1500002,0x11002800,0x2c000010,0x1248000,0x11002800,0x2c000010,0x15248002,0x11002800,0x40000001,0x63b020,0x11002800,
-0x40080000,0x918820,0x11002801,0x80000,0xaa65620,0x11002801,0x82000,0x962460,0x11002900,0x4000000,0x20000e,0x11002900,0x4000000,0x20000f,0x11002900,0x4000020,
-0x20000e,0x11002900,0x4000020,0x20000f,0x11002900,0x4000020,0x81000e,0x11002900,0x4000020,0x81000f,0x11002900,0x4000020,0x141000e,0x11002900,0x4000020,0x141000f,
-0x11002900,0x4000022,0x20000e,0x11002900,0x4000022,0x20000f,0x11002a00,0x4000000,0x1500000,0x11002a00,0x4000000,0x1600000,0x11002a00,0x4000000,0x1600002,0x11002b01,
-0x2000,0x962460,0x11002b01,0x2802020,0x962460,0x11002c00,0x4000000,0x200000,0x11002c00,0x4000000,0x200002,0x11002c00,0x4000000,0x20000f,0x11002c00,0x4000020,
-0x200000,0x11002c00,0x7c00000,0x200000,0x11002c00,0x7c00020,0x200000,0x11002c00,0x7c00120,0x220405,0x11002c00,0x7c00120,0x230402,0x11002c00,0x7c00120,0x250402,
-0x11002c00,0x7c00120,0x250405,0x11002c19,0x7c00100,0x250400,0x11002c19,0x7c00100,0x250401,0x11002d00,0x4000000,0x100006,0x11002d00,0x4000000,0x200006,0x11002d19,
-0x7c00100,0x220402,0x11002d19,0x7c00100,0x230400,0x11002d19,0x7c00100,0x250402,0x11002e00,0x24000000,0x200000,0x11002e00,0x24000020,0x200000,0x11002e00,0x24000020,
-0x200001,0x11002e00,0x24000020,0x14200000,0x11002f00,0x24000020,0x200000,0x11002f00,0x24000020,0x200001,0x11002f00,0x24000020,0x200002,0x11002f00,0x24000020,0xf00000,
-0x11002f00,0x24000020,0x1600000,0x11002f00,0x24000022,0x1600000,0x11003000,0x24000000,0x200000,0x11003000,0x24000000,0x14200000,0x11003000,0x24000020,0x200000,0x11003000,
-0x24000020,0x810000,0x11003000,0x24000020,0x1410000,0x11003100,0x24000000,0x200000,0x11003200,0x24000000,0x200000,0x11003300,0x4000000,0x100003,0x11003400,0x24000000,
-0x100000,0x11003400,0x24000000,0x200000,0x11003500,0x24000000,0x200000,0x11003600,0x24000000,0x200000,0x11003600,0x24000000,0x14200000,0x11003600,0x24000020,0x200000,
-0x11003700,0x24000000,0x200000,0x11003700,0x24000000,0x4200000,0x11003700,0x24000000,0x4e00000,0x11003700,0x24000000,0x14200000,0x11003700,0x24000000,0x14e00000,0x11003700,
-0x24000000,0x96800000,0x11003700,0x24000020,0x4200000,0x11003800,0x4000000,0x100000,0x11003800,0x24000000,0x200000,0x11003800,0x24000000,0xb00000,0x11003800,0x24000000,
-0x1710000,0x11003800,0x24000000,0x4200000,0x11003800,0x24000000,0x4e00000,0x11003800,0x24000000,0x14200000,0x11003800,0x24000000,0x14b00000,0x11003800,0x24000000,0x14e00000,
-0x11003800,0x24000000,0x96800000,0x11005003,0x7c00100,0x220402,0x11005013,0x2802500,0x962460,0x11005013,0x4000020,0x200005,0x11005013,0x7c00100,0x2633801,0x11005013,
-0x7c00100,0x2633802,0x11005013,0x7c00100,0x2633805,0x11005019,0x7c00100,0x220402,0x11005100,0x24000000,0x810000,0x11005100,0x24000000,0x1410000,0x11005102,0x7000100,
-0x230408,0x11005102,0x7c00100,0x230404,0x11005102,0x7c00100,0x230407,0x11005102,0x7c00100,0x230408,0x11005102,0x7c00100,0x230409,0x11005201,0x2802400,0x962460,
-0x11005500,0x80000,0x1e18820,0x11005502,0x7000100,0x230408,0x11005502,0x7c00100,0x230404,0x11005502,0x7c00100,0x230407,0x11005502,0x7c00100,0x230408,0x11005502,
-0x7c00100,0x230409,0x11005667,0x1000,0,0x11020200,0x80004,0x418820,0x11020200,0x4000000,0x100006,0x11020200,0x4000000,0x10000f,0x11020200,0x4000400,
-0x100002,0x11020200,0x4000400,0x500002,0x11020200,0x6800c00,0x101000,0x11020200,0x24000000,0x100000,0x11020200,0x24000000,0x1400000,0x11020200,0x24000000,0x1500000,
-0x11020200,0x24000000,0x1600000,0x11020200,0x24000000,0x14200000,0x11020200,0x24000020,0x100000,0x11020200,0x24000020,0x1600000,0x11020219,0x7c00100,0x12040f,0x11020219,
-0x7c00100,0x220400,0x11020219,0x7c00100,0x220401,0x11020219,0x7c00100,0x250400,0x11020319,0x7c00100,0x220400,0x11020319,0x7c00100,0x220401,0x11020319,0x7c00100,
-0x220402,0x11020319,0x7c00100,0x250400,0x11020319,0x7c00100,0x250402,0x11020319,0x7d00100,0x220402,0x11020419,0x7c00100,0x220401,0x11020519,0x7c00100,0x220400,
-0x11020600,0x4000400,0x100002,0x11020600,0x4000400,0x200400,0x11020600,0x7c00500,0x130400,0x11020600,0x7c00d00,0x130400,0x11020701,0x2802400,0x962460,0x11020701,
-0x2802400,0x962461,0x11020701,0x2802400,0xc62460,0x1102080e,0x7c00100,0x220400,0x1102080e,0x7c00100,0x250400,0x11020908,0x7c00100,0x220400,0x11020908,0x7c00100,
-0x220401,0x11020908,0x7c00100,0x250400,0x11020908,0x7c00100,0x250401,0x11022800,0x24000000,0x100000,0x11022800,0x24000000,0x200000,0x11022800,0x24000000,0x200002,
-0x11022800,0x24000000,0x401000,0x11022800,0x24000000,0xf00002,0x11022800,0x24000000,0xf0ac02,0x11022800,0x24000000,0x1500000,0x11022800,0x24000002,0x100000,0x11022800,
-0x24000002,0x370000,0x11022800,0x24000002,0x470000,0x11022800,0x24000006,0x400000,0x11022800,0x24000008,0x1710000,0x11022800,0x24000008,0x1712c00,0x11022800,0x24000020,
-0x100000,0x11022800,0x24000020,0x1500000,0x11022800,0x24000020,0x1500002,0x11022900,0x4000000,0x10000e,0x11022900,0x4000000,0x10000f,0x11022919,0x7c00100,0x12040f,
-0x11022c00,0x4000000,0x100002,0x11022c00,0x4000000,0x1500002,0x11022c00,0x4000000,0x1600002,0x11022c00,0x4000000,0x1410000f,0x11022c00,0x7c00120,0x120405,0x11022c0e,
-0x7c00100,0x250401,0x11022c19,0x7c00100,0x150401,0x11022d00,0x4000000,0x100006,0x11022d00,0x4000000,0x200006,0x11022d19,0x7c00100,0x120402,0x11022d19,0x7c00100,
-0x150402,0x11022e00,0x24000000,0x200000,0x11022e00,0x24000020,0x100000,0x11022e00,0x24000020,0x14100000,0x11022f00,0x24000020,0x100000,0x11022f00,0x24000020,0x100001,
-0x11022f00,0x24000020,0x100002,0x11023000,0x24000000,0x100000,0x11023300,0x4000000,0x100002,0x11023300,0x4000000,0x100003,0x11023300,0x4000100,0x120403,0x11023300,
-0x4000100,0x150403,0x11023300,0x4000100,0x14150403,0x11023400,0x24000000,0x100000,0x11023500,0x24000000,0x100000,0x11023600,0x24000000,0x100000,0x11023600,0x24000020,
-0x100000,0x11023600,0x24000020,0x14100000,0x11023700,0x24000000,0x4100000,0x11023700,0x24000000,0x4e00000,0x11023700,0x24000000,0x14100000,0x11023700,0x24000000,0x14e00000,
-0x11023700,0x24000020,0x100000,0x11023700,0x24000020,0x4100000,0x11023700,0x24000020,0x14100000,0x11023800,0x4000000,0x100000,0x11023800,0x24000000,0x200000,0x11024e67,
-0,0,0x11025600,0x4000000,0x100000,0x11042a00,0x4000000,0x1600000,0x11045700,0x4000000,0x20000a,0x11045700,0x4000020,0x20000a,0x11045712,0x7c00100,
-0xe3040a,0x11045712,0x7c80100,0xe3040a,0x11045716,0x7c00100,0xe30c0a,0x11045716,0x7c00100,0x2530c0a,0x11063d00,0x4000001,0x445811,0x11065700,0x4000000,0x810011,
-0x11065700,0x4000000,0xe00011,0x11065700,0x4000000,0x1410011,0x11065700,0x4000000,0x1500011,0x11065700,0x4000000,0x1600011,0x11065700,0x4000006,0xe70011,0x11065700,
-0x4000008,0xe00011,0x11065700,0x4000008,0xe02c11,0x11065700,0x4000010,0x871411,0x11065700,0x4000010,0x1201411,0x11065700,0x4000010,0x1271011,0x11065700,0x4000020,
-0xe00011,0x11065700,0x4000400,0xe00011,0x11065700,0x4000420,0xe00011,0x11065700,0x6800000,0xe01c11,0x11065700,0x6800040,0xe00011,0x11065700,0xc000010,0x80ac11,
-0x11065700,0xc000010,0xb48011,0x11065719,0x7c00100,0xe20411,0x11065719,0x7c00100,0xe50411,0x11065719,0x7c00140,0xe20411,0x11065719,0x7c00140,0xe50411,0x11080100,
-0x6800000,0x201c00,0x11080100,0x68000c0,0x19329800,0x11080100,0x24000000,0x200000,0x11080100,0x24000000,0x810000,0x11080100,0x24000000,0x1410000,0x11080100,0x24000000,
-0x1500000,0x11080100,0x24000000,0x1600000,0x11080100,0x24000000,0x1b00000,0x11080100,0x24000000,0x2410000,0x11080100,0x24000000,0x18200000,0x11080100,0x24000006,0xd70000,
-0x11080100,0x24000008,0x1713c00,0x11080100,0x24000008,0x1714000,0x11080100,0x24000010,0x1001400,0x11080100,0x24000010,0x1071000,0x11080100,0x24000010,0x1071400,0x11080100,
-0x24000020,0x200000,0x11080100,0x24000020,0x400000,0x11080100,0x24000020,0x1600000,0x11080100,0x24000400,0x200000,0x11080100,0x24000420,0x200000,0x11080100,0x2c000010,
-0xb48000,0x11080100,0x2c000010,0x100ac00,0x11080100,0x44000001,0x1a45800,0x11080119,0x7c00100,0x220400,0x11080119,0x7c00100,0x250400,0x11080119,0x7c001c0,0x220400,
-0x11080119,0x7c001c0,0x250400,0x11080200,0x4000400,0x200002,0x11080200,0x24000000,0x200000,0x11080200,0x24000000,0x1500000,0x11080200,0x24000000,0x1600000,0x11080200,
-0x24000020,0x200000,0x110a1e12,0x7c00100,0x2130480,0x110a1e12,0x7c80100,0x2130480,0x110a3000,0x24000000,0x34e00000,0x110a3000,0x24100000,0x810001,0x110a3000,0x24100000,
-0x1410001,0x110a3700,0x24000000,0x34200000,0x110a3d00,0x4000000,0xe00000,0x110a3d00,0x4000000,0xe00002,0x110a3d00,0x24000000,0xe00000,0x110a3d11,0x7c00300,0xe30000,
-0x110a3d11,0x7c00900,0x1230400,0x110a3d12,0x2802400,0x962460,0x110a3e14,0x7c00100,0xe30000,0x110a3e14,0x7c00100,0xe30001,0x110a3e14,0x7c00100,0x2530000,0x110a3e14,
-0x7c00900,0x1230000,0x110a3e14,0x7c00900,0x1230001,0x110a3f16,0x7c00100,0xe30c00,0x110a3f16,0x7c00100,0xe30c01,0x110a3f16,0x7c00100,0x2530c00,0x110a3f16,0x7c00900,
-0x1230c00,0x110a3f16,0x7c00900,0x1230c01,0x110a4005,0x7c00100,0xe30400,0x110a4112,0x7c00100,0xe30402,0x110a4112,0x7c80100,0xe30402,0x110a4400,0x4000000,0xe00000,
-0x110a4412,0x4000000,0xe00002,0x110a4412,0x4000000,0xe00003,0x110a4416,0x4000000,0xe00c03,0x110a4500,0x4000000,0xe0000d,0x110a4516,0x4000000,0xe00c0d,0x110a4711,
-0x7c40300,0xe30000,0x110a4f11,0x7c00300,0xe30001,0x110a4f11,0x7c40300,0xe30000,0x110a5300,0x4000000,0x810010,0x110a5300,0x4000000,0xe00002,0x110a5300,0x4000000,
-0xe00010,0x110a5300,0x4000000,0x1410010,0x110a5300,0x4000002,0xe70010,0x110a5300,0x4000008,0x810010,0x110a5300,0x4000008,0x1410010,0x110a5300,0x6800000,0xe01c02,
-0x110a5300,0x6800000,0xe01c10,0x110a5400,0x4000000,0x81000c,0x110a5400,0x4000000,0xe0000c,0x110a5400,0x4000000,0x141000c,0x110a5400,0x4000000,0x150000c,0x110a5400,
-0x4000000,0x160000c,0x110a5400,0x4000002,0xe7000c,0x110a5400,0x4000010,0x87140c,0x110a5400,0x4000010,0xe7000c,0x110a5400,0x4000010,0x120140c,0x110a5400,0x4000010,
-0x127100c,0x110a5400,0x4000020,0xe0000c,0x110a5400,0x4000026,0xe7000c,0x110a5400,0xc000010,0x80ac0c,0x110a5400,0xc000010,0xb4800c,0x11400a0c,0xc000010,0x1049400,
-0x11400c0e,0x4000010,0xb00000,0x11400c0e,0x4000010,0x1071400,0x11400c0e,0xc000010,0xb48000,0x11400c17,0x7c00900,0x230400,0x11400f42,0xc000010,0x448000,0x11400f54,
-0xc000010,0x448000,0x11401d83,0x4000000,0x200000,0x11403dab,0x4000000,0xe00000,0x114457a0,0x4000004,0x120000a,0x114457a0,0x4000008,0x81000a,0x114457a0,0x4000008,
-0x141000a,0x114457a0,0x4000010,0x87000a,0x114457a0,0xc000010,0x84800a,0x114457a9,0x3802500,0x126246a,0x114457a9,0x7c00d00,0x2530c0a,0x114a3da0,0x24000000,0x810000,
-0x114a3da0,0x24000000,0x1410000,0x114a3da0,0x24000008,0x810000,0x114a3da0,0x24000008,0x1410000,0x114a3da0,0x24000010,0x870000,0x114a3da0,0x2c000010,0x848000,0x114a3da6,
-0x4000000,0xe00000,0x114a3da6,0x24000000,0xe00000,0x114a3da6,0x24000002,0x1200000,0x114a3da6,0x24000002,0x14e00000,0x114a3da6,0x24000008,0x810000,0x114a3da6,0x24000008,
-0x1410000,0x114a3da9,0x7c00900,0x930c00,0x114a3da9,0x7c00900,0xe30c00,0x114a3dab,0x7c00300,0xe30000,0x114a3ea9,0x7000400,0x1200c02,0x114a3fa0,0x4000004,0x1200000,
-0x114a3fa9,0x7c00d00,0x2530c00,0x114a42ab,0x4000000,0xe00000,0x114a42ab,0x4000000,0xe0000f,0x114a44ab,0x4000000,0xe00002,0x114a44ab,0x4000000,0xe00003,0x114a44ab,
-0x4000000,0x14e00003,0x114a45ab,0x4000000,0xe00002,0x114a45ab,0x4000000,0xe0000d,0x1180090a,0x2802400,0x962460,0x11800c1f,0x2802100,0x962460,0x11800c1f,0x2802500,
-0x962460,0x11800f29,0x2802400,0x962460,0x11800f36,0x2802400,0x962460,0x11820700,0x2802400,0x962460,0x11820700,0x2802500,0x962460,0x118a3dac,0x2802400,0x962460,
-0x118a3ea9,0x2802400,0x962460,0x11c00904,0x2802400,0x962460,0x11c00908,0x2802400,0x962460,0x11c00c23,0x6800000,0x1329800,0x11c00c27,0xc000010,0xb48000,0x11c00f6b,
-0x6800000,0x1329800,0x11c01070,0x6800000,0x1329800,0x11c01174,0x6800000,0x1329800,0x11c01278,0x6800000,0x1329800,0x11c0147c,0x4000000,0x200000,0x11c0147c,0x6800000,
-0x1329800,0x11c05123,0x7c00100,0x230408,0x20000067,0x1000,0,0x20000b13,0x2802400,0x962460,0x20000b13,0x2802500,0x962460,0x20001b27,0x2802100,0x962460,
-0x20001b27,0x2802100,0x962461,0x20001b27,0x2802400,0x962460,0x20001b27,0x2806400,0x962460,0x20001b27,0x2902100,0x962462,0x20001b27,0x4000000,0x200000,0x20001b27,
-0x4000000,0x400000,0x20001b27,0x4000000,0x500000,0x20001b27,0x4000000,0x810000,0x20001b27,0x4000000,0xb00000,0x20001b27,0x4000000,0xc0000b,0x20001b27,0x4000000,
-0x1410000,0x20001b27,0x4000010,0xb00000,0x20001b27,0x4000010,0xc00000,0x20001b27,0x6800000,0x1329800,0x20001b27,0x6800100,0x462540,0x20001b27,0x6800400,0x962540,
-0x20001b27,0x7c00100,0x230400,0x20001b27,0x7c00100,0x230401,0x20002619,0x7c00100,0x220401,0x20002a00,0x4000000,0x1600000,0x20004b67,0,0x1900020,0x20004c67,
-0,0x1900020,0x20004d67,0,0x1900020,0x20006d67,0x1000,0,0x20006e67,0x1000,0,0x20026d67,0,0,0x20026e67,0,
-0,0x200a4a12,0x7c00100,0x1f304c1,0x200a4a12,0x7c00100,0x20304e1,0x21005600,0x4000000,0x700000,0x21022a00,0x4000000,0x1600000,0x30000419,0x7c00100,0x220400,
-0x30000419,0x7c00100,0x220401,0x30000419,0x7c00100,0x250400,0x30000419,0x7c00100,0x250401,0x30000519,0x7c00100,0x220400,0x30000600,0x4000400,0x200400,0x30000600,
-0x7c00500,0x230400,0x30000605,0x4000400,0x200000,0x3000080e,0x7c00100,0x220400,0x30000908,0x2000,0x962460,0x30000908,0x7c00100,0x220400,0x30000908,0x7c00100,
-0x220401,0x30000908,0x7c00100,0x250400,0x30000908,0x7c00100,0x250401,0x30000a03,0x4000006,0x400000,0x30000c02,0x4000000,0x200000,0x30000c02,0x7c00100,0x230400,
-0x30000d22,0x2802100,0x962460,0x30000d22,0x2802400,0x962460,0x30000d22,0x2802500,0x962460,0x30000d22,0x4000000,0x200000,0x30000d22,0x4000010,0x200000,0x30000d22,
-0x7c00100,0x230400,0x30000d22,0xc000010,0x248000,0x30000d22,0x80000000,0x218960,0x30000e25,0x2802500,0x962460,0x30000e25,0x7c00100,0x230400,0x30001821,0x2802100,
-0x962460,0x30001821,0x2806400,0x962460,0x30001821,0x4000000,0x200000,0x30001821,0x6800100,0x962540,0x30001821,0x6800100,0x962541,0x30001821,0x7c00100,0x230400,
-0x30001b27,0x2802100,0x962460,0x30001b27,0x2802400,0x962460,0x30001b27,0x4000000,0x200000,0x30001b27,0x4000000,0x400000,0x30001b27,0x7c00100,0x230400,0x30001c1c,
-0x2802100,0x1862460,0x30001c1c,0x2802400,0x1862460,0x30001c1c,0x2806400,0x1862460,0x30001c1c,0x4000000,0x200000,0x30001c1c,0x6800100,0x1862400,0x30001c1c,0x6800100,
-0x1862540,0x30001c1c,0x7c00100,0x1830000,0x30001c1c,0x7c00100,0x1830001,0x30001c1c,0xc000010,0x448000,0x30001f0b,0x4000000,0x200000,0x30001f0b,0x4000010,0x200000,
-0x30001f0b,0x4000010,0x400000,0x30001f0b,0x6800000,0x200000,0x30001f0b,0x7c00100,0x230400,0x30001f0b,0xc000010,0x248000,0x30002006,0x7c00100,0x250400,0x30002128,
-0x4000010,0x200000,0x30002128,0x7c00100,0x230400,0x30002128,0xc000010,0x248000,0x3000221d,0x4000000,0x810000,0x3000221d,0x4000000,0x1410000,0x3000221d,0x4000001,
-0x445800,0x3000221d,0x7c00100,0x230400,0x30002300,0x4000010,0x400000,0x30002320,0x7c00100,0x230400,0x30002417,0x2802100,0x1862460,0x30002417,0x2802400,0x1862460,
-0x30002417,0x2806400,0x1862460,0x30002417,0x2882000,0x1862460,0x30002417,0x4000000,0x200000,0x30002417,0x4000000,0x400000,0x30002417,0x4000000,0x1600000,0x30002417,
-0x4000010,0x400000,0x30002417,0x4000010,0x1200000,0x30002417,0x6800000,0x1329800,0x30002417,0x6800100,0x1862540,0x30002417,0x7c00100,0x1830000,0x30002417,0x7d00100,
-0x1830000,0x3000251b,0x80000,0xc18820,0x3000251b,0x2802100,0x962460,0x3000251b,0x3c02100,0x962460,0x3000251b,0x4000000,0x200000,0x3000251b,0x4000006,0x500000,
-0x3000251b,0x4000010,0x400000,0x3000251b,0x4000010,0xb70000,0x3000251b,0x4000800,0x200000,0x3000251b,0x6800000,0x1329800,0x3000251b,0x7c00100,0x230400,0x3000251b,
-0x7c00900,0x230400,0x3000251b,0xc000010,0xb48000,0x3000251b,0x12882000,0x962460,0x30002800,0x4000001,0xc41c0b,0x30002800,0x24000000,0x200000,0x30002800,0x2c000010,
-0x1248002,0x30002800,0x2c000010,0x15248002,0x30002a00,0x4000000,0x1600000,0x30002b01,0x2000,0x962460,0x30002b01,0x2000,0x8962460,0x30002c00,0x4000000,0x200000,
-0x30002c00,0x7c00100,0x14220405,0x30002d19,0x7c00100,0x250400,0x30002e00,0x24000000,0x200000,0x30003000,0x24000000,0x200000,0x30003000,0x24000000,0x4200000,0x30003100,
-0x24000000,0x200000,0x30003600,0x24000000,0x200000,0x30003700,0x24000000,0x4200000,0x3000392e,0x24000000,0x200000,0x30005013,0x7c00100,0x2633801,0x30005600,0,
-0x918820,0x30020600,0x4000400,0x500400,0x30020701,0x2802400,0x962460,0x30020701,0x2802400,0xc62460,0x300a3a11,0x4020000,0xe00000,0x300a3a11,0x4020000,0xe00002,
-0x300a3b11,0x4020000,0xe00002,0x300a3c00,0x4008000,0xe00000,0x300a3c00,0x4010000,0xe00000,0x300a3d11,0x7c00300,0xe30002,0x300a4305,0x7c00100,0xe30400,0x300a4611,
-0x7c40300,0xe30000,0x300a4829,0x7c00100,0xe30400,0x300a4829,0x7c00900,0x1230400,0x300a4929,0x4000000,0xe00000,0x30402589,0x4000010,0x400000,0x30402589,0x4000010,
-0xb70000,0x30402589,0xc000010,0xb48000,0x304a3dab,0x4000000,0xe00000,0x30800c1f,0x2802100,0x962460,0x30c01c81,0x6800000,0x1329800,0x3100080e,0x7c00120,0x220402,
-0x3100080e,0x7c00120,0x250402,0x31005167,0x1000,0,0x3100581e,0x4000000,0x200000,0x3100581e,0x7c00100,0x230400,0x3100590d,0x7c00100,0x230400,0x31005a09,
-0x7c00100,0x220400,0x31005a09,0x7c00100,0x250400,0x31005b00,0x4000000,0x200000,0x31005c00,0x80000,0x918820,0x31005c00,0x2802000,0x962460,0x31005c00,0x2802400,
-0x962460,0x31005c00,0x4000000,0x200000,0x31005c00,0x4000000,0x200001,0x31005c00,0x6800000,0x962540,0x31005c00,0x6800400,0x962540,0x31005c01,0x2802400,0x962460,
-0x31005d00,0x4000020,0x200005,0x31005d00,0x6800020,0x1329805,0x31005d00,0x7c00120,0x220405,0x31005d00,0x7c00120,0x250405,0x31006000,0x82000,0x8962460,0x31006000,
-0x180000,0x918820,0x310a5e11,0x7c40300,0xe30000,0x310a5f11,0x7c00300,0xe30001,0x32000419,0x7c00100,0x250400,0x3200080e,0x4000020,0x200000,0x3200080e,0x7c00100,
-0x220400,0x3200080e,0x7c00100,0x250400,0x32000908,0x7c00100,0x220400,0x32000908,0x7c00100,0x250400,0x32000c02,0x7c00100,0x230400,0x32000e25,0x7c00100,0x230400,
-0x32001d0c,0x7c00100,0x220400,0x32002800,0x80000,0x1e18820,0x32002800,0x80020,0x218820,0x32002800,0x4000001,0x445802,0x32002800,0x24000000,0x200000,0x32002800,
-0x24000000,0x200002,0x32002800,0x24000020,0x200000,0x32002800,0x2c000010,0x1248002,0x32002919,0x7c00100,0x22040f,0x32002a00,0x4000000,0x1600000,0x32002b01,0x2000,
-0x962460,0x32002b01,0x2802000,0x962460,0x32002b01,0x2802020,0x962460,0x32002c00,0x4000000,0x200000,0x32002c00,0x4000020,0x200000,0x32002c00,0x4000020,0x200005,
-0x32002c00,0x7c00120,0x220405,0x32002c00,0x7c00120,0x250405,0x32002e00,0x24000020,0x200000,0x32002f00,0x24000020,0x200000,0x32003000,0x24000000,0x200000,0x32003000,
-0x24000020,0x200000,0x32003500,0x24000000,0x200000,0x32003600,0x24000020,0x200000,0x32003600,0x24000020,0x14200000,0x32003700,0x24000000,0x200000,0x32003700,0x24000000,
-0x4100000,0x32003700,0x24000000,0x4200000,0x32003700,0x24000000,0x14200000,0x32003800,0x24000000,0x810000,0x32003800,0x24000000,0x1410000,0x32005102,0x4000000,0x1500008,
-0x32005502,0x7c00100,0x230400,0x32006108,0x7c00100,0x220400,0x32006108,0x7c00100,0x250400,0x3200622a,0x2802100,0x962460,0x3200622a,0x2806000,0x962460,0x3200622a,
-0x7c00100,0x230400,0x3200632b,0x2802100,0x962460,0x3200632b,0x2806000,0x962460,0x3200632b,0x7c00100,0x230400,0x3200642c,0x2802100,0x962460,0x3200642c,0x7c00100,
-0x230400,0x3200652d,0x2802100,0x962460,0x3200652d,0x7c00100,0x230400,0x32006600,0x24000020,0x200000,0x32006700,0x24000020,0x200000,0x32006800,0x24000020,0x200000,
-0x32006800,0x24000020,0x14200000,0x32006900,0x24000020,0x200000,0x32006900,0x24000020,0x810000,0x32006900,0x24000020,0x1410000,0x32006a00,0x24000020,0x200000,0x32006a00,
-0x24000020,0x200001,0x32006a00,0x24000020,0x200002,0x32020701,0x2882000,0xc62460,0x32023300,0x4000000,0x100000,0x32026c01,0x12882000,0x962460,0x32026c01,0x12882000,
-0x8962460,0x32065700,0x4000000,0x810011,0x32065700,0x4000000,0x1410011,0x32086600,0x24000020,0x810000,0x32086600,0x24000020,0x1410000,0x32086900,0x24000020,0x810000,
-0x32086900,0x24000020,0x1410000,0x320a3600,0x24000020,0x34200000,0x320a3d11,0x7c00100,0x1230400,0x320a3e14,0x7c00100,0xe30010,0x320a3e14,0x7c00100,0x2530000,0x320a3f16,
-0x7c00100,0xe30c10,0x320a4400,0x4000000,0xe00003,0x320a4929,0x4000000,0xe00000,0x320a4f11,0x7c00300,0xe30001,0x320a6b16,0x7c00100,0x2530c00,0x32406385,0xc000010,
-0x448000,0x324a3dae,0x4000000,0x14e00000,0x324a3dae,0x7c00100,0x1230400,0x324a3fa9,0x4000002,0x1200c00,0x324a53a6,0x24000000,0xe00000,0x32820701,0x2802000,0x962460,
-0x40000419,0x7c00100,0x220400,0x40000519,0x7c00100,0x220400,0x40000600,0x4000400,0x200400,0x4000080e,0x7c00100,0x220400,0x4000080e,0x7c00100,0x250400,0x4000080e,
-0x7c00100,0x250402,0x40000c02,0x2802100,0x962460,0x40000c02,0x2802400,0x962460,0x40000c02,0x2802500,0x962460,0x40000c02,0x4000000,0x200000,0x40000c02,0x4000000,
-0x1071400,0x40000c02,0x7c00100,0x230400,0x40000c02,0x80000000,0x218960,0x40000d22,0x7c00100,0x230400,0x40000f0a,0x7c00100,0x230400,0x40001004,0x7c00100,0x230400,
-0x40001110,0x2802100,0x962460,0x40001110,0x6800100,0x962540,0x4000120f,0x2802100,0x962460,0x4000120f,0x4000000,0x1600000,0x4000120f,0x7c00100,0x230400,0x4000131f,
-0x7c00100,0x230400,0x40001423,0x4000000,0x200000,0x40001423,0x4000000,0x1600000,0x40001615,0x2802400,0x962460,0x40001615,0x7c00100,0x230400,0x40002417,0x2802400,
-0x1862460,0x40002417,0x4000000,0x200000,0x40002800,0x6800000,0x201c00,0x40002800,0x24000002,0x200000,0x40002c00,0x4000000,0x200002,0x40003000,0x24000000,0x14200000,
-0x40003000,0x24000020,0x200000,0x40003700,0x24000000,0x200000,0x40003700,0x24000000,0x4200000,0x40003700,0x24000000,0x14200000,0x40005a09,0x7c00100,0x220400,0x40005a09,
-0x7c00100,0x250400,0x40005d00,0x7c00120,0x220405,0x40006f30,0x2802100,0x962460,0x40006f30,0x2802400,0x962460,0x40006f30,0x4000000,0x200000,0x40006f30,0x6800000,
-0x1329800,0x40006f30,0x6800100,0x962540,0x40006f30,0x7c00100,0x230400,0x40006f30,0xc000010,0xb48000,0x40007034,0x7c00100,0x1830000,0x40007117,0x4000000,0x200000,
-0x40007208,0x7c00100,0x220400,0x4000720e,0x7c00100,0x220400,0x4000720e,0x7c00500,0x22040e,0x4000720e,0x7c00500,0x22040f,0x40007219,0x7c00100,0x220400,0x40007219,
-0x7c00500,0x220400,0x40007219,0x7c00500,0x22040e,0x40007219,0x7c00500,0x22040f,0x40007300,0x24000000,0x200000,0x40007300,0x24000000,0x14200000,0x40007400,0x4000000,
-0x200000,0x40007531,0x7c00100,0x230400,0x40007631,0x7c00100,0x230400,0x40007835,0x4000010,0x400000,0x40007835,0x7c00100,0x230400,0x40007933,0x7c00100,0x230400,
-0x40007a32,0x6800000,0x1329800,0x40007a32,0x7c00100,0x230400,0x40007b2f,0x7c00100,0x230400,0x40007c00,0x4000000,0x200000,0x40020701,0x2802400,0x962460,0x40020701,
-0x2802400,0xc62460,0x40023300,0x4000000,0x200000,0x40027d01,0x12882000,0x962460,0x400a3700,0x24000000,0x34200000,0x400a3700,0x24000000,0x34e00000,0x400a4400,0x4000000,
-0xe0000d,0x400a4412,0x4000000,0xe00002,0x400a4412,0x4000000,0xe00003,0x400a4500,0x4000000,0xe0000d,0x400a5300,0x4000000,0x810010,0x400a5300,0x4000000,0x1410010,
-0x404077e0,0x4000000,0x200000,0x404077e3,0x4000000,0x200000,0x404077e3,0x4000000,0x400000,0x40c0147c,0x4000000,0x200000,0x40c05123,0x4000000,0x200000,0x41000419,
-0x7c00100,0x220400,0x41000419,0x7c00100,0x250400,0x4100080e,0x7c00100,0x220400,0x4100080e,0x7c00100,0x250400,0x41000908,0x7c00100,0x220400,0x41000908,0x7c00100,
-0x250400,0x41000b13,0x2802000,0x962460,0x41000b13,0x2802100,0x962460,0x41000b13,0x4000000,0xb00000,0x41000c02,0x2802100,0x962460,0x41000c02,0x4000000,0x1500000,
-0x41000c02,0xc000010,0xb48000,0x41000f0a,0x7c00100,0x230400,0x41001004,0x7c00100,0x230400,0x41001423,0x7c00100,0x230400,0x41001b27,0x4000000,0x500000,0x41001d0c,
-0x7c00100,0x220400,0x41001d0c,0x7c00100,0x23040f,0x41001f0b,0x2802100,0x962460,0x41001f0b,0x4000000,0x200000,0x41001f0b,0x7c00100,0x230400,0x41002800,0x24000000,
-0x200000,0x41002800,0x24000000,0x400000,0x41002919,0x7c00100,0x22040e,0x41002a00,0x4000000,0x1600000,0x41002b01,0x2802020,0x962460,0x41002c00,0x4000000,0x200000,
-0x41002c00,0x7c00120,0x220405,0x41003000,0x24000000,0x200000,0x41003700,0x24000000,0x4200000,0x41003700,0x24000000,0x14200000,0x41003700,0x24000000,0x14e00000,0x41005d00,
-0x7c00120,0x220405,0x41006600,0x24000020,0x200000,0x41006600,0x24000020,0x810000,0x41006600,0x24000020,0x1410000,0x41007208,0x7c00100,0x22040f,0x41007219,0x7c00100,
-0x220400,0x41007300,0x24000000,0x200000,0x41007e0e,0x2802000,0x962460,0x41007e0e,0x4000000,0x200000,0x41007f0e,0x4000000,0x200000,0x41007f0e,0x7c00100,0x230400,
-0x41008002,0x7c00100,0x230400,0x41008137,0x2802100,0x962460,0x41008137,0x4000000,0x200000,0x41008137,0x6800100,0x962540,0x41008137,0x7c00100,0x230400,0x41008301,
-0x2802000,0x962460,0x41008407,0x4000000,0x200000,0x41008407,0x4000000,0x400000,0x41008407,0x4000000,0xb00000,0x41008407,0x7c00100,0x220400,0x41008407,0x7c00100,
-0x250400,0x4100850b,0x7c00100,0x230400,0x4100860b,0x4000000,0x200000,0x4100860b,0x7c00100,0x230400,0x4100870c,0x7c00100,0x220400,0x41008838,0x7c00100,0x220400,
-0x41008838,0x7c00100,0x250400,0x41008939,0x2802000,0x962460,0x41008939,0x2802100,0x962460,0x41008939,0x2806000,0x962460,0x41008939,0x4000000,0x200000,0x41008939,
-0x4000000,0x400000,0x41008939,0x7c00100,0x230400,0x41008939,0xc000010,0x448000,0x41008a00,0x4000000,0x200000,0x41008b3b,0x4000000,0x1800000,0x41008b3b,0x6800000,
-0x1329800,0x41008b3b,0x7c00100,0x1830000,0x41008b3b,0x7e00100,0x1830000,0x41008c3d,0x4000010,0x400000,0x41008c3d,0x7c00100,0x230400,0x41008d0e,0x7c00100,0x22040f,
-0x41008d19,0x7c00100,0x220400,0x41008d19,0x7c00100,0x22040f,0x41008e00,0x24000000,0x200000,0x41008e00,0x24000000,0x400000,0x41008e00,0x24000000,0x1710000,0x41008e00,
-0x24000006,0x400000,0x41008f3a,0x2802000,0x962460,0x41008f3a,0x2802100,0x962460,0x41008f3a,0x2806000,0x962460,0x41008f3a,0x4000000,0x200000,0x41008f3a,0x6800100,
-0x962540,0x41008f3a,0x7c00100,0x230400,0x4100903c,0x7c00100,0x230400,0x4100903c,0x7c00100,0x23040f,0x41020701,0x2802000,0x962460,0x41020701,0x2802000,0xc62460,
-0x410a3700,0x24000000,0x34200000,0x410a3700,0x24000000,0x34e00000,0x410a4412,0x4000000,0xe00003,0x410a4711,0x7c40300,0xe30000,0x410a4f11,0x7c00300,0xe30001,0x410a9100,
-0x4000000,0x800010,0x410a9100,0x4000000,0x810010,0x410a9100,0x4000000,0x870010,0x410a9100,0x4000000,0xb00010,0x410a9100,0x4000000,0xf00010,0x410a9100,0x4000000,
-0x1001410,0x410a9100,0x4000000,0x1071010,0x410a9100,0x4000000,0x1071410,0x410a9100,0x4000000,0x1410010,0x414a82ab,0x4000000,0xe00000,0x41808300,0x2802000,0x962460,
-0x41c0147c,0x6800000,0x1329800,0x50000419,0x7c00100,0x220400,0x50000419,0x7c00100,0x250400,0x5000080e,0x7c00100,0x220400,0x50000908,0x7c00100,0x220400,0x50000908,
-0x7c00100,0x250400,0x50000b13,0x2802500,0x962460,0x50000f0a,0x7c00100,0x230400,0x50001615,0x2802100,0x962460,0x50001615,0x7c00100,0x230400,0x50002b01,0x2802020,
-0x962460,0x50002c00,0x4000000,0x200000,0x50002c19,0x7c00100,0x220400,0x50002d19,0x7c00100,0x220400,0x50003000,0x24000000,0x200000,0x50003000,0x24000020,0x200000,
-0x50003700,0x24000000,0x4200000,0x50005d00,0x7c00120,0x220405,0x50005d00,0x7c00120,0x250405,0x50006108,0x7c00100,0x220400,0x50006108,0x7c00100,0x250400,0x50006600,
-0x24000020,0x200000,0x50007300,0x24000000,0x200000,0x50008301,0x2802400,0x962460,0x50008a00,0x7c00500,0x230400,0x50009257,0x2802400,0x962460,0x50009257,0x4000000,
-0x200000,0x50009257,0x4000010,0x1071400,0x50009257,0x6800000,0x1329800,0x50009257,0x7c00100,0x230400,0x50009257,0x7c00500,0x230400,0x50009257,0x7c00900,0x230400,
-0x50009257,0xc000010,0xb48000,0x5000933e,0x2802100,0x962460,0x5000933e,0x2802400,0x962460,0x5000933e,0x4000000,0x200000,0x5000933e,0x4000000,0x400000,0x5000933e,
-0x4000010,0x400000,0x5000933e,0x6800000,0x1329800,0x5000933e,0x6800100,0x962540,0x5000933e,0x6800100,0x962541,0x5000933e,0x6804400,0x962540,0x5000933e,0x7c00100,
-0x230400,0x5000933e,0x7c00100,0x230401,0x5000933e,0xc000010,0x448000,0x50009419,0x7c00100,0x220400,0x50009419,0x7c00100,0x250400,0x50009500,0x4000400,0x200400,
-0x5000965a,0x4000000,0x500000,0x5000965a,0x7c00100,0x230400,0x5000965a,0xc000010,0xb48000,0x5000975b,0x4000000,0x200000,0x5000975b,0x4000010,0x400000,0x5000975b,
-0x7c00100,0x230400,0x50009865,0x7c00100,0x230400,0x50009965,0x4000010,0x400000,0x50009965,0x7c00100,0x230400,0x50409aab,0x4000000,0x200000,0x5100080e,0x7c00100,
-0x220400,0x5100080e,0x7c00100,0x250400,0x51000c02,0x2802100,0x962460,0x51000c02,0x4000000,0x1500000,0x51000c02,0x4000020,0x200000,0x51000c02,0x7c00100,0x230400,
-0x51000f0a,0x7c00100,0x230400,0x51000f0a,0x7c00500,0x230400,0x51001110,0x2802100,0x962460,0x5100131f,0x2802100,0x962460,0x51001423,0x7c00100,0x230400,0x51001524,
-0x2802100,0x962460,0x51001524,0x4000000,0x200000,0x51001524,0x7c00100,0x230400,0x5100171a,0x2802100,0x962460,0x5100171a,0x4000000,0x200000,0x5100171a,0x4000000,
-0x1500000,0x5100171a,0x7c00100,0x230400,0x51001b27,0x4000000,0x200000,0x51001b27,0x4000000,0x400000,0x51001b27,0x4000000,0x500000,0x51001b27,0x7c00100,0x230400,
-0x51001c1c,0x2802100,0x1862460,0x51001c1c,0x2802400,0x1862460,0x51001c1c,0x2806400,0x1862460,0x51001c1c,0x4000000,0x1800000,0x51001c1c,0x6800000,0x1329800,0x51001c1c,
-0x6800000,0x1862400,0x51001c1c,0x6800100,0x1862400,0x51001c1c,0x6800100,0x1862540,0x51001c1c,0x6800400,0x1862400,0x51001c1c,0x7c00100,0x1830000,0x5100251b,0x7c00100,
-0x230400,0x51002619,0x7c00100,0x220400,0x51002619,0x7c00100,0x250400,0x51002800,0x80020,0x218820,0x51002c00,0x4000000,0x200000,0x51002d19,0x7c00100,0x230400,
-0x51003700,0x24000000,0x4200000,0x51003700,0x24000000,0x4e00000,0x51005201,0x2802400,0x962460,0x51005c00,0x4000000,0x200000,0x51006108,0x7c00100,0x220400,0x51006108,
-0x7c00100,0x250400,0x51006600,0x24000020,0x200000,0x51006600,0x24000020,0x810000,0x51006600,0x24000020,0x1410000,0x51007300,0x24000000,0x200000,0x51007300,0x24000020,
-0x200000,0x51008002,0x7c00100,0x230400,0x51008301,0x2802000,0x962460,0x51008301,0x2802400,0x962460,0x51008a00,0x7c00500,0x230400,0x51008e00,0x24000000,0x200000,
-0x51008e00,0x24000000,0x400000,0x51008e00,0x24000000,0x810000,0x51008e00,0x24000000,0x1400000,0x51008e00,0x24000000,0x1410000,0x51008e00,0x24000000,0x1710000,0x51008e00,
-0x24000002,0x200000,0x51008e00,0x24000500,0x230400,0x51008e00,0x2c000010,0xb48000,0x51009419,0x7c00100,0x220400,0x51009419,0x7c00100,0x22040e,0x51009419,0x7c00100,
-0x22040f,0x51009419,0x7c00100,0x250400,0x51009500,0x4000000,0x200400,0x51009500,0x7c00500,0x230400,0x51009519,0x7c00100,0x220400,0x51009519,0x7c00100,0x22040f,
-0x51009519,0x7c00100,0x230400,0x51009519,0x7c00100,0x250400,0x51009b71,0x2802100,0x962460,0x51009b71,0x6800000,0x1329800,0x51009b71,0x6800100,0x962540,0x51009b71,
-0x6804400,0x962540,0x51009b71,0x7c00100,0x230400,0x51009c52,0x2802100,0x962460,0x51009c52,0x2802400,0x962460,0x51009c52,0x2802c00,0x962460,0x51009c52,0x4000010,
-0x400000,0x51009c52,0x6800000,0x1329800,0x51009c52,0x6800100,0x962540,0x51009c52,0x7c00100,0x230400,0x51009c52,0xc000010,0x448000,0x51009d6d,0x6800000,0x1329800,
-0x51009d6d,0x7c00100,0x230400,0x51009d6d,0x7c00500,0x230400,0x51009d6d,0x7c00d00,0x230400,0x51009d6d,0xc000010,0x448000,0x51009e08,0x2802100,0x962460,0x51009f63,
-0x4000010,0x400000,0x51009f63,0x6800000,0x1329800,0x51009f63,0x7c00100,0x230400,0x51009f63,0x7c00900,0x230400,0x51009f63,0xc000010,0x448000,0x51009f63,0xc000010,
-0xb48000,0x5100a008,0x2000,0x962460,0x5100a008,0x2802400,0x962460,0x5100a008,0x4000000,0x200000,0x5100a008,0x7c00100,0x220400,0x5100a008,0x7c00100,0x230400,
-0x5100a008,0x7c00100,0x250400,0x5100a008,0x7c00500,0x230400,0x5100a16f,0x2806400,0x962460,0x5100a16f,0x6800000,0x1329800,0x5100a16f,0x6800100,0x962540,0x5100a16f,
-0x7c00100,0x230400,0x5100a16f,0xc000010,0x448000,0x5100a24f,0x2802100,0x962460,0x5100a24f,0x2802400,0x962460,0x5100a24f,0x6800000,0x1329800,0x5100a24f,0x7c00100,
-0x230400,0x5100a24f,0xc000010,0x448000,0x5100a36e,0x2802100,0x962460,0x5100a36e,0x4000000,0x200000,0x5100a36e,0x6800100,0x962540,0x5100a36e,0x6804400,0x962540,
-0x5100a36e,0x7c00100,0x230400,0x5100a442,0x2802100,0x962460,0x5100a442,0x4000000,0x200000,0x5100a442,0x6800000,0x1329800,0x5100a442,0x6800100,0x962540,0x5100a442,
-0x7c00100,0x230400,0x5100a442,0xc000010,0x448000,0x5100a500,0x4000000,0x200000,0x5100a600,0x4000000,0x200000,0x5100a601,0x2802000,0x962460,0x5100a76b,0x7c00100,
-0x230400,0x5100a868,0x7c00100,0x230400,0x5100a96c,0x4000000,0x200000,0x5100a96c,0x7c00100,0x230400,0x5100aa00,0x4000000,0x4e00000,0x5100ab00,0x4000000,0x4e00000,
-0x51086600,0x24000020,0x810000,0x51086600,0x24000020,0x1410000,0x510a4005,0x7c00100,0xe30400,0x510a4711,0x7c40300,0xe30000,0x510a7300,0x24000000,0x34200000,0x510aaa00,
-0x4000000,0x34e00000,0x5140a2db,0x4000400,0x400000,0x514a82ab,0x4000000,0xe00000,0x51802b9d,0x2802000,0x962460,0x51c00908,0x2802400,0x962460,0x51c0a008,0x2802400,
-0x962460,0x52000f0a,0x2802100,0x962460,0x52000f0a,0x6800100,0x962540,0x52000f0a,0x7c00100,0x230400,0x52001004,0x4000000,0x1600000,0x52001b00,0x4000000,0x200000,
-0x52001c1c,0x2802100,0x1862460,0x52001c1c,0x6800100,0x1862400,0x52001c1c,0x6800400,0x1862400,0x52001e12,0x7c00100,0x2230500,0x52001e12,0x7c00100,0x2330520,0x52002128,
-0x4000002,0x400000,0x52002128,0x7c00100,0x230400,0x52002a00,0x4000000,0x1500000,0x52002a00,0x4000000,0x1600000,0x52002d00,0x4000000,0x200006,0x52003000,0x24000000,
-0x200000,0x52006108,0x7c00100,0x220400,0x52006108,0x7c00100,0x250400,0x52008301,0x2802400,0x962460,0x52008407,0x2802400,0x962460,0x52008407,0x7c00100,0x220400,
-0x52008407,0x7c00100,0x250400,0x52008b3b,0x6800000,0x1800000,0x52008b3b,0x7c00100,0x1830000,0x52008e00,0x24000000,0x400000,0x52009419,0x7c00100,0x250400,0x5200975b,
-0x4000000,0x200000,0x5200ac7e,0x2802000,0x962460,0x5200ac7e,0x2802100,0x962460,0x5200ac7e,0x2802400,0x962460,0x5200ac7e,0x4000010,0x200000,0x5200ac7e,0x7c00100,
-0x230400,0x5200ac7e,0xc000010,0x248000,0x5200ad28,0x7c00100,0x230400,0x5200ae6a,0x2802100,0x1862460,0x5200ae6a,0x2802400,0x962460,0x5200ae6a,0x2802400,0x1862460,
-0x5200ae6a,0x2806000,0x1862460,0x5200ae6a,0x4000000,0x1800000,0x5200ae6a,0x6800000,0x1329800,0x5200ae6a,0x6800100,0x1862400,0x5200ae6a,0x6800100,0x1862540,0x5200ae6a,
-0x7c00100,0x1830000,0x5200ae6a,0x7c00900,0x1830000,0x5200ae6a,0xc000010,0x1848000,0x5200b083,0x4000010,0x400000,0x5200b083,0x7c00100,0x230400,0x5200b083,0xc000010,
-0x448000,0x5200b182,0x2802400,0x962460,0x5200b182,0x4000000,0x200000,0x5200b182,0x4000010,0x400000,0x5200b182,0x7c00100,0x230400,0x5200b182,0xc000010,0x448000,
-0x5200b30a,0x2802400,0x962460,0x5200b30a,0x4000000,0x200000,0x5200b30a,0x7c00100,0x230400,0x5200b54e,0x2802100,0x962460,0x5200b54e,0x2802400,0x962460,0x5200b54e,
-0x4000000,0x200000,0x5200b54e,0x4000010,0x400000,0x5200b54e,0x6800000,0x1329800,0x5200b54e,0x6800100,0x962540,0x5200b54e,0x6804400,0x962540,0x5200b54e,0x7c00100,
-0x230400,0x5200b54e,0xc000010,0x448000,0x5200b61c,0x4000000,0x1800000,0x5200b61c,0x6800400,0x1862400,0x5200b61c,0x7c00100,0x1830000,0x5200b61c,0x7c00900,0x1830000,
-0x5200b77f,0x2802100,0x1862460,0x5200b77f,0x2802400,0x1862460,0x5200b77f,0x4000000,0x1800000,0x5200b77f,0x4000010,0x1800000,0x5200b77f,0x7c00100,0x1830000,0x5200b77f,
-0x7c00500,0x1830000,0x5200b77f,0x7c00900,0x1830000,0x5200b77f,0x7e00100,0x1830000,0x5200b873,0x2802100,0x962460,0x5200b873,0x2806400,0x962460,0x5200b873,0x6800000,
-0x1329800,0x5200b873,0x6800100,0x962540,0x5200b873,0x6800400,0x962540,0x5200b873,0x7c00100,0x230400,0x5200b873,0xc000010,0x448000,0x5200b912,0x7c00100,0x2230500,
-0x5200b912,0x7c00100,0x2330520,0x5200ba74,0x4000000,0x200000,0x5200ba74,0x4000010,0x400000,0x5200ba74,0x7c00100,0x230400,0x5200bb85,0x4000000,0x200000,0x5200bb85,
-0x7c00100,0x230400,0x5200bc75,0x4000000,0x400000,0x5200bc75,0x4000010,0x400000,0x5200bc75,0x7c00100,0x230400,0x5200bd7d,0x4000000,0x200000,0x5200bd7d,0x7c00100,
-0x230400,0x5200be7a,0x4000000,0x200000,0x5200be7a,0x7c00100,0x230400,0x5200bf58,0x7c00100,0x230400,0x5200c002,0x4000000,0x200000,0x5200c178,0x2802000,0x962460,
-0x5200c178,0x2802100,0x962460,0x5200c178,0x2802400,0x962460,0x5200c178,0x2806400,0x962460,0x5200c178,0x4000000,0x200000,0x5200c178,0x6800100,0x962540,0x5200c178,
-0x7c00100,0x230400,0x5200c178,0x7c00100,0x230401,0x5200c178,0xc000010,0x448000,0x5200c178,0x80000000,0x218960,0x5200c247,0x7c00100,0x230400,0x5200c247,0x7c00100,
-0x830400,0x5200c247,0x7c00100,0x1430400,0x5200c300,0x4000000,0x200003,0x52022d00,0x4000000,0x100006,0x52023700,0x24000000,0x4100000,0x52023700,0x24000000,0x4e00000,
-0x52023700,0x24000000,0x14100000,0x52023700,0x24000000,0x14e00000,0x52023700,0x24000000,0x96800000,0x52024400,0x4000000,0x100000,0x52027300,0x24000000,0x100000,0x5202c300,
-0x4000000,0x100000,0x5202c300,0x4000000,0x100002,0x5202c300,0x4000000,0x100003,0x5202c300,0x4000000,0x10000d,0x5202c300,0x4000100,0x150400,0x5202c300,0x4000100,
-0x15040d,0x5202c300,0x4000100,0x14150400,0x520a1e12,0x7c00100,0x2130480,0x520a3700,0x24000000,0x34e00000,0x520a3800,0x24000000,0x34100000,0x520a4711,0x7c40300,0xe30000,
-0x520a4f11,0x7c00300,0xe30001,0x520a7300,0x24000000,0x34100000,0x520ab412,0x7c00100,0x2130480,0x520ac400,0x4000000,0xe00002,0x520ac400,0x4000000,0xe0000d,0x520ac400,
-0x4000000,0x34e0000d,0x520ac414,0x4000000,0xe0000d,0x520ac511,0x7c40300,0xe30000,0x5240af8b,0x7c00100,0x230400,0x5240af90,0x4000400,0x200000,0x5240af90,0x6800100,
-0x962540,0x5240af92,0x6800400,0x962540,0x5240af92,0x7c00100,0x230400,0x5240b2b1,0x4000000,0x200000,0x5240b2b1,0x4000000,0x1500000,0x5240b2bc,0x4000000,0x200000,
-0x5240b2c9,0x4000000,0x200000,0x5240b5de,0x7c00900,0x230400,0x524a44ab,0x4000000,0xe00003,0x5280af8b,0x2802400,0x962460,0x5280af8c,0x2802400,0x962460,0x5280af92,
-0x2802400,0x962460,0x5280af94,0x2802400,0x962460,0x5280af96,0x2802400,0x962460,0x52c0b3d5,0x2802400,0x962460,0x52c0b3d9,0x7c00100,0x230400,0x60000c02,0x2802100,
-0x962460,0x60000c02,0x7c00100,0x230400,0x60000f0a,0x2802100,0x962460,0x60000f0a,0x6800100,0x962540,0x60000f0a,0x7c00100,0x230400,0x6000131f,0x4000000,0x200000,
-0x6000171a,0x7c00100,0x230400,0x6000171a,0x7c00100,0x230560,0x60001b27,0x2802100,0x962460,0x60001b27,0x4000000,0xc00000,0x60001b27,0x7c00100,0x230400,0x60001f0b,
-0x2802000,0x962460,0x60002919,0x7c00100,0x22040e,0x60002a00,0x4000000,0x1600000,0x60003000,0x24000000,0x14200000,0x60003000,0x24000000,0x14e00000,0x60003700,0x24000000,
-0x4200000,0x60003800,0x24000000,0x1710000,0x60005102,0x4000000,0x200000,0x60006108,0x7c00100,0x220400,0x60006108,0x7c00100,0x250400,0x60006600,0x24000020,0x200000,
-0x60008301,0x2802000,0x962460,0x6000903c,0x2806000,0x962460,0x6000903c,0x4000000,0x400000,0x60009519,0x7c00100,0x220400,0x60009519,0x7c00100,0x250400,0x6000a008,
-0x7c00100,0x220400,0x6000a008,0x7c00100,0x250400,0x6000c300,0x4000000,0x3a703580,0x6000c654,0x2802000,0x962460,0x6000c654,0x4000010,0x200000,0x6000c654,0x7c00100,
-0x230400,0x6000c73f,0x2802000,0x962460,0x6000c73f,0x2802100,0x962460,0x6000c73f,0x4000000,0x200000,0x6000c73f,0x6800100,0x962540,0x6000c73f,0x6804000,0x962540,
-0x6000c73f,0x7c00100,0x230400,0x6000c80b,0x7c00100,0x230400,0x6000c941,0x2802100,0x962460,0x6000c941,0x2806000,0x962460,0x6000c941,0x4000000,0x200000,0x6000c941,
-0x4000010,0x200000,0x6000c941,0x6800000,0x1329800,0x6000c941,0x6800100,0x962540,0x6000c941,0x7c00100,0x230400,0x6000c941,0xc000010,0x448000,0x6000ca82,0x7c00100,
-0x230400,0x6000cc00,0x4000000,0x4e00000,0x6000d000,0x4000000,0x200000,0x6002c300,0x4000000,0x100000,0x6002c300,0x4000000,0x10000d,0x6002c300,0x4000100,0x150400,
-0x6002c300,0x4000100,0x15040d,0x6002c300,0x4000100,0x14150400,0x600a3000,0x24000000,0x34200000,0x600a3000,0x24000000,0x34e00000,0x600a3700,0x24000000,0x34200000,0x600a3800,
-0x24000000,0x34200000,0x600a3800,0x24000000,0xb6800000,0x600a4305,0x7c00100,0xe30400,0x600ac300,0x4000000,0x34100000,0x600ac400,0x4000000,0x14e0000d,0x600ac400,0x4000000,
-0x34e0000d,0x600acb14,0x7c00100,0xe30000,0x600acb16,0x7c00100,0xe30c00,0x600acc00,0x4000000,0x34e00000,0x600acd00,0x4000000,0x34200000,0x600acd00,0x4000000,0x34e00000,
-0x600acd00,0x4000000,0xb6800000,0x600ace00,0x4000000,0x34e00000,0x600ace00,0x4000000,0xb6800000,0x600acf00,0x4000000,0x34e00000,0x600acf00,0x4000000,0xb6800000,0x600ad111,
-0x7c40300,0xe30000,0x604ac4ab,0x4000000,0x34e00003,0x61000a03,0x4000000,0x1600000,0x61000c02,0x80000000,0x218960,0x6100120f,0x4000000,0x200000,0x61001a18,0x7c00100,
-0x1830000,0x61001d0c,0x7c00100,0x220400,0x61001d0c,0x7c00100,0x250400,0x61006600,0x24000020,0x200000,0x61008407,0x7c00100,0x220400,0x61008407,0x7c00100,0x250400,
-0x6100870c,0x7c00100,0x220400,0x61008e00,0x24000000,0x200000,0x61008e00,0x24000000,0x400000,0x61008e00,0x24000002,0x300000,0x6100903c,0x7c00100,0x230400,0x61009519,
-0x7c00100,0x220400,0x61009519,0x7c00100,0x250400,0x61009519,0x7c00500,0x22040f,0x61009b71,0x2802100,0x962460,0x61009b71,0x2806400,0x962460,0x61009b71,0x7c00100,
-0x230400,0x6100a008,0x2802100,0x962460,0x6100c300,0x4000000,0x20000f,0x6100cd00,0x4000000,0x200000,0x6100d202,0x2802400,0x962460,0x6100d202,0x2802500,0x962460,
-0x6100d202,0x7c00100,0x230400,0x6100d302,0x4000020,0x200000,0x6100d302,0x7c00120,0x230405,0x6100d476,0x2802100,0x962460,0x6100d476,0x2802100,0x962461,0x6100d476,
-0x2806400,0x962460,0x6100d476,0x4000000,0x400000,0x6100d476,0x6800000,0x1329800,0x6100d476,0x6800100,0x962540,0x6100d476,0x7c00100,0x230400,0x6100d476,0xc000010,
-0x448000,0x6100d573,0x2802100,0x962460,0x6100d573,0x2806400,0x962460,0x6100d573,0x6800100,0x962540,0x6100d573,0x7c00100,0x230400,0x6100d573,0x7c00900,0x230400,
-0x6100d573,0xc000010,0x448000,0x6100d68d,0x7c00100,0x230400,0x6100d756,0x7c00100,0x230400,0x6100d85c,0x2802400,0x962460,0x6100d85c,0x6800100,0x962540,0x6100d85c,
-0x7c00100,0x230400,0x6100d85c,0x7c00500,0x230400,0x6100d997,0x2802100,0x962460,0x6100d997,0x4000000,0x200000,0x6100d997,0x4000000,0x400000,0x6100d997,0x6800000,
-0x1329800,0x6100d997,0x6800100,0x962540,0x6100d997,0x6804400,0x962540,0x6100d997,0x7c00100,0x230400,0x6100d997,0x7c00100,0x230560,0x6100d997,0xc000010,0x448000,
-0x6100da98,0x6800000,0x1329800,0x6100da98,0x7c00100,0x230400,0x6100db71,0x4000000,0x200000,0x6100dc99,0x2802100,0x962460,0x6100dc99,0x2802400,0x962460,0x6100dc99,
-0x6800000,0x1329800,0x6100dc99,0x6800100,0x962540,0x6100dc99,0x6804400,0x962540,0x6100dc99,0x7c00100,0x230400,0x610a4711,0x7c40300,0xe30000,0x610a4f11,0x7c00300,
-0xe30001,0x610ace00,0x4000000,0x34e00000,0x6140af90,0x6800100,0x962540,0x6140af92,0x7c00100,0x230400,0x6180af8d,0x2802400,0x962460,0x62002a00,0x4000000,0x1600000,
-0x63002800,0x80000,0x918820,0x63c00c15,0x80000,0x918820,0x7000080e,0x7c00100,0x250400,0x70000a03,0x4000000,0x200000,0x70000c00,0x80000000,0x218960,0x70000f0a,
-0x7c00100,0x230400,0x70001004,0x7c00100,0x230400,0x70001524,0x2802100,0x962460,0x70001524,0x7c00100,0x230400,0x70001615,0x2802100,0x962460,0x7000171a,0x2802100,
-0x962460,0x70001821,0x6800000,0x1329800,0x70002320,0x7c00100,0x230400,0x70002a00,0x4000000,0x1500000,0x70002a00,0x4000000,0x1600000,0x70003000,0x24000000,0x200000,
-0x70003000,0x24000000,0x14200000,0x70003800,0x24000000,0x4e00000,0x70005201,0x2802400,0x962460,0x7000581e,0x7c00100,0x230400,0x70006108,0x7c00100,0x220400,0x70006108,
-0x7c00100,0x250400,0x70006f30,0x7c00100,0x230400,0x70007300,0x24000000,0x200000,0x70007f0e,0x4000000,0x200000,0x70008301,0x2802100,0x962460,0x70008301,0x2802400,
-0x962460,0x70008e00,0x24000000,0x200000,0x70008e00,0x24000000,0x400000,0x70008e00,0x24000002,0x400000,0x70008e00,0x24000008,0x1410000,0x70008e00,0x24000010,0x400000,
-0x70008e00,0x2c000010,0x448000,0x70009519,0x7c00100,0x220400,0x70009519,0x7c00100,0x230400,0x70009519,0x7c00100,0x250400,0x70009865,0x7c00100,0x230400,0x70009965,
-0x4000010,0x400000,0x70009965,0x7c00100,0x230400,0x7000a008,0x7c00100,0x220400,0x7000a008,0x7c00100,0x250400,0x7000a008,0x7c00500,0x22040f,0x7000a50e,0x4000000,
-0x200000,0x7000b61c,0x2802400,0x1862460,0x7000b61c,0x6800400,0x1862400,0x7000b61c,0x7c00100,0x1830000,0x7000c300,0x4000000,0x100000,0x7000c941,0x2806000,0x962460,
-0x7000cc00,0x4000000,0x4e00000,0x7000cd00,0x4000000,0x200000,0x7000cd00,0x4000000,0x4200000,0x7000cd00,0x4000000,0x4e00000,0x7000cd00,0x4000000,0x14200000,0x7000cd00,
-0x4000000,0x14e00000,0x7000cd00,0x4000000,0x96800000,0x7000cf00,0x4000000,0x4e00000,0x7000cf00,0x4000000,0x14e00000,0x7000d202,0x2802100,0x962460,0x7000d202,0x7c00100,
-0x230400,0x7000d997,0x7c00100,0x230400,0x7000d997,0xc000010,0x248000,0x7000dd86,0x2802400,0x962460,0x7000dd86,0x7c00100,0x230400,0x7000dd86,0xc000010,0x448000,
-0x7000de9f,0x4000000,0x200000,0x7000de9f,0x7c00100,0x230400,0x7000e001,0x2000,0x962460,0x7000e001,0x2802400,0x962460,0x7000e187,0x2802000,0x962460,0x7000e187,
-0x2802100,0x962460,0x7000e187,0x4000000,0x200000,0x7000e187,0x7c00100,0x230400,0x7000e187,0xc000010,0x448000,0x7000e288,0x7c00100,0x230400,0x7000e300,0x4000000,
-0x200000,0x7000e489,0x2802100,0x962460,0x7000e489,0x2802400,0x962460,0x7000e489,0x6800100,0x962540,0x7000e489,0x6800100,0x962541,0x7000e489,0x6804400,0x962540,
-0x7000e489,0x7c00100,0x230400,0x7000e489,0x7c00900,0x230400,0x7000e59d,0x2802100,0x962460,0x7000e59d,0x2802400,0x962460,0x7000e59d,0x4000000,0x200000,0x7000e59d,
-0x4000010,0x200000,0x7000e59d,0x6800100,0x962540,0x7000e59d,0x6804400,0x962540,0x7000e59d,0x7c00100,0x230400,0x7000e59d,0xc000010,0x448000,0x7000e691,0x2802100,
-0x962460,0x7000e691,0x2802400,0x962460,0x7000e691,0x2806400,0x962460,0x7000e691,0x6800000,0x1329800,0x7000e691,0x6800100,0x962540,0x7000e691,0x7c00100,0x230400,
-0x7000e700,0x4000400,0x200400,0x7000e70e,0x7c00100,0x220400,0x7000e719,0x7c00100,0x220400,0x7000e719,0x7c00500,0x22040f,0x7000e853,0x7c00100,0x230400,0x7000e9a0,
-0x2802400,0x962460,0x7000e9a0,0x4000000,0x200000,0x7000e9a0,0x4000000,0x500000,0x7000e9a0,0x7c00100,0x230400,0x7000ea79,0x2802400,0x962460,0x7000ea79,0x4000000,
-0x200000,0x7000ea79,0x4000000,0xf00000,0x7000ea79,0x4000010,0x400000,0x7000ea79,0x7c00100,0x230400,0x7000eb8c,0x2802400,0x962460,0x7000eb8c,0x4000000,0x200000,
-0x7000eb8c,0x7c00100,0x230400,0x7000eca3,0x2802100,0x962460,0x7000eca3,0x2806400,0x962460,0x7000eca3,0x4000000,0x200000,0x7000eca3,0x6800000,0x1329800,0x7000eca3,
-0x6800100,0x962540,0x7000eca3,0x7c00100,0x230400,0x7000eca3,0xc000010,0x448000,0x7000ed95,0x6800000,0x1329800,0x7000ed95,0x7c00100,0x230400,0x7000ed95,0xc000010,
-0x448000,0x7000ee1c,0x2802400,0x1862460,0x7000ee1c,0x6800000,0x1329800,0x7000ee1c,0x7c00100,0x1830000,0x7000ee1c,0x7c00900,0x1830000,0x7000ef8f,0x4000000,0x200000,
-0x7000ef8f,0x7c00100,0x230400,0x7000f08e,0x4000000,0x200000,0x7000f08e,0x7c00100,0x230400,0x7000f159,0x2802100,0x962460,0x7000f159,0x7c00100,0x230400,0x7000f200,
-0x4000000,0x200000,0x7000f200,0x4000000,0x1200000,0x7000f200,0x4000000,0x1710000,0x7000f34b,0x2802100,0x962460,0x7000f34b,0x4000000,0x200000,0x7000f34b,0x4000010,
-0x400000,0x7000f34b,0x6800000,0x1329800,0x7000f34b,0x7c00100,0x230400,0x7000f34b,0x7c00900,0x230400,0x7000f34b,0xc000010,0x448000,0x7000f490,0x4000000,0x200000,
-0x7000f490,0x7c00100,0x230400,0x7000f5a5,0x7c00100,0x230400,0x7000f67b,0x4000000,0x200000,0x7000f67b,0x4000010,0x200000,0x7000f67b,0x7c00100,0x230400,0x7000f8a6,
-0x2802100,0x962460,0x7000f8a6,0x2802400,0x962460,0x7000f8a6,0x2806400,0x962460,0x7000f8a6,0x4000000,0x500000,0x7000f8a6,0x4000010,0xb00000,0x7000f8a6,0x4000800,
-0x200000,0x7000f8a6,0x6800100,0x962540,0x7000f8a6,0x6800100,0x962541,0x7000f8a6,0x7c00100,0x230400,0x7000f8a6,0xc000010,0x448000,0x7000f921,0x4000000,0x200000,
-0x7000fa00,0x4000000,0x200000,0x7000fb9e,0x2802100,0x962460,0x7000fb9e,0x2802400,0x962460,0x7000fb9e,0x2806400,0x962460,0x7000fb9e,0x4000000,0x200000,0x7000fb9e,
-0x6800000,0x1329800,0x7000fb9e,0x6800100,0x962540,0x7000fb9e,0x6800100,0x962541,0x7000fb9e,0x7c00100,0x230400,0x7000fc92,0x4000000,0x200000,0x7000fc92,0x6800000,
-0x1329800,0x7000fc92,0x7c00100,0x220400,0x7000fc92,0x7c00100,0x230400,0x7000fc92,0x7c00100,0x250400,0x700acd00,0x4000000,0x34e00000,0x700acd00,0x4000000,0xb6800000,
-0x700ace00,0x4000000,0x34e00000,0x700acf00,0x4000000,0x34e00000,0x700acf00,0x4000000,0xb6800000,0x7040dfe5,0x4000000,0x200000,0x7040f7e9,0x80000,0x918820,0x7080af90,
-0x2802400,0x962460,0x7080dfe5,0x2802400,0x962460,0x70c0e4e7,0x2802100,0x962460,0x70c0e4e7,0x2802400,0x962460,0x70c0e4e7,0x6800100,0x962540,0x8000120f,0x7c00100,
-0x230400,0x80001524,0x7c00100,0x230400,0x8000171a,0x7c00100,0x230400,0x80002006,0x7c00100,0x220400,0x80002006,0x7c00100,0x250400,0x80002a00,0x4000000,0x1500000,
-0x80002d00,0x4000000,0x200000,0x80005208,0x2802400,0x962460,0x80005c00,0x4000000,0x200000,0x80007300,0x24000000,0x200000,0x80009519,0x7c00100,0x220400,0x80009519,
-0x7c00100,0x230400,0x80009519,0x7c00100,0x250400,0x80009865,0x7c00100,0x230400,0x8000a008,0x2802100,0x962460,0x8000b30a,0x4000000,0x500000,0x8000b30a,0x7c00100,
-0x230400,0x8000cd00,0x4000000,0x4e00000,0x8000d202,0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802000,0x962460,
-0x8000d997,0x2802400,0x962460,0x8000d997,0x4000000,0x400000,0x8000d997,0x4000000,0x500000,0x8000d997,0x7c00100,0x230400,0x8000d997,0xc000010,0x448000,0x8000e489,
-0x2802100,0x962460,0x8000e489,0x7c00100,0x230400,0x8000e719,0x7c00100,0x220400,0x8000f8a6,0x2802100,0x962460,0x8000f8a6,0x7c00100,0x230400,0x8000f8a6,0xc000010,
-0x448000,0x8000fda1,0x2802100,0x1862460,0x8000fda1,0x2806400,0x1862460,0x8000fda1,0x4000000,0x1800000,0x8000fda1,0x6800000,0x1329800,0x8000fda1,0x6800100,0x1862540,
-0x8000fda1,0x7c00100,0x1830000,0x8000fda1,0xc000010,0x448000,0x8000fe9c,0x7c00100,0x230400,0x8000fe9c,0x7c00100,0x830400,0x8000fe9c,0x7c00100,0x1430400,0x8000ff06,
-0x7c00100,0x220400,0x80010165,0x7c00100,0x230400,0x800102a2,0x4000000,0x200000,0x800102a2,0x7c00100,0x230400,0x800103a4,0x7c00100,0x230400,0x800103a4,0xc000010,
-0x448000,0x8001044c,0x4000000,0x200000,0x8001044c,0x7c00100,0x220400,0x8001044c,0x7c00100,0x250400,0x80010670,0x2802000,0x962460,0x80010670,0x4000000,0x200000,
-0x80010670,0x4000010,0x400000,0x80010670,0xc000010,0x448000,0x800a4711,0x7c40300,0xe30000,0x800acd00,0x4000000,0x34e00000,0x800acd00,0x4000000,0x7a902460,0x800ace00,
-0x4000000,0x34e00000,0x800acf00,0x4000000,0x34e00000,0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0x34e00000,0x800b0500,0x4000000,0xb6800000,0x90001615,0x7c00100,
-0x230400,0x9000171a,0x4000000,0x200000,0x9000171a,0x7c00100,0x230400,0x90003000,0x24000000,0x200000,0x90007f0e,0x4000000,0x200000,0x90008301,0x2802000,0x962460,
-0x90008e00,0x24000000,0x400000,0x90009519,0x7c00100,0x250400,0x9000a16f,0x2802100,0x962460,0x9000d200,0x80000000,0x218960,0x9000d202,0x2802000,0x962460,0x9000d202,
-0x2802100,0x962460,0x9000d202,0x7c00100,0x230400,0x9000e59d,0x2802100,0x962460,0x900107a7,0x2802100,0x962460,0x900107a7,0x2802400,0x962460,0x900107a7,0x2802c00,
-0x962460,0x900107a7,0x4000000,0x1400000,0x900107a7,0x6800000,0x1329800,0x900107a7,0x7c00100,0x220400,0x900107a7,0x7c00100,0x250400,0x900108a8,0x2802100,0x962460,
-0x900108a8,0x2806400,0x962460,0x900108a8,0x4000000,0x200000,0x900108a8,0x4000000,0x400000,0x900108a8,0x4000010,0x400000,0x900108a8,0x6800000,0x1329800,0x900108a8,
-0x6800100,0x962540,0x900108a8,0x7c00100,0x230400,0x900108a8,0xc000010,0x448000,0x90010908,0x7c00100,0x220400,0x90010a38,0x2802100,0x962460,0x90010ca9,0x2802100,
-0x962460,0x90010ca9,0x4000000,0x500000,0x90010ca9,0x4000010,0xb00000,0x90010ca9,0x6800100,0x962540,0x90010ca9,0x7c00100,0x230400,0x90010d1b,0x4000000,0x500000,
-0x90010eaa,0x2802100,0x962460,0x90010eaa,0x2802400,0x962460,0x90010eaa,0x2806400,0x962460,0x90010eaa,0x4000000,0x200000,0x90010eaa,0x4000000,0x400000,0x90010eaa,
-0x4000010,0x400000,0x90010eaa,0x6800000,0x1329800,0x90010eaa,0x6800100,0x962540,0x90010eaa,0x7c00100,0x230400,0x90010eaa,0xc000010,0x448000,0x90010fab,0x7c00100,
-0x220400,0x90010fab,0x7c00100,0x250400,0x9002c300,0x4000000,0x100000,0x900ac400,0x4000000,0xe0000d,0x900acd00,0x4000000,0x34e00000,0x900acd00,0x4000000,0xb6800000,
-0x900acf00,0x4000000,0x34e00000,0x900b0500,0x4000000,0xe00000,0x900b0500,0x4000000,0x34e00000,0x900b0500,0x4000000,0xb6800000,0x900b0b9a,0x7c00900,0x1230400,0x900b109a,
-0x7c00300,0xe30000,0x900b119a,0x7c00300,0xe30000,0x90408e06,0x24000000,0x400000,0xa0001004,0x4000000,0x200000,0xa0001004,0x7c00100,0x230400,0xa000120f,0x2802100,
-0x962460,0xa000120f,0x2802400,0x962460,0xa000171a,0x2802100,0x962460,0xa000171a,0x2806400,0x962460,0xa0002a00,0x4000000,0x1600000,0xa0003000,0x24000000,0x200000,
-0xa000581e,0x7c00100,0x230400,0xa0007300,0x24000000,0x200000,0xa0008301,0x2802400,0x962460,0xa0008e00,0x24000000,0x400000,0xa000cf00,0x4000000,0x4e00000,0xa0010500,
-0x4000000,0x200000,0xa00114af,0x2802100,0x962460,0xa00114af,0x2802400,0x962460,0xa00114af,0x2806400,0x962460,0xa00114af,0x6800000,0x1329800,0xa00114af,0x7c00100,
-0x230400,0xa00114af,0x7c00100,0x230560,0xa00116b0,0x2802100,0x962460,0xa00116b0,0x2802800,0x962460,0xa00116b0,0x2806400,0x962460,0xa00116b0,0x4000000,0x400000,
-0xa00116b0,0x4000000,0x500000,0xa00116b0,0x4000010,0x400000,0xa00116b0,0x6800100,0x962540,0xa00116b0,0x7c00100,0x230400,0xa00116b0,0x7c00100,0x230560,0xa00116b0,
-0xc000010,0x448000,0xa0011722,0x7c00100,0x230400,0xa00118b1,0x2802000,0x962460,0xa00118b1,0x2802100,0x962460,0xa00118b1,0x2806400,0x962460,0xa00118b1,0x4000000,
-0x200000,0xa00118b1,0x4000000,0x400000,0xa00118b1,0x4000000,0x500000,0xa00118b1,0x6800100,0x962540,0xa00118b1,0x7c00100,0x230400,0xa00118b1,0x7c00100,0x230560,
-0xa00118b1,0xc000010,0x448000,0xa00a4005,0x7c00100,0xe30400,0xa00a4711,0x7c40300,0xe30000,0xa00ac400,0x4000000,0x4e00000,0xa00acb14,0x7c00100,0xe30000,0xa00acf00,
-0x4000000,0x34e00000,0xa00b0500,0x4000000,0x34e00000,0xa00b0500,0x4000000,0xb6800000,0xa00b0b96,0x7c00900,0x1230400,0xa00b1211,0x7c40300,0xe30000,0xa00b1314,0x7c00100,
-0xe30000,0xa00b1596,0x7c00300,0xe30000,0xa040af9c,0x6800400,0x962540,0xb0000a03,0x7c00100,0x220400,0xb0000b13,0x7c00100,0x2633800,0xb0001004,0x2802000,0x962460,
-0xb0001110,0x4000000,0x200000,0xb0001524,0x2802000,0x962460,0xb0001615,0x4000000,0x500000,0xb000251b,0x7c00100,0x230400,0xb0007300,0x24000000,0x200000,0xb0008939,
-0x4000000,0x200000,0xb0008939,0x7c00100,0x230400,0xb0008e00,0x24000000,0x200000,0xb0008e00,0x24000000,0x400000,0xb0008e00,0x24000010,0x400000,0xb0009257,0x2802000,
-0x962460,0xb0009257,0x4000000,0x1600000,0xb0009519,0x7c00100,0x220400,0xb0009519,0x7c00100,0x250400,0xb0009a00,0x4000000,0x200000,0xb000b30a,0x2802000,0x962460,
-0xb000b30a,0x7c00100,0x230400,0xb000c178,0x80000000,0x218960,0xb000c300,0x4000000,0x4200000,0xb000d202,0x2802000,0x962460,0xb000d476,0x6800100,0x962540,0xb000d476,
-0x7c00100,0x230400,0xb000e300,0x4000000,0x4e00000,0xb000fda1,0x7c00100,0x1830000,0xb0010eaa,0x2802000,0x962460,0xb00116b0,0x7c00100,0x230400,0xb0011900,0x4000000,
-0x4e00000,0xb0011ab2,0x2802100,0x962460,0xb0011ab2,0x2802400,0x962460,0xb0011ab2,0x2806400,0x962460,0xb0011ab2,0x4000000,0x200000,0xb0011ab2,0x6800100,0x962540,
-0xb0011ab2,0x7c00100,0x230400,0xb0011b0c,0x7c00100,0x250400,0xb0011cb3,0x2802100,0x962460,0xb0011cb3,0x2806400,0x962460,0xb0011cb3,0x6800000,0x1329800,0xb0011cb3,
-0x6800100,0x962540,0xb0011cb3,0x7c00100,0x230400,0xb0011db6,0x2802500,0x962460,0xb0011db6,0x6800000,0x1329800,0xb0011db6,0x7c00100,0x230400,0xb0011db6,0x7c00500,
-0x230400,0xb0011e00,0x4000000,0x200000,0xb0011e00,0x4000000,0x1500000,0xb0011fb4,0x2802100,0x962460,0xb0011fb4,0x6800100,0x962540,0xb0011fb4,0x7c00100,0x230400,
-0xb0011fb4,0xc000010,0x248000,0xb0012000,0x4000000,0x200000,0xb00121b5,0x4000000,0x200000,0xb00121b5,0x4000010,0x400000,0xb00121b5,0x7c00100,0x220400,0xb00121b5,
-0x7c00100,0x250400,0xb00121b5,0xc000010,0x448000,0xb00122b8,0x4000000,0x200000,0xb00122b8,0x7c00100,0x230400,0xb00123b7,0x2802400,0x962460,0xb00123b7,0x4000000,
-0x200000,0xb00123b7,0x7c00100,0x230400,0xb00123b7,0xc000010,0x248000,0xb00a4005,0x7c00100,0xe30400,0xb00a4711,0x7c40300,0xe30000,0xb00acf00,0x4000000,0x34e00000,
-0xb00b0500,0x4000000,0x34e00000,0xb00b0500,0x4000000,0x3ce00000,0xb00b0500,0x4000000,0xb6800000,0xb00b109a,0x7c00300,0xe30000,0xb080e47a,0x2802000,0x962460};
+0,0,0x12467,0,0,0x12567,0,0,0x12667,0,0,0x12767,0,0,0x12867,0,
+0,0x12967,0,0,0x12a67,0,0x4e00000,0x12b67,0,0,0x12c67,0,0,0xa0067,0,0xe00000,
+0xa4667,0,0xe00000,0xa4767,0,0xe00000,0xa4f67,0,0xe00000,0xa5e67,0,0xe00000,0xa5f67,0,0xe00000,0xac567,
+0,0xe00000,0xad167,0,0xe00000,0xb0067,0,0xe00000,0xb1267,0,0xe00000,0x11000100,0,0x900020,0x11000100,0x40000001,
+0x440020,0x11000100,0x40000001,0x643020,0x11000100,0x40000001,0xa5a040,0x11000100,0x40000001,0x116a8a0,0x11000200,0,0x900020,0x11000200,0x4000001,0xc4000b,
+0x11000200,0x7c00100,0x220402,0x11000200,0x24000000,0x14200000,0x11000200,0x24000008,0x1710000,0x11000200,0x40000001,0x1d3b020,0x11000219,0x7c00100,0x220401,0x11000219,
+0x7c00100,0x250401,0x11000319,0x7c00100,0x220401,0x11000319,0x7c00100,0x220402,0x11000319,0x7c00100,0x250400,0x11000319,0x7c00100,0x250401,0x11000419,0x7c00100,
+0x220400,0x11000419,0x7c00100,0x220401,0x11000419,0x7c00100,0x220402,0x11000419,0x7c00100,0x230400,0x11000419,0x7c00100,0x250400,0x11000419,0x7c00100,0x250401,
+0x11000419,0x7c00100,0x250402,0x11000519,0x7c00100,0x220400,0x11000519,0x7c00100,0x230400,0x11000600,0x4000400,0x200000,0x11000600,0x4000400,0x200002,0x11000600,
+0x4000400,0x200400,0x11000600,0x7c00500,0x220400,0x11000600,0x7c00500,0x230400,0x11000600,0x7c00500,0x530400,0x11000600,0x7c00d00,0x230400,0x11000619,0x7c00500,
+0x22040f,0x11000800,0x4000010,0x1001401,0x11000800,0x4000400,0x200001,0x11000800,0x6800010,0x201001,0x11000800,0x7c00500,0x230401,0x11000807,0x7c00100,0x220400,
+0x11000807,0x7c00100,0x250400,0x1100080e,0x4000400,0x200000,0x1100080e,0x4000400,0x200002,0x1100080e,0x7000500,0x220402,0x1100080e,0x7c00100,0x220400,0x1100080e,
+0x7c00100,0x220401,0x1100080e,0x7c00100,0x220402,0x1100080e,0x7c00100,0x250400,0x1100080e,0x7c00100,0x250401,0x1100080e,0x7c00120,0x220402,0x1100080e,0x7c00120,
+0x250402,0x11000908,0x4000000,0x200000,0x11000908,0x7c00100,0x220400,0x11000908,0x7c00100,0x220401,0x11000908,0x7c00100,0x250400,0x11000908,0x7c00100,0x250401,
+0x11000a03,0x4000000,0x200000,0x11000a03,0x4000000,0x200400,0x11000a03,0x4000000,0x270000,0x11000a03,0x7c00100,0x220400,0x11000a03,0x7c00100,0x220402,0x11000a03,
+0x7c00100,0x250400,0x11000a03,0x7c00500,0x230400,0x11000b13,0x2802500,0x962460,0x11000b13,0x4000000,0x200000,0x11000b13,0x4000000,0x201000,0x11000b13,0x4000000,
+0x230400,0x11000b13,0x4000002,0x400000,0x11000b13,0x4000010,0x200000,0x11000b13,0x7c00100,0x2633800,0x11000c00,0x80000000,0x218960,0x11000c02,0x2802100,0x962460,
+0x11000c02,0x2802400,0x962460,0x11000c02,0x4000000,0x200000,0x11000c02,0x4000000,0x1329400,0x11000c02,0x4000000,0x1329800,0x11000c02,0x4000000,0x1500000,0x11000c02,
+0x6800000,0x1329800,0x11000c02,0x7c00100,0x230400,0x11000c02,0x7c00100,0x230401,0x11000c02,0x7c00100,0x230402,0x11000c02,0x7c00500,0x230400,0x11000c02,0x7d00100,
+0x230400,0x11000f01,0x2802400,0x962460,0x11000f0a,0x2802100,0x962460,0x11000f0a,0x2802400,0x962460,0x11000f0a,0x2806400,0x962460,0x11000f0a,0x4000000,0x200000,
+0x11000f0a,0x6800100,0x962540,0x11000f0a,0x7c00100,0x230400,0x11000f0a,0x7c00100,0x230401,0x11001004,0x2802100,0x962460,0x11001004,0x2802400,0x962460,0x11001004,
+0x2806400,0x962460,0x11001004,0x4000000,0x200000,0x11001004,0x4000000,0x1500000,0x11001004,0x6800100,0x962540,0x11001004,0x6800100,0x962541,0x11001004,0x7c00100,
+0x230400,0x11001004,0x7c00100,0x230401,0x11001110,0x2802100,0x962460,0x11001110,0x2802400,0x962460,0x11001110,0x2806400,0x962460,0x11001110,0x6800100,0x962540,
+0x11001110,0x7c00100,0x230400,0x11001110,0x7c00100,0x230401,0x1100120f,0x2802100,0x962460,0x1100120f,0x2802400,0x962460,0x1100120f,0x2806400,0x962460,0x1100120f,
+0x6800100,0x962540,0x1100120f,0x7c00100,0x230400,0x1100131f,0x2802100,0x962460,0x1100131f,0x2802400,0x962460,0x1100131f,0x2806400,0x962460,0x1100131f,0x4000000,
+0x200000,0x1100131f,0x6800000,0x1329800,0x1100131f,0x6800100,0x962540,0x1100131f,0x6800100,0x962541,0x1100131f,0x7c00100,0x230400,0x1100131f,0x7c00100,0x230401,
+0x11001423,0x2802100,0x962460,0x11001423,0x2806400,0x962460,0x11001423,0x6800100,0x962540,0x11001423,0x6800100,0x962541,0x11001423,0x7c00100,0x230400,0x11001423,
+0x7c00100,0x230401,0x11001524,0x2802100,0x962460,0x11001524,0x2802100,0x962461,0x11001524,0x2806400,0x962460,0x11001524,0x6800000,0x1329800,0x11001524,0x6800100,
+0x962540,0x11001524,0x7c00100,0x230400,0x11001615,0x2802100,0x962460,0x11001615,0x2806400,0x962460,0x11001615,0x6800100,0x962540,0x11001615,0x6800100,0x962541,
+0x11001615,0x7c00100,0x230400,0x1100171a,0x2802100,0x962460,0x1100171a,0x2806400,0x962460,0x1100171a,0x6800000,0x1329800,0x1100171a,0x6800100,0x962540,0x1100171a,
+0x6800100,0x962541,0x1100171a,0x7c00100,0x230400,0x11001900,0x4000000,0x1600000,0x11001926,0x2802100,0x1862460,0x11001926,0x2802400,0x1862460,0x11001926,0x2806100,
+0x1862460,0x11001926,0x4000000,0x200000,0x11001926,0x4000010,0x400000,0x11001926,0x6800000,0x1329800,0x11001926,0x7800100,0x1830142,0x11001926,0x7c00100,0x1830000,
+0x11001926,0x7c00900,0x1830000,0x11001926,0x7e00100,0x1830000,0x11001a18,0x2802100,0x1862460,0x11001a18,0x2802400,0x1862460,0x11001a18,0x6800000,0x1329800,0x11001a18,
+0x7800100,0x1830142,0x11001a18,0x7c00100,0x1830000,0x11001a18,0x7c00100,0x1830002,0x11001a18,0x7c00900,0x1830000,0x11001a18,0x7e00100,0x1830000,0x11001d0c,0x7c00100,
+0x230400,0x11001d0c,0x7c00100,0x250400,0x11001e12,0x7c00100,0x2230500,0x11001e12,0x7c00100,0x2330520,0x11001e12,0x7c80100,0x2330520,0x11002619,0x7c00100,0x220401,
+0x11002619,0x7c00100,0x220402,0x11002619,0x7c00100,0x250401,0x1100270e,0x4000400,0x200001,0x1100270e,0x4000400,0x200002,0x1100270e,0x4000400,0x500001,0x1100270e,
+0x7c00100,0x220401,0x1100270e,0x7c00100,0x250401,0x11002800,0x80000,0x918820,0x11002800,0x80000,0x1c18020,0x11002800,0x180000,0x918820,0x11002800,0x4000001,
+0x445801,0x11002800,0x4000001,0x445802,0x11002800,0x4000001,0xc4000b,0x11002800,0x6800000,0x201c00,0x11002800,0x6800020,0x201c00,0x11002800,0x24000000,0x200000,
+0x11002800,0x24000000,0x200002,0x11002800,0x24000000,0x810000,0x11002800,0x24000000,0x1410000,0x11002800,0x24000000,0x1500000,0x11002800,0x24000000,0x1500002,0x11002800,
+0x24000002,0x400000,0x11002800,0x24000006,0xc0000b,0x11002800,0x24000008,0x1410000,0x11002800,0x24000008,0x1710000,0x11002800,0x24000020,0x1001400,0x11002800,0x24000020,
+0x1500002,0x11002800,0x2c000010,0x1248000,0x11002800,0x2c000010,0x15248002,0x11002800,0x40000001,0x63b020,0x11002800,0x40080000,0x918820,0x11002801,0x80000,0xaa65620,
+0x11002801,0x82000,0x962460,0x11002900,0x4000000,0x20000e,0x11002900,0x4000000,0x20000f,0x11002900,0x4000020,0x20000e,0x11002900,0x4000020,0x20000f,0x11002900,
+0x4000020,0x81000e,0x11002900,0x4000020,0x81000f,0x11002900,0x4000020,0x141000e,0x11002900,0x4000020,0x141000f,0x11002900,0x4000022,0x20000e,0x11002900,0x4000022,
+0x20000f,0x11002a00,0x4000000,0x1500000,0x11002a00,0x4000000,0x1600000,0x11002a00,0x4000000,0x1600002,0x11002b01,0x2000,0x962460,0x11002b01,0x2802020,0x962460,
+0x11002c00,0x4000000,0x200000,0x11002c00,0x4000000,0x200002,0x11002c00,0x4000000,0x20000f,0x11002c00,0x4000020,0x200000,0x11002c00,0x7c00000,0x200000,0x11002c00,
+0x7c00020,0x200000,0x11002c00,0x7c00120,0x220405,0x11002c00,0x7c00120,0x230402,0x11002c00,0x7c00120,0x250402,0x11002c00,0x7c00120,0x250405,0x11002c19,0x7c00100,
+0x250400,0x11002c19,0x7c00100,0x250401,0x11002d00,0x4000000,0x100006,0x11002d00,0x4000000,0x200006,0x11002d19,0x7c00100,0x220402,0x11002d19,0x7c00100,0x230400,
+0x11002d19,0x7c00100,0x250402,0x11002e00,0x24000000,0x200000,0x11002e00,0x24000020,0x200000,0x11002e00,0x24000020,0x200001,0x11002e00,0x24000020,0x14200000,0x11002f00,
+0x24000020,0x200000,0x11002f00,0x24000020,0x200001,0x11002f00,0x24000020,0x200002,0x11002f00,0x24000020,0xf00000,0x11002f00,0x24000020,0x1600000,0x11002f00,0x24000022,
+0x1600000,0x11003000,0x24000000,0x200000,0x11003000,0x24000000,0x14200000,0x11003000,0x24000020,0x200000,0x11003000,0x24000020,0x810000,0x11003000,0x24000020,0x1410000,
+0x11003100,0x24000000,0x200000,0x11003200,0x24000000,0x200000,0x11003300,0x4000000,0x100003,0x11003400,0x24000000,0x100000,0x11003400,0x24000000,0x200000,0x11003500,
+0x24000000,0x200000,0x11003600,0x24000000,0x200000,0x11003600,0x24000000,0x14200000,0x11003600,0x24000020,0x200000,0x11003700,0x24000000,0x200000,0x11003700,0x24000000,
+0x4200000,0x11003700,0x24000000,0x4e00000,0x11003700,0x24000000,0x14200000,0x11003700,0x24000000,0x14e00000,0x11003700,0x24000000,0x96800000,0x11003700,0x24000020,0x4200000,
+0x11003800,0x4000000,0x100000,0x11003800,0x24000000,0x200000,0x11003800,0x24000000,0xb00000,0x11003800,0x24000000,0x1710000,0x11003800,0x24000000,0x4200000,0x11003800,
+0x24000000,0x4e00000,0x11003800,0x24000000,0x14200000,0x11003800,0x24000000,0x14b00000,0x11003800,0x24000000,0x14e00000,0x11003800,0x24000000,0x96800000,0x11005003,0x7c00100,
+0x220402,0x11005013,0x2802500,0x962460,0x11005013,0x4000020,0x200005,0x11005013,0x7c00100,0x2633801,0x11005013,0x7c00100,0x2633802,0x11005013,0x7c00100,0x2633805,
+0x11005019,0x7c00100,0x220402,0x11005100,0x24000000,0x810000,0x11005100,0x24000000,0x1410000,0x11005102,0x7000100,0x230408,0x11005102,0x7c00100,0x230404,0x11005102,
+0x7c00100,0x230407,0x11005102,0x7c00100,0x230408,0x11005102,0x7c00100,0x230409,0x11005201,0x2802400,0x962460,0x11005500,0x80000,0x1e18820,0x11005502,0x7000100,
+0x230408,0x11005502,0x7c00100,0x230404,0x11005502,0x7c00100,0x230407,0x11005502,0x7c00100,0x230408,0x11005502,0x7c00100,0x230409,0x11005667,0x1000,0,
+0x11020200,0x80004,0x418820,0x11020200,0x4000000,0x100006,0x11020200,0x4000000,0x10000f,0x11020200,0x4000400,0x100002,0x11020200,0x4000400,0x500002,0x11020200,
+0x6800c00,0x101000,0x11020200,0x24000000,0x100000,0x11020200,0x24000000,0x1400000,0x11020200,0x24000000,0x1500000,0x11020200,0x24000000,0x1600000,0x11020200,0x24000000,
+0x14200000,0x11020200,0x24000020,0x100000,0x11020200,0x24000020,0x1600000,0x11020219,0x7c00100,0x12040f,0x11020219,0x7c00100,0x220400,0x11020219,0x7c00100,0x220401,
+0x11020219,0x7c00100,0x250400,0x11020319,0x7c00100,0x220400,0x11020319,0x7c00100,0x220401,0x11020319,0x7c00100,0x220402,0x11020319,0x7c00100,0x250400,0x11020319,
+0x7c00100,0x250402,0x11020319,0x7d00100,0x220402,0x11020419,0x7c00100,0x220401,0x11020519,0x7c00100,0x220400,0x11020600,0x4000400,0x100002,0x11020600,0x4000400,
+0x200400,0x11020600,0x7c00500,0x130400,0x11020600,0x7c00d00,0x130400,0x11020701,0x2802400,0x962460,0x11020701,0x2802400,0x962461,0x11020701,0x2802400,0xc62460,
+0x1102080e,0x7c00100,0x220400,0x1102080e,0x7c00100,0x250400,0x11020908,0x7c00100,0x220400,0x11020908,0x7c00100,0x220401,0x11020908,0x7c00100,0x250400,0x11020908,
+0x7c00100,0x250401,0x11022800,0x24000000,0x100000,0x11022800,0x24000000,0x200000,0x11022800,0x24000000,0x200002,0x11022800,0x24000000,0x401000,0x11022800,0x24000000,
+0xf00002,0x11022800,0x24000000,0xf0ac02,0x11022800,0x24000000,0x1500000,0x11022800,0x24000002,0x100000,0x11022800,0x24000002,0x370000,0x11022800,0x24000002,0x470000,
+0x11022800,0x24000006,0x400000,0x11022800,0x24000008,0x1710000,0x11022800,0x24000008,0x1712c00,0x11022800,0x24000020,0x100000,0x11022800,0x24000020,0x1500000,0x11022800,
+0x24000020,0x1500002,0x11022900,0x4000000,0x10000e,0x11022900,0x4000000,0x10000f,0x11022919,0x7c00100,0x12040f,0x11022c00,0x4000000,0x100002,0x11022c00,0x4000000,
+0x1500002,0x11022c00,0x4000000,0x1600002,0x11022c00,0x4000000,0x1410000f,0x11022c00,0x7c00120,0x120405,0x11022c0e,0x7c00100,0x250401,0x11022c19,0x7c00100,0x150401,
+0x11022d00,0x4000000,0x100006,0x11022d00,0x4000000,0x200006,0x11022d19,0x7c00100,0x120402,0x11022d19,0x7c00100,0x150402,0x11022e00,0x24000000,0x200000,0x11022e00,
+0x24000020,0x100000,0x11022e00,0x24000020,0x14100000,0x11022f00,0x24000020,0x100000,0x11022f00,0x24000020,0x100001,0x11022f00,0x24000020,0x100002,0x11023000,0x24000000,
+0x100000,0x11023300,0x4000000,0x100002,0x11023300,0x4000000,0x100003,0x11023300,0x4000100,0x120403,0x11023300,0x4000100,0x150403,0x11023300,0x4000100,0x14150403,
+0x11023400,0x24000000,0x100000,0x11023500,0x24000000,0x100000,0x11023600,0x24000000,0x100000,0x11023600,0x24000020,0x100000,0x11023600,0x24000020,0x14100000,0x11023700,
+0x24000000,0x4100000,0x11023700,0x24000000,0x4e00000,0x11023700,0x24000000,0x14100000,0x11023700,0x24000000,0x14e00000,0x11023700,0x24000020,0x100000,0x11023700,0x24000020,
+0x4100000,0x11023700,0x24000020,0x14100000,0x11023800,0x4000000,0x100000,0x11023800,0x24000000,0x200000,0x11024e67,0,0,0x11025600,0x4000000,0x100000,
+0x11042a00,0x4000000,0x1600000,0x11045700,0x4000000,0x20000a,0x11045700,0x4000020,0x20000a,0x11045712,0x7c00100,0xe3040a,0x11045712,0x7c80100,0xe3040a,0x11045716,
+0x7c00100,0xe30c0a,0x11045716,0x7c00100,0x2530c0a,0x11063d00,0x4000001,0x445811,0x11065700,0x4000000,0x810011,0x11065700,0x4000000,0xe00011,0x11065700,0x4000000,
+0x1410011,0x11065700,0x4000000,0x1500011,0x11065700,0x4000000,0x1600011,0x11065700,0x4000006,0xe70011,0x11065700,0x4000008,0xe00011,0x11065700,0x4000008,0xe02c11,
+0x11065700,0x4000010,0x871411,0x11065700,0x4000010,0x1201411,0x11065700,0x4000010,0x1271011,0x11065700,0x4000020,0xe00011,0x11065700,0x4000400,0xe00011,0x11065700,
+0x4000420,0xe00011,0x11065700,0x6800000,0xe01c11,0x11065700,0x6800040,0xe29811,0x11065700,0xc000010,0x80ac11,0x11065700,0xc000010,0xb48011,0x11065719,0x7c00100,
+0xe20411,0x11065719,0x7c00100,0xe50411,0x11065719,0x7c00140,0xe20411,0x11065719,0x7c00140,0xe50411,0x11080100,0x6800000,0x201c00,0x11080100,0x68000c0,0x19329800,
+0x11080100,0x24000000,0x200000,0x11080100,0x24000000,0x810000,0x11080100,0x24000000,0x1410000,0x11080100,0x24000000,0x1500000,0x11080100,0x24000000,0x1600000,0x11080100,
+0x24000000,0x1b00000,0x11080100,0x24000000,0x2410000,0x11080100,0x24000000,0x18200000,0x11080100,0x24000006,0xd70000,0x11080100,0x24000008,0x1713c00,0x11080100,0x24000008,
+0x1714000,0x11080100,0x24000010,0x1001400,0x11080100,0x24000010,0x1071000,0x11080100,0x24000010,0x1071400,0x11080100,0x24000020,0x200000,0x11080100,0x24000020,0x400000,
+0x11080100,0x24000020,0x1600000,0x11080100,0x24000400,0x200000,0x11080100,0x24000420,0x200000,0x11080100,0x2c000010,0xb48000,0x11080100,0x2c000010,0x100ac00,0x11080100,
+0x44000001,0x1a45800,0x11080119,0x7c00100,0x220400,0x11080119,0x7c00100,0x250400,0x11080119,0x7c001c0,0x220400,0x11080119,0x7c001c0,0x250400,0x11080200,0x4000400,
+0x200002,0x11080200,0x24000000,0x200000,0x11080200,0x24000000,0x1500000,0x11080200,0x24000000,0x1600000,0x11080200,0x24000020,0x200000,0x110a1e12,0x7c00100,0x2130480,
+0x110a1e12,0x7c80100,0x2130480,0x110a3000,0x24000000,0x34e00000,0x110a3000,0x24100000,0x810001,0x110a3000,0x24100000,0x1410001,0x110a3700,0x24000000,0x34200000,0x110a3d00,
+0x4000000,0xe00000,0x110a3d00,0x4000000,0xe00002,0x110a3d00,0x24000000,0xe00000,0x110a3d11,0x7c00300,0xe30000,0x110a3d11,0x7c00900,0x1230400,0x110a3d12,0x2802400,
+0x962460,0x110a3e14,0x7c00100,0xe30000,0x110a3e14,0x7c00100,0xe30001,0x110a3e14,0x7c00100,0x2530000,0x110a3e14,0x7c00900,0x1230000,0x110a3e14,0x7c00900,0x1230001,
+0x110a3f16,0x7c00100,0xe30c00,0x110a3f16,0x7c00100,0xe30c01,0x110a3f16,0x7c00100,0x2530c00,0x110a3f16,0x7c00900,0x1230c00,0x110a3f16,0x7c00900,0x1230c01,0x110a4005,
+0x7c00100,0xe30400,0x110a4112,0x7c00100,0xe30402,0x110a4112,0x7c80100,0xe30402,0x110a4400,0x4000000,0xe00000,0x110a4412,0x4000000,0xe00002,0x110a4412,0x4000000,
+0xe00003,0x110a4416,0x4000000,0xe00c03,0x110a4500,0x4000000,0xe0000d,0x110a4516,0x4000000,0xe00c0d,0x110a4711,0x7c40300,0xe30000,0x110a4f11,0x7c00300,0xe30001,
+0x110a4f11,0x7c40300,0xe30000,0x110a5300,0x4000000,0x810010,0x110a5300,0x4000000,0xe00002,0x110a5300,0x4000000,0xe00010,0x110a5300,0x4000000,0x1410010,0x110a5300,
+0x4000002,0xe70010,0x110a5300,0x4000008,0x810010,0x110a5300,0x4000008,0x1410010,0x110a5300,0x6800000,0xe01c02,0x110a5300,0x6800000,0xe01c10,0x110a5400,0x4000000,
+0x81000c,0x110a5400,0x4000000,0xe0000c,0x110a5400,0x4000000,0x141000c,0x110a5400,0x4000000,0x150000c,0x110a5400,0x4000000,0x160000c,0x110a5400,0x4000002,0xe7000c,
+0x110a5400,0x4000010,0x87140c,0x110a5400,0x4000010,0xe7000c,0x110a5400,0x4000010,0x120140c,0x110a5400,0x4000010,0x127100c,0x110a5400,0x4000020,0xe0000c,0x110a5400,
+0x4000026,0xe7000c,0x110a5400,0xc000010,0x80ac0c,0x110a5400,0xc000010,0xb4800c,0x11400a0c,0xc000010,0x1049400,0x11400c0e,0x4000010,0xb00000,0x11400c0e,0x4000010,
+0x1071400,0x11400c0e,0xc000010,0xb48000,0x11400c17,0x7c00900,0x230400,0x11400f42,0xc000010,0x448000,0x11400f56,0xc000010,0x448000,0x11401d8b,0x4000000,0x200000,
+0x11403dbf,0x4000000,0xe00000,0x114457b4,0x4000004,0x120000a,0x114457b4,0x4000008,0x81000a,0x114457b4,0x4000008,0x141000a,0x114457b4,0x4000010,0x87000a,0x114457b4,
+0xc000010,0x84800a,0x114457bd,0x3802500,0x126246a,0x114457bd,0x7c00d00,0x2530c0a,0x114a3db4,0x24000000,0x810000,0x114a3db4,0x24000000,0x1410000,0x114a3db4,0x24000008,
+0x810000,0x114a3db4,0x24000008,0x1410000,0x114a3db4,0x24000010,0x870000,0x114a3db4,0x2c000010,0x848000,0x114a3dba,0x4000000,0xe00000,0x114a3dba,0x24000000,0xe00000,
+0x114a3dba,0x24000002,0x1200000,0x114a3dba,0x24000002,0x14e00000,0x114a3dba,0x24000008,0x810000,0x114a3dba,0x24000008,0x1410000,0x114a3dbd,0x7c00900,0x930c00,0x114a3dbd,
+0x7c00900,0xe30c00,0x114a3dbf,0x7c00300,0xe30000,0x114a3ebd,0x7000400,0x1200c02,0x114a3fb4,0x4000004,0x1200000,0x114a3fbd,0x7c00d00,0x2530c00,0x114a42bf,0x4000000,
+0xe00000,0x114a42bf,0x4000000,0xe0000f,0x114a44bf,0x4000000,0xe00002,0x114a44bf,0x4000000,0xe00003,0x114a44bf,0x4000000,0x14e00003,0x114a45bf,0x4000000,0xe00002,
+0x114a45bf,0x4000000,0xe0000d,0x1180090a,0x2802400,0x962460,0x11800c1f,0x2802100,0x962460,0x11800c1f,0x2802500,0x962460,0x11800f29,0x2802400,0x962460,0x11800f36,
+0x2802400,0x962460,0x11820700,0x2802400,0x962460,0x11820700,0x2802500,0x962460,0x118a3dc0,0x2802400,0x962460,0x118a3ebd,0x2802400,0x962460,0x11c00904,0x2802400,
+0x962460,0x11c00908,0x2802400,0x962460,0x11c00c23,0x6800000,0x1329800,0x11c00c27,0xc000010,0xb48000,0x11c00f6f,0x6800000,0x1329800,0x11c01074,0x6800000,0x1329800,
+0x11c01178,0x6800000,0x1329800,0x11c0127c,0x6800000,0x1329800,0x11c01480,0x4000000,0x200000,0x11c01480,0x6800000,0x1329800,0x11c01684,0x6800000,0x1329800,0x11c05123,
+0x7c00100,0x230408,0x20000067,0x1000,0,0x20000b13,0x2802400,0x962460,0x20000b13,0x2802500,0x962460,0x20001b27,0x2802100,0x962460,0x20001b27,0x2802100,
+0x962461,0x20001b27,0x2802400,0x962460,0x20001b27,0x2806400,0x962460,0x20001b27,0x2902100,0x962462,0x20001b27,0x4000000,0x200000,0x20001b27,0x4000000,0x400000,
+0x20001b27,0x4000000,0x500000,0x20001b27,0x4000000,0x810000,0x20001b27,0x4000000,0xb00000,0x20001b27,0x4000000,0xc0000b,0x20001b27,0x4000000,0x1410000,0x20001b27,
+0x4000010,0xb00000,0x20001b27,0x4000010,0xc00000,0x20001b27,0x6800000,0x1329800,0x20001b27,0x6800100,0x462540,0x20001b27,0x6800400,0x962540,0x20001b27,0x7c00100,
+0x230400,0x20001b27,0x7c00100,0x230401,0x20002619,0x7c00100,0x220401,0x20002a00,0x4000000,0x1600000,0x20004b67,0,0x1900000,0x20004c67,0,0x1900000,
+0x20004d67,0,0x1900000,0x20006d67,0x1000,0,0x20006e67,0x1000,0,0x20026d67,0,0,0x20026e67,0,0,0x200a4a12,
+0x7c00100,0x1f304c1,0x200a4a12,0x7c00100,0x20304e1,0x21005600,0x4000000,0x700000,0x21022a00,0x4000000,0x1600000,0x30000419,0x7c00100,0x220400,0x30000419,0x7c00100,
+0x220401,0x30000419,0x7c00100,0x250400,0x30000419,0x7c00100,0x250401,0x30000519,0x7c00100,0x220400,0x30000600,0x4000400,0x200400,0x30000600,0x7c00500,0x230400,
+0x30000605,0x4000400,0x200000,0x3000080e,0x7c00100,0x220400,0x30000908,0x2000,0x962460,0x30000908,0x7c00100,0x220400,0x30000908,0x7c00100,0x220401,0x30000908,
+0x7c00100,0x250400,0x30000908,0x7c00100,0x250401,0x30000a03,0x4000006,0x400000,0x30000c02,0x4000000,0x200000,0x30000c02,0x7c00100,0x230400,0x30000d22,0x2802100,
+0x962460,0x30000d22,0x2802400,0x962460,0x30000d22,0x2802500,0x962460,0x30000d22,0x4000000,0x200000,0x30000d22,0x4000010,0x200000,0x30000d22,0x7c00100,0x230400,
+0x30000d22,0xc000010,0x248000,0x30000d22,0x80000000,0x218960,0x30000e25,0x2802500,0x962460,0x30000e25,0x7c00100,0x230400,0x30001821,0x2802100,0x962460,0x30001821,
+0x2806400,0x962460,0x30001821,0x4000000,0x200000,0x30001821,0x6800100,0x962540,0x30001821,0x6800100,0x962541,0x30001821,0x7c00100,0x230400,0x30001b27,0x2802100,
+0x962460,0x30001b27,0x2802400,0x962460,0x30001b27,0x4000000,0x200000,0x30001b27,0x4000000,0x400000,0x30001b27,0x7c00100,0x230400,0x30001c1c,0x2802100,0x1862460,
+0x30001c1c,0x2802400,0x1862460,0x30001c1c,0x2806400,0x1862460,0x30001c1c,0x4000000,0x200000,0x30001c1c,0x6800100,0x1862400,0x30001c1c,0x6800100,0x1862540,0x30001c1c,
+0x7c00100,0x1830000,0x30001c1c,0x7c00100,0x1830001,0x30001c1c,0xc000010,0x448000,0x30001f0b,0x4000000,0x200000,0x30001f0b,0x4000010,0x200000,0x30001f0b,0x4000010,
+0x400000,0x30001f0b,0x6800000,0x200000,0x30001f0b,0x7c00100,0x230400,0x30001f0b,0xc000010,0x248000,0x30002006,0x7c00100,0x250400,0x30002128,0x4000000,0x200000,
+0x30002128,0x7c00100,0x230400,0x30002128,0xc000010,0x248000,0x3000221d,0x4000000,0x810000,0x3000221d,0x4000000,0x1410000,0x3000221d,0x4000001,0x445800,0x3000221d,
+0x7c00100,0x230400,0x30002300,0x4000010,0x400000,0x30002320,0x7c00100,0x230400,0x30002417,0x2802100,0x1862460,0x30002417,0x2802400,0x1862460,0x30002417,0x2806400,
+0x1862460,0x30002417,0x2882000,0x1862460,0x30002417,0x4000000,0x200000,0x30002417,0x4000000,0x400000,0x30002417,0x4000000,0x1600000,0x30002417,0x4000010,0x400000,
+0x30002417,0x4000010,0x1200000,0x30002417,0x6800000,0x1329800,0x30002417,0x6800100,0x1862540,0x30002417,0x7c00100,0x1830000,0x30002417,0x7d00100,0x1830000,0x3000251b,
+0x80000,0xc18820,0x3000251b,0x2802100,0x962460,0x3000251b,0x3c02100,0x962460,0x3000251b,0x4000000,0x200000,0x3000251b,0x4000006,0x500000,0x3000251b,0x4000010,
+0x400000,0x3000251b,0x4000010,0xb70000,0x3000251b,0x4000800,0x200000,0x3000251b,0x6800000,0x1329800,0x3000251b,0x7c00100,0x230400,0x3000251b,0x7c00900,0x230400,
+0x3000251b,0xc000010,0xb48000,0x3000251b,0x12882000,0x962460,0x30002800,0x24000000,0x200000,0x30002800,0x2c000010,0x1248002,0x30002800,0x2c000010,0x15248002,0x30002a00,
+0x4000000,0x1600000,0x30002b01,0x2000,0x962460,0x30002b01,0x2000,0x8962460,0x30002c00,0x4000000,0x200000,0x30002c00,0x7c00100,0x14220405,0x30002d19,0x7c00100,
+0x250400,0x30002e00,0x24000000,0x200000,0x30003000,0x24000000,0x200000,0x30003000,0x24000000,0x4200000,0x30003100,0x24000000,0x200000,0x30003600,0x24000000,0x200000,
+0x30003700,0x24000000,0x4200000,0x3000392e,0x24000000,0x200000,0x30005013,0x7c00100,0x2633801,0x30005600,0,0x918820,0x30020600,0x4000400,0x500400,0x30020701,
+0x2802400,0x962460,0x30020701,0x2802400,0xc62460,0x300a3a11,0x4020000,0xe00000,0x300a3a11,0x4020000,0xe00002,0x300a3b11,0x4020000,0xe00002,0x300a3c00,0x4008000,
+0xe00000,0x300a3c00,0x4010000,0xe00000,0x300a3d11,0x7c00300,0xe30002,0x300a4305,0x7c00100,0xe30400,0x300a4611,0x7c40300,0xe30000,0x300a4829,0x7c00100,0xe30400,
+0x300a4829,0x7c00900,0x1230400,0x300a4929,0x4000000,0xe00000,0x30402591,0x4000010,0x400000,0x30402591,0x4000010,0xb70000,0x30402591,0xc000010,0xb48000,0x304028af,
+0x4000001,0xc41c0b,0x304a3dbf,0x4000000,0xe00000,0x30800c1f,0x2802100,0x962460,0x30c01c89,0x6800000,0x1329800,0x3100080e,0x7c00120,0x220402,0x3100080e,0x7c00120,
+0x250402,0x31005167,0x1000,0,0x3100581e,0x4000000,0x200000,0x3100581e,0x7c00100,0x230400,0x3100590d,0x7c00100,0x230400,0x31005a09,0x7c00100,0x220400,
+0x31005a09,0x7c00100,0x250400,0x31005b00,0x4000000,0x200000,0x31005c00,0x80000,0x918820,0x31005c00,0x2802000,0x962460,0x31005c00,0x2802400,0x962460,0x31005c00,
+0x4000000,0x200000,0x31005c00,0x4000000,0x200001,0x31005c00,0x6800000,0x962540,0x31005c00,0x6800400,0x962540,0x31005c01,0x2802400,0x962460,0x31005d00,0x4000020,
+0x200005,0x31005d00,0x6800020,0x1329805,0x31005d00,0x7c00120,0x220405,0x31005d00,0x7c00120,0x250405,0x31006000,0x82000,0x8962460,0x31006000,0x180000,0x918820,
+0x310a5e11,0x7c40300,0xe30000,0x310a5f11,0x7c00300,0xe30001,0x32000419,0x7c00100,0x250400,0x3200080e,0x4000020,0x200000,0x3200080e,0x7c00100,0x220400,0x3200080e,
+0x7c00100,0x250400,0x32000908,0x7c00100,0x220400,0x32000908,0x7c00100,0x250400,0x32000c02,0x7c00100,0x230400,0x32000e25,0x7c00100,0x230400,0x32001d0c,0x7c00100,
+0x230400,0x32002800,0x80000,0x1e18820,0x32002800,0x80020,0x218820,0x32002800,0x4000001,0x445802,0x32002800,0x24000000,0x200000,0x32002800,0x24000000,0x200002,
+0x32002800,0x24000020,0x200000,0x32002800,0x2c000010,0x1248002,0x32002919,0x7c00100,0x22040f,0x32002a00,0x4000000,0x1600000,0x32002b01,0x2000,0x962460,0x32002b01,
+0x2802000,0x962460,0x32002b01,0x2802020,0x962460,0x32002c00,0x4000000,0x200000,0x32002c00,0x4000020,0x200000,0x32002c00,0x4000020,0x200005,0x32002c00,0x7c00120,
+0x220405,0x32002c00,0x7c00120,0x250405,0x32002e00,0x24000020,0x200000,0x32002f00,0x24000020,0x200000,0x32003000,0x24000000,0x200000,0x32003000,0x24000020,0x200000,
+0x32003500,0x24000000,0x200000,0x32003600,0x24000020,0x200000,0x32003600,0x24000020,0x14200000,0x32003700,0x24000000,0x200000,0x32003700,0x24000000,0x4100000,0x32003700,
+0x24000000,0x4200000,0x32003700,0x24000000,0x14200000,0x32003800,0x24000000,0x810000,0x32003800,0x24000000,0x1410000,0x32005102,0x4000000,0x1500008,0x32005502,0x7c00100,
+0x230400,0x32006108,0x7c00100,0x220400,0x32006108,0x7c00100,0x250400,0x3200622a,0x2802100,0x962460,0x3200622a,0x2806000,0x962460,0x3200622a,0x7c00100,0x230400,
+0x3200632b,0x2802100,0x962460,0x3200632b,0x2806000,0x962460,0x3200632b,0x7c00100,0x230400,0x3200642c,0x2802100,0x962460,0x3200642c,0x7c00100,0x230400,0x3200652d,
+0x2802100,0x962460,0x3200652d,0x7c00100,0x230400,0x32006600,0x24000020,0x200000,0x32006700,0x24000020,0x200000,0x32006800,0x24000020,0x200000,0x32006800,0x24000020,
+0x14200000,0x32006900,0x24000020,0x200000,0x32006900,0x24000020,0x810000,0x32006900,0x24000020,0x1410000,0x32006a00,0x24000020,0x200000,0x32006a00,0x24000020,0x200001,
+0x32006a00,0x24000020,0x200002,0x32020701,0x2882000,0xc62460,0x32023300,0x4000000,0x100000,0x32026c01,0x12882000,0x962460,0x32026c01,0x12882000,0x8962460,0x32065700,
+0x4000000,0x810011,0x32065700,0x4000000,0x1410011,0x32086600,0x24000020,0x810000,0x32086600,0x24000020,0x1410000,0x32086900,0x24000020,0x810000,0x32086900,0x24000020,
+0x1410000,0x320a3600,0x24000020,0x34200000,0x320a3d11,0x7c00100,0x1230400,0x320a3e14,0x7c00100,0xe30010,0x320a3e14,0x7c00100,0x2530000,0x320a3f16,0x7c00100,0xe30c10,
+0x320a4400,0x4000000,0xe00003,0x320a4929,0x4000000,0xe00000,0x320a4f11,0x7c00300,0xe30001,0x320a6b16,0x7c00100,0x2530c00,0x3240638d,0xc000010,0x448000,0x324a3dc2,
+0x4000000,0x14e00000,0x324a3dc2,0x7c00100,0x1230400,0x324a3fbd,0x4000002,0x1200c00,0x324a53ba,0x24000000,0xe00000,0x32820701,0x2802000,0x962460,0x40000419,0x7c00100,
+0x220400,0x40000519,0x7c00100,0x220400,0x40000600,0x4000400,0x200400,0x4000080e,0x7c00100,0x220400,0x4000080e,0x7c00100,0x250400,0x4000080e,0x7c00100,0x250402,
+0x40000c02,0x2802100,0x962460,0x40000c02,0x2802400,0x962460,0x40000c02,0x2802500,0x962460,0x40000c02,0x4000000,0x200000,0x40000c02,0x4000000,0x1071400,0x40000c02,
+0x7c00100,0x230400,0x40000c02,0x80000000,0x218960,0x40000d22,0x7c00100,0x230400,0x40000f0a,0x7c00100,0x230400,0x40001004,0x7c00100,0x230400,0x40001110,0x2802100,
+0x962460,0x40001110,0x6800100,0x962540,0x4000120f,0x2802100,0x962460,0x4000120f,0x4000000,0x1600000,0x4000120f,0x7c00100,0x230400,0x4000131f,0x7c00100,0x230400,
+0x40001423,0x4000000,0x200000,0x40001423,0x4000000,0x1600000,0x40001615,0x2802400,0x962460,0x40001615,0x7c00100,0x230400,0x40002417,0x2802400,0x1862460,0x40002417,
+0x4000000,0x200000,0x40002800,0x6800000,0x201c00,0x40002800,0x24000002,0x200000,0x40002c00,0x4000000,0x200002,0x40003000,0x24000000,0x14200000,0x40003000,0x24000020,
+0x200000,0x40003700,0x24000000,0x200000,0x40003700,0x24000000,0x4200000,0x40003700,0x24000000,0x14200000,0x40005a09,0x7c00100,0x220400,0x40005a09,0x7c00100,0x250400,
+0x40005d00,0x7c00120,0x220405,0x40006f30,0x2802100,0x962460,0x40006f30,0x2802400,0x962460,0x40006f30,0x4000000,0x200000,0x40006f30,0x6800000,0x1329800,0x40006f30,
+0x6800100,0x962540,0x40006f30,0x7c00100,0x230400,0x40006f30,0xc000010,0xb48000,0x40007034,0x7c00100,0x1830000,0x40007117,0x4000000,0x200000,0x40007208,0x7c00100,
+0x220400,0x4000720e,0x7c00100,0x220400,0x4000720e,0x7c00500,0x22040e,0x4000720e,0x7c00500,0x22040f,0x40007219,0x7c00100,0x220400,0x40007219,0x7c00500,0x220400,
+0x40007219,0x7c00500,0x22040e,0x40007219,0x7c00500,0x22040f,0x40007300,0x24000000,0x200000,0x40007300,0x24000000,0x14200000,0x40007400,0x4000000,0x200000,0x40007531,
+0x7c00100,0x230400,0x40007631,0x7c00100,0x230400,0x40007835,0x4000010,0x400000,0x40007835,0x7c00100,0x230400,0x40007933,0x7c00100,0x230400,0x40007a32,0x6800000,
+0x1329800,0x40007a32,0x7c00100,0x230400,0x40007b2f,0x7c00100,0x230400,0x40007c00,0x4000000,0x200000,0x40020701,0x2802400,0x962460,0x40020701,0x2802400,0xc62460,
+0x40023300,0x4000000,0x200000,0x40027d01,0x12882000,0x962460,0x400a3700,0x24000000,0x34200000,0x400a3700,0x24000000,0x34e00000,0x400a4400,0x4000000,0xe0000d,0x400a4412,
+0x4000000,0xe00002,0x400a4412,0x4000000,0xe00003,0x400a4500,0x4000000,0xe0000d,0x400a5300,0x4000000,0x810010,0x400a5300,0x4000000,0x1410010,0x404077f6,0x4000000,
+0x200000,0x404077f9,0x4000000,0x200000,0x404077f9,0x4000000,0x400000,0x40c01480,0x4000000,0x200000,0x40c05123,0x4000000,0x200000,0x41000419,0x7c00100,0x220400,
+0x41000419,0x7c00100,0x250400,0x4100080e,0x7c00100,0x220400,0x4100080e,0x7c00100,0x250400,0x41000908,0x7c00100,0x220400,0x41000908,0x7c00100,0x250400,0x41000b13,
+0x2802000,0x962460,0x41000b13,0x2802100,0x962460,0x41000b13,0x4000000,0xb00000,0x41000c02,0x2802100,0x962460,0x41000c02,0x4000000,0x1500000,0x41000c02,0xc000010,
+0xb48000,0x41000f0a,0x7c00100,0x230400,0x41001004,0x7c00100,0x230400,0x41001423,0x7c00100,0x230400,0x41001b27,0x4000000,0x500000,0x41001d0c,0x7c00100,0x230400,
+0x41001d0c,0x7c00100,0x23040f,0x41001f0b,0x2802400,0x962460,0x41001f0b,0x4000000,0x200000,0x41001f0b,0x7c00100,0x230400,0x41002800,0x24000000,0x200000,0x41002800,
+0x24000000,0x400000,0x41002919,0x7c00100,0x22040e,0x41002a00,0x4000000,0x1600000,0x41002b01,0x2802020,0x962460,0x41002c00,0x4000000,0x200000,0x41002c00,0x7c00120,
+0x220405,0x41003000,0x24000000,0x200000,0x41003700,0x24000000,0x4200000,0x41003700,0x24000000,0x14200000,0x41003700,0x24000000,0x14e00000,0x41005d00,0x7c00120,0x220405,
+0x41006600,0x24000020,0x200000,0x41006600,0x24000020,0x810000,0x41006600,0x24000020,0x1410000,0x41007208,0x7c00100,0x22040f,0x41007219,0x7c00100,0x220400,0x41007300,
+0x24000000,0x200000,0x41007e0e,0x2802000,0x962460,0x41007e0e,0x4000000,0x200000,0x41007f0e,0x4000000,0x200000,0x41007f0e,0x7c00100,0x230400,0x41008002,0x7c00100,
+0x230400,0x41008137,0x2802100,0x962460,0x41008137,0x4000000,0x200000,0x41008137,0x6800100,0x962540,0x41008137,0x7c00100,0x230400,0x41008301,0x2802000,0x962460,
+0x41008407,0x4000000,0x200000,0x41008407,0x4000000,0x400000,0x41008407,0x4000000,0xb00000,0x41008407,0x7c00100,0x220400,0x41008407,0x7c00100,0x250400,0x4100850b,
+0x7c00100,0x230400,0x4100860b,0x4000000,0x200000,0x4100860b,0x7c00100,0x230400,0x4100870c,0x7c00100,0x220400,0x41008838,0x7c00100,0x220400,0x41008838,0x7c00100,
+0x250400,0x41008939,0x2802000,0x962460,0x41008939,0x2802100,0x962460,0x41008939,0x2806000,0x962460,0x41008939,0x4000000,0x200000,0x41008939,0x4000000,0x400000,
+0x41008939,0x7c00100,0x230400,0x41008939,0xc000010,0x448000,0x41008a00,0x4000400,0x200000,0x41008b3b,0x4000000,0x1800000,0x41008b3b,0x6800000,0x1329800,0x41008b3b,
+0x7c00100,0x1830000,0x41008b3b,0x7e00100,0x1830000,0x41008c3d,0x4000010,0x400000,0x41008c3d,0x7c00100,0x230400,0x41008d0e,0x7c00100,0x22040f,0x41008d19,0x7c00100,
+0x220400,0x41008d19,0x7c00100,0x22040f,0x41008e00,0x24000000,0x200000,0x41008e00,0x24000000,0x400000,0x41008e00,0x24000000,0x1710000,0x41008e00,0x24000006,0x400000,
+0x41008f3a,0x2802100,0x962460,0x41008f3a,0x2806000,0x962460,0x41008f3a,0x4000000,0x200000,0x41008f3a,0x6800100,0x962540,0x41008f3a,0x7c00100,0x230400,0x4100903c,
+0x7c00100,0x230400,0x4100903c,0x7c00100,0x23040f,0x41020701,0x2802000,0x962460,0x41020701,0x2802000,0xc62460,0x410a3700,0x24000000,0x34200000,0x410a3700,0x24000000,
+0x34e00000,0x410a4412,0x4000000,0xe00003,0x410a4711,0x7c40300,0xe30000,0x410a4f11,0x7c00300,0xe30001,0x410a9100,0x4000000,0x800010,0x410a9100,0x4000000,0x810010,
+0x410a9100,0x4000000,0x870010,0x410a9100,0x4000000,0xb00010,0x410a9100,0x4000000,0xf00010,0x410a9100,0x4000000,0x1001410,0x410a9100,0x4000000,0x1071010,0x410a9100,
+0x4000000,0x1071410,0x410a9100,0x4000000,0x1410010,0x414a82bf,0x4000000,0xe00000,0x41808300,0x2802000,0x962460,0x41c01480,0x6800000,0x1329800,0x50000419,0x7c00100,
+0x220400,0x50000419,0x7c00100,0x250400,0x5000080e,0x7c00100,0x220400,0x50000908,0x7c00100,0x220400,0x50000908,0x7c00100,0x250400,0x50000b13,0x2802500,0x962460,
+0x50000f0a,0x7c00100,0x230400,0x50001615,0x2802100,0x962460,0x50001615,0x7c00100,0x230400,0x50002b01,0x2802020,0x962460,0x50002c00,0x4000000,0x200000,0x50002c19,
+0x7c00100,0x220400,0x50002d19,0x7c00100,0x220400,0x50003000,0x24000000,0x200000,0x50003000,0x24000020,0x200000,0x50003700,0x24000000,0x4200000,0x50005d00,0x7c00120,
+0x220405,0x50005d00,0x7c00120,0x250405,0x50006108,0x7c00100,0x220400,0x50006108,0x7c00100,0x250400,0x50006600,0x24000020,0x200000,0x50007300,0x24000000,0x200000,
+0x50008301,0x2802400,0x962460,0x50008a00,0x7c00500,0x230400,0x50009257,0x2802400,0x962460,0x50009257,0x4000000,0x200000,0x50009257,0x4000010,0x1071400,0x50009257,
+0x6800000,0x1329800,0x50009257,0x7c00100,0x230400,0x50009257,0x7c00500,0x230400,0x50009257,0x7c00900,0x230400,0x50009257,0xc000010,0xb48000,0x5000933e,0x2802100,
+0x962460,0x5000933e,0x2802400,0x962460,0x5000933e,0x4000000,0x200000,0x5000933e,0x4000000,0x400000,0x5000933e,0x4000010,0x400000,0x5000933e,0x6800000,0x1329800,
+0x5000933e,0x6800100,0x962540,0x5000933e,0x6800100,0x962541,0x5000933e,0x6804400,0x962540,0x5000933e,0x7c00100,0x230400,0x5000933e,0x7c00100,0x230401,0x5000933e,
+0xc000010,0x448000,0x50009419,0x7c00100,0x220400,0x50009419,0x7c00100,0x250400,0x50009500,0x4000400,0x200400,0x5000965a,0x4000000,0x500000,0x5000965a,0x7c00100,
+0x230400,0x5000965a,0xc000010,0xb48000,0x5000975b,0x4000000,0x200000,0x5000975b,0x4000010,0x400000,0x5000975b,0x7c00100,0x230400,0x50009865,0x7c00100,0x230400,
+0x50009965,0x4000010,0x400000,0x50009965,0x7c00100,0x230400,0x50409abf,0x4000000,0x200000,0x5100080e,0x7c00100,0x220400,0x5100080e,0x7c00100,0x250400,0x51000c02,
+0x2802100,0x962460,0x51000c02,0x4000000,0x1500000,0x51000c02,0x4000020,0x200000,0x51000c02,0x7c00100,0x230400,0x51000f0a,0x7c00100,0x230400,0x51000f0a,0x7c00500,
+0x230400,0x51001110,0x2802100,0x962460,0x5100131f,0x2802100,0x962460,0x51001423,0x7c00100,0x230400,0x51001524,0x2802100,0x962460,0x51001524,0x4000000,0x200000,
+0x51001524,0x7c00100,0x230400,0x5100171a,0x2802100,0x962460,0x5100171a,0x4000000,0x200000,0x5100171a,0x4000000,0x1500000,0x5100171a,0x7c00100,0x230400,0x51001b27,
+0x4000000,0x200000,0x51001b27,0x4000000,0x400000,0x51001b27,0x4000000,0x500000,0x51001b27,0x7c00100,0x230400,0x51001c1c,0x2802100,0x1862460,0x51001c1c,0x2802500,
+0x1862460,0x51001c1c,0x2806400,0x1862460,0x51001c1c,0x4000000,0x1800000,0x51001c1c,0x6800000,0x1329800,0x51001c1c,0x6800100,0x1862400,0x51001c1c,0x6800100,0x1862540,
+0x51001c1c,0x6800500,0x1862400,0x51001c1c,0x7c00100,0x1830000,0x5100251b,0x7c00100,0x230400,0x51002619,0x7c00100,0x220400,0x51002619,0x7c00100,0x250400,0x51002800,
+0x80020,0x218820,0x51002c00,0x4000000,0x200000,0x51002d19,0x7c00100,0x230400,0x51003700,0x24000000,0x4200000,0x51003700,0x24000000,0x4e00000,0x51005201,0x2802400,
+0x962460,0x51005c00,0x4000000,0x200000,0x51006108,0x7c00100,0x220400,0x51006108,0x7c00100,0x250400,0x51006600,0x24000020,0x200000,0x51006600,0x24000020,0x810000,
+0x51006600,0x24000020,0x1410000,0x51007300,0x24000000,0x200000,0x51007300,0x24000020,0x200000,0x51008002,0x7c00100,0x230400,0x51008301,0x2802000,0x962460,0x51008301,
+0x2802400,0x962460,0x51008a00,0x7c00500,0x230400,0x51008e00,0x24000000,0x200000,0x51008e00,0x24000000,0x400000,0x51008e00,0x24000000,0x810000,0x51008e00,0x24000000,
+0x1400000,0x51008e00,0x24000000,0x1410000,0x51008e00,0x24000000,0x1710000,0x51008e00,0x24000002,0x200000,0x51008e00,0x24000500,0x230400,0x51008e00,0x2c000010,0xb48000,
+0x51009419,0x7c00100,0x220400,0x51009419,0x7c00100,0x22040e,0x51009419,0x7c00100,0x22040f,0x51009419,0x7c00100,0x250400,0x51009500,0x4000400,0x200400,0x51009500,
+0x7c00500,0x230400,0x51009519,0x7c00100,0x220400,0x51009519,0x7c00100,0x22040f,0x51009519,0x7c00100,0x230400,0x51009519,0x7c00100,0x250400,0x51009b71,0x2802100,
+0x962460,0x51009b71,0x6800000,0x1329800,0x51009b71,0x6800100,0x962540,0x51009b71,0x6804400,0x962540,0x51009b71,0x7c00100,0x230400,0x51009c52,0x2802100,0x962460,
+0x51009c52,0x2802400,0x962460,0x51009c52,0x2802d00,0x962460,0x51009c52,0x4000010,0x400000,0x51009c52,0x6800000,0x1329800,0x51009c52,0x6800100,0x962540,0x51009c52,
+0x7c00100,0x230400,0x51009c52,0xc000010,0x448000,0x51009d6d,0x6800000,0x1329800,0x51009d6d,0x7c00100,0x230400,0x51009d6d,0x7c00500,0x230400,0x51009d6d,0x7c00d00,
+0x230400,0x51009d6d,0xc000010,0x448000,0x51009e08,0x2802100,0x962460,0x51009f63,0x4000010,0x400000,0x51009f63,0x6800000,0x1329800,0x51009f63,0x7c00100,0x230400,
+0x51009f63,0x7c00900,0x230400,0x51009f63,0xc000010,0x448000,0x51009f63,0xc000010,0xb48000,0x5100a008,0x2000,0x962460,0x5100a008,0x2802400,0x962460,0x5100a008,
+0x4000000,0x200000,0x5100a008,0x7c00100,0x220400,0x5100a008,0x7c00100,0x230400,0x5100a008,0x7c00100,0x250400,0x5100a008,0x7c00500,0x230400,0x5100a16f,0x2806400,
+0x962460,0x5100a16f,0x6800000,0x1329800,0x5100a16f,0x6800100,0x962540,0x5100a16f,0x7c00100,0x230400,0x5100a16f,0xc000010,0x448000,0x5100a24f,0x2802100,0x962460,
+0x5100a24f,0x2802400,0x962460,0x5100a24f,0x6800000,0x1329800,0x5100a24f,0x7c00100,0x230400,0x5100a24f,0xc000010,0x448000,0x5100a36e,0x2802100,0x962460,0x5100a36e,
+0x4000000,0x200000,0x5100a36e,0x6800100,0x962540,0x5100a36e,0x6804400,0x962540,0x5100a36e,0x7c00100,0x230400,0x5100a442,0x2802100,0x962460,0x5100a442,0x4000000,
+0x200000,0x5100a442,0x6800000,0x1329800,0x5100a442,0x6800100,0x962540,0x5100a442,0x7c00100,0x230400,0x5100a442,0xc000010,0x448000,0x5100a500,0x4000000,0x200000,
+0x5100a600,0x4000000,0x200000,0x5100a601,0x2802000,0x962460,0x5100a76b,0x7c00100,0x230400,0x5100a868,0x7c00100,0x230400,0x5100a96c,0x4000000,0x200000,0x5100a96c,
+0x7c00100,0x230400,0x5100aa00,0x4000000,0x4e00000,0x5100ab00,0x4000000,0x4e00000,0x51086600,0x24000020,0x810000,0x51086600,0x24000020,0x1410000,0x510a4005,0x7c00100,
+0xe30400,0x510a4711,0x7c40300,0xe30000,0x510a7300,0x24000000,0x34200000,0x510aaa00,0x4000000,0x34e00000,0x5140a2f1,0x4000400,0x400000,0x514a82bf,0x4000000,0xe00000,
+0x51802bb1,0x2802000,0x962460,0x51c00908,0x2802400,0x962460,0x51c0a008,0x2802400,0x962460,0x52000f0a,0x2802100,0x962460,0x52000f0a,0x6800100,0x962540,0x52000f0a,
+0x7c00100,0x230400,0x52001004,0x4000000,0x1600000,0x52001b00,0x4000000,0x200000,0x52001c1c,0x2802100,0x1862460,0x52001c1c,0x6800100,0x1862400,0x52001c1c,0x6800500,
+0x1862400,0x52001e12,0x7c00100,0x2230500,0x52001e12,0x7c00100,0x2330520,0x52002128,0x4000002,0x400000,0x52002128,0x7c00100,0x230400,0x52002a00,0x4000000,0x1500000,
+0x52002a00,0x4000000,0x1600000,0x52002d00,0x4000000,0x200006,0x52003000,0x24000000,0x200000,0x52006108,0x7c00100,0x220400,0x52006108,0x7c00100,0x250400,0x52008301,
+0x2802400,0x962460,0x52008407,0x2802400,0x962460,0x52008407,0x7c00100,0x220400,0x52008407,0x7c00100,0x250400,0x52008b3b,0x6800000,0x1800000,0x52008b3b,0x7c00100,
+0x1830000,0x52008e00,0x24000000,0x400000,0x52009419,0x7c00100,0x250400,0x5200975b,0x4000000,0x200000,0x5200ac7e,0x2802000,0x962460,0x5200ac7e,0x2802100,0x962460,
+0x5200ac7e,0x2802400,0x962460,0x5200ac7e,0x4000010,0x200000,0x5200ac7e,0x7c00100,0x230400,0x5200ac7e,0xc000010,0x248000,0x5200ad28,0x7c00100,0x230400,0x5200ae6a,
+0x2802100,0x1862460,0x5200ae6a,0x2802400,0x962460,0x5200ae6a,0x2802400,0x1862460,0x5200ae6a,0x2806000,0x1862460,0x5200ae6a,0x4000000,0x1800000,0x5200ae6a,0x6800000,
+0x1329800,0x5200ae6a,0x6800100,0x1862400,0x5200ae6a,0x6800100,0x1862540,0x5200ae6a,0x7c00100,0x1830000,0x5200ae6a,0x7c00900,0x1830000,0x5200ae6a,0xc000010,0x1848000,
+0x5200b083,0x4000010,0x400000,0x5200b083,0x7c00100,0x230400,0x5200b083,0xc000010,0x448000,0x5200b182,0x2802400,0x962460,0x5200b182,0x4000000,0x200000,0x5200b182,
+0x4000010,0x400000,0x5200b182,0x7c00100,0x230400,0x5200b182,0xc000010,0x448000,0x5200b30a,0x2802400,0x962460,0x5200b30a,0x4000000,0x200000,0x5200b30a,0x7c00100,
+0x230400,0x5200b54e,0x2802100,0x962460,0x5200b54e,0x2802400,0x962460,0x5200b54e,0x4000000,0x200000,0x5200b54e,0x4000010,0x400000,0x5200b54e,0x6800000,0x1329800,
+0x5200b54e,0x6800100,0x962540,0x5200b54e,0x6804400,0x962540,0x5200b54e,0x7c00100,0x230400,0x5200b54e,0xc000010,0x448000,0x5200b61c,0x4000000,0x1800000,0x5200b61c,
+0x6800500,0x1862400,0x5200b61c,0x7c00100,0x1830000,0x5200b61c,0x7c00900,0x1830000,0x5200b77f,0x2802100,0x1862460,0x5200b77f,0x2802400,0x1862460,0x5200b77f,0x4000000,
+0x1800000,0x5200b77f,0x4000010,0x1800000,0x5200b77f,0x7c00100,0x1830000,0x5200b77f,0x7c00500,0x1830000,0x5200b77f,0x7c00900,0x1830000,0x5200b77f,0x7e00100,0x1830000,
+0x5200b873,0x2802100,0x962460,0x5200b873,0x2806400,0x962460,0x5200b873,0x6800000,0x1329800,0x5200b873,0x6800100,0x962540,0x5200b873,0x6800400,0x962540,0x5200b873,
+0x7c00100,0x230400,0x5200b873,0xc000010,0x448000,0x5200b912,0x7c00100,0x2230500,0x5200b912,0x7c00100,0x2330520,0x5200ba74,0x4000000,0x200000,0x5200ba74,0x4000010,
+0x400000,0x5200ba74,0x7c00100,0x230400,0x5200bb85,0x4000000,0x200000,0x5200bb85,0x7c00100,0x230400,0x5200bc75,0x4000000,0x400000,0x5200bc75,0x4000010,0x400000,
+0x5200bc75,0x7c00100,0x230400,0x5200bd7d,0x4000000,0x200000,0x5200bd7d,0x7c00100,0x230400,0x5200be7a,0x4000000,0x200000,0x5200be7a,0x7c00100,0x230400,0x5200bf58,
+0x7c00100,0x230400,0x5200c002,0x4000000,0x200000,0x5200c178,0x2802000,0x962460,0x5200c178,0x2802100,0x962460,0x5200c178,0x2802400,0x962460,0x5200c178,0x2806400,
+0x962460,0x5200c178,0x4000000,0x200000,0x5200c178,0x6800100,0x962540,0x5200c178,0x7c00100,0x230400,0x5200c178,0x7c00100,0x230401,0x5200c178,0xc000010,0x448000,
+0x5200c178,0x80000000,0x218960,0x5200c247,0x7c00100,0x230400,0x5200c247,0x7c00100,0x830400,0x5200c247,0x7c00100,0x1430400,0x5200c300,0x4000000,0x200003,0x52022d00,
+0x4000000,0x100006,0x52023700,0x24000000,0x4100000,0x52023700,0x24000000,0x4e00000,0x52023700,0x24000000,0x14100000,0x52023700,0x24000000,0x14e00000,0x52023700,0x24000000,
+0x96800000,0x52024400,0x4000000,0x100000,0x52027300,0x24000000,0x100000,0x5202c300,0x4000000,0x100000,0x5202c300,0x4000000,0x100002,0x5202c300,0x4000000,0x100003,
+0x5202c300,0x4000000,0x10000d,0x5202c300,0x4000100,0x150400,0x5202c300,0x4000100,0x15040d,0x5202c300,0x4000100,0x14150400,0x520a1e12,0x7c00100,0x2130480,0x520a3700,
+0x24000000,0x34e00000,0x520a3800,0x24000000,0x34100000,0x520a4711,0x7c40300,0xe30000,0x520a4f11,0x7c00300,0xe30001,0x520a7300,0x24000000,0x34100000,0x520ab412,0x7c00100,
+0x2130480,0x520ac400,0x4000000,0xe00002,0x520ac400,0x4000000,0xe0000d,0x520ac400,0x4000000,0x34e0000d,0x520ac414,0x4000000,0xe0000d,0x520ac511,0x7c40300,0xe30000,
+0x5240af93,0x7c00100,0x230400,0x5240af98,0x4000400,0x200000,0x5240af9a,0x6800400,0x962540,0x5240af9a,0x7c00100,0x230400,0x5240afa4,0x7c00100,0x230400,0x5240afa6,
+0x7c00100,0x230400,0x5240b2c5,0x4000000,0x200000,0x5240b2c5,0x4000000,0x1500000,0x5240b2d0,0x4000000,0x200000,0x5240b2de,0x4000000,0x200000,0x5240b5f4,0x7c00900,
+0x230400,0x524a44bf,0x4000000,0xe00003,0x5280af93,0x2802400,0x962460,0x5280af94,0x2802400,0x962460,0x5280af9a,0x2802400,0x962460,0x5280af9c,0x2802400,0x962460,
+0x5280af9e,0x2802400,0x962460,0x52c0b3eb,0x2802400,0x962460,0x52c0b3ef,0x7c00100,0x230400,0x60000c02,0x2802100,0x962460,0x60000c02,0x7c00100,0x230400,0x60000f0a,
+0x2802100,0x962460,0x60000f0a,0x6800100,0x962540,0x60000f0a,0x7c00100,0x230400,0x6000131f,0x4000000,0x200000,0x6000171a,0x7c00100,0x230400,0x6000171a,0x7c00100,
+0x230560,0x60001b27,0x2802100,0x962460,0x60001b27,0x4000000,0xc00000,0x60001b27,0x7c00100,0x230400,0x60001f0b,0x2802400,0x962460,0x60002919,0x7c00100,0x22040e,
+0x60002a00,0x4000000,0x1600000,0x60003000,0x24000000,0x14200000,0x60003000,0x24000000,0x14e00000,0x60003700,0x24000000,0x4200000,0x60003800,0x24000000,0x1710000,0x60005102,
+0x4000000,0x200000,0x60006108,0x7c00100,0x220400,0x60006108,0x7c00100,0x250400,0x60006600,0x24000020,0x200000,0x60008301,0x2802000,0x962460,0x6000903c,0x2806000,
+0x962460,0x6000903c,0x4000000,0x400000,0x60009519,0x7c00100,0x220400,0x60009519,0x7c00100,0x250400,0x6000a008,0x7c00100,0x220400,0x6000a008,0x7c00100,0x250400,
+0x6000c300,0x4000000,0x3a703580,0x6000c654,0x2802000,0x962460,0x6000c654,0x4000010,0x200000,0x6000c654,0x7c00100,0x230400,0x6000c73f,0x2802000,0x962460,0x6000c73f,
+0x2802100,0x962460,0x6000c73f,0x4000000,0x200000,0x6000c73f,0x6800100,0x962540,0x6000c73f,0x6804000,0x962540,0x6000c73f,0x7c00100,0x230400,0x6000c80b,0x7c00100,
+0x230400,0x6000c941,0x2802100,0x962460,0x6000c941,0x2806000,0x962460,0x6000c941,0x4000000,0x200000,0x6000c941,0x4000010,0x200000,0x6000c941,0x6800000,0x1329800,
+0x6000c941,0x6800100,0x962540,0x6000c941,0x7c00100,0x230400,0x6000c941,0xc000010,0x448000,0x6000ca82,0x7c00100,0x230400,0x6000cc00,0x4000000,0x4e00000,0x6000d000,
+0x4000000,0x200000,0x6002c300,0x4000000,0x100000,0x6002c300,0x4000000,0x10000d,0x6002c300,0x4000100,0x150400,0x6002c300,0x4000100,0x15040d,0x6002c300,0x4000100,
+0x14150400,0x600a3000,0x24000000,0x34200000,0x600a3000,0x24000000,0x34e00000,0x600a3700,0x24000000,0x34200000,0x600a3800,0x24000000,0x34200000,0x600a3800,0x24000000,0xb6800000,
+0x600a4305,0x7c00100,0xe30400,0x600ac300,0x4000000,0x34100000,0x600ac400,0x4000000,0x14e0000d,0x600ac400,0x4000000,0x34e0000d,0x600acb14,0x7c00100,0xe30000,0x600acb16,
+0x7c00100,0xe30c00,0x600acc00,0x4000000,0x34e00000,0x600acd00,0x4000000,0x34200000,0x600acd00,0x4000000,0x34e00000,0x600acd00,0x4000000,0xb6800000,0x600ace00,0x4000000,
+0x34e00000,0x600ace00,0x4000000,0xb6800000,0x600acf00,0x4000000,0x34e00000,0x600acf00,0x4000000,0xb6800000,0x600ad111,0x7c40300,0xe30000,0x604ac4bf,0x4000000,0x34e00003,
+0x61000a03,0x4000000,0x1600000,0x61000c02,0x80000000,0x218960,0x6100120f,0x4000000,0x200000,0x61001a18,0x7c00100,0x1830000,0x61001d0c,0x7c00100,0x230400,0x61001d0c,
+0x7c00100,0x250400,0x61006600,0x24000020,0x200000,0x61008407,0x7c00100,0x220400,0x61008407,0x7c00100,0x250400,0x6100870c,0x7c00100,0x220400,0x61008e00,0x24000000,
+0x200000,0x61008e00,0x24000000,0x400000,0x61008e00,0x24000002,0x300000,0x6100903c,0x7c00100,0x230400,0x61009519,0x7c00100,0x220400,0x61009519,0x7c00100,0x250400,
+0x61009519,0x7c00500,0x22040f,0x61009b71,0x2802100,0x962460,0x61009b71,0x2806400,0x962460,0x61009b71,0x7c00100,0x230400,0x6100a008,0x2802100,0x962460,0x6100c300,
+0x4000000,0x20000f,0x6100cd00,0x4000000,0x200000,0x6100d202,0x2802400,0x962460,0x6100d202,0x2802500,0x962460,0x6100d202,0x7c00100,0x230400,0x6100d302,0x4000020,
+0x200000,0x6100d302,0x7c00120,0x230405,0x6100d476,0x2802100,0x962460,0x6100d476,0x2802100,0x962461,0x6100d476,0x2806400,0x962460,0x6100d476,0x4000000,0x400000,
+0x6100d476,0x6800000,0x1329800,0x6100d476,0x6800100,0x962540,0x6100d476,0x7c00100,0x230400,0x6100d476,0xc000010,0x448000,0x6100d573,0x2802100,0x962460,0x6100d573,
+0x2806400,0x962460,0x6100d573,0x6800100,0x962540,0x6100d573,0x7c00100,0x230400,0x6100d573,0x7c00900,0x230400,0x6100d573,0xc000010,0x448000,0x6100d68d,0x7c00100,
+0x230400,0x6100d756,0x7c00100,0x230400,0x6100d85c,0x2802500,0x962460,0x6100d85c,0x6800100,0x962540,0x6100d85c,0x7c00100,0x230400,0x6100d85c,0x7c00500,0x230400,
+0x6100d997,0x2802100,0x962460,0x6100d997,0x4000000,0x200000,0x6100d997,0x4000000,0x400000,0x6100d997,0x6800000,0x1329800,0x6100d997,0x6800100,0x962540,0x6100d997,
+0x6804400,0x962540,0x6100d997,0x7c00100,0x230400,0x6100d997,0x7c00100,0x230560,0x6100d997,0xc000010,0x448000,0x6100da98,0x6800000,0x1329800,0x6100da98,0x7c00100,
+0x230400,0x6100db71,0x4000000,0x200000,0x6100dc99,0x2802100,0x962460,0x6100dc99,0x2802400,0x962460,0x6100dc99,0x6800000,0x1329800,0x6100dc99,0x6800100,0x962540,
+0x6100dc99,0x6804400,0x962540,0x6100dc99,0x7c00100,0x230400,0x610a4711,0x7c40300,0xe30000,0x610a4f11,0x7c00300,0xe30001,0x610ace00,0x4000000,0x34e00000,0x6140af98,
+0x7c00100,0x230400,0x6140af9a,0x7c00100,0x230400,0x6180af95,0x2802400,0x962460,0x62002a00,0x4000000,0x1600000,0x63002800,0x80000,0x918820,0x63c00c15,0x80000,
+0x918820,0x7000080e,0x7c00100,0x250400,0x70000a03,0x4000000,0x200000,0x70000c00,0x80000000,0x218960,0x70000f0a,0x7c00100,0x230400,0x70001004,0x7c00100,0x230400,
+0x70001524,0x2802100,0x962460,0x70001524,0x7c00100,0x230400,0x70001615,0x2802100,0x962460,0x7000171a,0x2802100,0x962460,0x70001821,0x6800000,0x1329800,0x70002320,
+0x7c00100,0x230400,0x70002a00,0x4000000,0x1500000,0x70002a00,0x4000000,0x1600000,0x70003000,0x24000000,0x200000,0x70003000,0x24000000,0x14200000,0x70003800,0x24000000,
+0x4e00000,0x70005201,0x2802400,0x962460,0x7000581e,0x7c00100,0x230400,0x70006108,0x7c00100,0x220400,0x70006108,0x7c00100,0x250400,0x70006f30,0x7c00100,0x230400,
+0x70007300,0x24000000,0x200000,0x70007f0e,0x4000000,0x200000,0x70008301,0x2802100,0x962460,0x70008301,0x2802400,0x962460,0x70008e00,0x24000000,0x200000,0x70008e00,
+0x24000000,0x400000,0x70008e00,0x24000002,0x400000,0x70008e00,0x24000008,0x1410000,0x70008e00,0x24000010,0x400000,0x70008e00,0x2c000010,0x448000,0x70009519,0x7c00100,
+0x220400,0x70009519,0x7c00100,0x230400,0x70009519,0x7c00100,0x250400,0x70009865,0x7c00100,0x230400,0x70009965,0x4000010,0x400000,0x70009965,0x7c00100,0x230400,
+0x7000a008,0x7c00100,0x220400,0x7000a008,0x7c00100,0x250400,0x7000a008,0x7c00500,0x22040f,0x7000a50e,0x4000000,0x200000,0x7000b61c,0x2802500,0x1862460,0x7000b61c,
+0x6800500,0x1862400,0x7000b61c,0x7c00100,0x1830000,0x7000c300,0x4000000,0x100000,0x7000c941,0x2806000,0x962460,0x7000cc00,0x4000000,0x4e00000,0x7000cd00,0x4000000,
+0x200000,0x7000cd00,0x4000000,0x4200000,0x7000cd00,0x4000000,0x4e00000,0x7000cd00,0x4000000,0x14200000,0x7000cd00,0x4000000,0x14e00000,0x7000cd00,0x4000000,0x96800000,
+0x7000cf00,0x4000000,0x4e00000,0x7000cf00,0x4000000,0x14e00000,0x7000d202,0x2802100,0x962460,0x7000d202,0x7c00100,0x230400,0x7000d997,0x7c00100,0x230400,0x7000d997,
+0xc000010,0x248000,0x7000dd86,0x2802400,0x962460,0x7000dd86,0x7c00100,0x230400,0x7000dd86,0xc000010,0x448000,0x7000de9f,0x4000000,0x200000,0x7000de9f,0x7c00100,
+0x230400,0x7000e001,0x2000,0x962460,0x7000e001,0x2802400,0x962460,0x7000e187,0x2802000,0x962460,0x7000e187,0x2802100,0x962460,0x7000e187,0x4000000,0x200000,
+0x7000e187,0x7c00100,0x230400,0x7000e187,0xc000010,0x448000,0x7000e288,0x7c00100,0x230400,0x7000e300,0x4000000,0x200000,0x7000e489,0x2802100,0x962460,0x7000e489,
+0x2802400,0x962460,0x7000e489,0x6800100,0x962540,0x7000e489,0x6800100,0x962541,0x7000e489,0x6804400,0x962540,0x7000e489,0x7c00100,0x230400,0x7000e489,0x7c00900,
+0x230400,0x7000e59d,0x2802100,0x962460,0x7000e59d,0x2802400,0x962460,0x7000e59d,0x4000000,0x200000,0x7000e59d,0x4000010,0x200000,0x7000e59d,0x6800100,0x962540,
+0x7000e59d,0x6804400,0x962540,0x7000e59d,0x7c00100,0x230400,0x7000e59d,0xc000010,0x448000,0x7000e691,0x2802100,0x962460,0x7000e691,0x2802400,0x962460,0x7000e691,
+0x2806400,0x962460,0x7000e691,0x6800000,0x1329800,0x7000e691,0x6800100,0x962540,0x7000e691,0x7c00100,0x230400,0x7000e700,0x4000400,0x200400,0x7000e70e,0x7c00100,
+0x220400,0x7000e719,0x7c00100,0x220400,0x7000e719,0x7c00500,0x22040f,0x7000e853,0x7c00100,0x230400,0x7000e9a0,0x2802400,0x962460,0x7000e9a0,0x4000000,0x200000,
+0x7000e9a0,0x4000000,0x500000,0x7000e9a0,0x7c00100,0x230400,0x7000ea79,0x2802400,0x962460,0x7000ea79,0x4000000,0x200000,0x7000ea79,0x4000000,0xf00000,0x7000ea79,
+0x4000010,0x400000,0x7000ea79,0x7c00100,0x230400,0x7000eb8c,0x2802400,0x962460,0x7000eb8c,0x4000000,0x200000,0x7000eb8c,0x7c00100,0x230400,0x7000eca3,0x2802100,
+0x962460,0x7000eca3,0x2806400,0x962460,0x7000eca3,0x4000000,0x200000,0x7000eca3,0x6800000,0x1329800,0x7000eca3,0x6800100,0x962540,0x7000eca3,0x7c00100,0x230400,
+0x7000eca3,0xc000010,0x448000,0x7000ed95,0x6800000,0x1329800,0x7000ed95,0x7c00100,0x230400,0x7000ed95,0xc000010,0x448000,0x7000ee1c,0x2802500,0x1862460,0x7000ee1c,
+0x6800000,0x1329800,0x7000ee1c,0x7c00100,0x1830000,0x7000ee1c,0x7c00900,0x1830000,0x7000ef8f,0x4000000,0x200000,0x7000ef8f,0x7c00100,0x230400,0x7000f08e,0x4000000,
+0x200000,0x7000f08e,0x7c00100,0x230400,0x7000f159,0x2802100,0x962460,0x7000f159,0x7c00100,0x230400,0x7000f200,0x4000000,0x200000,0x7000f200,0x4000000,0x1200000,
+0x7000f200,0x4000000,0x1710000,0x7000f34b,0x2802400,0x962460,0x7000f34b,0x4000000,0x200000,0x7000f34b,0x4000010,0x400000,0x7000f34b,0x6800000,0x1329800,0x7000f34b,
+0x7c00100,0x230400,0x7000f34b,0x7c00900,0x230400,0x7000f34b,0xc000010,0x448000,0x7000f490,0x4000000,0x200000,0x7000f490,0x7c00100,0x230400,0x7000f5a5,0x7c00100,
+0x230400,0x7000f67b,0x4000000,0x200000,0x7000f67b,0x4000010,0x200000,0x7000f67b,0x7c00100,0x230400,0x7000f8a6,0x2802100,0x962460,0x7000f8a6,0x2802400,0x962460,
+0x7000f8a6,0x2806400,0x962460,0x7000f8a6,0x4000000,0x500000,0x7000f8a6,0x4000010,0xb00000,0x7000f8a6,0x4000800,0x200000,0x7000f8a6,0x6800100,0x962540,0x7000f8a6,
+0x6800100,0x962541,0x7000f8a6,0x7c00100,0x230400,0x7000f8a6,0xc000010,0x448000,0x7000f921,0x4000000,0x200000,0x7000fa00,0x4000000,0x200000,0x7000fb9e,0x2802100,
+0x962460,0x7000fb9e,0x2802400,0x962460,0x7000fb9e,0x2806400,0x962460,0x7000fb9e,0x4000000,0x200000,0x7000fb9e,0x6800000,0x1329800,0x7000fb9e,0x6800100,0x962540,
+0x7000fb9e,0x6800100,0x962541,0x7000fb9e,0x7c00100,0x230400,0x7000fc92,0x4000000,0x200000,0x7000fc92,0x6800000,0x1329800,0x7000fc92,0x7c00100,0x220400,0x7000fc92,
+0x7c00100,0x230400,0x7000fc92,0x7c00100,0x250400,0x700acd00,0x4000000,0x34e00000,0x700acd00,0x4000000,0xb6800000,0x700ace00,0x4000000,0x34e00000,0x700acf00,0x4000000,
+0x34e00000,0x700acf00,0x4000000,0xb6800000,0x7040dffb,0x4000000,0x200000,0x7040f7ff,0x80000,0x918820,0x7080af98,0x2802400,0x962460,0x7080dffb,0x2802400,0x962460,
+0x70c0e4fd,0x2802100,0x962460,0x70c0e4fd,0x2802400,0x962460,0x70c0e4fd,0x6800100,0x962540,0x8000120f,0x7c00100,0x230400,0x80001524,0x7c00100,0x230400,0x8000171a,
+0x7c00100,0x230400,0x80002006,0x7c00100,0x220400,0x80002006,0x7c00100,0x250400,0x80002a00,0x4000000,0x1500000,0x80002d00,0x4000000,0x200000,0x80005208,0x2802400,
+0x962460,0x80005c00,0x4000000,0x200000,0x80007300,0x24000000,0x200000,0x80009519,0x7c00100,0x220400,0x80009519,0x7c00100,0x230400,0x80009519,0x7c00100,0x250400,
+0x80009865,0x7c00100,0x230400,0x8000a008,0x2802100,0x962460,0x8000b30a,0x4000000,0x500000,0x8000b30a,0x7c00100,0x230400,0x8000cd00,0x4000000,0x4e00000,0x8000d202,
+0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802000,0x962460,0x8000d997,0x2802400,0x962460,0x8000d997,0x4000000,
+0x400000,0x8000d997,0x4000000,0x500000,0x8000d997,0x7c00100,0x230400,0x8000d997,0xc000010,0x448000,0x8000e489,0x2802100,0x962460,0x8000e489,0x7c00100,0x230400,
+0x8000e719,0x7c00100,0x220400,0x8000f8a6,0x2802100,0x962460,0x8000f8a6,0x7c00100,0x230400,0x8000f8a6,0xc000010,0x448000,0x8000fda1,0x2802100,0x1862460,0x8000fda1,
+0x2806400,0x1862460,0x8000fda1,0x4000000,0x1800000,0x8000fda1,0x6800000,0x1329800,0x8000fda1,0x6800100,0x1862540,0x8000fda1,0x7c00100,0x1830000,0x8000fda1,0xc000010,
+0x448000,0x8000fe9c,0x7c00100,0x230400,0x8000fe9c,0x7c00100,0x830400,0x8000fe9c,0x7c00100,0x1430400,0x8000ff06,0x7c00100,0x220400,0x80010165,0x7c00100,0x230400,
+0x800102a2,0x4000000,0x200000,0x800102a2,0x7c00100,0x230400,0x800103a4,0x7c00100,0x230400,0x800103a4,0xc000010,0x448000,0x8001044c,0x4000000,0x200000,0x8001044c,
+0x7c00100,0x220400,0x8001044c,0x7c00100,0x250400,0x80010670,0x2802000,0x962460,0x80010670,0x4000000,0x200000,0x80010670,0x4000010,0x400000,0x80010670,0xc000010,
+0x448000,0x800a4711,0x7c40300,0xe30000,0x800acd00,0x4000000,0x34e00000,0x800acd00,0x4000000,0x7a902460,0x800ace00,0x4000000,0x34e00000,0x800acf00,0x4000000,0x34e00000,
+0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0x34e00000,0x800b0500,0x4000000,0xb6800000,0x90001615,0x7c00100,0x230400,0x9000171a,0x4000000,0x200000,0x9000171a,
+0x7c00100,0x230400,0x90003000,0x24000000,0x200000,0x90007f0e,0x4000000,0x200000,0x90008301,0x2802000,0x962460,0x90008e00,0x24000000,0x400000,0x90009519,0x7c00100,
+0x250400,0x9000a16f,0x2802100,0x962460,0x9000d200,0x80000000,0x218960,0x9000d202,0x2802000,0x962460,0x9000d202,0x2802100,0x962460,0x9000d202,0x7c00100,0x230400,
+0x9000e59d,0x2802100,0x962460,0x900107a7,0x2802100,0x962460,0x900107a7,0x2802400,0x962460,0x900107a7,0x2802c00,0x962460,0x900107a7,0x4000000,0x1400000,0x900107a7,
+0x6800000,0x1329800,0x900107a7,0x7c00100,0x220400,0x900107a7,0x7c00100,0x250400,0x900108a8,0x2802100,0x962460,0x900108a8,0x2806400,0x962460,0x900108a8,0x4000000,
+0x200000,0x900108a8,0x4000000,0x400000,0x900108a8,0x4000010,0x400000,0x900108a8,0x6800000,0x1329800,0x900108a8,0x6800100,0x962540,0x900108a8,0x7c00100,0x230400,
+0x900108a8,0xc000010,0x448000,0x90010908,0x7c00100,0x220400,0x90010a38,0x2802100,0x962460,0x90010ca9,0x2802100,0x962460,0x90010ca9,0x4000000,0x500000,0x90010ca9,
+0x4000010,0xb00000,0x90010ca9,0x6800100,0x962540,0x90010ca9,0x7c00100,0x230400,0x90010d1b,0x4000000,0x500000,0x90010eaa,0x2802100,0x962460,0x90010eaa,0x2802400,
+0x962460,0x90010eaa,0x2806400,0x962460,0x90010eaa,0x4000000,0x200000,0x90010eaa,0x4000000,0x400000,0x90010eaa,0x4000010,0x400000,0x90010eaa,0x6800000,0x1329800,
+0x90010eaa,0x6800100,0x962540,0x90010eaa,0x7c00100,0x230400,0x90010eaa,0xc000010,0x448000,0x90010fab,0x7c00100,0x220400,0x90010fab,0x7c00100,0x250400,0x9002c300,
+0x4000000,0x100000,0x900ac400,0x4000000,0xe0000d,0x900acd00,0x4000000,0x34e00000,0x900acd00,0x4000000,0xb6800000,0x900acf00,0x4000000,0x34e00000,0x900b0500,0x4000000,
+0xe00000,0x900b0500,0x4000000,0x34e00000,0x900b0500,0x4000000,0xb6800000,0x900b0b9a,0x7c00900,0x1230400,0x900b109a,0x7c00300,0xe30000,0x900b119a,0x7c00300,0xe30000,
+0x90408e06,0x24000000,0x400000,0xa0001004,0x4000000,0x200000,0xa0001004,0x7c00100,0x230400,0xa000120f,0x2802100,0x962460,0xa000120f,0x2802400,0x962460,0xa000171a,
+0x2802100,0x962460,0xa000171a,0x2806400,0x962460,0xa0002a00,0x4000000,0x1600000,0xa0003000,0x24000000,0x200000,0xa000581e,0x7c00100,0x230400,0xa0007300,0x24000000,
+0x200000,0xa0008301,0x2802400,0x962460,0xa0008e00,0x24000000,0x400000,0xa000cf00,0x4000000,0x4e00000,0xa0010500,0x4000000,0x200000,0xa00114af,0x2802100,0x962460,
+0xa00114af,0x2802400,0x962460,0xa00114af,0x2806400,0x962460,0xa00114af,0x6800000,0x1329800,0xa00114af,0x7c00100,0x230400,0xa00114af,0x7c00100,0x230560,0xa00116b0,
+0x2802100,0x962460,0xa00116b0,0x2802800,0x962460,0xa00116b0,0x2806400,0x962460,0xa00116b0,0x4000000,0x400000,0xa00116b0,0x4000000,0x500000,0xa00116b0,0x4000010,
+0x400000,0xa00116b0,0x6800100,0x962540,0xa00116b0,0x7c00100,0x230400,0xa00116b0,0x7c00100,0x230560,0xa00116b0,0xc000010,0x448000,0xa0011722,0x7c00100,0x230400,
+0xa00118b1,0x2802000,0x962460,0xa00118b1,0x2802100,0x962460,0xa00118b1,0x2806400,0x962460,0xa00118b1,0x4000000,0x200000,0xa00118b1,0x4000000,0x400000,0xa00118b1,
+0x4000000,0x500000,0xa00118b1,0x6800100,0x962540,0xa00118b1,0x7c00100,0x230400,0xa00118b1,0x7c00100,0x230560,0xa00118b1,0xc000010,0x448000,0xa00a4005,0x7c00100,
+0xe30400,0xa00a4711,0x7c40300,0xe30000,0xa00ac400,0x4000000,0x4e00000,0xa00acb14,0x7c00100,0xe30000,0xa00acf00,0x4000000,0x34e00000,0xa00b0500,0x4000000,0x34e00000,
+0xa00b0500,0x4000000,0xb6800000,0xa00b0b96,0x7c00900,0x1230400,0xa00b1211,0x7c40300,0xe30000,0xa00b1314,0x7c00100,0xe30000,0xa00b1596,0x7c00300,0xe30000,0xa040afae,
+0x6800400,0x962540,0xb0000a03,0x7c00100,0x220400,0xb0000b13,0x7c00100,0x2633800,0xb0001004,0x2802000,0x962460,0xb0001110,0x4000000,0x200000,0xb0001524,0x2802000,
+0x962460,0xb0001615,0x4000000,0x500000,0xb000251b,0x7c00100,0x230400,0xb0007300,0x24000000,0x200000,0xb0008939,0x4000000,0x200000,0xb0008939,0x7c00100,0x230400,
+0xb0008e00,0x24000000,0x200000,0xb0008e00,0x24000000,0x400000,0xb0008e00,0x24000010,0x400000,0xb0009257,0x2802000,0x962460,0xb0009257,0x4000000,0x1600000,0xb0009519,
+0x7c00100,0x220400,0xb0009519,0x7c00100,0x250400,0xb0009a00,0x4000000,0x200000,0xb000b30a,0x2802100,0x962460,0xb000b30a,0x7c00100,0x230400,0xb000c178,0x80000000,
+0x218960,0xb000c300,0x4000000,0x4200000,0xb000d202,0x2802000,0x962460,0xb000d476,0x6800100,0x962540,0xb000d476,0x7c00100,0x230400,0xb000e300,0x4000000,0x4e00000,
+0xb000fda1,0x7c00100,0x1830000,0xb0010eaa,0x2802000,0x962460,0xb00116b0,0x7c00100,0x230400,0xb0011900,0x4000000,0x4e00000,0xb0011ab2,0x2802100,0x962460,0xb0011ab2,
+0x2802400,0x962460,0xb0011ab2,0x2806400,0x962460,0xb0011ab2,0x4000000,0x200000,0xb0011ab2,0x6800100,0x962540,0xb0011ab2,0x7c00100,0x230400,0xb0011b0c,0x7c00100,
+0x230400,0xb0011cb3,0x2802100,0x962460,0xb0011cb3,0x2806400,0x962460,0xb0011cb3,0x6800000,0x1329800,0xb0011cb3,0x6800100,0x962540,0xb0011cb3,0x7c00100,0x230400,
+0xb0011db6,0x2802500,0x962460,0xb0011db6,0x6800000,0x1329800,0xb0011db6,0x7c00100,0x230400,0xb0011db6,0x7c00500,0x230400,0xb0011e00,0x4000000,0x200000,0xb0011e00,
+0x4000000,0x1500000,0xb0011fb4,0x2802100,0x962460,0xb0011fb4,0x6800100,0x962540,0xb0011fb4,0x7c00100,0x230400,0xb0011fb4,0xc000010,0x248000,0xb0012000,0x4000000,
+0x200000,0xb00121b5,0x4000000,0x200000,0xb00121b5,0x4000010,0x400000,0xb00121b5,0x7c00100,0x220400,0xb00121b5,0x7c00100,0x250400,0xb00121b5,0xc000010,0x448000,
+0xb00122b8,0x4000000,0x200000,0xb00122b8,0x7c00100,0x230400,0xb00123b7,0x2802400,0x962460,0xb00123b7,0x4000000,0x200000,0xb00123b7,0x7c00100,0x230400,0xb00123b7,
+0xc000010,0x248000,0xb00a4005,0x7c00100,0xe30400,0xb00a4711,0x7c40300,0xe30000,0xb00acf00,0x4000000,0x34e00000,0xb00b0500,0x4000000,0x34e00000,0xb00b0500,0x4000000,
+0x3ce00000,0xb00b0500,0x4000000,0xb6800000,0xb00b109a,0x7c00300,0xe30000,0xb080e47e,0x2802000,0x962460,0xc0001524,0x4000000,0x500000,0xc0001a18,0x2806400,0x1862460,
+0xc0001a18,0x7c00100,0x1830000,0xc0007300,0x24000000,0x200000,0xc0008e00,0x24000010,0x400000,0xc0009519,0x7c00100,0x220400,0xc0009519,0x7c00100,0x250400,0xc000c300,
+0x4000000,0x420000f,0xc000d85c,0x2802100,0x962460,0xc000d85c,0x6800100,0x962540,0xc000d85c,0x7c00100,0x230400,0xc000dc99,0x7c00100,0x230400,0xc000e719,0x7c00100,
+0x220400,0xc00107a7,0x7c00100,0x230400,0xc0010eaa,0x7c00100,0x230400,0xc00116b0,0x7c00100,0x230560,0xc0011900,0x4000000,0x4200000,0xc0012447,0,0x818820,
+0xc0012447,0,0xc18820,0xc0012447,0,0x1418820,0xc00125b9,0x7c00100,0x230400,0xc00126bb,0x2802100,0x962460,0xc00126bb,0x2806400,0x962460,0xc00126bb,
+0x4000000,0x500000,0xc00126bb,0x6800100,0x962540,0xc00126bb,0x7c00100,0x230400,0xc00127ba,0x2802400,0x962460,0xc00127ba,0x4000000,0x200000,0xc00127ba,0x6800000,
+0x1329800,0xc00127ba,0x7c00100,0x230400,0xc00127ba,0x7c00900,0x230400,0xc0012800,0x4000000,0x200000,0xc0012b23,0x4000000,0x200000,0xc0012b23,0x4000000,0x400000,
+0xc0012b23,0x4000000,0x1500000,0xc0012cbc,0x2802400,0x962460,0xc0012cbc,0x4000000,0x1600000,0xc0012cbc,0x6800000,0x1329800,0xc0012cbc,0x7c00100,0x230400,0xc00acf00,
+0x4000000,0x34e00000,0xc00ae300,0x4000000,0x34e00000,0xc00b0500,0x4000000,0x34e00000,0xc00b0500,0x4000000,0xb6800000,0xc00b0b00,0x4000000,0x1200000,0xc00b0b00,0x7c00900,
+0x1230400,0xc00b109a,0x7c00300,0xe30000,0xc00b2914,0x7c00100,0x2530000,0xc00b2916,0x7c00100,0x2530c00,0xc00b2a00,0x4000000,0x34e00000,0xc040af55,0x7c00100,0x230400,
+0xc0c12b80,0x4000000,0x200000,0xc14a44bf,0x4000000,0xe0000d};
-static const int32_t countPropsVectors=6639;
+static const int32_t countPropsVectors=6822;
static const int32_t propsVectorsColumns=3;
-static const uint16_t scriptExtensions[234]={
+static const uint16_t scriptExtensions[256]={
0x800e,0x8019,8,0x8059,8,2,8,0x8038,8,6,8,0x8019,3,0x800c,2,0x22,
0x25,0x80b6,2,0x22,0x8025,2,0x12,2,0x22,0x54,0x79,0x7b,0xa7,0xb6,0x80b7,2,
0x8022,2,0x8025,2,0x21,2,0x80b6,2,0x25,4,0xa,0xf,0x10,0x15,0x19,0x1a,
0x1f,0x23,0x24,0x89,0x97,0x809e,4,0xa,0xf,0x10,0x15,0x19,0x1a,0x1f,0x23,0x24,
0x89,0x809e,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x3a,0x89,0x91,0x99,
-0x9e,0xa0,0xb2,0x80b3,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x30,0x3a,
-0x89,0x91,0x99,0x9e,0xa0,0xb2,0x80b3,0xa,0x78,0xa0,0x80b2,0xa,0x67,4,0x3a,0x8076,
-4,0x6d,0x10,0x80a4,0x10,0x72,0xf,0x809d,0xf,0x76,0x23,0x8089,0x23,0x7a,0x1c,0x34,
-0x8076,0x1c,0x7e,0xc,0x8019,0x2a,0x2b,0x2c,0x802d,0x1b,0x805a,0x800a,4,0xa,0x15,0x8089,
-0xa,0x8089,4,0x800a,0xa,0x8097,0xa,0x15,0x1a,0x1f,0x23,0x8024,0x8004,0xa,0x19,0x8089,
-5,0x11,0x12,0x14,0x16,0x8029,5,0x11,0x12,0x14,0x8016,0x8011,5,0x8011,0x11,0x14,
-0x8016,0xa,0xf,0x10,0x78,0x91,0x99,0x9d,0x9e,0xa0,0xa3,0x80b2,0xa,0xf,0x10,0x15,
-0x1a,0x78,0x91,0x99,0x9d,0x9e,0xa0,0xa3,0x80b2,0xa,0xf,0x10,0x15,0x78,0x91,0x99,
-0x9d,0x9e,0xa0,0xa3,0x80b2,0xa,0x92,0xa,0x8023,0xa,0xd7,0x19,0x1c,0x804f,0x37,0x804e,
-0x2f,0x31,0x8053,0x2f,0x8031,2,0x8007,0x89,0x7a,0x8087};
+0x9e,0xa0,0xaf,0xb2,0xb3,0x80bb,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,
+0x30,0x3a,0x89,0x91,0x99,0x9e,0xa0,0xaf,0xb2,0xb3,0x80bb,0xa,0x78,0xa0,0x80b2,0xa,
+0x6b,4,0x3a,0x8076,4,0x71,0x10,0x80a4,0x10,0x76,0xf,0x809d,0xf,0x7a,0x23,0x8089,
+0x23,0x7e,0x15,0x80bb,0x15,0x82,0x1c,0x34,0x8076,0x1c,0x86,0xc,0x8019,0x2a,0x2b,0x2c,
+0x802d,0x1b,0x805a,0x800a,4,0xa,0x15,0x8089,0xa,0x8089,4,0x800a,0xa,0x8097,0xa,0x15,
+0x1a,0x1f,0x23,0x8024,0xa,0x80bb,4,0xa,0x15,0x1f,0x24,0x89,0x9e,0x80bb,0x8004,0x19,
+0x801b,0xa,0x19,0x8089,5,0x11,0x12,0x14,0x16,0x8029,5,0x11,0x12,0x14,0x8016,0x8011,
+5,0x8011,0x11,0x14,0x8016,0xa,0xf,0x10,0x78,0x91,0x99,0x9d,0x9e,0xa0,0xa3,0x80b2,
+0xa,0xf,0x10,0x15,0x1a,0x78,0x91,0x99,0x9d,0x9e,0xa0,0xa3,0xb2,0x80bb,0xa,0xf,
+0x10,0x15,0x78,0x91,0x99,0x9d,0x9e,0xa0,0xa3,0xb2,0x80bb,0xa,0x9a,0xa,0x8023,0xa,
+0xed,0x19,0x1c,0x804f,0x37,0x804e,0x2f,0x31,0x8053,0x2f,0x8031,2,0x8007,0x89,0x7e,0x8087};
-static const int32_t indexes[UPROPS_INDEX_COUNT]={0x29fa,0x29fa,0x29fa,0x29fa,0x649c,3,0x7e8b,0x7f00,0x7f00,0x7f00,0xb23b8,0x2a75a31,0,0,0,0};
+static const int32_t indexes[UPROPS_INDEX_COUNT]={0x2afc,0x2afc,0x2afc,0x2afc,0x66be,3,0x8164,0x81e4,0x81e4,0x81e4,0xb2cbc,0x2a75a31,0,0,0,0};
#endif // INCLUDED_FROM_UCHAR_C
diff --git a/Build/source/libs/icu/icu-src/source/common/uchriter.cpp b/Build/source/libs/icu/icu-src/source/common/uchriter.cpp
index 822168f5c8e..bedbabc74c2 100644
--- a/Build/source/libs/icu/icu-src/source/common/uchriter.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uchriter.cpp
@@ -89,7 +89,7 @@ UCharCharacterIterator::hashCode() const {
return ustr_hashUCharsN(text, textLength) ^ pos ^ begin ^ end;
}
-CharacterIterator*
+UCharCharacterIterator*
UCharCharacterIterator::clone() const {
return new UCharCharacterIterator(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/common/ucln_cmn.cpp b/Build/source/libs/icu/icu-src/source/common/ucln_cmn.cpp
index 8cabf137cf2..f3e07c6b891 100644
--- a/Build/source/libs/icu/icu-src/source/common/ucln_cmn.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ucln_cmn.cpp
@@ -40,8 +40,8 @@ U_CAPI void U_EXPORT2
u_cleanup(void)
{
UTRACE_ENTRY_OC(UTRACE_U_CLEANUP);
- umtx_lock(NULL); /* Force a memory barrier, so that we are sure to see */
- umtx_unlock(NULL); /* all state left around by any other threads. */
+ icu::umtx_lock(NULL); /* Force a memory barrier, so that we are sure to see */
+ icu::umtx_unlock(NULL); /* all state left around by any other threads. */
ucln_lib_cleanup();
@@ -65,9 +65,20 @@ U_CFUNC void
ucln_common_registerCleanup(ECleanupCommonType type,
cleanupFunc *func)
{
+ // Thread safety messiness: From ticket 10295, calls to registerCleanup() may occur
+ // concurrently. Although such cases should be storing the same value, they raise errors
+ // from the thread sanity checker. Doing the store within a mutex avoids those.
+ // BUT that can trigger a recursive entry into std::call_once() in umutex.cpp when this code,
+ // running from the call_once function, tries to grab the ICU global mutex, which
+ // re-enters the mutex init path. So, work-around by special casing UCLN_COMMON_MUTEX, not
+ // using the ICU global mutex for it.
+ //
+ // No other point in ICU uses std::call_once().
+
U_ASSERT(UCLN_COMMON_START < type && type < UCLN_COMMON_COUNT);
- if (UCLN_COMMON_START < type && type < UCLN_COMMON_COUNT)
- {
+ if (type == UCLN_COMMON_MUTEX) {
+ gCommonCleanupFunctions[type] = func;
+ } else if (UCLN_COMMON_START < type && type < UCLN_COMMON_COUNT) {
icu::Mutex m; // See ticket 10295 for discussion.
gCommonCleanupFunctions[type] = func;
}
diff --git a/Build/source/libs/icu/icu-src/source/common/ucln_cmn.h b/Build/source/libs/icu/icu-src/source/common/ucln_cmn.h
index 0ca911b47d9..b837fb94629 100644
--- a/Build/source/libs/icu/icu-src/source/common/ucln_cmn.h
+++ b/Build/source/libs/icu/icu-src/source/common/ucln_cmn.h
@@ -22,8 +22,6 @@
/* These are the cleanup functions for various APIs. */
/* @return true if cleanup complete successfully.*/
-U_CFUNC UBool umtx_cleanup(void);
-
U_CFUNC UBool utrace_cleanup(void);
U_CFUNC UBool ucln_lib_cleanup(void);
@@ -41,6 +39,8 @@ typedef enum ECleanupCommonType {
UCLN_COMMON_LOCALE_KEY_TYPE,
UCLN_COMMON_LOCALE,
UCLN_COMMON_LOCALE_AVAILABLE,
+ UCLN_COMMON_LIKELY_SUBTAGS,
+ UCLN_COMMON_LOCALE_DISTANCE,
UCLN_COMMON_ULOC,
UCLN_COMMON_CURRENCY,
UCLN_COMMON_LOADED_NORMALIZER2,
@@ -62,6 +62,7 @@ typedef enum ECleanupCommonType {
*/
UCLN_COMMON_UNIFIED_CACHE,
UCLN_COMMON_URES,
+ UCLN_COMMON_MUTEX, // Mutexes should be the last to be cleaned up.
UCLN_COMMON_COUNT /* This must be last */
} ECleanupCommonType;
diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv.cpp
index 4e57619f500..856be708785 100644
--- a/Build/source/libs/icu/icu-src/source/common/ucnv.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ucnv.cpp
@@ -25,6 +25,8 @@
#if !UCONFIG_NO_CONVERSION
+#include <memory>
+
#include "unicode/ustring.h"
#include "unicode/ucnv.h"
#include "unicode/ucnv_err.h"
@@ -158,7 +160,6 @@ ucnv_safeClone(const UConverter* cnv, void *stackBuffer, int32_t *pBufferSize, U
UConverter *localConverter, *allocatedConverter;
int32_t stackBufferSize;
int32_t bufferSizeNeeded;
- char *stackBufferChars = (char *)stackBuffer;
UErrorCode cbErr;
UConverterToUnicodeArgs toUArgs = {
sizeof(UConverterToUnicodeArgs),
@@ -224,23 +225,22 @@ ucnv_safeClone(const UConverter* cnv, void *stackBuffer, int32_t *pBufferSize, U
}
}
-
- /* Pointers on 64-bit platforms need to be aligned
- * on a 64-bit boundary in memory.
+ /* Adjust (if necessary) the stackBuffer pointer to be aligned correctly for a UConverter.
+ * TODO(Jira ICU-20736) Redo this using std::align() once g++4.9 compatibility is no longer needed.
*/
- if (U_ALIGNMENT_OFFSET(stackBuffer) != 0) {
- int32_t offsetUp = (int32_t)U_ALIGNMENT_OFFSET_UP(stackBufferChars);
- if(stackBufferSize > offsetUp) {
- stackBufferSize -= offsetUp;
- stackBufferChars += offsetUp;
+ if (stackBuffer) {
+ uintptr_t p = reinterpret_cast<uintptr_t>(stackBuffer);
+ uintptr_t aligned_p = (p + alignof(UConverter) - 1) & ~(alignof(UConverter) - 1);
+ ptrdiff_t pointerAdjustment = aligned_p - p;
+ if (bufferSizeNeeded + pointerAdjustment <= stackBufferSize) {
+ stackBuffer = reinterpret_cast<void *>(aligned_p);
+ stackBufferSize -= pointerAdjustment;
} else {
/* prevent using the stack buffer but keep the size > 0 so that we do not just preflight */
stackBufferSize = 1;
}
}
- stackBuffer = (void *)stackBufferChars;
-
/* Now, see if we must allocate any memory */
if (stackBufferSize < bufferSizeNeeded || stackBuffer == NULL)
{
@@ -475,7 +475,7 @@ ucnv_setSubstString(UConverter *cnv,
const UChar *s,
int32_t length,
UErrorCode *err) {
- UAlignedMemory cloneBuffer[U_CNV_SAFECLONE_BUFFERSIZE / sizeof(UAlignedMemory) + 1];
+ alignas(UConverter) char cloneBuffer[U_CNV_SAFECLONE_BUFFERSIZE];
char chars[UCNV_ERROR_BUFFER_LENGTH];
UConverter *clone;
diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv2022.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv2022.cpp
index d1a50d269f1..dbc5bb7e07b 100644
--- a/Build/source/libs/icu/icu-src/source/common/ucnv2022.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ucnv2022.cpp
@@ -3571,20 +3571,11 @@ _ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorC
/*
* Structure for cloning an ISO 2022 converter into a single memory block.
- * ucnv_safeClone() of the converter will align the entire cloneStruct,
- * and then ucnv_safeClone() of the sub-converter may additionally align
- * currentConverter inside the cloneStruct, for which we need the deadSpace
- * after currentConverter.
- * This is because UAlignedMemory may be larger than the actually
- * necessary alignment size for the platform.
- * The other cloneStruct fields will not be moved around,
- * and are aligned properly with cloneStruct's alignment.
*/
struct cloneStruct
{
UConverter cnv;
UConverter currentConverter;
- UAlignedMemory deadSpace;
UConverterDataISO2022 mydata;
};
@@ -3602,6 +3593,10 @@ _ISO_2022_SafeClone(
UConverterDataISO2022 *cnvData;
int32_t i, size;
+ if (U_FAILURE(*status)){
+ return nullptr;
+ }
+
if (*pBufferSize == 0) { /* 'preflighting' request - set needed size into *pBufferSize */
*pBufferSize = (int32_t)sizeof(struct cloneStruct);
return NULL;
@@ -3619,7 +3614,7 @@ _ISO_2022_SafeClone(
/* share the subconverters */
if(cnvData->currentConverter != NULL) {
- size = (int32_t)(sizeof(UConverter) + sizeof(UAlignedMemory)); /* include size of padding */
+ size = (int32_t)sizeof(UConverter);
localClone->mydata.currentConverter =
ucnv_safeClone(cnvData->currentConverter,
&localClone->currentConverter,
diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_bld.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv_bld.cpp
index 7596687435d..56fc3d6822f 100644
--- a/Build/source/libs/icu/icu-src/source/common/ucnv_bld.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ucnv_bld.cpp
@@ -194,9 +194,9 @@ static struct {
/*initializes some global variables */
static UHashtable *SHARED_DATA_HASHTABLE = NULL;
-static UMutex cnvCacheMutex = U_MUTEX_INITIALIZER; /* Mutex for synchronizing cnv cache access. */
- /* Note: the global mutex is used for */
- /* reference count updates. */
+static icu::UMutex cnvCacheMutex;
+/* Note: the global mutex is used for */
+/* reference count updates. */
static const char **gAvailableConverters = NULL;
static uint16_t gAvailableConverterCount = 0;
diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_lmb.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv_lmb.cpp
index 1ec56f7a45f..168392837b5 100644
--- a/Build/source/libs/icu/icu-src/source/common/ucnv_lmb.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ucnv_lmb.cpp
@@ -1107,11 +1107,13 @@ GetUniFromLMBCSUni(char const ** ppLMBCSin) /* Called with LMBCS-style Unicode
all input as required by ICU converter semantics.
*/
-#define CHECK_SOURCE_LIMIT(index) \
- if (args->source+index > args->sourceLimit){\
- *err = U_TRUNCATED_CHAR_FOUND;\
- args->source = args->sourceLimit;\
- return 0xffff;}
+#define CHECK_SOURCE_LIMIT(index) UPRV_BLOCK_MACRO_BEGIN { \
+ if (args->source+index > args->sourceLimit) { \
+ *err = U_TRUNCATED_CHAR_FOUND; \
+ args->source = args->sourceLimit; \
+ return 0xffff; \
+ } \
+} UPRV_BLOCK_MACRO_END
/* Return the Unicode representation for the current LMBCS character */
diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvbocu.cpp b/Build/source/libs/icu/icu-src/source/common/ucnvbocu.cpp
index 5b66c5059a5..7c2aab56558 100644
--- a/Build/source/libs/icu/icu-src/source/common/ucnvbocu.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ucnvbocu.cpp
@@ -202,14 +202,14 @@ bocu1TrailToByte[BOCU1_TRAIL_CONTROLS_COUNT]={
* @param d Divisor.
* @param m Output variable for the rest (modulo result).
*/
-#define NEGDIVMOD(n, d, m) { \
+#define NEGDIVMOD(n, d, m) UPRV_BLOCK_MACRO_BEGIN { \
(m)=(n)%(d); \
(n)/=(d); \
if((m)<0) { \
--(n); \
(m)+=(d); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/* Faster versions of packDiff() for single-byte-encoded diff values. */
diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvhz.cpp b/Build/source/libs/icu/icu-src/source/common/ucnvhz.cpp
index e9f5206c163..6b2f5faaf0a 100644
--- a/Build/source/libs/icu/icu-src/source/common/ucnvhz.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ucnvhz.cpp
@@ -38,7 +38,7 @@
#define ESC_LEN 2
-#define CONCAT_ESCAPE_MACRO( args, targetIndex,targetLength,strToAppend, err, len,sourceIndex){ \
+#define CONCAT_ESCAPE_MACRO(args, targetIndex,targetLength,strToAppend, err, len,sourceIndex) UPRV_BLOCK_MACRO_BEGIN { \
while(len-->0){ \
if(targetIndex < targetLength){ \
args->target[targetIndex] = (unsigned char) *strToAppend; \
@@ -53,7 +53,7 @@
} \
strToAppend++; \
} \
-}
+} UPRV_BLOCK_MACRO_END
typedef struct{
@@ -518,19 +518,11 @@ _HZ_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorCode *e
/*
* Structure for cloning an HZ converter into a single memory block.
- * ucnv_safeClone() of the HZ converter will align the entire cloneHZStruct,
- * and then ucnv_safeClone() of the sub-converter may additionally align
- * subCnv inside the cloneHZStruct, for which we need the deadSpace after
- * subCnv. This is because UAlignedMemory may be larger than the actually
- * necessary alignment size for the platform.
- * The other cloneHZStruct fields will not be moved around,
- * and are aligned properly with cloneHZStruct's alignment.
*/
struct cloneHZStruct
{
UConverter cnv;
UConverter subCnv;
- UAlignedMemory deadSpace;
UConverterDataHZ mydata;
};
@@ -545,12 +537,12 @@ _HZ_SafeClone(const UConverter *cnv,
int32_t size, bufferSizeNeeded = sizeof(struct cloneHZStruct);
if (U_FAILURE(*status)){
- return 0;
+ return nullptr;
}
if (*pBufferSize == 0){ /* 'preflighting' request - set needed size into *pBufferSize */
*pBufferSize = bufferSizeNeeded;
- return 0;
+ return nullptr;
}
localClone = (struct cloneHZStruct *)stackBuffer;
@@ -561,7 +553,7 @@ _HZ_SafeClone(const UConverter *cnv,
localClone->cnv.isExtraLocal = TRUE;
/* deep-clone the sub-converter */
- size = (int32_t)(sizeof(UConverter) + sizeof(UAlignedMemory)); /* include size of padding */
+ size = (int32_t)sizeof(UConverter);
((UConverterDataHZ*)localClone->cnv.extraInfo)->gbConverter =
ucnv_safeClone(((UConverterDataHZ*)cnv->extraInfo)->gbConverter, &localClone->subCnv, &size, status);
diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvisci.cpp b/Build/source/libs/icu/icu-src/source/common/ucnvisci.cpp
index 27a3a3124ad..44a7c05a3c8 100644
--- a/Build/source/libs/icu/icu-src/source/common/ucnvisci.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ucnvisci.cpp
@@ -831,7 +831,7 @@ static const uint16_t nuktaSpecialCases[][2]={
};
-#define WRITE_TO_TARGET_FROM_U(args,offsets,source,target,targetLimit,targetByteUnit,err){ \
+#define WRITE_TO_TARGET_FROM_U(args,offsets,source,target,targetLimit,targetByteUnit,err) UPRV_BLOCK_MACRO_BEGIN { \
int32_t offset = (int32_t)(source - args->source-1); \
/* write the targetUniChar to target */ \
if(target < targetLimit){ \
@@ -884,7 +884,7 @@ static const uint16_t nuktaSpecialCases[][2]={
(uint8_t) (targetByteUnit); \
*err = U_BUFFER_OVERFLOW_ERROR; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/* Rules:
* Explicit Halant :
@@ -1119,7 +1119,7 @@ static const uint16_t lookupTable[][2]={
{ GURMUKHI, PNJ_MASK }
};
-#define WRITE_TO_TARGET_TO_U(args,source,target,offsets,offset,targetUniChar,delta, err){\
+#define WRITE_TO_TARGET_TO_U(args,source,target,offsets,offset,targetUniChar,delta, err) UPRV_BLOCK_MACRO_BEGIN { \
/* add offset to current Indic Block */ \
if(targetUniChar>ASCII_END && \
targetUniChar != ZWJ && \
@@ -1140,9 +1140,9 @@ static const uint16_t lookupTable[][2]={
(UChar)targetUniChar; \
*err = U_BUFFER_OVERFLOW_ERROR; \
} \
-}
+} UPRV_BLOCK_MACRO_END
-#define GET_MAPPING(sourceChar,targetUniChar,data){ \
+#define GET_MAPPING(sourceChar,targetUniChar,data) UPRV_BLOCK_MACRO_BEGIN { \
targetUniChar = toUnicodeTable[(sourceChar)] ; \
/* is the code point valid in current script? */ \
if(sourceChar> ASCII_END && \
@@ -1153,7 +1153,7 @@ static const uint16_t lookupTable[][2]={
targetUniChar=missingCharMarker; \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/***********
* Rules for ISCII to Unicode converter
diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvmbcs.cpp b/Build/source/libs/icu/icu-src/source/common/ucnvmbcs.cpp
index 583744b73a3..ca9b0a335ad 100644
--- a/Build/source/libs/icu/icu-src/source/common/ucnvmbcs.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ucnvmbcs.cpp
@@ -1383,7 +1383,7 @@ _EBCDICSwapLFNL(UConverterSharedData *sharedData, UErrorCode *pErrorCode) {
uprv_strcat(name, UCNV_SWAP_LFNL_OPTION_STRING);
/* set the pointers */
- umtx_lock(NULL);
+ icu::umtx_lock(NULL);
if(mbcsTable->swapLFNLStateTable==NULL) {
mbcsTable->swapLFNLStateTable=newStateTable;
mbcsTable->swapLFNLFromUnicodeBytes=(uint8_t *)newResults;
@@ -1391,7 +1391,7 @@ _EBCDICSwapLFNL(UConverterSharedData *sharedData, UErrorCode *pErrorCode) {
newStateTable=NULL;
}
- umtx_unlock(NULL);
+ icu::umtx_unlock(NULL);
/* release the allocated memory if another thread beat us to it */
if(newStateTable!=NULL) {
@@ -1919,9 +1919,9 @@ ucnv_MBCSOpen(UConverter *cnv,
/* do this because double-checked locking is broken */
UBool isCached;
- umtx_lock(NULL);
+ icu::umtx_lock(NULL);
isCached=mbcsTable->swapLFNLStateTable!=NULL;
- umtx_unlock(NULL);
+ icu::umtx_unlock(NULL);
if(!isCached) {
if(!_EBCDICSwapLFNL(cnv->sharedData, pErrorCode)) {
diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvsel.cpp b/Build/source/libs/icu/icu-src/source/common/ucnvsel.cpp
index 79be8c31f2d..2dff5ac1bc8 100644
--- a/Build/source/libs/icu/icu-src/source/common/ucnvsel.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ucnvsel.cpp
@@ -691,36 +691,36 @@ static int16_t countOnes(uint32_t* mask, int32_t len) {
/* internal function! */
static UEnumeration *selectForMask(const UConverterSelector* sel,
- uint32_t *mask, UErrorCode *status) {
+ uint32_t *theMask, UErrorCode *status) {
+ LocalMemory<uint32_t> mask(theMask);
// this is the context we will use. Store a table of indices to which
// encodings are legit.
- struct Enumerator* result = (Enumerator*)uprv_malloc(sizeof(Enumerator));
- if (result == NULL) {
- uprv_free(mask);
+ LocalMemory<Enumerator> result(static_cast<Enumerator *>(uprv_malloc(sizeof(Enumerator))));
+ if (result.isNull()) {
*status = U_MEMORY_ALLOCATION_ERROR;
- return NULL;
+ return nullptr;
}
- result->index = NULL; // this will be allocated later!
+ result->index = nullptr; // this will be allocated later!
result->length = result->cur = 0;
result->sel = sel;
- UEnumeration *en = (UEnumeration *)uprv_malloc(sizeof(UEnumeration));
- if (en == NULL) {
+ LocalMemory<UEnumeration> en(static_cast<UEnumeration *>(uprv_malloc(sizeof(UEnumeration))));
+ if (en.isNull()) {
// TODO(markus): Combine Enumerator and UEnumeration into one struct.
- uprv_free(mask);
- uprv_free(result);
*status = U_MEMORY_ALLOCATION_ERROR;
- return NULL;
+ return nullptr;
}
- memcpy(en, &defaultEncodings, sizeof(UEnumeration));
- en->context = result;
-
+ memcpy(en.getAlias(), &defaultEncodings, sizeof(UEnumeration));
+
int32_t columns = (sel->encodingsCount+31)/32;
- int16_t numOnes = countOnes(mask, columns);
+ int16_t numOnes = countOnes(mask.getAlias(), columns);
// now, we know the exact space we need for index
if (numOnes > 0) {
- result->index = (int16_t*) uprv_malloc(numOnes * sizeof(int16_t));
-
+ result->index = static_cast<int16_t*>(uprv_malloc(numOnes * sizeof(int16_t)));
+ if (result->index == nullptr) {
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ return nullptr;
+ }
int32_t i, j;
int16_t k = 0;
for (j = 0 ; j < columns; j++) {
@@ -734,8 +734,8 @@ static UEnumeration *selectForMask(const UConverterSelector* sel,
}
} //otherwise, index will remain NULL (and will never be touched by
//the enumerator code anyway)
- uprv_free(mask);
- return en;
+ en->context = result.orphan();
+ return en.orphan();
}
/* check a string against the selector - UTF16 version */
diff --git a/Build/source/libs/icu/icu-src/source/common/ucptrie.cpp b/Build/source/libs/icu/icu-src/source/common/ucptrie.cpp
index 13496ad56c5..0004160a238 100644
--- a/Build/source/libs/icu/icu-src/source/common/ucptrie.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ucptrie.cpp
@@ -280,7 +280,7 @@ UChar32 getRange(const void *t, UChar32 start,
int32_t prevI3Block = -1;
int32_t prevBlock = -1;
UChar32 c = start;
- uint32_t value;
+ uint32_t trieValue, value = nullValue;
bool haveValue = false;
do {
int32_t i3Block;
@@ -319,6 +319,7 @@ UChar32 getRange(const void *t, UChar32 start,
return c - 1;
}
} else {
+ trieValue = trie->nullValue;
value = nullValue;
if (pValue != nullptr) { *pValue = nullValue; }
haveValue = true;
@@ -357,6 +358,7 @@ UChar32 getRange(const void *t, UChar32 start,
return c - 1;
}
} else {
+ trieValue = trie->nullValue;
value = nullValue;
if (pValue != nullptr) { *pValue = nullValue; }
haveValue = true;
@@ -364,23 +366,32 @@ UChar32 getRange(const void *t, UChar32 start,
c = (c + dataBlockLength) & ~dataMask;
} else {
int32_t di = block + (c & dataMask);
- uint32_t value2 = getValue(trie->data, valueWidth, di);
- value2 = maybeFilterValue(value2, trie->nullValue, nullValue,
- filter, context);
+ uint32_t trieValue2 = getValue(trie->data, valueWidth, di);
if (haveValue) {
- if (value2 != value) {
- return c - 1;
+ if (trieValue2 != trieValue) {
+ if (filter == nullptr ||
+ maybeFilterValue(trieValue2, trie->nullValue, nullValue,
+ filter, context) != value) {
+ return c - 1;
+ }
+ trieValue = trieValue2; // may or may not help
}
} else {
- value = value2;
+ trieValue = trieValue2;
+ value = maybeFilterValue(trieValue2, trie->nullValue, nullValue,
+ filter, context);
if (pValue != nullptr) { *pValue = value; }
haveValue = true;
}
while ((++c & dataMask) != 0) {
- if (maybeFilterValue(getValue(trie->data, valueWidth, ++di),
- trie->nullValue, nullValue,
- filter, context) != value) {
- return c - 1;
+ trieValue2 = getValue(trie->data, valueWidth, ++di);
+ if (trieValue2 != trieValue) {
+ if (filter == nullptr ||
+ maybeFilterValue(trieValue2, trie->nullValue, nullValue,
+ filter, context) != value) {
+ return c - 1;
+ }
+ trieValue = trieValue2; // may or may not help
}
}
}
diff --git a/Build/source/libs/icu/icu-src/source/common/ucurr.cpp b/Build/source/libs/icu/icu-src/source/common/ucurr.cpp
index 1062a9f3099..dfee3bd3000 100644
--- a/Build/source/libs/icu/icu-src/source/common/ucurr.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ucurr.cpp
@@ -85,30 +85,14 @@ static const char CURRENCY_MAP[] = "CurrencyMap";
// Tag for default meta-data, in CURRENCY_META
static const char DEFAULT_META[] = "DEFAULT";
-// Variant for legacy pre-euro mapping in CurrencyMap
-static const char VAR_PRE_EURO[] = "PREEURO";
-
-// Variant for legacy euro mapping in CurrencyMap
-static const char VAR_EURO[] = "EURO";
-
// Variant delimiter
static const char VAR_DELIM = '_';
-static const char VAR_DELIM_STR[] = "_";
-
-// Variant for legacy euro mapping in CurrencyMap
-//static const char VAR_DELIM_EURO[] = "_EURO";
-
-#define VARIANT_IS_EMPTY 0
-#define VARIANT_IS_EURO 0x1
-#define VARIANT_IS_PREEURO 0x2
// Tag for localized display names (symbols) of currencies
static const char CURRENCIES[] = "Currencies";
static const char CURRENCIES_NARROW[] = "Currencies%narrow";
static const char CURRENCYPLURALS[] = "CurrencyPlurals";
-static const UChar EUR_STR[] = {0x0045,0x0055,0x0052,0};
-
// ISO codes mapping table
static const UHashtable* gIsoCodes = NULL;
static icu::UInitOnce gIsoCodesInitOnce = U_INITONCE_INITIALIZER;
@@ -360,30 +344,10 @@ _findMetaData(const UChar* currency, UErrorCode& ec) {
// -------------------------------------
-/**
- * @see VARIANT_IS_EURO
- * @see VARIANT_IS_PREEURO
- */
-static uint32_t
+static void
idForLocale(const char* locale, char* countryAndVariant, int capacity, UErrorCode* ec)
{
- uint32_t variantType = 0;
- // !!! this is internal only, assumes buffer is not null and capacity is sufficient
- // Extract the country name and variant name. We only
- // recognize two variant names, EURO and PREEURO.
- char variant[ULOC_FULLNAME_CAPACITY];
ulocimp_getRegionForSupplementalData(locale, FALSE, countryAndVariant, capacity, ec);
- uloc_getVariant(locale, variant, sizeof(variant), ec);
- if (variant[0] != 0) {
- variantType = (uint32_t)(0 == uprv_strcmp(variant, VAR_EURO))
- | ((uint32_t)(0 == uprv_strcmp(variant, VAR_PRE_EURO)) << 1);
- if (variantType)
- {
- uprv_strcat(countryAndVariant, VAR_DELIM_STR);
- uprv_strcat(countryAndVariant, variant);
- }
- }
- return variantType;
}
// ------------------------------------------
@@ -401,7 +365,7 @@ U_CDECL_END
#if !UCONFIG_NO_SERVICE
struct CReg;
-static UMutex gCRegLock = U_MUTEX_INITIALIZER;
+static UMutex gCRegLock;
static CReg* gCRegHead = 0;
struct CReg : public icu::UMemory {
@@ -568,7 +532,7 @@ ucurr_forLocale(const char* locale,
// get country or country_variant in `id'
char id[ULOC_FULLNAME_CAPACITY];
- uint32_t variantType = idForLocale(locale, id, UPRV_LENGTHOF(id), ec);
+ idForLocale(locale, id, UPRV_LENGTHOF(id), ec);
if (U_FAILURE(*ec)) {
return 0;
}
@@ -602,20 +566,6 @@ ucurr_forLocale(const char* locale,
UResourceBundle *countryArray = ures_getByKey(rb, id, cm, &localStatus);
UResourceBundle *currencyReq = ures_getByIndex(countryArray, 0, NULL, &localStatus);
s = ures_getStringByKey(currencyReq, "id", &resLen, &localStatus);
-
- // Get the second item when PREEURO is requested, and this is a known Euro country.
- // If the requested variant is PREEURO, and this isn't a Euro country,
- // assume that the country changed over to the Euro in the future.
- // This is probably an old version of ICU that hasn't been updated yet.
- // The latest currency is probably correct.
- if (U_SUCCESS(localStatus)) {
- if ((variantType & VARIANT_IS_PREEURO) && u_strcmp(s, EUR_STR) == 0) {
- currencyReq = ures_getByIndex(countryArray, 1, currencyReq, &localStatus);
- s = ures_getStringByKey(currencyReq, "id", &resLen, &localStatus);
- } else if ((variantType & VARIANT_IS_EURO)) {
- s = EUR_STR;
- }
- }
ures_close(currencyReq);
ures_close(countryArray);
}
@@ -740,7 +690,13 @@ ucurr_getName(const UChar* currency,
key.append("/", ec2);
key.append(buf, ec2);
s = ures_getStringByKeyWithFallback(rb.getAlias(), key.data(), len, &ec2);
- } else {
+ if (ec2 == U_MISSING_RESOURCE_ERROR) {
+ *ec = U_USING_FALLBACK_WARNING;
+ ec2 = U_ZERO_ERROR;
+ choice = UCURR_SYMBOL_NAME;
+ }
+ }
+ if (s == NULL) {
ures_getByKey(rb.getAlias(), CURRENCIES, rb.getAlias(), &ec2);
ures_getByKeyWithFallback(rb.getAlias(), buf, rb.getAlias(), &ec2);
s = ures_getStringByIndex(rb.getAlias(), choice, len, &ec2);
@@ -757,7 +713,9 @@ ucurr_getName(const UChar* currency,
// We no longer support choice format data in names. Data should not contain
// choice patterns.
- *isChoiceFormat = FALSE;
+ if (isChoiceFormat != NULL) {
+ *isChoiceFormat = FALSE;
+ }
if (U_SUCCESS(ec2)) {
U_ASSERT(s != NULL);
return s;
@@ -1397,7 +1355,7 @@ static CurrencyNameCacheEntry* currCache[CURRENCY_NAME_CACHE_NUM] = {NULL};
// It is a simple round-robin replacement strategy.
static int8_t currentCacheEntryIndex = 0;
-static UMutex gCurrencyCacheMutex = U_MUTEX_INITIALIZER;
+static UMutex gCurrencyCacheMutex;
// Cache deletion
static void
@@ -1639,10 +1597,9 @@ uprv_getStaticCurrencyName(const UChar* iso, const char* loc,
{
U_NAMESPACE_USE
- UBool isChoiceFormat;
int32_t len;
const UChar* currname = ucurr_getName(iso, loc, UCURR_SYMBOL_NAME,
- &isChoiceFormat, &len, &ec);
+ nullptr /* isChoiceFormat */, &len, &ec);
if (U_SUCCESS(ec)) {
result.setTo(currname, len);
}
@@ -2305,7 +2262,7 @@ ucurr_countCurrencies(const char* locale,
uloc_getKeywordValue(locale, "currency", id, ULOC_FULLNAME_CAPACITY, &localStatus);
// get country or country_variant in `id'
- /*uint32_t variantType =*/ idForLocale(locale, id, sizeof(id), ec);
+ idForLocale(locale, id, sizeof(id), ec);
if (U_FAILURE(*ec))
{
@@ -2421,7 +2378,7 @@ ucurr_forLocaleAndDate(const char* locale,
resLen = uloc_getKeywordValue(locale, "currency", id, ULOC_FULLNAME_CAPACITY, &localStatus);
// get country or country_variant in `id'
- /*uint32_t variantType =*/ idForLocale(locale, id, sizeof(id), ec);
+ idForLocale(locale, id, sizeof(id), ec);
if (U_FAILURE(*ec))
{
return 0;
diff --git a/Build/source/libs/icu/icu-src/source/common/udata.cpp b/Build/source/libs/icu/icu-src/source/common/udata.cpp
index efcd2a2f975..ec9c999cea4 100644
--- a/Build/source/libs/icu/icu-src/source/common/udata.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/udata.cpp
@@ -33,6 +33,7 @@ might have to #include some other header
#include "cstring.h"
#include "mutex.h"
#include "putilimp.h"
+#include "restrace.h"
#include "uassert.h"
#include "ucln_cmn.h"
#include "ucmndata.h"
@@ -110,11 +111,12 @@ static u_atomic_int32_t gHaveTriedToLoadCommonData = ATOMIC_INT32_T_INITIALIZER(
static UHashtable *gCommonDataCache = NULL; /* Global hash table of opened ICU data files. */
static icu::UInitOnce gCommonDataCacheInitOnce = U_INITONCE_INITIALIZER;
-#if U_PLATFORM_HAS_WINUWP_API == 0
+#if !defined(ICU_DATA_DIR_WINDOWS)
static UDataFileAccess gDataFileAccess = UDATA_DEFAULT_ACCESS; // Access not synchronized.
// Modifying is documented as thread-unsafe.
#else
-static UDataFileAccess gDataFileAccess = UDATA_NO_FILES; // Windows UWP looks in one spot explicitly
+// If we are using the Windows data directory, then look in one spot only.
+static UDataFileAccess gDataFileAccess = UDATA_NO_FILES;
#endif
static UBool U_CALLCONV
@@ -206,7 +208,7 @@ setCommonICUData(UDataMemory *pData, /* The new common data. Belongs to ca
return didUpdate;
}
-#if U_PLATFORM_HAS_WINUWP_API == 0
+#if !defined(ICU_DATA_DIR_WINDOWS)
static UBool
setCommonICUDataPointer(const void *pData, UBool /*warn*/, UErrorCode *pErrorCode) {
@@ -320,7 +322,7 @@ static UDataMemory *udata_findCachedData(const char *path, UErrorCode &err)
retVal = el->item;
}
#ifdef UDATA_DEBUG
- fprintf(stderr, "Cache: [%s] -> %p\n", baseName, retVal);
+ fprintf(stderr, "Cache: [%s] -> %p\n", baseName, (void*) retVal);
#endif
return retVal;
}
@@ -383,7 +385,7 @@ static UDataMemory *udata_cacheDataItem(const char *path, UDataMemory *item, UEr
#ifdef UDATA_DEBUG
fprintf(stderr, "Cache: [%s] <<< %p : %s. vFunc=%p\n", newElement->name,
- newElement->item, u_errorName(subErr), newElement->item->vFuncs);
+ (void*) newElement->item, u_errorName(subErr), (void*) newElement->item->vFuncs);
#endif
if (subErr == U_USING_DEFAULT_WARNING || U_FAILURE(subErr)) {
@@ -477,7 +479,7 @@ UDataPathIterator::UDataPathIterator(const char *inPath, const char *pkg,
nextPath = itemPath.data();
}
#ifdef UDATA_DEBUG
- fprintf(stderr, "SUFFIX=%s [%p]\n", inSuffix, inSuffix);
+ fprintf(stderr, "SUFFIX=%s [%p]\n", inSuffix, (void*) inSuffix);
#endif
/** Suffix **/
@@ -492,12 +494,11 @@ UDataPathIterator::UDataPathIterator(const char *inPath, const char *pkg,
/* pathBuffer will hold the output path strings returned by this iterator */
#ifdef UDATA_DEBUG
- fprintf(stderr, "%p: init %s -> [path=%s], [base=%s], [suff=%s], [itempath=%s], [nextpath=%s], [checklast4=%s]\n",
- iter,
+ fprintf(stderr, "0: init %s -> [path=%s], [base=%s], [suff=%s], [itempath=%s], [nextpath=%s], [checklast4=%s]\n",
item,
path,
basename,
- suffix,
+ suffix.data(),
itemPath.data(),
nextPath,
checkLastFour?"TRUE":"false");
@@ -553,7 +554,7 @@ const char *UDataPathIterator::next(UErrorCode *pErrorCode)
fprintf(stderr, "rest of path (IDD) = %s\n", currentPath);
fprintf(stderr, " ");
{
- uint32_t qqq;
+ int32_t qqq;
for(qqq=0;qqq<pathLen;qqq++)
{
fprintf(stderr, " ");
@@ -574,7 +575,7 @@ const char *UDataPathIterator::next(UErrorCode *pErrorCode)
uprv_strlen(pathBasename)==(basenameLen+4)) { /* base+suffix = full len */
#ifdef UDATA_DEBUG
- fprintf(stderr, "Have %s file on the path: %s\n", suffix, pathBuffer.data());
+ fprintf(stderr, "Have %s file on the path: %s\n", suffix.data(), pathBuffer.data());
#endif
/* do nothing */
}
@@ -640,7 +641,8 @@ U_NAMESPACE_END
* our common data. *
* *
*----------------------------------------------------------------------*/
-#if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP Platform does not support dll icu data at this time
+#if !defined(ICU_DATA_DIR_WINDOWS)
+// When using the Windows system data, we expect only a single data file.
extern "C" const DataHeader U_DATA_API U_ICUDATA_ENTRY_POINT;
#endif
@@ -690,7 +692,8 @@ openCommonData(const char *path, /* Path from OpenChoice? */
if(gCommonICUDataArray[commonDataIndex] != NULL) {
return gCommonICUDataArray[commonDataIndex];
}
-#if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP Platform does not support dll icu data at this time
+#if !defined(ICU_DATA_DIR_WINDOWS)
+// When using the Windows system data, we expect only a single data file.
int32_t i;
for(i = 0; i < commonDataIndex; ++i) {
if(gCommonICUDataArray[i]->pHeader == &U_ICUDATA_ENTRY_POINT) {
@@ -714,7 +717,8 @@ openCommonData(const char *path, /* Path from OpenChoice? */
setCommonICUDataPointer(uprv_getICUData_conversion(), FALSE, pErrorCode);
}
*/
-#if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP Platform does not support dll icu data at this time
+#if !defined(ICU_DATA_DIR_WINDOWS)
+// When using the Windows system data, we expect only a single data file.
setCommonICUDataPointer(&U_ICUDATA_ENTRY_POINT, FALSE, pErrorCode);
{
Mutex lock;
@@ -831,7 +835,7 @@ static UBool extendICUData(UErrorCode *pErr)
* Use a specific mutex to avoid nested locks of the global mutex.
*/
#if MAP_IMPLEMENTATION==MAP_STDIO
- static UMutex extendICUDataMutex = U_MUTEX_INITIALIZER;
+ static UMutex extendICUDataMutex;
umtx_lock(&extendICUDataMutex);
#endif
if(!umtx_loadAcquire(gHaveTriedToLoadCommonData)) {
@@ -1070,13 +1074,13 @@ static UDataMemory *doLoadFromCommonData(UBool isICUData, const char * /*pkgName
/* look up the data piece in the common data */
pHeader=pCommonData->vFuncs->Lookup(pCommonData, tocEntryName, &length, subErrorCode);
#ifdef UDATA_DEBUG
- fprintf(stderr, "%s: pHeader=%p - %s\n", tocEntryName, pHeader, u_errorName(*subErrorCode));
+ fprintf(stderr, "%s: pHeader=%p - %s\n", tocEntryName, (void*) pHeader, u_errorName(*subErrorCode));
#endif
if(pHeader!=NULL) {
pEntryData = checkDataItem(pHeader, isAcceptable, context, type, name, subErrorCode, pErrorCode);
#ifdef UDATA_DEBUG
- fprintf(stderr, "pEntryData=%p\n", pEntryData);
+ fprintf(stderr, "pEntryData=%p\n", (void*) pEntryData);
#endif
if (U_FAILURE(*pErrorCode)) {
return NULL;
@@ -1168,6 +1172,9 @@ doOpenChoice(const char *path, const char *type, const char *name,
UBool isICUData = FALSE;
+ FileTracer::traceOpen(path, type, name);
+
+
/* Is this path ICU data? */
if(path == NULL ||
!strcmp(path, U_ICUDATA_ALIAS) || /* "ICUDATA" */
@@ -1276,12 +1283,12 @@ doOpenChoice(const char *path, const char *type, const char *name,
fprintf(stderr, " tocEntryPath = %s\n", tocEntryName.data());
#endif
-#if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP Platform does not support dll icu data at this time
+#if !defined(ICU_DATA_DIR_WINDOWS)
if(path == NULL) {
path = COMMON_DATA_NAME; /* "icudt26e" */
}
#else
- // Windows UWP expects only a single data file.
+ // When using the Windows system data, we expects only a single data file.
path = COMMON_DATA_NAME; /* "icudt26e" */
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/uhash.cpp b/Build/source/libs/icu/icu-src/source/common/uhash.cpp
index 239997d05d7..86311ceb0b2 100644
--- a/Build/source/libs/icu/icu-src/source/common/uhash.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uhash.cpp
@@ -119,13 +119,14 @@ static const float RESIZE_POLICY_RATIO_TABLE[6] = {
/* This macro expects a UHashTok.pointer as its keypointer and
valuepointer parameters */
-#define HASH_DELETE_KEY_VALUE(hash, keypointer, valuepointer) \
- if (hash->keyDeleter != NULL && keypointer != NULL) { \
- (*hash->keyDeleter)(keypointer); \
- } \
- if (hash->valueDeleter != NULL && valuepointer != NULL) { \
- (*hash->valueDeleter)(valuepointer); \
- }
+#define HASH_DELETE_KEY_VALUE(hash, keypointer, valuepointer) UPRV_BLOCK_MACRO_BEGIN { \
+ if (hash->keyDeleter != NULL && keypointer != NULL) { \
+ (*hash->keyDeleter)(keypointer); \
+ } \
+ if (hash->valueDeleter != NULL && valuepointer != NULL) { \
+ (*hash->valueDeleter)(valuepointer); \
+ } \
+} UPRV_BLOCK_MACRO_END
/*
* Constants for hinting whether a key or value is an integer
@@ -376,8 +377,7 @@ _uhash_find(const UHashtable *hash, UHashTok key,
* WILL NEVER HAPPEN as long as uhash_put() makes sure that
* count is always < length.
*/
- U_ASSERT(FALSE);
- return NULL; /* Never happens if uhash_put() behaves */
+ UPRV_UNREACHABLE;
}
return &(elements[theIndex]);
}
diff --git a/Build/source/libs/icu/icu-src/source/common/uidna.cpp b/Build/source/libs/icu/icu-src/source/common/uidna.cpp
index 7cc97a93a01..ac2f9c3c8cd 100644
--- a/Build/source/libs/icu/icu-src/source/common/uidna.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uidna.cpp
@@ -57,18 +57,16 @@ toASCIILower(UChar ch){
inline static UBool
startsWithPrefix(const UChar* src , int32_t srcLength){
- UBool startsWithPrefix = TRUE;
-
if(srcLength < ACE_PREFIX_LENGTH){
return FALSE;
}
for(int8_t i=0; i< ACE_PREFIX_LENGTH; i++){
if(toASCIILower(src[i]) != ACE_PREFIX[i]){
- startsWithPrefix = FALSE;
+ return FALSE;
}
}
- return startsWithPrefix;
+ return TRUE;
}
@@ -441,6 +439,7 @@ _internal_toUnicode(const UChar* src, int32_t srcLength,
for(int32_t j=0; j<srcLength; j++){
if(src[j]> 0x7f){
srcIsASCII = FALSE;
+ break;
}/*else if(isLDHChar(src[j])==FALSE){
// here we do not assemble surrogates
// since we know that LDH code points
diff --git a/Build/source/libs/icu/icu-src/source/common/uinvchar.cpp b/Build/source/libs/icu/icu-src/source/common/uinvchar.cpp
index a0fd9dfbb1c..05bcf10df48 100644
--- a/Build/source/libs/icu/icu-src/source/common/uinvchar.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uinvchar.cpp
@@ -446,6 +446,13 @@ uprv_copyEbcdic(const UDataSwapper *ds,
return length;
}
+U_CFUNC UBool
+uprv_isEbcdicAtSign(char c) {
+ static const uint8_t ebcdicAtSigns[] = {
+ 0x7C, 0x44, 0x66, 0x80, 0xAC, 0xAE, 0xAF, 0xB5, 0xEC, 0xEF, 0x00 };
+ return c != 0 && uprv_strchr((const char *)ebcdicAtSigns, c) != nullptr;
+}
+
/* compare invariant strings; variant characters compare less than others and unlike each other */
U_CFUNC int32_t
uprv_compareInvAscii(const UDataSwapper *ds,
@@ -563,6 +570,11 @@ uprv_compareInvEbcdicAsAscii(const char *s1, const char *s2) {
}
U_CAPI char U_EXPORT2
+uprv_ebcdicToAscii(char c) {
+ return (char)asciiFromEbcdic[(uint8_t)c];
+}
+
+U_CAPI char U_EXPORT2
uprv_ebcdicToLowercaseAscii(char c) {
return (char)lowercaseAsciiFromEbcdic[(uint8_t)c];
}
diff --git a/Build/source/libs/icu/icu-src/source/common/uinvchar.h b/Build/source/libs/icu/icu-src/source/common/uinvchar.h
index 56dddfa8fde..a43cfcd9828 100644
--- a/Build/source/libs/icu/icu-src/source/common/uinvchar.h
+++ b/Build/source/libs/icu/icu-src/source/common/uinvchar.h
@@ -68,6 +68,75 @@ uprv_isInvariantUString(const UChar *s, int32_t length);
# error Unknown charset family!
#endif
+#ifdef __cplusplus
+
+U_NAMESPACE_BEGIN
+
+/**
+ * Like U_UPPER_ORDINAL(x) but with validation.
+ * Returns 0..25 for A..Z else a value outside 0..25.
+ */
+inline int32_t uprv_upperOrdinal(int32_t c) {
+#if U_CHARSET_FAMILY==U_ASCII_FAMILY
+ return c - 'A';
+#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY
+ // EBCDIC: A-Z (26 letters) is split into three ranges A-I (9 letters), J-R (9), S-Z (8).
+ // https://en.wikipedia.org/wiki/EBCDIC_037#Codepage_layout
+ if (c <= 'I') { return c - 'A'; } // A-I --> 0-8
+ if (c < 'J') { return -1; }
+ if (c <= 'R') { return c - 'J' + 9; } // J-R --> 9..17
+ if (c < 'S') { return -1; }
+ return c - 'S' + 18; // S-Z --> 18..25
+#else
+# error Unknown charset family!
+#endif
+}
+
+// Like U_UPPER_ORDINAL(x) but for lowercase and with validation.
+// Returns 0..25 for a..z else a value outside 0..25.
+inline int32_t uprv_lowerOrdinal(int32_t c) {
+#if U_CHARSET_FAMILY==U_ASCII_FAMILY
+ return c - 'a';
+#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY
+ // EBCDIC: a-z (26 letters) is split into three ranges a-i (9 letters), j-r (9), s-z (8).
+ // https://en.wikipedia.org/wiki/EBCDIC_037#Codepage_layout
+ if (c <= 'i') { return c - 'a'; } // a-i --> 0-8
+ if (c < 'j') { return -1; }
+ if (c <= 'r') { return c - 'j' + 9; } // j-r --> 9..17
+ if (c < 's') { return -1; }
+ return c - 's' + 18; // s-z --> 18..25
+#else
+# error Unknown charset family!
+#endif
+}
+
+U_NAMESPACE_END
+
+#endif
+
+/**
+ * Returns true if c == '@' is possible.
+ * The @ sign is variant, and the @ sign used on one
+ * EBCDIC machine won't be compiled the same way on other EBCDIC based machines.
+ * @internal
+ */
+U_CFUNC UBool
+uprv_isEbcdicAtSign(char c);
+
+/**
+ * \def uprv_isAtSign
+ * Returns true if c == '@' is possible.
+ * For ASCII, checks for exactly '@'. For EBCDIC, calls uprv_isEbcdicAtSign().
+ * @internal
+ */
+#if U_CHARSET_FAMILY==U_ASCII_FAMILY
+# define uprv_isAtSign(c) ((c)=='@')
+#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY
+# define uprv_isAtSign(c) uprv_isEbcdicAtSign(c)
+#else
+# error Unknown charset family!
+#endif
+
/**
* Compare two EBCDIC invariant-character strings in ASCII order.
* @internal
@@ -89,6 +158,26 @@ uprv_compareInvEbcdicAsAscii(const char *s1, const char *s2);
#endif
/**
+ * Converts an EBCDIC invariant character to ASCII.
+ * @internal
+ */
+U_INTERNAL char U_EXPORT2
+uprv_ebcdicToAscii(char c);
+
+/**
+ * \def uprv_invCharToAscii
+ * Converts an invariant character to ASCII.
+ * @internal
+ */
+#if U_CHARSET_FAMILY==U_ASCII_FAMILY
+# define uprv_invCharToAscii(c) (c)
+#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY
+# define uprv_invCharToAscii(c) uprv_ebcdicToAscii(c)
+#else
+# error Unknown charset family!
+#endif
+
+/**
* Converts an EBCDIC invariant character to lowercase ASCII.
* @internal
*/
diff --git a/Build/source/libs/icu/icu-src/source/common/ulayout_props.h b/Build/source/libs/icu/icu-src/source/common/ulayout_props.h
new file mode 100644
index 00000000000..c0f028c7132
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/common/ulayout_props.h
@@ -0,0 +1,46 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+// ulayout_props.h
+// created: 2019feb12 Markus W. Scherer
+
+#ifndef __ULAYOUT_PROPS_H__
+#define __ULAYOUT_PROPS_H__
+
+#include "unicode/utypes.h"
+
+// file definitions ------------------------------------------------------------
+
+#define ULAYOUT_DATA_NAME "ulayout"
+#define ULAYOUT_DATA_TYPE "icu"
+
+// data format "Layo"
+#define ULAYOUT_FMT_0 0x4c
+#define ULAYOUT_FMT_1 0x61
+#define ULAYOUT_FMT_2 0x79
+#define ULAYOUT_FMT_3 0x6f
+
+// indexes into indexes[]
+enum {
+ // Element 0 stores the length of the indexes[] array.
+ ULAYOUT_IX_INDEXES_LENGTH,
+ // Elements 1..7 store the tops of consecutive code point tries.
+ // No trie is stored if the difference between two of these is less than 16.
+ ULAYOUT_IX_INPC_TRIE_TOP,
+ ULAYOUT_IX_INSC_TRIE_TOP,
+ ULAYOUT_IX_VO_TRIE_TOP,
+ ULAYOUT_IX_RESERVED_TOP,
+
+ ULAYOUT_IX_TRIES_TOP = 7,
+
+ ULAYOUT_IX_MAX_VALUES = 9,
+
+ // Length of indexes[]. Multiple of 4 to 16-align the tries.
+ ULAYOUT_IX_COUNT = 12
+};
+
+constexpr int32_t ULAYOUT_MAX_INPC_SHIFT = 24;
+constexpr int32_t ULAYOUT_MAX_INSC_SHIFT = 16;
+constexpr int32_t ULAYOUT_MAX_VO_SHIFT = 8;
+
+#endif // __ULAYOUT_PROPS_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/ulayout_props_data.h b/Build/source/libs/icu/icu-src/source/common/ulayout_props_data.h
deleted file mode 100644
index f42d15fc830..00000000000
--- a/Build/source/libs/icu/icu-src/source/common/ulayout_props_data.h
+++ /dev/null
@@ -1,722 +0,0 @@
-// © 2018 and later: Unicode, Inc. and others.
-// License & terms of use: http://www.unicode.org/copyright.html
-//
-// file name: ulayout_props_data.h
-//
-// machine-generated by: icu/tools/unicode/c/genprops/layoutpropsbuilder.cpp
-
-
-#ifdef INCLUDED_FROM_UPROPS_CPP
-
-static const int32_t maxInPCValue = 14;
-
-static const uint16_t inpc_trieIndex[765]={
-0,0x40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x80,0xc0,0xff,0x13f,0x17e,0x1be,0x17e,0x1fe,0x23e,0x27e,0x2bc,0x2fc,
-0x33c,0x37b,0x23e,0x3bb,0x3fb,0x439,0x477,0x4ad,0x4e1,0x521,0x531,0x571,0x599,0x5d9,0x619,0x656,
-0x2b7,0x2c6,0x2d2,0x2c6,0x2ed,0,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0,0x10,0x20,
-0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,
-0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0x80,0x90,0xa0,
-0xb0,0xc0,0xd0,0xe0,0xf0,0xff,0x10f,0x11f,0x12f,0x13f,0x14f,0x15f,0x16f,0x17e,0x18e,0x19e,
-0x1ae,0x1be,0x1ce,0x1de,0x1ee,0x17e,0x18e,0x19e,0x1ae,0x1fe,0x20e,0x21e,0x22e,0x23e,0x24e,0x25e,
-0x26e,0x27e,0x28e,0x29e,0x2ae,0x2bc,0x2cc,0x2dc,0x2ec,0x2fc,0x30c,0x31c,0x32c,0x33c,0x34c,0x35c,
-0x36c,0x37b,0x38b,0x39b,0x3ab,0x23e,0x24e,0x25e,0x26e,0x3bb,0x3cb,0x3db,0x3eb,0x3fb,0x40b,0x41b,
-0x42b,0x439,0x449,0x459,0x469,0x477,0x487,0x497,0x4a7,0x4ad,0x4bd,0x4cd,0x4dd,0x4e1,0x4f1,0x501,
-0x511,0x521,0x531,0x541,0x551,0x531,0x541,0x551,0x561,0x571,0x581,0x591,0x5a1,0x599,0x5a9,0x5b9,
-0x5c9,0x5d9,0x5e9,0x5f9,0x609,0x619,0x629,0x639,0x649,0x656,0x666,0x676,0x686,0,0,0x68b,
-0x69a,0,0x6a9,0x6b8,0x6c7,0x6d5,0x6e5,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0x6f3,0,0x6f3,
-0,0x701,0,0x701,0,0,0,0x70b,0x71b,0x729,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0x739,0x749,0,0,
-0,0,0,0,0,0x759,0x768,0,0,0,0x772,0,0,0,0x77e,0x78d,
-0x79b,0,0,0,0,0,0,0,0,0x7ab,0,0,0x7b7,0x7c7,0,0x7cc,
-0x52c,0x81,0,0x7dc,0,0,0,0x7ea,0x3fb,0,0,0x7fa,0x807,0,0,0,
-0,0,0,0,0,0,0x817,0x827,0x835,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0x2b3,0x83f,0,0x84c,0,0,0,0,
-0,0x101,0,0,0x858,0x864,0,0x874,0x882,0,0,0x892,0,0x8a0,0x3fb,0,
-0,0x80,0,0,0x8b0,0x8c0,0,0x2b9,0,0,0x8c7,0x8d6,0x8e3,0,0,0x8f1,
-0,0,0,0x901,0x2bd,0,0x911,0x151,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0x921,0,0x930,0,0,0x940,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0x950,0,0,0x958,0x966,0,0,0,
-0x81,0,0,0x976,0,0,0,0,0x52d,0,0x981,0x991,0x3cb,0,0,0x659,
-0x81,0,0,0x99e,0x9ae,0,0,0,0x9bb,0x9cb,0,0,0,0,0,0,
-0,0,0,0x71,0x9db,0,0xff,0,0,0x9e6,0x9f6,0x14f,0xa04,0x52b,0,0,
-0,0,0,0,0,0,0x99c,0xa14,0x16f,0,0,0,0,0,0xa24,0xa33,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0x2eb,0xa43,0xe3,
-0x214,0,0,0,0xa53,0x2be,0,0,0,0,0,0xa63,0xa73,0,0,0,
-0,0,0xa7b,0xa8b,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0xa97,0xaa6,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xab5,
-0,0,0xac2,0,0xad1,0,0,0xadd,0xae7,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x2eb,
-0xaf7,0,0,0,0,0,0xb07,0xb0f,0xb1e,0,0,0,0,0,0,0,
-0xb2d,0xb3c,0,0,0,0xb44,0xb54,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0xb61,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0x45,0x4d,0x4d,0x4d,0x5d,0x7d,0x9d,0xbd,0xdd,
-2,2,0xec,0x10a,0x129,0x149,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,0x169,0x188,2,2,2,2,2,2,2,2,
-2,2,0x1a8,2,2,0x1c8,0x1e6,0x203,0x221,0x23f,0x25f,0x27d,0x297
-};
-
-static const uint8_t inpc_trieData[2930]={
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-8,8,8,7,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,8,7,1,0,7,4,
-7,1,1,1,1,8,8,8,8,7,7,7,7,1,4,7,
-0,8,1,8,8,8,1,1,0,0,0,0,0,0,0,0,
-0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-8,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,1,0,7,4,7,
-1,1,1,1,0,0,4,4,0,0,5,5,1,0,0,0,
-0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,
-0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,8,
-8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,1,0,7,4,7,1,
-1,0,0,0,0,8,8,0,0,8,8,1,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,
-0,0,0,1,0,0,0,0,0,0,0,0,0,0,7,1,
-1,1,1,8,0,8,8,0xd,0,7,7,1,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,8,8,8,8,8,8,0,8,
-7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,1,0,7,8,7,1,
-1,1,1,0,0,4,0xb,0,0,5,0xc,1,0,0,0,0,
-0,0,0,0,8,0xd,0,0,0,0,0,0,0,0,0,0,
-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,7,7,8,7,7,0,
-0,0,4,4,4,0,5,5,5,8,0,0,0,0,0,0,
-0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,8,7,7,7,
-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,8,8,7,7,7,7,
-0,8,8,9,0,8,8,8,8,0,0,0,0,0,0,0,
-8,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0xd,7,7,7,7,
-0,8,0xd,0xd,0,0xd,0xd,8,8,0,0,0,0,0,0,0,
-7,7,0,0,0,0,0,0,0,0,0,0,0,1,1,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,8,8,7,7,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,8,8,0,7,7,7,1,1,0,4,
-4,4,0,5,5,5,8,0,0,0,0,0,0,0,0,0,
-7,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,8,0,0,0,0,7,7,7,8,
-8,1,0,1,0,7,4,0xb,4,5,0xc,5,7,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,
-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,7,8,7,7,8,8,8,8,1,1,1,0,0,0,0,
-0,0xe,0xe,0xe,0xe,0xe,7,0,8,8,8,8,8,8,8,8,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,7,8,7,7,8,8,8,8,1,1,0,8,1,0,0,
-0,0xe,0xe,0xe,0xe,0xe,0,0,0,8,8,8,8,8,8,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
-1,0,8,0,0,0,0,7,4,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,1,8,9,1,1,9,
-9,9,9,8,8,8,8,8,7,8,9,8,8,1,0,8,
-8,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,
-1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,0,0,0,0,0,0,1,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,7,7,8,8,1,4,8,8,8,8,
-8,1,7,0,8,7,0,1,1,0,0,0,0,0,0,7,
-7,1,1,0,0,0,0,1,1,0,7,7,7,0,0,7,
-7,7,7,7,7,7,0,0,8,8,8,8,0,0,0,0,
-0,0,0,0,0,0,0,1,7,4,8,8,7,7,7,7,
-7,7,1,0,7,0,0,0,0,0,0,0,0,0,0,7,
-7,7,8,0,0,8,1,1,0,0,0,0,0,0,0,0,
-0,0,0,8,1,0,0,0,0,0,0,0,0,0,0,0,
-0,7,8,8,8,8,1,1,1,0xb,0xc,5,4,4,4,5,
-5,8,7,7,8,8,8,8,8,8,8,0,8,0,0,0,
-0,0,0,0,0,0,8,0,0,8,8,1,7,7,0xd,0xd,
-8,8,7,7,7,0,0,0,0,7,7,1,7,7,7,7,
-7,7,1,8,1,0,0,0,0,7,7,7,7,7,0xe,0xe,
-0xe,7,7,0xe,7,7,7,7,7,0,0,0,0,0,0,0,
-7,7,0,0,0,0,0,0,0,8,1,4,7,8,0,0,
-0,0,0,4,1,7,8,8,8,1,1,1,1,0,7,8,
-7,7,8,8,8,8,1,1,8,1,7,4,4,4,8,8,
-8,8,8,8,8,8,8,8,0,0,1,8,8,8,8,7,
-0,0,0,0,0,0,0,0,0,0,0,8,7,8,8,1,
-1,1,3,9,0xa,4,4,5,5,8,0xd,7,0,0,0,0,
-0,0,0,0,0,0,0,8,1,8,8,8,0,7,1,1,
-8,1,4,7,8,8,7,0,1,1,0,0,0,0,0,0,
-8,7,8,8,7,7,7,8,7,8,0,0,0,0,7,7,
-7,4,4,0xb,7,7,1,8,8,8,8,4,4,8,1,0,
-0,0,0,0,0,0,0,8,8,8,0,6,1,1,1,1,
-1,8,8,1,1,1,1,8,7,6,6,6,6,6,6,6,
-0,0,0,0,1,0,0,0,0,8,0,0,7,0,0,0,
-0,0,0,0,0,8,0,0,0,0,8,0,0,0,0,7,
-7,1,8,7,0,0,0,0,0,0,0,0,7,7,7,7,
-7,7,7,7,7,7,7,7,1,8,0,0,0,0,0,0,
-0,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,
-8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,
-0,8,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
-0,0,0,0,0,0,0,1,1,1,8,1,1,1,1,8,
-0,0,0,8,7,7,8,8,1,1,4,4,8,7,7,2,
-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-8,8,8,8,1,8,4,8,1,7,4,1,1,0,0,0,
-0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,8,
-7,0,0,0,0,0,0,0,0,0,0,0,7,8,7,0,
-0,8,7,8,8,1,0xe,0xe,8,8,0xe,7,0xe,0xe,7,8,
-8,0,0,0,0,0,0,0,0,0,0,0,4,1,8,4,
-7,0,0,0,7,7,8,7,7,1,7,7,0,7,1,0,
-0,6,1,1,0,8,6,0,0,0,0,0,1,1,1,8,
-0,0,0,0,0,0,0,0,8,1,1,0,0,0,0,0,
-7,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,
-8,8,8,8,1,1,1,1,8,8,8,8,8,0,0,0,
-0,0,0,0,0,0,7,4,7,1,1,8,8,7,7,1,
-1,0,0,0,0,0,0,0,8,8,8,1,1,4,8,9,
-9,8,1,1,0,8,0,0,0,0,0,0,0,0,0,0,
-0,7,4,7,1,1,1,1,1,1,8,8,8,0xd,7,0,
-0,0,0,0,0,0,0,1,0,8,1,0,0,0,0,0,
-0,0,0,0,0,0,0,7,7,7,1,8,8,0xd,0xd,8,
-7,8,8,0,0,0,0,0,0,8,0,7,4,7,1,1,
-8,8,8,8,1,1,0,0,0,0,0,0,0,0,0,0,
-0,1,1,0,7,7,8,7,7,7,7,0,0,4,4,0,
-0,5,5,7,0,0,7,7,0,0,8,8,8,8,8,8,
-8,0,0,0,7,7,1,8,8,7,1,0,0,0,0,0,
-0,0,0,0,7,4,7,1,1,1,1,1,1,4,8,0xb,
-5,7,5,8,7,1,1,0,0,0,0,0,0,0,0,0,
-0,0,0,4,7,1,1,1,1,0,0,4,0xb,5,0xc,8,
-8,7,1,7,7,7,1,1,1,1,1,1,8,8,7,7,
-8,7,1,0,0,0,0,0,0,0,0,0,0,0,8,7,
-8,4,7,1,1,8,8,8,8,7,1,0,0,0,0,0,
-0,0,0,0,0,0,0,0,1,0,8,7,7,8,8,1,
-1,4,8,1,8,8,8,0,0,0,0,0,0,0,0,0,
-0,0,0,7,4,7,1,1,1,8,8,8,8,8,7,1,
-1,0,0,0,0,0,8,1,1,8,8,8,8,8,8,1,
-0,0,0,0,0,1,1,8,8,8,8,7,0,1,1,1,
-1,0,8,1,1,8,8,8,7,7,1,1,1,0,0,0,
-0,0,0,0,0,0,0,1,1,1,1,1,1,8,7,8,
-0,0,0,0,0,0,0,8,8,1,1,1,1,1,0,8,
-8,8,8,8,8,7,1,0,0,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,0,7,1,1,1,1,1,1,4,
-1,8,7,8,8,0,0,0,0,0,0,0,0,0,8,8,
-8,8,8,1,0,0,0,8,0,8,8,0,8,8,1,8,
-1,0,0,1,0,0,0,0,0,0,0,0,0,0,7,7,
-7,7,7,0,8,8,0,7,7,8,7,0,0,0,0,0,
-0,0,0,0,8,1,4,7,0,0,0,0,0,0,0,0,
-0,0
-};
-
-static const UCPTrie inpc_trie={
- inpc_trieIndex,
- { inpc_trieData },
- 765, 2930,
- 0x12000, 0x12,
- 1, 2,
- 0, 0,
- 0x2, 0x0,
- 0x0,
-};
-
-static const int32_t maxInSCValue = 35;
-
-static const uint16_t insc_trieIndex[834]={
-0,0x40,0x60,0x94,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
-0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
-0x40,0x40,0x40,0x40,0xd4,0x112,0x152,0x190,0x1cf,0x20d,0x24c,0x28a,0x2ca,0x308,0x346,0x384,
-0x3c4,0x402,0x441,0x47f,0x4bf,0x4fd,0x53d,0x57d,0x5bc,0x5fc,0x63b,0x67b,0x69b,0x6db,0x71b,0x758,
-0x2f8,0x30b,0x317,0x30b,0x332,0,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x60,0x70,0x80,
-0x90,0x94,0xa4,0xb4,0xc4,0x40,0x50,0x60,0x70,0x40,0x50,0x60,0x70,0x40,0x50,0x60,
-0x70,0x40,0x50,0x60,0x70,0x40,0x50,0x60,0x70,0x40,0x50,0x60,0x70,0x40,0x50,0x60,
-0x70,0x40,0x50,0x60,0x70,0xd4,0xe4,0xf4,0x104,0x112,0x122,0x132,0x142,0x152,0x162,0x172,
-0x182,0x190,0x1a0,0x1b0,0x1c0,0x1cf,0x1df,0x1ef,0x1ff,0x20d,0x21d,0x22d,0x23d,0x24c,0x25c,0x26c,
-0x27c,0x28a,0x29a,0x2aa,0x2ba,0x2ca,0x2da,0x2ea,0x2fa,0x308,0x318,0x328,0x338,0x346,0x356,0x366,
-0x376,0x384,0x394,0x3a4,0x3b4,0x3c4,0x3d4,0x3e4,0x3f4,0x402,0x412,0x422,0x432,0x441,0x451,0x461,
-0x471,0x47f,0x48f,0x49f,0x4af,0x4bf,0x4cf,0x4df,0x4ef,0x4fd,0x50d,0x51d,0x52d,0x53d,0x54d,0x55d,
-0x56d,0x57d,0x58d,0x59d,0x5ad,0x5bc,0x5cc,0x5dc,0x5ec,0x5fc,0x60c,0x61c,0x62c,0x63b,0x64b,0x65b,
-0x66b,0x67b,0x68b,0x69b,0x6ab,0x69b,0x6ab,0x6bb,0x6cb,0x6db,0x6eb,0x6fb,0x70b,0x71b,0x72b,0x73b,
-0x74b,0x758,0x768,0x778,0x788,0xe9,0xe9,0x798,0x7a3,0x7b3,0x7c3,0x7d2,0x7e1,0x7ef,0x7ff,0x40,
-0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
-0x40,0x40,0x40,0x40,0x40,0x80f,0x81d,0xe6,0x81d,0xe6,0x82d,0x80f,0x83d,0xe9,0xe9,0x84d,
-0x859,0x863,0x872,0x30,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
-0x40,0x40,0x40,0x40,0x882,0x16c,0x892,0x8a2,0x22d,0xe9,0x8b2,0x8c2,0xe9,0xe9,0x374,0x8d2,
-0x8e1,0x30,0x40,0x40,0xe9,0x8f1,0xe9,0xe9,0x901,0x90e,0x91e,0x92a,0x30,0x30,0x40,0x40,
-0x40,0x40,0x40,0x40,0x93a,0xe6,0xe9,0x94a,0x956,0x30,0x40,0x40,0x966,0xe9,0x975,0x985,
-0xe9,0xe9,0x995,0x9a5,0xe9,0xe9,0x9b5,0x9c2,0x9d2,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
-0x40,0x9e2,0x9f0,0x9fe,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
-0x40,0x40,0x40,0xa08,0xa14,0xa24,0x40,0x40,0x40,0x40,0x40,0x75a,0xa32,0x40,0x40,0x40,
-0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
-0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x74,0x40,0x40,0x40,0xa42,0xe9,0xa4f,
-0x40,0xe9,0xa5f,0xa6d,0xa7c,0xd6,0xe7,0xe9,0xa8c,0xa98,0x30,0xaa8,0xab6,0xac6,0xe9,0xad4,
-0xe9,0xae4,0xaf3,0x40,0x40,0xb03,0xe9,0xe9,0xb12,0x297,0x30,0xb22,0xb32,0xe3,0xe9,0x889,
-0xb42,0xb52,0x30,0xe9,0xb61,0xe9,0xe9,0xe9,0xb71,0xb81,0x40,0xb91,0xba1,0x40,0x40,0x40,
-0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xbb1,0xbc1,0xbce,0x30,0xbde,0xbee,0xe9,
-0xbf8,0x31,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
-0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xc08,0xe6,0xe9,
-0x88a,0xc18,0xc26,0xc30,0xc40,0xc50,0xe9,0xe9,0xc60,0x40,0x40,0x40,0x40,0xc70,0xe9,0x88b,
-0xc80,0xc90,0xca0,0xe9,0xcad,0xd5,0xe8,0xe9,0xcbd,0xccd,0x30,0x6ba,0x35,0xe1,0x3eb,0x886,
-0xcdd,0x40,0x40,0x40,0x40,0xced,0x16d,0xcfc,0xdf,0xe9,0xd0c,0xd1c,0x30,0xd2c,0x162,0x172,
-0xd3c,0x308,0xd4c,0xd5c,0x9ed,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xdb,0xe9,0xe9,
-0xd6c,0xd7a,0xd8a,0x40,0x40,0xd99,0xe9,0xe9,0x91f,0xda9,0x30,0x40,0x40,0x40,0x40,0x40,
-0x40,0x40,0x40,0x40,0x40,0xdb,0xe9,0xff,0xdb9,0xdc9,0xdd1,0x40,0x40,0xdb,0xe9,0xe9,
-0xde1,0xdf1,0x30,0x40,0x40,0xdf,0xe9,0xe01,0xe0e,0x30,0x40,0x40,0x40,0xe9,0xe1e,0xe2e,
-0xe3e,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xdf,0xe9,0x886,
-0xe4e,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
-0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xe5e,0xe9,0xe9,
-0xe6b,0xe7b,0xe8b,0xe9,0xe9,0xe97,0xea1,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
-0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xeb1,0xe9,0xff,
-0xec1,0xed1,0x6bb,0xee1,0x555,0xe9,0xeef,0x72b,0xeff,0x40,0x40,0x40,0x40,0xf0f,0xe9,0xe9,
-0xf1e,0xf2e,0x30,0xf3e,0xe9,0xf4a,0xf57,0x30,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
-0x40,0x40,0x40,0x40,0x40,0x40,0xe9,0xf67,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
-0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x45,0x55,0x55,0x55,0x65,0x85,0xa5,0xc5,
-0xe5,4,4,0xf5,0x114,0x134,0x154,4,0x174,4,0x17d,4,4,4,4,4,
-4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
-4,4,4,4,4,4,4,4,4,4,4,0x19d,0x1bd,4,4,4,
-4,4,4,4,4,4,4,0x1dd,4,4,0x1fd,0x21d,0x23d,0x25d,0x27d,0x29d,
-0x2bd,0x2d8
-};
-
-static const uint8_t insc_trieData[3960]={
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0xc,0,0,
-0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0xc,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0x1c,0x1c,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0xc,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,2,2,2,0x20,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,
-0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x22,0x22,
-0x17,1,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,
-0x22,0x22,0,4,4,0,0,0x22,0x22,0x22,5,5,5,5,5,5,
-5,5,0x23,0x23,0x22,0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
-0x18,0x18,0,0,0x23,0x23,0x23,0x23,0x23,0x23,5,5,5,5,5,5,
-5,5,0xc,2,2,0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,
-0,0x23,0x23,0,0,0x23,0x23,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,
-5,5,5,0,5,0,0,0,5,5,5,5,0,0,0x17,1,
-0x22,0x22,0x22,0x22,0x22,0,0,0x22,0x22,0,0,0x22,0x22,0x1f,6,0,
-0,0,0,0,0,0,0,0x22,0,0,0,0,5,5,0,5,
-0x23,0x23,0x22,0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
-5,5,0,0,0,0,0,0,0,0,0,0,2,0,0x1c,0,
-2,2,0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0,0,0,0,0x23,0x23,
-0,0,0x23,0x23,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,
-0,5,5,0,5,5,0,5,5,0,0,0x17,0,0x22,0x22,0x22,
-0,0,0,0,0x22,0x22,0,0,0x22,0x22,0x1f,0,0,0,4,0,
-0,0,0,0,0,0,5,5,5,5,0,5,0,0,0,0,
-0,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,2,0x12,0xc,
-0xc,0,0xb,0,0,0,0,0,0,0,0,0,0,2,2,0x20,
-0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0x23,0x23,0x23,0,0x23,
-0x23,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,0,5,5,5,5,5,5,5,0,5,5,
-0,5,5,5,5,5,0,0,0x17,1,0x22,0x22,0x22,0x22,0x22,0x22,
-0,0x22,0x22,0x22,0,0x22,0x22,0x1f,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0x23,0x23,0x22,0x22,0,0,
-0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,0,0,0,
-0,0,0,5,4,4,4,0x17,0x17,0x17,0,2,2,0x20,0,0x23,
-0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0,0x23,0x23,0,0,0x23,0x23,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,0,5,5,5,5,5,5,5,0,5,5,0,5,
-5,5,5,5,0,0,0x17,1,0x22,0x22,0x22,0x22,0x22,0,0,0x22,
-0x22,0,0,0x22,0x22,0x1f,0,0,0,0,0,0,0,0,0x22,0x22,
-0,0,0,0,5,5,0,5,0x23,0x23,0x22,0x22,0,0,0x18,0x18,
-0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,5,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,2,0x15,0,0x23,0x23,0x23,0x23,0x23,
-0x23,0,0,0,0x23,0x23,0x23,0,0x23,0x23,0x23,5,0,0,0,5,
-5,0,5,0,5,5,0,0,0,5,5,0,0,0,5,5,
-5,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
-0,0,0,0,0x22,0x22,0x22,0,0,0,0x22,0x22,0x22,0,0x22,0x22,
-0x22,0x1f,0,0,0,0,0,0,0,0,0,0x22,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0x18,0x18,0x18,0x18,0x18,0x18,
-0x18,0x18,0x18,0x18,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,2,2,2,0x20,2,0x23,0x23,0x23,0x23,0x23,0x23,0x23,
-0x23,0,0x23,0x23,0x23,0,0x23,0x23,0x23,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,
-0,1,0x22,0x22,0x22,0x22,0x22,0,0x22,0x22,0x22,0,0x22,0x22,0x22,0x1f,
-0,0,0,0,0,0,0,0x22,0x22,0,5,5,5,0,0,0,
-0,0,0x23,0x23,0x22,0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
-0x18,0x18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,2,2,0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0x23,
-0x23,0x23,0,0x23,0x23,0x23,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,
-5,5,5,5,5,0,5,5,5,5,5,0,0,0x17,1,0x22,
-0x22,0x22,0x22,0x22,0,0x22,0x22,0x22,0,0x22,0x22,0x22,0x1f,0,0,0,
-0,0,0,0,0x22,0x22,0,0,0,0,0,0,0,5,0,0x23,
-0x23,0x22,0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,
-0x11,0x11,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
-2,2,0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0x23,0x23,0x23,
-0,0x23,0x23,0x23,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,0x1a,0x1a,1,0x22,0x22,0x22,
-0x22,0x22,0,0x22,0x22,0x22,0,0x22,0x22,0x22,0x1f,0xd,0,0,0,0,
-0,6,6,6,0x22,0,0,0,0,0,0,0,0x23,0x23,0x23,0x22,
-0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,
-0,0,0,0,0,0,0,6,6,6,6,6,6,0,0,2,
-0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,
-0x23,0x23,0x23,0x23,0,0,0,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,
-5,5,5,5,5,5,5,5,5,0,5,0,0,5,5,5,
-5,5,5,5,0,0,0,0x1f,0,0,0,0,0x22,0x22,0x22,0x22,
-0x22,0x22,0,0x22,0,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0,0,0,
-0,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0x22,
-0x22,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,0,0x22,0x22,0x22,0x22,
-0x22,0x22,0x22,0x22,0x22,0x22,0x1a,0,0,0,0,0,0x22,0x22,0x22,0x22,
-0x22,0x22,0,0x22,0x1e,0x1e,0x1e,0x1e,0xa,2,0x1a,0,0x18,0x18,0x18,0x18,
-0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,5,5,0,5,
-0,0,5,5,0,5,0,0,5,0,0,0,0,0,0,5,
-5,5,5,0,5,5,5,5,5,5,5,0,5,5,5,0,
-5,0,5,0,0,5,5,0,5,5,0,0x22,0x22,0x22,0x22,0x22,
-0x22,0x22,0x22,0x22,0x22,0,0x22,0xb,0xb,0,0,0x22,0x22,0x22,0x22,0x22,
-0,0,0,0x1e,0x1e,0x1e,0x1e,0,2,0,0,0x18,0x18,0x18,0x18,0x18,
-0x18,0x18,0x18,0x18,0x18,0,0,5,5,5,5,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0x18,0x18,0x18,0x18,0x18,
-0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,
-0x1c,0,0x1c,0,0x17,0,0,0,0,0,0,5,5,5,5,5,
-5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,5,5,5,5,5,5,0,0,0,0,0x22,0x22,0x22,0x22,
-0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,2,0x20,0x22,0x22,2,2,0x1a,
-1,0,0,8,8,8,8,8,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,
-0xf,0xf,0xf,0,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,
-0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,
-0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0,0,0,0,0,0,0x1c,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,5,0x23,0x23,0x23,0x23,0x23,0x23,0x23,
-0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x22,0x22,2,0x1e,0x20,0x13,0x1a,0xb,0xb,
-0xb,0xb,5,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0xc,0,
-0,0xc,0,5,5,0x23,0x23,0x23,0x23,0x22,0x22,0x22,0x22,5,5,5,
-5,0xb,0xb,5,0x22,0x1e,0x1e,5,5,0x22,0x22,0x1e,0x1e,0x1e,0x1e,0x1e,
-5,5,0x22,0x22,0x22,0x22,5,5,5,5,5,5,5,5,5,5,
-5,0xb,0x22,0x22,0x22,0x22,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,5,0x1e,0x18,
-0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1e,0x1e,0x22,0x22,0,0,0x23,
-0x23,0x23,5,5,5,5,5,5,5,5,5,5,0,5,5,0x22,
-0x22,0x1a,0,0,0,0,0,0,0,0,0,0,0,5,5,0x22,
-0x22,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0x22,
-0x22,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,
-0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0,0x22,
-0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,2,0x20,0x22,0x1b,0x1b,0x1c,0x10,
-0xa,0x1c,0x1c,0x1a,0x13,0x1c,0,0,0,0,0,0,0,0,1,0x1c,
-0,0,0xc,5,5,5,5,5,5,5,5,5,5,5,5,5,
-5,5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xf,0xf,0xf,0,0,
-0,0,7,7,2,7,7,7,7,7,7,7,0x22,0x1c,0,0,
-0,0,5,5,5,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,
-0,0,0x1d,0x1d,0x1d,0x1d,0x1d,0,0,0,0,0,0,0,0,0,
-0,0,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
-0x22,0x22,7,7,7,7,7,7,7,0x1e,0x1e,0,0,0,0,0,
-0,5,5,5,5,5,5,5,0x22,0x22,0x22,0x22,0x22,0,0,0,
-0,5,5,5,5,5,5,5,5,5,5,5,5,5,0x23,0x23,
-0x23,5,5,0xb,0xb,0xf,7,7,9,0xf,0xf,0xf,0xf,0,0x13,0x22,
-0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,2,0x1e,
-0x1e,0x1e,0x1e,0x1e,0x1a,0x1c,0x1c,0,0,0x1c,2,2,2,0x10,0x20,0x23,
-0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,5,5,5,5,0x17,0x22,
-0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,5,5,5,5,5,
-5,5,0,0,0,0,2,0x10,0x20,0x23,0x23,0x23,0x23,0x23,0x23,0x23,
-5,5,5,5,5,5,0xf,0xf,0xf,0x22,0x22,0x22,0x22,0x22,0x22,0x1a,
-0x13,0xf,0xf,5,5,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,1,
-5,5,5,7,7,5,5,5,5,0x23,0x23,0x17,0x22,0x22,0x22,0x22,
-0x22,0x22,0x22,0x22,0x22,7,7,0x1a,0x1a,0,0,0,0,0,0,0,
-0,0,0,0,0,5,5,5,5,0xf,0xf,0x22,0x22,0x22,0x22,0x22,
-0x22,0x22,7,7,7,7,2,2,0x1c,0x17,0,0,0,0,0,0,
-0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,5,
-5,5,4,4,4,0,4,4,4,4,4,4,4,4,4,4,
-4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0x20,0x20,4,0x11,0x11,4,4,4,0,0,0,0,0,0,0,0,
-0,0,0,0x1c,0,0,0,0,0,0,0,0,0,0,0,0,
-0x16,0x14,0,0,0xc,0xc,0xc,0xc,0xc,0,0,0,0,0,0,0,
-0,0,0,0,0x1c,0x1c,0x1c,0,0,0,0,0,0,0,0,0,
-0,0,0x23,0x23,0,0x23,0x23,0x23,0x1a,5,5,5,5,2,5,5,
-5,5,0x22,0x22,0x22,0x22,0x22,0,0,0,0,0,0,0,0,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,0x21,0x21,5,
-5,5,5,0x21,0xf,0xf,5,5,5,5,5,5,5,0xf,5,2,
-0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
-0xb,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,2,0,0,
-0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,
-4,4,4,4,4,4,4,4,2,2,0,0,0,0,0,0,
-0,0,0,0,0x23,0x22,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
-5,5,5,5,5,5,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x1e,
-0x1e,0x1e,0,0,5,5,5,5,5,5,5,0x22,0x22,0x22,0x22,0x22,
-0x22,0x22,0x22,7,7,7,0x1a,0,0,0,0,0,0,0,0,0,
-0,0,0,2,2,0x10,0x20,0x23,0x23,0x23,0x23,0x23,5,5,5,0x23,
-0x23,0x23,5,5,5,0x17,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xf,
-0xb,0xb,5,5,5,5,5,0x22,0,5,5,5,5,5,5,5,
-5,5,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,5,5,5,5,
-5,0,0x22,0x22,0x22,0xb,0xb,0xb,0xb,0,0,0,0,0,0,0,
-0,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
-0,0,5,5,5,0xc,0xc,0xc,0,0,0,5,0x1e,0x1e,0x1e,5,
-5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
-0x1e,0x1d,0x1e,0x1d,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0x23,0x23,5,5,5,5,5,5,5,5,5,0x22,0x22,0x22,0x22,
-0x22,0,0,0,0,0,0x20,0x13,0,0,0,0,0,0,0,0,
-0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x23,
-0x23,5,0x23,5,5,5,5,5,5,5,5,5,7,7,7,7,
-7,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0,0x1e,0x1a,0,0,5,0x22,
-0x22,0x22,0,0x22,0x22,0,0,0,0,0,0x22,0x22,2,0x20,5,5,
-5,5,0,5,5,5,0,5,5,5,5,5,5,5,0,0,
-0x17,0x17,0x17,0,0,0,0,0x13,2,2,0x20,0x11,0x11,0x23,0x23,0x23,
-0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,0,
-0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,
-3,3,3,3,3,3,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x19,
-2,2,0x20,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,5,5,5,
-0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,0x17,0,0,0,0,0,
-2,2,0x20,0x23,0x23,0x23,0x23,5,5,5,5,5,5,5,5,5,
-0x22,0x22,0x22,0x13,0x1a,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
-0,0,0,0,5,0x22,0x22,0,0,0,0,0,0,0,0,0,
-0x21,0x21,0x21,0x21,0x21,5,5,5,5,5,5,5,5,5,5,5,
-0x17,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,
-0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,1,0xe,
-0xe,0,0,0,0,0,0x1c,0x17,0x22,0x22,0,0,0,0x22,0x22,0x22,
-0x22,2,0x1f,0x17,0x12,0,0,0,0,0,0,4,0,0x23,0x23,0x23,
-0x23,5,5,5,0,5,0,5,5,5,5,0,5,5,5,5,
-5,5,5,5,5,0,0,0,0,0,0,0,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,2,0x22,0x22,0x22,0x22,
-0x22,0x22,0x22,0x22,0x22,0x17,0x1a,0,0,0,0,0,2,2,2,0x20,
-0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0,0x23,5,0,5,5,
-0,5,5,5,5,5,0,0x17,0x17,1,0x22,0x22,0,0,0,0,
-0,0,0,0x22,0,0,0,0,0,0,2,2,0x23,0x23,0x22,0x22,
-0,0,4,4,4,4,4,4,4,0,0,0,5,5,5,5,
-5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,2,2,0x20,
-0x17,1,0,0,0,0,0,0,0,0,0x18,0x18,0x18,0x18,0x18,0x18,
-0x18,0x18,0x18,0x18,0,0,0,0,0x1c,0,0x23,0x23,0x23,0x23,0x23,0x23,
-0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,5,2,0x20,0x1f,0x17,1,0,0,
-0,0,0,0,0,0,0,0,0,0x22,0x22,0x22,0x22,0x22,0x22,0,
-0,0x22,0x22,0x22,0x22,2,2,0x20,0x1f,0x17,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0x23,0x23,0x23,0x23,0x22,0x22,0,
-0,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,2,0x20,
-0x1f,0x22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,5,5,5,5,5,5,5,5,5,5,5,2,0x20,0x22,0x22,
-0x22,0x22,0x22,0x22,0x1f,0x17,0,0,0,0,0,0,0,0,5,5,
-5,5,5,5,5,5,5,5,5,0,0,0xb,0xb,0xb,0x22,0x22,
-0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1a,0,0,0,0,0x18,0x18,
-0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,0,0x22,0x22,
-0x22,0x22,0x22,0x22,0x22,2,0x20,0x1f,0x17,0,0,0,0,0,0x23,0x22,
-0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,5,5,5,5,5,0x1c,0x1a,
-2,2,2,2,0x20,0xe,0xb,0xb,0xb,0xb,0xc,0,0,0,0,0,
-0xc,0,0x13,0,0,0,0,0,0,0,0,0x23,0x22,0x22,0x22,0x22,
-0x22,0x22,0x22,0x22,0x22,0x22,0x22,5,5,5,5,0,0,0xe,0xe,0xe,
-0xe,7,7,7,7,7,7,2,0x20,0x12,0x13,0,0,0,1,0,
-0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0x23,0x23,0x23,0x23,5,
-5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0,0x22,0x22,0x22,0x22,2,2,0x20,
-0x1f,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,
-0,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0x22,
-0x22,0x22,0x22,0x22,2,2,0,0,0,0,0,0,0,0,0,0x23,
-0x23,0x23,0x23,0x23,0x23,0x23,0,0x23,0x23,0,0x23,5,5,5,5,0x22,
-0x22,0x22,0x22,0x22,0x22,0,0,0,0x22,0,0x22,0x22,0,0x22,2,0x20,
-0x17,0x22,0x1a,0x13,0xd,0xb,0,0,0,0,0,0,0,0,0x23,0x23,
-0x23,0x23,0x23,0x23,0,0x23,0x23,0,0x23,0x23,5,5,5,5,5,5,
-5,5,5,5,0x22,0x22,0x22,0x22,0x22,0,0x22,0x22,2,0x20,0x13,0,
-0,0,0,0,0,0,0,5,5,0xc,0x22,0x22,0x22,0x22,0,0,
-0,0,0,0,0,0,0,0
-};
-
-static const UCPTrie insc_trie={
- insc_trieIndex,
- { insc_trieData },
- 834, 3960,
- 0x12000, 0x12,
- 1, 2,
- 0, 0,
- 0x4, 0x40,
- 0x0,
-};
-
-static const int32_t maxVoValue = 3;
-
-static const uint16_t vo_trieIndex[1100]={
-0,0x40,0x59,0x98,0,0,0,0,0,0,0,0xd0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0x33b,0x355,0x363,0x379,0x399,0x3b7,0x3d2,0x3ec,0x355,0x355,0x355,0x40c,0x355,0x355,0x355,0x40c,
-0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,
-0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,
-0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x355,0x355,0x355,0x40c,
-0x355,0x355,0x355,0x40c,0,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x59,0x69,0x79,0x89,
-0x98,0xa8,0xb8,0xc8,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,
-0,0x10,0x20,0x30,0xd0,0xe0,0xf0,0x100,0,0x10,0x20,0x30,0,0x10,0x20,0x30,
-0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,
-0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
-0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x10f,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
-0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
-0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0x110,0x110,0x110,0x110,0x110,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0xa9,0x96,0x11e,0x12c,0xae,0xaa,0,0,0,0,0,
-0,0x103,0x13c,0,0x14c,0x158,0x166,0x10b,0x175,0x110,0x110,0x110,0x184,0,0,0,
-0,0,0,0,0x72,0,0xf6,0,0,0,0,0,0,0,0,0,
-0,0,0,0x190,0x110,0x198,0,0,0,0,0x103,0x110,0x115,0,0xec,0x1a8,
-0x1b6,0x10e,0x110,0x110,0x1c6,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
-0x110,0x110,0,0,0,0,0,0,0,0,0,0,0x110,0x110,0x110,0x110,
-0x110,0x110,0x116,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
-0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x118,0x10a,0x110,0x1d2,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0x10e,0x110,0,0,
-0x116,0,0,0,0,0,0x108,0x110,0x1e2,0x114,0x110,0,0,0,0,0,
-0,0,0,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
-0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x1f1,0x1ff,0x110,0x20e,0x21d,
-0x110,0x22a,0x110,0x237,0x246,0x256,0x110,0x22a,0x110,0x237,0x261,0x110,0x110,0x26e,0x110,0x110,
-0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x27e,0x110,0x110,0x110,0x110,0x110,
-0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x27e,0x27e,0x27e,0x27e,0x27e,
-0x286,0x110,0x28e,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
-0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
-0x110,0x110,0x110,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0x110,0x110,0,0,0,0,0,
-0,0,0,0x110,0,0x110,0x117,0x29b,0x2aa,0,0,0,0,0,0,0,
-0,0,0x2ba,0x2c9,0x110,0x2d9,0x110,0x2e9,0x2f8,0,0,0,0,0,0,0,
-0x308,0x318,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0x110,0x110,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0x110,0x110,0x110,0x110,0x110,0x110,
-0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0,0,0,
-0,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
-0x110,0x110,0,0,0,0,0,0,0,0,0x328,0x110,0x110,0x110,0x110,0x110,
-0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
-0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x112,0x84,0x98,0xa8,0xa8,0xa8,
-0xa8,0xa8,0xa8,0xc8,0xc,0xe8,0x100,0x115,0xc,0xc,0xc,0x134,0x153,0x172,0x191,0xc,
-0x1ab,0xc,0x1cb,0x1eb,0x20b,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,
-0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,
-0x223,0x223,0x223,0x223,0x223,0xfb,0xc,0x243,0xc,0x223,0x223,0x223,0x223,0x223,0x223,0x223,
-0x223,0x223,0x223,0x223,0x223,0xc,0xc,0xc,0xc,0x223,0x223,0x223,0x223,0x223,0x223,0x223,
-0x223,0x223,0x223,0x223,0x223,0x223,0xf8,0xc,0x262,0xc,0xc,0xc,0xc,0x282,0xc,0xc,
-0xc,0xc,0xc,0x29c,0xc,0xc,0xfd,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,
-0xc,0x223,0x223,0x2b9,0xc,0xc,0xc,0xc,0xc,0x223,0x100,0xc,0xc,0xc,0xc,0xc,
-0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x2bc,0x223,
-0x223,0x223,0x223,0x223,0x223,0x223,0x223,0xf8,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,
-0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x2da,0xf8,0xc,0xc,0xc,0xc,
-0xc,0xc,0xc,0xc,0x223,0x2fa,0xc,0xc,0x223,0xfd,0xc,0xc,0xc,0xc,0xc,0xc,
-0xc,0xc,0xc,0xc,0x223,0x31a,0x223,0x223,0xc8,0x2b5,0xc,0xc,0x223,0x223,0x223,0x223,
-0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,
-0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x31b,0xc,0xc,0xc,0xc,
-0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,
-0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc
-};
-
-static const uint8_t vo_trieData[828]={
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-3,0,3,0,0,0,0,3,0,0,3,0,0,0,0,0,
-0,0,0,0,0,3,3,3,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
-0,0,0,0,0,0,0,0,0,3,3,0,0,0,3,0,
-0,0,0,3,3,3,0,0,0,0,0,0,3,0,3,3,
-3,0,0,0,0,0,0,0,0,0,0,0,3,3,0,3,
-3,3,3,3,3,3,0,0,0,0,0,3,3,0,3,3,
-0,0,0,0,0,0,3,3,3,3,0,3,0,3,0,3,
-0,0,0,0,3,0,0,0,0,0,3,3,3,3,3,3,
-0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,0,
-3,3,3,3,3,3,3,3,0,0,0,0,3,3,3,3,
-3,1,1,3,0,0,0,0,3,3,3,3,3,3,3,3,
-3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,
-3,3,0,0,0,0,3,3,3,0,3,3,3,3,3,3,
-3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,
-0,0,3,3,0,3,3,3,3,3,3,3,3,3,3,3,
-3,3,2,2,3,3,3,3,3,1,1,1,1,1,1,1,
-1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,3,
-3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,
-2,3,2,3,2,3,2,3,3,3,3,3,3,2,3,3,
-3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,3,
-3,3,3,3,3,2,3,3,3,3,3,2,2,3,3,3,
-3,2,2,3,3,3,1,2,3,2,3,2,3,2,3,2,
-3,3,3,3,3,3,2,2,3,3,3,3,3,1,3,3,
-3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,
-2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,
-3,3,3,3,3,3,3,3,3,2,2,2,2,2,3,3,
-3,3,3,0,1,1,1,1,1,1,3,3,3,0,0,0,
-0,3,3,3,3,3,3,3,3,3,0,2,3,3,3,3,
-3,3,1,1,3,3,2,0,2,3,3,3,3,3,3,3,
-3,3,3,1,1,0,0,0,2,3,3,3,3,3,3,3,
-3,3,3,3,1,3,1,3,1,3,3,3,3,3,3,3,
-3,3,3,3,1,1,1,1,1,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,3,3,3,1,3,3,3,3,
-0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,
-3,0,0,0,3,3,0,0,2,2,3,3,3,3,3,3,
-3,3,3,3,3,3,3,3,0,0,0,0
-};
-
-static const UCPTrie vo_trie={
- vo_trieIndex,
- { vo_trieData },
- 1100, 828,
- 0x110000, 0x110,
- 1, 2,
- 0, 0,
- 0xc, 0x0,
- 0x0,
-};
-
-#endif // INCLUDED_FROM_UPROPS_CPP
diff --git a/Build/source/libs/icu/icu-src/source/common/uloc.cpp b/Build/source/libs/icu/icu-src/source/common/uloc.cpp
index 81b6e0f68ab..6a9bfcfbff5 100644
--- a/Build/source/libs/icu/icu-src/source/common/uloc.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uloc.cpp
@@ -148,7 +148,8 @@ static const char * const LANGUAGES[] = {
"mad", "maf", "mag", "mai", "mak", "man", "mas", "mde",
"mdf", "mdh", "mdr", "men", "mer", "mfe", "mg", "mga",
"mgh", "mgo", "mh", "mi", "mic", "min", "mis", "mk",
- "ml", "mn", "mnc", "mni", "moh", "mos", "mr", "mrj",
+ "ml", "mn", "mnc", "mni", "mo",
+ "moh", "mos", "mr", "mrj",
"ms", "mt", "mua", "mul", "mus", "mwl", "mwr", "mwv",
"my", "mye", "myv", "mzn",
"na", "nan", "nap", "naq", "nb", "nd", "nds", "ne",
@@ -264,7 +265,8 @@ static const char * const LANGUAGES_3[] = {
"mad", "maf", "mag", "mai", "mak", "man", "mas", "mde",
"mdf", "mdh", "mdr", "men", "mer", "mfe", "mlg", "mga",
"mgh", "mgo", "mah", "mri", "mic", "min", "mis", "mkd",
- "mal", "mon", "mnc", "mni", "moh", "mos", "mar", "mrj",
+ "mal", "mon", "mnc", "mni", "mol",
+ "moh", "mos", "mar", "mrj",
"msa", "mlt", "mua", "mul", "mus", "mwl", "mwr", "mwv",
"mya", "mye", "myv", "mzn",
"nau", "nan", "nap", "naq", "nob", "nde", "nds", "nep",
@@ -457,8 +459,6 @@ NULL
typedef struct CanonicalizationMap {
const char *id; /* input ID */
const char *canonicalID; /* canonicalized output ID */
- const char *keyword; /* keyword, or NULL if none */
- const char *value; /* keyword value, or NULL if kw==NULL */
} CanonicalizationMap;
/**
@@ -466,78 +466,31 @@ typedef struct CanonicalizationMap {
* different semantic kinds of transformations.
*/
static const CanonicalizationMap CANONICALIZE_MAP[] = {
- { "", "en_US_POSIX", NULL, NULL }, /* .NET name */
- { "c", "en_US_POSIX", NULL, NULL }, /* POSIX name */
- { "posix", "en_US_POSIX", NULL, NULL }, /* POSIX name (alias of C) */
- { "art_LOJBAN", "jbo", NULL, NULL }, /* registered name */
- { "az_AZ_CYRL", "az_Cyrl_AZ", NULL, NULL }, /* .NET name */
- { "az_AZ_LATN", "az_Latn_AZ", NULL, NULL }, /* .NET name */
- { "ca_ES_PREEURO", "ca_ES", "currency", "ESP" },
- { "de__PHONEBOOK", "de", "collation", "phonebook" }, /* Old ICU name */
- { "de_AT_PREEURO", "de_AT", "currency", "ATS" },
- { "de_DE_PREEURO", "de_DE", "currency", "DEM" },
- { "de_LU_PREEURO", "de_LU", "currency", "LUF" },
- { "el_GR_PREEURO", "el_GR", "currency", "GRD" },
- { "en_BE_PREEURO", "en_BE", "currency", "BEF" },
- { "en_IE_PREEURO", "en_IE", "currency", "IEP" },
- { "es__TRADITIONAL", "es", "collation", "traditional" }, /* Old ICU name */
- { "es_ES_PREEURO", "es_ES", "currency", "ESP" },
- { "eu_ES_PREEURO", "eu_ES", "currency", "ESP" },
- { "fi_FI_PREEURO", "fi_FI", "currency", "FIM" },
- { "fr_BE_PREEURO", "fr_BE", "currency", "BEF" },
- { "fr_FR_PREEURO", "fr_FR", "currency", "FRF" },
- { "fr_LU_PREEURO", "fr_LU", "currency", "LUF" },
- { "ga_IE_PREEURO", "ga_IE", "currency", "IEP" },
- { "gl_ES_PREEURO", "gl_ES", "currency", "ESP" },
- { "hi__DIRECT", "hi", "collation", "direct" }, /* Old ICU name */
- { "it_IT_PREEURO", "it_IT", "currency", "ITL" },
- { "ja_JP_TRADITIONAL", "ja_JP", "calendar", "japanese" }, /* Old ICU name */
- { "nb_NO_NY", "nn_NO", NULL, NULL }, /* "markus said this was ok" :-) */
- { "nl_BE_PREEURO", "nl_BE", "currency", "BEF" },
- { "nl_NL_PREEURO", "nl_NL", "currency", "NLG" },
- { "pt_PT_PREEURO", "pt_PT", "currency", "PTE" },
- { "sr_SP_CYRL", "sr_Cyrl_RS", NULL, NULL }, /* .NET name */
- { "sr_SP_LATN", "sr_Latn_RS", NULL, NULL }, /* .NET name */
- { "sr_YU_CYRILLIC", "sr_Cyrl_RS", NULL, NULL }, /* Linux name */
- { "th_TH_TRADITIONAL", "th_TH", "calendar", "buddhist" }, /* Old ICU name */
- { "uz_UZ_CYRILLIC", "uz_Cyrl_UZ", NULL, NULL }, /* Linux name */
- { "uz_UZ_CYRL", "uz_Cyrl_UZ", NULL, NULL }, /* .NET name */
- { "uz_UZ_LATN", "uz_Latn_UZ", NULL, NULL }, /* .NET name */
- { "zh_CHS", "zh_Hans", NULL, NULL }, /* .NET name */
- { "zh_CHT", "zh_Hant", NULL, NULL }, /* .NET name */
- { "zh_GAN", "gan", NULL, NULL }, /* registered name */
- { "zh_GUOYU", "zh", NULL, NULL }, /* registered name */
- { "zh_HAKKA", "hak", NULL, NULL }, /* registered name */
- { "zh_MIN_NAN", "nan", NULL, NULL }, /* registered name */
- { "zh_WUU", "wuu", NULL, NULL }, /* registered name */
- { "zh_XIANG", "hsn", NULL, NULL }, /* registered name */
- { "zh_YUE", "yue", NULL, NULL }, /* registered name */
-};
-
-typedef struct VariantMap {
- const char *variant; /* input ID */
- const char *keyword; /* keyword, or NULL if none */
- const char *value; /* keyword value, or NULL if kw==NULL */
-} VariantMap;
-
-static const VariantMap VARIANT_MAP[] = {
- { "EURO", "currency", "EUR" },
- { "PINYIN", "collation", "pinyin" }, /* Solaris variant */
- { "STROKE", "collation", "stroke" } /* Solaris variant */
+ { "art_LOJBAN", "jbo" }, /* registered name */
+ { "hy__AREVELA", "hy" }, /* Registered IANA variant */
+ { "hy__AREVMDA", "hyw" }, /* Registered IANA variant */
+ { "zh_GAN", "gan" }, /* registered name */
+ { "zh_GUOYU", "zh" }, /* registered name */
+ { "zh_HAKKA", "hak" }, /* registered name */
+ { "zh_MIN_NAN", "nan" }, /* registered name */
+ { "zh_WUU", "wuu" }, /* registered name */
+ { "zh_XIANG", "hsn" }, /* registered name */
+ { "zh_YUE", "yue" }, /* registered name */
};
/* ### BCP47 Conversion *******************************************/
/* Test if the locale id has BCP47 u extension and does not have '@' */
#define _hasBCP47Extension(id) (id && uprv_strstr(id, "@") == NULL && getShortestSubtagLength(localeID) == 1)
/* Converts the BCP47 id to Unicode id. Does nothing to id if conversion fails */
-#define _ConvertBCP47(finalID, id, buffer, length,err) \
- if (uloc_forLanguageTag(id, buffer, length, NULL, err) <= 0 || \
- U_FAILURE(*err) || *err == U_STRING_NOT_TERMINATED_WARNING) { \
- finalID=id; \
- if (*err == U_STRING_NOT_TERMINATED_WARNING) { *err = U_BUFFER_OVERFLOW_ERROR; } \
- } else { \
- finalID=buffer; \
- }
+#define _ConvertBCP47(finalID, id, buffer, length,err) UPRV_BLOCK_MACRO_BEGIN { \
+ if (uloc_forLanguageTag(id, buffer, length, NULL, err) <= 0 || \
+ U_FAILURE(*err) || *err == U_STRING_NOT_TERMINATED_WARNING) { \
+ finalID=id; \
+ if (*err == U_STRING_NOT_TERMINATED_WARNING) { *err = U_BUFFER_OVERFLOW_ERROR; } \
+ } else { \
+ finalID=buffer; \
+ } \
+} UPRV_BLOCK_MACRO_END
/* Gets the size of the shortest subtag in the given localeID. */
static int32_t getShortestSubtagLength(const char *localeID) {
int32_t localeIDLength = static_cast<int32_t>(uprv_strlen(localeID));
@@ -643,20 +596,12 @@ compareKeywordStructs(const void * /*context*/, const void *left, const void *ri
return uprv_strcmp(leftString, rightString);
}
-/**
- * Both addKeyword and addValue must already be in canonical form.
- * Either both addKeyword and addValue are NULL, or neither is NULL.
- * If they are not NULL they must be zero terminated.
- * If addKeyword is not NULL is must have length small enough to fit in KeywordStruct.keyword.
- */
static int32_t
_getKeywords(const char *localeID,
char prev,
char *keywords, int32_t keywordCapacity,
char *values, int32_t valuesCapacity, int32_t *valLen,
UBool valuesToo,
- const char* addKeyword,
- const char* addValue,
UErrorCode *status)
{
KeywordStruct keywordList[ULOC_MAX_NO_KEYWORDS];
@@ -755,33 +700,6 @@ _getKeywords(const char *localeID,
}
} while(pos);
- /* Handle addKeyword/addValue. */
- if (addKeyword != NULL) {
- UBool duplicate = FALSE;
- U_ASSERT(addValue != NULL);
- /* Search for duplicate; if found, do nothing. Explicit keyword
- overrides addKeyword. */
- for (j=0; j<numKeywords; ++j) {
- if (uprv_strcmp(keywordList[j].keyword, addKeyword) == 0) {
- duplicate = TRUE;
- break;
- }
- }
- if (!duplicate) {
- if (numKeywords == maxKeywords) {
- *status = U_INTERNAL_PROGRAM_ERROR;
- return 0;
- }
- uprv_strcpy(keywordList[numKeywords].keyword, addKeyword);
- keywordList[numKeywords].keywordLen = (int32_t)uprv_strlen(addKeyword);
- keywordList[numKeywords].valueStart = addValue;
- keywordList[numKeywords].valueLen = (int32_t)uprv_strlen(addValue);
- ++numKeywords;
- }
- } else {
- U_ASSERT(addValue == NULL);
- }
-
/* now we have a list of keywords */
/* we need to sort it */
uprv_sortArray(keywordList, numKeywords, sizeof(KeywordStruct), compareKeywordStructs, NULL, FALSE, status);
@@ -839,7 +757,7 @@ locale_getKeywords(const char *localeID,
UErrorCode *status) {
return _getKeywords(localeID, prev, keywords, keywordCapacity,
values, valuesCapacity, valLen, valuesToo,
- NULL, NULL, status);
+ status);
}
U_CAPI int32_t U_EXPORT2
@@ -1188,20 +1106,6 @@ uloc_setKeywordValue(const char* keywordName,
*/
#define _isTerminator(a) ((a==0)||(a=='.')||(a=='@'))
-static char* _strnchr(const char* str, int32_t len, char c) {
- U_ASSERT(str != 0 && len >= 0);
- while (len-- != 0) {
- char d = *str;
- if (d == c) {
- return (char*) str;
- } else if (d == 0) {
- break;
- }
- ++str;
- }
- return NULL;
-}
-
/**
* Lookup 'key' in the array 'list'. The array 'list' should contain
* a NULL entry, followed by more entries, and a second NULL entry.
@@ -1279,6 +1183,16 @@ ulocimp_getLanguage(const char *localeID,
int32_t offset;
char lang[4]={ 0, 0, 0, 0 }; /* temporary buffer to hold language code for searching */
+ if (uprv_stricmp(localeID, "root") == 0) {
+ localeID += 4;
+ } else if (uprv_strnicmp(localeID, "und", 3) == 0 &&
+ (localeID[3] == '\0' ||
+ localeID[3] == '-' ||
+ localeID[3] == '_' ||
+ localeID[3] == '@')) {
+ localeID += 3;
+ }
+
/* if it starts with i- or x- then copy that prefix */
if(_isIDPrefix(localeID)) {
if(i<languageCapacity) {
@@ -1476,50 +1390,6 @@ _getVariant(const char *localeID,
return _getVariantEx(localeID, prev, variant, variantCapacity, FALSE);
}
-/**
- * Delete ALL instances of a variant from the given list of one or
- * more variants. Example: "FOO_EURO_BAR_EURO" => "FOO_BAR".
- * @param variants the source string of one or more variants,
- * separated by '_'. This will be MODIFIED IN PLACE. Not zero
- * terminated; if it is, trailing zero will NOT be maintained.
- * @param variantsLen length of variants
- * @param toDelete variant to delete, without separators, e.g. "EURO"
- * or "PREEURO"; not zero terminated
- * @param toDeleteLen length of toDelete
- * @return number of characters deleted from variants
- */
-static int32_t
-_deleteVariant(char* variants, int32_t variantsLen,
- const char* toDelete, int32_t toDeleteLen)
-{
- int32_t delta = 0; /* number of chars deleted */
- for (;;) {
- UBool flag = FALSE;
- if (variantsLen < toDeleteLen) {
- return delta;
- }
- if (uprv_strncmp(variants, toDelete, toDeleteLen) == 0 &&
- (variantsLen == toDeleteLen ||
- (flag=(variants[toDeleteLen] == '_')) != 0))
- {
- int32_t d = toDeleteLen + (flag?1:0);
- variantsLen -= d;
- delta += d;
- if (variantsLen > 0) {
- uprv_memmove(variants, variants+d, variantsLen);
- }
- } else {
- char* p = _strnchr(variants, variantsLen, '_');
- if (p == NULL) {
- return delta;
- }
- ++p;
- variantsLen -= (int32_t)(p - variants);
- variants = p;
- }
- }
-}
-
/* Keyword enumeration */
typedef struct UKeywordsContext {
@@ -1587,31 +1457,29 @@ static const UEnumeration gKeywordsEnum = {
U_CAPI UEnumeration* U_EXPORT2
uloc_openKeywordList(const char *keywordList, int32_t keywordListSize, UErrorCode* status)
{
- UKeywordsContext *myContext = NULL;
- UEnumeration *result = NULL;
+ LocalMemory<UKeywordsContext> myContext;
+ LocalMemory<UEnumeration> result;
- if(U_FAILURE(*status)) {
- return NULL;
+ if (U_FAILURE(*status)) {
+ return nullptr;
}
- result = (UEnumeration *)uprv_malloc(sizeof(UEnumeration));
- /* Null pointer test */
- if (result == NULL) {
+ myContext.adoptInstead(static_cast<UKeywordsContext *>(uprv_malloc(sizeof(UKeywordsContext))));
+ result.adoptInstead(static_cast<UEnumeration *>(uprv_malloc(sizeof(UEnumeration))));
+ if (myContext.isNull() || result.isNull()) {
*status = U_MEMORY_ALLOCATION_ERROR;
- return NULL;
+ return nullptr;
}
- uprv_memcpy(result, &gKeywordsEnum, sizeof(UEnumeration));
- myContext = static_cast<UKeywordsContext *>(uprv_malloc(sizeof(UKeywordsContext)));
- if (myContext == NULL) {
+ uprv_memcpy(result.getAlias(), &gKeywordsEnum, sizeof(UEnumeration));
+ myContext->keywords = static_cast<char *>(uprv_malloc(keywordListSize+1));
+ if (myContext->keywords == nullptr) {
*status = U_MEMORY_ALLOCATION_ERROR;
- uprv_free(result);
- return NULL;
+ return nullptr;
}
- myContext->keywords = (char *)uprv_malloc(keywordListSize+1);
uprv_memcpy(myContext->keywords, keywordList, keywordListSize);
myContext->keywords[keywordListSize] = 0;
myContext->current = myContext->keywords;
- result->context = myContext;
- return result;
+ result->context = myContext.orphan();
+ return result.orphan();
}
U_CAPI UEnumeration* U_EXPORT2
@@ -1698,8 +1566,6 @@ _canonicalize(const char* localeID,
const char* tmpLocaleID;
const char* keywordAssign = NULL;
const char* separatorIndicator = NULL;
- const char* addKeyword = NULL;
- const char* addValue = NULL;
char* name;
char* variant = NULL; /* pointer into name, or NULL */
@@ -1738,7 +1604,7 @@ _canonicalize(const char* localeID,
len = (int32_t)uprv_strlen(d);
if (name != NULL) {
- uprv_strncpy(name, d, len);
+ uprv_memcpy(name, d, len);
}
} else if(_isIDSeparator(*tmpLocaleID)) {
const char *scriptID;
@@ -1864,27 +1730,6 @@ _canonicalize(const char* localeID,
}
}
- /* Handle generic variants first */
- if (variant) {
- for (j=0; j<UPRV_LENGTHOF(VARIANT_MAP); j++) {
- const char* variantToCompare = VARIANT_MAP[j].variant;
- int32_t n = (int32_t)uprv_strlen(variantToCompare);
- int32_t variantLen = _deleteVariant(variant, uprv_min(variantSize, (nameCapacity-len)), variantToCompare, n);
- len -= variantLen;
- if (variantLen > 0) {
- if (len > 0 && name[len-1] == '_') { /* delete trailing '_' */
- --len;
- }
- addKeyword = VARIANT_MAP[j].keyword;
- addValue = VARIANT_MAP[j].value;
- break;
- }
- }
- if (len > 0 && len <= nameCapacity && name[len-1] == '_') { /* delete trailing '_' */
- --len;
- }
- }
-
/* Look up the ID in the canonicalization map */
for (j=0; j<UPRV_LENGTHOF(CANONICALIZE_MAP); j++) {
const char* id = CANONICALIZE_MAP[j].id;
@@ -1894,10 +1739,6 @@ _canonicalize(const char* localeID,
break; /* Don't remap "" if keywords present */
}
len = _copyCount(name, nameCapacity, CANONICALIZE_MAP[j].canonicalID);
- if (CANONICALIZE_MAP[j].keyword) {
- addKeyword = CANONICALIZE_MAP[j].keyword;
- addValue = CANONICALIZE_MAP[j].value;
- }
break;
}
}
@@ -1912,14 +1753,7 @@ _canonicalize(const char* localeID,
++len;
++fieldCount;
len += _getKeywords(tmpLocaleID+1, '@', (len<nameCapacity ? name+len : NULL), nameCapacity-len,
- NULL, 0, NULL, TRUE, addKeyword, addValue, err);
- } else if (addKeyword != NULL) {
- U_ASSERT(addValue != NULL && len < nameCapacity);
- /* inelegant but works -- later make _getKeywords do this? */
- len += _copyCount(name+len, nameCapacity-len, "@");
- len += _copyCount(name+len, nameCapacity-len, addKeyword);
- len += _copyCount(name+len, nameCapacity-len, "=");
- len += _copyCount(name+len, nameCapacity-len, addValue);
+ NULL, 0, NULL, TRUE, err);
}
}
@@ -1954,9 +1788,16 @@ uloc_getParent(const char* localeID,
i=0;
}
- if(i>0 && parent != localeID) {
- uprv_memcpy(parent, localeID, uprv_min(i, parentCapacity));
+ if (i > 0) {
+ if (uprv_strnicmp(localeID, "und_", 4) == 0) {
+ localeID += 3;
+ i -= 3;
+ uprv_memmove(parent, localeID, uprv_min(i, parentCapacity));
+ } else if (parent != localeID) {
+ uprv_memcpy(parent, localeID, uprv_min(i, parentCapacity));
+ }
}
+
return u_terminateChars(parent, parentCapacity, i, err);
}
@@ -2179,16 +2020,19 @@ uloc_getLCID(const char* localeID)
return 0;
}
- // Attempt platform lookup if available
- lcid = uprv_convertToLCIDPlatform(localeID);
- if (lcid > 0)
- {
+ // First, attempt Windows platform lookup if available, but fall
+ // through to catch any special cases (ICU vs Windows name differences).
+ lcid = uprv_convertToLCIDPlatform(localeID, &status);
+ if (U_FAILURE(status)) {
+ return 0;
+ }
+ if (lcid > 0) {
// Windows found an LCID, return that
return lcid;
}
uloc_getLanguage(localeID, langID, sizeof(langID), &status);
- if (U_FAILURE(status)) {
+ if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING) {
return 0;
}
diff --git a/Build/source/libs/icu/icu-src/source/common/uloc_keytype.cpp b/Build/source/libs/icu/icu-src/source/common/uloc_keytype.cpp
index b6f0752a707..019da058cf4 100644
--- a/Build/source/libs/icu/icu-src/source/common/uloc_keytype.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uloc_keytype.cpp
@@ -6,8 +6,14 @@
* Corporation and others. All Rights Reserved.
**********************************************************************
*/
+#include <algorithm>
+
#include "unicode/utypes.h"
+#include "unicode/unistr.h"
+#include "unicode/uobject.h"
+#include "charstr.h"
+#include "cmemory.h"
#include "cstring.h"
#include "uassert.h"
#include "ucln_cmn.h"
@@ -19,9 +25,6 @@
static UHashtable* gLocExtKeyMap = NULL;
static icu::UInitOnce gLocExtKeyMapInitOnce = U_INITONCE_INITIALIZER;
-static icu::UVector* gKeyTypeStringPool = NULL;
-static icu::UVector* gLocExtKeyDataEntries = NULL;
-static icu::UVector* gLocExtTypeEntries = NULL;
// bit flags for special types
typedef enum {
@@ -31,17 +34,21 @@ typedef enum {
SPECIALTYPE_RG_KEY_VALUE = 4
} SpecialType;
-typedef struct LocExtKeyData {
+struct LocExtKeyData : public icu::UMemory {
const char* legacyId;
const char* bcpId;
- UHashtable* typeMap;
+ icu::LocalUHashtablePointer typeMap;
uint32_t specialTypes;
-} LocExtKeyData;
+};
-typedef struct LocExtType {
+struct LocExtType : public icu::UMemory {
const char* legacyId;
const char* bcpId;
-} LocExtType;
+};
+
+static icu::MemoryPool<icu::CharString>* gKeyTypeStringPool = NULL;
+static icu::MemoryPool<LocExtKeyData>* gLocExtKeyDataEntries = NULL;
+static icu::MemoryPool<LocExtType>* gLocExtTypeEntries = NULL;
U_CDECL_BEGIN
@@ -65,25 +72,6 @@ uloc_key_type_cleanup(void) {
return TRUE;
}
-static void U_CALLCONV
-uloc_deleteKeyTypeStringPoolEntry(void* obj) {
- uprv_free(obj);
-}
-
-static void U_CALLCONV
-uloc_deleteKeyDataEntry(void* obj) {
- LocExtKeyData* keyData = (LocExtKeyData*)obj;
- if (keyData->typeMap != NULL) {
- uhash_close(keyData->typeMap);
- }
- uprv_free(keyData);
-}
-
-static void U_CALLCONV
-uloc_deleteTypeEntry(void* obj) {
- uprv_free(obj);
-}
-
U_CDECL_END
@@ -107,32 +95,20 @@ initFromResourceBundle(UErrorCode& sts) {
tmpSts = U_ZERO_ERROR;
LocalUResourceBundlePointer bcpTypeAliasRes(ures_getByKey(keyTypeDataRes.getAlias(), "bcpTypeAlias", NULL, &tmpSts));
- // initialize vectors storing dynamically allocated objects
- gKeyTypeStringPool = new UVector(uloc_deleteKeyTypeStringPoolEntry, NULL, sts);
+ // initialize pools storing dynamically allocated objects
+ gKeyTypeStringPool = new icu::MemoryPool<icu::CharString>;
if (gKeyTypeStringPool == NULL) {
- if (U_SUCCESS(sts)) {
- sts = U_MEMORY_ALLOCATION_ERROR;
- }
- }
- if (U_FAILURE(sts)) {
+ sts = U_MEMORY_ALLOCATION_ERROR;
return;
}
- gLocExtKeyDataEntries = new UVector(uloc_deleteKeyDataEntry, NULL, sts);
+ gLocExtKeyDataEntries = new icu::MemoryPool<LocExtKeyData>;
if (gLocExtKeyDataEntries == NULL) {
- if (U_SUCCESS(sts)) {
- sts = U_MEMORY_ALLOCATION_ERROR;
- }
- }
- if (U_FAILURE(sts)) {
+ sts = U_MEMORY_ALLOCATION_ERROR;
return;
}
- gLocExtTypeEntries = new UVector(uloc_deleteTypeEntry, NULL, sts);
+ gLocExtTypeEntries = new icu::MemoryPool<LocExtType>;
if (gLocExtTypeEntries == NULL) {
- if (U_SUCCESS(sts)) {
- sts = U_MEMORY_ALLOCATION_ERROR;
- }
- }
- if (U_FAILURE(sts)) {
+ sts = U_MEMORY_ALLOCATION_ERROR;
return;
}
@@ -145,27 +121,24 @@ initFromResourceBundle(UErrorCode& sts) {
break;
}
const char* legacyKeyId = ures_getKey(keyMapEntry.getAlias());
- int32_t bcpKeyIdLen = 0;
- const UChar* uBcpKeyId = ures_getString(keyMapEntry.getAlias(), &bcpKeyIdLen, &sts);
+ UnicodeString uBcpKeyId = ures_getUnicodeString(keyMapEntry.getAlias(), &sts);
if (U_FAILURE(sts)) {
break;
}
// empty value indicates that BCP key is same with the legacy key.
const char* bcpKeyId = legacyKeyId;
- if (bcpKeyIdLen > 0) {
- char* bcpKeyIdBuf = (char*)uprv_malloc(bcpKeyIdLen + 1);
+ if (!uBcpKeyId.isEmpty()) {
+ icu::CharString* bcpKeyIdBuf = gKeyTypeStringPool->create();
if (bcpKeyIdBuf == NULL) {
sts = U_MEMORY_ALLOCATION_ERROR;
break;
}
- u_UCharsToChars(uBcpKeyId, bcpKeyIdBuf, bcpKeyIdLen);
- bcpKeyIdBuf[bcpKeyIdLen] = 0;
- gKeyTypeStringPool->addElement(bcpKeyIdBuf, sts);
+ bcpKeyIdBuf->appendInvariantChars(uBcpKeyId, sts);
if (U_FAILURE(sts)) {
break;
}
- bcpKeyId = bcpKeyIdBuf;
+ bcpKeyId = bcpKeyIdBuf->data();
}
UBool isTZ = uprv_strcmp(legacyKeyId, "timezone") == 0;
@@ -199,7 +172,7 @@ initFromResourceBundle(UErrorCode& sts) {
LocalUResourceBundlePointer typeMapResByKey(ures_getByKey(typeMapRes.getAlias(), legacyKeyId, NULL, &tmpSts));
if (U_FAILURE(tmpSts)) {
// type map for each key must exist
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
} else {
LocalUResourceBundlePointer typeMapEntry;
@@ -228,70 +201,54 @@ initFromResourceBundle(UErrorCode& sts) {
// a timezone key uses a colon instead of a slash in the resource.
// e.g. America:Los_Angeles
if (uprv_strchr(legacyTypeId, ':') != NULL) {
- int32_t legacyTypeIdLen = static_cast<int32_t>(uprv_strlen(legacyTypeId));
- char* legacyTypeIdBuf = (char*)uprv_malloc(legacyTypeIdLen + 1);
+ icu::CharString* legacyTypeIdBuf =
+ gKeyTypeStringPool->create(legacyTypeId, sts);
if (legacyTypeIdBuf == NULL) {
sts = U_MEMORY_ALLOCATION_ERROR;
break;
}
- const char* p = legacyTypeId;
- char* q = legacyTypeIdBuf;
- while (*p) {
- if (*p == ':') {
- *q++ = '/';
- } else {
- *q++ = *p;
- }
- p++;
- }
- *q = 0;
-
- gKeyTypeStringPool->addElement(legacyTypeIdBuf, sts);
if (U_FAILURE(sts)) {
break;
}
- legacyTypeId = legacyTypeIdBuf;
+ std::replace(
+ legacyTypeIdBuf->data(),
+ legacyTypeIdBuf->data() + legacyTypeIdBuf->length(),
+ ':', '/');
+ legacyTypeId = legacyTypeIdBuf->data();
}
}
- int32_t bcpTypeIdLen = 0;
- const UChar* uBcpTypeId = ures_getString(typeMapEntry.getAlias(), &bcpTypeIdLen, &sts);
+ UnicodeString uBcpTypeId = ures_getUnicodeString(typeMapEntry.getAlias(), &sts);
if (U_FAILURE(sts)) {
break;
}
// empty value indicates that BCP type is same with the legacy type.
const char* bcpTypeId = legacyTypeId;
- if (bcpTypeIdLen > 0) {
- char* bcpTypeIdBuf = (char*)uprv_malloc(bcpTypeIdLen + 1);
+ if (!uBcpTypeId.isEmpty()) {
+ icu::CharString* bcpTypeIdBuf = gKeyTypeStringPool->create();
if (bcpTypeIdBuf == NULL) {
sts = U_MEMORY_ALLOCATION_ERROR;
break;
}
- u_UCharsToChars(uBcpTypeId, bcpTypeIdBuf, bcpTypeIdLen);
- bcpTypeIdBuf[bcpTypeIdLen] = 0;
- gKeyTypeStringPool->addElement(bcpTypeIdBuf, sts);
+ bcpTypeIdBuf->appendInvariantChars(uBcpTypeId, sts);
if (U_FAILURE(sts)) {
break;
}
- bcpTypeId = bcpTypeIdBuf;
+ bcpTypeId = bcpTypeIdBuf->data();
}
// Note: legacy type value should never be
// equivalent to bcp type value of a different
// type under the same key. So we use a single
// map for lookup.
- LocExtType* t = (LocExtType*)uprv_malloc(sizeof(LocExtType));
+ LocExtType* t = gLocExtTypeEntries->create();
if (t == NULL) {
sts = U_MEMORY_ALLOCATION_ERROR;
break;
}
t->bcpId = bcpTypeId;
t->legacyId = legacyTypeId;
- gLocExtTypeEntries->addElement((void*)t, sts);
- if (U_FAILURE(sts)) {
- break;
- }
uhash_put(typeDataMap, (void*)legacyTypeId, t, &sts);
if (bcpTypeId != legacyTypeId) {
@@ -320,29 +277,20 @@ initFromResourceBundle(UErrorCode& sts) {
if (isTZ) {
// replace colon with slash if necessary
if (uprv_strchr(from, ':') != NULL) {
- int32_t fromLen = static_cast<int32_t>(uprv_strlen(from));
- char* fromBuf = (char*)uprv_malloc(fromLen + 1);
+ icu::CharString* fromBuf =
+ gKeyTypeStringPool->create(from, sts);
if (fromBuf == NULL) {
sts = U_MEMORY_ALLOCATION_ERROR;
break;
}
- const char* p = from;
- char* q = fromBuf;
- while (*p) {
- if (*p == ':') {
- *q++ = '/';
- } else {
- *q++ = *p;
- }
- p++;
- }
- *q = 0;
-
- gKeyTypeStringPool->addElement(fromBuf, sts);
if (U_FAILURE(sts)) {
break;
}
- from = fromBuf;
+ std::replace(
+ fromBuf->data(),
+ fromBuf->data() + fromBuf->length(),
+ ':', '/');
+ from = fromBuf->data();
}
}
uhash_put(typeDataMap, (void*)from, t, &sts);
@@ -380,7 +328,7 @@ initFromResourceBundle(UErrorCode& sts) {
break;
}
- LocExtKeyData* keyData = (LocExtKeyData*)uprv_malloc(sizeof(LocExtKeyData));
+ LocExtKeyData* keyData = gLocExtKeyDataEntries->create();
if (keyData == NULL) {
sts = U_MEMORY_ALLOCATION_ERROR;
break;
@@ -388,12 +336,7 @@ initFromResourceBundle(UErrorCode& sts) {
keyData->bcpId = bcpKeyId;
keyData->legacyId = legacyKeyId;
keyData->specialTypes = specialTypes;
- keyData->typeMap = typeDataMap;
-
- gLocExtKeyDataEntries->addElement((void*)keyData, sts);
- if (U_FAILURE(sts)) {
- break;
- }
+ keyData->typeMap.adoptInstead(typeDataMap);
uhash_put(gLocExtKeyMap, (void*)legacyKeyId, keyData, &sts);
if (legacyKeyId != bcpKeyId) {
@@ -518,7 +461,7 @@ ulocimp_toBcpType(const char* key, const char* type, UBool* isKnownKey, UBool* i
if (isKnownKey != NULL) {
*isKnownKey = TRUE;
}
- LocExtType* t = (LocExtType*)uhash_get(keyData->typeMap, type);
+ LocExtType* t = (LocExtType*)uhash_get(keyData->typeMap.getAlias(), type);
if (t != NULL) {
return t->bcpId;
}
@@ -563,7 +506,7 @@ ulocimp_toLegacyType(const char* key, const char* type, UBool* isKnownKey, UBool
if (isKnownKey != NULL) {
*isKnownKey = TRUE;
}
- LocExtType* t = (LocExtType*)uhash_get(keyData->typeMap, type);
+ LocExtType* t = (LocExtType*)uhash_get(keyData->typeMap.getAlias(), type);
if (t != NULL) {
return t->legacyId;
}
diff --git a/Build/source/libs/icu/icu-src/source/common/uloc_tag.cpp b/Build/source/libs/icu/icu-src/source/common/uloc_tag.cpp
index 83d79160e8f..1c10c48182c 100644
--- a/Build/source/libs/icu/icu-src/source/common/uloc_tag.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uloc_tag.cpp
@@ -7,9 +7,12 @@
**********************************************************************
*/
+#include "unicode/bytestream.h"
#include "unicode/utypes.h"
#include "unicode/ures.h"
+#include "unicode/localpointer.h"
#include "unicode/putil.h"
+#include "unicode/uenum.h"
#include "unicode/uloc.h"
#include "ustr_imp.h"
#include "charstr.h"
@@ -18,7 +21,6 @@
#include "putilimp.h"
#include "uinvchar.h"
#include "ulocimp.h"
-#include "uvector.h"
#include "uassert.h"
@@ -29,17 +31,17 @@ typedef struct VariantListEntry {
} VariantListEntry;
/* struct holding a single attribute value */
-typedef struct AttributeListEntry {
+struct AttributeListEntry : public icu::UMemory {
const char *attribute;
struct AttributeListEntry *next;
-} AttributeListEntry;
+};
/* struct holding a single extension */
-typedef struct ExtensionListEntry {
+struct ExtensionListEntry : public icu::UMemory {
const char *key;
const char *value;
struct ExtensionListEntry *next;
-} ExtensionListEntry;
+};
#define MAXEXTLANG 3
typedef struct ULanguageTag {
@@ -347,45 +349,20 @@ static const char*
ultag_getGrandfathered(const ULanguageTag* langtag);
#endif
-namespace {
-
-// Helper class to memory manage CharString objects.
-// Only ever stack-allocated, does not need to inherit UMemory.
-class CharStringPool {
-public:
- CharStringPool() : status(U_ZERO_ERROR), pool(&deleter, nullptr, status) {}
- ~CharStringPool() = default;
-
- CharStringPool(const CharStringPool&) = delete;
- CharStringPool& operator=(const CharStringPool&) = delete;
+U_NAMESPACE_BEGIN
- icu::CharString* create() {
- if (U_FAILURE(status)) {
- return nullptr;
- }
- icu::CharString* const obj = new icu::CharString;
- if (obj == nullptr) {
- status = U_MEMORY_ALLOCATION_ERROR;
- return nullptr;
- }
- pool.addElement(obj, status);
- if (U_FAILURE(status)) {
- delete obj;
- return nullptr;
- }
- return obj;
- }
-
-private:
- static void U_CALLCONV deleter(void* obj) {
- delete static_cast<icu::CharString*>(obj);
- }
-
- UErrorCode status;
- icu::UVector pool;
-};
+/**
+ * \class LocalULanguageTagPointer
+ * "Smart pointer" class, closes a ULanguageTag via ultag_close().
+ * For most methods see the LocalPointerBase base class.
+ *
+ * @see LocalPointerBase
+ * @see LocalPointer
+ * @internal
+ */
+U_DEFINE_LOCAL_OPEN_POINTER(LocalULanguageTagPointer, ULanguageTag, ultag_close);
-} // namespace
+U_NAMESPACE_END
/*
* -------------------------------------------------
@@ -429,13 +406,22 @@ _isAlphaNumericString(const char* s, int32_t len) {
}
static UBool
-_isLanguageSubtag(const char* s, int32_t len) {
+_isAlphaNumericStringLimitedLength(const char* s, int32_t len, int32_t min, int32_t max) {
+ if (len < 0) {
+ len = (int32_t)uprv_strlen(s);
+ }
+ if (len >= min && len <= max && _isAlphaNumericString(s, len)) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+U_CFUNC UBool
+ultag_isLanguageSubtag(const char* s, int32_t len) {
/*
- * language = 2*3ALPHA ; shortest ISO 639 code
- * ["-" extlang] ; sometimes followed by
- * ; extended language subtags
- * / 4ALPHA ; or reserved for future use
- * / 5*8ALPHA ; or registered language subtag
+ * unicode_language_subtag = alpha{2,3} | alpha{5,8};
+ * NOTE: Per ICUTC 2019/01/23- accepting alpha 4
+ * See ICU-20372
*/
if (len < 0) {
len = (int32_t)uprv_strlen(s);
@@ -461,8 +447,8 @@ _isExtlangSubtag(const char* s, int32_t len) {
return FALSE;
}
-static UBool
-_isScriptSubtag(const char* s, int32_t len) {
+U_CFUNC UBool
+ultag_isScriptSubtag(const char* s, int32_t len) {
/*
* script = 4ALPHA ; ISO 15924 code
*/
@@ -475,8 +461,8 @@ _isScriptSubtag(const char* s, int32_t len) {
return FALSE;
}
-static UBool
-_isRegionSubtag(const char* s, int32_t len) {
+U_CFUNC UBool
+ultag_isRegionSubtag(const char* s, int32_t len) {
/*
* region = 2ALPHA ; ISO 3166-1 code
* / 3DIGIT ; UN M.49 code
@@ -502,7 +488,7 @@ _isVariantSubtag(const char* s, int32_t len) {
if (len < 0) {
len = (int32_t)uprv_strlen(s);
}
- if (len >= 5 && len <= 8 && _isAlphaNumericString(s, len)) {
+ if (_isAlphaNumericStringLimitedLength(s, len, 5, 8)) {
return TRUE;
}
if (len == 4 && ISNUMERIC(*s) && _isAlphaNumericString(s + 1, 3)) {
@@ -512,29 +498,64 @@ _isVariantSubtag(const char* s, int32_t len) {
}
static UBool
+_isSepListOf(UBool (*test)(const char*, int32_t), const char* s, int32_t len) {
+ const char *p = s;
+ const char *pSubtag = NULL;
+
+ if (len < 0) {
+ len = (int32_t)uprv_strlen(s);
+ }
+
+ while ((p - s) < len) {
+ if (*p == SEP) {
+ if (pSubtag == NULL) {
+ return FALSE;
+ }
+ if (!test(pSubtag, (int32_t)(p - pSubtag))) {
+ return FALSE;
+ }
+ pSubtag = NULL;
+ } else if (pSubtag == NULL) {
+ pSubtag = p;
+ }
+ p++;
+ }
+ if (pSubtag == NULL) {
+ return FALSE;
+ }
+ return test(pSubtag, (int32_t)(p - pSubtag));
+}
+
+U_CFUNC UBool
+ultag_isVariantSubtags(const char* s, int32_t len) {
+ return _isSepListOf(&_isVariantSubtag, s, len);
+}
+
+// This is for the ICU-specific "lvariant" handling.
+static UBool
_isPrivateuseVariantSubtag(const char* s, int32_t len) {
/*
* variant = 1*8alphanum ; registered variants
* / (DIGIT 3alphanum)
*/
- if (len < 0) {
- len = (int32_t)uprv_strlen(s);
- }
- if (len >= 1 && len <= 8 && _isAlphaNumericString(s, len)) {
- return TRUE;
- }
- return FALSE;
+ return _isAlphaNumericStringLimitedLength(s, len , 1, 8);
}
static UBool
_isExtensionSingleton(const char* s, int32_t len) {
/*
* extension = singleton 1*("-" (2*8alphanum))
+ *
+ * singleton = DIGIT ; 0 - 9
+ * / %x41-57 ; A - W
+ * / %x59-5A ; Y - Z
+ * / %x61-77 ; a - w
+ * / %x79-7A ; y - z
*/
if (len < 0) {
len = (int32_t)uprv_strlen(s);
}
- if (len == 1 && ISALPHA(*s) && (uprv_tolower(*s) != PRIVATEUSE)) {
+ if (len == 1 && (ISALPHA(*s) || ISNUMERIC(*s)) && (uprv_tolower(*s) != PRIVATEUSE)) {
return TRUE;
}
return FALSE;
@@ -545,101 +566,208 @@ _isExtensionSubtag(const char* s, int32_t len) {
/*
* extension = singleton 1*("-" (2*8alphanum))
*/
+ return _isAlphaNumericStringLimitedLength(s, len, 2, 8);
+}
+
+U_CFUNC UBool
+ultag_isExtensionSubtags(const char* s, int32_t len) {
+ return _isSepListOf(&_isExtensionSubtag, s, len);
+}
+
+static UBool
+_isPrivateuseValueSubtag(const char* s, int32_t len) {
+ /*
+ * privateuse = "x" 1*("-" (1*8alphanum))
+ */
+ return _isAlphaNumericStringLimitedLength(s, len, 1, 8);
+}
+
+U_CFUNC UBool
+ultag_isPrivateuseValueSubtags(const char* s, int32_t len) {
+ return _isSepListOf(&_isPrivateuseValueSubtag, s, len);
+}
+
+U_CFUNC UBool
+ultag_isUnicodeLocaleAttribute(const char* s, int32_t len) {
+ /*
+ * attribute = alphanum{3,8} ;
+ */
+ return _isAlphaNumericStringLimitedLength(s, len , 3, 8);
+}
+
+U_CFUNC UBool
+ultag_isUnicodeLocaleAttributes(const char* s, int32_t len) {
+ return _isSepListOf(&ultag_isUnicodeLocaleAttribute, s, len);
+}
+
+U_CFUNC UBool
+ultag_isUnicodeLocaleKey(const char* s, int32_t len) {
+ /*
+ * key = alphanum alpha ;
+ */
if (len < 0) {
len = (int32_t)uprv_strlen(s);
}
- if (len >= 2 && len <= 8 && _isAlphaNumericString(s, len)) {
+ if (len == 2 && (ISALPHA(*s) || ISNUMERIC(*s)) && ISALPHA(s[1])) {
return TRUE;
}
return FALSE;
}
-static UBool
-_isExtensionSubtags(const char* s, int32_t len) {
- const char *p = s;
- const char *pSubtag = NULL;
-
- if (len < 0) {
- len = (int32_t)uprv_strlen(s);
- }
+U_CFUNC UBool
+_isUnicodeLocaleTypeSubtag(const char*s, int32_t len) {
+ /*
+ * alphanum{3,8}
+ */
+ return _isAlphaNumericStringLimitedLength(s, len , 3, 8);
+}
- while ((p - s) < len) {
- if (*p == SEP) {
- if (pSubtag == NULL) {
- return FALSE;
- }
- if (!_isExtensionSubtag(pSubtag, (int32_t)(p - pSubtag))) {
- return FALSE;
- }
- pSubtag = NULL;
- } else if (pSubtag == NULL) {
- pSubtag = p;
- }
- p++;
- }
- if (pSubtag == NULL) {
- return FALSE;
- }
- return _isExtensionSubtag(pSubtag, (int32_t)(p - pSubtag));
+U_CFUNC UBool
+ultag_isUnicodeLocaleType(const char*s, int32_t len) {
+ /*
+ * type = alphanum{3,8} (sep alphanum{3,8})* ;
+ */
+ return _isSepListOf(&_isUnicodeLocaleTypeSubtag, s, len);
}
static UBool
-_isPrivateuseValueSubtag(const char* s, int32_t len) {
+_isTKey(const char* s, int32_t len)
+{
/*
- * privateuse = "x" 1*("-" (1*8alphanum))
+ * tkey = alpha digit ;
*/
if (len < 0) {
len = (int32_t)uprv_strlen(s);
}
- if (len >= 1 && len <= 8 && _isAlphaNumericString(s, len)) {
+ if (len == 2 && ISALPHA(*s) && ISNUMERIC(*(s + 1))) {
return TRUE;
}
return FALSE;
}
static UBool
-_isPrivateuseValueSubtags(const char* s, int32_t len) {
- const char *p = s;
- const char *pSubtag = NULL;
-
- if (len < 0) {
- len = (int32_t)uprv_strlen(s);
- }
+_isTValue(const char* s, int32_t len)
+{
+ /*
+ * tvalue = (sep alphanum{3,8})+ ;
+ */
+ return _isAlphaNumericStringLimitedLength(s, len , 3, 8);
+}
- while ((p - s) < len) {
- if (*p == SEP) {
- if (pSubtag == NULL) {
- return FALSE;
+static UBool
+_isTransformedExtensionSubtag(int32_t& state, const char* s, int32_t len)
+{
+ const int32_t kStart = 0; // Start, wait for unicode_language_subtag, tkey or end
+ const int32_t kGotLanguage = 1; // Got unicode_language_subtag, wait for unicode_script_subtag,
+ // unicode_region_subtag, unicode_variant_subtag, tkey or end
+ const int32_t kGotScript = 2; // Got unicode_script_subtag, wait for unicode_region_subtag,
+ // unicode_variant_subtag, tkey, or end
+ const int32_t kGotRegion = 3; // Got unicode_region_subtag, wait for unicode_variant_subtag,
+ // tkey, or end.
+ const int32_t kGotVariant = 4; // Got unicode_variant_subtag, wait for unicode_variant_subtag
+ // tkey or end.
+ const int32_t kGotTKey = -1; // Got tkey, wait for tvalue. ERROR if stop here.
+ const int32_t kGotTValue = 6; // Got tvalue, wait for tkey, tvalue or end
+
+ switch (state) {
+ case kStart:
+ if (ultag_isLanguageSubtag(s, len)) {
+ state = kGotLanguage;
+ return TRUE;
+ }
+ if (_isTKey(s, len)) {
+ state = kGotTKey;
+ return TRUE;
}
- if (!_isPrivateuseValueSubtag(pSubtag, (int32_t)(p - pSubtag))) {
- return FALSE;
+ return FALSE;
+ case kGotLanguage:
+ if (ultag_isScriptSubtag(s, len)) {
+ state = kGotScript;
+ return TRUE;
+ }
+ U_FALLTHROUGH;
+ case kGotScript:
+ if (ultag_isRegionSubtag(s, len)) {
+ state = kGotRegion;
+ return TRUE;
+ }
+ U_FALLTHROUGH;
+ case kGotRegion:
+ U_FALLTHROUGH;
+ case kGotVariant:
+ if (_isVariantSubtag(s, len)) {
+ state = kGotVariant;
+ return TRUE;
+ }
+ if (_isTKey(s, len)) {
+ state = kGotTKey;
+ return TRUE;
}
- pSubtag = NULL;
- } else if (pSubtag == NULL) {
- pSubtag = p;
- }
- p++;
- }
- if (pSubtag == NULL) {
- return FALSE;
+ return FALSE;
+ case kGotTKey:
+ if (_isTValue(s, len)) {
+ state = kGotTValue;
+ return TRUE;
+ }
+ return FALSE;
+ case kGotTValue:
+ if (_isTKey(s, len)) {
+ state = kGotTKey;
+ return TRUE;
+ }
+ if (_isTValue(s, len)) {
+ return TRUE;
+ }
+ return FALSE;
}
- return _isPrivateuseValueSubtag(pSubtag, (int32_t)(p - pSubtag));
+ return FALSE;
}
-U_CFUNC UBool
-ultag_isUnicodeLocaleKey(const char* s, int32_t len) {
- if (len < 0) {
- len = (int32_t)uprv_strlen(s);
- }
- if (len == 2 && _isAlphaNumericString(s, len)) {
- return TRUE;
+static UBool
+_isUnicodeExtensionSubtag(int32_t& state, const char* s, int32_t len)
+{
+ const int32_t kStart = 0; // Start, wait for a key or attribute or end
+ const int32_t kGotKey = 1; // Got a key, wait for type or key or end
+ const int32_t kGotType = 2; // Got a type, wait for key or end
+
+ switch (state) {
+ case kStart:
+ if (ultag_isUnicodeLocaleKey(s, len)) {
+ state = kGotKey;
+ return TRUE;
+ }
+ if (ultag_isUnicodeLocaleAttribute(s, len)) {
+ return TRUE;
+ }
+ return FALSE;
+ case kGotKey:
+ if (ultag_isUnicodeLocaleKey(s, len)) {
+ return TRUE;
+ }
+ if (_isUnicodeLocaleTypeSubtag(s, len)) {
+ state = kGotType;
+ return TRUE;
+ }
+ return FALSE;
+ case kGotType:
+ if (ultag_isUnicodeLocaleKey(s, len)) {
+ state = kGotKey;
+ return TRUE;
+ }
+ if (_isUnicodeLocaleTypeSubtag(s, len)) {
+ return TRUE;
+ }
+ return FALSE;
}
return FALSE;
}
-U_CFUNC UBool
-ultag_isUnicodeLocaleType(const char*s, int32_t len) {
+static UBool
+_isStatefulSepListOf(UBool (*test)(int32_t&, const char*, int32_t), const char* s, int32_t len)
+{
+ int32_t state = 0;
const char* p;
+ const char* start = s;
int32_t subtagLen = 0;
if (len < 0) {
@@ -648,22 +776,34 @@ ultag_isUnicodeLocaleType(const char*s, int32_t len) {
for (p = s; len > 0; p++, len--) {
if (*p == SEP) {
- if (subtagLen < 3) {
+ if (!test(state, start, subtagLen)) {
return FALSE;
}
subtagLen = 0;
- } else if (ISALPHA(*p) || ISNUMERIC(*p)) {
- subtagLen++;
- if (subtagLen > 8) {
- return FALSE;
- }
+ start = p + 1;
} else {
- return FALSE;
+ subtagLen++;
}
}
- return (subtagLen >= 3);
+ if (test(state, start, subtagLen) && state >= 0) {
+ return TRUE;
+ }
+ return FALSE;
}
+
+U_CFUNC UBool
+ultag_isTransformedExtensionSubtags(const char* s, int32_t len)
+{
+ return _isStatefulSepListOf(&_isTransformedExtensionSubtag, s, len);
+}
+
+U_CFUNC UBool
+ultag_isUnicodeExtensionSubtags(const char* s, int32_t len) {
+ return _isStatefulSepListOf(&_isUnicodeExtensionSubtag, s, len);
+}
+
+
/*
* -------------------------------------------------
*
@@ -850,22 +990,21 @@ _initializeULanguageTag(ULanguageTag* langtag) {
langtag->privateuse = EMPTY;
}
-static int32_t
-_appendLanguageToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UErrorCode* status) {
+static void
+_appendLanguageToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UErrorCode* status) {
char buf[ULOC_LANG_CAPACITY];
UErrorCode tmpStatus = U_ZERO_ERROR;
int32_t len, i;
- int32_t reslen = 0;
if (U_FAILURE(*status)) {
- return 0;
+ return;
}
len = uloc_getLanguage(localeID, buf, sizeof(buf), &tmpStatus);
if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) {
if (strict) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
- return 0;
+ return;
}
len = 0;
}
@@ -873,20 +1012,14 @@ _appendLanguageToLanguageTag(const char* localeID, char* appendAt, int32_t capac
/* Note: returned language code is in lower case letters */
if (len == 0) {
- if (reslen < capacity) {
- uprv_memcpy(appendAt + reslen, LANG_UND, uprv_min(LANG_UND_LEN, capacity - reslen));
- }
- reslen += LANG_UND_LEN;
- } else if (!_isLanguageSubtag(buf, len)) {
+ sink.Append(LANG_UND, LANG_UND_LEN);
+ } else if (!ultag_isLanguageSubtag(buf, len)) {
/* invalid language code */
if (strict) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
- return 0;
+ return;
}
- if (reslen < capacity) {
- uprv_memcpy(appendAt + reslen, LANG_UND, uprv_min(LANG_UND_LEN, capacity - reslen));
- }
- reslen += LANG_UND_LEN;
+ sink.Append(LANG_UND, LANG_UND_LEN);
} else {
/* resolve deprecated */
for (i = 0; i < UPRV_LENGTHOF(DEPRECATEDLANGS); i += 2) {
@@ -901,24 +1034,18 @@ _appendLanguageToLanguageTag(const char* localeID, char* appendAt, int32_t capac
break;
}
}
- if (reslen < capacity) {
- uprv_memcpy(appendAt + reslen, buf, uprv_min(len, capacity - reslen));
- }
- reslen += len;
+ sink.Append(buf, len);
}
- u_terminateChars(appendAt, capacity, reslen, status);
- return reslen;
}
-static int32_t
-_appendScriptToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UErrorCode* status) {
+static void
+_appendScriptToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UErrorCode* status) {
char buf[ULOC_SCRIPT_CAPACITY];
UErrorCode tmpStatus = U_ZERO_ERROR;
int32_t len;
- int32_t reslen = 0;
if (U_FAILURE(*status)) {
- return 0;
+ return;
}
len = uloc_getScript(localeID, buf, sizeof(buf), &tmpStatus);
@@ -926,40 +1053,31 @@ _appendScriptToLanguageTag(const char* localeID, char* appendAt, int32_t capacit
if (strict) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
}
- return 0;
+ return;
}
if (len > 0) {
- if (!_isScriptSubtag(buf, len)) {
+ if (!ultag_isScriptSubtag(buf, len)) {
/* invalid script code */
if (strict) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
}
- return 0;
+ return;
} else {
- if (reslen < capacity) {
- *(appendAt + reslen) = SEP;
- }
- reslen++;
- if (reslen < capacity) {
- uprv_memcpy(appendAt + reslen, buf, uprv_min(len, capacity - reslen));
- }
- reslen += len;
+ sink.Append("-", 1);
+ sink.Append(buf, len);
}
}
- u_terminateChars(appendAt, capacity, reslen, status);
- return reslen;
}
-static int32_t
-_appendRegionToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UErrorCode* status) {
+static void
+_appendRegionToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UErrorCode* status) {
char buf[ULOC_COUNTRY_CAPACITY];
UErrorCode tmpStatus = U_ZERO_ERROR;
int32_t len;
- int32_t reslen = 0;
if (U_FAILURE(*status)) {
- return 0;
+ return;
}
len = uloc_getCountry(localeID, buf, sizeof(buf), &tmpStatus);
@@ -967,22 +1085,19 @@ _appendRegionToLanguageTag(const char* localeID, char* appendAt, int32_t capacit
if (strict) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
}
- return 0;
+ return;
}
if (len > 0) {
- if (!_isRegionSubtag(buf, len)) {
+ if (!ultag_isRegionSubtag(buf, len)) {
/* invalid region code */
if (strict) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
}
- return 0;
+ return;
} else {
- if (reslen < capacity) {
- *(appendAt + reslen) = SEP;
- }
- reslen++;
- /* resolve deprecated */
+ sink.Append("-", 1);
+ /* resolve deprecated */
for (int i = 0; i < UPRV_LENGTHOF(DEPRECATEDREGIONS); i += 2) {
if (uprv_compareInvCharsAsAscii(buf, DEPRECATEDREGIONS[i]) == 0) {
uprv_strcpy(buf, DEPRECATEDREGIONS[i + 1]);
@@ -990,26 +1105,19 @@ _appendRegionToLanguageTag(const char* localeID, char* appendAt, int32_t capacit
break;
}
}
-
- if (reslen < capacity) {
- uprv_memcpy(appendAt + reslen, buf, uprv_min(len, capacity - reslen));
- }
- reslen += len;
+ sink.Append(buf, len);
}
}
- u_terminateChars(appendAt, capacity, reslen, status);
- return reslen;
}
-static int32_t
-_appendVariantsToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UBool *hadPosix, UErrorCode* status) {
+static void
+_appendVariantsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UBool *hadPosix, UErrorCode* status) {
char buf[ULOC_FULLNAME_CAPACITY];
UErrorCode tmpStatus = U_ZERO_ERROR;
int32_t len, i;
- int32_t reslen = 0;
if (U_FAILURE(*status)) {
- return 0;
+ return;
}
len = uloc_getVariant(localeID, buf, sizeof(buf), &tmpStatus);
@@ -1017,7 +1125,7 @@ _appendVariantsToLanguageTag(const char* localeID, char* appendAt, int32_t capac
if (strict) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
}
- return 0;
+ return;
}
if (len > 0) {
@@ -1094,15 +1202,9 @@ _appendVariantsToLanguageTag(const char* localeID, char* appendAt, int32_t capac
/* write out validated/normalized variants to the target */
var = varFirst;
while (var != NULL) {
- if (reslen < capacity) {
- *(appendAt + reslen) = SEP;
- }
- reslen++;
+ sink.Append("-", 1);
varLen = (int32_t)uprv_strlen(var->variant);
- if (reslen < capacity) {
- uprv_memcpy(appendAt + reslen, var->variant, uprv_min(varLen, capacity - reslen));
- }
- reslen += varLen;
+ sink.Append(var->variant, varLen);
var = var->next;
}
}
@@ -1117,27 +1219,25 @@ _appendVariantsToLanguageTag(const char* localeID, char* appendAt, int32_t capac
}
if (U_FAILURE(*status)) {
- return 0;
+ return;
}
}
-
- u_terminateChars(appendAt, capacity, reslen, status);
- return reslen;
}
-static int32_t
-_appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UBool hadPosix, UErrorCode* status) {
+static void
+_appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UBool hadPosix, UErrorCode* status) {
char attrBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY] = { 0 };
int32_t attrBufLength = 0;
- UEnumeration *keywordEnum = NULL;
- int32_t reslen = 0;
- keywordEnum = uloc_openKeywords(localeID, status);
+ icu::MemoryPool<AttributeListEntry> attrPool;
+ icu::MemoryPool<ExtensionListEntry> extPool;
+ icu::MemoryPool<icu::CharString> strPool;
+
+ icu::LocalUEnumerationPointer keywordEnum(uloc_openKeywords(localeID, status));
if (U_FAILURE(*status) && !hadPosix) {
- uenum_close(keywordEnum);
- return 0;
+ return;
}
- if (keywordEnum != NULL || hadPosix) {
+ if (keywordEnum.isValid() || hadPosix) {
/* reorder extensions */
int32_t len;
const char *key;
@@ -1145,8 +1245,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac
ExtensionListEntry *ext;
AttributeListEntry *firstAttr = NULL;
AttributeListEntry *attr;
- char *attrValue;
- CharStringPool extBufPool;
+ icu::MemoryPool<icu::CharString> extBufPool;
const char *bcpKey=nullptr, *bcpValue=nullptr;
UErrorCode tmpStatus = U_ZERO_ERROR;
int32_t keylen;
@@ -1154,7 +1253,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac
while (TRUE) {
icu::CharString buf;
- key = uenum_next(keywordEnum, NULL, status);
+ key = uenum_next(keywordEnum.getAlias(), NULL, status);
if (key == NULL) {
break;
}
@@ -1227,22 +1326,23 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac
}
/* create AttributeListEntry */
- attr = (AttributeListEntry*)uprv_malloc(sizeof(AttributeListEntry));
+ attr = attrPool.create();
if (attr == NULL) {
*status = U_MEMORY_ALLOCATION_ERROR;
break;
}
- attrValue = (char*)uprv_malloc(attrBufLength + 1);
+ icu::CharString* attrValue =
+ strPool.create(attrBuf, attrBufLength, *status);
if (attrValue == NULL) {
*status = U_MEMORY_ALLOCATION_ERROR;
break;
}
- uprv_strcpy(attrValue, attrBuf);
- attr->attribute = attrValue;
+ if (U_FAILURE(*status)) {
+ break;
+ }
+ attr->attribute = attrValue->data();
if (!_addAttributeToList(&firstAttr, attr)) {
- uprv_free(attr);
- uprv_free(attrValue);
if (strict) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
break;
@@ -1309,7 +1409,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac
}
} else {
if (*key == PRIVATEUSE) {
- if (!_isPrivateuseValueSubtags(buf.data(), len)) {
+ if (!ultag_isPrivateuseValueSubtags(buf.data(), len)) {
if (strict) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
break;
@@ -1317,7 +1417,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac
continue;
}
} else {
- if (!_isExtensionSingleton(key, keylen) || !_isExtensionSubtags(buf.data(), len)) {
+ if (!_isExtensionSingleton(key, keylen) || !ultag_isExtensionSubtags(buf.data(), len)) {
if (strict) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
break;
@@ -1326,12 +1426,12 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac
}
}
bcpKey = key;
- icu::CharString* extBuf = extBufPool.create();
+ icu::CharString* extBuf =
+ extBufPool.create(buf.data(), len, tmpStatus);
if (extBuf == nullptr) {
*status = U_MEMORY_ALLOCATION_ERROR;
break;
}
- extBuf->append(buf.data(), len, tmpStatus);
if (U_FAILURE(tmpStatus)) {
*status = tmpStatus;
break;
@@ -1340,7 +1440,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac
}
/* create ExtensionListEntry */
- ext = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry));
+ ext = extPool.create();
if (ext == NULL) {
*status = U_MEMORY_ALLOCATION_ERROR;
break;
@@ -1349,7 +1449,6 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac
ext->value = bcpValue;
if (!_addExtensionToList(&firstExt, ext, TRUE)) {
- uprv_free(ext);
if (strict) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
break;
@@ -1360,16 +1459,16 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac
/* Special handling for POSIX variant - add the keywords for POSIX */
if (hadPosix) {
/* create ExtensionListEntry for POSIX */
- ext = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry));
+ ext = extPool.create();
if (ext == NULL) {
*status = U_MEMORY_ALLOCATION_ERROR;
- goto cleanup;
+ return;
}
ext->key = POSIX_KEY;
ext->value = POSIX_VALUE;
if (!_addExtensionToList(&firstExt, ext, TRUE)) {
- uprv_free(ext);
+ // Silently ignore errors.
}
}
@@ -1378,15 +1477,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac
for (ext = firstExt; ext; ext = ext->next) {
if (!startLDMLExtension && uprv_strlen(ext->key) > 1) {
/* first LDML u singlton extension */
- if (reslen < capacity) {
- *(appendAt + reslen) = SEP;
- }
- reslen++;
- if (reslen < capacity) {
- *(appendAt + reslen) = LDMLEXT;
- }
- reslen++;
-
+ sink.Append("-u", 2);
startLDMLExtension = TRUE;
}
@@ -1394,64 +1485,19 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac
if (uprv_strcmp(ext->key, LOCALE_ATTRIBUTE_KEY) == 0) {
/* write the value for the attributes */
for (attr = firstAttr; attr; attr = attr->next) {
- if (reslen < capacity) {
- *(appendAt + reslen) = SEP;
- }
- reslen++;
- len = (int32_t)uprv_strlen(attr->attribute);
- if (reslen < capacity) {
- uprv_memcpy(appendAt + reslen, attr->attribute, uprv_min(len, capacity - reslen));
- }
- reslen += len;
+ sink.Append("-", 1);
+ sink.Append(
+ attr->attribute, static_cast<int32_t>(uprv_strlen(attr->attribute)));
}
} else {
- if (reslen < capacity) {
- *(appendAt + reslen) = SEP;
- }
- reslen++;
- len = (int32_t)uprv_strlen(ext->key);
- if (reslen < capacity) {
- uprv_memcpy(appendAt + reslen, ext->key, uprv_min(len, capacity - reslen));
- }
- reslen += len;
- if (reslen < capacity) {
- *(appendAt + reslen) = SEP;
- }
- reslen++;
- len = (int32_t)uprv_strlen(ext->value);
- if (reslen < capacity) {
- uprv_memcpy(appendAt + reslen, ext->value, uprv_min(len, capacity - reslen));
- }
- reslen += len;
+ sink.Append("-", 1);
+ sink.Append(ext->key, static_cast<int32_t>(uprv_strlen(ext->key)));
+ sink.Append("-", 1);
+ sink.Append(ext->value, static_cast<int32_t>(uprv_strlen(ext->value)));
}
}
}
-cleanup:
- /* clean up */
- ext = firstExt;
- while (ext != NULL) {
- ExtensionListEntry *tmpExt = ext->next;
- uprv_free(ext);
- ext = tmpExt;
- }
-
- attr = firstAttr;
- while (attr != NULL) {
- AttributeListEntry *tmpAttr = attr->next;
- char *pValue = (char *)attr->attribute;
- uprv_free(pValue);
- uprv_free(attr);
- attr = tmpAttr;
- }
-
- uenum_close(keywordEnum);
-
- if (U_FAILURE(*status)) {
- return 0;
- }
}
-
- return u_terminateChars(appendAt, capacity, reslen, status);
}
/**
@@ -1460,7 +1506,7 @@ cleanup:
* Note: char* buf is used for storing keywords
*/
static void
-_appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendTo, char* buf, int32_t bufSize, UBool *posixVariant, UErrorCode *status) {
+_appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendTo, icu::MemoryPool<ExtensionListEntry>& extPool, icu::MemoryPool<icu::CharString>& kwdBuf, UBool *posixVariant, UErrorCode *status) {
const char *pTag; /* beginning of current subtag */
const char *pKwds; /* beginning of key-type pairs */
UBool variantExists = *posixVariant;
@@ -1468,14 +1514,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT
ExtensionListEntry *kwdFirst = NULL; /* first LDML keyword */
ExtensionListEntry *kwd, *nextKwd;
- AttributeListEntry *attrFirst = NULL; /* first attribute */
- AttributeListEntry *attr, *nextAttr;
-
int32_t len;
- int32_t bufIdx = 0;
-
- char attrBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY];
- int32_t attrBufIdx = 0;
/* Reset the posixVariant value */
*posixVariant = FALSE;
@@ -1483,100 +1522,90 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT
pTag = ldmlext;
pKwds = NULL;
- /* Iterate through u extension attributes */
- while (*pTag) {
- /* locate next separator char */
- for (len = 0; *(pTag + len) && *(pTag + len) != SEP; len++);
+ {
+ AttributeListEntry *attrFirst = NULL; /* first attribute */
+ AttributeListEntry *attr, *nextAttr;
- if (ultag_isUnicodeLocaleKey(pTag, len)) {
- pKwds = pTag;
- break;
- }
+ char attrBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY];
+ int32_t attrBufIdx = 0;
- /* add this attribute to the list */
- attr = (AttributeListEntry*)uprv_malloc(sizeof(AttributeListEntry));
- if (attr == NULL) {
- *status = U_MEMORY_ALLOCATION_ERROR;
- goto cleanup;
- }
+ icu::MemoryPool<AttributeListEntry> attrPool;
- if (len < (int32_t)sizeof(attrBuf) - attrBufIdx) {
- uprv_memcpy(&attrBuf[attrBufIdx], pTag, len);
- attrBuf[attrBufIdx + len] = 0;
- attr->attribute = &attrBuf[attrBufIdx];
- attrBufIdx += (len + 1);
- } else {
- *status = U_ILLEGAL_ARGUMENT_ERROR;
- uprv_free(attr);
- goto cleanup;
- }
+ /* Iterate through u extension attributes */
+ while (*pTag) {
+ /* locate next separator char */
+ for (len = 0; *(pTag + len) && *(pTag + len) != SEP; len++);
- if (!_addAttributeToList(&attrFirst, attr)) {
- *status = U_ILLEGAL_ARGUMENT_ERROR;
- uprv_free(attr);
- goto cleanup;
- }
+ if (ultag_isUnicodeLocaleKey(pTag, len)) {
+ pKwds = pTag;
+ break;
+ }
- /* next tag */
- pTag += len;
- if (*pTag) {
- /* next to the separator */
- pTag++;
- }
- }
+ /* add this attribute to the list */
+ attr = attrPool.create();
+ if (attr == NULL) {
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
- if (attrFirst) {
- /* emit attributes as an LDML keyword, e.g. attribute=attr1-attr2 */
+ if (len < (int32_t)sizeof(attrBuf) - attrBufIdx) {
+ uprv_memcpy(&attrBuf[attrBufIdx], pTag, len);
+ attrBuf[attrBufIdx + len] = 0;
+ attr->attribute = &attrBuf[attrBufIdx];
+ attrBufIdx += (len + 1);
+ } else {
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
- if (attrBufIdx > bufSize) {
- /* attrBufIdx == <total length of attribute subtag> + 1 */
- *status = U_ILLEGAL_ARGUMENT_ERROR;
- goto cleanup;
- }
+ // duplicate attribute is ignored, causes no error.
+ _addAttributeToList(&attrFirst, attr);
- kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry));
- if (kwd == NULL) {
- *status = U_MEMORY_ALLOCATION_ERROR;
- goto cleanup;
+ /* next tag */
+ pTag += len;
+ if (*pTag) {
+ /* next to the separator */
+ pTag++;
+ }
}
- kwd->key = LOCALE_ATTRIBUTE_KEY;
- kwd->value = buf;
-
- /* attribute subtags sorted in alphabetical order as type */
- attr = attrFirst;
- while (attr != NULL) {
- nextAttr = attr->next;
+ if (attrFirst) {
+ /* emit attributes as an LDML keyword, e.g. attribute=attr1-attr2 */
- /* buffer size check is done above */
- if (attr != attrFirst) {
- *(buf + bufIdx) = SEP;
- bufIdx++;
+ kwd = extPool.create();
+ if (kwd == NULL) {
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ return;
}
- len = static_cast<int32_t>(uprv_strlen(attr->attribute));
- uprv_memcpy(buf + bufIdx, attr->attribute, len);
- bufIdx += len;
+ icu::CharString* value = kwdBuf.create();
+ if (value == NULL) {
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
- attr = nextAttr;
- }
- *(buf + bufIdx) = 0;
- bufIdx++;
+ /* attribute subtags sorted in alphabetical order as type */
+ attr = attrFirst;
+ while (attr != NULL) {
+ nextAttr = attr->next;
+ if (attr != attrFirst) {
+ value->append('-', *status);
+ }
+ value->append(attr->attribute, *status);
+ attr = nextAttr;
+ }
+ if (U_FAILURE(*status)) {
+ return;
+ }
- if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) {
- *status = U_ILLEGAL_ARGUMENT_ERROR;
- uprv_free(kwd);
- goto cleanup;
- }
+ kwd->key = LOCALE_ATTRIBUTE_KEY;
+ kwd->value = value->data();
- /* once keyword entry is created, delete the attribute list */
- attr = attrFirst;
- while (attr != NULL) {
- nextAttr = attr->next;
- uprv_free(attr);
- attr = nextAttr;
+ if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) {
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
}
- attrFirst = NULL;
}
if (pKwds) {
@@ -1640,7 +1669,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT
if (bcpKeyLen >= (int32_t)sizeof(bcpKeyBuf)) {
/* the BCP key is invalid */
*status = U_ILLEGAL_ARGUMENT_ERROR;
- goto cleanup;
+ return;
}
uprv_strncpy(bcpKeyBuf, pBcpKey, bcpKeyLen);
@@ -1650,7 +1679,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT
pKey = uloc_toLegacyKey(bcpKeyBuf);
if (pKey == NULL) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
- goto cleanup;
+ return;
}
if (pKey == bcpKeyBuf) {
/*
@@ -1658,16 +1687,15 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT
We normalize the result key to lower case.
*/
T_CString_toLowerCase(bcpKeyBuf);
- if (bufSize - bufIdx - 1 >= bcpKeyLen) {
- uprv_memcpy(buf + bufIdx, bcpKeyBuf, bcpKeyLen);
- pKey = buf + bufIdx;
- bufIdx += bcpKeyLen;
- *(buf + bufIdx) = 0;
- bufIdx++;
- } else {
- *status = U_BUFFER_OVERFLOW_ERROR;
- goto cleanup;
+ icu::CharString* key = kwdBuf.create(bcpKeyBuf, bcpKeyLen, *status);
+ if (key == NULL) {
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ return;
}
+ if (U_FAILURE(*status)) {
+ return;
+ }
+ pKey = key->data();
}
if (pBcpType) {
@@ -1675,7 +1703,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT
if (bcpTypeLen >= (int32_t)sizeof(bcpTypeBuf)) {
/* the BCP type is too long */
*status = U_ILLEGAL_ARGUMENT_ERROR;
- goto cleanup;
+ return;
}
uprv_strncpy(bcpTypeBuf, pBcpType, bcpTypeLen);
@@ -1685,7 +1713,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT
pType = uloc_toLegacyType(pKey, bcpTypeBuf);
if (pType == NULL) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
- goto cleanup;
+ return;
}
if (pType == bcpTypeBuf) {
/*
@@ -1694,16 +1722,15 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT
*/
/* normalize to lower case */
T_CString_toLowerCase(bcpTypeBuf);
- if (bufSize - bufIdx - 1 >= bcpTypeLen) {
- uprv_memcpy(buf + bufIdx, bcpTypeBuf, bcpTypeLen);
- pType = buf + bufIdx;
- bufIdx += bcpTypeLen;
- *(buf + bufIdx) = 0;
- bufIdx++;
- } else {
- *status = U_BUFFER_OVERFLOW_ERROR;
- goto cleanup;
+ icu::CharString* type = kwdBuf.create(bcpTypeBuf, bcpTypeLen, *status);
+ if (type == NULL) {
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ return;
}
+ if (U_FAILURE(*status)) {
+ return;
+ }
+ pType = type->data();
}
} else {
/* typeless - default type value is "yes" */
@@ -1716,10 +1743,10 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT
*posixVariant = TRUE;
} else {
/* create an ExtensionListEntry for this keyword */
- kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry));
+ kwd = extPool.create();
if (kwd == NULL) {
*status = U_MEMORY_ALLOCATION_ERROR;
- goto cleanup;
+ return;
}
kwd->key = pKey;
@@ -1728,7 +1755,6 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT
if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) {
// duplicate keyword is allowed, Only the first
// is honored.
- uprv_free(kwd);
}
}
@@ -1746,46 +1772,22 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT
_addExtensionToList(appendTo, kwd, FALSE);
kwd = nextKwd;
}
-
- return;
-
-cleanup:
- attr = attrFirst;
- while (attr != NULL) {
- nextAttr = attr->next;
- uprv_free(attr);
- attr = nextAttr;
- }
-
- kwd = kwdFirst;
- while (kwd != NULL) {
- nextKwd = kwd->next;
- uprv_free(kwd);
- kwd = nextKwd;
- }
}
-static int32_t
-_appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorCode* status) {
- int32_t reslen = 0;
+static void
+_appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode* status) {
int32_t i, n;
int32_t len;
ExtensionListEntry *kwdFirst = NULL;
ExtensionListEntry *kwd;
const char *key, *type;
- char *kwdBuf = NULL;
- int32_t kwdBufLength = capacity;
+ icu::MemoryPool<ExtensionListEntry> extPool;
+ icu::MemoryPool<icu::CharString> kwdBuf;
UBool posixVariant = FALSE;
if (U_FAILURE(*status)) {
- return 0;
- }
-
- kwdBuf = (char*)uprv_malloc(kwdBufLength);
- if (kwdBuf == NULL) {
- *status = U_MEMORY_ALLOCATION_ERROR;
- return 0;
+ return;
}
/* Determine if variants already exists */
@@ -1800,12 +1802,12 @@ _appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorC
key = ultag_getExtensionKey(langtag, i);
type = ultag_getExtensionValue(langtag, i);
if (*key == LDMLEXT) {
- _appendLDMLExtensionAsKeywords(type, &kwdFirst, kwdBuf, kwdBufLength, &posixVariant, status);
+ _appendLDMLExtensionAsKeywords(type, &kwdFirst, extPool, kwdBuf, &posixVariant, status);
if (U_FAILURE(*status)) {
break;
}
} else {
- kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry));
+ kwd = extPool.create();
if (kwd == NULL) {
*status = U_MEMORY_ALLOCATION_ERROR;
break;
@@ -1813,7 +1815,6 @@ _appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorC
kwd->key = key;
kwd->value = type;
if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) {
- uprv_free(kwd);
*status = U_ILLEGAL_ARGUMENT_ERROR;
break;
}
@@ -1824,14 +1825,13 @@ _appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorC
type = ultag_getPrivateUse(langtag);
if ((int32_t)uprv_strlen(type) > 0) {
/* add private use as a keyword */
- kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry));
+ kwd = extPool.create();
if (kwd == NULL) {
*status = U_MEMORY_ALLOCATION_ERROR;
} else {
kwd->key = PRIVATEUSE_KEY;
kwd->value = type;
if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) {
- uprv_free(kwd);
*status = U_ILLEGAL_ARGUMENT_ERROR;
}
}
@@ -1842,10 +1842,7 @@ _appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorC
if (U_SUCCESS(*status) && posixVariant) {
len = (int32_t) uprv_strlen(_POSIX);
- if (reslen < capacity) {
- uprv_memcpy(appendAt + reslen, _POSIX, uprv_min(len, capacity - reslen));
- }
- reslen += len;
+ sink.Append(_POSIX, len);
}
if (U_SUCCESS(*status) && kwdFirst != NULL) {
@@ -1853,70 +1850,39 @@ _appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorC
UBool firstValue = TRUE;
kwd = kwdFirst;
do {
- if (reslen < capacity) {
- if (firstValue) {
- /* '@' */
- *(appendAt + reslen) = LOCALE_EXT_SEP;
- firstValue = FALSE;
- } else {
- /* ';' */
- *(appendAt + reslen) = LOCALE_KEYWORD_SEP;
- }
+ if (firstValue) {
+ sink.Append("@", 1);
+ firstValue = FALSE;
+ } else {
+ sink.Append(";", 1);
}
- reslen++;
/* key */
len = (int32_t)uprv_strlen(kwd->key);
- if (reslen < capacity) {
- uprv_memcpy(appendAt + reslen, kwd->key, uprv_min(len, capacity - reslen));
- }
- reslen += len;
-
- /* '=' */
- if (reslen < capacity) {
- *(appendAt + reslen) = LOCALE_KEY_TYPE_SEP;
- }
- reslen++;
+ sink.Append(kwd->key, len);
+ sink.Append("=", 1);
/* type */
len = (int32_t)uprv_strlen(kwd->value);
- if (reslen < capacity) {
- uprv_memcpy(appendAt + reslen, kwd->value, uprv_min(len, capacity - reslen));
- }
- reslen += len;
+ sink.Append(kwd->value, len);
kwd = kwd->next;
} while (kwd);
}
-
- /* clean up */
- kwd = kwdFirst;
- while (kwd != NULL) {
- ExtensionListEntry *tmpKwd = kwd->next;
- uprv_free(kwd);
- kwd = tmpKwd;
- }
-
- uprv_free(kwdBuf);
-
- if (U_FAILURE(*status)) {
- return 0;
- }
-
- return u_terminateChars(appendAt, capacity, reslen, status);
}
-static int32_t
-_appendPrivateuseToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UBool hadPosix, UErrorCode* status) {
+static void
+_appendPrivateuseToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UBool hadPosix, UErrorCode* status) {
(void)hadPosix;
char buf[ULOC_FULLNAME_CAPACITY];
char tmpAppend[ULOC_FULLNAME_CAPACITY];
UErrorCode tmpStatus = U_ZERO_ERROR;
int32_t len, i;
int32_t reslen = 0;
+ int32_t capacity = sizeof tmpAppend;
if (U_FAILURE(*status)) {
- return 0;
+ return;
}
len = uloc_getVariant(localeID, buf, sizeof(buf), &tmpStatus);
@@ -1924,7 +1890,7 @@ _appendPrivateuseToLanguageTag(const char* localeID, char* appendAt, int32_t cap
if (strict) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
}
- return 0;
+ return;
}
if (len > 0) {
@@ -2008,20 +1974,14 @@ _appendPrivateuseToLanguageTag(const char* localeID, char* appendAt, int32_t cap
}
if (U_FAILURE(*status)) {
- return 0;
+ return;
}
}
if (U_SUCCESS(*status)) {
len = reslen;
- if (reslen < capacity) {
- uprv_memcpy(appendAt, tmpAppend, uprv_min(len, capacity - reslen));
- }
+ sink.Append(tmpAppend, len);
}
-
- u_terminateChars(appendAt, capacity, reslen, status);
-
- return reslen;
}
/*
@@ -2053,7 +2013,6 @@ _appendPrivateuseToLanguageTag(const char* localeID, char* appendAt, int32_t cap
static ULanguageTag*
ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* status) {
- ULanguageTag *t;
char *tagBuf;
int16_t next;
char *pSubtag, *pNext, *pLastGoodPosition;
@@ -2087,44 +2046,60 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta
*(tagBuf + tagLen) = 0;
/* create a ULanguageTag */
- t = (ULanguageTag*)uprv_malloc(sizeof(ULanguageTag));
- if (t == NULL) {
+ icu::LocalULanguageTagPointer t(
+ (ULanguageTag*)uprv_malloc(sizeof(ULanguageTag)));
+ if (t.isNull()) {
uprv_free(tagBuf);
*status = U_MEMORY_ALLOCATION_ERROR;
return NULL;
}
- _initializeULanguageTag(t);
+ _initializeULanguageTag(t.getAlias());
t->buf = tagBuf;
if (tagLen < MINLEN) {
/* the input tag is too short - return empty ULanguageTag */
- return t;
+ return t.orphan();
}
+ size_t parsedLenDelta = 0;
+ // Grandfathered tag will be consider together. Grandfathered tag with intervening
+ // script and region such as art-DE-lojban or art-Latn-lojban won't be
+ // matched.
/* check if the tag is grandfathered */
for (i = 0; i < UPRV_LENGTHOF(GRANDFATHERED); i += 2) {
- if (uprv_stricmp(GRANDFATHERED[i], tagBuf) == 0) {
+ int32_t checkGrandfatheredLen = static_cast<int32_t>(uprv_strlen(GRANDFATHERED[i]));
+ if (tagLen < checkGrandfatheredLen) {
+ continue;
+ }
+ if (tagLen > checkGrandfatheredLen && tagBuf[checkGrandfatheredLen] != '-') {
+ // make sure next char is '-'.
+ continue;
+ }
+ if (uprv_strnicmp(GRANDFATHERED[i], tagBuf, checkGrandfatheredLen) == 0) {
int32_t newTagLength;
- grandfatheredLen = tagLen; /* back up for output parsedLen */
- newTagLength = static_cast<int32_t>(uprv_strlen(GRANDFATHERED[i+1]));
+ grandfatheredLen = checkGrandfatheredLen; /* back up for output parsedLen */
+ int32_t replacementLen = static_cast<int32_t>(uprv_strlen(GRANDFATHERED[i+1]));
+ newTagLength = replacementLen + tagLen - checkGrandfatheredLen;
if (tagLen < newTagLength) {
uprv_free(tagBuf);
tagBuf = (char*)uprv_malloc(newTagLength + 1);
if (tagBuf == NULL) {
*status = U_MEMORY_ALLOCATION_ERROR;
- ultag_close(t);
return NULL;
}
t->buf = tagBuf;
tagLen = newTagLength;
}
+ parsedLenDelta = checkGrandfatheredLen - replacementLen;
uprv_strcpy(t->buf, GRANDFATHERED[i + 1]);
+ if (checkGrandfatheredLen != tagLen) {
+ uprv_strcpy(t->buf + replacementLen, tag + checkGrandfatheredLen);
+ }
break;
}
}
- size_t parsedLenDelta = 0;
if (grandfatheredLen == 0) {
for (i = 0; i < UPRV_LENGTHOF(REDUNDANT); i += 2) {
const char* redundantTag = REDUNDANT[i];
@@ -2193,7 +2168,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta
subtagLen = (int32_t)(pSep - pSubtag);
if (next & LANG) {
- if (_isLanguageSubtag(pSubtag, subtagLen)) {
+ if (ultag_isLanguageSubtag(pSubtag, subtagLen)) {
*pSep = 0; /* terminate */
// TODO: move deprecated language code handling here.
t->language = T_CString_toLowerCase(pSubtag);
@@ -2220,7 +2195,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta
}
}
if (next & SCRT) {
- if (_isScriptSubtag(pSubtag, subtagLen)) {
+ if (ultag_isScriptSubtag(pSubtag, subtagLen)) {
char *p = pSubtag;
*pSep = 0;
@@ -2240,7 +2215,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta
}
}
if (next & REGN) {
- if (_isRegionSubtag(pSubtag, subtagLen)) {
+ if (ultag_isRegionSubtag(pSubtag, subtagLen)) {
*pSep = 0;
// TODO: move deprecated region code handling here.
t->region = T_CString_toUpperCase(pSubtag);
@@ -2259,7 +2234,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta
var = (VariantListEntry*)uprv_malloc(sizeof(VariantListEntry));
if (var == NULL) {
*status = U_MEMORY_ALLOCATION_ERROR;
- goto error;
+ return NULL;
}
*pSep = 0;
var->variant = T_CString_toUpperCase(pSubtag);
@@ -2303,7 +2278,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta
pExtension = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry));
if (pExtension == NULL) {
*status = U_MEMORY_ALLOCATION_ERROR;
- goto error;
+ return NULL;
}
*pSep = 0;
pExtension->key = T_CString_toLowerCase(pSubtag);
@@ -2439,15 +2414,10 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta
}
if (parsedLen != NULL) {
- *parsedLen = (grandfatheredLen > 0) ? grandfatheredLen :
- (int32_t)(pLastGoodPosition - t->buf + parsedLenDelta);
+ *parsedLen = (int32_t)(pLastGoodPosition - t->buf + parsedLenDelta);
}
- return t;
-
-error:
- ultag_close(t);
- return NULL;
+ return t.orphan();
}
/**
@@ -2637,6 +2607,34 @@ uloc_toLanguageTag(const char* localeID,
int32_t langtagCapacity,
UBool strict,
UErrorCode* status) {
+ if (U_FAILURE(*status)) {
+ return 0;
+ }
+
+ icu::CheckedArrayByteSink sink(langtag, langtagCapacity);
+ ulocimp_toLanguageTag(localeID, sink, strict, status);
+
+ int32_t reslen = sink.NumberOfBytesAppended();
+
+ if (U_FAILURE(*status)) {
+ return reslen;
+ }
+
+ if (sink.Overflowed()) {
+ *status = U_BUFFER_OVERFLOW_ERROR;
+ } else {
+ u_terminateChars(langtag, langtagCapacity, reslen, status);
+ }
+
+ return reslen;
+}
+
+
+U_CAPI void U_EXPORT2
+ulocimp_toLanguageTag(const char* localeID,
+ icu::ByteSink& sink,
+ UBool strict,
+ UErrorCode* status) {
icu::CharString canonical;
int32_t reslen;
UErrorCode tmpStatus = U_ZERO_ERROR;
@@ -2657,7 +2655,7 @@ uloc_toLanguageTag(const char* localeID,
if (U_FAILURE(tmpStatus)) {
*status = tmpStatus;
- return 0;
+ return;
}
reslen =
@@ -2673,7 +2671,7 @@ uloc_toLanguageTag(const char* localeID,
if (U_FAILURE(tmpStatus)) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
- return 0;
+ return;
}
canonical.append(buffer, reslen, tmpStatus);
@@ -2683,38 +2681,33 @@ uloc_toLanguageTag(const char* localeID,
if (U_FAILURE(tmpStatus)) {
*status = tmpStatus;
- return 0;
+ return;
}
}
- reslen = 0;
-
/* For handling special case - private use only tag */
pKeywordStart = locale_getKeywordsStart(canonical.data());
if (pKeywordStart == canonical.data()) {
- UEnumeration *kwdEnum;
int kwdCnt = 0;
UBool done = FALSE;
- kwdEnum = uloc_openKeywords(canonical.data(), &tmpStatus);
- if (kwdEnum != NULL) {
- kwdCnt = uenum_count(kwdEnum, &tmpStatus);
+ icu::LocalUEnumerationPointer kwdEnum(uloc_openKeywords(canonical.data(), &tmpStatus));
+ if (U_SUCCESS(tmpStatus)) {
+ kwdCnt = uenum_count(kwdEnum.getAlias(), &tmpStatus);
if (kwdCnt == 1) {
const char *key;
int32_t len = 0;
- key = uenum_next(kwdEnum, &len, &tmpStatus);
+ key = uenum_next(kwdEnum.getAlias(), &len, &tmpStatus);
if (len == 1 && *key == PRIVATEUSE) {
char buf[ULOC_KEYWORD_AND_VALUES_CAPACITY];
buf[0] = PRIVATEUSE;
buf[1] = SEP;
len = uloc_getKeywordValue(localeID, key, &buf[2], sizeof(buf) - 2, &tmpStatus);
if (U_SUCCESS(tmpStatus)) {
- if (_isPrivateuseValueSubtags(&buf[2], len)) {
+ if (ultag_isPrivateuseValueSubtags(&buf[2], len)) {
/* return private use only tag */
- reslen = len + 2;
- uprv_memcpy(langtag, buf, uprv_min(reslen, langtagCapacity));
- u_terminateChars(langtag, langtagCapacity, reslen, status);
+ sink.Append(buf, len + 2);
done = TRUE;
} else if (strict) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
@@ -2727,21 +2720,18 @@ uloc_toLanguageTag(const char* localeID,
}
}
}
- uenum_close(kwdEnum);
if (done) {
- return reslen;
+ return;
}
}
}
- reslen += _appendLanguageToLanguageTag(canonical.data(), langtag, langtagCapacity, strict, status);
- reslen += _appendScriptToLanguageTag(canonical.data(), langtag + reslen, langtagCapacity - reslen, strict, status);
- reslen += _appendRegionToLanguageTag(canonical.data(), langtag + reslen, langtagCapacity - reslen, strict, status);
- reslen += _appendVariantsToLanguageTag(canonical.data(), langtag + reslen, langtagCapacity - reslen, strict, &hadPosix, status);
- reslen += _appendKeywordsToLanguageTag(canonical.data(), langtag + reslen, langtagCapacity - reslen, strict, hadPosix, status);
- reslen += _appendPrivateuseToLanguageTag(canonical.data(), langtag + reslen, langtagCapacity - reslen, strict, hadPosix, status);
-
- return reslen;
+ _appendLanguageToLanguageTag(canonical.data(), sink, strict, status);
+ _appendScriptToLanguageTag(canonical.data(), sink, strict, status);
+ _appendRegionToLanguageTag(canonical.data(), sink, strict, status);
+ _appendVariantsToLanguageTag(canonical.data(), sink, strict, &hadPosix, status);
+ _appendKeywordsToLanguageTag(canonical.data(), sink, strict, hadPosix, status);
+ _appendPrivateuseToLanguageTag(canonical.data(), sink, strict, hadPosix, status);
}
@@ -2751,136 +2741,116 @@ uloc_forLanguageTag(const char* langtag,
int32_t localeIDCapacity,
int32_t* parsedLength,
UErrorCode* status) {
- return ulocimp_forLanguageTag(
- langtag,
- -1,
- localeID,
- localeIDCapacity,
- parsedLength,
- status);
+ if (U_FAILURE(*status)) {
+ return 0;
+ }
+
+ icu::CheckedArrayByteSink sink(localeID, localeIDCapacity);
+ ulocimp_forLanguageTag(langtag, -1, sink, parsedLength, status);
+
+ int32_t reslen = sink.NumberOfBytesAppended();
+
+ if (U_FAILURE(*status)) {
+ return reslen;
+ }
+
+ if (sink.Overflowed()) {
+ *status = U_BUFFER_OVERFLOW_ERROR;
+ } else {
+ u_terminateChars(localeID, localeIDCapacity, reslen, status);
+ }
+
+ return reslen;
}
-U_CAPI int32_t U_EXPORT2
+U_CAPI void U_EXPORT2
ulocimp_forLanguageTag(const char* langtag,
int32_t tagLen,
- char* localeID,
- int32_t localeIDCapacity,
+ icu::ByteSink& sink,
int32_t* parsedLength,
UErrorCode* status) {
- ULanguageTag *lt;
- int32_t reslen = 0;
+ UBool isEmpty = TRUE;
const char *subtag, *p;
int32_t len;
int32_t i, n;
UBool noRegion = TRUE;
- lt = ultag_parse(langtag, tagLen, parsedLength, status);
+ icu::LocalULanguageTagPointer lt(ultag_parse(langtag, tagLen, parsedLength, status));
if (U_FAILURE(*status)) {
- return 0;
+ return;
}
/* language */
- subtag = ultag_getExtlangSize(lt) > 0 ? ultag_getExtlang(lt, 0) : ultag_getLanguage(lt);
+ subtag = ultag_getExtlangSize(lt.getAlias()) > 0 ? ultag_getExtlang(lt.getAlias(), 0) : ultag_getLanguage(lt.getAlias());
if (uprv_compareInvCharsAsAscii(subtag, LANG_UND) != 0) {
len = (int32_t)uprv_strlen(subtag);
if (len > 0) {
- if (reslen < localeIDCapacity) {
- uprv_memcpy(localeID, subtag, uprv_min(len, localeIDCapacity - reslen));
- }
- reslen += len;
+ sink.Append(subtag, len);
+ isEmpty = FALSE;
}
}
/* script */
- subtag = ultag_getScript(lt);
+ subtag = ultag_getScript(lt.getAlias());
len = (int32_t)uprv_strlen(subtag);
if (len > 0) {
- if (reslen < localeIDCapacity) {
- *(localeID + reslen) = LOCALE_SEP;
- }
- reslen++;
+ sink.Append("_", 1);
+ isEmpty = FALSE;
/* write out the script in title case */
- p = subtag;
- while (*p) {
- if (reslen < localeIDCapacity) {
- if (p == subtag) {
- *(localeID + reslen) = uprv_toupper(*p);
- } else {
- *(localeID + reslen) = *p;
- }
- }
- reslen++;
- p++;
- }
+ char c = uprv_toupper(*subtag);
+ sink.Append(&c, 1);
+ sink.Append(subtag + 1, len - 1);
}
/* region */
- subtag = ultag_getRegion(lt);
+ subtag = ultag_getRegion(lt.getAlias());
len = (int32_t)uprv_strlen(subtag);
if (len > 0) {
- if (reslen < localeIDCapacity) {
- *(localeID + reslen) = LOCALE_SEP;
- }
- reslen++;
- /* write out the retion in upper case */
+ sink.Append("_", 1);
+ isEmpty = FALSE;
+
+ /* write out the region in upper case */
p = subtag;
while (*p) {
- if (reslen < localeIDCapacity) {
- *(localeID + reslen) = uprv_toupper(*p);
- }
- reslen++;
+ char c = uprv_toupper(*p);
+ sink.Append(&c, 1);
p++;
}
noRegion = FALSE;
}
/* variants */
- n = ultag_getVariantsSize(lt);
+ n = ultag_getVariantsSize(lt.getAlias());
if (n > 0) {
if (noRegion) {
- if (reslen < localeIDCapacity) {
- *(localeID + reslen) = LOCALE_SEP;
- }
- reslen++;
+ sink.Append("_", 1);
+ isEmpty = FALSE;
}
for (i = 0; i < n; i++) {
- subtag = ultag_getVariant(lt, i);
- if (reslen < localeIDCapacity) {
- *(localeID + reslen) = LOCALE_SEP;
- }
- reslen++;
+ subtag = ultag_getVariant(lt.getAlias(), i);
+ sink.Append("_", 1);
+
/* write out the variant in upper case */
p = subtag;
while (*p) {
- if (reslen < localeIDCapacity) {
- *(localeID + reslen) = uprv_toupper(*p);
- }
- reslen++;
+ char c = uprv_toupper(*p);
+ sink.Append(&c, 1);
p++;
}
}
}
/* keywords */
- n = ultag_getExtensionsSize(lt);
- subtag = ultag_getPrivateUse(lt);
+ n = ultag_getExtensionsSize(lt.getAlias());
+ subtag = ultag_getPrivateUse(lt.getAlias());
if (n > 0 || uprv_strlen(subtag) > 0) {
- if (reslen == 0 && n > 0) {
+ if (isEmpty && n > 0) {
/* need a language */
- if (reslen < localeIDCapacity) {
- uprv_memcpy(localeID + reslen, LANG_UND, uprv_min(LANG_UND_LEN, localeIDCapacity - reslen));
- }
- reslen += LANG_UND_LEN;
+ sink.Append(LANG_UND, LANG_UND_LEN);
}
- len = _appendKeywords(lt, localeID + reslen, localeIDCapacity - reslen, status);
- reslen += len;
+ _appendKeywords(lt.getAlias(), sink, status);
}
-
- ultag_close(lt);
- return u_terminateChars(localeID, localeIDCapacity, reslen, status);
}
-
-
diff --git a/Build/source/libs/icu/icu-src/source/common/ulocimp.h b/Build/source/libs/icu/icu-src/source/common/ulocimp.h
index aa2090ebba6..31d3c44d0be 100644
--- a/Build/source/libs/icu/icu-src/source/common/ulocimp.h
+++ b/Build/source/libs/icu/icu-src/source/common/ulocimp.h
@@ -10,6 +10,7 @@
#ifndef ULOCIMP_H
#define ULOCIMP_H
+#include "unicode/bytestream.h"
#include "unicode/uloc.h"
/**
@@ -62,6 +63,31 @@ ulocimp_getCountry(const char *localeID,
const char **pEnd);
/**
+ * Writes a well-formed language tag for this locale ID.
+ *
+ * **Note**: When `strict` is FALSE, any locale fields which do not satisfy the
+ * BCP47 syntax requirement will be omitted from the result. When `strict` is
+ * TRUE, this function sets U_ILLEGAL_ARGUMENT_ERROR to the `err` if any locale
+ * fields do not satisfy the BCP47 syntax requirement.
+ *
+ * @param localeID the input locale ID
+ * @param sink the output sink receiving the BCP47 language
+ * tag for this Locale.
+ * @param strict boolean value indicating if the function returns
+ * an error for an ill-formed input locale ID.
+ * @param err error information if receiving the language
+ * tag failed.
+ * @return The length of the BCP47 language tag.
+ *
+ * @internal ICU 64
+ */
+U_STABLE void U_EXPORT2
+ulocimp_toLanguageTag(const char* localeID,
+ icu::ByteSink& sink,
+ UBool strict,
+ UErrorCode* err);
+
+/**
* Returns a locale ID for the specified BCP47 language tag string.
* If the specified language tag contains any ill-formed subtags,
* the first such subtag and all following subtags are ignored.
@@ -75,21 +101,18 @@ ulocimp_getCountry(const char *localeID,
* the first paragraph, so some information might be lost.
* @param langtag the input BCP47 language tag.
* @param tagLen the length of langtag, or -1 to call uprv_strlen().
- * @param localeID the output buffer receiving a locale ID for the
+ * @param sink the output sink receiving a locale ID for the
* specified BCP47 language tag.
- * @param localeIDCapacity the size of the locale ID output buffer.
* @param parsedLength if not NULL, successfully parsed length
* for the input language tag is set.
* @param err error information if receiving the locald ID
* failed.
- * @return the length of the locale ID.
* @internal ICU 63
*/
-U_CAPI int32_t U_EXPORT2
+U_CAPI void U_EXPORT2
ulocimp_forLanguageTag(const char* langtag,
int32_t tagLen,
- char* localeID,
- int32_t localeIDCapacity,
+ icu::ByteSink& sink,
int32_t* parsedLength,
UErrorCode* err);
@@ -122,9 +145,103 @@ U_CAPI int32_t U_EXPORT2
ulocimp_getRegionForSupplementalData(const char *localeID, UBool inferRegion,
char *region, int32_t regionCapacity, UErrorCode* status);
+/**
+ * Add the likely subtags for a provided locale ID, per the algorithm described
+ * in the following CLDR technical report:
+ *
+ * http://www.unicode.org/reports/tr35/#Likely_Subtags
+ *
+ * If localeID is already in the maximal form, or there is no data available
+ * for maximization, it will be copied to the output buffer. For example,
+ * "und-Zzzz" cannot be maximized, since there is no reasonable maximization.
+ *
+ * Examples:
+ *
+ * "en" maximizes to "en_Latn_US"
+ *
+ * "de" maximizes to "de_Latn_US"
+ *
+ * "sr" maximizes to "sr_Cyrl_RS"
+ *
+ * "sh" maximizes to "sr_Latn_RS" (Note this will not reverse.)
+ *
+ * "zh_Hani" maximizes to "zh_Hans_CN" (Note this will not reverse.)
+ *
+ * @param localeID The locale to maximize
+ * @param sink The output sink receiving the maximized locale
+ * @param err Error information if maximizing the locale failed. If the length
+ * of the localeID and the null-terminator is greater than the maximum allowed size,
+ * or the localeId is not well-formed, the error code is U_ILLEGAL_ARGUMENT_ERROR.
+ * @internal ICU 64
+ */
+U_STABLE void U_EXPORT2
+ulocimp_addLikelySubtags(const char* localeID,
+ icu::ByteSink& sink,
+ UErrorCode* err);
+
+/**
+ * Minimize the subtags for a provided locale ID, per the algorithm described
+ * in the following CLDR technical report:
+ *
+ * http://www.unicode.org/reports/tr35/#Likely_Subtags
+ *
+ * If localeID is already in the minimal form, or there is no data available
+ * for minimization, it will be copied to the output buffer. Since the
+ * minimization algorithm relies on proper maximization, see the comments
+ * for ulocimp_addLikelySubtags for reasons why there might not be any data.
+ *
+ * Examples:
+ *
+ * "en_Latn_US" minimizes to "en"
+ *
+ * "de_Latn_US" minimizes to "de"
+ *
+ * "sr_Cyrl_RS" minimizes to "sr"
+ *
+ * "zh_Hant_TW" minimizes to "zh_TW" (The region is preferred to the
+ * script, and minimizing to "zh" would imply "zh_Hans_CN".)
+ *
+ * @param localeID The locale to minimize
+ * @param sink The output sink receiving the maximized locale
+ * @param err Error information if minimizing the locale failed. If the length
+ * of the localeID and the null-terminator is greater than the maximum allowed size,
+ * or the localeId is not well-formed, the error code is U_ILLEGAL_ARGUMENT_ERROR.
+ * @internal ICU 64
+ */
+U_STABLE void U_EXPORT2
+ulocimp_minimizeSubtags(const char* localeID,
+ icu::ByteSink& sink,
+ UErrorCode* err);
+
U_CAPI const char * U_EXPORT2
locale_getKeywordsStart(const char *localeID);
+U_CFUNC UBool
+ultag_isExtensionSubtags(const char* s, int32_t len);
+
+U_CFUNC UBool
+ultag_isLanguageSubtag(const char* s, int32_t len);
+
+U_CFUNC UBool
+ultag_isPrivateuseValueSubtags(const char* s, int32_t len);
+
+U_CFUNC UBool
+ultag_isRegionSubtag(const char* s, int32_t len);
+
+U_CFUNC UBool
+ultag_isScriptSubtag(const char* s, int32_t len);
+
+U_CFUNC UBool
+ultag_isTransformedExtensionSubtags(const char* s, int32_t len);
+
+U_CFUNC UBool
+ultag_isUnicodeExtensionSubtags(const char* s, int32_t len);
+
+U_CFUNC UBool
+ultag_isUnicodeLocaleAttribute(const char* s, int32_t len);
+
+U_CFUNC UBool
+ultag_isUnicodeLocaleAttributes(const char* s, int32_t len);
U_CFUNC UBool
ultag_isUnicodeLocaleKey(const char* s, int32_t len);
@@ -132,6 +249,9 @@ ultag_isUnicodeLocaleKey(const char* s, int32_t len);
U_CFUNC UBool
ultag_isUnicodeLocaleType(const char* s, int32_t len);
+U_CFUNC UBool
+ultag_isVariantSubtags(const char* s, int32_t len);
+
U_CFUNC const char*
ulocimp_toBcpKey(const char* key);
diff --git a/Build/source/libs/icu/icu-src/source/common/umapfile.cpp b/Build/source/libs/icu/icu-src/source/common/umapfile.cpp
index 175e1a93ef3..3e714876a4d 100644
--- a/Build/source/libs/icu/icu-src/source/common/umapfile.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/umapfile.cpp
@@ -37,12 +37,32 @@
# define NOSERVICE
# define NOIME
# define NOMCX
+
+# if U_PLATFORM_HAS_WINUWP_API == 1
+ // Some previous versions of the Windows 10 SDK don't expose various APIs for UWP applications
+ // to use, even though UWP apps are allowed to call and use them. Temporarily change the
+ // WINAPI family partition below to Desktop, so that function declarations are visible for UWP.
+# include <winapifamily.h>
+# if !(WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM))
+# pragma push_macro("WINAPI_PARTITION_DESKTOP")
+# undef WINAPI_PARTITION_DESKTOP
+# define WINAPI_PARTITION_DESKTOP 1
+# define CHANGED_WINAPI_PARTITION_DESKTOP_VALUE
+# endif
+# endif
+
# include <windows.h>
+
+# if U_PLATFORM_HAS_WINUWP_API == 1 && defined(CHANGED_WINAPI_PARTITION_DESKTOP_VALUE)
+# pragma pop_macro("WINAPI_PARTITION_DESKTOP")
+# endif
+
# include "cmemory.h"
- typedef HANDLE MemoryMap;
+typedef HANDLE MemoryMap;
+
+# define IS_MAP(map) ((map)!=nullptr)
-# define IS_MAP(map) ((map)!=NULL)
#elif MAP_IMPLEMENTATION==MAP_POSIX || MAP_IMPLEMENTATION==MAP_390DLL
typedef size_t MemoryMap;
@@ -74,7 +94,7 @@
typedef void *MemoryMap;
-# define IS_MAP(map) ((map)!=NULL)
+# define IS_MAP(map) ((map)!=nullptr)
#endif
/*----------------------------------------------------------------------------*
@@ -105,20 +125,24 @@
UErrorCode *status /* Error status, used to report out-of-memory errors. */
)
{
- HANDLE map;
- HANDLE file;
-
if (U_FAILURE(*status)) {
return FALSE;
}
+ HANDLE map = nullptr;
+ HANDLE file = INVALID_HANDLE_VALUE;
+
UDataMemory_init(pData); /* Clear the output struct. */
/* open the input file */
#if U_PLATFORM_HAS_WINUWP_API == 0
- file=CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL,
+ // Note: In the non-UWP code-path (ie: Win32), the value of the path variable might have come from
+ // the CRT 'getenv' function, and would be therefore be encoded in the default ANSI code page.
+ // This means that we can't call the *W version of API below, whereas in the UWP code-path
+ // there is no 'getenv' call, and thus the string will be only UTF-8/Invariant characters.
+ file=CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, nullptr,
OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL|FILE_FLAG_RANDOM_ACCESS, NULL);
+ FILE_ATTRIBUTE_NORMAL|FILE_FLAG_RANDOM_ACCESS, nullptr);
#else
// Convert from UTF-8 string to UTF-16 string.
wchar_t utf16Path[MAX_PATH];
@@ -134,8 +158,9 @@
return FALSE;
}
- // TODO: Is it worth setting extended parameters to specify random access?
- file = CreateFile2(utf16Path, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, NULL);
+ file = CreateFileW(utf16Path, GENERIC_READ, FILE_SHARE_READ, nullptr,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, nullptr);
#endif
if (file == INVALID_HANDLE_VALUE) {
// If we failed to open the file due to an out-of-memory error, then we want
@@ -146,36 +171,13 @@
return FALSE;
}
- /* Declare and initialize a security descriptor.
- This is required for multiuser systems on Windows 2000 SP4 and beyond */
- // TODO: UWP does not have this function and I do not think it is required?
-#if U_PLATFORM_HAS_WINUWP_API == 0
-
- SECURITY_ATTRIBUTES mappingAttributes;
- SECURITY_ATTRIBUTES *mappingAttributesPtr = NULL;
- SECURITY_DESCRIPTOR securityDesc;
-
- if (InitializeSecurityDescriptor(&securityDesc, SECURITY_DESCRIPTOR_REVISION)) {
- /* give the security descriptor a Null Dacl done using the "TRUE, (PACL)NULL" here */
- if (SetSecurityDescriptorDacl(&securityDesc, TRUE, (PACL)NULL, FALSE)) {
- /* Make the security attributes point to the security descriptor */
- uprv_memset(&mappingAttributes, 0, sizeof(mappingAttributes));
- mappingAttributes.nLength = sizeof(mappingAttributes);
- mappingAttributes.lpSecurityDescriptor = &securityDesc;
- mappingAttributes.bInheritHandle = FALSE; /* object uninheritable */
- mappingAttributesPtr = &mappingAttributes;
- }
- }
- /* else creating security descriptors can fail when we are on Windows 98,
- and mappingAttributesPtr == NULL for that case. */
-
+ // Note: We use NULL/nullptr for lpAttributes parameter below.
+ // This means our handle cannot be inherited and we will get the default security descriptor.
/* create an unnamed Windows file-mapping object for the specified file */
- map=CreateFileMapping(file, mappingAttributesPtr, PAGE_READONLY, 0, 0, NULL);
-#else
- map = CreateFileMappingFromApp(file, NULL, PAGE_READONLY, 0, NULL);
-#endif
+ map = CreateFileMappingW(file, nullptr, PAGE_READONLY, 0, 0, nullptr);
+
CloseHandle(file);
- if (map == NULL) {
+ if (map == nullptr) {
// If we failed to create the mapping due to an out-of-memory error, then
// we want to report that error back to the caller.
if (HRESULT_FROM_WIN32(GetLastError()) == E_OUTOFMEMORY) {
@@ -185,22 +187,22 @@
}
/* map a view of the file into our address space */
- pData->pHeader=(const DataHeader *)MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);
- if(pData->pHeader==NULL) {
+ pData->pHeader = reinterpret_cast<const DataHeader *>(MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0));
+ if (pData->pHeader == nullptr) {
CloseHandle(map);
return FALSE;
}
- pData->map=map;
+ pData->map = map;
return TRUE;
}
U_CFUNC void
uprv_unmapFile(UDataMemory *pData) {
- if(pData!=NULL && pData->map!=NULL) {
+ if (pData != nullptr && pData->map != nullptr) {
UnmapViewOfFile(pData->pHeader);
CloseHandle(pData->map);
- pData->pHeader=NULL;
- pData->map=NULL;
+ pData->pHeader = nullptr;
+ pData->map = nullptr;
}
}
@@ -255,13 +257,13 @@
U_CFUNC void
uprv_unmapFile(UDataMemory *pData) {
- if(pData!=NULL && pData->map!=NULL) {
+ if(pData!=nullptr && pData->map!=nullptr) {
size_t dataLen = (char *)pData->map - (char *)pData->mapAddr;
if(munmap(pData->mapAddr, dataLen)==-1) {
}
- pData->pHeader=NULL;
+ pData->pHeader=nullptr;
pData->map=0;
- pData->mapAddr=NULL;
+ pData->mapAddr=nullptr;
}
}
@@ -295,7 +297,7 @@
UDataMemory_init(pData); /* Clear the output struct. */
/* open the input file */
file=fopen(path, "rb");
- if(file==NULL) {
+ if(file==nullptr) {
return FALSE;
}
@@ -308,7 +310,7 @@
/* allocate the memory to hold the file data */
p=uprv_malloc(fileLength);
- if(p==NULL) {
+ if(p==nullptr) {
fclose(file);
*status = U_MEMORY_ALLOCATION_ERROR;
return FALSE;
@@ -330,11 +332,11 @@
U_CFUNC void
uprv_unmapFile(UDataMemory *pData) {
- if(pData!=NULL && pData->map!=NULL) {
+ if(pData!=nullptr && pData->map!=nullptr) {
uprv_free(pData->map);
- pData->map = NULL;
- pData->mapAddr = NULL;
- pData->pHeader = NULL;
+ pData->map = nullptr;
+ pData->mapAddr = nullptr;
+ pData->pHeader = nullptr;
}
}
@@ -397,7 +399,7 @@
* Copy the ICU_DATA path to the path buffer and return that*/
const char *icuDataDir;
icuDataDir=u_getDataDirectory();
- if(icuDataDir!=NULL && *icuDataDir!=0) {
+ if(icuDataDir!=nullptr && *icuDataDir!=0) {
return strcpy_returnEnd(pathBuffer, icuDataDir);
} else {
/* there is no icuDataDir either. Just return the empty pathBuffer. */
@@ -429,7 +431,7 @@
}
inBasename=uprv_strrchr(path, U_FILE_SEP_CHAR);
- if(inBasename==NULL) {
+ if(inBasename==nullptr) {
inBasename = path;
} else {
inBasename++;
@@ -494,7 +496,7 @@
fprintf(stderr, " -> %08X\n", handle );
# endif
- if(handle != NULL) {
+ if(handle != nullptr) {
/* we have a data DLL - what kind of lookup do we need here? */
/* try to find the Table of Contents */
UDataMemory_init(pData); /* Clear the output struct. */
@@ -515,11 +517,11 @@
}
U_CFUNC void uprv_unmapFile(UDataMemory *pData) {
- if(pData!=NULL && pData->map!=NULL) {
+ if(pData!=nullptr && pData->map!=nullptr) {
uprv_free(pData->map);
- pData->map = NULL;
- pData->mapAddr = NULL;
- pData->pHeader = NULL;
+ pData->map = nullptr;
+ pData->mapAddr = nullptr;
+ pData->pHeader = nullptr;
}
}
diff --git a/Build/source/libs/icu/icu-src/source/common/umutablecptrie.cpp b/Build/source/libs/icu/icu-src/source/common/umutablecptrie.cpp
index 40af4b6c16a..cdbe27080b4 100644
--- a/Build/source/libs/icu/icu-src/source/common/umutablecptrie.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/umutablecptrie.cpp
@@ -18,6 +18,11 @@
#include "uassert.h"
#include "ucptrie_impl.h"
+// ICU-20235 In case Microsoft math.h has defined this, undefine it.
+#ifdef OVERFLOW
+#undef OVERFLOW
+#endif
+
U_NAMESPACE_BEGIN
namespace {
@@ -60,6 +65,7 @@ constexpr uint8_t I3_18 = 3;
constexpr int32_t INDEX_3_18BIT_BLOCK_LENGTH = UCPTRIE_INDEX_3_BLOCK_LENGTH + UCPTRIE_INDEX_3_BLOCK_LENGTH / 8;
class AllSameBlocks;
+class MixedBlocks;
class MutableCodePointTrie : public UMemory {
public:
@@ -92,8 +98,10 @@ private:
void maskValues(uint32_t mask);
UChar32 findHighStart() const;
int32_t compactWholeDataBlocks(int32_t fastILimit, AllSameBlocks &allSameBlocks);
- int32_t compactData(int32_t fastILimit, uint32_t *newData, int32_t dataNullIndex);
- int32_t compactIndex(int32_t fastILimit, UErrorCode &errorCode);
+ int32_t compactData(
+ int32_t fastILimit, uint32_t *newData, int32_t newDataCapacity,
+ int32_t dataNullIndex, MixedBlocks &mixedBlocks, UErrorCode &errorCode);
+ int32_t compactIndex(int32_t fastILimit, MixedBlocks &mixedBlocks, UErrorCode &errorCode);
int32_t compactTrie(int32_t fastILimit, UErrorCode &errorCode);
uint32_t *index = nullptr;
@@ -301,41 +309,56 @@ UChar32 MutableCodePointTrie::getRange(
uint32_t nullValue = initialValue;
if (filter != nullptr) { nullValue = filter(context, nullValue); }
UChar32 c = start;
- uint32_t value;
+ uint32_t trieValue, value;
bool haveValue = false;
int32_t i = c >> UCPTRIE_SHIFT_3;
do {
if (flags[i] == ALL_SAME) {
- uint32_t value2 = maybeFilterValue(index[i], initialValue, nullValue,
- filter, context);
+ uint32_t trieValue2 = index[i];
if (haveValue) {
- if (value2 != value) {
- return c - 1;
+ if (trieValue2 != trieValue) {
+ if (filter == nullptr ||
+ maybeFilterValue(trieValue2, initialValue, nullValue,
+ filter, context) != value) {
+ return c - 1;
+ }
+ trieValue = trieValue2; // may or may not help
}
} else {
- value = value2;
+ trieValue = trieValue2;
+ value = maybeFilterValue(trieValue2, initialValue, nullValue, filter, context);
if (pValue != nullptr) { *pValue = value; }
haveValue = true;
}
c = (c + UCPTRIE_SMALL_DATA_BLOCK_LENGTH) & ~UCPTRIE_SMALL_DATA_MASK;
} else /* MIXED */ {
int32_t di = index[i] + (c & UCPTRIE_SMALL_DATA_MASK);
- uint32_t value2 = maybeFilterValue(data[di], initialValue, nullValue,
- filter, context);
+ uint32_t trieValue2 = data[di];
if (haveValue) {
- if (value2 != value) {
- return c - 1;
+ if (trieValue2 != trieValue) {
+ if (filter == nullptr ||
+ maybeFilterValue(trieValue2, initialValue, nullValue,
+ filter, context) != value) {
+ return c - 1;
+ }
+ trieValue = trieValue2; // may or may not help
}
} else {
- value = value2;
+ trieValue = trieValue2;
+ value = maybeFilterValue(trieValue2, initialValue, nullValue, filter, context);
if (pValue != nullptr) { *pValue = value; }
haveValue = true;
}
while ((++c & UCPTRIE_SMALL_DATA_MASK) != 0) {
- if (maybeFilterValue(data[++di], initialValue, nullValue,
- filter, context) != value) {
- return c - 1;
+ trieValue2 = data[++di];
+ if (trieValue2 != trieValue) {
+ if (filter == nullptr ||
+ maybeFilterValue(trieValue2, initialValue, nullValue,
+ filter, context) != value) {
+ return c - 1;
+ }
}
+ trieValue = trieValue2; // may or may not help
}
}
++i;
@@ -548,28 +571,8 @@ void MutableCodePointTrie::maskValues(uint32_t mask) {
}
}
-inline bool
-equalBlocks(const uint32_t *s, const uint32_t *t, int32_t length) {
- while (length > 0 && *s == *t) {
- ++s;
- ++t;
- --length;
- }
- return length == 0;
-}
-
-inline bool
-equalBlocks(const uint16_t *s, const uint32_t *t, int32_t length) {
- while (length > 0 && *s == *t) {
- ++s;
- ++t;
- --length;
- }
- return length == 0;
-}
-
-inline bool
-equalBlocks(const uint16_t *s, const uint16_t *t, int32_t length) {
+template<typename UIntA, typename UIntB>
+bool equalBlocks(const UIntA *s, const UIntB *t, int32_t length) {
while (length > 0 && *s == *t) {
++s;
++t;
@@ -585,36 +588,6 @@ bool allValuesSameAs(const uint32_t *p, int32_t length, uint32_t value) {
}
/** Search for an identical block. */
-int32_t findSameBlock(const uint32_t *p, int32_t pStart, int32_t length,
- const uint32_t *q, int32_t qStart, int32_t blockLength) {
- // Ensure that we do not even partially get past length.
- length -= blockLength;
-
- q += qStart;
- while (pStart <= length) {
- if (equalBlocks(p + pStart, q, blockLength)) {
- return pStart;
- }
- ++pStart;
- }
- return -1;
-}
-
-int32_t findSameBlock(const uint16_t *p, int32_t pStart, int32_t length,
- const uint32_t *q, int32_t qStart, int32_t blockLength) {
- // Ensure that we do not even partially get past length.
- length -= blockLength;
-
- q += qStart;
- while (pStart <= length) {
- if (equalBlocks(p + pStart, q, blockLength)) {
- return pStart;
- }
- ++pStart;
- }
- return -1;
-}
-
int32_t findSameBlock(const uint16_t *p, int32_t pStart, int32_t length,
const uint16_t *q, int32_t qStart, int32_t blockLength) {
// Ensure that we do not even partially get past length.
@@ -655,30 +628,9 @@ int32_t findAllSameBlock(const uint32_t *p, int32_t start, int32_t limit,
* Look for maximum overlap of the beginning of the other block
* with the previous, adjacent block.
*/
-int32_t getOverlap(const uint32_t *p, int32_t length,
- const uint32_t *q, int32_t qStart, int32_t blockLength) {
- int32_t overlap = blockLength - 1;
- U_ASSERT(overlap <= length);
- q += qStart;
- while (overlap > 0 && !equalBlocks(p + (length - overlap), q, overlap)) {
- --overlap;
- }
- return overlap;
-}
-
-int32_t getOverlap(const uint16_t *p, int32_t length,
- const uint32_t *q, int32_t qStart, int32_t blockLength) {
- int32_t overlap = blockLength - 1;
- U_ASSERT(overlap <= length);
- q += qStart;
- while (overlap > 0 && !equalBlocks(p + (length - overlap), q, overlap)) {
- --overlap;
- }
- return overlap;
-}
-
-int32_t getOverlap(const uint16_t *p, int32_t length,
- const uint16_t *q, int32_t qStart, int32_t blockLength) {
+template<typename UIntA, typename UIntB>
+int32_t getOverlap(const UIntA *p, int32_t length,
+ const UIntB *q, int32_t qStart, int32_t blockLength) {
int32_t overlap = blockLength - 1;
U_ASSERT(overlap <= length);
q += qStart;
@@ -807,6 +759,171 @@ private:
int32_t refCounts[CAPACITY];
};
+// Custom hash table for mixed-value blocks to be found anywhere in the
+// compacted data or index so far.
+class MixedBlocks {
+public:
+ MixedBlocks() {}
+ ~MixedBlocks() {
+ uprv_free(table);
+ }
+
+ bool init(int32_t maxLength, int32_t newBlockLength) {
+ // We store actual data indexes + 1 to reserve 0 for empty entries.
+ int32_t maxDataIndex = maxLength - newBlockLength + 1;
+ int32_t newLength;
+ if (maxDataIndex <= 0xfff) { // 4k
+ newLength = 6007;
+ shift = 12;
+ mask = 0xfff;
+ } else if (maxDataIndex <= 0x7fff) { // 32k
+ newLength = 50021;
+ shift = 15;
+ mask = 0x7fff;
+ } else if (maxDataIndex <= 0x1ffff) { // 128k
+ newLength = 200003;
+ shift = 17;
+ mask = 0x1ffff;
+ } else {
+ // maxDataIndex up to around MAX_DATA_LENGTH, ca. 1.1M
+ newLength = 1500007;
+ shift = 21;
+ mask = 0x1fffff;
+ }
+ if (newLength > capacity) {
+ uprv_free(table);
+ table = (uint32_t *)uprv_malloc(newLength * 4);
+ if (table == nullptr) {
+ return false;
+ }
+ capacity = newLength;
+ }
+ length = newLength;
+ uprv_memset(table, 0, length * 4);
+
+ blockLength = newBlockLength;
+ return true;
+ }
+
+ template<typename UInt>
+ void extend(const UInt *data, int32_t minStart, int32_t prevDataLength, int32_t newDataLength) {
+ int32_t start = prevDataLength - blockLength;
+ if (start >= minStart) {
+ ++start; // Skip the last block that we added last time.
+ } else {
+ start = minStart; // Begin with the first full block.
+ }
+ for (int32_t end = newDataLength - blockLength; start <= end; ++start) {
+ uint32_t hashCode = makeHashCode(data, start);
+ addEntry(data, start, hashCode, start);
+ }
+ }
+
+ template<typename UIntA, typename UIntB>
+ int32_t findBlock(const UIntA *data, const UIntB *blockData, int32_t blockStart) const {
+ uint32_t hashCode = makeHashCode(blockData, blockStart);
+ int32_t entryIndex = findEntry(data, blockData, blockStart, hashCode);
+ if (entryIndex >= 0) {
+ return (table[entryIndex] & mask) - 1;
+ } else {
+ return -1;
+ }
+ }
+
+ int32_t findAllSameBlock(const uint32_t *data, uint32_t blockValue) const {
+ uint32_t hashCode = makeHashCode(blockValue);
+ int32_t entryIndex = findEntry(data, blockValue, hashCode);
+ if (entryIndex >= 0) {
+ return (table[entryIndex] & mask) - 1;
+ } else {
+ return -1;
+ }
+ }
+
+private:
+ template<typename UInt>
+ uint32_t makeHashCode(const UInt *blockData, int32_t blockStart) const {
+ int32_t blockLimit = blockStart + blockLength;
+ uint32_t hashCode = blockData[blockStart++];
+ do {
+ hashCode = 37 * hashCode + blockData[blockStart++];
+ } while (blockStart < blockLimit);
+ return hashCode;
+ }
+
+ uint32_t makeHashCode(uint32_t blockValue) const {
+ uint32_t hashCode = blockValue;
+ for (int32_t i = 1; i < blockLength; ++i) {
+ hashCode = 37 * hashCode + blockValue;
+ }
+ return hashCode;
+ }
+
+ template<typename UInt>
+ void addEntry(const UInt *data, int32_t blockStart, uint32_t hashCode, int32_t dataIndex) {
+ U_ASSERT(0 <= dataIndex && dataIndex < (int32_t)mask);
+ int32_t entryIndex = findEntry(data, data, blockStart, hashCode);
+ if (entryIndex < 0) {
+ table[~entryIndex] = (hashCode << shift) | (dataIndex + 1);
+ }
+ }
+
+ template<typename UIntA, typename UIntB>
+ int32_t findEntry(const UIntA *data, const UIntB *blockData, int32_t blockStart,
+ uint32_t hashCode) const {
+ uint32_t shiftedHashCode = hashCode << shift;
+ int32_t initialEntryIndex = (hashCode % (length - 1)) + 1; // 1..length-1
+ for (int32_t entryIndex = initialEntryIndex;;) {
+ uint32_t entry = table[entryIndex];
+ if (entry == 0) {
+ return ~entryIndex;
+ }
+ if ((entry & ~mask) == shiftedHashCode) {
+ int32_t dataIndex = (entry & mask) - 1;
+ if (equalBlocks(data + dataIndex, blockData + blockStart, blockLength)) {
+ return entryIndex;
+ }
+ }
+ entryIndex = nextIndex(initialEntryIndex, entryIndex);
+ }
+ }
+
+ int32_t findEntry(const uint32_t *data, uint32_t blockValue, uint32_t hashCode) const {
+ uint32_t shiftedHashCode = hashCode << shift;
+ int32_t initialEntryIndex = (hashCode % (length - 1)) + 1; // 1..length-1
+ for (int32_t entryIndex = initialEntryIndex;;) {
+ uint32_t entry = table[entryIndex];
+ if (entry == 0) {
+ return ~entryIndex;
+ }
+ if ((entry & ~mask) == shiftedHashCode) {
+ int32_t dataIndex = (entry & mask) - 1;
+ if (allValuesSameAs(data + dataIndex, blockLength, blockValue)) {
+ return entryIndex;
+ }
+ }
+ entryIndex = nextIndex(initialEntryIndex, entryIndex);
+ }
+ }
+
+ inline int32_t nextIndex(int32_t initialEntryIndex, int32_t entryIndex) const {
+ // U_ASSERT(0 < initialEntryIndex && initialEntryIndex < length);
+ return (entryIndex + initialEntryIndex) % length;
+ }
+
+ // Hash table.
+ // The length is a prime number, larger than the maximum data length.
+ // The "shift" lower bits store a data index + 1.
+ // The remaining upper bits store a partial hashCode of the block data values.
+ uint32_t *table = nullptr;
+ int32_t capacity = 0;
+ int32_t length = 0;
+ int32_t shift = 0;
+ uint32_t mask = 0;
+
+ int32_t blockLength = 0;
+};
+
int32_t MutableCodePointTrie::compactWholeDataBlocks(int32_t fastILimit, AllSameBlocks &allSameBlocks) {
#ifdef UCPTRIE_DEBUG
bool overflow = false;
@@ -962,8 +1079,9 @@ void printBlock(const uint32_t *block, int32_t blockLength, uint32_t value,
*
* It does not try to find an optimal order of writing, deduplicating, and overlapping blocks.
*/
-int32_t MutableCodePointTrie::compactData(int32_t fastILimit,
- uint32_t *newData, int32_t dataNullIndex) {
+int32_t MutableCodePointTrie::compactData(
+ int32_t fastILimit, uint32_t *newData, int32_t newDataCapacity,
+ int32_t dataNullIndex, MixedBlocks &mixedBlocks, UErrorCode &errorCode) {
#ifdef UCPTRIE_DEBUG
int32_t countSame=0, sumOverlaps=0;
bool printData = dataLength == 29088 /* line.brk */ ||
@@ -983,8 +1101,14 @@ int32_t MutableCodePointTrie::compactData(int32_t fastILimit,
#endif
}
- int32_t iLimit = highStart >> UCPTRIE_SHIFT_3;
int32_t blockLength = UCPTRIE_FAST_DATA_BLOCK_LENGTH;
+ if (!mixedBlocks.init(newDataCapacity, blockLength)) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return 0;
+ }
+ mixedBlocks.extend(newData, 0, 0, newDataLength);
+
+ int32_t iLimit = highStart >> UCPTRIE_SHIFT_3;
int32_t inc = SMALL_DATA_BLOCKS_PER_BMP_BLOCK;
int32_t fastLength = 0;
for (int32_t i = ASCII_I_LIMIT; i < iLimit; i += inc) {
@@ -992,12 +1116,17 @@ int32_t MutableCodePointTrie::compactData(int32_t fastILimit,
blockLength = UCPTRIE_SMALL_DATA_BLOCK_LENGTH;
inc = 1;
fastLength = newDataLength;
+ if (!mixedBlocks.init(newDataCapacity, blockLength)) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return 0;
+ }
+ mixedBlocks.extend(newData, 0, 0, newDataLength);
}
if (flags[i] == ALL_SAME) {
uint32_t value = index[i];
- int32_t n;
// Find an earlier part of the data array of length blockLength
// that is filled with this value.
+ int32_t n = mixedBlocks.findAllSameBlock(newData, value);
// If we find a match, and the current block is the data null block,
// and it is not a fast block but matches the start of a fast block,
// then we need to continue looking.
@@ -1005,12 +1134,10 @@ int32_t MutableCodePointTrie::compactData(int32_t fastILimit,
// and not all of the rest of the fast block is filled with this value.
// Otherwise trie.getRange() would detect that the fast block starts at
// dataNullOffset and assume incorrectly that it is filled with the null value.
- for (int32_t start = 0;
- (n = findAllSameBlock(newData, start, newDataLength,
- value, blockLength)) >= 0 &&
- i == dataNullIndex && i >= fastILimit && n < fastLength &&
- isStartOfSomeFastBlock(n, index, fastILimit);
- start = n + 1) {}
+ while (n >= 0 && i == dataNullIndex && i >= fastILimit && n < fastLength &&
+ isStartOfSomeFastBlock(n, index, fastILimit)) {
+ n = findAllSameBlock(newData, n + 1, newDataLength, value, blockLength);
+ }
if (n >= 0) {
DEBUG_DO(++countSame);
index[i] = n;
@@ -1023,14 +1150,16 @@ int32_t MutableCodePointTrie::compactData(int32_t fastILimit,
}
#endif
index[i] = newDataLength - n;
+ int32_t prevDataLength = newDataLength;
while (n < blockLength) {
newData[newDataLength++] = value;
++n;
}
+ mixedBlocks.extend(newData, 0, prevDataLength, newDataLength);
}
} else if (flags[i] == MIXED) {
const uint32_t *block = data + index[i];
- int32_t n = findSameBlock(newData, 0, newDataLength, block, 0, blockLength);
+ int32_t n = mixedBlocks.findBlock(newData, block, 0);
if (n >= 0) {
DEBUG_DO(++countSame);
index[i] = n;
@@ -1043,9 +1172,11 @@ int32_t MutableCodePointTrie::compactData(int32_t fastILimit,
}
#endif
index[i] = newDataLength - n;
+ int32_t prevDataLength = newDataLength;
while (n < blockLength) {
newData[newDataLength++] = block[n++];
}
+ mixedBlocks.extend(newData, 0, prevDataLength, newDataLength);
}
} else /* SAME_AS */ {
uint32_t j = index[i];
@@ -1061,7 +1192,8 @@ int32_t MutableCodePointTrie::compactData(int32_t fastILimit,
return newDataLength;
}
-int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &errorCode) {
+int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, MixedBlocks &mixedBlocks,
+ UErrorCode &errorCode) {
int32_t fastIndexLength = fastILimit >> (UCPTRIE_FAST_SHIFT - UCPTRIE_SHIFT_3);
if ((highStart >> UCPTRIE_FAST_SHIFT) <= fastIndexLength) {
// Only the linear fast index, no multi-stage index tables.
@@ -1095,6 +1227,12 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error
}
}
+ if (!mixedBlocks.init(fastIndexLength, UCPTRIE_INDEX_3_BLOCK_LENGTH)) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return 0;
+ }
+ mixedBlocks.extend(fastIndex, 0, 0, fastIndexLength);
+
// Examine index-3 blocks. For each determine one of:
// - same as the index-3 null block
// - same as a fast-index block
@@ -1105,6 +1243,7 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error
// Also determine an upper limit for the index-3 table length.
int32_t index3Capacity = 0;
i3FirstNull = index3NullOffset;
+ bool hasLongI3Blocks = false;
// If the fast index covers the whole BMP, then
// the multi-stage index is only for supplementary code points.
// Otherwise, the multi-stage index covers all of Unicode.
@@ -1129,13 +1268,13 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error
index3Capacity += UCPTRIE_INDEX_3_BLOCK_LENGTH;
} else {
index3Capacity += INDEX_3_18BIT_BLOCK_LENGTH;
+ hasLongI3Blocks = true;
}
i3FirstNull = 0;
}
} else {
if (oredI3 <= 0xffff) {
- int32_t n = findSameBlock(fastIndex, 0, fastIndexLength,
- index, i, UCPTRIE_INDEX_3_BLOCK_LENGTH);
+ int32_t n = mixedBlocks.findBlock(fastIndex, index, i);
if (n >= 0) {
flags[i] = I3_BMP;
index[i] = n;
@@ -1146,6 +1285,7 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error
} else {
flags[i] = I3_18;
index3Capacity += INDEX_3_18BIT_BLOCK_LENGTH;
+ hasLongI3Blocks = true;
}
}
i = j;
@@ -1166,6 +1306,18 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error
}
uprv_memcpy(index16, fastIndex, fastIndexLength * 2);
+ if (!mixedBlocks.init(index16Capacity, UCPTRIE_INDEX_3_BLOCK_LENGTH)) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return 0;
+ }
+ MixedBlocks longI3Blocks;
+ if (hasLongI3Blocks) {
+ if (!longI3Blocks.init(index16Capacity, INDEX_3_18BIT_BLOCK_LENGTH)) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return 0;
+ }
+ }
+
// Compact the index-3 table and write an uncompacted version of the index-2 table.
uint16_t index2[UNICODE_LIMIT >> UCPTRIE_SHIFT_2]; // index2Capacity
int32_t i2Length = 0;
@@ -1185,8 +1337,7 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error
} else if (f == I3_BMP) {
i3 = index[i];
} else if (f == I3_16) {
- int32_t n = findSameBlock(index16, index3Start, indexLength,
- index, i, UCPTRIE_INDEX_3_BLOCK_LENGTH);
+ int32_t n = mixedBlocks.findBlock(index16, index, i);
if (n >= 0) {
i3 = n;
} else {
@@ -1198,12 +1349,18 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error
index, i, UCPTRIE_INDEX_3_BLOCK_LENGTH);
}
i3 = indexLength - n;
+ int32_t prevIndexLength = indexLength;
while (n < UCPTRIE_INDEX_3_BLOCK_LENGTH) {
index16[indexLength++] = index[i + n++];
}
+ mixedBlocks.extend(index16, index3Start, prevIndexLength, indexLength);
+ if (hasLongI3Blocks) {
+ longI3Blocks.extend(index16, index3Start, prevIndexLength, indexLength);
+ }
}
} else {
U_ASSERT(f == I3_18);
+ U_ASSERT(hasLongI3Blocks);
// Encode an index-3 block that contains one or more data indexes exceeding 16 bits.
int32_t j = i;
int32_t jLimit = i + UCPTRIE_INDEX_3_BLOCK_LENGTH;
@@ -1236,8 +1393,7 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error
index16[k++] = v;
index16[k - 9] = upperBits;
} while (j < jLimit);
- int32_t n = findSameBlock(index16, index3Start, indexLength,
- index16, indexLength, INDEX_3_18BIT_BLOCK_LENGTH);
+ int32_t n = longI3Blocks.findBlock(index16, index16, indexLength);
if (n >= 0) {
i3 = n | 0x8000;
} else {
@@ -1249,6 +1405,7 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error
index16, indexLength, INDEX_3_18BIT_BLOCK_LENGTH);
}
i3 = (indexLength - n) | 0x8000;
+ int32_t prevIndexLength = indexLength;
if (n > 0) {
int32_t start = indexLength;
while (n < INDEX_3_18BIT_BLOCK_LENGTH) {
@@ -1257,6 +1414,10 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error
} else {
indexLength += INDEX_3_18BIT_BLOCK_LENGTH;
}
+ mixedBlocks.extend(index16, index3Start, prevIndexLength, indexLength);
+ if (hasLongI3Blocks) {
+ longI3Blocks.extend(index16, index3Start, prevIndexLength, indexLength);
+ }
}
}
if (index3NullOffset < 0 && i3FirstNull >= 0) {
@@ -1279,16 +1440,23 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error
}
// Compact the index-2 table and write the index-1 table.
+ static_assert(UCPTRIE_INDEX_2_BLOCK_LENGTH == UCPTRIE_INDEX_3_BLOCK_LENGTH,
+ "must re-init mixedBlocks");
int32_t blockLength = UCPTRIE_INDEX_2_BLOCK_LENGTH;
int32_t i1 = fastIndexLength;
for (int32_t i = 0; i < i2Length; i += blockLength) {
- if ((i2Length - i) < blockLength) {
+ int32_t n;
+ if ((i2Length - i) >= blockLength) {
+ // normal block
+ U_ASSERT(blockLength == UCPTRIE_INDEX_2_BLOCK_LENGTH);
+ n = mixedBlocks.findBlock(index16, index2, i);
+ } else {
// highStart is inside the last index-2 block. Shorten it.
blockLength = i2Length - i;
+ n = findSameBlock(index16, index3Start, indexLength,
+ index2, i, blockLength);
}
int32_t i2;
- int32_t n = findSameBlock(index16, index3Start, indexLength,
- index2, i, blockLength);
if (n >= 0) {
i2 = n;
} else {
@@ -1299,9 +1467,11 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error
n = getOverlap(index16, indexLength, index2, i, blockLength);
}
i2 = indexLength - n;
+ int32_t prevIndexLength = indexLength;
while (n < blockLength) {
index16[indexLength++] = index2[i + n++];
}
+ mixedBlocks.extend(index16, index3Start, prevIndexLength, indexLength);
}
// Set the index-1 table entry.
index16[i1++] = i2;
@@ -1369,7 +1539,11 @@ int32_t MutableCodePointTrie::compactTrie(int32_t fastILimit, UErrorCode &errorC
uprv_memcpy(newData, asciiData, sizeof(asciiData));
int32_t dataNullIndex = allSameBlocks.findMostUsed();
- int32_t newDataLength = compactData(fastILimit, newData, dataNullIndex);
+
+ MixedBlocks mixedBlocks;
+ int32_t newDataLength = compactData(fastILimit, newData, newDataCapacity,
+ dataNullIndex, mixedBlocks, errorCode);
+ if (U_FAILURE(errorCode)) { return 0; }
U_ASSERT(newDataLength <= newDataCapacity);
uprv_free(data);
data = newData;
@@ -1394,7 +1568,7 @@ int32_t MutableCodePointTrie::compactTrie(int32_t fastILimit, UErrorCode &errorC
dataNullOffset = UCPTRIE_NO_DATA_NULL_OFFSET;
}
- int32_t indexLength = compactIndex(fastILimit, errorCode);
+ int32_t indexLength = compactIndex(fastILimit, mixedBlocks, errorCode);
highStart = realHighStart;
return indexLength;
}
diff --git a/Build/source/libs/icu/icu-src/source/common/umutex.cpp b/Build/source/libs/icu/icu-src/source/common/umutex.cpp
index 29dbc90ec98..ccbee9960a3 100644
--- a/Build/source/libs/icu/icu-src/source/common/umutex.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/umutex.cpp
@@ -24,256 +24,142 @@
#include "unicode/utypes.h"
#include "uassert.h"
+#include "ucln_cmn.h"
#include "cmemory.h"
+U_NAMESPACE_BEGIN
-// The ICU global mutex. Used when ICU implementation code passes NULL for the mutex pointer.
-static UMutex globalMutex = U_MUTEX_INITIALIZER;
-
-/*
- * ICU Mutex wrappers. Wrap operating system mutexes, giving the rest of ICU a
- * platform independent set of mutex operations. For internal ICU use only.
- */
#if defined(U_USER_MUTEX_CPP)
-// Build time user mutex hook: #include "U_USER_MUTEX_CPP"
-#include U_MUTEX_XSTR(U_USER_MUTEX_CPP)
-
-#elif U_PLATFORM_USES_ONLY_WIN32_API
-
-#if defined U_NO_PLATFORM_ATOMICS
-#error ICU on Win32 requires support for low level atomic operations.
-// Visual Studio, gcc, clang are OK. Shouldn't get here.
+// Support for including an alternate implementation of mutexes has been withdrawn.
+// See issue ICU-20185.
+#error U_USER_MUTEX_CPP not supported
#endif
-// This function is called when a test of a UInitOnce::fState reveals that
-// initialization has not completed, that we either need to call the
-// function on this thread, or wait for some other thread to complete.
-//
-// The actual call to the init function is made inline by template code
-// that knows the C++ types involved. This function returns TRUE if
-// the caller needs to call the Init function.
-//
+/*************************************************************************************************
+ *
+ * ICU Mutex wrappers.
+ *
+ *************************************************************************************************/
-U_NAMESPACE_BEGIN
+namespace {
+std::mutex *initMutex;
+std::condition_variable *initCondition;
-U_COMMON_API UBool U_EXPORT2 umtx_initImplPreInit(UInitOnce &uio) {
- for (;;) {
- int32_t previousState = InterlockedCompareExchange(
- (LONG volatile *) // this is the type given in the API doc for this function.
- &uio.fState, // Destination
- 1, // Exchange Value
- 0); // Compare value
-
- if (previousState == 0) {
- return true; // Caller will next call the init function.
- // Current state == 1.
- } else if (previousState == 2) {
- // Another thread already completed the initialization.
- // We can simply return FALSE, indicating no
- // further action is needed by the caller.
- return FALSE;
- } else {
- // Another thread is currently running the initialization.
- // Wait until it completes.
- do {
- Sleep(1);
- previousState = umtx_loadAcquire(uio.fState);
- } while (previousState == 1);
- }
- }
-}
+// The ICU global mutex.
+// Used when ICU implementation code passes nullptr for the mutex pointer.
+UMutex globalMutex;
-// This function is called by the thread that ran an initialization function,
-// just after completing the function.
+std::once_flag initFlag;
+std::once_flag *pInitFlag = &initFlag;
-U_COMMON_API void U_EXPORT2 umtx_initImplPostInit(UInitOnce &uio) {
- umtx_storeRelease(uio.fState, 2);
-}
+} // Anonymous namespace
-U_NAMESPACE_END
+U_CDECL_BEGIN
+static UBool U_CALLCONV umtx_cleanup() {
+ initMutex->~mutex();
+ initCondition->~condition_variable();
+ UMutex::cleanup();
-static void winMutexInit(CRITICAL_SECTION *cs) {
- InitializeCriticalSection(cs);
- return;
+ // Reset the once_flag, by destructing it and creating a fresh one in its place.
+ // Do not use this trick anywhere else in ICU; use umtx_initOnce, not std::call_once().
+ pInitFlag->~once_flag();
+ pInitFlag = new(&initFlag) std::once_flag();
+ return true;
}
-U_CAPI void U_EXPORT2
-umtx_lock(UMutex *mutex) {
- if (mutex == NULL) {
- mutex = &globalMutex;
- }
- CRITICAL_SECTION *cs = &mutex->fCS;
- umtx_initOnce(mutex->fInitOnce, winMutexInit, cs);
- EnterCriticalSection(cs);
-}
-
-U_CAPI void U_EXPORT2
-umtx_unlock(UMutex* mutex)
-{
- if (mutex == NULL) {
- mutex = &globalMutex;
- }
- LeaveCriticalSection(&mutex->fCS);
+static void U_CALLCONV umtx_init() {
+ initMutex = STATIC_NEW(std::mutex);
+ initCondition = STATIC_NEW(std::condition_variable);
+ ucln_common_registerCleanup(UCLN_COMMON_MUTEX, umtx_cleanup);
}
+U_CDECL_END
-U_CAPI void U_EXPORT2
-umtx_condBroadcast(UConditionVar *condition) {
- // We require that the associated mutex be held by the caller,
- // so access to fWaitCount is protected and safe. No other thread can
- // call condWait() while we are here.
- if (condition->fWaitCount == 0) {
- return;
+std::mutex *UMutex::getMutex() {
+ std::mutex *retPtr = fMutex.load(std::memory_order_acquire);
+ if (retPtr == nullptr) {
+ std::call_once(*pInitFlag, umtx_init);
+ std::lock_guard<std::mutex> guard(*initMutex);
+ retPtr = fMutex.load(std::memory_order_acquire);
+ if (retPtr == nullptr) {
+ fMutex = new(fStorage) std::mutex();
+ retPtr = fMutex;
+ fListLink = gListHead;
+ gListHead = this;
+ }
}
- ResetEvent(condition->fExitGate);
- SetEvent(condition->fEntryGate);
+ U_ASSERT(retPtr != nullptr);
+ return retPtr;
}
-U_CAPI void U_EXPORT2
-umtx_condSignal(UConditionVar * /* condition */) {
- // Function not implemented. There is no immediate requirement from ICU to have it.
- // Once ICU drops support for Windows XP and Server 2003, ICU Condition Variables will be
- // changed to be thin wrappers on native Windows CONDITION_VARIABLEs, and this function
- // becomes trivial to provide.
- U_ASSERT(FALSE);
-}
+UMutex *UMutex::gListHead = nullptr;
-U_CAPI void U_EXPORT2
-umtx_condWait(UConditionVar *condition, UMutex *mutex) {
- if (condition->fEntryGate == NULL) {
- // Note: because the associated mutex must be locked when calling
- // wait, we know that there can not be multiple threads
- // running here with the same condition variable.
- // Meaning that lazy initialization is safe.
- U_ASSERT(condition->fExitGate == NULL);
- condition->fEntryGate = CreateEvent(NULL, // Security Attributes
- TRUE, // Manual Reset
- FALSE, // Initially reset
- NULL); // Name.
- U_ASSERT(condition->fEntryGate != NULL);
- condition->fExitGate = CreateEvent(NULL, TRUE, TRUE, NULL);
- U_ASSERT(condition->fExitGate != NULL);
- }
-
- condition->fWaitCount++;
- umtx_unlock(mutex);
- WaitForSingleObject(condition->fEntryGate, INFINITE);
- umtx_lock(mutex);
- condition->fWaitCount--;
- if (condition->fWaitCount == 0) {
- // All threads that were waiting at the entry gate have woken up
- // and moved through. Shut the entry gate and open the exit gate.
- ResetEvent(condition->fEntryGate);
- SetEvent(condition->fExitGate);
- } else {
- umtx_unlock(mutex);
- WaitForSingleObject(condition->fExitGate, INFINITE);
- umtx_lock(mutex);
+void UMutex::cleanup() {
+ UMutex *next = nullptr;
+ for (UMutex *m = gListHead; m != nullptr; m = next) {
+ (*m->fMutex).~mutex();
+ m->fMutex = nullptr;
+ next = m->fListLink;
+ m->fListLink = nullptr;
}
+ gListHead = nullptr;
}
-#elif U_PLATFORM_IMPLEMENTS_POSIX
-
-//-------------------------------------------------------------------------------------------
-//
-// POSIX specific definitions
-//
-//-------------------------------------------------------------------------------------------
-
-# include <pthread.h>
-
-// Each UMutex consists of a pthread_mutex_t.
-// All are statically initialized and ready for use.
-// There is no runtime mutex initialization code needed.
-
U_CAPI void U_EXPORT2
umtx_lock(UMutex *mutex) {
- if (mutex == NULL) {
+ if (mutex == nullptr) {
mutex = &globalMutex;
}
- int sysErr = pthread_mutex_lock(&mutex->fMutex);
- (void)sysErr; // Suppress unused variable warnings.
- U_ASSERT(sysErr == 0);
+ mutex->lock();
}
U_CAPI void U_EXPORT2
umtx_unlock(UMutex* mutex)
{
- if (mutex == NULL) {
- mutex = &globalMutex;
- }
- int sysErr = pthread_mutex_unlock(&mutex->fMutex);
- (void)sysErr; // Suppress unused variable warnings.
- U_ASSERT(sysErr == 0);
-}
-
-
-U_CAPI void U_EXPORT2
-umtx_condWait(UConditionVar *cond, UMutex *mutex) {
- if (mutex == NULL) {
+ if (mutex == nullptr) {
mutex = &globalMutex;
}
- int sysErr = pthread_cond_wait(&cond->fCondition, &mutex->fMutex);
- (void)sysErr;
- U_ASSERT(sysErr == 0);
+ mutex->unlock();
}
-U_CAPI void U_EXPORT2
-umtx_condBroadcast(UConditionVar *cond) {
- int sysErr = pthread_cond_broadcast(&cond->fCondition);
- (void)sysErr;
- U_ASSERT(sysErr == 0);
-}
-
-U_CAPI void U_EXPORT2
-umtx_condSignal(UConditionVar *cond) {
- int sysErr = pthread_cond_signal(&cond->fCondition);
- (void)sysErr;
- U_ASSERT(sysErr == 0);
-}
-
-
-
-U_NAMESPACE_BEGIN
-
-static pthread_mutex_t initMutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t initCondition = PTHREAD_COND_INITIALIZER;
+/*************************************************************************************************
+ *
+ * UInitOnce Implementation
+ *
+ *************************************************************************************************/
// This function is called when a test of a UInitOnce::fState reveals that
-// initialization has not completed, that we either need to call the
+// initialization has not completed, that we either need to call the init
// function on this thread, or wait for some other thread to complete.
//
// The actual call to the init function is made inline by template code
-// that knows the C++ types involved. This function returns TRUE if
+// that knows the C++ types involved. This function returns true if
// the caller needs to call the Init function.
//
U_COMMON_API UBool U_EXPORT2
umtx_initImplPreInit(UInitOnce &uio) {
- pthread_mutex_lock(&initMutex);
- int32_t state = uio.fState;
- if (state == 0) {
+ std::call_once(*pInitFlag, umtx_init);
+ std::unique_lock<std::mutex> lock(*initMutex);
+ if (umtx_loadAcquire(uio.fState) == 0) {
umtx_storeRelease(uio.fState, 1);
- pthread_mutex_unlock(&initMutex);
- return TRUE; // Caller will next call the init function.
+ return true; // Caller will next call the init function.
} else {
- while (uio.fState == 1) {
+ while (umtx_loadAcquire(uio.fState) == 1) {
// Another thread is currently running the initialization.
// Wait until it completes.
- pthread_cond_wait(&initCondition, &initMutex);
+ initCondition->wait(lock);
}
- pthread_mutex_unlock(&initMutex);
U_ASSERT(uio.fState == 2);
- return FALSE;
+ return false;
}
}
-
// This function is called by the thread that ran an initialization function,
// just after completing the function.
// Some threads may be waiting on the condition, requiring the broadcast wakeup.
@@ -282,80 +168,20 @@ umtx_initImplPreInit(UInitOnce &uio) {
U_COMMON_API void U_EXPORT2
umtx_initImplPostInit(UInitOnce &uio) {
- pthread_mutex_lock(&initMutex);
- umtx_storeRelease(uio.fState, 2);
- pthread_cond_broadcast(&initCondition);
- pthread_mutex_unlock(&initMutex);
-}
-
-U_NAMESPACE_END
-
-// End of POSIX specific umutex implementation.
-
-#else // Platform #define chain.
-
-#error Unknown Platform
-
-#endif // Platform #define chain.
-
-
-//-------------------------------------------------------------------------------
-//
-// Atomic Operations, out-of-line versions.
-// These are conditional, only defined if better versions
-// were not available for the platform.
-//
-// These versions are platform neutral.
-//
-//--------------------------------------------------------------------------------
-
-#if defined U_NO_PLATFORM_ATOMICS
-static UMutex gIncDecMutex = U_MUTEX_INITIALIZER;
-
-U_NAMESPACE_BEGIN
-
-U_COMMON_API int32_t U_EXPORT2
-umtx_atomic_inc(u_atomic_int32_t *p) {
- int32_t retVal;
- umtx_lock(&gIncDecMutex);
- retVal = ++(*p);
- umtx_unlock(&gIncDecMutex);
- return retVal;
-}
-
-
-U_COMMON_API int32_t U_EXPORT2
-umtx_atomic_dec(u_atomic_int32_t *p) {
- int32_t retVal;
- umtx_lock(&gIncDecMutex);
- retVal = --(*p);
- umtx_unlock(&gIncDecMutex);
- return retVal;
-}
-
-U_COMMON_API int32_t U_EXPORT2
-umtx_loadAcquire(u_atomic_int32_t &var) {
- umtx_lock(&gIncDecMutex);
- int32_t val = var;
- umtx_unlock(&gIncDecMutex);
- return val;
-}
-
-U_COMMON_API void U_EXPORT2
-umtx_storeRelease(u_atomic_int32_t &var, int32_t val) {
- umtx_lock(&gIncDecMutex);
- var = val;
- umtx_unlock(&gIncDecMutex);
+ {
+ std::unique_lock<std::mutex> lock(*initMutex);
+ umtx_storeRelease(uio.fState, 2);
+ }
+ initCondition->notify_all();
}
U_NAMESPACE_END
-#endif
-//--------------------------------------------------------------------------
-//
-// Deprecated functions for setting user mutexes.
-//
-//--------------------------------------------------------------------------
+/*************************************************************************************************
+ *
+ * Deprecated functions for setting user mutexes.
+ *
+ *************************************************************************************************/
U_DEPRECATED void U_EXPORT2
u_setMutexFunctions(const void * /*context */, UMtxInitFn *, UMtxFn *,
diff --git a/Build/source/libs/icu/icu-src/source/common/umutex.h b/Build/source/libs/icu/icu-src/source/common/umutex.h
index 015a12f9634..2503aa4a291 100644
--- a/Build/source/libs/icu/icu-src/source/common/umutex.h
+++ b/Build/source/libs/icu/icu-src/source/common/umutex.h
@@ -20,48 +20,55 @@
#ifndef UMUTEX_H
#define UMUTEX_H
+#include <atomic>
+#include <condition_variable>
+#include <mutex>
+#include <type_traits>
+
#include "unicode/utypes.h"
#include "unicode/uclean.h"
+#include "unicode/uobject.h"
+
#include "putilimp.h"
+#if defined(U_USER_ATOMICS_H) || defined(U_USER_MUTEX_H)
+// Support for including an alternate implementation of atomic & mutex operations has been withdrawn.
+// See issue ICU-20185.
+#error U_USER_ATOMICS and U_USER_MUTEX_H are not supported
+#endif
+// Export an explicit template instantiation of std::atomic<int32_t>.
+// When building DLLs for Windows this is required as it is used as a data member of the exported SharedObject class.
+// See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples.
+//
+// Similar story for std::atomic<std::mutex *>, and the exported UMutex class.
+#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN && !defined(U_IN_DOXYGEN)
+#if defined(__clang__) || defined(_MSC_VER)
+ #if defined(__clang__)
+ // Suppress the warning that the explicit instantiation after explicit specialization has no effect.
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Winstantiation-after-specialization"
+ #endif
+template struct U_COMMON_API std::atomic<int32_t>;
+template struct U_COMMON_API std::atomic<std::mutex *>;
+ #if defined(__clang__)
+ #pragma clang diagnostic pop
+ #endif
+#elif defined(__GNUC__)
+// For GCC this class is already exported/visible, so no need for U_COMMON_API.
+template struct std::atomic<int32_t>;
+template struct std::atomic<std::mutex *>;
+#endif
+#endif
-// Forward Declarations. UMutex is not in the ICU namespace (yet) because
-// there are some remaining references from plain C.
-struct UMutex;
-struct UConditionVar;
U_NAMESPACE_BEGIN
-struct UInitOnce;
-U_NAMESPACE_END
-
-// Stringify macros, to allow #include of user supplied atomic & mutex files.
-#define U_MUTEX_STR(s) #s
-#define U_MUTEX_XSTR(s) U_MUTEX_STR(s)
/****************************************************************************
*
- * Low Level Atomic Operations.
- * Compiler dependent. Not operating system dependent.
+ * Low Level Atomic Operations, ICU wrappers for.
*
****************************************************************************/
-#if defined (U_USER_ATOMICS_H)
-#include U_MUTEX_XSTR(U_USER_ATOMICS_H)
-
-#elif U_HAVE_STD_ATOMICS
-
-// C++11 atomics are available.
-
-#include <atomic>
-
-U_NAMESPACE_BEGIN
-
-// Export an explicit template instantiation of std::atomic<int32_t>.
-// When building DLLs for Windows this is required as it is used as a data member of the exported SharedObject class.
-// See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples.
-#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
-template struct U_COMMON_API std::atomic<int32_t>;
-#endif
typedef std::atomic<int32_t> u_atomic_int32_t;
#define ATOMIC_INT32_T_INITIALIZER(val) ATOMIC_VAR_INIT(val)
@@ -81,155 +88,19 @@ inline int32_t umtx_atomic_inc(u_atomic_int32_t *var) {
inline int32_t umtx_atomic_dec(u_atomic_int32_t *var) {
return var->fetch_sub(1) - 1;
}
-U_NAMESPACE_END
-
-#elif U_PLATFORM_HAS_WIN32_API
-
-// MSVC compiler. Reads and writes of volatile variables have
-// acquire and release memory semantics, respectively.
-// This is a Microsoft extension, not standard C++ behavior.
-//
-// Update: can't use this because of MinGW, built with gcc.
-// Original plan was to use gcc atomics for MinGW, but they
-// aren't supported, so we fold MinGW into this path.
-
-#ifndef WIN32_LEAN_AND_MEAN
-# define WIN32_LEAN_AND_MEAN
-#endif
-# define VC_EXTRALEAN
-# define NOUSER
-# define NOSERVICE
-# define NOIME
-# define NOMCX
-# ifndef NOMINMAX
-# define NOMINMAX
-# endif
-# include <windows.h>
-
-U_NAMESPACE_BEGIN
-typedef volatile LONG u_atomic_int32_t;
-#define ATOMIC_INT32_T_INITIALIZER(val) val
-
-inline int32_t umtx_loadAcquire(u_atomic_int32_t &var) {
- return InterlockedCompareExchange(&var, 0, 0);
-}
-
-inline void umtx_storeRelease(u_atomic_int32_t &var, int32_t val) {
- InterlockedExchange(&var, val);
-}
-
-
-inline int32_t umtx_atomic_inc(u_atomic_int32_t *var) {
- return InterlockedIncrement(var);
-}
-
-inline int32_t umtx_atomic_dec(u_atomic_int32_t *var) {
- return InterlockedDecrement(var);
-}
-U_NAMESPACE_END
-
-
-#elif U_HAVE_CLANG_ATOMICS
-/*
- * Clang __c11 atomic built-ins
- */
-
-U_NAMESPACE_BEGIN
-typedef _Atomic(int32_t) u_atomic_int32_t;
-#define ATOMIC_INT32_T_INITIALIZER(val) val
-
-inline int32_t umtx_loadAcquire(u_atomic_int32_t &var) {
- return __c11_atomic_load(&var, __ATOMIC_ACQUIRE);
-}
-
-inline void umtx_storeRelease(u_atomic_int32_t &var, int32_t val) {
- return __c11_atomic_store(&var, val, __ATOMIC_RELEASE);
-}
-
-inline int32_t umtx_atomic_inc(u_atomic_int32_t *var) {
- return __c11_atomic_fetch_add(var, 1, __ATOMIC_SEQ_CST) + 1;
-}
-
-inline int32_t umtx_atomic_dec(u_atomic_int32_t *var) {
- return __c11_atomic_fetch_sub(var, 1, __ATOMIC_SEQ_CST) - 1;
-}
-U_NAMESPACE_END
-
-
-#elif U_HAVE_GCC_ATOMICS
-/*
- * gcc atomic ops. These are available on several other compilers as well.
- */
-
-U_NAMESPACE_BEGIN
-typedef int32_t u_atomic_int32_t;
-#define ATOMIC_INT32_T_INITIALIZER(val) val
-
-inline int32_t umtx_loadAcquire(u_atomic_int32_t &var) {
- int32_t val = var;
- __sync_synchronize();
- return val;
-}
-
-inline void umtx_storeRelease(u_atomic_int32_t &var, int32_t val) {
- __sync_synchronize();
- var = val;
-}
-
-inline int32_t umtx_atomic_inc(u_atomic_int32_t *p) {
- return __sync_add_and_fetch(p, 1);
-}
-
-inline int32_t umtx_atomic_dec(u_atomic_int32_t *p) {
- return __sync_sub_and_fetch(p, 1);
-}
-U_NAMESPACE_END
-
-#else
-
-/*
- * Unknown Platform. Use out-of-line functions, which in turn use mutexes.
- * Slow but correct.
- */
-
-#define U_NO_PLATFORM_ATOMICS
-
-U_NAMESPACE_BEGIN
-typedef int32_t u_atomic_int32_t;
-#define ATOMIC_INT32_T_INITIALIZER(val) val
-
-U_COMMON_API int32_t U_EXPORT2
-umtx_loadAcquire(u_atomic_int32_t &var);
-
-U_COMMON_API void U_EXPORT2
-umtx_storeRelease(u_atomic_int32_t &var, int32_t val);
-
-U_COMMON_API int32_t U_EXPORT2
-umtx_atomic_inc(u_atomic_int32_t *p);
-
-U_COMMON_API int32_t U_EXPORT2
-umtx_atomic_dec(u_atomic_int32_t *p);
-
-U_NAMESPACE_END
-
-#endif /* Low Level Atomic Ops Platform Chain */
-
/*************************************************************************************************
*
* UInitOnce Definitions.
- * These are platform neutral.
*
*************************************************************************************************/
-U_NAMESPACE_BEGIN
-
struct UInitOnce {
u_atomic_int32_t fState;
UErrorCode fErrCode;
- void reset() {fState = 0;};
- UBool isReset() {return umtx_loadAcquire(fState) == 0;};
+ void reset() {fState = 0;}
+ UBool isReset() {return umtx_loadAcquire(fState) == 0;}
// Note: isReset() is used by service registration code.
// Thread safety of this usage needs review.
};
@@ -313,106 +184,78 @@ template<class T> void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)(T, UE
}
}
-U_NAMESPACE_END
-
-
+// UMutex should be constexpr-constructible, so that no initialization code
+// is run during startup.
+// This works on all C++ libraries except MS VS before VS2019.
+#if (defined(_CPPLIB_VER) && !defined(_MSVC_STL_VERSION)) || \
+ (defined(_MSVC_STL_VERSION) && _MSVC_STL_VERSION < 142)
+ // (VS std lib older than VS2017) || (VS std lib version < VS2019)
+# define UMUTEX_CONSTEXPR
+#else
+# define UMUTEX_CONSTEXPR constexpr
+#endif
-/*************************************************************************************************
+/**
+ * UMutex - ICU Mutex class.
*
- * Mutex Definitions. Platform Dependent, #if platform chain follows.
- * TODO: Add a C++11 version.
- * Need to convert all mutex using files to C++ first.
+ * This is the preferred Mutex class for use within ICU implementation code.
+ * It is a thin wrapper over C++ std::mutex, with these additions:
+ * - Static instances are safe, not triggering static construction or destruction,
+ * and the associated order of construction or destruction issues.
+ * - Plumbed into u_cleanup() for destructing the underlying std::mutex,
+ * which frees any OS level resources they may be holding.
*
- *************************************************************************************************/
-
-#if defined(U_USER_MUTEX_H)
-// #include "U_USER_MUTEX_H"
-#include U_MUTEX_XSTR(U_USER_MUTEX_H)
-
-#elif U_PLATFORM_USES_ONLY_WIN32_API
-
-/* For CRITICAL_SECTION */
-
-/*
- * Note: there is an earlier include of windows.h in this file, but it is in
- * different conditionals.
- * This one is needed if we are using C++11 for atomic ops, but
- * win32 APIs for Critical Sections.
- */
-
-#ifndef WIN32_LEAN_AND_MEAN
-# define WIN32_LEAN_AND_MEAN
-#endif
-# define VC_EXTRALEAN
-# define NOUSER
-# define NOSERVICE
-# define NOIME
-# define NOMCX
-# ifndef NOMINMAX
-# define NOMINMAX
-# endif
-# include <windows.h>
-
-
-typedef struct UMutex {
- icu::UInitOnce fInitOnce;
- CRITICAL_SECTION fCS;
-} UMutex;
-
-/* Initializer for a static UMUTEX. Deliberately contains no value for the
- * CRITICAL_SECTION.
+ * Limitations:
+ * - Static or global instances only. Cannot be heap allocated. Cannot appear as a
+ * member of another class.
+ * - No condition variables or other advanced features. If needed, you will need to use
+ * std::mutex and std::condition_variable directly. For an example, see unifiedcache.cpp
+ *
+ * Typical Usage:
+ * static UMutex myMutex;
+ *
+ * {
+ * Mutex lock(myMutex);
+ * ... // Do stuff that is protected by myMutex;
+ * } // myMutex is released when lock goes out of scope.
*/
-#define U_MUTEX_INITIALIZER {U_INITONCE_INITIALIZER}
-
-struct UConditionVar {
- HANDLE fEntryGate;
- HANDLE fExitGate;
- int32_t fWaitCount;
-};
-#define U_CONDITION_INITIALIZER {NULL, NULL, 0}
-
+class U_COMMON_API UMutex {
+public:
+ UMUTEX_CONSTEXPR UMutex() {}
+ ~UMutex() = default;
+ UMutex(const UMutex &other) = delete;
+ UMutex &operator =(const UMutex &other) = delete;
+ void *operator new(size_t) = delete;
-#elif U_PLATFORM_IMPLEMENTS_POSIX
+ // requirements for C++ BasicLockable, allows UMutex to work with std::lock_guard
+ void lock() {
+ std::mutex *m = fMutex.load(std::memory_order_acquire);
+ if (m == nullptr) { m = getMutex(); }
+ m->lock();
+ }
+ void unlock() { fMutex.load(std::memory_order_relaxed)->unlock(); }
-/*
- * POSIX platform
- */
+ static void cleanup();
-#include <pthread.h>
+private:
+ alignas(std::mutex) char fStorage[sizeof(std::mutex)] {};
+ std::atomic<std::mutex *> fMutex { nullptr };
-struct UMutex {
- pthread_mutex_t fMutex;
-};
-typedef struct UMutex UMutex;
-#define U_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER}
+ /** All initialized UMutexes are kept in a linked list, so that they can be found,
+ * and the underlying std::mutex destructed, by u_cleanup().
+ */
+ UMutex *fListLink { nullptr };
+ static UMutex *gListHead;
-struct UConditionVar {
- pthread_cond_t fCondition;
+ /** Out-of-line function to lazily initialize a UMutex on first use.
+ * Initial fast check is inline, in lock(). The returned value may never
+ * be nullptr.
+ */
+ std::mutex *getMutex();
};
-#define U_CONDITION_INITIALIZER {PTHREAD_COND_INITIALIZER}
-
-#else
-
-/*
- * Unknown platform type.
- * This is an error condition. ICU requires mutexes.
- */
-#error Unknown Platform.
-
-#endif
-
-
-
-/**************************************************************************************
- *
- * Mutex Implementation function declarations.
- * Declarations are platform neutral.
- * Implementations, in umutex.cpp, are platform specific.
- *
- ************************************************************************************/
/* Lock a mutex.
* @param mutex The given mutex to be locked. Pass NULL to specify
@@ -427,32 +270,8 @@ U_INTERNAL void U_EXPORT2 umtx_lock(UMutex* mutex);
*/
U_INTERNAL void U_EXPORT2 umtx_unlock (UMutex* mutex);
-/*
- * Wait on a condition variable.
- * The calling thread will unlock the mutex and wait on the condition variable.
- * The mutex must be locked by the calling thread when invoking this function.
- *
- * @param cond the condition variable to wait on.
- * @param mutex the associated mutex.
- */
-
-U_INTERNAL void U_EXPORT2 umtx_condWait(UConditionVar *cond, UMutex *mutex);
-
-/*
- * Broadcast wakeup of all threads waiting on a Condition.
- * The associated mutex must be locked by the calling thread when calling
- * this function; this is a temporary ICU restriction.
- *
- * @param cond the condition variable.
- */
-U_INTERNAL void U_EXPORT2 umtx_condBroadcast(UConditionVar *cond);
-
-/*
- * Signal a condition variable, waking up one waiting thread.
- * CAUTION: Do not use. Place holder only. Not implemented for Windows.
- */
-U_INTERNAL void U_EXPORT2 umtx_condSignal(UConditionVar *cond);
+U_NAMESPACE_END
#endif /* UMUTEX_H */
/*eof*/
diff --git a/Build/source/libs/icu/icu-src/source/common/unames.cpp b/Build/source/libs/icu/icu-src/source/common/unames.cpp
index 9c230dc93ee..cde8b5ad7e5 100644
--- a/Build/source/libs/icu/icu-src/source/common/unames.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/unames.cpp
@@ -212,13 +212,13 @@ isDataLoaded(UErrorCode *pErrorCode) {
return U_SUCCESS(*pErrorCode);
}
-#define WRITE_CHAR(buffer, bufferLength, bufferPos, c) { \
+#define WRITE_CHAR(buffer, bufferLength, bufferPos, c) UPRV_BLOCK_MACRO_BEGIN { \
if((bufferLength)>0) { \
*(buffer)++=c; \
--(bufferLength); \
} \
++(bufferPos); \
-}
+} UPRV_BLOCK_MACRO_END
#define U_ISO_COMMENT U_CHAR_NAME_CHOICE_COUNT
@@ -1526,7 +1526,7 @@ u_charFromName(UCharNameChoice nameChoice,
uint32_t i;
UChar32 cp = 0;
char c0;
- UChar32 error = 0xffff; /* Undefined, but use this for backwards compatibility. */
+ static constexpr UChar32 error = 0xffff; /* Undefined, but use this for backwards compatibility. */
if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
return error;
@@ -1560,39 +1560,45 @@ u_charFromName(UCharNameChoice nameChoice,
/* try extended names first */
if (lower[0] == '<') {
- if (nameChoice == U_EXTENDED_CHAR_NAME) {
+ if (nameChoice == U_EXTENDED_CHAR_NAME && lower[--i] == '>') {
// Parse a string like "<category-HHHH>" where HHHH is a hex code point.
- if (lower[--i] == '>' && i >= 3 && lower[--i] != '-') {
- while (i >= 3 && lower[--i] != '-') {}
-
- if (i >= 2 && lower[i] == '-') {
- uint32_t cIdx;
-
- lower[i] = 0;
-
- for (++i; lower[i] != '>'; ++i) {
- if (lower[i] >= '0' && lower[i] <= '9') {
- cp = (cp << 4) + lower[i] - '0';
- } else if (lower[i] >= 'a' && lower[i] <= 'f') {
- cp = (cp << 4) + lower[i] - 'a' + 10;
- } else {
- *pErrorCode = U_ILLEGAL_CHAR_FOUND;
- return error;
- }
- }
+ uint32_t limit = i;
+ while (i >= 3 && lower[--i] != '-') {}
- /* Now validate the category name.
- We could use a binary search, or a trie, if
- we really wanted to. */
+ // There should be 1 to 8 hex digits.
+ int32_t hexLength = limit - (i + 1);
+ if (i >= 2 && lower[i] == '-' && 1 <= hexLength && hexLength <= 8) {
+ uint32_t cIdx;
- for (lower[i] = 0, cIdx = 0; cIdx < UPRV_LENGTHOF(charCatNames); ++cIdx) {
+ lower[i] = 0;
- if (!uprv_strcmp(lower + 1, charCatNames[cIdx])) {
- if (getCharCat(cp) == cIdx) {
- return cp;
- }
- break;
+ for (++i; i < limit; ++i) {
+ if (lower[i] >= '0' && lower[i] <= '9') {
+ cp = (cp << 4) + lower[i] - '0';
+ } else if (lower[i] >= 'a' && lower[i] <= 'f') {
+ cp = (cp << 4) + lower[i] - 'a' + 10;
+ } else {
+ *pErrorCode = U_ILLEGAL_CHAR_FOUND;
+ return error;
+ }
+ // Prevent signed-integer overflow and out-of-range code points.
+ if (cp > UCHAR_MAX_VALUE) {
+ *pErrorCode = U_ILLEGAL_CHAR_FOUND;
+ return error;
+ }
+ }
+
+ /* Now validate the category name.
+ We could use a binary search, or a trie, if
+ we really wanted to. */
+ uint8_t cat = getCharCat(cp);
+ for (lower[i] = 0, cIdx = 0; cIdx < UPRV_LENGTHOF(charCatNames); ++cIdx) {
+
+ if (!uprv_strcmp(lower + 1, charCatNames[cIdx])) {
+ if (cat == cIdx) {
+ return cp;
}
+ break;
}
}
}
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/appendable.h b/Build/source/libs/icu/icu-src/source/common/unicode/appendable.h
index 8512c2f3031..4beacaf6583 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/appendable.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/appendable.h
@@ -23,6 +23,9 @@
*/
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/uobject.h"
U_NAMESPACE_BEGIN
@@ -231,4 +234,6 @@ private:
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __APPENDABLE_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/brkiter.h b/Build/source/libs/icu/icu-src/source/common/unicode/brkiter.h
index 5faeedfa93e..b9444973454 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/brkiter.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/brkiter.h
@@ -29,6 +29,10 @@
* \brief C++ API: Break Iterator.
*/
+#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#if UCONFIG_NO_BREAK_ITERATION
U_NAMESPACE_BEGIN
@@ -135,7 +139,7 @@ public:
* method which subclasses implement.
* @stable ICU 2.0
*/
- virtual BreakIterator* clone(void) const = 0;
+ virtual BreakIterator* clone() const = 0;
/**
* Return a polymorphic class ID for this object. Different subclasses
@@ -431,12 +435,13 @@ public:
static BreakIterator* U_EXPORT2
createSentenceInstance(const Locale& where, UErrorCode& status);
+#ifndef U_HIDE_DEPRECATED_API
/**
* Create BreakIterator for title-casing breaks using the specified locale
* Returns an instance of a BreakIterator implementing title breaks.
* The iterator returned locates title boundaries as described for
* Unicode 3.2 only. For Unicode 4.0 and above title boundary iteration,
- * please use Word Boundary iterator.{@link #createWordInstance }
+ * please use a word boundary iterator. See {@link #createWordInstance }.
*
* @param where the locale.
* @param status The error code.
@@ -451,10 +456,11 @@ public:
* used; neither the requested locale nor any of its fall back locales
* could be found.
* The caller owns the returned object and is responsible for deleting it.
- * @stable ICU 2.1
+ * @deprecated ICU 64 Use createWordInstance instead.
*/
static BreakIterator* U_EXPORT2
createTitleInstance(const Locale& where, UErrorCode& status);
+#endif /* U_HIDE_DEPRECATED_API */
/**
* Get the set of Locales for which TextBoundaries are installed.
@@ -491,6 +497,7 @@ public:
static UnicodeString& U_EXPORT2 getDisplayName(const Locale& objectLocale,
UnicodeString& name);
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Deprecated functionality. Use clone() instead.
*
@@ -513,6 +520,7 @@ public:
virtual BreakIterator * createBufferClone(void *stackBuffer,
int32_t &BufferSize,
UErrorCode &status) = 0;
+#endif // U_FORCE_HIDE_DEPRECATED_API
#ifndef U_HIDE_DEPRECATED_API
@@ -656,5 +664,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // BRKITER_H
//eof
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/bytestream.h b/Build/source/libs/icu/icu-src/source/common/unicode/bytestream.h
index 493115f71c7..0d60492fe23 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/bytestream.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/bytestream.h
@@ -38,6 +38,9 @@
*/
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/uobject.h"
#include "unicode/std_string.h"
@@ -267,4 +270,6 @@ class StringByteSink : public ByteSink {
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __BYTESTREAM_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/bytestrie.h b/Build/source/libs/icu/icu-src/source/common/unicode/bytestrie.h
index c57b8ccfeb5..51405f64a10 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/bytestrie.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/bytestrie.h
@@ -23,6 +23,9 @@
*/
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/stringpiece.h"
#include "unicode/uobject.h"
#include "unicode/ustringtrie.h"
@@ -94,6 +97,41 @@ public:
return *this;
}
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns the state of this trie as a 64-bit integer.
+ * The state value is never 0.
+ *
+ * @return opaque state value
+ * @see resetToState64
+ * @draft ICU 65
+ */
+ uint64_t getState64() const {
+ return (static_cast<uint64_t>(remainingMatchLength_ + 2) << kState64RemainingShift) |
+ (uint64_t)(pos_ - bytes_);
+ }
+
+ /**
+ * Resets this trie to the saved state.
+ * Unlike resetToState(State), the 64-bit state value
+ * must be from getState64() from the same trie object or
+ * from one initialized the exact same way.
+ * Because of no validation, this method is faster.
+ *
+ * @param state The opaque trie state value from getState64().
+ * @return *this
+ * @see getState64
+ * @see resetToState
+ * @see reset
+ * @draft ICU 65
+ */
+ BytesTrie &resetToState64(uint64_t state) {
+ remainingMatchLength_ = static_cast<int32_t>(state >> kState64RemainingShift) - 2;
+ pos_ = bytes_ + (state & kState64PosMask);
+ return *this;
+ }
+#endif /* U_HIDE_DRAFT_API */
+
/**
* BytesTrie state object, for saving a trie's current state
* and resetting the trie back to this state later.
@@ -502,6 +540,13 @@ private:
static const int32_t kMaxTwoByteDelta=((kMinThreeByteDeltaLead-kMinTwoByteDeltaLead)<<8)-1; // 0x2fff
static const int32_t kMaxThreeByteDelta=((kFourByteDeltaLead-kMinThreeByteDeltaLead)<<16)-1; // 0xdffff
+ // For getState64():
+ // The remainingMatchLength_ is -1..14=(kMaxLinearMatchLength=0x10)-2
+ // so we need at least 5 bits for that.
+ // We add 2 to store it as a positive value 1..16=kMaxLinearMatchLength.
+ static constexpr int32_t kState64RemainingShift = 59;
+ static constexpr uint64_t kState64PosMask = (UINT64_C(1) << kState64RemainingShift) - 1;
+
uint8_t *ownedArray_;
// Fixed value referencing the BytesTrie bytes.
@@ -517,4 +562,6 @@ private:
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __BYTESTRIE_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/bytestriebuilder.h b/Build/source/libs/icu/icu-src/source/common/unicode/bytestriebuilder.h
index 2a1f28e6255..b98374bb8fd 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/bytestriebuilder.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/bytestriebuilder.h
@@ -23,6 +23,9 @@
#define __BYTESTRIEBUILDER_H__
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/bytestrie.h"
#include "unicode/stringpiece.h"
#include "unicode/stringtriebuilder.h"
@@ -179,4 +182,6 @@ private:
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __BYTESTRIEBUILDER_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/caniter.h b/Build/source/libs/icu/icu-src/source/common/unicode/caniter.h
index 9b21ba52d89..13e524ff6ad 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/caniter.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/caniter.h
@@ -12,6 +12,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_NORMALIZATION
#include "unicode/uobject.h"
@@ -207,4 +209,6 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_NORMALIZATION */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/casemap.h b/Build/source/libs/icu/icu-src/source/common/unicode/casemap.h
index 477eb484d13..53af84fa74d 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/casemap.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/casemap.h
@@ -8,6 +8,9 @@
#define __CASEMAP_H__
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/stringpiece.h"
#include "unicode/uobject.h"
@@ -489,4 +492,6 @@ private:
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __CASEMAP_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/char16ptr.h b/Build/source/libs/icu/icu-src/source/common/unicode/char16ptr.h
index a7c5f1a0c5e..c8a9ae6c35d 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/char16ptr.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/char16ptr.h
@@ -7,9 +7,12 @@
#ifndef __CHAR16PTR_H__
#define __CHAR16PTR_H__
-#include <cstddef>
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
+#include <cstddef>
+
/**
* \file
* \brief C++ API: char16_t pointer wrappers with
@@ -305,4 +308,6 @@ inline OldUChar *toOldUCharPtr(char16_t *p) {
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __CHAR16PTR_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/chariter.h b/Build/source/libs/icu/icu-src/source/common/unicode/chariter.h
index 70d7a248833..db86f79e42e 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/chariter.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/chariter.h
@@ -13,6 +13,9 @@
#define CHARITER_H
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/uobject.h"
#include "unicode/unistr.h"
/**
@@ -377,7 +380,7 @@ public:
* @return a pointer to a new CharacterIterator
* @stable ICU 2.0
*/
- virtual CharacterIterator* clone(void) const = 0;
+ virtual CharacterIterator* clone() const = 0;
/**
* Sets the iterator to refer to the first code unit in its
@@ -725,4 +728,7 @@ CharacterIterator::getLength(void) const {
}
U_NAMESPACE_END
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/dbbi.h b/Build/source/libs/icu/icu-src/source/common/unicode/dbbi.h
index a2c3d7d7523..3de9cc38140 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/dbbi.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/dbbi.h
@@ -13,6 +13,10 @@
#ifndef DBBI_H
#define DBBI_H
+#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/rbbi.h"
#if !UCONFIG_NO_BREAK_ITERATION
@@ -39,4 +43,6 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/docmain.h b/Build/source/libs/icu/icu-src/source/common/unicode/docmain.h
index 6c2d9dcfb8b..704139a85ed 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/docmain.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/docmain.h
@@ -33,7 +33,7 @@
* then detailed member descriptions.</p>
*
* <h3>C Programmers:</h3>
- * <p>Use <a href="#Module">Module List</a> or <a href="globals.html">File Members</a>
+ * <p>Use <a href="#Module">Module List</a> or <a href="globals_u.html">File Members</a>
* to find a list of all the functions and constants.
* For example, to find BreakIterator functions you would click on
* <a href="files.html"> File List</a>,
@@ -99,7 +99,7 @@
* </tr>
* <tr>
* <td>Codepage Conversion</td>
- * <td>ucnv.h, ucnvsel.hb</td>
+ * <td>ucnv.h, ucnvsel.h</td>
* <td>C API</td>
* </tr>
* <tr>
@@ -115,7 +115,7 @@
* <tr>
* <td>Locales </td>
* <td>uloc.h</a></td>
- * <td>icu::Locale</td>
+ * <td>icu::Locale, icu::LocaleBuilder, icu::LocaleMatcher</td>
* </tr>
* <tr>
* <td>Resource Bundles</td>
@@ -143,11 +143,16 @@
* <td>icu::MessageFormat</td>
* </tr>
* <tr>
- * <td>Number Formatting</td>
+ * <td>Number Formatting<br/>(includes currency and unit formatting)</td>
* <td>unumberformatter.h, unum.h</td>
* <td>icu::number::NumberFormatter (ICU 60+) or icu::NumberFormat (older versions)</td>
* </tr>
* <tr>
+ * <td>Number Range Formatting<br />(includes currency and unit ranges)</td>
+ * <td>(no C API)</td>
+ * <td>icu::number::NumberRangeFormatter</td>
+ * </tr>
+ * <tr>
* <td>Number Spellout<br/>(Rule Based Number Formatting)</td>
* <td>unum.h<br/>(use UNUM_SPELLOUT)</td>
* <td>icu::RuleBasedNumberFormat</td>
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/dtintrv.h b/Build/source/libs/icu/icu-src/source/common/unicode/dtintrv.h
index c3f1058c066..15e15c9d405 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/dtintrv.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/dtintrv.h
@@ -15,6 +15,9 @@
#define __DTINTRV_H__
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/uobject.h"
/**
@@ -22,7 +25,6 @@
* \brief C++ API: Date Interval data type
*/
-
U_NAMESPACE_BEGIN
@@ -53,14 +55,14 @@ public:
* @return the from date in dateInterval.
* @stable ICU 4.0
*/
- UDate getFromDate() const;
+ inline UDate getFromDate() const;
/**
* Get the to date.
* @return the to date in dateInterval.
* @stable ICU 4.0
*/
- UDate getToDate() const;
+ inline UDate getToDate() const;
/**
@@ -114,7 +116,7 @@ public:
* @return TRUE if the two DateIntervals are not the same
* @stable ICU 4.0
*/
- UBool operator!=(const DateInterval& other) const;
+ inline UBool operator!=(const DateInterval& other) const;
/**
@@ -157,4 +159,6 @@ DateInterval::operator!=(const DateInterval& other) const {
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/edits.h b/Build/source/libs/icu/icu-src/source/common/unicode/edits.h
index 79e98b0cc27..c3ceaccb3b3 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/edits.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/edits.h
@@ -8,6 +8,9 @@
#define __EDITS_H__
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/uobject.h"
/**
@@ -159,7 +162,7 @@ public:
* @return TRUE if U_FAILURE(outErrorCode)
* @stable ICU 59
*/
- UBool copyErrorTo(UErrorCode &outErrorCode);
+ UBool copyErrorTo(UErrorCode &outErrorCode) const;
/**
* How much longer is the new text compared with the old text?
@@ -523,4 +526,6 @@ private:
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __EDITS_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/errorcode.h b/Build/source/libs/icu/icu-src/source/common/unicode/errorcode.h
index 81cad207452..fe7b5183232 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/errorcode.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/errorcode.h
@@ -26,6 +26,9 @@
*/
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/uobject.h"
U_NAMESPACE_BEGIN
@@ -136,4 +139,6 @@ protected:
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __ERRORCODE_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/filteredbrk.h b/Build/source/libs/icu/icu-src/source/common/unicode/filteredbrk.h
index 2444114e9a1..42936763259 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/filteredbrk.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/filteredbrk.h
@@ -11,6 +11,9 @@
#define FILTEREDBRK_H
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/brkiter.h"
#if !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_FILTERED_BREAK_ITERATION
@@ -101,6 +104,7 @@ class U_COMMON_API FilteredBreakIteratorBuilder : public UObject {
*/
virtual UBool unsuppressBreakAfter(const UnicodeString& string, UErrorCode& status) = 0;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* This function has been deprecated in favor of wrapIteratorWithFilter()
* The behavior is identical.
@@ -111,6 +115,7 @@ class U_COMMON_API FilteredBreakIteratorBuilder : public UObject {
* @see wrapBreakIteratorWithFilter()
*/
virtual BreakIterator *build(BreakIterator* adoptBreakIterator, UErrorCode& status) = 0;
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Wrap (adopt) an existing break iterator in a new filtered instance.
@@ -142,4 +147,6 @@ U_NAMESPACE_END
#endif // #if !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_FILTERED_BREAK_ITERATION
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // #ifndef FILTEREDBRK_H
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/idna.h b/Build/source/libs/icu/icu-src/source/common/unicode/idna.h
index f08658e502e..6dfcfe48db2 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/idna.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/idna.h
@@ -24,6 +24,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_IDNA
#include "unicode/bytestream.h"
@@ -322,4 +324,7 @@ private:
U_NAMESPACE_END
#endif // UCONFIG_NO_IDNA
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __IDNA_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/localebuilder.h b/Build/source/libs/icu/icu-src/source/common/unicode/localebuilder.h
new file mode 100644
index 00000000000..19e10f1c070
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/localebuilder.h
@@ -0,0 +1,315 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+#ifndef __LOCALEBUILDER_H__
+#define __LOCALEBUILDER_H__
+
+#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
+#include "unicode/locid.h"
+#include "unicode/localematcher.h"
+#include "unicode/stringpiece.h"
+#include "unicode/uobject.h"
+
+#ifndef U_HIDE_DRAFT_API
+/**
+ * \file
+ * \brief C++ API: Builder API for Locale
+ */
+
+U_NAMESPACE_BEGIN
+class CharString;
+
+/**
+ * <code>LocaleBuilder</code> is used to build instances of <code>Locale</code>
+ * from values configured by the setters. Unlike the <code>Locale</code>
+ * constructors, the <code>LocaleBuilder</code> checks if a value configured by a
+ * setter satisfies the syntax requirements defined by the <code>Locale</code>
+ * class. A <code>Locale</code> object created by a <code>LocaleBuilder</code> is
+ * well-formed and can be transformed to a well-formed IETF BCP 47 language tag
+ * without losing information.
+ *
+ * <p>The following example shows how to create a <code>Locale</code> object
+ * with the <code>LocaleBuilder</code>.
+ * <blockquote>
+ * <pre>
+ * UErrorCode status = U_ZERO_ERROR;
+ * Locale aLocale = LocaleBuilder()
+ * .setLanguage("sr")
+ * .setScript("Latn")
+ * .setRegion("RS")
+ * .build(status);
+ * if (U_SUCCESS(status)) {
+ * // ...
+ * }
+ * </pre>
+ * </blockquote>
+ *
+ * <p>LocaleBuilders can be reused; <code>clear()</code> resets all
+ * fields to their default values.
+ *
+ * <p>LocaleBuilder tracks errors in an internal UErrorCode. For all setters,
+ * except setLanguageTag and setLocale, LocaleBuilder will return immediately
+ * if the internal UErrorCode is in error state.
+ * To reset internal state and error code, call clear method.
+ * The setLanguageTag and setLocale method will first clear the internal
+ * UErrorCode, then track the error of the validation of the input parameter
+ * into the internal UErrorCode.
+ *
+ * @draft ICU 64
+ */
+class U_COMMON_API LocaleBuilder : public UObject {
+public:
+ /**
+ * Constructs an empty LocaleBuilder. The default value of all
+ * fields, extensions, and private use information is the
+ * empty string.
+ *
+ * @draft ICU 64
+ */
+ LocaleBuilder();
+
+ /**
+ * Destructor
+ * @draft ICU 64
+ */
+ virtual ~LocaleBuilder();
+
+ /**
+ * Resets the <code>LocaleBuilder</code> to match the provided
+ * <code>locale</code>. Existing state is discarded.
+ *
+ * <p>All fields of the locale must be well-formed.
+ * <p>This method clears the internal UErrorCode.
+ *
+ * @param locale the locale
+ * @return This builder.
+ *
+ * @draft ICU 64
+ */
+ LocaleBuilder& setLocale(const Locale& locale);
+
+ /**
+ * Resets the LocaleBuilder to match the provided
+ * [Unicode Locale Identifier](http://www.unicode.org/reports/tr35/tr35.html#unicode_locale_id) .
+ * Discards the existing state. the empty string cause the builder to be
+ * reset, like {@link #clear}. Grandfathered tags are converted to their
+ * canonical form before being processed. Otherwise, the <code>language
+ * tag</code> must be well-formed, or else the build() method will later
+ * report an U_ILLEGAL_ARGUMENT_ERROR.
+ *
+ * <p>This method clears the internal UErrorCode.
+ *
+ * @param tag the language tag, defined as
+ * [unicode_locale_id](http://www.unicode.org/reports/tr35/tr35.html#unicode_locale_id).
+ * @return This builder.
+ * @draft ICU 64
+ */
+ LocaleBuilder& setLanguageTag(StringPiece tag);
+
+ /**
+ * Sets the language. If <code>language</code> is the empty string, the
+ * language in this <code>LocaleBuilder</code> is removed. Otherwise, the
+ * <code>language</code> must be well-formed, or else the build() method will
+ * later report an U_ILLEGAL_ARGUMENT_ERROR.
+ *
+ * <p>The syntax of language value is defined as
+ * [unicode_language_subtag](http://www.unicode.org/reports/tr35/tr35.html#unicode_language_subtag).
+ *
+ * @param language the language
+ * @return This builder.
+ * @draft ICU 64
+ */
+ LocaleBuilder& setLanguage(StringPiece language);
+
+ /**
+ * Sets the script. If <code>script</code> is the empty string, the script in
+ * this <code>LocaleBuilder</code> is removed.
+ * Otherwise, the <code>script</code> must be well-formed, or else the build()
+ * method will later report an U_ILLEGAL_ARGUMENT_ERROR.
+ *
+ * <p>The script value is a four-letter script code as
+ * [unicode_script_subtag](http://www.unicode.org/reports/tr35/tr35.html#unicode_script_subtag)
+ * defined by ISO 15924
+ *
+ * @param script the script
+ * @return This builder.
+ * @draft ICU 64
+ */
+ LocaleBuilder& setScript(StringPiece script);
+
+ /**
+ * Sets the region. If region is the empty string, the region in this
+ * <code>LocaleBuilder</code> is removed. Otherwise, the <code>region</code>
+ * must be well-formed, or else the build() method will later report an
+ * U_ILLEGAL_ARGUMENT_ERROR.
+ *
+ * <p>The region value is defined by
+ * [unicode_region_subtag](http://www.unicode.org/reports/tr35/tr35.html#unicode_region_subtag)
+ * as a two-letter ISO 3166 code or a three-digit UN M.49 area code.
+ *
+ * <p>The region value in the <code>Locale</code> created by the
+ * <code>LocaleBuilder</code> is always normalized to upper case.
+ *
+ * @param region the region
+ * @return This builder.
+ * @draft ICU 64
+ */
+ LocaleBuilder& setRegion(StringPiece region);
+
+ /**
+ * Sets the variant. If variant is the empty string, the variant in this
+ * <code>LocaleBuilder</code> is removed. Otherwise, the <code>variant</code>
+ * must be well-formed, or else the build() method will later report an
+ * U_ILLEGAL_ARGUMENT_ERROR.
+ *
+ * <p><b>Note:</b> This method checks if <code>variant</code>
+ * satisfies the
+ * [unicode_variant_subtag](http://www.unicode.org/reports/tr35/tr35.html#unicode_variant_subtag)
+ * syntax requirements, and normalizes the value to lowercase letters. However,
+ * the <code>Locale</code> class does not impose any syntactic
+ * restriction on variant. To set an ill-formed variant, use a Locale constructor.
+ * If there are multiple unicode_variant_subtag, the caller must concatenate
+ * them with '-' as separator (ex: "foobar-fibar").
+ *
+ * @param variant the variant
+ * @return This builder.
+ * @draft ICU 64
+ */
+ LocaleBuilder& setVariant(StringPiece variant);
+
+ /**
+ * Sets the extension for the given key. If the value is the empty string,
+ * the extension is removed. Otherwise, the <code>key</code> and
+ * <code>value</code> must be well-formed, or else the build() method will
+ * later report an U_ILLEGAL_ARGUMENT_ERROR.
+ *
+ * <p><b>Note:</b> The key ('u') is used for the Unicode locale extension.
+ * Setting a value for this key replaces any existing Unicode locale key/type
+ * pairs with those defined in the extension.
+ *
+ * <p><b>Note:</b> The key ('x') is used for the private use code. To be
+ * well-formed, the value for this key needs only to have subtags of one to
+ * eight alphanumeric characters, not two to eight as in the general case.
+ *
+ * @param key the extension key
+ * @param value the extension value
+ * @return This builder.
+ * @draft ICU 64
+ */
+ LocaleBuilder& setExtension(char key, StringPiece value);
+
+ /**
+ * Sets the Unicode locale keyword type for the given key. If the type
+ * StringPiece is constructed with a nullptr, the keyword is removed.
+ * If the type is the empty string, the keyword is set without type subtags.
+ * Otherwise, the key and type must be well-formed, or else the build()
+ * method will later report an U_ILLEGAL_ARGUMENT_ERROR.
+ *
+ * <p>Keys and types are converted to lower case.
+ *
+ * <p><b>Note</b>:Setting the 'u' extension via {@link #setExtension}
+ * replaces all Unicode locale keywords with those defined in the
+ * extension.
+ *
+ * @param key the Unicode locale key
+ * @param type the Unicode locale type
+ * @return This builder.
+ * @draft ICU 64
+ */
+ LocaleBuilder& setUnicodeLocaleKeyword(
+ StringPiece key, StringPiece type);
+
+ /**
+ * Adds a unicode locale attribute, if not already present, otherwise
+ * has no effect. The attribute must not be empty string and must be
+ * well-formed or U_ILLEGAL_ARGUMENT_ERROR will be set to status
+ * during the build() call.
+ *
+ * @param attribute the attribute
+ * @return This builder.
+ * @draft ICU 64
+ */
+ LocaleBuilder& addUnicodeLocaleAttribute(StringPiece attribute);
+
+ /**
+ * Removes a unicode locale attribute, if present, otherwise has no
+ * effect. The attribute must not be empty string and must be well-formed
+ * or U_ILLEGAL_ARGUMENT_ERROR will be set to status during the build() call.
+ *
+ * <p>Attribute comparison for removal is case-insensitive.
+ *
+ * @param attribute the attribute
+ * @return This builder.
+ * @draft ICU 64
+ */
+ LocaleBuilder& removeUnicodeLocaleAttribute(StringPiece attribute);
+
+ /**
+ * Resets the builder to its initial, empty state.
+ * <p>This method clears the internal UErrorCode.
+ *
+ * @return this builder
+ * @draft ICU 64
+ */
+ LocaleBuilder& clear();
+
+ /**
+ * Resets the extensions to their initial, empty state.
+ * Language, script, region and variant are unchanged.
+ *
+ * @return this builder
+ * @draft ICU 64
+ */
+ LocaleBuilder& clearExtensions();
+
+ /**
+ * Returns an instance of <code>Locale</code> created from the fields set
+ * on this builder.
+ * If any set methods or during the build() call require memory allocation
+ * but fail U_MEMORY_ALLOCATION_ERROR will be set to status.
+ * If any of the fields set by the setters are not well-formed, the status
+ * will be set to U_ILLEGAL_ARGUMENT_ERROR. The state of the builder will
+ * not change after the build() call and the caller is free to keep using
+ * the same builder to build more locales.
+ *
+ * @return a new Locale
+ * @draft ICU 64
+ */
+ Locale build(UErrorCode& status);
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Sets the UErrorCode if an error occurred while recording sets.
+ * Preserves older error codes in the outErrorCode.
+ * @param outErrorCode Set to an error code that occurred while setting subtags.
+ * Unchanged if there is no such error or if outErrorCode
+ * already contained an error.
+ * @return TRUE if U_FAILURE(outErrorCode)
+ * @draft ICU 65
+ */
+ UBool copyErrorTo(UErrorCode &outErrorCode) const;
+#endif /* U_HIDE_DRAFT_API */
+
+private:
+ friend class LocaleMatcher::Result;
+
+ void copyExtensionsFrom(const Locale& src, UErrorCode& errorCode);
+
+ UErrorCode status_;
+ char language_[9];
+ char script_[5];
+ char region_[4];
+ CharString *variant_; // Pointer not object so we need not #include internal charstr.h.
+ icu::Locale *extensions_; // Pointer not object. Storage for all other fields.
+
+};
+
+U_NAMESPACE_END
+
+#endif // U_HIDE_DRAFT_API
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
+#endif // __LOCALEBUILDER_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/localematcher.h b/Build/source/libs/icu/icu-src/source/common/unicode/localematcher.h
new file mode 100644
index 00000000000..701123f750b
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/localematcher.h
@@ -0,0 +1,605 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+
+// localematcher.h
+// created: 2019may08 Markus W. Scherer
+
+#ifndef __LOCALEMATCHER_H__
+#define __LOCALEMATCHER_H__
+
+#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
+#include "unicode/locid.h"
+#include "unicode/stringpiece.h"
+#include "unicode/uobject.h"
+
+/**
+ * \file
+ * \brief C++ API: Locale matcher: User's desired locales vs. application's supported locales.
+ */
+
+#ifndef U_HIDE_DRAFT_API
+
+/**
+ * Builder option for whether the language subtag or the script subtag is most important.
+ *
+ * @see Builder#setFavorSubtag(FavorSubtag)
+ * @draft ICU 65
+ */
+enum ULocMatchFavorSubtag {
+ /**
+ * Language differences are most important, then script differences, then region differences.
+ * (This is the default behavior.)
+ *
+ * @draft ICU 65
+ */
+ ULOCMATCH_FAVOR_LANGUAGE,
+ /**
+ * Makes script differences matter relatively more than language differences.
+ *
+ * @draft ICU 65
+ */
+ ULOCMATCH_FAVOR_SCRIPT
+};
+#ifndef U_IN_DOXYGEN
+typedef enum ULocMatchFavorSubtag ULocMatchFavorSubtag;
+#endif
+
+/**
+ * Builder option for whether all desired locales are treated equally or
+ * earlier ones are preferred.
+ *
+ * @see Builder#setDemotionPerDesiredLocale(Demotion)
+ * @draft ICU 65
+ */
+enum ULocMatchDemotion {
+ /**
+ * All desired locales are treated equally.
+ *
+ * @draft ICU 65
+ */
+ ULOCMATCH_DEMOTION_NONE,
+ /**
+ * Earlier desired locales are preferred.
+ *
+ * <p>From each desired locale to the next,
+ * the distance to any supported locale is increased by an additional amount
+ * which is at least as large as most region mismatches.
+ * A later desired locale has to have a better match with some supported locale
+ * due to more than merely having the same region subtag.
+ *
+ * <p>For example: <code>Supported={en, sv} desired=[en-GB, sv]</code>
+ * yields <code>Result(en-GB, en)</code> because
+ * with the demotion of sv its perfect match is no better than
+ * the region distance between the earlier desired locale en-GB and en=en-US.
+ *
+ * <p>Notes:
+ * <ul>
+ * <li>In some cases, language and/or script differences can be as small as
+ * the typical region difference. (Example: sr-Latn vs. sr-Cyrl)
+ * <li>It is possible for certain region differences to be larger than usual,
+ * and larger than the demotion.
+ * (As of CLDR 35 there is no such case, but
+ * this is possible in future versions of the data.)
+ * </ul>
+ *
+ * @draft ICU 65
+ */
+ ULOCMATCH_DEMOTION_REGION
+};
+#ifndef U_IN_DOXYGEN
+typedef enum ULocMatchDemotion ULocMatchDemotion;
+#endif
+
+struct UHashtable;
+
+U_NAMESPACE_BEGIN
+
+struct LSR;
+
+class LocaleDistance;
+class LocaleLsrIterator;
+class UVector;
+class XLikelySubtags;
+
+/**
+ * Immutable class that picks the best match between a user's desired locales and
+ * an application's supported locales.
+ * Movable but not copyable.
+ *
+ * <p>Example:
+ * <pre>
+ * UErrorCode errorCode = U_ZERO_ERROR;
+ * LocaleMatcher matcher = LocaleMatcher::Builder().setSupportedLocales("fr, en-GB, en").build(errorCode);
+ * Locale *bestSupported = matcher.getBestLocale(Locale.US, errorCode); // "en"
+ * </pre>
+ *
+ * <p>A matcher takes into account when languages are close to one another,
+ * such as Danish and Norwegian,
+ * and when regional variants are close, like en-GB and en-AU as opposed to en-US.
+ *
+ * <p>If there are multiple supported locales with the same (language, script, region)
+ * likely subtags, then the current implementation returns the first of those locales.
+ * It ignores variant subtags (except for pseudolocale variants) and extensions.
+ * This may change in future versions.
+ *
+ * <p>For example, the current implementation does not distinguish between
+ * de, de-DE, de-Latn, de-1901, de-u-co-phonebk.
+ *
+ * <p>If you prefer one equivalent locale over another, then provide only the preferred one,
+ * or place it earlier in the list of supported locales.
+ *
+ * <p>Otherwise, the order of supported locales may have no effect on the best-match results.
+ * The current implementation compares each desired locale with supported locales
+ * in the following order:
+ * 1. Default locale, if supported;
+ * 2. CLDR "paradigm locales" like en-GB and es-419;
+ * 3. other supported locales.
+ * This may change in future versions.
+ *
+ * <p>Often a product will just need one matcher instance, built with the languages
+ * that it supports. However, it may want multiple instances with different
+ * default languages based on additional information, such as the domain.
+ *
+ * <p>This class is not intended for public subclassing.
+ *
+ * @draft ICU 65
+ */
+class U_COMMON_API LocaleMatcher : public UMemory {
+public:
+ /**
+ * Data for the best-matching pair of a desired and a supported locale.
+ * Movable but not copyable.
+ *
+ * @draft ICU 65
+ */
+ class U_COMMON_API Result : public UMemory {
+ public:
+ /**
+ * Move constructor; might modify the source.
+ * This object will have the same contents that the source object had.
+ *
+ * @param src Result to move contents from.
+ * @draft ICU 65
+ */
+ Result(Result &&src) U_NOEXCEPT;
+
+ /**
+ * Destructor.
+ *
+ * @draft ICU 65
+ */
+ ~Result();
+
+ /**
+ * Move assignment; might modify the source.
+ * This object will have the same contents that the source object had.
+ *
+ * @param src Result to move contents from.
+ * @draft ICU 65
+ */
+ Result &operator=(Result &&src) U_NOEXCEPT;
+
+ /**
+ * Returns the best-matching desired locale.
+ * nullptr if the list of desired locales is empty or if none matched well enough.
+ *
+ * @return the best-matching desired locale, or nullptr.
+ * @draft ICU 65
+ */
+ inline const Locale *getDesiredLocale() const { return desiredLocale; }
+
+ /**
+ * Returns the best-matching supported locale.
+ * If none matched well enough, this is the default locale.
+ * The default locale is nullptr if the list of supported locales is empty and
+ * no explicit default locale is set.
+ *
+ * @return the best-matching supported locale, or nullptr.
+ * @draft ICU 65
+ */
+ inline const Locale *getSupportedLocale() const { return supportedLocale; }
+
+ /**
+ * Returns the index of the best-matching desired locale in the input Iterable order.
+ * -1 if the list of desired locales is empty or if none matched well enough.
+ *
+ * @return the index of the best-matching desired locale, or -1.
+ * @draft ICU 65
+ */
+ inline int32_t getDesiredIndex() const { return desiredIndex; }
+
+ /**
+ * Returns the index of the best-matching supported locale in the
+ * constructor’s or builder’s input order (“set” Collection plus “added” locales).
+ * If the matcher was built from a locale list string, then the iteration order is that
+ * of a LocalePriorityList built from the same string.
+ * -1 if the list of supported locales is empty or if none matched well enough.
+ *
+ * @return the index of the best-matching supported locale, or -1.
+ * @draft ICU 65
+ */
+ inline int32_t getSupportedIndex() const { return supportedIndex; }
+
+ /**
+ * Takes the best-matching supported locale and adds relevant fields of the
+ * best-matching desired locale, such as the -t- and -u- extensions.
+ * May replace some fields of the supported locale.
+ * The result is the locale that should be used for date and number formatting, collation, etc.
+ * Returns the root locale if getSupportedLocale() returns nullptr.
+ *
+ * <p>Example: desired=ar-SA-u-nu-latn, supported=ar-EG, resolved locale=ar-SA-u-nu-latn
+ *
+ * @return a locale combining the best-matching desired and supported locales.
+ * @draft ICU 65
+ */
+ Locale makeResolvedLocale(UErrorCode &errorCode) const;
+
+ private:
+ Result(const Locale *desired, const Locale *supported,
+ int32_t desIndex, int32_t suppIndex, UBool owned) :
+ desiredLocale(desired), supportedLocale(supported),
+ desiredIndex(desIndex), supportedIndex(suppIndex),
+ desiredIsOwned(owned) {}
+
+ Result(const Result &other) = delete;
+ Result &operator=(const Result &other) = delete;
+
+ const Locale *desiredLocale;
+ const Locale *supportedLocale;
+ int32_t desiredIndex;
+ int32_t supportedIndex;
+ UBool desiredIsOwned;
+
+ friend class LocaleMatcher;
+ };
+
+ /**
+ * LocaleMatcher builder.
+ * Movable but not copyable.
+ *
+ * @see LocaleMatcher#builder()
+ * @draft ICU 65
+ */
+ class U_COMMON_API Builder : public UMemory {
+ public:
+ /**
+ * Constructs a builder used in chaining parameters for building a LocaleMatcher.
+ *
+ * @return a new Builder object
+ * @draft ICU 65
+ */
+ Builder() {}
+
+ /**
+ * Move constructor; might modify the source.
+ * This builder will have the same contents that the source builder had.
+ *
+ * @param src Builder to move contents from.
+ * @draft ICU 65
+ */
+ Builder(Builder &&src) U_NOEXCEPT;
+
+ /**
+ * Destructor.
+ *
+ * @draft ICU 65
+ */
+ ~Builder();
+
+ /**
+ * Move assignment; might modify the source.
+ * This builder will have the same contents that the source builder had.
+ *
+ * @param src Builder to move contents from.
+ * @draft ICU 65
+ */
+ Builder &operator=(Builder &&src) U_NOEXCEPT;
+
+ /**
+ * Parses an Accept-Language string
+ * (<a href="https://tools.ietf.org/html/rfc2616#section-14.4">RFC 2616 Section 14.4</a>),
+ * such as "af, en, fr;q=0.9", and sets the supported locales accordingly.
+ * Allows whitespace in more places but does not allow "*".
+ * Clears any previously set/added supported locales first.
+ *
+ * @param locales the Accept-Language string of locales to set
+ * @return this Builder object
+ * @draft ICU 65
+ */
+ Builder &setSupportedLocalesFromListString(StringPiece locales);
+
+ /**
+ * Copies the supported locales, preserving iteration order.
+ * Clears any previously set/added supported locales first.
+ * Duplicates are allowed, and are not removed.
+ *
+ * @param locales the list of locale
+ * @return this Builder object
+ * @draft ICU 65
+ */
+ Builder &setSupportedLocales(Locale::Iterator &locales);
+
+ /**
+ * Copies the supported locales from the begin/end range, preserving iteration order.
+ * Clears any previously set/added supported locales first.
+ * Duplicates are allowed, and are not removed.
+ *
+ * Each of the iterator parameter values must be an
+ * input iterator whose value is convertible to const Locale &.
+ *
+ * @param begin Start of range.
+ * @param end Exclusive end of range.
+ * @return this Builder object
+ * @draft ICU 65
+ */
+ template<typename Iter>
+ Builder &setSupportedLocales(Iter begin, Iter end) {
+ if (U_FAILURE(errorCode_)) { return *this; }
+ clearSupportedLocales();
+ while (begin != end) {
+ addSupportedLocale(*begin++);
+ }
+ return *this;
+ }
+
+ /**
+ * Copies the supported locales from the begin/end range, preserving iteration order.
+ * Calls the converter to convert each *begin to a Locale or const Locale &.
+ * Clears any previously set/added supported locales first.
+ * Duplicates are allowed, and are not removed.
+ *
+ * Each of the iterator parameter values must be an
+ * input iterator whose value is convertible to const Locale &.
+ *
+ * @param begin Start of range.
+ * @param end Exclusive end of range.
+ * @param converter Converter from *begin to const Locale & or compatible.
+ * @return this Builder object
+ * @draft ICU 65
+ */
+ template<typename Iter, typename Conv>
+ Builder &setSupportedLocalesViaConverter(Iter begin, Iter end, Conv converter) {
+ if (U_FAILURE(errorCode_)) { return *this; }
+ clearSupportedLocales();
+ while (begin != end) {
+ addSupportedLocale(converter(*begin++));
+ }
+ return *this;
+ }
+
+ /**
+ * Adds another supported locale.
+ * Duplicates are allowed, and are not removed.
+ *
+ * @param locale another locale
+ * @return this Builder object
+ * @draft ICU 65
+ */
+ Builder &addSupportedLocale(const Locale &locale);
+
+ /**
+ * Sets the default locale; if nullptr, or if it is not set explicitly,
+ * then the first supported locale is used as the default locale.
+ *
+ * @param defaultLocale the default locale (will be copied)
+ * @return this Builder object
+ * @draft ICU 65
+ */
+ Builder &setDefaultLocale(const Locale *defaultLocale);
+
+ /**
+ * If ULOCMATCH_FAVOR_SCRIPT, then the language differences are smaller than script
+ * differences.
+ * This is used in situations (such as maps) where
+ * it is better to fall back to the same script than a similar language.
+ *
+ * @param subtag the subtag to favor
+ * @return this Builder object
+ * @draft ICU 65
+ */
+ Builder &setFavorSubtag(ULocMatchFavorSubtag subtag);
+
+ /**
+ * Option for whether all desired locales are treated equally or
+ * earlier ones are preferred (this is the default).
+ *
+ * @param demotion the demotion per desired locale to set.
+ * @return this Builder object
+ * @draft ICU 65
+ */
+ Builder &setDemotionPerDesiredLocale(ULocMatchDemotion demotion);
+
+ /**
+ * Sets the UErrorCode if an error occurred while setting parameters.
+ * Preserves older error codes in the outErrorCode.
+ *
+ * @param outErrorCode Set to an error code if it does not contain one already
+ * and an error occurred while setting parameters.
+ * Otherwise unchanged.
+ * @return TRUE if U_FAILURE(outErrorCode)
+ * @draft ICU 65
+ */
+ UBool copyErrorTo(UErrorCode &outErrorCode) const;
+
+ /**
+ * Builds and returns a new locale matcher.
+ * This builder can continue to be used.
+ *
+ * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test,
+ * or else the function returns immediately. Check for U_FAILURE()
+ * on output or use with function chaining. (See User Guide for details.)
+ * @return new LocaleMatcher.
+ * @draft ICU 65
+ */
+ LocaleMatcher build(UErrorCode &errorCode) const;
+
+ private:
+ friend class LocaleMatcher;
+
+ Builder(const Builder &other) = delete;
+ Builder &operator=(const Builder &other) = delete;
+
+ void clearSupportedLocales();
+ bool ensureSupportedLocaleVector();
+
+ UErrorCode errorCode_ = U_ZERO_ERROR;
+ UVector *supportedLocales_ = nullptr;
+ int32_t thresholdDistance_ = -1;
+ ULocMatchDemotion demotion_ = ULOCMATCH_DEMOTION_REGION;
+ Locale *defaultLocale_ = nullptr;
+ ULocMatchFavorSubtag favor_ = ULOCMATCH_FAVOR_LANGUAGE;
+ };
+
+ // FYI No public LocaleMatcher constructors in C++; use the Builder.
+
+ /**
+ * Move copy constructor; might modify the source.
+ * This matcher will have the same settings that the source matcher had.
+ * @param src source matcher
+ * @draft ICU 65
+ */
+ LocaleMatcher(LocaleMatcher &&src) U_NOEXCEPT;
+
+ /**
+ * Destructor.
+ * @draft ICU 65
+ */
+ ~LocaleMatcher();
+
+ /**
+ * Move assignment operator; might modify the source.
+ * This matcher will have the same settings that the source matcher had.
+ * The behavior is undefined if *this and src are the same object.
+ * @param src source matcher
+ * @return *this
+ * @draft ICU 65
+ */
+ LocaleMatcher &operator=(LocaleMatcher &&src) U_NOEXCEPT;
+
+ /**
+ * Returns the supported locale which best matches the desired locale.
+ *
+ * @param desiredLocale Typically a user's language.
+ * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test,
+ * or else the function returns immediately. Check for U_FAILURE()
+ * on output or use with function chaining. (See User Guide for details.)
+ * @return the best-matching supported locale.
+ * @draft ICU 65
+ */
+ const Locale *getBestMatch(const Locale &desiredLocale, UErrorCode &errorCode) const;
+
+ /**
+ * Returns the supported locale which best matches one of the desired locales.
+ *
+ * @param desiredLocales Typically a user's languages, in order of preference (descending).
+ * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test,
+ * or else the function returns immediately. Check for U_FAILURE()
+ * on output or use with function chaining. (See User Guide for details.)
+ * @return the best-matching supported locale.
+ * @draft ICU 65
+ */
+ const Locale *getBestMatch(Locale::Iterator &desiredLocales, UErrorCode &errorCode) const;
+
+ /**
+ * Parses an Accept-Language string
+ * (<a href="https://tools.ietf.org/html/rfc2616#section-14.4">RFC 2616 Section 14.4</a>),
+ * such as "af, en, fr;q=0.9",
+ * and returns the supported locale which best matches one of the desired locales.
+ * Allows whitespace in more places but does not allow "*".
+ *
+ * @param desiredLocaleList Typically a user's languages, as an Accept-Language string.
+ * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test,
+ * or else the function returns immediately. Check for U_FAILURE()
+ * on output or use with function chaining. (See User Guide for details.)
+ * @return the best-matching supported locale.
+ * @draft ICU 65
+ */
+ const Locale *getBestMatchForListString(StringPiece desiredLocaleList, UErrorCode &errorCode) const;
+
+ /**
+ * Returns the best match between the desired locale and the supported locales.
+ * If the result's desired locale is not nullptr, then it is the address of the input locale.
+ * It has not been cloned.
+ *
+ * @param desiredLocale Typically a user's language.
+ * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test,
+ * or else the function returns immediately. Check for U_FAILURE()
+ * on output or use with function chaining. (See User Guide for details.)
+ * @return the best-matching pair of the desired and a supported locale.
+ * @draft ICU 65
+ */
+ Result getBestMatchResult(const Locale &desiredLocale, UErrorCode &errorCode) const;
+
+ /**
+ * Returns the best match between the desired and supported locales.
+ * If the result's desired locale is not nullptr, then it is a clone of
+ * the best-matching desired locale. The Result object owns the clone.
+ *
+ * @param desiredLocales Typically a user's languages, in order of preference (descending).
+ * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test,
+ * or else the function returns immediately. Check for U_FAILURE()
+ * on output or use with function chaining. (See User Guide for details.)
+ * @return the best-matching pair of a desired and a supported locale.
+ * @draft ICU 65
+ */
+ Result getBestMatchResult(Locale::Iterator &desiredLocales, UErrorCode &errorCode) const;
+
+#ifndef U_HIDE_INTERNAL_API
+ /**
+ * Returns a fraction between 0 and 1, where 1 means that the languages are a
+ * perfect match, and 0 means that they are completely different.
+ *
+ * <p>This is mostly an implementation detail, and the precise values may change over time.
+ * The implementation may use either the maximized forms or the others ones, or both.
+ * The implementation may or may not rely on the forms to be consistent with each other.
+ *
+ * <p>Callers should construct and use a matcher rather than match pairs of locales directly.
+ *
+ * @param desired Desired locale.
+ * @param supported Supported locale.
+ * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test,
+ * or else the function returns immediately. Check for U_FAILURE()
+ * on output or use with function chaining. (See User Guide for details.)
+ * @return value between 0 and 1, inclusive.
+ * @internal (has a known user)
+ */
+ double internalMatch(const Locale &desired, const Locale &supported, UErrorCode &errorCode) const;
+#endif // U_HIDE_INTERNAL_API
+
+private:
+ LocaleMatcher(const Builder &builder, UErrorCode &errorCode);
+ LocaleMatcher(const LocaleMatcher &other) = delete;
+ LocaleMatcher &operator=(const LocaleMatcher &other) = delete;
+
+ int32_t getBestSuppIndex(LSR desiredLSR, LocaleLsrIterator *remainingIter, UErrorCode &errorCode) const;
+
+ const XLikelySubtags &likelySubtags;
+ const LocaleDistance &localeDistance;
+ int32_t thresholdDistance;
+ int32_t demotionPerDesiredLocale;
+ ULocMatchFavorSubtag favorSubtag;
+
+ // These are in input order.
+ const Locale ** supportedLocales;
+ LSR *lsrs;
+ int32_t supportedLocalesLength;
+ // These are in preference order: 1. Default locale 2. paradigm locales 3. others.
+ UHashtable *supportedLsrToIndex; // Map<LSR, Integer> stores index+1 because 0 is "not found"
+ // Array versions of the supportedLsrToIndex keys and values.
+ // The distance lookup loops over the supportedLSRs and returns the index of the best match.
+ const LSR **supportedLSRs;
+ int32_t *supportedIndexes;
+ int32_t supportedLSRsLength;
+ Locale *ownedDefaultLocale;
+ const Locale *defaultLocale;
+ int32_t defaultLocaleIndex;
+};
+
+U_NAMESPACE_END
+
+#endif // U_HIDE_DRAFT_API
+#endif // U_SHOW_CPLUSPLUS_API
+#endif // __LOCALEMATCHER_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/localpointer.h b/Build/source/libs/icu/icu-src/source/common/unicode/localpointer.h
index e17ee3d886e..e011688b1a5 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/localpointer.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/localpointer.h
@@ -42,6 +42,8 @@
#if U_SHOW_CPLUSPLUS_API
+#include <memory>
+
U_NAMESPACE_BEGIN
/**
@@ -65,6 +67,13 @@ U_NAMESPACE_BEGIN
template<typename T>
class LocalPointerBase {
public:
+ // No heap allocation. Use only on the stack.
+ static void* U_EXPORT2 operator new(size_t) = delete;
+ static void* U_EXPORT2 operator new[](size_t) = delete;
+#if U_HAVE_PLACEMENT_NEW
+ static void* U_EXPORT2 operator new(size_t, void*) = delete;
+#endif
+
/**
* Constructor takes ownership.
* @param p simple pointer to an object that is adopted
@@ -158,12 +167,6 @@ private:
// No ownership sharing: No copy constructor, no assignment operator.
LocalPointerBase(const LocalPointerBase<T> &other);
void operator=(const LocalPointerBase<T> &other);
- // No heap allocation. Use only on the stack.
- static void * U_EXPORT2 operator new(size_t size);
- static void * U_EXPORT2 operator new[](size_t size);
-#if U_HAVE_PLACEMENT_NEW
- static void * U_EXPORT2 operator new(size_t, void *ptr);
-#endif
};
/**
@@ -221,6 +224,22 @@ public:
LocalPointer(LocalPointer<T> &&src) U_NOEXCEPT : LocalPointerBase<T>(src.ptr) {
src.ptr=NULL;
}
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Constructs a LocalPointer from a C++11 std::unique_ptr.
+ * The LocalPointer steals the object owned by the std::unique_ptr.
+ *
+ * This constructor works via move semantics. If your std::unique_ptr is
+ * in a local variable, you must use std::move.
+ *
+ * @param p The std::unique_ptr from which the pointer will be stolen.
+ * @draft ICU 64
+ */
+ explicit LocalPointer(std::unique_ptr<T> &&p)
+ : LocalPointerBase<T>(p.release()) {}
+#endif /* U_HIDE_DRAFT_API */
+
/**
* Destructor deletes the object it owns.
* @stable ICU 4.4
@@ -236,24 +255,27 @@ public:
* @stable ICU 56
*/
LocalPointer<T> &operator=(LocalPointer<T> &&src) U_NOEXCEPT {
- return moveFrom(src);
+ delete LocalPointerBase<T>::ptr;
+ LocalPointerBase<T>::ptr=src.ptr;
+ src.ptr=NULL;
+ return *this;
}
- // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API
+
+#ifndef U_HIDE_DRAFT_API
/**
- * Move assignment, leaves src with isNull().
- * The behavior is undefined if *this and src are the same object.
+ * Move-assign from an std::unique_ptr to this LocalPointer.
+ * Steals the pointer from the std::unique_ptr.
*
- * Can be called explicitly, does not need C++11 support.
- * @param src source smart pointer
+ * @param p The std::unique_ptr from which the pointer will be stolen.
* @return *this
- * @draft ICU 56
+ * @draft ICU 64
*/
- LocalPointer<T> &moveFrom(LocalPointer<T> &src) U_NOEXCEPT {
- delete LocalPointerBase<T>::ptr;
- LocalPointerBase<T>::ptr=src.ptr;
- src.ptr=NULL;
+ LocalPointer<T> &operator=(std::unique_ptr<T> &&p) U_NOEXCEPT {
+ adoptInstead(p.release());
return *this;
}
+#endif /* U_HIDE_DRAFT_API */
+
/**
* Swap pointers.
* @param other other smart pointer
@@ -309,6 +331,23 @@ public:
delete p;
}
}
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Conversion operator to a C++11 std::unique_ptr.
+ * Disowns the object and gives it to the returned std::unique_ptr.
+ *
+ * This operator works via move semantics. If your LocalPointer is
+ * in a local variable, you must use std::move.
+ *
+ * @return An std::unique_ptr owning the pointer previously owned by this
+ * icu::LocalPointer.
+ * @draft ICU 64
+ */
+ operator std::unique_ptr<T> () && {
+ return std::unique_ptr<T>(LocalPointerBase<T>::orphan());
+ }
+#endif /* U_HIDE_DRAFT_API */
};
/**
@@ -366,6 +405,22 @@ public:
LocalArray(LocalArray<T> &&src) U_NOEXCEPT : LocalPointerBase<T>(src.ptr) {
src.ptr=NULL;
}
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Constructs a LocalArray from a C++11 std::unique_ptr of an array type.
+ * The LocalPointer steals the array owned by the std::unique_ptr.
+ *
+ * This constructor works via move semantics. If your std::unique_ptr is
+ * in a local variable, you must use std::move.
+ *
+ * @param p The std::unique_ptr from which the array will be stolen.
+ * @draft ICU 64
+ */
+ explicit LocalArray(std::unique_ptr<T[]> &&p)
+ : LocalPointerBase<T>(p.release()) {}
+#endif /* U_HIDE_DRAFT_API */
+
/**
* Destructor deletes the array it owns.
* @stable ICU 4.4
@@ -381,24 +436,27 @@ public:
* @stable ICU 56
*/
LocalArray<T> &operator=(LocalArray<T> &&src) U_NOEXCEPT {
- return moveFrom(src);
+ delete[] LocalPointerBase<T>::ptr;
+ LocalPointerBase<T>::ptr=src.ptr;
+ src.ptr=NULL;
+ return *this;
}
- // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API
+
+#ifndef U_HIDE_DRAFT_API
/**
- * Move assignment, leaves src with isNull().
- * The behavior is undefined if *this and src are the same object.
+ * Move-assign from an std::unique_ptr to this LocalPointer.
+ * Steals the array from the std::unique_ptr.
*
- * Can be called explicitly, does not need C++11 support.
- * @param src source smart pointer
+ * @param p The std::unique_ptr from which the array will be stolen.
* @return *this
- * @draft ICU 56
+ * @draft ICU 64
*/
- LocalArray<T> &moveFrom(LocalArray<T> &src) U_NOEXCEPT {
- delete[] LocalPointerBase<T>::ptr;
- LocalPointerBase<T>::ptr=src.ptr;
- src.ptr=NULL;
+ LocalArray<T> &operator=(std::unique_ptr<T[]> &&p) U_NOEXCEPT {
+ adoptInstead(p.release());
return *this;
}
+#endif /* U_HIDE_DRAFT_API */
+
/**
* Swap pointers.
* @param other other smart pointer
@@ -462,6 +520,23 @@ public:
* @stable ICU 4.4
*/
T &operator[](ptrdiff_t i) const { return LocalPointerBase<T>::ptr[i]; }
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Conversion operator to a C++11 std::unique_ptr.
+ * Disowns the object and gives it to the returned std::unique_ptr.
+ *
+ * This operator works via move semantics. If your LocalPointer is
+ * in a local variable, you must use std::move.
+ *
+ * @return An std::unique_ptr owning the pointer previously owned by this
+ * icu::LocalPointer.
+ * @draft ICU 64
+ */
+ operator std::unique_ptr<T[]> () && {
+ return std::unique_ptr<T[]>(LocalPointerBase<T>::orphan());
+ }
+#endif /* U_HIDE_DRAFT_API */
};
/**
@@ -494,16 +569,21 @@ public:
: LocalPointerBase<Type>(src.ptr) { \
src.ptr=NULL; \
} \
+ /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ \
+ explicit LocalPointerClassName(std::unique_ptr<Type, decltype(&closeFunction)> &&p) \
+ : LocalPointerBase<Type>(p.release()) {} \
~LocalPointerClassName() { if (ptr != NULL) { closeFunction(ptr); } } \
LocalPointerClassName &operator=(LocalPointerClassName &&src) U_NOEXCEPT { \
- return moveFrom(src); \
- } \
- LocalPointerClassName &moveFrom(LocalPointerClassName &src) U_NOEXCEPT { \
if (ptr != NULL) { closeFunction(ptr); } \
LocalPointerBase<Type>::ptr=src.ptr; \
src.ptr=NULL; \
return *this; \
} \
+ /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ \
+ LocalPointerClassName &operator=(std::unique_ptr<Type, decltype(&closeFunction)> &&p) { \
+ adoptInstead(p.release()); \
+ return *this; \
+ } \
void swap(LocalPointerClassName &other) U_NOEXCEPT { \
Type *temp=LocalPointerBase<Type>::ptr; \
LocalPointerBase<Type>::ptr=other.ptr; \
@@ -516,6 +596,9 @@ public:
if (ptr != NULL) { closeFunction(ptr); } \
ptr=p; \
} \
+ operator std::unique_ptr<Type, decltype(&closeFunction)> () && { \
+ return std::unique_ptr<Type, decltype(&closeFunction)>(LocalPointerBase<Type>::orphan(), closeFunction); \
+ } \
}
U_NAMESPACE_END
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/locdspnm.h b/Build/source/libs/icu/icu-src/source/common/unicode/locdspnm.h
index 7f227829b4c..4f06f857044 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/locdspnm.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/locdspnm.h
@@ -12,6 +12,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Provides display names of Locale and its components.
@@ -49,7 +51,7 @@ public:
* @return a LocaleDisplayNames instance
* @stable ICU 4.4
*/
- static LocaleDisplayNames* U_EXPORT2 createInstance(const Locale& locale);
+ inline static LocaleDisplayNames* U_EXPORT2 createInstance(const Locale& locale);
/**
* Returns an instance of LocaleDisplayNames that returns names
@@ -204,4 +206,6 @@ U_NAMESPACE_END
#endif
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/locid.h b/Build/source/libs/icu/icu-src/source/common/unicode/locid.h
index 1ef15ca7512..57c669b3343 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/locid.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/locid.h
@@ -31,11 +31,14 @@
#ifndef LOCID_H
#define LOCID_H
+#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/bytestream.h"
#include "unicode/localpointer.h"
#include "unicode/strenum.h"
#include "unicode/stringpiece.h"
-#include "unicode/utypes.h"
#include "unicode/uobject.h"
#include "unicode/putil.h"
#include "unicode/uloc.h"
@@ -284,16 +287,14 @@ public:
*/
Locale(const Locale& other);
-#ifndef U_HIDE_DRAFT_API
/**
* Move constructor; might leave source in bogus state.
* This locale will have the same contents that the source locale had.
*
* @param other The Locale object being moved in.
- * @draft ICU 63
+ * @stable ICU 63
*/
Locale(Locale&& other) U_NOEXCEPT;
-#endif // U_HIDE_DRAFT_API
/**
* Destructor
@@ -310,7 +311,6 @@ public:
*/
Locale& operator=(const Locale& other);
-#ifndef U_HIDE_DRAFT_API
/**
* Move assignment operator; might leave source in bogus state.
* This locale will have the same contents that the source locale had.
@@ -318,10 +318,9 @@ public:
*
* @param other The Locale object being moved in.
* @return *this
- * @draft ICU 63
+ * @stable ICU 63
*/
Locale& operator=(Locale&& other) U_NOEXCEPT;
-#endif // U_HIDE_DRAFT_API
/**
* Checks if two locale keys are the same.
@@ -340,7 +339,7 @@ public:
* otherwise.
* @stable ICU 2.0
*/
- UBool operator!=(const Locale& other) const;
+ inline UBool operator!=(const Locale& other) const;
/**
* Clone this object.
@@ -389,7 +388,6 @@ public:
UErrorCode& success);
#endif /* U_HIDE_SYSTEM_API */
-#ifndef U_HIDE_DRAFT_API
/**
* Returns a Locale for the specified BCP47 language tag string.
* If the specified language tag contains any ill-formed subtags,
@@ -405,7 +403,7 @@ public:
* @param tag the input BCP47 language tag.
* @param status error information if creating the Locale failed.
* @return the Locale for the specified BCP47 language tag.
- * @draft ICU 63
+ * @stable ICU 63
*/
static Locale U_EXPORT2 forLanguageTag(StringPiece tag, UErrorCode& status);
@@ -420,7 +418,7 @@ public:
* @param sink the output sink receiving the BCP47 language
* tag for this Locale.
* @param status error information if creating the language tag failed.
- * @draft ICU 63
+ * @stable ICU 63
*/
void toLanguageTag(ByteSink& sink, UErrorCode& status) const;
@@ -432,11 +430,10 @@ public:
*
* @param status error information if creating the language tag failed.
* @return the BCP47 language tag for this Locale.
- * @draft ICU 63
+ * @stable ICU 63
*/
template<typename StringClass>
inline StringClass toLanguageTag(UErrorCode& status) const;
-#endif // U_HIDE_DRAFT_API
/**
* Creates a locale which has had minimal canonicalization
@@ -508,7 +505,6 @@ public:
*/
const char * getBaseName() const;
-#ifndef U_HIDE_DRAFT_API
/**
* Add the likely subtags for this Locale, per the algorithm described
* in the following CLDR technical report:
@@ -536,7 +532,7 @@ public:
* @param status error information if maximizing this Locale failed.
* If this Locale is not well-formed, the error code is
* U_ILLEGAL_ARGUMENT_ERROR.
- * @draft ICU 63
+ * @stable ICU 63
*/
void addLikelySubtags(UErrorCode& status);
@@ -567,10 +563,9 @@ public:
* @param status error information if maximizing this Locale failed.
* If this Locale is not well-formed, the error code is
* U_ILLEGAL_ARGUMENT_ERROR.
- * @draft ICU 63
+ * @stable ICU 63
*/
void minimizeSubtags(UErrorCode& status);
-#endif // U_HIDE_DRAFT_API
/**
* Gets the list of keywords for the specified locale.
@@ -583,8 +578,6 @@ public:
*/
StringEnumeration * createKeywords(UErrorCode &status) const;
-#ifndef U_HIDE_DRAFT_API
-
/**
* Gets the list of Unicode keywords for the specified locale.
*
@@ -592,7 +585,7 @@ public:
* @return pointer to StringEnumeration class, or NULL if there are no keywords.
* Client must dispose of it by calling delete.
* @see getUnicodeKeywords
- * @draft ICU 63
+ * @stable ICU 63
*/
StringEnumeration * createUnicodeKeywords(UErrorCode &status) const;
@@ -605,7 +598,7 @@ public:
*
* @param iterator an STL style output iterator to write the keywords to.
* @param status error information if creating set of keywords failed.
- * @draft ICU 63
+ * @stable ICU 63
*/
template<typename StringClass, typename OutputIterator>
inline void getKeywords(OutputIterator iterator, UErrorCode& status) const;
@@ -619,13 +612,11 @@ public:
*
* @param iterator an STL style output iterator to write the keywords to.
* @param status error information if creating set of keywords failed.
- * @draft ICU 63
+ * @stable ICU 63
*/
template<typename StringClass, typename OutputIterator>
inline void getUnicodeKeywords(OutputIterator iterator, UErrorCode& status) const;
-#endif // U_HIDE_DRAFT_API
-
/**
* Gets the value for a keyword.
*
@@ -644,7 +635,6 @@ public:
*/
int32_t getKeywordValue(const char* keywordName, char *buffer, int32_t bufferCapacity, UErrorCode &status) const;
-#ifndef U_HIDE_DRAFT_API
/**
* Gets the value for a keyword.
*
@@ -656,7 +646,7 @@ public:
* @param keywordName name of the keyword for which we want the value.
* @param sink the sink to receive the keyword value.
* @param status error information if getting the value failed.
- * @draft ICU 63
+ * @stable ICU 63
*/
void getKeywordValue(StringPiece keywordName, ByteSink& sink, UErrorCode& status) const;
@@ -671,7 +661,7 @@ public:
* @param keywordName name of the keyword for which we want the value.
* @param status error information if getting the value failed.
* @return the keyword value.
- * @draft ICU 63
+ * @stable ICU 63
*/
template<typename StringClass>
inline StringClass getKeywordValue(StringPiece keywordName, UErrorCode& status) const;
@@ -687,7 +677,7 @@ public:
* @param keywordName name of the keyword for which we want the value.
* @param sink the sink to receive the keyword value.
* @param status error information if getting the value failed.
- * @draft ICU 63
+ * @stable ICU 63
*/
void getUnicodeKeywordValue(StringPiece keywordName, ByteSink& sink, UErrorCode& status) const;
@@ -702,11 +692,10 @@ public:
* @param keywordName name of the keyword for which we want the value.
* @param status error information if getting the value failed.
* @return the keyword value.
- * @draft ICU 63
+ * @stable ICU 63
*/
template<typename StringClass>
inline StringClass getUnicodeKeywordValue(StringPiece keywordName, UErrorCode& status) const;
-#endif // U_HIDE_DRAFT_API
/**
* Sets or removes the value for a keyword.
@@ -729,7 +718,6 @@ public:
*/
void setKeywordValue(const char* keywordName, const char* keywordValue, UErrorCode &status);
-#ifndef U_HIDE_DRAFT_API
/**
* Sets or removes the value for a keyword.
*
@@ -746,7 +734,7 @@ public:
* NULL, will result in the keyword being removed. No error is given if
* that keyword does not exist.
* @param status Returns any error information while performing this operation.
- * @draft ICU 63
+ * @stable ICU 63
*/
void setKeywordValue(StringPiece keywordName, StringPiece keywordValue, UErrorCode& status);
@@ -766,10 +754,9 @@ public:
* NULL, will result in the keyword being removed. No error is given if
* that keyword does not exist.
* @param status Returns any error information while performing this operation.
- * @draft ICU 63
+ * @stable ICU 63
*/
void setUnicodeKeywordValue(StringPiece keywordName, StringPiece keywordValue, UErrorCode& status);
-#endif // U_HIDE_DRAFT_API
/**
* returns the locale's three-letter language code, as specified
@@ -962,7 +949,7 @@ public:
* @return FALSE if it is a real locale, TRUE if it is a bogus locale
* @stable ICU 2.1
*/
- UBool isBogus(void) const;
+ inline UBool isBogus(void) const;
/**
* Returns a list of all installed locales.
@@ -1008,6 +995,104 @@ public:
*/
virtual UClassID getDynamicClassID() const;
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * A Locale iterator interface similar to a Java Iterator<Locale>.
+ * @draft ICU 65
+ */
+ class U_COMMON_API Iterator /* not : public UObject because this is an interface/mixin class */ {
+ public:
+ /** @draft ICU 65 */
+ virtual ~Iterator();
+
+ /**
+ * @return TRUE if next() can be called again.
+ * @draft ICU 65
+ */
+ virtual UBool hasNext() const = 0;
+
+ /**
+ * @return the next locale.
+ * @draft ICU 65
+ */
+ virtual const Locale &next() = 0;
+ };
+
+ /**
+ * A generic Locale iterator implementation over Locale input iterators.
+ * @draft ICU 65
+ */
+ template<typename Iter>
+ class RangeIterator : public Iterator, public UMemory {
+ public:
+ /**
+ * Constructs an iterator from a begin/end range.
+ * Each of the iterator parameter values must be an
+ * input iterator whose value is convertible to const Locale &.
+ *
+ * @param begin Start of range.
+ * @param end Exclusive end of range.
+ * @draft ICU 65
+ */
+ RangeIterator(Iter begin, Iter end) : it_(begin), end_(end) {}
+
+ /**
+ * @return TRUE if next() can be called again.
+ * @draft ICU 65
+ */
+ UBool hasNext() const override { return it_ != end_; }
+
+ /**
+ * @return the next locale.
+ * @draft ICU 65
+ */
+ const Locale &next() override { return *it_++; }
+
+ private:
+ Iter it_;
+ const Iter end_;
+ };
+
+ /**
+ * A generic Locale iterator implementation over Locale input iterators.
+ * Calls the converter to convert each *begin to a const Locale &.
+ * @draft ICU 65
+ */
+ template<typename Iter, typename Conv>
+ class ConvertingIterator : public Iterator, public UMemory {
+ public:
+ /**
+ * Constructs an iterator from a begin/end range.
+ * Each of the iterator parameter values must be an
+ * input iterator whose value the converter converts to const Locale &.
+ *
+ * @param begin Start of range.
+ * @param end Exclusive end of range.
+ * @param converter Converter from *begin to const Locale & or compatible.
+ * @draft ICU 65
+ */
+ ConvertingIterator(Iter begin, Iter end, Conv converter) :
+ it_(begin), end_(end), converter_(converter) {}
+
+ /**
+ * @return TRUE if next() can be called again.
+ * @draft ICU 65
+ */
+ UBool hasNext() const override { return it_ != end_; }
+
+ /**
+ * @return the next locale.
+ * @draft ICU 65
+ */
+ const Locale &next() override { return converter_(*it_++); }
+
+ private:
+ Iter it_;
+ const Iter end_;
+ Conv converter_;
+ };
+#endif // U_HIDE_DRAFT_API
+
protected: /* only protected for testing purposes. DO NOT USE. */
#ifndef U_HIDE_INTERNAL_API
/**
@@ -1074,7 +1159,6 @@ Locale::operator!=(const Locale& other) const
return !operator==(other);
}
-#ifndef U_HIDE_DRAFT_API
template<typename StringClass> inline StringClass
Locale::toLanguageTag(UErrorCode& status) const
{
@@ -1083,7 +1167,6 @@ Locale::toLanguageTag(UErrorCode& status) const
toLanguageTag(sink, status);
return result;
}
-#endif // U_HIDE_DRAFT_API
inline const char *
Locale::getCountry() const
@@ -1115,13 +1198,11 @@ Locale::getName() const
return fullName;
}
-#ifndef U_HIDE_DRAFT_API
-
template<typename StringClass, typename OutputIterator> inline void
Locale::getKeywords(OutputIterator iterator, UErrorCode& status) const
{
LocalPointer<StringEnumeration> keys(createKeywords(status));
- if (U_FAILURE(status)) {
+ if (U_FAILURE(status) || keys.isNull()) {
return;
}
for (;;) {
@@ -1138,7 +1219,7 @@ template<typename StringClass, typename OutputIterator> inline void
Locale::getUnicodeKeywords(OutputIterator iterator, UErrorCode& status) const
{
LocalPointer<StringEnumeration> keys(createUnicodeKeywords(status));
- if (U_FAILURE(status)) {
+ if (U_FAILURE(status) || keys.isNull()) {
return;
}
for (;;) {
@@ -1169,8 +1250,6 @@ Locale::getUnicodeKeywordValue(StringPiece keywordName, UErrorCode& status) cons
return result;
}
-#endif // U_HIDE_DRAFT_API
-
inline UBool
Locale::isBogus(void) const {
return fIsBogus;
@@ -1178,4 +1257,6 @@ Locale::isBogus(void) const {
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/messagepattern.h b/Build/source/libs/icu/icu-src/source/common/unicode/messagepattern.h
index 9f2a86551ca..04f00a8757d 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/messagepattern.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/messagepattern.h
@@ -24,6 +24,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_FORMATTING
#include "unicode/parseerr.h"
@@ -942,4 +944,6 @@ U_NAMESPACE_END
#endif // !UCONFIG_NO_FORMATTING
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __MESSAGEPATTERN_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/normalizer2.h b/Build/source/libs/icu/icu-src/source/common/unicode/normalizer2.h
index 4caa0e31034..4aeb3bb3d82 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/normalizer2.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/normalizer2.h
@@ -26,6 +26,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_NORMALIZATION
#include "unicode/stringpiece.h"
@@ -771,4 +773,7 @@ private:
U_NAMESPACE_END
#endif // !UCONFIG_NO_NORMALIZATION
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __NORMALIZER2_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/normlzr.h b/Build/source/libs/icu/icu-src/source/common/unicode/normlzr.h
index 0141058fb00..07a596bd11b 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/normlzr.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/normlzr.h
@@ -13,6 +13,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Unicode Normalization
@@ -183,6 +185,7 @@ public:
Normalizer(const CharacterIterator& iter, UNormalizationMode mode);
#endif /* U_HIDE_DEPRECATED_API */
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Copy constructor.
* @param copy The object to be copied.
@@ -195,7 +198,7 @@ public:
* @deprecated ICU 56 Use Normalizer2 instead.
*/
virtual ~Normalizer();
-
+#endif // U_FORCE_HIDE_DEPRECATED_API
//-------------------------------------------------------------------------
// Static utility methods
@@ -599,7 +602,7 @@ public:
* @return a pointer to a new Normalizer
* @deprecated ICU 56 Use Normalizer2 instead.
*/
- Normalizer* clone(void) const;
+ Normalizer* clone() const;
/**
* Generates a hash code for this iterator.
@@ -723,12 +726,14 @@ public:
static UClassID U_EXPORT2 getStaticClassID();
#endif /* U_HIDE_DEPRECATED_API */
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* ICU "poor man's RTTI", returns a UClassID for the actual class.
* @return a UClassID for the actual class.
* @deprecated ICU 56 Use Normalizer2 instead.
*/
virtual UClassID getDynamicClassID() const;
+#endif // U_FORCE_HIDE_DEPRECATED_API
private:
//-------------------------------------------------------------------------
@@ -807,3 +812,5 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_NORMALIZATION */
#endif // NORMLZR_H
+
+#endif /* U_SHOW_CPLUSPLUS_API */
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/parsepos.h b/Build/source/libs/icu/icu-src/source/common/unicode/parsepos.h
index bbebca7b571..909d288d48d 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/parsepos.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/parsepos.h
@@ -19,6 +19,9 @@
#define PARSEPOS_H
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/uobject.h"
@@ -90,21 +93,21 @@ public:
* Assignment operator
* @stable ICU 2.0
*/
- ParsePosition& operator=(const ParsePosition& copy);
+ inline ParsePosition& operator=(const ParsePosition& copy);
/**
* Equality operator.
* @return TRUE if the two parse positions are equal, FALSE otherwise.
* @stable ICU 2.0
*/
- UBool operator==(const ParsePosition& that) const;
+ inline UBool operator==(const ParsePosition& that) const;
/**
* Equality operator.
* @return TRUE if the two parse positions are not equal, FALSE otherwise.
* @stable ICU 2.0
*/
- UBool operator!=(const ParsePosition& that) const;
+ inline UBool operator!=(const ParsePosition& that) const;
/**
* Clone this object.
@@ -126,14 +129,14 @@ public:
* @return the current index.
* @stable ICU 2.0
*/
- int32_t getIndex(void) const;
+ inline int32_t getIndex(void) const;
/**
* Set the current parse position.
* @param index the new index.
* @stable ICU 2.0
*/
- void setIndex(int32_t index);
+ inline void setIndex(int32_t index);
/**
* Set the index at which a parse error occurred. Formatters
@@ -142,14 +145,14 @@ public:
* set.
* @stable ICU 2.0
*/
- void setErrorIndex(int32_t ei);
+ inline void setErrorIndex(int32_t ei);
/**
* Retrieve the index at which an error occurred, or -1 if the
* error index has not been set.
* @stable ICU 2.0
*/
- int32_t getErrorIndex(void) const;
+ inline int32_t getErrorIndex(void) const;
/**
* ICU "poor man's RTTI", returns a UClassID for this class.
@@ -229,4 +232,6 @@ ParsePosition::setErrorIndex(int32_t ei)
}
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/platform.h b/Build/source/libs/icu/icu-src/source/common/unicode/platform.h
index a3623f5da6a..ad75b298a42 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/platform.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/platform.h
@@ -135,6 +135,14 @@
/** Fuchsia is a POSIX-ish platform. @internal */
#define U_PF_FUCHSIA 4100
/* Maximum value for Linux-based platform is 4499 */
+/**
+ * Emscripten is a C++ transpiler for the Web that can target asm.js or
+ * WebAssembly. It provides some POSIX-compatible wrappers and stubs and
+ * some Linux-like functionality, but is not fully compatible with
+ * either.
+ * @internal
+ */
+#define U_PF_EMSCRIPTEN 5010
/** z/OS is the successor to OS/390 which was the successor to MVS. @internal */
#define U_PF_OS390 9000
/** "IBM i" is the current name of what used to be i5/OS and earlier OS/400. @internal */
@@ -192,6 +200,8 @@
# define U_PLATFORM U_PF_OS390
#elif defined(__OS400__) || defined(__TOS_OS400__)
# define U_PLATFORM U_PF_OS400
+#elif defined(__EMSCRIPTEN__)
+# define U_PLATFORM U_PF_EMSCRIPTEN
#else
# define U_PLATFORM U_PF_UNKNOWN
#endif
@@ -414,26 +424,40 @@
#endif
/* Compatibility with compilers other than clang: http://clang.llvm.org/docs/LanguageExtensions.html */
-#ifndef __has_attribute
-# define __has_attribute(x) 0
+#ifdef __has_attribute
+# define UPRV_HAS_ATTRIBUTE(x) __has_attribute(x)
+#else
+# define UPRV_HAS_ATTRIBUTE(x) 0
#endif
-#ifndef __has_cpp_attribute
-# define __has_cpp_attribute(x) 0
+#ifdef __has_cpp_attribute
+# define UPRV_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
+#else
+# define UPRV_HAS_CPP_ATTRIBUTE(x) 0
#endif
-#ifndef __has_declspec_attribute
-# define __has_declspec_attribute(x) 0
+#ifdef __has_declspec_attribute
+# define UPRV_HAS_DECLSPEC_ATTRIBUTE(x) __has_declspec_attribute(x)
+#else
+# define UPRV_HAS_DECLSPEC_ATTRIBUTE(x) 0
#endif
-#ifndef __has_builtin
-# define __has_builtin(x) 0
+#ifdef __has_builtin
+# define UPRV_HAS_BUILTIN(x) __has_builtin(x)
+#else
+# define UPRV_HAS_BUILTIN(x) 0
#endif
-#ifndef __has_feature
-# define __has_feature(x) 0
+#ifdef __has_feature
+# define UPRV_HAS_FEATURE(x) __has_feature(x)
+#else
+# define UPRV_HAS_FEATURE(x) 0
#endif
-#ifndef __has_extension
-# define __has_extension(x) 0
+#ifdef __has_extension
+# define UPRV_HAS_EXTENSION(x) __has_extension(x)
+#else
+# define UPRV_HAS_EXTENSION(x) 0
#endif
-#ifndef __has_warning
-# define __has_warning(x) 0
+#ifdef __has_warning
+# define UPRV_HAS_WARNING(x) __has_warning(x)
+#else
+# define UPRV_HAS_WARNING(x) 0
#endif
/**
@@ -452,7 +476,9 @@
* Attribute to specify the size of the allocated buffer for malloc-like functions
* @internal
*/
-#if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) || __has_attribute(alloc_size)
+#if (defined(__GNUC__) && \
+ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) || \
+ UPRV_HAS_ATTRIBUTE(alloc_size)
# define U_ALLOC_SIZE_ATTR(X) __attribute__ ((alloc_size(X)))
# define U_ALLOC_SIZE_ATTR2(X,Y) __attribute__ ((alloc_size(X,Y)))
#else
@@ -516,8 +542,9 @@ namespace std {
#elif defined(__clang__)
// Test for compiler vs. feature separately.
// Other compilers might choke on the feature test.
-# if __has_cpp_attribute(clang::fallthrough) || \
- (__has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough"))
+# if UPRV_HAS_CPP_ATTRIBUTE(clang::fallthrough) || \
+ (UPRV_HAS_FEATURE(cxx_attributes) && \
+ UPRV_HAS_WARNING("-Wimplicit-fallthrough"))
# define U_FALLTHROUGH [[clang::fallthrough]]
# endif
#elif defined(__GNUC__) && (__GNUC__ >= 7)
@@ -620,7 +647,8 @@ namespace std {
*/
#ifdef U_CHARSET_IS_UTF8
/* Use the predefined value. */
-#elif U_PLATFORM_IS_LINUX_BASED || U_PLATFORM_IS_DARWIN_BASED
+#elif U_PLATFORM_IS_LINUX_BASED || U_PLATFORM_IS_DARWIN_BASED || \
+ U_PLATFORM == U_PF_EMSCRIPTEN
# define U_CHARSET_IS_UTF8 1
#else
# define U_CHARSET_IS_UTF8 0
@@ -707,7 +735,7 @@ namespace std {
* narrow-character strings are in EBCDIC.
*/
# define U_SIZEOF_WCHAR_T 2
-#else
+# else
/*
* LOCALETYPE(*CLD) or LOCALETYPE(*LOCALE) is specified.
* Wide-character strings are in 16-bit EBCDIC,
@@ -786,7 +814,8 @@ namespace std {
/* Use the predefined value. */
#elif defined(U_STATIC_IMPLEMENTATION)
# define U_EXPORT
-#elif defined(_MSC_VER) || (__has_declspec_attribute(dllexport) && __has_declspec_attribute(dllimport))
+#elif defined(_MSC_VER) || (UPRV_HAS_DECLSPEC_ATTRIBUTE(dllexport) && \
+ UPRV_HAS_DECLSPEC_ATTRIBUTE(dllimport))
# define U_EXPORT __declspec(dllexport)
#elif defined(__GNUC__)
# define U_EXPORT __attribute__((visibility("default")))
@@ -810,7 +839,8 @@ namespace std {
#ifdef U_IMPORT
/* Use the predefined value. */
-#elif defined(_MSC_VER) || (__has_declspec_attribute(dllexport) && __has_declspec_attribute(dllimport))
+#elif defined(_MSC_VER) || (UPRV_HAS_DECLSPEC_ATTRIBUTE(dllexport) && \
+ UPRV_HAS_DECLSPEC_ATTRIBUTE(dllimport))
/* Windows needs to export/import data. */
# define U_IMPORT __declspec(dllimport)
#else
@@ -852,4 +882,4 @@ namespace std {
#endif
/* @} */
-#endif
+#endif // _PLATFORM_H
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/rbbi.h b/Build/source/libs/icu/icu-src/source/common/unicode/rbbi.h
index 47abd554eaf..7825f603a51 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/rbbi.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/rbbi.h
@@ -18,6 +18,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Rule Based Break Iterator
@@ -107,7 +109,7 @@ private:
*
* If present, the special LanguageBreakEngine used for handling
* characters that are in the dictionary set, but not handled by any
- * LangugageBreakEngine.
+ * LanguageBreakEngine.
* @internal (private)
*/
UnhandledEngine *fUnhandledBreakEngine;
@@ -260,7 +262,7 @@ public:
* @return TRUE if both BreakIterators are not same.
* @stable ICU 2.0
*/
- UBool operator!=(const BreakIterator& that) const;
+ inline UBool operator!=(const BreakIterator& that) const;
/**
* Returns a newly-constructed RuleBasedBreakIterator with the same
@@ -272,7 +274,7 @@ public:
* @return a newly-constructed RuleBasedBreakIterator
* @stable ICU 2.0
*/
- virtual BreakIterator* clone() const;
+ virtual RuleBasedBreakIterator* clone() const;
/**
* Compute a hash code for this BreakIterator
@@ -536,6 +538,7 @@ public:
*/
static UClassID U_EXPORT2 getStaticClassID(void);
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Deprecated functionality. Use clone() instead.
*
@@ -562,10 +565,10 @@ public:
* or if the stackBuffer was too small to hold the clone.
* @deprecated ICU 52. Use clone() instead.
*/
- virtual BreakIterator * createBufferClone(void *stackBuffer,
- int32_t &BufferSize,
- UErrorCode &status);
-
+ virtual RuleBasedBreakIterator *createBufferClone(void *stackBuffer,
+ int32_t &BufferSize,
+ UErrorCode &status);
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Return the binary form of compiled break rules,
@@ -696,4 +699,6 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/rep.h b/Build/source/libs/icu/icu-src/source/common/unicode/rep.h
index 41fdc040497..6dd4530647e 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/rep.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/rep.h
@@ -16,6 +16,10 @@
#ifndef REP_H
#define REP_H
+#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/uobject.h"
/**
@@ -189,9 +193,6 @@ public:
* Clones can be used concurrently in multiple threads.
* If a subclass does not implement clone(), or if an error occurs,
* then NULL is returned.
- * The clone functions in all subclasses return a pointer to a Replaceable
- * because some compilers do not support covariant (same-as-this)
- * return types; cast to the appropriate subclass if necessary.
* The caller must delete the clone.
*
* @return a clone of this object
@@ -260,4 +261,6 @@ Replaceable::char32At(int32_t offset) const {
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/resbund.h b/Build/source/libs/icu/icu-src/source/common/unicode/resbund.h
index ad5899003b3..28940675287 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/resbund.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/resbund.h
@@ -49,6 +49,9 @@
#define RESBUND_H
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/uobject.h"
#include "unicode/ures.h"
#include "unicode/unistr.h"
@@ -489,4 +492,7 @@ private:
};
U_NAMESPACE_END
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/schriter.h b/Build/source/libs/icu/icu-src/source/common/unicode/schriter.h
index 42f02691e12..1ca5b70fca5 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/schriter.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/schriter.h
@@ -21,6 +21,9 @@
#define SCHRITER_H
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/chariter.h"
#include "unicode/uchriter.h"
@@ -130,7 +133,7 @@ public:
* @return the newly cloned object.
* @stable ICU 2.0
*/
- virtual CharacterIterator* clone(void) const;
+ virtual StringCharacterIterator* clone() const;
/**
* Sets the iterator to iterate over the provided string.
@@ -186,4 +189,7 @@ protected:
};
U_NAMESPACE_END
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/simpleformatter.h b/Build/source/libs/icu/icu-src/source/common/unicode/simpleformatter.h
index 850949caaf5..9414bca3085 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/simpleformatter.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/simpleformatter.h
@@ -17,6 +17,9 @@
*/
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/unistr.h"
U_NAMESPACE_BEGIN
@@ -265,8 +268,37 @@ public:
* @stable ICU 57
*/
UnicodeString getTextWithNoArguments() const {
- return getTextWithNoArguments(compiledPattern.getBuffer(), compiledPattern.length());
+ return getTextWithNoArguments(
+ compiledPattern.getBuffer(),
+ compiledPattern.length(),
+ nullptr,
+ 0);
+ }
+
+#ifndef U_HIDE_INTERNAL_API
+ /**
+ * Returns the pattern text with none of the arguments.
+ * Like formatting with all-empty string values.
+ *
+ * TODO(ICU-20406): Replace this with an Iterator interface.
+ *
+ * @param offsets offsets[i] receives the offset of where {i} was located
+ * before it was replaced by an empty string.
+ * For example, "a{0}b{1}" produces offset 1 for i=0 and 2 for i=1.
+ * Can be nullptr if offsetsLength==0.
+ * If there is no {i} in the pattern, then offsets[i] is set to -1.
+ * @param offsetsLength The length of the offsets array.
+ *
+ * @internal
+ */
+ UnicodeString getTextWithNoArguments(int32_t *offsets, int32_t offsetsLength) const {
+ return getTextWithNoArguments(
+ compiledPattern.getBuffer(),
+ compiledPattern.length(),
+ offsets,
+ offsetsLength);
}
+#endif // U_HIDE_INTERNAL_API
private:
/**
@@ -285,7 +317,11 @@ private:
return compiledPatternLength == 0 ? 0 : compiledPattern[0];
}
- static UnicodeString getTextWithNoArguments(const char16_t *compiledPattern, int32_t compiledPatternLength);
+ static UnicodeString getTextWithNoArguments(
+ const char16_t *compiledPattern,
+ int32_t compiledPatternLength,
+ int32_t *offsets,
+ int32_t offsetsLength);
static UnicodeString &format(
const char16_t *compiledPattern, int32_t compiledPatternLength,
@@ -300,4 +336,6 @@ private:
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __SIMPLEFORMATTER_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/std_string.h b/Build/source/libs/icu/icu-src/source/common/unicode/std_string.h
index 729c5639950..bf87230167e 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/std_string.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/std_string.h
@@ -27,6 +27,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
// Workaround for a libstdc++ bug before libstdc++4.6 (2011).
// https://bugs.llvm.org/show_bug.cgi?id=13364
#if defined(__GLIBCXX__)
@@ -34,4 +36,6 @@ namespace std { class type_info; }
#endif
#include <string>
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __STD_STRING_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/strenum.h b/Build/source/libs/icu/icu-src/source/common/unicode/strenum.h
index 61d514813b9..8601f1f7c40 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/strenum.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/strenum.h
@@ -12,6 +12,10 @@
#ifndef STRENUM_H
#define STRENUM_H
+#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/uobject.h"
#include "unicode/unistr.h"
@@ -67,9 +71,6 @@ public:
* Clones can be used concurrently in multiple threads.
* If a subclass does not implement clone(), or if an error occurs,
* then NULL is returned.
- * The clone functions in all subclasses return a base class pointer
- * because some compilers do not support covariant (same-as-this)
- * return types; cast to the appropriate subclass if necessary.
* The caller must delete the clone.
*
* @return a clone of this object
@@ -274,5 +275,7 @@ protected:
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
/* STRENUM_H */
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/stringpiece.h b/Build/source/libs/icu/icu-src/source/common/unicode/stringpiece.h
index b0887effa52..f581091f872 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/stringpiece.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/stringpiece.h
@@ -28,6 +28,12 @@
*/
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
+#include <cstddef>
+#include <type_traits>
+
#include "unicode/uobject.h"
#include "unicode/std_string.h"
@@ -74,6 +80,33 @@ class U_COMMON_API StringPiece : public UMemory {
*/
StringPiece(const std::string& str)
: ptr_(str.data()), length_(static_cast<int32_t>(str.size())) { }
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Constructs from some other implementation of a string piece class, from any
+ * C++ record type that has these two methods:
+ *
+ * \code{.cpp}
+ *
+ * struct OtherStringPieceClass {
+ * const char* data();
+ * size_t size();
+ * };
+ *
+ * \endcode
+ *
+ * The other string piece class will typically be std::string_view from C++17
+ * or absl::string_view from Abseil.
+ *
+ * @param str the other string piece
+ * @draft ICU 65
+ */
+ template <typename T,
+ typename = typename std::enable_if<
+ std::is_same<decltype(T().data()), const char*>::value &&
+ std::is_same<decltype(T().size()), size_t>::value>::type>
+ StringPiece(T str)
+ : ptr_(str.data()), length_(static_cast<int32_t>(str.size())) {}
+#endif // U_HIDE_DRAFT_API
/**
* Constructs from a const char * pointer and a specified length.
* @param offset a const char * pointer (need not be terminated)
@@ -221,4 +254,6 @@ inline UBool operator!=(const StringPiece& x, const StringPiece& y) {
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __STRINGPIECE_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/stringtriebuilder.h b/Build/source/libs/icu/icu-src/source/common/unicode/stringtriebuilder.h
index fe99fdb41fd..2c47dd415b1 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/stringtriebuilder.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/stringtriebuilder.h
@@ -18,6 +18,9 @@
#define __STRINGTRIEBUILDER_H__
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/uobject.h"
/**
@@ -418,4 +421,6 @@ protected:
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __STRINGTRIEBUILDER_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/symtable.h b/Build/source/libs/icu/icu-src/source/common/unicode/symtable.h
index 35e5f238a70..b64d877f974 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/symtable.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/symtable.h
@@ -13,6 +13,9 @@
#define SYMTABLE_H
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/uobject.h"
/**
@@ -111,4 +114,6 @@ public:
};
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uchar.h b/Build/source/libs/icu/icu-src/source/common/unicode/uchar.h
index 9e180db53b6..1b7ee099be7 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/uchar.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/uchar.h
@@ -60,7 +60,7 @@ U_CDECL_BEGIN
* @see u_getUnicodeVersion
* @stable ICU 2.0
*/
-#define U_UNICODE_VERSION "11.0"
+#define U_UNICODE_VERSION "12.1"
/**
* \file
@@ -1767,6 +1767,27 @@ enum UBlockCode {
/** @stable ICU 62 */
UBLOCK_SOGDIAN = 291, /*[10F30]*/
+ // New blocks in Unicode 12.0
+
+ /** @stable ICU 64 */
+ UBLOCK_EGYPTIAN_HIEROGLYPH_FORMAT_CONTROLS = 292, /*[13430]*/
+ /** @stable ICU 64 */
+ UBLOCK_ELYMAIC = 293, /*[10FE0]*/
+ /** @stable ICU 64 */
+ UBLOCK_NANDINAGARI = 294, /*[119A0]*/
+ /** @stable ICU 64 */
+ UBLOCK_NYIAKENG_PUACHUE_HMONG = 295, /*[1E100]*/
+ /** @stable ICU 64 */
+ UBLOCK_OTTOMAN_SIYAQ_NUMBERS = 296, /*[1ED00]*/
+ /** @stable ICU 64 */
+ UBLOCK_SMALL_KANA_EXTENSION = 297, /*[1B130]*/
+ /** @stable ICU 64 */
+ UBLOCK_SYMBOLS_AND_PICTOGRAPHS_EXTENDED_A = 298, /*[1FA70]*/
+ /** @stable ICU 64 */
+ UBLOCK_TAMIL_SUPPLEMENT = 299, /*[11FC0]*/
+ /** @stable ICU 64 */
+ UBLOCK_WANCHO = 300, /*[1E2C0]*/
+
#ifndef U_HIDE_DEPRECATED_API
/**
* One more than the highest normal UBlockCode value.
@@ -1774,7 +1795,7 @@ enum UBlockCode {
*
* @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
*/
- UBLOCK_COUNT = 292,
+ UBLOCK_COUNT = 301,
#endif // U_HIDE_DEPRECATED_API
/** @stable ICU 2.0 */
@@ -2557,8 +2578,6 @@ typedef enum UVerticalOrientation {
U_STABLE UBool U_EXPORT2
u_hasBinaryProperty(UChar32 c, UProperty which);
-#ifndef U_HIDE_DRAFT_API
-
/**
* Returns a frozen USet for a binary property.
* The library retains ownership over the returned object.
@@ -2572,13 +2591,11 @@ u_hasBinaryProperty(UChar32 c, UProperty which);
* @see UProperty
* @see u_hasBinaryProperty
* @see Unicode::fromUSet
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI const USet * U_EXPORT2
u_getBinaryPropertySet(UProperty property, UErrorCode *pErrorCode);
-#endif // U_HIDE_DRAFT_API
-
/**
* Check if a code point has the Alphabetic Unicode property.
* Same as u_hasBinaryProperty(c, UCHAR_ALPHABETIC).
@@ -2736,8 +2753,6 @@ u_getIntPropertyMinValue(UProperty which);
U_STABLE int32_t U_EXPORT2
u_getIntPropertyMaxValue(UProperty which);
-#ifndef U_HIDE_DRAFT_API
-
/**
* Returns an immutable UCPMap for an enumerated/catalog/int-valued property.
* The library retains ownership over the returned object.
@@ -2751,13 +2766,11 @@ u_getIntPropertyMaxValue(UProperty which);
* @return the property as a map
* @see UProperty
* @see u_getIntPropertyValue
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI const UCPMap * U_EXPORT2
u_getIntPropertyMap(UProperty property, UErrorCode *pErrorCode);
-#endif // U_HIDE_DRAFT_API
-
/**
* Get the numeric value for a Unicode code point as defined in the
* Unicode Character Database.
@@ -3176,15 +3189,14 @@ U_STABLE UBool U_EXPORT2
u_isprint(UChar32 c);
/**
- * Determines whether the specified code point is a base character.
+ * Non-standard: Determines whether the specified code point is a base character.
* True for general categories "L" (letters), "N" (numbers),
* "Mc" (spacing combining marks), and "Me" (enclosing marks).
*
- * Note that this is different from the Unicode definition in
- * chapter 3.5, conformance clause D13,
- * which defines base characters to be all characters (not Cn)
- * that do not graphically combine with preceding characters (M)
- * and that are neither control (Cc) or format (Cf) characters.
+ * Note that this is different from the Unicode Standard definition in
+ * chapter 3.6, conformance clause D51 “Base character”,
+ * which defines base characters as the code points with general categories
+ * Letter (L), Number (N), Punctuation (P), Symbol (S), or Space Separator (Zs).
*
* @param c the code point to be tested
* @return TRUE if the code point is a base character according to this function
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ucharstrie.h b/Build/source/libs/icu/icu-src/source/common/unicode/ucharstrie.h
index dfc93f6d0ba..d5729d944ee 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/ucharstrie.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/ucharstrie.h
@@ -24,6 +24,9 @@
*/
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/unistr.h"
#include "unicode/uobject.h"
#include "unicode/ustringtrie.h"
@@ -94,6 +97,41 @@ public:
return *this;
}
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns the state of this trie as a 64-bit integer.
+ * The state value is never 0.
+ *
+ * @return opaque state value
+ * @see resetToState64
+ * @draft ICU 65
+ */
+ uint64_t getState64() const {
+ return (static_cast<uint64_t>(remainingMatchLength_ + 2) << kState64RemainingShift) |
+ (uint64_t)(pos_ - uchars_);
+ }
+
+ /**
+ * Resets this trie to the saved state.
+ * Unlike resetToState(State), the 64-bit state value
+ * must be from getState64() from the same trie object or
+ * from one initialized the exact same way.
+ * Because of no validation, this method is faster.
+ *
+ * @param state The opaque trie state value from getState64().
+ * @return *this
+ * @see getState64
+ * @see resetToState
+ * @see reset
+ * @draft ICU 65
+ */
+ UCharsTrie &resetToState64(uint64_t state) {
+ remainingMatchLength_ = static_cast<int32_t>(state >> kState64RemainingShift) - 2;
+ pos_ = uchars_ + (state & kState64PosMask);
+ return *this;
+ }
+#endif /* U_HIDE_DRAFT_API */
+
/**
* UCharsTrie state object, for saving a trie's current state
* and resetting the trie back to this state later.
@@ -560,6 +598,13 @@ private:
static const int32_t kMaxTwoUnitDelta=((kThreeUnitDeltaLead-kMinTwoUnitDeltaLead)<<16)-1; // 0x03feffff
+ // For getState64():
+ // The remainingMatchLength_ is -1..14=(kMaxLinearMatchLength=0x10)-2
+ // so we need at least 5 bits for that.
+ // We add 2 to store it as a positive value 1..16=kMaxLinearMatchLength.
+ static constexpr int32_t kState64RemainingShift = 59;
+ static constexpr uint64_t kState64PosMask = (UINT64_C(1) << kState64RemainingShift) - 1;
+
char16_t *ownedArray_;
// Fixed value referencing the UCharsTrie words.
@@ -575,4 +620,6 @@ private:
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __UCHARSTRIE_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ucharstriebuilder.h b/Build/source/libs/icu/icu-src/source/common/unicode/ucharstriebuilder.h
index 2aa4757e52c..540dcc047fd 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/ucharstriebuilder.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/ucharstriebuilder.h
@@ -18,6 +18,9 @@
#define __UCHARSTRIEBUILDER_H__
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/stringtriebuilder.h"
#include "unicode/ucharstrie.h"
#include "unicode/unistr.h"
@@ -184,4 +187,6 @@ private:
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __UCHARSTRIEBUILDER_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uchriter.h b/Build/source/libs/icu/icu-src/source/common/unicode/uchriter.h
index efcd263f8bc..a485259b808 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/uchriter.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/uchriter.h
@@ -11,6 +11,9 @@
#define UCHRITER_H
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/chariter.h"
/**
@@ -132,7 +135,7 @@ public:
* @return the CharacterIterator newly created
* @stable ICU 2.0
*/
- virtual CharacterIterator* clone(void) const;
+ virtual UCharCharacterIterator* clone() const;
/**
* Sets the iterator to refer to the first code unit in its
@@ -384,4 +387,7 @@ protected:
};
U_NAMESPACE_END
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uconfig.h b/Build/source/libs/icu/icu-src/source/common/unicode/uconfig.h
index 857ed561357..bbc232d1ed8 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/uconfig.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/uconfig.h
@@ -369,6 +369,18 @@
# define UCONFIG_MSGPAT_DEFAULT_APOSTROPHE_MODE UMSGPAT_APOS_DOUBLE_OPTIONAL
#endif
+/**
+ * \def UCONFIG_USE_WINDOWS_LCID_MAPPING_API
+ * On platforms where U_PLATFORM_HAS_WIN32_API is true, this switch determines
+ * if the Windows platform APIs are used for LCID<->Locale Name conversions.
+ * Otherwise, only the built-in ICU tables are used.
+ *
+ * @internal ICU 64
+ */
+#ifndef UCONFIG_USE_WINDOWS_LCID_MAPPING_API
+# define UCONFIG_USE_WINDOWS_LCID_MAPPING_API 1
+#endif
+
/* i18n library switches ---------------------------------------------------- */
/**
@@ -441,4 +453,4 @@
# define UCONFIG_NO_FILTERED_BREAK_ITERATION 0
#endif
-#endif
+#endif // __UCONFIG_H__
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ucpmap.h b/Build/source/libs/icu/icu-src/source/common/unicode/ucpmap.h
index f2c42b6b7f4..31e1365cac8 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/ucpmap.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/ucpmap.h
@@ -9,8 +9,6 @@
#include "unicode/utypes.h"
-#ifndef U_HIDE_DRAFT_API
-
U_CDECL_BEGIN
/**
@@ -28,7 +26,7 @@ U_CDECL_BEGIN
*
* @see UCPTrie
* @see UMutableCPTrie
- * @draft ICU 63
+ * @stable ICU 63
*/
typedef struct UCPMap UCPMap;
@@ -39,13 +37,13 @@ typedef struct UCPMap UCPMap;
* @see ucpmap_getRange
* @see ucptrie_getRange
* @see umutablecptrie_getRange
- * @draft ICU 63
+ * @stable ICU 63
*/
enum UCPMapRangeOption {
/**
* ucpmap_getRange() enumerates all same-value ranges as stored in the map.
* Most users should use this option.
- * @draft ICU 63
+ * @stable ICU 63
*/
UCPMAP_RANGE_NORMAL,
/**
@@ -61,7 +59,7 @@ enum UCPMapRangeOption {
* special values optimized for UTF-16 string processing
* or for special error behavior for unpaired surrogates,
* but those values are not to be associated with the lead surrogate code *points*.
- * @draft ICU 63
+ * @stable ICU 63
*/
UCPMAP_RANGE_FIXED_LEAD_SURROGATES,
/**
@@ -77,7 +75,7 @@ enum UCPMapRangeOption {
* special values optimized for UTF-16 string processing
* or for special error behavior for unpaired surrogates,
* but those values are not to be associated with the lead surrogate code *points*.
- * @draft ICU 63
+ * @stable ICU 63
*/
UCPMAP_RANGE_FIXED_ALL_SURROGATES
};
@@ -93,7 +91,7 @@ typedef enum UCPMapRangeOption UCPMapRangeOption;
* @param c the code point
* @return the map value,
* or an implementation-defined error value if the code point is not in the range 0..U+10FFFF
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI uint32_t U_EXPORT2
ucpmap_get(const UCPMap *map, UChar32 c);
@@ -110,7 +108,7 @@ ucpmap_get(const UCPMap *map, UChar32 c);
* @param context an opaque pointer, as passed into the getRange function
* @param value a value from the map
* @return the modified value
- * @draft ICU 63
+ * @stable ICU 63
*/
typedef uint32_t U_CALLCONV
UCPMapValueFilter(const void *context, uint32_t value);
@@ -149,7 +147,7 @@ UCPMapValueFilter(const void *context, uint32_t value);
* may have been modified by filter(context, map value)
* if that function pointer is not NULL
* @return the range end code point, or -1 if start is not a valid code point
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI UChar32 U_EXPORT2
ucpmap_getRange(const UCPMap *map, UChar32 start,
@@ -158,5 +156,4 @@ ucpmap_getRange(const UCPMap *map, UChar32 start,
U_CDECL_END
-#endif // U_HIDE_DRAFT_API
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ucptrie.h b/Build/source/libs/icu/icu-src/source/common/unicode/ucptrie.h
index 2718c984e43..be06a227928 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/ucptrie.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/ucptrie.h
@@ -9,8 +9,6 @@
#include "unicode/utypes.h"
-#ifndef U_HIDE_DRAFT_API
-
#include "unicode/localpointer.h"
#include "unicode/ucpmap.h"
#include "unicode/utf8.h"
@@ -55,7 +53,7 @@ typedef union UCPTrieData {
* The macros will return bogus values, or may crash, if used on the wrong type or value width.
*
* @see UMutableCPTrie
- * @draft ICU 63
+ * @stable ICU 63
*/
struct UCPTrie {
#ifndef U_IN_DOXYGEN
@@ -115,23 +113,23 @@ typedef struct UCPTrie UCPTrie;
* @see umutablecptrie_buildImmutable
* @see ucptrie_openFromBinary
* @see ucptrie_getType
- * @draft ICU 63
+ * @stable ICU 63
*/
enum UCPTrieType {
/**
* For ucptrie_openFromBinary() to accept any type.
* ucptrie_getType() will return the actual type.
- * @draft ICU 63
+ * @stable ICU 63
*/
UCPTRIE_TYPE_ANY = -1,
/**
* Fast/simple/larger BMP data structure. Use functions and "fast" macros.
- * @draft ICU 63
+ * @stable ICU 63
*/
UCPTRIE_TYPE_FAST,
/**
* Small/slower BMP data structure. Use functions and "small" macros.
- * @draft ICU 63
+ * @stable ICU 63
*/
UCPTRIE_TYPE_SMALL
};
@@ -145,30 +143,30 @@ typedef enum UCPTrieType UCPTrieType;
* @see umutablecptrie_buildImmutable
* @see ucptrie_openFromBinary
* @see ucptrie_getValueWidth
- * @draft ICU 63
+ * @stable ICU 63
*/
enum UCPTrieValueWidth {
/**
* For ucptrie_openFromBinary() to accept any data value width.
* ucptrie_getValueWidth() will return the actual data value width.
- * @draft ICU 63
+ * @stable ICU 63
*/
UCPTRIE_VALUE_BITS_ANY = -1,
/**
* The trie stores 16 bits per data value.
* It returns them as unsigned values 0..0xffff=65535.
- * @draft ICU 63
+ * @stable ICU 63
*/
UCPTRIE_VALUE_BITS_16,
/**
* The trie stores 32 bits per data value.
- * @draft ICU 63
+ * @stable ICU 63
*/
UCPTRIE_VALUE_BITS_32,
/**
* The trie stores 8 bits per data value.
* It returns them as unsigned values 0..0xff=255.
- * @draft ICU 63
+ * @stable ICU 63
*/
UCPTRIE_VALUE_BITS_8
};
@@ -200,7 +198,7 @@ typedef enum UCPTrieValueWidth UCPTrieValueWidth;
* @see umutablecptrie_open
* @see umutablecptrie_buildImmutable
* @see ucptrie_toBinary
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI UCPTrie * U_EXPORT2
ucptrie_openFromBinary(UCPTrieType type, UCPTrieValueWidth valueWidth,
@@ -211,30 +209,11 @@ ucptrie_openFromBinary(UCPTrieType type, UCPTrieValueWidth valueWidth,
* Closes a trie and releases associated memory.
*
* @param trie the trie
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI void U_EXPORT2
ucptrie_close(UCPTrie *trie);
-#if U_SHOW_CPLUSPLUS_API
-
-U_NAMESPACE_BEGIN
-
-/**
- * \class LocalUCPTriePointer
- * "Smart pointer" class, closes a UCPTrie via ucptrie_close().
- * For most methods see the LocalPointerBase base class.
- *
- * @see LocalPointerBase
- * @see LocalPointer
- * @draft ICU 63
- */
-U_DEFINE_LOCAL_OPEN_POINTER(LocalUCPTriePointer, UCPTrie, ucptrie_close);
-
-U_NAMESPACE_END
-
-#endif
-
/**
* Returns the trie type.
*
@@ -242,7 +221,7 @@ U_NAMESPACE_END
* @return the trie type
* @see ucptrie_openFromBinary
* @see UCPTRIE_TYPE_ANY
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI UCPTrieType U_EXPORT2
ucptrie_getType(const UCPTrie *trie);
@@ -254,7 +233,7 @@ ucptrie_getType(const UCPTrie *trie);
* @return the number of bits in a trie data value
* @see ucptrie_openFromBinary
* @see UCPTRIE_VALUE_BITS_ANY
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI UCPTrieValueWidth U_EXPORT2
ucptrie_getValueWidth(const UCPTrie *trie);
@@ -271,7 +250,7 @@ ucptrie_getValueWidth(const UCPTrie *trie);
* @param c the code point
* @return the trie value,
* or the trie error value if the code point is not in the range 0..U+10FFFF
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI uint32_t U_EXPORT2
ucptrie_get(const UCPTrie *trie, UChar32 c);
@@ -310,7 +289,7 @@ ucptrie_get(const UCPTrie *trie, UChar32 c);
* may have been modified by filter(context, trie value)
* if that function pointer is not NULL
* @return the range end code point, or -1 if start is not a valid code point
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI UChar32 U_EXPORT2
ucptrie_getRange(const UCPTrie *trie, UChar32 start,
@@ -330,7 +309,7 @@ ucptrie_getRange(const UCPTrie *trie, UChar32 start,
* @return the number of bytes written or (if buffer overflow) needed for the trie
*
* @see ucptrie_openFromBinary()
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI int32_t U_EXPORT2
ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *pErrorCode);
@@ -341,7 +320,7 @@ ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *
* Do not use this macro in any other way.
*
* @see UCPTRIE_VALUE_BITS_16
- * @draft ICU 63
+ * @stable ICU 63
*/
#define UCPTRIE_16(trie, i) ((trie)->data.ptr16[i])
@@ -351,7 +330,7 @@ ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *
* Do not use this macro in any other way.
*
* @see UCPTRIE_VALUE_BITS_32
- * @draft ICU 63
+ * @stable ICU 63
*/
#define UCPTRIE_32(trie, i) ((trie)->data.ptr32[i])
@@ -361,7 +340,7 @@ ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *
* Do not use this macro in any other way.
*
* @see UCPTRIE_VALUE_BITS_8
- * @draft ICU 63
+ * @stable ICU 63
*/
#define UCPTRIE_8(trie, i) ((trie)->data.ptr8[i])
@@ -373,7 +352,7 @@ ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *
* @param dataAccess UCPTRIE_16, UCPTRIE_32, or UCPTRIE_8 according to the trie’s value width
* @param c (UChar32, in) the input code point
* @return The code point's trie value.
- * @draft ICU 63
+ * @stable ICU 63
*/
#define UCPTRIE_FAST_GET(trie, dataAccess, c) dataAccess(trie, _UCPTRIE_CP_INDEX(trie, 0xffff, c))
@@ -385,7 +364,7 @@ ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *
* @param dataAccess UCPTRIE_16, UCPTRIE_32, or UCPTRIE_8 according to the trie’s value width
* @param c (UChar32, in) the input code point
* @return The code point's trie value.
- * @draft ICU 63
+ * @stable ICU 63
*/
#define UCPTRIE_SMALL_GET(trie, dataAccess, c) \
dataAccess(trie, _UCPTRIE_CP_INDEX(trie, UCPTRIE_SMALL_MAX, c))
@@ -401,9 +380,9 @@ ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *
* @param limit (const UChar *, in) the limit pointer for the text, or NULL if NUL-terminated
* @param c (UChar32, out) variable for the code point
* @param result (out) variable for the trie lookup result
- * @draft ICU 63
+ * @stable ICU 63
*/
-#define UCPTRIE_FAST_U16_NEXT(trie, dataAccess, src, limit, c, result) { \
+#define UCPTRIE_FAST_U16_NEXT(trie, dataAccess, src, limit, c, result) UPRV_BLOCK_MACRO_BEGIN { \
(c) = *(src)++; \
int32_t __index; \
if (!U16_IS_SURROGATE(c)) { \
@@ -419,7 +398,7 @@ ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *
} \
} \
(result) = dataAccess(trie, __index); \
-}
+} UPRV_BLOCK_MACRO_END
/**
* UTF-16: Reads the previous code point (UChar32 c, out), pre-decrements src,
@@ -432,9 +411,9 @@ ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *
* @param src (const UChar *, in/out) the source text pointer
* @param c (UChar32, out) variable for the code point
* @param result (out) variable for the trie lookup result
- * @draft ICU 63
+ * @stable ICU 63
*/
-#define UCPTRIE_FAST_U16_PREV(trie, dataAccess, start, src, c, result) { \
+#define UCPTRIE_FAST_U16_PREV(trie, dataAccess, start, src, c, result) UPRV_BLOCK_MACRO_BEGIN { \
(c) = *--(src); \
int32_t __index; \
if (!U16_IS_SURROGATE(c)) { \
@@ -450,7 +429,7 @@ ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *
} \
} \
(result) = dataAccess(trie, __index); \
-}
+} UPRV_BLOCK_MACRO_END
/**
* UTF-8: Post-increments src and gets a value from the trie.
@@ -466,9 +445,9 @@ ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *
* @param src (const char *, in/out) the source text pointer
* @param limit (const char *, in) the limit pointer for the text (must not be NULL)
* @param result (out) variable for the trie lookup result
- * @draft ICU 63
+ * @stable ICU 63
*/
-#define UCPTRIE_FAST_U8_NEXT(trie, dataAccess, src, limit, result) { \
+#define UCPTRIE_FAST_U8_NEXT(trie, dataAccess, src, limit, result) UPRV_BLOCK_MACRO_BEGIN { \
int32_t __lead = (uint8_t)*(src)++; \
if (!U8_IS_SINGLE(__lead)) { \
uint8_t __t1, __t2, __t3; \
@@ -496,7 +475,7 @@ ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *
} \
} \
(result) = dataAccess(trie, __lead); \
-}
+} UPRV_BLOCK_MACRO_END
/**
* UTF-8: Pre-decrements src and gets a value from the trie.
@@ -512,9 +491,9 @@ ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *
* @param start (const char *, in) the start pointer for the text
* @param src (const char *, in/out) the source text pointer
* @param result (out) variable for the trie lookup result
- * @draft ICU 63
+ * @stable ICU 63
*/
-#define UCPTRIE_FAST_U8_PREV(trie, dataAccess, start, src, result) { \
+#define UCPTRIE_FAST_U8_PREV(trie, dataAccess, start, src, result) UPRV_BLOCK_MACRO_BEGIN { \
int32_t __index = (uint8_t)*--(src); \
if (!U8_IS_SINGLE(__index)) { \
__index = ucptrie_internalU8PrevIndex((trie), __index, (const uint8_t *)(start), \
@@ -523,7 +502,7 @@ ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *
__index >>= 3; \
} \
(result) = dataAccess(trie, __index); \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Returns a trie value for an ASCII code point, without range checking.
@@ -532,7 +511,7 @@ ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *
* @param dataAccess UCPTRIE_16, UCPTRIE_32, or UCPTRIE_8 according to the trie’s value width
* @param c (UChar32, in) the input code point; must be U+0000..U+007F
* @return The ASCII code point's trie value.
- * @draft ICU 63
+ * @stable ICU 63
*/
#define UCPTRIE_ASCII_GET(trie, dataAccess, c) dataAccess(trie, c)
@@ -545,7 +524,7 @@ ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *
* @param dataAccess UCPTRIE_16, UCPTRIE_32, or UCPTRIE_8 according to the trie’s value width
* @param c (UChar32, in) the input code point, must be U+0000..U+FFFF
* @return The BMP code point's trie value.
- * @draft ICU 63
+ * @stable ICU 63
*/
#define UCPTRIE_FAST_BMP_GET(trie, dataAccess, c) dataAccess(trie, _UCPTRIE_FAST_INDEX(trie, c))
@@ -557,7 +536,7 @@ ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *
* @param dataAccess UCPTRIE_16, UCPTRIE_32, or UCPTRIE_8 according to the trie’s value width
* @param c (UChar32, in) the input code point, must be U+10000..U+10FFFF
* @return The supplementary code point's trie value.
- * @draft ICU 63
+ * @stable ICU 63
*/
#define UCPTRIE_FAST_SUPP_GET(trie, dataAccess, c) dataAccess(trie, _UCPTRIE_SMALL_INDEX(trie, c))
@@ -642,5 +621,24 @@ ucptrie_internalU8PrevIndex(const UCPTrie *trie, UChar32 c,
U_CDECL_END
#endif // U_IN_DOXYGEN
-#endif // U_HIDE_DRAFT_API
+
+#if U_SHOW_CPLUSPLUS_API
+
+U_NAMESPACE_BEGIN
+
+/**
+ * \class LocalUCPTriePointer
+ * "Smart pointer" class, closes a UCPTrie via ucptrie_close().
+ * For most methods see the LocalPointerBase base class.
+ *
+ * @see LocalPointerBase
+ * @see LocalPointer
+ * @stable ICU 63
+ */
+U_DEFINE_LOCAL_OPEN_POINTER(LocalUCPTriePointer, UCPTrie, ucptrie_close);
+
+U_NAMESPACE_END
+
+#endif // U_SHOW_CPLUSPLUS_API
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ucurr.h b/Build/source/libs/icu/icu-src/source/common/unicode/ucurr.h
index b219875de23..f91cc0df7c6 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/ucurr.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/ucurr.h
@@ -103,20 +103,17 @@ typedef enum UCurrNameStyle {
* currency, such as "US Dollar" for USD.
* @stable ICU 2.6
*/
- UCURR_LONG_NAME
+ UCURR_LONG_NAME,
-#ifndef U_HIDE_DRAFT_API
- ,
/**
* Selector for getName() indicating the narrow currency symbol.
* The narrow currency symbol is similar to the regular currency
* symbol, but it always takes the shortest form: for example,
* "$" instead of "US$" for USD in en-CA.
*
- * @draft ICU 61
+ * @stable ICU 61
*/
UCURR_NARROW_SYMBOL_NAME
-#endif // U_HIDE_DRAFT_API
} UCurrNameStyle;
#if !UCONFIG_NO_SERVICE
@@ -162,14 +159,14 @@ ucurr_unregister(UCurrRegistryKey key, UErrorCode* status);
* @param currency null-terminated 3-letter ISO 4217 code
* @param locale locale in which to display currency
* @param nameStyle selector for which kind of name to return
- * @param isChoiceFormat fill-in set to TRUE if the returned value
- * is a ChoiceFormat pattern; otherwise it is a static string
+ * @param isChoiceFormat always set to FALSE, or can be NULL;
+ * display names are static strings;
+ * since ICU 4.4, ChoiceFormat patterns are no longer supported
* @param len fill-in parameter to receive length of result
* @param ec error code
* @return pointer to display string of 'len' UChars. If the resource
* data contains no entry for 'currency', then 'currency' itself is
- * returned. If *isChoiceFormat is TRUE, then the result is a
- * ChoiceFormat pattern. Otherwise it is a static string.
+ * returned.
* @stable ICU 2.6
*/
U_STABLE const UChar* U_EXPORT2
@@ -186,14 +183,15 @@ ucurr_getName(const UChar* currency,
* currency object in the en_US locale is "US dollar" or "US dollars".
* @param currency null-terminated 3-letter ISO 4217 code
* @param locale locale in which to display currency
- * @param isChoiceFormat fill-in set to TRUE if the returned value
- * is a ChoiceFormat pattern; otherwise it is a static string
+ * @param isChoiceFormat always set to FALSE, or can be NULL;
+ * display names are static strings;
+ * since ICU 4.4, ChoiceFormat patterns are no longer supported
* @param pluralCount plural count
* @param len fill-in parameter to receive length of result
* @param ec error code
* @return pointer to display string of 'len' UChars. If the resource
* data contains no entry for 'currency', then 'currency' itself is
- * returned.
+ * returned.
* @stable ICU 4.2
*/
U_STABLE const UChar* U_EXPORT2
@@ -208,6 +206,13 @@ ucurr_getPluralName(const UChar* currency,
* Returns the number of the number of fraction digits that should
* be displayed for the given currency.
* This is equivalent to ucurr_getDefaultFractionDigitsForUsage(currency,UCURR_USAGE_STANDARD,ec);
+ *
+ * Important: The number of fraction digits for a given currency is NOT
+ * guaranteed to be constant across versions of ICU or CLDR. For example,
+ * do NOT use this value as a mechanism for deciding the magnitude used
+ * to store currency values in a database. You should use this value for
+ * display purposes only.
+ *
* @param currency null-terminated 3-letter ISO 4217 code
* @param ec input-output error code
* @return a non-negative number of fraction digits to be
@@ -221,6 +226,13 @@ ucurr_getDefaultFractionDigits(const UChar* currency,
/**
* Returns the number of the number of fraction digits that should
* be displayed for the given currency with usage.
+ *
+ * Important: The number of fraction digits for a given currency is NOT
+ * guaranteed to be constant across versions of ICU or CLDR. For example,
+ * do NOT use this value as a mechanism for deciding the magnitude used
+ * to store currency values in a database. You should use this value for
+ * display purposes only.
+ *
* @param currency null-terminated 3-letter ISO 4217 code
* @param usage enum usage for the currency
* @param ec input-output error code
@@ -309,7 +321,7 @@ typedef enum UCurrCurrencyType {
* Provides a UEnumeration object for listing ISO-4217 codes.
* @param currType You can use one of several UCurrCurrencyType values for this
* variable. You can also | (or) them together to get a specific list of
- * currencies. Most people will want to use the (UCURR_CURRENCY|UCURR_NON_DEPRECATED) value to
+ * currencies. Most people will want to use the (UCURR_COMMON|UCURR_NON_DEPRECATED) value to
* get a list of current currencies.
* @param pErrorCode Error code
* @stable ICU 3.2
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/udata.h b/Build/source/libs/icu/icu-src/source/common/unicode/udata.h
index a0286e1e420..325ffcf17db 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/udata.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/udata.h
@@ -264,25 +264,6 @@ udata_openChoice(const char *path, const char *type, const char *name,
U_STABLE void U_EXPORT2
udata_close(UDataMemory *pData);
-#if U_SHOW_CPLUSPLUS_API
-
-U_NAMESPACE_BEGIN
-
-/**
- * \class LocalUDataMemoryPointer
- * "Smart pointer" class, closes a UDataMemory via udata_close().
- * For most methods see the LocalPointerBase base class.
- *
- * @see LocalPointerBase
- * @see LocalPointer
- * @stable ICU 4.4
- */
-U_DEFINE_LOCAL_OPEN_POINTER(LocalUDataMemoryPointer, UDataMemory, udata_close);
-
-U_NAMESPACE_END
-
-#endif
-
/**
* Get the pointer to the actual data inside the data memory.
* The data is read-only.
@@ -434,4 +415,23 @@ udata_setFileAccess(UDataFileAccess access, UErrorCode *status);
U_CDECL_END
+#if U_SHOW_CPLUSPLUS_API
+
+U_NAMESPACE_BEGIN
+
+/**
+ * \class LocalUDataMemoryPointer
+ * "Smart pointer" class, closes a UDataMemory via udata_close().
+ * For most methods see the LocalPointerBase base class.
+ *
+ * @see LocalPointerBase
+ * @see LocalPointer
+ * @stable ICU 4.4
+ */
+U_DEFINE_LOCAL_OPEN_POINTER(LocalUDataMemoryPointer, UDataMemory, udata_close);
+
+U_NAMESPACE_END
+
+#endif // U_SHOW_CPLUSPLUS_API
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uloc.h b/Build/source/libs/icu/icu-src/source/common/unicode/uloc.h
index 23a54a9981c..c45edad9e09 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/uloc.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/uloc.h
@@ -742,12 +742,18 @@ uloc_getDisplayName(const char* localeID,
/**
- * Gets the specified locale from a list of all available locales.
- * The return value is a pointer to an item of
- * a locale name array. Both this array and the pointers
- * it contains are owned by ICU and should not be deleted or written through
- * by the caller. The locale name is terminated by a null pointer.
- * @param n the specific locale name index of the available locale list
+ * Gets the specified locale from a list of available locales.
+ *
+ * This method corresponds to uloc_openAvailableByType called with the
+ * ULOC_AVAILABLE_DEFAULT type argument.
+ *
+ * The return value is a pointer to an item of a locale name array. Both this
+ * array and the pointers it contains are owned by ICU and should not be
+ * deleted or written through by the caller. The locale name is terminated by
+ * a null pointer.
+ *
+ * @param n the specific locale name index of the available locale list;
+ * should not exceed the number returned by uloc_countAvailable.
* @return a specified locale name of all available locales
* @stable ICU 2.0
*/
@@ -762,6 +768,72 @@ uloc_getAvailable(int32_t n);
*/
U_STABLE int32_t U_EXPORT2 uloc_countAvailable(void);
+#ifndef U_HIDE_DRAFT_API
+
+/**
+ * Types for uloc_getAvailableByType and uloc_countAvailableByType.
+ *
+ * @draft ICU 65
+ */
+typedef enum ULocAvailableType {
+ /**
+ * Locales that return data when passed to ICU APIs,
+ * but not including legacy or alias locales.
+ *
+ * @draft ICU 65
+ */
+ ULOC_AVAILABLE_DEFAULT,
+
+ /**
+ * Legacy or alias locales that return data when passed to ICU APIs.
+ * Examples of supported legacy or alias locales:
+ *
+ * - iw (alias to he)
+ * - mo (alias to ro)
+ * - zh_CN (alias to zh_Hans_CN)
+ * - sr_BA (alias to sr_Cyrl_BA)
+ * - ars (alias to ar_SA)
+ *
+ * The locales in this set are disjoint from the ones in
+ * ULOC_AVAILABLE_DEFAULT. To get both sets at the same time, use
+ * ULOC_AVAILABLE_WITH_LEGACY_ALIASES.
+ *
+ * @draft ICU 65
+ */
+ ULOC_AVAILABLE_ONLY_LEGACY_ALIASES,
+
+ /**
+ * The union of the locales in ULOC_AVAILABLE_DEFAULT and
+ * ULOC_AVAILABLE_ONLY_LEGACY_ALIAS.
+ *
+ * @draft ICU 65
+ */
+ ULOC_AVAILABLE_WITH_LEGACY_ALIASES,
+
+#ifndef U_HIDE_INTERNAL_API
+ /**
+ * @internal
+ */
+ ULOC_AVAILABLE_COUNT
+#endif
+} ULocAvailableType;
+
+/**
+ * Gets a list of available locales according to the type argument, allowing
+ * the user to access different sets of supported locales in ICU.
+ *
+ * The returned UEnumeration must be closed by the caller.
+ *
+ * @param type Type choice from ULocAvailableType.
+ * @param status Set if an error occurred.
+ * @return a UEnumeration owned by the caller, or nullptr on failure.
+ * @draft ICU 65
+ */
+U_DRAFT UEnumeration* U_EXPORT2
+uloc_openAvailableByType(ULocAvailableType type, UErrorCode* status);
+
+#endif // U_HIDE_DRAFT_API
+
/**
*
* Gets a list of all available 2-letter language codes defined in ISO 639,
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/umachine.h b/Build/source/libs/icu/icu-src/source/common/unicode/umachine.h
index 0205da62eb4..c52984cef39 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/umachine.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/umachine.h
@@ -140,6 +140,42 @@
#define U_FINAL final
#endif
+// Before ICU 65, function-like, multi-statement ICU macros were just defined as
+// series of statements wrapped in { } blocks and the caller could choose to
+// either treat them as if they were actual functions and end the invocation
+// with a trailing ; creating an empty statement after the block or else omit
+// this trailing ; using the knowledge that the macro would expand to { }.
+//
+// But doing so doesn't work well with macros that look like functions and
+// compiler warnings about empty statements (ICU-20601) and ICU 65 therefore
+// switches to the standard solution of wrapping such macros in do { } while.
+//
+// This will however break existing code that depends on being able to invoke
+// these macros without a trailing ; so to be able to remain compatible with
+// such code the wrapper is itself defined as macros so that it's possible to
+// build ICU 65 and later with the old macro behaviour, like this:
+//
+// export CPPFLAGS='-DUPRV_BLOCK_MACRO_BEGIN="" -DUPRV_BLOCK_MACRO_END=""'
+// runConfigureICU ...
+//
+
+/**
+ * \def UPRV_BLOCK_MACRO_BEGIN
+ * Defined as the "do" keyword by default.
+ * @internal
+ */
+#ifndef UPRV_BLOCK_MACRO_BEGIN
+#define UPRV_BLOCK_MACRO_BEGIN do
+#endif
+
+/**
+ * \def UPRV_BLOCK_MACRO_END
+ * Defined as "while (FALSE)" by default.
+ * @internal
+ */
+#ifndef UPRV_BLOCK_MACRO_END
+#define UPRV_BLOCK_MACRO_END while (FALSE)
+#endif
/*==========================================================================*/
/* limits for int32_t etc., like in POSIX inttypes.h */
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/umutablecptrie.h b/Build/source/libs/icu/icu-src/source/common/unicode/umutablecptrie.h
index e75191a4495..13e71ef25e8 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/umutablecptrie.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/umutablecptrie.h
@@ -9,8 +9,6 @@
#include "unicode/utypes.h"
-#ifndef U_HIDE_DRAFT_API
-
#include "unicode/localpointer.h"
#include "unicode/ucpmap.h"
#include "unicode/ucptrie.h"
@@ -44,7 +42,7 @@ U_CDECL_BEGIN
*
* @see UCPTrie
* @see umutablecptrie_buildImmutable
- * @draft ICU 63
+ * @stable ICU 63
*/
typedef struct UMutableCPTrie UMutableCPTrie;
@@ -59,7 +57,7 @@ typedef struct UMutableCPTrie UMutableCPTrie;
* @param errorValue the value for out-of-range code points and ill-formed UTF-8/16
* @param pErrorCode an in/out ICU UErrorCode
* @return the trie
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI UMutableCPTrie * U_EXPORT2
umutablecptrie_open(uint32_t initialValue, uint32_t errorValue, UErrorCode *pErrorCode);
@@ -71,7 +69,7 @@ umutablecptrie_open(uint32_t initialValue, uint32_t errorValue, UErrorCode *pErr
* @param other the trie to clone
* @param pErrorCode an in/out ICU UErrorCode
* @return the trie clone
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI UMutableCPTrie * U_EXPORT2
umutablecptrie_clone(const UMutableCPTrie *other, UErrorCode *pErrorCode);
@@ -80,7 +78,7 @@ umutablecptrie_clone(const UMutableCPTrie *other, UErrorCode *pErrorCode);
* Closes a mutable trie and releases associated memory.
*
* @param trie the trie
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI void U_EXPORT2
umutablecptrie_close(UMutableCPTrie *trie);
@@ -96,7 +94,7 @@ U_NAMESPACE_BEGIN
*
* @see LocalPointerBase
* @see LocalPointer
- * @draft ICU 63
+ * @stable ICU 63
*/
U_DEFINE_LOCAL_OPEN_POINTER(LocalUMutableCPTriePointer, UMutableCPTrie, umutablecptrie_close);
@@ -111,7 +109,7 @@ U_NAMESPACE_END
* @param map the source map
* @param pErrorCode an in/out ICU UErrorCode
* @return the mutable trie
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI UMutableCPTrie * U_EXPORT2
umutablecptrie_fromUCPMap(const UCPMap *map, UErrorCode *pErrorCode);
@@ -123,7 +121,7 @@ umutablecptrie_fromUCPMap(const UCPMap *map, UErrorCode *pErrorCode);
* @param trie the immutable trie
* @param pErrorCode an in/out ICU UErrorCode
* @return the mutable trie
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI UMutableCPTrie * U_EXPORT2
umutablecptrie_fromUCPTrie(const UCPTrie *trie, UErrorCode *pErrorCode);
@@ -134,7 +132,7 @@ umutablecptrie_fromUCPTrie(const UCPTrie *trie, UErrorCode *pErrorCode);
* @param trie the trie
* @param c the code point
* @return the value
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI uint32_t U_EXPORT2
umutablecptrie_get(const UMutableCPTrie *trie, UChar32 c);
@@ -166,7 +164,7 @@ umutablecptrie_get(const UMutableCPTrie *trie, UChar32 c);
* may have been modified by filter(context, trie value)
* if that function pointer is not NULL
* @return the range end code point, or -1 if start is not a valid code point
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI UChar32 U_EXPORT2
umutablecptrie_getRange(const UMutableCPTrie *trie, UChar32 start,
@@ -180,7 +178,7 @@ umutablecptrie_getRange(const UMutableCPTrie *trie, UChar32 start,
* @param c the code point
* @param value the value
* @param pErrorCode an in/out ICU UErrorCode
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI void U_EXPORT2
umutablecptrie_set(UMutableCPTrie *trie, UChar32 c, uint32_t value, UErrorCode *pErrorCode);
@@ -194,7 +192,7 @@ umutablecptrie_set(UMutableCPTrie *trie, UChar32 c, uint32_t value, UErrorCode *
* @param end the last code point to get the value (inclusive)
* @param value the value
* @param pErrorCode an in/out ICU UErrorCode
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI void U_EXPORT2
umutablecptrie_setRange(UMutableCPTrie *trie,
@@ -229,7 +227,7 @@ umutablecptrie_setRange(UMutableCPTrie *trie,
* @param pErrorCode an in/out ICU UErrorCode
*
* @see umutablecptrie_fromUCPTrie
- * @draft ICU 63
+ * @stable ICU 63
*/
U_CAPI UCPTrie * U_EXPORT2
umutablecptrie_buildImmutable(UMutableCPTrie *trie, UCPTrieType type, UCPTrieValueWidth valueWidth,
@@ -237,5 +235,4 @@ umutablecptrie_buildImmutable(UMutableCPTrie *trie, UCPTrieType type, UCPTrieVal
U_CDECL_END
-#endif // U_HIDE_DRAFT_API
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/unifilt.h b/Build/source/libs/icu/icu-src/source/common/unicode/unifilt.h
index e10527154b6..420e1a19056 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/unifilt.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/unifilt.h
@@ -12,6 +12,10 @@
#ifndef UNIFILT_H
#define UNIFILT_H
+#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/unifunct.h"
#include "unicode/unimatch.h"
@@ -68,6 +72,14 @@ public:
virtual ~UnicodeFilter();
/**
+ * Clones this object polymorphically.
+ * The caller owns the result and should delete it when done.
+ * @return clone, or nullptr if an error occurred
+ * @stable ICU 2.4
+ */
+ virtual UnicodeFilter* clone() const = 0;
+
+ /**
* Returns <tt>true</tt> for characters that are in the selected
* subset. In other words, if a character is <b>to be
* filtered</b>, then <tt>contains()</tt> returns
@@ -119,4 +131,6 @@ protected:
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/unifunct.h b/Build/source/libs/icu/icu-src/source/common/unicode/unifunct.h
index 1c507596861..7d31af7dafb 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/unifunct.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/unifunct.h
@@ -13,6 +13,9 @@
#define UNIFUNCT_H
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/uobject.h"
/**
@@ -124,4 +127,6 @@ protected:
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/unimatch.h b/Build/source/libs/icu/icu-src/source/common/unicode/unimatch.h
index ee4326f93c1..5a192b1b427 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/unimatch.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/unimatch.h
@@ -17,6 +17,7 @@
* \brief C++ API: Unicode Matcher
*/
+#if U_SHOW_CPLUSPLUS_API
U_NAMESPACE_BEGIN
@@ -162,4 +163,6 @@ public:
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uniset.h b/Build/source/libs/icu/icu-src/source/common/unicode/uniset.h
index 0abc7542402..97423110035 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/uniset.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/uniset.h
@@ -13,6 +13,10 @@
#ifndef UNICODESET_H
#define UNICODESET_H
+#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/ucpmap.h"
#include "unicode/unifilt.h"
#include "unicode/unistr.h"
@@ -27,7 +31,6 @@ U_NAMESPACE_BEGIN
// Forward Declarations.
class BMPSet;
-class CharacterProperties;
class ParsePosition;
class RBBIRuleScanner;
class SymbolTable;
@@ -276,14 +279,23 @@ class RuleCharacterIterator;
* @stable ICU 2.0
*/
class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter {
+private:
+ /**
+ * Enough for sets with few ranges.
+ * For example, White_Space has 10 ranges, list length 21.
+ */
+ static constexpr int32_t INITIAL_CAPACITY = 25;
+ // fFlags constant
+ static constexpr uint8_t kIsBogus = 1; // This set is bogus (i.e. not valid)
+
+ UChar32* list = stackList; // MUST be terminated with HIGH
+ int32_t capacity = INITIAL_CAPACITY; // capacity of list
+ int32_t len = 1; // length of list used; 1 <= len <= capacity
+ uint8_t fFlags = 0; // Bit flag (see constants above)
- int32_t len; // length of list used; 0 <= len <= capacity
- int32_t capacity; // capacity of list
- UChar32* list; // MUST be terminated with HIGH
- BMPSet *bmpSet; // The set is frozen iff either bmpSet or stringSpan is not NULL.
- UChar32* buffer; // internal buffer, may be NULL
- int32_t bufferCapacity; // capacity of buffer
- int32_t patLen;
+ BMPSet *bmpSet = nullptr; // The set is frozen iff either bmpSet or stringSpan is not NULL.
+ UChar32* buffer = nullptr; // internal buffer, may be NULL
+ int32_t bufferCapacity = 0; // capacity of buffer
/**
* The pattern representation of this set. This may not be the
@@ -294,15 +306,19 @@ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter {
* indicating that toPattern() must generate a pattern
* representation from the inversion list.
*/
- char16_t *pat;
- UVector* strings; // maintained in sorted order
- UnicodeSetStringSpan *stringSpan;
+ char16_t *pat = nullptr;
+ int32_t patLen = 0;
+
+ UVector* strings = nullptr; // maintained in sorted order
+ UnicodeSetStringSpan *stringSpan = nullptr;
+
+ /**
+ * Initial list array.
+ * Avoids some heap allocations, and list is never nullptr.
+ * Increases the object size a bit.
+ */
+ UChar32 stackList[INITIAL_CAPACITY];
-private:
- enum { // constants
- kIsBogus = 1 // This set is bogus (i.e. not valid)
- };
- uint8_t fFlags; // Bit flag (see constants above)
public:
/**
* Determine if this object contains a valid set.
@@ -478,7 +494,7 @@ public:
* <tt>true</tt> if the specified set is not equal to this set.
* @stable ICU 2.0
*/
- UBool operator!=(const UnicodeSet& o) const;
+ inline UBool operator!=(const UnicodeSet& o) const;
/**
* Returns a copy of this object. All UnicodeFunctor objects have
@@ -489,7 +505,7 @@ public:
* @see cloneAsThawed
* @stable ICU 2.0
*/
- virtual UnicodeFunctor* clone() const;
+ virtual UnicodeSet* clone() const;
/**
* Returns the hash code value for this set.
@@ -567,7 +583,7 @@ public:
* @see cloneAsThawed
* @stable ICU 3.8
*/
- UnicodeFunctor *freeze();
+ UnicodeSet *freeze();
/**
* Clone the set and make the clone mutable.
@@ -577,7 +593,7 @@ public:
* @see isFrozen
* @stable ICU 3.8
*/
- UnicodeFunctor *cloneAsThawed() const;
+ UnicodeSet *cloneAsThawed() const;
//----------------------------------------------------------------
// Public API
@@ -1480,8 +1496,6 @@ private:
friend class USetAccess;
- int32_t getStringCount() const;
-
const UnicodeString* getString(int32_t index) const;
//----------------------------------------------------------------
@@ -1528,13 +1542,18 @@ private:
// Implementation: Utility methods
//----------------------------------------------------------------
- void ensureCapacity(int32_t newLen, UErrorCode& ec);
+ static int32_t nextCapacity(int32_t minCapacity);
+
+ bool ensureCapacity(int32_t newLen);
- void ensureBufferCapacity(int32_t newLen, UErrorCode& ec);
+ bool ensureBufferCapacity(int32_t newLen);
void swapBuffers(void);
UBool allocateStrings(UErrorCode &status);
+ UBool hasStrings() const;
+ int32_t stringsSize() const;
+ UBool stringsContains(const UnicodeString &s) const;
UnicodeString& _toPattern(UnicodeString& result,
UBool escapeUnprintable) const;
@@ -1614,7 +1633,6 @@ private:
UnicodeString& rebuiltPat,
UErrorCode& ec);
- friend class CharacterProperties;
static const UnicodeSet* getInclusions(int32_t src, UErrorCode &status);
/**
@@ -1637,16 +1655,18 @@ private:
const UnicodeSet* inclusions,
UErrorCode &status);
-#ifndef U_HIDE_DRAFT_API // Skipped: ucpmap.h is draft only.
+ // UCPMap is now stable ICU 63
void applyIntPropertyValue(const UCPMap *map,
UCPMapValueFilter *filter, const void *context,
UErrorCode &errorCode);
-#endif /* U_HIDE_DRAFT_API */
/**
* Set the new pattern to cache.
*/
- void setPattern(const UnicodeString& newPat);
+ void setPattern(const UnicodeString& newPat) {
+ setPattern(newPat.getBuffer(), newPat.length());
+ }
+ void setPattern(const char16_t *newPat, int32_t newPatLen);
/**
* Release existing cached pattern.
*/
@@ -1719,4 +1739,6 @@ inline int32_t UnicodeSet::spanBack(const UnicodeString &s, int32_t limit, USetS
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/unistr.h b/Build/source/libs/icu/icu-src/source/common/unicode/unistr.h
index bf954b5f1d8..da79053765a 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/unistr.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/unistr.h
@@ -28,8 +28,11 @@
* \brief C++ API: Unicode String
*/
-#include <cstddef>
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
+#include <cstddef>
#include "unicode/char16ptr.h"
#include "unicode/rep.h"
#include "unicode/std_string.h"
@@ -106,7 +109,7 @@ class UnicodeStringAppendable; // unicode/appendable.h
*
* The string parameter must be a C string literal.
* The length of the string, not including the terminating
- * <code>NUL</code>, must be specified as a constant.
+ * `NUL`, must be specified as a constant.
* @stable ICU 2.0
*/
#if !U_CHAR16_IS_TYPEDEF
@@ -209,7 +212,9 @@ class UnicodeStringAppendable; // unicode/appendable.h
* similar functionality as the Java String and StringBuffer/StringBuilder classes.
* It is a concrete implementation of the abstract class Replaceable (for transliteration).
*
- * A UnicodeString may also "alias" an external array of characters
+ * The UnicodeString equivalent of std::string’s clear() is remove().
+ *
+ * A UnicodeString may "alias" an external array of characters
* (that is, point to it, rather than own the array)
* whose lifetime must then at least match the lifetime of the aliasing object.
* This aliasing may be preserved when returning a UnicodeString by value,
@@ -221,35 +226,35 @@ class UnicodeStringAppendable; // unicode/appendable.h
*
* The UnicodeString class is not suitable for subclassing.
*
- * <p>For an overview of Unicode strings in C and C++ see the
- * <a href="http://userguide.icu-project.org/strings#TOC-Strings-in-C-C-">User Guide Strings chapter</a>.</p>
+ * For an overview of Unicode strings in C and C++ see the
+ * [User Guide Strings chapter](http://userguide.icu-project.org/strings#TOC-Strings-in-C-C-).
*
- * <p>In ICU, a Unicode string consists of 16-bit Unicode <em>code units</em>.
+ * In ICU, a Unicode string consists of 16-bit Unicode *code units*.
* A Unicode character may be stored with either one code unit
* (the most common case) or with a matched pair of special code units
* ("surrogates"). The data type for code units is char16_t.
- * For single-character handling, a Unicode character code <em>point</em> is a value
- * in the range 0..0x10ffff. ICU uses the UChar32 type for code points.</p>
+ * For single-character handling, a Unicode character code *point* is a value
+ * in the range 0..0x10ffff. ICU uses the UChar32 type for code points.
*
- * <p>Indexes and offsets into and lengths of strings always count code units, not code points.
+ * Indexes and offsets into and lengths of strings always count code units, not code points.
* This is the same as with multi-byte char* strings in traditional string handling.
* Operations on partial strings typically do not test for code point boundaries.
* If necessary, the user needs to take care of such boundaries by testing for the code unit
* values or by using functions like
* UnicodeString::getChar32Start() and UnicodeString::getChar32Limit()
- * (or, in C, the equivalent macros U16_SET_CP_START() and U16_SET_CP_LIMIT(), see utf.h).</p>
+ * (or, in C, the equivalent macros U16_SET_CP_START() and U16_SET_CP_LIMIT(), see utf.h).
*
* UnicodeString methods are more lenient with regard to input parameter values
* than other ICU APIs. In particular:
* - If indexes are out of bounds for a UnicodeString object
- * (<0 or >length()) then they are "pinned" to the nearest boundary.
+ * (< 0 or > length()) then they are "pinned" to the nearest boundary.
* - If the buffer passed to an insert/append/replace operation is owned by the
* target object, e.g., calling str.append(str), an extra copy may take place
* to ensure safety.
* - If primitive string pointer values (e.g., const char16_t * or char *)
* for input strings are NULL, then those input string parameters are treated
* as if they pointed to an empty string.
- * However, this is <em>not</em> the case for char * parameters for charset names
+ * However, this is *not* the case for char * parameters for charset names
* or other IDs.
* - Most UnicodeString methods do not take a UErrorCode parameter because
* there are usually very few opportunities for failure other than a shortage
@@ -273,14 +278,14 @@ class UnicodeStringAppendable; // unicode/appendable.h
* This includes the const UnicodeString & parameters for
* copy construction, assignment, and cloning.
*
- * <p>UnicodeString uses several storage methods.
+ * UnicodeString uses several storage methods.
* String contents can be stored inside the UnicodeString object itself,
* in an allocated and shared buffer, or in an outside buffer that is "aliased".
* Most of this is done transparently, but careful aliasing in particular provides
* significant performance improvements.
* Also, the internal buffer is accessible via special functions.
* For details see the
- * <a href="http://userguide.icu-project.org/strings#TOC-Maximizing-Performance-with-the-UnicodeString-Storage-Model">User Guide Strings chapter</a>.</p>
+ * [User Guide Strings chapter](http://userguide.icu-project.org/strings#TOC-Maximizing-Performance-with-the-UnicodeString-Storage-Model).
*
* @see utf.h
* @see CharacterIterator
@@ -315,7 +320,7 @@ public:
/**
* Equality operator. Performs only bitwise comparison.
* @param text The UnicodeString to compare to this one.
- * @return TRUE if <TT>text</TT> contains the same characters as this one,
+ * @return TRUE if `text` contains the same characters as this one,
* FALSE otherwise.
* @stable ICU 2.0
*/
@@ -324,7 +329,7 @@ public:
/**
* Inequality operator. Performs only bitwise comparison.
* @param text The UnicodeString to compare to this one.
- * @return FALSE if <TT>text</TT> contains the same characters as this one,
+ * @return FALSE if `text` contains the same characters as this one,
* TRUE otherwise.
* @stable ICU 2.0
*/
@@ -334,7 +339,7 @@ public:
* Greater than operator. Performs only bitwise comparison.
* @param text The UnicodeString to compare to this one.
* @return TRUE if the characters in this are bitwise
- * greater than the characters in <code>text</code>, FALSE otherwise
+ * greater than the characters in `text`, FALSE otherwise
* @stable ICU 2.0
*/
inline UBool operator> (const UnicodeString& text) const;
@@ -343,7 +348,7 @@ public:
* Less than operator. Performs only bitwise comparison.
* @param text The UnicodeString to compare to this one.
* @return TRUE if the characters in this are bitwise
- * less than the characters in <code>text</code>, FALSE otherwise
+ * less than the characters in `text`, FALSE otherwise
* @stable ICU 2.0
*/
inline UBool operator< (const UnicodeString& text) const;
@@ -352,7 +357,7 @@ public:
* Greater than or equal operator. Performs only bitwise comparison.
* @param text The UnicodeString to compare to this one.
* @return TRUE if the characters in this are bitwise
- * greater than or equal to the characters in <code>text</code>, FALSE otherwise
+ * greater than or equal to the characters in `text`, FALSE otherwise
* @stable ICU 2.0
*/
inline UBool operator>= (const UnicodeString& text) const;
@@ -361,37 +366,37 @@ public:
* Less than or equal operator. Performs only bitwise comparison.
* @param text The UnicodeString to compare to this one.
* @return TRUE if the characters in this are bitwise
- * less than or equal to the characters in <code>text</code>, FALSE otherwise
+ * less than or equal to the characters in `text`, FALSE otherwise
* @stable ICU 2.0
*/
inline UBool operator<= (const UnicodeString& text) const;
/**
* Compare the characters bitwise in this UnicodeString to
- * the characters in <code>text</code>.
+ * the characters in `text`.
* @param text The UnicodeString to compare to this one.
* @return The result of bitwise character comparison: 0 if this
- * contains the same characters as <code>text</code>, -1 if the characters in
- * this are bitwise less than the characters in <code>text</code>, +1 if the
+ * contains the same characters as `text`, -1 if the characters in
+ * this are bitwise less than the characters in `text`, +1 if the
* characters in this are bitwise greater than the characters
- * in <code>text</code>.
+ * in `text`.
* @stable ICU 2.0
*/
inline int8_t compare(const UnicodeString& text) const;
/**
* Compare the characters bitwise in the range
- * [<TT>start</TT>, <TT>start + length</TT>) with the characters
- * in the <b>entire string</b> <TT>text</TT>.
+ * [`start`, `start + length`) with the characters
+ * in the **entire string** `text`.
* (The parameters "start" and "length" are not applied to the other text "text".)
* @param start the offset at which the compare operation begins
* @param length the number of characters of text to compare.
* @param text the other text to be compared against this string.
* @return The result of bitwise character comparison: 0 if this
- * contains the same characters as <code>text</code>, -1 if the characters in
- * this are bitwise less than the characters in <code>text</code>, +1 if the
+ * contains the same characters as `text`, -1 if the characters in
+ * this are bitwise less than the characters in `text`, +1 if the
* characters in this are bitwise greater than the characters
- * in <code>text</code>.
+ * in `text`.
* @stable ICU 2.0
*/
inline int8_t compare(int32_t start,
@@ -400,19 +405,19 @@ public:
/**
* Compare the characters bitwise in the range
- * [<TT>start</TT>, <TT>start + length</TT>) with the characters
- * in <TT>srcText</TT> in the range
- * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>).
+ * [`start`, `start + length`) with the characters
+ * in `srcText` in the range
+ * [`srcStart`, `srcStart + srcLength`).
* @param start the offset at which the compare operation begins
* @param length the number of characters in this to compare.
* @param srcText the text to be compared
- * @param srcStart the offset into <TT>srcText</TT> to start comparison
- * @param srcLength the number of characters in <TT>src</TT> to compare
+ * @param srcStart the offset into `srcText` to start comparison
+ * @param srcLength the number of characters in `src` to compare
* @return The result of bitwise character comparison: 0 if this
- * contains the same characters as <code>srcText</code>, -1 if the characters in
- * this are bitwise less than the characters in <code>srcText</code>, +1 if the
+ * contains the same characters as `srcText`, -1 if the characters in
+ * this are bitwise less than the characters in `srcText`, +1 if the
* characters in this are bitwise greater than the characters
- * in <code>srcText</code>.
+ * in `srcText`.
* @stable ICU 2.0
*/
inline int8_t compare(int32_t start,
@@ -423,14 +428,14 @@ public:
/**
* Compare the characters bitwise in this UnicodeString with the first
- * <TT>srcLength</TT> characters in <TT>srcChars</TT>.
+ * `srcLength` characters in `srcChars`.
* @param srcChars The characters to compare to this UnicodeString.
- * @param srcLength the number of characters in <TT>srcChars</TT> to compare
+ * @param srcLength the number of characters in `srcChars` to compare
* @return The result of bitwise character comparison: 0 if this
- * contains the same characters as <code>srcChars</code>, -1 if the characters in
- * this are bitwise less than the characters in <code>srcChars</code>, +1 if the
+ * contains the same characters as `srcChars`, -1 if the characters in
+ * this are bitwise less than the characters in `srcChars`, +1 if the
* characters in this are bitwise greater than the characters
- * in <code>srcChars</code>.
+ * in `srcChars`.
* @stable ICU 2.0
*/
inline int8_t compare(ConstChar16Ptr srcChars,
@@ -438,16 +443,16 @@ public:
/**
* Compare the characters bitwise in the range
- * [<TT>start</TT>, <TT>start + length</TT>) with the first
- * <TT>length</TT> characters in <TT>srcChars</TT>
+ * [`start`, `start + length`) with the first
+ * `length` characters in `srcChars`
* @param start the offset at which the compare operation begins
* @param length the number of characters to compare.
* @param srcChars the characters to be compared
* @return The result of bitwise character comparison: 0 if this
- * contains the same characters as <code>srcChars</code>, -1 if the characters in
- * this are bitwise less than the characters in <code>srcChars</code>, +1 if the
+ * contains the same characters as `srcChars`, -1 if the characters in
+ * this are bitwise less than the characters in `srcChars`, +1 if the
* characters in this are bitwise greater than the characters
- * in <code>srcChars</code>.
+ * in `srcChars`.
* @stable ICU 2.0
*/
inline int8_t compare(int32_t start,
@@ -456,19 +461,19 @@ public:
/**
* Compare the characters bitwise in the range
- * [<TT>start</TT>, <TT>start + length</TT>) with the characters
- * in <TT>srcChars</TT> in the range
- * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>).
+ * [`start`, `start + length`) with the characters
+ * in `srcChars` in the range
+ * [`srcStart`, `srcStart + srcLength`).
* @param start the offset at which the compare operation begins
* @param length the number of characters in this to compare
* @param srcChars the characters to be compared
- * @param srcStart the offset into <TT>srcChars</TT> to start comparison
- * @param srcLength the number of characters in <TT>srcChars</TT> to compare
+ * @param srcStart the offset into `srcChars` to start comparison
+ * @param srcLength the number of characters in `srcChars` to compare
* @return The result of bitwise character comparison: 0 if this
- * contains the same characters as <code>srcChars</code>, -1 if the characters in
- * this are bitwise less than the characters in <code>srcChars</code>, +1 if the
+ * contains the same characters as `srcChars`, -1 if the characters in
+ * this are bitwise less than the characters in `srcChars`, +1 if the
* characters in this are bitwise greater than the characters
- * in <code>srcChars</code>.
+ * in `srcChars`.
* @stable ICU 2.0
*/
inline int8_t compare(int32_t start,
@@ -479,19 +484,19 @@ public:
/**
* Compare the characters bitwise in the range
- * [<TT>start</TT>, <TT>limit</TT>) with the characters
- * in <TT>srcText</TT> in the range
- * [<TT>srcStart</TT>, <TT>srcLimit</TT>).
+ * [`start`, `limit`) with the characters
+ * in `srcText` in the range
+ * [`srcStart`, `srcLimit`).
* @param start the offset at which the compare operation begins
* @param limit the offset immediately following the compare operation
* @param srcText the text to be compared
- * @param srcStart the offset into <TT>srcText</TT> to start comparison
- * @param srcLimit the offset into <TT>srcText</TT> to limit comparison
+ * @param srcStart the offset into `srcText` to start comparison
+ * @param srcLimit the offset into `srcText` to limit comparison
* @return The result of bitwise character comparison: 0 if this
- * contains the same characters as <code>srcText</code>, -1 if the characters in
- * this are bitwise less than the characters in <code>srcText</code>, +1 if the
+ * contains the same characters as `srcText`, -1 if the characters in
+ * this are bitwise less than the characters in `srcText`, +1 if the
* characters in this are bitwise greater than the characters
- * in <code>srcText</code>.
+ * in `srcText`.
* @stable ICU 2.0
*/
inline int8_t compareBetween(int32_t start,
@@ -848,21 +853,21 @@ public:
uint32_t options) const;
/**
- * Determine if this starts with the characters in <TT>text</TT>
+ * Determine if this starts with the characters in `text`
* @param text The text to match.
- * @return TRUE if this starts with the characters in <TT>text</TT>,
+ * @return TRUE if this starts with the characters in `text`,
* FALSE otherwise
* @stable ICU 2.0
*/
inline UBool startsWith(const UnicodeString& text) const;
/**
- * Determine if this starts with the characters in <TT>srcText</TT>
- * in the range [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>).
+ * Determine if this starts with the characters in `srcText`
+ * in the range [`srcStart`, `srcStart + srcLength`).
* @param srcText The text to match.
- * @param srcStart the offset into <TT>srcText</TT> to start matching
- * @param srcLength the number of characters in <TT>srcText</TT> to match
- * @return TRUE if this starts with the characters in <TT>text</TT>,
+ * @param srcStart the offset into `srcText` to start matching
+ * @param srcLength the number of characters in `srcText` to match
+ * @return TRUE if this starts with the characters in `text`,
* FALSE otherwise
* @stable ICU 2.0
*/
@@ -871,10 +876,10 @@ public:
int32_t srcLength) const;
/**
- * Determine if this starts with the characters in <TT>srcChars</TT>
+ * Determine if this starts with the characters in `srcChars`
* @param srcChars The characters to match.
- * @param srcLength the number of characters in <TT>srcChars</TT>
- * @return TRUE if this starts with the characters in <TT>srcChars</TT>,
+ * @param srcLength the number of characters in `srcChars`
+ * @return TRUE if this starts with the characters in `srcChars`,
* FALSE otherwise
* @stable ICU 2.0
*/
@@ -882,12 +887,12 @@ public:
int32_t srcLength) const;
/**
- * Determine if this ends with the characters in <TT>srcChars</TT>
- * in the range [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>).
+ * Determine if this ends with the characters in `srcChars`
+ * in the range [`srcStart`, `srcStart + srcLength`).
* @param srcChars The characters to match.
- * @param srcStart the offset into <TT>srcText</TT> to start matching
- * @param srcLength the number of characters in <TT>srcChars</TT> to match
- * @return TRUE if this ends with the characters in <TT>srcChars</TT>, FALSE otherwise
+ * @param srcStart the offset into `srcText` to start matching
+ * @param srcLength the number of characters in `srcChars` to match
+ * @return TRUE if this ends with the characters in `srcChars`, FALSE otherwise
* @stable ICU 2.0
*/
inline UBool startsWith(const char16_t *srcChars,
@@ -895,21 +900,21 @@ public:
int32_t srcLength) const;
/**
- * Determine if this ends with the characters in <TT>text</TT>
+ * Determine if this ends with the characters in `text`
* @param text The text to match.
- * @return TRUE if this ends with the characters in <TT>text</TT>,
+ * @return TRUE if this ends with the characters in `text`,
* FALSE otherwise
* @stable ICU 2.0
*/
inline UBool endsWith(const UnicodeString& text) const;
/**
- * Determine if this ends with the characters in <TT>srcText</TT>
- * in the range [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>).
+ * Determine if this ends with the characters in `srcText`
+ * in the range [`srcStart`, `srcStart + srcLength`).
* @param srcText The text to match.
- * @param srcStart the offset into <TT>srcText</TT> to start matching
- * @param srcLength the number of characters in <TT>srcText</TT> to match
- * @return TRUE if this ends with the characters in <TT>text</TT>,
+ * @param srcStart the offset into `srcText` to start matching
+ * @param srcLength the number of characters in `srcText` to match
+ * @return TRUE if this ends with the characters in `text`,
* FALSE otherwise
* @stable ICU 2.0
*/
@@ -918,10 +923,10 @@ public:
int32_t srcLength) const;
/**
- * Determine if this ends with the characters in <TT>srcChars</TT>
+ * Determine if this ends with the characters in `srcChars`
* @param srcChars The characters to match.
- * @param srcLength the number of characters in <TT>srcChars</TT>
- * @return TRUE if this ends with the characters in <TT>srcChars</TT>,
+ * @param srcLength the number of characters in `srcChars`
+ * @return TRUE if this ends with the characters in `srcChars`,
* FALSE otherwise
* @stable ICU 2.0
*/
@@ -929,12 +934,12 @@ public:
int32_t srcLength) const;
/**
- * Determine if this ends with the characters in <TT>srcChars</TT>
- * in the range [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>).
+ * Determine if this ends with the characters in `srcChars`
+ * in the range [`srcStart`, `srcStart + srcLength`).
* @param srcChars The characters to match.
- * @param srcStart the offset into <TT>srcText</TT> to start matching
- * @param srcLength the number of characters in <TT>srcChars</TT> to match
- * @return TRUE if this ends with the characters in <TT>srcChars</TT>,
+ * @param srcStart the offset into `srcText` to start matching
+ * @param srcLength the number of characters in `srcChars` to match
+ * @return TRUE if this ends with the characters in `srcChars`,
* FALSE otherwise
* @stable ICU 2.0
*/
@@ -946,21 +951,21 @@ public:
/* Searching - bitwise only */
/**
- * Locate in this the first occurrence of the characters in <TT>text</TT>,
+ * Locate in this the first occurrence of the characters in `text`,
* using bitwise comparison.
* @param text The text to search for.
- * @return The offset into this of the start of <TT>text</TT>,
+ * @return The offset into this of the start of `text`,
* or -1 if not found.
* @stable ICU 2.0
*/
inline int32_t indexOf(const UnicodeString& text) const;
/**
- * Locate in this the first occurrence of the characters in <TT>text</TT>
- * starting at offset <TT>start</TT>, using bitwise comparison.
+ * Locate in this the first occurrence of the characters in `text`
+ * starting at offset `start`, using bitwise comparison.
* @param text The text to search for.
* @param start The offset at which searching will start.
- * @return The offset into this of the start of <TT>text</TT>,
+ * @return The offset into this of the start of `text`,
* or -1 if not found.
* @stable ICU 2.0
*/
@@ -969,12 +974,12 @@ public:
/**
* Locate in this the first occurrence in the range
- * [<TT>start</TT>, <TT>start + length</TT>) of the characters
- * in <TT>text</TT>, using bitwise comparison.
+ * [`start`, `start + length`) of the characters
+ * in `text`, using bitwise comparison.
* @param text The text to search for.
* @param start The offset at which searching will start.
* @param length The number of characters to search
- * @return The offset into this of the start of <TT>text</TT>,
+ * @return The offset into this of the start of `text`,
* or -1 if not found.
* @stable ICU 2.0
*/
@@ -984,17 +989,17 @@ public:
/**
* Locate in this the first occurrence in the range
- * [<TT>start</TT>, <TT>start + length</TT>) of the characters
- * in <TT>srcText</TT> in the range
- * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>),
+ * [`start`, `start + length`) of the characters
+ * in `srcText` in the range
+ * [`srcStart`, `srcStart + srcLength`),
* using bitwise comparison.
* @param srcText The text to search for.
- * @param srcStart the offset into <TT>srcText</TT> at which
+ * @param srcStart the offset into `srcText` at which
* to start matching
- * @param srcLength the number of characters in <TT>srcText</TT> to match
+ * @param srcLength the number of characters in `srcText` to match
* @param start the offset into this at which to start matching
* @param length the number of characters in this to search
- * @return The offset into this of the start of <TT>text</TT>,
+ * @return The offset into this of the start of `text`,
* or -1 if not found.
* @stable ICU 2.0
*/
@@ -1006,12 +1011,12 @@ public:
/**
* Locate in this the first occurrence of the characters in
- * <TT>srcChars</TT>
- * starting at offset <TT>start</TT>, using bitwise comparison.
+ * `srcChars`
+ * starting at offset `start`, using bitwise comparison.
* @param srcChars The text to search for.
- * @param srcLength the number of characters in <TT>srcChars</TT> to match
+ * @param srcLength the number of characters in `srcChars` to match
* @param start the offset into this at which to start matching
- * @return The offset into this of the start of <TT>text</TT>,
+ * @return The offset into this of the start of `text`,
* or -1 if not found.
* @stable ICU 2.0
*/
@@ -1021,13 +1026,13 @@ public:
/**
* Locate in this the first occurrence in the range
- * [<TT>start</TT>, <TT>start + length</TT>) of the characters
- * in <TT>srcChars</TT>, using bitwise comparison.
+ * [`start`, `start + length`) of the characters
+ * in `srcChars`, using bitwise comparison.
* @param srcChars The text to search for.
- * @param srcLength the number of characters in <TT>srcChars</TT>
+ * @param srcLength the number of characters in `srcChars`
* @param start The offset at which searching will start.
* @param length The number of characters to search
- * @return The offset into this of the start of <TT>srcChars</TT>,
+ * @return The offset into this of the start of `srcChars`,
* or -1 if not found.
* @stable ICU 2.0
*/
@@ -1038,17 +1043,17 @@ public:
/**
* Locate in this the first occurrence in the range
- * [<TT>start</TT>, <TT>start + length</TT>) of the characters
- * in <TT>srcChars</TT> in the range
- * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>),
+ * [`start`, `start + length`) of the characters
+ * in `srcChars` in the range
+ * [`srcStart`, `srcStart + srcLength`),
* using bitwise comparison.
* @param srcChars The text to search for.
- * @param srcStart the offset into <TT>srcChars</TT> at which
+ * @param srcStart the offset into `srcChars` at which
* to start matching
- * @param srcLength the number of characters in <TT>srcChars</TT> to match
+ * @param srcLength the number of characters in `srcChars` to match
* @param start the offset into this at which to start matching
* @param length the number of characters in this to search
- * @return The offset into this of the start of <TT>text</TT>,
+ * @return The offset into this of the start of `text`,
* or -1 if not found.
* @stable ICU 2.0
*/
@@ -1059,55 +1064,55 @@ public:
int32_t length) const;
/**
- * Locate in this the first occurrence of the BMP code point <code>c</code>,
+ * Locate in this the first occurrence of the BMP code point `c`,
* using bitwise comparison.
* @param c The code unit to search for.
- * @return The offset into this of <TT>c</TT>, or -1 if not found.
+ * @return The offset into this of `c`, or -1 if not found.
* @stable ICU 2.0
*/
inline int32_t indexOf(char16_t c) const;
/**
- * Locate in this the first occurrence of the code point <TT>c</TT>,
+ * Locate in this the first occurrence of the code point `c`,
* using bitwise comparison.
*
* @param c The code point to search for.
- * @return The offset into this of <TT>c</TT>, or -1 if not found.
+ * @return The offset into this of `c`, or -1 if not found.
* @stable ICU 2.0
*/
inline int32_t indexOf(UChar32 c) const;
/**
- * Locate in this the first occurrence of the BMP code point <code>c</code>,
- * starting at offset <TT>start</TT>, using bitwise comparison.
+ * Locate in this the first occurrence of the BMP code point `c`,
+ * starting at offset `start`, using bitwise comparison.
* @param c The code unit to search for.
* @param start The offset at which searching will start.
- * @return The offset into this of <TT>c</TT>, or -1 if not found.
+ * @return The offset into this of `c`, or -1 if not found.
* @stable ICU 2.0
*/
inline int32_t indexOf(char16_t c,
int32_t start) const;
/**
- * Locate in this the first occurrence of the code point <TT>c</TT>
- * starting at offset <TT>start</TT>, using bitwise comparison.
+ * Locate in this the first occurrence of the code point `c`
+ * starting at offset `start`, using bitwise comparison.
*
* @param c The code point to search for.
* @param start The offset at which searching will start.
- * @return The offset into this of <TT>c</TT>, or -1 if not found.
+ * @return The offset into this of `c`, or -1 if not found.
* @stable ICU 2.0
*/
inline int32_t indexOf(UChar32 c,
int32_t start) const;
/**
- * Locate in this the first occurrence of the BMP code point <code>c</code>
- * in the range [<TT>start</TT>, <TT>start + length</TT>),
+ * Locate in this the first occurrence of the BMP code point `c`
+ * in the range [`start`, `start + length`),
* using bitwise comparison.
* @param c The code unit to search for.
* @param start the offset into this at which to start matching
* @param length the number of characters in this to search
- * @return The offset into this of <TT>c</TT>, or -1 if not found.
+ * @return The offset into this of `c`, or -1 if not found.
* @stable ICU 2.0
*/
inline int32_t indexOf(char16_t c,
@@ -1115,14 +1120,14 @@ public:
int32_t length) const;
/**
- * Locate in this the first occurrence of the code point <TT>c</TT>
- * in the range [<TT>start</TT>, <TT>start + length</TT>),
+ * Locate in this the first occurrence of the code point `c`
+ * in the range [`start`, `start + length`),
* using bitwise comparison.
*
* @param c The code point to search for.
* @param start the offset into this at which to start matching
* @param length the number of characters in this to search
- * @return The offset into this of <TT>c</TT>, or -1 if not found.
+ * @return The offset into this of `c`, or -1 if not found.
* @stable ICU 2.0
*/
inline int32_t indexOf(UChar32 c,
@@ -1130,21 +1135,21 @@ public:
int32_t length) const;
/**
- * Locate in this the last occurrence of the characters in <TT>text</TT>,
+ * Locate in this the last occurrence of the characters in `text`,
* using bitwise comparison.
* @param text The text to search for.
- * @return The offset into this of the start of <TT>text</TT>,
+ * @return The offset into this of the start of `text`,
* or -1 if not found.
* @stable ICU 2.0
*/
inline int32_t lastIndexOf(const UnicodeString& text) const;
/**
- * Locate in this the last occurrence of the characters in <TT>text</TT>
- * starting at offset <TT>start</TT>, using bitwise comparison.
+ * Locate in this the last occurrence of the characters in `text`
+ * starting at offset `start`, using bitwise comparison.
* @param text The text to search for.
* @param start The offset at which searching will start.
- * @return The offset into this of the start of <TT>text</TT>,
+ * @return The offset into this of the start of `text`,
* or -1 if not found.
* @stable ICU 2.0
*/
@@ -1153,12 +1158,12 @@ public:
/**
* Locate in this the last occurrence in the range
- * [<TT>start</TT>, <TT>start + length</TT>) of the characters
- * in <TT>text</TT>, using bitwise comparison.
+ * [`start`, `start + length`) of the characters
+ * in `text`, using bitwise comparison.
* @param text The text to search for.
* @param start The offset at which searching will start.
* @param length The number of characters to search
- * @return The offset into this of the start of <TT>text</TT>,
+ * @return The offset into this of the start of `text`,
* or -1 if not found.
* @stable ICU 2.0
*/
@@ -1168,17 +1173,17 @@ public:
/**
* Locate in this the last occurrence in the range
- * [<TT>start</TT>, <TT>start + length</TT>) of the characters
- * in <TT>srcText</TT> in the range
- * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>),
+ * [`start`, `start + length`) of the characters
+ * in `srcText` in the range
+ * [`srcStart`, `srcStart + srcLength`),
* using bitwise comparison.
* @param srcText The text to search for.
- * @param srcStart the offset into <TT>srcText</TT> at which
+ * @param srcStart the offset into `srcText` at which
* to start matching
- * @param srcLength the number of characters in <TT>srcText</TT> to match
+ * @param srcLength the number of characters in `srcText` to match
* @param start the offset into this at which to start matching
* @param length the number of characters in this to search
- * @return The offset into this of the start of <TT>text</TT>,
+ * @return The offset into this of the start of `text`,
* or -1 if not found.
* @stable ICU 2.0
*/
@@ -1189,12 +1194,12 @@ public:
int32_t length) const;
/**
- * Locate in this the last occurrence of the characters in <TT>srcChars</TT>
- * starting at offset <TT>start</TT>, using bitwise comparison.
+ * Locate in this the last occurrence of the characters in `srcChars`
+ * starting at offset `start`, using bitwise comparison.
* @param srcChars The text to search for.
- * @param srcLength the number of characters in <TT>srcChars</TT> to match
+ * @param srcLength the number of characters in `srcChars` to match
* @param start the offset into this at which to start matching
- * @return The offset into this of the start of <TT>text</TT>,
+ * @return The offset into this of the start of `text`,
* or -1 if not found.
* @stable ICU 2.0
*/
@@ -1204,13 +1209,13 @@ public:
/**
* Locate in this the last occurrence in the range
- * [<TT>start</TT>, <TT>start + length</TT>) of the characters
- * in <TT>srcChars</TT>, using bitwise comparison.
+ * [`start`, `start + length`) of the characters
+ * in `srcChars`, using bitwise comparison.
* @param srcChars The text to search for.
- * @param srcLength the number of characters in <TT>srcChars</TT>
+ * @param srcLength the number of characters in `srcChars`
* @param start The offset at which searching will start.
* @param length The number of characters to search
- * @return The offset into this of the start of <TT>srcChars</TT>,
+ * @return The offset into this of the start of `srcChars`,
* or -1 if not found.
* @stable ICU 2.0
*/
@@ -1221,17 +1226,17 @@ public:
/**
* Locate in this the last occurrence in the range
- * [<TT>start</TT>, <TT>start + length</TT>) of the characters
- * in <TT>srcChars</TT> in the range
- * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>),
+ * [`start`, `start + length`) of the characters
+ * in `srcChars` in the range
+ * [`srcStart`, `srcStart + srcLength`),
* using bitwise comparison.
* @param srcChars The text to search for.
- * @param srcStart the offset into <TT>srcChars</TT> at which
+ * @param srcStart the offset into `srcChars` at which
* to start matching
- * @param srcLength the number of characters in <TT>srcChars</TT> to match
+ * @param srcLength the number of characters in `srcChars` to match
* @param start the offset into this at which to start matching
* @param length the number of characters in this to search
- * @return The offset into this of the start of <TT>text</TT>,
+ * @return The offset into this of the start of `text`,
* or -1 if not found.
* @stable ICU 2.0
*/
@@ -1242,55 +1247,55 @@ public:
int32_t length) const;
/**
- * Locate in this the last occurrence of the BMP code point <code>c</code>,
+ * Locate in this the last occurrence of the BMP code point `c`,
* using bitwise comparison.
* @param c The code unit to search for.
- * @return The offset into this of <TT>c</TT>, or -1 if not found.
+ * @return The offset into this of `c`, or -1 if not found.
* @stable ICU 2.0
*/
inline int32_t lastIndexOf(char16_t c) const;
/**
- * Locate in this the last occurrence of the code point <TT>c</TT>,
+ * Locate in this the last occurrence of the code point `c`,
* using bitwise comparison.
*
* @param c The code point to search for.
- * @return The offset into this of <TT>c</TT>, or -1 if not found.
+ * @return The offset into this of `c`, or -1 if not found.
* @stable ICU 2.0
*/
inline int32_t lastIndexOf(UChar32 c) const;
/**
- * Locate in this the last occurrence of the BMP code point <code>c</code>
- * starting at offset <TT>start</TT>, using bitwise comparison.
+ * Locate in this the last occurrence of the BMP code point `c`
+ * starting at offset `start`, using bitwise comparison.
* @param c The code unit to search for.
* @param start The offset at which searching will start.
- * @return The offset into this of <TT>c</TT>, or -1 if not found.
+ * @return The offset into this of `c`, or -1 if not found.
* @stable ICU 2.0
*/
inline int32_t lastIndexOf(char16_t c,
int32_t start) const;
/**
- * Locate in this the last occurrence of the code point <TT>c</TT>
- * starting at offset <TT>start</TT>, using bitwise comparison.
+ * Locate in this the last occurrence of the code point `c`
+ * starting at offset `start`, using bitwise comparison.
*
* @param c The code point to search for.
* @param start The offset at which searching will start.
- * @return The offset into this of <TT>c</TT>, or -1 if not found.
+ * @return The offset into this of `c`, or -1 if not found.
* @stable ICU 2.0
*/
inline int32_t lastIndexOf(UChar32 c,
int32_t start) const;
/**
- * Locate in this the last occurrence of the BMP code point <code>c</code>
- * in the range [<TT>start</TT>, <TT>start + length</TT>),
+ * Locate in this the last occurrence of the BMP code point `c`
+ * in the range [`start`, `start + length`),
* using bitwise comparison.
* @param c The code unit to search for.
* @param start the offset into this at which to start matching
* @param length the number of characters in this to search
- * @return The offset into this of <TT>c</TT>, or -1 if not found.
+ * @return The offset into this of `c`, or -1 if not found.
* @stable ICU 2.0
*/
inline int32_t lastIndexOf(char16_t c,
@@ -1298,14 +1303,14 @@ public:
int32_t length) const;
/**
- * Locate in this the last occurrence of the code point <TT>c</TT>
- * in the range [<TT>start</TT>, <TT>start + length</TT>),
+ * Locate in this the last occurrence of the code point `c`
+ * in the range [`start`, `start + length`),
* using bitwise comparison.
*
* @param c The code point to search for.
* @param start the offset into this at which to start matching
* @param length the number of characters in this to search
- * @return The offset into this of <TT>c</TT>, or -1 if not found.
+ * @return The offset into this of `c`, or -1 if not found.
* @stable ICU 2.0
*/
inline int32_t lastIndexOf(UChar32 c,
@@ -1316,32 +1321,32 @@ public:
/* Character access */
/**
- * Return the code unit at offset <tt>offset</tt>.
+ * Return the code unit at offset `offset`.
* If the offset is not valid (0..length()-1) then U+ffff is returned.
* @param offset a valid offset into the text
- * @return the code unit at offset <tt>offset</tt>
+ * @return the code unit at offset `offset`
* or 0xffff if the offset is not valid for this string
* @stable ICU 2.0
*/
inline char16_t charAt(int32_t offset) const;
/**
- * Return the code unit at offset <tt>offset</tt>.
+ * Return the code unit at offset `offset`.
* If the offset is not valid (0..length()-1) then U+ffff is returned.
* @param offset a valid offset into the text
- * @return the code unit at offset <tt>offset</tt>
+ * @return the code unit at offset `offset`
* @stable ICU 2.0
*/
inline char16_t operator[] (int32_t offset) const;
/**
* Return the code point that contains the code unit
- * at offset <tt>offset</tt>.
+ * at offset `offset`.
* If the offset is not valid (0..length()-1) then U+ffff is returned.
* @param offset a valid offset into the text
* that indicates the text offset of any of the code units
* that will be assembled into a code point (21-bit value) and returned
- * @return the code point of text at <tt>offset</tt>
+ * @return the code point of text at `offset`
* or 0xffff if the offset is not valid for this string
* @stable ICU 2.0
*/
@@ -1398,33 +1403,33 @@ public:
* This behaves like CharacterIterator::move32(delta, kCurrent).
*
* Behavior for out-of-bounds indexes:
- * <code>moveIndex32</code> pins the input index to 0..length(), i.e.,
+ * `moveIndex32` pins the input index to 0..length(), i.e.,
* if the input index<0 then it is pinned to 0;
* if it is index>length() then it is pinned to length().
- * Afterwards, the index is moved by <code>delta</code> code points
+ * Afterwards, the index is moved by `delta` code points
* forward or backward,
* but no further backward than to 0 and no further forward than to length().
* The resulting index return value will be in between 0 and length(), inclusively.
*
* Examples:
- * <pre>
- * // s has code points 'a' U+10000 'b' U+10ffff U+2029
- * UnicodeString s=UNICODE_STRING("a\\U00010000b\\U0010ffff\\u2029", 31).unescape();
+ * \code
+ * // s has code points 'a' U+10000 'b' U+10ffff U+2029
+ * UnicodeString s(u"a\U00010000b\U0010ffff\u2029");
*
- * // initial index: position of U+10000
- * int32_t index=1;
+ * // initial index: position of U+10000
+ * int32_t index=1;
*
- * // the following examples will all result in index==4, position of U+10ffff
+ * // the following examples will all result in index==4, position of U+10ffff
*
- * // skip 2 code points from some position in the string
- * index=s.moveIndex32(index, 2); // skips U+10000 and 'b'
+ * // skip 2 code points from some position in the string
+ * index=s.moveIndex32(index, 2); // skips U+10000 and 'b'
*
- * // go to the 3rd code point from the start of s (0-based)
- * index=s.moveIndex32(0, 3); // skips 'a', U+10000, and 'b'
+ * // go to the 3rd code point from the start of s (0-based)
+ * index=s.moveIndex32(0, 3); // skips 'a', U+10000, and 'b'
*
- * // go to the next-to-last code point of s
- * index=s.moveIndex32(s.length(), -2); // backward-skips U+2029 and U+10ffff
- * </pre>
+ * // go to the next-to-last code point of s
+ * index=s.moveIndex32(s.length(), -2); // backward-skips U+2029 and U+10ffff
+ * \endcode
*
* @param index input code unit index
* @param delta (signed) code point count to move the index forward or backward
@@ -1438,16 +1443,16 @@ public:
/**
* Copy the characters in the range
- * [<tt>start</tt>, <tt>start + length</tt>) into the array <tt>dst</tt>,
- * beginning at <tt>dstStart</tt>.
- * If the string aliases to <code>dst</code> itself as an external buffer,
+ * [`start`, `start + length`) into the array `dst`,
+ * beginning at `dstStart`.
+ * If the string aliases to `dst` itself as an external buffer,
* then extract() will not copy the contents.
*
* @param start offset of first character which will be copied into the array
* @param length the number of characters to extract
- * @param dst array in which to copy characters. The length of <tt>dst</tt>
- * must be at least (<tt>dstStart + length</tt>).
- * @param dstStart the offset in <TT>dst</TT> where the first character
+ * @param dst array in which to copy characters. The length of `dst`
+ * must be at least (`dstStart + length`).
+ * @param dstStart the offset in `dst` where the first character
* will be extracted
* @stable ICU 2.0
*/
@@ -1468,7 +1473,7 @@ public:
* If the string itself does not fit into dest
* (length()>destCapacity) then the error code is set to U_BUFFER_OVERFLOW_ERROR.
*
- * If the string aliases to <code>dest</code> itself as an external buffer,
+ * If the string aliases to `dest` itself as an external buffer,
* then extract() will not copy the contents.
*
* @param dest Destination string buffer.
@@ -1483,12 +1488,11 @@ public:
/**
* Copy the characters in the range
- * [<tt>start</tt>, <tt>start + length</tt>) into the UnicodeString
- * <tt>target</tt>.
+ * [`start`, `start + length`) into the UnicodeString
+ * `target`.
* @param start offset of first character which will be copied
* @param length the number of characters to extract
* @param target UnicodeString into which to copy characters.
- * @return A reference to <TT>target</TT>
* @stable ICU 2.0
*/
inline void extract(int32_t start,
@@ -1496,13 +1500,13 @@ public:
UnicodeString& target) const;
/**
- * Copy the characters in the range [<tt>start</tt>, <tt>limit</tt>)
- * into the array <tt>dst</tt>, beginning at <tt>dstStart</tt>.
+ * Copy the characters in the range [`start`, `limit`)
+ * into the array `dst`, beginning at `dstStart`.
* @param start offset of first character which will be copied into the array
* @param limit offset immediately following the last character to be copied
- * @param dst array in which to copy characters. The length of <tt>dst</tt>
- * must be at least (<tt>dstStart + (limit - start)</tt>).
- * @param dstStart the offset in <TT>dst</TT> where the first character
+ * @param dst array in which to copy characters. The length of `dst`
+ * must be at least (`dstStart + (limit - start)`).
+ * @param dstStart the offset in `dst` where the first character
* will be extracted
* @stable ICU 2.0
*/
@@ -1512,12 +1516,11 @@ public:
int32_t dstStart = 0) const;
/**
- * Copy the characters in the range [<tt>start</tt>, <tt>limit</tt>)
- * into the UnicodeString <tt>target</tt>. Replaceable API.
+ * Copy the characters in the range [`start`, `limit`)
+ * into the UnicodeString `target`. Replaceable API.
* @param start offset of first character which will be copied
* @param limit offset immediately following the last character to be copied
* @param target UnicodeString into which to copy characters.
- * @return A reference to <TT>target</TT>
* @stable ICU 2.0
*/
virtual void extractBetween(int32_t start,
@@ -1526,11 +1529,11 @@ public:
/**
* Copy the characters in the range
- * [<tt>start</TT>, <tt>start + startLength</TT>) into an array of characters.
+ * [`start`, `start + startLength`) into an array of characters.
* All characters must be invariant (see utypes.h).
* Use US_INV as the last, signature-distinguishing parameter.
*
- * This function does not write any more than <code>targetCapacity</code>
+ * This function does not write any more than `targetCapacity`
* characters but returns the length of the entire output string
* so that one can allocate a larger buffer and call the function again
* if necessary.
@@ -1555,9 +1558,9 @@ public:
/**
* Copy the characters in the range
- * [<tt>start</TT>, <tt>start + length</TT>) into an array of characters
+ * [`start`, `start + length`) into an array of characters
* in the platform's default codepage.
- * This function does not write any more than <code>targetLength</code>
+ * This function does not write any more than `targetLength`
* characters but returns the length of the entire output string
* so that one can allocate a larger buffer and call the function again
* if necessary.
@@ -1567,8 +1570,8 @@ public:
* @param startLength the number of characters to extract
* @param target the target buffer for extraction
* @param targetLength the length of the target buffer
- * If <TT>target</TT> is NULL, then the number of bytes required for
- * <TT>target</TT> is returned.
+ * If `target` is NULL, then the number of bytes required for
+ * `target` is returned.
* @return the output string length, not including the terminating NUL
* @stable ICU 2.0
*/
@@ -1583,7 +1586,7 @@ public:
/**
* Copy the characters in the range
- * [<tt>start</TT>, <tt>start + length</TT>) into an array of characters
+ * [`start`, `start + length`) into an array of characters
* in a specified codepage.
* The output string is NUL-terminated.
*
@@ -1597,11 +1600,11 @@ public:
* @param target the target buffer for extraction
* @param codepage the desired codepage for the characters. 0 has
* the special meaning of the default codepage
- * If <code>codepage</code> is an empty string (<code>""</code>),
+ * If `codepage` is an empty string (`""`),
* then a simple conversion is performed on the codepage-invariant
* subset ("invariant characters") of the platform encoding. See utypes.h.
- * If <TT>target</TT> is NULL, then the number of bytes required for
- * <TT>target</TT> is returned. It is assumed that the target is big enough
+ * If `target` is NULL, then the number of bytes required for
+ * `target` is returned. It is assumed that the target is big enough
* to fit all of the characters.
* @return the output string length, not including the terminating NUL
* @stable ICU 2.0
@@ -1613,9 +1616,9 @@ public:
/**
* Copy the characters in the range
- * [<tt>start</TT>, <tt>start + length</TT>) into an array of characters
+ * [`start`, `start + length`) into an array of characters
* in a specified codepage.
- * This function does not write any more than <code>targetLength</code>
+ * This function does not write any more than `targetLength`
* characters but returns the length of the entire output string
* so that one can allocate a larger buffer and call the function again
* if necessary.
@@ -1632,11 +1635,11 @@ public:
* @param targetLength the length of the target buffer
* @param codepage the desired codepage for the characters. 0 has
* the special meaning of the default codepage
- * If <code>codepage</code> is an empty string (<code>""</code>),
+ * If `codepage` is an empty string (`""`),
* then a simple conversion is performed on the codepage-invariant
* subset ("invariant characters") of the platform encoding. See utypes.h.
- * If <TT>target</TT> is NULL, then the number of bytes required for
- * <TT>target</TT> is returned.
+ * If `target` is NULL, then the number of bytes required for
+ * `target` is returned.
* @return the output string length, not including the terminating NUL
* @stable ICU 2.0
*/
@@ -1849,7 +1852,7 @@ public:
/**
* Assignment operator. Replace the characters in this UnicodeString
- * with the characters from <TT>srcText</TT>.
+ * with the characters from `srcText`.
*
* Starting with ICU 2.4, the assignment operator and the copy constructor
* allocate a new buffer and copy the buffer contents even for readonly aliases.
@@ -1870,7 +1873,7 @@ public:
/**
* Almost the same as the assignment operator.
* Replace the characters in this UnicodeString
- * with the characters from <code>srcText</code>.
+ * with the characters from `srcText`.
*
* This function works the same as the assignment operator
* for all strings except for ones that are readonly aliases.
@@ -1902,22 +1905,7 @@ public:
* @return *this
* @stable ICU 56
*/
- UnicodeString &operator=(UnicodeString &&src) U_NOEXCEPT {
- return moveFrom(src);
- }
-
- // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API
- /**
- * Move assignment; might leave src in bogus state.
- * This string will have the same contents and state that the source string had.
- * The behavior is undefined if *this and src are the same object.
- *
- * Can be called explicitly, does not need C++11 support.
- * @param src source string
- * @return *this
- * @draft ICU 56
- */
- UnicodeString &moveFrom(UnicodeString &src) U_NOEXCEPT;
+ UnicodeString &operator=(UnicodeString &&src) U_NOEXCEPT;
/**
* Swap strings.
@@ -1932,14 +1920,14 @@ public:
* @param s2 will get s1's contents and state
* @stable ICU 56
*/
- friend U_COMMON_API inline void U_EXPORT2
+ friend inline void U_EXPORT2
swap(UnicodeString &s1, UnicodeString &s2) U_NOEXCEPT {
s1.swap(s2);
}
/**
* Assignment operator. Replace the characters in this UnicodeString
- * with the code unit <TT>ch</TT>.
+ * with the code unit `ch`.
* @param ch the code unit to replace
* @return a reference to this
* @stable ICU 2.0
@@ -1948,7 +1936,7 @@ public:
/**
* Assignment operator. Replace the characters in this UnicodeString
- * with the code point <TT>ch</TT>.
+ * with the code point `ch`.
* @param ch the code point to replace
* @return a reference to this
* @stable ICU 2.0
@@ -1957,11 +1945,11 @@ public:
/**
* Set the text in the UnicodeString object to the characters
- * in <TT>srcText</TT> in the range
- * [<TT>srcStart</TT>, <TT>srcText.length()</TT>).
- * <TT>srcText</TT> is not modified.
+ * in `srcText` in the range
+ * [`srcStart`, `srcText.length()`).
+ * `srcText` is not modified.
* @param srcText the source for the new characters
- * @param srcStart the offset into <TT>srcText</TT> where new characters
+ * @param srcStart the offset into `srcText` where new characters
* will be obtained
* @return a reference to this
* @stable ICU 2.2
@@ -1971,13 +1959,13 @@ public:
/**
* Set the text in the UnicodeString object to the characters
- * in <TT>srcText</TT> in the range
- * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>).
- * <TT>srcText</TT> is not modified.
+ * in `srcText` in the range
+ * [`srcStart`, `srcStart + srcLength`).
+ * `srcText` is not modified.
* @param srcText the source for the new characters
- * @param srcStart the offset into <TT>srcText</TT> where new characters
+ * @param srcStart the offset into `srcText` where new characters
* will be obtained
- * @param srcLength the number of characters in <TT>srcText</TT> in the
+ * @param srcLength the number of characters in `srcText` in the
* replace string.
* @return a reference to this
* @stable ICU 2.0
@@ -1988,8 +1976,8 @@ public:
/**
* Set the text in the UnicodeString object to the characters in
- * <TT>srcText</TT>.
- * <TT>srcText</TT> is not modified.
+ * `srcText`.
+ * `srcText` is not modified.
* @param srcText the source for the new characters
* @return a reference to this
* @stable ICU 2.0
@@ -1998,7 +1986,7 @@ public:
/**
* Set the characters in the UnicodeString object to the characters
- * in <TT>srcChars</TT>. <TT>srcChars</TT> is not modified.
+ * in `srcChars`. `srcChars` is not modified.
* @param srcChars the source for the new characters
* @param srcLength the number of Unicode characters in srcChars.
* @return a reference to this
@@ -2009,23 +1997,23 @@ public:
/**
* Set the characters in the UnicodeString object to the code unit
- * <TT>srcChar</TT>.
+ * `srcChar`.
* @param srcChar the code unit which becomes the UnicodeString's character
* content
* @return a reference to this
* @stable ICU 2.0
*/
- UnicodeString& setTo(char16_t srcChar);
+ inline UnicodeString& setTo(char16_t srcChar);
/**
* Set the characters in the UnicodeString object to the code point
- * <TT>srcChar</TT>.
+ * `srcChar`.
* @param srcChar the code point which becomes the UnicodeString's character
* content
* @return a reference to this
* @stable ICU 2.0
*/
- UnicodeString& setTo(UChar32 srcChar);
+ inline UnicodeString& setTo(UChar32 srcChar);
/**
* Aliasing setTo() function, analogous to the readonly-aliasing char16_t* constructor.
@@ -2041,12 +2029,12 @@ public:
* When using fastCopyFrom(), the text will be aliased again,
* so that both strings then alias the same readonly-text.
*
- * @param isTerminated specifies if <code>text</code> is <code>NUL</code>-terminated.
- * This must be true if <code>textLength==-1</code>.
+ * @param isTerminated specifies if `text` is `NUL`-terminated.
+ * This must be true if `textLength==-1`.
* @param text The characters to alias for the UnicodeString.
- * @param textLength The number of Unicode characters in <code>text</code> to alias.
+ * @param textLength The number of Unicode characters in `text` to alias.
* If -1, then this constructor will determine the length
- * by calling <code>u_strlen()</code>.
+ * by calling `u_strlen()`.
* @return a reference to this
* @stable ICU 2.0
*/
@@ -2068,8 +2056,8 @@ public:
* as the string buffer itself and will in this case not copy the contents.
*
* @param buffer The characters to alias for the UnicodeString.
- * @param buffLength The number of Unicode characters in <code>buffer</code> to alias.
- * @param buffCapacity The size of <code>buffer</code> in char16_ts.
+ * @param buffLength The number of Unicode characters in `buffer` to alias.
+ * @param buffCapacity The size of `buffer` in char16_ts.
* @return a reference to this
* @stable ICU 2.0
*/
@@ -2109,8 +2097,7 @@ public:
* s.truncate(0); // set to an empty string (complete truncation), or
* s=UnicodeString(); // assign an empty string, or
* s.setTo((UChar32)-1); // set to a pseudo code point that is out of range, or
- * static const char16_t nul=0;
- * s.setTo(&nul, 0); // set to an empty C Unicode string
+ * s.setTo(u"", 0); // set to an empty C Unicode string
* }
* \endcode
*
@@ -2133,7 +2120,7 @@ public:
/* Append operations */
/**
- * Append operator. Append the code unit <TT>ch</TT> to the UnicodeString
+ * Append operator. Append the code unit `ch` to the UnicodeString
* object.
* @param ch the code unit to be appended
* @return a reference to this
@@ -2142,7 +2129,7 @@ public:
inline UnicodeString& operator+= (char16_t ch);
/**
- * Append operator. Append the code point <TT>ch</TT> to the UnicodeString
+ * Append operator. Append the code point `ch` to the UnicodeString
* object.
* @param ch the code point to be appended
* @return a reference to this
@@ -2151,8 +2138,8 @@ public:
inline UnicodeString& operator+= (UChar32 ch);
/**
- * Append operator. Append the characters in <TT>srcText</TT> to the
- * UnicodeString object. <TT>srcText</TT> is not modified.
+ * Append operator. Append the characters in `srcText` to the
+ * UnicodeString object. `srcText` is not modified.
* @param srcText the source for the new characters
* @return a reference to this
* @stable ICU 2.0
@@ -2161,14 +2148,14 @@ public:
/**
* Append the characters
- * in <TT>srcText</TT> in the range
- * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>) to the
- * UnicodeString object at offset <TT>start</TT>. <TT>srcText</TT>
+ * in `srcText` in the range
+ * [`srcStart`, `srcStart + srcLength`) to the
+ * UnicodeString object at offset `start`. `srcText`
* is not modified.
* @param srcText the source for the new characters
- * @param srcStart the offset into <TT>srcText</TT> where new characters
+ * @param srcStart the offset into `srcText` where new characters
* will be obtained
- * @param srcLength the number of characters in <TT>srcText</TT> in
+ * @param srcLength the number of characters in `srcText` in
* the append string
* @return a reference to this
* @stable ICU 2.0
@@ -2178,8 +2165,8 @@ public:
int32_t srcLength);
/**
- * Append the characters in <TT>srcText</TT> to the UnicodeString object.
- * <TT>srcText</TT> is not modified.
+ * Append the characters in `srcText` to the UnicodeString object.
+ * `srcText` is not modified.
* @param srcText the source for the new characters
* @return a reference to this
* @stable ICU 2.0
@@ -2187,15 +2174,15 @@ public:
inline UnicodeString& append(const UnicodeString& srcText);
/**
- * Append the characters in <TT>srcChars</TT> in the range
- * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>) to the UnicodeString
+ * Append the characters in `srcChars` in the range
+ * [`srcStart`, `srcStart + srcLength`) to the UnicodeString
* object at offset
- * <TT>start</TT>. <TT>srcChars</TT> is not modified.
+ * `start`. `srcChars` is not modified.
* @param srcChars the source for the new characters
- * @param srcStart the offset into <TT>srcChars</TT> where new characters
+ * @param srcStart the offset into `srcChars` where new characters
* will be obtained
- * @param srcLength the number of characters in <TT>srcChars</TT> in
- * the append string; can be -1 if <TT>srcChars</TT> is NUL-terminated
+ * @param srcLength the number of characters in `srcChars` in
+ * the append string; can be -1 if `srcChars` is NUL-terminated
* @return a reference to this
* @stable ICU 2.0
*/
@@ -2204,11 +2191,11 @@ public:
int32_t srcLength);
/**
- * Append the characters in <TT>srcChars</TT> to the UnicodeString object
- * at offset <TT>start</TT>. <TT>srcChars</TT> is not modified.
+ * Append the characters in `srcChars` to the UnicodeString object
+ * at offset `start`. `srcChars` is not modified.
* @param srcChars the source for the new characters
- * @param srcLength the number of Unicode characters in <TT>srcChars</TT>;
- * can be -1 if <TT>srcChars</TT> is NUL-terminated
+ * @param srcLength the number of Unicode characters in `srcChars`;
+ * can be -1 if `srcChars` is NUL-terminated
* @return a reference to this
* @stable ICU 2.0
*/
@@ -2216,7 +2203,7 @@ public:
int32_t srcLength);
/**
- * Append the code unit <TT>srcChar</TT> to the UnicodeString object.
+ * Append the code unit `srcChar` to the UnicodeString object.
* @param srcChar the code unit to append
* @return a reference to this
* @stable ICU 2.0
@@ -2224,7 +2211,7 @@ public:
inline UnicodeString& append(char16_t srcChar);
/**
- * Append the code point <TT>srcChar</TT> to the UnicodeString object.
+ * Append the code point `srcChar` to the UnicodeString object.
* @param srcChar the code point to append
* @return a reference to this
* @stable ICU 2.0
@@ -2235,14 +2222,14 @@ public:
/* Insert operations */
/**
- * Insert the characters in <TT>srcText</TT> in the range
- * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>) into the UnicodeString
- * object at offset <TT>start</TT>. <TT>srcText</TT> is not modified.
+ * Insert the characters in `srcText` in the range
+ * [`srcStart`, `srcStart + srcLength`) into the UnicodeString
+ * object at offset `start`. `srcText` is not modified.
* @param start the offset where the insertion begins
* @param srcText the source for the new characters
- * @param srcStart the offset into <TT>srcText</TT> where new characters
+ * @param srcStart the offset into `srcText` where new characters
* will be obtained
- * @param srcLength the number of characters in <TT>srcText</TT> in
+ * @param srcLength the number of characters in `srcText` in
* the insert string
* @return a reference to this
* @stable ICU 2.0
@@ -2253,8 +2240,8 @@ public:
int32_t srcLength);
/**
- * Insert the characters in <TT>srcText</TT> into the UnicodeString object
- * at offset <TT>start</TT>. <TT>srcText</TT> is not modified.
+ * Insert the characters in `srcText` into the UnicodeString object
+ * at offset `start`. `srcText` is not modified.
* @param start the offset where the insertion begins
* @param srcText the source for the new characters
* @return a reference to this
@@ -2264,14 +2251,14 @@ public:
const UnicodeString& srcText);
/**
- * Insert the characters in <TT>srcChars</TT> in the range
- * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>) into the UnicodeString
- * object at offset <TT>start</TT>. <TT>srcChars</TT> is not modified.
+ * Insert the characters in `srcChars` in the range
+ * [`srcStart`, `srcStart + srcLength`) into the UnicodeString
+ * object at offset `start`. `srcChars` is not modified.
* @param start the offset at which the insertion begins
* @param srcChars the source for the new characters
- * @param srcStart the offset into <TT>srcChars</TT> where new characters
+ * @param srcStart the offset into `srcChars` where new characters
* will be obtained
- * @param srcLength the number of characters in <TT>srcChars</TT>
+ * @param srcLength the number of characters in `srcChars`
* in the insert string
* @return a reference to this
* @stable ICU 2.0
@@ -2282,8 +2269,8 @@ public:
int32_t srcLength);
/**
- * Insert the characters in <TT>srcChars</TT> into the UnicodeString object
- * at offset <TT>start</TT>. <TT>srcChars</TT> is not modified.
+ * Insert the characters in `srcChars` into the UnicodeString object
+ * at offset `start`. `srcChars` is not modified.
* @param start the offset where the insertion begins
* @param srcChars the source for the new characters
* @param srcLength the number of Unicode characters in srcChars.
@@ -2295,8 +2282,8 @@ public:
int32_t srcLength);
/**
- * Insert the code unit <TT>srcChar</TT> into the UnicodeString object at
- * offset <TT>start</TT>.
+ * Insert the code unit `srcChar` into the UnicodeString object at
+ * offset `start`.
* @param start the offset at which the insertion occurs
* @param srcChar the code unit to insert
* @return a reference to this
@@ -2306,8 +2293,8 @@ public:
char16_t srcChar);
/**
- * Insert the code point <TT>srcChar</TT> into the UnicodeString object at
- * offset <TT>start</TT>.
+ * Insert the code point `srcChar` into the UnicodeString object at
+ * offset `start`.
* @param start the offset at which the insertion occurs
* @param srcChar the code point to insert
* @return a reference to this
@@ -2321,22 +2308,22 @@ public:
/**
* Replace the characters in the range
- * [<TT>start</TT>, <TT>start + length</TT>) with the characters in
- * <TT>srcText</TT> in the range
- * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>).
- * <TT>srcText</TT> is not modified.
+ * [`start`, `start + length`) with the characters in
+ * `srcText` in the range
+ * [`srcStart`, `srcStart + srcLength`).
+ * `srcText` is not modified.
* @param start the offset at which the replace operation begins
* @param length the number of characters to replace. The character at
- * <TT>start + length</TT> is not modified.
+ * `start + length` is not modified.
* @param srcText the source for the new characters
- * @param srcStart the offset into <TT>srcText</TT> where new characters
+ * @param srcStart the offset into `srcText` where new characters
* will be obtained
- * @param srcLength the number of characters in <TT>srcText</TT> in
+ * @param srcLength the number of characters in `srcText` in
* the replace string
* @return a reference to this
* @stable ICU 2.0
*/
- UnicodeString& replace(int32_t start,
+ inline UnicodeString& replace(int32_t start,
int32_t length,
const UnicodeString& srcText,
int32_t srcStart,
@@ -2344,38 +2331,38 @@ public:
/**
* Replace the characters in the range
- * [<TT>start</TT>, <TT>start + length</TT>)
- * with the characters in <TT>srcText</TT>. <TT>srcText</TT> is
+ * [`start`, `start + length`)
+ * with the characters in `srcText`. `srcText` is
* not modified.
* @param start the offset at which the replace operation begins
* @param length the number of characters to replace. The character at
- * <TT>start + length</TT> is not modified.
+ * `start + length` is not modified.
* @param srcText the source for the new characters
* @return a reference to this
* @stable ICU 2.0
*/
- UnicodeString& replace(int32_t start,
+ inline UnicodeString& replace(int32_t start,
int32_t length,
const UnicodeString& srcText);
/**
* Replace the characters in the range
- * [<TT>start</TT>, <TT>start + length</TT>) with the characters in
- * <TT>srcChars</TT> in the range
- * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>). <TT>srcChars</TT>
+ * [`start`, `start + length`) with the characters in
+ * `srcChars` in the range
+ * [`srcStart`, `srcStart + srcLength`). `srcChars`
* is not modified.
* @param start the offset at which the replace operation begins
* @param length the number of characters to replace. The character at
- * <TT>start + length</TT> is not modified.
+ * `start + length` is not modified.
* @param srcChars the source for the new characters
- * @param srcStart the offset into <TT>srcChars</TT> where new characters
+ * @param srcStart the offset into `srcChars` where new characters
* will be obtained
- * @param srcLength the number of characters in <TT>srcChars</TT>
+ * @param srcLength the number of characters in `srcChars`
* in the replace string
* @return a reference to this
* @stable ICU 2.0
*/
- UnicodeString& replace(int32_t start,
+ inline UnicodeString& replace(int32_t start,
int32_t length,
const char16_t *srcChars,
int32_t srcStart,
@@ -2383,11 +2370,11 @@ public:
/**
* Replace the characters in the range
- * [<TT>start</TT>, <TT>start + length</TT>) with the characters in
- * <TT>srcChars</TT>. <TT>srcChars</TT> is not modified.
+ * [`start`, `start + length`) with the characters in
+ * `srcChars`. `srcChars` is not modified.
* @param start the offset at which the replace operation begins
* @param length number of characters to replace. The character at
- * <TT>start + length</TT> is not modified.
+ * `start + length` is not modified.
* @param srcChars the source for the new characters
* @param srcLength the number of Unicode characters in srcChars
* @return a reference to this
@@ -2400,11 +2387,11 @@ public:
/**
* Replace the characters in the range
- * [<TT>start</TT>, <TT>start + length</TT>) with the code unit
- * <TT>srcChar</TT>.
+ * [`start`, `start + length`) with the code unit
+ * `srcChar`.
* @param start the offset at which the replace operation begins
* @param length the number of characters to replace. The character at
- * <TT>start + length</TT> is not modified.
+ * `start + length` is not modified.
* @param srcChar the new code unit
* @return a reference to this
* @stable ICU 2.0
@@ -2415,11 +2402,11 @@ public:
/**
* Replace the characters in the range
- * [<TT>start</TT>, <TT>start + length</TT>) with the code point
- * <TT>srcChar</TT>.
+ * [`start`, `start + length`) with the code point
+ * `srcChar`.
* @param start the offset at which the replace operation begins
* @param length the number of characters to replace. The character at
- * <TT>start + length</TT> is not modified.
+ * `start + length` is not modified.
* @param srcChar the new code point
* @return a reference to this
* @stable ICU 2.0
@@ -2427,8 +2414,8 @@ public:
UnicodeString& replace(int32_t start, int32_t length, UChar32 srcChar);
/**
- * Replace the characters in the range [<TT>start</TT>, <TT>limit</TT>)
- * with the characters in <TT>srcText</TT>. <TT>srcText</TT> is not modified.
+ * Replace the characters in the range [`start`, `limit`)
+ * with the characters in `srcText`. `srcText` is not modified.
* @param start the offset at which the replace operation begins
* @param limit the offset immediately following the replace range
* @param srcText the source for the new characters
@@ -2440,16 +2427,16 @@ public:
const UnicodeString& srcText);
/**
- * Replace the characters in the range [<TT>start</TT>, <TT>limit</TT>)
- * with the characters in <TT>srcText</TT> in the range
- * [<TT>srcStart</TT>, <TT>srcLimit</TT>). <TT>srcText</TT> is not modified.
+ * Replace the characters in the range [`start`, `limit`)
+ * with the characters in `srcText` in the range
+ * [`srcStart`, `srcLimit`). `srcText` is not modified.
* @param start the offset at which the replace operation begins
* @param limit the offset immediately following the replace range
* @param srcText the source for the new characters
- * @param srcStart the offset into <TT>srcChars</TT> where new characters
+ * @param srcStart the offset into `srcChars` where new characters
* will be obtained
* @param srcLimit the offset immediately following the range to copy
- * in <TT>srcText</TT>
+ * in `srcText`
* @return a reference to this
* @stable ICU 2.0
*/
@@ -2461,12 +2448,9 @@ public:
/**
* Replace a substring of this object with the given text.
- * @param start the beginning index, inclusive; <code>0 <= start
- * <= limit</code>.
- * @param limit the ending index, exclusive; <code>start <= limit
- * <= length()</code>.
- * @param text the text to replace characters <code>start</code>
- * to <code>limit - 1</code>
+ * @param start the beginning index, inclusive; `0 <= start <= limit`.
+ * @param limit the ending index, exclusive; `start <= limit <= length()`.
+ * @param text the text to replace characters `start` to `limit - 1`
* @stable ICU 2.0
*/
virtual void handleReplaceBetween(int32_t start,
@@ -2485,14 +2469,12 @@ public:
* information. This method is used to duplicate or reorder substrings.
* The destination index must not overlap the source range.
*
- * @param start the beginning index, inclusive; <code>0 <= start <=
- * limit</code>.
- * @param limit the ending index, exclusive; <code>start <= limit <=
- * length()</code>.
+ * @param start the beginning index, inclusive; `0 <= start <= limit`.
+ * @param limit the ending index, exclusive; `start <= limit <= length()`.
* @param dest the destination index. The characters from
- * <code>start..limit-1</code> will be copied to <code>dest</code>.
- * Implementations of this method may assume that <code>dest <= start ||
- * dest >= limit</code>.
+ * `start..limit-1` will be copied to `dest`.
+ * Implementations of this method may assume that `dest <= start ||
+ * dest >= limit`.
* @stable ICU 2.0
*/
virtual void copy(int32_t start, int32_t limit, int32_t dest);
@@ -2513,7 +2495,7 @@ public:
/**
* Replace all occurrences of characters in oldText with characters
* in newText
- * in the range [<TT>start</TT>, <TT>start + length</TT>).
+ * in the range [`start`, `start + length`).
* @param start the start of the range in which replace will performed
* @param length the length of the range in which replace will be performed
* @param oldText the text containing the search text
@@ -2528,18 +2510,18 @@ public:
/**
* Replace all occurrences of characters in oldText in the range
- * [<TT>oldStart</TT>, <TT>oldStart + oldLength</TT>) with the characters
+ * [`oldStart`, `oldStart + oldLength`) with the characters
* in newText in the range
- * [<TT>newStart</TT>, <TT>newStart + newLength</TT>)
- * in the range [<TT>start</TT>, <TT>start + length</TT>).
+ * [`newStart`, `newStart + newLength`)
+ * in the range [`start`, `start + length`).
* @param start the start of the range in which replace will performed
* @param length the length of the range in which replace will be performed
* @param oldText the text containing the search text
- * @param oldStart the start of the search range in <TT>oldText</TT>
- * @param oldLength the length of the search range in <TT>oldText</TT>
+ * @param oldStart the start of the search range in `oldText`
+ * @param oldLength the length of the search range in `oldText`
* @param newText the text containing the replacement text
- * @param newStart the start of the replacement range in <TT>newText</TT>
- * @param newLength the length of the replacement range in <TT>newText</TT>
+ * @param newStart the start of the replacement range in `newText`
+ * @param newLength the length of the replacement range in `newText`
* @return a reference to this
* @stable ICU 2.0
*/
@@ -2556,15 +2538,18 @@ public:
/* Remove operations */
/**
- * Remove all characters from the UnicodeString object.
+ * Removes all characters from the UnicodeString object and clears the bogus flag.
+ * This is the UnicodeString equivalent of std::string’s clear().
+ *
* @return a reference to this
+ * @see setToBogus
* @stable ICU 2.0
*/
- inline UnicodeString& remove(void);
+ inline UnicodeString& remove();
/**
* Remove the characters in the range
- * [<TT>start</TT>, <TT>start + length</TT>) from the UnicodeString object.
+ * [`start`, `start + length`) from the UnicodeString object.
* @param start the offset of the first character to remove
* @param length the number of characters to remove
* @return a reference to this
@@ -2575,7 +2560,7 @@ public:
/**
* Remove the characters in the range
- * [<TT>start</TT>, <TT>limit</TT>) from the UnicodeString object.
+ * [`start`, `limit`) from the UnicodeString object.
* @param start the offset of the first character to remove
* @param limit the offset immediately following the range to remove
* @return a reference to this
@@ -2586,8 +2571,8 @@ public:
/**
* Retain only the characters in the range
- * [<code>start</code>, <code>limit</code>) from the UnicodeString object.
- * Removes characters before <code>start</code> and at and after <code>limit</code>.
+ * [`start`, `limit`) from the UnicodeString object.
+ * Removes characters before `start` and at and after `limit`.
* @param start the offset of the first character to retain
* @param limit the offset immediately following the range to retain
* @return a reference to this
@@ -2598,7 +2583,7 @@ public:
/* Length operations */
/**
- * Pad the start of this UnicodeString with the character <TT>padChar</TT>.
+ * Pad the start of this UnicodeString with the character `padChar`.
* If the length of this UnicodeString is less than targetLength,
* length() - targetLength copies of padChar will be added to the
* beginning of this UnicodeString.
@@ -2612,7 +2597,7 @@ public:
char16_t padChar = 0x0020);
/**
- * Pad the end of this UnicodeString with the character <TT>padChar</TT>.
+ * Pad the end of this UnicodeString with the character `padChar`.
* If the length of this UnicodeString is less than targetLength,
* length() - targetLength copies of padChar will be added to the
* end of this UnicodeString.
@@ -2626,7 +2611,7 @@ public:
char16_t padChar = 0x0020);
/**
- * Truncate this UnicodeString to the <TT>targetLength</TT>.
+ * Truncate this UnicodeString to the `targetLength`.
* @param targetLength the desired length of this UnicodeString.
* @return TRUE if the text was truncated, FALSE otherwise
* @stable ICU 2.0
@@ -2651,7 +2636,7 @@ public:
inline UnicodeString& reverse(void);
/**
- * Reverse the range [<TT>start</TT>, <TT>start + length</TT>) in
+ * Reverse the range [`start`, `start + length`) in
* this UnicodeString.
* @param start the start of the range to reverse
* @param length the number of characters to to reverse
@@ -2836,7 +2821,7 @@ public:
* If the length() was greater than minCapacity, then any contents after minCapacity
* may be lost.
* The buffer contents is not NUL-terminated by getBuffer().
- * If length()<getCapacity() then you can terminate it by writing a NUL
+ * If length() < getCapacity() then you can terminate it by writing a NUL
* at index length().
* - You must call releaseBuffer(newLength) before and in order to
* return to normal UnicodeString operation.
@@ -2892,7 +2877,7 @@ public:
*
* The buffer contents is (probably) not NUL-terminated.
* You can check if it is with
- * <code>(s.length()<s.getCapacity() && buffer[s.length()]==0)</code>.
+ * `(s.length() < s.getCapacity() && buffer[s.length()]==0)`.
* (See getTerminatedBuffer().)
*
* The buffer may reside in read-only memory. Its contents must not
@@ -2952,7 +2937,7 @@ public:
inline UnicodeString();
/**
- * Construct a UnicodeString with capacity to hold <TT>capacity</TT> char16_ts
+ * Construct a UnicodeString with capacity to hold `capacity` char16_ts
* @param capacity the number of char16_ts this UnicodeString should hold
* before a resize is necessary; if count is greater than 0 and count
* code points c take up more space than capacity, then capacity is adjusted
@@ -2968,7 +2953,7 @@ public:
* Single char16_t (code unit) constructor.
*
* It is recommended to mark this constructor "explicit" by
- * <code>-DUNISTR_FROM_CHAR_EXPLICIT=explicit</code>
+ * `-DUNISTR_FROM_CHAR_EXPLICIT=explicit`
* on the compiler command line or similar.
* @param ch the character to place in the UnicodeString
* @stable ICU 2.0
@@ -2979,7 +2964,7 @@ public:
* Single UChar32 (code point) constructor.
*
* It is recommended to mark this constructor "explicit" by
- * <code>-DUNISTR_FROM_CHAR_EXPLICIT=explicit</code>
+ * `-DUNISTR_FROM_CHAR_EXPLICIT=explicit`
* on the compiler command line or similar.
* @param ch the character to place in the UnicodeString
* @stable ICU 2.0
@@ -2990,9 +2975,9 @@ public:
* char16_t* constructor.
*
* It is recommended to mark this constructor "explicit" by
- * <code>-DUNISTR_FROM_STRING_EXPLICIT=explicit</code>
+ * `-DUNISTR_FROM_STRING_EXPLICIT=explicit`
* on the compiler command line or similar.
- * @param text The characters to place in the UnicodeString. <TT>text</TT>
+ * @param text The characters to place in the UnicodeString. `text`
* must be NULL (U+0000) terminated.
* @stable ICU 2.0
*/
@@ -3004,7 +2989,7 @@ public:
* Delegates to UnicodeString(const char16_t *).
*
* It is recommended to mark this constructor "explicit" by
- * <code>-DUNISTR_FROM_STRING_EXPLICIT=explicit</code>
+ * `-DUNISTR_FROM_STRING_EXPLICIT=explicit`
* on the compiler command line or similar.
* @param text NUL-terminated UTF-16 string
* @stable ICU 59
@@ -3020,7 +3005,7 @@ public:
* Delegates to UnicodeString(const char16_t *).
*
* It is recommended to mark this constructor "explicit" by
- * <code>-DUNISTR_FROM_STRING_EXPLICIT=explicit</code>
+ * `-DUNISTR_FROM_STRING_EXPLICIT=explicit`
* on the compiler command line or similar.
* @param text NUL-terminated UTF-16 string
* @stable ICU 59
@@ -3034,7 +3019,7 @@ public:
* Effectively the same as the default constructor, makes an empty string object.
*
* It is recommended to mark this constructor "explicit" by
- * <code>-DUNISTR_FROM_STRING_EXPLICIT=explicit</code>
+ * `-DUNISTR_FROM_STRING_EXPLICIT=explicit`
* on the compiler command line or similar.
* @param text nullptr
* @stable ICU 59
@@ -3044,7 +3029,7 @@ public:
/**
* char16_t* constructor.
* @param text The characters to place in the UnicodeString.
- * @param textLength The number of Unicode characters in <TT>text</TT>
+ * @param textLength The number of Unicode characters in `text`
* to copy.
* @stable ICU 2.0
*/
@@ -3056,11 +3041,11 @@ public:
* uint16_t * constructor.
* Delegates to UnicodeString(const char16_t *, int32_t).
* @param text UTF-16 string
- * @param length string length
+ * @param textLength string length
* @stable ICU 59
*/
- UnicodeString(const uint16_t *text, int32_t length) :
- UnicodeString(ConstChar16Ptr(text), length) {}
+ UnicodeString(const uint16_t *text, int32_t textLength) :
+ UnicodeString(ConstChar16Ptr(text), textLength) {}
#endif
#if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN)
@@ -3069,21 +3054,21 @@ public:
* (Only defined if U_SIZEOF_WCHAR_T==2.)
* Delegates to UnicodeString(const char16_t *, int32_t).
* @param text NUL-terminated UTF-16 string
- * @param length string length
+ * @param textLength string length
* @stable ICU 59
*/
- UnicodeString(const wchar_t *text, int32_t length) :
- UnicodeString(ConstChar16Ptr(text), length) {}
+ UnicodeString(const wchar_t *text, int32_t textLength) :
+ UnicodeString(ConstChar16Ptr(text), textLength) {}
#endif
/**
* nullptr_t constructor.
* Effectively the same as the default constructor, makes an empty string object.
* @param text nullptr
- * @param length ignored
+ * @param textLength ignored
* @stable ICU 59
*/
- inline UnicodeString(const std::nullptr_t text, int32_t length);
+ inline UnicodeString(const std::nullptr_t text, int32_t textLength);
/**
* Readonly-aliasing char16_t* constructor.
@@ -3099,12 +3084,12 @@ public:
* When using fastCopyFrom(), the text will be aliased again,
* so that both strings then alias the same readonly-text.
*
- * @param isTerminated specifies if <code>text</code> is <code>NUL</code>-terminated.
- * This must be true if <code>textLength==-1</code>.
+ * @param isTerminated specifies if `text` is `NUL`-terminated.
+ * This must be true if `textLength==-1`.
* @param text The characters to alias for the UnicodeString.
- * @param textLength The number of Unicode characters in <code>text</code> to alias.
+ * @param textLength The number of Unicode characters in `text` to alias.
* If -1, then this constructor will determine the length
- * by calling <code>u_strlen()</code>.
+ * by calling `u_strlen()`.
* @stable ICU 2.0
*/
UnicodeString(UBool isTerminated,
@@ -3125,8 +3110,8 @@ public:
* as the string buffer itself and will in this case not copy the contents.
*
* @param buffer The characters to alias for the UnicodeString.
- * @param buffLength The number of Unicode characters in <code>buffer</code> to alias.
- * @param buffCapacity The size of <code>buffer</code> in char16_ts.
+ * @param buffLength The number of Unicode characters in `buffer` to alias.
+ * @param buffCapacity The size of `buffer` in char16_ts.
* @stable ICU 2.0
*/
UnicodeString(char16_t *buffer, int32_t buffLength, int32_t buffCapacity);
@@ -3181,7 +3166,7 @@ public:
* UNICODE_STRING_SIMPLE.
*
* It is recommended to mark this constructor "explicit" by
- * <code>-DUNISTR_FROM_STRING_EXPLICIT=explicit</code>
+ * `-DUNISTR_FROM_STRING_EXPLICIT=explicit`
* on the compiler command line or similar.
* @param codepageData an array of bytes, null-terminated,
* in the platform's default codepage.
@@ -3196,7 +3181,7 @@ public:
* Uses the default converter (and thus depends on the ICU conversion code)
* unless U_CHARSET_IS_UTF8 is set to 1.
* @param codepageData an array of bytes in the platform's default codepage.
- * @param dataLength The number of bytes in <TT>codepageData</TT>.
+ * @param dataLength The number of bytes in `codepageData`.
* @stable ICU 2.0
*/
UnicodeString(const char *codepageData, int32_t dataLength);
@@ -3208,11 +3193,11 @@ public:
/**
* char* constructor.
* @param codepageData an array of bytes, null-terminated
- * @param codepage the encoding of <TT>codepageData</TT>. The special
- * value 0 for <TT>codepage</TT> indicates that the text is in the
+ * @param codepage the encoding of `codepageData`. The special
+ * value 0 for `codepage` indicates that the text is in the
* platform's default codepage.
*
- * If <code>codepage</code> is an empty string (<code>""</code>),
+ * If `codepage` is an empty string (`""`),
* then a simple conversion is performed on the codepage-invariant
* subset ("invariant characters") of the platform encoding. See utypes.h.
* Recommendation: For invariant-character strings use the constructor
@@ -3227,11 +3212,11 @@ public:
/**
* char* constructor.
* @param codepageData an array of bytes.
- * @param dataLength The number of bytes in <TT>codepageData</TT>.
- * @param codepage the encoding of <TT>codepageData</TT>. The special
- * value 0 for <TT>codepage</TT> indicates that the text is in the
+ * @param dataLength The number of bytes in `codepageData`.
+ * @param codepage the encoding of `codepageData`. The special
+ * value 0 for `codepage` indicates that the text is in the
* platform's default codepage.
- * If <code>codepage</code> is an empty string (<code>""</code>),
+ * If `codepage` is an empty string (`""`),
* then a simple conversion is performed on the codepage-invariant
* subset ("invariant characters") of the platform encoding. See utypes.h.
* Recommendation: For invariant-character strings use the constructor
@@ -3282,20 +3267,19 @@ public:
*
* For example:
* \code
- * void fn(const char *s) {
- * UnicodeString ustr(s, -1, US_INV);
- * // use ustr ...
- * }
+ * void fn(const char *s) {
+ * UnicodeString ustr(s, -1, US_INV);
+ * // use ustr ...
+ * }
* \endcode
- *
* @param src String using only invariant characters.
- * @param length Length of src, or -1 if NUL-terminated.
+ * @param textLength Length of src, or -1 if NUL-terminated.
* @param inv Signature-distinguishing paramater, use US_INV.
*
* @see US_INV
* @stable ICU 3.2
*/
- UnicodeString(const char *src, int32_t length, enum EInvariant inv);
+ UnicodeString(const char *src, int32_t textLength, enum EInvariant inv);
/**
@@ -3327,7 +3311,7 @@ public:
/**
* 'Substring' constructor from tail of source string.
* @param src The UnicodeString object to copy.
- * @param srcStart The offset into <tt>src</tt> at which to start copying.
+ * @param srcStart The offset into `src` at which to start copying.
* @stable ICU 2.2
*/
UnicodeString(const UnicodeString& src, int32_t srcStart);
@@ -3335,8 +3319,8 @@ public:
/**
* 'Substring' constructor from subrange of source string.
* @param src The UnicodeString object to copy.
- * @param srcStart The offset into <tt>src</tt> at which to start copying.
- * @param srcLength The number of characters from <tt>src</tt> to copy.
+ * @param srcStart The offset into `src` at which to start copying.
+ * @param srcLength The number of characters from `src` to copy.
* @stable ICU 2.2
*/
UnicodeString(const UnicodeString& src, int32_t srcStart, int32_t srcLength);
@@ -3346,9 +3330,6 @@ public:
* Clones can be used concurrently in multiple threads.
* If a subclass does not implement clone(), or if an error occurs,
* then NULL is returned.
- * The clone functions in all subclasses return a pointer to a Replaceable
- * because some compilers do not support covariant (same-as-this)
- * return types; cast to the appropriate subclass if necessary.
* The caller must delete the clone.
*
* @return a clone of this object
@@ -3357,7 +3338,7 @@ public:
* @see getDynamicClassID
* @stable ICU 2.6
*/
- virtual Replaceable *clone() const;
+ virtual UnicodeString *clone() const;
/** Destructor.
* @stable ICU 2.0
@@ -3408,7 +3389,7 @@ public:
*
* \\a => U+0007, \\b => U+0008, \\t => U+0009, \\n => U+000A,
* \\v => U+000B, \\f => U+000C, \\r => U+000D, \\e => U+001B,
- * \\&quot; => U+0022, \\' => U+0027, \\? => U+003F, \\\\ => U+005C
+ * \\" => U+0022, \\' => U+0027, \\? => U+003F, \\\\ => U+005C
*
* Anything else following a backslash is generically escaped. For
* example, "[a\\-z]" returns "[a-z]".
@@ -3656,9 +3637,9 @@ private:
* Real constructor for converting from codepage data.
* It assumes that it is called with !fRefCounted.
*
- * If <code>codepage==0</code>, then the default converter
+ * If `codepage==0`, then the default converter
* is used for the platform encoding.
- * If <code>codepage</code> is an empty string (<code>""</code>),
+ * If `codepage` is an empty string (`""`),
* then a simple conversion is performed on the codepage-invariant
* subset ("invariant characters") of the platform encoding. See utypes.h.
*/
@@ -4771,4 +4752,6 @@ UnicodeString::reverse(int32_t start,
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/unorm.h b/Build/source/libs/icu/icu-src/source/common/unicode/unorm.h
index 3839de12957..09dd366a968 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/unorm.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/unorm.h
@@ -131,6 +131,8 @@
// Do not conditionalize the following enum with #ifndef U_HIDE_DEPRECATED_API,
// it is needed for layout of Normalizer object.
+#ifndef U_FORCE_HIDE_DEPRECATED_API
+
/**
* Constants for normalization modes.
* @deprecated ICU 56 Use unorm2.h instead.
@@ -155,6 +157,8 @@ typedef enum {
UNORM_MODE_COUNT
} UNormalizationMode;
+#endif // U_FORCE_HIDE_DEPRECATED_API
+
#ifndef U_HIDE_DEPRECATED_API
/**
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uobject.h b/Build/source/libs/icu/icu-src/source/common/unicode/uobject.h
index c42c720cc71..eeb331ce973 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/uobject.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/uobject.h
@@ -21,6 +21,10 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
+#include "unicode/platform.h"
+
/**
* \file
* \brief C++ API: Common ICU base class UObject.
@@ -28,7 +32,9 @@
/**
* \def U_NO_THROW
- * Define this to define the throw() specification so
+ * Since ICU 64, use U_NOEXCEPT instead.
+ *
+ * Previously, define this to define the throw() specification so
* certain functions do not throw any exceptions
*
* UMemory operator new methods should have the throw() specification
@@ -37,10 +43,10 @@
* constructor is still called, and if the constructor references member
* data, (which it typically does), the result is a segmentation violation.
*
- * @stable ICU 4.2
+ * @stable ICU 4.2. Since ICU 64, Use U_NOEXCEPT instead. See ICU-20422.
*/
#ifndef U_NO_THROW
-#define U_NO_THROW throw()
+#define U_NO_THROW U_NOEXCEPT
#endif
/*===========================================================================*/
@@ -125,14 +131,14 @@ public:
* for ICU4C C++ classes
* @stable ICU 2.4
*/
- static void * U_EXPORT2 operator new(size_t size) U_NO_THROW;
+ static void * U_EXPORT2 operator new(size_t size) U_NOEXCEPT;
/**
* Override for ICU4C C++ memory management.
* See new().
* @stable ICU 2.4
*/
- static void * U_EXPORT2 operator new[](size_t size) U_NO_THROW;
+ static void * U_EXPORT2 operator new[](size_t size) U_NOEXCEPT;
/**
* Override for ICU4C C++ memory management.
@@ -142,14 +148,14 @@ public:
* for ICU4C C++ classes
* @stable ICU 2.4
*/
- static void U_EXPORT2 operator delete(void *p) U_NO_THROW;
+ static void U_EXPORT2 operator delete(void *p) U_NOEXCEPT;
/**
* Override for ICU4C C++ memory management.
* See delete().
* @stable ICU 2.4
*/
- static void U_EXPORT2 operator delete[](void *p) U_NO_THROW;
+ static void U_EXPORT2 operator delete[](void *p) U_NOEXCEPT;
#if U_HAVE_PLACEMENT_NEW
/**
@@ -157,14 +163,14 @@ public:
* See new().
* @stable ICU 2.6
*/
- static inline void * U_EXPORT2 operator new(size_t, void *ptr) U_NO_THROW { return ptr; }
+ static inline void * U_EXPORT2 operator new(size_t, void *ptr) U_NOEXCEPT { return ptr; }
/**
* Override for ICU4C C++ memory management for STL.
* See delete().
* @stable ICU 2.6
*/
- static inline void U_EXPORT2 operator delete(void *, void *) U_NO_THROW {}
+ static inline void U_EXPORT2 operator delete(void *, void *) U_NOEXCEPT {}
#endif /* U_HAVE_PLACEMENT_NEW */
#if U_HAVE_DEBUG_LOCATION_NEW
/**
@@ -174,7 +180,7 @@ public:
* @param file The file where the allocation was requested
* @param line The line where the allocation was requested
*/
- static void * U_EXPORT2 operator new(size_t size, const char* file, int line) U_NO_THROW;
+ static void * U_EXPORT2 operator new(size_t size, const char* file, int line) U_NOEXCEPT;
/**
* This method provides a matching delete for the MFC debug new
*
@@ -182,7 +188,7 @@ public:
* @param file The file where the allocation was requested
* @param line The line where the allocation was requested
*/
- static void U_EXPORT2 operator delete(void* p, const char* file, int line) U_NO_THROW;
+ static void U_EXPORT2 operator delete(void* p, const char* file, int line) U_NOEXCEPT;
#endif /* U_HAVE_DEBUG_LOCATION_NEW */
#endif /* U_OVERRIDE_CXX_ALLOCATION */
@@ -209,11 +215,8 @@ public:
* The clone() function is not available in UObject because it is not
* implemented by all ICU classes.
* Many ICU services provide a clone() function for their class trees,
- * defined on the service's C++ base class, and all subclasses within that
- * service class tree return a pointer to the service base class
+ * defined on the service's C++ base class
* (which itself is a subclass of UObject).
- * This is because some compilers do not support covariant (same-as-this)
- * return types; cast to the appropriate subclass if necessary.
*
* @stable ICU 2.2
*/
@@ -316,4 +319,6 @@ protected:
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/urename.h b/Build/source/libs/icu/icu-src/source/common/unicode/urename.h
index 5812173e39c..e302bf0976e 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/urename.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/urename.h
@@ -109,12 +109,13 @@
#define _UTF32LEData U_ICU_ENTRY_POINT_RENAME(_UTF32LEData)
#define _UTF7Data U_ICU_ENTRY_POINT_RENAME(_UTF7Data)
#define _UTF8Data U_ICU_ENTRY_POINT_RENAME(_UTF8Data)
+#define _isUnicodeLocaleTypeSubtag U_ICU_ENTRY_POINT_RENAME(_isUnicodeLocaleTypeSubtag)
#define allowedHourFormatsCleanup U_ICU_ENTRY_POINT_RENAME(allowedHourFormatsCleanup)
-#define checkImpl U_ICU_ENTRY_POINT_RENAME(checkImpl)
#define cmemory_cleanup U_ICU_ENTRY_POINT_RENAME(cmemory_cleanup)
#define dayPeriodRulesCleanup U_ICU_ENTRY_POINT_RENAME(dayPeriodRulesCleanup)
#define deleteAllowedHourFormats U_ICU_ENTRY_POINT_RENAME(deleteAllowedHourFormats)
#define gTimeZoneFilesInitOnce U_ICU_ENTRY_POINT_RENAME(gTimeZoneFilesInitOnce)
+#define initNumsysNames U_ICU_ENTRY_POINT_RENAME(initNumsysNames)
#define izrule_clone U_ICU_ENTRY_POINT_RENAME(izrule_clone)
#define izrule_close U_ICU_ENTRY_POINT_RENAME(izrule_close)
#define izrule_equals U_ICU_ENTRY_POINT_RENAME(izrule_equals)
@@ -133,6 +134,7 @@
#define locale_getKeywordsStart U_ICU_ENTRY_POINT_RENAME(locale_getKeywordsStart)
#define locale_get_default U_ICU_ENTRY_POINT_RENAME(locale_get_default)
#define locale_set_default U_ICU_ENTRY_POINT_RENAME(locale_set_default)
+#define numSysCleanup U_ICU_ENTRY_POINT_RENAME(numSysCleanup)
#define pl_addFontRun U_ICU_ENTRY_POINT_RENAME(pl_addFontRun)
#define pl_addLocaleRun U_ICU_ENTRY_POINT_RENAME(pl_addLocaleRun)
#define pl_addValueRun U_ICU_ENTRY_POINT_RENAME(pl_addValueRun)
@@ -191,10 +193,13 @@
#define res_getAlias U_ICU_ENTRY_POINT_RENAME(res_getAlias)
#define res_getArrayItem U_ICU_ENTRY_POINT_RENAME(res_getArrayItem)
#define res_getBinary U_ICU_ENTRY_POINT_RENAME(res_getBinary)
+#define res_getBinaryNoTrace U_ICU_ENTRY_POINT_RENAME(res_getBinaryNoTrace)
#define res_getIntVector U_ICU_ENTRY_POINT_RENAME(res_getIntVector)
+#define res_getIntVectorNoTrace U_ICU_ENTRY_POINT_RENAME(res_getIntVectorNoTrace)
#define res_getPublicType U_ICU_ENTRY_POINT_RENAME(res_getPublicType)
#define res_getResource U_ICU_ENTRY_POINT_RENAME(res_getResource)
#define res_getString U_ICU_ENTRY_POINT_RENAME(res_getString)
+#define res_getStringNoTrace U_ICU_ENTRY_POINT_RENAME(res_getStringNoTrace)
#define res_getTableItemByIndex U_ICU_ENTRY_POINT_RENAME(res_getTableItemByIndex)
#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
#define res_load U_ICU_ENTRY_POINT_RENAME(res_load)
@@ -521,6 +526,7 @@
#define ucal_getDefaultTimeZone U_ICU_ENTRY_POINT_RENAME(ucal_getDefaultTimeZone)
#define ucal_getFieldDifference U_ICU_ENTRY_POINT_RENAME(ucal_getFieldDifference)
#define ucal_getGregorianChange U_ICU_ENTRY_POINT_RENAME(ucal_getGregorianChange)
+#define ucal_getHostTimeZone U_ICU_ENTRY_POINT_RENAME(ucal_getHostTimeZone)
#define ucal_getKeywordValuesForLocale U_ICU_ENTRY_POINT_RENAME(ucal_getKeywordValuesForLocale)
#define ucal_getLimit U_ICU_ENTRY_POINT_RENAME(ucal_getLimit)
#define ucal_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ucal_getLocaleByType)
@@ -573,7 +579,6 @@
#define ucasemap_getLocale U_ICU_ENTRY_POINT_RENAME(ucasemap_getLocale)
#define ucasemap_getOptions U_ICU_ENTRY_POINT_RENAME(ucasemap_getOptions)
#define ucasemap_internalUTF8ToTitle U_ICU_ENTRY_POINT_RENAME(ucasemap_internalUTF8ToTitle)
-#define ucasemap_mapUTF8 U_ICU_ENTRY_POINT_RENAME(ucasemap_mapUTF8)
#define ucasemap_open U_ICU_ENTRY_POINT_RENAME(ucasemap_open)
#define ucasemap_setBreakIterator U_ICU_ENTRY_POINT_RENAME(ucasemap_setBreakIterator)
#define ucasemap_setLocale U_ICU_ENTRY_POINT_RENAME(ucasemap_setLocale)
@@ -583,6 +588,18 @@
#define ucasemap_utf8ToLower U_ICU_ENTRY_POINT_RENAME(ucasemap_utf8ToLower)
#define ucasemap_utf8ToTitle U_ICU_ENTRY_POINT_RENAME(ucasemap_utf8ToTitle)
#define ucasemap_utf8ToUpper U_ICU_ENTRY_POINT_RENAME(ucasemap_utf8ToUpper)
+#define ucfpos_close U_ICU_ENTRY_POINT_RENAME(ucfpos_close)
+#define ucfpos_constrainCategory U_ICU_ENTRY_POINT_RENAME(ucfpos_constrainCategory)
+#define ucfpos_constrainField U_ICU_ENTRY_POINT_RENAME(ucfpos_constrainField)
+#define ucfpos_getCategory U_ICU_ENTRY_POINT_RENAME(ucfpos_getCategory)
+#define ucfpos_getField U_ICU_ENTRY_POINT_RENAME(ucfpos_getField)
+#define ucfpos_getIndexes U_ICU_ENTRY_POINT_RENAME(ucfpos_getIndexes)
+#define ucfpos_getInt64IterationContext U_ICU_ENTRY_POINT_RENAME(ucfpos_getInt64IterationContext)
+#define ucfpos_matchesField U_ICU_ENTRY_POINT_RENAME(ucfpos_matchesField)
+#define ucfpos_open U_ICU_ENTRY_POINT_RENAME(ucfpos_open)
+#define ucfpos_reset U_ICU_ENTRY_POINT_RENAME(ucfpos_reset)
+#define ucfpos_setInt64IterationContext U_ICU_ENTRY_POINT_RENAME(ucfpos_setInt64IterationContext)
+#define ucfpos_setState U_ICU_ENTRY_POINT_RENAME(ucfpos_setState)
#define uchar_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(uchar_addPropertyStarts)
#define uchar_swapNames U_ICU_ENTRY_POINT_RENAME(uchar_swapNames)
#define ucln_cleanupOne U_ICU_ENTRY_POINT_RENAME(ucln_cleanupOne)
@@ -897,8 +914,12 @@
#define udatpg_setDecimal U_ICU_ENTRY_POINT_RENAME(udatpg_setDecimal)
#define udict_swap U_ICU_ENTRY_POINT_RENAME(udict_swap)
#define udtitvfmt_close U_ICU_ENTRY_POINT_RENAME(udtitvfmt_close)
+#define udtitvfmt_closeResult U_ICU_ENTRY_POINT_RENAME(udtitvfmt_closeResult)
#define udtitvfmt_format U_ICU_ENTRY_POINT_RENAME(udtitvfmt_format)
+#define udtitvfmt_formatToResult U_ICU_ENTRY_POINT_RENAME(udtitvfmt_formatToResult)
#define udtitvfmt_open U_ICU_ENTRY_POINT_RENAME(udtitvfmt_open)
+#define udtitvfmt_openResult U_ICU_ENTRY_POINT_RENAME(udtitvfmt_openResult)
+#define udtitvfmt_resultAsValue U_ICU_ENTRY_POINT_RENAME(udtitvfmt_resultAsValue)
#define uenum_close U_ICU_ENTRY_POINT_RENAME(uenum_close)
#define uenum_count U_ICU_ENTRY_POINT_RENAME(uenum_count)
#define uenum_next U_ICU_ENTRY_POINT_RENAME(uenum_next)
@@ -912,16 +933,9 @@
#define ufieldpositer_close U_ICU_ENTRY_POINT_RENAME(ufieldpositer_close)
#define ufieldpositer_next U_ICU_ENTRY_POINT_RENAME(ufieldpositer_next)
#define ufieldpositer_open U_ICU_ENTRY_POINT_RENAME(ufieldpositer_open)
-#define ufile_close_translit U_ICU_ENTRY_POINT_RENAME(ufile_close_translit)
-#define ufile_fill_uchar_buffer U_ICU_ENTRY_POINT_RENAME(ufile_fill_uchar_buffer)
-#define ufile_flush_io U_ICU_ENTRY_POINT_RENAME(ufile_flush_io)
-#define ufile_flush_translit U_ICU_ENTRY_POINT_RENAME(ufile_flush_translit)
#define ufile_getch U_ICU_ENTRY_POINT_RENAME(ufile_getch)
#define ufile_getch32 U_ICU_ENTRY_POINT_RENAME(ufile_getch32)
-#define ufmt_64tou U_ICU_ENTRY_POINT_RENAME(ufmt_64tou)
#define ufmt_close U_ICU_ENTRY_POINT_RENAME(ufmt_close)
-#define ufmt_defaultCPToUnicode U_ICU_ENTRY_POINT_RENAME(ufmt_defaultCPToUnicode)
-#define ufmt_digitvalue U_ICU_ENTRY_POINT_RENAME(ufmt_digitvalue)
#define ufmt_getArrayItemByIndex U_ICU_ENTRY_POINT_RENAME(ufmt_getArrayItemByIndex)
#define ufmt_getArrayLength U_ICU_ENTRY_POINT_RENAME(ufmt_getArrayLength)
#define ufmt_getDate U_ICU_ENTRY_POINT_RENAME(ufmt_getDate)
@@ -933,11 +947,9 @@
#define ufmt_getType U_ICU_ENTRY_POINT_RENAME(ufmt_getType)
#define ufmt_getUChars U_ICU_ENTRY_POINT_RENAME(ufmt_getUChars)
#define ufmt_isNumeric U_ICU_ENTRY_POINT_RENAME(ufmt_isNumeric)
-#define ufmt_isdigit U_ICU_ENTRY_POINT_RENAME(ufmt_isdigit)
#define ufmt_open U_ICU_ENTRY_POINT_RENAME(ufmt_open)
-#define ufmt_ptou U_ICU_ENTRY_POINT_RENAME(ufmt_ptou)
-#define ufmt_uto64 U_ICU_ENTRY_POINT_RENAME(ufmt_uto64)
-#define ufmt_utop U_ICU_ENTRY_POINT_RENAME(ufmt_utop)
+#define ufmtval_getString U_ICU_ENTRY_POINT_RENAME(ufmtval_getString)
+#define ufmtval_nextPosition U_ICU_ENTRY_POINT_RENAME(ufmtval_nextPosition)
#define ugender_getInstance U_ICU_ENTRY_POINT_RENAME(ugender_getInstance)
#define ugender_getListGender U_ICU_ENTRY_POINT_RENAME(ugender_getListGender)
#define uhash_close U_ICU_ENTRY_POINT_RENAME(uhash_close)
@@ -1040,8 +1052,12 @@
#define ulist_resetList U_ICU_ENTRY_POINT_RENAME(ulist_resetList)
#define ulist_reset_keyword_values_iterator U_ICU_ENTRY_POINT_RENAME(ulist_reset_keyword_values_iterator)
#define ulistfmt_close U_ICU_ENTRY_POINT_RENAME(ulistfmt_close)
+#define ulistfmt_closeResult U_ICU_ENTRY_POINT_RENAME(ulistfmt_closeResult)
#define ulistfmt_format U_ICU_ENTRY_POINT_RENAME(ulistfmt_format)
+#define ulistfmt_formatStringsToResult U_ICU_ENTRY_POINT_RENAME(ulistfmt_formatStringsToResult)
#define ulistfmt_open U_ICU_ENTRY_POINT_RENAME(ulistfmt_open)
+#define ulistfmt_openResult U_ICU_ENTRY_POINT_RENAME(ulistfmt_openResult)
+#define ulistfmt_resultAsValue U_ICU_ENTRY_POINT_RENAME(ulistfmt_resultAsValue)
#define uloc_acceptLanguage U_ICU_ENTRY_POINT_RENAME(uloc_acceptLanguage)
#define uloc_acceptLanguageFromHTTP U_ICU_ENTRY_POINT_RENAME(uloc_acceptLanguageFromHTTP)
#define uloc_addLikelySubtags U_ICU_ENTRY_POINT_RENAME(uloc_addLikelySubtags)
@@ -1079,6 +1095,7 @@
#define uloc_getVariant U_ICU_ENTRY_POINT_RENAME(uloc_getVariant)
#define uloc_isRightToLeft U_ICU_ENTRY_POINT_RENAME(uloc_isRightToLeft)
#define uloc_minimizeSubtags U_ICU_ENTRY_POINT_RENAME(uloc_minimizeSubtags)
+#define uloc_openAvailableByType U_ICU_ENTRY_POINT_RENAME(uloc_openAvailableByType)
#define uloc_openKeywordList U_ICU_ENTRY_POINT_RENAME(uloc_openKeywordList)
#define uloc_openKeywords U_ICU_ENTRY_POINT_RENAME(uloc_openKeywords)
#define uloc_setDefault U_ICU_ENTRY_POINT_RENAME(uloc_setDefault)
@@ -1099,17 +1116,30 @@
#define ulocdata_getPaperSize U_ICU_ENTRY_POINT_RENAME(ulocdata_getPaperSize)
#define ulocdata_open U_ICU_ENTRY_POINT_RENAME(ulocdata_open)
#define ulocdata_setNoSubstitute U_ICU_ENTRY_POINT_RENAME(ulocdata_setNoSubstitute)
+#define ulocimp_addLikelySubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_addLikelySubtags)
#define ulocimp_forLanguageTag U_ICU_ENTRY_POINT_RENAME(ulocimp_forLanguageTag)
#define ulocimp_getCountry U_ICU_ENTRY_POINT_RENAME(ulocimp_getCountry)
#define ulocimp_getLanguage U_ICU_ENTRY_POINT_RENAME(ulocimp_getLanguage)
#define ulocimp_getRegionForSupplementalData U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegionForSupplementalData)
#define ulocimp_getScript U_ICU_ENTRY_POINT_RENAME(ulocimp_getScript)
+#define ulocimp_minimizeSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_minimizeSubtags)
#define ulocimp_toBcpKey U_ICU_ENTRY_POINT_RENAME(ulocimp_toBcpKey)
#define ulocimp_toBcpType U_ICU_ENTRY_POINT_RENAME(ulocimp_toBcpType)
+#define ulocimp_toLanguageTag U_ICU_ENTRY_POINT_RENAME(ulocimp_toLanguageTag)
#define ulocimp_toLegacyKey U_ICU_ENTRY_POINT_RENAME(ulocimp_toLegacyKey)
#define ulocimp_toLegacyType U_ICU_ENTRY_POINT_RENAME(ulocimp_toLegacyType)
+#define ultag_isExtensionSubtags U_ICU_ENTRY_POINT_RENAME(ultag_isExtensionSubtags)
+#define ultag_isLanguageSubtag U_ICU_ENTRY_POINT_RENAME(ultag_isLanguageSubtag)
+#define ultag_isPrivateuseValueSubtags U_ICU_ENTRY_POINT_RENAME(ultag_isPrivateuseValueSubtags)
+#define ultag_isRegionSubtag U_ICU_ENTRY_POINT_RENAME(ultag_isRegionSubtag)
+#define ultag_isScriptSubtag U_ICU_ENTRY_POINT_RENAME(ultag_isScriptSubtag)
+#define ultag_isTransformedExtensionSubtags U_ICU_ENTRY_POINT_RENAME(ultag_isTransformedExtensionSubtags)
+#define ultag_isUnicodeExtensionSubtags U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeExtensionSubtags)
+#define ultag_isUnicodeLocaleAttribute U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeLocaleAttribute)
+#define ultag_isUnicodeLocaleAttributes U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeLocaleAttributes)
#define ultag_isUnicodeLocaleKey U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeLocaleKey)
#define ultag_isUnicodeLocaleType U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeLocaleType)
+#define ultag_isVariantSubtags U_ICU_ENTRY_POINT_RENAME(ultag_isVariantSubtags)
#define umsg_applyPattern U_ICU_ENTRY_POINT_RENAME(umsg_applyPattern)
#define umsg_autoQuoteApostrophe U_ICU_ENTRY_POINT_RENAME(umsg_autoQuoteApostrophe)
#define umsg_clone U_ICU_ENTRY_POINT_RENAME(umsg_clone)
@@ -1122,9 +1152,6 @@
#define umsg_toPattern U_ICU_ENTRY_POINT_RENAME(umsg_toPattern)
#define umsg_vformat U_ICU_ENTRY_POINT_RENAME(umsg_vformat)
#define umsg_vparse U_ICU_ENTRY_POINT_RENAME(umsg_vparse)
-#define umtx_condBroadcast U_ICU_ENTRY_POINT_RENAME(umtx_condBroadcast)
-#define umtx_condSignal U_ICU_ENTRY_POINT_RENAME(umtx_condSignal)
-#define umtx_condWait U_ICU_ENTRY_POINT_RENAME(umtx_condWait)
#define umtx_lock U_ICU_ENTRY_POINT_RENAME(umtx_lock)
#define umtx_unlock U_ICU_ENTRY_POINT_RENAME(umtx_unlock)
#define umutablecptrie_buildImmutable U_ICU_ENTRY_POINT_RENAME(umutablecptrie_buildImmutable)
@@ -1208,7 +1235,9 @@
#define unumf_formatDouble U_ICU_ENTRY_POINT_RENAME(unumf_formatDouble)
#define unumf_formatInt U_ICU_ENTRY_POINT_RENAME(unumf_formatInt)
#define unumf_openForSkeletonAndLocale U_ICU_ENTRY_POINT_RENAME(unumf_openForSkeletonAndLocale)
+#define unumf_openForSkeletonAndLocaleWithError U_ICU_ENTRY_POINT_RENAME(unumf_openForSkeletonAndLocaleWithError)
#define unumf_openResult U_ICU_ENTRY_POINT_RENAME(unumf_openResult)
+#define unumf_resultAsValue U_ICU_ENTRY_POINT_RENAME(unumf_resultAsValue)
#define unumf_resultGetAllFieldPositions U_ICU_ENTRY_POINT_RENAME(unumf_resultGetAllFieldPositions)
#define unumf_resultNextFieldPosition U_ICU_ENTRY_POINT_RENAME(unumf_resultNextFieldPosition)
#define unumf_resultToString U_ICU_ENTRY_POINT_RENAME(unumf_resultToString)
@@ -1225,6 +1254,7 @@
#define uplrules_open U_ICU_ENTRY_POINT_RENAME(uplrules_open)
#define uplrules_openForType U_ICU_ENTRY_POINT_RENAME(uplrules_openForType)
#define uplrules_select U_ICU_ENTRY_POINT_RENAME(uplrules_select)
+#define uplrules_selectFormatted U_ICU_ENTRY_POINT_RENAME(uplrules_selectFormatted)
#define uplrules_selectWithFormat U_ICU_ENTRY_POINT_RENAME(uplrules_selectWithFormat)
#define uplug_closeLibrary U_ICU_ENTRY_POINT_RENAME(uplug_closeLibrary)
#define uplug_findLibrary U_ICU_ENTRY_POINT_RENAME(uplug_findLibrary)
@@ -1287,7 +1317,6 @@
#define uprv_decNumberAbs U_ICU_ENTRY_POINT_RENAME(uprv_decNumberAbs)
#define uprv_decNumberAdd U_ICU_ENTRY_POINT_RENAME(uprv_decNumberAdd)
#define uprv_decNumberAnd U_ICU_ENTRY_POINT_RENAME(uprv_decNumberAnd)
-#define uprv_decNumberClass U_ICU_ENTRY_POINT_RENAME(uprv_decNumberClass)
#define uprv_decNumberClassToString U_ICU_ENTRY_POINT_RENAME(uprv_decNumberClassToString)
#define uprv_decNumberCompare U_ICU_ENTRY_POINT_RENAME(uprv_decNumberCompare)
#define uprv_decNumberCompareSignal U_ICU_ENTRY_POINT_RENAME(uprv_decNumberCompareSignal)
@@ -1353,6 +1382,7 @@
#define uprv_dlsym_func U_ICU_ENTRY_POINT_RENAME(uprv_dlsym_func)
#define uprv_eastrncpy U_ICU_ENTRY_POINT_RENAME(uprv_eastrncpy)
#define uprv_ebcdicFromAscii U_ICU_ENTRY_POINT_RENAME(uprv_ebcdicFromAscii)
+#define uprv_ebcdicToAscii U_ICU_ENTRY_POINT_RENAME(uprv_ebcdicToAscii)
#define uprv_ebcdicToLowercaseAscii U_ICU_ENTRY_POINT_RENAME(uprv_ebcdicToLowercaseAscii)
#define uprv_ebcdictolower U_ICU_ENTRY_POINT_RENAME(uprv_ebcdictolower)
#define uprv_fabs U_ICU_ENTRY_POINT_RENAME(uprv_fabs)
@@ -1372,6 +1402,7 @@
#define uprv_getUTCtime U_ICU_ENTRY_POINT_RENAME(uprv_getUTCtime)
#define uprv_int32Comparator U_ICU_ENTRY_POINT_RENAME(uprv_int32Comparator)
#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
+#define uprv_isEbcdicAtSign U_ICU_ENTRY_POINT_RENAME(uprv_isEbcdicAtSign)
#define uprv_isInfinite U_ICU_ENTRY_POINT_RENAME(uprv_isInfinite)
#define uprv_isInvariantString U_ICU_ENTRY_POINT_RENAME(uprv_isInvariantString)
#define uprv_isInvariantUString U_ICU_ENTRY_POINT_RENAME(uprv_isInvariantUString)
@@ -1499,10 +1530,15 @@
#define uregion_getRegionFromNumericCode U_ICU_ENTRY_POINT_RENAME(uregion_getRegionFromNumericCode)
#define uregion_getType U_ICU_ENTRY_POINT_RENAME(uregion_getType)
#define ureldatefmt_close U_ICU_ENTRY_POINT_RENAME(ureldatefmt_close)
+#define ureldatefmt_closeResult U_ICU_ENTRY_POINT_RENAME(ureldatefmt_closeResult)
#define ureldatefmt_combineDateAndTime U_ICU_ENTRY_POINT_RENAME(ureldatefmt_combineDateAndTime)
#define ureldatefmt_format U_ICU_ENTRY_POINT_RENAME(ureldatefmt_format)
#define ureldatefmt_formatNumeric U_ICU_ENTRY_POINT_RENAME(ureldatefmt_formatNumeric)
+#define ureldatefmt_formatNumericToResult U_ICU_ENTRY_POINT_RENAME(ureldatefmt_formatNumericToResult)
+#define ureldatefmt_formatToResult U_ICU_ENTRY_POINT_RENAME(ureldatefmt_formatToResult)
#define ureldatefmt_open U_ICU_ENTRY_POINT_RENAME(ureldatefmt_open)
+#define ureldatefmt_openResult U_ICU_ENTRY_POINT_RENAME(ureldatefmt_openResult)
+#define ureldatefmt_resultAsValue U_ICU_ENTRY_POINT_RENAME(ureldatefmt_resultAsValue)
#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
#define ures_copyResb U_ICU_ENTRY_POINT_RENAME(ures_copyResb)
#define ures_countArrayItems U_ICU_ENTRY_POINT_RENAME(ures_countArrayItems)
@@ -1534,6 +1570,7 @@
#define ures_getUTF8String U_ICU_ENTRY_POINT_RENAME(ures_getUTF8String)
#define ures_getUTF8StringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getUTF8StringByIndex)
#define ures_getUTF8StringByKey U_ICU_ENTRY_POINT_RENAME(ures_getUTF8StringByKey)
+#define ures_getValueWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getValueWithFallback)
#define ures_getVersion U_ICU_ENTRY_POINT_RENAME(ures_getVersion)
#define ures_getVersionByKey U_ICU_ENTRY_POINT_RENAME(ures_getVersionByKey)
#define ures_getVersionNumber U_ICU_ENTRY_POINT_RENAME(ures_getVersionNumber)
@@ -1543,6 +1580,7 @@
#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
#define ures_openAvailableLocales U_ICU_ENTRY_POINT_RENAME(ures_openAvailableLocales)
#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
+#define ures_openDirectFillIn U_ICU_ENTRY_POINT_RENAME(ures_openDirectFillIn)
#define ures_openFillIn U_ICU_ENTRY_POINT_RENAME(ures_openFillIn)
#define ures_openNoDefault U_ICU_ENTRY_POINT_RENAME(ures_openNoDefault)
#define ures_openU U_ICU_ENTRY_POINT_RENAME(ures_openU)
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ures.h b/Build/source/libs/icu/icu-src/source/common/unicode/ures.h
index af0ce76f25b..839779fada8 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/ures.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/ures.h
@@ -333,19 +333,19 @@ ures_getLocaleByType(const UResourceBundle* resourceBundle,
#ifndef U_HIDE_INTERNAL_API
/**
- * Same as ures_open() but uses the fill-in parameter instead of allocating
- * a bundle, if r!=NULL.
+ * Same as ures_open() but uses the fill-in parameter instead of allocating a new bundle.
+ *
* TODO need to revisit usefulness of this function
* and usage model for fillIn parameters without knowing sizeof(UResourceBundle)
- * @param r The resourcebundle to open
+ * @param r The existing UResourceBundle to fill in. If NULL then status will be
+ * set to U_ILLEGAL_ARGUMENT_ERROR.
* @param packageName The packageName and locale together point to an ICU udata object,
* as defined by <code> udata_open( packageName, "res", locale, err) </code>
* or equivalent. Typically, packageName will refer to a (.dat) file, or to
* a package registered with udata_setAppData(). Using a full file or directory
* pathname for packageName is deprecated. If NULL, ICU data will be used.
* @param localeID specifies the locale for which we want to open the resource
- * @param status The error code
- * @return a newly allocated resource bundle or NULL if it doesn't exist.
+ * @param status The error code.
* @internal
*/
U_INTERNAL void U_EXPORT2
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uscript.h b/Build/source/libs/icu/icu-src/source/common/unicode/uscript.h
index faf9edf8ae2..c8babdf0306 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/uscript.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/uscript.h
@@ -466,6 +466,15 @@ typedef enum UScriptCode {
/** @stable ICU 62 */
USCRIPT_OLD_SOGDIAN = 184,/* Sogo */
+ /** @stable ICU 64 */
+ USCRIPT_ELYMAIC = 185,/* Elym */
+ /** @stable ICU 64 */
+ USCRIPT_NYIAKENG_PUACHUE_HMONG = 186,/* Hmnp */
+ /** @stable ICU 64 */
+ USCRIPT_NANDINAGARI = 187,/* Nand */
+ /** @stable ICU 64 */
+ USCRIPT_WANCHO = 188,/* Wcho */
+
#ifndef U_HIDE_DEPRECATED_API
/**
* One more than the highest normal UScriptCode value.
@@ -473,7 +482,7 @@ typedef enum UScriptCode {
*
* @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
*/
- USCRIPT_CODE_LIMIT = 185
+ USCRIPT_CODE_LIMIT = 189
#endif // U_HIDE_DEPRECATED_API
} UScriptCode;
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/usetiter.h b/Build/source/libs/icu/icu-src/source/common/unicode/usetiter.h
index d0d99185b7c..c6396fd76c7 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/usetiter.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/usetiter.h
@@ -10,6 +10,9 @@
#define USETITER_H
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/uobject.h"
#include "unicode/unistr.h"
@@ -317,4 +320,6 @@ inline UChar32 UnicodeSetIterator::getCodepointEnd() const {
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/utext.h b/Build/source/libs/icu/icu-src/source/common/unicode/utext.h
index ad21d70a164..196056bfb89 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/utext.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/utext.h
@@ -766,12 +766,14 @@ utext_extract(UText *ut,
*
* @stable ICU 3.8
*/
-#define UTEXT_SETNATIVEINDEX(ut, ix) \
- { int64_t __offset = (ix) - (ut)->chunkNativeStart; \
- if (__offset>=0 && __offset<(int64_t)(ut)->nativeIndexingLimit && (ut)->chunkContents[__offset]<0xdc00) { \
- (ut)->chunkOffset=(int32_t)__offset; \
- } else { \
- utext_setNativeIndex((ut), (ix)); } }
+#define UTEXT_SETNATIVEINDEX(ut, ix) UPRV_BLOCK_MACRO_BEGIN { \
+ int64_t __offset = (ix) - (ut)->chunkNativeStart; \
+ if (__offset>=0 && __offset<(int64_t)(ut)->nativeIndexingLimit && (ut)->chunkContents[__offset]<0xdc00) { \
+ (ut)->chunkOffset=(int32_t)__offset; \
+ } else { \
+ utext_setNativeIndex((ut), (ix)); \
+ } \
+} UPRV_BLOCK_MACRO_END
@@ -1555,7 +1557,7 @@ struct UText {
U_STABLE UText * U_EXPORT2
utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status);
-#ifndef U_HIDE_INTERNAL_API
+// do not use #ifndef U_HIDE_INTERNAL_API around the following!
/**
* @internal
* Value used to help identify correctly initialized UText structs.
@@ -1564,7 +1566,6 @@ utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status);
enum {
UTEXT_MAGIC = 0x345ad82c
};
-#endif /* U_HIDE_INTERNAL_API */
/**
* initializer to be used with local (stack) instances of a UText
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/utf16.h b/Build/source/libs/icu/icu-src/source/common/unicode/utf16.h
index aca51b56a79..9fd7d5c8a77 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/utf16.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/utf16.h
@@ -163,7 +163,7 @@
* @see U16_GET
* @stable ICU 2.4
*/
-#define U16_GET_UNSAFE(s, i, c) { \
+#define U16_GET_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[i]; \
if(U16_IS_SURROGATE(c)) { \
if(U16_IS_SURROGATE_LEAD(c)) { \
@@ -172,7 +172,7 @@
(c)=U16_GET_SUPPLEMENTARY((s)[(i)-1], (c)); \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Get a code point from a string at a random-access offset,
@@ -197,7 +197,7 @@
* @see U16_GET_UNSAFE
* @stable ICU 2.4
*/
-#define U16_GET(s, start, i, length, c) { \
+#define U16_GET(s, start, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[i]; \
if(U16_IS_SURROGATE(c)) { \
uint16_t __c2; \
@@ -211,7 +211,7 @@
} \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Get a code point from a string at a random-access offset,
@@ -236,7 +236,7 @@
* @see U16_GET_UNSAFE
* @stable ICU 60
*/
-#define U16_GET_OR_FFFD(s, start, i, length, c) { \
+#define U16_GET_OR_FFFD(s, start, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[i]; \
if(U16_IS_SURROGATE(c)) { \
uint16_t __c2; \
@@ -254,7 +254,7 @@
} \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/* definitions with forward iteration --------------------------------------- */
@@ -277,12 +277,12 @@
* @see U16_NEXT
* @stable ICU 2.4
*/
-#define U16_NEXT_UNSAFE(s, i, c) { \
+#define U16_NEXT_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[(i)++]; \
if(U16_IS_LEAD(c)) { \
(c)=U16_GET_SUPPLEMENTARY((c), (s)[(i)++]); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Get a code point from a string at a code point boundary offset,
@@ -305,7 +305,7 @@
* @see U16_NEXT_UNSAFE
* @stable ICU 2.4
*/
-#define U16_NEXT(s, i, length, c) { \
+#define U16_NEXT(s, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[(i)++]; \
if(U16_IS_LEAD(c)) { \
uint16_t __c2; \
@@ -314,7 +314,7 @@
(c)=U16_GET_SUPPLEMENTARY((c), __c2); \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Get a code point from a string at a code point boundary offset,
@@ -337,7 +337,7 @@
* @see U16_NEXT_UNSAFE
* @stable ICU 60
*/
-#define U16_NEXT_OR_FFFD(s, i, length, c) { \
+#define U16_NEXT_OR_FFFD(s, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[(i)++]; \
if(U16_IS_SURROGATE(c)) { \
uint16_t __c2; \
@@ -348,7 +348,7 @@
(c)=0xfffd; \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Append a code point to a string, overwriting 1 or 2 code units.
@@ -363,14 +363,14 @@
* @see U16_APPEND
* @stable ICU 2.4
*/
-#define U16_APPEND_UNSAFE(s, i, c) { \
+#define U16_APPEND_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
if((uint32_t)(c)<=0xffff) { \
(s)[(i)++]=(uint16_t)(c); \
} else { \
(s)[(i)++]=(uint16_t)(((c)>>10)+0xd7c0); \
(s)[(i)++]=(uint16_t)(((c)&0x3ff)|0xdc00); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Append a code point to a string, overwriting 1 or 2 code units.
@@ -389,7 +389,7 @@
* @see U16_APPEND_UNSAFE
* @stable ICU 2.4
*/
-#define U16_APPEND(s, i, capacity, c, isError) { \
+#define U16_APPEND(s, i, capacity, c, isError) UPRV_BLOCK_MACRO_BEGIN { \
if((uint32_t)(c)<=0xffff) { \
(s)[(i)++]=(uint16_t)(c); \
} else if((uint32_t)(c)<=0x10ffff && (i)+1<(capacity)) { \
@@ -398,7 +398,7 @@
} else /* c>0x10ffff or not enough space */ { \
(isError)=TRUE; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Advance the string offset from one code point boundary to the next.
@@ -410,11 +410,11 @@
* @see U16_FWD_1
* @stable ICU 2.4
*/
-#define U16_FWD_1_UNSAFE(s, i) { \
+#define U16_FWD_1_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
if(U16_IS_LEAD((s)[(i)++])) { \
++(i); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Advance the string offset from one code point boundary to the next.
@@ -429,11 +429,11 @@
* @see U16_FWD_1_UNSAFE
* @stable ICU 2.4
*/
-#define U16_FWD_1(s, i, length) { \
+#define U16_FWD_1(s, i, length) UPRV_BLOCK_MACRO_BEGIN { \
if(U16_IS_LEAD((s)[(i)++]) && (i)!=(length) && U16_IS_TRAIL((s)[i])) { \
++(i); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Advance the string offset from one code point boundary to the n-th next one,
@@ -447,13 +447,13 @@
* @see U16_FWD_N
* @stable ICU 2.4
*/
-#define U16_FWD_N_UNSAFE(s, i, n) { \
+#define U16_FWD_N_UNSAFE(s, i, n) UPRV_BLOCK_MACRO_BEGIN { \
int32_t __N=(n); \
while(__N>0) { \
U16_FWD_1_UNSAFE(s, i); \
--__N; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Advance the string offset from one code point boundary to the n-th next one,
@@ -470,13 +470,13 @@
* @see U16_FWD_N_UNSAFE
* @stable ICU 2.4
*/
-#define U16_FWD_N(s, i, length, n) { \
+#define U16_FWD_N(s, i, length, n) UPRV_BLOCK_MACRO_BEGIN { \
int32_t __N=(n); \
while(__N>0 && ((i)<(length) || ((length)<0 && (s)[i]!=0))) { \
U16_FWD_1(s, i, length); \
--__N; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Adjust a random-access offset to a code point boundary
@@ -491,11 +491,11 @@
* @see U16_SET_CP_START
* @stable ICU 2.4
*/
-#define U16_SET_CP_START_UNSAFE(s, i) { \
+#define U16_SET_CP_START_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
if(U16_IS_TRAIL((s)[i])) { \
--(i); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Adjust a random-access offset to a code point boundary
@@ -511,11 +511,11 @@
* @see U16_SET_CP_START_UNSAFE
* @stable ICU 2.4
*/
-#define U16_SET_CP_START(s, start, i) { \
+#define U16_SET_CP_START(s, start, i) UPRV_BLOCK_MACRO_BEGIN { \
if(U16_IS_TRAIL((s)[i]) && (i)>(start) && U16_IS_LEAD((s)[(i)-1])) { \
--(i); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/* definitions with backward iteration -------------------------------------- */
@@ -539,12 +539,12 @@
* @see U16_PREV
* @stable ICU 2.4
*/
-#define U16_PREV_UNSAFE(s, i, c) { \
+#define U16_PREV_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[--(i)]; \
if(U16_IS_TRAIL(c)) { \
(c)=U16_GET_SUPPLEMENTARY((s)[--(i)], (c)); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Move the string offset from one code point boundary to the previous one
@@ -566,7 +566,7 @@
* @see U16_PREV_UNSAFE
* @stable ICU 2.4
*/
-#define U16_PREV(s, start, i, c) { \
+#define U16_PREV(s, start, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[--(i)]; \
if(U16_IS_TRAIL(c)) { \
uint16_t __c2; \
@@ -575,7 +575,7 @@
(c)=U16_GET_SUPPLEMENTARY(__c2, (c)); \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Move the string offset from one code point boundary to the previous one
@@ -597,7 +597,7 @@
* @see U16_PREV_UNSAFE
* @stable ICU 60
*/
-#define U16_PREV_OR_FFFD(s, start, i, c) { \
+#define U16_PREV_OR_FFFD(s, start, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[--(i)]; \
if(U16_IS_SURROGATE(c)) { \
uint16_t __c2; \
@@ -608,7 +608,7 @@
(c)=0xfffd; \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Move the string offset from one code point boundary to the previous one.
@@ -621,11 +621,11 @@
* @see U16_BACK_1
* @stable ICU 2.4
*/
-#define U16_BACK_1_UNSAFE(s, i) { \
+#define U16_BACK_1_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
if(U16_IS_TRAIL((s)[--(i)])) { \
--(i); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Move the string offset from one code point boundary to the previous one.
@@ -639,11 +639,11 @@
* @see U16_BACK_1_UNSAFE
* @stable ICU 2.4
*/
-#define U16_BACK_1(s, start, i) { \
+#define U16_BACK_1(s, start, i) UPRV_BLOCK_MACRO_BEGIN { \
if(U16_IS_TRAIL((s)[--(i)]) && (i)>(start) && U16_IS_LEAD((s)[(i)-1])) { \
--(i); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Move the string offset from one code point boundary to the n-th one before it,
@@ -658,13 +658,13 @@
* @see U16_BACK_N
* @stable ICU 2.4
*/
-#define U16_BACK_N_UNSAFE(s, i, n) { \
+#define U16_BACK_N_UNSAFE(s, i, n) UPRV_BLOCK_MACRO_BEGIN { \
int32_t __N=(n); \
while(__N>0) { \
U16_BACK_1_UNSAFE(s, i); \
--__N; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Move the string offset from one code point boundary to the n-th one before it,
@@ -680,13 +680,13 @@
* @see U16_BACK_N_UNSAFE
* @stable ICU 2.4
*/
-#define U16_BACK_N(s, start, i, n) { \
+#define U16_BACK_N(s, start, i, n) UPRV_BLOCK_MACRO_BEGIN { \
int32_t __N=(n); \
while(__N>0 && (i)>(start)) { \
U16_BACK_1(s, start, i); \
--__N; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Adjust a random-access offset to a code point boundary after a code point.
@@ -701,11 +701,11 @@
* @see U16_SET_CP_LIMIT
* @stable ICU 2.4
*/
-#define U16_SET_CP_LIMIT_UNSAFE(s, i) { \
+#define U16_SET_CP_LIMIT_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
if(U16_IS_LEAD((s)[(i)-1])) { \
++(i); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Adjust a random-access offset to a code point boundary after a code point.
@@ -724,10 +724,10 @@
* @see U16_SET_CP_LIMIT_UNSAFE
* @stable ICU 2.4
*/
-#define U16_SET_CP_LIMIT(s, start, i, length) { \
+#define U16_SET_CP_LIMIT(s, start, i, length) UPRV_BLOCK_MACRO_BEGIN { \
if((start)<(i) && ((i)<(length) || (length)<0) && U16_IS_LEAD((s)[(i)-1]) && U16_IS_TRAIL((s)[i])) { \
++(i); \
} \
-}
+} UPRV_BLOCK_MACRO_END
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/utf8.h b/Build/source/libs/icu/icu-src/source/common/unicode/utf8.h
index 4bb063c5e36..4987a00e8e0 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/utf8.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/utf8.h
@@ -229,11 +229,11 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_GET
* @stable ICU 2.4
*/
-#define U8_GET_UNSAFE(s, i, c) { \
+#define U8_GET_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
int32_t _u8_get_unsafe_index=(int32_t)(i); \
U8_SET_CP_START_UNSAFE(s, _u8_get_unsafe_index); \
U8_NEXT_UNSAFE(s, _u8_get_unsafe_index, c); \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Get a code point from a string at a random-access offset,
@@ -256,11 +256,11 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_GET_UNSAFE
* @stable ICU 2.4
*/
-#define U8_GET(s, start, i, length, c) { \
+#define U8_GET(s, start, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
int32_t _u8_get_index=(i); \
U8_SET_CP_START(s, start, _u8_get_index); \
U8_NEXT(s, _u8_get_index, length, c); \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Get a code point from a string at a random-access offset,
@@ -287,11 +287,11 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_GET
* @stable ICU 51
*/
-#define U8_GET_OR_FFFD(s, start, i, length, c) { \
+#define U8_GET_OR_FFFD(s, start, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
int32_t _u8_get_index=(i); \
U8_SET_CP_START(s, start, _u8_get_index); \
U8_NEXT_OR_FFFD(s, _u8_get_index, length, c); \
-}
+} UPRV_BLOCK_MACRO_END
/* definitions with forward iteration --------------------------------------- */
@@ -312,7 +312,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_NEXT
* @stable ICU 2.4
*/
-#define U8_NEXT_UNSAFE(s, i, c) { \
+#define U8_NEXT_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(uint8_t)(s)[(i)++]; \
if(!U8_IS_SINGLE(c)) { \
if((c)<0xe0) { \
@@ -326,7 +326,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
(i)+=3; \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Get a code point from a string at a code point boundary offset,
@@ -377,7 +377,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
#define U8_NEXT_OR_FFFD(s, i, length, c) U8_INTERNAL_NEXT_OR_SUB(s, i, length, c, 0xfffd)
/** @internal */
-#define U8_INTERNAL_NEXT_OR_SUB(s, i, length, c, sub) { \
+#define U8_INTERNAL_NEXT_OR_SUB(s, i, length, c, sub) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(uint8_t)(s)[(i)++]; \
if(!U8_IS_SINGLE(c)) { \
uint8_t __t = 0; \
@@ -403,7 +403,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
(c)=(sub); /* ill-formed*/ \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Append a code point to a string, overwriting 1 to 4 bytes.
@@ -418,7 +418,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_APPEND
* @stable ICU 2.4
*/
-#define U8_APPEND_UNSAFE(s, i, c) { \
+#define U8_APPEND_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
uint32_t __uc=(c); \
if(__uc<=0x7f) { \
(s)[(i)++]=(uint8_t)__uc; \
@@ -436,7 +436,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
} \
(s)[(i)++]=(uint8_t)((__uc&0x3f)|0x80); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Append a code point to a string, overwriting 1 to 4 bytes.
@@ -455,7 +455,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_APPEND_UNSAFE
* @stable ICU 2.4
*/
-#define U8_APPEND(s, i, capacity, c, isError) { \
+#define U8_APPEND(s, i, capacity, c, isError) UPRV_BLOCK_MACRO_BEGIN { \
uint32_t __uc=(c); \
if(__uc<=0x7f) { \
(s)[(i)++]=(uint8_t)__uc; \
@@ -474,7 +474,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
} else { \
(isError)=TRUE; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Advance the string offset from one code point boundary to the next.
@@ -486,9 +486,9 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_FWD_1
* @stable ICU 2.4
*/
-#define U8_FWD_1_UNSAFE(s, i) { \
+#define U8_FWD_1_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
(i)+=1+U8_COUNT_TRAIL_BYTES_UNSAFE((s)[i]); \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Advance the string offset from one code point boundary to the next.
@@ -503,7 +503,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_FWD_1_UNSAFE
* @stable ICU 2.4
*/
-#define U8_FWD_1(s, i, length) { \
+#define U8_FWD_1(s, i, length) UPRV_BLOCK_MACRO_BEGIN { \
uint8_t __b=(s)[(i)++]; \
if(U8_IS_LEAD(__b) && (i)!=(length)) { \
uint8_t __t1=(s)[i]; \
@@ -524,7 +524,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
} \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Advance the string offset from one code point boundary to the n-th next one,
@@ -538,13 +538,13 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_FWD_N
* @stable ICU 2.4
*/
-#define U8_FWD_N_UNSAFE(s, i, n) { \
+#define U8_FWD_N_UNSAFE(s, i, n) UPRV_BLOCK_MACRO_BEGIN { \
int32_t __N=(n); \
while(__N>0) { \
U8_FWD_1_UNSAFE(s, i); \
--__N; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Advance the string offset from one code point boundary to the n-th next one,
@@ -561,13 +561,13 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_FWD_N_UNSAFE
* @stable ICU 2.4
*/
-#define U8_FWD_N(s, i, length, n) { \
+#define U8_FWD_N(s, i, length, n) UPRV_BLOCK_MACRO_BEGIN { \
int32_t __N=(n); \
while(__N>0 && ((i)<(length) || ((length)<0 && (s)[i]!=0))) { \
U8_FWD_1(s, i, length); \
--__N; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Adjust a random-access offset to a code point boundary
@@ -582,9 +582,9 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_SET_CP_START
* @stable ICU 2.4
*/
-#define U8_SET_CP_START_UNSAFE(s, i) { \
+#define U8_SET_CP_START_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
while(U8_IS_TRAIL((s)[i])) { --(i); } \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Adjust a random-access offset to a code point boundary
@@ -603,13 +603,12 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_TRUNCATE_IF_INCOMPLETE
* @stable ICU 2.4
*/
-#define U8_SET_CP_START(s, start, i) { \
+#define U8_SET_CP_START(s, start, i) UPRV_BLOCK_MACRO_BEGIN { \
if(U8_IS_TRAIL((s)[(i)])) { \
(i)=utf8_back1SafeBody(s, start, (i)); \
} \
-}
+} UPRV_BLOCK_MACRO_END
-#ifndef U_HIDE_DRAFT_API
/**
* If the string ends with a UTF-8 byte sequence that is valid so far
* but incomplete, then reduce the length of the string to end before
@@ -634,9 +633,9 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @param start int32_t starting string offset (usually 0)
* @param length int32_t string length (usually start<=length)
* @see U8_SET_CP_START
- * @draft ICU 61
+ * @stable ICU 61
*/
-#define U8_TRUNCATE_IF_INCOMPLETE(s, start, length) \
+#define U8_TRUNCATE_IF_INCOMPLETE(s, start, length) UPRV_BLOCK_MACRO_BEGIN { \
if((length)>(start)) { \
uint8_t __b1=s[(length)-1]; \
if(U8_IS_SINGLE(__b1)) { \
@@ -657,8 +656,8 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
} \
} \
} \
- }
-#endif // U_HIDE_DRAFT_API
+ } \
+} UPRV_BLOCK_MACRO_END
/* definitions with backward iteration -------------------------------------- */
@@ -681,7 +680,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_PREV
* @stable ICU 2.4
*/
-#define U8_PREV_UNSAFE(s, i, c) { \
+#define U8_PREV_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(uint8_t)(s)[--(i)]; \
if(U8_IS_TRAIL(c)) { \
uint8_t __b, __count=1, __shift=6; \
@@ -701,7 +700,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
} \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Move the string offset from one code point boundary to the previous one
@@ -723,12 +722,12 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_PREV_UNSAFE
* @stable ICU 2.4
*/
-#define U8_PREV(s, start, i, c) { \
+#define U8_PREV(s, start, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(uint8_t)(s)[--(i)]; \
if(!U8_IS_SINGLE(c)) { \
(c)=utf8_prevCharSafeBody((const uint8_t *)s, start, &(i), c, -1); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Move the string offset from one code point boundary to the previous one
@@ -754,12 +753,12 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_PREV
* @stable ICU 51
*/
-#define U8_PREV_OR_FFFD(s, start, i, c) { \
+#define U8_PREV_OR_FFFD(s, start, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(uint8_t)(s)[--(i)]; \
if(!U8_IS_SINGLE(c)) { \
(c)=utf8_prevCharSafeBody((const uint8_t *)s, start, &(i), c, -3); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Move the string offset from one code point boundary to the previous one.
@@ -772,9 +771,9 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_BACK_1
* @stable ICU 2.4
*/
-#define U8_BACK_1_UNSAFE(s, i) { \
+#define U8_BACK_1_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
while(U8_IS_TRAIL((s)[--(i)])) {} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Move the string offset from one code point boundary to the previous one.
@@ -788,11 +787,11 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_BACK_1_UNSAFE
* @stable ICU 2.4
*/
-#define U8_BACK_1(s, start, i) { \
+#define U8_BACK_1(s, start, i) UPRV_BLOCK_MACRO_BEGIN { \
if(U8_IS_TRAIL((s)[--(i)])) { \
(i)=utf8_back1SafeBody(s, start, (i)); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Move the string offset from one code point boundary to the n-th one before it,
@@ -807,13 +806,13 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_BACK_N
* @stable ICU 2.4
*/
-#define U8_BACK_N_UNSAFE(s, i, n) { \
+#define U8_BACK_N_UNSAFE(s, i, n) UPRV_BLOCK_MACRO_BEGIN { \
int32_t __N=(n); \
while(__N>0) { \
U8_BACK_1_UNSAFE(s, i); \
--__N; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Move the string offset from one code point boundary to the n-th one before it,
@@ -829,13 +828,13 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_BACK_N_UNSAFE
* @stable ICU 2.4
*/
-#define U8_BACK_N(s, start, i, n) { \
+#define U8_BACK_N(s, start, i, n) UPRV_BLOCK_MACRO_BEGIN { \
int32_t __N=(n); \
while(__N>0 && (i)>(start)) { \
U8_BACK_1(s, start, i); \
--__N; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Adjust a random-access offset to a code point boundary after a code point.
@@ -850,10 +849,10 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_SET_CP_LIMIT
* @stable ICU 2.4
*/
-#define U8_SET_CP_LIMIT_UNSAFE(s, i) { \
+#define U8_SET_CP_LIMIT_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
U8_BACK_1_UNSAFE(s, i); \
U8_FWD_1_UNSAFE(s, i); \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Adjust a random-access offset to a code point boundary after a code point.
@@ -872,11 +871,11 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* @see U8_SET_CP_LIMIT_UNSAFE
* @stable ICU 2.4
*/
-#define U8_SET_CP_LIMIT(s, start, i, length) { \
+#define U8_SET_CP_LIMIT(s, start, i, length) UPRV_BLOCK_MACRO_BEGIN { \
if((start)<(i) && ((i)<(length) || (length)<0)) { \
U8_BACK_1(s, start, i); \
U8_FWD_1(s, i, length); \
} \
-}
+} UPRV_BLOCK_MACRO_END
#endif
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/utf_old.h b/Build/source/libs/icu/icu-src/source/common/unicode/utf_old.h
index 55c17c01df6..b2428e6b31e 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/utf_old.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/utf_old.h
@@ -19,9 +19,6 @@
/**
* \file
* \brief C API: Deprecated macros for Unicode string handling
- */
-
-/**
*
* The macros in utf_old.h are all deprecated and their use discouraged.
* Some of the design principles behind the set of UTF macros
@@ -139,12 +136,16 @@
*
* <hr>
*
- * @deprecated ICU 2.4. Use the macros in utf.h, utf16.h, utf8.h instead.
+ * Deprecated ICU 2.4. Use the macros in utf.h, utf16.h, utf8.h instead.
*/
#ifndef __UTF_OLD_H__
#define __UTF_OLD_H__
+#include "unicode/utf.h"
+#include "unicode/utf8.h"
+#include "unicode/utf16.h"
+
/**
* \def U_HIDE_OBSOLETE_UTF_OLD_H
*
@@ -162,10 +163,6 @@
#if !defined(U_HIDE_DEPRECATED_API) && !U_HIDE_OBSOLETE_UTF_OLD_H
-#include "unicode/utf.h"
-#include "unicode/utf8.h"
-#include "unicode/utf16.h"
-
/* Formerly utf.h, part 1 --------------------------------------------------- */
#ifdef U_USE_UTF_DEPRECATES
@@ -365,21 +362,21 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_I
#define UTF8_ARRAY_SIZE(size) ((5*(size))/2)
/** @deprecated ICU 2.4. Renamed to U8_GET_UNSAFE, see utf_old.h. */
-#define UTF8_GET_CHAR_UNSAFE(s, i, c) { \
+#define UTF8_GET_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
int32_t _utf8_get_char_unsafe_index=(int32_t)(i); \
UTF8_SET_CHAR_START_UNSAFE(s, _utf8_get_char_unsafe_index); \
UTF8_NEXT_CHAR_UNSAFE(s, _utf8_get_char_unsafe_index, c); \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Use U8_GET instead, see utf_old.h. */
-#define UTF8_GET_CHAR_SAFE(s, start, i, length, c, strict) { \
+#define UTF8_GET_CHAR_SAFE(s, start, i, length, c, strict) UPRV_BLOCK_MACRO_BEGIN { \
int32_t _utf8_get_char_safe_index=(int32_t)(i); \
UTF8_SET_CHAR_START_SAFE(s, start, _utf8_get_char_safe_index); \
UTF8_NEXT_CHAR_SAFE(s, _utf8_get_char_safe_index, length, c, strict); \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U8_NEXT_UNSAFE, see utf_old.h. */
-#define UTF8_NEXT_CHAR_UNSAFE(s, i, c) { \
+#define UTF8_NEXT_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[(i)++]; \
if((uint8_t)((c)-0xc0)<0x35) { \
uint8_t __count=UTF8_COUNT_TRAIL_BYTES(c); \
@@ -396,10 +393,10 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_I
break; \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U8_APPEND_UNSAFE, see utf_old.h. */
-#define UTF8_APPEND_CHAR_UNSAFE(s, i, c) { \
+#define UTF8_APPEND_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
if((uint32_t)(c)<=0x7f) { \
(s)[(i)++]=(uint8_t)(c); \
} else { \
@@ -416,29 +413,29 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_I
} \
(s)[(i)++]=(uint8_t)(((c)&0x3f)|0x80); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U8_FWD_1_UNSAFE, see utf_old.h. */
-#define UTF8_FWD_1_UNSAFE(s, i) { \
+#define UTF8_FWD_1_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
(i)+=1+UTF8_COUNT_TRAIL_BYTES((s)[i]); \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U8_FWD_N_UNSAFE, see utf_old.h. */
-#define UTF8_FWD_N_UNSAFE(s, i, n) { \
+#define UTF8_FWD_N_UNSAFE(s, i, n) UPRV_BLOCK_MACRO_BEGIN { \
int32_t __N=(n); \
while(__N>0) { \
UTF8_FWD_1_UNSAFE(s, i); \
--__N; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U8_SET_CP_START_UNSAFE, see utf_old.h. */
-#define UTF8_SET_CHAR_START_UNSAFE(s, i) { \
+#define UTF8_SET_CHAR_START_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
while(UTF8_IS_TRAIL((s)[i])) { --(i); } \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Use U8_NEXT instead, see utf_old.h. */
-#define UTF8_NEXT_CHAR_SAFE(s, i, length, c, strict) { \
+#define UTF8_NEXT_CHAR_SAFE(s, i, length, c, strict) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[(i)++]; \
if((c)>=0x80) { \
if(UTF8_IS_LEAD(c)) { \
@@ -447,16 +444,16 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_I
(c)=UTF8_ERROR_VALUE_1; \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Use U8_APPEND instead, see utf_old.h. */
-#define UTF8_APPEND_CHAR_SAFE(s, i, length, c) { \
+#define UTF8_APPEND_CHAR_SAFE(s, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
if((uint32_t)(c)<=0x7f) { \
(s)[(i)++]=(uint8_t)(c); \
} else { \
(i)=utf8_appendCharSafeBody(s, (int32_t)(i), (int32_t)(length), c, NULL); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U8_FWD_1, see utf_old.h. */
#define UTF8_FWD_1_SAFE(s, i, length) U8_FWD_1(s, i, length)
@@ -468,7 +465,7 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_I
#define UTF8_SET_CHAR_START_SAFE(s, start, i) U8_SET_CP_START(s, start, i)
/** @deprecated ICU 2.4. Renamed to U8_PREV_UNSAFE, see utf_old.h. */
-#define UTF8_PREV_CHAR_UNSAFE(s, i, c) { \
+#define UTF8_PREV_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[--(i)]; \
if(UTF8_IS_TRAIL(c)) { \
uint8_t __b, __count=1, __shift=6; \
@@ -488,30 +485,30 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_I
} \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U8_BACK_1_UNSAFE, see utf_old.h. */
-#define UTF8_BACK_1_UNSAFE(s, i) { \
+#define UTF8_BACK_1_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
while(UTF8_IS_TRAIL((s)[--(i)])) {} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U8_BACK_N_UNSAFE, see utf_old.h. */
-#define UTF8_BACK_N_UNSAFE(s, i, n) { \
+#define UTF8_BACK_N_UNSAFE(s, i, n) UPRV_BLOCK_MACRO_BEGIN { \
int32_t __N=(n); \
while(__N>0) { \
UTF8_BACK_1_UNSAFE(s, i); \
--__N; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U8_SET_CP_LIMIT_UNSAFE, see utf_old.h. */
-#define UTF8_SET_CHAR_LIMIT_UNSAFE(s, i) { \
+#define UTF8_SET_CHAR_LIMIT_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
UTF8_BACK_1_UNSAFE(s, i); \
UTF8_FWD_1_UNSAFE(s, i); \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Use U8_PREV instead, see utf_old.h. */
-#define UTF8_PREV_CHAR_SAFE(s, start, i, c, strict) { \
+#define UTF8_PREV_CHAR_SAFE(s, start, i, c, strict) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[--(i)]; \
if((c)>=0x80) { \
if((c)<=0xbf) { \
@@ -520,7 +517,7 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_I
(c)=UTF8_ERROR_VALUE_1; \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U8_BACK_1, see utf_old.h. */
#define UTF8_BACK_1_SAFE(s, start, i) U8_BACK_1(s, start, i)
@@ -593,7 +590,7 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_I
* UTF16_PREV_CHAR[_UNSAFE]() is more efficient for that.
* @deprecated ICU 2.4. Renamed to U16_GET_UNSAFE, see utf_old.h.
*/
-#define UTF16_GET_CHAR_UNSAFE(s, i, c) { \
+#define UTF16_GET_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[i]; \
if(UTF_IS_SURROGATE(c)) { \
if(UTF_IS_SURROGATE_FIRST(c)) { \
@@ -602,10 +599,10 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_I
(c)=UTF16_GET_PAIR_VALUE((s)[(i)-1], (c)); \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Use U16_GET instead, see utf_old.h. */
-#define UTF16_GET_CHAR_SAFE(s, start, i, length, c, strict) { \
+#define UTF16_GET_CHAR_SAFE(s, start, i, length, c, strict) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[i]; \
if(UTF_IS_SURROGATE(c)) { \
uint16_t __c2; \
@@ -629,51 +626,51 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_I
} else if((strict) && !UTF_IS_UNICODE_CHAR(c)) { \
(c)=UTF_ERROR_VALUE; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U16_NEXT_UNSAFE, see utf_old.h. */
-#define UTF16_NEXT_CHAR_UNSAFE(s, i, c) { \
+#define UTF16_NEXT_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[(i)++]; \
if(UTF_IS_FIRST_SURROGATE(c)) { \
(c)=UTF16_GET_PAIR_VALUE((c), (s)[(i)++]); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U16_APPEND_UNSAFE, see utf_old.h. */
-#define UTF16_APPEND_CHAR_UNSAFE(s, i, c) { \
+#define UTF16_APPEND_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
if((uint32_t)(c)<=0xffff) { \
(s)[(i)++]=(uint16_t)(c); \
} else { \
(s)[(i)++]=(uint16_t)(((c)>>10)+0xd7c0); \
(s)[(i)++]=(uint16_t)(((c)&0x3ff)|0xdc00); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U16_FWD_1_UNSAFE, see utf_old.h. */
-#define UTF16_FWD_1_UNSAFE(s, i) { \
+#define UTF16_FWD_1_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
if(UTF_IS_FIRST_SURROGATE((s)[(i)++])) { \
++(i); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U16_FWD_N_UNSAFE, see utf_old.h. */
-#define UTF16_FWD_N_UNSAFE(s, i, n) { \
+#define UTF16_FWD_N_UNSAFE(s, i, n) UPRV_BLOCK_MACRO_BEGIN { \
int32_t __N=(n); \
while(__N>0) { \
UTF16_FWD_1_UNSAFE(s, i); \
--__N; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U16_SET_CP_START_UNSAFE, see utf_old.h. */
-#define UTF16_SET_CHAR_START_UNSAFE(s, i) { \
+#define UTF16_SET_CHAR_START_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
if(UTF_IS_SECOND_SURROGATE((s)[i])) { \
--(i); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Use U16_NEXT instead, see utf_old.h. */
-#define UTF16_NEXT_CHAR_SAFE(s, i, length, c, strict) { \
+#define UTF16_NEXT_CHAR_SAFE(s, i, length, c, strict) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[(i)++]; \
if(UTF_IS_FIRST_SURROGATE(c)) { \
uint16_t __c2; \
@@ -689,10 +686,10 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_I
/* unmatched second surrogate or other non-character */ \
(c)=UTF_ERROR_VALUE; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Use U16_APPEND instead, see utf_old.h. */
-#define UTF16_APPEND_CHAR_SAFE(s, i, length, c) { \
+#define UTF16_APPEND_CHAR_SAFE(s, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
if((uint32_t)(c)<=0xffff) { \
(s)[(i)++]=(uint16_t)(c); \
} else if((uint32_t)(c)<=0x10ffff) { \
@@ -705,7 +702,7 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_I
} else /* c>0x10ffff, write error value */ { \
(s)[(i)++]=UTF_ERROR_VALUE; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U16_FWD_1, see utf_old.h. */
#define UTF16_FWD_1_SAFE(s, i, length) U16_FWD_1(s, i, length)
@@ -717,38 +714,38 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_I
#define UTF16_SET_CHAR_START_SAFE(s, start, i) U16_SET_CP_START(s, start, i)
/** @deprecated ICU 2.4. Renamed to U16_PREV_UNSAFE, see utf_old.h. */
-#define UTF16_PREV_CHAR_UNSAFE(s, i, c) { \
+#define UTF16_PREV_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[--(i)]; \
if(UTF_IS_SECOND_SURROGATE(c)) { \
(c)=UTF16_GET_PAIR_VALUE((s)[--(i)], (c)); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U16_BACK_1_UNSAFE, see utf_old.h. */
-#define UTF16_BACK_1_UNSAFE(s, i) { \
+#define UTF16_BACK_1_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
if(UTF_IS_SECOND_SURROGATE((s)[--(i)])) { \
--(i); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U16_BACK_N_UNSAFE, see utf_old.h. */
-#define UTF16_BACK_N_UNSAFE(s, i, n) { \
+#define UTF16_BACK_N_UNSAFE(s, i, n) UPRV_BLOCK_MACRO_BEGIN { \
int32_t __N=(n); \
while(__N>0) { \
UTF16_BACK_1_UNSAFE(s, i); \
--__N; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U16_SET_CP_LIMIT_UNSAFE, see utf_old.h. */
-#define UTF16_SET_CHAR_LIMIT_UNSAFE(s, i) { \
+#define UTF16_SET_CHAR_LIMIT_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
if(UTF_IS_FIRST_SURROGATE((s)[(i)-1])) { \
++(i); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Use U16_PREV instead, see utf_old.h. */
-#define UTF16_PREV_CHAR_SAFE(s, start, i, c, strict) { \
+#define UTF16_PREV_CHAR_SAFE(s, start, i, c, strict) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[--(i)]; \
if(UTF_IS_SECOND_SURROGATE(c)) { \
uint16_t __c2; \
@@ -764,7 +761,7 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_I
/* unmatched first surrogate or other non-character */ \
(c)=UTF_ERROR_VALUE; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Renamed to U16_BACK_1, see utf_old.h. */
#define UTF16_BACK_1_SAFE(s, start, i) U16_BACK_1(s, start, i)
@@ -830,122 +827,122 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_I
#define UTF32_ARRAY_SIZE(size) (size)
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_GET_CHAR_UNSAFE(s, i, c) { \
+#define UTF32_GET_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[i]; \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_GET_CHAR_SAFE(s, start, i, length, c, strict) { \
+#define UTF32_GET_CHAR_SAFE(s, start, i, length, c, strict) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[i]; \
if(!UTF32_IS_SAFE(c, strict)) { \
(c)=UTF_ERROR_VALUE; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/* definitions with forward iteration --------------------------------------- */
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_NEXT_CHAR_UNSAFE(s, i, c) { \
+#define UTF32_NEXT_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[(i)++]; \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_APPEND_CHAR_UNSAFE(s, i, c) { \
+#define UTF32_APPEND_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(s)[(i)++]=(c); \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_FWD_1_UNSAFE(s, i) { \
+#define UTF32_FWD_1_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
++(i); \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_FWD_N_UNSAFE(s, i, n) { \
+#define UTF32_FWD_N_UNSAFE(s, i, n) UPRV_BLOCK_MACRO_BEGIN { \
(i)+=(n); \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_SET_CHAR_START_UNSAFE(s, i) { \
-}
+#define UTF32_SET_CHAR_START_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_NEXT_CHAR_SAFE(s, i, length, c, strict) { \
+#define UTF32_NEXT_CHAR_SAFE(s, i, length, c, strict) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[(i)++]; \
if(!UTF32_IS_SAFE(c, strict)) { \
(c)=UTF_ERROR_VALUE; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_APPEND_CHAR_SAFE(s, i, length, c) { \
+#define UTF32_APPEND_CHAR_SAFE(s, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
if((uint32_t)(c)<=0x10ffff) { \
(s)[(i)++]=(c); \
} else /* c>0x10ffff, write 0xfffd */ { \
(s)[(i)++]=0xfffd; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_FWD_1_SAFE(s, i, length) { \
+#define UTF32_FWD_1_SAFE(s, i, length) UPRV_BLOCK_MACRO_BEGIN { \
++(i); \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_FWD_N_SAFE(s, i, length, n) { \
+#define UTF32_FWD_N_SAFE(s, i, length, n) UPRV_BLOCK_MACRO_BEGIN { \
if(((i)+=(n))>(length)) { \
(i)=(length); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_SET_CHAR_START_SAFE(s, start, i) { \
-}
+#define UTF32_SET_CHAR_START_SAFE(s, start, i) UPRV_BLOCK_MACRO_BEGIN { \
+} UPRV_BLOCK_MACRO_END
/* definitions with backward iteration -------------------------------------- */
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_PREV_CHAR_UNSAFE(s, i, c) { \
+#define UTF32_PREV_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[--(i)]; \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_BACK_1_UNSAFE(s, i) { \
+#define UTF32_BACK_1_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
--(i); \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_BACK_N_UNSAFE(s, i, n) { \
+#define UTF32_BACK_N_UNSAFE(s, i, n) UPRV_BLOCK_MACRO_BEGIN { \
(i)-=(n); \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_SET_CHAR_LIMIT_UNSAFE(s, i) { \
-}
+#define UTF32_SET_CHAR_LIMIT_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_PREV_CHAR_SAFE(s, start, i, c, strict) { \
+#define UTF32_PREV_CHAR_SAFE(s, start, i, c, strict) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(s)[--(i)]; \
if(!UTF32_IS_SAFE(c, strict)) { \
(c)=UTF_ERROR_VALUE; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_BACK_1_SAFE(s, start, i) { \
+#define UTF32_BACK_1_SAFE(s, start, i) UPRV_BLOCK_MACRO_BEGIN { \
--(i); \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_BACK_N_SAFE(s, start, i, n) { \
+#define UTF32_BACK_N_SAFE(s, start, i, n) UPRV_BLOCK_MACRO_BEGIN { \
(i)-=(n); \
if((i)<(start)) { \
(i)=(start); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** @deprecated ICU 2.4. Obsolete, see utf_old.h. */
-#define UTF32_SET_CHAR_LIMIT_SAFE(s, i, length) { \
-}
+#define UTF32_SET_CHAR_LIMIT_SAFE(s, i, length) UPRV_BLOCK_MACRO_BEGIN { \
+} UPRV_BLOCK_MACRO_END
/* Formerly utf.h, part 2 --------------------------------------------------- */
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/utrace.h b/Build/source/libs/icu/icu-src/source/common/unicode/utrace.h
index 66269784dbc..5afcd9f4490 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/utrace.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/utrace.h
@@ -66,6 +66,7 @@ typedef enum UTraceFunctionNumber {
UTRACE_FUNCTION_START=0,
UTRACE_U_INIT=UTRACE_FUNCTION_START,
UTRACE_U_CLEANUP,
+
#ifndef U_HIDE_DEPRECATED_API
/**
* One more than the highest normal collation trace location.
@@ -83,6 +84,7 @@ typedef enum UTraceFunctionNumber {
UTRACE_UCNV_FLUSH_CACHE,
UTRACE_UCNV_LOAD,
UTRACE_UCNV_UNLOAD,
+
#ifndef U_HIDE_DEPRECATED_API
/**
* One more than the highest normal collation trace location.
@@ -101,13 +103,80 @@ typedef enum UTraceFunctionNumber {
UTRACE_UCOL_STRCOLLITER,
UTRACE_UCOL_OPEN_FROM_SHORT_STRING,
UTRACE_UCOL_STRCOLLUTF8, /**< @stable ICU 50 */
+
#ifndef U_HIDE_DEPRECATED_API
/**
* One more than the highest normal collation trace location.
* @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
*/
- UTRACE_COLLATION_LIMIT
+ UTRACE_COLLATION_LIMIT,
#endif // U_HIDE_DEPRECATED_API
+
+#ifndef U_HIDE_DRAFT_API
+
+ /**
+ * The lowest resource/data location.
+ * @draft ICU 65
+ */
+ UTRACE_UDATA_START=0x3000,
+
+ /**
+ * Indicates that a value was read from a resource bundle. Provides three
+ * C-style strings to UTraceData: type, file name, and resource path. The
+ * possible types are:
+ *
+ * - "string" (a string value was accessed)
+ * - "binary" (a binary value was accessed)
+ * - "intvector" (a integer vector value was accessed)
+ * - "int" (a signed integer value was accessed)
+ * - "uint" (a unsigned integer value was accessed)
+ * - "get" (a path was loaded, but the value was not accessed)
+ * - "getalias" (a path was loaded, and an alias was resolved)
+ *
+ * @draft ICU 65
+ */
+ UTRACE_UDATA_RESOURCE=UTRACE_UDATA_START,
+
+ /**
+ * Indicates that a resource bundle was opened.
+ *
+ * Provides one C-style string to UTraceData: file name.
+ * @draft ICU 65
+ */
+ UTRACE_UDATA_BUNDLE,
+
+ /**
+ * Indicates that a data file was opened, but not *.res files.
+ *
+ * Provides one C-style string to UTraceData: file name.
+ *
+ * @draft ICU 65
+ */
+ UTRACE_UDATA_DATA_FILE,
+
+ /**
+ * Indicates that a *.res file was opened.
+ *
+ * This differs from UTRACE_UDATA_BUNDLE because a res file is typically
+ * opened only once per application runtime, but the bundle corresponding
+ * to that res file may be opened many times.
+ *
+ * Provides one C-style string to UTraceData: file name.
+ *
+ * @draft ICU 65
+ */
+ UTRACE_UDATA_RES_FILE,
+
+#endif // U_HIDE_DRAFT_API
+
+#ifndef U_HIDE_INTERNAL_API
+ /**
+ * One more than the highest normal resource/data trace location.
+ * @internal The numeric value may change over time, see ICU ticket #12420.
+ */
+ UTRACE_RES_DATA_LIMIT,
+#endif // U_HIDE_INTERNAL_API
+
} UTraceFunctionNumber;
/**
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/utypes.h b/Build/source/libs/icu/icu-src/source/common/unicode/utypes.h
index 2baf519f7fb..8d8f54764e0 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/utypes.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/utypes.h
@@ -385,17 +385,31 @@ typedef double UDate;
/*===========================================================================*/
/**
- * Error code to replace exception handling, so that the code is compatible with all C++ compilers,
- * and to use the same mechanism for C and C++.
+ * Standard ICU4C error code type, a substitute for exceptions.
+ *
+ * Initialize the UErrorCode with U_ZERO_ERROR, and check for success or
+ * failure using U_SUCCESS() or U_FAILURE():
+ *
+ * UErrorCode errorCode = U_ZERO_ERROR;
+ * // call ICU API that needs an error code parameter.
+ * if (U_FAILURE(errorCode)) {
+ * // An error occurred. Handle it here.
+ * }
+ *
+ * C++ code should use icu::ErrorCode, available in unicode/errorcode.h, or a
+ * suitable subclass.
+ *
+ * For more information, see:
+ * http://icu-project.org/userguide/conventions
+ *
+ * Note: By convention, ICU functions that take a reference (C++) or a pointer
+ * (C) to a UErrorCode first test:
+ *
+ * if (U_FAILURE(errorCode)) { return immediately; }
*
- * \par
- * ICU functions that take a reference (C++) or a pointer (C) to a UErrorCode
- * first test if(U_FAILURE(errorCode)) { return immediately; }
* so that in a chain of such functions the first one that sets an error code
* causes the following ones to not perform any operations.
*
- * \par
- * Error codes should be tested using U_FAILURE() and U_SUCCESS().
* @stable ICU 2.0
*/
typedef enum UErrorCode {
@@ -544,12 +558,8 @@ typedef enum UErrorCode {
U_DEFAULT_KEYWORD_MISSING, /**< Missing DEFAULT rule in plural rules */
U_DECIMAL_NUMBER_SYNTAX_ERROR, /**< Decimal number syntax error */
U_FORMAT_INEXACT_ERROR, /**< Cannot format a number exactly and rounding mode is ROUND_UNNECESSARY @stable ICU 4.8 */
-#ifndef U_HIDE_DRAFT_API
- U_NUMBER_ARG_OUTOFBOUNDS_ERROR, /**< The argument to a NumberFormatter helper method was out of bounds; the bounds are usually 0 to 999. @draft ICU 61 */
-#endif // U_HIDE_DRAFT_API
-#ifndef U_HIDE_DRAFT_API
- U_NUMBER_SKELETON_SYNTAX_ERROR, /**< The number skeleton passed to C++ NumberFormatter or C UNumberFormatter was invalid or contained a syntax error. @draft ICU 62 */
-#endif // U_HIDE_DRAFT_API
+ U_NUMBER_ARG_OUTOFBOUNDS_ERROR, /**< The argument to a NumberFormatter helper method was out of bounds; the bounds are usually 0 to 999. @stable ICU 61 */
+ U_NUMBER_SKELETON_SYNTAX_ERROR, /**< The number skeleton passed to C++ NumberFormatter or C UNumberFormatter was invalid or contained a syntax error. @stable ICU 62 */
#ifndef U_HIDE_DEPRECATED_API
/**
* One more than the highest normal formatting API error code.
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uvernum.h b/Build/source/libs/icu/icu-src/source/common/unicode/uvernum.h
index 83d0b4ecd1c..0923c1d9189 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/uvernum.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/uvernum.h
@@ -60,7 +60,7 @@
* This value will change in the subsequent releases of ICU
* @stable ICU 2.4
*/
-#define U_ICU_VERSION_MAJOR_NUM 63
+#define U_ICU_VERSION_MAJOR_NUM 65
/** The current ICU minor version as an integer.
* This value will change in the subsequent releases of ICU
@@ -86,7 +86,7 @@
* This value will change in the subsequent releases of ICU
* @stable ICU 2.6
*/
-#define U_ICU_VERSION_SUFFIX _63
+#define U_ICU_VERSION_SUFFIX _65
/**
* \def U_DEF2_ICU_ENTRY_POINT_RENAME
@@ -103,16 +103,34 @@
* \def U_ICU_ENTRY_POINT_RENAME
* @stable ICU 4.2
*/
+/**
+ * Disable the version suffix. Use the custom suffix if exists.
+ * \def U_DISABLE_VERSION_SUFFIX
+ * @internal
+ */
+#ifndef U_DISABLE_VERSION_SUFFIX
+#define U_DISABLE_VERSION_SUFFIX 0
+#endif
#ifndef U_ICU_ENTRY_POINT_RENAME
#ifdef U_HAVE_LIB_SUFFIX
-#define U_DEF_ICU_ENTRY_POINT_RENAME(x,y,z) x ## y ## z
-#define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y,z) U_DEF_ICU_ENTRY_POINT_RENAME(x,y,z)
-#define U_ICU_ENTRY_POINT_RENAME(x) U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX,U_LIB_SUFFIX_C_NAME)
+# if !U_DISABLE_VERSION_SUFFIX
+# define U_DEF_ICU_ENTRY_POINT_RENAME(x,y,z) x ## y ## z
+# define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y,z) U_DEF_ICU_ENTRY_POINT_RENAME(x,y,z)
+# define U_ICU_ENTRY_POINT_RENAME(x) U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX,U_LIB_SUFFIX_C_NAME)
+# else
+# define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
+# define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
+# define U_ICU_ENTRY_POINT_RENAME(x) U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_LIB_SUFFIX_C_NAME)
+# endif
#else
-#define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
-#define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
-#define U_ICU_ENTRY_POINT_RENAME(x) U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
+# if !U_DISABLE_VERSION_SUFFIX
+# define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
+# define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
+# define U_ICU_ENTRY_POINT_RENAME(x) U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
+# else
+# define U_ICU_ENTRY_POINT_RENAME(x) x
+# endif
#endif
#endif
@@ -121,7 +139,7 @@
* This value will change in the subsequent releases of ICU
* @stable ICU 2.4
*/
-#define U_ICU_VERSION "63.1"
+#define U_ICU_VERSION "65.1"
/**
* The current ICU library major version number as a string, for library name suffixes.
@@ -134,13 +152,13 @@
*
* @stable ICU 2.6
*/
-#define U_ICU_VERSION_SHORT "63"
+#define U_ICU_VERSION_SHORT "65"
#ifndef U_HIDE_INTERNAL_API
/** Data version in ICU4C.
* @internal ICU 4.4 Internal Use Only
**/
-#define U_ICU_DATA_VERSION "63.1"
+#define U_ICU_DATA_VERSION "65.1"
#endif /* U_HIDE_INTERNAL_API */
/*===========================================================================
diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uversion.h b/Build/source/libs/icu/icu-src/source/common/unicode/uversion.h
index 4aaa8b4d606..5700f62cbff 100644
--- a/Build/source/libs/icu/icu-src/source/common/unicode/uversion.h
+++ b/Build/source/libs/icu/icu-src/source/common/unicode/uversion.h
@@ -62,26 +62,22 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH];
/* C++ namespace if supported. Versioned unless versioning is disabled. */
/*===========================================================================*/
+/* Define C++ namespace symbols. */
+#ifdef __cplusplus
+
/**
* \def U_NAMESPACE_BEGIN
- * This is used to begin a declaration of a public ICU C++ API.
- * When not compiling for C++, it does nothing.
- * When compiling for C++, it begins an extern "C++" linkage block (to protect
- * against cases in which an external client includes ICU header files inside
- * an extern "C" linkage block).
+ * This is used to begin a declaration of a public ICU C++ API within
+ * versioned-ICU-namespace block.
*
- * It also begins a versioned-ICU-namespace block.
* @stable ICU 2.4
*/
/**
* \def U_NAMESPACE_END
* This is used to end a declaration of a public ICU C++ API.
- * When not compiling for C++, it does nothing.
- * When compiling for C++, it ends the extern "C++" block begun by
- * U_NAMESPACE_BEGIN.
+ * It ends the versioned-ICU-namespace block begun by U_NAMESPACE_BEGIN.
*
- * It also ends the versioned-ICU-namespace block begun by U_NAMESPACE_BEGIN.
* @stable ICU 2.4
*/
@@ -89,9 +85,6 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH];
* \def U_NAMESPACE_USE
* This is used to specify that the rest of the code uses the
* public ICU C++ API namespace.
- * This is invoked by default; we recommend that you turn it off:
- * See the "Recommended Build Options" section of the ICU4C readme
- * (http://source.icu-project.org/repos/icu/icu/trunk/readme.html#RecBuild)
* @stable ICU 2.4
*/
@@ -105,8 +98,6 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH];
* @stable ICU 2.4
*/
-/* Define C++ namespace symbols. */
-#ifdef __cplusplus
# if U_DISABLE_RENAMING
# define U_ICU_NAMESPACE icu
namespace U_ICU_NAMESPACE { }
@@ -116,8 +107,8 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH];
namespace icu = U_ICU_NAMESPACE;
# endif
-# define U_NAMESPACE_BEGIN extern "C++" { namespace U_ICU_NAMESPACE {
-# define U_NAMESPACE_END } }
+# define U_NAMESPACE_BEGIN namespace U_ICU_NAMESPACE {
+# define U_NAMESPACE_END }
# define U_NAMESPACE_USE using namespace U_ICU_NAMESPACE;
# define U_NAMESPACE_QUALIFIER U_ICU_NAMESPACE::
@@ -133,12 +124,7 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH];
# if U_USING_ICU_NAMESPACE
U_NAMESPACE_USE
# endif
-#else
-# define U_NAMESPACE_BEGIN
-# define U_NAMESPACE_END
-# define U_NAMESPACE_USE
-# define U_NAMESPACE_QUALIFIER
-#endif
+#endif /* __cplusplus */
/*===========================================================================*/
/* General version helper functions. Definitions in putil.c */
diff --git a/Build/source/libs/icu/icu-src/source/common/unifiedcache.cpp b/Build/source/libs/icu/icu-src/source/common/unifiedcache.cpp
index d33d8d2c01c..f2dd9165595 100644
--- a/Build/source/libs/icu/icu-src/source/common/unifiedcache.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/unifiedcache.cpp
@@ -13,16 +13,15 @@
#include "unifiedcache.h"
#include <algorithm> // For std::max()
+#include <mutex>
-#include "mutex.h"
#include "uassert.h"
#include "uhash.h"
#include "ucln_cmn.h"
-#include "umutex.h"
static icu::UnifiedCache *gCache = NULL;
-static UMutex gCacheMutex = U_MUTEX_INITIALIZER;
-static UConditionVar gInProgressValueAddedCond = U_CONDITION_INITIALIZER;
+static std::mutex *gCacheMutex = nullptr;
+static std::condition_variable *gInProgressValueAddedCond;
static icu::UInitOnce gCacheInitOnce = U_INITONCE_INITIALIZER;
static const int32_t MAX_EVICT_ITERATIONS = 10;
@@ -33,10 +32,12 @@ static const int32_t DEFAULT_PERCENTAGE_OF_IN_USE = 100;
U_CDECL_BEGIN
static UBool U_CALLCONV unifiedcache_cleanup() {
gCacheInitOnce.reset();
- if (gCache) {
- delete gCache;
- gCache = NULL;
- }
+ delete gCache;
+ gCache = nullptr;
+ gCacheMutex->~mutex();
+ gCacheMutex = nullptr;
+ gInProgressValueAddedCond->~condition_variable();
+ gInProgressValueAddedCond = nullptr;
return TRUE;
}
U_CDECL_END
@@ -71,6 +72,8 @@ static void U_CALLCONV cacheInit(UErrorCode &status) {
ucln_common_registerCleanup(
UCLN_COMMON_UNIFIED_CACHE, unifiedcache_cleanup);
+ gCacheMutex = STATIC_NEW(std::mutex);
+ gInProgressValueAddedCond = STATIC_NEW(std::condition_variable);
gCache = new UnifiedCache(status);
if (gCache == NULL) {
status = U_MEMORY_ALLOCATION_ERROR;
@@ -132,28 +135,28 @@ void UnifiedCache::setEvictionPolicy(
status = U_ILLEGAL_ARGUMENT_ERROR;
return;
}
- Mutex lock(&gCacheMutex);
+ std::lock_guard<std::mutex> lock(*gCacheMutex);
fMaxUnused = count;
fMaxPercentageOfInUse = percentageOfInUseItems;
}
int32_t UnifiedCache::unusedCount() const {
- Mutex lock(&gCacheMutex);
+ std::lock_guard<std::mutex> lock(*gCacheMutex);
return uhash_count(fHashtable) - fNumValuesInUse;
}
int64_t UnifiedCache::autoEvictedCount() const {
- Mutex lock(&gCacheMutex);
+ std::lock_guard<std::mutex> lock(*gCacheMutex);
return fAutoEvictedCount;
}
int32_t UnifiedCache::keyCount() const {
- Mutex lock(&gCacheMutex);
+ std::lock_guard<std::mutex> lock(*gCacheMutex);
return uhash_count(fHashtable);
}
void UnifiedCache::flush() const {
- Mutex lock(&gCacheMutex);
+ std::lock_guard<std::mutex> lock(*gCacheMutex);
// Use a loop in case cache items that are flushed held hard references to
// other cache items making those additional cache items eligible for
@@ -162,7 +165,7 @@ void UnifiedCache::flush() const {
}
void UnifiedCache::handleUnreferencedObject() const {
- Mutex lock(&gCacheMutex);
+ std::lock_guard<std::mutex> lock(*gCacheMutex);
--fNumValuesInUse;
_runEvictionSlice();
}
@@ -181,7 +184,7 @@ void UnifiedCache::dump() {
}
void UnifiedCache::dumpContents() const {
- Mutex lock(&gCacheMutex);
+ std::lock_guard<std::mutex> lock(*gCacheMutex);
_dumpContents();
}
@@ -221,7 +224,7 @@ UnifiedCache::~UnifiedCache() {
// Now all that should be left in the cache are entries that refer to
// each other and entries with hard references from outside the cache.
// Nothing we can do about these so proceed to wipe out the cache.
- Mutex lock(&gCacheMutex);
+ std::lock_guard<std::mutex> lock(*gCacheMutex);
_flush(TRUE);
}
uhash_close(fHashtable);
@@ -322,7 +325,7 @@ void UnifiedCache::_putIfAbsentAndGet(
const CacheKeyBase &key,
const SharedObject *&value,
UErrorCode &status) const {
- Mutex lock(&gCacheMutex);
+ std::lock_guard<std::mutex> lock(*gCacheMutex);
const UHashElement *element = uhash_find(fHashtable, &key);
if (element != NULL && !_inProgress(element)) {
_fetch(element, value, status);
@@ -347,15 +350,15 @@ UBool UnifiedCache::_poll(
UErrorCode &status) const {
U_ASSERT(value == NULL);
U_ASSERT(status == U_ZERO_ERROR);
- Mutex lock(&gCacheMutex);
+ std::unique_lock<std::mutex> lock(*gCacheMutex);
const UHashElement *element = uhash_find(fHashtable, &key);
// If the hash table contains an inProgress placeholder entry for this key,
// this means that another thread is currently constructing the value object.
// Loop, waiting for that construction to complete.
while (element != NULL && _inProgress(element)) {
- umtx_condWait(&gInProgressValueAddedCond, &gCacheMutex);
- element = uhash_find(fHashtable, &key);
+ gInProgressValueAddedCond->wait(lock);
+ element = uhash_find(fHashtable, &key);
}
// If the hash table contains an entry for the key,
@@ -427,7 +430,7 @@ void UnifiedCache::_put(
// Tell waiting threads that we replace in-progress status with
// an error.
- umtx_condBroadcast(&gInProgressValueAddedCond);
+ gInProgressValueAddedCond->notify_all();
}
void UnifiedCache::_fetch(
diff --git a/Build/source/libs/icu/icu-src/source/common/unifiedcache.h b/Build/source/libs/icu/icu-src/source/common/unifiedcache.h
index 4c9992be25e..d6c9945126c 100644
--- a/Build/source/libs/icu/icu-src/source/common/unifiedcache.h
+++ b/Build/source/libs/icu/icu-src/source/common/unifiedcache.h
@@ -137,7 +137,7 @@ class LocaleCacheKey : public CacheKey<T> {
protected:
Locale fLoc;
public:
- LocaleCacheKey(const Locale &loc) : fLoc(loc) {};
+ LocaleCacheKey(const Locale &loc) : fLoc(loc) {}
LocaleCacheKey(const LocaleCacheKey<T> &other)
: CacheKey<T>(other), fLoc(other.fLoc) { }
virtual ~LocaleCacheKey() { }
diff --git a/Build/source/libs/icu/icu-src/source/common/uniset.cpp b/Build/source/libs/icu/icu-src/source/common/uniset.cpp
index e8378e0a223..b73d612f246 100644
--- a/Build/source/libs/icu/icu-src/source/common/uniset.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uniset.cpp
@@ -14,6 +14,7 @@
#include "unicode/parsepos.h"
#include "unicode/symtable.h"
#include "unicode/uniset.h"
+#include "unicode/ustring.h"
#include "unicode/utf8.h"
#include "unicode/utf16.h"
#include "ruleiter.h"
@@ -53,11 +54,8 @@
// LOW <= all valid values. ZERO for codepoints
#define UNICODESET_LOW 0x000000
-// initial storage. Must be >= 0
-#define START_EXTRA 16
-
-// extra amount for growth. Must be >= 0
-#define GROW_EXTRA START_EXTRA
+/** Max list [0, 1, 2, ..., max code point, HIGH] */
+constexpr int32_t MAX_LENGTH = UNICODESET_HIGH + 1;
U_NAMESPACE_BEGIN
@@ -137,6 +135,18 @@ static int8_t U_CALLCONV compareUnicodeString(UElement t1, UElement t2) {
return a.compare(b);
}
+UBool UnicodeSet::hasStrings() const {
+ return strings != nullptr && !strings->isEmpty();
+}
+
+int32_t UnicodeSet::stringsSize() const {
+ return strings == nullptr ? 0 : strings->size();
+}
+
+UBool UnicodeSet::stringsContains(const UnicodeString &s) const {
+ return strings != nullptr && strings->contains((void*) &s);
+}
+
//----------------------------------------------------------------
// Constructors &c
//----------------------------------------------------------------
@@ -144,24 +154,8 @@ static int8_t U_CALLCONV compareUnicodeString(UElement t1, UElement t2) {
/**
* Constructs an empty set.
*/
-UnicodeSet::UnicodeSet() :
- len(1), capacity(1 + START_EXTRA), list(0), bmpSet(0), buffer(0),
- bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL),
- fFlags(0)
-{
- UErrorCode status = U_ZERO_ERROR;
- allocateStrings(status);
- if (U_FAILURE(status)) {
- setToBogus(); // If memory allocation failed, set to bogus state.
- return;
- }
- list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity);
- if(list!=NULL){
- list[0] = UNICODESET_HIGH;
- } else { // If memory allocation failed, set to bogus state.
- setToBogus();
- return;
- }
+UnicodeSet::UnicodeSet() {
+ list[0] = UNICODESET_HIGH;
_dbgct(this);
}
@@ -172,89 +166,39 @@ UnicodeSet::UnicodeSet() :
* @param start first character, inclusive, of range
* @param end last character, inclusive, of range
*/
-UnicodeSet::UnicodeSet(UChar32 start, UChar32 end) :
- len(1), capacity(1 + START_EXTRA), list(0), bmpSet(0), buffer(0),
- bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL),
- fFlags(0)
-{
- UErrorCode status = U_ZERO_ERROR;
- allocateStrings(status);
- if (U_FAILURE(status)) {
- setToBogus(); // If memory allocation failed, set to bogus state.
- return;
- }
- list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity);
- if(list!=NULL){
- list[0] = UNICODESET_HIGH;
- complement(start, end);
- } else { // If memory allocation failed, set to bogus state.
- setToBogus();
- return;
- }
+UnicodeSet::UnicodeSet(UChar32 start, UChar32 end) {
+ list[0] = UNICODESET_HIGH;
+ add(start, end);
_dbgct(this);
}
/**
* Constructs a set that is identical to the given UnicodeSet.
*/
-UnicodeSet::UnicodeSet(const UnicodeSet& o) :
- UnicodeFilter(o),
- len(0), capacity(o.isFrozen() ? o.len : o.len + GROW_EXTRA), list(0),
- bmpSet(0),
- buffer(0), bufferCapacity(0),
- patLen(0), pat(NULL), strings(NULL), stringSpan(NULL),
- fFlags(0)
-{
- UErrorCode status = U_ZERO_ERROR;
- allocateStrings(status);
- if (U_FAILURE(status)) {
- setToBogus(); // If memory allocation failed, set to bogus state.
- return;
- }
- list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity);
- if(list!=NULL){
- *this = o;
- } else { // If memory allocation failed, set to bogus state.
- setToBogus();
- return;
- }
+UnicodeSet::UnicodeSet(const UnicodeSet& o) : UnicodeFilter(o) {
+ *this = o;
_dbgct(this);
}
// Copy-construct as thawed.
-UnicodeSet::UnicodeSet(const UnicodeSet& o, UBool /* asThawed */) :
- UnicodeFilter(o),
- len(0), capacity(o.len + GROW_EXTRA), list(0),
- bmpSet(0),
- buffer(0), bufferCapacity(0),
- patLen(0), pat(NULL), strings(NULL), stringSpan(NULL),
- fFlags(0)
-{
- UErrorCode status = U_ZERO_ERROR;
- allocateStrings(status);
- if (U_FAILURE(status)) {
- setToBogus(); // If memory allocation failed, set to bogus state.
- return;
- }
- list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity);
- if(list!=NULL){
+UnicodeSet::UnicodeSet(const UnicodeSet& o, UBool /* asThawed */) : UnicodeFilter(o) {
+ if (ensureCapacity(o.len)) {
// *this = o except for bmpSet and stringSpan
len = o.len;
uprv_memcpy(list, o.list, (size_t)len*sizeof(UChar32));
- if (strings != NULL && o.strings != NULL) {
- strings->assign(*o.strings, cloneUnicodeString, status);
- } else { // Invalid strings.
- setToBogus();
- return;
+ if (o.hasStrings()) {
+ UErrorCode status = U_ZERO_ERROR;
+ if (!allocateStrings(status) ||
+ (strings->assign(*o.strings, cloneUnicodeString, status), U_FAILURE(status))) {
+ setToBogus();
+ return;
+ }
}
if (o.pat) {
- setPattern(UnicodeString(o.pat, o.patLen));
+ setPattern(o.pat, o.patLen);
}
- } else { // If memory allocation failed, set to bogus state.
- setToBogus();
- return;
+ _dbgct(this);
}
- _dbgct(this);
}
/**
@@ -262,9 +206,11 @@ UnicodeSet::UnicodeSet(const UnicodeSet& o, UBool /* asThawed */) :
*/
UnicodeSet::~UnicodeSet() {
_dbgdt(this); // first!
- uprv_free(list);
+ if (list != stackList) {
+ uprv_free(list);
+ }
delete bmpSet;
- if (buffer) {
+ if (buffer != stackList) {
uprv_free(buffer);
}
delete strings;
@@ -290,32 +236,30 @@ UnicodeSet& UnicodeSet::copyFrom(const UnicodeSet& o, UBool asThawed) {
setToBogus();
return *this;
}
- UErrorCode ec = U_ZERO_ERROR;
- ensureCapacity(o.len, ec);
- if (U_FAILURE(ec)) {
+ if (!ensureCapacity(o.len)) {
// ensureCapacity will mark the UnicodeSet as Bogus if OOM failure happens.
return *this;
}
len = o.len;
uprv_memcpy(list, o.list, (size_t)len*sizeof(UChar32));
- if (o.bmpSet == NULL || asThawed) {
- bmpSet = NULL;
- } else {
+ if (o.bmpSet != nullptr && !asThawed) {
bmpSet = new BMPSet(*o.bmpSet, list, len);
if (bmpSet == NULL) { // Check for memory allocation error.
setToBogus();
return *this;
}
}
- if (strings != NULL && o.strings != NULL) {
- strings->assign(*o.strings, cloneUnicodeString, ec);
- } else { // Invalid strings.
- setToBogus();
- return *this;
+ if (o.hasStrings()) {
+ UErrorCode status = U_ZERO_ERROR;
+ if ((strings == nullptr && !allocateStrings(status)) ||
+ (strings->assign(*o.strings, cloneUnicodeString, status), U_FAILURE(status))) {
+ setToBogus();
+ return *this;
+ }
+ } else if (hasStrings()) {
+ strings->removeAllElements();
}
- if (o.stringSpan == NULL || asThawed) {
- stringSpan = NULL;
- } else {
+ if (o.stringSpan != nullptr && !asThawed) {
stringSpan = new UnicodeSetStringSpan(*o.stringSpan, *strings);
if (stringSpan == NULL) { // Check for memory allocation error.
setToBogus();
@@ -324,7 +268,7 @@ UnicodeSet& UnicodeSet::copyFrom(const UnicodeSet& o, UBool asThawed) {
}
releasePattern();
if (o.pat) {
- setPattern(UnicodeString(o.pat, o.patLen));
+ setPattern(o.pat, o.patLen);
}
return *this;
}
@@ -334,11 +278,11 @@ UnicodeSet& UnicodeSet::copyFrom(const UnicodeSet& o, UBool asThawed) {
* to support cloning in order to allow classes using
* UnicodeMatchers, such as Transliterator, to implement cloning.
*/
-UnicodeFunctor* UnicodeSet::clone() const {
+UnicodeSet* UnicodeSet::clone() const {
return new UnicodeSet(*this);
}
-UnicodeFunctor *UnicodeSet::cloneAsThawed() const {
+UnicodeSet *UnicodeSet::cloneAsThawed() const {
return new UnicodeSet(*this, TRUE);
}
@@ -357,7 +301,8 @@ UBool UnicodeSet::operator==(const UnicodeSet& o) const {
for (int32_t i = 0; i < len; ++i) {
if (list[i] != o.list[i]) return FALSE;
}
- if (*strings != *o.strings) return FALSE;
+ if (hasStrings() != o.hasStrings()) { return FALSE; }
+ if (hasStrings() && *strings != *o.strings) return FALSE;
return TRUE;
}
@@ -393,7 +338,7 @@ int32_t UnicodeSet::size(void) const {
for (int32_t i = 0; i < count; ++i) {
n += getRangeEnd(i) - getRangeStart(i) + 1;
}
- return n + strings->size();
+ return n + stringsSize();
}
/**
@@ -402,7 +347,7 @@ int32_t UnicodeSet::size(void) const {
* @return <tt>true</tt> if this set contains no elements.
*/
UBool UnicodeSet::isEmpty(void) const {
- return len == 1 && strings->size() == 0;
+ return len == 1 && !hasStrings();
}
/**
@@ -502,7 +447,7 @@ UBool UnicodeSet::contains(const UnicodeString& s) const {
if (s.length() == 0) return FALSE;
int32_t cp = getSingleCP(s);
if (cp < 0) {
- return strings->contains((void*) &s);
+ return stringsContains(s);
} else {
return contains((UChar32) cp);
}
@@ -524,8 +469,7 @@ UBool UnicodeSet::containsAll(const UnicodeSet& c) const {
return FALSE;
}
}
- if (!strings->containsAll(*c.strings)) return FALSE;
- return TRUE;
+ return !c.hasStrings() || (strings != nullptr && strings->containsAll(*c.strings));
}
/**
@@ -571,8 +515,7 @@ UBool UnicodeSet::containsNone(const UnicodeSet& c) const {
return FALSE;
}
}
- if (!strings->containsNone(*c.strings)) return FALSE;
- return TRUE;
+ return strings == nullptr || !c.hasStrings() || strings->containsNone(*c.strings);
}
/**
@@ -613,7 +556,7 @@ UBool UnicodeSet::matchesIndexValue(uint8_t v) const {
return TRUE;
}
}
- if (strings->size() != 0) {
+ if (hasStrings()) {
for (i=0; i<strings->size(); ++i) {
const UnicodeString& s = *(const UnicodeString*)strings->elementAt(i);
//if (s.length() == 0) {
@@ -648,7 +591,7 @@ UMatchDegree UnicodeSet::matches(const Replaceable& text,
return U_MISMATCH;
}
} else {
- if (strings->size() != 0) { // try strings first
+ if (hasStrings()) { // try strings first
// might separate forward and backward loops later
// for now they are combined
@@ -849,7 +792,39 @@ UnicodeSet& UnicodeSet::set(UChar32 start, UChar32 end) {
*/
UnicodeSet& UnicodeSet::add(UChar32 start, UChar32 end) {
if (pinCodePoint(start) < pinCodePoint(end)) {
- UChar32 range[3] = { start, end+1, UNICODESET_HIGH };
+ UChar32 limit = end + 1;
+ // Fast path for adding a new range after the last one.
+ // Odd list length: [..., lastStart, lastLimit, HIGH]
+ if ((len & 1) != 0) {
+ // If the list is empty, set lastLimit low enough to not be adjacent to 0.
+ UChar32 lastLimit = len == 1 ? -2 : list[len - 2];
+ if (lastLimit <= start && !isFrozen() && !isBogus()) {
+ if (lastLimit == start) {
+ // Extend the last range.
+ list[len - 2] = limit;
+ if (limit == UNICODESET_HIGH) {
+ --len;
+ }
+ } else {
+ list[len - 1] = start;
+ if (limit < UNICODESET_HIGH) {
+ if (ensureCapacity(len + 2)) {
+ list[len++] = limit;
+ list[len++] = UNICODESET_HIGH;
+ }
+ } else { // limit == UNICODESET_HIGH
+ if (ensureCapacity(len + 1)) {
+ list[len++] = UNICODESET_HIGH;
+ }
+ }
+ }
+ releasePattern();
+ return *this;
+ }
+ }
+ // This is slow. Could be much faster using findCodePoint(start)
+ // and modifying the list, dealing with adjacent & overlapping ranges.
+ UChar32 range[3] = { start, limit, UNICODESET_HIGH };
add(range, 2, 0);
} else if (start == end) {
add(start);
@@ -918,9 +893,7 @@ UnicodeSet& UnicodeSet::add(UChar32 c) {
list[i] = c;
// if we touched the HIGH mark, then add a new one
if (c == (UNICODESET_HIGH - 1)) {
- UErrorCode status = U_ZERO_ERROR;
- ensureCapacity(len+1, status);
- if (U_FAILURE(status)) {
+ if (!ensureCapacity(len+1)) {
// ensureCapacity will mark the object as Bogus if OOM failure happens.
return *this;
}
@@ -964,21 +937,13 @@ UnicodeSet& UnicodeSet::add(UChar32 c) {
// ^
// list[i]
- UErrorCode status = U_ZERO_ERROR;
- ensureCapacity(len+2, status);
- if (U_FAILURE(status)) {
+ if (!ensureCapacity(len+2)) {
// ensureCapacity will mark the object as Bogus if OOM failure happens.
return *this;
}
- //for (int32_t k=len-1; k>=i; --k) {
- // list[k+2] = list[k];
- //}
- UChar32* src = list + len;
- UChar32* dst = src + 2;
- UChar32* srclimit = list + i;
- while (src > srclimit) *(--dst) = *(--src);
-
+ UChar32 *p = list + i;
+ uprv_memmove(p + 2, p, (len - i) * sizeof(*p));
list[i] = c;
list[i+1] = c+1;
len += 2;
@@ -1014,7 +979,7 @@ UnicodeSet& UnicodeSet::add(const UnicodeString& s) {
if (s.length() == 0 || isFrozen() || isBogus()) return *this;
int32_t cp = getSingleCP(s);
if (cp < 0) {
- if (!strings->contains((void*) &s)) {
+ if (!stringsContains(s)) {
_add(s);
releasePattern();
}
@@ -1033,12 +998,16 @@ void UnicodeSet::_add(const UnicodeString& s) {
if (isFrozen() || isBogus()) {
return;
}
+ UErrorCode ec = U_ZERO_ERROR;
+ if (strings == nullptr && !allocateStrings(ec)) {
+ setToBogus();
+ return;
+ }
UnicodeString* t = new UnicodeString(s);
if (t == NULL) { // Check for memory allocation error.
setToBogus();
return;
}
- UErrorCode ec = U_ZERO_ERROR;
strings->sortedInsert(t, compareUnicodeString, ec);
if (U_FAILURE(ec)) {
setToBogus();
@@ -1121,7 +1090,10 @@ UnicodeSet& UnicodeSet::removeAll(const UnicodeString& s) {
}
UnicodeSet& UnicodeSet::removeAllStrings() {
- strings->removeAllElements();
+ if (!isFrozen() && hasStrings()) {
+ strings->removeAllElements();
+ releasePattern();
+ }
return *this;
}
@@ -1217,8 +1189,9 @@ UnicodeSet& UnicodeSet::remove(const UnicodeString& s) {
if (s.length() == 0 || isFrozen() || isBogus()) return *this;
int32_t cp = getSingleCP(s);
if (cp < 0) {
- strings->removeElement((void*) &s);
- releasePattern();
+ if (strings != nullptr && strings->removeElement((void*) &s)) {
+ releasePattern();
+ }
} else {
remove((UChar32)cp, (UChar32)cp);
}
@@ -1260,24 +1233,17 @@ UnicodeSet& UnicodeSet::complement(void) {
if (isFrozen() || isBogus()) {
return *this;
}
- UErrorCode status = U_ZERO_ERROR;
if (list[0] == UNICODESET_LOW) {
- ensureBufferCapacity(len-1, status);
- if (U_FAILURE(status)) {
- return *this;
- }
- uprv_memcpy(buffer, list + 1, (size_t)(len-1)*sizeof(UChar32));
+ uprv_memmove(list, list + 1, (size_t)(len-1)*sizeof(UChar32));
--len;
} else {
- ensureBufferCapacity(len+1, status);
- if (U_FAILURE(status)) {
+ if (!ensureCapacity(len+1)) {
return *this;
}
- uprv_memcpy(buffer + 1, list, (size_t)len*sizeof(UChar32));
- buffer[0] = UNICODESET_LOW;
+ uprv_memmove(list + 1, list, (size_t)len*sizeof(UChar32));
+ list[0] = UNICODESET_LOW;
++len;
}
- swapBuffers();
releasePattern();
return *this;
}
@@ -1294,7 +1260,7 @@ UnicodeSet& UnicodeSet::complement(const UnicodeString& s) {
if (s.length() == 0 || isFrozen() || isBogus()) return *this;
int32_t cp = getSingleCP(s);
if (cp < 0) {
- if (strings->contains((void*) &s)) {
+ if (stringsContains(s)) {
strings->removeElement((void*) &s);
} else {
_add(s);
@@ -1325,7 +1291,7 @@ UnicodeSet& UnicodeSet::addAll(const UnicodeSet& c) {
if ( c.strings!=NULL ) {
for (int32_t i=0; i<c.strings->size(); ++i) {
const UnicodeString* s = (const UnicodeString*)c.strings->elementAt(i);
- if (!strings->contains((void*) s)) {
+ if (!stringsContains(*s)) {
_add(*s);
}
}
@@ -1347,7 +1313,13 @@ UnicodeSet& UnicodeSet::retainAll(const UnicodeSet& c) {
return *this;
}
retain(c.list, c.len, 0);
- strings->retainAll(*c.strings);
+ if (hasStrings()) {
+ if (!c.hasStrings()) {
+ strings->removeAllElements();
+ } else {
+ strings->retainAll(*c.strings);
+ }
+ }
return *this;
}
@@ -1365,7 +1337,9 @@ UnicodeSet& UnicodeSet::removeAll(const UnicodeSet& c) {
return *this;
}
retain(c.list, c.len, 2);
- strings->removeAll(*c.strings);
+ if (hasStrings() && c.hasStrings()) {
+ strings->removeAll(*c.strings);
+ }
return *this;
}
@@ -1383,10 +1357,12 @@ UnicodeSet& UnicodeSet::complementAll(const UnicodeSet& c) {
}
exclusiveOr(c.list, c.len, 0);
- for (int32_t i=0; i<c.strings->size(); ++i) {
- void* e = c.strings->elementAt(i);
- if (!strings->removeElement(e)) {
- _add(*(const UnicodeString*)e);
+ if (c.strings != nullptr) {
+ for (int32_t i=0; i<c.strings->size(); ++i) {
+ void* e = c.strings->elementAt(i);
+ if (strings == nullptr || !strings->removeElement(e)) {
+ _add(*(const UnicodeString*)e);
+ }
}
}
return *this;
@@ -1400,18 +1376,14 @@ UnicodeSet& UnicodeSet::clear(void) {
if (isFrozen()) {
return *this;
}
- if (list != NULL) {
- list[0] = UNICODESET_HIGH;
- }
+ list[0] = UNICODESET_HIGH;
len = 1;
releasePattern();
if (strings != NULL) {
strings->removeAllElements();
}
- if (list != NULL && strings != NULL) {
- // Remove bogus
- fFlags = 0;
- }
+ // Remove bogus
+ fFlags = 0;
return *this;
}
@@ -1445,10 +1417,6 @@ UChar32 UnicodeSet::getRangeEnd(int32_t index) const {
return list[index*2 + 1] - 1;
}
-int32_t UnicodeSet::getStringCount() const {
- return strings->size();
-}
-
const UnicodeString* UnicodeSet::getString(int32_t index) const {
return (const UnicodeString*) strings->elementAt(index);
}
@@ -1462,22 +1430,32 @@ UnicodeSet& UnicodeSet::compact() {
return *this;
}
// Delete buffer first to defragment memory less.
- if (buffer != NULL) {
+ if (buffer != stackList) {
uprv_free(buffer);
buffer = NULL;
- }
- if (len < capacity) {
- // Make the capacity equal to len or 1.
- // We don't want to realloc of 0 size.
- int32_t newCapacity = len + (len == 0);
- UChar32* temp = (UChar32*) uprv_realloc(list, sizeof(UChar32) * newCapacity);
+ bufferCapacity = 0;
+ }
+ if (list == stackList) {
+ // pass
+ } else if (len <= INITIAL_CAPACITY) {
+ uprv_memcpy(stackList, list, len * sizeof(UChar32));
+ uprv_free(list);
+ list = stackList;
+ capacity = INITIAL_CAPACITY;
+ } else if ((len + 7) < capacity) {
+ // If we have more than a little unused capacity, shrink it to len.
+ UChar32* temp = (UChar32*) uprv_realloc(list, sizeof(UChar32) * len);
if (temp) {
list = temp;
- capacity = newCapacity;
+ capacity = len;
}
// else what the heck happened?! We allocated less memory!
// Oh well. We'll keep our original array.
}
+ if (strings != nullptr && strings->isEmpty()) {
+ delete strings;
+ strings = nullptr;
+ }
return *this;
}
@@ -1488,10 +1466,8 @@ UnicodeSet& UnicodeSet::compact() {
/**
* Deserialize constructor.
*/
-UnicodeSet::UnicodeSet(const uint16_t data[], int32_t dataLen, ESerialization serialization, UErrorCode &ec)
- : len(1), capacity(1+START_EXTRA), list(0), bmpSet(0), buffer(0),
- bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL),
- fFlags(0) {
+UnicodeSet::UnicodeSet(const uint16_t data[], int32_t dataLen, ESerialization serialization,
+ UErrorCode &ec) {
if(U_FAILURE(ec)) {
setToBogus();
@@ -1506,24 +1482,15 @@ UnicodeSet::UnicodeSet(const uint16_t data[], int32_t dataLen, ESerialization se
return;
}
- allocateStrings(ec);
- if (U_FAILURE(ec)) {
- setToBogus();
- return;
- }
-
// bmp?
int32_t headerSize = ((data[0]&0x8000)) ?2:1;
int32_t bmpLength = (headerSize==1)?data[0]:data[1];
- len = (((data[0]&0x7FFF)-bmpLength)/2)+bmpLength;
+ int32_t newLength = (((data[0]&0x7FFF)-bmpLength)/2)+bmpLength;
#ifdef DEBUG_SERIALIZE
- printf("dataLen %d headerSize %d bmpLen %d len %d. data[0]=%X/%X/%X/%X\n", dataLen,headerSize,bmpLength,len, data[0],data[1],data[2],data[3]);
+ printf("dataLen %d headerSize %d bmpLen %d len %d. data[0]=%X/%X/%X/%X\n", dataLen,headerSize,bmpLength,newLength, data[0],data[1],data[2],data[3]);
#endif
- capacity = len+1;
- list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity);
- if(!list || U_FAILURE(ec)) {
- setToBogus();
+ if(!ensureCapacity(newLength + 1)) { // +1 for HIGH
return;
}
// copy bmp
@@ -1535,15 +1502,18 @@ UnicodeSet::UnicodeSet(const uint16_t data[], int32_t dataLen, ESerialization se
#endif
}
// copy smp
- for(i=bmpLength;i<len;i++) {
+ for(i=bmpLength;i<newLength;i++) {
list[i] = ((UChar32)data[headerSize+bmpLength+(i-bmpLength)*2+0] << 16) +
((UChar32)data[headerSize+bmpLength+(i-bmpLength)*2+1]);
#ifdef DEBUG_SERIALIZE
printf("<<32@%d+[%d] %lX\n", headerSize+bmpLength+i, i, list[i]);
#endif
}
- // terminator
- list[len++]=UNICODESET_HIGH;
+ U_ASSERT(i == newLength);
+ if (i == 0 || list[i - 1] != UNICODESET_HIGH) {
+ list[i++] = UNICODESET_HIGH;
+ }
+ len = i;
}
@@ -1664,33 +1634,65 @@ UBool UnicodeSet::allocateStrings(UErrorCode &status) {
return TRUE;
}
-void UnicodeSet::ensureCapacity(int32_t newLen, UErrorCode& ec) {
+int32_t UnicodeSet::nextCapacity(int32_t minCapacity) {
+ // Grow exponentially to reduce the frequency of allocations.
+ if (minCapacity < INITIAL_CAPACITY) {
+ return minCapacity + INITIAL_CAPACITY;
+ } else if (minCapacity <= 2500) {
+ return 5 * minCapacity;
+ } else {
+ int32_t newCapacity = 2 * minCapacity;
+ if (newCapacity > MAX_LENGTH) {
+ newCapacity = MAX_LENGTH;
+ }
+ return newCapacity;
+ }
+}
+
+bool UnicodeSet::ensureCapacity(int32_t newLen) {
+ if (newLen > MAX_LENGTH) {
+ newLen = MAX_LENGTH;
+ }
if (newLen <= capacity) {
- return;
+ return true;
}
- UChar32* temp = (UChar32*) uprv_realloc(list, sizeof(UChar32) * (newLen + GROW_EXTRA));
+ int32_t newCapacity = nextCapacity(newLen);
+ UChar32* temp = (UChar32*) uprv_malloc(newCapacity * sizeof(UChar32));
if (temp == NULL) {
- ec = U_MEMORY_ALLOCATION_ERROR;
setToBogus(); // set the object to bogus state if an OOM failure occurred.
- return;
+ return false;
+ }
+ // Copy only the actual contents.
+ uprv_memcpy(temp, list, len * sizeof(UChar32));
+ if (list != stackList) {
+ uprv_free(list);
}
list = temp;
- capacity = newLen + GROW_EXTRA;
- // else we keep the original contents on the memory failure.
+ capacity = newCapacity;
+ return true;
}
-void UnicodeSet::ensureBufferCapacity(int32_t newLen, UErrorCode& ec) {
- if (buffer != NULL && newLen <= bufferCapacity)
- return;
- UChar32* temp = (UChar32*) uprv_realloc(buffer, sizeof(UChar32) * (newLen + GROW_EXTRA));
+bool UnicodeSet::ensureBufferCapacity(int32_t newLen) {
+ if (newLen > MAX_LENGTH) {
+ newLen = MAX_LENGTH;
+ }
+ if (newLen <= bufferCapacity) {
+ return true;
+ }
+ int32_t newCapacity = nextCapacity(newLen);
+ UChar32* temp = (UChar32*) uprv_malloc(newCapacity * sizeof(UChar32));
if (temp == NULL) {
- ec = U_MEMORY_ALLOCATION_ERROR;
setToBogus();
- return;
+ return false;
+ }
+ // The buffer has no contents to be copied.
+ // It is always filled from scratch after this call.
+ if (buffer != stackList) {
+ uprv_free(buffer);
}
buffer = temp;
- bufferCapacity = newLen + GROW_EXTRA;
- // else we keep the original contents on the memory failure.
+ bufferCapacity = newCapacity;
+ return true;
}
/**
@@ -1727,9 +1729,7 @@ void UnicodeSet::exclusiveOr(const UChar32* other, int32_t otherLen, int8_t pola
if (isFrozen() || isBogus()) {
return;
}
- UErrorCode status = U_ZERO_ERROR;
- ensureBufferCapacity(len + otherLen, status);
- if (U_FAILURE(status)) {
+ if (!ensureBufferCapacity(len + otherLen)) {
return;
}
@@ -1777,9 +1777,7 @@ void UnicodeSet::add(const UChar32* other, int32_t otherLen, int8_t polarity) {
if (isFrozen() || isBogus() || other==NULL) {
return;
}
- UErrorCode status = U_ZERO_ERROR;
- ensureBufferCapacity(len + otherLen, status);
- if (U_FAILURE(status)) {
+ if (!ensureBufferCapacity(len + otherLen)) {
return;
}
@@ -1890,9 +1888,7 @@ void UnicodeSet::retain(const UChar32* other, int32_t otherLen, int8_t polarity)
if (isFrozen() || isBogus()) {
return;
}
- UErrorCode status = U_ZERO_ERROR;
- ensureBufferCapacity(len + otherLen, status);
- if (U_FAILURE(status)) {
+ if (!ensureBufferCapacity(len + otherLen)) {
return;
}
@@ -2138,12 +2134,14 @@ UnicodeString& UnicodeSet::_generatePattern(UnicodeString& result,
}
}
- for (int32_t i = 0; i<strings->size(); ++i) {
- result.append(OPEN_BRACE);
- _appendToPat(result,
- *(const UnicodeString*) strings->elementAt(i),
- escapeUnprintable);
- result.append(CLOSE_BRACE);
+ if (strings != nullptr) {
+ for (int32_t i = 0; i<strings->size(); ++i) {
+ result.append(OPEN_BRACE);
+ _appendToPat(result,
+ *(const UnicodeString*) strings->elementAt(i),
+ escapeUnprintable);
+ result.append(CLOSE_BRACE);
+ }
}
return result.append(SET_CLOSE);
}
@@ -2162,45 +2160,29 @@ void UnicodeSet::releasePattern() {
/**
* Set the new pattern to cache.
*/
-void UnicodeSet::setPattern(const UnicodeString& newPat) {
+void UnicodeSet::setPattern(const char16_t *newPat, int32_t newPatLen) {
releasePattern();
- int32_t newPatLen = newPat.length();
pat = (UChar *)uprv_malloc((newPatLen + 1) * sizeof(UChar));
if (pat) {
patLen = newPatLen;
- newPat.extractBetween(0, patLen, pat);
+ u_memcpy(pat, newPat, patLen);
pat[patLen] = 0;
}
// else we don't care if malloc failed. This was just a nice cache.
// We can regenerate an equivalent pattern later when requested.
}
-UnicodeFunctor *UnicodeSet::freeze() {
+UnicodeSet *UnicodeSet::freeze() {
if(!isFrozen() && !isBogus()) {
- // Do most of what compact() does before freezing because
- // compact() will not work when the set is frozen.
- // Small modification: Don't shrink if the savings would be tiny (<=GROW_EXTRA).
-
- // Delete buffer first to defragment memory less.
- if (buffer != NULL) {
- uprv_free(buffer);
- buffer = NULL;
- }
- if (capacity > (len + GROW_EXTRA)) {
- // Make the capacity equal to len or 1.
- // We don't want to realloc of 0 size.
- capacity = len + (len == 0);
- list = (UChar32*) uprv_realloc(list, sizeof(UChar32) * capacity);
- if (list == NULL) { // Check for memory allocation error.
- setToBogus();
- return this;
- }
- }
+ compact();
// Optimize contains() and span() and similar functions.
- if (!strings->isEmpty()) {
+ if (hasStrings()) {
stringSpan = new UnicodeSetStringSpan(*this, *strings, UnicodeSetStringSpan::ALL);
- if (stringSpan != NULL && !stringSpan->needsStringSpanUTF16()) {
+ if (stringSpan == nullptr) {
+ setToBogus();
+ return this;
+ } else if (!stringSpan->needsStringSpanUTF16()) {
// All strings are irrelevant for span() etc. because
// all of each string's code points are contained in this set.
// Do not check needsStringSpanUTF8() because UTF-8 has at most as
@@ -2233,7 +2215,7 @@ int32_t UnicodeSet::span(const UChar *s, int32_t length, USetSpanCondition spanC
}
if(stringSpan!=NULL) {
return stringSpan->span(s, length, spanCondition);
- } else if(!strings->isEmpty()) {
+ } else if(hasStrings()) {
uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ?
UnicodeSetStringSpan::FWD_UTF16_NOT_CONTAINED :
UnicodeSetStringSpan::FWD_UTF16_CONTAINED;
@@ -2270,7 +2252,7 @@ int32_t UnicodeSet::spanBack(const UChar *s, int32_t length, USetSpanCondition s
}
if(stringSpan!=NULL) {
return stringSpan->spanBack(s, length, spanCondition);
- } else if(!strings->isEmpty()) {
+ } else if(hasStrings()) {
uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ?
UnicodeSetStringSpan::BACK_UTF16_NOT_CONTAINED :
UnicodeSetStringSpan::BACK_UTF16_CONTAINED;
@@ -2308,7 +2290,7 @@ int32_t UnicodeSet::spanUTF8(const char *s, int32_t length, USetSpanCondition sp
}
if(stringSpan!=NULL) {
return stringSpan->spanUTF8((const uint8_t *)s, length, spanCondition);
- } else if(!strings->isEmpty()) {
+ } else if(hasStrings()) {
uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ?
UnicodeSetStringSpan::FWD_UTF8_NOT_CONTAINED :
UnicodeSetStringSpan::FWD_UTF8_CONTAINED;
@@ -2346,7 +2328,7 @@ int32_t UnicodeSet::spanBackUTF8(const char *s, int32_t length, USetSpanConditio
}
if(stringSpan!=NULL) {
return stringSpan->spanBackUTF8((const uint8_t *)s, length, spanCondition);
- } else if(!strings->isEmpty()) {
+ } else if(hasStrings()) {
uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ?
UnicodeSetStringSpan::BACK_UTF8_NOT_CONTAINED :
UnicodeSetStringSpan::BACK_UTF8_CONTAINED;
diff --git a/Build/source/libs/icu/icu-src/source/common/uniset_closure.cpp b/Build/source/libs/icu/icu-src/source/common/uniset_closure.cpp
index 0b7da796826..882231ba1a5 100644
--- a/Build/source/libs/icu/icu-src/source/common/uniset_closure.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uniset_closure.cpp
@@ -31,10 +31,6 @@
#include "util.h"
#include "uvector.h"
-// initial storage. Must be >= 0
-// *** same as in uniset.cpp ! ***
-#define START_EXTRA 16
-
U_NAMESPACE_BEGIN
// TODO memory debugging provided inside uniset.cpp
@@ -49,42 +45,16 @@ U_NAMESPACE_BEGIN
UnicodeSet::UnicodeSet(const UnicodeString& pattern,
uint32_t options,
const SymbolTable* symbols,
- UErrorCode& status) :
- len(0), capacity(START_EXTRA), list(0), bmpSet(0), buffer(0),
- bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL),
- fFlags(0)
-{
- if(U_SUCCESS(status)){
- list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity);
- /* test for NULL */
- if(list == NULL) {
- status = U_MEMORY_ALLOCATION_ERROR;
- }else{
- allocateStrings(status);
- applyPattern(pattern, options, symbols, status);
- }
- }
+ UErrorCode& status) {
+ applyPattern(pattern, options, symbols, status);
_dbgct(this);
}
UnicodeSet::UnicodeSet(const UnicodeString& pattern, ParsePosition& pos,
uint32_t options,
const SymbolTable* symbols,
- UErrorCode& status) :
- len(0), capacity(START_EXTRA), list(0), bmpSet(0), buffer(0),
- bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL),
- fFlags(0)
-{
- if(U_SUCCESS(status)){
- list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity);
- /* test for NULL */
- if(list == NULL) {
- status = U_MEMORY_ALLOCATION_ERROR;
- }else{
- allocateStrings(status);
- applyPattern(pattern, pos, options, symbols, status);
- }
- }
+ UErrorCode& status) {
+ applyPattern(pattern, pos, options, symbols, status);
_dbgct(this);
}
@@ -199,7 +169,7 @@ UnicodeSet& UnicodeSet::closeOver(int32_t attribute) {
// start with input set to guarantee inclusion
// USET_CASE: remove strings because the strings will actually be reduced (folded);
// therefore, start with no strings and add only those needed
- if (attribute & USET_CASE_INSENSITIVE) {
+ if ((attribute & USET_CASE_INSENSITIVE) && foldSet.hasStrings()) {
foldSet.strings->removeAllElements();
}
@@ -234,7 +204,7 @@ UnicodeSet& UnicodeSet::closeOver(int32_t attribute) {
}
}
}
- if (strings != NULL && strings->size() > 0) {
+ if (hasStrings()) {
if (attribute & USET_CASE_INSENSITIVE) {
for (int32_t j=0; j<strings->size(); ++j) {
str = *(const UnicodeString *) strings->elementAt(j);
diff --git a/Build/source/libs/icu/icu-src/source/common/uniset_props.cpp b/Build/source/libs/icu/icu-src/source/common/uniset_props.cpp
index 6cfd80a705b..37277fcb751 100644
--- a/Build/source/libs/icu/icu-src/source/common/uniset_props.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uniset_props.cpp
@@ -47,10 +47,6 @@
U_NAMESPACE_USE
-// initial storage. Must be >= 0
-// *** same as in uniset.cpp ! ***
-#define START_EXTRA 16
-
// Define UChar constants using hex for EBCDIC compatibility
// Used #define to reduce private static exports and memory access time.
#define SET_OPEN ((UChar)0x005B) /*[*/
@@ -185,21 +181,8 @@ isPOSIXClose(const UnicodeString &pattern, int32_t pos) {
* @param pattern a string specifying what characters are in the set
*/
UnicodeSet::UnicodeSet(const UnicodeString& pattern,
- UErrorCode& status) :
- len(0), capacity(START_EXTRA), list(0), bmpSet(0), buffer(0),
- bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL),
- fFlags(0)
-{
- if(U_SUCCESS(status)){
- list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity);
- /* test for NULL */
- if(list == NULL) {
- status = U_MEMORY_ALLOCATION_ERROR;
- }else{
- allocateStrings(status);
- applyPattern(pattern, status);
- }
- }
+ UErrorCode& status) {
+ applyPattern(pattern, status);
_dbgct(this);
}
@@ -713,6 +696,11 @@ static UBool numericValueFilter(UChar32 ch, void* context) {
return u_getNumericValue(ch) == *(double*)context;
}
+static UBool generalCategoryMaskFilter(UChar32 ch, void* context) {
+ int32_t value = *(int32_t*)context;
+ return (U_GET_GC_MASK((UChar32) ch) & value) != 0;
+}
+
static UBool versionFilter(UChar32 ch, void* context) {
static const UVersionInfo none = { 0, 0, 0, 0 };
UVersionInfo v;
@@ -721,6 +709,16 @@ static UBool versionFilter(UChar32 ch, void* context) {
return uprv_memcmp(&v, &none, sizeof(v)) > 0 && uprv_memcmp(&v, version, sizeof(v)) <= 0;
}
+typedef struct {
+ UProperty prop;
+ int32_t value;
+} IntPropertyContext;
+
+static UBool intPropertyFilter(UChar32 ch, void* context) {
+ IntPropertyContext* c = (IntPropertyContext*)context;
+ return u_getIntPropertyValue((UChar32) ch, c->prop) == c->value;
+}
+
static UBool scriptExtensionsFilter(UChar32 ch, void* context) {
return uscript_hasScript(ch, *(UScriptCode*)context);
}
@@ -781,43 +779,6 @@ void UnicodeSet::applyFilter(UnicodeSet::Filter filter,
namespace {
-/** Maps map values to 1 if the mask contains their value'th bit, all others to 0. */
-uint32_t U_CALLCONV generalCategoryMaskFilter(const void *context, uint32_t value) {
- uint32_t mask = *(const uint32_t *)context;
- value = U_MASK(value) & mask;
- if (value != 0) { value = 1; }
- return value;
-}
-
-/** Maps one map value to 1, all others to 0. */
-uint32_t U_CALLCONV intValueFilter(const void *context, uint32_t value) {
- uint32_t v = *(const uint32_t *)context;
- return value == v ? 1 : 0;
-}
-
-} // namespace
-
-void UnicodeSet::applyIntPropertyValue(const UCPMap *map,
- UCPMapValueFilter *filter, const void *context,
- UErrorCode &errorCode) {
- if (U_FAILURE(errorCode)) { return; }
- clear();
- UChar32 start = 0, end;
- uint32_t value;
- while ((end = ucpmap_getRange(map, start, UCPMAP_RANGE_NORMAL, 0,
- filter, context, &value)) >= 0) {
- if (value != 0) {
- add(start, end);
- }
- start = end + 1;
- }
- if (isBogus()) {
- errorCode = U_MEMORY_ALLOCATION_ERROR;
- }
-}
-
-namespace {
-
static UBool mungeCharName(char* dst, const char* src, int32_t dstCapacity) {
/* Note: we use ' ' in compiler code page */
int32_t j = 0;
@@ -841,15 +802,17 @@ static UBool mungeCharName(char* dst, const char* src, int32_t dstCapacity) {
// Property set API
//----------------------------------------------------------------
-#define FAIL(ec) {ec=U_ILLEGAL_ARGUMENT_ERROR; return *this;}
+#define FAIL(ec) UPRV_BLOCK_MACRO_BEGIN { \
+ ec=U_ILLEGAL_ARGUMENT_ERROR; \
+ return *this; \
+} UPRV_BLOCK_MACRO_END
UnicodeSet&
UnicodeSet::applyIntPropertyValue(UProperty prop, int32_t value, UErrorCode& ec) {
- if (U_FAILURE(ec)) { return *this; }
- // All of the following check isFrozen() before modifying this set.
+ if (U_FAILURE(ec) || isFrozen()) { return *this; }
if (prop == UCHAR_GENERAL_CATEGORY_MASK) {
- const UCPMap *map = u_getIntPropertyMap(UCHAR_GENERAL_CATEGORY, &ec);
- applyIntPropertyValue(map, generalCategoryMaskFilter, &value, ec);
+ const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec);
+ applyFilter(generalCategoryMaskFilter, &value, inclusions, ec);
} else if (prop == UCHAR_SCRIPT_EXTENSIONS) {
const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec);
UScriptCode script = (UScriptCode)value;
@@ -866,14 +829,11 @@ UnicodeSet::applyIntPropertyValue(UProperty prop, int32_t value, UErrorCode& ec)
clear();
}
} else if (UCHAR_INT_START <= prop && prop < UCHAR_INT_LIMIT) {
- const UCPMap *map = u_getIntPropertyMap(prop, &ec);
- applyIntPropertyValue(map, intValueFilter, &value, ec);
+ const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec);
+ IntPropertyContext c = {prop, value};
+ applyFilter(intPropertyFilter, &c, inclusions, ec);
} else {
- // This code used to always call getInclusions(property source)
- // which sets an error for an unsupported property.
ec = U_ILLEGAL_ARGUMENT_ERROR;
- // Otherwise we would just clear() this set because
- // getIntPropertyValue(c, prop) returns 0 for all code points.
}
return *this;
}
diff --git a/Build/source/libs/icu/icu-src/source/common/unisetspan.cpp b/Build/source/libs/icu/icu-src/source/common/unisetspan.cpp
index 0a8893472f9..68e44d91ee7 100644
--- a/Build/source/libs/icu/icu-src/source/common/unisetspan.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/unisetspan.cpp
@@ -400,7 +400,7 @@ UnicodeSetStringSpan::UnicodeSetStringSpan(const UnicodeSetStringSpan &otherStri
if(otherStringSpan.pSpanNotSet==&otherStringSpan.spanSet) {
pSpanNotSet=&spanSet;
} else {
- pSpanNotSet=(UnicodeSet *)otherStringSpan.pSpanNotSet->clone();
+ pSpanNotSet=otherStringSpan.pSpanNotSet->clone();
}
// Allocate a block of meta data.
@@ -436,7 +436,7 @@ void UnicodeSetStringSpan::addToSpanNotSet(UChar32 c) {
if(spanSet.contains(c)) {
return; // Nothing to do.
}
- UnicodeSet *newSet=(UnicodeSet *)spanSet.cloneAsThawed();
+ UnicodeSet *newSet=spanSet.cloneAsThawed();
if(newSet==NULL) {
return; // Out of memory.
} else {
diff --git a/Build/source/libs/icu/icu-src/source/common/unistr.cpp b/Build/source/libs/icu/icu-src/source/common/unistr.cpp
index c8b6c0a3a46..901bb3358ba 100644
--- a/Build/source/libs/icu/icu-src/source/common/unistr.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/unistr.cpp
@@ -309,8 +309,7 @@ UnicodeString::UnicodeString(const UnicodeString& that) {
}
UnicodeString::UnicodeString(UnicodeString &&src) U_NOEXCEPT {
- fUnion.fFields.fLengthAndFlags = kShortString;
- moveFrom(src);
+ copyFieldsFrom(src, TRUE);
}
UnicodeString::UnicodeString(const UnicodeString& that,
@@ -333,7 +332,7 @@ Replaceable::clone() const {
}
// UnicodeString overrides clone() with a real implementation
-Replaceable *
+UnicodeString *
UnicodeString::clone() const {
return new UnicodeString(*this);
}
@@ -572,7 +571,7 @@ UnicodeString::copyFrom(const UnicodeString &src, UBool fastCopy) {
return *this;
}
-UnicodeString &UnicodeString::moveFrom(UnicodeString &src) U_NOEXCEPT {
+UnicodeString &UnicodeString::operator=(UnicodeString &&src) U_NOEXCEPT {
// No explicit check for self move assignment, consistent with standard library.
// Self move assignment causes no crash nor leak but might make the object bogus.
releaseArray();
@@ -580,7 +579,7 @@ UnicodeString &UnicodeString::moveFrom(UnicodeString &src) U_NOEXCEPT {
return *this;
}
-// Same as moveFrom() except without memory management.
+// Same as move assignment except without memory management.
void UnicodeString::copyFieldsFrom(UnicodeString &src, UBool setSrcToBogus) U_NOEXCEPT {
int16_t lengthAndFlags = fUnion.fFields.fLengthAndFlags = src.fUnion.fFields.fLengthAndFlags;
if(lengthAndFlags & kUsingStackBuffer) {
diff --git a/Build/source/libs/icu/icu-src/source/common/uobject.cpp b/Build/source/libs/icu/icu-src/source/common/uobject.cpp
index 1133dd9b67a..e222b2ce9b9 100644
--- a/Build/source/libs/icu/icu-src/source/common/uobject.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uobject.cpp
@@ -58,32 +58,32 @@ U_NAMESPACE_BEGIN
* and replace with uprv_malloc/uprv_free.
*/
-void * U_EXPORT2 UMemory::operator new(size_t size) U_NO_THROW {
+void * U_EXPORT2 UMemory::operator new(size_t size) U_NOEXCEPT {
return uprv_malloc(size);
}
-void U_EXPORT2 UMemory::operator delete(void *p) U_NO_THROW {
+void U_EXPORT2 UMemory::operator delete(void *p) U_NOEXCEPT {
if(p!=NULL) {
uprv_free(p);
}
}
-void * U_EXPORT2 UMemory::operator new[](size_t size) U_NO_THROW {
+void * U_EXPORT2 UMemory::operator new[](size_t size) U_NOEXCEPT {
return uprv_malloc(size);
}
-void U_EXPORT2 UMemory::operator delete[](void *p) U_NO_THROW {
+void U_EXPORT2 UMemory::operator delete[](void *p) U_NOEXCEPT {
if(p!=NULL) {
uprv_free(p);
}
}
#if U_HAVE_DEBUG_LOCATION_NEW
-void * U_EXPORT2 UMemory::operator new(size_t size, const char* /*file*/, int /*line*/) U_NO_THROW {
+void * U_EXPORT2 UMemory::operator new(size_t size, const char* /*file*/, int /*line*/) U_NOEXCEPT {
return UMemory::operator new(size);
}
-void U_EXPORT2 UMemory::operator delete(void* p, const char* /*file*/, int /*line*/) U_NO_THROW {
+void U_EXPORT2 UMemory::operator delete(void* p, const char* /*file*/, int /*line*/) U_NOEXCEPT {
UMemory::operator delete(p);
}
#endif /* U_HAVE_DEBUG_LOCATION_NEW */
diff --git a/Build/source/libs/icu/icu-src/source/common/uprops.cpp b/Build/source/libs/icu/icu-src/source/common/uprops.cpp
index 2421c15d2bd..7d99675220e 100644
--- a/Build/source/libs/icu/icu-src/source/common/uprops.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uprops.cpp
@@ -26,23 +26,131 @@
#include "unicode/utypes.h"
#include "unicode/uchar.h"
#include "unicode/ucptrie.h"
+#include "unicode/udata.h"
#include "unicode/unorm2.h"
#include "unicode/uscript.h"
#include "unicode/ustring.h"
#include "cstring.h"
+#include "mutex.h"
#include "normalizer2impl.h"
#include "umutex.h"
#include "ubidi_props.h"
#include "uprops.h"
#include "ucase.h"
+#include "ucln_cmn.h"
+#include "ulayout_props.h"
#include "ustr_imp.h"
-// ulayout_props_data.h is machine-generated by genprops
-#define INCLUDED_FROM_UPROPS_CPP
-#include "ulayout_props_data.h"
-
U_NAMESPACE_USE
+// Unicode text layout properties data -----------------------------------------
+
+namespace {
+
+icu::UInitOnce gLayoutInitOnce = U_INITONCE_INITIALIZER;
+UDataMemory *gLayoutMemory = nullptr;
+
+UCPTrie *gInpcTrie = nullptr; // Indic_Positional_Category
+UCPTrie *gInscTrie = nullptr; // Indic_Syllabic_Category
+UCPTrie *gVoTrie = nullptr; // Vertical_Orientation
+
+int32_t gMaxInpcValue = 0;
+int32_t gMaxInscValue = 0;
+int32_t gMaxVoValue = 0;
+
+UBool U_CALLCONV uprops_cleanup() {
+ udata_close(gLayoutMemory);
+ gLayoutMemory = nullptr;
+
+ ucptrie_close(gInpcTrie);
+ gInpcTrie = nullptr;
+ ucptrie_close(gInscTrie);
+ gInscTrie = nullptr;
+ ucptrie_close(gVoTrie);
+ gVoTrie = nullptr;
+
+ gMaxInpcValue = 0;
+ gMaxInscValue = 0;
+ gMaxVoValue = 0;
+
+ gLayoutInitOnce.reset();
+ return TRUE;
+}
+
+UBool U_CALLCONV
+ulayout_isAcceptable(void * /*context*/,
+ const char * /* type */, const char * /*name*/,
+ const UDataInfo *pInfo) {
+ return pInfo->size >= 20 &&
+ pInfo->isBigEndian == U_IS_BIG_ENDIAN &&
+ pInfo->charsetFamily == U_CHARSET_FAMILY &&
+ pInfo->dataFormat[0] == ULAYOUT_FMT_0 &&
+ pInfo->dataFormat[1] == ULAYOUT_FMT_1 &&
+ pInfo->dataFormat[2] == ULAYOUT_FMT_2 &&
+ pInfo->dataFormat[3] == ULAYOUT_FMT_3 &&
+ pInfo->formatVersion[0] == 1;
+}
+
+// UInitOnce singleton initialization function
+void U_CALLCONV ulayout_load(UErrorCode &errorCode) {
+ gLayoutMemory = udata_openChoice(
+ nullptr, ULAYOUT_DATA_TYPE, ULAYOUT_DATA_NAME,
+ ulayout_isAcceptable, nullptr, &errorCode);
+ if (U_FAILURE(errorCode)) { return; }
+
+ const uint8_t *inBytes = (const uint8_t *)udata_getMemory(gLayoutMemory);
+ const int32_t *inIndexes = (const int32_t *)inBytes;
+ int32_t indexesLength = inIndexes[ULAYOUT_IX_INDEXES_LENGTH];
+ if (indexesLength < 12) {
+ errorCode = U_INVALID_FORMAT_ERROR; // Not enough indexes.
+ return;
+ }
+ int32_t offset = indexesLength * 4;
+ int32_t top = inIndexes[ULAYOUT_IX_INPC_TRIE_TOP];
+ int32_t trieSize = top - offset;
+ if (trieSize >= 16) {
+ gInpcTrie = ucptrie_openFromBinary(
+ UCPTRIE_TYPE_ANY, UCPTRIE_VALUE_BITS_ANY,
+ inBytes + offset, trieSize, nullptr, &errorCode);
+ }
+ offset = top;
+ top = inIndexes[ULAYOUT_IX_INSC_TRIE_TOP];
+ trieSize = top - offset;
+ if (trieSize >= 16) {
+ gInscTrie = ucptrie_openFromBinary(
+ UCPTRIE_TYPE_ANY, UCPTRIE_VALUE_BITS_ANY,
+ inBytes + offset, trieSize, nullptr, &errorCode);
+ }
+ offset = top;
+ top = inIndexes[ULAYOUT_IX_VO_TRIE_TOP];
+ trieSize = top - offset;
+ if (trieSize >= 16) {
+ gVoTrie = ucptrie_openFromBinary(
+ UCPTRIE_TYPE_ANY, UCPTRIE_VALUE_BITS_ANY,
+ inBytes + offset, trieSize, nullptr, &errorCode);
+ }
+
+ uint32_t maxValues = inIndexes[ULAYOUT_IX_MAX_VALUES];
+ gMaxInpcValue = maxValues >> ULAYOUT_MAX_INPC_SHIFT;
+ gMaxInscValue = (maxValues >> ULAYOUT_MAX_INSC_SHIFT) & 0xff;
+ gMaxVoValue = (maxValues >> ULAYOUT_MAX_VO_SHIFT) & 0xff;
+
+ ucln_common_registerCleanup(UCLN_COMMON_UPROPS, uprops_cleanup);
+}
+
+UBool ulayout_ensureData(UErrorCode &errorCode) {
+ if (U_FAILURE(errorCode)) { return FALSE; }
+ umtx_initOnce(gLayoutInitOnce, &ulayout_load, errorCode);
+ return U_SUCCESS(errorCode);
+}
+
+UBool ulayout_ensureData() {
+ UErrorCode errorCode = U_ZERO_ERROR;
+ return ulayout_ensureData(errorCode);
+}
+
+} // namespace
+
/* general properties API functions ----------------------------------------- */
struct BinaryProperty;
@@ -434,15 +542,29 @@ static int32_t getTrailCombiningClass(const IntProperty &/*prop*/, UChar32 c, UP
#endif
static int32_t getInPC(const IntProperty &, UChar32 c, UProperty) {
- return ucptrie_get(&inpc_trie, c);
+ return ulayout_ensureData() && gInpcTrie != nullptr ? ucptrie_get(gInpcTrie, c) : 0;
}
static int32_t getInSC(const IntProperty &, UChar32 c, UProperty) {
- return ucptrie_get(&insc_trie, c);
+ return ulayout_ensureData() && gInscTrie != nullptr ? ucptrie_get(gInscTrie, c) : 0;
}
static int32_t getVo(const IntProperty &, UChar32 c, UProperty) {
- return ucptrie_get(&vo_trie, c);
+ return ulayout_ensureData() && gVoTrie != nullptr ? ucptrie_get(gVoTrie, c) : 0;
+}
+
+static int32_t layoutGetMaxValue(const IntProperty &/*prop*/, UProperty which) {
+ if (!ulayout_ensureData()) { return 0; }
+ switch (which) {
+ case UCHAR_INDIC_POSITIONAL_CATEGORY:
+ return gMaxInpcValue;
+ case UCHAR_INDIC_SYLLABIC_CATEGORY:
+ return gMaxInscValue;
+ case UCHAR_VERTICAL_ORIENTATION:
+ return gMaxVoValue;
+ default:
+ return 0;
+ }
}
static const IntProperty intProps[UCHAR_INT_LIMIT-UCHAR_INT_START]={
@@ -480,9 +602,9 @@ static const IntProperty intProps[UCHAR_INT_LIMIT-UCHAR_INT_START]={
{ 2, UPROPS_SB_MASK, UPROPS_SB_SHIFT, defaultGetValue, defaultGetMaxValue },
{ 2, UPROPS_WB_MASK, UPROPS_WB_SHIFT, defaultGetValue, defaultGetMaxValue },
{ UPROPS_SRC_BIDI, 0, 0, getBiDiPairedBracketType, biDiGetMaxValue },
- { UPROPS_SRC_INPC, 0, maxInPCValue, getInPC, getMaxValueFromShift },
- { UPROPS_SRC_INSC, 0, maxInSCValue, getInSC, getMaxValueFromShift },
- { UPROPS_SRC_VO, 0, maxVoValue, getVo, getMaxValueFromShift },
+ { UPROPS_SRC_INPC, 0, 0, getInPC, layoutGetMaxValue },
+ { UPROPS_SRC_INSC, 0, 0, getInSC, layoutGetMaxValue },
+ { UPROPS_SRC_VO, 0, 0, getVo, layoutGetMaxValue },
};
U_CAPI int32_t U_EXPORT2
@@ -586,23 +708,28 @@ uprops_getSource(UProperty which) {
U_CFUNC void U_EXPORT2
uprops_addPropertyStarts(UPropertySource src, const USetAdder *sa, UErrorCode *pErrorCode) {
- if (U_FAILURE(*pErrorCode)) { return; }
+ if (!ulayout_ensureData(*pErrorCode)) { return; }
const UCPTrie *trie;
switch (src) {
case UPROPS_SRC_INPC:
- trie = &inpc_trie;
+ trie = gInpcTrie;
break;
case UPROPS_SRC_INSC:
- trie = &insc_trie;
+ trie = gInscTrie;
break;
case UPROPS_SRC_VO:
- trie = &vo_trie;
+ trie = gVoTrie;
break;
default:
*pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
return;
}
+ if (trie == nullptr) {
+ *pErrorCode = U_MISSING_RESOURCE_ERROR;
+ return;
+ }
+
// Add the start code point of each same-value range of the trie.
UChar32 start = 0, end;
while ((end = ucptrie_getRange(trie, start, UCPMAP_RANGE_NORMAL, 0,
diff --git a/Build/source/libs/icu/icu-src/source/common/uprops.h b/Build/source/libs/icu/icu-src/source/common/uprops.h
index 1a8e4e84f74..c7d648694ee 100644
--- a/Build/source/libs/icu/icu-src/source/common/uprops.h
+++ b/Build/source/libs/icu/icu-src/source/common/uprops.h
@@ -95,8 +95,15 @@ enum {
* denominator: den = 20<<(frac20>>2)
*/
UPROPS_NTV_FRACTION20_START=UPROPS_NTV_BASE60_START+36, // 0x300+9*4=0x324
+ /**
+ * Fraction-32 values:
+ * frac32 = ntv-0x34c = 0..15 -> 1|3|5|7 / 32|64|128|256
+ * numerator: num = 2*(frac32&3)+1
+ * denominator: den = 32<<(frac32>>2)
+ */
+ UPROPS_NTV_FRACTION32_START=UPROPS_NTV_FRACTION20_START+24, // 0x324+6*4=0x34c
/** No numeric value (yet). */
- UPROPS_NTV_RESERVED_START=UPROPS_NTV_FRACTION20_START+24, // 0x324+6*4=0x34c
+ UPROPS_NTV_RESERVED_START=UPROPS_NTV_FRACTION32_START+16, // 0x34c+4*4=0x35c
UPROPS_NTV_MAX_SMALL_INT=UPROPS_NTV_FRACTION_START-UPROPS_NTV_NUMERIC_START-1
};
@@ -462,7 +469,6 @@ class UnicodeSet;
class CharacterProperties {
public:
CharacterProperties() = delete;
- static void U_CALLCONV initInclusion(UPropertySource src, UErrorCode &errorCode);
static const UnicodeSet *getInclusionsForProperty(UProperty prop, UErrorCode &errorCode);
};
diff --git a/Build/source/libs/icu/icu-src/source/common/uresbund.cpp b/Build/source/libs/icu/icu-src/source/common/uresbund.cpp
index 656eeb7b442..6c0e760389d 100644
--- a/Build/source/libs/icu/icu-src/source/common/uresbund.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uresbund.cpp
@@ -21,6 +21,7 @@
******************************************************************************
*/
+#include "unicode/ures.h"
#include "unicode/ustring.h"
#include "unicode/ucnv.h"
#include "charstr.h"
@@ -30,6 +31,7 @@
#include "ucln_cmn.h"
#include "cmemory.h"
#include "cstring.h"
+#include "mutex.h"
#include "uhash.h"
#include "unicode/uenum.h"
#include "uenumimp.h"
@@ -37,6 +39,7 @@
#include "umutex.h"
#include "putilimp.h"
#include "uassert.h"
+#include "uresdata.h"
using namespace icu;
@@ -46,9 +49,9 @@ TODO: This cache should probably be removed when the deprecated code is
completely removed.
*/
static UHashtable *cache = NULL;
-static icu::UInitOnce gCacheInitOnce;
+static icu::UInitOnce gCacheInitOnce = U_INITONCE_INITIALIZER;
-static UMutex resbMutex = U_MUTEX_INITIALIZER;
+static UMutex resbMutex;
/* INTERNAL: hashes an entry */
static int32_t U_CALLCONV hashEntry(const UHashTok parm) {
@@ -92,13 +95,12 @@ static UBool chopLocale(char *name) {
* Internal function
*/
static void entryIncrease(UResourceDataEntry *entry) {
- umtx_lock(&resbMutex);
+ Mutex lock(&resbMutex);
entry->fCountExisting++;
while(entry->fParent != NULL) {
entry = entry->fParent;
entry->fCountExisting++;
}
- umtx_unlock(&resbMutex);
}
/**
@@ -180,9 +182,8 @@ static int32_t ures_flushCache()
/*if shared data hasn't even been lazy evaluated yet
* return 0
*/
- umtx_lock(&resbMutex);
+ Mutex lock(&resbMutex);
if (cache == NULL) {
- umtx_unlock(&resbMutex);
return 0;
}
@@ -214,7 +215,6 @@ static int32_t ures_flushCache()
* got decremented by free_entry().
*/
} while(deletedMore);
- umtx_unlock(&resbMutex);
return rbDeletedNum;
}
@@ -228,9 +228,8 @@ U_CAPI UBool U_EXPORT2 ures_dumpCacheContents(void) {
const UHashElement *e;
UResourceDataEntry *resB;
- umtx_lock(&resbMutex);
+ Mutex lock(&resbMutex);
if (cache == NULL) {
- umtx_unlock(&resbMutex);
fprintf(stderr,"%s:%d: RB Cache is NULL.\n", __FILE__, __LINE__);
return FALSE;
}
@@ -249,9 +248,6 @@ U_CAPI UBool U_EXPORT2 ures_dumpCacheContents(void) {
}
fprintf(stderr,"%s:%d: RB Cache still contains %d items.\n", __FILE__, __LINE__, uhash_count(cache));
-
- umtx_unlock(&resbMutex);
-
return cacheNotEmpty;
}
@@ -397,7 +393,8 @@ static UResourceDataEntry *init_entry(const char *localeID, const char *path, UE
/* We'll try to get alias string from the bundle */
aliasres = res_getResource(&(r->fData), "%%ALIAS");
if (aliasres != RES_BOGUS) {
- const UChar *alias = res_getString(&(r->fData), aliasres, &aliasLen);
+ // No tracing: called during initial data loading
+ const UChar *alias = res_getStringNoTrace(&(r->fData), aliasres, &aliasLen);
if(alias != NULL && aliasLen > 0) { /* if there is actual alias - unload and load new data */
u_UCharsToChars(alias, aliasName, aliasLen+1);
r->fAlias = init_entry(aliasName, path, status);
@@ -488,6 +485,9 @@ findFirstExisting(const char* path, char* name,
/*Fallback data stuff*/
*hasChopped = chopLocale(name);
+ if (*hasChopped && *name == '\0') {
+ uprv_strcpy(name, "und");
+ }
}
return r;
}
@@ -512,6 +512,18 @@ U_CFUNC void ures_initStackObject(UResourceBundle* resB) {
ures_setIsStackObject(resB, TRUE);
}
+U_NAMESPACE_BEGIN
+
+StackUResourceBundle::StackUResourceBundle() {
+ ures_initStackObject(&bundle);
+}
+
+StackUResourceBundle::~StackUResourceBundle() {
+ ures_close(&bundle);
+}
+
+U_NAMESPACE_END
+
static UBool // returns U_SUCCESS(*status)
loadParentsExceptRoot(UResourceDataEntry *&t1,
char name[], int32_t nameCapacity,
@@ -523,7 +535,8 @@ loadParentsExceptRoot(UResourceDataEntry *&t1,
Resource parentRes = res_getResource(&t1->fData, "%%Parent");
if (parentRes != RES_BOGUS) { // An explicit parent was found.
int32_t parentLocaleLen = 0;
- const UChar *parentLocaleName = res_getString(&(t1->fData), parentRes, &parentLocaleLen);
+ // No tracing: called during initial data loading
+ const UChar *parentLocaleName = res_getStringNoTrace(&(t1->fData), parentRes, &parentLocaleLen);
if(parentLocaleName != NULL && 0 < parentLocaleLen && parentLocaleLen < nameCapacity) {
u_UCharsToChars(parentLocaleName, name, parentLocaleLen + 1);
if (uprv_strcmp(name, kRootLocaleName) == 0) {
@@ -647,107 +660,105 @@ static UResourceDataEntry *entryOpen(const char* path, const char* localeID,
}
}
- umtx_lock(&resbMutex);
- { /* umtx_lock */
- /* We're going to skip all the locales that do not have any data */
- r = findFirstExisting(path, name, &isRoot, &hasChopped, &isDefault, &intStatus);
+ Mutex lock(&resbMutex); // Lock resbMutex until the end of this function.
+
+ /* We're going to skip all the locales that do not have any data */
+ r = findFirstExisting(path, name, &isRoot, &hasChopped, &isDefault, &intStatus);
+
+ // If we failed due to out-of-memory, report the failure and exit early.
+ if (intStatus == U_MEMORY_ALLOCATION_ERROR) {
+ *status = intStatus;
+ goto finish;
+ }
+
+ if(r != NULL) { /* if there is one real locale, we can look for parents. */
+ t1 = r;
+ hasRealData = TRUE;
+ if ( usingUSRData ) { /* This code inserts user override data into the inheritance chain */
+ UErrorCode usrStatus = U_ZERO_ERROR;
+ UResourceDataEntry *u1 = init_entry(t1->fName, usrDataPath, &usrStatus);
+ // If we failed due to out-of-memory, report the failure and exit early.
+ if (intStatus == U_MEMORY_ALLOCATION_ERROR) {
+ *status = intStatus;
+ goto finish;
+ }
+ if ( u1 != NULL ) {
+ if(u1->fBogus == U_ZERO_ERROR) {
+ u1->fParent = t1;
+ r = u1;
+ } else {
+ /* the USR override data wasn't found, set it to be deleted */
+ u1->fCountExisting = 0;
+ }
+ }
+ }
+ if (hasChopped && !isRoot) {
+ if (!loadParentsExceptRoot(t1, name, UPRV_LENGTHOF(name), usingUSRData, usrDataPath, status)) {
+ goto finish;
+ }
+ }
+ }
+ /* we could have reached this point without having any real data */
+ /* if that is the case, we need to chain in the default locale */
+ if(r==NULL && openType == URES_OPEN_LOCALE_DEFAULT_ROOT && !isDefault && !isRoot) {
+ /* insert default locale */
+ uprv_strcpy(name, uloc_getDefault());
+ r = findFirstExisting(path, name, &isRoot, &hasChopped, &isDefault, &intStatus);
// If we failed due to out-of-memory, report the failure and exit early.
if (intStatus == U_MEMORY_ALLOCATION_ERROR) {
*status = intStatus;
- goto finishUnlock;
+ goto finish;
}
-
- if(r != NULL) { /* if there is one real locale, we can look for parents. */
+ intStatus = U_USING_DEFAULT_WARNING;
+ if(r != NULL) { /* the default locale exists */
t1 = r;
hasRealData = TRUE;
- if ( usingUSRData ) { /* This code inserts user override data into the inheritance chain */
- UErrorCode usrStatus = U_ZERO_ERROR;
- UResourceDataEntry *u1 = init_entry(t1->fName, usrDataPath, &usrStatus);
- // If we failed due to out-of-memory, report the failure and exit early.
- if (intStatus == U_MEMORY_ALLOCATION_ERROR) {
- *status = intStatus;
- goto finishUnlock;
- }
- if ( u1 != NULL ) {
- if(u1->fBogus == U_ZERO_ERROR) {
- u1->fParent = t1;
- r = u1;
- } else {
- /* the USR override data wasn't found, set it to be deleted */
- u1->fCountExisting = 0;
- }
- }
- }
+ isDefault = TRUE;
+ // TODO: Why not if (usingUSRData) { ... } like in the non-default-locale code path?
if (hasChopped && !isRoot) {
if (!loadParentsExceptRoot(t1, name, UPRV_LENGTHOF(name), usingUSRData, usrDataPath, status)) {
- goto finishUnlock;
+ goto finish;
}
}
}
+ }
- /* we could have reached this point without having any real data */
- /* if that is the case, we need to chain in the default locale */
- if(r==NULL && openType == URES_OPEN_LOCALE_DEFAULT_ROOT && !isDefault && !isRoot) {
- /* insert default locale */
- uprv_strcpy(name, uloc_getDefault());
- r = findFirstExisting(path, name, &isRoot, &hasChopped, &isDefault, &intStatus);
- // If we failed due to out-of-memory, report the failure and exit early.
- if (intStatus == U_MEMORY_ALLOCATION_ERROR) {
- *status = intStatus;
- goto finishUnlock;
- }
+ /* we could still have r == NULL at this point - maybe even default locale is not */
+ /* present */
+ if(r == NULL) {
+ uprv_strcpy(name, kRootLocaleName);
+ r = findFirstExisting(path, name, &isRoot, &hasChopped, &isDefault, &intStatus);
+ // If we failed due to out-of-memory, report the failure and exit early.
+ if (intStatus == U_MEMORY_ALLOCATION_ERROR) {
+ *status = intStatus;
+ goto finish;
+ }
+ if(r != NULL) {
+ t1 = r;
intStatus = U_USING_DEFAULT_WARNING;
- if(r != NULL) { /* the default locale exists */
- t1 = r;
- hasRealData = TRUE;
- isDefault = TRUE;
- // TODO: Why not if (usingUSRData) { ... } like in the non-default-locale code path?
- if (hasChopped && !isRoot) {
- if (!loadParentsExceptRoot(t1, name, UPRV_LENGTHOF(name), usingUSRData, usrDataPath, status)) {
- goto finishUnlock;
- }
- }
- }
+ hasRealData = TRUE;
+ } else { /* we don't even have the root locale */
+ *status = U_MISSING_RESOURCE_ERROR;
+ goto finish;
}
-
- /* we could still have r == NULL at this point - maybe even default locale is not */
- /* present */
- if(r == NULL) {
- uprv_strcpy(name, kRootLocaleName);
- r = findFirstExisting(path, name, &isRoot, &hasChopped, &isDefault, &intStatus);
- // If we failed due to out-of-memory, report the failure and exit early.
- if (intStatus == U_MEMORY_ALLOCATION_ERROR) {
- *status = intStatus;
- goto finishUnlock;
- }
- if(r != NULL) {
- t1 = r;
- intStatus = U_USING_DEFAULT_WARNING;
- hasRealData = TRUE;
- } else { /* we don't even have the root locale */
- *status = U_MISSING_RESOURCE_ERROR;
- goto finishUnlock;
- }
- } else if(!isRoot && uprv_strcmp(t1->fName, kRootLocaleName) != 0 &&
- t1->fParent == NULL && !r->fData.noFallback) {
- if (!insertRootBundle(t1, status)) {
- goto finishUnlock;
- }
- if(!hasRealData) {
- r->fBogus = U_USING_DEFAULT_WARNING;
- }
+ } else if(!isRoot && uprv_strcmp(t1->fName, kRootLocaleName) != 0 &&
+ t1->fParent == NULL && !r->fData.noFallback) {
+ if (!insertRootBundle(t1, status)) {
+ goto finish;
}
-
- // TODO: Does this ever loop?
- while(r != NULL && !isRoot && t1->fParent != NULL) {
- t1->fParent->fCountExisting++;
- t1 = t1->fParent;
+ if(!hasRealData) {
+ r->fBogus = U_USING_DEFAULT_WARNING;
}
- } /* umtx_lock */
-finishUnlock:
- umtx_unlock(&resbMutex);
+ }
+
+ // TODO: Does this ever loop?
+ while(r != NULL && !isRoot && t1->fParent != NULL) {
+ t1->fParent->fCountExisting++;
+ t1 = t1->fParent;
+ }
+finish:
if(U_SUCCESS(*status)) {
if(intStatus != U_ZERO_ERROR) {
*status = intStatus;
@@ -771,7 +782,7 @@ entryOpenDirect(const char* path, const char* localeID, UErrorCode* status) {
return NULL;
}
- umtx_lock(&resbMutex);
+ Mutex lock(&resbMutex);
// findFirstExisting() without fallbacks.
UResourceDataEntry *r = init_entry(localeID, path, status);
if(U_SUCCESS(*status)) {
@@ -809,7 +820,6 @@ entryOpenDirect(const char* path, const char* localeID, UErrorCode* status) {
t1 = t1->fParent;
}
}
- umtx_unlock(&resbMutex);
return r;
}
@@ -852,9 +862,8 @@ static void entryCloseInt(UResourceDataEntry *resB) {
*/
static void entryClose(UResourceDataEntry *resB) {
- umtx_lock(&resbMutex);
+ Mutex lock(&resbMutex);
entryCloseInt(resB);
- umtx_unlock(&resbMutex);
}
/*
@@ -1110,7 +1119,7 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r,
UResourceDataEntry *dataEntry = mainRes->fData;
char stackPath[URES_MAX_BUFFER_SIZE];
char *pathBuf = stackPath, *myPath = pathBuf;
- if(uprv_strlen(keyPath) > URES_MAX_BUFFER_SIZE) {
+ if(uprv_strlen(keyPath) >= UPRV_LENGTHOF(stackPath)) {
pathBuf = (char *)uprv_malloc((uprv_strlen(keyPath)+1)*sizeof(char));
if(pathBuf == NULL) {
*status = U_MEMORY_ALLOCATION_ERROR;
@@ -1158,6 +1167,7 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r,
if(mainRes != result) {
ures_close(mainRes);
}
+ ResourceTracer(resB).maybeTrace("getalias");
return result;
}
} else {
@@ -1237,6 +1247,7 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r,
/*resB->fParent = parent->fRes;*/
uprv_memmove(&resB->fResData, rdata, sizeof(ResourceData));
resB->fSize = res_countArrayItems(&(resB->fResData), resB->fRes);
+ ResourceTracer(resB).trace("get");
return resB;
}
@@ -1285,7 +1296,7 @@ U_CAPI const UChar* U_EXPORT2 ures_getString(const UResourceBundle* resB, int32_
*status = U_ILLEGAL_ARGUMENT_ERROR;
return NULL;
}
- s = res_getString(&(resB->fResData), resB->fRes, len);
+ s = res_getString({resB}, &(resB->fResData), resB->fRes, len);
if (s == NULL) {
*status = U_RESOURCE_TYPE_MISMATCH;
}
@@ -1374,7 +1385,7 @@ U_CAPI const uint8_t* U_EXPORT2 ures_getBinary(const UResourceBundle* resB, int3
*status = U_ILLEGAL_ARGUMENT_ERROR;
return NULL;
}
- p = res_getBinary(&(resB->fResData), resB->fRes, len);
+ p = res_getBinary({resB}, &(resB->fResData), resB->fRes, len);
if (p == NULL) {
*status = U_RESOURCE_TYPE_MISMATCH;
}
@@ -1391,7 +1402,7 @@ U_CAPI const int32_t* U_EXPORT2 ures_getIntVector(const UResourceBundle* resB, i
*status = U_ILLEGAL_ARGUMENT_ERROR;
return NULL;
}
- p = res_getIntVector(&(resB->fResData), resB->fRes, len);
+ p = res_getIntVector({resB}, &(resB->fResData), resB->fRes, len);
if (p == NULL) {
*status = U_RESOURCE_TYPE_MISMATCH;
}
@@ -1412,7 +1423,7 @@ U_CAPI int32_t U_EXPORT2 ures_getInt(const UResourceBundle* resB, UErrorCode *st
*status = U_RESOURCE_TYPE_MISMATCH;
return 0xffffffff;
}
- return RES_GET_INT(resB->fRes);
+ return res_getInt({resB}, resB->fRes);
}
U_CAPI uint32_t U_EXPORT2 ures_getUInt(const UResourceBundle* resB, UErrorCode *status) {
@@ -1427,7 +1438,7 @@ U_CAPI uint32_t U_EXPORT2 ures_getUInt(const UResourceBundle* resB, UErrorCode *
*status = U_RESOURCE_TYPE_MISMATCH;
return 0xffffffff;
}
- return RES_GET_UINT(resB->fRes);
+ return res_getUInt({resB}, resB->fRes);
}
U_CAPI UResType U_EXPORT2 ures_getType(const UResourceBundle *resB) {
@@ -1438,10 +1449,18 @@ U_CAPI UResType U_EXPORT2 ures_getType(const UResourceBundle *resB) {
}
U_CAPI const char * U_EXPORT2 ures_getKey(const UResourceBundle *resB) {
+ //
+ // TODO: Trace ures_getKey? I guess not usually.
+ //
+ // We usually get the key string to decide whether we want the value, or to
+ // make a key-value pair. Tracing the value should suffice.
+ //
+ // However, I believe we have some data (e.g., in res_index) where the key
+ // strings are the data. Tracing the enclosing table should suffice.
+ //
if(resB == NULL) {
return NULL;
}
-
return(resB->fKey);
}
@@ -1461,7 +1480,7 @@ static const UChar* ures_getStringWithAlias(const UResourceBundle *resB, Resourc
ures_close(tempRes);
return result;
} else {
- return res_getString(&(resB->fResData), r, len);
+ return res_getString({resB, sIndex}, &(resB->fResData), r, len);
}
}
@@ -1497,7 +1516,7 @@ U_CAPI const UChar* U_EXPORT2 ures_getNextString(UResourceBundle *resB, int32_t*
switch(RES_GET_TYPE(resB->fRes)) {
case URES_STRING:
case URES_STRING_V2:
- return res_getString(&(resB->fResData), resB->fRes, len);
+ return res_getString({resB}, &(resB->fResData), resB->fRes, len);
case URES_TABLE:
case URES_TABLE16:
case URES_TABLE32:
@@ -1642,7 +1661,7 @@ U_CAPI const UChar* U_EXPORT2 ures_getStringByIndex(const UResourceBundle *resB,
switch(RES_GET_TYPE(resB->fRes)) {
case URES_STRING:
case URES_STRING_V2:
- return res_getString(&(resB->fResData), resB->fRes, len);
+ return res_getString({resB}, &(resB->fResData), resB->fRes, len);
case URES_TABLE:
case URES_TABLE16:
case URES_TABLE32:
@@ -1934,10 +1953,10 @@ void getAllItemsWithFallback(
// When the sink sees the no-fallback/no-inheritance marker,
// then it would remove the parent's item.
// We would deserialize parent values even though they are overridden in a child bundle.
- value.pResData = &bundle->fResData;
+ value.setData(&bundle->fResData);
UResourceDataEntry *parentEntry = bundle->fData->fParent;
UBool hasParent = parentEntry != NULL && U_SUCCESS(parentEntry->fBogus);
- value.setResource(bundle->fRes);
+ value.setResource(bundle->fRes, ResourceTracer(bundle));
sink.put(bundle->fKey, value, !hasParent, errorCode);
if (hasParent) {
// We might try to query the sink whether
@@ -1982,31 +2001,60 @@ void getAllItemsWithFallback(
} // namespace
+// Requires a ResourceDataValue fill-in, so that we need not cast from a ResourceValue.
+// Unfortunately, the caller must know which subclass to make and pass in.
+// Alternatively, we could make it as polymorphic as in Java by
+// returning a ResourceValue pointer (possibly wrapped into a LocalPointer)
+// that the caller then owns.
+//
+// Also requires a UResourceBundle fill-in, so that the value's ResourceTracer
+// can point to a non-local bundle.
+// Without tracing, the child bundle could be a function-local object.
+U_CAPI void U_EXPORT2
+ures_getValueWithFallback(const UResourceBundle *bundle, const char *path,
+ UResourceBundle *tempFillIn,
+ ResourceDataValue &value, UErrorCode &errorCode) {
+ if (U_FAILURE(errorCode)) { return; }
+ if (path == nullptr) {
+ errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
+ const UResourceBundle *rb;
+ if (*path == 0) {
+ // empty path
+ rb = bundle;
+ } else {
+ rb = ures_getByKeyWithFallback(bundle, path, tempFillIn, &errorCode);
+ if (U_FAILURE(errorCode)) {
+ return;
+ }
+ }
+ value.setData(&rb->fResData);
+ value.setResource(rb->fRes, ResourceTracer(rb));
+}
+
U_CAPI void U_EXPORT2
ures_getAllItemsWithFallback(const UResourceBundle *bundle, const char *path,
icu::ResourceSink &sink, UErrorCode &errorCode) {
if (U_FAILURE(errorCode)) { return; }
- if (path == NULL) {
+ if (path == nullptr) {
errorCode = U_ILLEGAL_ARGUMENT_ERROR;
return;
}
- UResourceBundle stackBundle;
- ures_initStackObject(&stackBundle);
+ StackUResourceBundle stackBundle;
const UResourceBundle *rb;
if (*path == 0) {
// empty path
rb = bundle;
} else {
- rb = ures_getByKeyWithFallback(bundle, path, &stackBundle, &errorCode);
+ rb = ures_getByKeyWithFallback(bundle, path, stackBundle.getAlias(), &errorCode);
if (U_FAILURE(errorCode)) {
- ures_close(&stackBundle);
return;
}
}
// Get all table items with fallback.
ResourceDataValue value;
getAllItemsWithFallback(rb, value, sink, errorCode);
- ures_close(&stackBundle);
}
U_CAPI UResourceBundle* U_EXPORT2 ures_getByKey(const UResourceBundle *resB, const char* inKey, UResourceBundle *fillIn, UErrorCode *status) {
@@ -2089,7 +2137,7 @@ U_CAPI const UChar* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB, c
switch (RES_GET_TYPE(res)) {
case URES_STRING:
case URES_STRING_V2:
- return res_getString(rd, res, len);
+ return res_getString({resB, key}, rd, res, len);
case URES_ALIAS:
{
const UChar* result = 0;
@@ -2111,7 +2159,7 @@ U_CAPI const UChar* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB, c
switch (RES_GET_TYPE(res)) {
case URES_STRING:
case URES_STRING_V2:
- return res_getString(&(resB->fResData), res, len);
+ return res_getString({resB, key}, &(resB->fResData), res, len);
case URES_ALIAS:
{
const UChar* result = 0;
@@ -2132,6 +2180,7 @@ U_CAPI const UChar* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB, c
/* here should go a first attempt to locate the key using index table */
const ResourceData *rd = getFallbackData(resB, &key, &realData, &res, status);
if(U_SUCCESS(*status)) {
+ // TODO: Tracing
return res_getString(rd, res, len);
} else {
*status = U_MISSING_RESOURCE_ERROR;
@@ -2277,6 +2326,8 @@ ures_openWithType(UResourceBundle *r, const char* path, const char* localeID,
r->fSize = res_countArrayItems(&(r->fResData), r->fRes);
r->fIndex = -1;
+ ResourceTracer(r).traceOpen();
+
return r;
}
@@ -2300,11 +2351,13 @@ ures_openDirect(const char* path, const char* localeID, UErrorCode* status) {
}
/**
- * API: This function is used to open a resource bundle
+ * Internal API: This function is used to open a resource bundle
* proper fallback chaining is executed while initialization.
* The result is stored in cache for later fallback search.
+ *
+ * Same as ures_open(), but uses the fill-in parameter and does not allocate a new bundle.
*/
-U_CAPI void U_EXPORT2
+U_INTERNAL void U_EXPORT2
ures_openFillIn(UResourceBundle *r, const char* path,
const char* localeID, UErrorCode* status) {
if(U_SUCCESS(*status) && r == NULL) {
@@ -2315,6 +2368,18 @@ ures_openFillIn(UResourceBundle *r, const char* path,
}
/**
+ * Same as ures_openDirect(), but uses the fill-in parameter and does not allocate a new bundle.
+ */
+U_INTERNAL void U_EXPORT2
+ures_openDirectFillIn(UResourceBundle *r, const char* path, const char* localeID, UErrorCode* status) {
+ if(U_SUCCESS(*status) && r == NULL) {
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
+ ures_openWithType(r, path, localeID, URES_OPEN_DIRECT, status);
+}
+
+/**
* API: Counts members. For arrays and tables, returns number of resources.
* For strings, returns 1.
*/
diff --git a/Build/source/libs/icu/icu-src/source/common/uresdata.cpp b/Build/source/libs/icu/icu-src/source/common/uresdata.cpp
index 8bcb9ab8b88..b3c2e2e27cc 100644
--- a/Build/source/libs/icu/icu-src/source/common/uresdata.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uresdata.cpp
@@ -33,6 +33,7 @@
#include "uinvchar.h"
#include "uresdata.h"
#include "uresimp.h"
+#include "utracimp.h"
/*
* Resource access helpers
@@ -307,7 +308,7 @@ res_getPublicType(Resource res) {
}
U_CAPI const UChar * U_EXPORT2
-res_getString(const ResourceData *pResData, Resource res, int32_t *pLength) {
+res_getStringNoTrace(const ResourceData *pResData, Resource res, int32_t *pLength) {
const UChar *p;
uint32_t offset=RES_GET_OFFSET(res);
int32_t length;
@@ -402,7 +403,8 @@ int32_t getStringArray(const ResourceData *pResData, const icu::ResourceArray &a
}
for(int32_t i = 0; i < length; ++i) {
int32_t sLength;
- const UChar *s = res_getString(pResData, array.internalGetResource(pResData, i), &sLength);
+ // No tracing: handled by the caller
+ const UChar *s = res_getStringNoTrace(pResData, array.internalGetResource(pResData, i), &sLength);
if(s == NULL) {
errorCode = U_RESOURCE_TYPE_MISMATCH;
return 0;
@@ -434,7 +436,7 @@ res_getAlias(const ResourceData *pResData, Resource res, int32_t *pLength) {
}
U_CAPI const uint8_t * U_EXPORT2
-res_getBinary(const ResourceData *pResData, Resource res, int32_t *pLength) {
+res_getBinaryNoTrace(const ResourceData *pResData, Resource res, int32_t *pLength) {
const uint8_t *p;
uint32_t offset=RES_GET_OFFSET(res);
int32_t length;
@@ -454,7 +456,7 @@ res_getBinary(const ResourceData *pResData, Resource res, int32_t *pLength) {
U_CAPI const int32_t * U_EXPORT2
-res_getIntVector(const ResourceData *pResData, Resource res, int32_t *pLength) {
+res_getIntVectorNoTrace(const ResourceData *pResData, Resource res, int32_t *pLength) {
const int32_t *p;
uint32_t offset=RES_GET_OFFSET(res);
int32_t length;
@@ -507,7 +509,7 @@ const UChar *ResourceDataValue::getString(int32_t &length, UErrorCode &errorCode
if(U_FAILURE(errorCode)) {
return NULL;
}
- const UChar *s = res_getString(pResData, res, &length);
+ const UChar *s = res_getString(fTraceInfo, &getData(), res, &length);
if(s == NULL) {
errorCode = U_RESOURCE_TYPE_MISMATCH;
}
@@ -518,7 +520,7 @@ const UChar *ResourceDataValue::getAliasString(int32_t &length, UErrorCode &erro
if(U_FAILURE(errorCode)) {
return NULL;
}
- const UChar *s = res_getAlias(pResData, res, &length);
+ const UChar *s = res_getAlias(&getData(), res, &length);
if(s == NULL) {
errorCode = U_RESOURCE_TYPE_MISMATCH;
}
@@ -532,7 +534,7 @@ int32_t ResourceDataValue::getInt(UErrorCode &errorCode) const {
if(RES_GET_TYPE(res) != URES_INT) {
errorCode = U_RESOURCE_TYPE_MISMATCH;
}
- return RES_GET_INT(res);
+ return res_getInt(fTraceInfo, res);
}
uint32_t ResourceDataValue::getUInt(UErrorCode &errorCode) const {
@@ -542,14 +544,14 @@ uint32_t ResourceDataValue::getUInt(UErrorCode &errorCode) const {
if(RES_GET_TYPE(res) != URES_INT) {
errorCode = U_RESOURCE_TYPE_MISMATCH;
}
- return RES_GET_UINT(res);
+ return res_getUInt(fTraceInfo, res);
}
const int32_t *ResourceDataValue::getIntVector(int32_t &length, UErrorCode &errorCode) const {
if(U_FAILURE(errorCode)) {
return NULL;
}
- const int32_t *iv = res_getIntVector(pResData, res, &length);
+ const int32_t *iv = res_getIntVector(fTraceInfo, &getData(), res, &length);
if(iv == NULL) {
errorCode = U_RESOURCE_TYPE_MISMATCH;
}
@@ -560,7 +562,7 @@ const uint8_t *ResourceDataValue::getBinary(int32_t &length, UErrorCode &errorCo
if(U_FAILURE(errorCode)) {
return NULL;
}
- const uint8_t *b = res_getBinary(pResData, res, &length);
+ const uint8_t *b = res_getBinary(fTraceInfo, &getData(), res, &length);
if(b == NULL) {
errorCode = U_RESOURCE_TYPE_MISMATCH;
}
@@ -578,19 +580,19 @@ ResourceArray ResourceDataValue::getArray(UErrorCode &errorCode) const {
switch(RES_GET_TYPE(res)) {
case URES_ARRAY:
if (offset!=0) { // empty if offset==0
- items32 = (const Resource *)pResData->pRoot+offset;
+ items32 = (const Resource *)getData().pRoot+offset;
length = *items32++;
}
break;
case URES_ARRAY16:
- items16 = pResData->p16BitUnits+offset;
+ items16 = getData().p16BitUnits+offset;
length = *items16++;
break;
default:
errorCode = U_RESOURCE_TYPE_MISMATCH;
return ResourceArray();
}
- return ResourceArray(items16, items32, length);
+ return ResourceArray(items16, items32, length, fTraceInfo);
}
ResourceTable ResourceDataValue::getTable(UErrorCode &errorCode) const {
@@ -606,19 +608,19 @@ ResourceTable ResourceDataValue::getTable(UErrorCode &errorCode) const {
switch(RES_GET_TYPE(res)) {
case URES_TABLE:
if (offset != 0) { // empty if offset==0
- keys16 = (const uint16_t *)(pResData->pRoot+offset);
+ keys16 = (const uint16_t *)(getData().pRoot+offset);
length = *keys16++;
items32 = (const Resource *)(keys16+length+(~length&1));
}
break;
case URES_TABLE16:
- keys16 = pResData->p16BitUnits+offset;
+ keys16 = getData().p16BitUnits+offset;
length = *keys16++;
items16 = keys16 + length;
break;
case URES_TABLE32:
if (offset != 0) { // empty if offset==0
- keys32 = pResData->pRoot+offset;
+ keys32 = getData().pRoot+offset;
length = *keys32++;
items32 = (const Resource *)keys32 + length;
}
@@ -627,22 +629,22 @@ ResourceTable ResourceDataValue::getTable(UErrorCode &errorCode) const {
errorCode = U_RESOURCE_TYPE_MISMATCH;
return ResourceTable();
}
- return ResourceTable(keys16, keys32, items16, items32, length);
+ return ResourceTable(keys16, keys32, items16, items32, length, fTraceInfo);
}
UBool ResourceDataValue::isNoInheritanceMarker() const {
- return ::isNoInheritanceMarker(pResData, res);
+ return ::isNoInheritanceMarker(&getData(), res);
}
int32_t ResourceDataValue::getStringArray(UnicodeString *dest, int32_t capacity,
UErrorCode &errorCode) const {
- return ::getStringArray(pResData, getArray(errorCode), dest, capacity, errorCode);
+ return ::getStringArray(&getData(), getArray(errorCode), dest, capacity, errorCode);
}
int32_t ResourceDataValue::getStringArrayOrStringAsArray(UnicodeString *dest, int32_t capacity,
UErrorCode &errorCode) const {
if(URES_IS_ARRAY(res)) {
- return ::getStringArray(pResData, getArray(errorCode), dest, capacity, errorCode);
+ return ::getStringArray(&getData(), getArray(errorCode), dest, capacity, errorCode);
}
if(U_FAILURE(errorCode)) {
return 0;
@@ -656,7 +658,7 @@ int32_t ResourceDataValue::getStringArrayOrStringAsArray(UnicodeString *dest, in
return 1;
}
int32_t sLength;
- const UChar *s = res_getString(pResData, res, &sLength);
+ const UChar *s = res_getString(fTraceInfo, &getData(), res, &sLength);
if(s != NULL) {
dest[0].setTo(TRUE, s, sLength);
return 1;
@@ -671,7 +673,7 @@ UnicodeString ResourceDataValue::getStringOrFirstOfArray(UErrorCode &errorCode)
return us;
}
int32_t sLength;
- const UChar *s = res_getString(pResData, res, &sLength);
+ const UChar *s = res_getString(fTraceInfo, &getData(), res, &sLength);
if(s != NULL) {
us.setTo(TRUE, s, sLength);
return us;
@@ -681,7 +683,8 @@ UnicodeString ResourceDataValue::getStringOrFirstOfArray(UErrorCode &errorCode)
return us;
}
if(array.getSize() > 0) {
- s = res_getString(pResData, array.internalGetResource(pResData, 0), &sLength);
+ // Tracing is already performed above (unimportant for trace that this is an array)
+ s = res_getStringNoTrace(&getData(), array.internalGetResource(&getData(), 0), &sLength);
if(s != NULL) {
us.setTo(TRUE, s, sLength);
return us;
@@ -818,18 +821,45 @@ UBool icu::ResourceTable::getKeyAndValue(int32_t i,
const char *&key, icu::ResourceValue &value) const {
if(0 <= i && i < length) {
icu::ResourceDataValue &rdValue = static_cast<icu::ResourceDataValue &>(value);
- if (keys16 != NULL) {
- key = RES_GET_KEY16(rdValue.pResData, keys16[i]);
+ if (keys16 != nullptr) {
+ key = RES_GET_KEY16(&rdValue.getData(), keys16[i]);
} else {
- key = RES_GET_KEY32(rdValue.pResData, keys32[i]);
+ key = RES_GET_KEY32(&rdValue.getData(), keys32[i]);
}
Resource res;
- if (items16 != NULL) {
- res = makeResourceFrom16(rdValue.pResData, items16[i]);
+ if (items16 != nullptr) {
+ res = makeResourceFrom16(&rdValue.getData(), items16[i]);
} else {
res = items32[i];
}
- rdValue.setResource(res);
+ // Note: the ResourceTracer keeps a reference to the field of this
+ // ResourceTable. This is OK because the ResourceTable should remain
+ // alive for the duration that fields are being read from it
+ // (including nested fields).
+ rdValue.setResource(res, ResourceTracer(fTraceInfo, key));
+ return TRUE;
+ }
+ return FALSE;
+}
+
+UBool icu::ResourceTable::findValue(const char *key, ResourceValue &value) const {
+ icu::ResourceDataValue &rdValue = static_cast<icu::ResourceDataValue &>(value);
+ const char *realKey = nullptr;
+ int32_t i;
+ if (keys16 != nullptr) {
+ i = _res_findTableItem(&rdValue.getData(), keys16, length, key, &realKey);
+ } else {
+ i = _res_findTable32Item(&rdValue.getData(), keys32, length, key, &realKey);
+ }
+ if (i >= 0) {
+ Resource res;
+ if (items16 != nullptr) {
+ res = makeResourceFrom16(&rdValue.getData(), items16[i]);
+ } else {
+ res = items32[i];
+ }
+ // Same note about lifetime as in getKeyAndValue().
+ rdValue.setResource(res, ResourceTracer(fTraceInfo, key));
return TRUE;
}
return FALSE;
@@ -875,7 +905,13 @@ uint32_t icu::ResourceArray::internalGetResource(const ResourceData *pResData, i
UBool icu::ResourceArray::getValue(int32_t i, icu::ResourceValue &value) const {
if(0 <= i && i < length) {
icu::ResourceDataValue &rdValue = static_cast<icu::ResourceDataValue &>(value);
- rdValue.setResource(internalGetResource(rdValue.pResData, i));
+ // Note: the ResourceTracer keeps a reference to the field of this
+ // ResourceArray. This is OK because the ResourceArray should remain
+ // alive for the duration that fields are being read from it
+ // (including nested fields).
+ rdValue.setResource(
+ internalGetResource(&rdValue.getData(), i),
+ ResourceTracer(fTraceInfo, i));
return TRUE;
}
return FALSE;
diff --git a/Build/source/libs/icu/icu-src/source/common/uresdata.h b/Build/source/libs/icu/icu-src/source/common/uresdata.h
index 4e28ddccf63..d1b67babf29 100644
--- a/Build/source/libs/icu/icu-src/source/common/uresdata.h
+++ b/Build/source/libs/icu/icu-src/source/common/uresdata.h
@@ -69,14 +69,16 @@ typedef uint32_t Resource;
#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
#define RES_GET_POINTER(pRoot, res) ((pRoot)+RES_GET_OFFSET(res))
-/* get signed and unsigned integer values directly from the Resource handle */
+/* get signed and unsigned integer values directly from the Resource handle
+ * NOTE: For proper logging, please use the res_getInt() constexpr
+ */
#if U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC
-# define RES_GET_INT(res) (((int32_t)((res)<<4L))>>4L)
+# define RES_GET_INT_NO_TRACE(res) (((int32_t)((res)<<4L))>>4L)
#else
-# define RES_GET_INT(res) (int32_t)(((res)&0x08000000) ? (res)|0xf0000000 : (res)&0x07ffffff)
+# define RES_GET_INT_NO_TRACE(res) (int32_t)(((res)&0x08000000) ? (res)|0xf0000000 : (res)&0x07ffffff)
#endif
-#define RES_GET_UINT(res) ((res)&0x0fffffff)
+#define RES_GET_UINT_NO_TRACE(res) ((res)&0x0fffffff)
#define URES_IS_ARRAY(type) ((int32_t)(type)==URES_ARRAY || (int32_t)(type)==URES_ARRAY16)
#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
@@ -423,22 +425,26 @@ res_unload(ResourceData *pResData);
U_INTERNAL UResType U_EXPORT2
res_getPublicType(Resource res);
+///////////////////////////////////////////////////////////////////////////
+// To enable tracing, use the inline versions of the res_get* functions. //
+///////////////////////////////////////////////////////////////////////////
+
/*
* Return a pointer to a zero-terminated, const UChar* string
* and set its length in *pLength.
* Returns NULL if not found.
*/
U_INTERNAL const UChar * U_EXPORT2
-res_getString(const ResourceData *pResData, Resource res, int32_t *pLength);
-
-U_INTERNAL const UChar * U_EXPORT2
-res_getAlias(const ResourceData *pResData, Resource res, int32_t *pLength);
+res_getStringNoTrace(const ResourceData *pResData, Resource res, int32_t *pLength);
U_INTERNAL const uint8_t * U_EXPORT2
-res_getBinary(const ResourceData *pResData, Resource res, int32_t *pLength);
+res_getBinaryNoTrace(const ResourceData *pResData, Resource res, int32_t *pLength);
U_INTERNAL const int32_t * U_EXPORT2
-res_getIntVector(const ResourceData *pResData, Resource res, int32_t *pLength);
+res_getIntVectorNoTrace(const ResourceData *pResData, Resource res, int32_t *pLength);
+
+U_INTERNAL const UChar * U_EXPORT2
+res_getAlias(const ResourceData *pResData, Resource res, int32_t *pLength);
U_INTERNAL Resource U_EXPORT2
res_getResource(const ResourceData *pResData, const char *key);
@@ -470,17 +476,55 @@ U_CFUNC Resource res_findResource(const ResourceData *pResData, Resource r,
#ifdef __cplusplus
#include "resource.h"
+#include "restrace.h"
U_NAMESPACE_BEGIN
+inline const UChar* res_getString(const ResourceTracer& traceInfo,
+ const ResourceData *pResData, Resource res, int32_t *pLength) {
+ traceInfo.trace("string");
+ return res_getStringNoTrace(pResData, res, pLength);
+}
+
+inline const uint8_t* res_getBinary(const ResourceTracer& traceInfo,
+ const ResourceData *pResData, Resource res, int32_t *pLength) {
+ traceInfo.trace("binary");
+ return res_getBinaryNoTrace(pResData, res, pLength);
+}
+
+inline const int32_t* res_getIntVector(const ResourceTracer& traceInfo,
+ const ResourceData *pResData, Resource res, int32_t *pLength) {
+ traceInfo.trace("intvector");
+ return res_getIntVectorNoTrace(pResData, res, pLength);
+}
+
+inline int32_t res_getInt(const ResourceTracer& traceInfo, Resource res) {
+ traceInfo.trace("int");
+ return RES_GET_INT_NO_TRACE(res);
+}
+
+inline uint32_t res_getUInt(const ResourceTracer& traceInfo, Resource res) {
+ traceInfo.trace("uint");
+ return RES_GET_UINT_NO_TRACE(res);
+}
+
class ResourceDataValue : public ResourceValue {
public:
- ResourceDataValue() : pResData(NULL), res(static_cast<Resource>(URES_NONE)) {}
+ ResourceDataValue() :
+ res(static_cast<Resource>(URES_NONE)),
+ fTraceInfo() {}
virtual ~ResourceDataValue();
- void setData(const ResourceData *data) { pResData = data; }
- void setResource(Resource r) { res = r; }
+ void setData(const ResourceData *data) {
+ resData = *data;
+ }
+ void setResource(Resource r, ResourceTracer&& traceInfo) {
+ res = r;
+ fTraceInfo = traceInfo;
+ }
+
+ const ResourceData &getData() const { return resData; }
virtual UResType getType() const;
virtual const UChar *getString(int32_t &length, UErrorCode &errorCode) const;
virtual const UChar *getAliasString(int32_t &length, UErrorCode &errorCode) const;
@@ -497,10 +541,12 @@ public:
UErrorCode &errorCode) const;
virtual UnicodeString getStringOrFirstOfArray(UErrorCode &errorCode) const;
- const ResourceData *pResData;
-
private:
+ // TODO(ICU-20769): If UResourceBundle.fResData becomes a pointer,
+ // then remove this value field again and just store a pResData pointer.
+ ResourceData resData;
Resource res;
+ ResourceTracer fTraceInfo;
};
U_NAMESPACE_END
diff --git a/Build/source/libs/icu/icu-src/source/common/uresimp.h b/Build/source/libs/icu/icu-src/source/common/uresimp.h
index e7fa3e1e36b..f453ddc004a 100644
--- a/Build/source/libs/icu/icu-src/source/common/uresimp.h
+++ b/Build/source/libs/icu/icu-src/source/common/uresimp.h
@@ -11,6 +11,7 @@
#define URESIMP_H
#include "unicode/ures.h"
+#include "unicode/utypes.h"
#include "uresdata.h"
@@ -66,6 +67,9 @@ struct UResourceBundle {
char *fVersion;
UResourceDataEntry *fTopLevelData; /* for getting the valid locale */
char *fResPath; /* full path to the resource: "zh_TW/CollationElements/Sequence" */
+ // TODO(ICU-20769): Try to change the by-value fResData into a pointer,
+ // with the struct in only one place for each bundle.
+ // Also replace class ResourceDataValue.resData with a pResData pointer again.
ResourceData fResData;
char fResBuf[RES_BUFSIZE];
int32_t fResPathLen;
@@ -82,6 +86,60 @@ struct UResourceBundle {
U_CAPI void U_EXPORT2 ures_initStackObject(UResourceBundle* resB);
+#ifdef __cplusplus
+
+U_NAMESPACE_BEGIN
+
+/**
+ * \class StackUResourceBundle
+ * "Smart pointer" like class, closes a UResourceBundle via ures_close().
+ *
+ * This code:
+ *
+ * StackUResourceBundle bundle;
+ * foo(bundle.getAlias());
+ *
+ * Is equivalent to this code:
+ *
+ * UResourceBundle bundle;
+ * ures_initStackObject(&bundle);
+ * foo(&bundle);
+ * ures_close(&bundle);
+ *
+ * @see LocalUResourceBundlePointer
+ * @internal
+ */
+class U_COMMON_API StackUResourceBundle {
+public:
+ // No heap allocation. Use only on the stack.
+ static void* U_EXPORT2 operator new(size_t) U_NOEXCEPT = delete;
+ static void* U_EXPORT2 operator new[](size_t) U_NOEXCEPT = delete;
+#if U_HAVE_PLACEMENT_NEW
+ static void* U_EXPORT2 operator new(size_t, void*) U_NOEXCEPT = delete;
+#endif
+
+ StackUResourceBundle();
+ ~StackUResourceBundle();
+
+ UResourceBundle* getAlias() { return &bundle; }
+
+ UResourceBundle& ref() { return bundle; }
+ const UResourceBundle& ref() const { return bundle; }
+
+ StackUResourceBundle(const StackUResourceBundle&) = delete;
+ StackUResourceBundle& operator=(const StackUResourceBundle&) = delete;
+
+ StackUResourceBundle(StackUResourceBundle&&) = delete;
+ StackUResourceBundle& operator=(StackUResourceBundle&&) = delete;
+
+private:
+ UResourceBundle bundle;
+};
+
+U_NAMESPACE_END
+
+#endif /* __cplusplus */
+
/**
* Opens a resource bundle for the locale;
* if there is not even a base language bundle, then loads the root bundle;
@@ -227,6 +285,11 @@ ures_getStringByKeyWithFallback(const UResourceBundle *resB,
#ifdef __cplusplus
U_CAPI void U_EXPORT2
+ures_getValueWithFallback(const UResourceBundle *bundle, const char *path,
+ UResourceBundle *tempFillIn,
+ icu::ResourceDataValue &value, UErrorCode &errorCode);
+
+U_CAPI void U_EXPORT2
ures_getAllItemsWithFallback(const UResourceBundle *bundle, const char *path,
icu::ResourceSink &sink, UErrorCode &errorCode);
@@ -275,4 +338,27 @@ U_CAPI const char* U_EXPORT2
ures_getLocaleInternal(const UResourceBundle* resourceBundle,
UErrorCode* status);
+/**
+ * Same as ures_openDirect() but uses the fill-in parameter instead of allocating a new bundle.
+ *
+ * @param r The existing UResourceBundle to fill in. If NULL then status will be
+ * set to U_ILLEGAL_ARGUMENT_ERROR.
+ * @param packageName The packageName and locale together point to an ICU udata object,
+ * as defined by <code> udata_open( packageName, "res", locale, err) </code>
+ * or equivalent. Typically, packageName will refer to a (.dat) file, or to
+ * a package registered with udata_setAppData(). Using a full file or directory
+ * pathname for packageName is deprecated. If NULL, ICU data will be used.
+ * @param locale specifies the locale for which we want to open the resource
+ * if NULL, the default locale will be used. If strlen(locale) == 0
+ * root locale will be used.
+ * @param status The error code.
+ * @see ures_openDirect
+ * @internal
+ */
+U_CAPI void U_EXPORT2
+ures_openDirectFillIn(UResourceBundle *r,
+ const char *packageName,
+ const char *locale,
+ UErrorCode *status);
+
#endif /*URESIMP_H*/
diff --git a/Build/source/libs/icu/icu-src/source/common/uscript.cpp b/Build/source/libs/icu/icu-src/source/common/uscript.cpp
index 83b5f7ef168..98528c158b4 100644
--- a/Build/source/libs/icu/icu-src/source/common/uscript.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uscript.cpp
@@ -18,8 +18,11 @@
#include "unicode/uchar.h"
#include "unicode/uscript.h"
#include "unicode/uloc.h"
+#include "bytesinkutil.h"
+#include "charstr.h"
#include "cmemory.h"
#include "cstring.h"
+#include "ulocimp.h"
static const UScriptCode JAPANESE[3] = { USCRIPT_KATAKANA, USCRIPT_HIRAGANA, USCRIPT_HAN };
static const UScriptCode KOREAN[2] = { USCRIPT_HANGUL, USCRIPT_HAN };
@@ -98,7 +101,6 @@ uscript_getCode(const char* nameOrAbbrOrLocale,
int32_t capacity,
UErrorCode* err){
UBool triedCode;
- char likely[ULOC_FULLNAME_CAPACITY];
UErrorCode internalErrorCode;
int32_t length;
@@ -125,10 +127,13 @@ uscript_getCode(const char* nameOrAbbrOrLocale,
if(U_FAILURE(*err) || length != 0) {
return length;
}
- (void)uloc_addLikelySubtags(nameOrAbbrOrLocale,
- likely, UPRV_LENGTHOF(likely), &internalErrorCode);
+ icu::CharString likely;
+ {
+ icu::CharStringByteSink sink(&likely);
+ ulocimp_addLikelySubtags(nameOrAbbrOrLocale, sink, &internalErrorCode);
+ }
if(U_SUCCESS(internalErrorCode) && internalErrorCode != U_STRING_NOT_TERMINATED_WARNING) {
- length = getCodesFromLocale(likely, fillIn, capacity, err);
+ length = getCodesFromLocale(likely.data(), fillIn, capacity, err);
if(U_FAILURE(*err) || length != 0) {
return length;
}
diff --git a/Build/source/libs/icu/icu-src/source/common/uscript_props.cpp b/Build/source/libs/icu/icu-src/source/common/uscript_props.cpp
index bfdb68c7a9c..ee120b4ca1d 100644
--- a/Build/source/libs/icu/icu-src/source/common/uscript_props.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uscript_props.cpp
@@ -229,6 +229,10 @@ const int32_t SCRIPT_PROPS[] = {
0x10D12 | LIMITED_USE | RTL, // Rohg
0x10F42 | EXCLUSION | RTL, // Sogd
0x10F19 | EXCLUSION | RTL, // Sogo
+ 0x10FF1 | EXCLUSION | RTL, // Elym
+ 0x1E108 | LIMITED_USE, // Hmnp
+ 0x119CE | EXCLUSION, // Nand
+ 0x1E2E1 | LIMITED_USE, // Wcho
// End copy-paste from parsescriptmetadata.py
};
diff --git a/Build/source/libs/icu/icu-src/source/common/uset.cpp b/Build/source/libs/icu/icu-src/source/common/uset.cpp
index 39ad0a340c4..eae7981d52f 100644
--- a/Build/source/libs/icu/icu-src/source/common/uset.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/uset.cpp
@@ -249,7 +249,7 @@ class USetAccess /* not : public UObject because all methods are static */ {
public:
/* Try to have the compiler inline these*/
inline static int32_t getStringCount(const UnicodeSet& set) {
- return set.getStringCount();
+ return set.stringsSize();
}
inline static const UnicodeString* getString(const UnicodeSet& set,
int32_t i) {
diff --git a/Build/source/libs/icu/icu-src/source/common/usetiter.cpp b/Build/source/libs/icu/icu-src/source/common/usetiter.cpp
index 93048ba2a08..79151690494 100644
--- a/Build/source/libs/icu/icu-src/source/common/usetiter.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/usetiter.cpp
@@ -116,7 +116,7 @@ void UnicodeSetIterator::reset() {
stringCount = 0;
} else {
endRange = set->getRangeCount() - 1;
- stringCount = set->strings->size();
+ stringCount = set->stringsSize();
}
range = 0;
endElement = -1;
diff --git a/Build/source/libs/icu/icu-src/source/common/usprep.cpp b/Build/source/libs/icu/icu-src/source/common/usprep.cpp
index 01238b35f5b..8351a773706 100644
--- a/Build/source/libs/icu/icu-src/source/common/usprep.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/usprep.cpp
@@ -45,10 +45,9 @@ U_CDECL_BEGIN
Static cache for already opened StringPrep profiles
*/
static UHashtable *SHARED_DATA_HASHTABLE = NULL;
-static icu::UInitOnce gSharedDataInitOnce;
-
-static UMutex usprepMutex = U_MUTEX_INITIALIZER;
+static icu::UInitOnce gSharedDataInitOnce = U_INITONCE_INITIALIZER;
+static UMutex usprepMutex;
/* format version of spp file */
//static uint8_t formatVersion[4]={ 0, 0, 0, 0 };
diff --git a/Build/source/libs/icu/icu-src/source/common/ustr_cnv.cpp b/Build/source/libs/icu/icu-src/source/common/ustr_cnv.cpp
index 97c78bfaca9..9a25a9905a2 100644
--- a/Build/source/libs/icu/icu-src/source/common/ustr_cnv.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ustr_cnv.cpp
@@ -40,14 +40,14 @@ u_getDefaultConverter(UErrorCode *status)
UConverter *converter = NULL;
if (gDefaultConverter != NULL) {
- umtx_lock(NULL);
+ icu::umtx_lock(NULL);
/* need to check to make sure it wasn't taken out from under us */
if (gDefaultConverter != NULL) {
converter = gDefaultConverter;
gDefaultConverter = NULL;
}
- umtx_unlock(NULL);
+ icu::umtx_unlock(NULL);
}
/* if the cache was empty, create a converter */
@@ -70,12 +70,12 @@ u_releaseDefaultConverter(UConverter *converter)
ucnv_reset(converter);
}
ucnv_enableCleanup();
- umtx_lock(NULL);
+ icu::umtx_lock(NULL);
if(gDefaultConverter == NULL) {
gDefaultConverter = converter;
converter = NULL;
}
- umtx_unlock(NULL);
+ icu::umtx_unlock(NULL);
}
if(converter != NULL) {
@@ -89,14 +89,14 @@ u_flushDefaultConverter()
UConverter *converter = NULL;
if (gDefaultConverter != NULL) {
- umtx_lock(NULL);
+ icu::umtx_lock(NULL);
/* need to check to make sure it wasn't taken out from under us */
if (gDefaultConverter != NULL) {
converter = gDefaultConverter;
gDefaultConverter = NULL;
}
- umtx_unlock(NULL);
+ icu::umtx_unlock(NULL);
}
/* if the cache was populated, flush it */
diff --git a/Build/source/libs/icu/icu-src/source/common/ustr_titlecase_brkiter.cpp b/Build/source/libs/icu/icu-src/source/common/ustr_titlecase_brkiter.cpp
index 89888cf336b..457905eb60d 100644
--- a/Build/source/libs/icu/icu-src/source/common/ustr_titlecase_brkiter.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ustr_titlecase_brkiter.cpp
@@ -45,7 +45,7 @@ public:
WholeStringBreakIterator() : BreakIterator(), length(0) {}
~WholeStringBreakIterator() U_OVERRIDE;
UBool operator==(const BreakIterator&) const U_OVERRIDE;
- BreakIterator *clone() const U_OVERRIDE;
+ WholeStringBreakIterator *clone() const U_OVERRIDE;
static UClassID U_EXPORT2 getStaticClassID();
UClassID getDynamicClassID() const U_OVERRIDE;
CharacterIterator &getText() const U_OVERRIDE;
@@ -62,9 +62,9 @@ public:
int32_t preceding(int32_t offset) U_OVERRIDE;
UBool isBoundary(int32_t offset) U_OVERRIDE;
int32_t next(int32_t n) U_OVERRIDE;
- BreakIterator *createBufferClone(void *stackBuffer, int32_t &BufferSize,
- UErrorCode &errorCode) U_OVERRIDE;
- BreakIterator &refreshInputText(UText *input, UErrorCode &errorCode) U_OVERRIDE;
+ WholeStringBreakIterator *createBufferClone(void *stackBuffer, int32_t &BufferSize,
+ UErrorCode &errorCode) U_OVERRIDE;
+ WholeStringBreakIterator &refreshInputText(UText *input, UErrorCode &errorCode) U_OVERRIDE;
private:
int32_t length;
@@ -74,16 +74,10 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(WholeStringBreakIterator)
WholeStringBreakIterator::~WholeStringBreakIterator() {}
UBool WholeStringBreakIterator::operator==(const BreakIterator&) const { return FALSE; }
-BreakIterator *WholeStringBreakIterator::clone() const { return nullptr; }
+WholeStringBreakIterator *WholeStringBreakIterator::clone() const { return nullptr; }
CharacterIterator &WholeStringBreakIterator::getText() const {
- U_ASSERT(FALSE); // really should not be called
- // Returns a null reference.
- // Otherwise we would have to define a dummy CharacterIterator,
- // and either have it as a field and const_cast it to a non-const reference,
- // or have it via a pointer and return a reference to that.
- CharacterIterator *none = nullptr;
- return *none;
+ UPRV_UNREACHABLE; // really should not be called
}
UText *WholeStringBreakIterator::getUText(UText * /*fillIn*/, UErrorCode &errorCode) const {
if (U_SUCCESS(errorCode)) {
@@ -105,10 +99,8 @@ void WholeStringBreakIterator::setText(UText *text, UErrorCode &errorCode) {
}
}
}
-void WholeStringBreakIterator::adoptText(CharacterIterator* it) {
- U_ASSERT(FALSE); // should not be called
- length = it->getLength();
- delete it;
+void WholeStringBreakIterator::adoptText(CharacterIterator*) {
+ UPRV_UNREACHABLE; // should not be called
}
int32_t WholeStringBreakIterator::first() { return 0; }
@@ -121,14 +113,14 @@ int32_t WholeStringBreakIterator::preceding(int32_t /*offset*/) { return 0; }
UBool WholeStringBreakIterator::isBoundary(int32_t /*offset*/) { return FALSE; }
int32_t WholeStringBreakIterator::next(int32_t /*n*/) { return length; }
-BreakIterator *WholeStringBreakIterator::createBufferClone(
+WholeStringBreakIterator *WholeStringBreakIterator::createBufferClone(
void * /*stackBuffer*/, int32_t & /*BufferSize*/, UErrorCode &errorCode) {
if (U_SUCCESS(errorCode)) {
errorCode = U_UNSUPPORTED_ERROR;
}
return nullptr;
}
-BreakIterator &WholeStringBreakIterator::refreshInputText(
+WholeStringBreakIterator &WholeStringBreakIterator::refreshInputText(
UText * /*input*/, UErrorCode &errorCode) {
if (U_SUCCESS(errorCode)) {
errorCode = U_UNSUPPORTED_ERROR;
diff --git a/Build/source/libs/icu/icu-src/source/common/ustring.cpp b/Build/source/libs/icu/icu-src/source/common/ustring.cpp
index 6450ea2bc64..67cb4544b9a 100644
--- a/Build/source/libs/icu/icu-src/source/common/ustring.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/ustring.cpp
@@ -1428,7 +1428,7 @@ u_unescape(const char *src, UChar *dest, int32_t destCapacity) {
* NUL-terminate a string no matter what its type.
* Set warning and error codes accordingly.
*/
-#define __TERMINATE_STRING(dest, destCapacity, length, pErrorCode) \
+#define __TERMINATE_STRING(dest, destCapacity, length, pErrorCode) UPRV_BLOCK_MACRO_BEGIN { \
if(pErrorCode!=NULL && U_SUCCESS(*pErrorCode)) { \
/* not a public function, so no complete argument checking */ \
\
@@ -1448,7 +1448,8 @@ u_unescape(const char *src, UChar *dest, int32_t destCapacity) {
/* even the string itself did not fit - set an error code */ \
*pErrorCode=U_BUFFER_OVERFLOW_ERROR; \
} \
- }
+ } \
+} UPRV_BLOCK_MACRO_END
U_CAPI int32_t U_EXPORT2
u_terminateUChars(UChar *dest, int32_t destCapacity, int32_t length, UErrorCode *pErrorCode) {
@@ -1488,7 +1489,7 @@ u_terminateWChars(wchar_t *dest, int32_t destCapacity, int32_t length, UErrorCod
the output range. [LIU]
*/
-#define STRING_HASH(TYPE, STR, STRLEN, DEREF) \
+#define STRING_HASH(TYPE, STR, STRLEN, DEREF) UPRV_BLOCK_MACRO_BEGIN { \
uint32_t hash = 0; \
const TYPE *p = (const TYPE*) STR; \
if (p != NULL) { \
@@ -1500,7 +1501,8 @@ u_terminateWChars(wchar_t *dest, int32_t destCapacity, int32_t length, UErrorCod
p += inc; \
} \
} \
- return static_cast<int32_t>(hash)
+ return static_cast<int32_t>(hash); \
+} UPRV_BLOCK_MACRO_END
/* Used by UnicodeString to compute its hashcode - Not public API. */
U_CAPI int32_t U_EXPORT2
diff --git a/Build/source/libs/icu/icu-src/source/common/utext.cpp b/Build/source/libs/icu/icu-src/source/common/utext.cpp
index 6f579bd4f27..9a77228cfc6 100644
--- a/Build/source/libs/icu/icu-src/source/common/utext.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/utext.cpp
@@ -567,7 +567,7 @@ enum {
struct ExtendedUText {
UText ut;
- UAlignedMemory extension;
+ max_align_t extension;
};
static const UText emptyText = UTEXT_INITIALIZER;
@@ -582,7 +582,7 @@ utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status) {
// We need to heap-allocate storage for the new UText
int32_t spaceRequired = sizeof(UText);
if (extraSpace > 0) {
- spaceRequired = sizeof(ExtendedUText) + extraSpace - sizeof(UAlignedMemory);
+ spaceRequired = sizeof(ExtendedUText) + extraSpace - sizeof(max_align_t);
}
ut = (UText *)uprv_malloc(spaceRequired);
if (ut == NULL) {
diff --git a/Build/source/libs/icu/icu-src/source/common/util.cpp b/Build/source/libs/icu/icu-src/source/common/util.cpp
index a762cc48716..86e5c791bad 100644
--- a/Build/source/libs/icu/icu-src/source/common/util.cpp
+++ b/Build/source/libs/icu/icu-src/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/Build/source/libs/icu/icu-src/source/common/util.h b/Build/source/libs/icu/icu-src/source/common/util.h
index e197cab7882..f3f71dce458 100644
--- a/Build/source/libs/icu/icu-src/source/common/util.h
+++ b/Build/source/libs/icu/icu-src/source/common/util.h
@@ -179,13 +179,22 @@ 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
* is no identifier.
diff --git a/Build/source/libs/icu/icu-src/source/common/utrace.cpp b/Build/source/libs/icu/icu-src/source/common/utrace.cpp
index dad1ef8b644..c9815465947 100644
--- a/Build/source/libs/icu/icu-src/source/common/utrace.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/utrace.cpp
@@ -67,8 +67,7 @@ utrace_exit(int32_t fnNumber, int32_t returnType, ...) {
fmt = gExitFmtPtrStatus;
break;
default:
- U_ASSERT(FALSE);
- fmt = gExitFmt;
+ UPRV_UNREACHABLE;
}
va_start(args, returnType);
@@ -477,6 +476,16 @@ trCollNames[] = {
NULL
};
+
+static const char* const
+trResDataNames[] = {
+ "resc",
+ "bundle-open",
+ "file-open",
+ "res-open",
+ NULL
+};
+
U_CAPI const char * U_EXPORT2
utrace_functionName(int32_t fnNumber) {
@@ -486,6 +495,8 @@ utrace_functionName(int32_t fnNumber) {
return trConvNames[fnNumber - UTRACE_CONVERSION_START];
} else if(UTRACE_COLLATION_START <= fnNumber && fnNumber < UTRACE_COLLATION_LIMIT){
return trCollNames[fnNumber - UTRACE_COLLATION_START];
+ } else if(UTRACE_UDATA_START <= fnNumber && fnNumber < UTRACE_RES_DATA_LIMIT){
+ return trResDataNames[fnNumber - UTRACE_UDATA_START];
} else {
return "[BOGUS Trace Function Number]";
}
diff --git a/Build/source/libs/icu/icu-src/source/common/utracimp.h b/Build/source/libs/icu/icu-src/source/common/utracimp.h
index e8ee53fcd61..f32fe1db394 100644
--- a/Build/source/libs/icu/icu-src/source/common/utracimp.h
+++ b/Build/source/libs/icu/icu-src/source/common/utracimp.h
@@ -144,10 +144,12 @@ U_CDECL_END
*/
#define UTRACE_ENTRY(fnNumber) \
int32_t utraceFnNumber=(fnNumber); \
+UPRV_BLOCK_MACRO_BEGIN { \
if(utrace_getLevel()>=UTRACE_INFO) { \
utrace_entry(fnNumber); \
utraceFnNumber |= UTRACE_TRACED_ENTRY; \
- }
+ } \
+} UPRV_BLOCK_MACRO_END
/**
@@ -162,10 +164,12 @@ U_CDECL_END
*/
#define UTRACE_ENTRY_OC(fnNumber) \
int32_t utraceFnNumber=(fnNumber); \
+UPRV_BLOCK_MACRO_BEGIN { \
if(utrace_getLevel()>=UTRACE_OPEN_CLOSE) { \
utrace_entry(fnNumber); \
utraceFnNumber |= UTRACE_TRACED_ENTRY; \
- }
+ } \
+} UPRV_BLOCK_MACRO_END
/**
* Trace statement for each exit point of a function that has a UTRACE_ENTRY()
@@ -179,10 +183,11 @@ U_CDECL_END
*
* @internal
*/
-#define UTRACE_EXIT() \
- {if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \
+#define UTRACE_EXIT() UPRV_BLOCK_MACRO_BEGIN { \
+ if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \
utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, UTRACE_EXITV_NONE); \
- }}
+ } \
+} UPRV_BLOCK_MACRO_END
/**
* Trace statement for each exit point of a function that has a UTRACE_ENTRY()
@@ -192,25 +197,29 @@ U_CDECL_END
*
* @internal
*/
-#define UTRACE_EXIT_VALUE(val) \
- {if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \
+#define UTRACE_EXIT_VALUE(val) UPRV_BLOCK_MACRO_BEGIN { \
+ if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \
utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, UTRACE_EXITV_I32, val); \
- }}
+ } \
+} UPRV_BLOCK_MACRO_END
-#define UTRACE_EXIT_STATUS(status) \
- {if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \
+#define UTRACE_EXIT_STATUS(status) UPRV_BLOCK_MACRO_BEGIN { \
+ if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \
utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, UTRACE_EXITV_STATUS, status); \
- }}
+ } \
+} UPRV_BLOCK_MACRO_END
-#define UTRACE_EXIT_VALUE_STATUS(val, status) \
- {if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \
+#define UTRACE_EXIT_VALUE_STATUS(val, status) UPRV_BLOCK_MACRO_BEGIN { \
+ if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \
utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (UTRACE_EXITV_I32 | UTRACE_EXITV_STATUS), val, status); \
- }}
+ } \
+} UPRV_BLOCK_MACRO_END
-#define UTRACE_EXIT_PTR_STATUS(ptr, status) \
- {if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \
+#define UTRACE_EXIT_PTR_STATUS(ptr, status) UPRV_BLOCK_MACRO_BEGIN { \
+ if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \
utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (UTRACE_EXITV_PTR | UTRACE_EXITV_STATUS), ptr, status); \
- }}
+ } \
+} UPRV_BLOCK_MACRO_END
/**
* Trace statement used inside functions that have a UTRACE_ENTRY() statement.
@@ -220,10 +229,11 @@ U_CDECL_END
* Calls utrace_data() if the level is high enough.
* @internal
*/
-#define UTRACE_DATA0(level, fmt) \
+#define UTRACE_DATA0(level, fmt) UPRV_BLOCK_MACRO_BEGIN { \
if(UTRACE_LEVEL(level)) { \
utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt)); \
- }
+ } \
+} UPRV_BLOCK_MACRO_END
/**
* Trace statement used inside functions that have a UTRACE_ENTRY() statement.
@@ -233,10 +243,11 @@ U_CDECL_END
* Calls utrace_data() if the level is high enough.
* @internal
*/
-#define UTRACE_DATA1(level, fmt, a) \
+#define UTRACE_DATA1(level, fmt, a) UPRV_BLOCK_MACRO_BEGIN { \
if(UTRACE_LEVEL(level)) { \
utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY , (level), (fmt), (a)); \
- }
+ } \
+} UPRV_BLOCK_MACRO_END
/**
* Trace statement used inside functions that have a UTRACE_ENTRY() statement.
@@ -246,10 +257,11 @@ U_CDECL_END
* Calls utrace_data() if the level is high enough.
* @internal
*/
-#define UTRACE_DATA2(level, fmt, a, b) \
+#define UTRACE_DATA2(level, fmt, a, b) UPRV_BLOCK_MACRO_BEGIN { \
if(UTRACE_LEVEL(level)) { \
utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY , (level), (fmt), (a), (b)); \
- }
+ } \
+} UPRV_BLOCK_MACRO_END
/**
* Trace statement used inside functions that have a UTRACE_ENTRY() statement.
@@ -259,10 +271,11 @@ U_CDECL_END
* Calls utrace_data() if the level is high enough.
* @internal
*/
-#define UTRACE_DATA3(level, fmt, a, b, c) \
+#define UTRACE_DATA3(level, fmt, a, b, c) UPRV_BLOCK_MACRO_BEGIN { \
if(UTRACE_LEVEL(level)) { \
utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c)); \
- }
+ } \
+} UPRV_BLOCK_MACRO_END
/**
* Trace statement used inside functions that have a UTRACE_ENTRY() statement.
@@ -272,10 +285,11 @@ U_CDECL_END
* Calls utrace_data() if the level is high enough.
* @internal
*/
-#define UTRACE_DATA4(level, fmt, a, b, c, d) \
+#define UTRACE_DATA4(level, fmt, a, b, c, d) UPRV_BLOCK_MACRO_BEGIN { \
if(UTRACE_LEVEL(level)) { \
utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d)); \
- }
+ } \
+} UPRV_BLOCK_MACRO_END
/**
* Trace statement used inside functions that have a UTRACE_ENTRY() statement.
@@ -285,10 +299,11 @@ U_CDECL_END
* Calls utrace_data() if the level is high enough.
* @internal
*/
-#define UTRACE_DATA5(level, fmt, a, b, c, d, e) \
+#define UTRACE_DATA5(level, fmt, a, b, c, d, e) UPRV_BLOCK_MACRO_BEGIN { \
if(UTRACE_LEVEL(level)) { \
utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e)); \
- }
+ } \
+} UPRV_BLOCK_MACRO_END
/**
* Trace statement used inside functions that have a UTRACE_ENTRY() statement.
@@ -298,10 +313,11 @@ U_CDECL_END
* Calls utrace_data() if the level is high enough.
* @internal
*/
-#define UTRACE_DATA6(level, fmt, a, b, c, d, e, f) \
+#define UTRACE_DATA6(level, fmt, a, b, c, d, e, f) UPRV_BLOCK_MACRO_BEGIN { \
if(UTRACE_LEVEL(level)) { \
utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e), (f)); \
- }
+ } \
+} UPRV_BLOCK_MACRO_END
/**
* Trace statement used inside functions that have a UTRACE_ENTRY() statement.
@@ -311,10 +327,11 @@ U_CDECL_END
* Calls utrace_data() if the level is high enough.
* @internal
*/
-#define UTRACE_DATA7(level, fmt, a, b, c, d, e, f, g) \
+#define UTRACE_DATA7(level, fmt, a, b, c, d, e, f, g) UPRV_BLOCK_MACRO_BEGIN { \
if(UTRACE_LEVEL(level)) { \
utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e), (f), (g)); \
- }
+ } \
+} UPRV_BLOCK_MACRO_END
/**
* Trace statement used inside functions that have a UTRACE_ENTRY() statement.
@@ -324,10 +341,11 @@ U_CDECL_END
* Calls utrace_data() if the level is high enough.
* @internal
*/
-#define UTRACE_DATA8(level, fmt, a, b, c, d, e, f, g, h) \
+#define UTRACE_DATA8(level, fmt, a, b, c, d, e, f, g, h) UPRV_BLOCK_MACRO_BEGIN { \
if(UTRACE_LEVEL(level)) { \
utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e), (f), (g), (h)); \
- }
+ } \
+} UPRV_BLOCK_MACRO_END
/**
* Trace statement used inside functions that have a UTRACE_ENTRY() statement.
@@ -337,10 +355,11 @@ U_CDECL_END
* Calls utrace_data() if the level is high enough.
* @internal
*/
-#define UTRACE_DATA9(level, fmt, a, b, c, d, e, f, g, h, i) \
+#define UTRACE_DATA9(level, fmt, a, b, c, d, e, f, g, h, i) UPRV_BLOCK_MACRO_BEGIN { \
if(UTRACE_LEVEL(level)) { \
utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e), (f), (g), (h), (i)); \
- }
+ } \
+} UPRV_BLOCK_MACRO_END
#else
diff --git a/Build/source/libs/icu/icu-src/source/common/utrie.h b/Build/source/libs/icu/icu-src/source/common/utrie.h
index 3e2197eda6c..532ba778eb6 100644
--- a/Build/source/libs/icu/icu-src/source/common/utrie.h
+++ b/Build/source/libs/icu/icu-src/source/common/utrie.h
@@ -182,7 +182,7 @@ typedef struct UTrie UTrie;
]
/** Internal trie getter from a pair of surrogates */
-#define _UTRIE_GET_FROM_PAIR(trie, data, c, c2, result, resultType) { \
+#define _UTRIE_GET_FROM_PAIR(trie, data, c, c2, result, resultType) UPRV_BLOCK_MACRO_BEGIN { \
int32_t __offset; \
\
/* get data for lead surrogate */ \
@@ -195,18 +195,18 @@ typedef struct UTrie UTrie;
} else { \
(result)=(resultType)((trie)->initialValue); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** Internal trie getter from a BMP code point, treating a lead surrogate as a normal code point */
#define _UTRIE_GET_FROM_BMP(trie, data, c16) \
- _UTRIE_GET_RAW(trie, data, 0xd800<=(c16) && (c16)<=0xdbff ? UTRIE_LEAD_INDEX_DISP : 0, c16);
+ _UTRIE_GET_RAW(trie, data, 0xd800<=(c16) && (c16)<=0xdbff ? UTRIE_LEAD_INDEX_DISP : 0, c16)
/**
* Internal trie getter from a code point.
* Could be faster(?) but longer with
* if((c32)<=0xd7ff) { (result)=_UTRIE_GET_RAW(trie, data, 0, c32); }
*/
-#define _UTRIE_GET(trie, data, c32, result, resultType) \
+#define _UTRIE_GET(trie, data, c32, result, resultType) UPRV_BLOCK_MACRO_BEGIN { \
if((uint32_t)(c32)<=0xffff) { \
/* BMP code points */ \
(result)=_UTRIE_GET_FROM_BMP(trie, data, c32); \
@@ -217,10 +217,11 @@ typedef struct UTrie UTrie;
} else { \
/* out of range */ \
(result)=(resultType)((trie)->initialValue); \
- }
+ } \
+} UPRV_BLOCK_MACRO_END
/** Internal next-post-increment: get the next code point (c, c2) and its data */
-#define _UTRIE_NEXT(trie, data, src, limit, c, c2, result, resultType) { \
+#define _UTRIE_NEXT(trie, data, src, limit, c, c2, result, resultType) UPRV_BLOCK_MACRO_BEGIN { \
(c)=*(src)++; \
if(!U16_IS_LEAD(c)) { \
(c2)=0; \
@@ -233,10 +234,10 @@ typedef struct UTrie UTrie;
(c2)=0; \
(result)=_UTRIE_GET_RAW((trie), data, UTRIE_LEAD_INDEX_DISP, (c)); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** Internal previous: get the previous code point (c, c2) and its data */
-#define _UTRIE_PREVIOUS(trie, data, start, src, c, c2, result, resultType) { \
+#define _UTRIE_PREVIOUS(trie, data, start, src, c, c2, result, resultType) UPRV_BLOCK_MACRO_BEGIN { \
(c)=*--(src); \
if(!U16_IS_SURROGATE(c)) { \
(c2)=0; \
@@ -257,7 +258,7 @@ typedef struct UTrie UTrie;
(c2)=0; \
(result)=_UTRIE_GET_RAW((trie), data, UTRIE_LEAD_INDEX_DISP, (c)); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/* Public UTrie API ---------------------------------------------------------*/
diff --git a/Build/source/libs/icu/icu-src/source/common/utrie2.h b/Build/source/libs/icu/icu-src/source/common/utrie2.h
index 75028ee23ac..671f44e16a6 100644
--- a/Build/source/libs/icu/icu-src/source/common/utrie2.h
+++ b/Build/source/libs/icu/icu-src/source/common/utrie2.h
@@ -871,7 +871,7 @@ utrie2_internalU8PrevIndex(const UTrie2 *trie, UChar32 c,
(trie)->data[_UTRIE2_INDEX_FROM_CP(trie, asciiOffset, c)]
/** Internal next-post-increment: get the next code point (c) and its data. */
-#define _UTRIE2_U16_NEXT(trie, data, src, limit, c, result) { \
+#define _UTRIE2_U16_NEXT(trie, data, src, limit, c, result) UPRV_BLOCK_MACRO_BEGIN { \
{ \
uint16_t __c2; \
(c)=*(src)++; \
@@ -885,10 +885,10 @@ utrie2_internalU8PrevIndex(const UTrie2 *trie, UChar32 c,
(result)=_UTRIE2_GET_FROM_SUPP((trie), data, (c)); \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** Internal pre-decrement-previous: get the previous code point (c) and its data */
-#define _UTRIE2_U16_PREV(trie, data, start, src, c, result) { \
+#define _UTRIE2_U16_PREV(trie, data, start, src, c, result) UPRV_BLOCK_MACRO_BEGIN { \
{ \
uint16_t __c2; \
(c)=*--(src); \
@@ -900,10 +900,10 @@ utrie2_internalU8PrevIndex(const UTrie2 *trie, UChar32 c,
(result)=_UTRIE2_GET_FROM_SUPP((trie), data, (c)); \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** Internal UTF-8 next-post-increment: get the next code point's data. */
-#define _UTRIE2_U8_NEXT(trie, ascii, data, src, limit, result) { \
+#define _UTRIE2_U8_NEXT(trie, ascii, data, src, limit, result) UPRV_BLOCK_MACRO_BEGIN { \
uint8_t __lead=(uint8_t)*(src)++; \
if(U8_IS_SINGLE(__lead)) { \
(result)=(trie)->ascii[__lead]; \
@@ -935,10 +935,10 @@ utrie2_internalU8PrevIndex(const UTrie2 *trie, UChar32 c,
(result)=(trie)->data[__index>>3]; \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/** Internal UTF-8 pre-decrement-previous: get the previous code point's data. */
-#define _UTRIE2_U8_PREV(trie, ascii, data, start, src, result) { \
+#define _UTRIE2_U8_PREV(trie, ascii, data, start, src, result) UPRV_BLOCK_MACRO_BEGIN { \
uint8_t __b=(uint8_t)*--(src); \
if(U8_IS_SINGLE(__b)) { \
(result)=(trie)->ascii[__b]; \
@@ -948,7 +948,7 @@ utrie2_internalU8PrevIndex(const UTrie2 *trie, UChar32 c,
(src)-=__index&7; \
(result)=(trie)->data[__index>>3]; \
} \
-}
+} UPRV_BLOCK_MACRO_END
U_CDECL_END
diff --git a/Build/source/libs/icu/icu-src/source/common/utrie2_builder.cpp b/Build/source/libs/icu/icu-src/source/common/utrie2_builder.cpp
index 80e09c9c26b..8de824cc3d4 100644
--- a/Build/source/libs/icu/icu-src/source/common/utrie2_builder.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/utrie2_builder.cpp
@@ -309,6 +309,7 @@ utrie2_clone(const UTrie2 *other, UErrorCode *pErrorCode) {
trie=(UTrie2 *)uprv_malloc(sizeof(UTrie2));
if(trie==NULL) {
+ *pErrorCode=U_MEMORY_ALLOCATION_ERROR;
return NULL;
}
uprv_memcpy(trie, other, sizeof(UTrie2));
@@ -333,6 +334,7 @@ utrie2_clone(const UTrie2 *other, UErrorCode *pErrorCode) {
}
if(trie->memory==NULL && trie->newTrie==NULL) {
+ *pErrorCode=U_MEMORY_ALLOCATION_ERROR;
uprv_free(trie);
trie=NULL;
}
diff --git a/Build/source/libs/icu/icu-src/source/common/uvector.h b/Build/source/libs/icu/icu-src/source/common/uvector.h
index 5ec6e114b8f..98318d14c60 100644
--- a/Build/source/libs/icu/icu-src/source/common/uvector.h
+++ b/Build/source/libs/icu/icu-src/source/common/uvector.h
@@ -142,19 +142,19 @@ public:
UBool equals(const UVector &other) const;
- void* firstElement(void) const;
+ inline void* firstElement(void) const;
- void* lastElement(void) const;
+ inline void* lastElement(void) const;
- int32_t lastElementi(void) const;
+ inline int32_t lastElementi(void) const;
int32_t indexOf(void* obj, int32_t startIndex = 0) const;
int32_t indexOf(int32_t obj, int32_t startIndex = 0) const;
- UBool contains(void* obj) const;
+ inline UBool contains(void* obj) const;
- UBool contains(int32_t obj) const;
+ inline UBool contains(int32_t obj) const;
UBool containsAll(const UVector& other) const;
@@ -168,9 +168,9 @@ public:
void removeAllElements();
- int32_t size(void) const;
+ inline int32_t size(void) const;
- UBool isEmpty(void) const;
+ inline UBool isEmpty(void) const;
UBool ensureCapacity(int32_t minimumCapacity, UErrorCode &status);
@@ -195,7 +195,7 @@ public:
UElementsAreEqual *setComparer(UElementsAreEqual *c);
- void* operator[](int32_t index) const;
+ inline void* operator[](int32_t index) const;
/**
* Removes the element at the given index from this vector and
@@ -309,19 +309,19 @@ public:
// It's okay not to have a virtual destructor (in UVector)
// because UStack has no special cleanup to do.
- UBool empty(void) const;
+ inline UBool empty(void) const;
- void* peek(void) const;
+ inline void* peek(void) const;
- int32_t peeki(void) const;
+ inline int32_t peeki(void) const;
void* pop(void);
int32_t popi(void);
- void* push(void* obj, UErrorCode &status);
+ inline void* push(void* obj, UErrorCode &status);
- int32_t push(int32_t i, UErrorCode &status);
+ inline int32_t push(int32_t i, UErrorCode &status);
/*
If the object o occurs as an item in this stack,
diff --git a/Build/source/libs/icu/icu-src/source/common/uvectr32.h b/Build/source/libs/icu/icu-src/source/common/uvectr32.h
index 9112d9fe4aa..ba47daa75f1 100644
--- a/Build/source/libs/icu/icu-src/source/common/uvectr32.h
+++ b/Build/source/libs/icu/icu-src/source/common/uvectr32.h
@@ -97,21 +97,21 @@ public:
// java.util.Vector API
//------------------------------------------------------------
- void addElement(int32_t elem, UErrorCode &status);
+ inline void addElement(int32_t elem, UErrorCode &status);
void setElementAt(int32_t elem, int32_t index);
void insertElementAt(int32_t elem, int32_t index, UErrorCode &status);
- int32_t elementAti(int32_t index) const;
+ inline int32_t elementAti(int32_t index) const;
UBool equals(const UVector32 &other) const;
- int32_t lastElementi(void) const;
+ inline int32_t lastElementi(void) const;
int32_t indexOf(int32_t elem, int32_t startIndex = 0) const;
- UBool contains(int32_t elem) const;
+ inline UBool contains(int32_t elem) const;
UBool containsAll(const UVector32& other) const;
@@ -123,9 +123,9 @@ public:
void removeAllElements();
- int32_t size(void) const;
+ inline int32_t size(void) const;
- UBool isEmpty(void) const;
+ inline UBool isEmpty(void) const;
// Inline. Use this one for speedy size check.
inline UBool ensureCapacity(int32_t minimumCapacity, UErrorCode &status);
@@ -163,7 +163,7 @@ public:
/**
* Returns a pointer to the internal array holding the vector.
*/
- int32_t *getBuffer() const;
+ inline int32_t *getBuffer() const;
/**
* Set the maximum allowed buffer capacity for this vector/stack.
@@ -197,16 +197,16 @@ private:
// In the original UVector, these were in a separate derived class, UStack.
// Here in UVector32, they are all together.
public:
- UBool empty(void) const; // TODO: redundant, same as empty(). Remove it?
+ inline UBool empty(void) const; // TODO: redundant, same as empty(). Remove it?
- int32_t peeki(void) const;
+ inline int32_t peeki(void) const;
- int32_t popi(void);
+ inline int32_t popi(void);
- int32_t push(int32_t i, UErrorCode &status);
+ inline int32_t push(int32_t i, UErrorCode &status);
- int32_t *reserveBlock(int32_t size, UErrorCode &status);
- int32_t *popFrame(int32_t size);
+ inline int32_t *reserveBlock(int32_t size, UErrorCode &status);
+ inline int32_t *popFrame(int32_t size);
};
diff --git a/Build/source/libs/icu/icu-src/source/common/uvectr64.h b/Build/source/libs/icu/icu-src/source/common/uvectr64.h
index 5571685988a..1cc9a501917 100644
--- a/Build/source/libs/icu/icu-src/source/common/uvectr64.h
+++ b/Build/source/libs/icu/icu-src/source/common/uvectr64.h
@@ -96,17 +96,17 @@ public:
// subset of java.util.Vector API
//------------------------------------------------------------
- void addElement(int64_t elem, UErrorCode &status);
+ inline void addElement(int64_t elem, UErrorCode &status);
void setElementAt(int64_t elem, int32_t index);
void insertElementAt(int64_t elem, int32_t index, UErrorCode &status);
- int64_t elementAti(int32_t index) const;
+ inline int64_t elementAti(int32_t index) const;
//UBool equals(const UVector64 &other) const;
- int64_t lastElementi(void) const;
+ inline int64_t lastElementi(void) const;
//int32_t indexOf(int64_t elem, int32_t startIndex = 0) const;
@@ -122,7 +122,7 @@ public:
void removeAllElements();
- int32_t size(void) const;
+ inline int32_t size(void) const;
inline UBool isEmpty(void) const { return count == 0; }
@@ -152,7 +152,7 @@ public:
/**
* Returns a pointer to the internal array holding the vector.
*/
- int64_t *getBuffer() const;
+ inline int64_t *getBuffer() const;
/**
* Set the maximum allowed buffer capacity for this vector/stack.
@@ -190,12 +190,12 @@ public:
//int64_t peeki(void) const;
- int64_t popi(void);
+ inline int64_t popi(void);
- int64_t push(int64_t i, UErrorCode &status);
+ inline int64_t push(int64_t i, UErrorCode &status);
- int64_t *reserveBlock(int32_t size, UErrorCode &status);
- int64_t *popFrame(int32_t size);
+ inline int64_t *reserveBlock(int32_t size, UErrorCode &status);
+ inline int64_t *popFrame(int32_t size);
};
diff --git a/Build/source/libs/icu/icu-src/source/common/wintz.cpp b/Build/source/libs/icu/icu-src/source/common/wintz.cpp
index 5e9ac0d2f37..115512e704c 100644
--- a/Build/source/libs/icu/icu-src/source/common/wintz.cpp
+++ b/Build/source/libs/icu/icu-src/source/common/wintz.cpp
@@ -35,7 +35,7 @@
U_NAMESPACE_BEGIN
-// The value of MAX_TIMEZONE_ID_LENGTH is 128, which is defined in DYNAMIC_TIME_ZONE_INFORMATION
+// The max size of TimeZoneKeyName is 128, defined in DYNAMIC_TIME_ZONE_INFORMATION
#define MAX_TIMEZONE_ID_LENGTH 128
/**
@@ -44,7 +44,7 @@ U_NAMESPACE_BEGIN
* Note: We use the Win32 API GetDynamicTimeZoneInformation to get the current time zone info.
* This API returns a non-localized time zone name, which we can then map to an ICU time zone name.
*/
-U_CFUNC const char* U_EXPORT2
+U_INTERNAL const char* U_EXPORT2
uprv_detectWindowsTimeZone()
{
UErrorCode status = U_ZERO_ERROR;
@@ -79,26 +79,25 @@ uprv_detectWindowsTimeZone()
// convert from wchar_t* (UTF-16 on Windows) to char* (UTF-8).
u_strToUTF8(dynamicTZKeyName, UPRV_LENGTHOF(dynamicTZKeyName), nullptr,
- reinterpret_cast<const UChar*>(dynamicTZI.TimeZoneKeyName), UPRV_LENGTHOF(dynamicTZI.TimeZoneKeyName), &status);
+ reinterpret_cast<const UChar*>(dynamicTZI.TimeZoneKeyName), -1, &status);
if (U_FAILURE(status)) {
return nullptr;
}
if (dynamicTZI.TimeZoneKeyName[0] != 0) {
- UResourceBundle winTZ;
- ures_initStackObject(&winTZ);
- ures_getByKey(bundle.getAlias(), dynamicTZKeyName, &winTZ, &status);
-
+ StackUResourceBundle winTZ;
+ ures_getByKey(bundle.getAlias(), dynamicTZKeyName, winTZ.getAlias(), &status);
+
if (U_SUCCESS(status)) {
const UChar* icuTZ = nullptr;
if (errorCode != 0) {
- icuTZ = ures_getStringByKey(&winTZ, ISOcode, &len, &status);
+ icuTZ = ures_getStringByKey(winTZ.getAlias(), ISOcode, &len, &status);
}
if (errorCode == 0 || icuTZ == nullptr) {
/* fallback to default "001" and reset status */
status = U_ZERO_ERROR;
- icuTZ = ures_getStringByKey(&winTZ, "001", &len, &status);
+ icuTZ = ures_getStringByKey(winTZ.getAlias(), "001", &len, &status);
}
if (U_SUCCESS(status)) {
@@ -111,7 +110,6 @@ uprv_detectWindowsTimeZone()
tmpid[index] = '\0';
}
}
- ures_close(&winTZ);
}
// Copy the timezone ID to icuid to be returned.
diff --git a/Build/source/libs/icu/icu-src/source/common/wintz.h b/Build/source/libs/icu/icu-src/source/common/wintz.h
index f98b1779b5d..cd8565eef1e 100644
--- a/Build/source/libs/icu/icu-src/source/common/wintz.h
+++ b/Build/source/libs/icu/icu-src/source/common/wintz.h
@@ -28,7 +28,7 @@ U_CDECL_BEGIN
typedef struct _TIME_ZONE_INFORMATION TIME_ZONE_INFORMATION;
U_CDECL_END
-U_CFUNC const char* U_EXPORT2
+U_INTERNAL const char* U_EXPORT2
uprv_detectWindowsTimeZone();
#endif /* U_PLATFORM_USES_ONLY_WIN32_API */
diff --git a/Build/source/libs/icu/icu-src/source/config/dist.mk b/Build/source/libs/icu/icu-src/source/config/dist.mk
index 3e6e42e50dd..a990181cec6 100644
--- a/Build/source/libs/icu/icu-src/source/config/dist.mk
+++ b/Build/source/libs/icu/icu-src/source/config/dist.mk
@@ -9,7 +9,7 @@
#
# This will only work if subversion is installed.
# You must checkout ICU4C at the `/icu` or `/icu/icu4c` level - not just `…/source`
-# also note that `make dist` does NOT reflect any local modifications - it only does a fresh SVN export.
+# also note that `make dist` does NOT reflect any local modifications, but pulls from HEAD.
top_builddir = .
@@ -19,21 +19,21 @@ DISTY_DIR=dist
DISTY_TMP=dist/tmp
DISTY_ICU=$(DISTY_TMP)/icu
DISTY_DATA=$(DISTY_ICU)/source/data
+# The following line controls what is removed in the data/ subdirectory for the source tarball.
DISTY_RMV=brkitr coll curr lang locales mappings rbnf region translit xml zone misc/*.txt misc/*.mk unit
DISTY_RMDIR=$(DISTY_RMV:%=$(DISTY_DATA)/%)
DISTY_IN=$(DISTY_DATA)/in
DOCZIP=icu-docs.zip
-SVNTOP=$(top_srcdir)/..
-SVNVER=$(shell svnversion $(SVNTOP) | cut -d: -f1 | tr -cd 'a-zA-Z0-9')
-SVNURL=$(shell svn info $(SVNTOP) | grep '^URL:' | cut -d: -f2-)
+ICU4CTOP=$(top_srcdir)/..
+GITVER=$(shell (cd $(ICU4CTOP) && (git describe --tags --exact-match 2>/dev/null || git rev-parse --short HEAD)) || echo 'unknown')
DISTY_VER=$(shell echo $(VERSION) | tr '.' '_' )
DISTY_PREFIX=icu4c
DISTY_FILE_DIR=$(shell pwd)/$(DISTY_DIR)
-DISTY_FILE_TGZ=$(DISTY_FILE_DIR)/$(DISTY_PREFIX)-src-$(DISTY_VER)-r$(SVNVER).tgz
-DISTY_FILE_ZIP=$(DISTY_FILE_DIR)/$(DISTY_PREFIX)-src-$(DISTY_VER)-r$(SVNVER).zip
-DISTY_DOC_ZIP=$(DISTY_FILE_DIR)/$(DISTY_PREFIX)-docs-$(DISTY_VER)-r$(SVNVER).zip
-DISTY_DATA_ZIP=$(DISTY_FILE_DIR)/$(DISTY_PREFIX)-data-$(DISTY_VER)-r$(SVNVER).zip
+DISTY_FILE_TGZ=$(DISTY_FILE_DIR)/$(DISTY_PREFIX)-$(DISTY_VER)-$(GITVER)-src.tgz
+DISTY_FILE_ZIP=$(DISTY_FILE_DIR)/$(DISTY_PREFIX)-$(DISTY_VER)-$(GITVER)-src.zip
+DISTY_DOC_ZIP=$(DISTY_FILE_DIR)/$(DISTY_PREFIX)-$(DISTY_VER)-$(GITVER)-docs.zip
+DISTY_DATA_ZIP=$(DISTY_FILE_DIR)/$(DISTY_PREFIX)-$(DISTY_VER)-$(GITVER)-data.zip
DISTY_DAT:=$(firstword $(wildcard data/out/tmp/icudt$(SO_TARGET_VERSION_MAJOR)*.dat))
DISTY_FILES_SRC=$(DISTY_FILE_TGZ) $(DISTY_FILE_ZIP)
@@ -50,8 +50,9 @@ $(DISTY_TMP):
$(DISTY_DOC_ZIP): $(DOCZIP) $(DISTY_FILE_DIR)
cp $(DOCZIP) $(DISTY_DOC_ZIP)
ln -sf $(shell basename $(DISTY_DOC_ZIP)) $(DISTY_FILE_DIR)/icu4c-docs.zip
+ ln -f $(DISTY_DOC_ZIP) $(DISTY_FILE_DIR)/icu4c-$(DISTY_VER)-docs.zip
-$(DISTY_DAT):
+$(DISTY_DAT):
echo Missing $@
/bin/false
@@ -61,15 +62,10 @@ $(DOCZIP):
"$(MAKE)" -C . srcdir="$(srcdir)" top_srcdir="$(top_srcdir)" builddir=. $@
$(DISTY_FILE_TGZ) $(DISTY_FILE_ZIP) $(DISTY_DATA_ZIP): $(DISTY_DAT) $(DISTY_TMP)
- @echo "svnversion of $(SVNTOP) is as follows (if this fails, make sure svn is installed..)"
- svnversion $(SVNTOP)
+ @echo Export icu4c@$(GITVER) to "$(DISTY_TMP)/icu"
-$(RMV) $(DISTY_FILE) $(DISTY_TMP)
$(MKINSTALLDIRS) $(DISTY_TMP)
- @echo collecting excludes to $(EXCLUDES_FILE)
- (cd "$(SVNTOP)" ; svn status --no-ignore | grep '^I' | cut -c2- > "$(EXCLUDES_FILE)" )
- @echo pseudo-exporting $(SVNVER)
- @#svn export -r $(shell echo $(SVNVER) | tr -d 'a-zA-Z' ) $(SVNURL) "$(DISTY_TMP)/icu"
- rsync -a --exclude-from="$(EXCLUDES_FILE)" "$(SVNTOP)" "$(DISTY_TMP)/icu"
+ ( cd $(ICU4CTOP)/.. && git archive --format=tar --prefix=icu/ HEAD:icu4c/ ) | ( cd "$(DISTY_TMP)" && tar xf - )
( cd $(DISTY_TMP)/icu/source ; zip -rlq $(DISTY_DATA_ZIP) data )
$(MKINSTALLDIRS) $(DISTY_IN)
echo DISTY_DAT=$(DISTY_DAT)
@@ -82,6 +78,9 @@ $(DISTY_FILE_TGZ) $(DISTY_FILE_ZIP) $(DISTY_DATA_ZIP): $(DISTY_DAT) $(DISTY_TMP
ln -sf $(shell basename $(DISTY_FILE_ZIP)) $(DISTY_FILE_DIR)/icu4c-src.zip
ln -sf $(shell basename $(DISTY_FILE_TGZ)) $(DISTY_FILE_DIR)/icu4c-src.tgz
ln -sf $(shell basename $(DISTY_DATA_ZIP)) $(DISTY_FILE_DIR)/icu4c-data.zip
+ ln -f $(DISTY_FILE_ZIP) $(DISTY_FILE_DIR)/icu4c-$(DISTY_VER)-src.zip
+ ln -f $(DISTY_FILE_TGZ) $(DISTY_FILE_DIR)/icu4c-$(DISTY_VER)-src.tgz
+ ln -f $(DISTY_DATA_ZIP) $(DISTY_FILE_DIR)/icu4c-$(DISTY_VER)-data.zip
ls -l $(DISTY_FILE_TGZ) $(DISTY_FILE_ZIP) $(DISTY_DATA_ZIP)
diff --git a/Build/source/libs/icu/icu-src/source/config/mh-cygwin b/Build/source/libs/icu/icu-src/source/config/mh-cygwin
index c5a37179cab..1b09a5bf928 100644
--- a/Build/source/libs/icu/icu-src/source/config/mh-cygwin
+++ b/Build/source/libs/icu/icu-src/source/config/mh-cygwin
@@ -7,7 +7,7 @@
## Commands to generate dependency files
GEN_DEPS.c= $(CC) -E -MM $(DEFS) $(CPPFLAGS)
-GEN_DEPS.cc= $(CXX) -E -MM -std=c++11 $(DEFS) $(CPPFLAGS)
+GEN_DEPS.cc= $(CXX) -E -MM $(DEFS) $(CPPFLAGS) $(CXXFLAGS)
## Flags to create/use a static library
ifneq ($(ENABLE_SHARED),YES)
@@ -18,6 +18,10 @@ else
STATICCPPFLAGS = -DU_STATIC_IMPLEMENTATION
endif
+## ICU requires a minimum target of Windows 7, and WINVER is not set to this by default.
+## https://msdn.microsoft.com/en-us/library/aa383745.aspx
+CPPFLAGS += -DWINVER=0x0601 -D_WIN32_WINNT=0x0601
+
## Flags for position independent code
SHAREDLIBCFLAGS =
SHAREDLIBCXXFLAGS =
diff --git a/Build/source/libs/icu/icu-src/source/config/mh-cygwin-msvc b/Build/source/libs/icu/icu-src/source/config/mh-cygwin-msvc
index 4744bb949e3..31ac458d308 100644
--- a/Build/source/libs/icu/icu-src/source/config/mh-cygwin-msvc
+++ b/Build/source/libs/icu/icu-src/source/config/mh-cygwin-msvc
@@ -24,6 +24,10 @@ else
STATICCPPFLAGS = -DU_STATIC_IMPLEMENTATION
endif
+## ICU requires a minimum target of Windows 7, and WINVER is not set to this by default.
+## https://msdn.microsoft.com/en-us/library/aa383745.aspx
+CPPFLAGS += -DWINVER=0x0601 -D_WIN32_WINNT=0x0601
+
## Flags for position independent code
SHAREDLIBCFLAGS =
SHAREDLIBCXXFLAGS =
@@ -117,13 +121,13 @@ LIBCTESTFW= $(top_builddir)/tools/ctestfw/$(LIBICU)$(CTESTFW_STUBNAME)$(ICULIBSU
LIBICUTOOLUTIL= $(LIBDIR)/$(LIBICU)$(TOOLUTIL_STUBNAME)$(ICULIBSUFFIX).lib
## These are the library specific LDFLAGS
-LDFLAGSICUDT+= -base:"0x4ad00000" -NOENTRY# The NOENTRY option is required for creating a resource-only DLL.
-LDFLAGSICUUC= -base:"0x4a800000"# in-uc = 1MB
-LDFLAGSICUI18N= -base:"0x4a900000"# io-in = 2MB
-LDFLAGSICUIO= -base:"0x4ab00000"# le-io = 1MB
-LDFLAGSICULX= -base:"0x4ac80000"
+LDFLAGSICUDT+= -NOENTRY# The NOENTRY option is required for creating a resource-only DLL.
+LDFLAGSICUUC=# Unused for now.
+LDFLAGSICUI18N=# Unused for now.
+LDFLAGSICUIO=# Unused for now.
+LDFLAGSICULX=# Unused for now.
LDFLAGSCTESTFW=# Unused for now.
-LDFLAGSICUTOOLUTIL= -base:"0x4ac00000"# Same as layout. Layout and tools probably won't mix.
+LDFLAGSICUTOOLUTIL=# Unused for now.
# The #M# is used to delete lines for icu-config
# Current full path directory.
diff --git a/Build/source/libs/icu/icu-src/source/config/mh-cygwin64 b/Build/source/libs/icu/icu-src/source/config/mh-cygwin64
index dc9d1a1ab01..0eee4736846 100644
--- a/Build/source/libs/icu/icu-src/source/config/mh-cygwin64
+++ b/Build/source/libs/icu/icu-src/source/config/mh-cygwin64
@@ -7,7 +7,7 @@
## Commands to generate dependency files
GEN_DEPS.c= $(CC) -E -MM $(DEFS) $(CPPFLAGS)
-GEN_DEPS.cc= $(CXX) -E -MM -std=c++11 $(DEFS) $(CPPFLAGS)
+GEN_DEPS.cc= $(CXX) -E -MM $(DEFS) $(CPPFLAGS) $(CXXFLAGS)
## Flags to create/use a static library
ifneq ($(ENABLE_SHARED),YES)
@@ -18,6 +18,10 @@ else
STATICCPPFLAGS = -DU_STATIC_IMPLEMENTATION
endif
+## ICU requires a minimum target of Windows 7, and WINVER is not set to this by default.
+## https://msdn.microsoft.com/en-us/library/aa383745.aspx
+CPPFLAGS += -DWINVER=0x0601 -D_WIN32_WINNT=0x0601
+
## Flags for position independent code
SHAREDLIBCFLAGS =
SHAREDLIBCXXFLAGS =
diff --git a/Build/source/libs/icu/icu-src/source/config/mh-darwin b/Build/source/libs/icu/icu-src/source/config/mh-darwin
index e4ad4623049..7b15709c860 100644
--- a/Build/source/libs/icu/icu-src/source/config/mh-darwin
+++ b/Build/source/libs/icu/icu-src/source/config/mh-darwin
@@ -33,7 +33,7 @@ SHLIB.cc= $(CXX) -dynamiclib -dynamic $(CXXFLAGS) $(LDFLAGS) $(LD_SOOPTIONS)
ifeq ($(ENABLE_RPATH),YES)
LD_SONAME = -Wl,-compatibility_version -Wl,$(SO_TARGET_VERSION_MAJOR) -Wl,-current_version -Wl,$(SO_TARGET_VERSION) -install_name $(libdir)/$(notdir $(MIDDLE_SO_TARGET))
else
-LD_SONAME = -Wl,-compatibility_version -Wl,$(SO_TARGET_VERSION_MAJOR) -Wl,-current_version -Wl,$(SO_TARGET_VERSION) -install_name $(notdir $(MIDDLE_SO_TARGET))
+LD_SONAME = -Wl,-compatibility_version -Wl,$(SO_TARGET_VERSION_MAJOR) -Wl,-current_version -Wl,$(SO_TARGET_VERSION) -install_name $(notdir $(MIDDLE_SO_TARGET)) $(PKGDATA_TRAILING_SPACE)
endif
## Compiler switch to embed a runtime search path
diff --git a/Build/source/libs/icu/icu-src/source/config/mh-mingw b/Build/source/libs/icu/icu-src/source/config/mh-mingw
index 1c887346745..e2a49d77905 100644
--- a/Build/source/libs/icu/icu-src/source/config/mh-mingw
+++ b/Build/source/libs/icu/icu-src/source/config/mh-mingw
@@ -85,13 +85,29 @@ IMPORT_LIB_EXT = .dll.a
#SH## with usually. Many applications will want to add ${ICULIBS_I18N} as well.
#SH#ICULIBS="${ICULIBS_BASE} ${ICULIBS_I18N} ${ICULIBS_COMMON} ${ICULIBS_DATA} "
-# The #M# is used to delete lines for icu-config
-# Current full path directory.
-#CURR_FULL_DIR=$(shell pwd -W)#M# for MSYS
-CURR_FULL_DIR?=$(subst \,/,$(shell cmd /c cd))#M# for Cygwin shell
-# Current full path directory for use in source code in a -D compiler option.
-#CURR_SRCCODE_FULL_DIR=$(subst /,\\\\,$(shell pwd -W))#M# for MSYS
-CURR_SRCCODE_FULL_DIR=$(subst \,/,$(shell cmd /c cd))#M# for Cygwin shell
+# Note: The #M# is used to delete lines for icu-config
+MSYS_VERSION ?= $(if $(findstring Msys, $(shell uname -o)),$(word 1, $(subst ., ,$(shell uname -r))),0)#M#
+$(info Detected MSYS version: $(MSYS_VERSION))
+
+ifeq ($(MSYS_VERSION),$(filter $(MSYS_VERSION),0 1))
+ # Older versions of MSYS don't have cygpath by default. #M#
+
+ # Current full path directory. #M#
+ #CURR_FULL_DIR=$(shell pwd -W)#M# for MSYS
+ CURR_FULL_DIR?=$(subst \,/,$(shell cmd /c cd))#M# for Cygwin shell
+
+ # Current full path directory for use in source code in a -D compiler option. #M#
+ #CURR_SRCCODE_FULL_DIR=$(subst /,\\\\,$(shell pwd -W))#M# for MSYS
+ CURR_SRCCODE_FULL_DIR=$(subst \,/,$(shell cmd /c cd))#M# for Cygwin shell
+else
+ # MSYS2 and up have cygpath by default #M#
+
+ # Current full path directory. #M#
+ CURR_FULL_DIR?=$(shell cygpath . -a -m)#M#
+
+ # Current full path directory for use in source code in a -D compiler option. #M#
+ CURR_SRCCODE_FULL_DIR=$(shell cygpath . -a -m)#M#
+endif
## Compilation rules
%.$(STATIC_O): $(srcdir)/%.c
diff --git a/Build/source/libs/icu/icu-src/source/config/mh-mingw64 b/Build/source/libs/icu/icu-src/source/config/mh-mingw64
index 7d464e572bb..456997a5e94 100644
--- a/Build/source/libs/icu/icu-src/source/config/mh-mingw64
+++ b/Build/source/libs/icu/icu-src/source/config/mh-mingw64
@@ -103,13 +103,29 @@ LIBICU = $(STATIC_PREFIX_WHEN_USED)$(ICUPREFIX)
#SH## with usually. Many applications will want to add ${ICULIBS_I18N} as well.
#SH#ICULIBS="${ICULIBS_BASE} ${ICULIBS_I18N} ${ICULIBS_COMMON} ${ICULIBS_DATA} "
-# The #M# is used to delete lines for icu-config
-# Current full path directory.
-#CURR_FULL_DIR=$(shell pwd -W)#M# for MSYS
-CURR_FULL_DIR?=$(subst \,/,$(shell cmd /c cd))#M# for Cygwin shell
-# Current full path directory for use in source code in a -D compiler option.
-#CURR_SRCCODE_FULL_DIR=$(subst /,\\\\,$(shell pwd -W))#M# for MSYS
-CURR_SRCCODE_FULL_DIR=$(subst \,/,$(shell cmd /c cd))#M# for Cygwin shell
+# Note: The #M# is used to delete lines for icu-config
+MSYS_VERSION ?= $(if $(findstring Msys, $(shell uname -o)),$(word 1, $(subst ., ,$(shell uname -r))),0)#M#
+$(info Detected MSYS version: $(MSYS_VERSION))
+
+ifeq ($(MSYS_VERSION),$(filter $(MSYS_VERSION),0 1))
+ # Older versions of MSYS don't have cygpath by default. #M#
+
+ # Current full path directory. #M#
+ #CURR_FULL_DIR=$(shell pwd -W)#M# for MSYS
+ CURR_FULL_DIR?=$(subst \,/,$(shell cmd /c cd))#M# for Cygwin shell
+
+ # Current full path directory for use in source code in a -D compiler option. #M#
+ #CURR_SRCCODE_FULL_DIR=$(subst /,\\\\,$(shell pwd -W))#M# for MSYS
+ CURR_SRCCODE_FULL_DIR=$(subst \,/,$(shell cmd /c cd))#M# for Cygwin shell
+else
+ # MSYS2 and up have cygpath by default #M#
+
+ # Current full path directory. #M#
+ CURR_FULL_DIR?=$(shell cygpath . -a -m)#M#
+
+ # Current full path directory for use in source code in a -D compiler option. #M#
+ CURR_SRCCODE_FULL_DIR=$(shell cygpath . -a -m)#M#
+endif
## Compilation rules
%.$(STATIC_O): $(srcdir)/%.c
diff --git a/Build/source/libs/icu/icu-src/source/config/mh-msys-msvc b/Build/source/libs/icu/icu-src/source/config/mh-msys-msvc
index 05fe514ac7b..17f710ef3c9 100644
--- a/Build/source/libs/icu/icu-src/source/config/mh-msys-msvc
+++ b/Build/source/libs/icu/icu-src/source/config/mh-msys-msvc
@@ -122,13 +122,13 @@ LIBCTESTFW= $(top_builddir)/tools/ctestfw/$(LIBICU)$(CTESTFW_STUBNAME)$(ICULIBSU
LIBICUTOOLUTIL= $(LIBDIR)/$(LIBICU)$(TOOLUTIL_STUBNAME)$(ICULIBSUFFIX).lib
## These are the library specific LDFLAGS
-LDFLAGSICUDT+= -base:"0x4ad00000" -NOENTRY# The NOENTRY option is required for creating a resource-only DLL.
-LDFLAGSICUUC= -base:"0x4a800000"# in-uc = 1MB
-LDFLAGSICUI18N= -base:"0x4a900000"# io-in = 2MB
-LDFLAGSICUIO= -base:"0x4ab00000"# le-io = 1MB
-LDFLAGSICULX= -base:"0x4ac80000"
+LDFLAGSICUDT+= -NOENTRY# The NOENTRY option is required for creating a resource-only DLL.
+LDFLAGSICUUC=# Unused for now.
+LDFLAGSICUI18N=# Unused for now.
+LDFLAGSICUIO=# Unused for now.
+LDFLAGSICULX=# Unused for now.
LDFLAGSCTESTFW=# Unused for now.
-LDFLAGSICUTOOLUTIL= -base:"0x4ac00000"# Same as layout. Layout and tools probably won't mix.
+LDFLAGSICUTOOLUTIL=# Unused for now.
## Compilation rules
%.$(STATIC_O): $(srcdir)/%.c
diff --git a/Build/source/libs/icu/icu-src/source/config/mh-solaris b/Build/source/libs/icu/icu-src/source/config/mh-solaris
index 3d7e6fe79f4..5e2abcfeb59 100644
--- a/Build/source/libs/icu/icu-src/source/config/mh-solaris
+++ b/Build/source/libs/icu/icu-src/source/config/mh-solaris
@@ -56,7 +56,7 @@ LD_RPATH_PRE= -R
#LIBRARY_PATH_PREFIX=/usr/lib/lwp:
## Compiler switch to embed a library name
-LD_SONAME = -h $(notdir $(MIDDLE_SO_TARGET))
+LD_SONAME = -h $(notdir $(MIDDLE_SO_TARGET)) $(PKGDATA_TRAILING_SPACE)
## Shared object suffix
SO= so
diff --git a/Build/source/libs/icu/icu-src/source/config/mh-solaris-gcc b/Build/source/libs/icu/icu-src/source/config/mh-solaris-gcc
index 63db4f02874..d55d9cca0cd 100644
--- a/Build/source/libs/icu/icu-src/source/config/mh-solaris-gcc
+++ b/Build/source/libs/icu/icu-src/source/config/mh-solaris-gcc
@@ -25,7 +25,7 @@ LD_RPATH= -R'$$'ORIGIN
LD_RPATH_PRE= -R
## Compiler switch to embed a library name
-LD_SONAME = -h $(notdir $(MIDDLE_SO_TARGET))
+LD_SONAME = -h $(notdir $(MIDDLE_SO_TARGET)) $(PKGDATA_TRAILING_SPACE)
## Shared library options
LD_SOOPTIONS= -Wl,-Bsymbolic
diff --git a/Build/source/libs/icu/icu-src/source/config/pkgdataMakefile.in b/Build/source/libs/icu/icu-src/source/config/pkgdataMakefile.in
index 7bf24cc6b18..f6fe1984dcb 100644
--- a/Build/source/libs/icu/icu-src/source/config/pkgdataMakefile.in
+++ b/Build/source/libs/icu/icu-src/source/config/pkgdataMakefile.in
@@ -16,6 +16,7 @@ include $(top_builddir)/icudefs.mk
OUTPUTFILE=pkgdata.inc
MIDDLE_SO_TARGET=
+PKGDATA_TRAILING_SPACE=" "
all : clean
@echo GENCCODE_ASSEMBLY_TYPE=$(GENCCODE_ASSEMBLY) >> $(OUTPUTFILE)
@@ -36,7 +37,6 @@ all : clean
@echo RANLIB=$(RANLIB) >> $(OUTPUTFILE)
@echo INSTALL_CMD=$(INSTALL-L) >> $(OUTPUTFILE)
-
clean :
$(RMV) $(OUTPUTFILE)
diff --git a/Build/source/libs/icu/icu-src/source/configure b/Build/source/libs/icu/icu-src/source/configure
index 972951ef7bc..ed5c8745ca7 100755
--- a/Build/source/libs/icu/icu-src/source/configure
+++ b/Build/source/libs/icu/icu-src/source/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for ICU 63.1.
+# Generated by GNU Autoconf 2.69 for ICU 65.1.
#
# Report bugs to <http://icu-project.org/bugs>.
#
@@ -582,8 +582,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='ICU'
PACKAGE_TARNAME='International Components for Unicode'
-PACKAGE_VERSION='63.1'
-PACKAGE_STRING='ICU 63.1'
+PACKAGE_VERSION='65.1'
+PACKAGE_STRING='ICU 65.1'
PACKAGE_BUGREPORT='http://icu-project.org/bugs'
PACKAGE_URL='http://icu-project.org'
@@ -645,6 +645,8 @@ ICULIBSUFFIX
DATA_PACKAGING_MODE
thepkgicudatadir
pkgicudatadir
+U_HAVE_FUZZER
+FUZZER_TRUE
U_HAVE_TOOLS
TOOLS_TRUE
U_HAVE_LAYOUTEX
@@ -694,7 +696,7 @@ GREP
DOXYGEN
cross_buildroot
U_MAKE
-PYTHON3
+PYTHON
cross_compiling
INSTALL_DATA
INSTALL_SCRIPT
@@ -753,7 +755,6 @@ infodir
docdir
oldincludedir
includedir
-runstatedir
localstatedir
sharedstatedir
sysconfdir
@@ -798,6 +799,7 @@ enable_icuio
enable_layoutex
enable_layout
enable_tools
+enable_fuzzer
with_data_packaging
with_library_suffix
enable_tests
@@ -858,7 +860,6 @@ datadir='${datarootdir}'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
-runstatedir='${localstatedir}/run'
includedir='${prefix}/include'
oldincludedir='/usr/include'
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1111,15 +1112,6 @@ do
| -silent | --silent | --silen | --sile | --sil)
silent=yes ;;
- -runstatedir | --runstatedir | --runstatedi | --runstated \
- | --runstate | --runstat | --runsta | --runst | --runs \
- | --run | --ru | --r)
- ac_prev=runstatedir ;;
- -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
- | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
- | --run=* | --ru=* | --r=*)
- runstatedir=$ac_optarg ;;
-
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
ac_prev=sbindir ;;
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1257,7 +1249,7 @@ fi
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
datadir sysconfdir sharedstatedir localstatedir includedir \
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
- libdir localedir mandir runstatedir
+ libdir localedir mandir
do
eval ac_val=\$$ac_var
# Remove trailing slashes.
@@ -1370,7 +1362,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures ICU 63.1 to adapt to many kinds of systems.
+\`configure' configures ICU 65.1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1410,7 +1402,6 @@ Fine tuning of the installation directories:
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
- --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
--libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include]
--oldincludedir=DIR C header files for non-gcc [/usr/include]
@@ -1437,7 +1428,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of ICU 63.1:";;
+ short | recursive ) echo "Configuration of ICU 65.1:";;
esac
cat <<\_ACEOF
@@ -1466,6 +1457,7 @@ Optional Features:
icu-le-hb must be installed via pkg-config. See http://harfbuzz.org
--enable-tools build ICU's tools default=yes
+ --enable-fuzzer build ICU's fuzzer test targets default=no
--enable-tests build ICU tests default=yes
--enable-samples build ICU samples default=yes
@@ -1574,7 +1566,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-ICU configure 63.1
+ICU configure 65.1
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2209,6 +2201,60 @@ $as_echo "$ac_res" >&6; }
} # ac_fn_c_check_func
+# ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES
+# ---------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_cxx_check_type ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+ eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_type
+
# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
# -------------------------------------------
# Tests whether TYPE exists after having included INCLUDES, setting cache
@@ -2266,7 +2312,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by ICU $as_me 63.1, which was
+It was created by ICU $as_me 65.1, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -2615,6 +2661,10 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
+# Instruct Python to never write any byte code to the ICU source tree.
+PYTHONDONTWRITEBYTECODE=1
+export PYTHONDONTWRITEBYTECODE
+
@@ -4200,17 +4250,18 @@ fi
#AC_CHECK_PROG(AUTOCONF, autoconf, autoconf, true)
#AC_CHECK_PROG(STRIP, strip, strip, true)
-for ac_prog in python3
+# TODO(ICU-20301): Remove fallback to Python 2.
+for ac_prog in python3 "py -3" python "py"
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_PYTHON3+:} false; then :
+if ${ac_cv_prog_PYTHON+:} false; then :
$as_echo_n "(cached) " >&6
else
- if test -n "$PYTHON3"; then
- ac_cv_prog_PYTHON3="$PYTHON3" # Let the user override the test.
+ if test -n "$PYTHON"; then
+ ac_cv_prog_PYTHON="$PYTHON" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
@@ -4219,7 +4270,7 @@ do
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_PYTHON3="$ac_prog"
+ ac_cv_prog_PYTHON="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
@@ -4229,20 +4280,21 @@ IFS=$as_save_IFS
fi
fi
-PYTHON3=$ac_cv_prog_PYTHON3
-if test -n "$PYTHON3"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON3" >&5
-$as_echo "$PYTHON3" >&6; }
+PYTHON=$ac_cv_prog_PYTHON
+if test -n "$PYTHON"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5
+$as_echo "$PYTHON" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
- test -n "$PYTHON3" && break
+ test -n "$PYTHON" && break
done
+
# Check for the platform make
for ac_prog in gmake gnumake
do
@@ -7156,6 +7208,29 @@ else
fi
+# Check if C++17 std::string_view is available.
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ac_fn_cxx_check_type "$LINENO" "std::string_view" "ac_cv_type_std__string_view" "#include <string_view>
+"
+if test "x$ac_cv_type_std__string_view" = xyes; then :
+
+fi
+
+if test "x$ac_cv_type_std__string_view" = xyes; then :
+ CONFIG_CPPFLAGS="${CONFIG_CPPFLAGS} -DU_HAVE_STRING_VIEW=1"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
# Checks for typedefs
ac_fn_c_check_type "$LINENO" "int8_t" "ac_cv_type_int8_t" "$ac_includes_default"
if test "x$ac_cv_type_int8_t" = xyes; then :
@@ -7672,6 +7747,28 @@ else
U_HAVE_TOOLS=0
fi
+# Enable/disable fuzzer target tests.
+# Check whether --enable-fuzzer was given.
+if test "${enable_fuzzer+set}" = set; then :
+ enableval=$enable_fuzzer; case "${enableval}" in
+ yes) fuzzer=true ;;
+ no) fuzzer=false ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-fuzzer" "$LINENO" 5 ;;
+ esac
+else
+ fuzzer=false
+fi
+
+
+
+if test "$fuzzer" = true; then
+ FUZZER_TRUE=
+ U_HAVE_FUZZER=1
+else
+ FUZZER_TRUE='#'
+ U_HAVE_FUZZER=0
+fi
+
# Check whether --with-data-packaging was given.
if test "${with_data_packaging+set}" = set; then :
@@ -7862,14 +7959,15 @@ fi
# Now that we're done using CPPFLAGS etc. for tests, we can change it
# for build.
-if test "${CC}" == "clang"; then
+if test "${CC}" = "clang"; then
CLANGCFLAGS="-Qunused-arguments -Wno-parentheses-equality"
else
CLANGCFLAGS=""
fi
-if test "${CXX}" == "clang++"; then
+if test "${CXX}" = "clang++"; then
CLANGCXXFLAGS="-Qunused-arguments -Wno-parentheses-equality"
+ LIBCXXFLAGS="$LIBCXXFLAGS -Wglobal-constructors"
else
CLANGCXXFLAGS=""
fi
@@ -7890,7 +7988,7 @@ echo "CXXFLAGS=$CXXFLAGS"
# output the Makefiles
-ac_config_files="$ac_config_files icudefs.mk Makefile data/pkgdataMakefile config/Makefile.inc config/icu.pc config/pkgdataMakefile data/Makefile stubdata/Makefile common/Makefile i18n/Makefile layoutex/Makefile io/Makefile extra/Makefile extra/uconv/Makefile extra/uconv/pkgdataMakefile extra/scrptrun/Makefile tools/Makefile tools/ctestfw/Makefile tools/toolutil/Makefile tools/makeconv/Makefile tools/genrb/Makefile tools/genccode/Makefile tools/gencmn/Makefile tools/gencnval/Makefile tools/gendict/Makefile tools/gentest/Makefile tools/gennorm2/Makefile tools/genbrk/Makefile tools/gensprep/Makefile tools/icuinfo/Makefile tools/icupkg/Makefile tools/icuswap/Makefile tools/pkgdata/Makefile tools/tzcode/Makefile tools/gencfu/Makefile tools/escapesrc/Makefile test/Makefile test/compat/Makefile test/testdata/Makefile test/testdata/pkgdataMakefile test/hdrtst/Makefile test/intltest/Makefile test/cintltst/Makefile test/iotest/Makefile test/letest/Makefile test/perf/Makefile test/perf/collationperf/Makefile test/perf/collperf/Makefile test/perf/collperf2/Makefile test/perf/dicttrieperf/Makefile test/perf/ubrkperf/Makefile test/perf/charperf/Makefile test/perf/convperf/Makefile test/perf/normperf/Makefile test/perf/DateFmtPerf/Makefile test/perf/howExpensiveIs/Makefile test/perf/strsrchperf/Makefile test/perf/unisetperf/Makefile test/perf/usetperf/Makefile test/perf/ustrperf/Makefile test/perf/utfperf/Makefile test/perf/utrie2perf/Makefile test/perf/leperf/Makefile samples/Makefile samples/date/Makefile samples/cal/Makefile samples/layout/Makefile"
+ac_config_files="$ac_config_files icudefs.mk Makefile data/pkgdataMakefile config/Makefile.inc config/icu.pc config/pkgdataMakefile data/Makefile stubdata/Makefile common/Makefile i18n/Makefile layoutex/Makefile io/Makefile extra/Makefile extra/uconv/Makefile extra/uconv/pkgdataMakefile extra/scrptrun/Makefile tools/Makefile tools/ctestfw/Makefile tools/toolutil/Makefile tools/makeconv/Makefile tools/genrb/Makefile tools/genccode/Makefile tools/gencmn/Makefile tools/gencnval/Makefile tools/gendict/Makefile tools/gentest/Makefile tools/gennorm2/Makefile tools/genbrk/Makefile tools/gensprep/Makefile tools/icuinfo/Makefile tools/icupkg/Makefile tools/icuswap/Makefile tools/pkgdata/Makefile tools/tzcode/Makefile tools/gencfu/Makefile tools/escapesrc/Makefile test/Makefile test/compat/Makefile test/testdata/Makefile test/testdata/pkgdataMakefile test/hdrtst/Makefile test/intltest/Makefile test/cintltst/Makefile test/iotest/Makefile test/letest/Makefile test/perf/Makefile test/perf/collationperf/Makefile test/perf/collperf/Makefile test/perf/collperf2/Makefile test/perf/dicttrieperf/Makefile test/perf/ubrkperf/Makefile test/perf/charperf/Makefile test/perf/convperf/Makefile test/perf/normperf/Makefile test/perf/DateFmtPerf/Makefile test/perf/howExpensiveIs/Makefile test/perf/strsrchperf/Makefile test/perf/unisetperf/Makefile test/perf/usetperf/Makefile test/perf/ustrperf/Makefile test/perf/utfperf/Makefile test/perf/utrie2perf/Makefile test/perf/leperf/Makefile test/fuzzer/Makefile samples/Makefile samples/date/Makefile samples/cal/Makefile samples/layout/Makefile"
cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
@@ -8435,7 +8533,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by ICU $as_me 63.1, which was
+This file was extended by ICU $as_me 65.1, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -8489,7 +8587,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-ICU config.status 63.1
+ICU config.status 65.1
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
@@ -8663,6 +8761,7 @@ do
"test/perf/utfperf/Makefile") CONFIG_FILES="$CONFIG_FILES test/perf/utfperf/Makefile" ;;
"test/perf/utrie2perf/Makefile") CONFIG_FILES="$CONFIG_FILES test/perf/utrie2perf/Makefile" ;;
"test/perf/leperf/Makefile") CONFIG_FILES="$CONFIG_FILES test/perf/leperf/Makefile" ;;
+ "test/fuzzer/Makefile") CONFIG_FILES="$CONFIG_FILES test/fuzzer/Makefile" ;;
"samples/Makefile") CONFIG_FILES="$CONFIG_FILES samples/Makefile" ;;
"samples/date/Makefile") CONFIG_FILES="$CONFIG_FILES samples/date/Makefile" ;;
"samples/cal/Makefile") CONFIG_FILES="$CONFIG_FILES samples/cal/Makefile" ;;
@@ -9122,6 +9221,41 @@ $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
+if test -z "$PYTHON";
+then
+ echo "" > data/rules.mk
+ echo "" > test/testdata/rules.mk
+else
+ if test -f "$srcdir/data/locales/root.txt";
+ then
+ echo "Spawning Python to generate data/rules.mk..."
+ PYTHONPATH="$srcdir/python" \
+ $PYTHON -m icutools.databuilder \
+ --mode gnumake \
+ --seqmode parallel \
+ --src_dir "$srcdir/data" \
+ --filter_file "$ICU_DATA_FILTER_FILE" \
+ $ICU_DATA_BUILDTOOL_OPTS \
+ > data/rules.mk
+ if test "$?" != "0"; then
+ as_fn_error $? "Python failed to run; see above error." "$LINENO" 5
+ fi
+ else
+ echo "Not rebuilding data/rules.mk, assuming prebuilt data in data/in"
+ touch data/rules.mk
+ fi
+ echo "Spawning Python to generate test/testdata/rules.mk..."
+ PYTHONPATH="$srcdir/python" \
+ $PYTHON -m icutools.databuilder \
+ --mode gnumake \
+ --seqmode parallel \
+ --src_dir "$srcdir/test/testdata" \
+ > test/testdata/rules.mk
+ if test "$?" != "0"; then
+ as_fn_error $? "Python failed to run; see above error." "$LINENO" 5
+ fi
+fi
+
echo
echo "ICU for C/C++ $VERSION is ready to be built."
echo "=== Important Notes: ==="
@@ -9204,17 +9338,9 @@ then
echo "## Expect build failures in the 'data', 'test', and other directories."
fi
-if test -z "$PYTHON3";
+if test -z "$PYTHON";
then
- echo ""
- echo "NOTICE: Unable to find Python 3. ICU versions 64 and later will require Python 3 to build."
- echo "See ICU-10923 for more information: https://unicode-org.atlassian.net/browse/ICU-10923"
- echo ""
-else
- echo ""
- echo "Found Python 3. You are all set for ICU 64, which will require Python 3 to build."
- echo "For more info on Python 3 requirement, see: https://unicode-org.atlassian.net/browse/ICU-10923"
- echo ""
+ echo "** Note: Python not found. You will not be able to build data from source or run tests."
fi
$as_unset _CXX_CXXSUFFIX
diff --git a/Build/source/libs/icu/icu-src/source/data/BUILDRULES.py b/Build/source/libs/icu/icu-src/source/data/BUILDRULES.py
new file mode 100644
index 00000000000..08091ee8092
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/data/BUILDRULES.py
@@ -0,0 +1,573 @@
+# Copyright (C) 2018 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+# Python 2/3 Compatibility (ICU-20299)
+# TODO(ICU-20301): Remove this.
+from __future__ import print_function
+
+from icutools.databuilder import *
+from icutools.databuilder import locale_dependencies
+from icutools.databuilder import utils
+from icutools.databuilder.request_types import *
+
+import os
+import sys
+
+
+def generate(config, glob, common_vars):
+ requests = []
+
+ if len(glob("misc/*")) == 0:
+ print("Error: Cannot find data directory; please specify --src_dir", file=sys.stderr)
+ exit(1)
+
+ requests += generate_cnvalias(config, glob, common_vars)
+ requests += generate_ulayout(config, glob, common_vars)
+ requests += generate_confusables(config, glob, common_vars)
+ requests += generate_conversion_mappings(config, glob, common_vars)
+ requests += generate_brkitr_brk(config, glob, common_vars)
+ requests += generate_stringprep(config, glob, common_vars)
+ requests += generate_brkitr_dictionaries(config, glob, common_vars)
+ requests += generate_normalization(config, glob, common_vars)
+ requests += generate_coll_ucadata(config, glob, common_vars)
+ requests += generate_full_unicore_data(config, glob, common_vars)
+ requests += generate_unames(config, glob, common_vars)
+ requests += generate_misc(config, glob, common_vars)
+ requests += generate_curr_supplemental(config, glob, common_vars)
+ requests += generate_translit(config, glob, common_vars)
+
+ # Res Tree Files
+ # (input dirname, output dirname, resfiles.mk path, mk version var, mk source var, use pool file, dep files)
+ requests += generate_tree(config, glob, common_vars,
+ "locales",
+ None,
+ "icu-locale-deprecates.xml",
+ config.use_pool_bundle,
+ [])
+
+ requests += generate_tree(config, glob, common_vars,
+ "curr",
+ "curr",
+ "icu-locale-deprecates.xml",
+ config.use_pool_bundle,
+ [])
+
+ requests += generate_tree(config, glob, common_vars,
+ "lang",
+ "lang",
+ "icu-locale-deprecates.xml",
+ config.use_pool_bundle,
+ [])
+
+ requests += generate_tree(config, glob, common_vars,
+ "region",
+ "region",
+ "icu-locale-deprecates.xml",
+ config.use_pool_bundle,
+ [])
+
+ requests += generate_tree(config, glob, common_vars,
+ "zone",
+ "zone",
+ "icu-locale-deprecates.xml",
+ config.use_pool_bundle,
+ [])
+
+ requests += generate_tree(config, glob, common_vars,
+ "unit",
+ "unit",
+ "icu-locale-deprecates.xml",
+ config.use_pool_bundle,
+ [])
+
+ requests += generate_tree(config, glob, common_vars,
+ "coll",
+ "coll",
+ "icu-coll-deprecates.xml",
+ # Never use pool bundle for coll, brkitr, or rbnf
+ False,
+ # Depends on timezoneTypes.res and keyTypeData.res.
+ # TODO: We should not need this dependency to build collation.
+ # TODO: Bake keyTypeData.res into the common library?
+ [DepTarget("coll_ucadata"), DepTarget("misc_res"), InFile("unidata/UCARules.txt")])
+
+ requests += generate_tree(config, glob, common_vars,
+ "brkitr",
+ "brkitr",
+ "icu-locale-deprecates.xml",
+ # Never use pool bundle for coll, brkitr, or rbnf
+ False,
+ [DepTarget("brkitr_brk"), DepTarget("dictionaries")])
+
+ requests += generate_tree(config, glob, common_vars,
+ "rbnf",
+ "rbnf",
+ "icu-rbnf-deprecates.xml",
+ # Never use pool bundle for coll, brkitr, or rbnf
+ False,
+ [])
+
+ requests += [
+ ListRequest(
+ name = "icudata_list",
+ variable_name = "icudata_all_output_files",
+ output_file = TmpFile("icudata.lst"),
+ include_tmp = False
+ )
+ ]
+
+ return requests
+
+
+def generate_cnvalias(config, glob, common_vars):
+ # UConv Name Aliases
+ input_file = InFile("mappings/convrtrs.txt")
+ output_file = OutFile("cnvalias.icu")
+ return [
+ SingleExecutionRequest(
+ name = "cnvalias",
+ category = "cnvalias",
+ dep_targets = [],
+ input_files = [input_file],
+ output_files = [output_file],
+ tool = IcuTool("gencnval"),
+ args = "-s {IN_DIR} -d {OUT_DIR} "
+ "{INPUT_FILES[0]}",
+ format_with = {}
+ )
+ ]
+
+
+def generate_confusables(config, glob, common_vars):
+ # CONFUSABLES
+ txt1 = InFile("unidata/confusables.txt")
+ txt2 = InFile("unidata/confusablesWholeScript.txt")
+ cfu = OutFile("confusables.cfu")
+ return [
+ SingleExecutionRequest(
+ name = "confusables",
+ category = "confusables",
+ dep_targets = [DepTarget("cnvalias")],
+ input_files = [txt1, txt2],
+ output_files = [cfu],
+ tool = IcuTool("gencfu"),
+ args = "-d {OUT_DIR} -i {OUT_DIR} "
+ "-c -r {IN_DIR}/{INPUT_FILES[0]} -w {IN_DIR}/{INPUT_FILES[1]} "
+ "-o {OUTPUT_FILES[0]}",
+ format_with = {}
+ )
+ ]
+
+
+def generate_conversion_mappings(config, glob, common_vars):
+ # UConv Conversion Table Files
+ input_files = [InFile(filename) for filename in glob("mappings/*.ucm")]
+ output_files = [OutFile("%s.cnv" % v.filename[9:-4]) for v in input_files]
+ # TODO: handle BUILD_SPECIAL_CNV_FILES? Means to add --ignore-siso-check flag to makeconv
+ return [
+ RepeatedOrSingleExecutionRequest(
+ name = "conversion_mappings",
+ category = "conversion_mappings",
+ dep_targets = [],
+ input_files = input_files,
+ output_files = output_files,
+ tool = IcuTool("makeconv"),
+ args = "-s {IN_DIR} -d {OUT_DIR} -c {INPUT_FILE_PLACEHOLDER}",
+ format_with = {},
+ repeat_with = {
+ "INPUT_FILE_PLACEHOLDER": utils.SpaceSeparatedList(file.filename for file in input_files)
+ }
+ )
+ ]
+
+
+def generate_brkitr_brk(config, glob, common_vars):
+ # BRK Files
+ input_files = [InFile(filename) for filename in glob("brkitr/rules/*.txt")]
+ output_files = [OutFile("brkitr/%s.brk" % v.filename[13:-4]) for v in input_files]
+ return [
+ RepeatedExecutionRequest(
+ name = "brkitr_brk",
+ category = "brkitr_rules",
+ dep_targets = [DepTarget("cnvalias"), DepTarget("ulayout")],
+ input_files = input_files,
+ output_files = output_files,
+ tool = IcuTool("genbrk"),
+ args = "-d {OUT_DIR} -i {OUT_DIR} "
+ "-c -r {IN_DIR}/{INPUT_FILE} "
+ "-o {OUTPUT_FILE}",
+ format_with = {},
+ repeat_with = {}
+ )
+ ]
+
+
+def generate_stringprep(config, glob, common_vars):
+ # SPP FILES
+ input_files = [InFile(filename) for filename in glob("sprep/*.txt")]
+ output_files = [OutFile("%s.spp" % v.filename[6:-4]) for v in input_files]
+ bundle_names = [v.filename[6:-4] for v in input_files]
+ return [
+ RepeatedExecutionRequest(
+ name = "stringprep",
+ category = "stringprep",
+ dep_targets = [InFile("unidata/NormalizationCorrections.txt")],
+ input_files = input_files,
+ output_files = output_files,
+ tool = IcuTool("gensprep"),
+ args = "-s {IN_DIR}/sprep -d {OUT_DIR} -i {OUT_DIR} "
+ "-b {BUNDLE_NAME} -m {IN_DIR}/unidata -u 3.2.0 {BUNDLE_NAME}.txt",
+ format_with = {},
+ repeat_with = {
+ "BUNDLE_NAME": bundle_names
+ }
+ )
+ ]
+
+
+def generate_brkitr_dictionaries(config, glob, common_vars):
+ # Dict Files
+ input_files = [InFile(filename) for filename in glob("brkitr/dictionaries/*.txt")]
+ output_files = [OutFile("brkitr/%s.dict" % v.filename[20:-4]) for v in input_files]
+ extra_options_map = {
+ "brkitr/dictionaries/burmesedict.txt": "--bytes --transform offset-0x1000",
+ "brkitr/dictionaries/cjdict.txt": "--uchars",
+ "brkitr/dictionaries/khmerdict.txt": "--bytes --transform offset-0x1780",
+ "brkitr/dictionaries/laodict.txt": "--bytes --transform offset-0x0e80",
+ "brkitr/dictionaries/thaidict.txt": "--bytes --transform offset-0x0e00"
+ }
+ extra_optionses = [extra_options_map[v.filename] for v in input_files]
+ return [
+ RepeatedExecutionRequest(
+ name = "dictionaries",
+ category = "brkitr_dictionaries",
+ dep_targets = [],
+ input_files = input_files,
+ output_files = output_files,
+ tool = IcuTool("gendict"),
+ args = "-i {OUT_DIR} "
+ "-c {EXTRA_OPTIONS} "
+ "{IN_DIR}/{INPUT_FILE} {OUT_DIR}/{OUTPUT_FILE}",
+ format_with = {},
+ repeat_with = {
+ "EXTRA_OPTIONS": extra_optionses
+ }
+ )
+ ]
+
+
+def generate_normalization(config, glob, common_vars):
+ # NRM Files
+ input_files = [InFile(filename) for filename in glob("in/*.nrm")]
+ # nfc.nrm is pre-compiled into C++; see generate_full_unicore_data
+ input_files.remove(InFile("in/nfc.nrm"))
+ output_files = [OutFile(v.filename[3:]) for v in input_files]
+ return [
+ RepeatedExecutionRequest(
+ name = "normalization",
+ category = "normalization",
+ dep_targets = [],
+ input_files = input_files,
+ output_files = output_files,
+ tool = IcuTool("icupkg"),
+ args = "-t{ICUDATA_CHAR} {IN_DIR}/{INPUT_FILE} {OUT_DIR}/{OUTPUT_FILE}",
+ format_with = {},
+ repeat_with = {}
+ )
+ ]
+
+
+def generate_coll_ucadata(config, glob, common_vars):
+ # Collation Dependency File (ucadata.icu)
+ input_file = InFile("in/coll/ucadata-%s.icu" % config.coll_han_type)
+ output_file = OutFile("coll/ucadata.icu")
+ return [
+ SingleExecutionRequest(
+ name = "coll_ucadata",
+ category = "coll_ucadata",
+ dep_targets = [],
+ input_files = [input_file],
+ output_files = [output_file],
+ tool = IcuTool("icupkg"),
+ args = "-t{ICUDATA_CHAR} {IN_DIR}/{INPUT_FILES[0]} {OUT_DIR}/{OUTPUT_FILES[0]}",
+ format_with = {}
+ )
+ ]
+
+
+def generate_full_unicore_data(config, glob, common_vars):
+ # The core Unicode properties files (pnames.icu, uprops.icu, ucase.icu, ubidi.icu)
+ # are hardcoded in the common DLL and therefore not included in the data package any more.
+ # They are not built by default but need to be built for ICU4J data,
+ # both in the .jar and in the .dat file (if ICU4J uses the .dat file).
+ # See ICU-4497.
+ if not config.include_uni_core_data:
+ return []
+
+ basenames = [
+ "pnames.icu",
+ "uprops.icu",
+ "ucase.icu",
+ "ubidi.icu",
+ "nfc.nrm"
+ ]
+ input_files = [InFile("in/%s" % bn) for bn in basenames]
+ output_files = [OutFile(bn) for bn in basenames]
+ return [
+ RepeatedExecutionRequest(
+ name = "unicore",
+ category = "unicore",
+ input_files = input_files,
+ output_files = output_files,
+ tool = IcuTool("icupkg"),
+ args = "-t{ICUDATA_CHAR} {IN_DIR}/{INPUT_FILE} {OUT_DIR}/{OUTPUT_FILE}"
+ )
+ ]
+
+
+def generate_unames(config, glob, common_vars):
+ # Unicode Character Names
+ input_file = InFile("in/unames.icu")
+ output_file = OutFile("unames.icu")
+ return [
+ SingleExecutionRequest(
+ name = "unames",
+ category = "unames",
+ dep_targets = [],
+ input_files = [input_file],
+ output_files = [output_file],
+ tool = IcuTool("icupkg"),
+ args = "-t{ICUDATA_CHAR} {IN_DIR}/{INPUT_FILES[0]} {OUT_DIR}/{OUTPUT_FILES[0]}",
+ format_with = {}
+ )
+ ]
+
+
+def generate_ulayout(config, glob, common_vars):
+ # Unicode text layout properties
+ basename = "ulayout"
+ input_file = InFile("in/%s.icu" % basename)
+ output_file = OutFile("%s.icu" % basename)
+ return [
+ SingleExecutionRequest(
+ name = basename,
+ category = basename,
+ dep_targets = [],
+ input_files = [input_file],
+ output_files = [output_file],
+ tool = IcuTool("icupkg"),
+ args = "-t{ICUDATA_CHAR} {IN_DIR}/{INPUT_FILES[0]} {OUT_DIR}/{OUTPUT_FILES[0]}",
+ format_with = {}
+ )
+ ]
+
+
+def generate_misc(config, glob, common_vars):
+ # Misc Data Res Files
+ input_files = [InFile(filename) for filename in glob("misc/*.txt")]
+ input_basenames = [v.filename[5:] for v in input_files]
+ output_files = [OutFile("%s.res" % v[:-4]) for v in input_basenames]
+ return [
+ RepeatedExecutionRequest(
+ name = "misc_res",
+ category = "misc",
+ dep_targets = [],
+ input_files = input_files,
+ output_files = output_files,
+ tool = IcuTool("genrb"),
+ args = "-s {IN_DIR}/misc -d {OUT_DIR} -i {OUT_DIR} "
+ "-k -q "
+ "{INPUT_BASENAME}",
+ format_with = {},
+ repeat_with = {
+ "INPUT_BASENAME": input_basenames
+ }
+ )
+ ]
+
+
+def generate_curr_supplemental(config, glob, common_vars):
+ # Currency Supplemental Res File
+ input_file = InFile("curr/supplementalData.txt")
+ input_basename = "supplementalData.txt"
+ output_file = OutFile("curr/supplementalData.res")
+ return [
+ SingleExecutionRequest(
+ name = "curr_supplemental_res",
+ category = "curr_supplemental",
+ dep_targets = [],
+ input_files = [input_file],
+ output_files = [output_file],
+ tool = IcuTool("genrb"),
+ args = "-s {IN_DIR}/curr -d {OUT_DIR}/curr -i {OUT_DIR} "
+ "-k "
+ "{INPUT_BASENAME}",
+ format_with = {
+ "INPUT_BASENAME": input_basename
+ }
+ )
+ ]
+
+
+def generate_translit(config, glob, common_vars):
+ input_files = [
+ InFile("translit/root.txt"),
+ InFile("translit/en.txt"),
+ InFile("translit/el.txt")
+ ]
+ dep_files = set(InFile(filename) for filename in glob("translit/*.txt"))
+ dep_files -= set(input_files)
+ dep_files = list(sorted(dep_files))
+ input_basenames = [v.filename[9:] for v in input_files]
+ output_files = [
+ OutFile("translit/%s.res" % v[:-4])
+ for v in input_basenames
+ ]
+ return [
+ RepeatedOrSingleExecutionRequest(
+ name = "translit_res",
+ category = "translit",
+ dep_targets = dep_files,
+ input_files = input_files,
+ output_files = output_files,
+ tool = IcuTool("genrb"),
+ args = "-s {IN_DIR}/translit -d {OUT_DIR}/translit -i {OUT_DIR} "
+ "-k "
+ "{INPUT_BASENAME}",
+ format_with = {
+ },
+ repeat_with = {
+ "INPUT_BASENAME": utils.SpaceSeparatedList(input_basenames)
+ }
+ )
+ ]
+
+
+def generate_tree(
+ config,
+ glob,
+ common_vars,
+ sub_dir,
+ out_sub_dir,
+ xml_filename,
+ use_pool_bundle,
+ dep_targets):
+ requests = []
+ category = "%s_tree" % sub_dir
+ out_prefix = "%s/" % out_sub_dir if out_sub_dir else ""
+ # TODO: Clean this up for curr
+ input_files = [InFile(filename) for filename in glob("%s/*.txt" % sub_dir)]
+ if sub_dir == "curr":
+ input_files.remove(InFile("curr/supplementalData.txt"))
+ input_basenames = [v.filename[len(sub_dir)+1:] for v in input_files]
+ output_files = [
+ OutFile("%s%s.res" % (out_prefix, v[:-4]))
+ for v in input_basenames
+ ]
+
+ # Generate Pool Bundle
+ if use_pool_bundle:
+ input_pool_files = [OutFile("%spool.res" % out_prefix)]
+ pool_target_name = "%s_pool_write" % sub_dir
+ use_pool_bundle_option = "--usePoolBundle {OUT_DIR}/{OUT_PREFIX}".format(
+ OUT_PREFIX = out_prefix,
+ **common_vars
+ )
+ requests += [
+ SingleExecutionRequest(
+ name = pool_target_name,
+ category = category,
+ dep_targets = dep_targets,
+ input_files = input_files,
+ output_files = input_pool_files,
+ tool = IcuTool("genrb"),
+ args = "-s {IN_DIR}/{IN_SUB_DIR} -d {OUT_DIR}/{OUT_PREFIX} -i {OUT_DIR} "
+ "--writePoolBundle -k "
+ "{INPUT_BASENAMES_SPACED}",
+ format_with = {
+ "IN_SUB_DIR": sub_dir,
+ "OUT_PREFIX": out_prefix,
+ "INPUT_BASENAMES_SPACED": utils.SpaceSeparatedList(input_basenames)
+ }
+ ),
+ ]
+ dep_targets = dep_targets + [DepTarget(pool_target_name)]
+ else:
+ use_pool_bundle_option = ""
+
+ # Generate Res File Tree
+ requests += [
+ RepeatedOrSingleExecutionRequest(
+ name = "%s_res" % sub_dir,
+ category = category,
+ dep_targets = dep_targets,
+ input_files = input_files,
+ output_files = output_files,
+ tool = IcuTool("genrb"),
+ args = "-s {IN_DIR}/{IN_SUB_DIR} -d {OUT_DIR}/{OUT_PREFIX} -i {OUT_DIR} "
+ "{EXTRA_OPTION} -k "
+ "{INPUT_BASENAME}",
+ format_with = {
+ "IN_SUB_DIR": sub_dir,
+ "OUT_PREFIX": out_prefix,
+ "EXTRA_OPTION": use_pool_bundle_option
+ },
+ repeat_with = {
+ "INPUT_BASENAME": utils.SpaceSeparatedList(input_basenames)
+ }
+ )
+ ]
+
+ # Generate res_index file
+ # Exclude the deprecated locale variants and root; see ICU-20628. This
+ # could be data-driven, but we do not want to perform I/O in this script
+ # (for example, we do not want to read from an XML file).
+ excluded_locales = set([
+ "ja_JP_TRADITIONAL",
+ "th_TH_TRADITIONAL",
+ "de_",
+ "de__PHONEBOOK",
+ "es_",
+ "es__TRADITIONAL",
+ "root",
+ ])
+ # Put alias locales in a separate structure; see ICU-20627
+ alias_locales = set(locale_dependencies.data["aliases"].keys())
+ alias_files = []
+ installed_files = []
+ for f in input_files:
+ file_stem = IndexRequest.locale_file_stem(f)
+ if file_stem in excluded_locales:
+ continue
+ destination = alias_files if file_stem in alias_locales else installed_files
+ destination.append(f)
+ cldr_version = locale_dependencies.data["cldrVersion"] if sub_dir == "locales" else None
+ index_file_txt = TmpFile("{IN_SUB_DIR}/{INDEX_NAME}.txt".format(
+ IN_SUB_DIR = sub_dir,
+ **common_vars
+ ))
+ index_res_file = OutFile("{OUT_PREFIX}{INDEX_NAME}.res".format(
+ OUT_PREFIX = out_prefix,
+ **common_vars
+ ))
+ index_file_target_name = "%s_index_txt" % sub_dir
+ requests += [
+ IndexRequest(
+ name = index_file_target_name,
+ category = category,
+ installed_files = installed_files,
+ alias_files = alias_files,
+ txt_file = index_file_txt,
+ output_file = index_res_file,
+ cldr_version = cldr_version,
+ args = "-s {TMP_DIR}/{IN_SUB_DIR} -d {OUT_DIR}/{OUT_PREFIX} -i {OUT_DIR} "
+ "-k "
+ "{INDEX_NAME}.txt",
+ format_with = {
+ "IN_SUB_DIR": sub_dir,
+ "OUT_PREFIX": out_prefix
+ }
+ )
+ ]
+
+ return requests
diff --git a/Build/source/libs/icu/icu-src/source/data/Makefile.in b/Build/source/libs/icu/icu-src/source/data/Makefile.in
index 688bcae3f15..d1fb80fe19b 100644
--- a/Build/source/libs/icu/icu-src/source/data/Makefile.in
+++ b/Build/source/libs/icu/icu-src/source/data/Makefile.in
@@ -82,35 +82,12 @@ endif
OUTTMPDIR=$(OUTDIR)/tmp
MAINBUILDDIR=$(OUTDIR)/build
BUILDDIR=$(MAINBUILDDIR)/$(ICUDATA_PLATFORM_NAME)
-UNICODEDATADIR=$(SRCDATADIR)/unidata
-LOCSRCDIR=$(SRCDATADIR)/locales
-CURRSRCDIR=$(SRCDATADIR)/curr
-CURRBLDDIR=$(BUILDDIR)/curr
-LANGSRCDIR=$(SRCDATADIR)/lang
-LANGBLDDIR=$(BUILDDIR)/lang
-REGIONSRCDIR=$(SRCDATADIR)/region
-REGIONBLDDIR=$(BUILDDIR)/region
-ZONESRCDIR=$(SRCDATADIR)/zone
-ZONEBLDDIR=$(BUILDDIR)/zone
-UNITSRCDIR=$(SRCDATADIR)/unit
-UNITBLDDIR=$(BUILDDIR)/unit
-COLSRCDIR=$(SRCDATADIR)/coll
-COLBLDDIR=$(BUILDDIR)/coll
-RBNFSRCDIR=$(SRCDATADIR)/rbnf
-RBNFBLDDIR=$(BUILDDIR)/rbnf
-TRANSLITSRCDIR=$(SRCDATADIR)/translit
-TRANSLITBLDDIR=$(BUILDDIR)/translit
MISCSRCDIR=$(SRCDATADIR)/misc
-BRKSRCDIR=$(SRCDATADIR)/brkitr
-BRKBLDDIR=$(BUILDDIR)/brkitr
-DICTSRCDIR=$(BRKSRCDIR)/dictionaries
-BRKRULESRCDIR=$(BRKSRCDIR)/rules
-MISCSRCDIR=$(SRCDATADIR)/misc
-UCMSRCDIR=$(SRCDATADIR)/mappings
-SPREPSRCDIR=$(SRCDATADIR)/sprep
-COMINCDIR=$(top_srcdir)/common/unicode
SRCLISTDEPS=Makefile $(srcdir)/Makefile.in
-BUILD_DIRS=$(OUTDIR) $(MAINBUILDDIR) $(BUILDDIR) $(CURRBLDDIR) $(LANGBLDDIR) $(REGIONBLDDIR) $(ZONEBLDDIR) $(UNITBLDDIR) $(BRKBLDDIR) $(COLBLDDIR) $(RBNFBLDDIR) $(TRANSLITBLDDIR) $(OUTTMPDIR) $(OUTTMPDIR_390STUB) $(OUTTMPDIR)/$(CURR_TREE) $(OUTTMPDIR)/$(LANG_TREE) $(OUTTMPDIR)/$(REGION_TREE) $(OUTTMPDIR)/$(ZONE_TREE) $(OUTTMPDIR)/$(UNIT_TREE) $(OUTTMPDIR)/$(COLLATION_TREE) $(OUTTMPDIR)/$(RBNF_TREE) $(OUTTMPDIR)/$(TRANSLIT_TREE) $(OUTTMPDIR)/$(BREAK_TREE)
+
+# Variable names for rules.mk
+OUT_DIR=$(BUILDDIR)
+TMP_DIR=$(OUTTMPDIR)
# relative lib links from pkgdata are the same as for tmp
TOOLDIR=$(top_builddir)/tools
@@ -131,7 +108,7 @@ install: all-local install-local
clean: clean-local
distclean : distclean-local
dist:
-check: all
+check: all check-local
check-exhaustive: check
@@ -141,7 +118,7 @@ check-exhaustive: check
distclean-local: clean
$(RMV) Makefile
-all-local: build-dir icupkg.inc build-local packagedata $(POST_DATA_BUILD) $(OS390PKG)
+all-local: icupkg.inc build-local packagedata $(POST_DATA_BUILD) $(OS390PKG)
dist-local:
@@ -149,7 +126,7 @@ clean-map:
-test -z *.map || $(RMV) *.map
clean-local: cleanpackage cleanfiles clean-map
- $(RMV) build-dir* build-local packagedata uni-core-data
+ $(RMV) $(OUTDIR) build-local packagedata uni-core-data
cleanfiles:
test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)
@@ -159,6 +136,7 @@ cleanpackage:
$(RMV) $(LIBDIR)/*$(LIB_ICUDATA_NAME)*.$(SO)* $(LIBDIR)/$(LIB_STATIC_ICUDATA_NAME).$(A)
check-local:
+ PYTHONPATH=$(top_srcdir)/python @PYTHON@ -m icutools.databuilder.test
# Find out if we have a source archive.
# If we have that, then use that instead of building everything from scratch.
@@ -240,133 +218,14 @@ package390: $(OUTTMPDIR)/icudata390.lst $(PKGDATA_LIST) ./icupkg.inc packagedata
cp $(ICUPKGDATA_OUTDIR)/$(LIB_ICUDATA_NAME)$(STUB_SUFFIX).$(SO) $(top_builddir)/stubdata/$(LIB_ICUDATA_NAME)$(STUB_SUFFIX).$(SO)
-##### Define all the data files. the build rule that depends on them is below.
-# X_FILES_SHORT = just the base names (for lists)
-# X_FILES = full paths (for dependency)
+## Include the main build rules for data files
+include $(top_builddir)/$(subdir)/rules.mk
-## DAT files - Misc. data files.
-# 2005-may-05 Removed Unicode properties files (unorm.icu, uprops.icu, ucase.icu, ubidi.icu)
-# from data build. See Jitterbug 4497. (makedata.mak revision 1.117)
-# 2010-dec Removed pnames.icu.
-# These are now hardcoded in ICU4C and only loaded in ICU4J.
-#
-DAT_FILES_SHORT=unames.icu cnvalias.icu coll/ucadata.icu nfkc.nrm nfkc_cf.nrm uts46.nrm
-DAT_FILES=$(DAT_FILES_SHORT:%=$(BUILDDIR)/%)
-
-## BRK files
-BREAK_TREE=brkitr
--include $(BRKSRCDIR)/brkfiles.mk
--include $(BRKSRCDIR)/brklocal.mk
-ALL_BRK_SOURCE= $(BRK_SOURCE) $(BRK_SOURCE_LOCAL)
-BRK_FILES_SHORT=$(ALL_BRK_SOURCE:%.txt=$(BREAK_TREE)/%.brk)
-BRK_FILES=$(ALL_BRK_SOURCE:%.txt=$(BRKBLDDIR)/%.brk)
-ifdef BRK_DICT_SOURCE
-ALL_DICT_SOURCE=$(BRK_DICT_SOURCE) $(BRK_DICT_SOURCE_LOCAL)
-DICT_FILES_SHORT=$(ALL_DICT_SOURCE:%.txt=$(BREAK_TREE)/%.dict)
-DICT_FILES=$(ALL_DICT_SOURCE:%.txt=$(BRKBLDDIR)/%.dict)
-endif
-ifdef BRK_RES_SOURCE
-BRS_SRC= root.txt $(BRK_RES_SOURCE) $(BRK_RES_SOURCE_LOCAL)
-BRS_SRC_FILES = $(BRS_SRC:%=$(BRKSRCDIR)/%)
-INSTALLED_BRS_FILES = $(BRK_RES_SOURCE:%.txt=%) $(BRK_RES_SOURCE_LOCAL:%.txt=%)
-endif
-
-## Confusables (Spoofing) files
-ALL_CFU_SOURCE=$(UNICODEDATADIR)/confusables.txt $(UNICODEDATADIR)/confusablesWholeScript.txt
-CFU_FILES_SHORT=confusables.cfu
-CFU_FILES=$(BUILDDIR)/$(CFU_FILES_SHORT)
-
-## UCM files
--include $(UCMSRCDIR)/ucmcore.mk
--include $(UCMSRCDIR)/ucmfiles.mk
--include $(UCMSRCDIR)/ucmebcdic.mk
--include $(UCMSRCDIR)/ucmlocal.mk
-ALL_UCM_SOURCE=ibm-37_P100-1995.ucm ibm-1047_P100-1995.ucm $(UCM_SOURCE_CORE) $(UCM_SOURCE_FILES) $(UCM_SOURCE_EBCDIC) $(UCM_SOURCE_LOCAL)
-UCM_FILES = $(ALL_UCM_SOURCE:%=$(SRCDATADIR)/%)
-CNV_FILES = $(ALL_UCM_SOURCE:%.ucm=$(BUILDDIR)/%.cnv)
-CNV_FILES_SHORT = $(ALL_UCM_SOURCE:%.ucm=%.cnv)
-UCM_SOURCE_SPECIAL=$(UCM_SOURCE_EBCDIC_IGNORE_SISO) $(UCM_SOURCE_EBCDIC_IGNORE_SISO_LOCAL)
-UCM_FILES_SPECIAL=$(UCM_SOURCE_SPECIAL:%=$(UCMSRCDIR)/%)
-CNV_FILES_SPECIAL=$(UCM_SOURCE_SPECIAL:%.ucm=$(BUILDDIR)/%.cnv)
-CNV_FILES_SHORT_SPECIAL=$(UCM_SOURCE_SPECIAL:%.ucm=%.cnv)
-
-## RES files
--include $(LOCSRCDIR)/resfiles.mk
--include $(CURRSRCDIR)/resfiles.mk
--include $(LANGSRCDIR)/resfiles.mk
--include $(REGIONSRCDIR)/resfiles.mk
--include $(ZONESRCDIR)/resfiles.mk
--include $(UNITSRCDIR)/resfiles.mk
--include $(COLSRCDIR)/colfiles.mk
--include $(RBNFSRCDIR)/rbnffiles.mk
--include $(TRANSLITSRCDIR)/trnsfiles.mk
--include $(LOCSRCDIR)/reslocal.mk
--include $(CURRSRCDIR)/reslocal.mk
--include $(LANGSRCDIR)/reslocal.mk
--include $(REGIONSRCDIR)/reslocal.mk
--include $(ZONESRCDIR)/reslocal.mk
--include $(UNITSRCDIR)/reslocal.mk
--include $(COLSRCDIR)/collocal.mk
--include $(BRKSRCDIR)/brslocal.mk
--include $(RBNFSRCDIR)/rbnflocal.mk
--include $(TRANSLITSRCDIR)/trnslocal.mk
-ifdef GENRB_SOURCE
-RES_SRC= root.txt $(GENRB_SOURCE) $(GENRB_ALIAS_SOURCE) $(GENRB_SOURCE_LOCAL) $(GENRB_ALIAS_SOURCE_LOCAL)
-RES_SRC_FILES = $(RES_SRC:%=$(LOCSRCDIR)/%)
-INSTALLED_RB_FILES = $(GENRB_SOURCE:%.txt=%) $(GENRB_SOURCE_LOCAL:%.txt=%)
-endif
-ifdef CURR_SOURCE
-CURR_SRC= root.txt supplementalData.txt $(CURR_SOURCE) $(CURR_ALIAS_SOURCE) $(CURR_SOURCE_LOCAL)
-CURR_SRC_FILES = $(CURR_SRC:%=$(CURRSRCDIR)/%)
-INSTALLED_CURR_FILES = $(CURR_SOURCE:%.txt=%) $(CURR_SOURCE_LOCAL:%.txt=%)
-endif
-ifdef LANG_SOURCE
-LANG_SRC= root.txt $(LANG_SOURCE) $(LANG_ALIAS_SOURCE) $(LANG_SOURCE_LOCAL)
-LANG_SRC_FILES = $(LANG_SRC:%=$(LANGSRCDIR)/%)
-INSTALLED_LANG_FILES = $(LANG_SOURCE:%.txt=%) $(LANG_SOURCE_LOCAL:%.txt=%)
-endif
-ifdef REGION_SOURCE
-REGION_SRC= root.txt $(REGION_SOURCE) $(REGION_ALIAS_SOURCE) $(REGION_SOURCE_LOCAL)
-REGION_SRC_FILES = $(REGION_SRC:%=$(REGIONSRCDIR)/%)
-INSTALLED_REGION_FILES = $(REGION_SOURCE:%.txt=%) $(REGION_SOURCE_LOCAL:%.txt=%)
-endif
-ifdef ZONE_SOURCE
-ZONE_SRC= root.txt $(ZONE_SOURCE) $(ZONE_ALIAS_SOURCE) $(ZONE_SOURCE_LOCAL) tzdbNames.txt
-ZONE_SRC_FILES = $(ZONE_SRC:%=$(ZONESRCDIR)/%)
-INSTALLED_ZONE_FILES = $(ZONE_SOURCE:%.txt=%) $(ZONE_SOURCE_LOCAL:%.txt=%)
-endif
-ifdef UNIT_SOURCE
-UNIT_SRC= root.txt $(UNIT_SOURCE) $(UNIT_ALIAS_SOURCE) $(UNIT_SOURCE_LOCAL)
-UNIT_SRC_FILES = $(UNIT_SRC:%=$(UNITSRCDIR)/%)
-INSTALLED_UNIT_FILES = $(UNIT_SOURCE:%.txt=%) $(UNIT_SOURCE_LOCAL:%.txt=%)
-endif
-ifdef COLLATION_SOURCE
-COL_SRC= root.txt $(COLLATION_SOURCE) $(COLLATION_ALIAS_SOURCE) $(COLLATION_SOURCE_LOCAL)
-COL_SRC_FILES = $(COL_SRC:%=$(COLSRCDIR)/%)
-INSTALLED_COL_FILES = $(COLLATION_SOURCE:%.txt=%) $(COLLATION_SOURCE_LOCAL:%.txt=%)
-endif
-ifdef RBNF_SOURCE
-RBNF_SRC= root.txt $(RBNF_SOURCE) $(RBNF_ALIAS_SOURCE) $(RBNF_SOURCE_LOCAL)
-RBNF_SRC_FILES = $(RBNF_SRC:%=$(RBNFSRCDIR)/%)
-INSTALLED_RBNF_FILES = $(RBNF_SOURCE:%.txt=%) $(RBNF_SOURCE_LOCAL:%.txt=%)
-endif
-ifdef TRANSLIT_SOURCE
-TRANSLIT_SRC= $(TRANSLIT_SOURCE) $(TRANSLIT_ALIAS_SOURCE) $(TRANSLIT_SOURCE_LOCAL)
-TRANSLIT_SRC_FILES = $(TRANSLIT_SRC:%=$(TRANSLITSRCDIR)/%)
-INSTALLED_TRANSLIT_FILES = $(TRANSLIT_SOURCE:%.txt=%) $(TRANSLIT_SOURCE_LOCAL:%.txt=%)
-endif
-GENRBOPTS=-k
-
-## MISC files
--include $(MISCSRCDIR)/miscfiles.mk
--include $(MISCSRCDIR)/misclocal.mk
-MSC_SOURCE= $(MISC_SOURCE) $(MISC_SOURCE_LOCAL)
-MSC_SRC_FILES=$(MSC_SOURCE:%=$(MISCSRCDIR)/%)
ifeq ($(ENABLE_SO_VERSION_DATA),1)
ifeq ($(PKGDATA_MODE),dll)
SO_VERSION_DATA = $(OUTTMPDIR)/icudata.res
-$(SO_VERSION_DATA) : $(MISCSRCDIR)/icudata.rc | build-dir
+$(SO_VERSION_DATA) : $(MISCSRCDIR)/icudata.rc
ifeq ($(MSYS_RC_MODE),1)
rc.exe -i$(srcdir)/../common -i$(top_builddir)/common -fo$@ $(CPPFLAGS) $<
else
@@ -375,89 +234,8 @@ endif
endif
endif
-INDEX_NAME=res_index
-INDEX_FILE=$(OUTTMPDIR)/$(INDEX_NAME).txt
-
-ALL_RES_SRC= $(RES_SRC) $(TRNS_SOURCE) $(MSC_SOURCE)
-RES_FILES = $(ALL_RES_SRC:%.txt=$(BUILDDIR)/%.res) $(BUILDDIR)/$(INDEX_NAME).res $(BUILDDIR)/pool.res
-RES_FILES_SHORT = $(ALL_RES_SRC:%.txt=%.res) $(INDEX_NAME).res pool.res
-PKGDATA_LIST = $(OUTTMPDIR)/icudata.lst
-
-CURR_TREE=curr
-CURR_INDEX_FILE=$(OUTTMPDIR)/$(CURR_TREE)/$(INDEX_NAME).txt
-CURR_FILES = $(CURR_SRC:%.txt=$(CURRBLDDIR)/%.res) $(CURRBLDDIR)/$(INDEX_NAME).res $(CURRBLDDIR)/pool.res
-CURR_FILES_SHORT = $(CURR_SRC:%.txt=$(CURR_TREE)/%.res) $(CURR_TREE)/$(INDEX_NAME).res $(CURR_TREE)/pool.res
-
-LANG_TREE=lang
-LANG_INDEX_FILE=$(OUTTMPDIR)/$(LANG_TREE)/$(INDEX_NAME).txt
-LANG_FILES = $(LANG_SRC:%.txt=$(LANGBLDDIR)/%.res) $(LANGBLDDIR)/$(INDEX_NAME).res $(LANGBLDDIR)/pool.res
-LANG_FILES_SHORT = $(LANG_SRC:%.txt=$(LANG_TREE)/%.res) $(LANG_TREE)/$(INDEX_NAME).res $(LANG_TREE)/pool.res
-
-REGION_TREE=region
-REGION_INDEX_FILE=$(OUTTMPDIR)/$(REGION_TREE)/$(INDEX_NAME).txt
-REGION_FILES = $(REGION_SRC:%.txt=$(REGIONBLDDIR)/%.res) $(REGIONBLDDIR)/$(INDEX_NAME).res $(REGIONBLDDIR)/pool.res
-REGION_FILES_SHORT = $(REGION_SRC:%.txt=$(REGION_TREE)/%.res) $(REGION_TREE)/$(INDEX_NAME).res $(REGION_TREE)/pool.res
-
-ZONE_TREE=zone
-ZONE_INDEX_FILE=$(OUTTMPDIR)/$(ZONE_TREE)/$(INDEX_NAME).txt
-ZONE_FILES = $(ZONE_SRC:%.txt=$(ZONEBLDDIR)/%.res) $(ZONEBLDDIR)/$(INDEX_NAME).res $(ZONEBLDDIR)/pool.res
-ZONE_FILES_SHORT = $(ZONE_SRC:%.txt=$(ZONE_TREE)/%.res) $(ZONE_TREE)/$(INDEX_NAME).res $(ZONE_TREE)/pool.res
-
-UNIT_TREE=unit
-UNIT_INDEX_FILE=$(OUTTMPDIR)/$(UNIT_TREE)/$(INDEX_NAME).txt
-UNIT_FILES = $(UNIT_SRC:%.txt=$(UNITBLDDIR)/%.res) $(UNITBLDDIR)/$(INDEX_NAME).res $(UNITBLDDIR)/pool.res
-UNIT_FILES_SHORT = $(UNIT_SRC:%.txt=$(UNIT_TREE)/%.res) $(UNIT_TREE)/$(INDEX_NAME).res $(UNIT_TREE)/pool.res
-
-COLLATION_TREE=coll
-COLLATION_INDEX_FILE=$(OUTTMPDIR)/$(COLLATION_TREE)/$(INDEX_NAME).txt
-COLLATION_INDEX_RES=$(COLBLDDIR)/$(INDEX_NAME).res
-COLLATION_INDEX_RES_SHORT=$(COLLATION_TREE)/$(INDEX_NAME).res
-COLLATION_FILES = $(COL_SRC:%.txt=$(COLBLDDIR)/%.res) $(COLLATION_INDEX_RES)
-COLLATION_FILES_SHORT = $(COL_SRC:%.txt=$(COLLATION_TREE)/%.res)
-
-BRK_RES_INDEX_FILE=$(OUTTMPDIR)/$(BREAK_TREE)/$(INDEX_NAME).txt
-BRK_RES_INDEX_RES=$(BRKBLDDIR)/$(INDEX_NAME).res
-BRK_RES_INDEX_RES_SHORT=$(BREAK_TREE)/$(INDEX_NAME).res
-BRK_RES_FILES = $(BRS_SRC:%.txt=$(BRKBLDDIR)/%.res) $(BRK_RES_INDEX_RES)
-BRK_RES_FILES_SHORT = $(BRS_SRC:%.txt=$(BREAK_TREE)/%.res)
-
-RBNF_TREE=rbnf
-RBNF_INDEX_FILE=$(OUTTMPDIR)/$(RBNF_TREE)/$(INDEX_NAME).txt
-RBNF_INDEX_RES=$(RBNFBLDDIR)/$(INDEX_NAME).res
-RBNF_INDEX_RES_SHORT=$(RBNF_TREE)/$(INDEX_NAME).res
-RBNF_FILES = $(RBNF_SRC:%.txt=$(RBNFBLDDIR)/%.res) $(RBNF_INDEX_RES)
-RBNF_FILES_SHORT = $(RBNF_SRC:%.txt=$(RBNF_TREE)/%.res)
-
-TRANSLIT_TREE=translit
-#TRANSLIT_INDEX_FILE=$(OUTTMPDIR)/$(TRANSLIT_TREE)/$(INDEX_NAME).txt
-#TRANSLIT_INDEX_RES=$(TRANSLITBLDDIR)/$(INDEX_NAME).res
-#TRANSLIT_INDEX_RES_SHORT=$(TRANSLIT_TREE)/$(INDEX_NAME).res
-TRANSLIT_FILES = $(TRANSLIT_SRC:%.txt=$(TRANSLITBLDDIR)/%.res)
-TRANSLIT_FILES_SHORT = $(TRANSLIT_SRC:%.txt=$(TRANSLIT_TREE)/%.res)
-
-## SPP files
--include $(SPREPSRCDIR)/sprepfiles.mk
--include $(SPREPSRCDIR)/spreplocal.mk
-ALL_SPREP_SOURCE=$(SPREP_SOURCE) $(SPREP_SOURCE_LOCAL)
-SPREP_FILES = $(ALL_SPREP_SOURCE:%.txt=$(BUILDDIR)/%.spp)
-SPREP_FILES_SHORT = $(ALL_SPREP_SOURCE:%.txt=%.spp)
-
-## All generated files
-ALL_FILES = $(DAT_FILES) $(CNV_FILES) $(CNV_FILES_SPECIAL) $(BRK_FILES) $(DICT_FILES) $(RES_FILES) $(INDEX_RES_FILE) $(CURR_FILES) $(LANG_FILES) $(REGION_FILES) $(ZONE_FILES) $(UNIT_FILES) $(COLLATION_FILES) $(BRK_RES_FILES) $(RBNF_FILES) $(TRANSLIT_FILES) $(SPREP_FILES) $(CFU_FILES)
-ALL_INDEX_SRC_FILES = $(PKGDATA_LIST) $(INDEX_FILE) $(CURR_INDEX_FILE) $(LANG_INDEX_FILE) $(REGION_INDEX_FILE) $(ZONE_INDEX_FILE) $(UNIT_INDEX_FILE) $(COLLATION_INDEX_FILE) $(BRK_RES_INDEX_FILE) $(RBNF_INDEX_FILE)
-# a list to use in the .lst files (package-relative)
-COLL_FILES_LIST=$(COLLATION_FILES_SHORT) $(COLLATION_INDEX_RES_SHORT)
-BRK_FILES_LIST=$(BRK_FILES_SHORT) $(BRK_RES_FILES_SHORT) $(BRK_RES_INDEX_RES_SHORT) $(DICT_FILES_SHORT)
-LOCALE_FILES_LIST= $(RES_FILES_SHORT) $(LANG_FILES_SHORT) $(REGION_FILES_SHORT) $(ZONE_FILES_SHORT) $(UNIT_FILES_SHORT)
-MISC_FILES_LIST=$(DAT_FILES_SHORT) $(CNV_FILES_SHORT) $(CNV_FILES_SHORT_SPECIAL) $(CURR_FILES_SHORT) $(RBNF_FILES_SHORT) $(RBNF_INDEX_RES_SHORT) $(TRANSLIT_FILES_SHORT) $(SPREP_FILES_SHORT) $(CFU_FILES_SHORT)
-UNI_CORE_DATA=pnames.icu uprops.icu ucase.icu ubidi.icu nfc.nrm
-UNI_CORE_TARGET_DATA=$(UNI_CORE_DATA:%=$(BUILDDIR)/%)
-
-ifneq ($(INCLUDE_UNI_CORE_DATA),)
-MISC_FILES_LIST+=$(UNI_CORE_DATA)
-build-local: uni-core-data
- echo timestamp > $@
-endif
+PKGDATA_LIST = $(TMP_DIR)/icudata.lst
+
#####################################################
# General data build rules
@@ -466,28 +244,14 @@ endif
CLEANFILES = *~ icupkg.inc *.x
ifeq ($(ICUDATA_SOURCE_ARCHIVE),)
-build-local: build-dir $(SO_VERSION_DATA) $(ALL_FILES) $(PKGDATA_LIST) $(OS390LIST)
+build-local: $(SO_VERSION_DATA) $(ICUDATA_ALL_OUTPUT_FILES) $(PKGDATA_LIST) $(OS390LIST)
echo timestamp > $@
-$(PKGDATA_LIST): $(SRCLISTDEPS)
- @echo "generating $@ (list of data files)"
- @-$(RMV) $@
- @for file in $(COLL_FILES_LIST); do \
- echo $$file >> $@; \
- done;
- @for file in $(BRK_FILES_LIST); do \
- echo $$file >> $@; \
- done;
- @for file in $(LOCALE_FILES_LIST); do \
- echo $$file >> $@; \
- done;
- @for file in $(MISC_FILES_LIST); do \
- echo $$file >> $@; \
- done;
else
-build-local: build-dir $(SO_VERSION_DATA) $(PKGDATA_LIST) $(OS390LIST)
+build-local: $(SO_VERSION_DATA) $(PKGDATA_LIST) $(OS390LIST)
echo timestamp > $@
$(PKGDATA_LIST): $(SRCLISTDEPS) $(ICUDATA_SOURCE_ARCHIVE)
ifneq ($(ICUDATA_SOURCE_IS_NATIVE_TARGET),YES)
+ $(MKINSTALLDIRS) $(OUTTMPDIR) $(BUILDDIR)
@echo "Unpacking $(ICUDATA_SOURCE_ARCHIVE) and generating $@ (list of data files)"
@-$(RMV) $@
$(INVOKE) $(TOOLBINDIR)/icupkg -d $(BUILDDIR) --list -x \* $(ICUDATA_SOURCE_ARCHIVE) -o $@
@@ -497,299 +261,12 @@ endif
endif
-$(BUILD_DIRS): build-dir
-
-build-dir:
- @-$(RMV) $@
- echo timestamp > $@.tmp
- @list='$(BUILD_DIRS)'; \
- for dir in $$list; do \
- if ! test -d $$dir; then \
- echo $(MKINSTALLDIRS) $(BUILD_DIRS); \
- $(MKINSTALLDIRS) $(BUILD_DIRS); \
- fi; \
- done
- mv $@.tmp $@
-
-# The | is an order-only prerequisite. This helps when the -j option is used,
-# and we don't want the files to be built before the directories are built.
-ifneq ($(filter order-only,$(.FEATURES)),)
-$(ALL_FILES) $(ALL_INDEX_SRC_FILES): | build-dir
-endif
-
-# Now, sections for building each kind of data.
-
-#################################################### DAT
-# DAT FILES
-
-# cnvalias.icu
-$(BUILDDIR)/cnvalias.icu: $(UCMSRCDIR)/convrtrs.txt $(TOOLBINDIR)/gencnval$(TOOLEXEEXT)
- $(INVOKE) $(TOOLBINDIR)/gencnval -d $(BUILDDIR) $(UCMSRCDIR)/convrtrs.txt
-
-# Targets for prebuilt Unicode data
-$(BUILDDIR)/%.icu: $(SRCDATADIR)/in/%.icu
- $(INVOKE) $(TOOLBINDIR)/icupkg -t$(ICUDATA_CHAR) $< $@
-
-$(BUILDDIR)/%.nrm: $(SRCDATADIR)/in/%.nrm
- $(INVOKE) $(TOOLBINDIR)/icupkg -t$(ICUDATA_CHAR) $< $@
-
-$(BUILDDIR)/coll/ucadata.icu: $(SRCDATADIR)/in/coll/ucadata-unihan.icu
- $(INVOKE) $(TOOLBINDIR)/icupkg -t$(ICUDATA_CHAR) $< $@
-
-#################################################### SPP
-# SPP FILES
-
-$(BUILDDIR)/%.spp: $(SPREPSRCDIR)/%.txt $(TOOLBINDIR)/gensprep$(TOOLEXEEXT) $(BUILDDIR)/unames.icu
- $(INVOKE) $(TOOLBINDIR)/gensprep -d $(BUILDDIR) -i $(BUILDDIR) -s $(SPREPSRCDIR) -b $(@F:%.spp=%) -m $(UNICODEDATADIR) -u 3.2.0 $(<F)
-
-#################################################### BRK
-# BRK FILES
-
-$(BRKBLDDIR)/%.brk: $(BRKRULESRCDIR)/%.txt $(TOOLBINDIR)/genbrk$(TOOLEXEEXT) $(DAT_FILES)
- $(INVOKE) $(TOOLBINDIR)/genbrk -c -i $(BUILDDIR) -r $< -o $@
-
-#################################################### DICT
-# DICT FILES
-
-# .dict file generated regardless of whether dictionary file exists
-
-$(BRKBLDDIR)/%.dict: $(TOOLBINDIR)/gendict$(TOOLEXEEXT) $(DAT_FILES)
- $(INVOKE) $(TOOLBINDIR)/gendict --uchars -c -i $(BUILDDIR) $(DICTSRCDIR)/$(*F).txt $@
-
-$(BRKBLDDIR)/thaidict.dict: $(TOOLBINDIR)/gendict$(TOOLEXEEXT) $(DAT_FILES)
- $(INVOKE) $(TOOLBINDIR)/gendict --bytes --transform offset-0x0e00 -c -i $(BUILDDIR) $(DICTSRCDIR)/thaidict.txt $(BRKBLDDIR)/thaidict.dict
-
-$(BRKBLDDIR)/laodict.dict: $(TOOLBINDIR)/gendict$(TOOLEXEEXT) $(DAT_FILES)
- $(INVOKE) $(TOOLBINDIR)/gendict --bytes --transform offset-0x0e80 -c -i $(BUILDDIR) $(DICTSRCDIR)/laodict.txt $(BRKBLDDIR)/laodict.dict
-
-$(BRKBLDDIR)/burmesedict.dict: $(TOOLBINDIR)/gendict$(TOOLEXEEXT) $(DAT_FILES)
- $(INVOKE) $(TOOLBINDIR)/gendict --bytes --transform offset-0x1000 -c -i $(BUILDDIR) $(DICTSRCDIR)/burmesedict.txt $(BRKBLDDIR)/burmesedict.dict
-
-# TODO: figure out why combining characters are here?
-$(BRKBLDDIR)/khmerdict.dict: $(TOOLBINDIR)/gendict$(TOOLEXEEXT) $(DAT_FILES)
- $(INVOKE) $(TOOLBINDIR)/gendict --bytes --transform offset-0x1780 -c -i $(BUILDDIR) $(DICTSRCDIR)/khmerdict.txt $(BRKBLDDIR)/khmerdict.dict
-
-#################################################### CFU
-# CFU FILES
-# Note: gencfu requires two input files to produce a single output file.
-# There will be exactly one target file and two source files.
-# The $(word n, ...) selects the nth word from the following stuff.
-# There must be a nicer way to do this.
-
-$(CFU_FILES): $(ALL_CFU_SOURCE) $(TOOLBINDIR)/gencfu$(TOOLEXEEXT) $(DAT_FILES)
- $(INVOKE) echo ALL_CFU_SOURCE: $(ALL_CFU_SOURCE)
- $(INVOKE) echo CFU_FILES: $(CFU_FILES)
- $(INVOKE) echo CFU_FILES_SHORT: $(CFU_FILES_SHORT)
- $(INVOKE) $(TOOLBINDIR)/gencfu -c -i $(BUILDDIR) -r $(word 1,$(ALL_CFU_SOURCE)) -w $(word 2,$(ALL_CFU_SOURCE)) -o $@
-
-
-#################################################### CNV
-# CNV FILES
-$(CNV_FILES_SPECIAL) : $(UCM_FILES_SPECIAL) $(TOOLBINDIR)/makeconv$(TOOLEXEEXT)
- $(INVOKE) $(TOOLBINDIR)/makeconv --ignore-siso-check -c -d $(BUILDDIR) $(UCMSRCDIR)/$(@F:%.cnv=%.ucm)
-$(BUILDDIR)/%.cnv: $(UCMSRCDIR)/%.ucm $(TOOLBINDIR)/makeconv$(TOOLEXEEXT)
- $(INVOKE) $(TOOLBINDIR)/makeconv -c -d $(BUILDDIR) $(UCMSRCDIR)/$(<F)
-
-#################################################### RES
-# RES FILES
-
-### curr res
-$(CURRBLDDIR)/%.res: $(CURRSRCDIR)/%.txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES) | $(BUILDDIR)/cnvalias.icu
- $(INVOKE) $(TOOLBINDIR)/genrb --usePoolBundle $(GENRBOPTS) -i $(BUILDDIR) -s $(CURRSRCDIR) -d $(CURRBLDDIR) $(<F)
-
-# copy the curr/pool.res file from the source folder to the build output folder
-# and swap it to native endianness
-$(CURRBLDDIR)/pool.res: $(CURRSRCDIR)/pool.res
- $(INVOKE) $(TOOLBINDIR)/icupkg -t$(ICUDATA_CHAR) $(CURRSRCDIR)/pool.res $(CURRBLDDIR)/pool.res
-
-$(CURRBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(CURR_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
- $(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(OUTTMPDIR)/$(CURR_TREE) -d $(CURRBLDDIR) $(INDEX_NAME).txt
-
-$(CURR_INDEX_FILE): $(SRCLISTDEPS)
- @echo "generating $@ (list of installed currency name locales)"; \
- $(RMV) $@; \
- echo "// Warning this file is automatically generated" > $@; \
- echo "$(INDEX_NAME):table(nofallback) {" >> $@; \
- echo " InstalledLocales {" >> $@; \
- for file in $(INSTALLED_CURR_FILES); do \
- echo " $$file {\"\"}" >> $@; \
- done; \
- echo " }" >> $@; \
- echo "}" >> $@;
-
-### lang res
-$(LANGBLDDIR)/%.res: $(LANGSRCDIR)/%.txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES) | $(BUILDDIR)/cnvalias.icu
- $(INVOKE) $(TOOLBINDIR)/genrb --usePoolBundle $(GENRBOPTS) -i $(BUILDDIR) -s $(LANGSRCDIR) -d $(LANGBLDDIR) $(<F)
-
-# copy the lang/pool.res file from the source folder to the build output folder
-# and swap it to native endianness
-$(LANGBLDDIR)/pool.res: $(LANGSRCDIR)/pool.res
- $(INVOKE) $(TOOLBINDIR)/icupkg -t$(ICUDATA_CHAR) $(LANGSRCDIR)/pool.res $(LANGBLDDIR)/pool.res
-
-$(LANGBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(LANG_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
- $(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(OUTTMPDIR)/$(LANG_TREE) -d $(LANGBLDDIR) $(INDEX_NAME).txt
-
-$(LANG_INDEX_FILE): $(SRCLISTDEPS)
- @echo "generating $@ (list of installed language name locales)"; \
- $(RMV) $@; \
- echo "// Warning this file is automatically generated" > $@; \
- echo "$(INDEX_NAME):table(nofallback) {" >> $@; \
- echo " InstalledLocales {" >> $@; \
- for file in $(INSTALLED_LANG_FILES); do \
- echo " $$file {\"\"}" >> $@; \
- done; \
- echo " }" >> $@; \
- echo "}" >> $@;
-
-### region res
-$(REGIONBLDDIR)/%.res: $(REGIONSRCDIR)/%.txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES) | $(BUILDDIR)/cnvalias.icu
- $(INVOKE) $(TOOLBINDIR)/genrb --usePoolBundle $(GENRBOPTS) -i $(BUILDDIR) -s $(REGIONSRCDIR) -d $(REGIONBLDDIR) $(<F)
-
-# copy the region/pool.res file from the source folder to the build output folder
-# and swap it to native endianness
-$(REGIONBLDDIR)/pool.res: $(REGIONSRCDIR)/pool.res
- $(INVOKE) $(TOOLBINDIR)/icupkg -t$(ICUDATA_CHAR) $(REGIONSRCDIR)/pool.res $(REGIONBLDDIR)/pool.res
-
-$(REGIONBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(REGION_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
- $(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(OUTTMPDIR)/$(REGION_TREE) -d $(REGIONBLDDIR) $(INDEX_NAME).txt
-
-$(REGION_INDEX_FILE): $(SRCLISTDEPS)
- @echo "generating $@ (list of installed region name locales)"; \
- $(RMV) $@; \
- echo "// Warning this file is automatically generated" > $@; \
- echo "$(INDEX_NAME):table(nofallback) {" >> $@; \
- echo " InstalledLocales {" >> $@; \
- for file in $(INSTALLED_REGION_FILES); do \
- echo " $$file {\"\"}" >> $@; \
- done; \
- echo " }" >> $@; \
- echo "}" >> $@;
-
-### zone res
-$(ZONEBLDDIR)/%.res: $(ZONESRCDIR)/%.txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES) | $(BUILDDIR)/cnvalias.icu
- $(INVOKE) $(TOOLBINDIR)/genrb --usePoolBundle $(GENRBOPTS) -i $(BUILDDIR) -s $(ZONESRCDIR) -d $(ZONEBLDDIR) $(<F)
-
-# copy the zone/pool.res file from the source folder to the build output folder
-# and swap it to native endianness
-$(ZONEBLDDIR)/pool.res: $(ZONESRCDIR)/pool.res
- $(INVOKE) $(TOOLBINDIR)/icupkg -t$(ICUDATA_CHAR) $(ZONESRCDIR)/pool.res $(ZONEBLDDIR)/pool.res
-
-$(ZONEBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(ZONE_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
- $(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(OUTTMPDIR)/$(ZONE_TREE) -d $(ZONEBLDDIR) $(INDEX_NAME).txt
-
-$(ZONE_INDEX_FILE): $(SRCLISTDEPS)
- @echo "generating $@ (list of installed time zone name locales)"; \
- $(RMV) $@; \
- echo "// Warning this file is automatically generated" > $@; \
- echo "$(INDEX_NAME):table(nofallback) {" >> $@; \
- echo " InstalledLocales {" >> $@; \
- for file in $(INSTALLED_ZONE_FILES); do \
- echo " $$file {\"\"}" >> $@; \
- done; \
- echo " }" >> $@; \
- echo "}" >> $@;
-
-### unit res
-$(UNITBLDDIR)/%.res: $(UNITSRCDIR)/%.txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES)
- $(INVOKE) $(TOOLBINDIR)/genrb --usePoolBundle $(GENRBOPTS) -i $(BUILDDIR) -s $(UNITSRCDIR) -d $(UNITBLDDIR) $(<F)
-
-# copy the unit/pool.res file from the source folder to the build output folder
-# and swap it to native endianness
-$(UNITBLDDIR)/pool.res: $(UNITSRCDIR)/pool.res
- $(INVOKE) $(TOOLBINDIR)/icupkg -t$(ICUDATA_CHAR) $(UNITSRCDIR)/pool.res $(UNITBLDDIR)/pool.res
-
-$(UNITBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(UNIT_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT)
- $(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(OUTTMPDIR)/$(UNIT_TREE) -d $(UNITBLDDIR) $(INDEX_NAME).txt
-
-$(UNIT_INDEX_FILE): $(SRCLISTDEPS)
- @echo "generating $@ (list of installed time zone name locales)"; \
- $(RMV) $@; \
- echo "// Warning this file is automatically generated" > $@; \
- echo "$(INDEX_NAME):table(nofallback) {" >> $@; \
- echo " InstalledLocales {" >> $@; \
- for file in $(INSTALLED_UNIT_FILES); do \
- echo " $$file {\"\"}" >> $@; \
- done; \
- echo " }" >> $@; \
- echo "}" >> $@;
-
-### collation res
-$(COLBLDDIR)/%.res: $(COLSRCDIR)/%.txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES) | $(BUILDDIR)/cnvalias.icu
- $(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(COLSRCDIR) -d $(COLBLDDIR) $(<F)
-
-$(COLBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(COLLATION_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
- $(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(OUTTMPDIR)/$(COLLATION_TREE) -d $(COLBLDDIR) $(INDEX_NAME).txt
-
-$(COLLATION_INDEX_FILE): $(SRCLISTDEPS)
- @echo "generating $@ (list of installed collation locales)"; \
- $(RMV) $@; \
- echo "// Warning this file is automatically generated" > $@; \
- echo "$(INDEX_NAME):table(nofallback) {" >> $@; \
- echo " InstalledLocales {" >> $@; \
- for file in $(INSTALLED_COL_FILES); do \
- echo " $$file {\"\"}" >> $@; \
- done; \
- echo " }" >> $@; \
- echo "}" >> $@;
-
-### brk res
-$(BRKBLDDIR)/%.res: $(BRKSRCDIR)/%.txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(BRK_FILES) $(DICT_FILES) $(DAT_FILES) | $(BUILDDIR)/cnvalias.icu
- $(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(BRKSRCDIR) -d $(BRKBLDDIR) $(<F)
-
-$(BRKBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(BREAK_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
- $(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(OUTTMPDIR)/$(BREAK_TREE) -d $(BRKBLDDIR) $(INDEX_NAME).txt
-
-$(BRK_RES_INDEX_FILE): $(SRCLISTDEPS)
- @echo "generating $@ (list of installed break locales)"; \
- $(RMV) $@; \
- echo "// Warning this file is automatically generated" > $@; \
- echo "$(INDEX_NAME):table(nofallback) {" >> $@; \
- echo " InstalledLocales {" >> $@; \
- for file in $(INSTALLED_BRS_FILES); do \
- echo " $$file {\"\"}" >> $@; \
- done; \
- echo " }" >> $@; \
- echo "}" >> $@;
-
-### RBNF res
-$(RBNFBLDDIR)/%.res: $(RBNFSRCDIR)/%.txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES) | $(BUILDDIR)/cnvalias.icu
- $(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(RBNFSRCDIR) -d $(RBNFBLDDIR) $(<F)
-
-$(RBNFBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(RBNF_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
- $(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(OUTTMPDIR)/$(RBNF_TREE) -d $(RBNFBLDDIR) $(INDEX_NAME).txt
-
-$(RBNF_INDEX_FILE): $(SRCLISTDEPS)
- @echo "generating $@ (list of installed RBNF locales)"; \
- $(RMV) $@; \
- echo "// Warning this file is automatically generated" > $@; \
- echo "$(INDEX_NAME):table(nofallback) {" >> $@; \
- echo " InstalledLocales {" >> $@; \
- for file in $(INSTALLED_RBNF_FILES); do \
- echo " $$file {\"\"}" >> $@; \
- done; \
- echo " }" >> $@; \
- echo "}" >> $@;
-
-### TRANSLIT res
-$(TRANSLITBLDDIR)/%.res: $(TRANSLITSRCDIR)/%.txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES) | $(BUILDDIR)/cnvalias.icu
- $(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(TRANSLITSRCDIR) -d $(TRANSLITBLDDIR) $(<F)
-
-### normal (locale) res
-all-RES: $(RES_FILES)
-
-$(BUILDDIR)/%.res: $(LOCSRCDIR)/%.txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES) | $(BUILDDIR)/cnvalias.icu
- $(INVOKE) $(TOOLBINDIR)/genrb --usePoolBundle $(GENRBOPTS) -i $(BUILDDIR) -s $(LOCSRCDIR) -d $(BUILDDIR) $(<F)
-
-# copy the locales/pool.res file from the source folder to the build output folder
-# and swap it to native endianness
-$(BUILDDIR)/pool.res: $(LOCSRCDIR)/pool.res
- $(INVOKE) $(TOOLBINDIR)/icupkg -t$(ICUDATA_CHAR) $(LOCSRCDIR)/pool.res $(BUILDDIR)/pool.res
-
# if the tzcode directory contains a new tzdata*.tar.gz file, use it for zoneinfo
ifeq ($(TZDATA),)
TZDATA = $(firstword $(wildcard $(top_builddir)/tools/tzcode/tzdata*.tar.gz) $(wildcard $(top_srcdir)/tools/tzcode/tzdata*.tar.gz))
endif
+# TODO(ICU-20466): Make the TZDATA override part of Python icutools.databuilder
ifneq ($(TZDATA),)
TZCODE_DIR=$(top_builddir)/tools/tzcode
@@ -809,39 +286,6 @@ $(ZONEINFO): $(TZDATA)
# end of zoneinfo-generation
endif
-# zoneinfo has some issues. Ignore some warnings with -q
-$(BUILDDIR)/%.res: $(MISCSRCDIR)/%.txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
- $(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -q -i $(BUILDDIR) -s $(MISCSRCDIR) -d $(BUILDDIR) $(<F)
-
-
-
-$(INDEX_FILE): $(SRCLISTDEPS)
- @echo "generating $@ (list of installed locales)"; \
- $(RMV) $@; \
- echo "// Warning this file is automatically generated" > $@; \
- echo "$(INDEX_NAME):table(nofallback) {" >> $@; \
- echo " CLDRVersion { \"$(GENRB_CLDR_VERSION)\" }" >> $@; \
- echo " InstalledLocales {" >> $@; \
- for file in $(INSTALLED_RB_FILES); do \
- echo " $$file {\"\"}" >> $@; \
- done; \
- echo " }" >> $@; \
- echo "}" >> $@;
-
-clean-resindex:
- -$(RMV) $(BUILDDIR)/$(INDEX_NAME).txt $(PKGDATA_LIST)
-
-$(BUILDDIR)/$(INDEX_NAME).res: $(INDEX_FILE) $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
- $(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -d $(BUILDDIR) $(INDEX_FILE)
-
-# The core Unicode properties files (pnames.icu, uprops.icu, ucase.icu, ubidi.icu)
-# are hardcoded in the common DLL and therefore not included in the data package any more.
-# They are not built by default but need to be built for ICU4J data and for getting the .c source files
-# when updating the Unicode data.
-uni-core-data: build-dir $(UNI_CORE_TARGET_DATA)
- @echo Unicode .icu files built to $(BUILDDIR)
- echo timestamp > $@
-
# Build the ICU4J icudata.jar.
# Command line:
# (Run this from the output data folder which may not be .../source/data in an out-of-source build.)
@@ -858,11 +302,10 @@ ICU4J_DATA_DIRNAME=com/ibm/icu/impl/data/$(ICUDATA_BASENAME_VERSION)b
ICU4J_TZDATA_PATHS=$(ICU4J_TZDATA_FILES:%="$(ICU4J_DATA_DIRNAME)/%.res")
# generate icu4j-related data to $(OUTDIR)/icu4j/com/ibm/icu/impl/data/...
-generate-data: build-dir packagedata $(OUTTMPDIR)/$(ICUDATA_PLATFORM_NAME).dat uni-core-data
+generate-data: packagedata $(OUTTMPDIR)/$(ICUDATA_PLATFORM_NAME).dat
mkdir -p $(OUTDIR)/icu4j/$(ICU4J_DATA_DIRNAME)
mkdir -p $(OUTDIR)/icu4j/tzdata/$(ICU4J_DATA_DIRNAME)
- echo $(UNI_CORE_DATA) > $(OUTDIR)/icu4j/add.txt
- $(INVOKE) $(TOOLBINDIR)/icupkg $(OUTTMPDIR)/$(ICUDATA_PLATFORM_NAME).dat $(OUTDIR)/icu4j/$(ICUDATA_BASENAME_VERSION)b.dat -a $(OUTDIR)/icu4j/add.txt -s $(BUILDDIR) -x '*' -tb -d $(OUTDIR)/icu4j/$(ICU4J_DATA_DIRNAME)
+ $(INVOKE) $(TOOLBINDIR)/icupkg $(OUTTMPDIR)/$(ICUDATA_PLATFORM_NAME).dat $(OUTDIR)/icu4j/$(ICUDATA_BASENAME_VERSION)b.dat -s $(BUILDDIR) -x '*' -tb -d $(OUTDIR)/icu4j/$(ICU4J_DATA_DIRNAME)
mv $(ICU4J_TZDATA_PATHS:%=$(OUTDIR)/icu4j/%) "$(OUTDIR)/icu4j/tzdata/$(ICU4J_DATA_DIRNAME)"
$(OUTDIR)/icu4j/icutzdata.jar: generate-data
@@ -873,7 +316,10 @@ $(OUTDIR)/icu4j/icutzdata.jar: generate-data
# - swap the ICU data
# - extract all data items
# - package them into the .jar file
-$(OUTDIR)/icu4j/icudata.jar: generate-data
+# TODO(ICU-20466): Move this to Python
+# NOTE: If you get the error "No rule to make target 'out/build/icudt64l/uprops.icu'",
+# you need to reconfigure with unicore data. See icu4j-readme.txt
+$(OUTDIR)/icu4j/icudata.jar: generate-data | $(OUT_DIR)/uprops.icu
$(JAR) cf $(OUTDIR)/icu4j/icudata.jar -C $(OUTDIR)/icu4j $(ICU4J_DATA_DIRNAME)/
ICU4J_DATA=$(OUTDIR)/icu4j/icudata.jar
diff --git a/Build/source/libs/icu/icu-src/source/data/build.xml b/Build/source/libs/icu/icu-src/source/data/build.xml
index 20f7b5be2de..9d0fa70bfb9 100644
--- a/Build/source/libs/icu/icu-src/source/data/build.xml
+++ b/Build/source/libs/icu/icu-src/source/data/build.xml
@@ -27,7 +27,7 @@
<condition property="is.cldr.dir.set" >
<isset property="env.CLDR_DIR" />
</condition >
- <fail unless="is.cldr.dir.set" message="Please set the CLDR_DIR environment variable to the top level ICU source dir (containing 'common')."/>
+ <fail unless="is.cldr.dir.set" message="Please set the CLDR_DIR environment variable to the top level CLDR source dir (containing 'common')."/>
<available property="cldrtools.dir" value="${env.CLDR_DIR}/cldr-tools" file="${env.CLDR_DIR}/cldr-tools" type="dir"/>
<available property="cldrtools.dir" value="${env.CLDR_DIR}/tools/java" file="${env.CLDR_DIR}/tools/java" type="dir"/>
@@ -43,12 +43,19 @@
</condition>
<fail unless="is.cldr.classes.set" message="CLDR classes not found in ${cldrtools.dir}. Please either set the CLDR_CLASSES environment variable or build cldr.jar."/>
- <echo message="java home: ${java.home}"/>
+ <property name="env.CLDR_TMP_DIR" location="${env.CLDR_DIR}/../cldr-aux" /> <!-- Hack: see CLDRPaths -->
+ <property name="cldr.prod.dir" location="${env.CLDR_TMP_DIR}/production/" />
+ <echo message="java home: ${java.home}"/>
<echo message="java version: ${java.version}"/>
<echo message="ant java version: ${ant.java.version}"/>
<echo message="${ant.version}"/>
+ <echo message="cldr tools dir: ${cldrtools.dir}"/>
+ <echo message="cldr tools jar: ${cldrtools.jar}"/>
+ <echo message="cldr tools classes: ${env.CLDR_CLASSES}"/>
+ <echo message="CLDR_TMP_DIR: ${env.CLDR_TMP_DIR} "/>
+ <echo message="cldr.prod.dir (production data): ${cldr.prod.dir}"/>
</target>
- <target name="setup">
+ <target name="setup" depends="init">
<taskdef name="cldr-build" classname="org.unicode.cldr.ant.CLDRBuild">
<classpath>
<pathelement path="${java.class.path}/"/>
@@ -57,11 +64,31 @@
<fileset dir="${cldrtools.dir}/libs" includes="*.jar"/>
</classpath>
</taskdef>
+ <mkdir dir="${env.CLDR_TMP_DIR}"/> <!-- make sure parent dir exists -->
+ <condition property="cldrprod.exists">
+ <available file="${cldr.prod.dir}" type="dir"/>
+ </condition>
+ </target>
+
+ <target name="cleanprod" depends="init, setup" if="cldrprod.exists">
+ <delete dir="${cldr.prod.dir}" />
</target>
+ <target name="proddata" depends="init,setup" unless="cldrprod.exists">
+ <echo message="Rebuilding ${cldr.prod.dir} - takes a while!"/>
+
+ <!-- setup prod data -->
+ <java fork="true" jar="${cldrtools.jar}">
+ <arg value="org.unicode.cldr.tool.GenerateProductionData" /> <!-- change to short alias 'proddata' or similar when annotated -->
+ <arg value="-v" />
+ <!-- TODO: for now, we just let the default source/target paths used.
+ could set '-s' / '-d' for explicit source/dest -->
+ </java>
+ </target>
+
<!-- target for generating ICU data -->
<target name="all" depends="locales, collation, rbnf, supplementalData, metadata, metaZones, windowsZones, likelySubtags, plurals, pluralRanges, numberingSystems, translit, brkitr, keyTypeData, genderList, dayPeriods" />
<!-- parallel target -->
- <target name="pall" depends="init">
+ <target name="pall" depends="init,setup,proddata">
<parallel threadsPerProcessor ="1">
<sequential>
<ant target='locales' />
@@ -98,22 +125,23 @@
</parallel>
</target>
- <target name="locales" depends="init,setup" description="builds locale files in ICU text format">
+ <target name="locales" depends="init,setup,proddata" description="builds locale files in ICU text format">
<cldr-build toolName="org.unicode.cldr.icu.NewLdml2IcuConverter" srcFile=".*xml" destFile=".*txt">
<!-- launch the tool and generate the data after reading the config file -->
<run>
<args>
- <arg name="--sourcedir" value="${env.CLDR_DIR}/common/main" />
+ <arg name="--sourcedir" value="${cldr.prod.dir}/common/main" />
<arg name="--destdir" value="${env.ICU4C_DIR}/source/data/locales"/>
<arg name="--specialsdir" value="${env.ICU4C_DIR}/source/data/xml/main"/>
- <arg name="--supplementaldir" value="${env.CLDR_DIR}/common/supplemental" />
+ <arg name="--supplementaldir" value="${cldr.prod.dir}/common/supplemental" />
<arg name="--type" value="locales"/>
- <arg name="--makefile" value="resfiles.mk"/>
+ <arg name="--depgraphfile" value="../../python/icutools/databuilder/locale_dependencies.py"/>
</args>
<remapper>
<remap sourcePath="/Keys" targetDir="lang" />
<remap sourcePath="/Languages" targetDir="lang" />
<remap sourcePath="/Languages%long" targetDir="lang" />
+ <remap sourcePath="/Languages%menu" targetDir="lang" />
<remap sourcePath="/Languages%short" targetDir="lang" />
<remap sourcePath="/Languages%secondary" targetDir="lang" />
<remap sourcePath="/Languages%variant" targetDir="lang" />
@@ -133,6 +161,7 @@
<remap sourcePath="/Countries%variant" targetDir="region" />
<remap sourcePath="/Countries%short" targetDir="region" />
<remap sourcePath="/Currencies" targetDir="curr" />
+ <remap sourcePath="/Currencies%formal" targetDir="curr" />
<remap sourcePath="/Currencies%narrow" targetDir="curr" />
<remap sourcePath="/Currencies%variant" targetDir="curr" />
<remap sourcePath="/CurrencyPlurals" targetDir="curr" />
@@ -150,15 +179,14 @@
</run>
</cldr-build>
</target>
- <target name="collation" depends="init,setup" description="builds collation files in ICU text format">
+ <target name="collation" depends="init,setup,proddata" description="builds collation files in ICU text format">
<cldr-build toolName="org.unicode.cldr.icu.NewLdml2IcuConverter" srcFile=".*xml" destFile=".*txt">
<run>
<args>
- <arg name="--sourcedir" value="${env.CLDR_DIR}/common/collation" />
+ <arg name="--sourcedir" value="${cldr.prod.dir}/common/collation" />
<arg name="--destdir" value="${env.ICU4C_DIR}/source/data/coll"/>
<arg name="--specialsdir" value="${env.ICU4C_DIR}/source/data/xml/collation"/>
<arg name="--type" value="collation"/>
- <arg name="--makefile" value="colfiles.mk"/>
</args>
<!-- http://ant.apache.org/faq.html#xml-entity-include -->
&icu-config;
@@ -166,15 +194,14 @@
</run>
</cldr-build>
</target>
- <target name="rbnf" depends="init,setup" description="builds rbnf files in ICU text format">
+ <target name="rbnf" depends="init,setup,proddata" description="builds rbnf files in ICU text format">
<cldr-build toolName="org.unicode.cldr.icu.NewLdml2IcuConverter" srcFile=".*xml" destFile=".*txt">
<run>
<args>
- <arg name="--sourcedir" value="${env.CLDR_DIR}/common/rbnf" />
+ <arg name="--sourcedir" value="${cldr.prod.dir}/common/rbnf" />
<arg name="--destdir" value="${env.ICU4C_DIR}/source/data/rbnf"/>
<arg name="--specialsdir" value="${env.ICU4C_DIR}/source/data/xml/rbnf"/>
<arg name="--type" value="rbnf" />
- <arg name="--makefile" value="rbnffiles.mk"/>
</args>
<!-- http://ant.apache.org/faq.html#xml-entity-include -->
&icu-config;
@@ -182,12 +209,12 @@
</run>
</cldr-build>
</target>
- <target name="supplementalData" depends="init,setup" description="builds supplementalData.txt from supplementalData.xml">
+ <target name="supplementalData" depends="init,setup,proddata" description="builds supplementalData.txt from supplementalData.xml">
<cldr-build toolName="org.unicode.cldr.icu.NewLdml2IcuConverter" destFile="supplementalData.txt" noArgs="true">
<!-- launch the tool and generate the data after reading the config file -->
<run>
<args>
- <arg name="-s" value="${env.CLDR_DIR}/common/supplemental" />
+ <arg name="-s" value="${cldr.prod.dir}/common/supplemental" />
<arg name="-d" value="${env.ICU4C_DIR}/source/data/misc"/>
<arg name="-t" value="supplementalData"/>
</args>
@@ -198,123 +225,122 @@
</run>
</cldr-build>
</target>
- <target name="metadata" depends="init,setup" description="builds metadata.txt from supplementalMetadata.xml">
+ <target name="metadata" depends="init,setup,proddata" description="builds metadata.txt from supplementalMetadata.xml">
<cldr-build toolName="org.unicode.cldr.icu.NewLdml2IcuConverter" destFile="metadata.txt" noArgs="true">
<!-- launch the tool and generate the data after reading the config file -->
<run>
<args>
- <arg name="-s" value="${env.CLDR_DIR}/common/supplemental" />
+ <arg name="-s" value="${cldr.prod.dir}/common/supplemental" />
<arg name="-d" value="${env.ICU4C_DIR}/source/data/misc"/>
<arg name="-t" value="metadata"/>
</args>
</run>
</cldr-build>
</target>
- <target name="metaZones" depends="init,setup" description="builds metaZones.txt from metaZones.xml">
+ <target name="metaZones" depends="init,setup,proddata" description="builds metaZones.txt from metaZones.xml">
<cldr-build toolName="org.unicode.cldr.icu.NewLdml2IcuConverter" destFile="metaZones.txt" noArgs="true">
<!-- launch the tool and generate the data after reading the config file -->
<run>
<args>
- <arg name="-s" value="${env.CLDR_DIR}/common/supplemental" />
+ <arg name="-s" value="${cldr.prod.dir}/common/supplemental" />
<arg name="-d" value="${env.ICU4C_DIR}/source/data/misc"/>
<arg name="-t" value="metaZones"/>
</args>
</run>
</cldr-build>
</target>
- <target name="windowsZones" depends="init,setup" description="builds windowsZones.txt from windowsZones.xml">
+ <target name="windowsZones" depends="init,setup,proddata" description="builds windowsZones.txt from windowsZones.xml">
<cldr-build toolName="org.unicode.cldr.icu.NewLdml2IcuConverter" destFile="windowsZones.txt" noArgs="true">
<!-- launch the tool and generate the data after reading the config file -->
<run>
<args>
- <arg name="-s" value="${env.CLDR_DIR}/common/supplemental" />
+ <arg name="-s" value="${cldr.prod.dir}/common/supplemental" />
<arg name="-d" value="${env.ICU4C_DIR}/source/data/misc"/>
<arg name="-t" value="windowsZones"/>
</args>
</run>
</cldr-build>
</target>
- <target name="likelySubtags" depends="init,setup" description="builds likelySubtags.txt from likelySubtags.xml">
+ <target name="likelySubtags" depends="init,setup,proddata" description="builds likelySubtags.txt from likelySubtags.xml">
<cldr-build toolName="org.unicode.cldr.icu.NewLdml2IcuConverter" destFile="likelySubtags.txt" noArgs="true">
<!-- launch the tool and generate the data after reading the config file -->
<run>
<args>
- <arg name="-s" value="${env.CLDR_DIR}/common/supplemental" />
+ <arg name="-s" value="${cldr.prod.dir}/common/supplemental" />
<arg name="-d" value="${env.ICU4C_DIR}/source/data/misc"/>
<arg name="-t" value="likelySubtags"/>
</args>
</run>
</cldr-build>
</target>
- <target name="plurals" depends="init,setup" description="builds plurals.txt from plurals.xml">
+ <target name="plurals" depends="init,setup,proddata" description="builds plurals.txt from plurals.xml">
<cldr-build toolName="org.unicode.cldr.icu.NewLdml2IcuConverter" destFile="plurals.txt" noArgs="true">
<!-- launch the tool and generate the data after reading the config file -->
<run>
<args>
- <arg name="-s" value="${env.CLDR_DIR}/common/supplemental" />
+ <arg name="-s" value="${cldr.prod.dir}/common/supplemental" />
<arg name="-d" value="${env.ICU4C_DIR}/source/data/misc"/>
<arg name="-t" value="plurals"/>
</args>
</run>
</cldr-build>
</target>
- <target name="pluralRanges" depends="init,setup" description="builds pluralRanges.txt from pluralRanges.xml">
+ <target name="pluralRanges" depends="init,setup,proddata" description="builds pluralRanges.txt from pluralRanges.xml">
<cldr-build toolName="org.unicode.cldr.icu.NewLdml2IcuConverter" destFile="pluralRanges.txt" noArgs="true">
<!-- launch the tool and generate the data after reading the config file -->
<run>
<args>
- <arg name="-s" value="${env.CLDR_DIR}/common/supplemental" />
+ <arg name="-s" value="${cldr.prod.dir}/common/supplemental" />
<arg name="-d" value="${env.ICU4C_DIR}/source/data/misc"/>
<arg name="-t" value="pluralRanges"/>
</args>
</run>
</cldr-build>
</target>
- <target name="numberingSystems" depends="init,setup" description="builds numberingSystems.txt from numberingSystems.xml">
+ <target name="numberingSystems" depends="init,setup,proddata" description="builds numberingSystems.txt from numberingSystems.xml">
<cldr-build toolName="org.unicode.cldr.icu.NewLdml2IcuConverter" destFile="numberingSystems.txt" noArgs="true">
<!-- launch the tool and generate the data after reading the config file -->
<run>
<args>
- <arg name="-s" value="${env.CLDR_DIR}/common/supplemental" />
+ <arg name="-s" value="${cldr.prod.dir}/common/supplemental" />
<arg name="-d" value="${env.ICU4C_DIR}/source/data/misc"/>
<arg name="-t" value="numberingSystems"/>
</args>
</run>
</cldr-build>
</target>
- <target name="genderList" depends="init,setup" description="builds genderList.txt from genderList.xml">
+ <target name="genderList" depends="init,setup,proddata" description="builds genderList.txt from genderList.xml">
<cldr-build toolName="org.unicode.cldr.icu.NewLdml2IcuConverter" destFile="genderList.txt" noArgs="true">
<!-- launch the tool and generate the data after reading the config file -->
<run>
<args>
- <arg name="-s" value="${env.CLDR_DIR}/common/supplemental" />
+ <arg name="-s" value="${cldr.prod.dir}/common/supplemental" />
<arg name="-d" value="${env.ICU4C_DIR}/source/data/misc"/>
<arg name="-t" value="genderList"/>
</args>
</run>
</cldr-build>
</target>
- <target name="dayPeriods" depends="init,setup" description="builds dayPeriods.txt from dayPeriods.xml">
+ <target name="dayPeriods" depends="init,setup,proddata" description="builds dayPeriods.txt from dayPeriods.xml">
<cldr-build toolName="org.unicode.cldr.icu.NewLdml2IcuConverter" destFile="dayPeriods.txt" noArgs="true">
<!-- launch the tool and generate the data after reading the config file -->
<run>
<args>
- <arg name="-s" value="${env.CLDR_DIR}/common/supplemental" />
+ <arg name="-s" value="${cldr.prod.dir}/common/supplemental" />
<arg name="-d" value="${env.ICU4C_DIR}/source/data/misc"/>
<arg name="-t" value="dayPeriods"/>
</args>
</run>
</cldr-build>
</target>
- <target name="brkitr" depends="init,setup" description="builds break iterator files in ICU text format">
+ <target name="brkitr" depends="init,setup,proddata" description="builds break iterator files in ICU text format">
<cldr-build toolName="org.unicode.cldr.icu.NewLdml2IcuConverter" srcFile=".*xml" destFile=".*txt">
<run>
<args>
- <arg name="--sourcedir" value="${env.CLDR_DIR}/common/segments"/>
+ <arg name="--sourcedir" value="${cldr.prod.dir}/common/segments"/>
<arg name="--specialsdir" value="${env.ICU4C_DIR}/source/data/xml/brkitr"/>
<arg name="--destdir" value="${env.ICU4C_DIR}/source/data/brkitr"/>
<arg name="--type" value="brkitr" />
- <arg name="--makefile" value="brkfiles.mk"/>
</args>
<!-- The entity include is not required for this target -->
<!-- http://ant.apache.org/faq.html#xml-entity-include
@@ -324,11 +350,11 @@
</cldr-build>
</target>
- <target name="keyTypeData" depends="init,setup" description="builds keyTypeData.txt and timezoneTypes.txt from bcp47/*.xml">
+ <target name="keyTypeData" depends="init,setup,proddata" description="builds keyTypeData.txt and timezoneTypes.txt from bcp47/*.xml">
<cldr-build toolName="org.unicode.cldr.icu.NewLdml2IcuConverter" noArgs="true">
<run>
<args>
- <arg name="-s" value="${env.CLDR_DIR}/common/bcp47" />
+ <arg name="-s" value="${cldr.prod.dir}/common/bcp47" />
<arg name="-d" value="${env.ICU4C_DIR}/source/data/misc"/>
<arg name="-t" value="keyTypeData"/>
</args>
@@ -336,12 +362,12 @@
</cldr-build>
</target>
- <target name="translit" depends="init,setup" description="builds collation files in ICU text format">
+ <target name="translit" depends="init,setup,proddata" description="builds collation files in ICU text format">
<cldr-build toolName="org.unicode.cldr.icu.ConvertTransforms" srcFile=".*xml" destFile=".*txt">
<run>
<args>
<arg name="-m" value="((?!.*(Canadian|Ethiopic|ug-Latin).*).*)" />
- <arg name="--sourcedir" value="${env.CLDR_DIR}/common/transforms" />
+ <arg name="--sourcedir" value="${cldr.prod.dir}/common/transforms" />
<arg name="--destdir" value="${env.ICU4C_DIR}/source/data/translit"/>
<arg name="--commentSkip"/>
<arg name="--approvedOnly"/>
@@ -353,11 +379,11 @@
</target>
<!-- we don't generate en.txt or el.txt - so don't change trnsfiles.mk for now. -->
<!--
- <target name="trnsfiles" depends="init, setup" description="builds trnsfiles.mk">
+ <target name="trnsfiles" depends="init, setup,proddata" description="builds trnsfiles.mk">
<cldr-build toolName="org.unicode.cldr.icu.ConvertTransforms" srcFile=".*xml" destFile="trnsfiles.mk" noArgs="true">
<run>
<args> [ double hyphen not allowed in comments - transpose -" to fix below ]
- <arg name=-"-sourcedir" value="${env.CLDR_DIR}/common/transforms" />
+ <arg name=-"-sourcedir" value="${cldr.prod.dir}/common/transforms" />
<arg name=-"-destdir" value="${env.ICU4C_DIR}/source/data/translit"/>
<arg name=-"-commentSkip"/>
<arg name=-"-writeIndex"/>
@@ -365,7 +391,7 @@
</run>
</cldr-build>
</target> -->
- <target name="clean" depends="init, setup" description="deletes all txt files and mk files from coll and locales directories">
+ <target name="clean" depends="init, setup, cleanprod" description="deletes all txt files and mk files from coll and locales directories">
<delete>
<fileset id="locales" dir="${env.ICU4C_DIR}/source/data/locales">
<include name="*.txt" />
@@ -373,6 +399,9 @@
<fileset id="resfiles" dir="${env.ICU4C_DIR}/source/data/locales">
<include name="resfiles.mk" />
</fileset>
+ <fileset id="dependencies_py" dir="${env.ICU4C_DIR}/source/python/icutools/databuilder">
+ <include name="locale_dependencies.py" />
+ </fileset>
<fileset id="locales_split" dir="${env.ICU4C_DIR}/source/data">
<include name="curr/*.txt" />
<include name="curr/resfiles.mk" />
diff --git a/Build/source/libs/icu/icu-src/source/data/cldr-icu-readme.txt b/Build/source/libs/icu/icu-src/source/data/cldr-icu-readme.txt
index 717d11962e7..6d194416199 100644
--- a/Build/source/libs/icu/icu-src/source/data/cldr-icu-readme.txt
+++ b/Build/source/libs/icu/icu-src/source/data/cldr-icu-readme.txt
@@ -20,10 +20,6 @@
# ICU is the version number and/or a CLDR svn tag name for the revision of CLDR
# that was the source of the data for that release of ICU.
#
-# Note: Some versions of the OpenJDK will not build the CLDR java utilities.
-# If you see compilation errors complaining about type incompatibilities with
-# functions on generic classes, try switching to the Sun JDK.
-#
# Besides a standard JDK, the process also requires ant
# (http://ant.apache.org/),
# plus the xml-apis.jar from the Apache xalan package
@@ -39,21 +35,6 @@
#
#----
#
-# IP address whitelisting
-#
-# Parts of the build process (notably building the new ICU data files in step 4)
-# require http: access to files in the CLDR repository; for example, processing
-# the files in icu4c/source/data/xml/ may require access to
-# http://www.unicode.org/repos/cldr/trunk/common/dtd/ldml.dtd
-#
-# Unless you cache the dtds locally by e.g. setting -DCLDR_DTD_CACHE=/tmp, the
-# builds will repeatedly make such requests, which will likely result in the
-# Unicode server blocking access and consequent timeout failures. You can
-# prevent such blockage by having the external IP address of your build system
-# whitelisted with Unicode; contact Rick McGowan or Steven Loomis.
-#
-#----
-#
# There are several environment variables that need to be defined.
#
# a) Java- and ant-related variables
@@ -64,18 +45,25 @@
#
# ANT_OPTS: You may want to set:
#
-# -Xmx3072m, to give Java more memory; otherwise it may run out
+# -Xmx4096m, to give Java more memory; otherwise it may run out
# of heap.
-# -DCLDR_DTD_CACHE=/tmp, to reduce frequent http: access to dtds
-# and consequent blockage by Unicode server.
#
# b) CLDR-related variables
#
# CLDR_DIR: Path to root of CLDR sources, below which are the common and
# tools directories.
-# CLDR_CLASSES: Defined relative to CLDR_DIR. It only needs to be set if you
-# are not running ant jar for CLDR and have a non-default output
-# folder for cldr-tools classes.
+# CLDR_CLASSES: Path to the CLDR Tools classes directory. If not set, defaults
+# to $CLDR_DIR/tools/java/classes
+#
+# CLDR_TMP_DIR: Parent of temporary CLDR production data.
+# Defaults to $CLDR_DIR/../cldr-aux (sibling to CLDR_DIR).
+#
+# *** NOTE ***: In CLDR release-36-beta, the GenerateProductionData
+# tool no longer generates data into $CLDR_TMP_DIR/production; instead
+# it generates data into $CLDR_DIR/../cldr-staging/production. However
+# the rest of the build still assumes that the generated data is in
+# $CLDR_TMP_DIR/production. So CLDR_TMP_DIR must be defined to be
+# $CLDR_DIR/../cldr-staging
#
# c) ICU-related variables
# These variables only need to be set if you're directly reusing the
@@ -107,6 +95,10 @@
# iterators, you need to update <fileset id="brkitr" ...> under
# <target name="clean" ...> to clean the correct set of files.
#
+# If there are new CLDR resource bundle types, you may need to
+# updated the <remapper> sections to put these in the correct
+# data subfolder for ICU.
+#
# icu4c/source/data/xml/ - If you are adding a new locale, break
# iterator, collation tailoring, or rule-based number formatter,
# you may need to add a corresponding xml file in (respectively)
@@ -127,6 +119,8 @@
# common/dtd/ldml.dtd - update cldrVersion
# common/dtd/ldmlBCP47.dtd - update cldrVersion
# common/dtd/ldmlSupplemental.dtd - update cldrVersion
+# common/dtd/ldmlSupplemental.dtd - updateunicodeVersion
+# keyboards/dtd/ldmlKeyboard.dtd - update cldrVersion
# tools/java/org/unicode/cldr/util/CLDRFile.java - update GEN_VERSION
#
# c) After everything is committed, you will need to tag the CLDR, ICU4J, and
@@ -138,34 +132,34 @@
# 1a. Java and ant variables, adjust for your system
export JAVA_HOME=`/usr/libexec/java_home`
-export ANT_OPTS="-Xmx3072m -DCLDR_DTD_CACHE=/tmp"
+export ANT_OPTS="-Xmx4096m
# 1b. CLDR variables, adjust for your setup; with cygwin it might be e.g.
# CLDR_DIR=`cygpath -wp /build/cldr`
-export CLDR_DIR=$HOME/cldr/trunk
-#export CLDR_CLASSES=$CLDR_DIR/tools/java/classes
+export CLDR_DIR=$HOME/cldr-myfork
# 1c. ICU variables
-export ICU4C_DIR=$HOME/icu/trunk/icu4c
-export ICU4J_ROOT=$HOME/icu/trunk/icu4j
+export ICU4C_DIR=$HOME/icu-myfork/icu4c
+export ICU4J_ROOT=$HOME/icu-myfork/icu4j
-# 2. Build the CLDR Java tools
+# 2. Build the CLDR Java tools and jar
cd $CLDR_DIR/tools/java
+ant all
ant jar
# 3. Configure ICU4C, build and test without new data first, to verify that
-# there are no pre-existing errors (configure shown here for MacOSX, adjust
-# for your platform).
+# there are no pre-existing errors. Here <platform> is the runConfigureICU
+# code for the platform you are building, e.g. Linux, MacOSX, Cygwin.
cd $ICU4C_DIR/source
-./runConfigureICU MacOSX
+./runConfigureICU <platform>
make all 2>&1 | tee /tmp/icu4c-oldData-makeAll.txt
make check 2>&1 | tee /tmp/icu4c-oldData-makeCheck.txt
-# 4. Build the new ICU4C data files; these include .txt files and .mk files.
+# 4. Build the new ICU4C data files; these include .txt files and .py files.
# These new files will replace whatever was already present in the ICU4C sources.
# This process uses ant with ICU's data/build.xml and data/icu-config.xml to
# operate (via CLDR's ant/CLDRConverterTool.java and ant/CLDRBuild.java) the
@@ -173,29 +167,27 @@ make check 2>&1 | tee /tmp/icu4c-oldData-makeCheck.txt
# This process will take several minutes.
# Keep a log so you can investigate anything that looks suspicious.
#
-# If you see timeout errors when building the rbnf data, for example, then the
-# system you are building on likely does not have its IP address whitelisted with
-# Unicode for access to the CLDR repository, see note on "IP address whitelisting"
-# near the top of this file.
+# Running "ant setup" is not required, but it will print useful errors to
+# debug issues with your path when it fails.
+#
cd $ICU4C_DIR/source/data
+ant setup
ant clean
ant all 2>&1 | tee /tmp/cldr-newData-buildLog.txt
+# NOTE: if you change the CLDR data, please run "ant cleanprod" to clean out the
+# temporary production data directory (usually $CLDR_DIR/../cldr-aux/production )
+
# 5. Check which data files have modifications, which have been added or removed
# (if there are no changes, you may not need to proceed further). Make sure the
# list seems reasonable.
git status
-# 6. Fix any errors, investigate any warnings. Some warnings are expected,
-# including warnings for missing versions in locale names which specify some
-# collationvariants, e.g.
-# [cldr-build] WARNING (ja_JP_TRADITIONAL): No version #??
-# [cldr-build] WARNING (zh_TW_STROKE): No version #??
-# and warnings for some empty collation bundles, e.g.
-# [cldr-build] WARNING (en): warning: No collations found. Bundle will ...
-# [cldr-build] WARNING (to): warning: No collations found. Bundle will ...
+# 6. Fix any errors, investigate any warnings. Currently for example there are
+# a few warnings of the following form in rbnf files:
+# [cldr-build] Warning: no version match with: $Revision☹$
#
# Fixing may entail modifying CLDR source data or tools - for example,
# updating the validSubLocales for collation data (file a bug if appropriate).
@@ -204,8 +196,13 @@ git status
# 7. Now rebuild ICU4C with the new data and run make check tests.
# Again, keep a log so you can investigate the errors.
-
cd $ICU4C_DIR/source
+
+# 7a. If any files were added or removed (likely), re-run configure:
+./runConfigureICU <platform>
+make clean
+
+# 7b. Now do the rebuild.
make check 2>&1 | tee /tmp/icu4c-newData-makeCheck.txt
# 8. Investigate each test case failure. The first run processing new CLDR data
@@ -238,9 +235,17 @@ cd $ICU4J_ROOT
ant all 2>&1 | tee /tmp/icu4j-oldData-antAll.txt
ant check 2>&1 | tee /tmp/icu4j-oldData-antCheck.txt
-# 12. Now build the new data and test data for ICU4J
+# 12. Transfer the data to ICU4J:
+cd $ICU4C_DIR/source
+
+# 12a. You need to reconfigure ICU4C to include the unicore data.
+ICU_DATA_BUILDTOOL_OPTS=--include_uni_core_data ./runConfigureICU <platform>
+# 12b. Now build the jar files.
cd $ICU4C_DIR/source/data
+# The following 2 lines are required to include the unicore data:
+ make clean
+ make -j6
make icu4j-data-install
cd $ICU4C_DIR/source/test/testdata
make icu4j-data-install
@@ -252,22 +257,33 @@ cd $ICU4J_ROOT
ant check 2>&1 | tee /tmp/icu4j-newData-antCheck.txt
# 14. Investigate test case failures; fix test cases and repeat from step 12,
-# or fix CLDR data and repeat from step 4, as appropriate, until; there are no
+# or fix CLDR data and repeat from step 4, as appropriate, until there are no
# more failures in ICU4C or ICU4J (except failures that were present before you
# began testing the new CLDR data).
-# 15. Check the file changes; then svn add or svn remove as necessary, and
+# Note that certain data changes and related test failures may require the
+# rebuilding of other kinds of data. For example:
+# a) Changes to locale matching data may cause failures in e.g. the following:
+# com.ibm.icu.dev.test.util.LocaleDistanceTest (testLoadedDataSameAsBuiltFromScratch)
+# com.ibm.icu.dev.test.util.LocaleMatcherTest (testLikelySubtagsLoadedDataSameAsBuiltFromScratch)
+# To address these requires building and running the tool
+# icu4j/tools/misc/src/com/ibm/icu/dev/tool/locale/LocaleDistanceBuilder.java
+# to regenerate the file icu4c/source/data/misc/langInfo.txt and then regenerating
+# the ICU4J data jars.
+# b) Changes to plurals data may cause failures in e.g. the following
+# com.ibm.icu.dev.test.format.PluralRulesTest (TestLocales)
+# To address these requires updating the LOCALE_SNAPSHOT data in
+# icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/PluralRulesTest.java
+# by modifying the TestLocales() test there to run generateLOCALE_SNAPSHOT() and then
+# copying in the updated data.
+
+# 15. Check the file changes; then git add or git rm as necessary, and
# commit the changes.
-cd $ICU4C_DIR/source
+cd $HOME/icu/
+cd ..
git status
# add or remove as necessary
-
-cd $ICU4J_ROOT
-git status
-# add or remove as necessary
-
-cd $HOME/icu/trunk/
# commit
# 16. For an official CLDR data integration into ICU, now tag the CLDR and
@@ -278,7 +294,7 @@ svn copy svn+ssh://unicode.org/repos/cldr/trunk \
svn+ssh://unicode.org/repos/cldr/tags/release-NNN \
--parents -m "cldrbug nnnn: tag cldr sources for NNN"
-svn copy svn+ssh://source.icu-project.org/repos/icu/trunk \
-svn+ssh://source.icu-project.org/repos/icu/tags/cldr-NNN \
---parents -m 'ticket:mmmm: tag the version used for integrating CLDR NNN'
+cd $HOME/icu/
+git tag ...
+
diff --git a/Build/source/libs/icu/icu-src/source/data/dtd/cldr-35.1/common/dtd/ldml.dtd b/Build/source/libs/icu/icu-src/source/data/dtd/cldr-35.1/common/dtd/ldml.dtd
new file mode 100644
index 00000000000..1a1961634f6
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/data/dtd/cldr-35.1/common/dtd/ldml.dtd
@@ -0,0 +1,3146 @@
+<!--
+Copyright © 2003-2019 Unicode, Inc. and others. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated documentation (the "Data Files") or Unicode software and any associated documentation (the "Software") to deal in the Data Files or Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Data Files or Software, and to permit persons to whom the Data Files or Software are furnished to do so, provided that (a) the above copyright notice(s) and this permission notice appear with all copies of the Data Files or Software, (b) both the above copyright notice(s) and this permission notice appear in associated documentation, and (c) there is clear notice in each modified Data File or in the Software as well as in the documentation associated with the Data File(s) or Software that the data or software has been modified.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder.
+$Revision$
+-->
+
+<!ELEMENT ldml ( identity, ( alias | ( fallback*, localeDisplayNames?, layout?, contextTransforms?, characters?, delimiters?, measurement?, dates?, numbers?, units?, listPatterns?, collations?, posix?, characterLabels?, segmentations?, rbnf?, typographicNames?, annotations?, metadata?, references?, special* ) ) ) >
+<!ATTLIST ldml version CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST ldml draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT identity ( alias | ( version, generation?, language, script?, territory?, variant?, special* ) ) >
+<!ATTLIST identity draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!-- ######################################################### -->
+<!-- # These elements are common to almost all elements defined -->
+
+<!ELEMENT alias ( special* ) >
+<!ATTLIST alias source NMTOKEN #REQUIRED >
+ <!--@MATCH:literal/locale-->
+ <!--@VALUE-->
+<!ATTLIST alias path CDATA #IMPLIED >
+ <!--@MATCH:regex/\.\..*-->
+ <!--@VALUE-->
+<!ATTLIST alias alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST alias draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT special ANY >
+
+<!ELEMENT version EMPTY >
+<!ATTLIST version number CDATA #REQUIRED >
+ <!--@MATCH:regex/\$Revision.*\$-->
+ <!--@METADATA-->
+<!ATTLIST version cldrVersion CDATA #FIXED "35.1" >
+ <!--@MATCH:any-->
+ <!--@VALUE-->
+<!ATTLIST version draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT generation EMPTY >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST generation date CDATA #REQUIRED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST generation draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT language ( #PCDATA ) >
+<!ATTLIST language type NMTOKEN #REQUIRED >
+ <!--@MATCH:validity/locale-->
+<!ATTLIST language alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/long, secondary, short, variant-->
+<!ATTLIST language draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST language references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT script ( #PCDATA ) >
+<!ATTLIST script type NMTOKEN #REQUIRED >
+ <!--@MATCH:validity/script-->
+<!ATTLIST script alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/secondary, short, stand-alone, variant-->
+<!ATTLIST script draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST script references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT territory ( #PCDATA ) >
+<!ATTLIST territory type NMTOKEN #REQUIRED >
+ <!--@MATCH:validity/region-->
+<!ATTLIST territory alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/short, variant-->
+<!ATTLIST territory draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST territory references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT variant ( #PCDATA ) >
+<!ATTLIST variant type NMTOKEN #REQUIRED >
+ <!--@MATCH:validity/variant-->
+<!ATTLIST variant alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/secondary, variant-->
+<!ATTLIST variant draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST variant references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT fallback ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST fallback alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST fallback draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST fallback references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT localeDisplayNames ( alias | ( localeDisplayPattern?, languages?, scripts?, territories?, subdivisions?, variants?, keys?, types?, transformNames?, measurementSystemNames?, codePatterns?, special* ) ) >
+<!ATTLIST localeDisplayNames draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT localeDisplayPattern ( alias | ( localePattern*, localeSeparator*, localeKeyTypePattern*, special* ) ) >
+<!ATTLIST localeDisplayPattern alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST localeDisplayPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST localeDisplayPattern references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT localePattern ( #PCDATA ) >
+<!ATTLIST localePattern alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST localePattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST localePattern references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT localeSeparator ( #PCDATA ) >
+<!ATTLIST localeSeparator alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST localeSeparator draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST localeSeparator references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT localeKeyTypePattern ( #PCDATA ) >
+<!ATTLIST localeKeyTypePattern alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST localeKeyTypePattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST localeKeyTypePattern references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!-- # Either 1 alias OR any specials, any order, zero or more language -->
+
+<!ELEMENT languages ( alias | ( language | special )* ) >
+<!ATTLIST languages draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST languages standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST languages references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST languages validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!-- # Either 1 alias OR any specials, any order, zero or more script -->
+
+<!ELEMENT scripts ( alias | ( script | special )* ) >
+<!ATTLIST scripts draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST scripts standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST scripts references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST scripts validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!-- # Either 1 alias OR any specials, any order, zero or more territory -->
+
+<!ELEMENT territories ( alias | ( territory | special )* ) >
+<!ATTLIST territories draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST territories standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST territories references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST territories validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT subdivisions ( alias | ( subdivision | special )* ) >
+<!ATTLIST subdivisions draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST subdivisions references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT subdivision ( #PCDATA ) >
+<!ATTLIST subdivision type NMTOKEN #REQUIRED >
+ <!--@MATCH:validity/subdivision-->
+<!ATTLIST subdivision alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST subdivision draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+
+<!-- # Either 1 alias OR any specials, any order, zero or more variant -->
+
+<!ELEMENT variants ( alias | ( variant | special )* ) >
+<!ATTLIST variants draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST variants standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST variants references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST variants validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!-- # Either 1 alias OR any specials, any order, zero or more key -->
+
+<!ELEMENT keys ( alias | ( key | special )* ) >
+<!ATTLIST keys draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST keys standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST keys references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST keys validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT key ( #PCDATA ) >
+<!ATTLIST key type NMTOKEN #REQUIRED >
+ <!--@MATCH:bcp47/anykey-->
+<!ATTLIST key alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST key draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST key references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!-- # Either 1 alias OR any specials, any order, zero or more type -->
+
+<!ELEMENT types ( alias | ( type | special )* ) >
+<!ATTLIST types draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST types standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST types references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST types validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT type ( #PCDATA ) >
+<!ATTLIST type key NMTOKEN #REQUIRED >
+ <!--@MATCH:bcp47/anykey-->
+<!ATTLIST type type NMTOKEN #REQUIRED >
+ <!--@MATCH:bcp47/anyvalue-->
+<!ATTLIST type alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/short, variant-->
+<!ATTLIST type draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST type references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT transformNames ( alias | ( transformName | special )* ) >
+ <!--@DEPRECATED-->
+<!ATTLIST transformNames draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST transformNames references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT transformName ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST transformName type NMTOKEN #REQUIRED >
+ <!--@DEPRECATED-->
+<!ATTLIST transformName alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST transformName draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST transformName references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!-- # Either 1 alias OR any specials, any order, zero or more measurementSystemName -->
+
+<!ELEMENT measurementSystemNames ( alias | ( measurementSystemName | special )* ) >
+<!ATTLIST measurementSystemNames draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST measurementSystemNames references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST measurementSystemNames validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT measurementSystemName ( #PCDATA ) >
+<!ATTLIST measurementSystemName type (US | metric | UK) #REQUIRED >
+<!ATTLIST measurementSystemName alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST measurementSystemName draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST measurementSystemName references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT codePatterns ( alias | ( codePattern | special )* ) >
+
+<!ELEMENT codePattern ( #PCDATA ) >
+<!ATTLIST codePattern type NMTOKEN #REQUIRED >
+ <!--@MATCH:literal/language, script, territory-->
+<!ATTLIST codePattern alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST codePattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST codePattern references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!-- ######################################################### -->
+<!-- # layout and orientation are script specific, so validSublocales attribute is not required -->
+
+<!ELEMENT layout ( alias | ( orientation*, inList*, inText*, special* ) ) >
+<!ATTLIST layout draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST layout references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT orientation ( alias | ( characterOrder*, lineOrder*, special* ) ) >
+<!ATTLIST orientation characters (left-to-right | right-to-left | top-to-bottom | bottom-to-top) #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST orientation lines (left-to-right | right-to-left | top-to-bottom | bottom-to-top) #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST orientation alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST orientation draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST orientation standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST orientation references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT characterOrder ( #PCDATA ) >
+<!ATTLIST characterOrder alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST characterOrder draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT lineOrder ( #PCDATA ) >
+<!ATTLIST lineOrder alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST lineOrder draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT inList ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST inList casing (titlecase-words | titlecase-firstword | lowercase-words | mixed) #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST inList alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST inList draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST inList references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT inText ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST inText type (languages | scripts | territories | variants | keys | types | measurementSystemNames | monthWidth | dayWidth | quarterWidth | long | fields | currency) #IMPLIED >
+ <!--@DEPRECATED-->
+<!ATTLIST inText alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST inText draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST inText references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT contextTransforms ( alias | ( contextTransformUsage*, special* ) ) >
+<!ATTLIST contextTransforms alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST contextTransforms draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST contextTransforms references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST contextTransforms validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT contextTransformUsage ( alias | ( contextTransform*, special* ) ) >
+<!ATTLIST contextTransformUsage type CDATA #REQUIRED >
+ <!--@MATCH:literal/calendar-field, currencyName, day-format-except-narrow, day-standalone-except-narrow, era-abbr, era-name, keyValue, languages, month-format-except-narrow, month-standalone-except-narrow, number-spellout, relative, script, typographicNames-->
+<!ATTLIST contextTransformUsage alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST contextTransformUsage draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST contextTransformUsage references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST contextTransformUsage validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT contextTransform ( #PCDATA ) >
+<!ATTLIST contextTransform type (uiListOrMenu | stand-alone) #REQUIRED >
+<!ATTLIST contextTransform alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST contextTransform draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST contextTransform references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT characters ( alias | ( exemplarCharacters*, ellipsis*, moreInformation*, stopwords*, indexLabels*, mapping*, parseLenients*, special* ) ) >
+<!ATTLIST characters draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT exemplarCharacters ( #PCDATA | cp )* >
+<!ATTLIST exemplarCharacters type (auxiliary | standard | punctuation | currencySymbol | index | numbers) #IMPLIED >
+ <!--@DEPRECATED:currencySymbol-->
+<!ATTLIST exemplarCharacters alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST exemplarCharacters draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST exemplarCharacters standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST exemplarCharacters references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST exemplarCharacters validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!-- # This element can occur anywhere there may be localizable data -->
+
+<!ELEMENT cp ( special* ) >
+ <!--@DEPRECATED-->
+<!ATTLIST cp hex NMTOKEN #REQUIRED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT ellipsis ( #PCDATA ) >
+<!ATTLIST ellipsis type (initial | medial | final | word-initial | word-medial | word-final) #IMPLIED >
+<!ATTLIST ellipsis alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST ellipsis draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST ellipsis references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT moreInformation ( #PCDATA ) >
+<!ATTLIST moreInformation alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST moreInformation draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST moreInformation references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT stopwords ( stopwordList* ) >
+ <!--@DEPRECATED-->
+
+<!ELEMENT stopwordList ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST stopwordList type NMTOKEN #REQUIRED >
+ <!--@DEPRECATED-->
+<!ATTLIST stopwordList alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST stopwordList draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST stopwordList references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT indexLabels ( indexSeparator*, compressedIndexSeparator*, indexRangePattern*, indexLabelBefore*, indexLabelAfter*, indexLabel* ) >
+ <!--@DEPRECATED-->
+
+<!ELEMENT indexSeparator ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST indexSeparator alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST indexSeparator draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST indexSeparator references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT compressedIndexSeparator ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST compressedIndexSeparator alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST compressedIndexSeparator draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST compressedIndexSeparator references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT indexRangePattern ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST indexRangePattern alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST indexRangePattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST indexRangePattern references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT indexLabelBefore ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST indexLabelBefore alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST indexLabelBefore draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST indexLabelBefore references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT indexLabelAfter ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST indexLabelAfter alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST indexLabelAfter draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST indexLabelAfter references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT indexLabel ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST indexLabel indexSource CDATA #IMPLIED >
+ <!--@DEPRECATED-->
+<!ATTLIST indexLabel priority (1 | 2 | 3) #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST indexLabel alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST indexLabel draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST indexLabel references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT mapping ( special* ) >
+ <!--@DEPRECATED-->
+<!ATTLIST mapping registry NMTOKEN #REQUIRED >
+ <!--@DEPRECATED-->
+<!ATTLIST mapping type NMTOKEN #IMPLIED >
+ <!-- use choice instead -->
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST mapping choice NMTOKEN #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST mapping alt NMTOKENS #IMPLIED >
+ <!--@DEPRECATED-->
+<!ATTLIST mapping draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST mapping standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST mapping references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST mapping validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT parseLenients ( alias | ( parseLenient*, special* ) ) >
+<!ATTLIST parseLenients scope (general | number | date) #REQUIRED >
+<!ATTLIST parseLenients level (lenient | stricter) #REQUIRED >
+
+<!ELEMENT parseLenient ( #PCDATA ) >
+<!ATTLIST parseLenient sample CDATA #REQUIRED >
+ <!--@MATCH:any-->
+<!ATTLIST parseLenient alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST parseLenient draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT delimiters ( alias | ( quotationStart*, quotationEnd*, alternateQuotationStart*, alternateQuotationEnd*, special* ) ) >
+<!ATTLIST delimiters alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST delimiters draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST delimiters standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST delimiters references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST delimiters validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT quotationStart ( #PCDATA | cp )* >
+<!ATTLIST quotationStart alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST quotationStart draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST quotationStart references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT quotationEnd ( #PCDATA | cp )* >
+<!ATTLIST quotationEnd alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST quotationEnd draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST quotationEnd references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT alternateQuotationStart ( #PCDATA | cp )* >
+<!ATTLIST alternateQuotationStart alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST alternateQuotationStart draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST alternateQuotationStart references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT alternateQuotationEnd ( #PCDATA | cp )* >
+<!ATTLIST alternateQuotationEnd alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST alternateQuotationEnd draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST alternateQuotationEnd references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT measurement ( alias | ( measurementSystem*, paperSize*, special* ) ) >
+ <!-- use measurementData in supplemental instead -->
+ <!--@DEPRECATED-->
+<!ATTLIST measurement alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST measurement draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST measurement standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST measurement references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST measurement validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT measurementSystem ( special* ) >
+ <!-- use measurementSystem in supplemental instead -->
+ <!--@DEPRECATED-->
+<!ATTLIST measurementSystem type (metric | US | UK) #REQUIRED >
+ <!-- use choice instead -->
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST measurementSystem choice (metric | US | UK) #IMPLIED >
+ <!-- really required, but needs to be optional to support type also -->
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST measurementSystem alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST measurementSystem draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST measurementSystem standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST measurementSystem references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST measurementSystem validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT paperSize ( alias | ( height*, width*, special* ) ) >
+ <!-- use paperSize in supplemental instead -->
+ <!--@DEPRECATED-->
+<!ATTLIST paperSize alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST paperSize draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST paperSize standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST paperSize references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST paperSize validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT height ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST height alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST height draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST height references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT width ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST width alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST width draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST width references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT dates ( alias | ( localizedPatternChars*, dateRangePattern*, calendars?, fields?, timeZoneNames?, special* ) ) >
+<!ATTLIST dates alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST dates draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dates standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dates references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST dates validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT localizedPatternChars ( #PCDATA | cp )* >
+ <!--@DEPRECATED-->
+<!ATTLIST localizedPatternChars alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST localizedPatternChars draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST localizedPatternChars standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST localizedPatternChars references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST localizedPatternChars validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT dateRangePattern ( #PCDATA ) >
+ <!-- use intervalFormats. -->
+ <!--@DEPRECATED-->
+<!ATTLIST dateRangePattern alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST dateRangePattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dateRangePattern standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dateRangePattern references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dateRangePattern validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT calendars ( alias | ( default*, calendar*, special* ) ) >
+ <!-- use calendarPreferenceData instead of default element -->
+<!ATTLIST calendars draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST calendars validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT default ( special* ) >
+ <!--@DEPRECATED-->
+<!ATTLIST default type NMTOKEN #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST default choice NMTOKEN #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST default alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST default draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST default references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT calendar ( alias | ( months?, monthNames?, monthAbbr?, monthPatterns?, days?, dayNames?, dayAbbr?, quarters?, week?, am*, pm*, dayPeriods?, eras?, cyclicNameSets?, dateFormats?, timeFormats?, dateTimeFormats?, fields*, special* ) ) >
+ <!-- use of fields is deprecated here -->
+<!ATTLIST calendar type NMTOKEN #REQUIRED >
+ <!--@MATCH:bcp47/ca-->
+<!ATTLIST calendar alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST calendar draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST calendar standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST calendar references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST calendar validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT months ( alias | ( default*, monthContext*, special* ) ) >
+<!ATTLIST months alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST months draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST months standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST months references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST months validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT monthContext ( alias | ( default*, monthWidth*, special* ) ) >
+<!ATTLIST monthContext type (format | stand-alone) #REQUIRED >
+<!ATTLIST monthContext alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST monthContext draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST monthContext standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST monthContext references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST monthContext validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT monthWidth ( alias | ( month*, special* ) ) >
+<!ATTLIST monthWidth type (abbreviated | narrow | wide) #REQUIRED >
+<!ATTLIST monthWidth alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST monthWidth draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST monthWidth standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST monthWidth references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST monthWidth validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT month ( #PCDATA | cp )* >
+<!ATTLIST month type (1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13) #REQUIRED >
+<!ATTLIST month yeartype (standard | leap) #IMPLIED >
+<!ATTLIST month alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST month draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST month references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT monthNames ( alias | ( month*, special* ) ) >
+ <!--@DEPRECATED-->
+<!ATTLIST monthNames draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT monthAbbr ( alias | ( month*, special* ) ) >
+ <!--@DEPRECATED-->
+<!ATTLIST monthAbbr draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT monthPatterns ( alias | ( monthPatternContext*, special* ) ) >
+<!ATTLIST monthPatterns alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST monthPatterns draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST monthPatterns references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST monthPatterns validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT monthPatternContext ( alias | ( monthPatternWidth*, special* ) ) >
+<!ATTLIST monthPatternContext type (format | stand-alone | numeric) #REQUIRED >
+<!ATTLIST monthPatternContext alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST monthPatternContext draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST monthPatternContext references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST monthPatternContext validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT monthPatternWidth ( alias | ( monthPattern*, special* ) ) >
+<!ATTLIST monthPatternWidth type (abbreviated | narrow | wide | all) #REQUIRED >
+<!ATTLIST monthPatternWidth alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST monthPatternWidth draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST monthPatternWidth references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST monthPatternWidth validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT monthPattern ( #PCDATA ) >
+<!ATTLIST monthPattern type (leap | standardAfterLeap | combined) #REQUIRED >
+<!ATTLIST monthPattern alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST monthPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST monthPattern references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT days ( alias | ( default*, dayContext*, special* ) ) >
+<!ATTLIST days alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST days draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST days standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST days references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST days validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT dayContext ( alias | ( default*, dayWidth*, special* ) ) >
+<!ATTLIST dayContext type (format | stand-alone) #REQUIRED >
+<!ATTLIST dayContext alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST dayContext draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dayContext standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dayContext references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST dayContext validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT dayWidth ( alias | ( day*, special* ) ) >
+<!ATTLIST dayWidth type (abbreviated | narrow | short | wide) #REQUIRED >
+<!ATTLIST dayWidth alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST dayWidth draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dayWidth standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dayWidth references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST dayWidth validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT day ( #PCDATA ) >
+<!ATTLIST day type (sun | mon | tue | wed | thu | fri | sat) #REQUIRED >
+<!ATTLIST day alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST day draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST day references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT dayNames ( alias | ( day*, special* ) ) >
+ <!--@DEPRECATED-->
+<!ATTLIST dayNames draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT dayAbbr ( alias | ( day*, special* ) ) >
+ <!--@DEPRECATED-->
+<!ATTLIST dayAbbr draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT quarters ( alias | ( default*, quarterContext*, special* ) ) >
+<!ATTLIST quarters alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST quarters draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST quarters references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST quarters validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT quarterContext ( alias | ( default*, quarterWidth*, special* ) ) >
+<!ATTLIST quarterContext type (format | stand-alone) #REQUIRED >
+<!ATTLIST quarterContext alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST quarterContext draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST quarterContext references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST quarterContext validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT quarterWidth ( alias | ( quarter*, special* ) ) >
+<!ATTLIST quarterWidth type (abbreviated | narrow | wide) #REQUIRED >
+<!ATTLIST quarterWidth alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST quarterWidth draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST quarterWidth references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST quarterWidth validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT quarter ( #PCDATA ) >
+<!ATTLIST quarter type (1 | 2 | 3 | 4) #REQUIRED >
+<!ATTLIST quarter alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST quarter draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST quarter references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT week ( alias | ( minDays*, firstDay*, weekendStart*, weekendEnd*, special* ) ) >
+ <!-- use supplemental weekData -->
+ <!--@DEPRECATED-->
+<!ATTLIST week alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST week draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST week standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST week references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST week validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT minDays ( special* ) >
+ <!--@DEPRECATED-->
+<!ATTLIST minDays count (1 | 2 | 3 | 4 | 5 | 6 | 7) #REQUIRED >
+ <!--@DEPRECATED-->
+<!ATTLIST minDays alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST minDays draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST minDays references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT firstDay ( special* ) >
+ <!-- use supplemental data -->
+ <!--@DEPRECATED-->
+<!ATTLIST firstDay day (sun | mon | tue | wed | thu | fri | sat) #REQUIRED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST firstDay alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST firstDay draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST firstDay references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT weekendStart ( special* ) >
+ <!-- use supplemental data -->
+ <!--@DEPRECATED-->
+<!ATTLIST weekendStart day (sun | mon | tue | wed | thu | fri | sat) #REQUIRED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST weekendStart time CDATA "00:00" >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST weekendStart alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST weekendStart draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST weekendStart references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT weekendEnd ( special* ) >
+ <!-- use supplemental data -->
+ <!--@DEPRECATED-->
+<!ATTLIST weekendEnd day (sun | mon | tue | wed | thu | fri | sat) #REQUIRED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST weekendEnd time CDATA "24:00" >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST weekendEnd alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST weekendEnd draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST weekendEnd references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT am ( #PCDATA ) >
+ <!-- use dayPeriods -->
+ <!--@DEPRECATED-->
+<!ATTLIST am alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST am draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST am references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST am validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT pm ( #PCDATA ) >
+ <!-- use dayPeriods -->
+ <!--@DEPRECATED-->
+<!ATTLIST pm alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST pm draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST pm references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST pm validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT dayPeriods ( alias | ( dayPeriodContext*, special* ) ) >
+<!ATTLIST dayPeriods draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dayPeriods references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT dayPeriodContext ( alias | ( dayPeriodWidth*, special* ) ) >
+<!ATTLIST dayPeriodContext type NMTOKEN #REQUIRED >
+ <!--@MATCH:literal/format, stand-alone-->
+<!ATTLIST dayPeriodContext draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dayPeriodContext references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT dayPeriodWidth ( alias | ( dayPeriod*, special* ) ) >
+<!ATTLIST dayPeriodWidth type (abbreviated | narrow | wide) #REQUIRED >
+<!ATTLIST dayPeriodWidth draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dayPeriodWidth references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT dayPeriod ( #PCDATA ) >
+<!ATTLIST dayPeriod type NMTOKEN #REQUIRED >
+ <!--@MATCH:literal/afternoon1, afternoon2, am, evening1, evening2, midnight, morning1, morning2, night1, night2, noon, pm-->
+<!ATTLIST dayPeriod alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST dayPeriod draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST dayPeriod references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT eras ( alias | ( eraNames?, eraAbbr?, eraNarrow?, special* ) ) >
+<!ATTLIST eras alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST eras draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST eras standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST eras references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST eras validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT eraNames ( alias | ( era*, special* ) ) >
+<!ATTLIST eraNames alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST eraNames draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST eraNames references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST eraNames validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT era ( #PCDATA ) >
+<!ATTLIST era type NMTOKEN #REQUIRED >
+ <!--@MATCH:range/0~237-->
+<!ATTLIST era alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST era draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST era references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT eraAbbr ( alias | ( era*, special* ) ) >
+<!ATTLIST eraAbbr alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST eraAbbr draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST eraAbbr references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST eraAbbr validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT eraNarrow ( alias | ( era*, special* ) ) >
+<!ATTLIST eraNarrow alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST eraNarrow draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST eraNarrow references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST eraNarrow validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT cyclicNameSets ( alias | ( cyclicNameSet*, special* ) ) >
+<!ATTLIST cyclicNameSets alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST cyclicNameSets draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST cyclicNameSets references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST cyclicNameSets validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT cyclicNameSet ( alias | ( cyclicNameContext*, special* ) ) >
+<!ATTLIST cyclicNameSet type (years | months | days | dayParts | zodiacs | solarTerms) #REQUIRED >
+<!ATTLIST cyclicNameSet alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST cyclicNameSet draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST cyclicNameSet references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST cyclicNameSet validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT cyclicNameContext ( alias | ( cyclicNameWidth*, special* ) ) >
+<!ATTLIST cyclicNameContext type (format | stand-alone) #REQUIRED >
+<!ATTLIST cyclicNameContext alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST cyclicNameContext draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST cyclicNameContext references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST cyclicNameContext validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT cyclicNameWidth ( alias | ( cyclicName*, special* ) ) >
+<!ATTLIST cyclicNameWidth type (abbreviated | narrow | wide) #REQUIRED >
+<!ATTLIST cyclicNameWidth alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST cyclicNameWidth draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST cyclicNameWidth references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST cyclicNameWidth validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT cyclicName ( #PCDATA ) >
+<!ATTLIST cyclicName type NMTOKEN #REQUIRED >
+ <!--@MATCH:range/1~60-->
+<!ATTLIST cyclicName alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST cyclicName draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST cyclicName references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT dateFormats ( alias | ( default*, dateFormatLength*, special* ) ) >
+<!ATTLIST dateFormats draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dateFormats validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT dateFormatLength ( alias | ( default*, dateFormat*, special* ) ) >
+<!ATTLIST dateFormatLength type (full | long | medium | short) #REQUIRED >
+<!ATTLIST dateFormatLength alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST dateFormatLength draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dateFormatLength standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dateFormatLength references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST dateFormatLength validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT dateFormat ( alias | ( pattern*, displayName*, special* ) ) >
+<!ATTLIST dateFormat type NMTOKEN "standard" >
+ <!--@MATCH:literal/standard-->
+<!ATTLIST dateFormat alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST dateFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dateFormat standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dateFormat references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST dateFormat validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT pattern ( #PCDATA ) >
+<!ATTLIST pattern type NMTOKEN "standard" >
+ <!--@MATCH:literal/1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000, 100000000000, 1000000000000, 10000000000000, 100000000000000, approximately, atLeast, atMost, range, standard-->
+<!ATTLIST pattern numbers CDATA #IMPLIED >
+ <!-- TODO: generalize this to be any (M=|d=)?<numberSystem> -->
+ <!--@MATCH:literal/M=romanlow, d=hanidays, hanidec, hebr, y=jpanyear-->
+ <!--@VALUE-->
+<!ATTLIST pattern count (0 | 1 | zero | one | two | few | many | other) #IMPLIED >
+ <!-- Only used for decimalFormats type="1000..." -->
+<!ATTLIST pattern alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST pattern draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST pattern references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT displayName ( #PCDATA ) >
+<!ATTLIST displayName count (0 | 1 | zero | one | two | few | many | other) #IMPLIED >
+ <!-- only for currencies -->
+<!ATTLIST displayName alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST displayName draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST displayName references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT timeFormats ( alias | ( default*, timeFormatLength*, special* ) ) >
+<!ATTLIST timeFormats draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST timeFormats validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT timeFormatLength ( alias | ( default*, timeFormat*, special* ) ) >
+<!ATTLIST timeFormatLength type (full | long | medium | short) #REQUIRED >
+<!ATTLIST timeFormatLength alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST timeFormatLength draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST timeFormatLength standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST timeFormatLength references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST timeFormatLength validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT timeFormat ( alias | ( pattern*, displayName*, special* ) ) >
+<!ATTLIST timeFormat type NMTOKEN "standard" >
+ <!--@MATCH:literal/standard-->
+<!ATTLIST timeFormat alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST timeFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST timeFormat standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST timeFormat references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST timeFormat validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT dateTimeFormats ( alias | ( default*, dateTimeFormatLength*, availableFormats*, appendItems*, intervalFormats*, special* ) ) >
+<!ATTLIST dateTimeFormats draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dateTimeFormats validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT dateTimeFormatLength ( alias | ( default*, dateTimeFormat*, special* ) ) >
+<!ATTLIST dateTimeFormatLength type (full | long | medium | short) #IMPLIED >
+<!ATTLIST dateTimeFormatLength alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST dateTimeFormatLength draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dateTimeFormatLength standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dateTimeFormatLength references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST dateTimeFormatLength validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT dateTimeFormat ( alias | ( pattern*, displayName*, special* ) ) >
+<!ATTLIST dateTimeFormat type NMTOKEN "standard" >
+ <!--@MATCH:literal/standard-->
+<!ATTLIST dateTimeFormat alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST dateTimeFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dateTimeFormat standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST dateTimeFormat references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST dateTimeFormat validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT availableFormats ( alias | ( dateFormatItem*, special* ) ) >
+<!ATTLIST availableFormats alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST availableFormats draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST availableFormats references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST availableFormats validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT dateFormatItem ( #PCDATA ) >
+<!ATTLIST dateFormatItem id CDATA #REQUIRED >
+ <!-- TODO rationalize this list -->
+ <!--@MATCH:literal/Bh, Bhm, Bhms, E, EBhm, EBhms, EEEEd, EHm, EHms, Ed, Ehm, Ehms, Gy, GyM, GyMMM, GyMMMEEEEd, GyMMMEd, GyMMMM, GyMMMMEd, GyMMMMd, GyMMMd, GyMd, H, HHmm, HHmmZ, HHmmss, Hm, HmZ, Hmm, Hms, Hmsv, Hmsvvvv, Hmv, M, MEEEEd, MEd, MMM, MMMEEEEd, MMMEd, MMMM, MMMMEEEEd, MMMMEd, MMMMW, MMMMd, MMMMdd, MMMd, MMMdd, MMd, MMdd, Md, Mdd, UM, UMMM, UMMMd, UMd, d, h, hhmm, hhmmss, hm, hms, hmsv, hmsvvvv, hmv, mmss, ms, y, yM, yMEEEEd, yMEd, yMM, yMMM, yMMMEEEEd, yMMMEd, yMMMM, yMMMMEEEEd, yMMMMEd, yMMMMccccd, yMMMMd, yMMMd, yMMdd, yMd, yQ, yQQQ, yQQQQ, yw, yyyy, yyyyM, yyyyMEEEEd, yyyyMEd, yyyyMM, yyyyMMM, yyyyMMMEEEEd, yyyyMMMEd, yyyyMMMM, yyyyMMMMEd, yyyyMMMMccccd, yyyyMMMMd, yyyyMMMd, yyyyMMdd, yyyyMd, yyyyQQQ, yyyyQQQQ-->
+<!ATTLIST dateFormatItem count (zero | one | two | few | many | other) #IMPLIED >
+<!ATTLIST dateFormatItem alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST dateFormatItem draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST dateFormatItem references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT appendItems ( alias | ( appendItem*, special* ) ) >
+<!ATTLIST appendItems alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST appendItems draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST appendItems references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST appendItems validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT appendItem ( #PCDATA ) >
+<!ATTLIST appendItem request CDATA #REQUIRED >
+ <!--@MATCH:literal/Day, Day-Of-Week, Era, Hour, Minute, Month, Quarter, Second, Timezone, Week, Year-->
+<!ATTLIST appendItem alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST appendItem draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST appendItem references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT intervalFormats ( alias | ( intervalFormatFallback*, intervalFormatItem*, special* ) ) >
+<!ATTLIST intervalFormats alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST intervalFormats draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST intervalFormats references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST intervalFormats validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT intervalFormatFallback ( #PCDATA ) >
+<!ATTLIST intervalFormatFallback alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST intervalFormatFallback draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST intervalFormatFallback references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST intervalFormatFallback validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT intervalFormatItem ( alias | ( greatestDifference*, special* ) ) >
+<!ATTLIST intervalFormatItem id NMTOKEN #REQUIRED >
+ <!-- TODO: check to see if this should be minimized -->
+ <!--@MATCH:literal/Bh, Bhm, Gy, GyM, GyMEd, GyMMM, GyMMMEd, GyMMMd, GyMd, H, Hm, Hmv, Hv, M, MEd, MMM, MMMEEEEd, MMMEd, MMMM, MMMMEd, MMMMd, MMMd, Md, d, h, hm, hmv, hv, y, yM, yMEd, yMMM, yMMMEEEEd, yMMMEd, yMMMM, yMMMMEEEEd, yMMMMEd, yMMMMd, yMMMd, yMd-->
+<!ATTLIST intervalFormatItem alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST intervalFormatItem draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST intervalFormatItem references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST intervalFormatItem validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT greatestDifference ( #PCDATA ) >
+<!ATTLIST greatestDifference id NMTOKEN #REQUIRED >
+ <!--@MATCH:literal/B, G, H, M, a, d, h, m, y-->
+<!ATTLIST greatestDifference alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST greatestDifference draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST greatestDifference references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST greatestDifference validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT fields ( alias | ( field*, special* ) ) >
+<!ATTLIST fields alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST fields draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST fields standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST fields references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST fields validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT field ( alias | ( displayName*, relative*, relativeTime*, relativePeriod*, special* ) ) >
+<!ATTLIST field type (era | era-short | era-narrow | year | year-short | year-narrow | quarter | quarter-short | quarter-narrow | month | month-short | month-narrow | week | week-short | week-narrow | weekOfMonth | weekOfMonth-short | weekOfMonth-narrow | day | day-short | day-narrow | dayOfYear | dayOfYear-short | dayOfYear-narrow | weekday | weekday-short | weekday-narrow | weekdayOfMonth | weekdayOfMonth-short | weekdayOfMonth-narrow | sun | sun-short | sun-narrow | mon | mon-short | mon-narrow | tue | tue-short | tue-narrow | wed | wed-short | wed-narrow | thu | thu-short | thu-narrow | fri | fri-short | fri-narrow | sat | sat-short | sat-narrow | dayperiod | dayperiod-short | dayperiod-narrow | hour | hour-short | hour-narrow | minute | minute-short | minute-narrow | second | second-short | second-narrow | zone | zone-short | zone-narrow) #IMPLIED >
+<!ATTLIST field alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST field draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST field standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST field references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST field validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT relative ( #PCDATA ) >
+<!ATTLIST relative type NMTOKEN #IMPLIED >
+ <!-- TODO: determine whether to allow 3 -->
+ <!--@MATCH:range/-2~3-->
+<!ATTLIST relative alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST relative draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST relative references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST relative validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT relativeTime ( alias | ( relativeTimePattern*, special* ) ) >
+<!ATTLIST relativeTime type NMTOKEN #REQUIRED >
+ <!--@MATCH:literal/future, past-->
+<!ATTLIST relativeTime alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST relativeTime draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST relativeTime references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST relativeTime validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT relativeTimePattern ( #PCDATA ) >
+<!ATTLIST relativeTimePattern count (zero | one | two | few | many | other) #REQUIRED >
+<!ATTLIST relativeTimePattern alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST relativeTimePattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST relativeTimePattern references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST relativeTimePattern validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT relativePeriod ( #PCDATA ) >
+<!ATTLIST relativePeriod alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST relativePeriod draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT timeZoneNames ( alias | ( hourFormat*, hoursFormat*, gmtFormat*, gmtZeroFormat*, regionFormat*, fallbackFormat*, fallbackRegionFormat*, abbreviationFallback*, preferenceOrdering*, singleCountries*, default*, zone*, metazone*, special* ) ) >
+<!ATTLIST timeZoneNames draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST timeZoneNames validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT hourFormat ( #PCDATA ) >
+<!ATTLIST hourFormat alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST hourFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST hourFormat references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT hoursFormat ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST hoursFormat alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST hoursFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST hoursFormat references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT gmtFormat ( #PCDATA ) >
+<!ATTLIST gmtFormat alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST gmtFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST gmtFormat references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT gmtZeroFormat ( #PCDATA ) >
+<!ATTLIST gmtZeroFormat alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST gmtZeroFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST gmtZeroFormat references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT regionFormat ( #PCDATA ) >
+<!ATTLIST regionFormat type (standard | daylight) #IMPLIED >
+<!ATTLIST regionFormat alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST regionFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST regionFormat references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT fallbackFormat ( #PCDATA ) >
+<!ATTLIST fallbackFormat alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST fallbackFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST fallbackFormat references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT fallbackRegionFormat ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST fallbackRegionFormat alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST fallbackRegionFormat draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST fallbackRegionFormat references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT abbreviationFallback EMPTY >
+ <!--@DEPRECATED-->
+<!ATTLIST abbreviationFallback type (GMT | standard) #IMPLIED >
+ <!-- use choice instead -->
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST abbreviationFallback choice (GMT | standard) #IMPLIED >
+ <!-- really required, but needs to be optional to support type also -->
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST abbreviationFallback alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST abbreviationFallback draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST abbreviationFallback references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT preferenceOrdering EMPTY >
+ <!-- use metazones instead -->
+ <!--@DEPRECATED-->
+<!ATTLIST preferenceOrdering type CDATA #IMPLIED >
+ <!-- use choice instead -->
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST preferenceOrdering choice CDATA #IMPLIED >
+ <!-- really required, but needs to be optional to support type also -->
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST preferenceOrdering alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST preferenceOrdering draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST preferenceOrdering references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT singleCountries EMPTY >
+ <!--@DEPRECATED-->
+<!ATTLIST singleCountries list CDATA #REQUIRED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST singleCountries alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST singleCountries draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST singleCountries references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT zone ( alias | ( long*, short*, commonlyUsed*, exemplarCity*, special* ) ) >
+<!ATTLIST zone type CDATA #REQUIRED >
+ <!--@MATCH:bcp47/tz-->
+<!ATTLIST zone alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST zone draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST zone standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST zone references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST zone validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT long ( alias | ( generic*, standard*, daylight*, special* ) ) >
+<!ATTLIST long alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST long draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST long references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST long validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT generic ( #PCDATA ) >
+<!ATTLIST generic alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST generic draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST generic references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT standard ( #PCDATA ) >
+<!ATTLIST standard alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST standard draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST standard references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT daylight ( #PCDATA ) >
+<!ATTLIST daylight alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST daylight draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST daylight references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT short ( alias | ( generic*, standard*, daylight*, special* ) ) >
+<!ATTLIST short alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST short draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST short references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST short validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT commonlyUsed ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST commonlyUsed used (true | false) #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST commonlyUsed alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST commonlyUsed draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST commonlyUsed references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT exemplarCity ( #PCDATA ) >
+<!ATTLIST exemplarCity alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/formal, secondary-->
+<!ATTLIST exemplarCity draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST exemplarCity references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT metazone ( alias | ( long*, short*, commonlyUsed*, special* ) ) >
+<!ATTLIST metazone type CDATA #REQUIRED >
+ <!--@MATCH:metazone-->
+<!ATTLIST metazone alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST metazone draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST metazone standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST metazone references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST metazone validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT numbers ( alias | ( defaultNumberingSystem*, otherNumberingSystems*, minimumGroupingDigits*, symbols*, decimalFormats*, scientificFormats*, percentFormats*, currencyFormats*, currencies?, miscPatterns*, minimalPairs*, special* ) ) >
+<!ATTLIST numbers alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST numbers draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST numbers standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST numbers references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST numbers validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT defaultNumberingSystem ( #PCDATA ) >
+<!ATTLIST defaultNumberingSystem alt NMTOKENS #IMPLIED >
+ <!--@MATCH:bcp47/nu-->
+<!ATTLIST defaultNumberingSystem draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST defaultNumberingSystem references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT otherNumberingSystems ( alias | ( native*, traditional*, finance*, special* ) ) >
+<!ATTLIST otherNumberingSystems alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST otherNumberingSystems draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT native ( #PCDATA ) >
+<!ATTLIST native alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST native draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+
+<!ELEMENT traditional ( #PCDATA ) >
+<!ATTLIST traditional alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST traditional draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+
+<!ELEMENT finance ( #PCDATA ) >
+<!ATTLIST finance alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST finance draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+
+<!ELEMENT minimumGroupingDigits ( #PCDATA ) >
+<!ATTLIST minimumGroupingDigits alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST minimumGroupingDigits draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST minimumGroupingDigits references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT symbols ( alias | ( decimal*, group*, list*, percentSign*, nativeZeroDigit*, patternDigit*, plusSign*, minusSign*, exponential*, superscriptingExponent*, perMille*, infinity*, nan*, currencyDecimal*, currencyGroup*, timeSeparator*, special* ) ) >
+<!ATTLIST symbols alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST symbols draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST symbols standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST symbols references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST symbols validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST symbols numberSystem CDATA #IMPLIED >
+ <!--@MATCH:bcp47/nu-->
+
+<!ELEMENT decimal ( #PCDATA ) >
+<!ATTLIST decimal alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST decimal draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST decimal references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST decimal numberSystem CDATA #IMPLIED >
+ <!--@DEPRECATED-->
+
+<!ELEMENT group ( #PCDATA ) >
+<!ATTLIST group alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST group draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST group references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST group numberSystem CDATA #IMPLIED >
+ <!--@DEPRECATED-->
+
+<!ELEMENT list ( #PCDATA ) >
+<!ATTLIST list alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST list draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST list references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST list numberSystem CDATA #IMPLIED >
+ <!--@DEPRECATED-->
+
+<!ELEMENT percentSign ( #PCDATA ) >
+<!ATTLIST percentSign alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST percentSign draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST percentSign references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST percentSign numberSystem CDATA #IMPLIED >
+ <!--@DEPRECATED-->
+
+<!ELEMENT nativeZeroDigit ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST nativeZeroDigit alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST nativeZeroDigit draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST nativeZeroDigit references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST nativeZeroDigit numberSystem CDATA #IMPLIED >
+ <!--@DEPRECATED-->
+
+<!ELEMENT patternDigit ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST patternDigit alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST patternDigit draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST patternDigit references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST patternDigit numberSystem CDATA #IMPLIED >
+ <!--@DEPRECATED-->
+
+<!ELEMENT plusSign ( #PCDATA ) >
+<!ATTLIST plusSign alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST plusSign draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST plusSign references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST plusSign numberSystem CDATA #IMPLIED >
+ <!--@DEPRECATED-->
+
+<!ELEMENT minusSign ( #PCDATA ) >
+<!ATTLIST minusSign alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST minusSign draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST minusSign references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST minusSign numberSystem CDATA #IMPLIED >
+ <!--@DEPRECATED-->
+
+<!ELEMENT exponential ( #PCDATA ) >
+<!ATTLIST exponential alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST exponential draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST exponential references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST exponential numberSystem CDATA #IMPLIED >
+ <!--@DEPRECATED-->
+
+<!ELEMENT superscriptingExponent ( #PCDATA ) >
+<!ATTLIST superscriptingExponent alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST superscriptingExponent draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST superscriptingExponent references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT perMille ( #PCDATA ) >
+<!ATTLIST perMille alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST perMille draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST perMille references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST perMille numberSystem CDATA #IMPLIED >
+ <!--@DEPRECATED-->
+
+<!ELEMENT infinity ( #PCDATA ) >
+<!ATTLIST infinity alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST infinity draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST infinity references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST infinity numberSystem CDATA #IMPLIED >
+ <!--@DEPRECATED-->
+
+<!ELEMENT nan ( #PCDATA ) >
+<!ATTLIST nan alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST nan draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST nan references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST nan numberSystem CDATA #IMPLIED >
+ <!--@DEPRECATED-->
+
+<!ELEMENT currencyDecimal ( #PCDATA ) >
+<!ATTLIST currencyDecimal alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST currencyDecimal draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST currencyDecimal references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST currencyDecimal numberSystem CDATA #IMPLIED >
+ <!--@DEPRECATED-->
+
+<!ELEMENT currencyGroup ( #PCDATA ) >
+<!ATTLIST currencyGroup alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST currencyGroup draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST currencyGroup references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST currencyGroup numberSystem CDATA #IMPLIED >
+ <!--@DEPRECATED-->
+
+<!ELEMENT timeSeparator ( #PCDATA ) >
+<!ATTLIST timeSeparator alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST timeSeparator draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST timeSeparator references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT decimalFormats ( alias | ( default*, decimalFormatLength*, special* ) ) >
+<!ATTLIST decimalFormats draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST decimalFormats validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST decimalFormats numberSystem CDATA #IMPLIED >
+ <!--@MATCH:bcp47/nu-->
+
+<!ELEMENT decimalFormatLength ( alias | ( default*, decimalFormat*, special* ) ) >
+<!ATTLIST decimalFormatLength type (full | long | medium | short) #IMPLIED >
+<!ATTLIST decimalFormatLength alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST decimalFormatLength draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST decimalFormatLength standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST decimalFormatLength references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST decimalFormatLength validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT decimalFormat ( alias | ( pattern*, special* ) ) >
+<!ATTLIST decimalFormat type NMTOKEN "standard" >
+ <!--@MATCH:literal/standard-->
+<!ATTLIST decimalFormat alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST decimalFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST decimalFormat standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST decimalFormat references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST decimalFormat validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT scientificFormats ( alias | ( default*, scientificFormatLength*, special* ) ) >
+<!ATTLIST scientificFormats draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST scientificFormats validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST scientificFormats numberSystem CDATA #IMPLIED >
+ <!--@MATCH:bcp47/nu-->
+
+<!ELEMENT scientificFormatLength ( alias | ( default*, scientificFormat*, special* ) ) >
+<!ATTLIST scientificFormatLength type (full | long | medium | short) #IMPLIED >
+<!ATTLIST scientificFormatLength alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST scientificFormatLength draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST scientificFormatLength standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST scientificFormatLength references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST scientificFormatLength validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT scientificFormat ( alias | ( pattern*, special* ) ) >
+<!ATTLIST scientificFormat type NMTOKEN "standard" >
+ <!--@MATCH:literal/standard-->
+<!ATTLIST scientificFormat alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST scientificFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST scientificFormat standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST scientificFormat references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST scientificFormat validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT percentFormats ( alias | ( default*, percentFormatLength*, special* ) ) >
+<!ATTLIST percentFormats draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST percentFormats validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST percentFormats numberSystem CDATA #IMPLIED >
+ <!--@MATCH:bcp47/nu-->
+
+<!ELEMENT percentFormatLength ( alias | ( default*, percentFormat*, special* ) ) >
+<!ATTLIST percentFormatLength type (full | long | medium | short) #IMPLIED >
+<!ATTLIST percentFormatLength alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST percentFormatLength draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST percentFormatLength standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST percentFormatLength references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST percentFormatLength validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT percentFormat ( alias | ( pattern*, special* ) ) >
+<!ATTLIST percentFormat type NMTOKEN "standard" >
+ <!--@MATCH:literal/standard-->
+<!ATTLIST percentFormat alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST percentFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST percentFormat standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST percentFormat references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST percentFormat validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT currencyFormats ( alias | ( default*, currencySpacing*, currencyFormatLength*, unitPattern*, special* ) ) >
+<!ATTLIST currencyFormats draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST currencyFormats validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST currencyFormats numberSystem CDATA #IMPLIED >
+ <!--@MATCH:bcp47/nu-->
+
+<!ELEMENT currencySpacing ( alias | ( beforeCurrency*, afterCurrency*, special* ) ) >
+
+<!ELEMENT beforeCurrency ( alias | ( currencyMatch*, surroundingMatch*, insertBetween*, special* ) ) >
+
+<!ELEMENT currencyMatch ( #PCDATA ) >
+<!ATTLIST currencyMatch alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST currencyMatch draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST currencyMatch references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT surroundingMatch ( #PCDATA ) >
+<!ATTLIST surroundingMatch alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST surroundingMatch draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST surroundingMatch references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT insertBetween ( #PCDATA ) >
+<!ATTLIST insertBetween alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST insertBetween draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST insertBetween references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT afterCurrency ( alias | ( currencyMatch*, surroundingMatch*, insertBetween*, special* ) ) >
+
+<!ELEMENT currencyFormatLength ( alias | ( default*, currencyFormat*, special* ) ) >
+<!ATTLIST currencyFormatLength type (full | long | medium | short) #IMPLIED >
+<!ATTLIST currencyFormatLength alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST currencyFormatLength draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST currencyFormatLength standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST currencyFormatLength references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST currencyFormatLength validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT currencyFormat ( alias | ( pattern*, special* ) ) >
+<!ATTLIST currencyFormat type NMTOKEN "standard" >
+ <!--@MATCH:literal/accounting, standard-->
+<!ATTLIST currencyFormat alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST currencyFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST currencyFormat standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST currencyFormat references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST currencyFormat validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT unitPattern ( #PCDATA ) >
+<!ATTLIST unitPattern count (0 | 1 | zero | one | two | few | many | other) #REQUIRED >
+<!ATTLIST unitPattern alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST unitPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST unitPattern references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST unitPattern validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT currencies ( alias | ( default?, currency*, special* ) ) >
+<!ATTLIST currencies draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST currencies validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT currency ( alias | ( ( ( pattern+, displayName*, symbol* ) | ( displayName+, symbol*, pattern* ) | ( symbol+, pattern* ) )?, decimal*, group*, special* ) ) >
+
+<!-- # warning: pattern appears twice in the above. The first is for consistency with all other cases of
+ pattern + displayName; the second is for backwards compatibility -->
+<!ATTLIST currency type NMTOKEN "standard" >
+ <!--@MATCH:validity/currency-->
+<!ATTLIST currency alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST currency draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST currency references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST currency validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT symbol ( #PCDATA ) >
+<!ATTLIST symbol choice (true | false) #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST symbol alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/formal, narrow, variant-->
+<!ATTLIST symbol draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST symbol references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT miscPatterns ( alias | ( default*, pattern*, special* ) ) >
+<!ATTLIST miscPatterns draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST miscPatterns numberSystem CDATA #IMPLIED >
+ <!--@MATCH:bcp47/nu-->
+
+<!ELEMENT minimalPairs ( alias | ( pluralMinimalPairs*, ordinalMinimalPairs*, special* ) ) >
+<!ATTLIST minimalPairs alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST minimalPairs draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT pluralMinimalPairs ( #PCDATA ) >
+<!ATTLIST pluralMinimalPairs count NMTOKEN #IMPLIED >
+ <!--@MATCH:literal/few, many, one, other, two, zero-->
+<!ATTLIST pluralMinimalPairs alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST pluralMinimalPairs draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT ordinalMinimalPairs ( #PCDATA ) >
+<!ATTLIST ordinalMinimalPairs ordinal NMTOKEN #IMPLIED >
+ <!--@MATCH:literal/few, many, one, other, two, zero-->
+<!ATTLIST ordinalMinimalPairs alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST ordinalMinimalPairs draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT units ( alias | ( unit*, unitLength*, durationUnit*, special* ) ) >
+<!ATTLIST units alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST units draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST units references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST units validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT unit ( alias | ( displayName*, unitPattern*, perUnitPattern*, special* ) ) >
+<!ATTLIST unit type NMTOKEN #REQUIRED >
+ <!--@MATCH:validity/unit-->
+<!ATTLIST unit alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST unit draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST unit references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST unit validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT perUnitPattern ( #PCDATA ) >
+<!ATTLIST perUnitPattern alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST perUnitPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST perUnitPattern references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT unitLength ( alias | ( compoundUnit*, unit*, coordinateUnit*, special* ) ) >
+<!ATTLIST unitLength type (long | short | narrow) #REQUIRED >
+<!ATTLIST unitLength alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST unitLength draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST unitLength references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST unitLength validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT compoundUnit ( alias | ( compoundUnitPattern*, special* ) ) >
+<!ATTLIST compoundUnit type NMTOKEN #REQUIRED >
+ <!--@MATCH:literal/per-->
+<!ATTLIST compoundUnit alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST compoundUnit draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST compoundUnit references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST compoundUnit validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT compoundUnitPattern ( #PCDATA ) >
+<!ATTLIST compoundUnitPattern alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST compoundUnitPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST compoundUnitPattern references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST compoundUnitPattern validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT coordinateUnit ( alias | ( displayName*, coordinateUnitPattern*, special* ) ) >
+<!ATTLIST coordinateUnit alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST coordinateUnit draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT coordinateUnitPattern ( #PCDATA ) >
+<!ATTLIST coordinateUnitPattern type (north | east | south | west) #REQUIRED >
+<!ATTLIST coordinateUnitPattern alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST coordinateUnitPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT durationUnit ( alias | ( durationUnitPattern*, special* ) ) >
+<!ATTLIST durationUnit type NMTOKEN #REQUIRED >
+ <!--@MATCH:literal/hm, hms, ms-->
+<!ATTLIST durationUnit alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST durationUnit draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST durationUnit references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT durationUnitPattern ( #PCDATA ) >
+<!ATTLIST durationUnitPattern alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST durationUnitPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST durationUnitPattern references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST durationUnitPattern validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT listPatterns ( alias | ( listPattern*, special* ) ) >
+<!ATTLIST listPatterns alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST listPatterns draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST listPatterns references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST listPatterns validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT listPattern ( alias | ( listPatternPart*, special* ) ) >
+<!ATTLIST listPattern type NMTOKEN #IMPLIED >
+ <!--@MATCH:literal/or, or-narrow, or-short, standard-narrow, standard-short, unit, unit-narrow, unit-short-->
+<!ATTLIST listPattern alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST listPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST listPattern references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST listPattern validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT listPatternPart ( #PCDATA ) >
+<!ATTLIST listPatternPart type (start | middle | end | 2 | 3) #REQUIRED >
+<!ATTLIST listPatternPart alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST listPatternPart draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST listPatternPart references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST listPatternPart validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT collations ( alias | ( defaultCollation?, default*, collation*, special* ) ) >
+<!ATTLIST collations version NMTOKEN #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST collations draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!-- should be DEPRECATED, but needs some cleanup first -->
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST collations validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT defaultCollation ( #PCDATA ) >
+<!ATTLIST defaultCollation alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST defaultCollation draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT collation ( alias | ( base?, import*, settings?, suppress_contractions?, optimize?, ( cr* | rules? ), special* ) ) >
+<!ATTLIST collation type NMTOKEN "standard" >
+ <!--@MATCH:or/bcp47/co||regex/private-.*||literal/digits-after-->
+<!ATTLIST collation visibility (internal | external) #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST collation alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/proposed, short, variant-->
+<!ATTLIST collation draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST collation standard CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST collation references CDATA #IMPLIED >
+ <!--@MATCH:any-->
+ <!--@METADATA-->
+<!ATTLIST collation validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT base ( alias | special ) >
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT import EMPTY >
+ <!-- deprecated, see CLDR ticket #8289 -->
+ <!--@DEPRECATED-->
+<!ATTLIST import source CDATA #REQUIRED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST import type CDATA #IMPLIED >
+ <!--@DEPRECATED-->
+<!ATTLIST import draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST import references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT settings ( special* ) >
+ <!-- deprecated, see CLDR ticket #8289 -->
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+<!ATTLIST settings strength (primary | secondary | tertiary | quaternary | identical) #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST settings alternate (non-ignorable | shifted) #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST settings backwards (on | off) #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST settings normalization (on | off) #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST settings caseLevel (on | off) #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST settings caseFirst (upper | lower | off) #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST settings hiraganaQuarternary (on | off) #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST settings hiraganaQuaternary (on | off) #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST settings maxVariable (space | punct | symbol | currency) #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST settings numeric (on | off) #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST settings private (true | false) #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST settings variableTop CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST settings reorder NMTOKENS #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT suppress_contractions ( #PCDATA | cp )* >
+ <!-- deprecated, see CLDR ticket #8289 -->
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT optimize ( #PCDATA | cp )* >
+ <!-- deprecated, see CLDR ticket #8289 -->
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT cr ( #PCDATA ) >
+<!ATTLIST cr alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST cr draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST cr references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!-- # Use the cr element instead, with ICU syntax. -->
+
+<!ELEMENT rules ( alias | ( ( reset | import ), ( reset | import | p | pc | s | sc | t | tc | q | qc | i | ic | x )* ) ) >
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT reset ( #PCDATA | cp | first_variable | last_variable | first_tertiary_ignorable | last_tertiary_ignorable | first_secondary_ignorable | last_secondary_ignorable | first_primary_ignorable | last_primary_ignorable | first_non_ignorable | last_non_ignorable | first_trailing | last_trailing )* >
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+<!ATTLIST reset before NMTOKEN #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT first_variable EMPTY >
+ <!--@DEPRECATED-->
+
+<!ELEMENT last_variable EMPTY >
+ <!--@DEPRECATED-->
+
+<!ELEMENT first_tertiary_ignorable EMPTY >
+ <!--@DEPRECATED-->
+
+<!ELEMENT last_tertiary_ignorable EMPTY >
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT first_secondary_ignorable EMPTY >
+ <!--@DEPRECATED-->
+
+<!ELEMENT last_secondary_ignorable EMPTY >
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT first_primary_ignorable EMPTY >
+ <!--@DEPRECATED-->
+
+<!ELEMENT last_primary_ignorable EMPTY >
+ <!--@DEPRECATED-->
+
+<!ELEMENT first_non_ignorable EMPTY >
+ <!--@DEPRECATED-->
+
+<!ELEMENT last_non_ignorable EMPTY >
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT first_trailing EMPTY >
+ <!--@DEPRECATED-->
+
+<!ELEMENT last_trailing EMPTY >
+ <!--@DEPRECATED-->
+
+<!ELEMENT p ( #PCDATA | cp | last_variable )* >
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT pc ( #PCDATA | cp | last_variable )* >
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT s ( #PCDATA | cp | last_variable )* >
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT sc ( #PCDATA | cp | last_variable )* >
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT t ( #PCDATA | cp | last_variable )* >
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT tc ( #PCDATA | cp | last_variable )* >
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT q ( #PCDATA | cp | last_variable )* >
+ <!--@DEPRECATED-->
+
+<!ELEMENT qc ( #PCDATA | cp | last_variable )* >
+ <!--@DEPRECATED-->
+
+<!ELEMENT i ( #PCDATA | cp | last_variable )* >
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT ic ( #PCDATA | cp | last_variable )* >
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT x ( context?, ( p | pc | s | sc | t | tc | q | qc | i | ic )*, extend? ) >
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT context ( #PCDATA | cp )* >
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT extend ( #PCDATA | cp )* >
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT posix ( alias | ( messages*, special* ) ) >
+<!ATTLIST posix draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST posix references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST posix validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT messages ( alias | ( yesstr*, nostr*, yesexpr*, noexpr*, special* ) ) >
+<!ATTLIST messages alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST messages draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST messages references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST messages validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT yesstr ( #PCDATA ) >
+<!ATTLIST yesstr alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST yesstr draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST yesstr references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT nostr ( #PCDATA ) >
+<!ATTLIST nostr alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST nostr draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST nostr references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT yesexpr ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST yesexpr alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST yesexpr draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST yesexpr references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT noexpr ( #PCDATA ) >
+ <!--@DEPRECATED-->
+<!ATTLIST noexpr alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST noexpr draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST noexpr references CDATA #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT characterLabels ( alias | ( characterLabelPattern*, characterLabel*, special* ) ) >
+
+<!ELEMENT characterLabelPattern ( #PCDATA ) >
+<!ATTLIST characterLabelPattern type NMTOKEN #REQUIRED >
+ <!--@MATCH:literal/all, category-list, compatibility, enclosed, extended, historic, miscellaneous, other, scripts, strokes-->
+<!ATTLIST characterLabelPattern count (0 | 1 | zero | one | two | few | many | other) #IMPLIED >
+ <!-- count only used for certain patterns" -->
+<!ATTLIST characterLabelPattern alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST characterLabelPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT characterLabel ( #PCDATA ) >
+<!ATTLIST characterLabel type NMTOKEN #REQUIRED >
+ <!--@MATCH:literal/activities, african_scripts, american_scripts, animal, animals_nature, arrows, body, box_drawing, braille, building, bullets_stars, consonantal_jamo, currency_symbols, dash_connector, digits, dingbats, divination_symbols, downwards_arrows, downwards_upwards_arrows, east_asian_scripts, emoji, european_scripts, female, flag, flags, food_drink, format, format_whitespace, full_width_form_variant, geometric_shapes, half_width_form_variant, han_characters, han_radicals, hanja, hanzi_simplified, hanzi_traditional, heart, historic_scripts, ideographic_desc_characters, japanese_kana, kanbun, kanji, keycap, leftwards_arrows, leftwards_rightwards_arrows, letterlike_symbols, limited_use, male, math_symbols, middle_eastern_scripts, miscellaneous, modern_scripts, modifier, musical_symbols, nature, nonspacing, numbers, objects, other, paired, person, phonetic_alphabet, pictographs, place, plant, punctuation, rightwards_arrows, sign_standard_symbols, small_form_variant, smiley, smileys_people, south_asian_scripts, southeast_asian_scripts, spacing, sport, symbols, technical_symbols, tone_marks, travel, travel_places, upwards_arrows, variant_forms, vocalic_jamo, weather, western_asian_scripts, whitespace-->
+<!ATTLIST characterLabel alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST characterLabel draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT segmentations ( alias | ( segmentation*, special* ) ) >
+<!ATTLIST segmentations alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST segmentations draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST segmentations references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST segmentations validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT segmentation ( alias | ( variables?, segmentRules?, exceptions?, suppressions? ) | special* ) >
+<!ATTLIST segmentation type NMTOKEN #REQUIRED >
+ <!--@MATCH:literal/GraphemeClusterBreak, LineBreak, SentenceBreak, WordBreak-->
+<!ATTLIST segmentation alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST segmentation draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST segmentation references CDATA #IMPLIED >
+ <!--@METADATA-->
+<!ATTLIST segmentation validSubLocales CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT variables ( alias | ( variable*, special* ) ) >
+
+<!ELEMENT variable ( #PCDATA ) >
+ <!--@ORDERED-->
+<!ATTLIST variable id CDATA #REQUIRED >
+ <!--@MATCH:regex/\$[a-zA-Z0-9_]+-->
+<!ATTLIST variable alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST variable draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST variable references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT segmentRules ( alias | ( rule*, special* ) ) >
+
+<!ELEMENT rule ( #PCDATA ) >
+<!ATTLIST rule id NMTOKEN #REQUIRED >
+ <!--@MATCH:range/0.0~9999.0-->
+<!ATTLIST rule alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST rule draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+<!ATTLIST rule references CDATA #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT exceptions ( exception* ) >
+ <!-- use suppressions instead -->
+ <!--@DEPRECATED-->
+
+<!ELEMENT exception ( #PCDATA ) >
+ <!--@ORDERED-->
+ <!--@DEPRECATED-->
+<!ATTLIST exception draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT suppressions ( alias | ( suppression*, special* ) ) >
+<!ATTLIST suppressions type NMTOKEN "standard" >
+ <!--@MATCH:literal/standard-->
+<!ATTLIST suppressions draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT suppression ( #PCDATA ) >
+ <!--@ORDERED-->
+<!ATTLIST suppression alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST suppression draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT rbnf ( alias | ( rulesetGrouping*, special* ) ) >
+
+<!ELEMENT rulesetGrouping ( alias | ( ruleset*, special* ) ) >
+<!ATTLIST rulesetGrouping type NMTOKEN #REQUIRED >
+ <!--@MATCH:literal/NumberingSystemRules, OrdinalRules, SpelloutRules-->
+<!ATTLIST rulesetGrouping draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT ruleset ( alias | ( rbnfrule*, special* ) ) >
+ <!--@ORDERED-->
+<!ATTLIST ruleset type NMTOKEN #REQUIRED >
+ <!--@MATCH:regex/(ord-M-)?[\-0-9a-z]+-->
+<!ATTLIST ruleset access (public | private) #IMPLIED >
+ <!--@VALUE-->
+<!ATTLIST ruleset allowsParsing (true | false) #IMPLIED >
+ <!--@VALUE-->
+<!ATTLIST ruleset draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT rbnfrule ( #PCDATA ) >
+ <!--@ORDERED-->
+<!ATTLIST rbnfrule value CDATA #REQUIRED >
+ <!--@MATCH:or/range/-1.0E20~1.0E20||literal/-x, 0, 0.x, NaN, -Inf, Inf, x,x, x.x-->
+ <!--@VALUE-->
+<!ATTLIST rbnfrule radix CDATA #IMPLIED >
+ <!--@MATCH:literal/1,000, 100, 1000, 100000, 20-->
+ <!--@VALUE-->
+<!ATTLIST rbnfrule decexp CDATA #IMPLIED >
+ <!--@VALUE-->
+<!ATTLIST rbnfrule alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST rbnfrule draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED:true, false-->
+
+<!ELEMENT typographicNames ( alias | ( axisName*, styleName*, featureName*, special* ) ) >
+
+<!ELEMENT axisName ( #PCDATA ) >
+<!ATTLIST axisName type (ital | opsz | slnt | wdth | wght) #REQUIRED >
+<!ATTLIST axisName alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST axisName draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT styleName ( #PCDATA ) >
+<!ATTLIST styleName type (ital | opsz | slnt | wdth | wght) #REQUIRED >
+<!ATTLIST styleName subtype NMTOKEN #REQUIRED >
+ <!--@MATCH:literal/-12, 0, 1, 100, 112.5, 12, 125, 144, 150, 18, 200, 24, 300, 350, 380, 400, 50, 500, 600, 62.5, 700, 72, 75, 8, 800, 87.5, 900, 950-->
+<!ATTLIST styleName alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/compressed, demi, extended, heavy, narrow, short, ultra, ultrablack, ultraheavy, wide-->
+<!ATTLIST styleName draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT featureName ( #PCDATA ) >
+<!ATTLIST featureName type (afrc | cpsp | dlig | frac | lnum | onum | ordn | pnum | smcp | tnum | zero) #REQUIRED >
+<!ATTLIST featureName alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/short, variant-->
+<!ATTLIST featureName draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT annotations ( alias | ( annotation*, special* ) ) >
+
+<!ELEMENT annotation ( #PCDATA ) >
+<!ATTLIST annotation cp CDATA #REQUIRED >
+ <!--@MATCH:any-->
+<!ATTLIST annotation tts CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST annotation type (tts) #IMPLIED >
+<!ATTLIST annotation alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST annotation draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+
+<!-- ######################################################### -->
+<!-- # This element contains metadata for Survey Tool internal use (optimization, etc). -->
+
+<!ELEMENT metadata ( alias | ( casingData?, special* ) ) >
+ <!--@METADATA-->
+
+<!ELEMENT casingData ( alias | ( casingItem*, special* ) ) >
+ <!--@METADATA-->
+
+<!ELEMENT casingItem ( #PCDATA ) >
+<!ATTLIST casingItem type CDATA #REQUIRED >
+ <!--@MATCH:any-->
+<!ATTLIST casingItem override (true | false) #IMPLIED >
+ <!--@VALUE-->
+<!ATTLIST casingItem forceError (true | false) #IMPLIED >
+ <!--@VALUE-->
+<!ATTLIST casingItem alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+<!ATTLIST casingItem draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+ <!--@METADATA-->
+
+<!ELEMENT references ( reference* ) >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+
+<!ELEMENT reference ( #PCDATA ) >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST reference type NMTOKEN #REQUIRED >
+ <!--@DEPRECATED-->
+<!ATTLIST reference uri CDATA #IMPLIED >
+ <!--@VALUE-->
+ <!--@DEPRECATED-->
+<!ATTLIST reference alt NMTOKENS #IMPLIED >
+ <!--@MATCH:literal/variant-->
+ <!--@DEPRECATED-->
+<!ATTLIST reference draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
+<!ATTLIST reference standard (true | false) #IMPLIED >
+ <!--@METADATA-->
+ <!--@DEPRECATED-->
diff --git a/Build/source/libs/icu/icu-src/source/data/dtd/cldr-35.1/common/dtd/ldmlICU.dtd b/Build/source/libs/icu/icu-src/source/data/dtd/cldr-35.1/common/dtd/ldmlICU.dtd
new file mode 100644
index 00000000000..5a9b613411b
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/data/dtd/cldr-35.1/common/dtd/ldmlICU.dtd
@@ -0,0 +1,113 @@
+<!--
+Copyright © 2003-2015 Unicode, Inc. and others. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated documentation (the "Data Files") or Unicode software and any associated documentation (the "Software") to deal in the Data Files or Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Data Files or Software, and to permit persons to whom the Data Files or Software are furnished to do so, provided that (a) the above copyright notice(s) and this permission notice appear with all copies of the Data Files or Software, (b) both the above copyright notice(s) and this permission notice appear in associated documentation, and (c) there is clear notice in each modified Data File or in the Software as well as in the documentation associated with the Data File(s) or Software that the data or software has been modified.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder.
+-->
+
+<!-- ######################################################### -->
+<!-- The alias, default, special and cp elements are already defined in ldml.dtd. Defining them here as well would break locale conversion. -->
+<!-- ######################################################### -->
+
+<!-- ICU Specific elements -->
+<!-- ######################################################### -->
+<!ATTLIST special xmlns:icu CDATA #IMPLIED>
+<!ATTLIST special icu:version CDATA #IMPLIED>
+
+<!ELEMENT icu:version EMPTY>
+<!ATTLIST icu:version icu:specialVersion CDATA #FIXED "1.7" >
+<!ATTLIST icu:version icu:requiredLDMLVersion CDATA #FIXED "1.7" >
+
+<!-- ICU Scripts -->
+
+<!ELEMENT icu:scripts (alias | icu:script* ) >
+<!ATTLIST icu:scripts draft ( true | false ) #IMPLIED >
+<!ATTLIST icu:scripts standard CDATA #IMPLIED >
+
+<!ELEMENT icu:script ( #PCDATA ) >
+<!ATTLIST icu:script type NMTOKEN #REQUIRED >
+<!ATTLIST icu:script draft ( true | false ) #IMPLIED >
+
+<!-- RBNF data -->
+<!ELEMENT icu:ruleBasedNumberFormats ( alias | (default?, icu:ruleBasedNumberFormat*)) >
+
+<!-- Either bare data or any number of cp -->
+<!ELEMENT icu:ruleBasedNumberFormat (#PCDATA | cp)* >
+<!ATTLIST icu:ruleBasedNumberFormat type NMTOKEN #IMPLIED >
+
+<!-- RBBI data -->
+<!ELEMENT icu:breakIteratorData (alias | (icu:boundaries?, icu:dictionaries?)) >
+
+<!ELEMENT icu:boundaries (alias | (icu:grapheme?, icu:word?, icu:line*, icu:sentence?, icu:title?, icu:xgc?)) >
+
+<!ELEMENT icu:dictionaries (alias | (icu:dictionary*)) >
+
+<!ELEMENT icu:dictionary ( #PCDATA ) >
+<!ATTLIST icu:dictionary icu:dependency NMTOKEN #IMPLIED >
+<!ATTLIST icu:dictionary type NMTOKEN #REQUIRED >
+
+<!ELEMENT icu:grapheme ( #PCDATA ) >
+<!ATTLIST icu:grapheme icu:class NMTOKEN #IMPLIED >
+<!ATTLIST icu:grapheme icu:append NMTOKEN #IMPLIED >
+<!ATTLIST icu:grapheme icu:import NMTOKEN #IMPLIED >
+<!ATTLIST icu:grapheme icu:dependency NMTOKEN #IMPLIED >
+
+<!ELEMENT icu:word ( #PCDATA ) >
+<!ATTLIST icu:word icu:class NMTOKEN #IMPLIED >
+<!ATTLIST icu:word icu:append NMTOKEN #IMPLIED >
+<!ATTLIST icu:word icu:import NMTOKEN #IMPLIED >
+<!ATTLIST icu:word icu:dependency NMTOKEN #IMPLIED >
+
+<!ELEMENT icu:line ( #PCDATA ) >
+<!ATTLIST icu:line icu:class NMTOKEN #IMPLIED >
+<!ATTLIST icu:line icu:append NMTOKEN #IMPLIED >
+<!ATTLIST icu:line icu:import NMTOKEN #IMPLIED >
+<!ATTLIST icu:line icu:dependency NMTOKEN #IMPLIED >
+<!ATTLIST icu:line alt NMTOKENS #IMPLIED >
+
+<!ELEMENT icu:sentence ( #PCDATA ) >
+<!ATTLIST icu:sentence icu:class NMTOKEN #IMPLIED >
+<!ATTLIST icu:sentence icu:append NMTOKEN #IMPLIED >
+<!ATTLIST icu:sentence icu:import NMTOKEN #IMPLIED >
+<!ATTLIST icu:sentence icu:dependency NMTOKEN #IMPLIED >
+
+<!ELEMENT icu:title ( #PCDATA ) >
+<!ATTLIST icu:title icu:class NMTOKEN #IMPLIED >
+<!ATTLIST icu:title icu:append NMTOKEN #IMPLIED >
+<!ATTLIST icu:title icu:import NMTOKEN #IMPLIED >
+<!ATTLIST icu:title icu:dependency NMTOKEN #IMPLIED >
+
+<!ELEMENT icu:xgc ( #PCDATA ) >
+<!ATTLIST icu:xgc icu:class NMTOKEN #IMPLIED >
+<!ATTLIST icu:xgc icu:append NMTOKEN #IMPLIED >
+<!ATTLIST icu:xgc icu:import NMTOKEN #IMPLIED >
+<!ATTLIST icu:xgc icu:dependency NMTOKEN #IMPLIED >
+
+<!--deprecated -->
+<!ELEMENT icu:breakDictionaryData EMPTY >
+<!ATTLIST icu:breakDictionaryData icu:class NMTOKEN #IMPLIED >
+<!ATTLIST icu:breakDictionaryData icu:import NMTOKEN #IMPLIED >
+<!ATTLIST icu:breakDictionaryData icu:importFile CDATA #IMPLIED >
+
+<!-- RBT data -->
+<!ELEMENT icu:transforms ( alias | (default?, icu:transform*)) >
+<!ELEMENT icu:transform ( #PCDATA |cp )* >
+<!ATTLIST icu:transform type NMTOKEN #REQUIRED >
+
+<!-- leap month information, all deprecated -->
+<!ELEMENT icu:isLeapMonth ( alias | (icu:nonLeapSymbol?, icu:leapSymbol? ))> <!-- deprecated -->
+<!ELEMENT icu:nonLeapSymbol ( #PCDATA ) > <!-- deprecated -->
+<!ELEMENT icu:leapSymbol ( #PCDATA ) > <!-- deprecated -->
+
+<!-- UCA Rules -->
+<!ELEMENT icu:UCARules EMPTY >
+<!ATTLIST icu:UCARules icu:uca_rules CDATA #REQUIRED >
+
+<!-- Dependencies Rules -->
+<!ELEMENT icu:depends EMPTY >
+<!ATTLIST icu:depends icu:dependency CDATA #REQUIRED >
+
+<!-- ######################################################### -->
diff --git a/Build/source/libs/icu/icu-src/source/data/icu-coll-deprecates.xml b/Build/source/libs/icu/icu-src/source/data/icu-coll-deprecates.xml
index ccf978a6592..09efac23674 100644
--- a/Build/source/libs/icu/icu-src/source/data/icu-coll-deprecates.xml
+++ b/Build/source/libs/icu/icu-src/source/data/icu-coll-deprecates.xml
@@ -16,7 +16,7 @@
<alias from="in_ID" to="id_ID" />
<alias from="iw" to="he" />
<alias from="iw_IL" to="he_IL" />
- <alias from="mo" to="ro_MD" />
+ <alias from="mo" to="ro" />
<alias from="no" to="nb" />
<alias from="no_NO" to="nb_NO" />
<alias from="pa_IN" to="pa_Guru_IN" />
diff --git a/Build/source/libs/icu/icu-src/source/data/icu-config.xml b/Build/source/libs/icu/icu-src/source/data/icu-config.xml
index 7fda0eeade9..2cb593a9407 100644
--- a/Build/source/libs/icu/icu-src/source/data/icu-config.xml
+++ b/Build/source/libs/icu/icu-src/source/data/icu-config.xml
@@ -100,6 +100,8 @@
<include locales="ccp_IN"/>
<include locales="ce"/>
<include locales="ce_RU"/>
+ <include locales="ceb"/>
+ <include locales="ceb_PH"/>
<include locales="cgg"/>
<include locales="cgg_UG"/>
<include locales="chr"/>
@@ -145,6 +147,7 @@
<include locales="en"/>
<include locales="en_001"/>
<include locales="en_150"/>
+ <include locales="en_AE"/>
<include locales="en_AG"/>
<include locales="en_AI"/>
<include locales="en_AS"/>
@@ -250,6 +253,7 @@
<include locales="en_ZM"/>
<include locales="en_ZW"/>
<include locales="eo"/>
+ <include locales="eo_001"/>
<include locales="es"/>
<include locales="es_003"/>
<include locales="es_419"/>
@@ -292,6 +296,19 @@
<include locales="ff"/>
<include locales="ff_CM"/>
<include locales="ff_GN"/>
+ <include locales="ff_Latn"/>
+ <include locales="ff_Latn_BF"/>
+ <include locales="ff_Latn_CM"/>
+ <include locales="ff_Latn_GH"/>
+ <include locales="ff_Latn_GM"/>
+ <include locales="ff_Latn_GN"/>
+ <include locales="ff_Latn_GW"/>
+ <include locales="ff_Latn_LR"/>
+ <include locales="ff_Latn_MR"/>
+ <include locales="ff_Latn_NE"/>
+ <include locales="ff_Latn_NG"/>
+ <include locales="ff_Latn_SL"/>
+ <include locales="ff_Latn_SN"/>
<include locales="ff_MR"/>
<include locales="ff_SN"/>
<include locales="fi"/>
@@ -353,6 +370,7 @@
<include locales="fy"/>
<include locales="fy_NL"/>
<include locales="ga"/>
+ <include locales="ga_GB"/>
<include locales="ga_IE"/>
<include locales="gd"/>
<include locales="gd_GB"/>
@@ -575,6 +593,7 @@
<include locales="pl_PL"/>
<include locales="ps"/>
<include locales="ps_AF"/>
+ <include locales="ps_PK"/>
<include locales="pt"/>
<include locales="pt_AO"/>
<include locales="pt_BR"/>
@@ -763,10 +782,10 @@
<include locales="yo_BJ"/>
<include locales="yo_NG"/>
<include locales="yue"/>
- <include locales="yue_Hans"/>
- <include locales="yue_Hans_CN"/>
- <include locales="yue_Hant"/>
- <include locales="yue_Hant_HK"/>
+ <include locales="yue_Hans"/>
+ <include locales="yue_Hans_CN"/>
+ <include locales="yue_Hant"/>
+ <include locales="yue_Hant_HK"/>
<include locales="zgh"/>
<include locales="zgh_MA"/>
<include locales="zh"/>
diff --git a/Build/source/libs/icu/icu-src/source/data/icu-locale-deprecates.xml b/Build/source/libs/icu/icu-src/source/data/icu-locale-deprecates.xml
index 5ed82ede4f0..d2ec74166c4 100644
--- a/Build/source/libs/icu/icu-src/source/data/icu-locale-deprecates.xml
+++ b/Build/source/libs/icu/icu-src/source/data/icu-locale-deprecates.xml
@@ -14,12 +14,16 @@
<alias from="bs_BA" to="bs_Latn_BA" />
<alias from="en_NH" to="en_VU"/>
<alias from="en_RH" to="en_ZW"/>
+ <alias from="ff_CM" to="ff_Latn_CM"/>
+ <alias from="ff_GN" to="ff_Latn_GN"/>
+ <alias from="ff_MR" to="ff_Latn_MR"/>
+ <alias from="ff_SN" to="ff_Latn_SN"/>
<alias from="in" to="id"/>
<alias from="in_ID" to="id_ID"/>
<alias from="iw" to="he"/>
<alias from="iw_IL" to="he_IL"/>
<alias from="ja_JP_TRADITIONAL" to="ja_JP" rbpath="/calendar/default" value="japanese"/>
- <alias from="mo" to="ro_MD"/>
+ <alias from="mo" to="ro"/>
<alias from="no_NO" to="nb_NO"/>
<alias from="no_NO_NY" to="nn_NO"/>
<alias from="no" to="nb"/>
diff --git a/Build/source/libs/icu/icu-src/source/data/icu-rbnf-deprecates.xml b/Build/source/libs/icu/icu-src/source/data/icu-rbnf-deprecates.xml
index 22df252f11c..d933a2d4906 100644
--- a/Build/source/libs/icu/icu-src/source/data/icu-rbnf-deprecates.xml
+++ b/Build/source/libs/icu/icu-src/source/data/icu-rbnf-deprecates.xml
@@ -8,6 +8,10 @@
*******************************************************************************
*/
-->
+<!--
+TODO: Most of these aliases are CLDR parent locales. Is this separate list
+necessary and can we just use the main list in icu-locale-deprecates.xml?
+-->
<deprecates>
<alias from="ars" to="ar" />
<alias from="es_DO" to="es_419" />
diff --git a/Build/source/libs/icu/icu-src/source/data/icu4j-readme.txt b/Build/source/libs/icu/icu-src/source/data/icu4j-readme.txt
index 943d722dedf..6a38bd62c17 100644
--- a/Build/source/libs/icu/icu-src/source/data/icu4j-readme.txt
+++ b/Build/source/libs/icu/icu-src/source/data/icu4j-readme.txt
@@ -17,9 +17,20 @@ In the following,
$icu4j_root is the ICU4J root directory
$jdk_bin is the JDK bin directory (for the jar tool)
-1. Download and build ICU4C. For more instructions on downloading and building
- ICU4C, see the ICU4C readme at:
- http://source.icu-project.org/repos/icu/trunk/icu4c/readme.html#HowToBuild
+1. *Linux*
+ Download, configure, and build ICU4C. When you configure ICU4C, you must
+ set the environment variable ICU_DATA_BUILDTOOL_OPTS to
+ "--include_uni_core_data" to build additional required ICU4J data:
+
+ ICU_DATA_BUILDTOOL_OPTS=--include_uni_core_data ./runConfigureICU Linux
+
+ *Windows*
+ - Add ICU_DATA_BUILDTOOL_OPTS as a system environment variable with value "--include_uni_core_data"
+ - Build $icu4c_root\source\allinone\allinone.sln in Visual Studio
+
+ For more instructions on downloading and building ICU4C,
+ see the ICU4C readme at:
+ https://htmlpreview.github.io/?https://github.com/unicode-org/icu/blob/master/icu4c/readme.html#HowToBuild
(Windows: build as 'x86, Release' otherwise you will have to set 'CFG' differently below.)
*NOTE* You should do a full rebuild after any data changes.
@@ -32,10 +43,10 @@ platform.
*Windows*
-2a. On the command line, cd to $icu4c_root\source\data.
+2a. On Developer Command Prompt for VS, cd to $icu4c_root\source\data.
-2b. On the command line,
- nmake -f makedata.mak ICUMAKE=$icu4c_root\source\data\ CFG=x86\Release JAR="$jdk_bin\jar" ICU4J_ROOT=$icu4j_root icu4j-data-install
+2b. On Developer Command Prompt for VS,
+ nmake -f makedata.mak ICUMAKE=$icu4c_root\source\data\ CFG=x86\Release JAR="$jdk_bin\jar" ICU4J_ROOT=$icu4j_root icu4j-data-install
Continue with step 3 below, in Java:
@@ -65,3 +76,7 @@ icutzdata.jar in $icu4j_root/main/shared/data.
cd $icu4j_root
ant main
+
+ Run the tests locally and make sure they pass:
+
+ ant check
diff --git a/Build/source/libs/icu/icu-src/source/data/in/coll/ucadata-implicithan.icu b/Build/source/libs/icu/icu-src/source/data/in/coll/ucadata-implicithan.icu
index f31a19dca0e..296515d1ece 100644
--- a/Build/source/libs/icu/icu-src/source/data/in/coll/ucadata-implicithan.icu
+++ b/Build/source/libs/icu/icu-src/source/data/in/coll/ucadata-implicithan.icu
Binary files differ
diff --git a/Build/source/libs/icu/icu-src/source/data/in/coll/ucadata-unihan.icu b/Build/source/libs/icu/icu-src/source/data/in/coll/ucadata-unihan.icu
index 6d1a8f54152..3c86fd12dd4 100644
--- a/Build/source/libs/icu/icu-src/source/data/in/coll/ucadata-unihan.icu
+++ b/Build/source/libs/icu/icu-src/source/data/in/coll/ucadata-unihan.icu
Binary files differ
diff --git a/Build/source/libs/icu/icu-src/source/data/in/icudt63l.dat b/Build/source/libs/icu/icu-src/source/data/in/icudt65l.dat
index 0fb2d5d89c3..288bf20dbf9 100644
--- a/Build/source/libs/icu/icu-src/source/data/in/icudt63l.dat
+++ b/Build/source/libs/icu/icu-src/source/data/in/icudt65l.dat
Binary files differ
diff --git a/Build/source/libs/icu/icu-src/source/data/in/nfc.nrm b/Build/source/libs/icu/icu-src/source/data/in/nfc.nrm
index 6566a2cd902..5691b2bcb61 100644
--- a/Build/source/libs/icu/icu-src/source/data/in/nfc.nrm
+++ b/Build/source/libs/icu/icu-src/source/data/in/nfc.nrm
Binary files differ
diff --git a/Build/source/libs/icu/icu-src/source/data/in/nfkc.nrm b/Build/source/libs/icu/icu-src/source/data/in/nfkc.nrm
index 4d1fe7d75ca..b0f4405451f 100644
--- a/Build/source/libs/icu/icu-src/source/data/in/nfkc.nrm
+++ b/Build/source/libs/icu/icu-src/source/data/in/nfkc.nrm
Binary files differ
diff --git a/Build/source/libs/icu/icu-src/source/data/in/nfkc_cf.nrm b/Build/source/libs/icu/icu-src/source/data/in/nfkc_cf.nrm
index e2180cfdd9f..eef4e62e583 100644
--- a/Build/source/libs/icu/icu-src/source/data/in/nfkc_cf.nrm
+++ b/Build/source/libs/icu/icu-src/source/data/in/nfkc_cf.nrm
Binary files differ
diff --git a/Build/source/libs/icu/icu-src/source/data/in/pnames.icu b/Build/source/libs/icu/icu-src/source/data/in/pnames.icu
index ca3998cb146..443a8e45e7c 100644
--- a/Build/source/libs/icu/icu-src/source/data/in/pnames.icu
+++ b/Build/source/libs/icu/icu-src/source/data/in/pnames.icu
Binary files differ
diff --git a/Build/source/libs/icu/icu-src/source/data/in/ubidi.icu b/Build/source/libs/icu/icu-src/source/data/in/ubidi.icu
index 86fa21f7dd5..df3bbb8fad7 100644
--- a/Build/source/libs/icu/icu-src/source/data/in/ubidi.icu
+++ b/Build/source/libs/icu/icu-src/source/data/in/ubidi.icu
Binary files differ
diff --git a/Build/source/libs/icu/icu-src/source/data/in/ucase.icu b/Build/source/libs/icu/icu-src/source/data/in/ucase.icu
index 136f0a620df..cb65fe77397 100644
--- a/Build/source/libs/icu/icu-src/source/data/in/ucase.icu
+++ b/Build/source/libs/icu/icu-src/source/data/in/ucase.icu
Binary files differ
diff --git a/Build/source/libs/icu/icu-src/source/data/in/ulayout.icu b/Build/source/libs/icu/icu-src/source/data/in/ulayout.icu
new file mode 100644
index 00000000000..c129d1ba0df
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/data/in/ulayout.icu
Binary files differ
diff --git a/Build/source/libs/icu/icu-src/source/data/in/unames.icu b/Build/source/libs/icu/icu-src/source/data/in/unames.icu
index ce549a4829a..77ff1fd4687 100644
--- a/Build/source/libs/icu/icu-src/source/data/in/unames.icu
+++ b/Build/source/libs/icu/icu-src/source/data/in/unames.icu
Binary files differ
diff --git a/Build/source/libs/icu/icu-src/source/data/in/uprops.icu b/Build/source/libs/icu/icu-src/source/data/in/uprops.icu
index 2bc695d76bb..4a16695e31f 100644
--- a/Build/source/libs/icu/icu-src/source/data/in/uprops.icu
+++ b/Build/source/libs/icu/icu-src/source/data/in/uprops.icu
Binary files differ
diff --git a/Build/source/libs/icu/icu-src/source/data/in/uts46.nrm b/Build/source/libs/icu/icu-src/source/data/in/uts46.nrm
index 4bae51640a7..210b4d6a6da 100644
--- a/Build/source/libs/icu/icu-src/source/data/in/uts46.nrm
+++ b/Build/source/libs/icu/icu-src/source/data/in/uts46.nrm
Binary files differ
diff --git a/Build/source/libs/icu/icu-src/source/data/makedata.mak b/Build/source/libs/icu/icu-src/source/data/makedata.mak
index 6a54d0acc8e..dfd6273931a 100644
--- a/Build/source/libs/icu/icu-src/source/data/makedata.mak
+++ b/Build/source/libs/icu/icu-src/source/data/makedata.mak
@@ -12,14 +12,14 @@
##############################################################################
# Keep the following in sync with the version - see common/unicode/uvernum.h
-U_ICUDATA_NAME=icudt63
+U_ICUDATA_NAME=icudt65
##############################################################################
!IF "$(UWP)" == "UWP"
# Optionally change the name of the data file for the UWP version.
-U_ICUDATA_NAME=icudt63
+U_ICUDATA_NAME=icudt65
!ENDIF
U_ICUDATA_ENDIAN_SUFFIX=l
-UNICODE_VERSION=11.0
+UNICODE_VERSION=12.1
ICU_LIB_TARGET=$(DLL_OUTPUT)\$(U_ICUDATA_NAME).dll
# ICUMAKE
@@ -33,12 +33,8 @@ ICU_LIB_TARGET=$(DLL_OUTPUT)\$(U_ICUDATA_NAME).dll
!ENDIF
!MESSAGE ICU data make path is $(ICUMAKE)
-!IF [py -3]!=0
-!MESSAGE Information: Unable to find Python 3. ICU versions 64 and later will require Python 3 to build.
-!MESSAGE Information: See ICU-10923 for more information: https://unicode-org.atlassian.net/browse/ICU-10923
-!ELSE
-!MESSAGE Information: Found Python 3. You are all set for ICU 64, which will require Python 3 to build.
-!MESSAGE Information: For more info on Python 3 requirement, see: https://unicode-org.atlassian.net/browse/ICU-10923
+!IF [py -3 -c "exit(0)"]!=0
+!MESSAGE Information: Unable to find Python 3. Data will fail to build from source.
!ENDIF
# Suffixes for data files
@@ -72,15 +68,10 @@ ICUP=$(ICUP:\source\data\\..\..=)
ICUSRCDATA=$(ICUP)\source\data
ICUSRCDATA_RELATIVE_PATH=..\..\..
-# ICUUCM
-# The directory that contains ucmcore.mk files along with *.ucm files
-#
-ICUUCM=mappings
-
-# ICULOC
-# The directory that contains resfiles.mk files along with *.txt locale data files
-#
-ICULOC=locales
+# Timestamp files to keep track of current build state
+TOOLS_TS=$(ICUTMP)\tools.timestamp
+COREDATA_TS=$(ICUTMP)\coredata.timestamp
+ARM_CROSSBUILD_TS=
# ICUCOL
# The directory that contains colfiles.mk files along with *.txt collation data files
@@ -102,23 +93,6 @@ ICUTRNS=translit
#
ICUBRK=brkitr
-# ICUUNIDATA
-# The directory that contains Unicode data files
-#
-ICUUNIDATA=$(ICUP)\source\data\unidata
-
-
-# ICUMISC
-# The directory that contains miscfiles.mk along with files that are miscelleneous data
-#
-ICUMISC=$(ICUP)\source\data\misc
-ICUMISC2=misc
-
-# ICUSPREP
-# The directory that contains sprepfiles.mk files along with *.txt stringprep files
-#
-ICUSPREP=sprep
-
#
# ICUDATA
# The source directory. Contains the source files for the common data to be built.
@@ -133,6 +107,8 @@ ICUDATA=$(ICUP)\source\data
#
!IF "$(CFG)" == "ARM\Release" || "$(CFG)" == "ARM\Debug"
DLL_OUTPUT=$(ICUP)\binARM$(UWP)
+!ELSE IF "$(CFG)" == "ARM64\Release" || "$(CFG)" == "ARM64\Debug"
+DLL_OUTPUT=$(ICUP)\binARM64$(UWP)
!ELSE IF "$(CFG)" == "x64\Release" || "$(CFG)" == "x64\Debug"
DLL_OUTPUT=$(ICUP)\bin64$(UWP)
!ELSE IF "$(UWP)" == "UWP"
@@ -140,6 +116,7 @@ DLL_OUTPUT=$(ICUP)\bin32$(UWP)
!ELSE
DLL_OUTPUT=$(ICUP)\bin$(UWP)
!ENDIF
+!MESSAGE ICU data DLL_OUTPUT path is $(DLL_OUTPUT)
#
# TESTDATA
@@ -153,7 +130,7 @@ TESTDATAOUT=$(ICUP)\source\test\testdata\out
#
# TESTDATABLD
-# The build directory for test data intermidiate files
+# The build directory for test data intermediate files
# (Tests are NOT run from this makefile,
# only the data is put in place.)
TESTDATABLD=$(ICUP)\source\test\testdata\out\build
@@ -165,20 +142,39 @@ TESTDATABLD=$(ICUP)\source\test\testdata\out\build
ICUTOOLS=$(ICUP)\source\tools
!MESSAGE ICU tools path is $(ICUTOOLS)
+# ARM_CROSS_BUILD
+# In order to support cross-compiling for ARM/ARM64 using the x64 tools
+# we need to know if we're building the ARM/ARM64 data DLL, otherwise
+# the existence of the x64 bits will cause us to think we are already done.
+# Note: This is only for the "regular" builds, the UWP builds have a separate project file entirely.
+ARM_CROSS_BUILD=
+!IF "$(UWP)" == ""
+!IF "$(CFG)" == "ARM\Release" || "$(CFG)" == "ARM\Debug"
+ARM_CROSS_BUILD=ARM
+ARM_CROSSBUILD_TS=$(ICUTMP)\$(ARM_CROSS_BUILD).timestamp
+!ELSE IF "$(CFG)" == "ARM64\Release" || "$(CFG)" == "ARM64\Debug"
+ARM_CROSS_BUILD=ARM64
+ARM_CROSSBUILD_TS=$(ICUTMP)\$(ARM_CROSS_BUILD).timestamp
+!ENDIF
+!ENDIF
+
#
# TOOLS CFG PATH
-# ARM needs to use one of the other tools, so make sure to get an usable cfg path
+# Generally the tools want to run on the same architecture as is being built.
+# Thus ARM and ARM64 need to use another build of the other tools, so make sure to get an usable cfg path.
# Since tools, particularly pkggen, have architecture built-in, we made x64 on
# Windows be machine-independent and use those tools.
#
+!IF "$(ARM_CROSS_BUILD)" == ""
CFGTOOLS=$(CFG)
-!IF "$(CFG)" == "ARM\Release" || "$(CFG)" == "ARM\Debug"
+!ELSE
CFGTOOLS=x64\Release
!ENDIF
!MESSAGE ICU tools CFG subpath is $(CFGTOOLS)
+
# The current ICU tools need to be in the path first.
-# x86 uses x86, x64 and arm use x64
+# x86 uses x86; x64, arm, and arm64 use x64
!IF "$(CFG)" == "x86\Release" || "$(CFG)" == "x86\Debug"
PATH = $(ICUP)\bin;$(PATH)
ICUPBIN=$(ICUP)\bin
@@ -210,353 +206,19 @@ ICUDATA_SOURCE_ARCHIVE=$(ICUTMP)\$(ICUPKG).dat
!IFDEF ICUDATA_SOURCE_ARCHIVE
!MESSAGE ICU data source archive is $(ICUDATA_SOURCE_ARCHIVE)
-!ELSE
-# We're including a list of .ucm files.
-# There are several lists, they are all optional.
-
-# Always build the mapping files for the EBCDIC fallback codepages
-# They are necessary on EBCDIC machines, and
-# the following logic is much easier if UCM_SOURCE is never empty.
-# (They are small.)
-UCM_SOURCE=ibm-37_P100-1995.ucm ibm-1047_P100-1995.ucm
-
-!IF EXISTS("$(ICUSRCDATA)\$(ICUUCM)\ucmcore.mk")
-!INCLUDE "$(ICUSRCDATA)\$(ICUUCM)\ucmcore.mk"
-UCM_SOURCE=$(UCM_SOURCE) $(UCM_SOURCE_CORE)
-!ELSE
-!MESSAGE Warning: cannot find "ucmcore.mk". Not building core MIME/Unix/Windows converter files.
-!ENDIF
-
-!IF EXISTS("$(ICUSRCDATA)\$(ICUUCM)\ucmfiles.mk")
-!INCLUDE "$(ICUSRCDATA)\$(ICUUCM)\ucmfiles.mk"
-UCM_SOURCE=$(UCM_SOURCE) $(UCM_SOURCE_FILES)
-!ELSE
-!MESSAGE Warning: cannot find "ucmfiles.mk". Not building many converter files.
-!ENDIF
-
-!IF EXISTS("$(ICUSRCDATA)\$(ICUUCM)\ucmebcdic.mk")
-!INCLUDE "$(ICUSRCDATA)\$(ICUUCM)\ucmebcdic.mk"
-UCM_SOURCE=$(UCM_SOURCE) $(UCM_SOURCE_EBCDIC)
-!IFDEF UCM_SOURCE_EBCDIC_IGNORE_SISO
-BUILD_SPECIAL_CNV_FILES=YES
-UCM_SOURCE_SPECIAL=$(UCM_SOURCE_EBCDIC_IGNORE_SISO)
-!ELSE
-!UNDEF BUILD_SPECIAL_CNV_FILES
-!ENDIF
-!ELSE
-!MESSAGE Warning: cannot find "ucmebcdic.mk". Not building EBCDIC converter files.
-!ENDIF
-
-!IF EXISTS("$(ICUSRCDATA)\$(ICUUCM)\ucmlocal.mk")
-!INCLUDE "$(ICUSRCDATA)\$(ICUUCM)\ucmlocal.mk"
-!IFDEF UCM_SOURCE_LOCAL
-UCM_SOURCE=$(UCM_SOURCE) $(UCM_SOURCE_LOCAL)
-!ENDIF
-!IFDEF UCM_SOURCE_EBCDIC_IGNORE_SISO_LOCAL
-UCM_SOURCE_SPECIAL=$(UCM_SOURCE_SPECIAL) $(UCM_SOURCE_EBCDIC_IGNORE_SISO_LOCAL)
-BUILD_SPECIAL_CNV_FILES=YES
-!ENDIF
-!ELSE
-!MESSAGE Information: cannot find "ucmlocal.mk". Not building user-additional converter files.
-!ENDIF
-
-CNV_FILES=$(UCM_SOURCE:.ucm=.cnv)
-!IFDEF BUILD_SPECIAL_CNV_FILES
-CNV_FILES_SPECIAL=$(UCM_SOURCE_SPECIAL:.ucm=.cnv)
-!ENDIF
-
-!IF EXISTS("$(ICUSRCDATA)\$(ICUBRK)\brkfiles.mk")
-!INCLUDE "$(ICUSRCDATA)\$(ICUBRK)\brkfiles.mk"
-!IF EXISTS("$(ICUSRCDATA)\$(ICUBRK)\brklocal.mk")
-!INCLUDE "$(ICUSRCDATA)\$(ICUBRK)\brklocal.mk"
-!IFDEF BRK_SOURCE_LOCAL
-BRK_SOURCE=$(BRK_SOURCE) $(BRK_SOURCE_LOCAL)
-!ENDIF
-!IFDEF BRK_DICT_SOURCE_LOCAL
-BRK_DICT_SOURCE=$(BRK_DICT_SOURCE) $(BRK_DICT_SOURCE_LOCAL)
-!ENDIF
-!IFDEF BRK_RES_SOURCE_LOCAL
-BRK_RES_SOURCE=$(BRK_RES_SOURCE) $(BRK_RES_SOURCE_LOCAL)
-!ENDIF
-!ELSE
-!MESSAGE Information: cannot find "brklocal.mk". Not building user-additional break iterator files.
-!ENDIF
-!ELSE
-!MESSAGE Warning: cannot find "brkfiles.mk"
-!ENDIF
-
-#
-# Break iterator data files.
-#
-BRK_FILES=$(ICUBRK)\$(BRK_SOURCE:.txt =.brk brkitr\)
-BRK_FILES=$(BRK_FILES:.txt=.brk)
-BRK_FILES=$(BRK_FILES:brkitr\ =brkitr\)
-
-!IFDEF BRK_DICT_SOURCE
-BRK_DICT_FILES = $(ICUBRK)\$(BRK_DICT_SOURCE:.txt =.dict brkitr\)
-BRK_DICT_FILES = $(BRK_DICT_FILES:.txt=.dict)
-BRK_DICT_FILES = $(BRK_DICT_FILES:brkitr\ =brkitr\)
-!ENDIF
-
-!IFDEF BRK_RES_SOURCE
-BRK_RES_FILES = $(BRK_RES_SOURCE:.txt =.res brkitr\)
-BRK_RES_FILES = $(BRK_RES_FILES:.txt=.res)
-BRK_RES_FILES = $(ICUBRK)\root.res $(ICUBRK)\$(BRK_RES_FILES:brkitr\ =)
-ALL_RES = $(ALL_RES) $(ICUBRK)\res_index.res
-!ENDIF
-
-# Read list of locale resource bundle files
-!IF EXISTS("$(ICUSRCDATA)\$(ICULOC)\resfiles.mk")
-!INCLUDE "$(ICUSRCDATA)\$(ICULOC)\resfiles.mk"
-!IF EXISTS("$(ICUSRCDATA)\$(ICULOC)\reslocal.mk")
-!INCLUDE "$(ICUSRCDATA)\$(ICULOC)\reslocal.mk"
-!IFDEF GENRB_SOURCE_LOCAL
-GENRB_SOURCE=$(GENRB_SOURCE) $(GENRB_SOURCE_LOCAL)
-!ENDIF
-!ELSE
-!MESSAGE Information: cannot find "reslocal.mk". Not building user-additional resource bundle files.
-!ENDIF
-!ELSE
-!MESSAGE Warning: cannot find "resfiles.mk"
-!ENDIF
-
-!IFDEF GENRB_SOURCE
-RB_FILES = root.res pool.res $(GENRB_ALIAS_SOURCE:.txt=.res) $(GENRB_ALIAS_SOURCE_LOCAL:.txt=.res) $(GENRB_SOURCE:.txt=.res)
-ALL_RES = $(ALL_RES) res_index.res
-!ENDIF
-
-
-# Read the list of currency display name resource bundle files
-!IF EXISTS("$(ICUSRCDATA)\curr\resfiles.mk")
-!INCLUDE "$(ICUSRCDATA)\curr\resfiles.mk"
-!IF EXISTS("$(ICUSRCDATA)\curr\reslocal.mk")
-!INCLUDE "$(ICUSRCDATA)\curr\reslocal.mk"
-!IFDEF CURR_SOURCE_LOCAL
-CURR_SOURCE=$(CURR_SOURCE) $(CURR_SOURCE_LOCAL)
-!ENDIF
-!ELSE
-!MESSAGE Information: cannot find "curr\reslocal.mk". Not building user-additional resource bundle files.
-!ENDIF
-!ELSE
-!MESSAGE Warning: cannot find "curr\resfiles.mk"
-!ENDIF
-
-!IFDEF CURR_SOURCE
-CURR_FILES = curr\root.txt supplementalData.txt $(CURR_ALIAS_SOURCE) $(CURR_SOURCE)
-CURR_RES_FILES = $(CURR_FILES:.txt =.res curr\)
-CURR_RES_FILES = $(CURR_RES_FILES:.txt=.res)
-CURR_RES_FILES = curr\pool.res $(CURR_RES_FILES:curr\ =curr\)
-ALL_RES = $(ALL_RES) curr\res_index.res
-!ENDIF
-
-# Read the list of language/script display name resource bundle files
-!IF EXISTS("$(ICUSRCDATA)\lang\resfiles.mk")
-!INCLUDE "$(ICUSRCDATA)\lang\resfiles.mk"
-!IF EXISTS("$(ICUSRCDATA)\lang\reslocal.mk")
-!INCLUDE "$(ICUSRCDATA)\lang\reslocal.mk"
-!IFDEF LANG_SOURCE_LOCAL
-LANG_SOURCE=$(LANG_SOURCE) $(LANG_SOURCE_LOCAL)
-!ENDIF
-!ELSE
-!MESSAGE Information: cannot find "lang\reslocal.mk". Not building user-additional resource bundle files.
-!ENDIF
-!ELSE
-!MESSAGE Warning: cannot find "lang\resfiles.mk"
-!ENDIF
-
-!IFDEF LANG_SOURCE
-LANG_FILES = lang\root.txt $(LANG_ALIAS_SOURCE) $(LANG_SOURCE)
-LANG_RES_FILES = $(LANG_FILES:.txt =.res lang\)
-LANG_RES_FILES = $(LANG_RES_FILES:.txt=.res)
-LANG_RES_FILES = lang\pool.res $(LANG_RES_FILES:lang\ =lang\)
-ALL_RES = $(ALL_RES) lang\res_index.res
-!ENDIF
-
-# Read the list of region display name resource bundle files
-!IF EXISTS("$(ICUSRCDATA)\region\resfiles.mk")
-!INCLUDE "$(ICUSRCDATA)\region\resfiles.mk"
-!IF EXISTS("$(ICUSRCDATA)\region\reslocal.mk")
-!INCLUDE "$(ICUSRCDATA)\region\reslocal.mk"
-!IFDEF REGION_SOURCE_LOCAL
-REGION_SOURCE=$(REGION_SOURCE) $(REGION_SOURCE_LOCAL)
-!ENDIF
-!ELSE
-!MESSAGE Information: cannot find "region\reslocal.mk". Not building user-additional resource bundle files.
-!ENDIF
-!ELSE
-!MESSAGE Warning: cannot find "region\resfiles.mk"
!ENDIF
-!IFDEF REGION_SOURCE
-REGION_FILES = region\root.txt $(REGION_ALIAS_SOURCE) $(REGION_SOURCE)
-REGION_RES_FILES = $(REGION_FILES:.txt =.res region\)
-REGION_RES_FILES = $(REGION_RES_FILES:.txt=.res)
-REGION_RES_FILES = region\pool.res $(REGION_RES_FILES:region\ =region\)
-ALL_RES = $(ALL_RES) region\res_index.res
-!ENDIF
-
-# Read the list of time zone display name resource bundle files
-!IF EXISTS("$(ICUSRCDATA)\zone\resfiles.mk")
-!INCLUDE "$(ICUSRCDATA)\zone\resfiles.mk"
-!IF EXISTS("$(ICUSRCDATA)\zone\reslocal.mk")
-!INCLUDE "$(ICUSRCDATA)\zone\reslocal.mk"
-!IFDEF ZONE_SOURCE_LOCAL
-ZONE_SOURCE=$(ZONE_SOURCE) $(ZONE_SOURCE_LOCAL)
-!ENDIF
-!ELSE
-!MESSAGE Information: cannot find "zone\reslocal.mk". Not building user-additional resource bundle files.
-!ENDIF
-ZONE_SOURCE=$(ZONE_SOURCE) tzdbNames.txt
-!ELSE
-!MESSAGE Warning: cannot find "zone\resfiles.mk"
-!ENDIF
-
-!IFDEF ZONE_SOURCE
-ZONE_FILES = zone\root.txt $(ZONE_ALIAS_SOURCE) $(ZONE_SOURCE)
-ZONE_RES_FILES = $(ZONE_FILES:.txt =.res zone\)
-ZONE_RES_FILES = $(ZONE_RES_FILES:.txt=.res)
-ZONE_RES_FILES = zone\pool.res $(ZONE_RES_FILES:zone\ =zone\)
-ALL_RES = $(ALL_RES) zone\res_index.res
-!ENDIF
-
-# Read the list of units display name resource bundle files
-!IF EXISTS("$(ICUSRCDATA)\unit\resfiles.mk")
-!INCLUDE "$(ICUSRCDATA)\unit\resfiles.mk"
-!IF EXISTS("$(ICUSRCDATA)\unit\reslocal.mk")
-!INCLUDE "$(ICUSRCDATA)\unit\reslocal.mk"
-!IFDEF UNIT_SOURCE_LOCAL
-UNIT_SOURCE=$(UNIT_SOURCE) $(UNIT_SOURCE_LOCAL)
-!ENDIF
-!ELSE
-!MESSAGE Information: cannot find "unit\reslocal.mk". Not building user-additional resource bundle files.
-!ENDIF
-!ELSE
-!MESSAGE Warning: cannot find "unit\resfiles.mk"
-!ENDIF
-
-!IFDEF UNIT_SOURCE
-UNIT_FILES = unit\root.txt $(UNIT_ALIAS_SOURCE) $(UNIT_SOURCE)
-UNIT_RES_FILES = $(UNIT_FILES:.txt =.res unit\)
-UNIT_RES_FILES = $(UNIT_RES_FILES:.txt=.res)
-UNIT_RES_FILES = unit\pool.res $(UNIT_RES_FILES:unit\ =unit\)
-ALL_RES = $(ALL_RES) unit\res_index.res
-!ENDIF
-
-# Read the list of collation resource bundle files
-!IF EXISTS("$(ICUSRCDATA)\$(ICUCOL)\colfiles.mk")
-!INCLUDE "$(ICUSRCDATA)\$(ICUCOL)\colfiles.mk"
-!IF EXISTS("$(ICUSRCDATA)\$(ICUCOL)\collocal.mk")
-!INCLUDE "$(ICUSRCDATA)\$(ICUCOL)\collocal.mk"
-!IFDEF COLLATION_SOURCE_LOCAL
-COLLATION_SOURCE=$(COLLATION_SOURCE) $(COLLATION_SOURCE_LOCAL)
-!ENDIF
-!ELSE
-!MESSAGE Information: cannot find "collocal.mk". Not building user-additional resource bundle files.
-!ENDIF
-!ELSE
-!MESSAGE Warning: cannot find "colfiles.mk"
-!ENDIF
-
-!IFDEF COLLATION_SOURCE
-COL_FILES = $(ICUCOL)\root.txt $(COLLATION_ALIAS_SOURCE) $(COLLATION_SOURCE)
-COL_COL_FILES = $(COL_FILES:.txt =.res coll\)
-COL_COL_FILES = $(COL_COL_FILES:.txt=.res)
-COL_COL_FILES = $(COL_COL_FILES:coll\ =)
-ALL_RES = $(ALL_RES) $(ICUCOL)\res_index.res
-!ENDIF
-
-# Read the list of RBNF resource bundle files
-!IF EXISTS("$(ICUSRCDATA)\$(ICURBNF)\rbnffiles.mk")
-!INCLUDE "$(ICUSRCDATA)\$(ICURBNF)\rbnffiles.mk"
-!IF EXISTS("$(ICUSRCDATA)\$(ICURBNF)\rbnflocal.mk")
-!INCLUDE "$(ICUSRCDATA)\$(ICURBNF)\rbnflocal.mk"
-!IFDEF RBNF_SOURCE_LOCAL
-RBNF_SOURCE=$(RBNF_SOURCE) $(RBNF_SOURCE_LOCAL)
-!ENDIF
-!ELSE
-!MESSAGE Information: cannot find "rbnflocal.mk". Not building user-additional resource bundle files.
-!ENDIF
-!ELSE
-!MESSAGE Warning: cannot find "rbnffiles.mk"
-!ENDIF
-
-!IFDEF RBNF_SOURCE
-RBNF_FILES = $(ICURBNF)\root.txt $(RBNF_ALIAS_SOURCE) $(RBNF_SOURCE)
-RBNF_RES_FILES = $(RBNF_FILES:.txt =.res rbnf\)
-RBNF_RES_FILES = $(RBNF_RES_FILES:.txt=.res)
-RBNF_RES_FILES = $(RBNF_RES_FILES:rbnf\ =rbnf\)
-ALL_RES = $(ALL_RES) $(ICURBNF)\res_index.res
-!ENDIF
-
-# Read the list of transliterator resource bundle files
-!IF EXISTS("$(ICUSRCDATA)\$(ICUTRNS)\trnsfiles.mk")
-!INCLUDE "$(ICUSRCDATA)\$(ICUTRNS)\trnsfiles.mk"
-!IF EXISTS("$(ICUSRCDATA)\$(ICUTRNS)\trnslocal.mk")
-!INCLUDE "$(ICUSRCDATA)\$(ICUTRNS)\trnslocal.mk"
-!IFDEF TRANSLIT_SOURCE_LOCAL
-TRANSLIT_SOURCE=$(TRANSLIT_SOURCE) $(TRANSLIT_SOURCE_LOCAL)
-!ENDIF
-!ELSE
-!MESSAGE Information: cannot find "trnslocal.mk". Not building user-additional transliterator files.
-!ENDIF
-!ELSE
-!MESSAGE Warning: cannot find "trnsfiles.mk"
-!ENDIF
-
-!IFDEF TRANSLIT_SOURCE
-TRANSLIT_FILES = $(ICUTRNS)\$(TRANSLIT_ALIAS_SOURCE) $(TRANSLIT_SOURCE)
-TRANSLIT_RES_FILES = $(TRANSLIT_FILES:.txt =.res translit\)
-TRANSLIT_RES_FILES = $(TRANSLIT_RES_FILES:.txt=.res)
-TRANSLIT_RES_FILES = $(TRANSLIT_RES_FILES:translit\ =translit\)
-#ALL_RES = $(ALL_RES) $(ICUTRNS)\res_index.res
-!ENDIF
-
-# Read the list of miscellaneous resource bundle files
-!IF EXISTS("$(ICUSRCDATA)\$(ICUMISC2)\miscfiles.mk")
-!INCLUDE "$(ICUSRCDATA)\$(ICUMISC2)\miscfiles.mk"
-!IF EXISTS("$(ICUSRCDATA)\$(ICUMISC2)\misclocal.mk")
-!INCLUDE "$(ICUSRCDATA)\$(ICUMISC2)\misclocal.mk"
-!IFDEF MISC_SOURCE_LOCAL
-MISC_SOURCE=$(MISC_SOURCE) $(MISC_SOURCE_LOCAL)
-!ENDIF
-!ELSE
-!MESSAGE Information: cannot find "misclocal.mk". Not building user-additional miscellaenous files.
-!ENDIF
-!ELSE
-!MESSAGE Warning: cannot find "miscfiles.mk"
-!ENDIF
-
-MISC_FILES = $(MISC_SOURCE:.txt=.res)
-
-# don't include COL_FILES
-ALL_RES = $(ALL_RES) $(RB_FILES) $(MISC_FILES)
-!ENDIF
-
-# Read the list of stringprep profile files
-!IF EXISTS("$(ICUSRCDATA)\$(ICUSPREP)\sprepfiles.mk")
-!INCLUDE "$(ICUSRCDATA)\$(ICUSPREP)\sprepfiles.mk"
-!IF EXISTS("$(ICUSRCDATA)\$(ICUSPREP)\spreplocal.mk")
-!INCLUDE "$(ICUSRCDATA)\$(ICUSPREP)\spreplocal.mk"
-!IFDEF SPREP_SOURCE_LOCAL
-SPREP_SOURCE=$(SPREP_SOURCE) $(SPREP_SOURCE_LOCAL)
-!ENDIF
-!ELSE
-!MESSAGE Information: cannot find "spreplocal.mk". Not building user-additional stringprep files.
-!ENDIF
-!ELSE
-!MESSAGE Warning: cannot find "sprepfiles.mk"
-!ENDIF
-
-SPREP_FILES = $(SPREP_SOURCE:.txt=.spp)
-
# Common defines for both ways of building ICU's data library.
COMMON_ICUDATA_DEPENDENCIES="$(ICUPBIN)\pkgdata.exe" "$(ICUTMP)\icudata.res" "$(ICUP)\source\stubdata\stubdatabuilt.txt"
COMMON_ICUDATA_ARGUMENTS=-f -e $(U_ICUDATA_NAME) -v $(ICU_PACKAGE_MODE) -c -p $(ICUPKG) -T "$(ICUTMP)" -L $(U_ICUDATA_NAME) -d "$(ICUBLD_PKG)" -s .
!IF "$(UWP)" == "UWP"
COMMON_ICUDATA_ARGUMENTS=$(COMMON_ICUDATA_ARGUMENTS) -u
+!ENDIF
!IF "$(CFG)" == "ARM\Release" || "$(CFG)" == "ARM\Debug"
-COMMON_ICUDATA_ARGUMENTS=$(COMMON_ICUDATA_ARGUMENTS) -a
+COMMON_ICUDATA_ARGUMENTS=$(COMMON_ICUDATA_ARGUMENTS) -a ARM
!ENDIF
+!IF "$(CFG)" == "ARM64\Release" || "$(CFG)" == "ARM64\Debug"
+COMMON_ICUDATA_ARGUMENTS=$(COMMON_ICUDATA_ARGUMENTS) -a ARM64
!ENDIF
#############################################################################
@@ -568,6 +230,7 @@ COMMON_ICUDATA_ARGUMENTS=$(COMMON_ICUDATA_ARGUMENTS) -a
# Building the common dll in $(ICUBLD_PKG) unconditionally copies it to $(DLL_OUTPUT) too.
#
#############################################################################
+!IF "$(ARM_CROSS_BUILD)" == ""
ALL : GODATA "$(ICU_LIB_TARGET)" "$(TESTDATAOUT)\testdata.dat"
@echo All targets are up to date
@@ -576,6 +239,45 @@ ALL : GODATA "$(ICU_LIB_TARGET)" "$(TESTDATAOUT)\testdata.dat"
copy "$(ICUOUT)\$(U_ICUDATA_NAME)$(U_ICUDATA_ENDIAN_SUFFIX).dat" "$(ICUMAKE)\..\..\commondata\"
!ENDIF
+!ELSE
+ALL : GODATA "$(ICU_LIB_TARGET)" "$(TESTDATAOUT)\testdata.dat" $(ARM_CROSSBUILD_TS)
+ @echo All targets are up to date
+
+!ENDIF
+
+# Three main targets: tools, core data, and test data.
+# Keep track of whether they are built via timestamp files.
+
+$(TOOLS_TS): "$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb.exe" "$(ICUTOOLS)\gencnval\$(CFGTOOLS)\gencnval.exe" "$(ICUTOOLS)\gencfu\$(CFGTOOLS)\gencfu.exe" "$(ICUTOOLS)\icupkg\$(CFGTOOLS)\icupkg.exe" "$(ICUTOOLS)\makeconv\$(CFGTOOLS)\makeconv.exe" "$(ICUPBIN)\pkgdata.exe"
+ @echo "timestamp" > $(TOOLS_TS)
+
+# On Unix, Python generates at configure time a list of Makefile rules.
+# On Windows, however, we run the Python data build script at build time instead.
+# The alternative would be to use a preprocessor macro to generate rules for nmake.
+# However, this approach was abandoned for reasons including:
+#
+# - nmake imposes more stringent restrictions on command line length.
+# - The lack of gnumake features makes nmake file construction more complex.
+# - Windows builds are single-threaded, giving less advantage to a Makefile approach.
+#
+# Currently, the entire script needs to run even for small changes to data. Maybe consider
+# checking file-changed timestamps in Python to build only the required subset of data.
+
+$(COREDATA_TS):
+ @cd "$(ICUSRCDATA)"
+ set PYTHONPATH=$(ICUP)\source\python;%PYTHONPATH%
+ py -3 -B -m icutools.databuilder \
+ --mode windows-exec \
+ --src_dir "$(ICUSRCDATA)" \
+ --tool_dir "$(ICUTOOLS)" \
+ --tool_cfg "$(CFG)" \
+ --out_dir "$(ICUBLD_PKG)" \
+ --tmp_dir "$(ICUTMP)" \
+ --filter_file "$(ICU_DATA_FILTER_FILE)" \
+ $(ICU_DATA_BUILDTOOL_OPTS)
+ @echo "timestamp" > $(COREDATA_TS)
+
+
# The core Unicode properties files (uprops.icu, ucase.icu, ubidi.icu)
# are hardcoded in the common DLL and therefore not included in the data package any more.
# They are not built by default but need to be built for ICU4J data and for getting the .c source files
@@ -673,10 +375,10 @@ icu4j-data-install :
#
# testdata - nmake will invoke pkgdata, which will create testdata.dat
#
-"$(TESTDATAOUT)\testdata.dat": "$(TESTDATA)\*" "$(ICUBLD_PKG)\$(ICUCOL)\ucadata.icu" $(TRANSLIT_RES_FILES) $(MISC_FILES) $(RB_FILES) {"$(ICUTOOLS)\genrb\$(CFGTOOLS)"}genrb.exe
+"$(TESTDATAOUT)\testdata.dat": "$(TESTDATA)\*" $(TOOLS_TS) $(COREDATA_TS)
@cd "$(TESTDATA)"
@echo building testdata...
- nmake /nologo /f "$(TESTDATA)\testdata.mak" TESTDATA=. ICUTOOLS="$(ICUTOOLS)" ICUPBIN="$(ICUPBIN)" ICUP="$(ICUP)" CFG=$(CFGTOOLS) TESTDATAOUT="$(TESTDATAOUT)" TESTDATABLD="$(TESTDATABLD)"
+ nmake /nologo /f "$(TESTDATA)\testdata.mak" TESTDATA=. ICUTOOLS="$(ICUTOOLS)" ICUPBIN="$(ICUPBIN)" ICUP="$(ICUP)" CFG=$(CFGTOOLS) TESTDATAOUT="$(TESTDATAOUT)" TESTDATABLD="$(TESTDATABLD)" ICUSRCDATA="$(ICUSRCDATA)" DLL_OUTPUT="$(DLL_OUTPUT)"
#invoke pkgdata for ICU common data
# pkgdata will drop all output files (.dat, .dll, .lib) into the target (ICUBLD_PKG) directory.
@@ -697,73 +399,39 @@ icu4j-data-install :
copy "$(ICUTMP)\$(ICUPKG).dat" "$(ICUOUT)\$(U_ICUDATA_NAME)$(U_ICUDATA_ENDIAN_SUFFIX).dat"
-@erase "$(ICUTMP)\$(ICUPKG).dat"
!ELSE
-"$(ICU_LIB_TARGET)" : $(COMMON_ICUDATA_DEPENDENCIES) $(CNV_FILES) $(CNV_FILES_SPECIAL) "$(ICUBLD_PKG)\unames.icu" "$(ICUBLD_PKG)\cnvalias.icu" "$(ICUBLD_PKG)\nfkc.nrm" "$(ICUBLD_PKG)\nfkc_cf.nrm" "$(ICUBLD_PKG)\uts46.nrm" "$(ICUBLD_PKG)\$(ICUCOL)\ucadata.icu" $(CURR_RES_FILES) $(LANG_RES_FILES) $(REGION_RES_FILES) $(ZONE_RES_FILES) $(UNIT_RES_FILES) $(BRK_FILES) $(BRK_DICT_FILES) $(BRK_RES_FILES) $(ALL_RES) $(COL_COL_FILES) $(RBNF_RES_FILES) $(TRANSLIT_RES_FILES) $(SPREP_FILES) "$(ICUBLD_PKG)\confusables.cfu"
- @echo Building icu data
+"$(ICU_LIB_TARGET)" : $(COMMON_ICUDATA_DEPENDENCIES) $(COREDATA_TS)
+ @echo Building ICU data from scratch
cd "$(ICUBLD_PKG)"
- "$(ICUPBIN)\pkgdata" $(COMMON_ICUDATA_ARGUMENTS) <<"$(ICUTMP)\icudata.lst"
-unames.icu
-confusables.cfu
-$(ICUCOL)\ucadata.icu
-cnvalias.icu
-nfkc.nrm
-nfkc_cf.nrm
-uts46.nrm
-$(CNV_FILES:.cnv =.cnv
-)
-$(CNV_FILES_SPECIAL:.cnv =.cnv
-)
-$(ALL_RES:.res =.res
-)
-$(CURR_RES_FILES:.res =.res
-)
-$(LANG_RES_FILES:.res =.res
-)
-$(REGION_RES_FILES:.res =.res
-)
-$(ZONE_RES_FILES:.res =.res
-)
-$(UNIT_RES_FILES:.res =.res
-)
-$(COL_COL_FILES:.res =.res
-)
-$(RBNF_RES_FILES:.res =.res
-)
-$(TRANSLIT_RES_FILES:.res =.res
-)
-$(BRK_FILES:.brk =.brk
-)
-$(BRK_DICT_FILES:.dict =.dict
-)
-$(BRK_RES_FILES:.res =.res
-)
-$(SPREP_FILES:.spp=.spp
-)
-<<KEEP
+ "$(ICUPBIN)\pkgdata" $(COMMON_ICUDATA_ARGUMENTS) $(ICUTMP)\icudata.lst
-@erase "$(ICU_LIB_TARGET)"
- @if not exist "$(DLL_OUTPUT)" mkdir "$(DLL_OUTPUT)"
+ @if not exist "$(DLL_OUTPUT)" mkdir "$(DLL_OUTPUT)"
copy "$(U_ICUDATA_NAME).dll" "$(ICU_LIB_TARGET)"
-@erase "$(U_ICUDATA_NAME).dll"
copy "$(ICUTMP)\$(ICUPKG).dat" "$(ICUOUT)\$(U_ICUDATA_NAME)$(U_ICUDATA_ENDIAN_SUFFIX).dat"
-@erase "$(ICUTMP)\$(ICUPKG).dat"
!ENDIF
+"$(ARM_CROSSBUILD_TS)" : $(COMMON_ICUDATA_DEPENDENCIES) "$(ICU_LIB_TARGET)"
+ @echo Building ICU data for "$(ARM_CROSS_BUILD)" from x64
+ cd "$(ICUBLD_PKG)"
+ "$(ICUPBIN)\pkgdata" $(COMMON_ICUDATA_ARGUMENTS) $(ICUTMP)\icudata.lst
+ -@erase "$(ICU_LIB_TARGET)"
+ @if not exist "$(DLL_OUTPUT)" mkdir "$(DLL_OUTPUT)"
+ copy "$(U_ICUDATA_NAME).dll" "$(ICU_LIB_TARGET)"
+ -@erase "$(U_ICUDATA_NAME).dll"
+ copy "$(ICUTMP)\$(ICUPKG).dat" "$(ICUOUT)\$(U_ICUDATA_NAME)$(U_ICUDATA_ENDIAN_SUFFIX).dat"
+ -@erase "$(ICUTMP)\$(ICUPKG).dat"
+ @echo "timestamp" > $(ARM_CROSSBUILD_TS)
+
# utility target to create missing directories
+# Most directories are made by Python, but still create ICUTMP
+# so it works in the source archive
CREATE_DIRS :
@if not exist "$(ICUOUT)\$(NULL)" mkdir "$(ICUOUT)"
@if not exist "$(ICUTMP)\$(NULL)" mkdir "$(ICUTMP)"
@if not exist "$(ICUOUT)\build\$(NULL)" mkdir "$(ICUOUT)\build"
@if not exist "$(ICUBLD_PKG)\$(NULL)" mkdir "$(ICUBLD_PKG)"
- @if not exist "$(ICUBLD_PKG)\curr\$(NULL)" mkdir "$(ICUBLD_PKG)\curr"
- @if not exist "$(ICUBLD_PKG)\lang\$(NULL)" mkdir "$(ICUBLD_PKG)\lang"
- @if not exist "$(ICUBLD_PKG)\region\$(NULL)" mkdir "$(ICUBLD_PKG)\region"
- @if not exist "$(ICUBLD_PKG)\zone\$(NULL)" mkdir "$(ICUBLD_PKG)\zone"
- @if not exist "$(ICUBLD_PKG)\$(ICUBRK)\$(NULL)" mkdir "$(ICUBLD_PKG)\$(ICUBRK)"
- @if not exist "$(ICUBLD_PKG)\$(ICUCOL)\$(NULL)" mkdir "$(ICUBLD_PKG)\$(ICUCOL)"
- @if not exist "$(ICUBLD_PKG)\$(ICURBNF)\$(NULL)" mkdir "$(ICUBLD_PKG)\$(ICURBNF)"
- @if not exist "$(ICUBLD_PKG)\$(ICUTRNS)\$(NULL)" mkdir "$(ICUBLD_PKG)\$(ICUTRNS)"
- @if not exist "$(TESTDATAOUT)\$(NULL)" mkdir "$(TESTDATAOUT)"
- @if not exist "$(TESTDATABLD)\$(NULL)" mkdir "$(TESTDATABLD)"
- @if not exist "$(TESTDATAOUT)\testdata\$(NULL)" mkdir "$(TESTDATAOUT)\testdata"
+ @if not exist "$(TESTDATAOUT)" mkdir "$(TESTDATAOUT)"
# utility target to send us to the right dir
GODATA : CREATE_DIRS
@@ -772,306 +440,20 @@ GODATA : CREATE_DIRS
# This is to remove all the data files
CLEAN : GODATA
@echo Cleaning up the data files.
- @cd "$(ICUBLD_PKG)"
- -@erase "*.cnv"
- -@erase "*.exp"
- -@erase "*.icu"
- -@erase "*.lib"
- -@erase "*.nrm"
- -@erase "*.res"
- -@erase "*.spp"
- -@erase "*.txt"
- -@erase "*.cfu"
- -@erase "curr\*.res"
- -@erase "curr\*.txt"
- -@erase "lang\*.res"
- -@erase "lang\*.txt"
- -@erase "region\*.res"
- -@erase "region\*.txt"
- -@erase "zone\*.res"
- -@erase "zone\*.txt"
- @cd "$(ICUBLD_PKG)\$(ICUBRK)"
- -@erase "*.brk"
- -@erase "*.res"
- -@erase "*.txt"
- -@erase "*.dict"
- @cd "$(ICUBLD_PKG)\$(ICUCOL)"
- -@erase "*.res"
- -@erase "*.txt"
- @cd "$(ICUBLD_PKG)\$(ICURBNF)"
- -@erase "*.res"
- -@erase "*.txt"
- @cd "$(ICUBLD_PKG)\$(ICUTRNS)"
- -@erase "*.res"
@cd "$(ICUOUT)"
- -@erase "*.dat"
- @cd "$(ICUTMP)"
- -@erase "*.html"
- -@erase "*.lst"
- -@erase "*.mak"
- -@erase "*.obj"
- -@erase "*.res"
- @cd "$(TESTDATABLD)"
- -@erase "*.cnv"
- -@erase "*.icu"
- -@erase "*.mak"
- -@erase "*.nrm"
- -@erase "*.res"
- -@erase "*.spp"
- -@erase "*.txt"
- @cd "$(TESTDATAOUT)"
- -@erase "*.dat"
- @cd "$(TESTDATAOUT)\testdata"
- -@erase "*.typ"
- @cd "$(ICUBLD_PKG)"
-
-
-# RBBI .brk file generation.
-{$(ICUSRCDATA_RELATIVE_PATH)\$(ICUBRK)\rules}.txt.brk:
- @echo Creating $@
- @"$(ICUTOOLS)\genbrk\$(CFGTOOLS)\genbrk" -c -r $< -o $@ -d"$(ICUBLD_PKG)" -i "$(ICUBLD_PKG)"
-
-#RBBI .dict file generation.
-{$(ICUSRCDATA_RELATIVE_PATH)\$(ICUBRK)\dictionaries}.txt.dict:
- @echo Creating $@
- @"$(ICUTOOLS)\gendict\$(CFGTOOLS)\gendict" -c --uchars $< "$(ICUBLD_PKG)\$@"
-
-$(ICUBRK)\thaidict.dict:
- @echo Creating $(ICUBRK)\thaidict.dict
- @"$(ICUTOOLS)\gendict\$(CFGTOOLS)\gendict" -c --bytes --transform offset-0x0e00 $(ICUSRCDATA_RELATIVE_PATH)\$(ICUBRK)\dictionaries\thaidict.txt "$(ICUBLD_PKG)\$(ICUBRK)\thaidict.dict"
-
-$(ICUBRK)\laodict.dict:
- @echo Creating $(ICUBRK)\laodict.dict
- @"$(ICUTOOLS)\gendict\$(CFGTOOLS)\gendict" -c --bytes --transform offset-0x0e80 $(ICUSRCDATA_RELATIVE_PATH)\$(ICUBRK)\dictionaries\laodict.txt "$(ICUBLD_PKG)\$(ICUBRK)\laodict.dict"
-
-$(ICUBRK)\burmesedict.dict:
- @echo Creating $(ICUBRK)\burmesedict.dict
- @"$(ICUTOOLS)\gendict\$(CFGTOOLS)\gendict" -c --bytes --transform offset-0x1000 $(ICUSRCDATA_RELATIVE_PATH)\$(ICUBRK)\dictionaries\burmesedict.txt "$(ICUBLD_PKG)\$(ICUBRK)\burmesedict.dict"
-
-$(ICUBRK)\khmerdict.dict:
- @echo Creating $(ICUBRK)\khmerdict.dict
- @"$(ICUTOOLS)\gendict\$(CFGTOOLS)\gendict" -c --bytes --transform offset-0x1780 $(ICUSRCDATA_RELATIVE_PATH)\$(ICUBRK)\dictionaries\khmerdict.txt "$(ICUBLD_PKG)\$(ICUBRK)\khmerdict.dict"
-
-!IFNDEF ICUDATA_SOURCE_ARCHIVE
-# Rule for creating converters
-$(CNV_FILES): $(UCM_SOURCE)
- @echo Building Charset Conversion table $(@B)
- @"$(ICUTOOLS)\makeconv\$(CFGTOOLS)\makeconv" -c -d"$(ICUBLD_PKG)" $(ICUSRCDATA_RELATIVE_PATH)\$(ICUUCM)\$(@B).ucm
-!ENDIF
-
-!IFDEF BUILD_SPECIAL_CNV_FILES
-$(CNV_FILES_SPECIAL): $(UCM_SOURCE_SPECIAL)
- @echo Building Special Charset Conversion table $(@B)
- @"$(ICUTOOLS)\makeconv\$(CFGTOOLS)\makeconv" -c --ignore-siso-check -d"$(ICUBLD_PKG)" $(ICUSRCDATA_RELATIVE_PATH)\$(ICUUCM)\$(@B).ucm
-!ENDIF
-
-# Batch inference rule for creating miscellaneous resource files
-# TODO: -q option is specified to squelch the 120+ warnings about
-# empty intvectors and binary elements. Unfortunately, this may
-# squelch other legitimate warnings. When there is a better
-# way, remove the -q.
-{$(ICUSRCDATA_RELATIVE_PATH)\$(ICUMISC2)}.txt.res::
- @echo Making Miscellaneous Resource Bundle files
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" -k -q -d"$(ICUBLD_PKG)" $<
-
-# Inference rule for creating resource bundle files
-{$(ICUSRCDATA_RELATIVE_PATH)\$(ICULOC)}.txt.res::
- @echo Making Locale Resource Bundle files
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" --usePoolBundle $(ICUSRCDATA_RELATIVE_PATH)\$(ICULOC) -k -d"$(ICUBLD_PKG)" $<
-
-# copy the locales/pool.res file from the source folder to the build output folder
-# and swap it to native endianness
-pool.res: $(ICUSRCDATA_RELATIVE_PATH)\$(ICULOC)\pool.res
- "$(ICUPBIN)\icupkg" -tl "$(ICUSRCDATA_RELATIVE_PATH)\$(ICULOC)\pool.res" pool.res
-
-res_index.res:
- @echo Generating <<res_index.txt
-// Warning this file is automatically generated
-res_index:table(nofallback) {
- InstalledLocales {
- $(GENRB_SOURCE:.txt= {""}
- )
- }
-}
-<<KEEP
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" -k -d"$(ICUBLD_PKG)" .\res_index.txt
-
-
-{$(ICUSRCDATA_RELATIVE_PATH)\curr}.txt{curr}.res::
- @echo Making currency display name files
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" --usePoolBundle $(ICUSRCDATA_RELATIVE_PATH)\curr -k -i "$(ICUBLD_PKG)" -d"$(ICUBLD_PKG)\curr" $<
-
-# copy the curr/pool.res file from the source folder to the build output folder
-# and swap it to native endianness
-curr\pool.res: $(ICUSRCDATA_RELATIVE_PATH)\curr\pool.res
- "$(ICUPBIN)\icupkg" -tl "$(ICUSRCDATA_RELATIVE_PATH)\curr\pool.res" curr\pool.res
-
-curr\res_index.res:
- @echo Generating <<curr\res_index.txt
-// Warning this file is automatically generated
-res_index:table(nofallback) {
- InstalledLocales {
- $(CURR_SOURCE:.txt= {""}
- )
- }
-}
-<<KEEP
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" -k -d"$(ICUBLD_PKG)\curr" .\curr\res_index.txt
-
-
-{$(ICUSRCDATA_RELATIVE_PATH)\lang}.txt{lang}.res::
- @echo Making language/script display name files
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" --usePoolBundle $(ICUSRCDATA_RELATIVE_PATH)\lang -k -i "$(ICUBLD_PKG)" -d"$(ICUBLD_PKG)\lang" $<
-
-# copy the lang/pool.res file from the source folder to the build output folder
-# and swap it to native endianness
-lang\pool.res: $(ICUSRCDATA_RELATIVE_PATH)\lang\pool.res
- "$(ICUPBIN)\icupkg" -tl "$(ICUSRCDATA_RELATIVE_PATH)\lang\pool.res" lang\pool.res
-
-lang\res_index.res:
- @echo Generating <<lang\res_index.txt
-// Warning this file is automatically generated
-res_index:table(nofallback) {
- InstalledLocales {
- $(LANG_SOURCE:.txt= {""}
- )
- }
-}
-<<KEEP
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" -k -d"$(ICUBLD_PKG)\lang" .\lang\res_index.txt
-
-
-{$(ICUSRCDATA_RELATIVE_PATH)\region}.txt{region}.res::
- @echo Making region display name files
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" --usePoolBundle $(ICUSRCDATA_RELATIVE_PATH)\region -k -i "$(ICUBLD_PKG)" -d"$(ICUBLD_PKG)\region" $<
-
-# copy the region/pool.res file from the source folder to the build output folder
-# and swap it to native endianness
-region\pool.res: $(ICUSRCDATA_RELATIVE_PATH)\region\pool.res
- "$(ICUPBIN)\icupkg" -tl "$(ICUSRCDATA_RELATIVE_PATH)\region\pool.res" region\pool.res
-
-region\res_index.res:
- @echo Generating <<region\res_index.txt
-// Warning this file is automatically generated
-res_index:table(nofallback) {
- InstalledLocales {
- $(REGION_SOURCE:.txt= {""}
- )
- }
-}
-<<KEEP
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" -k -d"$(ICUBLD_PKG)\region" .\region\res_index.txt
-
-
-{$(ICUSRCDATA_RELATIVE_PATH)\zone}.txt{zone}.res::
- @echo Making time zone display name files
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" --usePoolBundle $(ICUSRCDATA_RELATIVE_PATH)\zone -k -i "$(ICUBLD_PKG)" -d"$(ICUBLD_PKG)\zone" $<
-
-# copy the zone/pool.res file from the source folder to the build output folder
-# and swap it to native endianness
-zone\pool.res: $(ICUSRCDATA_RELATIVE_PATH)\zone\pool.res
- "$(ICUPBIN)\icupkg" -tl "$(ICUSRCDATA_RELATIVE_PATH)\zone\pool.res" zone\pool.res
-
-zone\res_index.res:
- @echo Generating <<zone\res_index.txt
-// Warning this file is automatically generated
-res_index:table(nofallback) {
- InstalledLocales {
- $(ZONE_SOURCE:.txt= {""}
- )
- }
-}
-<<KEEP
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" -k -d"$(ICUBLD_PKG)\zone" .\zone\res_index.txt
-
-
-{$(ICUSRCDATA_RELATIVE_PATH)\unit}.txt{unit}.res::
- @echo Making unit display name files
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" --usePoolBundle $(ICUSRCDATA_RELATIVE_PATH)\unit -k -i "$(ICUBLD_PKG)" -d"$(ICUBLD_PKG)\unit" $<
-
-# copy the unit/pool.res file from the source folder to the build output folder
-# and swap it to native endianness
-unit\pool.res: $(ICUSRCDATA_RELATIVE_PATH)\unit\pool.res
- "$(ICUPBIN)\icupkg" -tl "$(ICUSRCDATA_RELATIVE_PATH)\unit\pool.res" unit\pool.res
-
-unit\res_index.res:
- @echo Generating <<unit\res_index.txt
-// Warning this file is automatically generated
-res_index:table(nofallback) {
- InstalledLocales {
- $(UNIT_SOURCE:.txt= {""}
- )
- }
-}
-<<KEEP
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" -k -d"$(ICUBLD_PKG)\unit" .\unit\res_index.txt
-
-
-{$(ICUSRCDATA_RELATIVE_PATH)\$(ICUCOL)}.txt{$(ICUCOL)}.res::
- @echo Making Collation files
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" -k -i "$(ICUBLD_PKG)" -d"$(ICUBLD_PKG)\$(ICUCOL)" $<
-
-$(ICUCOL)\res_index.res:
- @echo Generating <<$(ICUCOL)\res_index.txt
-// Warning this file is automatically generated
-res_index:table(nofallback) {
- InstalledLocales {
- $(COLLATION_SOURCE:.txt= {""}
- )
- }
-}
-<<KEEP
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" -k -d"$(ICUBLD_PKG)\$(ICUCOL)" .\$(ICUCOL)\res_index.txt
-
-{$(ICUSRCDATA_RELATIVE_PATH)\$(ICURBNF)}.txt{$(ICURBNF)}.res::
- @echo Making RBNF files
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" -k -i "$(ICUBLD_PKG)" -d"$(ICUBLD_PKG)\$(ICURBNF)" $<
-
-$(ICURBNF)\res_index.res:
- @echo Generating <<$(ICURBNF)\res_index.txt
-// Warning this file is automatically generated
-res_index:table(nofallback) {
- InstalledLocales {
- $(RBNF_SOURCE:.txt= {""}
- )
- }
-}
-<<KEEP
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" -k -d"$(ICUBLD_PKG)\$(ICURBNF)" .\$(ICURBNF)\res_index.txt
-
-$(ICUBRK)\res_index.res:
- @echo Generating <<$(ICUBRK)\res_index.txt
-// Warning this file is automatically generated
-res_index:table(nofallback) {
- InstalledLocales {
- $(BRK_RES_SOURCE:.txt= {""}
- )
- }
-}
-<<KEEP
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" -k -d"$(ICUBLD_PKG)\$(ICUBRK)" .\$(ICUBRK)\res_index.txt
-
-{$(ICUSRCDATA_RELATIVE_PATH)\$(ICUBRK)}.txt{$(ICUBRK)}.res::
- @echo Making Break Iterator Resource files
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" -k -i "$(ICUBLD_PKG)" -d"$(ICUBLD_PKG)\$(ICUBRK)" $<
-
-{$(ICUSRCDATA_RELATIVE_PATH)\$(ICUTRNS)}.txt{$(ICUTRNS)}.res::
- @echo Making Transliterator files
- @"$(ICUTOOLS)\genrb\$(CFGTOOLS)\genrb" -k -i "$(ICUBLD_PKG)" -d"$(ICUBLD_PKG)\$(ICUTRNS)" $<
-
+ -@erase "$(ICUOUT)\*.dat"
+ @rmdir $(ICUBLD) /s /q
+ @rmdir $(ICUTMP) /s /q
+ @rmdir $(TESTDATAOUT) /s /q
# DLL version information
# If you modify this, modify winmode.c in pkgdata.
-"$(ICUTMP)\icudata.res": "$(ICUMISC)\icudata.rc"
+"$(ICUTMP)\icudata.res": "$(ICUSRCDATA)\misc\icudata.rc"
@echo Creating data DLL version information from $**
@rc.exe /i "..\..\..\..\common" /r /fo $@ $**
-# Targets for converters
-"$(ICUBLD_PKG)\cnvalias.icu" : {"$(ICUSRCDATA)\$(ICUUCM)"}\convrtrs.txt "$(ICUTOOLS)\gencnval\$(CFGTOOLS)\gencnval.exe"
- @echo Creating data file for Converter Aliases
- @"$(ICUTOOLS)\gencnval\$(CFGTOOLS)\gencnval" -d "$(ICUBLD_PKG)" "$(ICUSRCDATA)\$(ICUUCM)\convrtrs.txt"
-
# Targets for prebuilt Unicode data
+# Needed for ICU4J!
"$(ICUBLD_PKG)\pnames.icu": $(ICUSRCDATA_RELATIVE_PATH)\in\pnames.icu
"$(ICUPBIN)\icupkg" -tl $? $@
@@ -1102,37 +484,8 @@ res_index:table(nofallback) {
"$(ICUBLD_PKG)\coll\ucadata.icu": $(ICUSRCDATA_RELATIVE_PATH)\in\coll\ucadata-unihan.icu
"$(ICUPBIN)\icupkg" -tl $? $@
-# Stringprep .spp file generation.
-{$(ICUSRCDATA_RELATIVE_PATH)\$(ICUSPREP)}.txt.spp:
- @echo Creating $@
- @"$(ICUTOOLS)\gensprep\$(CFGTOOLS)\gensprep" -s $(<D) -d "$(ICUBLD_PKG)" -b $(@B) -m "$(ICUUNIDATA)" -u 3.2.0 $(<F)
-
-# Confusables .cfu file generation
-# Can't use an inference rule because two .txt source files combine to produce a single .cfu output file
-"$(ICUBLD_PKG)\confusables.cfu": "$(ICUUNIDATA)\confusables.txt" "$(ICUUNIDATA)\confusablesWholeScript.txt" "$(ICUTOOLS)\gencfu\$(CFGTOOLS)\gencfu.exe"
- @echo Creating $@
- @"$(ICUTOOLS)\gencfu\$(CFGTOOLS)\gencfu" -c -r "$(ICUUNIDATA)\confusables.txt" -w "$(ICUUNIDATA)\confusablesWholeScript.txt" -o $@ -i "$(ICUBLD_PKG)"
!IFDEF ICUDATA_ARCHIVE
-"$(ICUDATA_SOURCE_ARCHIVE)": CREATE_DIRS $(ICUDATA_ARCHIVE) "$(ICUTOOLS)\icupkg\$(CFGTOOLS)\icupkg.exe"
+"$(ICUDATA_SOURCE_ARCHIVE)": CREATE_DIRS $(ICUDATA_ARCHIVE) $(TOOLS_TS)
"$(ICUTOOLS)\icupkg\$(CFGTOOLS)\icupkg" -t$(U_ICUDATA_ENDIAN_SUFFIX) "$(ICUDATA_ARCHIVE)" "$(ICUDATA_SOURCE_ARCHIVE)"
!ENDIF
-
-# Dependencies on the tools for the batch inference rules
-
-!IFNDEF ICUDATA_SOURCE_ARCHIVE
-$(UCM_SOURCE) : {"$(ICUTOOLS)\makeconv\$(CFGTOOLS)"}makeconv.exe
-
-!IFDEF BUILD_SPECIAL_CNV_FILES
-$(UCM_SOURCE_SPECIAL): {"$(ICUTOOLS)\makeconv\$(CFGTOOLS)"}makeconv.exe
-!ENDIF
-
-# This used to depend on "$(ICUBLD_PKG)\uprops.icu" "$(ICUBLD_PKG)\ucase.icu" "$(ICUBLD_PKG)\ubidi.icu"
-# This data is now hard coded as a part of the library.
-# See Jitterbug 4497 for details.
-$(MISC_SOURCE) $(RB_FILES) $(CURR_FILES) $(LANG_FILES) $(REGION_FILES) $(ZONE_FILES) $(UNIT_FILES) $(COL_COL_FILES) $(RBNF_RES_FILES) $(BRK_RES_FILES) $(TRANSLIT_RES_FILES): {"$(ICUTOOLS)\genrb\$(CFGTOOLS)"}genrb.exe "$(ICUBLD_PKG)\$(ICUCOL)\ucadata.icu"
-
-# This used to depend on "$(ICUBLD_PKG)\pnames.icu" "$(ICUBLD_PKG)\uprops.icu" "$(ICUBLD_PKG)\ucase.icu" "$(ICUBLD_PKG)\ubidi.icu"
-# These are now hardcoded in ICU4C and only loaded in ICU4J.
-$(BRK_SOURCE) : "$(ICUBLD_PKG)\unames.icu"
-!ENDIF
diff --git a/Build/source/libs/icu/icu-src/source/data/makedata.vcxproj b/Build/source/libs/icu/icu-src/source/data/makedata.vcxproj
index 9c94ae40c16..71ccafbc280 100644
--- a/Build/source/libs/icu/icu-src/source/data/makedata.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/data/makedata.vcxproj
@@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Label="Globals">
<ProjectGuid>{D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}</ProjectGuid>
<Keyword>MakeFileProj</Keyword>
@@ -9,6 +7,8 @@
<UseOfMfc>false</UseOfMfc>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -19,69 +19,26 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\data\tmp\x86\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\data\build\</IntDir>
- <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Release</NMakeBuildCommandLine>
- <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Release clean all</NMakeReBuildCommandLine>
- <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Release clean</NMakeCleanCommandLine>
- <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
- <NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
- <NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
- <NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
- <NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
- <NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\data\tmp\x86\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\data\build\</IntDir>
- <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Debug</NMakeBuildCommandLine>
- <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Debug clean all</NMakeReBuildCommandLine>
- <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Debug clean</NMakeCleanCommandLine>
- <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
- <NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
- <NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
- <NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
- <NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
- <NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\data\tmp\x64\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\data\build\</IntDir>
- <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Release</NMakeBuildCommandLine>
- <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Release clean all</NMakeReBuildCommandLine>
- <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Release clean</NMakeCleanCommandLine>
- <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
- <NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
- <NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
- <NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
- <NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
- <NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\data\tmp\x64\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\data\build\</IntDir>
- <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Debug</NMakeBuildCommandLine>
- <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Debug clean all</NMakeReBuildCommandLine>
- <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Debug clean</NMakeCleanCommandLine>
- <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
- <NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
- <NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
- <NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
- <NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
- <NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
+ <OutDir>.\data\tmp\$(Platform)\</OutDir>
+ <IntDir>.\data\build\</IntDir>
+ <MakeCFG>$(Platform)\$(Configuration)</MakeCFG>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\data\tmp\x86\</OutDir>
+ <MakeCFG Condition="'$(Platform)'=='Win32'">x86\$(Configuration)</MakeCFG>
+ <!-- NMake -->
+ <NMakeBuildCommandLine>NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=$(MakeCFG)</NMakeBuildCommandLine>
+ <NMakeReBuildCommandLine>NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=$(MakeCFG) clean all</NMakeReBuildCommandLine>
+ <NMakeCleanCommandLine>NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=$(MakeCFG) clean</NMakeCleanCommandLine>
+ <NMakeOutput/>
+ <NMakePreprocessorDefinitions>$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
+ <NMakeIncludeSearchPath>$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
+ <NMakeForcedIncludes>$(NMakeForcedIncludes)</NMakeForcedIncludes>
+ <NMakeAssemblySearchPath>$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
+ <NMakeForcedUsingAssemblies>$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
</PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <BuildLog>
- <Path>.\out\tmp\x86\ReleaseBuildLog.html</Path>
- </BuildLog>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <BuildLog>
- <Path>.\out\tmp\x86\DebugBuildLog.html</Path>
- </BuildLog>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <BuildLog>
- <Path>.\out\tmp\x64\ReleaseBuildLog.html</Path>
- </BuildLog>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ItemDefinitionGroup>
<BuildLog>
- <Path>.\out\tmp\x64\DebugBuildLog.html</Path>
+ <Path>.\data\log\$(Platform)\$(Configuration)BuildLog.html</Path>
</BuildLog>
</ItemDefinitionGroup>
<ItemGroup>
@@ -93,7 +50,6 @@
<None Include="locales\resfiles.mk" />
<None Include="..\test\testdata\testdata.mak" />
<None Include="translit\trnsfiles.mk" />
- <None Include="..\test\testdata\tstfiles.mk" />
<None Include="mappings\ucmcore.mk" />
<None Include="mappings\ucmebcdic.mk" />
<None Include="mappings\ucmfiles.mk" />
@@ -199,4 +155,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
-</Project> \ No newline at end of file
+</Project>
diff --git a/Build/source/libs/icu/icu-src/source/data/makedata.vcxproj.filters b/Build/source/libs/icu/icu-src/source/data/makedata.vcxproj.filters
index d37a4b28673..54bd3034bc1 100644
--- a/Build/source/libs/icu/icu-src/source/data/makedata.vcxproj.filters
+++ b/Build/source/libs/icu/icu-src/source/data/makedata.vcxproj.filters
@@ -35,9 +35,6 @@
<None Include="translit\trnsfiles.mk">
<Filter>Make Files</Filter>
</None>
- <None Include="..\test\testdata\tstfiles.mk">
- <Filter>Make Files</Filter>
- </None>
<None Include="mappings\ucmcore.mk">
<Filter>Make Files</Filter>
</None>
diff --git a/Build/source/libs/icu/icu-src/source/data/makedata_uwp.vcxproj b/Build/source/libs/icu/icu-src/source/data/makedata_uwp.vcxproj
index 8573b36e456..f89bac014b7 100644
--- a/Build/source/libs/icu/icu-src/source/data/makedata_uwp.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/data/makedata_uwp.vcxproj
@@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS UWP projects. -->
- <Import Project="..\allinone\Build.Windows.UWP.ProjectConfiguration.props" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
@@ -15,6 +13,10 @@
<Configuration>Debug</Configuration>
<Platform>ARM</Platform>
</ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|ARM64">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -27,6 +29,10 @@
<Configuration>Release</Configuration>
<Platform>ARM</Platform>
</ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM64">
+ <Configuration>Release</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{B1D53358-37BD-48BC-B27C-68BAF1E78508}</ProjectGuid>
@@ -35,6 +41,8 @@
<ConfigurationType>Makefile</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
</PropertyGroup>
+ <!-- The following import will include the 'default' configuration options for VS UWP projects. -->
+ <Import Project="..\allinone\Build.Windows.UWP.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -46,65 +54,20 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\data\tmp\x86\</OutDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\data\tmp\x86\</OutDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\data\tmp\x64\</OutDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\data\tmp\x64\</OutDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">.\data\tmp\arm\</OutDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">.\data\tmp\arm\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\data\build\</IntDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\data\build\</IntDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\data\build\</IntDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\data\build\</IntDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">.\data\build\</IntDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">.\data\build\</IntDir>
- <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Release UWP=UWP</NMakeBuildCommandLine>
- <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Release UWP=UWP clean all</NMakeReBuildCommandLine>
- <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Release UWP=UWP clean</NMakeCleanCommandLine>
- <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Debug UWP=UWP</NMakeBuildCommandLine>
- <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Debug UWP=UWP clean all</NMakeReBuildCommandLine>
- <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Debug UWP=UWP clean</NMakeCleanCommandLine>
- <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Release UWP=UWP</NMakeBuildCommandLine>
- <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Release UWP=UWP clean all</NMakeReBuildCommandLine>
- <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Release UWP=UWP clean</NMakeCleanCommandLine>
- <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Debug UWP=UWP</NMakeBuildCommandLine>
- <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Debug UWP=UWP clean all</NMakeReBuildCommandLine>
- <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Debug UWP=UWP clean</NMakeCleanCommandLine>
- <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=ARM\Release UWP=UWP</NMakeBuildCommandLine>
- <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=ARM\Release UWP=UWP clean all</NMakeReBuildCommandLine>
- <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=ARM\Release UWP=UWP clean</NMakeCleanCommandLine>
- <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=ARM\Debug UWP=UWP</NMakeBuildCommandLine>
- <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=ARM\Debug UWP=UWP clean all</NMakeReBuildCommandLine>
- <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=ARM\Debug UWP=UWP clean</NMakeCleanCommandLine>
+ <OutDir>.\data\tmp\$(Platform)\</OutDir>
+ <IntDir>.\data\build\</IntDir>
+ <MakeCFG>$(Platform)\$(Configuration)</MakeCFG>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\data\tmp\x86\</OutDir>
+ <MakeCFG Condition="'$(Platform)'=='Win32'">x86\$(Configuration)</MakeCFG>
+ <!-- NMake -->
+ <NMakeBuildCommandLine>NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=$(MakeCFG) UWP=UWP</NMakeBuildCommandLine>
+ <NMakeReBuildCommandLine>NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=$(MakeCFG) UWP=UWP clean all</NMakeReBuildCommandLine>
+ <NMakeCleanCommandLine>NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=$(MakeCFG) UWP=UWP clean</NMakeCleanCommandLine>
</PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <BuildLog>
- <Path>.\out\tmp\x86\ReleaseUWPBuildLog.html</Path>
- </BuildLog>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <BuildLog>
- <Path>.\out\tmp\x86\DebugUWPBuildLog.html</Path>
- </BuildLog>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <BuildLog>
- <Path>.\out\tmp\x64\ReleaseUWPBuildLog.html</Path>
- </BuildLog>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <BuildLog>
- <Path>.\out\tmp\x64\DebugUWPBuildLog.html</Path>
- </BuildLog>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
- <BuildLog>
- <Path>.\out\tmp\arm\ReleaseUWPBuildLog.html</Path>
- </BuildLog>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <ItemDefinitionGroup>
<BuildLog>
- <Path>.\out\tmp\arm\DebugUWPBuildLog.html</Path>
+ <Path>$(OutDir)$(Configuration)UWPBuildLog.html</Path>
</BuildLog>
</ItemDefinitionGroup>
<ItemGroup>
@@ -116,7 +79,6 @@
<None Include="locales\resfiles.mk" />
<None Include="..\test\testdata\testdata.mak" />
<None Include="translit\trnsfiles.mk" />
- <None Include="..\test\testdata\tstfiles.mk" />
<None Include="mappings\ucmcore.mk" />
<None Include="mappings\ucmebcdic.mk" />
<None Include="mappings\ucmfiles.mk" />
@@ -127,7 +89,10 @@
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
</ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <Target Name="Build" Condition="'$(SkipUWP)'=='true'">
+ <Message Text="Skipping building the UWP project: $(MSBuildThisFile)" Importance="high" />
+ </Target>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" Condition="'$(SkipUWP)'!='true'" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project> \ No newline at end of file
diff --git a/Build/source/libs/icu/icu-src/source/data/pkgdataMakefile.in b/Build/source/libs/icu/icu-src/source/data/pkgdataMakefile.in
index 4e21d03ce16..721ba1612f8 100644
--- a/Build/source/libs/icu/icu-src/source/data/pkgdataMakefile.in
+++ b/Build/source/libs/icu/icu-src/source/data/pkgdataMakefile.in
@@ -16,6 +16,7 @@ include $(top_builddir)/icudefs.mk
OUTPUTFILE=icupkg.inc
MIDDLE_SO_TARGET=
+PKGDATA_TRAILING_SPACE=" "
all : clean
@echo GENCCODE_ASSEMBLY_TYPE=$(GENCCODE_ASSEMBLY) >> $(OUTPUTFILE)
@@ -36,7 +37,6 @@ all : clean
@echo RANLIB=$(RANLIB) >> $(OUTPUTFILE)
@echo INSTALL_CMD=$(INSTALL) >> $(OUTPUTFILE)
-
clean :
$(RMV) $(OUTPUTFILE)
diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/CaseFolding.txt b/Build/source/libs/icu/icu-src/source/data/unidata/CaseFolding.txt
index cce350f49c9..7eeb915abfd 100644
--- a/Build/source/libs/icu/icu-src/source/data/unidata/CaseFolding.txt
+++ b/Build/source/libs/icu/icu-src/source/data/unidata/CaseFolding.txt
@@ -1,6 +1,6 @@
-# CaseFolding-11.0.0.txt
-# Date: 2018-01-31, 08:20:09 GMT
-# © 2018 Unicode®, Inc.
+# CaseFolding-12.1.0.txt
+# Date: 2019-03-10, 10:53:00 GMT
+# © 2019 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@@ -1227,6 +1227,13 @@ A7B3; C; AB53; # LATIN CAPITAL LETTER CHI
A7B4; C; A7B5; # LATIN CAPITAL LETTER BETA
A7B6; C; A7B7; # LATIN CAPITAL LETTER OMEGA
A7B8; C; A7B9; # LATIN CAPITAL LETTER U WITH STROKE
+A7BA; C; A7BB; # LATIN CAPITAL LETTER GLOTTAL A
+A7BC; C; A7BD; # LATIN CAPITAL LETTER GLOTTAL I
+A7BE; C; A7BF; # LATIN CAPITAL LETTER GLOTTAL U
+A7C2; C; A7C3; # LATIN CAPITAL LETTER ANGLICANA W
+A7C4; C; A794; # LATIN CAPITAL LETTER C WITH PALATAL HOOK
+A7C5; C; 0282; # LATIN CAPITAL LETTER S WITH HOOK
+A7C6; C; 1D8E; # LATIN CAPITAL LETTER Z WITH PALATAL HOOK
AB70; C; 13A0; # CHEROKEE SMALL LETTER A
AB71; C; 13A1; # CHEROKEE SMALL LETTER E
AB72; C; 13A2; # CHEROKEE SMALL LETTER I
diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/DerivedCoreProperties.txt b/Build/source/libs/icu/icu-src/source/data/unidata/DerivedCoreProperties.txt
index 4048cc2b842..7856f2b40ab 100644
--- a/Build/source/libs/icu/icu-src/source/data/unidata/DerivedCoreProperties.txt
+++ b/Build/source/libs/icu/icu-src/source/data/unidata/DerivedCoreProperties.txt
@@ -1,6 +1,6 @@
-# DerivedCoreProperties-11.0.0.txt
-# Date: 2018-02-21, 05:34:02 GMT
-# © 2018 Unicode®, Inc.
+# DerivedCoreProperties-12.1.0.txt
+# Date: 2019-03-10, 10:53:06 GMT
+# © 2019 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@@ -530,16 +530,10 @@ FFE9..FFEC ; Math
0E4D ; Alphabetic
0E81..0E82 ; Alphabetic
0E84 ; Alphabetic
-0E87..0E88 ; Alphabetic
-0E8A ; Alphabetic
-0E8D ; Alphabetic
-0E94..0E97 ; Alphabetic
-0E99..0E9F ; Alphabetic
-0EA1..0EA3 ; Alphabetic
+0E86..0E8A ; Alphabetic
+0E8C..0EA3 ; Alphabetic
0EA5 ; Alphabetic
-0EA7 ; Alphabetic
-0EAA..0EAB ; Alphabetic
-0EAD..0EB0 ; Alphabetic
+0EA7..0EB0 ; Alphabetic
0EB1 ; Alphabetic
0EB2..0EB3 ; Alphabetic
0EB4..0EB9 ; Alphabetic
@@ -573,17 +567,20 @@ FFE9..FFEC ; Math
105A..105D ; Alphabetic
105E..1060 ; Alphabetic
1061 ; Alphabetic
-1062 ; Alphabetic
+1062..1064 ; Alphabetic
1065..1066 ; Alphabetic
-1067..1068 ; Alphabetic
+1067..106D ; Alphabetic
106E..1070 ; Alphabetic
1071..1074 ; Alphabetic
1075..1081 ; Alphabetic
1082 ; Alphabetic
1083..1084 ; Alphabetic
1085..1086 ; Alphabetic
+1087..108C ; Alphabetic
+108D ; Alphabetic
108E ; Alphabetic
-109C ; Alphabetic
+108F ; Alphabetic
+109A..109C ; Alphabetic
109D ; Alphabetic
10A0..10C5 ; Alphabetic
10C7 ; Alphabetic
@@ -607,7 +604,6 @@ FFE9..FFEC ; Math
12D8..1310 ; Alphabetic
1312..1315 ; Alphabetic
1318..135A ; Alphabetic
-135F ; Alphabetic
1380..138F ; Alphabetic
13A0..13F5 ; Alphabetic
13F8..13FD ; Alphabetic
@@ -703,6 +699,7 @@ FFE9..FFEC ; Math
1C24..1C2B ; Alphabetic
1C2C..1C33 ; Alphabetic
1C34..1C35 ; Alphabetic
+1C36 ; Alphabetic
1C4D..1C4F ; Alphabetic
1C5A..1C77 ; Alphabetic
1C78..1C7D ; Alphabetic
@@ -710,9 +707,9 @@ FFE9..FFEC ; Math
1C90..1CBA ; Alphabetic
1CBD..1CBF ; Alphabetic
1CE9..1CEC ; Alphabetic
-1CEE..1CF1 ; Alphabetic
-1CF2..1CF3 ; Alphabetic
+1CEE..1CF3 ; Alphabetic
1CF5..1CF6 ; Alphabetic
+1CFA ; Alphabetic
1D00..1D2B ; Alphabetic
1D2C..1D6A ; Alphabetic
1D6B..1D77 ; Alphabetic
@@ -829,13 +826,16 @@ A771..A787 ; Alphabetic
A788 ; Alphabetic
A78B..A78E ; Alphabetic
A78F ; Alphabetic
-A790..A7B9 ; Alphabetic
+A790..A7BF ; Alphabetic
+A7C2..A7C6 ; Alphabetic
A7F7 ; Alphabetic
A7F8..A7F9 ; Alphabetic
A7FA ; Alphabetic
A7FB..A801 ; Alphabetic
+A802 ; Alphabetic
A803..A805 ; Alphabetic
A807..A80A ; Alphabetic
+A80B ; Alphabetic
A80C..A822 ; Alphabetic
A823..A824 ; Alphabetic
A825..A826 ; Alphabetic
@@ -848,6 +848,7 @@ A8C5 ; Alphabetic
A8F2..A8F7 ; Alphabetic
A8FB ; Alphabetic
A8FD..A8FE ; Alphabetic
+A8FF ; Alphabetic
A90A..A925 ; Alphabetic
A926..A92A ; Alphabetic
A930..A946 ; Alphabetic
@@ -860,10 +861,11 @@ A984..A9B2 ; Alphabetic
A9B4..A9B5 ; Alphabetic
A9B6..A9B9 ; Alphabetic
A9BA..A9BB ; Alphabetic
-A9BC ; Alphabetic
-A9BD..A9BF ; Alphabetic
+A9BC..A9BD ; Alphabetic
+A9BE..A9BF ; Alphabetic
A9CF ; Alphabetic
A9E0..A9E4 ; Alphabetic
+A9E5 ; Alphabetic
A9E6 ; Alphabetic
A9E7..A9EF ; Alphabetic
A9FA..A9FE ; Alphabetic
@@ -882,6 +884,9 @@ AA60..AA6F ; Alphabetic
AA70 ; Alphabetic
AA71..AA76 ; Alphabetic
AA7A ; Alphabetic
+AA7B ; Alphabetic
+AA7C ; Alphabetic
+AA7D ; Alphabetic
AA7E..AAAF ; Alphabetic
AAB0 ; Alphabetic
AAB1 ; Alphabetic
@@ -908,7 +913,7 @@ AB20..AB26 ; Alphabetic
AB28..AB2E ; Alphabetic
AB30..AB5A ; Alphabetic
AB5C..AB5F ; Alphabetic
-AB60..AB65 ; Alphabetic
+AB60..AB67 ; Alphabetic
AB70..ABBF ; Alphabetic
ABC0..ABE2 ; Alphabetic
ABE3..ABE4 ; Alphabetic
@@ -1016,6 +1021,7 @@ FFDA..FFDC ; Alphabetic
10F00..10F1C ; Alphabetic
10F27 ; Alphabetic
10F30..10F45 ; Alphabetic
+10FE0..10FF6 ; Alphabetic
11000 ; Alphabetic
11001 ; Alphabetic
11002 ; Alphabetic
@@ -1087,6 +1093,7 @@ FFDA..FFDC ; Alphabetic
11443..11444 ; Alphabetic
11445 ; Alphabetic
11447..1144A ; Alphabetic
+1145F ; Alphabetic
11480..114AF ; Alphabetic
114B0..114B2 ; Alphabetic
114B3..114B8 ; Alphabetic
@@ -1119,6 +1126,7 @@ FFDA..FFDC ; Alphabetic
116AD ; Alphabetic
116AE..116AF ; Alphabetic
116B0..116B5 ; Alphabetic
+116B8 ; Alphabetic
11700..1171A ; Alphabetic
1171D..1171F ; Alphabetic
11720..11721 ; Alphabetic
@@ -1131,6 +1139,15 @@ FFDA..FFDC ; Alphabetic
11838 ; Alphabetic
118A0..118DF ; Alphabetic
118FF ; Alphabetic
+119A0..119A7 ; Alphabetic
+119AA..119D0 ; Alphabetic
+119D1..119D3 ; Alphabetic
+119D4..119D7 ; Alphabetic
+119DA..119DB ; Alphabetic
+119DC..119DF ; Alphabetic
+119E1 ; Alphabetic
+119E3 ; Alphabetic
+119E4 ; Alphabetic
11A00 ; Alphabetic
11A01..11A0A ; Alphabetic
11A0B..11A32 ; Alphabetic
@@ -1142,8 +1159,7 @@ FFDA..FFDC ; Alphabetic
11A51..11A56 ; Alphabetic
11A57..11A58 ; Alphabetic
11A59..11A5B ; Alphabetic
-11A5C..11A83 ; Alphabetic
-11A86..11A89 ; Alphabetic
+11A5C..11A89 ; Alphabetic
11A8A..11A96 ; Alphabetic
11A97 ; Alphabetic
11A9D ; Alphabetic
@@ -1194,19 +1210,23 @@ FFDA..FFDC ; Alphabetic
16A40..16A5E ; Alphabetic
16AD0..16AED ; Alphabetic
16B00..16B2F ; Alphabetic
-16B30..16B36 ; Alphabetic
16B40..16B43 ; Alphabetic
16B63..16B77 ; Alphabetic
16B7D..16B8F ; Alphabetic
16E40..16E7F ; Alphabetic
-16F00..16F44 ; Alphabetic
+16F00..16F4A ; Alphabetic
+16F4F ; Alphabetic
16F50 ; Alphabetic
-16F51..16F7E ; Alphabetic
+16F51..16F87 ; Alphabetic
+16F8F..16F92 ; Alphabetic
16F93..16F9F ; Alphabetic
16FE0..16FE1 ; Alphabetic
-17000..187F1 ; Alphabetic
+16FE3 ; Alphabetic
+17000..187F7 ; Alphabetic
18800..18AF2 ; Alphabetic
1B000..1B11E ; Alphabetic
+1B150..1B152 ; Alphabetic
+1B164..1B167 ; Alphabetic
1B170..1B2FB ; Alphabetic
1BC00..1BC6A ; Alphabetic
1BC70..1BC7C ; Alphabetic
@@ -1248,9 +1268,14 @@ FFDA..FFDC ; Alphabetic
1E01B..1E021 ; Alphabetic
1E023..1E024 ; Alphabetic
1E026..1E02A ; Alphabetic
+1E100..1E12C ; Alphabetic
+1E137..1E13D ; Alphabetic
+1E14E ; Alphabetic
+1E2C0..1E2EB ; Alphabetic
1E800..1E8C4 ; Alphabetic
1E900..1E943 ; Alphabetic
1E947 ; Alphabetic
+1E94B ; Alphabetic
1EE00..1EE03 ; Alphabetic
1EE05..1EE1F ; Alphabetic
1EE21..1EE22 ; Alphabetic
@@ -1294,7 +1319,7 @@ FFDA..FFDC ; Alphabetic
2CEB0..2EBE0 ; Alphabetic
2F800..2FA1D ; Alphabetic
-# Total code points: 126989
+# Total code points: 127256
# ================================================
@@ -1916,11 +1941,15 @@ A7AF ; Lowercase
A7B5 ; Lowercase
A7B7 ; Lowercase
A7B9 ; Lowercase
+A7BB ; Lowercase
+A7BD ; Lowercase
+A7BF ; Lowercase
+A7C3 ; Lowercase
A7F8..A7F9 ; Lowercase
A7FA ; Lowercase
AB30..AB5A ; Lowercase
AB5C..AB5F ; Lowercase
-AB60..AB65 ; Lowercase
+AB60..AB67 ; Lowercase
AB70..ABBF ; Lowercase
FB00..FB06 ; Lowercase
FB13..FB17 ; Lowercase
@@ -1960,7 +1989,7 @@ FF41..FF5A ; Lowercase
1D7CB ; Lowercase
1E922..1E943 ; Lowercase
-# Total code points: 2334
+# Total code points: 2340
# ================================================
@@ -2562,6 +2591,11 @@ A7AA..A7AE ; Uppercase
A7B0..A7B4 ; Uppercase
A7B6 ; Uppercase
A7B8 ; Uppercase
+A7BA ; Uppercase
+A7BC ; Uppercase
+A7BE ; Uppercase
+A7C2 ; Uppercase
+A7C4..A7C6 ; Uppercase
FF21..FF3A ; Uppercase
10400..10427 ; Uppercase
104B0..104D3 ; Uppercase
@@ -2604,7 +2638,7 @@ FF21..FF3A ; Uppercase
1F150..1F169 ; Uppercase
1F170..1F189 ; Uppercase
-# Total code points: 1901
+# Total code points: 1908
# ================================================
@@ -2713,12 +2747,13 @@ A722..A76F ; Cased
A770 ; Cased
A771..A787 ; Cased
A78B..A78E ; Cased
-A790..A7B9 ; Cased
+A790..A7BF ; Cased
+A7C2..A7C6 ; Cased
A7F8..A7F9 ; Cased
A7FA ; Cased
AB30..AB5A ; Cased
AB5C..AB5F ; Cased
-AB60..AB65 ; Cased
+AB60..AB67 ; Cased
AB70..ABBF ; Cased
FB00..FB06 ; Cased
FB13..FB17 ; Cased
@@ -2766,7 +2801,7 @@ FF41..FF5A ; Cased
1F150..1F169 ; Cased
1F170..1F189 ; Cased
-# Total code points: 4266
+# Total code points: 4279
# ================================================
@@ -2907,8 +2942,7 @@ FF41..FF5A ; Cased
0E46 ; Case_Ignorable
0E47..0E4E ; Case_Ignorable
0EB1 ; Case_Ignorable
-0EB4..0EB9 ; Case_Ignorable
-0EBB..0EBC ; Case_Ignorable
+0EB4..0EBC ; Case_Ignorable
0EC6 ; Case_Ignorable
0EC8..0ECD ; Case_Ignorable
0F18..0F19 ; Case_Ignorable
@@ -3058,7 +3092,7 @@ A947..A951 ; Case_Ignorable
A980..A982 ; Case_Ignorable
A9B3 ; Case_Ignorable
A9B6..A9B9 ; Case_Ignorable
-A9BC ; Case_Ignorable
+A9BC..A9BD ; Case_Ignorable
A9CF ; Case_Ignorable
A9E5 ; Case_Ignorable
A9E6 ; Case_Ignorable
@@ -3160,6 +3194,9 @@ FFF9..FFFB ; Case_Ignorable
11727..1172B ; Case_Ignorable
1182F..11837 ; Case_Ignorable
11839..1183A ; Case_Ignorable
+119D4..119D7 ; Case_Ignorable
+119DA..119DB ; Case_Ignorable
+119E0 ; Case_Ignorable
11A01..11A0A ; Case_Ignorable
11A33..11A38 ; Case_Ignorable
11A3B..11A3E ; Case_Ignorable
@@ -3184,12 +3221,15 @@ FFF9..FFFB ; Case_Ignorable
11D95 ; Case_Ignorable
11D97 ; Case_Ignorable
11EF3..11EF4 ; Case_Ignorable
+13430..13438 ; Case_Ignorable
16AF0..16AF4 ; Case_Ignorable
16B30..16B36 ; Case_Ignorable
16B40..16B43 ; Case_Ignorable
+16F4F ; Case_Ignorable
16F8F..16F92 ; Case_Ignorable
16F93..16F9F ; Case_Ignorable
16FE0..16FE1 ; Case_Ignorable
+16FE3 ; Case_Ignorable
1BC9D..1BC9E ; Case_Ignorable
1BCA0..1BCA3 ; Case_Ignorable
1D167..1D169 ; Case_Ignorable
@@ -3209,14 +3249,18 @@ FFF9..FFFB ; Case_Ignorable
1E01B..1E021 ; Case_Ignorable
1E023..1E024 ; Case_Ignorable
1E026..1E02A ; Case_Ignorable
+1E130..1E136 ; Case_Ignorable
+1E137..1E13D ; Case_Ignorable
+1E2EC..1E2EF ; Case_Ignorable
1E8D0..1E8D6 ; Case_Ignorable
1E944..1E94A ; Case_Ignorable
+1E94B ; Case_Ignorable
1F3FB..1F3FF ; Case_Ignorable
E0001 ; Case_Ignorable
E0020..E007F ; Case_Ignorable
E0100..E01EF ; Case_Ignorable
-# Total code points: 2357
+# Total code points: 2396
# ================================================
@@ -3812,6 +3856,11 @@ A7AA..A7AE ; Changes_When_Lowercased
A7B0..A7B4 ; Changes_When_Lowercased
A7B6 ; Changes_When_Lowercased
A7B8 ; Changes_When_Lowercased
+A7BA ; Changes_When_Lowercased
+A7BC ; Changes_When_Lowercased
+A7BE ; Changes_When_Lowercased
+A7C2 ; Changes_When_Lowercased
+A7C4..A7C6 ; Changes_When_Lowercased
FF21..FF3A ; Changes_When_Lowercased
10400..10427 ; Changes_When_Lowercased
104B0..104D3 ; Changes_When_Lowercased
@@ -3820,7 +3869,7 @@ FF21..FF3A ; Changes_When_Lowercased
16E40..16E5F ; Changes_When_Lowercased
1E900..1E921 ; Changes_When_Lowercased
-# Total code points: 1383
+# Total code points: 1390
# ================================================
@@ -3985,7 +4034,7 @@ FF21..FF3A ; Changes_When_Lowercased
0275 ; Changes_When_Uppercased
027D ; Changes_When_Uppercased
0280 ; Changes_When_Uppercased
-0283 ; Changes_When_Uppercased
+0282..0283 ; Changes_When_Uppercased
0287..028C ; Changes_When_Uppercased
0292 ; Changes_When_Uppercased
029D..029E ; Changes_When_Uppercased
@@ -4120,6 +4169,7 @@ FF21..FF3A ; Changes_When_Lowercased
1C80..1C88 ; Changes_When_Uppercased
1D79 ; Changes_When_Uppercased
1D7D ; Changes_When_Uppercased
+1D8E ; Changes_When_Uppercased
1E01 ; Changes_When_Uppercased
1E03 ; Changes_When_Uppercased
1E05 ; Changes_When_Uppercased
@@ -4415,7 +4465,7 @@ A785 ; Changes_When_Uppercased
A787 ; Changes_When_Uppercased
A78C ; Changes_When_Uppercased
A791 ; Changes_When_Uppercased
-A793 ; Changes_When_Uppercased
+A793..A794 ; Changes_When_Uppercased
A797 ; Changes_When_Uppercased
A799 ; Changes_When_Uppercased
A79B ; Changes_When_Uppercased
@@ -4429,6 +4479,10 @@ A7A9 ; Changes_When_Uppercased
A7B5 ; Changes_When_Uppercased
A7B7 ; Changes_When_Uppercased
A7B9 ; Changes_When_Uppercased
+A7BB ; Changes_When_Uppercased
+A7BD ; Changes_When_Uppercased
+A7BF ; Changes_When_Uppercased
+A7C3 ; Changes_When_Uppercased
AB53 ; Changes_When_Uppercased
AB70..ABBF ; Changes_When_Uppercased
FB00..FB06 ; Changes_When_Uppercased
@@ -4441,7 +4495,7 @@ FF41..FF5A ; Changes_When_Uppercased
16E60..16E7F ; Changes_When_Uppercased
1E922..1E943 ; Changes_When_Uppercased
-# Total code points: 1475
+# Total code points: 1482
# ================================================
@@ -4607,7 +4661,7 @@ FF41..FF5A ; Changes_When_Uppercased
0275 ; Changes_When_Titlecased
027D ; Changes_When_Titlecased
0280 ; Changes_When_Titlecased
-0283 ; Changes_When_Titlecased
+0282..0283 ; Changes_When_Titlecased
0287..028C ; Changes_When_Titlecased
0292 ; Changes_When_Titlecased
029D..029E ; Changes_When_Titlecased
@@ -4740,6 +4794,7 @@ FF41..FF5A ; Changes_When_Uppercased
1C80..1C88 ; Changes_When_Titlecased
1D79 ; Changes_When_Titlecased
1D7D ; Changes_When_Titlecased
+1D8E ; Changes_When_Titlecased
1E01 ; Changes_When_Titlecased
1E03 ; Changes_When_Titlecased
1E05 ; Changes_When_Titlecased
@@ -5035,7 +5090,7 @@ A785 ; Changes_When_Titlecased
A787 ; Changes_When_Titlecased
A78C ; Changes_When_Titlecased
A791 ; Changes_When_Titlecased
-A793 ; Changes_When_Titlecased
+A793..A794 ; Changes_When_Titlecased
A797 ; Changes_When_Titlecased
A799 ; Changes_When_Titlecased
A79B ; Changes_When_Titlecased
@@ -5049,6 +5104,10 @@ A7A9 ; Changes_When_Titlecased
A7B5 ; Changes_When_Titlecased
A7B7 ; Changes_When_Titlecased
A7B9 ; Changes_When_Titlecased
+A7BB ; Changes_When_Titlecased
+A7BD ; Changes_When_Titlecased
+A7BF ; Changes_When_Titlecased
+A7C3 ; Changes_When_Titlecased
AB53 ; Changes_When_Titlecased
AB70..ABBF ; Changes_When_Titlecased
FB00..FB06 ; Changes_When_Titlecased
@@ -5061,7 +5120,7 @@ FF41..FF5A ; Changes_When_Titlecased
16E60..16E7F ; Changes_When_Titlecased
1E922..1E943 ; Changes_When_Titlecased
-# Total code points: 1402
+# Total code points: 1409
# ================================================
@@ -5667,6 +5726,11 @@ A7AA..A7AE ; Changes_When_Casefolded
A7B0..A7B4 ; Changes_When_Casefolded
A7B6 ; Changes_When_Casefolded
A7B8 ; Changes_When_Casefolded
+A7BA ; Changes_When_Casefolded
+A7BC ; Changes_When_Casefolded
+A7BE ; Changes_When_Casefolded
+A7C2 ; Changes_When_Casefolded
+A7C4..A7C6 ; Changes_When_Casefolded
AB70..ABBF ; Changes_When_Casefolded
FB00..FB06 ; Changes_When_Casefolded
FB13..FB17 ; Changes_When_Casefolded
@@ -5678,7 +5742,7 @@ FF21..FF3A ; Changes_When_Casefolded
16E40..16E5F ; Changes_When_Casefolded
1E900..1E921 ; Changes_When_Casefolded
-# Total code points: 1456
+# Total code points: 1463
# ================================================
@@ -5714,7 +5778,7 @@ FF21..FF3A ; Changes_When_Casefolded
0275 ; Changes_When_Casemapped
027D ; Changes_When_Casemapped
0280 ; Changes_When_Casemapped
-0283 ; Changes_When_Casemapped
+0282..0283 ; Changes_When_Casemapped
0287..028C ; Changes_When_Casemapped
0292 ; Changes_When_Casemapped
029D..029E ; Changes_When_Casemapped
@@ -5746,6 +5810,7 @@ FF21..FF3A ; Changes_When_Casefolded
1CBD..1CBF ; Changes_When_Casemapped
1D79 ; Changes_When_Casemapped
1D7D ; Changes_When_Casemapped
+1D8E ; Changes_When_Casemapped
1E00..1E9B ; Changes_When_Casemapped
1E9E ; Changes_When_Casemapped
1EA0..1F15 ; Changes_When_Casemapped
@@ -5791,9 +5856,10 @@ A722..A72F ; Changes_When_Casemapped
A732..A76F ; Changes_When_Casemapped
A779..A787 ; Changes_When_Casemapped
A78B..A78D ; Changes_When_Casemapped
-A790..A793 ; Changes_When_Casemapped
+A790..A794 ; Changes_When_Casemapped
A796..A7AE ; Changes_When_Casemapped
-A7B0..A7B9 ; Changes_When_Casemapped
+A7B0..A7BF ; Changes_When_Casemapped
+A7C2..A7C6 ; Changes_When_Casemapped
AB53 ; Changes_When_Casemapped
AB70..ABBF ; Changes_When_Casemapped
FB00..FB06 ; Changes_When_Casemapped
@@ -5809,7 +5875,7 @@ FF41..FF5A ; Changes_When_Casemapped
16E40..16E7F ; Changes_When_Casemapped
1E900..1E943 ; Changes_When_Casemapped
-# Total code points: 2827
+# Total code points: 2841
# ================================================
@@ -5979,16 +6045,10 @@ FF41..FF5A ; Changes_When_Casemapped
0E46 ; ID_Start
0E81..0E82 ; ID_Start
0E84 ; ID_Start
-0E87..0E88 ; ID_Start
-0E8A ; ID_Start
-0E8D ; ID_Start
-0E94..0E97 ; ID_Start
-0E99..0E9F ; ID_Start
-0EA1..0EA3 ; ID_Start
+0E86..0E8A ; ID_Start
+0E8C..0EA3 ; ID_Start
0EA5 ; ID_Start
-0EA7 ; ID_Start
-0EAA..0EAB ; ID_Start
-0EAD..0EB0 ; ID_Start
+0EA7..0EB0 ; ID_Start
0EB2..0EB3 ; ID_Start
0EBD ; ID_Start
0EC0..0EC4 ; ID_Start
@@ -6076,8 +6136,9 @@ FF41..FF5A ; Changes_When_Casemapped
1C90..1CBA ; ID_Start
1CBD..1CBF ; ID_Start
1CE9..1CEC ; ID_Start
-1CEE..1CF1 ; ID_Start
+1CEE..1CF3 ; ID_Start
1CF5..1CF6 ; ID_Start
+1CFA ; ID_Start
1D00..1D2B ; ID_Start
1D2C..1D6A ; ID_Start
1D6B..1D77 ; ID_Start
@@ -6191,7 +6252,8 @@ A771..A787 ; ID_Start
A788 ; ID_Start
A78B..A78E ; ID_Start
A78F ; ID_Start
-A790..A7B9 ; ID_Start
+A790..A7BF ; ID_Start
+A7C2..A7C6 ; ID_Start
A7F7 ; ID_Start
A7F8..A7F9 ; ID_Start
A7FA ; ID_Start
@@ -6238,7 +6300,7 @@ AB20..AB26 ; ID_Start
AB28..AB2E ; ID_Start
AB30..AB5A ; ID_Start
AB5C..AB5F ; ID_Start
-AB60..AB65 ; ID_Start
+AB60..AB67 ; ID_Start
AB70..ABBF ; ID_Start
ABC0..ABE2 ; ID_Start
AC00..D7A3 ; ID_Start
@@ -6335,6 +6397,7 @@ FFDA..FFDC ; ID_Start
10F00..10F1C ; ID_Start
10F27 ; ID_Start
10F30..10F45 ; ID_Start
+10FE0..10FF6 ; ID_Start
11003..11037 ; ID_Start
11083..110AF ; ID_Start
110D0..110E8 ; ID_Start
@@ -6365,6 +6428,7 @@ FFDA..FFDC ; ID_Start
1135D..11361 ; ID_Start
11400..11434 ; ID_Start
11447..1144A ; ID_Start
+1145F ; ID_Start
11480..114AF ; ID_Start
114C4..114C5 ; ID_Start
114C7 ; ID_Start
@@ -6373,16 +6437,20 @@ FFDA..FFDC ; ID_Start
11600..1162F ; ID_Start
11644 ; ID_Start
11680..116AA ; ID_Start
+116B8 ; ID_Start
11700..1171A ; ID_Start
11800..1182B ; ID_Start
118A0..118DF ; ID_Start
118FF ; ID_Start
+119A0..119A7 ; ID_Start
+119AA..119D0 ; ID_Start
+119E1 ; ID_Start
+119E3 ; ID_Start
11A00 ; ID_Start
11A0B..11A32 ; ID_Start
11A3A ; ID_Start
11A50 ; ID_Start
-11A5C..11A83 ; ID_Start
-11A86..11A89 ; ID_Start
+11A5C..11A89 ; ID_Start
11A9D ; ID_Start
11AC0..11AF8 ; ID_Start
11C00..11C08 ; ID_Start
@@ -6411,13 +6479,16 @@ FFDA..FFDC ; ID_Start
16B63..16B77 ; ID_Start
16B7D..16B8F ; ID_Start
16E40..16E7F ; ID_Start
-16F00..16F44 ; ID_Start
+16F00..16F4A ; ID_Start
16F50 ; ID_Start
16F93..16F9F ; ID_Start
16FE0..16FE1 ; ID_Start
-17000..187F1 ; ID_Start
+16FE3 ; ID_Start
+17000..187F7 ; ID_Start
18800..18AF2 ; ID_Start
1B000..1B11E ; ID_Start
+1B150..1B152 ; ID_Start
+1B164..1B167 ; ID_Start
1B170..1B2FB ; ID_Start
1BC00..1BC6A ; ID_Start
1BC70..1BC7C ; ID_Start
@@ -6453,8 +6524,13 @@ FFDA..FFDC ; ID_Start
1D78A..1D7A8 ; ID_Start
1D7AA..1D7C2 ; ID_Start
1D7C4..1D7CB ; ID_Start
+1E100..1E12C ; ID_Start
+1E137..1E13D ; ID_Start
+1E14E ; ID_Start
+1E2C0..1E2EB ; ID_Start
1E800..1E8C4 ; ID_Start
1E900..1E943 ; ID_Start
+1E94B ; ID_Start
1EE00..1EE03 ; ID_Start
1EE05..1EE1F ; ID_Start
1EE21..1EE22 ; ID_Start
@@ -6495,7 +6571,7 @@ FFDA..FFDC ; ID_Start
2CEB0..2EBE0 ; ID_Start
2F800..2FA1D ; ID_Start
-# Total code points: 125660
+# Total code points: 125884
# ================================================
@@ -6815,20 +6891,13 @@ FFDA..FFDC ; ID_Start
0E50..0E59 ; ID_Continue
0E81..0E82 ; ID_Continue
0E84 ; ID_Continue
-0E87..0E88 ; ID_Continue
-0E8A ; ID_Continue
-0E8D ; ID_Continue
-0E94..0E97 ; ID_Continue
-0E99..0E9F ; ID_Continue
-0EA1..0EA3 ; ID_Continue
+0E86..0E8A ; ID_Continue
+0E8C..0EA3 ; ID_Continue
0EA5 ; ID_Continue
-0EA7 ; ID_Continue
-0EAA..0EAB ; ID_Continue
-0EAD..0EB0 ; ID_Continue
+0EA7..0EB0 ; ID_Continue
0EB1 ; ID_Continue
0EB2..0EB3 ; ID_Continue
-0EB4..0EB9 ; ID_Continue
-0EBB..0EBC ; ID_Continue
+0EB4..0EBC ; ID_Continue
0EBD ; ID_Continue
0EC0..0EC4 ; ID_Continue
0EC6 ; ID_Continue
@@ -7041,12 +7110,12 @@ FFDA..FFDC ; ID_Start
1CE2..1CE8 ; ID_Continue
1CE9..1CEC ; ID_Continue
1CED ; ID_Continue
-1CEE..1CF1 ; ID_Continue
-1CF2..1CF3 ; ID_Continue
+1CEE..1CF3 ; ID_Continue
1CF4 ; ID_Continue
1CF5..1CF6 ; ID_Continue
1CF7 ; ID_Continue
1CF8..1CF9 ; ID_Continue
+1CFA ; ID_Continue
1D00..1D2B ; ID_Continue
1D2C..1D6A ; ID_Continue
1D6B..1D77 ; ID_Continue
@@ -7178,7 +7247,8 @@ A771..A787 ; ID_Continue
A788 ; ID_Continue
A78B..A78E ; ID_Continue
A78F ; ID_Continue
-A790..A7B9 ; ID_Continue
+A790..A7BF ; ID_Continue
+A7C2..A7C6 ; ID_Continue
A7F7 ; ID_Continue
A7F8..A7F9 ; ID_Continue
A7FA ; ID_Continue
@@ -7217,8 +7287,8 @@ A9B3 ; ID_Continue
A9B4..A9B5 ; ID_Continue
A9B6..A9B9 ; ID_Continue
A9BA..A9BB ; ID_Continue
-A9BC ; ID_Continue
-A9BD..A9C0 ; ID_Continue
+A9BC..A9BD ; ID_Continue
+A9BE..A9C0 ; ID_Continue
A9CF ; ID_Continue
A9D0..A9D9 ; ID_Continue
A9E0..A9E4 ; ID_Continue
@@ -7274,7 +7344,7 @@ AB20..AB26 ; ID_Continue
AB28..AB2E ; ID_Continue
AB30..AB5A ; ID_Continue
AB5C..AB5F ; ID_Continue
-AB60..AB65 ; ID_Continue
+AB60..AB67 ; ID_Continue
AB70..ABBF ; ID_Continue
ABC0..ABE2 ; ID_Continue
ABE3..ABE4 ; ID_Continue
@@ -7399,6 +7469,7 @@ FFDA..FFDC ; ID_Continue
10F27 ; ID_Continue
10F30..10F45 ; ID_Continue
10F46..10F50 ; ID_Continue
+10FE0..10FF6 ; ID_Continue
11000 ; ID_Continue
11001 ; ID_Continue
11002 ; ID_Continue
@@ -7486,6 +7557,7 @@ FFDA..FFDC ; ID_Continue
11447..1144A ; ID_Continue
11450..11459 ; ID_Continue
1145E ; ID_Continue
+1145F ; ID_Continue
11480..114AF ; ID_Continue
114B0..114B2 ; ID_Continue
114B3..114B8 ; ID_Continue
@@ -7524,6 +7596,7 @@ FFDA..FFDC ; ID_Continue
116B0..116B5 ; ID_Continue
116B6 ; ID_Continue
116B7 ; ID_Continue
+116B8 ; ID_Continue
116C0..116C9 ; ID_Continue
11700..1171A ; ID_Continue
1171D..1171F ; ID_Continue
@@ -7540,6 +7613,16 @@ FFDA..FFDC ; ID_Continue
118A0..118DF ; ID_Continue
118E0..118E9 ; ID_Continue
118FF ; ID_Continue
+119A0..119A7 ; ID_Continue
+119AA..119D0 ; ID_Continue
+119D1..119D3 ; ID_Continue
+119D4..119D7 ; ID_Continue
+119DA..119DB ; ID_Continue
+119DC..119DF ; ID_Continue
+119E0 ; ID_Continue
+119E1 ; ID_Continue
+119E3 ; ID_Continue
+119E4 ; ID_Continue
11A00 ; ID_Continue
11A01..11A0A ; ID_Continue
11A0B..11A32 ; ID_Continue
@@ -7552,8 +7635,7 @@ FFDA..FFDC ; ID_Continue
11A51..11A56 ; ID_Continue
11A57..11A58 ; ID_Continue
11A59..11A5B ; ID_Continue
-11A5C..11A83 ; ID_Continue
-11A86..11A89 ; ID_Continue
+11A5C..11A89 ; ID_Continue
11A8A..11A96 ; ID_Continue
11A97 ; ID_Continue
11A98..11A99 ; ID_Continue
@@ -7617,15 +7699,19 @@ FFDA..FFDC ; ID_Continue
16B63..16B77 ; ID_Continue
16B7D..16B8F ; ID_Continue
16E40..16E7F ; ID_Continue
-16F00..16F44 ; ID_Continue
+16F00..16F4A ; ID_Continue
+16F4F ; ID_Continue
16F50 ; ID_Continue
-16F51..16F7E ; ID_Continue
+16F51..16F87 ; ID_Continue
16F8F..16F92 ; ID_Continue
16F93..16F9F ; ID_Continue
16FE0..16FE1 ; ID_Continue
-17000..187F1 ; ID_Continue
+16FE3 ; ID_Continue
+17000..187F7 ; ID_Continue
18800..18AF2 ; ID_Continue
1B000..1B11E ; ID_Continue
+1B150..1B152 ; ID_Continue
+1B164..1B167 ; ID_Continue
1B170..1B2FB ; ID_Continue
1BC00..1BC6A ; ID_Continue
1BC70..1BC7C ; ID_Continue
@@ -7681,10 +7767,19 @@ FFDA..FFDC ; ID_Continue
1E01B..1E021 ; ID_Continue
1E023..1E024 ; ID_Continue
1E026..1E02A ; ID_Continue
+1E100..1E12C ; ID_Continue
+1E130..1E136 ; ID_Continue
+1E137..1E13D ; ID_Continue
+1E140..1E149 ; ID_Continue
+1E14E ; ID_Continue
+1E2C0..1E2EB ; ID_Continue
+1E2EC..1E2EF ; ID_Continue
+1E2F0..1E2F9 ; ID_Continue
1E800..1E8C4 ; ID_Continue
1E8D0..1E8D6 ; ID_Continue
1E900..1E943 ; ID_Continue
1E944..1E94A ; ID_Continue
+1E94B ; ID_Continue
1E950..1E959 ; ID_Continue
1EE00..1EE03 ; ID_Continue
1EE05..1EE1F ; ID_Continue
@@ -7727,7 +7822,7 @@ FFDA..FFDC ; ID_Continue
2F800..2FA1D ; ID_Continue
E0100..E01EF ; ID_Continue
-# Total code points: 128510
+# Total code points: 128789
# ================================================
@@ -7894,16 +7989,10 @@ E0100..E01EF ; ID_Continue
0E46 ; XID_Start
0E81..0E82 ; XID_Start
0E84 ; XID_Start
-0E87..0E88 ; XID_Start
-0E8A ; XID_Start
-0E8D ; XID_Start
-0E94..0E97 ; XID_Start
-0E99..0E9F ; XID_Start
-0EA1..0EA3 ; XID_Start
+0E86..0E8A ; XID_Start
+0E8C..0EA3 ; XID_Start
0EA5 ; XID_Start
-0EA7 ; XID_Start
-0EAA..0EAB ; XID_Start
-0EAD..0EB0 ; XID_Start
+0EA7..0EB0 ; XID_Start
0EB2 ; XID_Start
0EBD ; XID_Start
0EC0..0EC4 ; XID_Start
@@ -7991,8 +8080,9 @@ E0100..E01EF ; ID_Continue
1C90..1CBA ; XID_Start
1CBD..1CBF ; XID_Start
1CE9..1CEC ; XID_Start
-1CEE..1CF1 ; XID_Start
+1CEE..1CF3 ; XID_Start
1CF5..1CF6 ; XID_Start
+1CFA ; XID_Start
1D00..1D2B ; XID_Start
1D2C..1D6A ; XID_Start
1D6B..1D77 ; XID_Start
@@ -8105,7 +8195,8 @@ A771..A787 ; XID_Start
A788 ; XID_Start
A78B..A78E ; XID_Start
A78F ; XID_Start
-A790..A7B9 ; XID_Start
+A790..A7BF ; XID_Start
+A7C2..A7C6 ; XID_Start
A7F7 ; XID_Start
A7F8..A7F9 ; XID_Start
A7FA ; XID_Start
@@ -8152,7 +8243,7 @@ AB20..AB26 ; XID_Start
AB28..AB2E ; XID_Start
AB30..AB5A ; XID_Start
AB5C..AB5F ; XID_Start
-AB60..AB65 ; XID_Start
+AB60..AB67 ; XID_Start
AB70..ABBF ; XID_Start
ABC0..ABE2 ; XID_Start
AC00..D7A3 ; XID_Start
@@ -8254,6 +8345,7 @@ FFDA..FFDC ; XID_Start
10F00..10F1C ; XID_Start
10F27 ; XID_Start
10F30..10F45 ; XID_Start
+10FE0..10FF6 ; XID_Start
11003..11037 ; XID_Start
11083..110AF ; XID_Start
110D0..110E8 ; XID_Start
@@ -8284,6 +8376,7 @@ FFDA..FFDC ; XID_Start
1135D..11361 ; XID_Start
11400..11434 ; XID_Start
11447..1144A ; XID_Start
+1145F ; XID_Start
11480..114AF ; XID_Start
114C4..114C5 ; XID_Start
114C7 ; XID_Start
@@ -8292,16 +8385,20 @@ FFDA..FFDC ; XID_Start
11600..1162F ; XID_Start
11644 ; XID_Start
11680..116AA ; XID_Start
+116B8 ; XID_Start
11700..1171A ; XID_Start
11800..1182B ; XID_Start
118A0..118DF ; XID_Start
118FF ; XID_Start
+119A0..119A7 ; XID_Start
+119AA..119D0 ; XID_Start
+119E1 ; XID_Start
+119E3 ; XID_Start
11A00 ; XID_Start
11A0B..11A32 ; XID_Start
11A3A ; XID_Start
11A50 ; XID_Start
-11A5C..11A83 ; XID_Start
-11A86..11A89 ; XID_Start
+11A5C..11A89 ; XID_Start
11A9D ; XID_Start
11AC0..11AF8 ; XID_Start
11C00..11C08 ; XID_Start
@@ -8330,13 +8427,16 @@ FFDA..FFDC ; XID_Start
16B63..16B77 ; XID_Start
16B7D..16B8F ; XID_Start
16E40..16E7F ; XID_Start
-16F00..16F44 ; XID_Start
+16F00..16F4A ; XID_Start
16F50 ; XID_Start
16F93..16F9F ; XID_Start
16FE0..16FE1 ; XID_Start
-17000..187F1 ; XID_Start
+16FE3 ; XID_Start
+17000..187F7 ; XID_Start
18800..18AF2 ; XID_Start
1B000..1B11E ; XID_Start
+1B150..1B152 ; XID_Start
+1B164..1B167 ; XID_Start
1B170..1B2FB ; XID_Start
1BC00..1BC6A ; XID_Start
1BC70..1BC7C ; XID_Start
@@ -8372,8 +8472,13 @@ FFDA..FFDC ; XID_Start
1D78A..1D7A8 ; XID_Start
1D7AA..1D7C2 ; XID_Start
1D7C4..1D7CB ; XID_Start
+1E100..1E12C ; XID_Start
+1E137..1E13D ; XID_Start
+1E14E ; XID_Start
+1E2C0..1E2EB ; XID_Start
1E800..1E8C4 ; XID_Start
1E900..1E943 ; XID_Start
+1E94B ; XID_Start
1EE00..1EE03 ; XID_Start
1EE05..1EE1F ; XID_Start
1EE21..1EE22 ; XID_Start
@@ -8414,7 +8519,7 @@ FFDA..FFDC ; XID_Start
2CEB0..2EBE0 ; XID_Start
2F800..2FA1D ; XID_Start
-# Total code points: 125637
+# Total code points: 125861
# ================================================
@@ -8730,20 +8835,13 @@ FFDA..FFDC ; XID_Start
0E50..0E59 ; XID_Continue
0E81..0E82 ; XID_Continue
0E84 ; XID_Continue
-0E87..0E88 ; XID_Continue
-0E8A ; XID_Continue
-0E8D ; XID_Continue
-0E94..0E97 ; XID_Continue
-0E99..0E9F ; XID_Continue
-0EA1..0EA3 ; XID_Continue
+0E86..0E8A ; XID_Continue
+0E8C..0EA3 ; XID_Continue
0EA5 ; XID_Continue
-0EA7 ; XID_Continue
-0EAA..0EAB ; XID_Continue
-0EAD..0EB0 ; XID_Continue
+0EA7..0EB0 ; XID_Continue
0EB1 ; XID_Continue
0EB2..0EB3 ; XID_Continue
-0EB4..0EB9 ; XID_Continue
-0EBB..0EBC ; XID_Continue
+0EB4..0EBC ; XID_Continue
0EBD ; XID_Continue
0EC0..0EC4 ; XID_Continue
0EC6 ; XID_Continue
@@ -8956,12 +9054,12 @@ FFDA..FFDC ; XID_Start
1CE2..1CE8 ; XID_Continue
1CE9..1CEC ; XID_Continue
1CED ; XID_Continue
-1CEE..1CF1 ; XID_Continue
-1CF2..1CF3 ; XID_Continue
+1CEE..1CF3 ; XID_Continue
1CF4 ; XID_Continue
1CF5..1CF6 ; XID_Continue
1CF7 ; XID_Continue
1CF8..1CF9 ; XID_Continue
+1CFA ; XID_Continue
1D00..1D2B ; XID_Continue
1D2C..1D6A ; XID_Continue
1D6B..1D77 ; XID_Continue
@@ -9092,7 +9190,8 @@ A771..A787 ; XID_Continue
A788 ; XID_Continue
A78B..A78E ; XID_Continue
A78F ; XID_Continue
-A790..A7B9 ; XID_Continue
+A790..A7BF ; XID_Continue
+A7C2..A7C6 ; XID_Continue
A7F7 ; XID_Continue
A7F8..A7F9 ; XID_Continue
A7FA ; XID_Continue
@@ -9131,8 +9230,8 @@ A9B3 ; XID_Continue
A9B4..A9B5 ; XID_Continue
A9B6..A9B9 ; XID_Continue
A9BA..A9BB ; XID_Continue
-A9BC ; XID_Continue
-A9BD..A9C0 ; XID_Continue
+A9BC..A9BD ; XID_Continue
+A9BE..A9C0 ; XID_Continue
A9CF ; XID_Continue
A9D0..A9D9 ; XID_Continue
A9E0..A9E4 ; XID_Continue
@@ -9188,7 +9287,7 @@ AB20..AB26 ; XID_Continue
AB28..AB2E ; XID_Continue
AB30..AB5A ; XID_Continue
AB5C..AB5F ; XID_Continue
-AB60..AB65 ; XID_Continue
+AB60..AB67 ; XID_Continue
AB70..ABBF ; XID_Continue
ABC0..ABE2 ; XID_Continue
ABE3..ABE4 ; XID_Continue
@@ -9319,6 +9418,7 @@ FFDA..FFDC ; XID_Continue
10F27 ; XID_Continue
10F30..10F45 ; XID_Continue
10F46..10F50 ; XID_Continue
+10FE0..10FF6 ; XID_Continue
11000 ; XID_Continue
11001 ; XID_Continue
11002 ; XID_Continue
@@ -9406,6 +9506,7 @@ FFDA..FFDC ; XID_Continue
11447..1144A ; XID_Continue
11450..11459 ; XID_Continue
1145E ; XID_Continue
+1145F ; XID_Continue
11480..114AF ; XID_Continue
114B0..114B2 ; XID_Continue
114B3..114B8 ; XID_Continue
@@ -9444,6 +9545,7 @@ FFDA..FFDC ; XID_Continue
116B0..116B5 ; XID_Continue
116B6 ; XID_Continue
116B7 ; XID_Continue
+116B8 ; XID_Continue
116C0..116C9 ; XID_Continue
11700..1171A ; XID_Continue
1171D..1171F ; XID_Continue
@@ -9460,6 +9562,16 @@ FFDA..FFDC ; XID_Continue
118A0..118DF ; XID_Continue
118E0..118E9 ; XID_Continue
118FF ; XID_Continue
+119A0..119A7 ; XID_Continue
+119AA..119D0 ; XID_Continue
+119D1..119D3 ; XID_Continue
+119D4..119D7 ; XID_Continue
+119DA..119DB ; XID_Continue
+119DC..119DF ; XID_Continue
+119E0 ; XID_Continue
+119E1 ; XID_Continue
+119E3 ; XID_Continue
+119E4 ; XID_Continue
11A00 ; XID_Continue
11A01..11A0A ; XID_Continue
11A0B..11A32 ; XID_Continue
@@ -9472,8 +9584,7 @@ FFDA..FFDC ; XID_Continue
11A51..11A56 ; XID_Continue
11A57..11A58 ; XID_Continue
11A59..11A5B ; XID_Continue
-11A5C..11A83 ; XID_Continue
-11A86..11A89 ; XID_Continue
+11A5C..11A89 ; XID_Continue
11A8A..11A96 ; XID_Continue
11A97 ; XID_Continue
11A98..11A99 ; XID_Continue
@@ -9537,15 +9648,19 @@ FFDA..FFDC ; XID_Continue
16B63..16B77 ; XID_Continue
16B7D..16B8F ; XID_Continue
16E40..16E7F ; XID_Continue
-16F00..16F44 ; XID_Continue
+16F00..16F4A ; XID_Continue
+16F4F ; XID_Continue
16F50 ; XID_Continue
-16F51..16F7E ; XID_Continue
+16F51..16F87 ; XID_Continue
16F8F..16F92 ; XID_Continue
16F93..16F9F ; XID_Continue
16FE0..16FE1 ; XID_Continue
-17000..187F1 ; XID_Continue
+16FE3 ; XID_Continue
+17000..187F7 ; XID_Continue
18800..18AF2 ; XID_Continue
1B000..1B11E ; XID_Continue
+1B150..1B152 ; XID_Continue
+1B164..1B167 ; XID_Continue
1B170..1B2FB ; XID_Continue
1BC00..1BC6A ; XID_Continue
1BC70..1BC7C ; XID_Continue
@@ -9601,10 +9716,19 @@ FFDA..FFDC ; XID_Continue
1E01B..1E021 ; XID_Continue
1E023..1E024 ; XID_Continue
1E026..1E02A ; XID_Continue
+1E100..1E12C ; XID_Continue
+1E130..1E136 ; XID_Continue
+1E137..1E13D ; XID_Continue
+1E140..1E149 ; XID_Continue
+1E14E ; XID_Continue
+1E2C0..1E2EB ; XID_Continue
+1E2EC..1E2EF ; XID_Continue
+1E2F0..1E2F9 ; XID_Continue
1E800..1E8C4 ; XID_Continue
1E8D0..1E8D6 ; XID_Continue
1E900..1E943 ; XID_Continue
1E944..1E94A ; XID_Continue
+1E94B ; XID_Continue
1E950..1E959 ; XID_Continue
1EE00..1EE03 ; XID_Continue
1EE05..1EE1F ; XID_Continue
@@ -9647,7 +9771,7 @@ FFDA..FFDC ; XID_Continue
2F800..2FA1D ; XID_Continue
E0100..E01EF ; XID_Continue
-# Total code points: 128491
+# Total code points: 128770
# ================================================
@@ -9657,7 +9781,8 @@ E0100..E01EF ; XID_Continue
# + Cf (Format characters)
# + Variation_Selector
# - White_Space
-# - FFF9..FFFB (Annotation characters)
+# - FFF9..FFFB (Interlinear annotation format characters)
+# - 13430..13438 (Egyptian hieroglyph format characters)
# - Prepended_Concatenation_Mark (Exceptional format characters that should be visible)
00AD ; Default_Ignorable_Code_Point
@@ -9797,8 +9922,7 @@ E01F0..E0FFF ; Default_Ignorable_Code_Point
0E34..0E3A ; Grapheme_Extend
0E47..0E4E ; Grapheme_Extend
0EB1 ; Grapheme_Extend
-0EB4..0EB9 ; Grapheme_Extend
-0EBB..0EBC ; Grapheme_Extend
+0EB4..0EBC ; Grapheme_Extend
0EC8..0ECD ; Grapheme_Extend
0F18..0F19 ; Grapheme_Extend
0F35 ; Grapheme_Extend
@@ -9851,6 +9975,7 @@ E01F0..E0FFF ; Default_Ignorable_Code_Point
1ABE ; Grapheme_Extend
1B00..1B03 ; Grapheme_Extend
1B34 ; Grapheme_Extend
+1B35 ; Grapheme_Extend
1B36..1B3A ; Grapheme_Extend
1B3C ; Grapheme_Extend
1B42 ; Grapheme_Extend
@@ -9902,7 +10027,7 @@ A947..A951 ; Grapheme_Extend
A980..A982 ; Grapheme_Extend
A9B3 ; Grapheme_Extend
A9B6..A9B9 ; Grapheme_Extend
-A9BC ; Grapheme_Extend
+A9BC..A9BD ; Grapheme_Extend
A9E5 ; Grapheme_Extend
AA29..AA2E ; Grapheme_Extend
AA31..AA32 ; Grapheme_Extend
@@ -9987,6 +10112,9 @@ FF9E..FF9F ; Grapheme_Extend
11727..1172B ; Grapheme_Extend
1182F..11837 ; Grapheme_Extend
11839..1183A ; Grapheme_Extend
+119D4..119D7 ; Grapheme_Extend
+119DA..119DB ; Grapheme_Extend
+119E0 ; Grapheme_Extend
11A01..11A0A ; Grapheme_Extend
11A33..11A38 ; Grapheme_Extend
11A3B..11A3E ; Grapheme_Extend
@@ -10013,6 +10141,7 @@ FF9E..FF9F ; Grapheme_Extend
11EF3..11EF4 ; Grapheme_Extend
16AF0..16AF4 ; Grapheme_Extend
16B30..16B36 ; Grapheme_Extend
+16F4F ; Grapheme_Extend
16F8F..16F92 ; Grapheme_Extend
1BC9D..1BC9E ; Grapheme_Extend
1D165 ; Grapheme_Extend
@@ -10033,12 +10162,14 @@ FF9E..FF9F ; Grapheme_Extend
1E01B..1E021 ; Grapheme_Extend
1E023..1E024 ; Grapheme_Extend
1E026..1E02A ; Grapheme_Extend
+1E130..1E136 ; Grapheme_Extend
+1E2EC..1E2EF ; Grapheme_Extend
1E8D0..1E8D6 ; Grapheme_Extend
1E944..1E94A ; Grapheme_Extend
E0020..E007F ; Grapheme_Extend
E0100..E01EF ; Grapheme_Extend
-# Total code points: 1943
+# Total code points: 1965
# ================================================
@@ -10313,6 +10444,7 @@ E0100..E01EF ; Grapheme_Extend
0C58..0C5A ; Grapheme_Base
0C60..0C61 ; Grapheme_Base
0C66..0C6F ; Grapheme_Base
+0C77 ; Grapheme_Base
0C78..0C7E ; Grapheme_Base
0C7F ; Grapheme_Base
0C80 ; Grapheme_Base
@@ -10371,16 +10503,10 @@ E0100..E01EF ; Grapheme_Extend
0E5A..0E5B ; Grapheme_Base
0E81..0E82 ; Grapheme_Base
0E84 ; Grapheme_Base
-0E87..0E88 ; Grapheme_Base
-0E8A ; Grapheme_Base
-0E8D ; Grapheme_Base
-0E94..0E97 ; Grapheme_Base
-0E99..0E9F ; Grapheme_Base
-0EA1..0EA3 ; Grapheme_Base
+0E86..0E8A ; Grapheme_Base
+0E8C..0EA3 ; Grapheme_Base
0EA5 ; Grapheme_Base
-0EA7 ; Grapheme_Base
-0EAA..0EAB ; Grapheme_Base
-0EAD..0EB0 ; Grapheme_Base
+0EA7..0EB0 ; Grapheme_Base
0EB2..0EB3 ; Grapheme_Base
0EBD ; Grapheme_Base
0EC0..0EC4 ; Grapheme_Base
@@ -10470,7 +10596,8 @@ E0100..E01EF ; Grapheme_Extend
13F8..13FD ; Grapheme_Base
1400 ; Grapheme_Base
1401..166C ; Grapheme_Base
-166D..166E ; Grapheme_Base
+166D ; Grapheme_Base
+166E ; Grapheme_Base
166F..167F ; Grapheme_Base
1680 ; Grapheme_Base
1681..169A ; Grapheme_Base
@@ -10540,7 +10667,6 @@ E0100..E01EF ; Grapheme_Extend
1AA8..1AAD ; Grapheme_Base
1B04 ; Grapheme_Base
1B05..1B33 ; Grapheme_Base
-1B35 ; Grapheme_Base
1B3B ; Grapheme_Base
1B3D..1B41 ; Grapheme_Base
1B43..1B44 ; Grapheme_Base
@@ -10579,10 +10705,10 @@ E0100..E01EF ; Grapheme_Extend
1CD3 ; Grapheme_Base
1CE1 ; Grapheme_Base
1CE9..1CEC ; Grapheme_Base
-1CEE..1CF1 ; Grapheme_Base
-1CF2..1CF3 ; Grapheme_Base
+1CEE..1CF3 ; Grapheme_Base
1CF5..1CF6 ; Grapheme_Base
1CF7 ; Grapheme_Base
+1CFA ; Grapheme_Base
1D00..1D2B ; Grapheme_Base
1D2C..1D6A ; Grapheme_Base
1D6B..1D77 ; Grapheme_Base
@@ -10811,8 +10937,7 @@ E0100..E01EF ; Grapheme_Extend
2B47..2B4C ; Grapheme_Base
2B4D..2B73 ; Grapheme_Base
2B76..2B95 ; Grapheme_Base
-2B98..2BC8 ; Grapheme_Base
-2BCA..2BFE ; Grapheme_Base
+2B98..2BFF ; Grapheme_Base
2C00..2C2E ; Grapheme_Base
2C30..2C5E ; Grapheme_Base
2C60..2C7B ; Grapheme_Base
@@ -10876,7 +11001,7 @@ E0100..E01EF ; Grapheme_Extend
2E40 ; Grapheme_Base
2E41 ; Grapheme_Base
2E42 ; Grapheme_Base
-2E43..2E4E ; Grapheme_Base
+2E43..2E4F ; Grapheme_Base
2E80..2E99 ; Grapheme_Base
2E9B..2EF3 ; Grapheme_Base
2F00..2FD5 ; Grapheme_Base
@@ -10946,8 +11071,7 @@ E0100..E01EF ; Grapheme_Extend
3280..3289 ; Grapheme_Base
328A..32B0 ; Grapheme_Base
32B1..32BF ; Grapheme_Base
-32C0..32FE ; Grapheme_Base
-3300..33FF ; Grapheme_Base
+32C0..33FF ; Grapheme_Base
3400..4DB5 ; Grapheme_Base
4DC0..4DFF ; Grapheme_Base
4E00..9FEF ; Grapheme_Base
@@ -10984,7 +11108,8 @@ A788 ; Grapheme_Base
A789..A78A ; Grapheme_Base
A78B..A78E ; Grapheme_Base
A78F ; Grapheme_Base
-A790..A7B9 ; Grapheme_Base
+A790..A7BF ; Grapheme_Base
+A7C2..A7C6 ; Grapheme_Base
A7F7 ; Grapheme_Base
A7F8..A7F9 ; Grapheme_Base
A7FA ; Grapheme_Base
@@ -11022,7 +11147,7 @@ A983 ; Grapheme_Base
A984..A9B2 ; Grapheme_Base
A9B4..A9B5 ; Grapheme_Base
A9BA..A9BB ; Grapheme_Base
-A9BD..A9C0 ; Grapheme_Base
+A9BE..A9C0 ; Grapheme_Base
A9C1..A9CD ; Grapheme_Base
A9CF ; Grapheme_Base
A9D0..A9D9 ; Grapheme_Base
@@ -11071,7 +11196,7 @@ AB28..AB2E ; Grapheme_Base
AB30..AB5A ; Grapheme_Base
AB5B ; Grapheme_Base
AB5C..AB5F ; Grapheme_Base
-AB60..AB65 ; Grapheme_Base
+AB60..AB67 ; Grapheme_Base
AB70..ABBF ; Grapheme_Base
ABC0..ABE2 ; Grapheme_Base
ABE3..ABE4 ; Grapheme_Base
@@ -11309,6 +11434,7 @@ FFFC..FFFD ; Grapheme_Base
10F30..10F45 ; Grapheme_Base
10F51..10F54 ; Grapheme_Base
10F55..10F59 ; Grapheme_Base
+10FE0..10FF6 ; Grapheme_Base
11000 ; Grapheme_Base
11002 ; Grapheme_Base
11003..11037 ; Grapheme_Base
@@ -11384,6 +11510,7 @@ FFFC..FFFD ; Grapheme_Base
11450..11459 ; Grapheme_Base
1145B ; Grapheme_Base
1145D ; Grapheme_Base
+1145F ; Grapheme_Base
11480..114AF ; Grapheme_Base
114B1..114B2 ; Grapheme_Base
114B9 ; Grapheme_Base
@@ -11412,6 +11539,7 @@ FFFC..FFFD ; Grapheme_Base
116AC ; Grapheme_Base
116AE..116AF ; Grapheme_Base
116B6 ; Grapheme_Base
+116B8 ; Grapheme_Base
116C0..116C9 ; Grapheme_Base
11700..1171A ; Grapheme_Base
11720..11721 ; Grapheme_Base
@@ -11428,6 +11556,14 @@ FFFC..FFFD ; Grapheme_Base
118E0..118E9 ; Grapheme_Base
118EA..118F2 ; Grapheme_Base
118FF ; Grapheme_Base
+119A0..119A7 ; Grapheme_Base
+119AA..119D0 ; Grapheme_Base
+119D1..119D3 ; Grapheme_Base
+119DC..119DF ; Grapheme_Base
+119E1 ; Grapheme_Base
+119E2 ; Grapheme_Base
+119E3 ; Grapheme_Base
+119E4 ; Grapheme_Base
11A00 ; Grapheme_Base
11A0B..11A32 ; Grapheme_Base
11A39 ; Grapheme_Base
@@ -11435,8 +11571,7 @@ FFFC..FFFD ; Grapheme_Base
11A3F..11A46 ; Grapheme_Base
11A50 ; Grapheme_Base
11A57..11A58 ; Grapheme_Base
-11A5C..11A83 ; Grapheme_Base
-11A86..11A89 ; Grapheme_Base
+11A5C..11A89 ; Grapheme_Base
11A97 ; Grapheme_Base
11A9A..11A9C ; Grapheme_Base
11A9D ; Grapheme_Base
@@ -11471,6 +11606,11 @@ FFFC..FFFD ; Grapheme_Base
11EE0..11EF2 ; Grapheme_Base
11EF5..11EF6 ; Grapheme_Base
11EF7..11EF8 ; Grapheme_Base
+11FC0..11FD4 ; Grapheme_Base
+11FD5..11FDC ; Grapheme_Base
+11FDD..11FE0 ; Grapheme_Base
+11FE1..11FF1 ; Grapheme_Base
+11FFF ; Grapheme_Base
12000..12399 ; Grapheme_Base
12400..1246E ; Grapheme_Base
12470..12474 ; Grapheme_Base
@@ -11496,14 +11636,18 @@ FFFC..FFFD ; Grapheme_Base
16E40..16E7F ; Grapheme_Base
16E80..16E96 ; Grapheme_Base
16E97..16E9A ; Grapheme_Base
-16F00..16F44 ; Grapheme_Base
+16F00..16F4A ; Grapheme_Base
16F50 ; Grapheme_Base
-16F51..16F7E ; Grapheme_Base
+16F51..16F87 ; Grapheme_Base
16F93..16F9F ; Grapheme_Base
16FE0..16FE1 ; Grapheme_Base
-17000..187F1 ; Grapheme_Base
+16FE2 ; Grapheme_Base
+16FE3 ; Grapheme_Base
+17000..187F7 ; Grapheme_Base
18800..18AF2 ; Grapheme_Base
1B000..1B11E ; Grapheme_Base
+1B150..1B152 ; Grapheme_Base
+1B164..1B167 ; Grapheme_Base
1B170..1B2FB ; Grapheme_Base
1BC00..1BC6A ; Grapheme_Base
1BC70..1BC7C ; Grapheme_Base
@@ -11572,9 +11716,18 @@ FFFC..FFFD ; Grapheme_Base
1DA76..1DA83 ; Grapheme_Base
1DA85..1DA86 ; Grapheme_Base
1DA87..1DA8B ; Grapheme_Base
+1E100..1E12C ; Grapheme_Base
+1E137..1E13D ; Grapheme_Base
+1E140..1E149 ; Grapheme_Base
+1E14E ; Grapheme_Base
+1E14F ; Grapheme_Base
+1E2C0..1E2EB ; Grapheme_Base
+1E2F0..1E2F9 ; Grapheme_Base
+1E2FF ; Grapheme_Base
1E800..1E8C4 ; Grapheme_Base
1E8C7..1E8CF ; Grapheme_Base
1E900..1E943 ; Grapheme_Base
+1E94B ; Grapheme_Base
1E950..1E959 ; Grapheme_Base
1E95E..1E95F ; Grapheme_Base
1EC71..1ECAB ; Grapheme_Base
@@ -11582,6 +11735,9 @@ FFFC..FFFD ; Grapheme_Base
1ECAD..1ECAF ; Grapheme_Base
1ECB0 ; Grapheme_Base
1ECB1..1ECB4 ; Grapheme_Base
+1ED01..1ED2D ; Grapheme_Base
+1ED2E ; Grapheme_Base
+1ED2F..1ED3D ; Grapheme_Base
1EE00..1EE03 ; Grapheme_Base
1EE05..1EE1F ; Grapheme_Base
1EE21..1EE22 ; Grapheme_Base
@@ -11623,7 +11779,7 @@ FFFC..FFFD ; Grapheme_Base
1F0C1..1F0CF ; Grapheme_Base
1F0D1..1F0F5 ; Grapheme_Base
1F100..1F10C ; Grapheme_Base
-1F110..1F16B ; Grapheme_Base
+1F110..1F16C ; Grapheme_Base
1F170..1F1AC ; Grapheme_Base
1F1E6..1F202 ; Grapheme_Base
1F210..1F23B ; Grapheme_Base
@@ -11632,26 +11788,29 @@ FFFC..FFFD ; Grapheme_Base
1F260..1F265 ; Grapheme_Base
1F300..1F3FA ; Grapheme_Base
1F3FB..1F3FF ; Grapheme_Base
-1F400..1F6D4 ; Grapheme_Base
+1F400..1F6D5 ; Grapheme_Base
1F6E0..1F6EC ; Grapheme_Base
-1F6F0..1F6F9 ; Grapheme_Base
+1F6F0..1F6FA ; Grapheme_Base
1F700..1F773 ; Grapheme_Base
1F780..1F7D8 ; Grapheme_Base
+1F7E0..1F7EB ; Grapheme_Base
1F800..1F80B ; Grapheme_Base
1F810..1F847 ; Grapheme_Base
1F850..1F859 ; Grapheme_Base
1F860..1F887 ; Grapheme_Base
1F890..1F8AD ; Grapheme_Base
1F900..1F90B ; Grapheme_Base
-1F910..1F93E ; Grapheme_Base
-1F940..1F970 ; Grapheme_Base
+1F90D..1F971 ; Grapheme_Base
1F973..1F976 ; Grapheme_Base
-1F97A ; Grapheme_Base
-1F97C..1F9A2 ; Grapheme_Base
-1F9B0..1F9B9 ; Grapheme_Base
-1F9C0..1F9C2 ; Grapheme_Base
-1F9D0..1F9FF ; Grapheme_Base
+1F97A..1F9A2 ; Grapheme_Base
+1F9A5..1F9AA ; Grapheme_Base
+1F9AE..1F9CA ; Grapheme_Base
+1F9CD..1FA53 ; Grapheme_Base
1FA60..1FA6D ; Grapheme_Base
+1FA70..1FA73 ; Grapheme_Base
+1FA78..1FA7A ; Grapheme_Base
+1FA80..1FA82 ; Grapheme_Base
+1FA90..1FA95 ; Grapheme_Base
20000..2A6D6 ; Grapheme_Base
2A700..2B734 ; Grapheme_Base
2B740..2B81D ; Grapheme_Base
@@ -11659,7 +11818,7 @@ FFFC..FFFD ; Grapheme_Base
2CEB0..2EBE0 ; Grapheme_Base
2F800..2FA1D ; Grapheme_Base
-# Total code points: 135374
+# Total code points: 135898
# ================================================
@@ -11679,6 +11838,7 @@ FFFC..FFFD ; Grapheme_Base
0D4D ; Grapheme_Link
0DCA ; Grapheme_Link
0E3A ; Grapheme_Link
+0EBA ; Grapheme_Link
0F84 ; Grapheme_Link
1039..103A ; Grapheme_Link
1714 ; Grapheme_Link
@@ -11712,6 +11872,7 @@ ABED ; Grapheme_Link
116B6 ; Grapheme_Link
1172B ; Grapheme_Link
11839 ; Grapheme_Link
+119E0 ; Grapheme_Link
11A34 ; Grapheme_Link
11A47 ; Grapheme_Link
11A99 ; Grapheme_Link
@@ -11719,6 +11880,6 @@ ABED ; Grapheme_Link
11D44..11D45 ; Grapheme_Link
11D97 ; Grapheme_Link
-# Total code points: 56
+# Total code points: 58
# EOF
diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/DerivedNormalizationProps.txt b/Build/source/libs/icu/icu-src/source/data/unidata/DerivedNormalizationProps.txt
index a9608136488..1c75ebd63fd 100644
--- a/Build/source/libs/icu/icu-src/source/data/unidata/DerivedNormalizationProps.txt
+++ b/Build/source/libs/icu/icu-src/source/data/unidata/DerivedNormalizationProps.txt
@@ -1,6 +1,6 @@
-# DerivedNormalizationProps-11.0.0.txt
-# Date: 2018-01-31, 08:20:15 GMT
-# © 2018 Unicode®, Inc.
+# DerivedNormalizationProps-12.1.0.txt
+# Date: 2019-04-01, 09:10:23 GMT
+# © 2019 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@@ -647,9 +647,10 @@ A7F8 ; FC_NFKC; 0127
1F14F ; FC_NFKC; 0077 0063
1F16A ; FC_NFKC; 006D 0063
1F16B ; FC_NFKC; 006D 0064
+1F16C ; FC_NFKC; 006D 0072
1F190 ; FC_NFKC; 0064 006A
-# Total code points: 633
+# Total code points: 634
# ================================================
@@ -1463,8 +1464,7 @@ FB46..FB4E ; NFC_QC; N
3280..3289 ; NFKD_QC; N
328A..32B0 ; NFKD_QC; N
32B1..32BF ; NFKD_QC; N
-32C0..32FE ; NFKD_QC; N
-3300..33FF ; NFKD_QC; N
+32C0..33FF ; NFKD_QC; N
A69C..A69D ; NFKD_QC; N
A770 ; NFKD_QC; N
A7F8..A7F9 ; NFKD_QC; N
@@ -1677,7 +1677,7 @@ FFED..FFEE ; NFKD_QC; N
1F100..1F10A ; NFKD_QC; N
1F110..1F12E ; NFKD_QC; N
1F130..1F14F ; NFKD_QC; N
-1F16A..1F16B ; NFKD_QC; N
+1F16A..1F16C ; NFKD_QC; N
1F190 ; NFKD_QC; N
1F200..1F202 ; NFKD_QC; N
1F210..1F23B ; NFKD_QC; N
@@ -1685,7 +1685,7 @@ FFED..FFEE ; NFKD_QC; N
1F250..1F251 ; NFKD_QC; N
2F800..2FA1D ; NFKD_QC; N
-# Total code points: 16894
+# Total code points: 16896
# ================================================
@@ -1875,8 +1875,7 @@ FFED..FFEE ; NFKD_QC; N
3280..3289 ; NFKC_QC; N
328A..32B0 ; NFKC_QC; N
32B1..32BF ; NFKC_QC; N
-32C0..32FE ; NFKC_QC; N
-3300..33FF ; NFKC_QC; N
+32C0..33FF ; NFKC_QC; N
A69C..A69D ; NFKC_QC; N
A770 ; NFKC_QC; N
A7F8..A7F9 ; NFKC_QC; N
@@ -2080,7 +2079,7 @@ FFED..FFEE ; NFKC_QC; N
1F100..1F10A ; NFKC_QC; N
1F110..1F12E ; NFKC_QC; N
1F130..1F14F ; NFKC_QC; N
-1F16A..1F16B ; NFKC_QC; N
+1F16A..1F16C ; NFKC_QC; N
1F190 ; NFKC_QC; N
1F200..1F202 ; NFKC_QC; N
1F210..1F23B ; NFKC_QC; N
@@ -2088,7 +2087,7 @@ FFED..FFEE ; NFKC_QC; N
1F250..1F251 ; NFKC_QC; N
2F800..2FA1D ; NFKC_QC; N
-# Total code points: 4794
+# Total code points: 4796
# ================================================
@@ -2682,7 +2681,7 @@ FB46..FB4E ; Expands_On_NFC
326E..327E ; Expands_On_NFKD
32B1..32BF ; Expands_On_NFKD
32C0..32CF ; Expands_On_NFKD
-3300..33FF ; Expands_On_NFKD
+32FF..33FF ; Expands_On_NFKD
AC00..D7A3 ; Expands_On_NFKD
FB00..FB06 ; Expands_On_NFKD
FB13..FB17 ; Expands_On_NFKD
@@ -2726,13 +2725,13 @@ FFE3 ; Expands_On_NFKD
1F110..1F12A ; Expands_On_NFKD
1F12D..1F12E ; Expands_On_NFKD
1F14A..1F14F ; Expands_On_NFKD
-1F16A..1F16B ; Expands_On_NFKD
+1F16A..1F16C ; Expands_On_NFKD
1F190 ; Expands_On_NFKD
1F200..1F201 ; Expands_On_NFKD
1F213 ; Expands_On_NFKD
1F240..1F248 ; Expands_On_NFKD
-# Total code points: 13387
+# Total code points: 13389
# ================================================
@@ -2833,7 +2832,7 @@ FFE3 ; Expands_On_NFKD
327C..327D ; Expands_On_NFKC
32B1..32BF ; Expands_On_NFKC
32C0..32CF ; Expands_On_NFKC
-3300..33FF ; Expands_On_NFKC
+32FF..33FF ; Expands_On_NFKC
FB00..FB06 ; Expands_On_NFKC
FB13..FB17 ; Expands_On_NFKC
FB1D ; Expands_On_NFKC
@@ -2865,12 +2864,12 @@ FFE3 ; Expands_On_NFKC
1F110..1F12A ; Expands_On_NFKC
1F12D..1F12E ; Expands_On_NFKC
1F14A..1F14F ; Expands_On_NFKC
-1F16A..1F16B ; Expands_On_NFKC
+1F16A..1F16C ; Expands_On_NFKC
1F190 ; Expands_On_NFKC
1F200..1F201 ; Expands_On_NFKC
1F240..1F248 ; Expands_On_NFKC
-# Total code points: 1235
+# Total code points: 1237
# ================================================
@@ -4958,6 +4957,7 @@ FFE3 ; Expands_On_NFKC
32FC ; NFKC_CF; 30F0
32FD ; NFKC_CF; 30F1
32FE ; NFKC_CF; 30F2
+32FF ; NFKC_CF; 4EE4 548C
3300 ; NFKC_CF; 30A2 30D1 30FC 30C8
3301 ; NFKC_CF; 30A2 30EB 30D5 30A1
3302 ; NFKC_CF; 30A2 30F3 30DA 30A2
@@ -5326,6 +5326,13 @@ A7B3 ; NFKC_CF; AB53
A7B4 ; NFKC_CF; A7B5
A7B6 ; NFKC_CF; A7B7
A7B8 ; NFKC_CF; A7B9
+A7BA ; NFKC_CF; A7BB
+A7BC ; NFKC_CF; A7BD
+A7BE ; NFKC_CF; A7BF
+A7C2 ; NFKC_CF; A7C3
+A7C4 ; NFKC_CF; A794
+A7C5 ; NFKC_CF; 0282
+A7C6 ; NFKC_CF; 1D8E
A7F8 ; NFKC_CF; 0127
A7F9 ; NFKC_CF; 0153
AB5C ; NFKC_CF; A727
@@ -8195,6 +8202,7 @@ FFF0..FFF8 ; NFKC_CF;
1F14F ; NFKC_CF; 0077 0063
1F16A ; NFKC_CF; 006D 0063
1F16B ; NFKC_CF; 006D 0064
+1F16C ; NFKC_CF; 006D 0072
1F190 ; NFKC_CF; 0064 006A
1F200 ; NFKC_CF; 307B 304B
1F201 ; NFKC_CF; 30B3 30B3
@@ -8794,7 +8802,7 @@ E0080..E00FF ; NFKC_CF;
E0100..E01EF ; NFKC_CF;
E01F0..E0FFF ; NFKC_CF;
-# Total code points: 10306
+# Total code points: 10315
# ================================================
@@ -9452,8 +9460,7 @@ E01F0..E0FFF ; NFKC_CF;
3280..3289 ; Changes_When_NFKC_Casefolded
328A..32B0 ; Changes_When_NFKC_Casefolded
32B1..32BF ; Changes_When_NFKC_Casefolded
-32C0..32FE ; Changes_When_NFKC_Casefolded
-3300..33FF ; Changes_When_NFKC_Casefolded
+32C0..33FF ; Changes_When_NFKC_Casefolded
A640 ; Changes_When_NFKC_Casefolded
A642 ; Changes_When_NFKC_Casefolded
A644 ; Changes_When_NFKC_Casefolded
@@ -9556,6 +9563,11 @@ A7AA..A7AE ; Changes_When_NFKC_Casefolded
A7B0..A7B4 ; Changes_When_NFKC_Casefolded
A7B6 ; Changes_When_NFKC_Casefolded
A7B8 ; Changes_When_NFKC_Casefolded
+A7BA ; Changes_When_NFKC_Casefolded
+A7BC ; Changes_When_NFKC_Casefolded
+A7BE ; Changes_When_NFKC_Casefolded
+A7C2 ; Changes_When_NFKC_Casefolded
+A7C4..A7C6 ; Changes_When_NFKC_Casefolded
A7F8..A7F9 ; Changes_When_NFKC_Casefolded
AB5C..AB5F ; Changes_When_NFKC_Casefolded
AB70..ABBF ; Changes_When_NFKC_Casefolded
@@ -9769,7 +9781,7 @@ FFF0..FFF8 ; Changes_When_NFKC_Casefolded
1F100..1F10A ; Changes_When_NFKC_Casefolded
1F110..1F12E ; Changes_When_NFKC_Casefolded
1F130..1F14F ; Changes_When_NFKC_Casefolded
-1F16A..1F16B ; Changes_When_NFKC_Casefolded
+1F16A..1F16C ; Changes_When_NFKC_Casefolded
1F190 ; Changes_When_NFKC_Casefolded
1F200..1F202 ; Changes_When_NFKC_Casefolded
1F210..1F23B ; Changes_When_NFKC_Casefolded
@@ -9784,6 +9796,6 @@ E0080..E00FF ; Changes_When_NFKC_Casefolded
E0100..E01EF ; Changes_When_NFKC_Casefolded
E01F0..E0FFF ; Changes_When_NFKC_Casefolded
-# Total code points: 10306
+# Total code points: 10315
# EOF
diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/FractionalUCA.txt b/Build/source/libs/icu/icu-src/source/data/unidata/FractionalUCA.txt
index 6c965ccae4d..5655134c679 100644
--- a/Build/source/libs/icu/icu-src/source/data/unidata/FractionalUCA.txt
+++ b/Build/source/libs/icu/icu-src/source/data/unidata/FractionalUCA.txt
@@ -1,12 +1,12 @@
# Fractional UCA Table, generated from the UCA DUCET
-# 2018-05-21 [MS]
-# VERSION: UCA=11.0.0, UCD=11.0.0
+# 2019-04-01 [MS]
+# VERSION: UCA=12.1.0, UCD=12.1.0
# © 2016 and later: Unicode, Inc. and others.
# License & terms of use: http://www.unicode.org/copyright.html
# For a description of the format and usage, see
# http://www.unicode.org/reports/tr35/tr35-collation.html
-[UCA version = 11.0.0]
+[UCA version = 12.1.0]
# Unified_Ideograph: 87887 characters
[Unified_Ideograph 4E00..9FEF FA0E..FA0F FA11 FA13..FA14 FA1F FA21 FA23..FA24 FA27..FA29 3400..4DB5 20000..2A6D6 2A700..2B734 2B740..2B81D 2B820..2CEA1 2CEB0..2EBE0]
@@ -93,7 +93,7 @@
[radical 81=⽐比:比毕𠂱𣬂-𣬇毖-毘㲋𭯊毙𣬈-𣬊𭯋-𭯎𣬋𣬌𭯏𬆹𭯐𭯑𣬍𬆺𣬎-𣬑𪵕𣬒-𣬔毚𣬕𣬖𬆻𣬗-𣬚]
[radical 82=⽑毛:毛𣬛𪵖㲌𣬜-𣬠毜毝𣬡-𣬨𬆼毞毟㲍-㲑𣬩-𣬷𪵗𪵘𬆽-𬆿𭯒毠毡㲒𣬸-𣭛𪵙𪵚𬇀𭯓-𭯗毢-毪㲓𣭜-𣭰𪵛𪵜𭯘毫-毮㲔-㲚𣭱-𣮇𬇁𭯙𭯚毯-毶㲛-㲞𣮈-𣮧𪵝𪵞𭯛-𭯝毷-毽㲟-㲣𣮨-𣯄𪵟𬇂𭯞𭯟毾㲤-㲩𣯅-𣯢𪵠𬇃𬇄𭯠-𭯢毿-氂𣯣-𣯷𪵡𬇅氃-氇㲪-㲮𣯸-𣰉𬇆𭯣-𭯥氈-氊𣰊-𣰙𬇇𭯦-𭯩氋㲯㲰𣰚-𣰪𪵢𬇈𭯪氌㲱𣰫-𣰰𭯫𠫈𣰱-𣰵𭯬𣰶-𣰺氍𣰻-𣰾𭯭𣰿-𣱁𭯮氎㲲𣱂𣱃𭯯𣱄]
[radical 83=⽒氏:氏-民𫞕氒𫞖𬇉氓𣱅𣱆𬇊𬇋𭯰𣱇-𣱊𬇌㲳𬇍𣱋-𣱎𭯱𣱏𣱐𬇎𣱑-𣱔]
-[radical 84=⽓气:气-氘𣱕𣱖氙氚𣱗𣱘氛-氝㲴𣱙-𣱛𪵣𬇏𭯲氞-氢𣱜-𣱠𪵤𬇐氣-氩𣱡𬇑氪氫㲵𣱣𪵥氬-氰𣱢𣱤𣱥氱𣱦-𣱨𪵦氲氳𣱩𪵧𬇒㲶𣱪𣱫𭯳鿫㲷𭯴𣱬𣱭𬇓𣱮𭯵𣱯𣱰]
+[radical 84=⽓气:气-氘𣱕𣱖氙氚𣱗𣱘氛-氝㲴𣱙-𣱛𪵣𬇏𭯲氞-氢𣱜-𣱠𪵤𬇐氣-氩𣱡𬇑氪氫㲵𣱣𪵥氬-氰𣱢𣱤𣱥氱𣱦-𣱨𪵦氲氳𣱩𪵧𬇒㲶𣱪𣱫𭯳㲷𭯴鿫𣱬𣱭𬇓𣱮𭯵𣱯𣱰]
[radical 85=⽔水:水氵氺𣱱氶-氹㲸𣱲-𣱴氻氼氾-汉㲹-㲼𣱵-𣱿𪵨汊-汤㲽-㲿𣲀-𣲍𪵩-𪵬𬇔-𬇗𭯶𭯷汥-沪㳀-㳊𣲎-𣲱𪵭-𪵰𬇘-𬇚𭯸-𭯼沫-泙泛-泴泶-泾㳋-㳕𣲲-𣳣𪵱-𪵶𬇛-𬇟𭯽-𭰋泚泿-洌洎-洕洗-浕㳖-㳣𣳤-𣴝𪵷-𪵽𬇠-𬇦𭰌-𭰖洍洖浖-涘涚-涩㳤-㳳𣴞-𣵶𣷚𪵾-𪶋𫞗𬇧-𬇴𭰗-𭰧涙涪-渂渄-渗渚湴㳴-㴎𣵷-𣷙𣷛-𣷻𣸊𪶌-𪶖𫞘𬇵-𬈄𭰨-𭱂渃渘渙減-湳湵-溌滋滞鿌㴏-㴤𣷼-𣸉𣸋-𣹜𪶗-𪶩𬈅-𬈕𭱃-𭱡溍-滊滍-滙滛-滝滟-滪漓㴥-㴻𣹝-𣻌𦴶𪶪-𪶾𫞙-𫞛𬈖-𬈤𭱢-𭱵滌滚滫-漊漌-漒演-漼漾-潍㴼-㵉𣻍-𣻳𣻵-𣼘𣼚-𣽂𪶿-𪷊𬈥-𬈱𭱶-𭲑漋漽潎-潿澁-澘澚-澝濐㵊-㵜𣻴𣽃-𣾨𣾪-𣾿𣿁-𣿄𪷋-𪷜𫞜𬈲-𬉇𭲒-𭲫澙澞-濏濑-濓濖㵝-㵮𣾩𣿅-𤀡𪷝-𪷧𫞝𬉈-𬉒𭲬-𭲻澀濔濕濗-濲濴-濸㵯-㵼𣿀𤀣-𤁝𤁟𤁠𪷨-𪷲𬉓-𬉚𭲼-𭳏濹-瀔㵽-㶃𤁞𤁡-𤂜𤂞-𤂠𤂢-𤂲𪷳-𪷹𬉛-𬉞𭳐-𭳛濳瀕-瀮㶄-㶋𤂝𤂡𤂳-𤃧𪷺-𪷿𫞞𬉟-𬉤𭳜-𭳫瀯-灁㶌-㶑𤃨-𤄍𪸀-𪸂𬉥-𬉪𭳬-𭳯灂-灍灏灐㶒-㶘𢌇𤄎-𤄵𪸃-𪸇𬉫-𬉭𭳰-𭳶灑-灘㶙㶚𤄶-𤅉𪸈𪸉𬉮𬉯𭳷-𭳹灙-灜㶛-㶝𤅊-𤅟𪸊𪸋灝-灡㶞㶟𤅠-𤅨𪸌𬉰𬉱𭳺-𭳽灢灣𤅩-𤅯灎灤-灦㶠𤅰-𤅶灧灨𤅷-𤅿𬉲灩灪𭳾𤆀𬉳𤆁]
[radical 86=⽕火:火-灭𤆂𪸍𭳿灮-灳炇㶡㶢𤆃-𤆌𭴀-𭴂灴-炀㶣-㶥𤆍-𤆜𪸎-𪸐𬉴-𬉺𭴃-𭴇炁-炆炈-炞㶦-㶪𤆝-𤆻𪸑-𪸗𬉻-𬊀𭴈-𭴑炟-烃㶫-㶲𤆼-𤇮𪸘-𪸢𬊁𬊂𭴒-𭴚烄-烮㶳-㶸𤇯-𤈤𪸣-𪸪𫞟𬊃-𬊈𭴛-𭴥烯-焓焕-焘㶹-㷁𤈥-𤉡𪸫-𪸲𫞠𬊉-𬊖𭴦-𭴷焔焙-煀煮㷂-㷍𤉢-𤊱𪸳-𪹃𬊗-𬊨𭴸-𭵈煁-煭煯-煸煺㮡㷎-㷞𤊲-𤋲𤋴-𤌆𤍏𪹄-𪹑𬊩-𬊱𭵉-𭵡煹煻-熙熦蒸㷟-㷪𤌇-𤌱𤌳-𤍎𪹒-𪹠𫞡𬊲-𬊾𭵢-𭵲熚-熥熧-熵黙龦龽㷫-㷲𤌲𤍐-𤍨𤍪-𤍿𤎁𤎃-𤎜𪹡-𪹩𬊿-𬋄𭵳-𭵼熶-燞㷳-㷽𤍩𤎝-𤏟𤏡-𤏴𪹪-𪹳𬋅-𬋌𭵽-𭶋營-燷鿪㷾-㸃𤏵-𤐣𪹴-𪹻𬋍-𬋐𭶌-𭶙燸-爃㸄㸅𤐤-𤑂𤑄-𤑑𦦨𪹼-𪺀𬋑-𬋓𭶚-𭶡爄-爊爌-爎爕㸆㸇㸉𤑒-𤑲𪺁𪺂𬋔-𬋘𭶢𭶣爋爏-爔爖-爘㸈㸊-㸌𤑳-𤒠𤒨𪺃-𪺅𬋙-𬋝𭶤-𭶦爙-爛㸍𤒡-𤒧𤒪-𤒹爜-爠㸎𤒩𤒺𤒻𤒽-𤓆𪺆𪺇𭶧爡爢㸏㸐𤒼𤓇-𤓎𤓐-𤓖𪺈𬋞爣𤓗-𤓛𪺉𭶨𭶩爤-爦𤓜-𤓞𤓠-𤓣𪺊𪺋𬋟𬋠㸑𤓤-𤓩𪺌爧𤓪𤓬𬋡𬋢爨𤓫𤓭爩𤓮𬋣]
[radical 87=⽖爪:爪爫𤓯-𤓵𪺍爬爭㸒㸓𤓶-𤓼𬋤𬋥𭶪爮-爰𤓽-𤔋𪺎𬋦𭶫爱𤔌-𤔏𬋧𬋨𭶬-𭶯㸔𤔐-𤔓𪺏𬋩𬋪𭶰爲𤔔-𤔖𤔘-𤔛𪺐-𪺓𬋫𬋬𭶱𤔜-𤔡𪺔𪺕𬋭𬋮𭶲𭶳爳㸕𤔢-𤔦𬋯𬋰𭶴𭶵噕爴𤔧-𤔭𪺖𪺗𬋱𬋲𭶶𤔮-𤔱𬋳𬋴𭶷𭶸𤔲-𤔸𤔼𪺘𪺙𬋵𬋶爵𤔹𤔻𤔽𤔾𭶹𤔺𤔿𤕀𬋷𤕂-𤕇𬋸𬋹𤕈-𤕍𬋺𪺚]
@@ -254,7 +254,7 @@
[top_byte 00 TERMINATOR ]
[top_byte 01 LEVEL-SEPARATOR ]
[top_byte 02 FIELD-SEPARATOR ]
-[top_byte 03 SPACE PUNCTUATION ] # 684 primary weights
+[top_byte 03 SPACE PUNCTUATION ] # 688 primary weights
[top_byte 04 SPACE PUNCTUATION ]
[top_byte 05 SPACE PUNCTUATION ]
[top_byte 06 SPACE PUNCTUATION ]
@@ -263,9 +263,9 @@
[top_byte 09 SPACE PUNCTUATION ]
[top_byte 0A SPACE PUNCTUATION ]
[top_byte 0B SPACE PUNCTUATION ]
-[top_byte 0C SYMBOL CURRENCY ] # 5937 primary weights
+[top_byte 0C SYMBOL CURRENCY ] # 6120 primary weights
[top_byte 0D SYMBOL CURRENCY ]
-[top_byte 0E DIGIT ] # 440 primary weights
+[top_byte 0E DIGIT ] # 504 primary weights
[top_byte 0F DIGIT ]
[top_byte 10 DIGIT ]
[top_byte 11 DIGIT ]
@@ -292,7 +292,7 @@
[top_byte 26 DIGIT ]
[top_byte 27 REORDER_RESERVED_BEFORE_LATIN ]
[top_byte 28 REORDER_RESERVED_BEFORE_LATIN ]
-[top_byte 29 Latn ] # 390 primary weights
+[top_byte 29 Latn ] # 394 primary weights
[top_byte 2A Latn ]
[top_byte 2B Latn ]
[top_byte 2C Latn ]
@@ -364,19 +364,19 @@
[top_byte 6E Telu COMPRESS ] # 75 primary weights
[top_byte 6F Knda COMPRESS ] # 75 primary weights
[top_byte 70 Mlym COMPRESS ] # 74 primary weights
-[top_byte 71 Sinh Mtei Sylo Saur Kthi Mahj Shrd Khoj Sind Mult Gran Newa Tirh Sidd Modi Takr Dogr Ahom Gonm Gong Sund Brah Khar Bhks COMPRESS ] # 1379 primary weights
+[top_byte 71 Sinh Mtei Sylo Saur Kthi Mahj Shrd Khoj Sind Mult Gran Newa Tirh Sidd Modi Takr Nand Dogr Ahom Gonm Gong Sund Brah Khar Bhks COMPRESS ] # 1444 primary weights
[top_byte 72 Thai COMPRESS ] # 65 primary weights
-[top_byte 73 Laoo Tavt COMPRESS ] # 117 primary weights
-[top_byte 74 Tibt Zanb Soyo COMPRESS ] # 206 primary weights
+[top_byte 73 Laoo Tavt COMPRESS ] # 132 primary weights
+[top_byte 74 Tibt Zanb Soyo COMPRESS ] # 208 primary weights
[top_byte 75 Marc Lepc Phag Limb Tglg Hano Buhd Tagb Bugi Maka Batk Rjng Kali Mymr Rohg Cakm Khmr COMPRESS ] # 805 primary weights
[top_byte 76 Tale Talu Lana Cham Bali Java Mong Olck Cher Osge Cans Ogam COMPRESS ] # 1415 primary weights
[top_byte 77 Runr Hung Orkh COMPRESS ] # 135 primary weights
-[top_byte 78 Vaii Bamu Bass Mend Medf Adlm COMPRESS ] # 1217 primary weights
+[top_byte 78 Vaii Bamu Bass Mend Medf Adlm COMPRESS ] # 1218 primary weights
[top_byte 79 Hang COMPRESS ] # 358 primary weights
[top_byte 7A Hira Hrkt Kana COMPRESS ] # 336 primary weights
-[top_byte 7B Bopo Yiii Lisu Plrd Wara Pauc Hmng Lyci Cari Lydi Ital Goth COMPRESS ] # 1750 primary weights
-[top_byte 7C Dsrt Shaw Dupl Osma Elba Aghb Sora Mroo Linb Lina Cprt Sarb Narb Avst Palm Nbat Hatr Armi Prti Phli Phlp Mani Sogo Sogd Ugar Xpeo Xsux COMPRESS ] # 2564 primary weights
-[top_byte 7D Egyp Merc Mero Hluw Tang Nshu COMPRESS ] # 8968 primary weights
+[top_byte 7B Bopo Yiii Lisu Plrd Wara Pauc Hmng Hmnp Wcho Lyci Cari Lydi Ital Goth COMPRESS ] # 1863 primary weights
+[top_byte 7C Dsrt Shaw Dupl Osma Elba Aghb Sora Mroo Linb Lina Cprt Sarb Narb Avst Palm Nbat Hatr Armi Prti Phli Phlp Elym Mani Sogo Sogd Ugar Xpeo Xsux COMPRESS ] # 2587 primary weights
+[top_byte 7D Egyp Merc Mero Hluw Tang Nshu COMPRESS ] # 8974 primary weights
[top_byte 7E Hani Hans Hant ]
[top_byte 7F Hani Hans Hant ]
[top_byte 80 Hani Hans Hant ]
@@ -798,6 +798,15 @@ A8F1; [,,]
11372; [,,]
11373; [,,]
11374; [,,]
+13430; [,,]
+13431; [,,]
+13432; [,,]
+13433; [,,]
+13434; [,,]
+13435; [,,]
+13436; [,,]
+13437; [,,]
+13438; [,,]
1BCA0; [,,]
1BCA1; [,,]
1BCA2; [,,]
@@ -1562,376 +1571,389 @@ FE20; [, DE, 05]
0483; [, E0, 05]
FE2E; [, E0, 05]
A66F; [, E2 02, 05]
-05B0; [, E2 24, 05]
-05B1; [, E2 46, 05]
-05B2; [, E2 68, 05]
-05B3; [, E2 8A, 05]
-05B4; [, E2 AC, 05]
-05B5; [, E2 CE, 05]
-05B6; [, E2 F0, 05]
-05B7; [, E3 14, 05]
-05B8; [, E3 36, 05]
-05C7; [, E3 36, 05]
-05B9; [, E3 58, 05]
-05BA; [, E3 58, 05]
-05BB; [, E3 7A, 05]
-05C2; [, E3 9C, 05]
-05C1; [, E3 BE, 05]
-05BC; [, E3 E0, 05]
-05BF; [, E4 04, 05]
-FB1E; [, E4 26, 05]
-081C; [, E4 48, 05]
-081D; [, E4 48, 05]
-081E; [, E4 6A, 05]
-081F; [, E4 6A, 05]
-0820; [, E4 6A, 05]
-0821; [, E4 8C, 05]
-0822; [, E4 8C, 05]
-0823; [, E4 8C, 05]
-0824; [, E4 AE, 05]
-0825; [, E4 AE, 05]
-0826; [, E4 D0, 05]
-0827; [, E4 D0, 05]
-0828; [, E4 F2, 05]
-0829; [, E4 F2, 05]
-082A; [, E4 F2, 05]
-082B; [, E5 16, 05]
-082C; [, E5 38, 05]
-0818; [, E5 5A, 05]
-0819; [, E5 7C, 05]
-082D; [, E5 9E, 05]
-064B; [, E5 C0, 05]
-FE71; [, E5 C0, 10]
-FE70; [, E5 C0, 2C]
-08F0; [, E5 E2, 05]
-08E7; [, E6 06, 05]
-064C; [, E6 28, 05]
-FE72; [, E6 28, 20]
-FC5E; [, E6 28, 20][, E8 4C, 2E]
-08F1; [, E6 4A, 05]
-08E8; [, E6 6C, 05]
-064D; [, E6 8E, 05]
-FE74; [, E6 8E, 20]
-FC5F; [, E6 8E, 20][, E8 4C, 2E]
-08F2; [, E6 B0, 05]
-08E9; [, E6 D2, 05]
-064E; [, E6 F4, 05]
-FE77; [, E6 F4, 20]
-FE76; [, E6 F4, 2E]
-FCF2; [, E6 F4, 20][, E8 4C, 20]
-FC60; [, E6 F4, 2E][, E8 4C, 2E]
-08E4; [, E7 18, 05]
-08F4; [, E7 3A, 05]
-08F5; [, E7 5C, 05]
-064F; [, E7 7E, 05]
-FE79; [, E7 7E, 20]
-FE78; [, E7 7E, 2E]
-FCF3; [, E7 7E, 20][, E8 4C, 20]
-FC61; [, E7 7E, 2E][, E8 4C, 2E]
-08E5; [, E7 A0, 05]
-08FE; [, E7 C2, 05]
-0650; [, E7 E4, 05]
-FE7B; [, E7 E4, 20]
-FE7A; [, E7 E4, 2E]
-FCF4; [, E7 E4, 20][, E8 4C, 20]
-FC62; [, E7 E4, 2E][, E8 4C, 2E]
-08E6; [, E8 08, 05]
-08F6; [, E8 2A, 05]
-0651; [, E8 4C, 05]
-0AFB; [, E8 4C, 05]
-11237; [, E8 4C, 05]
-FE7D; [, E8 4C, 20]
-FE7C; [, E8 4C, 2E]
-FC63; [, E8 4C, 2E][, EB 82, 2C]
-0652; [, E8 6E, 05]
-0AFA; [, E8 6E, 05]
-1123E; [, E8 6E, 05]
-FE7F; [, E8 6E, 20]
-FE7E; [, E8 6E, 2E]
-0653; [, E8 90, 05]
-0AFC; [, E8 90, 05]
-0654; [, E8 B2, 05]
-0655; [, E8 D4, 05]
-065F; [, E8 F6, 05]
-0656; [, E9 1A, 05]
-0657; [, E9 3C, 05]
-0658; [, E9 5E, 05]
-08FF; [, E9 80, 05]
-0659; [, E9 A2, 05]
-065A; [, E9 C4, 05]
-065B; [, E9 E6, 05]
-065C; [, EA 0A, 05]
-065D; [, EA 2C, 05]
-065E; [, EA 4E, 05]
-08E3; [, EA 70, 05]
-08F7; [, EA 92, 05]
-08F8; [, EA B4, 05]
-08FD; [, EA D6, 05]
-08FB; [, EA F8, 05]
-08FC; [, EB 1C, 05]
-08F9; [, EB 3E, 05]
-08FA; [, EB 60, 05]
-0670; [, EB 82, 05]
-0711; [, EB A4, 05]
-0730; [, EB C6, 05]
-0731; [, EB E8, 05]
-0732; [, EC 0C, 05]
-0733; [, EC 2E, 05]
-0734; [, EC 50, 05]
-0735; [, EC 72, 05]
-0736; [, EC 94, 05]
-0737; [, EC B6, 05]
-0738; [, EC D8, 05]
-0739; [, EC FA, 05]
-073A; [, ED 1E, 05]
-073B; [, ED 40, 05]
-073C; [, ED 62, 05]
-073D; [, ED 84, 05]
-073E; [, ED A6, 05]
-073F; [, ED C8, 05]
-07EB; [, ED EA, 05]
-07EC; [, EE 0E, 05]
-07ED; [, EE 30, 05]
-07EE; [, EE 52, 05]
-07EF; [, EE 74, 05]
-07F0; [, EE 96, 05]
-07F1; [, EE B8, 05]
-07F2; [, EE DA, 05]
-07F3; [, EE FC, 05]
-135F; [, EF 20, 05]
-135E; [, EF 42, 05]
-135D; [, EF 64, 05]
-A6F0; [, EF 86, 05]
-A6F1; [, EF A8, 05]
-16AF0; [, EF CA, 05]
-16AF1; [, EF EC, 05]
-16AF2; [, F0 10, 05]
-16AF3; [, F0 32, 05]
-16AF4; [, F0 54, 05]
-1E944; [, F0 76, 05]
-1E945; [, F0 76, 05]
-1E946; [, F0 76, 05]
-1E94A; [, F0 98, 05]
-1E947; [, F0 BA, 05]
-1E948; [, F0 DC, 05]
-1E949; [, F0 FE, 05]
-093C; [, F1 22, 05]
-09BC; [, F1 22, 05]
-0A3C; [, F1 22, 05]
-0ABC; [, F1 22, 05]
-0AFD; [, F1 22, 05]
-0AFE; [, F1 22, 05]
-0AFF; [, F1 22, 05]
-0B3C; [, F1 22, 05]
-0CBC; [, F1 22, 05]
-1B34; [, F1 22, 05]
-1BE6; [, F1 22, 05]
-1C37; [, F1 22, 05]
-A9B3; [, F1 22, 05]
-110BA; [, F1 22, 05]
-11173; [, F1 22, 05]
-111CA; [, F1 22, 05]
-11236; [, F1 22, 05]
-112E9; [, F1 22, 05]
-1133B; [, F1 22, 05]
-1133C; [, F1 22, 05]
-11446; [, F1 22, 05]
-114C3; [, F1 22, 05]
-115C0; [, F1 22, 05]
-116B7; [, F1 22, 05]
-1183A; [, F1 22, 05]
-11A33; [, F1 22, 05]
-11D42; [, F1 22, 05]
-0900; [, F1 44, 05]
-0901; [, F1 44, 05]
-0981; [, F1 44, 05]
-0A01; [, F1 44, 05]
-0A81; [, F1 44, 05]
-0B01; [, F1 44, 05]
-0C00; [, F1 44, 05]
-0C01; [, F1 44, 05]
-0C81; [, F1 44, 05]
-0D01; [, F1 44, 05]
-1B00; [, F1 44, 05]
-1B01; [, F1 44, 05]
-A8C5; [, F1 44, 05]
-A980; [, F1 44, 05]
-11000; [, F1 44, 05]
-11080; [, F1 44, 05]
-11100; [, F1 44, 05]
-11180; [, F1 44, 05]
-11301; [, F1 44, 05]
-11443; [, F1 44, 05]
-114BF; [, F1 44, 05]
-115BC; [, F1 44, 05]
-11640; [, F1 44, 05]
-11A35; [, F1 44, 05]
-11A36; [, F1 44, 05]
-11A37; [, F1 44, 05]
-11C3C; [, F1 44, 05]
-11CB6; [, F1 44, 05]
-11D43; [, F1 44, 05]
-0902; [, F1 66, 05]
-0982; [, F1 66, 05]
-0A02; [, F1 66, 05]
-0A82; [, F1 66, 05]
-0B02; [, F1 66, 05]
-0B82; [, F1 66, 05]
-0C02; [, F1 66, 05]
-0C04; [, F1 66, 05]
-0C82; [, F1 66, 05]
-0D00; [, F1 66, 05]
-0D02; [, F1 66, 05]
-0D82; [, F1 66, 05]
-0F7E; [, F1 66, 05]
-1036; [, F1 66, 05]
-17C6; [, F1 66, 05]
-1A74; [, F1 66, 05]
-1B02; [, F1 66, 05]
-1B80; [, F1 66, 05]
-1CED; [, F1 66, 05]
-A80B; [, F1 66, 05]
-A880; [, F1 66, 05]
-A981; [, F1 66, 05]
-10A0E; [, F1 66, 05]
-11001; [, F1 66, 05]
-11081; [, F1 66, 05]
-11101; [, F1 66, 05]
-11181; [, F1 66, 05]
-11234; [, F1 66, 05]
-112DF; [, F1 66, 05]
-11300; [, F1 66, 05]
-11302; [, F1 66, 05]
-11444; [, F1 66, 05]
-114C0; [, F1 66, 05]
-115BD; [, F1 66, 05]
-1163D; [, F1 66, 05]
-116AB; [, F1 66, 05]
-11837; [, F1 66, 05]
-11A38; [, F1 66, 05]
-11A96; [, F1 66, 05]
-11C3D; [, F1 66, 05]
-11CB5; [, F1 66, 05]
-11D40; [, F1 66, 05]
-11D95; [, F1 66, 05]
-0903; [, F1 88, 05]
-0983; [, F1 88, 05]
-0A03; [, F1 88, 05]
-0A83; [, F1 88, 05]
-0B03; [, F1 88, 05]
-0C03; [, F1 88, 05]
-0C83; [, F1 88, 05]
-0D03; [, F1 88, 05]
-0D83; [, F1 88, 05]
-0F7F; [, F1 88, 05]
-1038; [, F1 88, 05]
-17C7; [, F1 88, 05]
-1B04; [, F1 88, 05]
-1B82; [, F1 88, 05]
-1CF2; [, F1 88, 05]
-1CF3; [, F1 88, 05]
-A881; [, F1 88, 05]
-A983; [, F1 88, 05]
-10A0F; [, F1 88, 05]
-11002; [, F1 88, 05]
-11082; [, F1 88, 05]
-11102; [, F1 88, 05]
-11182; [, F1 88, 05]
-11303; [, F1 88, 05]
-11445; [, F1 88, 05]
-114C1; [, F1 88, 05]
-115BE; [, F1 88, 05]
-1163E; [, F1 88, 05]
-116AC; [, F1 88, 05]
-11838; [, F1 88, 05]
-11A39; [, F1 88, 05]
-11A97; [, F1 88, 05]
-11C3E; [, F1 88, 05]
-11D41; [, F1 88, 05]
-11D96; [, F1 88, 05]
-09FE; [, F1 AA, 05]
-111C9; [, F1 AA, 05]
-1145E; [, F1 AA, 05]
-0A70; [, F1 CC, 05]
-0A71; [, F1 EE, 05]
-1B03; [, F2 12, 05]
-A982; [, F2 34, 05]
-1B81; [, F2 56, 05]
-ABEC; [, F2 78, 05]
-10A38; [, F2 9A, 05]
-10A39; [, F2 BC, 05]
-10A3A; [, F2 DE, 05]
-111CB; [, F3 02, 05]
-111CC; [, F3 24, 05]
-11A98; [, F3 46, 05]
-0E4E; [, F3 68, 05]
-0E47; [, F3 8A, 05]
-0E48; [, F3 AC, 05]
-0E49; [, F3 CE, 05]
-0E4A; [, F3 F0, 05]
-0E4B; [, F4 14, 05]
-0E4C; [, F4 36, 05]
-0E4D; [, F4 58, 05]
-0EC8; [, F4 7A, 05]
-0EC9; [, F4 9C, 05]
-0ECA; [, F4 BE, 05]
-0ECB; [, F4 E0, 05]
-0ECC; [, F5 04, 05]
-0ECD; [, F5 26, 05]
-AABF; [, F5 48, 05]
-AAC1; [, F5 6A, 05]
-0F39; [, F5 8C, 05]
-A92B; [, F5 AE, 05]
-A92C; [, F5 D0, 05]
-A92D; [, F5 F2, 05]
-1037; [, F6 16, 05]
-17C8; [, F6 38, 05]
-17C9; [, F6 5A, 05]
-17CA; [, F6 7C, 05]
-1A75; [, F6 9E, 05]
-1A76; [, F6 C0, 05]
-1A77; [, F6 E2, 05]
-1A78; [, F7 06, 05]
-1A79; [, F7 28, 05]
-1A7A; [, F7 4A, 05]
-1A7B; [, F7 6C, 05]
-1A7C; [, F7 8E, 05]
-1939; [, F7 B0, 05]
-193A; [, F7 D2, 05]
-193B; [, F7 F4, 05]
-16B30; [, F8 18, 05]
-16B31; [, F8 3A, 05]
-16B32; [, F8 5C, 05]
-16B33; [, F8 7E, 05]
-16B34; [, F8 A0, 05]
-16B35; [, F8 C2, 05]
-16B36; [, F8 E4, 05]
-302A; [, F9 08, 05]
-302B; [, F9 2A, 05]
-302C; [, F9 4C, 05]
-302D; [, F9 6E, 05]
-302E; [, F9 90, 05]
-302F; [, F9 B2, 05]
-20D0; [, F9 D4, 05]
-20D1; [, F9 F6, 05]
-20D2; [, FA 1A, 05]
-20D3; [, FA 1A, 05]
-20D4; [, FA 3C, 05]
-20D5; [, FA 5E, 05]
-20D6; [, FA 80, 05]
-20D7; [, FA A2, 05]
-20DB; [, FA C4, 05]
-20DC; [, FA E6, 05]
-20E1; [, FB 0A, 05]
-20E6; [, FB 2C, 05]
-20E7; [, FB 4E, 05]
-20E8; [, FB 70, 05]
-20E9; [, FB 92, 05]
-101FD; [, FB B4, 05]
-004C | 00B7; [, FB D6, 05]
-006C | 00B7; [, FB D6, 05]
-004C | 0387; [, FB D6, 05]
-006C | 0387; [, FB D6, 05]
+05B0; [, E2 23, 05]
+05B1; [, E2 44, 05]
+05B2; [, E2 65, 05]
+05B3; [, E2 86, 05]
+05B4; [, E2 A7, 05]
+05B5; [, E2 C8, 05]
+05B6; [, E2 E9, 05]
+05B7; [, E3 0C, 05]
+05B8; [, E3 2D, 05]
+05C7; [, E3 2D, 05]
+05B9; [, E3 4E, 05]
+05BA; [, E3 4E, 05]
+05BB; [, E3 6F, 05]
+05C2; [, E3 90, 05]
+05C1; [, E3 B1, 05]
+05BC; [, E3 D2, 05]
+05BF; [, E3 F3, 05]
+FB1E; [, E4 16, 05]
+081C; [, E4 37, 05]
+081D; [, E4 37, 05]
+081E; [, E4 58, 05]
+081F; [, E4 58, 05]
+0820; [, E4 58, 05]
+0821; [, E4 79, 05]
+0822; [, E4 79, 05]
+0823; [, E4 79, 05]
+0824; [, E4 9A, 05]
+0825; [, E4 9A, 05]
+0826; [, E4 BB, 05]
+0827; [, E4 BB, 05]
+0828; [, E4 DC, 05]
+0829; [, E4 DC, 05]
+082A; [, E4 DC, 05]
+082B; [, E4 FD, 05]
+082C; [, E5 20, 05]
+0818; [, E5 41, 05]
+0819; [, E5 62, 05]
+082D; [, E5 83, 05]
+064B; [, E5 A4, 05]
+FE71; [, E5 A4, 10]
+FE70; [, E5 A4, 2C]
+08F0; [, E5 C5, 05]
+08E7; [, E5 E6, 05]
+064C; [, E6 09, 05]
+FE72; [, E6 09, 20]
+FC5E; [, E6 09, 20][, E8 1D, 2E]
+08F1; [, E6 2A, 05]
+08E8; [, E6 4B, 05]
+064D; [, E6 6C, 05]
+FE74; [, E6 6C, 20]
+FC5F; [, E6 6C, 20][, E8 1D, 2E]
+08F2; [, E6 8D, 05]
+08E9; [, E6 AE, 05]
+064E; [, E6 CF, 05]
+FE77; [, E6 CF, 20]
+FE76; [, E6 CF, 2E]
+FCF2; [, E6 CF, 20][, E8 1D, 20]
+FC60; [, E6 CF, 2E][, E8 1D, 2E]
+08E4; [, E6 F0, 05]
+08F4; [, E7 13, 05]
+08F5; [, E7 34, 05]
+064F; [, E7 55, 05]
+FE79; [, E7 55, 20]
+FE78; [, E7 55, 2E]
+FCF3; [, E7 55, 20][, E8 1D, 20]
+FC61; [, E7 55, 2E][, E8 1D, 2E]
+08E5; [, E7 76, 05]
+08FE; [, E7 97, 05]
+0650; [, E7 B8, 05]
+FE7B; [, E7 B8, 20]
+FE7A; [, E7 B8, 2E]
+FCF4; [, E7 B8, 20][, E8 1D, 20]
+FC62; [, E7 B8, 2E][, E8 1D, 2E]
+08E6; [, E7 D9, 05]
+08F6; [, E7 FA, 05]
+0651; [, E8 1D, 05]
+0AFB; [, E8 1D, 05]
+11237; [, E8 1D, 05]
+FE7D; [, E8 1D, 20]
+FE7C; [, E8 1D, 2E]
+FC63; [, E8 1D, 2E][, EB 3B, 2C]
+0652; [, E8 3E, 05]
+0AFA; [, E8 3E, 05]
+1123E; [, E8 3E, 05]
+FE7F; [, E8 3E, 20]
+FE7E; [, E8 3E, 2E]
+0653; [, E8 5F, 05]
+0AFC; [, E8 5F, 05]
+0654; [, E8 80, 05]
+0655; [, E8 A1, 05]
+065F; [, E8 C2, 05]
+0656; [, E8 E3, 05]
+0657; [, E9 06, 05]
+0658; [, E9 27, 05]
+08FF; [, E9 48, 05]
+0659; [, E9 69, 05]
+065A; [, E9 8A, 05]
+065B; [, E9 AB, 05]
+065C; [, E9 CC, 05]
+065D; [, E9 ED, 05]
+065E; [, EA 10, 05]
+08E3; [, EA 31, 05]
+08F7; [, EA 52, 05]
+08F8; [, EA 73, 05]
+08FD; [, EA 94, 05]
+08FB; [, EA B5, 05]
+08FC; [, EA D6, 05]
+08F9; [, EA F7, 05]
+08FA; [, EB 1A, 05]
+0670; [, EB 3B, 05]
+0711; [, EB 5C, 05]
+0730; [, EB 7D, 05]
+0731; [, EB 9E, 05]
+0732; [, EB BF, 05]
+0733; [, EB E0, 05]
+0734; [, EC 03, 05]
+0735; [, EC 24, 05]
+0736; [, EC 45, 05]
+0737; [, EC 66, 05]
+0738; [, EC 87, 05]
+0739; [, EC A8, 05]
+073A; [, EC C9, 05]
+073B; [, EC EA, 05]
+073C; [, ED 0D, 05]
+073D; [, ED 2E, 05]
+073E; [, ED 4F, 05]
+073F; [, ED 70, 05]
+07EB; [, ED 91, 05]
+07EC; [, ED B2, 05]
+07ED; [, ED D3, 05]
+07EE; [, ED F4, 05]
+07EF; [, EE 17, 05]
+07F0; [, EE 38, 05]
+07F1; [, EE 59, 05]
+07F2; [, EE 7A, 05]
+07F3; [, EE 9B, 05]
+135F; [, EE BC, 05]
+135E; [, EE DD, 05]
+135D; [, EE FE, 05]
+A6F0; [, EF 21, 05]
+A6F1; [, EF 42, 05]
+16AF0; [, EF 63, 05]
+16AF1; [, EF 84, 05]
+16AF2; [, EF A5, 05]
+16AF3; [, EF C6, 05]
+16AF4; [, EF E7, 05]
+1E944; [, F0 0A, 05]
+1E945; [, F0 0A, 05]
+1E946; [, F0 0A, 05]
+1E94A; [, F0 2B, 05]
+1E947; [, F0 4C, 05]
+1E948; [, F0 6D, 05]
+1E949; [, F0 8E, 05]
+093C; [, F0 AF, 05]
+09BC; [, F0 AF, 05]
+0A3C; [, F0 AF, 05]
+0ABC; [, F0 AF, 05]
+0AFD; [, F0 AF, 05]
+0AFE; [, F0 AF, 05]
+0AFF; [, F0 AF, 05]
+0B3C; [, F0 AF, 05]
+0CBC; [, F0 AF, 05]
+1B34; [, F0 AF, 05]
+1BE6; [, F0 AF, 05]
+1C37; [, F0 AF, 05]
+A9B3; [, F0 AF, 05]
+110BA; [, F0 AF, 05]
+11173; [, F0 AF, 05]
+111CA; [, F0 AF, 05]
+11236; [, F0 AF, 05]
+112E9; [, F0 AF, 05]
+1133B; [, F0 AF, 05]
+1133C; [, F0 AF, 05]
+11446; [, F0 AF, 05]
+114C3; [, F0 AF, 05]
+115C0; [, F0 AF, 05]
+116B7; [, F0 AF, 05]
+1183A; [, F0 AF, 05]
+11A33; [, F0 AF, 05]
+11D42; [, F0 AF, 05]
+0900; [, F0 D0, 05]
+0901; [, F0 D0, 05]
+0981; [, F0 D0, 05]
+0A01; [, F0 D0, 05]
+0A81; [, F0 D0, 05]
+0B01; [, F0 D0, 05]
+0C00; [, F0 D0, 05]
+0C01; [, F0 D0, 05]
+0C81; [, F0 D0, 05]
+0D01; [, F0 D0, 05]
+1B00; [, F0 D0, 05]
+1B01; [, F0 D0, 05]
+A8C5; [, F0 D0, 05]
+A980; [, F0 D0, 05]
+11000; [, F0 D0, 05]
+11080; [, F0 D0, 05]
+11100; [, F0 D0, 05]
+11180; [, F0 D0, 05]
+11301; [, F0 D0, 05]
+11443; [, F0 D0, 05]
+114BF; [, F0 D0, 05]
+115BC; [, F0 D0, 05]
+11640; [, F0 D0, 05]
+11A35; [, F0 D0, 05]
+11A36; [, F0 D0, 05]
+11A37; [, F0 D0, 05]
+11C3C; [, F0 D0, 05]
+11CB6; [, F0 D0, 05]
+11D43; [, F0 D0, 05]
+0902; [, F0 F1, 05]
+0982; [, F0 F1, 05]
+0A02; [, F0 F1, 05]
+0A82; [, F0 F1, 05]
+0B02; [, F0 F1, 05]
+0B82; [, F0 F1, 05]
+0C02; [, F0 F1, 05]
+0C04; [, F0 F1, 05]
+0C82; [, F0 F1, 05]
+0D00; [, F0 F1, 05]
+0D02; [, F0 F1, 05]
+0D82; [, F0 F1, 05]
+0F7E; [, F0 F1, 05]
+1036; [, F0 F1, 05]
+17C6; [, F0 F1, 05]
+1A74; [, F0 F1, 05]
+1B02; [, F0 F1, 05]
+1B80; [, F0 F1, 05]
+1CED; [, F0 F1, 05]
+A80B; [, F0 F1, 05]
+A880; [, F0 F1, 05]
+A981; [, F0 F1, 05]
+10A0E; [, F0 F1, 05]
+11001; [, F0 F1, 05]
+11081; [, F0 F1, 05]
+11101; [, F0 F1, 05]
+11181; [, F0 F1, 05]
+11234; [, F0 F1, 05]
+112DF; [, F0 F1, 05]
+11300; [, F0 F1, 05]
+11302; [, F0 F1, 05]
+11444; [, F0 F1, 05]
+114C0; [, F0 F1, 05]
+115BD; [, F0 F1, 05]
+1163D; [, F0 F1, 05]
+116AB; [, F0 F1, 05]
+11837; [, F0 F1, 05]
+119DE; [, F0 F1, 05]
+11A38; [, F0 F1, 05]
+11A96; [, F0 F1, 05]
+11C3D; [, F0 F1, 05]
+11CB5; [, F0 F1, 05]
+11D40; [, F0 F1, 05]
+11D95; [, F0 F1, 05]
+0903; [, F1 14, 05]
+0983; [, F1 14, 05]
+0A03; [, F1 14, 05]
+0A83; [, F1 14, 05]
+0B03; [, F1 14, 05]
+0C03; [, F1 14, 05]
+0C83; [, F1 14, 05]
+0D03; [, F1 14, 05]
+0D83; [, F1 14, 05]
+0F7F; [, F1 14, 05]
+1038; [, F1 14, 05]
+17C7; [, F1 14, 05]
+1B04; [, F1 14, 05]
+1B82; [, F1 14, 05]
+1CF2; [, F1 14, 05]
+1CF3; [, F1 14, 05]
+A881; [, F1 14, 05]
+A983; [, F1 14, 05]
+10A0F; [, F1 14, 05]
+11002; [, F1 14, 05]
+11082; [, F1 14, 05]
+11102; [, F1 14, 05]
+11182; [, F1 14, 05]
+11303; [, F1 14, 05]
+11445; [, F1 14, 05]
+114C1; [, F1 14, 05]
+115BE; [, F1 14, 05]
+1163E; [, F1 14, 05]
+116AC; [, F1 14, 05]
+11838; [, F1 14, 05]
+119DF; [, F1 14, 05]
+11A39; [, F1 14, 05]
+11A97; [, F1 14, 05]
+11C3E; [, F1 14, 05]
+11D41; [, F1 14, 05]
+11D96; [, F1 14, 05]
+09FE; [, F1 35, 05]
+111C9; [, F1 35, 05]
+1145E; [, F1 35, 05]
+0A70; [, F1 56, 05]
+0A71; [, F1 77, 05]
+1B03; [, F1 98, 05]
+A982; [, F1 B9, 05]
+1B81; [, F1 DA, 05]
+ABEC; [, F1 FB, 05]
+10A38; [, F2 1E, 05]
+10A39; [, F2 3F, 05]
+10A3A; [, F2 60, 05]
+111CB; [, F2 81, 05]
+111CC; [, F2 A2, 05]
+11A98; [, F2 C3, 05]
+0E4E; [, F2 E4, 05]
+0E47; [, F3 07, 05]
+0E48; [, F3 28, 05]
+0E49; [, F3 49, 05]
+0E4A; [, F3 6A, 05]
+0E4B; [, F3 8B, 05]
+0E4C; [, F3 AC, 05]
+0E4D; [, F3 CD, 05]
+0EC8; [, F3 EE, 05]
+0EC9; [, F4 11, 05]
+0ECA; [, F4 32, 05]
+0ECB; [, F4 53, 05]
+0ECC; [, F4 74, 05]
+0ECD; [, F4 95, 05]
+AABF; [, F4 B6, 05]
+AAC1; [, F4 D7, 05]
+0F39; [, F4 F8, 05]
+A92B; [, F5 1B, 05]
+A92C; [, F5 3C, 05]
+A92D; [, F5 5D, 05]
+1037; [, F5 7E, 05]
+17C8; [, F5 9F, 05]
+17C9; [, F5 C0, 05]
+17CA; [, F5 E1, 05]
+1A75; [, F6 04, 05]
+1A76; [, F6 25, 05]
+1A77; [, F6 46, 05]
+1A78; [, F6 67, 05]
+1A79; [, F6 88, 05]
+1A7A; [, F6 A9, 05]
+1A7B; [, F6 CA, 05]
+1A7C; [, F6 EB, 05]
+1939; [, F7 0E, 05]
+193A; [, F7 2F, 05]
+193B; [, F7 50, 05]
+16B30; [, F7 71, 05]
+1E131; [, F7 71, 05]
+16B31; [, F7 92, 05]
+1E136; [, F7 92, 05]
+16B32; [, F7 B3, 05]
+1E132; [, F7 B3, 05]
+16B33; [, F7 D4, 05]
+1E133; [, F7 D4, 05]
+16B34; [, F7 F5, 05]
+1E130; [, F7 F5, 05]
+16B35; [, F8 18, 05]
+1E134; [, F8 18, 05]
+16B36; [, F8 39, 05]
+1E135; [, F8 39, 05]
+1E2EC; [, F8 5A, 05]
+1E2ED; [, F8 7B, 05]
+1E2EE; [, F8 9C, 05]
+1E2EF; [, F8 BD, 05]
+302A; [, F8 DE, 05]
+302B; [, F8 FF, 05]
+302C; [, F9 22, 05]
+302D; [, F9 43, 05]
+302E; [, F9 64, 05]
+302F; [, F9 85, 05]
+20D0; [, F9 A6, 05]
+20D1; [, F9 C7, 05]
+20D2; [, F9 E8, 05]
+20D3; [, F9 E8, 05]
+20D4; [, FA 0B, 05]
+20D5; [, FA 2C, 05]
+20D6; [, FA 4D, 05]
+20D7; [, FA 6E, 05]
+20DB; [, FA 8F, 05]
+20DC; [, FA B0, 05]
+20E1; [, FA D1, 05]
+20E6; [, FA F2, 05]
+20E7; [, FB 15, 05]
+20E8; [, FB 36, 05]
+20E9; [, FB 57, 05]
+101FD; [, FB 78, 05]
+004C | 00B7; [, FB 99, 05]
+006C | 00B7; [, FB 99, 05]
+004C | 0387; [, FB 99, 05]
+006C | 0387; [, FB 99, 05]
FDD1 00A0; [03 02 02, 05, 05] # SPACE first primary starts new lead byte
@@ -2051,192 +2073,196 @@ FE10; [06, 05, 31]
2E4E; [07 0E, 05, 05]
-055D; [07 10, 05, 05]
+2E4F; [07 10, 05, 05]
-060C; [07 12, 05, 05]
+055D; [07 12, 05, 05]
-060D; [07 14, 05, 05]
+060C; [07 14, 05, 05]
-066B; [07 16, 05, 05]
+060D; [07 16, 05, 05]
-066C; [07 18, 05, 05]
+066B; [07 18, 05, 05]
-07F8; [07 1A, 05, 05]
+066C; [07 1A, 05, 05]
-1802; [07 1C, 05, 05]
+07F8; [07 1C, 05, 05]
-1808; [07 1E 02, 05, 05]
+1802; [07 1E, 05, 05]
-A4FE; [07 1E 09, 05, 05]
+1808; [07 20 02, 05, 05]
-A60D; [07 1E 10, 05, 05]
+A4FE; [07 20 09, 05, 05]
-A6F5; [07 1E 17, 05, 05]
+A60D; [07 20 10, 05, 05]
-16E97; [07 1E 1E, 05, 05]
+A6F5; [07 20 17, 05, 05]
-3001; [07 20, 05, 05]
-FE51; [07 20, 05, 10]
-FF64; [07 20, 05, 9E]
-FE11; [07 20, 05, 2C]
+16E97; [07 20 1E, 05, 05]
-FE45; [07 22, 05, 05]
+3001; [07 22, 05, 05]
+FE51; [07 22, 05, 10]
+FF64; [07 22, 05, 9E]
+FE11; [07 22, 05, 2C]
-FE46; [07 24, 05, 05]
+FE45; [07 24, 05, 05]
-003B; [07 26, 05, 05]
-037E; [07 26, 05, 05]
-FF1B; [07 26, 05, 10]
-FE54; [07 26, 05, 1E]
-FE14; [07 26, 05, 2C]
+FE46; [07 26, 05, 05]
-061B; [07 28, 05, 05]
+16FE2; [07 28, 05, 05]
-204F; [07 2A, 05, 05]
+003B; [07 2A, 05, 05]
+037E; [07 2A, 05, 05]
+FF1B; [07 2A, 05, 10]
+FE54; [07 2A, 05, 1E]
+FE14; [07 2A, 05, 2C]
-2E35; [07 2C, 05, 05]
+061B; [07 2C, 05, 05]
-A6F6; [07 2E, 05, 05]
+204F; [07 2E, 05, 05]
-2E49; [07 30, 05, 05]
+2E35; [07 30, 05, 05]
-003A; [07 32, 05, 05]
-FF1A; [07 32, 05, 10]
-FE55; [07 32, 05, 26]
-FE13; [07 32, 05, 31]
-2A74; [07 32, 05, 1B][07 32, 05, 1B][0C 82, 05, 18]
+A6F6; [07 32, 05, 05]
-0589; [07 34, 05, 05]
+2E49; [07 34, 05, 05]
-061E; [07 36, 05, 05]
+003A; [07 36, 05, 05]
+FF1A; [07 36, 05, 10]
+FE55; [07 36, 05, 26]
+FE13; [07 36, 05, 31]
+2A74; [07 36, 05, 1B][07 36, 05, 1B][0C 83, 05, 18]
-0703; [07 38 02, 05, 05]
+0589; [07 38, 05, 05]
-0704; [07 38 09, 05, 05]
+061E; [07 3A, 05, 05]
-0705; [07 38 10, 05, 05]
+0703; [07 3C 02, 05, 05]
-0706; [07 38 17, 05, 05]
+0704; [07 3C 09, 05, 05]
-0707; [07 38 1E, 05, 05]
+0705; [07 3C 10, 05, 05]
-0708; [07 38 25, 05, 05]
+0706; [07 3C 17, 05, 05]
-0830; [07 38 2C, 05, 05]
+0707; [07 3C 1E, 05, 05]
-0831; [07 38 33, 05, 05]
+0708; [07 3C 25, 05, 05]
-0832; [07 38 3A, 05, 05]
+0830; [07 3C 2C, 05, 05]
-0833; [07 38 41, 05, 05]
+0831; [07 3C 33, 05, 05]
-0834; [07 38 48, 05, 05]
+0832; [07 3C 3A, 05, 05]
-0835; [07 38 4F, 05, 05]
+0833; [07 3C 41, 05, 05]
-0836; [07 38 56, 05, 05]
+0834; [07 3C 48, 05, 05]
-0837; [07 38 5D, 05, 05]
+0835; [07 3C 4F, 05, 05]
-0838; [07 38 64, 05, 05]
+0836; [07 3C 56, 05, 05]
-0839; [07 38 6B, 05, 05]
+0837; [07 3C 5D, 05, 05]
-083A; [07 38 72, 05, 05]
+0838; [07 3C 64, 05, 05]
-083B; [07 38 79, 05, 05]
+0839; [07 3C 6B, 05, 05]
-083C; [07 38 80, 05, 05]
+083A; [07 3C 72, 05, 05]
-083D; [07 38 87, 05, 05]
+083B; [07 3C 79, 05, 05]
-083E; [07 38 8E, 05, 05]
+083C; [07 3C 80, 05, 05]
-1361; [07 3A, 05, 05]
+083D; [07 3C 87, 05, 05]
-1363; [07 3C, 05, 05]
+083E; [07 3C 8E, 05, 05]
-1364; [07 3E, 05, 05]
+1361; [07 3E, 05, 05]
-1365; [07 40, 05, 05]
+1363; [07 40, 05, 05]
-1366; [07 42, 05, 05]
+1364; [07 42, 05, 05]
-1804; [07 44, 05, 05]
+1365; [07 44, 05, 05]
-1805; [07 46, 05, 05]
+1366; [07 46, 05, 05]
-0F14; [07 48, 05, 05]
+1804; [07 48, 05, 05]
-17D6; [07 4A, 05, 05]
+1805; [07 4A, 05, 05]
-1B5D; [07 4C 02, 05, 05]
+0F14; [07 4C, 05, 05]
-A9C7; [07 4C 09, 05, 05]
+17D6; [07 4E, 05, 05]
-16EB; [07 4E, 05, 05]
+1B5D; [07 50 02, 05, 05]
-16EC; [07 50, 05, 05]
+A9C7; [07 50 09, 05, 05]
-16ED; [07 52, 05, 05]
+16EB; [07 52, 05, 05]
-A6F4; [07 54, 05, 05]
+16EC; [07 54, 05, 05]
-0021; [07 56, 05, 05]
-FF01; [07 56, 05, 10]
-FE57; [07 56, 05, 20]
-FE15; [07 56, 05, 28]
-203C; [07 56, 05, 18][07 56, 05, 18]
-2049; [07 56, 05, 18][07 5E, 05, 1B]
+16ED; [07 56, 05, 05]
-00A1; [07 58, 05, 05]
+A6F4; [07 58, 05, 05]
-055C; [07 5A, 05, 05]
+0021; [07 5A, 05, 05]
+FF01; [07 5A, 05, 10]
+FE57; [07 5A, 05, 20]
+FE15; [07 5A, 05, 28]
+203C; [07 5A, 05, 18][07 5A, 05, 18]
+2049; [07 5A, 05, 18][07 62, 05, 1B]
-07F9; [07 5C 02, 05, 05]
+00A1; [07 5C, 05, 05]
-1944; [07 5C 09, 05, 05]
+055C; [07 5E, 05, 05]
-1E95E; [07 5C 10, 05, 05]
+07F9; [07 60 02, 05, 05]
-003F; [07 5E, 05, 05]
-FF1F; [07 5E, 05, 10]
-FE56; [07 5E, 05, 26]
-FE16; [07 5E, 05, 31]
-2048; [07 5E, 05, 1B][07 56, 05, 18]
-2047; [07 5E, 05, 1B][07 5E, 05, 1B]
+1944; [07 60 09, 05, 05]
-00BF; [07 60, 05, 05]
+1E95E; [07 60 10, 05, 05]
-2E2E; [07 62, 05, 05]
+003F; [07 62, 05, 05]
+FF1F; [07 62, 05, 10]
+FE56; [07 62, 05, 26]
+FE16; [07 62, 05, 31]
+2048; [07 62, 05, 1B][07 5A, 05, 18]
+2047; [07 62, 05, 1B][07 62, 05, 1B]
-055E; [07 64, 05, 05]
+00BF; [07 64, 05, 05]
-061F; [07 66, 05, 05]
+2E2E; [07 66, 05, 05]
-0709; [07 68, 05, 05]
+055E; [07 68, 05, 05]
-1367; [07 6A, 05, 05]
+061F; [07 6A, 05, 05]
-1945; [07 6C 02, 05, 05]
+0709; [07 6C, 05, 05]
-2CFA; [07 6C 09, 05, 05]
+1367; [07 6E, 05, 05]
-2CFB; [07 6C 10, 05, 05]
+1945; [07 70 02, 05, 05]
-A60F; [07 6C 17, 05, 05]
+2CFA; [07 70 09, 05, 05]
-A6F7; [07 6C 1E, 05, 05]
+2CFB; [07 70 10, 05, 05]
-AAF1; [07 6C 25, 05, 05]
+A60F; [07 70 17, 05, 05]
-11143; [07 6C 2C, 05, 05]
+A6F7; [07 70 1E, 05, 05]
-1E95F; [07 6C 33, 05, 05]
+AAF1; [07 70 25, 05, 05]
-203D; [07 6E, 05, 05]
+11143; [07 70 2C, 05, 05]
-2E18; [07 70, 05, 05]
+1E95F; [07 70 33, 05, 05]
+
+203D; [07 72, 05, 05]
+
+2E18; [07 74, 05, 05]
002E; [08, 05, 05]
FF0E; [08, 05, 10]
@@ -3241,344 +3267,348 @@ A8FC; [0B 22, 05, 05]
0AF0; [0B 28, 05, 05]
-0C84; [0B 2A, 05, 05]
+0C77; [0B 2A, 05, 05]
+
+0C84; [0B 2C, 05, 05]
+
+0DF4; [0B 2E, 05, 05]
-0DF4; [0B 2C, 05, 05]
+0E4F; [0B 30, 05, 05]
-0E4F; [0B 2E, 05, 05]
+0E5A; [0B 32, 05, 05]
-0E5A; [0B 30, 05, 05]
+0E5B; [0B 34, 05, 05]
-0E5B; [0B 32, 05, 05]
+AADE; [0B 36 02, 05, 05]
-AADE; [0B 34 02, 05, 05]
+AADF; [0B 36 09, 05, 05]
-AADF; [0B 34 09, 05, 05]
+0F04; [0B 38, 05, 05]
-0F04; [0B 36, 05, 05]
+0F05; [0B 3A, 05, 05]
-0F05; [0B 38, 05, 05]
+0F06; [0B 3C, 05, 05]
-0F06; [0B 3A, 05, 05]
+0F07; [0B 3E, 05, 05]
-0F07; [0B 3C, 05, 05]
+0F08; [0B 40, 05, 05]
-0F08; [0B 3E, 05, 05]
+0F09; [0B 42, 05, 05]
-0F09; [0B 40, 05, 05]
+0F0A; [0B 44, 05, 05]
-0F0A; [0B 42, 05, 05]
+0FD0; [0B 46, 05, 05]
-0FD0; [0B 44, 05, 05]
+0FD1; [0B 48, 05, 05]
-0FD1; [0B 46, 05, 05]
+0F0B; [0B 4A, 05, 05]
+0F0C; [0B 4A, 05, 20]
-0F0B; [0B 48, 05, 05]
-0F0C; [0B 48, 05, 20]
+0F0D; [0B 4C, 05, 05]
-0F0D; [0B 4A, 05, 05]
+0F0E; [0B 4E, 05, 05]
-0F0E; [0B 4C, 05, 05]
+0F0F; [0B 50, 05, 05]
-0F0F; [0B 4E, 05, 05]
+0F10; [0B 52, 05, 05]
-0F10; [0B 50, 05, 05]
+0F11; [0B 54, 05, 05]
-0F11; [0B 52, 05, 05]
+0F12; [0B 56, 05, 05]
-0F12; [0B 54, 05, 05]
+0F85; [0B 58, 05, 05]
-0F85; [0B 56, 05, 05]
+0FD2; [0B 5A, 05, 05]
-0FD2; [0B 58, 05, 05]
+0FD3; [0B 5C, 05, 05]
-0FD3; [0B 5A, 05, 05]
+0FD4; [0B 5E, 05, 05]
-0FD4; [0B 5C, 05, 05]
+0FD9; [0B 60, 05, 05]
-0FD9; [0B 5E, 05, 05]
+0FDA; [0B 62, 05, 05]
-0FDA; [0B 60, 05, 05]
+11A3F; [0B 64 02, 05, 05]
-11A3F; [0B 62 02, 05, 05]
+11A40; [0B 64 09, 05, 05]
-11A40; [0B 62 09, 05, 05]
+11A41; [0B 64 10, 05, 05]
-11A41; [0B 62 10, 05, 05]
+11A42; [0B 64 17, 05, 05]
-11A42; [0B 62 17, 05, 05]
+11A43; [0B 64 1E, 05, 05]
-11A43; [0B 62 1E, 05, 05]
+11A44; [0B 64 25, 05, 05]
-11A44; [0B 62 25, 05, 05]
+11A45; [0B 64 2C, 05, 05]
-11A45; [0B 62 2C, 05, 05]
+11A46; [0B 64 33, 05, 05]
-11A46; [0B 62 33, 05, 05]
+11A9A; [0B 64 3A, 05, 05]
-11A9A; [0B 62 3A, 05, 05]
+11A9B; [0B 64 41, 05, 05]
-11A9B; [0B 62 41, 05, 05]
+11A9C; [0B 64 48, 05, 05]
-11A9C; [0B 62 48, 05, 05]
+11A9E; [0B 64 4F, 05, 05]
-11A9E; [0B 62 4F, 05, 05]
+11A9F; [0B 64 56, 05, 05]
-11A9F; [0B 62 56, 05, 05]
+11AA0; [0B 64 5D, 05, 05]
-11AA0; [0B 62 5D, 05, 05]
+11AA1; [0B 64 64, 05, 05]
-11AA1; [0B 62 64, 05, 05]
+11AA2; [0B 64 6B, 05, 05]
-11AA2; [0B 62 6B, 05, 05]
+11C70; [0B 64 72, 05, 05]
-11C70; [0B 62 72, 05, 05]
+11C71; [0B 64 79, 05, 05]
-11C71; [0B 62 79, 05, 05]
+1C3D; [0B 64 80, 05, 05]
-1C3D; [0B 62 80, 05, 05]
+1C3E; [0B 64 87, 05, 05]
-1C3E; [0B 62 87, 05, 05]
+1C3F; [0B 64 8E, 05, 05]
-1C3F; [0B 62 8E, 05, 05]
+104C; [0B 66, 05, 05]
-104C; [0B 64, 05, 05]
+104D; [0B 68, 05, 05]
-104D; [0B 66, 05, 05]
+104E; [0B 6A, 05, 05]
-104E; [0B 68, 05, 05]
+104F; [0B 6C, 05, 05]
-104F; [0B 6A, 05, 05]
+17D8; [0B 6E, 05, 05]
-17D8; [0B 6C, 05, 05]
+17D9; [0B 70, 05, 05]
-17D9; [0B 6E, 05, 05]
+17DA; [0B 72, 05, 05]
-17DA; [0B 70, 05, 05]
+1AA0; [0B 74 02, 05, 05]
-1AA0; [0B 72 02, 05, 05]
+1AA1; [0B 74 09, 05, 05]
-1AA1; [0B 72 09, 05, 05]
+1AA2; [0B 74 10, 05, 05]
-1AA2; [0B 72 10, 05, 05]
+1AA3; [0B 74 17, 05, 05]
-1AA3; [0B 72 17, 05, 05]
+1AA4; [0B 74 1E, 05, 05]
-1AA4; [0B 72 1E, 05, 05]
+1AA5; [0B 74 25, 05, 05]
-1AA5; [0B 72 25, 05, 05]
+1AA6; [0B 74 2C, 05, 05]
-1AA6; [0B 72 2C, 05, 05]
+1AAC; [0B 74 33, 05, 05]
-1AAC; [0B 72 33, 05, 05]
+1AAD; [0B 74 3A, 05, 05]
-1AAD; [0B 72 3A, 05, 05]
+1CC0; [0B 74 41, 05, 05]
-166D; [0B 72 41, 05, 05]
+1CC1; [0B 74 48, 05, 05]
-1CC0; [0B 72 48, 05, 05]
+1CC2; [0B 74 4F, 05, 05]
-1CC1; [0B 72 4F, 05, 05]
+1CC3; [0B 74 56, 05, 05]
-1CC2; [0B 72 56, 05, 05]
+1CC4; [0B 74 5D, 05, 05]
-1CC3; [0B 72 5D, 05, 05]
+1CC5; [0B 74 64, 05, 05]
-1CC4; [0B 72 64, 05, 05]
+1CC6; [0B 74 6B, 05, 05]
-1CC5; [0B 72 6B, 05, 05]
+1CC7; [0B 74 72, 05, 05]
-1CC6; [0B 72 72, 05, 05]
+2D70; [0B 74 79, 05, 05]
-1CC7; [0B 72 79, 05, 05]
+A874; [0B 74 80, 05, 05]
-2D70; [0B 72 80, 05, 05]
+A875; [0B 74 87, 05, 05]
-A874; [0B 72 87, 05, 05]
+1BFC; [0B 74 8E, 05, 05]
-A875; [0B 72 8E, 05, 05]
+1BFD; [0B 74 95, 05, 05]
-1BFC; [0B 72 95, 05, 05]
+1BFE; [0B 74 9C, 05, 05]
-1BFD; [0B 72 9C, 05, 05]
+1BFF; [0B 74 A3, 05, 05]
-1BFE; [0B 72 A3, 05, 05]
+A92E; [0B 76, 05, 05]
-1BFF; [0B 72 AA, 05, 05]
+A9DE; [0B 78 02, 05, 05]
-A92E; [0B 74, 05, 05]
+A9DF; [0B 78 09, 05, 05]
-A9DE; [0B 76 02, 05, 05]
+AA5C; [0B 78 10, 05, 05]
-A9DF; [0B 76 09, 05, 05]
+1056F; [0B 78 17, 05, 05]
-AA5C; [0B 76 10, 05, 05]
+11049; [0B 78 1E, 05, 05]
-1056F; [0B 76 17, 05, 05]
+1104A; [0B 78 25, 05, 05]
-11049; [0B 76 1E, 05, 05]
+1104B; [0B 78 2C, 05, 05]
-1104A; [0B 76 25, 05, 05]
+1104C; [0B 78 33, 05, 05]
-1104B; [0B 76 2C, 05, 05]
+1104D; [0B 78 3A, 05, 05]
-1104C; [0B 76 33, 05, 05]
+10A50; [0B 78 41, 05, 05]
-1104D; [0B 76 3A, 05, 05]
+10A51; [0B 78 48, 05, 05]
-10A50; [0B 76 41, 05, 05]
+10A52; [0B 78 4F, 05, 05]
-10A51; [0B 76 48, 05, 05]
+10A53; [0B 78 56, 05, 05]
-10A52; [0B 76 4F, 05, 05]
+10A54; [0B 78 5D, 05, 05]
-10A53; [0B 76 56, 05, 05]
+10A55; [0B 78 64, 05, 05]
-10A54; [0B 76 5D, 05, 05]
+10A58; [0B 78 6B, 05, 05]
-10A55; [0B 76 64, 05, 05]
+11C43; [0B 78 72, 05, 05]
-10A58; [0B 76 6B, 05, 05]
+11C44; [0B 78 79, 05, 05]
-11C43; [0B 76 72, 05, 05]
+11C45; [0B 78 80, 05, 05]
-11C44; [0B 76 79, 05, 05]
+10B39; [0B 78 87, 05, 05]
-11C45; [0B 76 80, 05, 05]
+10AF0; [0B 78 8E, 05, 05]
-10B39; [0B 76 87, 05, 05]
+10AF1; [0B 78 95, 05, 05]
-10AF0; [0B 76 8E, 05, 05]
+10AF2; [0B 78 9C, 05, 05]
-10AF1; [0B 76 95, 05, 05]
+10AF3; [0B 78 A3, 05, 05]
-10AF2; [0B 76 9C, 05, 05]
+10AF4; [0B 78 AA, 05, 05]
-10AF3; [0B 76 A3, 05, 05]
+10AF5; [0B 78 B1, 05, 05]
-10AF4; [0B 76 AA, 05, 05]
+10AF6; [0B 78 B8, 05, 05]
-10AF5; [0B 76 B1, 05, 05]
+10B99; [0B 78 BF, 05, 05]
-10AF6; [0B 76 B8, 05, 05]
+10B9A; [0B 78 C6, 05, 05]
-10B99; [0B 76 BF, 05, 05]
+10B9B; [0B 78 CD, 05, 05]
-10B9A; [0B 76 C6, 05, 05]
+10B9C; [0B 78 D4, 05, 05]
-10B9B; [0B 76 CD, 05, 05]
+110BB; [0B 78 DB, 05, 05]
-10B9C; [0B 76 D4, 05, 05]
+110BC; [0B 78 E2, 05, 05]
-110BB; [0B 76 DB, 05, 05]
+11174; [0B 78 E9, 05, 05]
-110BC; [0B 76 E2, 05, 05]
+11175; [0B 78 F0, 05, 05]
-11174; [0B 76 E9, 05, 05]
+111CD; [0B 78 F7, 05, 05]
-11175; [0B 76 F0, 05, 05]
+111C7; [0B 78 FE, 05, 05]
-111CD; [0B 76 F7, 05, 05]
+111DB; [0B 79 07, 05, 05]
-111C7; [0B 76 FE, 05, 05]
+111DD; [0B 79 0E, 05, 05]
-111DB; [0B 77 07, 05, 05]
+1123A; [0B 79 15, 05, 05]
-111DD; [0B 77 0E, 05, 05]
+1123B; [0B 79 1C, 05, 05]
-1123A; [0B 77 15, 05, 05]
+1123C; [0B 79 23, 05, 05]
-1123B; [0B 77 1C, 05, 05]
+1123D; [0B 79 2A, 05, 05]
-1123C; [0B 77 23, 05, 05]
+1144D; [0B 79 31, 05, 05]
-1123D; [0B 77 2A, 05, 05]
+1144E; [0B 79 38, 05, 05]
-1144D; [0B 77 31, 05, 05]
+1144F; [0B 79 3F, 05, 05]
-1144E; [0B 77 38, 05, 05]
+1145B; [0B 79 46, 05, 05]
-1144F; [0B 77 3F, 05, 05]
+1145D; [0B 79 4D, 05, 05]
-1145B; [0B 77 46, 05, 05]
+114C6; [0B 79 54, 05, 05]
-1145D; [0B 77 4D, 05, 05]
+115C1; [0B 79 5B, 05, 05]
-114C6; [0B 77 54, 05, 05]
+115C4; [0B 79 62, 05, 05]
-115C1; [0B 77 5B, 05, 05]
+115C5; [0B 79 69, 05, 05]
-115C4; [0B 77 62, 05, 05]
+115C6; [0B 79 70, 05, 05]
-115C5; [0B 77 69, 05, 05]
+115C7; [0B 79 77, 05, 05]
-115C6; [0B 77 70, 05, 05]
+115C8; [0B 79 7E, 05, 05]
-115C7; [0B 77 77, 05, 05]
+115C9; [0B 79 85, 05, 05]
-115C8; [0B 77 7E, 05, 05]
+115CA; [0B 79 8C, 05, 05]
-115C9; [0B 77 85, 05, 05]
+115CB; [0B 79 93, 05, 05]
-115CA; [0B 77 8C, 05, 05]
+115CC; [0B 79 9A, 05, 05]
-115CB; [0B 77 93, 05, 05]
+115CD; [0B 79 A1, 05, 05]
-115CC; [0B 77 9A, 05, 05]
+115CE; [0B 79 A8, 05, 05]
-115CD; [0B 77 A1, 05, 05]
+115CF; [0B 79 AF, 05, 05]
-115CE; [0B 77 A8, 05, 05]
+115D0; [0B 79 B6, 05, 05]
-115CF; [0B 77 AF, 05, 05]
+115D1; [0B 79 BD, 05, 05]
-115D0; [0B 77 B6, 05, 05]
+115D2; [0B 79 C4, 05, 05]
-115D1; [0B 77 BD, 05, 05]
+115D3; [0B 79 CB, 05, 05]
-115D2; [0B 77 C4, 05, 05]
+115D4; [0B 79 D2, 05, 05]
-115D3; [0B 77 CB, 05, 05]
+115D5; [0B 79 D9, 05, 05]
-115D4; [0B 77 D2, 05, 05]
+115D6; [0B 79 E0, 05, 05]
-115D5; [0B 77 D9, 05, 05]
+115D7; [0B 79 E7, 05, 05]
-115D6; [0B 77 E0, 05, 05]
+11643; [0B 79 EE, 05, 05]
-115D7; [0B 77 E7, 05, 05]
+1183B; [0B 79 F5, 05, 05]
-11643; [0B 77 EE, 05, 05]
+119E2; [0B 79 FC, 05, 05]
-1183B; [0B 77 F5, 05, 05]
+11FFF; [0B 7B, 05, 05]
-16B37; [0B 77 FC, 05, 05]
+16B37; [0B 7D 02, 05, 05]
-16B38; [0B 78 05, 05, 05]
+16B38; [0B 7D 09, 05, 05]
-16B39; [0B 78 0C, 05, 05]
+16B39; [0B 7D 10, 05, 05]
-16B3A; [0B 78 13, 05, 05]
+16B3A; [0B 7D 17, 05, 05]
-16B3B; [0B 78 1A, 05, 05]
+16B3B; [0B 7D 1E, 05, 05]
-16B44; [0B 78 21, 05, 05]
+16B44; [0B 7D 25, 05, 05]
-16E99; [0B 78 28, 05, 05]
+16E99; [0B 7D 2C, 05, 05]
-16E9A; [0B 78 2F, 05, 05]
+16E9A; [0B 7D 33, 05, 05]
-1DA87; [0B 78 36, 05, 05]
+1DA87; [0B 7D 3A, 05, 05]
-1DA88; [0B 78 3D, 05, 05]
+1DA88; [0B 7D 41, 05, 05]
-1DA89; [0B 78 44, 05, 05]
+1DA89; [0B 7D 48, 05, 05]
-1DA8A; [0B 78 4B, 05, 05]
+1DA8A; [0B 7D 4F, 05, 05]
-1DA8B; [0B 78 52, 05, 05]
+1DA8B; [0B 7D 56, 05, 05]
-10A7F; [0B 78 59, 05, 05]
+10A7F; [0B 7D 5D, 05, 05]
FDD1 263A; [0C 02 02, 05, 05] # SYMBOL first primary starts new lead byte
@@ -3910,11683 +3940,12049 @@ FBC1; [0C 55 B8, 05, 05]
0BFA; [0C 55 FE, 05, 05]
-0C7F; [0C 56 07, 05, 05]
+11FD5; [0C 56 07, 05, 05]
+
+11FD6; [0C 56 0E, 05, 05]
+
+11FD7; [0C 56 15, 05, 05]
+
+11FD8; [0C 56 1C, 05, 05]
+
+11FD9; [0C 56 23, 05, 05]
+
+11FDA; [0C 56 2A, 05, 05]
+
+11FDB; [0C 56 31, 05, 05]
+
+11FDC; [0C 56 38, 05, 05]
+
+11FE1; [0C 56 3F, 05, 05]
+
+11FE2; [0C 56 46, 05, 05]
+
+11FE3; [0C 56 4D, 05, 05]
+
+11FE4; [0C 56 54, 05, 05]
+
+11FE5; [0C 56 5B, 05, 05]
+
+11FE6; [0C 56 62, 05, 05]
+
+11FE7; [0C 56 69, 05, 05]
+
+11FE8; [0C 56 70, 05, 05]
+
+11FE9; [0C 56 77, 05, 05]
+
+11FEA; [0C 56 7E, 05, 05]
+
+11FEB; [0C 56 85, 05, 05]
+
+11FEC; [0C 56 8C, 05, 05]
+
+11FED; [0C 56 93, 05, 05]
+
+11FEE; [0C 56 9A, 05, 05]
+
+11FEF; [0C 56 A1, 05, 05]
+
+11FF0; [0C 56 A8, 05, 05]
+
+11FF1; [0C 56 AF, 05, 05]
+
+0C7F; [0C 56 B6, 05, 05]
+
+0D4F; [0C 56 BD, 05, 05]
+
+0D79; [0C 56 C4, 05, 05]
+
+A828; [0C 56 CB, 05, 05]
+
+A829; [0C 56 D2, 05, 05]
+
+A82A; [0C 56 D9, 05, 05]
+
+A82B; [0C 56 E0, 05, 05]
+
+A836; [0C 56 E7, 05, 05]
+
+A837; [0C 56 EE, 05, 05]
+
+A839; [0C 56 F5, 05, 05]
+
+0F01; [0C 56 FC, 05, 05]
+
+0F02; [0C 57 05, 05, 05]
+
+0F03; [0C 57 0C, 05, 05]
+
+0F13; [0C 57 13, 05, 05]
+
+0F15; [0C 57 1A, 05, 05]
+
+0F16; [0C 57 21, 05, 05]
+
+0F17; [0C 57 28, 05, 05]
+
+0F1A; [0C 57 2F, 05, 05]
+
+0F1B; [0C 57 36, 05, 05]
+
+0F1C; [0C 57 3D, 05, 05]
+
+0F1D; [0C 57 44, 05, 05]
+
+0F1E; [0C 57 4B, 05, 05]
+
+0F1F; [0C 57 52, 05, 05]
+
+0F34; [0C 57 59, 05, 05]
+
+0F36; [0C 57 60, 05, 05]
+
+0F38; [0C 57 67, 05, 05]
+
+0FBE; [0C 57 6E, 05, 05]
+
+0FBF; [0C 57 75, 05, 05]
+
+0FC0; [0C 57 7C, 05, 05]
+
+0FC1; [0C 57 83, 05, 05]
+
+0FC2; [0C 57 8A, 05, 05]
+
+0FC3; [0C 57 91, 05, 05]
+
+0FC4; [0C 57 98, 05, 05]
+
+0FC5; [0C 57 9F, 05, 05]
+
+0FC7; [0C 57 A6, 05, 05]
+
+0FC8; [0C 57 AD, 05, 05]
+
+0FC9; [0C 57 B4, 05, 05]
+
+0FCA; [0C 57 BB, 05, 05]
+
+0FCB; [0C 57 C2, 05, 05]
+
+0FCC; [0C 57 C9, 05, 05]
+
+0FCE; [0C 57 D0, 05, 05]
+
+0FCF; [0C 57 D7, 05, 05]
+
+0FD5; [0C 57 DE, 05, 05]
+
+0FD6; [0C 57 E5, 05, 05]
+
+0FD7; [0C 57 EC, 05, 05]
+
+0FD8; [0C 57 F3, 05, 05]
+
+166D; [0C 57 FA, 05, 05]
+
+1940; [0C 58 03, 05, 05]
+
+109E; [0C 58 0A, 05, 05]
+
+109F; [0C 58 11, 05, 05]
+
+AA77; [0C 58 18, 05, 05]
+
+AA78; [0C 58 1F, 05, 05]
+
+AA79; [0C 58 26, 05, 05]
+
+1173F; [0C 58 2D, 05, 05]
+
+19E0; [0C 58 34, 05, 05]
+
+19E1; [0C 58 3B, 05, 05]
+
+19E2; [0C 58 42, 05, 05]
+
+19E3; [0C 58 49, 05, 05]
+
+19E4; [0C 58 50, 05, 05]
+
+19E5; [0C 58 57, 05, 05]
+
+19E6; [0C 58 5E, 05, 05]
+
+19E7; [0C 58 65, 05, 05]
+
+19E8; [0C 58 6C, 05, 05]
+
+19E9; [0C 58 73, 05, 05]
+
+19EA; [0C 58 7A, 05, 05]
+
+19EB; [0C 58 81, 05, 05]
+
+19EC; [0C 58 88, 05, 05]
+
+19ED; [0C 58 8F, 05, 05]
+
+19EE; [0C 58 96, 05, 05]
+
+19EF; [0C 58 9D, 05, 05]
+
+19F0; [0C 58 A4, 05, 05]
+
+19F1; [0C 58 AB, 05, 05]
+
+19F2; [0C 58 B2, 05, 05]
+
+19F3; [0C 58 B9, 05, 05]
+
+19F4; [0C 58 C0, 05, 05]
+
+19F5; [0C 58 C7, 05, 05]
+
+19F6; [0C 58 CE, 05, 05]
+
+19F7; [0C 58 D5, 05, 05]
+
+19F8; [0C 58 DC, 05, 05]
+
+19F9; [0C 58 E3, 05, 05]
+
+19FA; [0C 58 EA, 05, 05]
+
+19FB; [0C 58 F1, 05, 05]
+
+19FC; [0C 58 F8, 05, 05]
+
+19FD; [0C 58 FF, 05, 05]
+
+19FE; [0C 59 08, 05, 05]
+
+19FF; [0C 59 0F, 05, 05]
+
+1B61; [0C 59 16, 05, 05]
-0D4F; [0C 56 0E, 05, 05]
+1B62; [0C 59 1D, 05, 05]
-0D79; [0C 56 15, 05, 05]
+1B63; [0C 59 24, 05, 05]
-A828; [0C 56 1C, 05, 05]
+1B64; [0C 59 2B, 05, 05]
-A829; [0C 56 23, 05, 05]
+1B65; [0C 59 32, 05, 05]
-A82A; [0C 56 2A, 05, 05]
+1B66; [0C 59 39, 05, 05]
-A82B; [0C 56 31, 05, 05]
+1B67; [0C 59 40, 05, 05]
-A836; [0C 56 38, 05, 05]
+1B68; [0C 59 47, 05, 05]
-A837; [0C 56 3F, 05, 05]
+1B69; [0C 59 4E, 05, 05]
-A839; [0C 56 46, 05, 05]
+1B6A; [0C 59 55, 05, 05]
-0F01; [0C 56 4D, 05, 05]
+1B74; [0C 59 5C, 05, 05]
-0F02; [0C 56 54, 05, 05]
+1B75; [0C 59 63, 05, 05]
-0F03; [0C 56 5B, 05, 05]
+1B76; [0C 59 6A, 05, 05]
-0F13; [0C 56 62, 05, 05]
+1B77; [0C 59 71, 05, 05]
-0F15; [0C 56 69, 05, 05]
+1B78; [0C 59 78, 05, 05]
-0F16; [0C 56 70, 05, 05]
+1B79; [0C 59 7F, 05, 05]
-0F17; [0C 56 77, 05, 05]
+1B7A; [0C 59 86, 05, 05]
-0F1A; [0C 56 7E, 05, 05]
+1B7B; [0C 59 8D, 05, 05]
-0F1B; [0C 56 85, 05, 05]
+1B7C; [0C 59 94, 05, 05]
-0F1C; [0C 56 8C, 05, 05]
+00A9; [0C 5B, 05, 05]
-0F1D; [0C 56 93, 05, 05]
+1F12F; [0C 5D, 05, 05]
-0F1E; [0C 56 9A, 05, 05]
+00AE; [0C 5F, 05, 05]
-0F1F; [0C 56 A1, 05, 05]
+2104; [0C 61 02, 05, 05]
-0F34; [0C 56 A8, 05, 05]
+2108; [0C 61 09, 05, 05]
-0F36; [0C 56 AF, 05, 05]
+2114; [0C 61 10, 05, 05]
-0F38; [0C 56 B6, 05, 05]
+2117; [0C 61 17, 05, 05]
-0FBE; [0C 56 BD, 05, 05]
+2118; [0C 61 1E, 05, 05]
-0FBF; [0C 56 C4, 05, 05]
+211E; [0C 61 25, 05, 05]
-0FC0; [0C 56 CB, 05, 05]
+211F; [0C 61 2C, 05, 05]
-0FC1; [0C 56 D2, 05, 05]
+2123; [0C 61 33, 05, 05]
-0FC2; [0C 56 D9, 05, 05]
+2125; [0C 61 3A, 05, 05]
-0FC3; [0C 56 E0, 05, 05]
+2127; [0C 61 41, 05, 05]
-0FC4; [0C 56 E7, 05, 05]
+2129; [0C 61 48, 05, 05]
-0FC5; [0C 56 EE, 05, 05]
+212E; [0C 61 4F, 05, 05]
-0FC7; [0C 56 F5, 05, 05]
+213A; [0C 61 56, 05, 05]
-0FC8; [0C 56 FC, 05, 05]
+2141; [0C 61 5D, 05, 05]
-0FC9; [0C 57 05, 05, 05]
+2142; [0C 61 64, 05, 05]
-0FCA; [0C 57 0C, 05, 05]
+2143; [0C 61 6B, 05, 05]
-0FCB; [0C 57 13, 05, 05]
+2144; [0C 61 72, 05, 05]
-0FCC; [0C 57 1A, 05, 05]
+214A; [0C 61 79, 05, 05]
-0FCE; [0C 57 21, 05, 05]
+214C; [0C 61 80, 05, 05]
-0FCF; [0C 57 28, 05, 05]
+214F; [0C 61 87, 05, 05]
-0FD5; [0C 57 2F, 05, 05]
+218A; [0C 61 8E, 05, 05]
-0FD6; [0C 57 36, 05, 05]
+218B; [0C 61 95, 05, 05]
-0FD7; [0C 57 3D, 05, 05]
+2190; [0C 63, 05, 05]
+FFE9; [0C 63, 05, A0]
+219A; [0C 63, 05, 05][, 9E, 05]
-0FD8; [0C 57 44, 05, 05]
+2192; [0C 65, 05, 05]
+FFEB; [0C 65, 05, A0]
+219B; [0C 65, 05, 05][, 9E, 05]
-1940; [0C 57 4B, 05, 05]
+2191; [0C 67, 05, 05]
+FFEA; [0C 67, 05, A0]
-109E; [0C 57 52, 05, 05]
+2193; [0C 69, 05, 05]
+FFEC; [0C 69, 05, A0]
-109F; [0C 57 59, 05, 05]
+2194; [0C 6B 02, 05, 05]
+21AE; [0C 6B 02, 05, 05][, 9E, 05]
-AA77; [0C 57 60, 05, 05]
+2195; [0C 6B 09, 05, 05]
-AA78; [0C 57 67, 05, 05]
+2196; [0C 6B 10, 05, 05]
-AA79; [0C 57 6E, 05, 05]
+2197; [0C 6B 17, 05, 05]
-1173F; [0C 57 75, 05, 05]
+2198; [0C 6B 1E, 05, 05]
-19E0; [0C 57 7C, 05, 05]
+2199; [0C 6B 25, 05, 05]
-19E1; [0C 57 83, 05, 05]
+219C; [0C 6B 2C, 05, 05]
-19E2; [0C 57 8A, 05, 05]
+219D; [0C 6B 33, 05, 05]
-19E3; [0C 57 91, 05, 05]
+219E; [0C 6B 3A, 05, 05]
-19E4; [0C 57 98, 05, 05]
+219F; [0C 6B 41, 05, 05]
-19E5; [0C 57 9F, 05, 05]
+21A0; [0C 6B 48, 05, 05]
-19E6; [0C 57 A6, 05, 05]
+21A1; [0C 6B 4F, 05, 05]
-19E7; [0C 57 AD, 05, 05]
+21A2; [0C 6B 56, 05, 05]
-19E8; [0C 57 B4, 05, 05]
+21A3; [0C 6B 5D, 05, 05]
-19E9; [0C 57 BB, 05, 05]
+21A4; [0C 6B 64, 05, 05]
-19EA; [0C 57 C2, 05, 05]
+21A5; [0C 6B 6B, 05, 05]
-19EB; [0C 57 C9, 05, 05]
+21A6; [0C 6B 72, 05, 05]
-19EC; [0C 57 D0, 05, 05]
+21A7; [0C 6B 79, 05, 05]
-19ED; [0C 57 D7, 05, 05]
+21A8; [0C 6B 80, 05, 05]
-19EE; [0C 57 DE, 05, 05]
+21A9; [0C 6B 87, 05, 05]
-19EF; [0C 57 E5, 05, 05]
+21AA; [0C 6B 8E, 05, 05]
-19F0; [0C 57 EC, 05, 05]
+21AB; [0C 6B 95, 05, 05]
-19F1; [0C 57 F3, 05, 05]
+21AC; [0C 6B 9C, 05, 05]
-19F2; [0C 57 FA, 05, 05]
+21AD; [0C 6B A3, 05, 05]
-19F3; [0C 58 03, 05, 05]
+21AF; [0C 6B AA, 05, 05]
-19F4; [0C 58 0A, 05, 05]
+21B0; [0C 6B B1, 05, 05]
-19F5; [0C 58 11, 05, 05]
+21B1; [0C 6B B8, 05, 05]
-19F6; [0C 58 18, 05, 05]
+21B2; [0C 6B BF, 05, 05]
-19F7; [0C 58 1F, 05, 05]
+21B3; [0C 6B C6, 05, 05]
-19F8; [0C 58 26, 05, 05]
+21B4; [0C 6B CD, 05, 05]
-19F9; [0C 58 2D, 05, 05]
+21B5; [0C 6B D4, 05, 05]
-19FA; [0C 58 34, 05, 05]
+21B6; [0C 6B DB, 05, 05]
-19FB; [0C 58 3B, 05, 05]
+21B7; [0C 6B E2, 05, 05]
-19FC; [0C 58 42, 05, 05]
+21B8; [0C 6B E9, 05, 05]
-19FD; [0C 58 49, 05, 05]
+21B9; [0C 6B F0, 05, 05]
-19FE; [0C 58 50, 05, 05]
+21BA; [0C 6B F7, 05, 05]
-19FF; [0C 58 57, 05, 05]
+21BB; [0C 6B FE, 05, 05]
-1B61; [0C 58 5E, 05, 05]
+21BC; [0C 6C 07, 05, 05]
-1B62; [0C 58 65, 05, 05]
+21BD; [0C 6C 0E, 05, 05]
-1B63; [0C 58 6C, 05, 05]
+21BE; [0C 6C 15, 05, 05]
-1B64; [0C 58 73, 05, 05]
+21BF; [0C 6C 1C, 05, 05]
-1B65; [0C 58 7A, 05, 05]
+21C0; [0C 6C 23, 05, 05]
-1B66; [0C 58 81, 05, 05]
+21C1; [0C 6C 2A, 05, 05]
-1B67; [0C 58 88, 05, 05]
+21C2; [0C 6C 31, 05, 05]
-1B68; [0C 58 8F, 05, 05]
+21C3; [0C 6C 38, 05, 05]
-1B69; [0C 58 96, 05, 05]
+21C4; [0C 6C 3F, 05, 05]
-1B6A; [0C 58 9D, 05, 05]
+21C5; [0C 6C 46, 05, 05]
-1B74; [0C 58 A4, 05, 05]
+21C6; [0C 6C 4D, 05, 05]
-1B75; [0C 58 AB, 05, 05]
+21C7; [0C 6C 54, 05, 05]
-1B76; [0C 58 B2, 05, 05]
+21C8; [0C 6C 5B, 05, 05]
-1B77; [0C 58 B9, 05, 05]
+21C9; [0C 6C 62, 05, 05]
-1B78; [0C 58 C0, 05, 05]
+21CA; [0C 6C 69, 05, 05]
-1B79; [0C 58 C7, 05, 05]
+21CB; [0C 6C 70, 05, 05]
-1B7A; [0C 58 CE, 05, 05]
+21CC; [0C 6C 77, 05, 05]
-1B7B; [0C 58 D5, 05, 05]
+21D0; [0C 6C 7E, 05, 05]
+21CD; [0C 6C 7E, 05, 05][, 9E, 05]
-1B7C; [0C 58 DC, 05, 05]
+21D1; [0C 6C 85, 05, 05]
-00A9; [0C 5A, 05, 05]
+21D2; [0C 6C 8C, 05, 05]
+21CF; [0C 6C 8C, 05, 05][, 9E, 05]
-1F12F; [0C 5C, 05, 05]
+21D3; [0C 6C 93, 05, 05]
-00AE; [0C 5E, 05, 05]
+21D4; [0C 6C 9A, 05, 05]
+21CE; [0C 6C 9A, 05, 05][, 9E, 05]
-2104; [0C 60 02, 05, 05]
+21D5; [0C 6C A1, 05, 05]
-2108; [0C 60 09, 05, 05]
+21D6; [0C 6C A8, 05, 05]
-2114; [0C 60 10, 05, 05]
+21D7; [0C 6C AF, 05, 05]
-2117; [0C 60 17, 05, 05]
+21D8; [0C 6C B6, 05, 05]
-2118; [0C 60 1E, 05, 05]
+21D9; [0C 6C BD, 05, 05]
-211E; [0C 60 25, 05, 05]
+21DA; [0C 6C C4, 05, 05]
-211F; [0C 60 2C, 05, 05]
+21DB; [0C 6C CB, 05, 05]
-2123; [0C 60 33, 05, 05]
+21DC; [0C 6C D2, 05, 05]
-2125; [0C 60 3A, 05, 05]
+21DD; [0C 6C D9, 05, 05]
-2127; [0C 60 41, 05, 05]
+21DE; [0C 6C E0, 05, 05]
-2129; [0C 60 48, 05, 05]
+21DF; [0C 6C E7, 05, 05]
-212E; [0C 60 4F, 05, 05]
+21E0; [0C 6C EE, 05, 05]
-213A; [0C 60 56, 05, 05]
+21E1; [0C 6C F5, 05, 05]
-2141; [0C 60 5D, 05, 05]
+21E2; [0C 6C FC, 05, 05]
-2142; [0C 60 64, 05, 05]
+21E3; [0C 6D 05, 05, 05]
-2143; [0C 60 6B, 05, 05]
+21E4; [0C 6D 0C, 05, 05]
-2144; [0C 60 72, 05, 05]
+21E5; [0C 6D 13, 05, 05]
-214A; [0C 60 79, 05, 05]
+21E6; [0C 6D 1A, 05, 05]
-214C; [0C 60 80, 05, 05]
+21E7; [0C 6D 21, 05, 05]
-214F; [0C 60 87, 05, 05]
+21E8; [0C 6D 28, 05, 05]
-218A; [0C 60 8E, 05, 05]
+21E9; [0C 6D 2F, 05, 05]
-218B; [0C 60 95, 05, 05]
+21EA; [0C 6D 36, 05, 05]
-2190; [0C 62, 05, 05]
-FFE9; [0C 62, 05, A0]
-219A; [0C 62, 05, 05][, 9E, 05]
+21EB; [0C 6D 3D, 05, 05]
-2192; [0C 64, 05, 05]
-FFEB; [0C 64, 05, A0]
-219B; [0C 64, 05, 05][, 9E, 05]
+21EC; [0C 6D 44, 05, 05]
-2191; [0C 66, 05, 05]
-FFEA; [0C 66, 05, A0]
+21ED; [0C 6D 4B, 05, 05]
-2193; [0C 68, 05, 05]
-FFEC; [0C 68, 05, A0]
+21EE; [0C 6D 52, 05, 05]
-2194; [0C 6A 02, 05, 05]
-21AE; [0C 6A 02, 05, 05][, 9E, 05]
+21EF; [0C 6D 59, 05, 05]
-2195; [0C 6A 09, 05, 05]
+21F0; [0C 6D 60, 05, 05]
-2196; [0C 6A 10, 05, 05]
+21F1; [0C 6D 67, 05, 05]
-2197; [0C 6A 17, 05, 05]
+21F2; [0C 6D 6E, 05, 05]
-2198; [0C 6A 1E, 05, 05]
+21F3; [0C 6D 75, 05, 05]
-2199; [0C 6A 25, 05, 05]
+21F4; [0C 6D 7C, 05, 05]
-219C; [0C 6A 2C, 05, 05]
+21F5; [0C 6D 83, 05, 05]
-219D; [0C 6A 33, 05, 05]
+21F6; [0C 6D 8A, 05, 05]
-219E; [0C 6A 3A, 05, 05]
+21F7; [0C 6D 91, 05, 05]
-219F; [0C 6A 41, 05, 05]
+21F8; [0C 6D 98, 05, 05]
-21A0; [0C 6A 48, 05, 05]
+21F9; [0C 6D 9F, 05, 05]
-21A1; [0C 6A 4F, 05, 05]
+21FA; [0C 6D A6, 05, 05]
-21A2; [0C 6A 56, 05, 05]
+21FB; [0C 6D AD, 05, 05]
-21A3; [0C 6A 5D, 05, 05]
+21FC; [0C 6D B4, 05, 05]
-21A4; [0C 6A 64, 05, 05]
+21FD; [0C 6D BB, 05, 05]
-21A5; [0C 6A 6B, 05, 05]
+21FE; [0C 6D C2, 05, 05]
-21A6; [0C 6A 72, 05, 05]
+21FF; [0C 6D C9, 05, 05]
-21A7; [0C 6A 79, 05, 05]
+2200; [0C 6D D0, 05, 05]
-21A8; [0C 6A 80, 05, 05]
+2201; [0C 6D D7, 05, 05]
-21A9; [0C 6A 87, 05, 05]
+2202; [0C 6F, 05, 05]
+1D6DB; [0C 6F, 05, 20]
+1D715; [0C 6F, 05, 20]
+1D74F; [0C 6F, 05, 20]
+1D789; [0C 6F, 05, 20]
+1D7C3; [0C 6F, 05, 20]
-21AA; [0C 6A 8E, 05, 05]
+2203; [0C 71 02, 05, 05]
+2204; [0C 71 02, 05, 05][, 9E, 05]
-21AB; [0C 6A 95, 05, 05]
+2205; [0C 71 09, 05, 05]
-21AC; [0C 6A 9C, 05, 05]
+2206; [0C 71 10, 05, 05]
-21AD; [0C 6A A3, 05, 05]
+2207; [0C 73, 05, 05]
+1D6C1; [0C 73, 05, 20]
+1D6FB; [0C 73, 05, 20]
+1D735; [0C 73, 05, 20]
+1D76F; [0C 73, 05, 20]
+1D7A9; [0C 73, 05, 20]
-21AF; [0C 6A AA, 05, 05]
+2208; [0C 75 02, 05, 05]
+2209; [0C 75 02, 05, 05][, 9E, 05]
-21B0; [0C 6A B1, 05, 05]
+220A; [0C 75 09, 05, 05]
-21B1; [0C 6A B8, 05, 05]
+220B; [0C 75 10, 05, 05]
+220C; [0C 75 10, 05, 05][, 9E, 05]
-21B2; [0C 6A BF, 05, 05]
+220D; [0C 75 17, 05, 05]
-21B3; [0C 6A C6, 05, 05]
+03F6; [0C 75 1E, 05, 05]
-21B4; [0C 6A CD, 05, 05]
+220E; [0C 75 25, 05, 05]
-21B5; [0C 6A D4, 05, 05]
+220F; [0C 75 2C, 05, 05]
-21B6; [0C 6A DB, 05, 05]
+2210; [0C 75 33, 05, 05]
-21B7; [0C 6A E2, 05, 05]
+2211; [0C 77, 05, 05]
+2140; [0C 77, 05, 20]
-21B8; [0C 6A E9, 05, 05]
+002B; [0C 79, 05, 05]
+FF0B; [0C 79, 05, 10]
+FB29; [0C 79, 05, 18]
+FE62; [0C 79, 05, 20]
+207A; [0C 79, 05, 28]
+208A; [0C 79, 05, 30]
-21B9; [0C 6A F0, 05, 05]
+00B1; [0C 7B, 05, 05]
-21BA; [0C 6A F7, 05, 05]
+00F7; [0C 7D, 05, 05]
-21BB; [0C 6A FE, 05, 05]
+00D7; [0C 7F, 05, 05]
-21BC; [0C 6B 07, 05, 05]
+003C; [0C 81, 05, 05]
+FF1C; [0C 81, 05, 20]
+FE64; [0C 81, 05, 2E]
+226E; [0C 81, 05, 05][, 9E, 05]
-21BD; [0C 6B 0E, 05, 05]
+003D; [0C 83, 05, 05]
+FF1D; [0C 83, 05, 10]
+FE66; [0C 83, 05, 20]
+207C; [0C 83, 05, 28]
+208C; [0C 83, 05, 30]
+2260; [0C 83, 05, 05][, 9E, 05]
+2A75; [0C 83, 05, 18][0C 83, 05, 18]
+2A76; [0C 83, 05, 18][0C 83, 05, 18][0C 83, 05, 18]
-21BE; [0C 6B 15, 05, 05]
+003E; [0C 85, 05, 05]
+FF1E; [0C 85, 05, 20]
+FE65; [0C 85, 05, 2E]
+226F; [0C 85, 05, 05][, 9E, 05]
-21BF; [0C 6B 1C, 05, 05]
+00AC; [0C 87, 05, 05]
+FFE2; [0C 87, 05, 20]
-21C0; [0C 6B 23, 05, 05]
+007C; [0C 89, 05, 05]
+FF5C; [0C 89, 05, 20]
-21C1; [0C 6B 2A, 05, 05]
+00A6; [0C 8B, 05, 05]
+FFE4; [0C 8B, 05, 20]
-21C2; [0C 6B 31, 05, 05]
+007E; [0C 8D, 05, 05]
+FF5E; [0C 8D, 05, 20]
-21C3; [0C 6B 38, 05, 05]
+2212; [0C 8F, 05, 05]
+207B; [0C 8F, 05, 20]
+208B; [0C 8F, 05, 2E]
-21C4; [0C 6B 3F, 05, 05]
+2052; [0C 91 02, 05, 05]
-21C5; [0C 6B 46, 05, 05]
+2213; [0C 91 09, 05, 05]
-21C6; [0C 6B 4D, 05, 05]
+2214; [0C 91 10, 05, 05]
-21C7; [0C 6B 54, 05, 05]
+2215; [0C 93, 05, 05]
-21C8; [0C 6B 5B, 05, 05]
+2044; [0C 95, 05, 05]
-21C9; [0C 6B 62, 05, 05]
+2216; [0C 97 02, 05, 05]
-21CA; [0C 6B 69, 05, 05]
+2217; [0C 97 09, 05, 05]
-21CB; [0C 6B 70, 05, 05]
+2218; [0C 97 10, 05, 05]
-21CC; [0C 6B 77, 05, 05]
+2219; [0C 97 17, 05, 05]
-21D0; [0C 6B 7E, 05, 05]
-21CD; [0C 6B 7E, 05, 05][, 9E, 05]
+221A; [0C 97 1E, 05, 05]
-21D1; [0C 6B 85, 05, 05]
+221B; [0C 97 25, 05, 05]
-21D2; [0C 6B 8C, 05, 05]
-21CF; [0C 6B 8C, 05, 05][, 9E, 05]
+0606; [0C 97 2C, 05, 05]
-21D3; [0C 6B 93, 05, 05]
+221C; [0C 97 33, 05, 05]
-21D4; [0C 6B 9A, 05, 05]
-21CE; [0C 6B 9A, 05, 05][, 9E, 05]
+0607; [0C 97 3A, 05, 05]
-21D5; [0C 6B A1, 05, 05]
+221D; [0C 97 41, 05, 05]
-21D6; [0C 6B A8, 05, 05]
+221E; [0C 97 48, 05, 05]
-21D7; [0C 6B AF, 05, 05]
+221F; [0C 97 4F, 05, 05]
-21D8; [0C 6B B6, 05, 05]
+2220; [0C 97 56, 05, 05]
-21D9; [0C 6B BD, 05, 05]
+2221; [0C 97 5D, 05, 05]
-21DA; [0C 6B C4, 05, 05]
+2222; [0C 97 64, 05, 05]
-21DB; [0C 6B CB, 05, 05]
+2223; [0C 97 6B, 05, 05]
+2224; [0C 97 6B, 05, 05][, 9E, 05]
-21DC; [0C 6B D2, 05, 05]
+2225; [0C 97 72, 05, 05]
+2226; [0C 97 72, 05, 05][, 9E, 05]
-21DD; [0C 6B D9, 05, 05]
+2227; [0C 97 79, 05, 05]
-21DE; [0C 6B E0, 05, 05]
+2228; [0C 97 80, 05, 05]
-21DF; [0C 6B E7, 05, 05]
+2229; [0C 97 87, 05, 05]
-21E0; [0C 6B EE, 05, 05]
+222A; [0C 97 8E, 05, 05]
-21E1; [0C 6B F5, 05, 05]
+222B; [0C 99, 05, 05]
+222C; [0C 99, 05, 20][0C 99, 05, 20]
+222D; [0C 99, 05, 20][0C 99, 05, 20][0C 99, 05, 20]
+2A0C; [0C 99, 05, 20][0C 99, 05, 20][0C 99, 05, 20][0C 99, 05, 20]
-21E2; [0C 6B FC, 05, 05]
+222E; [0C 9B, 05, 05]
+222F; [0C 9B, 05, 20][0C 9B, 05, 20]
+2230; [0C 9B, 05, 20][0C 9B, 05, 20][0C 9B, 05, 20]
-21E3; [0C 6C 05, 05, 05]
+2231; [0C 9D 02, 05, 05]
-21E4; [0C 6C 0C, 05, 05]
+2232; [0C 9D 09, 05, 05]
-21E5; [0C 6C 13, 05, 05]
+2233; [0C 9D 10, 05, 05]
-21E6; [0C 6C 1A, 05, 05]
+2234; [0C 9D 17, 05, 05]
-21E7; [0C 6C 21, 05, 05]
+2235; [0C 9D 1E, 05, 05]
-21E8; [0C 6C 28, 05, 05]
+2236; [0C 9D 25, 05, 05]
-21E9; [0C 6C 2F, 05, 05]
+2237; [0C 9D 2C, 05, 05]
-21EA; [0C 6C 36, 05, 05]
+2238; [0C 9D 33, 05, 05]
-21EB; [0C 6C 3D, 05, 05]
+2239; [0C 9D 3A, 05, 05]
-21EC; [0C 6C 44, 05, 05]
+223A; [0C 9D 41, 05, 05]
-21ED; [0C 6C 4B, 05, 05]
+223B; [0C 9D 48, 05, 05]
-21EE; [0C 6C 52, 05, 05]
+223C; [0C 9D 4F, 05, 05]
+2241; [0C 9D 4F, 05, 05][, 9E, 05]
-21EF; [0C 6C 59, 05, 05]
+223D; [0C 9D 56, 05, 05]
-21F0; [0C 6C 60, 05, 05]
+223E; [0C 9D 5D, 05, 05]
-21F1; [0C 6C 67, 05, 05]
+223F; [0C 9D 64, 05, 05]
-21F2; [0C 6C 6E, 05, 05]
+2240; [0C 9D 6B, 05, 05]
-21F3; [0C 6C 75, 05, 05]
+2242; [0C 9D 72, 05, 05]
-21F4; [0C 6C 7C, 05, 05]
+2243; [0C 9D 79, 05, 05]
+2244; [0C 9D 79, 05, 05][, 9E, 05]
-21F5; [0C 6C 83, 05, 05]
+2245; [0C 9D 80, 05, 05]
+2247; [0C 9D 80, 05, 05][, 9E, 05]
-21F6; [0C 6C 8A, 05, 05]
+2246; [0C 9D 87, 05, 05]
-21F7; [0C 6C 91, 05, 05]
+2248; [0C 9D 8E, 05, 05]
+2249; [0C 9D 8E, 05, 05][, 9E, 05]
-21F8; [0C 6C 98, 05, 05]
+224A; [0C 9D 95, 05, 05]
-21F9; [0C 6C 9F, 05, 05]
+224B; [0C 9D 9C, 05, 05]
-21FA; [0C 6C A6, 05, 05]
+224C; [0C 9D A3, 05, 05]
-21FB; [0C 6C AD, 05, 05]
+224D; [0C 9D AA, 05, 05]
+226D; [0C 9D AA, 05, 05][, 9E, 05]
-21FC; [0C 6C B4, 05, 05]
+224E; [0C 9D B1, 05, 05]
-21FD; [0C 6C BB, 05, 05]
+224F; [0C 9D B8, 05, 05]
-21FE; [0C 6C C2, 05, 05]
+2250; [0C 9D BF, 05, 05]
-21FF; [0C 6C C9, 05, 05]
+2251; [0C 9D C6, 05, 05]
-2200; [0C 6C D0, 05, 05]
+2252; [0C 9D CD, 05, 05]
-2201; [0C 6C D7, 05, 05]
+2253; [0C 9D D4, 05, 05]
-2202; [0C 6E, 05, 05]
-1D6DB; [0C 6E, 05, 20]
-1D715; [0C 6E, 05, 20]
-1D74F; [0C 6E, 05, 20]
-1D789; [0C 6E, 05, 20]
-1D7C3; [0C 6E, 05, 20]
+2254; [0C 9D DB, 05, 05]
-2203; [0C 70 02, 05, 05]
-2204; [0C 70 02, 05, 05][, 9E, 05]
+2255; [0C 9D E2, 05, 05]
-2205; [0C 70 09, 05, 05]
+2256; [0C 9D E9, 05, 05]
-2206; [0C 70 10, 05, 05]
+2257; [0C 9D F0, 05, 05]
-2207; [0C 72, 05, 05]
-1D6C1; [0C 72, 05, 20]
-1D6FB; [0C 72, 05, 20]
-1D735; [0C 72, 05, 20]
-1D76F; [0C 72, 05, 20]
-1D7A9; [0C 72, 05, 20]
+2258; [0C 9D F7, 05, 05]
-2208; [0C 74 02, 05, 05]
-2209; [0C 74 02, 05, 05][, 9E, 05]
+2259; [0C 9D FE, 05, 05]
-220A; [0C 74 09, 05, 05]
+225A; [0C 9E 07, 05, 05]
-220B; [0C 74 10, 05, 05]
-220C; [0C 74 10, 05, 05][, 9E, 05]
+225B; [0C 9E 0E, 05, 05]
-220D; [0C 74 17, 05, 05]
+225C; [0C 9E 15, 05, 05]
-03F6; [0C 74 1E, 05, 05]
+225D; [0C 9E 1C, 05, 05]
-220E; [0C 74 25, 05, 05]
+225E; [0C 9E 23, 05, 05]
-220F; [0C 74 2C, 05, 05]
+225F; [0C 9E 2A, 05, 05]
-2210; [0C 74 33, 05, 05]
+2261; [0C 9E 31, 05, 05]
+2262; [0C 9E 31, 05, 05][, 9E, 05]
-2211; [0C 76, 05, 05]
-2140; [0C 76, 05, 20]
+2263; [0C 9E 38, 05, 05]
-002B; [0C 78, 05, 05]
-FF0B; [0C 78, 05, 10]
-FB29; [0C 78, 05, 18]
-FE62; [0C 78, 05, 20]
-207A; [0C 78, 05, 28]
-208A; [0C 78, 05, 30]
+2264; [0C 9E 3F, 05, 05]
+2270; [0C 9E 3F, 05, 05][, 9E, 05]
-00B1; [0C 7A, 05, 05]
+2265; [0C 9E 46, 05, 05]
+2271; [0C 9E 46, 05, 05][, 9E, 05]
-00F7; [0C 7C, 05, 05]
+2266; [0C 9E 4D, 05, 05]
-00D7; [0C 7E, 05, 05]
+2267; [0C 9E 54, 05, 05]
-003C; [0C 80, 05, 05]
-FF1C; [0C 80, 05, 20]
-FE64; [0C 80, 05, 2E]
-226E; [0C 80, 05, 05][, 9E, 05]
+2268; [0C 9E 5B, 05, 05]
-003D; [0C 82, 05, 05]
-FF1D; [0C 82, 05, 10]
-FE66; [0C 82, 05, 20]
-207C; [0C 82, 05, 28]
-208C; [0C 82, 05, 30]
-2260; [0C 82, 05, 05][, 9E, 05]
-2A75; [0C 82, 05, 18][0C 82, 05, 18]
-2A76; [0C 82, 05, 18][0C 82, 05, 18][0C 82, 05, 18]
+2269; [0C 9E 62, 05, 05]
-003E; [0C 84, 05, 05]
-FF1E; [0C 84, 05, 20]
-FE65; [0C 84, 05, 2E]
-226F; [0C 84, 05, 05][, 9E, 05]
+226A; [0C 9E 69, 05, 05]
-00AC; [0C 86, 05, 05]
-FFE2; [0C 86, 05, 20]
+226B; [0C 9E 70, 05, 05]
-007C; [0C 88, 05, 05]
-FF5C; [0C 88, 05, 20]
+226C; [0C 9E 77, 05, 05]
-00A6; [0C 8A, 05, 05]
-FFE4; [0C 8A, 05, 20]
+2272; [0C 9E 7E, 05, 05]
+2274; [0C 9E 7E, 05, 05][, 9E, 05]
-007E; [0C 8C, 05, 05]
-FF5E; [0C 8C, 05, 20]
+2273; [0C 9E 85, 05, 05]
+2275; [0C 9E 85, 05, 05][, 9E, 05]
-2212; [0C 8E, 05, 05]
-207B; [0C 8E, 05, 20]
-208B; [0C 8E, 05, 2E]
+2276; [0C 9E 8C, 05, 05]
+2278; [0C 9E 8C, 05, 05][, 9E, 05]
-2052; [0C 90 02, 05, 05]
+2277; [0C 9E 93, 05, 05]
+2279; [0C 9E 93, 05, 05][, 9E, 05]
-2213; [0C 90 09, 05, 05]
+227A; [0C 9E 9A, 05, 05]
+2280; [0C 9E 9A, 05, 05][, 9E, 05]
-2214; [0C 90 10, 05, 05]
+227B; [0C 9E A1, 05, 05]
+2281; [0C 9E A1, 05, 05][, 9E, 05]
-2215; [0C 92, 05, 05]
+227C; [0C 9E A8, 05, 05]
+22E0; [0C 9E A8, 05, 05][, 9E, 05]
-2044; [0C 94, 05, 05]
+227D; [0C 9E AF, 05, 05]
+22E1; [0C 9E AF, 05, 05][, 9E, 05]
-2216; [0C 96 02, 05, 05]
+227E; [0C 9E B6, 05, 05]
-2217; [0C 96 09, 05, 05]
+227F; [0C 9E BD, 05, 05]
-2218; [0C 96 10, 05, 05]
+2282; [0C 9E C4, 05, 05]
+2284; [0C 9E C4, 05, 05][, 9E, 05]
-2219; [0C 96 17, 05, 05]
+2283; [0C 9E CB, 05, 05]
+2285; [0C 9E CB, 05, 05][, 9E, 05]
-221A; [0C 96 1E, 05, 05]
+2286; [0C 9E D2, 05, 05]
+2288; [0C 9E D2, 05, 05][, 9E, 05]
-221B; [0C 96 25, 05, 05]
+2287; [0C 9E D9, 05, 05]
+2289; [0C 9E D9, 05, 05][, 9E, 05]
-0606; [0C 96 2C, 05, 05]
+228A; [0C 9E E0, 05, 05]
-221C; [0C 96 33, 05, 05]
+228B; [0C 9E E7, 05, 05]
-0607; [0C 96 3A, 05, 05]
+228C; [0C 9E EE, 05, 05]
-221D; [0C 96 41, 05, 05]
+228D; [0C 9E F5, 05, 05]
-221E; [0C 96 48, 05, 05]
+228E; [0C 9E FC, 05, 05]
-221F; [0C 96 4F, 05, 05]
+228F; [0C 9F 05, 05, 05]
-2220; [0C 96 56, 05, 05]
+2290; [0C 9F 0C, 05, 05]
-2221; [0C 96 5D, 05, 05]
+2291; [0C 9F 13, 05, 05]
+22E2; [0C 9F 13, 05, 05][, 9E, 05]
-2222; [0C 96 64, 05, 05]
+2292; [0C 9F 1A, 05, 05]
+22E3; [0C 9F 1A, 05, 05][, 9E, 05]
-2223; [0C 96 6B, 05, 05]
-2224; [0C 96 6B, 05, 05][, 9E, 05]
+2293; [0C 9F 21, 05, 05]
-2225; [0C 96 72, 05, 05]
-2226; [0C 96 72, 05, 05][, 9E, 05]
+2294; [0C 9F 28, 05, 05]
-2227; [0C 96 79, 05, 05]
+2295; [0C 9F 2F, 05, 05]
-2228; [0C 96 80, 05, 05]
+2296; [0C 9F 36, 05, 05]
-2229; [0C 96 87, 05, 05]
+2297; [0C 9F 3D, 05, 05]
-222A; [0C 96 8E, 05, 05]
+2298; [0C 9F 44, 05, 05]
-222B; [0C 98, 05, 05]
-222C; [0C 98, 05, 20][0C 98, 05, 20]
-222D; [0C 98, 05, 20][0C 98, 05, 20][0C 98, 05, 20]
-2A0C; [0C 98, 05, 20][0C 98, 05, 20][0C 98, 05, 20][0C 98, 05, 20]
+2299; [0C 9F 4B, 05, 05]
-222E; [0C 9A, 05, 05]
-222F; [0C 9A, 05, 20][0C 9A, 05, 20]
-2230; [0C 9A, 05, 20][0C 9A, 05, 20][0C 9A, 05, 20]
+229A; [0C 9F 52, 05, 05]
-2231; [0C 9C 02, 05, 05]
+229B; [0C 9F 59, 05, 05]
-2232; [0C 9C 09, 05, 05]
+229C; [0C 9F 60, 05, 05]
-2233; [0C 9C 10, 05, 05]
+229D; [0C 9F 67, 05, 05]
-2234; [0C 9C 17, 05, 05]
+229E; [0C 9F 6E, 05, 05]
-2235; [0C 9C 1E, 05, 05]
+229F; [0C 9F 75, 05, 05]
-2236; [0C 9C 25, 05, 05]
+22A0; [0C 9F 7C, 05, 05]
-2237; [0C 9C 2C, 05, 05]
+22A1; [0C 9F 83, 05, 05]
-2238; [0C 9C 33, 05, 05]
+22A2; [0C 9F 8A, 05, 05]
+22AC; [0C 9F 8A, 05, 05][, 9E, 05]
-2239; [0C 9C 3A, 05, 05]
+22A3; [0C 9F 91, 05, 05]
-223A; [0C 9C 41, 05, 05]
+22A4; [0C 9F 98, 05, 05]
-223B; [0C 9C 48, 05, 05]
+22A5; [0C 9F 9F, 05, 05]
-223C; [0C 9C 4F, 05, 05]
-2241; [0C 9C 4F, 05, 05][, 9E, 05]
+22A6; [0C 9F A6, 05, 05]
-223D; [0C 9C 56, 05, 05]
+22A7; [0C 9F AD, 05, 05]
-223E; [0C 9C 5D, 05, 05]
+22A8; [0C 9F B4, 05, 05]
+22AD; [0C 9F B4, 05, 05][, 9E, 05]
-223F; [0C 9C 64, 05, 05]
+22A9; [0C 9F BB, 05, 05]
+22AE; [0C 9F BB, 05, 05][, 9E, 05]
-2240; [0C 9C 6B, 05, 05]
+22AA; [0C 9F C2, 05, 05]
-2242; [0C 9C 72, 05, 05]
+22AB; [0C 9F C9, 05, 05]
+22AF; [0C 9F C9, 05, 05][, 9E, 05]
-2243; [0C 9C 79, 05, 05]
-2244; [0C 9C 79, 05, 05][, 9E, 05]
+22B0; [0C 9F D0, 05, 05]
-2245; [0C 9C 80, 05, 05]
-2247; [0C 9C 80, 05, 05][, 9E, 05]
+22B1; [0C 9F D7, 05, 05]
-2246; [0C 9C 87, 05, 05]
+22B2; [0C 9F DE, 05, 05]
+22EA; [0C 9F DE, 05, 05][, 9E, 05]
-2248; [0C 9C 8E, 05, 05]
-2249; [0C 9C 8E, 05, 05][, 9E, 05]
+22B3; [0C 9F E5, 05, 05]
+22EB; [0C 9F E5, 05, 05][, 9E, 05]
-224A; [0C 9C 95, 05, 05]
+22B4; [0C 9F EC, 05, 05]
+22EC; [0C 9F EC, 05, 05][, 9E, 05]
-224B; [0C 9C 9C, 05, 05]
+22B5; [0C 9F F3, 05, 05]
+22ED; [0C 9F F3, 05, 05][, 9E, 05]
-224C; [0C 9C A3, 05, 05]
+22B6; [0C 9F FA, 05, 05]
-224D; [0C 9C AA, 05, 05]
-226D; [0C 9C AA, 05, 05][, 9E, 05]
+22B7; [0C A0 03, 05, 05]
-224E; [0C 9C B1, 05, 05]
+22B8; [0C A0 0A, 05, 05]
-224F; [0C 9C B8, 05, 05]
+22B9; [0C A0 11, 05, 05]
-2250; [0C 9C BF, 05, 05]
+22BA; [0C A0 18, 05, 05]
-2251; [0C 9C C6, 05, 05]
+22BB; [0C A0 1F, 05, 05]
-2252; [0C 9C CD, 05, 05]
+22BC; [0C A0 26, 05, 05]
-2253; [0C 9C D4, 05, 05]
+214B; [0C A0 2D, 05, 05]
-2254; [0C 9C DB, 05, 05]
+22BD; [0C A0 34, 05, 05]
-2255; [0C 9C E2, 05, 05]
+22BE; [0C A0 3B, 05, 05]
-2256; [0C 9C E9, 05, 05]
+22BF; [0C A0 42, 05, 05]
-2257; [0C 9C F0, 05, 05]
+22C0; [0C A0 49, 05, 05]
-2258; [0C 9C F7, 05, 05]
+22C1; [0C A0 50, 05, 05]
-2259; [0C 9C FE, 05, 05]
+22C2; [0C A0 57, 05, 05]
-225A; [0C 9D 07, 05, 05]
+22C3; [0C A0 5E, 05, 05]
-225B; [0C 9D 0E, 05, 05]
+22C4; [0C A0 65, 05, 05]
-225C; [0C 9D 15, 05, 05]
+22C5; [0C A0 6C, 05, 05]
-225D; [0C 9D 1C, 05, 05]
+22C6; [0C A0 73, 05, 05]
-225E; [0C 9D 23, 05, 05]
+22C7; [0C A0 7A, 05, 05]
-225F; [0C 9D 2A, 05, 05]
+22C8; [0C A0 81, 05, 05]
-2261; [0C 9D 31, 05, 05]
-2262; [0C 9D 31, 05, 05][, 9E, 05]
+22C9; [0C A0 88, 05, 05]
-2263; [0C 9D 38, 05, 05]
+22CA; [0C A0 8F, 05, 05]
-2264; [0C 9D 3F, 05, 05]
-2270; [0C 9D 3F, 05, 05][, 9E, 05]
+22CB; [0C A0 96, 05, 05]
-2265; [0C 9D 46, 05, 05]
-2271; [0C 9D 46, 05, 05][, 9E, 05]
+22CC; [0C A0 9D, 05, 05]
-2266; [0C 9D 4D, 05, 05]
+22CD; [0C A0 A4, 05, 05]
-2267; [0C 9D 54, 05, 05]
+22CE; [0C A0 AB, 05, 05]
-2268; [0C 9D 5B, 05, 05]
+22CF; [0C A0 B2, 05, 05]
-2269; [0C 9D 62, 05, 05]
+22D0; [0C A0 B9, 05, 05]
-226A; [0C 9D 69, 05, 05]
+22D1; [0C A0 C0, 05, 05]
-226B; [0C 9D 70, 05, 05]
+22D2; [0C A0 C7, 05, 05]
-226C; [0C 9D 77, 05, 05]
+22D3; [0C A0 CE, 05, 05]
-2272; [0C 9D 7E, 05, 05]
-2274; [0C 9D 7E, 05, 05][, 9E, 05]
+22D4; [0C A0 D5, 05, 05]
-2273; [0C 9D 85, 05, 05]
-2275; [0C 9D 85, 05, 05][, 9E, 05]
+22D5; [0C A0 DC, 05, 05]
-2276; [0C 9D 8C, 05, 05]
-2278; [0C 9D 8C, 05, 05][, 9E, 05]
+22D6; [0C A0 E3, 05, 05]
-2277; [0C 9D 93, 05, 05]
-2279; [0C 9D 93, 05, 05][, 9E, 05]
+22D7; [0C A0 EA, 05, 05]
-227A; [0C 9D 9A, 05, 05]
-2280; [0C 9D 9A, 05, 05][, 9E, 05]
+22D8; [0C A0 F1, 05, 05]
-227B; [0C 9D A1, 05, 05]
-2281; [0C 9D A1, 05, 05][, 9E, 05]
+22D9; [0C A0 F8, 05, 05]
-227C; [0C 9D A8, 05, 05]
-22E0; [0C 9D A8, 05, 05][, 9E, 05]
+22DA; [0C A0 FF, 05, 05]
-227D; [0C 9D AF, 05, 05]
-22E1; [0C 9D AF, 05, 05][, 9E, 05]
+22DB; [0C A1 08, 05, 05]
-227E; [0C 9D B6, 05, 05]
+22DC; [0C A1 0F, 05, 05]
-227F; [0C 9D BD, 05, 05]
+22DD; [0C A1 16, 05, 05]
-2282; [0C 9D C4, 05, 05]
-2284; [0C 9D C4, 05, 05][, 9E, 05]
+22DE; [0C A1 1D, 05, 05]
-2283; [0C 9D CB, 05, 05]
-2285; [0C 9D CB, 05, 05][, 9E, 05]
+22DF; [0C A1 24, 05, 05]
-2286; [0C 9D D2, 05, 05]
-2288; [0C 9D D2, 05, 05][, 9E, 05]
+22E4; [0C A1 2B, 05, 05]
-2287; [0C 9D D9, 05, 05]
-2289; [0C 9D D9, 05, 05][, 9E, 05]
+22E5; [0C A1 32, 05, 05]
-228A; [0C 9D E0, 05, 05]
+22E6; [0C A1 39, 05, 05]
-228B; [0C 9D E7, 05, 05]
+22E7; [0C A1 40, 05, 05]
-228C; [0C 9D EE, 05, 05]
+22E8; [0C A1 47, 05, 05]
-228D; [0C 9D F5, 05, 05]
+22E9; [0C A1 4E, 05, 05]
-228E; [0C 9D FC, 05, 05]
+22EE; [0C A1 55, 05, 05]
-228F; [0C 9E 05, 05, 05]
+22EF; [0C A1 5C, 05, 05]
-2290; [0C 9E 0C, 05, 05]
+22F0; [0C A1 63, 05, 05]
-2291; [0C 9E 13, 05, 05]
-22E2; [0C 9E 13, 05, 05][, 9E, 05]
+22F1; [0C A1 6A, 05, 05]
-2292; [0C 9E 1A, 05, 05]
-22E3; [0C 9E 1A, 05, 05][, 9E, 05]
+22F2; [0C A1 71, 05, 05]
-2293; [0C 9E 21, 05, 05]
+22F3; [0C A1 78, 05, 05]
-2294; [0C 9E 28, 05, 05]
+22F4; [0C A1 7F, 05, 05]
-2295; [0C 9E 2F, 05, 05]
+22F5; [0C A1 86, 05, 05]
-2296; [0C 9E 36, 05, 05]
+22F6; [0C A1 8D, 05, 05]
-2297; [0C 9E 3D, 05, 05]
+22F7; [0C A1 94, 05, 05]
-2298; [0C 9E 44, 05, 05]
+22F8; [0C A1 9B, 05, 05]
-2299; [0C 9E 4B, 05, 05]
+22F9; [0C A1 A2, 05, 05]
-229A; [0C 9E 52, 05, 05]
+22FA; [0C A1 A9, 05, 05]
-229B; [0C 9E 59, 05, 05]
+22FB; [0C A1 B0, 05, 05]
-229C; [0C 9E 60, 05, 05]
+22FC; [0C A1 B7, 05, 05]
-229D; [0C 9E 67, 05, 05]
+22FD; [0C A1 BE, 05, 05]
-229E; [0C 9E 6E, 05, 05]
+22FE; [0C A1 C5, 05, 05]
-229F; [0C 9E 75, 05, 05]
+22FF; [0C A1 CC, 05, 05]
-22A0; [0C 9E 7C, 05, 05]
+2300; [0C A1 D3, 05, 05]
-22A1; [0C 9E 83, 05, 05]
+2301; [0C A1 DA, 05, 05]
-22A2; [0C 9E 8A, 05, 05]
-22AC; [0C 9E 8A, 05, 05][, 9E, 05]
+2302; [0C A1 E1, 05, 05]
-22A3; [0C 9E 91, 05, 05]
+2303; [0C A1 E8, 05, 05]
-22A4; [0C 9E 98, 05, 05]
+2304; [0C A1 EF, 05, 05]
-22A5; [0C 9E 9F, 05, 05]
+2305; [0C A1 F6, 05, 05]
-22A6; [0C 9E A6, 05, 05]
+2306; [0C A1 FD, 05, 05]
-22A7; [0C 9E AD, 05, 05]
+2307; [0C A2 06, 05, 05]
-22A8; [0C 9E B4, 05, 05]
-22AD; [0C 9E B4, 05, 05][, 9E, 05]
+230C; [0C A2 0D, 05, 05]
-22A9; [0C 9E BB, 05, 05]
-22AE; [0C 9E BB, 05, 05][, 9E, 05]
+230D; [0C A2 14, 05, 05]
-22AA; [0C 9E C2, 05, 05]
+230E; [0C A2 1B, 05, 05]
-22AB; [0C 9E C9, 05, 05]
-22AF; [0C 9E C9, 05, 05][, 9E, 05]
+230F; [0C A2 22, 05, 05]
-22B0; [0C 9E D0, 05, 05]
+2310; [0C A2 29, 05, 05]
-22B1; [0C 9E D7, 05, 05]
+2311; [0C A2 30, 05, 05]
-22B2; [0C 9E DE, 05, 05]
-22EA; [0C 9E DE, 05, 05][, 9E, 05]
+2312; [0C A2 37, 05, 05]
-22B3; [0C 9E E5, 05, 05]
-22EB; [0C 9E E5, 05, 05][, 9E, 05]
+2313; [0C A2 3E, 05, 05]
-22B4; [0C 9E EC, 05, 05]
-22EC; [0C 9E EC, 05, 05][, 9E, 05]
+2314; [0C A2 45, 05, 05]
-22B5; [0C 9E F3, 05, 05]
-22ED; [0C 9E F3, 05, 05][, 9E, 05]
+2315; [0C A2 4C, 05, 05]
-22B6; [0C 9E FA, 05, 05]
+2316; [0C A2 53, 05, 05]
-22B7; [0C 9F 03, 05, 05]
+2317; [0C A2 5A, 05, 05]
-22B8; [0C 9F 0A, 05, 05]
+2318; [0C A2 61, 05, 05]
-22B9; [0C 9F 11, 05, 05]
+2319; [0C A2 68, 05, 05]
-22BA; [0C 9F 18, 05, 05]
+231A; [0C A2 6F, 05, 05]
-22BB; [0C 9F 1F, 05, 05]
+231B; [0C A2 76, 05, 05]
-22BC; [0C 9F 26, 05, 05]
+231C; [0C A2 7D, 05, 05]
-214B; [0C 9F 2D, 05, 05]
+231D; [0C A2 84, 05, 05]
-22BD; [0C 9F 34, 05, 05]
+231E; [0C A2 8B, 05, 05]
-22BE; [0C 9F 3B, 05, 05]
+231F; [0C A2 92, 05, 05]
-22BF; [0C 9F 42, 05, 05]
+2320; [0C A2 99, 05, 05]
-22C0; [0C 9F 49, 05, 05]
+2321; [0C A2 A0, 05, 05]
-22C1; [0C 9F 50, 05, 05]
+2322; [0C A2 A7, 05, 05]
-22C2; [0C 9F 57, 05, 05]
+2323; [0C A2 AE, 05, 05]
-22C3; [0C 9F 5E, 05, 05]
+2324; [0C A2 B5, 05, 05]
-22C4; [0C 9F 65, 05, 05]
+2325; [0C A2 BC, 05, 05]
-22C5; [0C 9F 6C, 05, 05]
+2326; [0C A2 C3, 05, 05]
-22C6; [0C 9F 73, 05, 05]
+2327; [0C A2 CA, 05, 05]
-22C7; [0C 9F 7A, 05, 05]
+2328; [0C A2 D1, 05, 05]
-22C8; [0C 9F 81, 05, 05]
+232B; [0C A2 D8, 05, 05]
-22C9; [0C 9F 88, 05, 05]
+232C; [0C A2 DF, 05, 05]
-22CA; [0C 9F 8F, 05, 05]
+232D; [0C A2 E6, 05, 05]
-22CB; [0C 9F 96, 05, 05]
+232E; [0C A2 ED, 05, 05]
-22CC; [0C 9F 9D, 05, 05]
+232F; [0C A2 F4, 05, 05]
-22CD; [0C 9F A4, 05, 05]
+2330; [0C A2 FB, 05, 05]
-22CE; [0C 9F AB, 05, 05]
+2331; [0C A3 04, 05, 05]
-22CF; [0C 9F B2, 05, 05]
+2332; [0C A3 0B, 05, 05]
-22D0; [0C 9F B9, 05, 05]
+2333; [0C A3 12, 05, 05]
-22D1; [0C 9F C0, 05, 05]
+2334; [0C A3 19, 05, 05]
-22D2; [0C 9F C7, 05, 05]
+2335; [0C A3 20, 05, 05]
-22D3; [0C 9F CE, 05, 05]
+2336; [0C A3 27, 05, 05]
-22D4; [0C 9F D5, 05, 05]
+2337; [0C A3 2E, 05, 05]
-22D5; [0C 9F DC, 05, 05]
+2338; [0C A3 35, 05, 05]
-22D6; [0C 9F E3, 05, 05]
+2339; [0C A3 3C, 05, 05]
-22D7; [0C 9F EA, 05, 05]
+233A; [0C A3 43, 05, 05]
-22D8; [0C 9F F1, 05, 05]
+233B; [0C A3 4A, 05, 05]
-22D9; [0C 9F F8, 05, 05]
+233C; [0C A3 51, 05, 05]
-22DA; [0C 9F FF, 05, 05]
+233D; [0C A3 58, 05, 05]
-22DB; [0C A0 08, 05, 05]
+233E; [0C A3 5F, 05, 05]
-22DC; [0C A0 0F, 05, 05]
+233F; [0C A3 66, 05, 05]
-22DD; [0C A0 16, 05, 05]
+2340; [0C A3 6D, 05, 05]
-22DE; [0C A0 1D, 05, 05]
+2341; [0C A3 74, 05, 05]
-22DF; [0C A0 24, 05, 05]
+2342; [0C A3 7B, 05, 05]
-22E4; [0C A0 2B, 05, 05]
+2343; [0C A3 82, 05, 05]
-22E5; [0C A0 32, 05, 05]
+2344; [0C A3 89, 05, 05]
-22E6; [0C A0 39, 05, 05]
+2345; [0C A3 90, 05, 05]
-22E7; [0C A0 40, 05, 05]
+2346; [0C A3 97, 05, 05]
-22E8; [0C A0 47, 05, 05]
+2347; [0C A3 9E, 05, 05]
-22E9; [0C A0 4E, 05, 05]
+2348; [0C A3 A5, 05, 05]
-22EE; [0C A0 55, 05, 05]
+2349; [0C A3 AC, 05, 05]
-22EF; [0C A0 5C, 05, 05]
+234A; [0C A3 B3, 05, 05]
-22F0; [0C A0 63, 05, 05]
+234B; [0C A3 BA, 05, 05]
-22F1; [0C A0 6A, 05, 05]
+234C; [0C A3 C1, 05, 05]
-22F2; [0C A0 71, 05, 05]
+234D; [0C A3 C8, 05, 05]
-22F3; [0C A0 78, 05, 05]
+234E; [0C A3 CF, 05, 05]
-22F4; [0C A0 7F, 05, 05]
+234F; [0C A3 D6, 05, 05]
-22F5; [0C A0 86, 05, 05]
+2350; [0C A3 DD, 05, 05]
-22F6; [0C A0 8D, 05, 05]
+2351; [0C A3 E4, 05, 05]
-22F7; [0C A0 94, 05, 05]
+2352; [0C A3 EB, 05, 05]
-22F8; [0C A0 9B, 05, 05]
+2353; [0C A3 F2, 05, 05]
-22F9; [0C A0 A2, 05, 05]
+2354; [0C A3 F9, 05, 05]
-22FA; [0C A0 A9, 05, 05]
+2355; [0C A4 02, 05, 05]
-22FB; [0C A0 B0, 05, 05]
+2356; [0C A4 09, 05, 05]
-22FC; [0C A0 B7, 05, 05]
+2357; [0C A4 10, 05, 05]
-22FD; [0C A0 BE, 05, 05]
+2358; [0C A4 17, 05, 05]
-22FE; [0C A0 C5, 05, 05]
+2359; [0C A4 1E, 05, 05]
-22FF; [0C A0 CC, 05, 05]
+235A; [0C A4 25, 05, 05]
-2300; [0C A0 D3, 05, 05]
+235B; [0C A4 2C, 05, 05]
-2301; [0C A0 DA, 05, 05]
+235C; [0C A4 33, 05, 05]
-2302; [0C A0 E1, 05, 05]
+235D; [0C A4 3A, 05, 05]
-2303; [0C A0 E8, 05, 05]
+235E; [0C A4 41, 05, 05]
-2304; [0C A0 EF, 05, 05]
+235F; [0C A4 48, 05, 05]
-2305; [0C A0 F6, 05, 05]
+2360; [0C A4 4F, 05, 05]
-2306; [0C A0 FD, 05, 05]
+2361; [0C A4 56, 05, 05]
-2307; [0C A1 06, 05, 05]
+2362; [0C A4 5D, 05, 05]
-230C; [0C A1 0D, 05, 05]
+2363; [0C A4 64, 05, 05]
-230D; [0C A1 14, 05, 05]
+2364; [0C A4 6B, 05, 05]
-230E; [0C A1 1B, 05, 05]
+2365; [0C A4 72, 05, 05]
-230F; [0C A1 22, 05, 05]
+2366; [0C A4 79, 05, 05]
-2310; [0C A1 29, 05, 05]
+2367; [0C A4 80, 05, 05]
-2311; [0C A1 30, 05, 05]
+2368; [0C A4 87, 05, 05]
-2312; [0C A1 37, 05, 05]
+2369; [0C A4 8E, 05, 05]
-2313; [0C A1 3E, 05, 05]
+236A; [0C A4 95, 05, 05]
-2314; [0C A1 45, 05, 05]
+236B; [0C A4 9C, 05, 05]
-2315; [0C A1 4C, 05, 05]
+236C; [0C A4 A3, 05, 05]
-2316; [0C A1 53, 05, 05]
+236D; [0C A4 AA, 05, 05]
-2317; [0C A1 5A, 05, 05]
+236E; [0C A4 B1, 05, 05]
-2318; [0C A1 61, 05, 05]
+236F; [0C A4 B8, 05, 05]
-2319; [0C A1 68, 05, 05]
+2370; [0C A4 BF, 05, 05]
-231A; [0C A1 6F, 05, 05]
+2371; [0C A4 C6, 05, 05]
-231B; [0C A1 76, 05, 05]
+2372; [0C A4 CD, 05, 05]
-231C; [0C A1 7D, 05, 05]
+2373; [0C A4 D4, 05, 05]
-231D; [0C A1 84, 05, 05]
+2374; [0C A4 DB, 05, 05]
-231E; [0C A1 8B, 05, 05]
+2375; [0C A4 E2, 05, 05]
-231F; [0C A1 92, 05, 05]
+2376; [0C A4 E9, 05, 05]
-2320; [0C A1 99, 05, 05]
+2377; [0C A4 F0, 05, 05]
-2321; [0C A1 A0, 05, 05]
+2378; [0C A4 F7, 05, 05]
-2322; [0C A1 A7, 05, 05]
+2379; [0C A4 FE, 05, 05]
-2323; [0C A1 AE, 05, 05]
+237A; [0C A5 07, 05, 05]
-2324; [0C A1 B5, 05, 05]
+237B; [0C A5 0E, 05, 05]
-2325; [0C A1 BC, 05, 05]
+237C; [0C A5 15, 05, 05]
-2326; [0C A1 C3, 05, 05]
+237D; [0C A5 1C, 05, 05]
-2327; [0C A1 CA, 05, 05]
+237E; [0C A5 23, 05, 05]
-2328; [0C A1 D1, 05, 05]
+237F; [0C A5 2A, 05, 05]
-232B; [0C A1 D8, 05, 05]
+2380; [0C A5 31, 05, 05]
-232C; [0C A1 DF, 05, 05]
+2381; [0C A5 38, 05, 05]
-232D; [0C A1 E6, 05, 05]
+2382; [0C A5 3F, 05, 05]
-232E; [0C A1 ED, 05, 05]
+2383; [0C A5 46, 05, 05]
-232F; [0C A1 F4, 05, 05]
+2384; [0C A5 4D, 05, 05]
-2330; [0C A1 FB, 05, 05]
+2385; [0C A5 54, 05, 05]
-2331; [0C A2 04, 05, 05]
+2386; [0C A5 5B, 05, 05]
-2332; [0C A2 0B, 05, 05]
+2387; [0C A5 62, 05, 05]
-2333; [0C A2 12, 05, 05]
+2388; [0C A5 69, 05, 05]
-2334; [0C A2 19, 05, 05]
+2389; [0C A5 70, 05, 05]
-2335; [0C A2 20, 05, 05]
+238A; [0C A5 77, 05, 05]
-2336; [0C A2 27, 05, 05]
+238B; [0C A5 7E, 05, 05]
-2337; [0C A2 2E, 05, 05]
+238C; [0C A5 85, 05, 05]
-2338; [0C A2 35, 05, 05]
+238D; [0C A5 8C, 05, 05]
-2339; [0C A2 3C, 05, 05]
+238E; [0C A5 93, 05, 05]
-233A; [0C A2 43, 05, 05]
+238F; [0C A5 9A, 05, 05]
-233B; [0C A2 4A, 05, 05]
+2390; [0C A5 A1, 05, 05]
-233C; [0C A2 51, 05, 05]
+2391; [0C A5 A8, 05, 05]
-233D; [0C A2 58, 05, 05]
+2392; [0C A5 AF, 05, 05]
-233E; [0C A2 5F, 05, 05]
+2393; [0C A5 B6, 05, 05]
-233F; [0C A2 66, 05, 05]
+2394; [0C A5 BD, 05, 05]
-2340; [0C A2 6D, 05, 05]
+2395; [0C A5 C4, 05, 05]
-2341; [0C A2 74, 05, 05]
+2396; [0C A5 CB, 05, 05]
-2342; [0C A2 7B, 05, 05]
+2397; [0C A5 D2, 05, 05]
-2343; [0C A2 82, 05, 05]
+2398; [0C A5 D9, 05, 05]
-2344; [0C A2 89, 05, 05]
+2399; [0C A5 E0, 05, 05]
-2345; [0C A2 90, 05, 05]
+239A; [0C A5 E7, 05, 05]
-2346; [0C A2 97, 05, 05]
+239B; [0C A5 EE, 05, 05]
-2347; [0C A2 9E, 05, 05]
+239C; [0C A5 F5, 05, 05]
-2348; [0C A2 A5, 05, 05]
+239D; [0C A5 FC, 05, 05]
-2349; [0C A2 AC, 05, 05]
+239E; [0C A6 05, 05, 05]
-234A; [0C A2 B3, 05, 05]
+239F; [0C A6 0C, 05, 05]
-234B; [0C A2 BA, 05, 05]
+23A0; [0C A6 13, 05, 05]
-234C; [0C A2 C1, 05, 05]
+23A1; [0C A6 1A, 05, 05]
-234D; [0C A2 C8, 05, 05]
+23A2; [0C A6 21, 05, 05]
-234E; [0C A2 CF, 05, 05]
+23A3; [0C A6 28, 05, 05]
-234F; [0C A2 D6, 05, 05]
+23A4; [0C A6 2F, 05, 05]
-2350; [0C A2 DD, 05, 05]
+23A5; [0C A6 36, 05, 05]
-2351; [0C A2 E4, 05, 05]
+23A6; [0C A6 3D, 05, 05]
-2352; [0C A2 EB, 05, 05]
+23A7; [0C A6 44, 05, 05]
-2353; [0C A2 F2, 05, 05]
+23A8; [0C A6 4B, 05, 05]
-2354; [0C A2 F9, 05, 05]
+23A9; [0C A6 52, 05, 05]
-2355; [0C A3 02, 05, 05]
+23AA; [0C A6 59, 05, 05]
-2356; [0C A3 09, 05, 05]
+23AB; [0C A6 60, 05, 05]
-2357; [0C A3 10, 05, 05]
+23AC; [0C A6 67, 05, 05]
-2358; [0C A3 17, 05, 05]
+23AD; [0C A6 6E, 05, 05]
-2359; [0C A3 1E, 05, 05]
+23AE; [0C A6 75, 05, 05]
-235A; [0C A3 25, 05, 05]
+23AF; [0C A6 7C, 05, 05]
-235B; [0C A3 2C, 05, 05]
+23B0; [0C A6 83, 05, 05]
-235C; [0C A3 33, 05, 05]
+23B1; [0C A6 8A, 05, 05]
-235D; [0C A3 3A, 05, 05]
+23B2; [0C A6 91, 05, 05]
-235E; [0C A3 41, 05, 05]
+23B3; [0C A6 98, 05, 05]
-235F; [0C A3 48, 05, 05]
+23B4; [0C A6 9F, 05, 05]
-2360; [0C A3 4F, 05, 05]
+23B5; [0C A6 A6, 05, 05]
-2361; [0C A3 56, 05, 05]
+23B6; [0C A6 AD, 05, 05]
-2362; [0C A3 5D, 05, 05]
+23B7; [0C A6 B4, 05, 05]
-2363; [0C A3 64, 05, 05]
+23B8; [0C A6 BB, 05, 05]
-2364; [0C A3 6B, 05, 05]
+23B9; [0C A6 C2, 05, 05]
-2365; [0C A3 72, 05, 05]
+23BA; [0C A6 C9, 05, 05]
-2366; [0C A3 79, 05, 05]
+23BB; [0C A6 D0, 05, 05]
-2367; [0C A3 80, 05, 05]
+23BC; [0C A6 D7, 05, 05]
-2368; [0C A3 87, 05, 05]
+23BD; [0C A6 DE, 05, 05]
-2369; [0C A3 8E, 05, 05]
+23BE; [0C A6 E5, 05, 05]
-236A; [0C A3 95, 05, 05]
+23BF; [0C A6 EC, 05, 05]
-236B; [0C A3 9C, 05, 05]
+23C0; [0C A6 F3, 05, 05]
-236C; [0C A3 A3, 05, 05]
+23C1; [0C A6 FA, 05, 05]
-236D; [0C A3 AA, 05, 05]
+23C2; [0C A7 03, 05, 05]
-236E; [0C A3 B1, 05, 05]
+23C3; [0C A7 0A, 05, 05]
-236F; [0C A3 B8, 05, 05]
+23C4; [0C A7 11, 05, 05]
-2370; [0C A3 BF, 05, 05]
+23C5; [0C A7 18, 05, 05]
-2371; [0C A3 C6, 05, 05]
+23C6; [0C A7 1F, 05, 05]
-2372; [0C A3 CD, 05, 05]
+23C7; [0C A7 26, 05, 05]
-2373; [0C A3 D4, 05, 05]
+23C8; [0C A7 2D, 05, 05]
-2374; [0C A3 DB, 05, 05]
+23C9; [0C A7 34, 05, 05]
-2375; [0C A3 E2, 05, 05]
+23CA; [0C A7 3B, 05, 05]
-2376; [0C A3 E9, 05, 05]
+23CB; [0C A7 42, 05, 05]
-2377; [0C A3 F0, 05, 05]
+23CC; [0C A7 49, 05, 05]
-2378; [0C A3 F7, 05, 05]
+23CD; [0C A7 50, 05, 05]
-2379; [0C A3 FE, 05, 05]
+23CE; [0C A7 57, 05, 05]
-237A; [0C A4 07, 05, 05]
+23CF; [0C A7 5E, 05, 05]
-237B; [0C A4 0E, 05, 05]
+23D0; [0C A7 65, 05, 05]
-237C; [0C A4 15, 05, 05]
+23D1; [0C A7 6C, 05, 05]
-237D; [0C A4 1C, 05, 05]
+23D2; [0C A7 73, 05, 05]
-237E; [0C A4 23, 05, 05]
+23D3; [0C A7 7A, 05, 05]
-237F; [0C A4 2A, 05, 05]
+23D4; [0C A7 81, 05, 05]
-2380; [0C A4 31, 05, 05]
+23D5; [0C A7 88, 05, 05]
-2381; [0C A4 38, 05, 05]
+23D6; [0C A7 8F, 05, 05]
-2382; [0C A4 3F, 05, 05]
+23D7; [0C A7 96, 05, 05]
-2383; [0C A4 46, 05, 05]
+23D8; [0C A7 9D, 05, 05]
-2384; [0C A4 4D, 05, 05]
+23D9; [0C A7 A4, 05, 05]
-2385; [0C A4 54, 05, 05]
+23DA; [0C A7 AB, 05, 05]
-2386; [0C A4 5B, 05, 05]
+23DB; [0C A7 B2, 05, 05]
-2387; [0C A4 62, 05, 05]
+23DC; [0C A7 B9, 05, 05]
-2388; [0C A4 69, 05, 05]
+23DD; [0C A7 C0, 05, 05]
-2389; [0C A4 70, 05, 05]
+23DE; [0C A7 C7, 05, 05]
-238A; [0C A4 77, 05, 05]
+23DF; [0C A7 CE, 05, 05]
-238B; [0C A4 7E, 05, 05]
+23E0; [0C A7 D5, 05, 05]
-238C; [0C A4 85, 05, 05]
+23E1; [0C A7 DC, 05, 05]
-238D; [0C A4 8C, 05, 05]
+23E2; [0C A7 E3, 05, 05]
-238E; [0C A4 93, 05, 05]
+23E3; [0C A7 EA, 05, 05]
-238F; [0C A4 9A, 05, 05]
+23E4; [0C A7 F1, 05, 05]
-2390; [0C A4 A1, 05, 05]
+23E5; [0C A7 F8, 05, 05]
-2391; [0C A4 A8, 05, 05]
+23E6; [0C A7 FF, 05, 05]
-2392; [0C A4 AF, 05, 05]
+23E7; [0C A8 08, 05, 05]
-2393; [0C A4 B6, 05, 05]
+23E8; [0C A8 0F, 05, 05]
-2394; [0C A4 BD, 05, 05]
+23E9; [0C A8 16, 05, 05]
-2395; [0C A4 C4, 05, 05]
+23EA; [0C A8 1D, 05, 05]
-2396; [0C A4 CB, 05, 05]
+23EB; [0C A8 24, 05, 05]
-2397; [0C A4 D2, 05, 05]
+23EC; [0C A8 2B, 05, 05]
-2398; [0C A4 D9, 05, 05]
+23ED; [0C A8 32, 05, 05]
-2399; [0C A4 E0, 05, 05]
+23EE; [0C A8 39, 05, 05]
-239A; [0C A4 E7, 05, 05]
+23EF; [0C A8 40, 05, 05]
-239B; [0C A4 EE, 05, 05]
+23F0; [0C A8 47, 05, 05]
-239C; [0C A4 F5, 05, 05]
+23F1; [0C A8 4E, 05, 05]
-239D; [0C A4 FC, 05, 05]
+23F2; [0C A8 55, 05, 05]
-239E; [0C A5 05, 05, 05]
+23F3; [0C A8 5C, 05, 05]
-239F; [0C A5 0C, 05, 05]
+23F4; [0C A8 63, 05, 05]
-23A0; [0C A5 13, 05, 05]
+23F5; [0C A8 6A, 05, 05]
-23A1; [0C A5 1A, 05, 05]
+23F6; [0C A8 71, 05, 05]
-23A2; [0C A5 21, 05, 05]
+23F7; [0C A8 78, 05, 05]
-23A3; [0C A5 28, 05, 05]
+23F8; [0C A8 7F, 05, 05]
-23A4; [0C A5 2F, 05, 05]
+23F9; [0C A8 86, 05, 05]
-23A5; [0C A5 36, 05, 05]
+23FA; [0C A8 8D, 05, 05]
-23A6; [0C A5 3D, 05, 05]
+23FB; [0C A8 94, 05, 05]
-23A7; [0C A5 44, 05, 05]
+23FC; [0C A8 9B, 05, 05]
-23A8; [0C A5 4B, 05, 05]
+23FD; [0C A8 A2, 05, 05]
-23A9; [0C A5 52, 05, 05]
+23FE; [0C A8 A9, 05, 05]
-23AA; [0C A5 59, 05, 05]
+23FF; [0C A8 B0, 05, 05]
-23AB; [0C A5 60, 05, 05]
+2400; [0C A8 B7, 05, 05]
-23AC; [0C A5 67, 05, 05]
+2401; [0C A8 BE, 05, 05]
-23AD; [0C A5 6E, 05, 05]
+2402; [0C A8 C5, 05, 05]
-23AE; [0C A5 75, 05, 05]
+2403; [0C A8 CC, 05, 05]
-23AF; [0C A5 7C, 05, 05]
+2404; [0C A8 D3, 05, 05]
-23B0; [0C A5 83, 05, 05]
+2405; [0C A8 DA, 05, 05]
-23B1; [0C A5 8A, 05, 05]
+2406; [0C A8 E1, 05, 05]
-23B2; [0C A5 91, 05, 05]
+2407; [0C A8 E8, 05, 05]
-23B3; [0C A5 98, 05, 05]
+2408; [0C A8 EF, 05, 05]
-23B4; [0C A5 9F, 05, 05]
+2409; [0C A8 F6, 05, 05]
-23B5; [0C A5 A6, 05, 05]
+240A; [0C A8 FD, 05, 05]
-23B6; [0C A5 AD, 05, 05]
+240B; [0C A9 06, 05, 05]
-23B7; [0C A5 B4, 05, 05]
+240C; [0C A9 0D, 05, 05]
-23B8; [0C A5 BB, 05, 05]
+240D; [0C A9 14, 05, 05]
-23B9; [0C A5 C2, 05, 05]
+240E; [0C A9 1B, 05, 05]
-23BA; [0C A5 C9, 05, 05]
+240F; [0C A9 22, 05, 05]
-23BB; [0C A5 D0, 05, 05]
+2410; [0C A9 29, 05, 05]
-23BC; [0C A5 D7, 05, 05]
+2411; [0C A9 30, 05, 05]
-23BD; [0C A5 DE, 05, 05]
+2412; [0C A9 37, 05, 05]
-23BE; [0C A5 E5, 05, 05]
+2413; [0C A9 3E, 05, 05]
-23BF; [0C A5 EC, 05, 05]
+2414; [0C A9 45, 05, 05]
-23C0; [0C A5 F3, 05, 05]
+2415; [0C A9 4C, 05, 05]
-23C1; [0C A5 FA, 05, 05]
+2416; [0C A9 53, 05, 05]
-23C2; [0C A6 03, 05, 05]
+2417; [0C A9 5A, 05, 05]
-23C3; [0C A6 0A, 05, 05]
+2418; [0C A9 61, 05, 05]
-23C4; [0C A6 11, 05, 05]
+2419; [0C A9 68, 05, 05]
-23C5; [0C A6 18, 05, 05]
+241A; [0C A9 6F, 05, 05]
-23C6; [0C A6 1F, 05, 05]
+241B; [0C A9 76, 05, 05]
-23C7; [0C A6 26, 05, 05]
+241C; [0C A9 7D, 05, 05]
-23C8; [0C A6 2D, 05, 05]
+241D; [0C A9 84, 05, 05]
-23C9; [0C A6 34, 05, 05]
+241E; [0C A9 8B, 05, 05]
-23CA; [0C A6 3B, 05, 05]
+241F; [0C A9 92, 05, 05]
-23CB; [0C A6 42, 05, 05]
+2420; [0C A9 99, 05, 05]
-23CC; [0C A6 49, 05, 05]
+2421; [0C A9 A0, 05, 05]
-23CD; [0C A6 50, 05, 05]
+2422; [0C A9 A7, 05, 05]
-23CE; [0C A6 57, 05, 05]
+2423; [0C A9 AE, 05, 05]
-23CF; [0C A6 5E, 05, 05]
+2424; [0C A9 B5, 05, 05]
-23D0; [0C A6 65, 05, 05]
+2425; [0C A9 BC, 05, 05]
-23D1; [0C A6 6C, 05, 05]
+2426; [0C A9 C3, 05, 05]
-23D2; [0C A6 73, 05, 05]
+2440; [0C A9 CA, 05, 05]
-23D3; [0C A6 7A, 05, 05]
+2441; [0C A9 D1, 05, 05]
-23D4; [0C A6 81, 05, 05]
+2442; [0C A9 D8, 05, 05]
-23D5; [0C A6 88, 05, 05]
+2443; [0C A9 DF, 05, 05]
-23D6; [0C A6 8F, 05, 05]
+2444; [0C A9 E6, 05, 05]
-23D7; [0C A6 96, 05, 05]
+2445; [0C A9 ED, 05, 05]
-23D8; [0C A6 9D, 05, 05]
+2446; [0C A9 F4, 05, 05]
-23D9; [0C A6 A4, 05, 05]
+2447; [0C A9 FB, 05, 05]
-23DA; [0C A6 AB, 05, 05]
+2448; [0C AA 04, 05, 05]
-23DB; [0C A6 B2, 05, 05]
+2449; [0C AA 0B, 05, 05]
-23DC; [0C A6 B9, 05, 05]
+244A; [0C AA 12, 05, 05]
-23DD; [0C A6 C0, 05, 05]
+2500; [0C AA 19, 05, 05]
-23DE; [0C A6 C7, 05, 05]
+2501; [0C AA 20, 05, 05]
-23DF; [0C A6 CE, 05, 05]
+2502; [0C AC, 05, 05]
+FFE8; [0C AC, 05, A0]
-23E0; [0C A6 D5, 05, 05]
+2503; [0C AE 02, 05, 05]
-23E1; [0C A6 DC, 05, 05]
+2504; [0C AE 09, 05, 05]
-23E2; [0C A6 E3, 05, 05]
+2505; [0C AE 10, 05, 05]
-23E3; [0C A6 EA, 05, 05]
+2506; [0C AE 17, 05, 05]
-23E4; [0C A6 F1, 05, 05]
+2507; [0C AE 1E, 05, 05]
-23E5; [0C A6 F8, 05, 05]
+2508; [0C AE 25, 05, 05]
-23E6; [0C A6 FF, 05, 05]
+2509; [0C AE 2C, 05, 05]
-23E7; [0C A7 08, 05, 05]
+250A; [0C AE 33, 05, 05]
-23E8; [0C A7 0F, 05, 05]
+250B; [0C AE 3A, 05, 05]
-23E9; [0C A7 16, 05, 05]
+250C; [0C AE 41, 05, 05]
-23EA; [0C A7 1D, 05, 05]
+250D; [0C AE 48, 05, 05]
-23EB; [0C A7 24, 05, 05]
+250E; [0C AE 4F, 05, 05]
-23EC; [0C A7 2B, 05, 05]
+250F; [0C AE 56, 05, 05]
-23ED; [0C A7 32, 05, 05]
+2510; [0C AE 5D, 05, 05]
-23EE; [0C A7 39, 05, 05]
+2511; [0C AE 64, 05, 05]
-23EF; [0C A7 40, 05, 05]
+2512; [0C AE 6B, 05, 05]
-23F0; [0C A7 47, 05, 05]
+2513; [0C AE 72, 05, 05]
-23F1; [0C A7 4E, 05, 05]
+2514; [0C AE 79, 05, 05]
-23F2; [0C A7 55, 05, 05]
+2515; [0C AE 80, 05, 05]
-23F3; [0C A7 5C, 05, 05]
+2516; [0C AE 87, 05, 05]
-23F4; [0C A7 63, 05, 05]
+2517; [0C AE 8E, 05, 05]
-23F5; [0C A7 6A, 05, 05]
+2518; [0C AE 95, 05, 05]
-23F6; [0C A7 71, 05, 05]
+2519; [0C AE 9C, 05, 05]
-23F7; [0C A7 78, 05, 05]
+251A; [0C AE A3, 05, 05]
-23F8; [0C A7 7F, 05, 05]
+251B; [0C AE AA, 05, 05]
-23F9; [0C A7 86, 05, 05]
+251C; [0C AE B1, 05, 05]
-23FA; [0C A7 8D, 05, 05]
+251D; [0C AE B8, 05, 05]
-23FB; [0C A7 94, 05, 05]
+251E; [0C AE BF, 05, 05]
-23FC; [0C A7 9B, 05, 05]
+251F; [0C AE C6, 05, 05]
-23FD; [0C A7 A2, 05, 05]
+2520; [0C AE CD, 05, 05]
-23FE; [0C A7 A9, 05, 05]
+2521; [0C AE D4, 05, 05]
-23FF; [0C A7 B0, 05, 05]
+2522; [0C AE DB, 05, 05]
-2400; [0C A7 B7, 05, 05]
+2523; [0C AE E2, 05, 05]
-2401; [0C A7 BE, 05, 05]
+2524; [0C AE E9, 05, 05]
-2402; [0C A7 C5, 05, 05]
+2525; [0C AE F0, 05, 05]
-2403; [0C A7 CC, 05, 05]
+2526; [0C AE F7, 05, 05]
-2404; [0C A7 D3, 05, 05]
+2527; [0C AE FE, 05, 05]
-2405; [0C A7 DA, 05, 05]
+2528; [0C AF 07, 05, 05]
-2406; [0C A7 E1, 05, 05]
+2529; [0C AF 0E, 05, 05]
-2407; [0C A7 E8, 05, 05]
+252A; [0C AF 15, 05, 05]
-2408; [0C A7 EF, 05, 05]
+252B; [0C AF 1C, 05, 05]
-2409; [0C A7 F6, 05, 05]
+252C; [0C AF 23, 05, 05]
-240A; [0C A7 FD, 05, 05]
+252D; [0C AF 2A, 05, 05]
-240B; [0C A8 06, 05, 05]
+252E; [0C AF 31, 05, 05]
-240C; [0C A8 0D, 05, 05]
+252F; [0C AF 38, 05, 05]
-240D; [0C A8 14, 05, 05]
+2530; [0C AF 3F, 05, 05]
-240E; [0C A8 1B, 05, 05]
+2531; [0C AF 46, 05, 05]
-240F; [0C A8 22, 05, 05]
+2532; [0C AF 4D, 05, 05]
-2410; [0C A8 29, 05, 05]
+2533; [0C AF 54, 05, 05]
-2411; [0C A8 30, 05, 05]
+2534; [0C AF 5B, 05, 05]
-2412; [0C A8 37, 05, 05]
+2535; [0C AF 62, 05, 05]
-2413; [0C A8 3E, 05, 05]
+2536; [0C AF 69, 05, 05]
-2414; [0C A8 45, 05, 05]
+2537; [0C AF 70, 05, 05]
-2415; [0C A8 4C, 05, 05]
+2538; [0C AF 77, 05, 05]
-2416; [0C A8 53, 05, 05]
+2539; [0C AF 7E, 05, 05]
-2417; [0C A8 5A, 05, 05]
+253A; [0C AF 85, 05, 05]
-2418; [0C A8 61, 05, 05]
+253B; [0C AF 8C, 05, 05]
-2419; [0C A8 68, 05, 05]
+253C; [0C AF 93, 05, 05]
-241A; [0C A8 6F, 05, 05]
+253D; [0C AF 9A, 05, 05]
-241B; [0C A8 76, 05, 05]
+253E; [0C AF A1, 05, 05]
-241C; [0C A8 7D, 05, 05]
+253F; [0C AF A8, 05, 05]
-241D; [0C A8 84, 05, 05]
+2540; [0C AF AF, 05, 05]
-241E; [0C A8 8B, 05, 05]
+2541; [0C AF B6, 05, 05]
-241F; [0C A8 92, 05, 05]
+2542; [0C AF BD, 05, 05]
-2420; [0C A8 99, 05, 05]
+2543; [0C AF C4, 05, 05]
-2421; [0C A8 A0, 05, 05]
+2544; [0C AF CB, 05, 05]
-2422; [0C A8 A7, 05, 05]
+2545; [0C AF D2, 05, 05]
-2423; [0C A8 AE, 05, 05]
+2546; [0C AF D9, 05, 05]
-2424; [0C A8 B5, 05, 05]
+2547; [0C AF E0, 05, 05]
-2425; [0C A8 BC, 05, 05]
+2548; [0C AF E7, 05, 05]
-2426; [0C A8 C3, 05, 05]
+2549; [0C AF EE, 05, 05]
-2440; [0C A8 CA, 05, 05]
+254A; [0C AF F5, 05, 05]
-2441; [0C A8 D1, 05, 05]
+254B; [0C AF FC, 05, 05]
-2442; [0C A8 D8, 05, 05]
+254C; [0C B0 05, 05, 05]
-2443; [0C A8 DF, 05, 05]
+254D; [0C B0 0C, 05, 05]
-2444; [0C A8 E6, 05, 05]
+254E; [0C B0 13, 05, 05]
-2445; [0C A8 ED, 05, 05]
+254F; [0C B0 1A, 05, 05]
-2446; [0C A8 F4, 05, 05]
+2550; [0C B0 21, 05, 05]
-2447; [0C A8 FB, 05, 05]
+2551; [0C B0 28, 05, 05]
-2448; [0C A9 04, 05, 05]
+2552; [0C B0 2F, 05, 05]
-2449; [0C A9 0B, 05, 05]
+2553; [0C B0 36, 05, 05]
-244A; [0C A9 12, 05, 05]
+2554; [0C B0 3D, 05, 05]
-2500; [0C A9 19, 05, 05]
+2555; [0C B0 44, 05, 05]
-2501; [0C A9 20, 05, 05]
+2556; [0C B0 4B, 05, 05]
-2502; [0C AB, 05, 05]
-FFE8; [0C AB, 05, A0]
+2557; [0C B0 52, 05, 05]
-2503; [0C AD 02, 05, 05]
+2558; [0C B0 59, 05, 05]
-2504; [0C AD 09, 05, 05]
+2559; [0C B0 60, 05, 05]
-2505; [0C AD 10, 05, 05]
+255A; [0C B0 67, 05, 05]
-2506; [0C AD 17, 05, 05]
+255B; [0C B0 6E, 05, 05]
-2507; [0C AD 1E, 05, 05]
+255C; [0C B0 75, 05, 05]
-2508; [0C AD 25, 05, 05]
+255D; [0C B0 7C, 05, 05]
-2509; [0C AD 2C, 05, 05]
+255E; [0C B0 83, 05, 05]
-250A; [0C AD 33, 05, 05]
+255F; [0C B0 8A, 05, 05]
-250B; [0C AD 3A, 05, 05]
+2560; [0C B0 91, 05, 05]
-250C; [0C AD 41, 05, 05]
+2561; [0C B0 98, 05, 05]
-250D; [0C AD 48, 05, 05]
+2562; [0C B0 9F, 05, 05]
-250E; [0C AD 4F, 05, 05]
+2563; [0C B0 A6, 05, 05]
-250F; [0C AD 56, 05, 05]
+2564; [0C B0 AD, 05, 05]
-2510; [0C AD 5D, 05, 05]
+2565; [0C B0 B4, 05, 05]
-2511; [0C AD 64, 05, 05]
+2566; [0C B0 BB, 05, 05]
-2512; [0C AD 6B, 05, 05]
+2567; [0C B0 C2, 05, 05]
-2513; [0C AD 72, 05, 05]
+2568; [0C B0 C9, 05, 05]
-2514; [0C AD 79, 05, 05]
+2569; [0C B0 D0, 05, 05]
-2515; [0C AD 80, 05, 05]
+256A; [0C B0 D7, 05, 05]
-2516; [0C AD 87, 05, 05]
+256B; [0C B0 DE, 05, 05]
-2517; [0C AD 8E, 05, 05]
+256C; [0C B0 E5, 05, 05]
-2518; [0C AD 95, 05, 05]
+256D; [0C B0 EC, 05, 05]
-2519; [0C AD 9C, 05, 05]
+256E; [0C B0 F3, 05, 05]
-251A; [0C AD A3, 05, 05]
+256F; [0C B0 FA, 05, 05]
-251B; [0C AD AA, 05, 05]
+2570; [0C B1 03, 05, 05]
-251C; [0C AD B1, 05, 05]
+2571; [0C B1 0A, 05, 05]
-251D; [0C AD B8, 05, 05]
+2572; [0C B1 11, 05, 05]
-251E; [0C AD BF, 05, 05]
+2573; [0C B1 18, 05, 05]
-251F; [0C AD C6, 05, 05]
+2574; [0C B1 1F, 05, 05]
-2520; [0C AD CD, 05, 05]
+2575; [0C B1 26, 05, 05]
-2521; [0C AD D4, 05, 05]
+2576; [0C B1 2D, 05, 05]
-2522; [0C AD DB, 05, 05]
+2577; [0C B1 34, 05, 05]
-2523; [0C AD E2, 05, 05]
+2578; [0C B1 3B, 05, 05]
-2524; [0C AD E9, 05, 05]
+2579; [0C B1 42, 05, 05]
-2525; [0C AD F0, 05, 05]
+257A; [0C B1 49, 05, 05]
-2526; [0C AD F7, 05, 05]
+257B; [0C B1 50, 05, 05]
-2527; [0C AD FE, 05, 05]
+257C; [0C B1 57, 05, 05]
-2528; [0C AE 07, 05, 05]
+257D; [0C B1 5E, 05, 05]
-2529; [0C AE 0E, 05, 05]
+257E; [0C B1 65, 05, 05]
-252A; [0C AE 15, 05, 05]
+257F; [0C B1 6C, 05, 05]
-252B; [0C AE 1C, 05, 05]
+2580; [0C B1 73, 05, 05]
-252C; [0C AE 23, 05, 05]
+2581; [0C B1 7A, 05, 05]
-252D; [0C AE 2A, 05, 05]
+2582; [0C B1 81, 05, 05]
-252E; [0C AE 31, 05, 05]
+2583; [0C B1 88, 05, 05]
-252F; [0C AE 38, 05, 05]
+2584; [0C B1 8F, 05, 05]
-2530; [0C AE 3F, 05, 05]
+2585; [0C B1 96, 05, 05]
-2531; [0C AE 46, 05, 05]
+2586; [0C B1 9D, 05, 05]
-2532; [0C AE 4D, 05, 05]
+2587; [0C B1 A4, 05, 05]
-2533; [0C AE 54, 05, 05]
+2588; [0C B1 AB, 05, 05]
-2534; [0C AE 5B, 05, 05]
+2589; [0C B1 B2, 05, 05]
-2535; [0C AE 62, 05, 05]
+258A; [0C B1 B9, 05, 05]
-2536; [0C AE 69, 05, 05]
+258B; [0C B1 C0, 05, 05]
-2537; [0C AE 70, 05, 05]
+258C; [0C B1 C7, 05, 05]
-2538; [0C AE 77, 05, 05]
+258D; [0C B1 CE, 05, 05]
-2539; [0C AE 7E, 05, 05]
+258E; [0C B1 D5, 05, 05]
-253A; [0C AE 85, 05, 05]
+258F; [0C B1 DC, 05, 05]
-253B; [0C AE 8C, 05, 05]
+2590; [0C B1 E3, 05, 05]
-253C; [0C AE 93, 05, 05]
+2591; [0C B1 EA, 05, 05]
-253D; [0C AE 9A, 05, 05]
+2592; [0C B1 F1, 05, 05]
-253E; [0C AE A1, 05, 05]
+2593; [0C B1 F8, 05, 05]
-253F; [0C AE A8, 05, 05]
+2594; [0C B1 FF, 05, 05]
-2540; [0C AE AF, 05, 05]
+2595; [0C B2 08, 05, 05]
-2541; [0C AE B6, 05, 05]
+2596; [0C B2 0F, 05, 05]
-2542; [0C AE BD, 05, 05]
+2597; [0C B2 16, 05, 05]
-2543; [0C AE C4, 05, 05]
+2598; [0C B2 1D, 05, 05]
-2544; [0C AE CB, 05, 05]
+2599; [0C B2 24, 05, 05]
-2545; [0C AE D2, 05, 05]
+259A; [0C B2 2B, 05, 05]
-2546; [0C AE D9, 05, 05]
+259B; [0C B2 32, 05, 05]
-2547; [0C AE E0, 05, 05]
+259C; [0C B2 39, 05, 05]
-2548; [0C AE E7, 05, 05]
+259D; [0C B2 40, 05, 05]
-2549; [0C AE EE, 05, 05]
+259E; [0C B2 47, 05, 05]
-254A; [0C AE F5, 05, 05]
+259F; [0C B2 4E, 05, 05]
-254B; [0C AE FC, 05, 05]
+25A0; [0C B4, 05, 05]
+FFED; [0C B4, 05, A0]
-254C; [0C AF 05, 05, 05]
+25A1; [0C B6 02, 05, 05]
-254D; [0C AF 0C, 05, 05]
+25A2; [0C B6 09, 05, 05]
-254E; [0C AF 13, 05, 05]
+25A3; [0C B6 10, 05, 05]
-254F; [0C AF 1A, 05, 05]
+25A4; [0C B6 17, 05, 05]
-2550; [0C AF 21, 05, 05]
+25A5; [0C B6 1E, 05, 05]
-2551; [0C AF 28, 05, 05]
+25A6; [0C B6 25, 05, 05]
-2552; [0C AF 2F, 05, 05]
+25A7; [0C B6 2C, 05, 05]
-2553; [0C AF 36, 05, 05]
+25A8; [0C B6 33, 05, 05]
-2554; [0C AF 3D, 05, 05]
+25A9; [0C B6 3A, 05, 05]
-2555; [0C AF 44, 05, 05]
+25AA; [0C B6 41, 05, 05]
-2556; [0C AF 4B, 05, 05]
+25AB; [0C B6 48, 05, 05]
-2557; [0C AF 52, 05, 05]
+25AC; [0C B6 4F, 05, 05]
-2558; [0C AF 59, 05, 05]
+25AD; [0C B6 56, 05, 05]
-2559; [0C AF 60, 05, 05]
+25AE; [0C B6 5D, 05, 05]
-255A; [0C AF 67, 05, 05]
+25AF; [0C B6 64, 05, 05]
-255B; [0C AF 6E, 05, 05]
+25B0; [0C B6 6B, 05, 05]
-255C; [0C AF 75, 05, 05]
+25B1; [0C B6 72, 05, 05]
-255D; [0C AF 7C, 05, 05]
+25B2; [0C B6 79, 05, 05]
-255E; [0C AF 83, 05, 05]
+25B3; [0C B6 80, 05, 05]
-255F; [0C AF 8A, 05, 05]
+25B4; [0C B6 87, 05, 05]
-2560; [0C AF 91, 05, 05]
+25B5; [0C B6 8E, 05, 05]
-2561; [0C AF 98, 05, 05]
+25B6; [0C B6 95, 05, 05]
-2562; [0C AF 9F, 05, 05]
+25B7; [0C B6 9C, 05, 05]
-2563; [0C AF A6, 05, 05]
+25B8; [0C B6 A3, 05, 05]
-2564; [0C AF AD, 05, 05]
+25B9; [0C B6 AA, 05, 05]
-2565; [0C AF B4, 05, 05]
+25BA; [0C B6 B1, 05, 05]
-2566; [0C AF BB, 05, 05]
+25BB; [0C B6 B8, 05, 05]
-2567; [0C AF C2, 05, 05]
+25BC; [0C B6 BF, 05, 05]
-2568; [0C AF C9, 05, 05]
+25BD; [0C B6 C6, 05, 05]
-2569; [0C AF D0, 05, 05]
+25BE; [0C B6 CD, 05, 05]
-256A; [0C AF D7, 05, 05]
+25BF; [0C B6 D4, 05, 05]
-256B; [0C AF DE, 05, 05]
+25C0; [0C B6 DB, 05, 05]
-256C; [0C AF E5, 05, 05]
+25C1; [0C B6 E2, 05, 05]
-256D; [0C AF EC, 05, 05]
+25C2; [0C B6 E9, 05, 05]
-256E; [0C AF F3, 05, 05]
+25C3; [0C B6 F0, 05, 05]
-256F; [0C AF FA, 05, 05]
+25C4; [0C B6 F7, 05, 05]
-2570; [0C B0 03, 05, 05]
+25C5; [0C B6 FE, 05, 05]
-2571; [0C B0 0A, 05, 05]
+25C6; [0C B7 07, 05, 05]
-2572; [0C B0 11, 05, 05]
+25C7; [0C B7 0E, 05, 05]
-2573; [0C B0 18, 05, 05]
+25C8; [0C B7 15, 05, 05]
-2574; [0C B0 1F, 05, 05]
+25C9; [0C B7 1C, 05, 05]
-2575; [0C B0 26, 05, 05]
+25CA; [0C B7 23, 05, 05]
-2576; [0C B0 2D, 05, 05]
+25CB; [0C B9, 05, 05]
+FFEE; [0C B9, 05, A0]
-2577; [0C B0 34, 05, 05]
+25CC; [0C BB 02, 05, 05]
-2578; [0C B0 3B, 05, 05]
+25CD; [0C BB 09, 05, 05]
-2579; [0C B0 42, 05, 05]
+25CE; [0C BB 10, 05, 05]
-257A; [0C B0 49, 05, 05]
+25CF; [0C BB 17, 05, 05]
-257B; [0C B0 50, 05, 05]
+25D0; [0C BB 1E, 05, 05]
-257C; [0C B0 57, 05, 05]
+25D1; [0C BB 25, 05, 05]
-257D; [0C B0 5E, 05, 05]
+25D2; [0C BB 2C, 05, 05]
-257E; [0C B0 65, 05, 05]
+25D3; [0C BB 33, 05, 05]
-257F; [0C B0 6C, 05, 05]
+25D4; [0C BB 3A, 05, 05]
-2580; [0C B0 73, 05, 05]
+25D5; [0C BB 41, 05, 05]
-2581; [0C B0 7A, 05, 05]
+25D6; [0C BB 48, 05, 05]
-2582; [0C B0 81, 05, 05]
+25D7; [0C BB 4F, 05, 05]
-2583; [0C B0 88, 05, 05]
+25D8; [0C BB 56, 05, 05]
-2584; [0C B0 8F, 05, 05]
+25D9; [0C BB 5D, 05, 05]
-2585; [0C B0 96, 05, 05]
+25DA; [0C BB 64, 05, 05]
-2586; [0C B0 9D, 05, 05]
+25DB; [0C BB 6B, 05, 05]
-2587; [0C B0 A4, 05, 05]
+25DC; [0C BB 72, 05, 05]
-2588; [0C B0 AB, 05, 05]
+25DD; [0C BB 79, 05, 05]
-2589; [0C B0 B2, 05, 05]
+25DE; [0C BB 80, 05, 05]
-258A; [0C B0 B9, 05, 05]
+25DF; [0C BB 87, 05, 05]
-258B; [0C B0 C0, 05, 05]
+25E0; [0C BB 8E, 05, 05]
-258C; [0C B0 C7, 05, 05]
+25E1; [0C BB 95, 05, 05]
-258D; [0C B0 CE, 05, 05]
+25E2; [0C BB 9C, 05, 05]
-258E; [0C B0 D5, 05, 05]
+25E3; [0C BB A3, 05, 05]
-258F; [0C B0 DC, 05, 05]
+25E4; [0C BB AA, 05, 05]
-2590; [0C B0 E3, 05, 05]
+25E5; [0C BB B1, 05, 05]
-2591; [0C B0 EA, 05, 05]
+25E6; [0C BB B8, 05, 05]
-2592; [0C B0 F1, 05, 05]
+25E7; [0C BB BF, 05, 05]
-2593; [0C B0 F8, 05, 05]
+25E8; [0C BB C6, 05, 05]
-2594; [0C B0 FF, 05, 05]
+25E9; [0C BB CD, 05, 05]
-2595; [0C B1 08, 05, 05]
+25EA; [0C BB D4, 05, 05]
-2596; [0C B1 0F, 05, 05]
+25EB; [0C BB DB, 05, 05]
-2597; [0C B1 16, 05, 05]
+25EC; [0C BB E2, 05, 05]
-2598; [0C B1 1D, 05, 05]
+25ED; [0C BB E9, 05, 05]
-2599; [0C B1 24, 05, 05]
+25EE; [0C BB F0, 05, 05]
-259A; [0C B1 2B, 05, 05]
+25EF; [0C BB F7, 05, 05]
-259B; [0C B1 32, 05, 05]
+25F0; [0C BB FE, 05, 05]
-259C; [0C B1 39, 05, 05]
+25F1; [0C BC 07, 05, 05]
-259D; [0C B1 40, 05, 05]
+25F2; [0C BC 0E, 05, 05]
-259E; [0C B1 47, 05, 05]
+25F3; [0C BC 15, 05, 05]
-259F; [0C B1 4E, 05, 05]
+25F4; [0C BC 1C, 05, 05]
-25A0; [0C B3, 05, 05]
-FFED; [0C B3, 05, A0]
+25F5; [0C BC 23, 05, 05]
-25A1; [0C B5 02, 05, 05]
+25F6; [0C BC 2A, 05, 05]
-25A2; [0C B5 09, 05, 05]
+25F7; [0C BC 31, 05, 05]
-25A3; [0C B5 10, 05, 05]
+25F8; [0C BC 38, 05, 05]
-25A4; [0C B5 17, 05, 05]
+25F9; [0C BC 3F, 05, 05]
-25A5; [0C B5 1E, 05, 05]
+25FA; [0C BC 46, 05, 05]
-25A6; [0C B5 25, 05, 05]
+25FB; [0C BC 4D, 05, 05]
-25A7; [0C B5 2C, 05, 05]
+25FC; [0C BC 54, 05, 05]
-25A8; [0C B5 33, 05, 05]
+25FD; [0C BC 5B, 05, 05]
-25A9; [0C B5 3A, 05, 05]
+25FE; [0C BC 62, 05, 05]
-25AA; [0C B5 41, 05, 05]
+25FF; [0C BC 69, 05, 05]
-25AB; [0C B5 48, 05, 05]
+2600; [0C BC 70, 05, 05]
-25AC; [0C B5 4F, 05, 05]
+2601; [0C BC 77, 05, 05]
-25AD; [0C B5 56, 05, 05]
+2602; [0C BC 7E, 05, 05]
-25AE; [0C B5 5D, 05, 05]
+2603; [0C BC 85, 05, 05]
-25AF; [0C B5 64, 05, 05]
+2604; [0C BC 8C, 05, 05]
-25B0; [0C B5 6B, 05, 05]
+2605; [0C BC 93, 05, 05]
-25B1; [0C B5 72, 05, 05]
+2606; [0C BC 9A, 05, 05]
-25B2; [0C B5 79, 05, 05]
+2607; [0C BC A1, 05, 05]
-25B3; [0C B5 80, 05, 05]
+2608; [0C BC A8, 05, 05]
-25B4; [0C B5 87, 05, 05]
+2609; [0C BC AF, 05, 05]
-25B5; [0C B5 8E, 05, 05]
+260A; [0C BC B6, 05, 05]
-25B6; [0C B5 95, 05, 05]
+260B; [0C BC BD, 05, 05]
-25B7; [0C B5 9C, 05, 05]
+260C; [0C BC C4, 05, 05]
-25B8; [0C B5 A3, 05, 05]
+260D; [0C BC CB, 05, 05]
-25B9; [0C B5 AA, 05, 05]
+260E; [0C BC D2, 05, 05]
-25BA; [0C B5 B1, 05, 05]
+260F; [0C BC D9, 05, 05]
-25BB; [0C B5 B8, 05, 05]
+2610; [0C BC E0, 05, 05]
-25BC; [0C B5 BF, 05, 05]
+2611; [0C BC E7, 05, 05]
-25BD; [0C B5 C6, 05, 05]
+2612; [0C BC EE, 05, 05]
-25BE; [0C B5 CD, 05, 05]
+2613; [0C BC F5, 05, 05]
-25BF; [0C B5 D4, 05, 05]
+2614; [0C BC FC, 05, 05]
-25C0; [0C B5 DB, 05, 05]
+2615; [0C BD 05, 05, 05]
-25C1; [0C B5 E2, 05, 05]
+2616; [0C BD 0C, 05, 05]
-25C2; [0C B5 E9, 05, 05]
+2617; [0C BD 13, 05, 05]
-25C3; [0C B5 F0, 05, 05]
+2618; [0C BD 1A, 05, 05]
-25C4; [0C B5 F7, 05, 05]
+2619; [0C BD 21, 05, 05]
-25C5; [0C B5 FE, 05, 05]
+261A; [0C BD 28, 05, 05]
-25C6; [0C B6 07, 05, 05]
+261B; [0C BD 2F, 05, 05]
-25C7; [0C B6 0E, 05, 05]
+261C; [0C BD 36, 05, 05]
-25C8; [0C B6 15, 05, 05]
+261D; [0C BD 3D, 05, 05]
-25C9; [0C B6 1C, 05, 05]
+261E; [0C BD 44, 05, 05]
-25CA; [0C B6 23, 05, 05]
+261F; [0C BD 4B, 05, 05]
-25CB; [0C B8, 05, 05]
-FFEE; [0C B8, 05, A0]
+2620; [0C BD 52, 05, 05]
-25CC; [0C BA 02, 05, 05]
+2621; [0C BD 59, 05, 05]
-25CD; [0C BA 09, 05, 05]
+2622; [0C BD 60, 05, 05]
-25CE; [0C BA 10, 05, 05]
+2623; [0C BD 67, 05, 05]
-25CF; [0C BA 17, 05, 05]
+2624; [0C BD 6E, 05, 05]
-25D0; [0C BA 1E, 05, 05]
+2625; [0C BD 75, 05, 05]
-25D1; [0C BA 25, 05, 05]
+2626; [0C BD 7C, 05, 05]
-25D2; [0C BA 2C, 05, 05]
+2627; [0C BD 83, 05, 05]
-25D3; [0C BA 33, 05, 05]
+2628; [0C BD 8A, 05, 05]
-25D4; [0C BA 3A, 05, 05]
+2629; [0C BD 91, 05, 05]
-25D5; [0C BA 41, 05, 05]
+262A; [0C BD 98, 05, 05]
-25D6; [0C BA 48, 05, 05]
+262B; [0C BD 9F, 05, 05]
-25D7; [0C BA 4F, 05, 05]
+262C; [0C BD A6, 05, 05]
-25D8; [0C BA 56, 05, 05]
+262D; [0C BD AD, 05, 05]
-25D9; [0C BA 5D, 05, 05]
+262E; [0C BD B4, 05, 05]
-25DA; [0C BA 64, 05, 05]
+262F; [0C BD BB, 05, 05]
-25DB; [0C BA 6B, 05, 05]
+2638; [0C BD C2, 05, 05]
-25DC; [0C BA 72, 05, 05]
+2639; [0C BD C9, 05, 05]
-25DD; [0C BA 79, 05, 05]
+263A; [0C BD D0, 05, 05]
-25DE; [0C BA 80, 05, 05]
+263B; [0C BD D7, 05, 05]
-25DF; [0C BA 87, 05, 05]
+263C; [0C BD DE, 05, 05]
-25E0; [0C BA 8E, 05, 05]
+263D; [0C BD E5, 05, 05]
-25E1; [0C BA 95, 05, 05]
+263E; [0C BD EC, 05, 05]
-25E2; [0C BA 9C, 05, 05]
+263F; [0C BD F3, 05, 05]
-25E3; [0C BA A3, 05, 05]
+2640; [0C BD FA, 05, 05]
-25E4; [0C BA AA, 05, 05]
+2641; [0C BE 03, 05, 05]
-25E5; [0C BA B1, 05, 05]
+2642; [0C BE 0A, 05, 05]
-25E6; [0C BA B8, 05, 05]
+2643; [0C BE 11, 05, 05]
-25E7; [0C BA BF, 05, 05]
+2644; [0C BE 18, 05, 05]
-25E8; [0C BA C6, 05, 05]
+2645; [0C BE 1F, 05, 05]
-25E9; [0C BA CD, 05, 05]
+2646; [0C BE 26, 05, 05]
-25EA; [0C BA D4, 05, 05]
+2647; [0C BE 2D, 05, 05]
-25EB; [0C BA DB, 05, 05]
+2648; [0C BE 34, 05, 05]
-25EC; [0C BA E2, 05, 05]
+2649; [0C BE 3B, 05, 05]
-25ED; [0C BA E9, 05, 05]
+264A; [0C BE 42, 05, 05]
-25EE; [0C BA F0, 05, 05]
+264B; [0C BE 49, 05, 05]
-25EF; [0C BA F7, 05, 05]
+264C; [0C BE 50, 05, 05]
-25F0; [0C BA FE, 05, 05]
+264D; [0C BE 57, 05, 05]
-25F1; [0C BB 07, 05, 05]
+264E; [0C BE 5E, 05, 05]
-25F2; [0C BB 0E, 05, 05]
+264F; [0C BE 65, 05, 05]
-25F3; [0C BB 15, 05, 05]
+2650; [0C BE 6C, 05, 05]
-25F4; [0C BB 1C, 05, 05]
+2651; [0C BE 73, 05, 05]
-25F5; [0C BB 23, 05, 05]
+2652; [0C BE 7A, 05, 05]
-25F6; [0C BB 2A, 05, 05]
+2653; [0C BE 81, 05, 05]
-25F7; [0C BB 31, 05, 05]
+2654; [0C BE 88, 05, 05]
-25F8; [0C BB 38, 05, 05]
+2655; [0C BE 8F, 05, 05]
-25F9; [0C BB 3F, 05, 05]
+2656; [0C BE 96, 05, 05]
-25FA; [0C BB 46, 05, 05]
+2657; [0C BE 9D, 05, 05]
-25FB; [0C BB 4D, 05, 05]
+2658; [0C BE A4, 05, 05]
-25FC; [0C BB 54, 05, 05]
+2659; [0C BE AB, 05, 05]
-25FD; [0C BB 5B, 05, 05]
+265A; [0C BE B2, 05, 05]
-25FE; [0C BB 62, 05, 05]
+265B; [0C BE B9, 05, 05]
-25FF; [0C BB 69, 05, 05]
+265C; [0C BE C0, 05, 05]
-2600; [0C BB 70, 05, 05]
+265D; [0C BE C7, 05, 05]
-2601; [0C BB 77, 05, 05]
+265E; [0C BE CE, 05, 05]
-2602; [0C BB 7E, 05, 05]
+265F; [0C BE D5, 05, 05]
-2603; [0C BB 85, 05, 05]
+2660; [0C BE DC, 05, 05]
-2604; [0C BB 8C, 05, 05]
+2661; [0C BE E3, 05, 05]
-2605; [0C BB 93, 05, 05]
+2662; [0C BE EA, 05, 05]
-2606; [0C BB 9A, 05, 05]
+2663; [0C BE F1, 05, 05]
-2607; [0C BB A1, 05, 05]
+2664; [0C BE F8, 05, 05]
-2608; [0C BB A8, 05, 05]
+2665; [0C BE FF, 05, 05]
-2609; [0C BB AF, 05, 05]
+2666; [0C BF 08, 05, 05]
-260A; [0C BB B6, 05, 05]
+2667; [0C BF 0F, 05, 05]
-260B; [0C BB BD, 05, 05]
+2668; [0C BF 16, 05, 05]
-260C; [0C BB C4, 05, 05]
+2669; [0C BF 1D, 05, 05]
-260D; [0C BB CB, 05, 05]
+266A; [0C BF 24, 05, 05]
-260E; [0C BB D2, 05, 05]
+266B; [0C BF 2B, 05, 05]
-260F; [0C BB D9, 05, 05]
+266C; [0C BF 32, 05, 05]
-2610; [0C BB E0, 05, 05]
+2670; [0C BF 39, 05, 05]
-2611; [0C BB E7, 05, 05]
+2671; [0C BF 40, 05, 05]
-2612; [0C BB EE, 05, 05]
+2672; [0C BF 47, 05, 05]
-2613; [0C BB F5, 05, 05]
+2673; [0C BF 4E, 05, 05]
-2614; [0C BB FC, 05, 05]
+2674; [0C BF 55, 05, 05]
-2615; [0C BC 05, 05, 05]
+2675; [0C BF 5C, 05, 05]
-2616; [0C BC 0C, 05, 05]
+2676; [0C BF 63, 05, 05]
-2617; [0C BC 13, 05, 05]
+2677; [0C BF 6A, 05, 05]
-2618; [0C BC 1A, 05, 05]
+2678; [0C BF 71, 05, 05]
-2619; [0C BC 21, 05, 05]
+2679; [0C BF 78, 05, 05]
-261A; [0C BC 28, 05, 05]
+267A; [0C BF 7F, 05, 05]
-261B; [0C BC 2F, 05, 05]
+267B; [0C BF 86, 05, 05]
-261C; [0C BC 36, 05, 05]
+267C; [0C BF 8D, 05, 05]
-261D; [0C BC 3D, 05, 05]
+267D; [0C BF 94, 05, 05]
-261E; [0C BC 44, 05, 05]
+267E; [0C BF 9B, 05, 05]
-261F; [0C BC 4B, 05, 05]
+267F; [0C BF A2, 05, 05]
-2620; [0C BC 52, 05, 05]
+2680; [0C BF A9, 05, 05]
-2621; [0C BC 59, 05, 05]
+2681; [0C BF B0, 05, 05]
-2622; [0C BC 60, 05, 05]
+2682; [0C BF B7, 05, 05]
-2623; [0C BC 67, 05, 05]
+2683; [0C BF BE, 05, 05]
-2624; [0C BC 6E, 05, 05]
+2684; [0C BF C5, 05, 05]
-2625; [0C BC 75, 05, 05]
+2685; [0C BF CC, 05, 05]
-2626; [0C BC 7C, 05, 05]
+2686; [0C BF D3, 05, 05]
-2627; [0C BC 83, 05, 05]
+2687; [0C BF DA, 05, 05]
-2628; [0C BC 8A, 05, 05]
+2688; [0C BF E1, 05, 05]
-2629; [0C BC 91, 05, 05]
+2689; [0C BF E8, 05, 05]
-262A; [0C BC 98, 05, 05]
+2690; [0C BF EF, 05, 05]
-262B; [0C BC 9F, 05, 05]
+2691; [0C BF F6, 05, 05]
-262C; [0C BC A6, 05, 05]
+2692; [0C BF FD, 05, 05]
-262D; [0C BC AD, 05, 05]
+2693; [0C C0 06, 05, 05]
-262E; [0C BC B4, 05, 05]
+2694; [0C C0 0D, 05, 05]
-262F; [0C BC BB, 05, 05]
+2695; [0C C0 14, 05, 05]
-2638; [0C BC C2, 05, 05]
+2696; [0C C0 1B, 05, 05]
-2639; [0C BC C9, 05, 05]
+2697; [0C C0 22, 05, 05]
-263A; [0C BC D0, 05, 05]
+2698; [0C C0 29, 05, 05]
-263B; [0C BC D7, 05, 05]
+2699; [0C C0 30, 05, 05]
-263C; [0C BC DE, 05, 05]
+269A; [0C C0 37, 05, 05]
-263D; [0C BC E5, 05, 05]
+269B; [0C C0 3E, 05, 05]
-263E; [0C BC EC, 05, 05]
+269C; [0C C0 45, 05, 05]
-263F; [0C BC F3, 05, 05]
+269D; [0C C0 4C, 05, 05]
-2640; [0C BC FA, 05, 05]
+269E; [0C C0 53, 05, 05]
-2641; [0C BD 03, 05, 05]
+269F; [0C C0 5A, 05, 05]
-2642; [0C BD 0A, 05, 05]
+26A0; [0C C0 61, 05, 05]
-2643; [0C BD 11, 05, 05]
+26A1; [0C C0 68, 05, 05]
-2644; [0C BD 18, 05, 05]
+26A2; [0C C0 6F, 05, 05]
-2645; [0C BD 1F, 05, 05]
+26A3; [0C C0 76, 05, 05]
-2646; [0C BD 26, 05, 05]
+26A4; [0C C0 7D, 05, 05]
-2647; [0C BD 2D, 05, 05]
+26A5; [0C C0 84, 05, 05]
-2648; [0C BD 34, 05, 05]
+26A6; [0C C0 8B, 05, 05]
-2649; [0C BD 3B, 05, 05]
+26A7; [0C C0 92, 05, 05]
-264A; [0C BD 42, 05, 05]
+26A8; [0C C0 99, 05, 05]
-264B; [0C BD 49, 05, 05]
+26A9; [0C C0 A0, 05, 05]
-264C; [0C BD 50, 05, 05]
+26AA; [0C C0 A7, 05, 05]
-264D; [0C BD 57, 05, 05]
+26AB; [0C C0 AE, 05, 05]
-264E; [0C BD 5E, 05, 05]
+26AC; [0C C0 B5, 05, 05]
-264F; [0C BD 65, 05, 05]
+26AD; [0C C0 BC, 05, 05]
-2650; [0C BD 6C, 05, 05]
+26AE; [0C C0 C3, 05, 05]
-2651; [0C BD 73, 05, 05]
+26AF; [0C C0 CA, 05, 05]
-2652; [0C BD 7A, 05, 05]
+26B0; [0C C0 D1, 05, 05]
-2653; [0C BD 81, 05, 05]
+26B1; [0C C0 D8, 05, 05]
-2654; [0C BD 88, 05, 05]
+26B2; [0C C0 DF, 05, 05]
-2655; [0C BD 8F, 05, 05]
+26B3; [0C C0 E6, 05, 05]
-2656; [0C BD 96, 05, 05]
+26B4; [0C C0 ED, 05, 05]
-2657; [0C BD 9D, 05, 05]
+26B5; [0C C0 F4, 05, 05]
-2658; [0C BD A4, 05, 05]
+26B6; [0C C0 FB, 05, 05]
-2659; [0C BD AB, 05, 05]
+26B7; [0C C1 04, 05, 05]
-265A; [0C BD B2, 05, 05]
+26B8; [0C C1 0B, 05, 05]
-265B; [0C BD B9, 05, 05]
+26B9; [0C C1 12, 05, 05]
-265C; [0C BD C0, 05, 05]
+26BA; [0C C1 19, 05, 05]
-265D; [0C BD C7, 05, 05]
+26BB; [0C C1 20, 05, 05]
-265E; [0C BD CE, 05, 05]
+26BC; [0C C1 27, 05, 05]
-265F; [0C BD D5, 05, 05]
+26BD; [0C C1 2E, 05, 05]
-2660; [0C BD DC, 05, 05]
+26BE; [0C C1 35, 05, 05]
-2661; [0C BD E3, 05, 05]
+26BF; [0C C1 3C, 05, 05]
-2662; [0C BD EA, 05, 05]
+26C0; [0C C1 43, 05, 05]
-2663; [0C BD F1, 05, 05]
+26C1; [0C C1 4A, 05, 05]
-2664; [0C BD F8, 05, 05]
+26C2; [0C C1 51, 05, 05]
-2665; [0C BD FF, 05, 05]
+26C3; [0C C1 58, 05, 05]
-2666; [0C BE 08, 05, 05]
+26C4; [0C C1 5F, 05, 05]
-2667; [0C BE 0F, 05, 05]
+26C5; [0C C1 66, 05, 05]
-2668; [0C BE 16, 05, 05]
+26C6; [0C C1 6D, 05, 05]
-2669; [0C BE 1D, 05, 05]
+26C7; [0C C1 74, 05, 05]
-266A; [0C BE 24, 05, 05]
+26C8; [0C C1 7B, 05, 05]
-266B; [0C BE 2B, 05, 05]
+26C9; [0C C1 82, 05, 05]
-266C; [0C BE 32, 05, 05]
+26CA; [0C C1 89, 05, 05]
-2670; [0C BE 39, 05, 05]
+26CB; [0C C1 90, 05, 05]
-2671; [0C BE 40, 05, 05]
+26CC; [0C C1 97, 05, 05]
-2672; [0C BE 47, 05, 05]
+26CD; [0C C1 9E, 05, 05]
-2673; [0C BE 4E, 05, 05]
+26CE; [0C C1 A5, 05, 05]
-2674; [0C BE 55, 05, 05]
+26CF; [0C C1 AC, 05, 05]
-2675; [0C BE 5C, 05, 05]
+26D0; [0C C1 B3, 05, 05]
-2676; [0C BE 63, 05, 05]
+26D1; [0C C1 BA, 05, 05]
-2677; [0C BE 6A, 05, 05]
+26D2; [0C C1 C1, 05, 05]
-2678; [0C BE 71, 05, 05]
+26D3; [0C C1 C8, 05, 05]
-2679; [0C BE 78, 05, 05]
+26D4; [0C C1 CF, 05, 05]
-267A; [0C BE 7F, 05, 05]
+26D5; [0C C1 D6, 05, 05]
-267B; [0C BE 86, 05, 05]
+26D6; [0C C1 DD, 05, 05]
-267C; [0C BE 8D, 05, 05]
+26D7; [0C C1 E4, 05, 05]
-267D; [0C BE 94, 05, 05]
+26D8; [0C C1 EB, 05, 05]
-267E; [0C BE 9B, 05, 05]
+26D9; [0C C1 F2, 05, 05]
-267F; [0C BE A2, 05, 05]
+26DA; [0C C1 F9, 05, 05]
-2680; [0C BE A9, 05, 05]
+26DB; [0C C2 02, 05, 05]
-2681; [0C BE B0, 05, 05]
+26DC; [0C C2 09, 05, 05]
-2682; [0C BE B7, 05, 05]
+26DD; [0C C2 10, 05, 05]
-2683; [0C BE BE, 05, 05]
+26DE; [0C C2 17, 05, 05]
-2684; [0C BE C5, 05, 05]
+26DF; [0C C2 1E, 05, 05]
-2685; [0C BE CC, 05, 05]
+26E0; [0C C2 25, 05, 05]
-2686; [0C BE D3, 05, 05]
+26E1; [0C C2 2C, 05, 05]
-2687; [0C BE DA, 05, 05]
+26E2; [0C C2 33, 05, 05]
-2688; [0C BE E1, 05, 05]
+26E3; [0C C2 3A, 05, 05]
-2689; [0C BE E8, 05, 05]
+26E4; [0C C2 41, 05, 05]
-2690; [0C BE EF, 05, 05]
+26E5; [0C C2 48, 05, 05]
-2691; [0C BE F6, 05, 05]
+26E6; [0C C2 4F, 05, 05]
-2692; [0C BE FD, 05, 05]
+26E7; [0C C2 56, 05, 05]
-2693; [0C BF 06, 05, 05]
+26E8; [0C C2 5D, 05, 05]
-2694; [0C BF 0D, 05, 05]
+26E9; [0C C2 64, 05, 05]
-2695; [0C BF 14, 05, 05]
+26EA; [0C C2 6B, 05, 05]
-2696; [0C BF 1B, 05, 05]
+26EB; [0C C2 72, 05, 05]
-2697; [0C BF 22, 05, 05]
+26EC; [0C C2 79, 05, 05]
-2698; [0C BF 29, 05, 05]
+26ED; [0C C2 80, 05, 05]
-2699; [0C BF 30, 05, 05]
+26EE; [0C C2 87, 05, 05]
-269A; [0C BF 37, 05, 05]
+26EF; [0C C2 8E, 05, 05]
-269B; [0C BF 3E, 05, 05]
+26F0; [0C C2 95, 05, 05]
-269C; [0C BF 45, 05, 05]
+26F1; [0C C2 9C, 05, 05]
-269D; [0C BF 4C, 05, 05]
+26F2; [0C C2 A3, 05, 05]
-269E; [0C BF 53, 05, 05]
+26F3; [0C C2 AA, 05, 05]
-269F; [0C BF 5A, 05, 05]
+26F4; [0C C2 B1, 05, 05]
-26A0; [0C BF 61, 05, 05]
+26F5; [0C C2 B8, 05, 05]
-26A1; [0C BF 68, 05, 05]
+26F6; [0C C2 BF, 05, 05]
-26A2; [0C BF 6F, 05, 05]
+26F7; [0C C2 C6, 05, 05]
-26A3; [0C BF 76, 05, 05]
+26F8; [0C C2 CD, 05, 05]
-26A4; [0C BF 7D, 05, 05]
+26F9; [0C C2 D4, 05, 05]
-26A5; [0C BF 84, 05, 05]
+26FA; [0C C2 DB, 05, 05]
-26A6; [0C BF 8B, 05, 05]
+26FB; [0C C2 E2, 05, 05]
-26A7; [0C BF 92, 05, 05]
+26FC; [0C C2 E9, 05, 05]
-26A8; [0C BF 99, 05, 05]
+26FD; [0C C2 F0, 05, 05]
-26A9; [0C BF A0, 05, 05]
+26FE; [0C C2 F7, 05, 05]
-26AA; [0C BF A7, 05, 05]
+26FF; [0C C2 FE, 05, 05]
-26AB; [0C BF AE, 05, 05]
+1F1E6; [0C C3 07, 05, 05]
-26AC; [0C BF B5, 05, 05]
+1F1E7; [0C C3 0E, 05, 05]
-26AD; [0C BF BC, 05, 05]
+1F1E8; [0C C3 15, 05, 05]
-26AE; [0C BF C3, 05, 05]
+1F1E9; [0C C3 1C, 05, 05]
-26AF; [0C BF CA, 05, 05]
+1F1EA; [0C C3 23, 05, 05]
-26B0; [0C BF D1, 05, 05]
+1F1EB; [0C C3 2A, 05, 05]
-26B1; [0C BF D8, 05, 05]
+1F1EC; [0C C3 31, 05, 05]
-26B2; [0C BF DF, 05, 05]
+1F1ED; [0C C3 38, 05, 05]
-26B3; [0C BF E6, 05, 05]
+1F1EE; [0C C3 3F, 05, 05]
-26B4; [0C BF ED, 05, 05]
+1F1EF; [0C C3 46, 05, 05]
-26B5; [0C BF F4, 05, 05]
+1F1F0; [0C C3 4D, 05, 05]
-26B6; [0C BF FB, 05, 05]
+1F1F1; [0C C3 54, 05, 05]
-26B7; [0C C0 04, 05, 05]
+1F1F2; [0C C3 5B, 05, 05]
-26B8; [0C C0 0B, 05, 05]
+1F1F3; [0C C3 62, 05, 05]
-26B9; [0C C0 12, 05, 05]
+1F1F4; [0C C3 69, 05, 05]
-26BA; [0C C0 19, 05, 05]
+1F1F5; [0C C3 70, 05, 05]
-26BB; [0C C0 20, 05, 05]
+1F1F6; [0C C3 77, 05, 05]
-26BC; [0C C0 27, 05, 05]
+1F1F7; [0C C3 7E, 05, 05]
-26BD; [0C C0 2E, 05, 05]
+1F1F8; [0C C3 85, 05, 05]
-26BE; [0C C0 35, 05, 05]
+1F1F9; [0C C3 8C, 05, 05]
-26BF; [0C C0 3C, 05, 05]
+1F1FA; [0C C3 93, 05, 05]
-26C0; [0C C0 43, 05, 05]
+1F1FB; [0C C3 9A, 05, 05]
-26C1; [0C C0 4A, 05, 05]
+1F1FC; [0C C3 A1, 05, 05]
-26C2; [0C C0 51, 05, 05]
+1F1FD; [0C C3 A8, 05, 05]
-26C3; [0C C0 58, 05, 05]
+1F1FE; [0C C3 AF, 05, 05]
-26C4; [0C C0 5F, 05, 05]
+1F1FF; [0C C3 B6, 05, 05]
-26C5; [0C C0 66, 05, 05]
+2700; [0C C3 BD, 05, 05]
-26C6; [0C C0 6D, 05, 05]
+2701; [0C C3 C4, 05, 05]
-26C7; [0C C0 74, 05, 05]
+2702; [0C C3 CB, 05, 05]
-26C8; [0C C0 7B, 05, 05]
+2703; [0C C3 D2, 05, 05]
-26C9; [0C C0 82, 05, 05]
+2704; [0C C3 D9, 05, 05]
-26CA; [0C C0 89, 05, 05]
+2705; [0C C3 E0, 05, 05]
-26CB; [0C C0 90, 05, 05]
+2706; [0C C3 E7, 05, 05]
-26CC; [0C C0 97, 05, 05]
+2707; [0C C3 EE, 05, 05]
-26CD; [0C C0 9E, 05, 05]
+2708; [0C C3 F5, 05, 05]
-26CE; [0C C0 A5, 05, 05]
+2709; [0C C3 FC, 05, 05]
-26CF; [0C C0 AC, 05, 05]
+270A; [0C C4 05, 05, 05]
-26D0; [0C C0 B3, 05, 05]
+270B; [0C C4 0C, 05, 05]
-26D1; [0C C0 BA, 05, 05]
+270C; [0C C4 13, 05, 05]
-26D2; [0C C0 C1, 05, 05]
+270D; [0C C4 1A, 05, 05]
-26D3; [0C C0 C8, 05, 05]
+270E; [0C C4 21, 05, 05]
-26D4; [0C C0 CF, 05, 05]
+270F; [0C C4 28, 05, 05]
-26D5; [0C C0 D6, 05, 05]
+2710; [0C C4 2F, 05, 05]
-26D6; [0C C0 DD, 05, 05]
+2711; [0C C4 36, 05, 05]
-26D7; [0C C0 E4, 05, 05]
+2712; [0C C4 3D, 05, 05]
-26D8; [0C C0 EB, 05, 05]
+2713; [0C C4 44, 05, 05]
-26D9; [0C C0 F2, 05, 05]
+2714; [0C C4 4B, 05, 05]
-26DA; [0C C0 F9, 05, 05]
+2715; [0C C4 52, 05, 05]
-26DB; [0C C1 02, 05, 05]
+2716; [0C C4 59, 05, 05]
-26DC; [0C C1 09, 05, 05]
+2717; [0C C4 60, 05, 05]
-26DD; [0C C1 10, 05, 05]
+2718; [0C C4 67, 05, 05]
-26DE; [0C C1 17, 05, 05]
+2719; [0C C4 6E, 05, 05]
-26DF; [0C C1 1E, 05, 05]
+271A; [0C C4 75, 05, 05]
-26E0; [0C C1 25, 05, 05]
+271B; [0C C4 7C, 05, 05]
-26E1; [0C C1 2C, 05, 05]
+271C; [0C C4 83, 05, 05]
-26E2; [0C C1 33, 05, 05]
+271D; [0C C4 8A, 05, 05]
-26E3; [0C C1 3A, 05, 05]
+271E; [0C C4 91, 05, 05]
-26E4; [0C C1 41, 05, 05]
+271F; [0C C4 98, 05, 05]
-26E5; [0C C1 48, 05, 05]
+2720; [0C C4 9F, 05, 05]
-26E6; [0C C1 4F, 05, 05]
+2721; [0C C4 A6, 05, 05]
-26E7; [0C C1 56, 05, 05]
+2722; [0C C4 AD, 05, 05]
-26E8; [0C C1 5D, 05, 05]
+2723; [0C C4 B4, 05, 05]
-26E9; [0C C1 64, 05, 05]
+2724; [0C C4 BB, 05, 05]
-26EA; [0C C1 6B, 05, 05]
+2725; [0C C4 C2, 05, 05]
-26EB; [0C C1 72, 05, 05]
+2726; [0C C4 C9, 05, 05]
-26EC; [0C C1 79, 05, 05]
+2727; [0C C4 D0, 05, 05]
-26ED; [0C C1 80, 05, 05]
+2728; [0C C4 D7, 05, 05]
-26EE; [0C C1 87, 05, 05]
+2729; [0C C4 DE, 05, 05]
-26EF; [0C C1 8E, 05, 05]
+272A; [0C C4 E5, 05, 05]
-26F0; [0C C1 95, 05, 05]
+272B; [0C C4 EC, 05, 05]
-26F1; [0C C1 9C, 05, 05]
+272C; [0C C4 F3, 05, 05]
-26F2; [0C C1 A3, 05, 05]
+272D; [0C C4 FA, 05, 05]
-26F3; [0C C1 AA, 05, 05]
+272E; [0C C5 03, 05, 05]
-26F4; [0C C1 B1, 05, 05]
+272F; [0C C5 0A, 05, 05]
-26F5; [0C C1 B8, 05, 05]
+2730; [0C C5 11, 05, 05]
-26F6; [0C C1 BF, 05, 05]
+2731; [0C C5 18, 05, 05]
-26F7; [0C C1 C6, 05, 05]
+2732; [0C C5 1F, 05, 05]
-26F8; [0C C1 CD, 05, 05]
+2733; [0C C5 26, 05, 05]
-26F9; [0C C1 D4, 05, 05]
+2734; [0C C5 2D, 05, 05]
-26FA; [0C C1 DB, 05, 05]
+2735; [0C C5 34, 05, 05]
-26FB; [0C C1 E2, 05, 05]
+2736; [0C C5 3B, 05, 05]
-26FC; [0C C1 E9, 05, 05]
+2737; [0C C5 42, 05, 05]
-26FD; [0C C1 F0, 05, 05]
+2738; [0C C5 49, 05, 05]
-26FE; [0C C1 F7, 05, 05]
+2739; [0C C5 50, 05, 05]
-26FF; [0C C1 FE, 05, 05]
+273A; [0C C5 57, 05, 05]
-1F1E6; [0C C2 07, 05, 05]
+273B; [0C C5 5E, 05, 05]
-1F1E7; [0C C2 0E, 05, 05]
+273C; [0C C5 65, 05, 05]
-1F1E8; [0C C2 15, 05, 05]
+273D; [0C C5 6C, 05, 05]
-1F1E9; [0C C2 1C, 05, 05]
+273E; [0C C5 73, 05, 05]
-1F1EA; [0C C2 23, 05, 05]
+273F; [0C C5 7A, 05, 05]
-1F1EB; [0C C2 2A, 05, 05]
+2740; [0C C5 81, 05, 05]
-1F1EC; [0C C2 31, 05, 05]
+2741; [0C C5 88, 05, 05]
-1F1ED; [0C C2 38, 05, 05]
+2742; [0C C5 8F, 05, 05]
-1F1EE; [0C C2 3F, 05, 05]
+2743; [0C C5 96, 05, 05]
-1F1EF; [0C C2 46, 05, 05]
+2744; [0C C5 9D, 05, 05]
-1F1F0; [0C C2 4D, 05, 05]
+2745; [0C C5 A4, 05, 05]
-1F1F1; [0C C2 54, 05, 05]
+2746; [0C C5 AB, 05, 05]
-1F1F2; [0C C2 5B, 05, 05]
+2747; [0C C5 B2, 05, 05]
-1F1F3; [0C C2 62, 05, 05]
+2748; [0C C5 B9, 05, 05]
-1F1F4; [0C C2 69, 05, 05]
+2749; [0C C5 C0, 05, 05]
-1F1F5; [0C C2 70, 05, 05]
+274A; [0C C5 C7, 05, 05]
-1F1F6; [0C C2 77, 05, 05]
+274B; [0C C5 CE, 05, 05]
-1F1F7; [0C C2 7E, 05, 05]
+274C; [0C C5 D5, 05, 05]
-1F1F8; [0C C2 85, 05, 05]
+274D; [0C C5 DC, 05, 05]
-1F1F9; [0C C2 8C, 05, 05]
+274E; [0C C5 E3, 05, 05]
-1F1FA; [0C C2 93, 05, 05]
+274F; [0C C5 EA, 05, 05]
-1F1FB; [0C C2 9A, 05, 05]
+2750; [0C C5 F1, 05, 05]
-1F1FC; [0C C2 A1, 05, 05]
+2751; [0C C5 F8, 05, 05]
-1F1FD; [0C C2 A8, 05, 05]
+2752; [0C C5 FF, 05, 05]
-1F1FE; [0C C2 AF, 05, 05]
+2753; [0C C6 08, 05, 05]
-1F1FF; [0C C2 B6, 05, 05]
+2754; [0C C6 0F, 05, 05]
-2700; [0C C2 BD, 05, 05]
+2755; [0C C6 16, 05, 05]
-2701; [0C C2 C4, 05, 05]
+2756; [0C C6 1D, 05, 05]
-2702; [0C C2 CB, 05, 05]
+2757; [0C C6 24, 05, 05]
-2703; [0C C2 D2, 05, 05]
+2758; [0C C6 2B, 05, 05]
-2704; [0C C2 D9, 05, 05]
+2759; [0C C6 32, 05, 05]
-2705; [0C C2 E0, 05, 05]
+275A; [0C C6 39, 05, 05]
-2706; [0C C2 E7, 05, 05]
+275B; [0C C6 40, 05, 05]
-2707; [0C C2 EE, 05, 05]
+275C; [0C C6 47, 05, 05]
-2708; [0C C2 F5, 05, 05]
+275D; [0C C6 4E, 05, 05]
-2709; [0C C2 FC, 05, 05]
+275E; [0C C6 55, 05, 05]
-270A; [0C C3 05, 05, 05]
+275F; [0C C6 5C, 05, 05]
-270B; [0C C3 0C, 05, 05]
+2760; [0C C6 63, 05, 05]
-270C; [0C C3 13, 05, 05]
+2761; [0C C6 6A, 05, 05]
-270D; [0C C3 1A, 05, 05]
+2762; [0C C6 71, 05, 05]
-270E; [0C C3 21, 05, 05]
+2763; [0C C6 78, 05, 05]
-270F; [0C C3 28, 05, 05]
+2764; [0C C6 7F, 05, 05]
-2710; [0C C3 2F, 05, 05]
+2765; [0C C6 86, 05, 05]
-2711; [0C C3 36, 05, 05]
+2766; [0C C6 8D, 05, 05]
-2712; [0C C3 3D, 05, 05]
+2767; [0C C6 94, 05, 05]
-2713; [0C C3 44, 05, 05]
+2794; [0C C6 9B, 05, 05]
-2714; [0C C3 4B, 05, 05]
+2795; [0C C6 A2, 05, 05]
-2715; [0C C3 52, 05, 05]
+2796; [0C C6 A9, 05, 05]
-2716; [0C C3 59, 05, 05]
+2797; [0C C6 B0, 05, 05]
-2717; [0C C3 60, 05, 05]
+2798; [0C C6 B7, 05, 05]
-2718; [0C C3 67, 05, 05]
+2799; [0C C6 BE, 05, 05]
-2719; [0C C3 6E, 05, 05]
+279A; [0C C6 C5, 05, 05]
-271A; [0C C3 75, 05, 05]
+279B; [0C C6 CC, 05, 05]
-271B; [0C C3 7C, 05, 05]
+279C; [0C C6 D3, 05, 05]
-271C; [0C C3 83, 05, 05]
+279D; [0C C6 DA, 05, 05]
-271D; [0C C3 8A, 05, 05]
+279E; [0C C6 E1, 05, 05]
-271E; [0C C3 91, 05, 05]
+279F; [0C C6 E8, 05, 05]
-271F; [0C C3 98, 05, 05]
+27A0; [0C C6 EF, 05, 05]
-2720; [0C C3 9F, 05, 05]
+27A1; [0C C6 F6, 05, 05]
-2721; [0C C3 A6, 05, 05]
+27A2; [0C C6 FD, 05, 05]
-2722; [0C C3 AD, 05, 05]
+27A3; [0C C7 06, 05, 05]
-2723; [0C C3 B4, 05, 05]
+27A4; [0C C7 0D, 05, 05]
-2724; [0C C3 BB, 05, 05]
+27A5; [0C C7 14, 05, 05]
-2725; [0C C3 C2, 05, 05]
+27A6; [0C C7 1B, 05, 05]
-2726; [0C C3 C9, 05, 05]
+27A7; [0C C7 22, 05, 05]
-2727; [0C C3 D0, 05, 05]
+27A8; [0C C7 29, 05, 05]
-2728; [0C C3 D7, 05, 05]
+27A9; [0C C7 30, 05, 05]
-2729; [0C C3 DE, 05, 05]
+27AA; [0C C7 37, 05, 05]
-272A; [0C C3 E5, 05, 05]
+27AB; [0C C7 3E, 05, 05]
-272B; [0C C3 EC, 05, 05]
+27AC; [0C C7 45, 05, 05]
-272C; [0C C3 F3, 05, 05]
+27AD; [0C C7 4C, 05, 05]
-272D; [0C C3 FA, 05, 05]
+27AE; [0C C7 53, 05, 05]
-272E; [0C C4 03, 05, 05]
+27AF; [0C C7 5A, 05, 05]
-272F; [0C C4 0A, 05, 05]
+27B0; [0C C7 61, 05, 05]
-2730; [0C C4 11, 05, 05]
+27B1; [0C C7 68, 05, 05]
-2731; [0C C4 18, 05, 05]
+27B2; [0C C7 6F, 05, 05]
-2732; [0C C4 1F, 05, 05]
+27B3; [0C C7 76, 05, 05]
-2733; [0C C4 26, 05, 05]
+27B4; [0C C7 7D, 05, 05]
-2734; [0C C4 2D, 05, 05]
+27B5; [0C C7 84, 05, 05]
-2735; [0C C4 34, 05, 05]
+27B6; [0C C7 8B, 05, 05]
-2736; [0C C4 3B, 05, 05]
+27B7; [0C C7 92, 05, 05]
-2737; [0C C4 42, 05, 05]
+27B8; [0C C7 99, 05, 05]
-2738; [0C C4 49, 05, 05]
+27B9; [0C C7 A0, 05, 05]
-2739; [0C C4 50, 05, 05]
+27BA; [0C C7 A7, 05, 05]
-273A; [0C C4 57, 05, 05]
+27BB; [0C C7 AE, 05, 05]
-273B; [0C C4 5E, 05, 05]
+27BC; [0C C7 B5, 05, 05]
-273C; [0C C4 65, 05, 05]
+27BD; [0C C7 BC, 05, 05]
-273D; [0C C4 6C, 05, 05]
+27BE; [0C C7 C3, 05, 05]
-273E; [0C C4 73, 05, 05]
+27BF; [0C C7 CA, 05, 05]
-273F; [0C C4 7A, 05, 05]
+27C0; [0C C7 D1, 05, 05]
-2740; [0C C4 81, 05, 05]
+27C1; [0C C7 D8, 05, 05]
-2741; [0C C4 88, 05, 05]
+27C2; [0C C7 DF, 05, 05]
-2742; [0C C4 8F, 05, 05]
+27C3; [0C C7 E6, 05, 05]
-2743; [0C C4 96, 05, 05]
+27C4; [0C C7 ED, 05, 05]
-2744; [0C C4 9D, 05, 05]
+27C7; [0C C7 F4, 05, 05]
-2745; [0C C4 A4, 05, 05]
+27C8; [0C C7 FB, 05, 05]
-2746; [0C C4 AB, 05, 05]
+27C9; [0C C8 04, 05, 05]
-2747; [0C C4 B2, 05, 05]
+27CA; [0C C8 0B, 05, 05]
-2748; [0C C4 B9, 05, 05]
+27CB; [0C C8 12, 05, 05]
-2749; [0C C4 C0, 05, 05]
+27CC; [0C C8 19, 05, 05]
-274A; [0C C4 C7, 05, 05]
+27CD; [0C C8 20, 05, 05]
-274B; [0C C4 CE, 05, 05]
+27CE; [0C C8 27, 05, 05]
-274C; [0C C4 D5, 05, 05]
+27CF; [0C C8 2E, 05, 05]
-274D; [0C C4 DC, 05, 05]
+27D0; [0C C8 35, 05, 05]
-274E; [0C C4 E3, 05, 05]
+27D1; [0C C8 3C, 05, 05]
-274F; [0C C4 EA, 05, 05]
+27D2; [0C C8 43, 05, 05]
-2750; [0C C4 F1, 05, 05]
+27D3; [0C C8 4A, 05, 05]
-2751; [0C C4 F8, 05, 05]
+27D4; [0C C8 51, 05, 05]
-2752; [0C C4 FF, 05, 05]
+27D5; [0C C8 58, 05, 05]
-2753; [0C C5 08, 05, 05]
+27D6; [0C C8 5F, 05, 05]
-2754; [0C C5 0F, 05, 05]
+27D7; [0C C8 66, 05, 05]
-2755; [0C C5 16, 05, 05]
+27D8; [0C C8 6D, 05, 05]
-2756; [0C C5 1D, 05, 05]
+27D9; [0C C8 74, 05, 05]
-2757; [0C C5 24, 05, 05]
+27DA; [0C C8 7B, 05, 05]
-2758; [0C C5 2B, 05, 05]
+27DB; [0C C8 82, 05, 05]
-2759; [0C C5 32, 05, 05]
+27DC; [0C C8 89, 05, 05]
-275A; [0C C5 39, 05, 05]
+27DD; [0C C8 90, 05, 05]
-275B; [0C C5 40, 05, 05]
+27DE; [0C C8 97, 05, 05]
-275C; [0C C5 47, 05, 05]
+27DF; [0C C8 9E, 05, 05]
-275D; [0C C5 4E, 05, 05]
+27E0; [0C C8 A5, 05, 05]
-275E; [0C C5 55, 05, 05]
+27E1; [0C C8 AC, 05, 05]
-275F; [0C C5 5C, 05, 05]
+27E2; [0C C8 B3, 05, 05]
-2760; [0C C5 63, 05, 05]
+27E3; [0C C8 BA, 05, 05]
-2761; [0C C5 6A, 05, 05]
+27E4; [0C C8 C1, 05, 05]
-2762; [0C C5 71, 05, 05]
+27E5; [0C C8 C8, 05, 05]
-2763; [0C C5 78, 05, 05]
+27F0; [0C C8 CF, 05, 05]
-2764; [0C C5 7F, 05, 05]
+27F1; [0C C8 D6, 05, 05]
-2765; [0C C5 86, 05, 05]
+27F2; [0C C8 DD, 05, 05]
-2766; [0C C5 8D, 05, 05]
+27F3; [0C C8 E4, 05, 05]
-2767; [0C C5 94, 05, 05]
+27F4; [0C C8 EB, 05, 05]
-2794; [0C C5 9B, 05, 05]
+27F5; [0C C8 F2, 05, 05]
-2795; [0C C5 A2, 05, 05]
+27F6; [0C C8 F9, 05, 05]
-2796; [0C C5 A9, 05, 05]
+27F7; [0C C9 02, 05, 05]
-2797; [0C C5 B0, 05, 05]
+27F8; [0C C9 09, 05, 05]
-2798; [0C C5 B7, 05, 05]
+27F9; [0C C9 10, 05, 05]
-2799; [0C C5 BE, 05, 05]
+27FA; [0C C9 17, 05, 05]
-279A; [0C C5 C5, 05, 05]
+27FB; [0C C9 1E, 05, 05]
-279B; [0C C5 CC, 05, 05]
+27FC; [0C C9 25, 05, 05]
-279C; [0C C5 D3, 05, 05]
+27FD; [0C C9 2C, 05, 05]
-279D; [0C C5 DA, 05, 05]
+27FE; [0C C9 33, 05, 05]
-279E; [0C C5 E1, 05, 05]
+27FF; [0C C9 3A, 05, 05]
-279F; [0C C5 E8, 05, 05]
+2900; [0C C9 41, 05, 05]
-27A0; [0C C5 EF, 05, 05]
+2901; [0C C9 48, 05, 05]
-27A1; [0C C5 F6, 05, 05]
+2902; [0C C9 4F, 05, 05]
-27A2; [0C C5 FD, 05, 05]
+2903; [0C C9 56, 05, 05]
-27A3; [0C C6 06, 05, 05]
+2904; [0C C9 5D, 05, 05]
-27A4; [0C C6 0D, 05, 05]
+2905; [0C C9 64, 05, 05]
-27A5; [0C C6 14, 05, 05]
+2906; [0C C9 6B, 05, 05]
-27A6; [0C C6 1B, 05, 05]
+2907; [0C C9 72, 05, 05]
-27A7; [0C C6 22, 05, 05]
+2908; [0C C9 79, 05, 05]
-27A8; [0C C6 29, 05, 05]
+2909; [0C C9 80, 05, 05]
-27A9; [0C C6 30, 05, 05]
+290A; [0C C9 87, 05, 05]
-27AA; [0C C6 37, 05, 05]
+290B; [0C C9 8E, 05, 05]
-27AB; [0C C6 3E, 05, 05]
+290C; [0C C9 95, 05, 05]
-27AC; [0C C6 45, 05, 05]
+290D; [0C C9 9C, 05, 05]
-27AD; [0C C6 4C, 05, 05]
+290E; [0C C9 A3, 05, 05]
-27AE; [0C C6 53, 05, 05]
+290F; [0C C9 AA, 05, 05]
-27AF; [0C C6 5A, 05, 05]
+2910; [0C C9 B1, 05, 05]
-27B0; [0C C6 61, 05, 05]
+2911; [0C C9 B8, 05, 05]
-27B1; [0C C6 68, 05, 05]
+2912; [0C C9 BF, 05, 05]
-27B2; [0C C6 6F, 05, 05]
+2913; [0C C9 C6, 05, 05]
-27B3; [0C C6 76, 05, 05]
+2914; [0C C9 CD, 05, 05]
-27B4; [0C C6 7D, 05, 05]
+2915; [0C C9 D4, 05, 05]
-27B5; [0C C6 84, 05, 05]
+2916; [0C C9 DB, 05, 05]
-27B6; [0C C6 8B, 05, 05]
+2917; [0C C9 E2, 05, 05]
-27B7; [0C C6 92, 05, 05]
+2918; [0C C9 E9, 05, 05]
-27B8; [0C C6 99, 05, 05]
+2919; [0C C9 F0, 05, 05]
-27B9; [0C C6 A0, 05, 05]
+291A; [0C C9 F7, 05, 05]
-27BA; [0C C6 A7, 05, 05]
+291B; [0C C9 FE, 05, 05]
-27BB; [0C C6 AE, 05, 05]
+291C; [0C CA 07, 05, 05]
-27BC; [0C C6 B5, 05, 05]
+291D; [0C CA 0E, 05, 05]
-27BD; [0C C6 BC, 05, 05]
+291E; [0C CA 15, 05, 05]
-27BE; [0C C6 C3, 05, 05]
+291F; [0C CA 1C, 05, 05]
-27BF; [0C C6 CA, 05, 05]
+2920; [0C CA 23, 05, 05]
-27C0; [0C C6 D1, 05, 05]
+2921; [0C CA 2A, 05, 05]
-27C1; [0C C6 D8, 05, 05]
+2922; [0C CA 31, 05, 05]
-27C2; [0C C6 DF, 05, 05]
+2923; [0C CA 38, 05, 05]
-27C3; [0C C6 E6, 05, 05]
+2924; [0C CA 3F, 05, 05]
-27C4; [0C C6 ED, 05, 05]
+2925; [0C CA 46, 05, 05]
-27C7; [0C C6 F4, 05, 05]
+2926; [0C CA 4D, 05, 05]
-27C8; [0C C6 FB, 05, 05]
+2927; [0C CA 54, 05, 05]
-27C9; [0C C7 04, 05, 05]
+2928; [0C CA 5B, 05, 05]
-27CA; [0C C7 0B, 05, 05]
+2929; [0C CA 62, 05, 05]
-27CB; [0C C7 12, 05, 05]
+292A; [0C CA 69, 05, 05]
-27CC; [0C C7 19, 05, 05]
+292B; [0C CA 70, 05, 05]
-27CD; [0C C7 20, 05, 05]
+292C; [0C CA 77, 05, 05]
-27CE; [0C C7 27, 05, 05]
+292D; [0C CA 7E, 05, 05]
-27CF; [0C C7 2E, 05, 05]
+292E; [0C CA 85, 05, 05]
-27D0; [0C C7 35, 05, 05]
+292F; [0C CA 8C, 05, 05]
-27D1; [0C C7 3C, 05, 05]
+2930; [0C CA 93, 05, 05]
-27D2; [0C C7 43, 05, 05]
+2931; [0C CA 9A, 05, 05]
-27D3; [0C C7 4A, 05, 05]
+2932; [0C CA A1, 05, 05]
-27D4; [0C C7 51, 05, 05]
+2933; [0C CA A8, 05, 05]
-27D5; [0C C7 58, 05, 05]
+2934; [0C CA AF, 05, 05]
-27D6; [0C C7 5F, 05, 05]
+2935; [0C CA B6, 05, 05]
-27D7; [0C C7 66, 05, 05]
+2936; [0C CA BD, 05, 05]
-27D8; [0C C7 6D, 05, 05]
+2937; [0C CA C4, 05, 05]
-27D9; [0C C7 74, 05, 05]
+2938; [0C CA CB, 05, 05]
-27DA; [0C C7 7B, 05, 05]
+2939; [0C CA D2, 05, 05]
-27DB; [0C C7 82, 05, 05]
+293A; [0C CA D9, 05, 05]
-27DC; [0C C7 89, 05, 05]
+293B; [0C CA E0, 05, 05]
-27DD; [0C C7 90, 05, 05]
+293C; [0C CA E7, 05, 05]
-27DE; [0C C7 97, 05, 05]
+293D; [0C CA EE, 05, 05]
-27DF; [0C C7 9E, 05, 05]
+293E; [0C CA F5, 05, 05]
-27E0; [0C C7 A5, 05, 05]
+293F; [0C CA FC, 05, 05]
-27E1; [0C C7 AC, 05, 05]
+2940; [0C CB 05, 05, 05]
-27E2; [0C C7 B3, 05, 05]
+2941; [0C CB 0C, 05, 05]
-27E3; [0C C7 BA, 05, 05]
+2942; [0C CB 13, 05, 05]
-27E4; [0C C7 C1, 05, 05]
+2943; [0C CB 1A, 05, 05]
-27E5; [0C C7 C8, 05, 05]
+2944; [0C CB 21, 05, 05]
-27F0; [0C C7 CF, 05, 05]
+2945; [0C CB 28, 05, 05]
-27F1; [0C C7 D6, 05, 05]
+2946; [0C CB 2F, 05, 05]
-27F2; [0C C7 DD, 05, 05]
+2947; [0C CB 36, 05, 05]
-27F3; [0C C7 E4, 05, 05]
+2948; [0C CB 3D, 05, 05]
-27F4; [0C C7 EB, 05, 05]
+2949; [0C CB 44, 05, 05]
-27F5; [0C C7 F2, 05, 05]
+294A; [0C CB 4B, 05, 05]
-27F6; [0C C7 F9, 05, 05]
+294B; [0C CB 52, 05, 05]
-27F7; [0C C8 02, 05, 05]
+294C; [0C CB 59, 05, 05]
-27F8; [0C C8 09, 05, 05]
+294D; [0C CB 60, 05, 05]
-27F9; [0C C8 10, 05, 05]
+294E; [0C CB 67, 05, 05]
-27FA; [0C C8 17, 05, 05]
+294F; [0C CB 6E, 05, 05]
-27FB; [0C C8 1E, 05, 05]
+2950; [0C CB 75, 05, 05]
-27FC; [0C C8 25, 05, 05]
+2951; [0C CB 7C, 05, 05]
-27FD; [0C C8 2C, 05, 05]
+2952; [0C CB 83, 05, 05]
-27FE; [0C C8 33, 05, 05]
+2953; [0C CB 8A, 05, 05]
-27FF; [0C C8 3A, 05, 05]
+2954; [0C CB 91, 05, 05]
-2900; [0C C8 41, 05, 05]
+2955; [0C CB 98, 05, 05]
-2901; [0C C8 48, 05, 05]
+2956; [0C CB 9F, 05, 05]
-2902; [0C C8 4F, 05, 05]
+2957; [0C CB A6, 05, 05]
-2903; [0C C8 56, 05, 05]
+2958; [0C CB AD, 05, 05]
-2904; [0C C8 5D, 05, 05]
+2959; [0C CB B4, 05, 05]
-2905; [0C C8 64, 05, 05]
+295A; [0C CB BB, 05, 05]
-2906; [0C C8 6B, 05, 05]
+295B; [0C CB C2, 05, 05]
-2907; [0C C8 72, 05, 05]
+295C; [0C CB C9, 05, 05]
-2908; [0C C8 79, 05, 05]
+295D; [0C CB D0, 05, 05]
-2909; [0C C8 80, 05, 05]
+295E; [0C CB D7, 05, 05]
-290A; [0C C8 87, 05, 05]
+295F; [0C CB DE, 05, 05]
-290B; [0C C8 8E, 05, 05]
+2960; [0C CB E5, 05, 05]
-290C; [0C C8 95, 05, 05]
+2961; [0C CB EC, 05, 05]
-290D; [0C C8 9C, 05, 05]
+2962; [0C CB F3, 05, 05]
-290E; [0C C8 A3, 05, 05]
+2963; [0C CB FA, 05, 05]
-290F; [0C C8 AA, 05, 05]
+2964; [0C CC 03, 05, 05]
-2910; [0C C8 B1, 05, 05]
+2965; [0C CC 0A, 05, 05]
-2911; [0C C8 B8, 05, 05]
+2966; [0C CC 11, 05, 05]
-2912; [0C C8 BF, 05, 05]
+2967; [0C CC 18, 05, 05]
-2913; [0C C8 C6, 05, 05]
+2968; [0C CC 1F, 05, 05]
-2914; [0C C8 CD, 05, 05]
+2969; [0C CC 26, 05, 05]
-2915; [0C C8 D4, 05, 05]
+296A; [0C CC 2D, 05, 05]
-2916; [0C C8 DB, 05, 05]
+296B; [0C CC 34, 05, 05]
-2917; [0C C8 E2, 05, 05]
+296C; [0C CC 3B, 05, 05]
-2918; [0C C8 E9, 05, 05]
+296D; [0C CC 42, 05, 05]
-2919; [0C C8 F0, 05, 05]
+296E; [0C CC 49, 05, 05]
-291A; [0C C8 F7, 05, 05]
+296F; [0C CC 50, 05, 05]
-291B; [0C C8 FE, 05, 05]
+2970; [0C CC 57, 05, 05]
-291C; [0C C9 07, 05, 05]
+2971; [0C CC 5E, 05, 05]
-291D; [0C C9 0E, 05, 05]
+2972; [0C CC 65, 05, 05]
-291E; [0C C9 15, 05, 05]
+2973; [0C CC 6C, 05, 05]
-291F; [0C C9 1C, 05, 05]
+2974; [0C CC 73, 05, 05]
-2920; [0C C9 23, 05, 05]
+2975; [0C CC 7A, 05, 05]
-2921; [0C C9 2A, 05, 05]
+2976; [0C CC 81, 05, 05]
-2922; [0C C9 31, 05, 05]
+2977; [0C CC 88, 05, 05]
-2923; [0C C9 38, 05, 05]
+2978; [0C CC 8F, 05, 05]
-2924; [0C C9 3F, 05, 05]
+2979; [0C CC 96, 05, 05]
-2925; [0C C9 46, 05, 05]
+297A; [0C CC 9D, 05, 05]
-2926; [0C C9 4D, 05, 05]
+297B; [0C CC A4, 05, 05]
-2927; [0C C9 54, 05, 05]
+297C; [0C CC AB, 05, 05]
-2928; [0C C9 5B, 05, 05]
+297D; [0C CC B2, 05, 05]
-2929; [0C C9 62, 05, 05]
+297E; [0C CC B9, 05, 05]
-292A; [0C C9 69, 05, 05]
+297F; [0C CC C0, 05, 05]
-292B; [0C C9 70, 05, 05]
+2980; [0C CC C7, 05, 05]
-292C; [0C C9 77, 05, 05]
+2981; [0C CC CE, 05, 05]
-292D; [0C C9 7E, 05, 05]
+2982; [0C CC D5, 05, 05]
-292E; [0C C9 85, 05, 05]
+2999; [0C CC DC, 05, 05]
-292F; [0C C9 8C, 05, 05]
+299A; [0C CC E3, 05, 05]
-2930; [0C C9 93, 05, 05]
+299B; [0C CC EA, 05, 05]
-2931; [0C C9 9A, 05, 05]
+299C; [0C CC F1, 05, 05]
-2932; [0C C9 A1, 05, 05]
+299D; [0C CC F8, 05, 05]
-2933; [0C C9 A8, 05, 05]
+299E; [0C CC FF, 05, 05]
-2934; [0C C9 AF, 05, 05]
+299F; [0C CD 08, 05, 05]
-2935; [0C C9 B6, 05, 05]
+29A0; [0C CD 0F, 05, 05]
-2936; [0C C9 BD, 05, 05]
+29A1; [0C CD 16, 05, 05]
-2937; [0C C9 C4, 05, 05]
+29A2; [0C CD 1D, 05, 05]
-2938; [0C C9 CB, 05, 05]
+29A3; [0C CD 24, 05, 05]
-2939; [0C C9 D2, 05, 05]
+29A4; [0C CD 2B, 05, 05]
-293A; [0C C9 D9, 05, 05]
+29A5; [0C CD 32, 05, 05]
-293B; [0C C9 E0, 05, 05]
+29A6; [0C CD 39, 05, 05]
-293C; [0C C9 E7, 05, 05]
+29A7; [0C CD 40, 05, 05]
-293D; [0C C9 EE, 05, 05]
+29A8; [0C CD 47, 05, 05]
-293E; [0C C9 F5, 05, 05]
+29A9; [0C CD 4E, 05, 05]
-293F; [0C C9 FC, 05, 05]
+29AA; [0C CD 55, 05, 05]
-2940; [0C CA 05, 05, 05]
+29AB; [0C CD 5C, 05, 05]
-2941; [0C CA 0C, 05, 05]
+29AC; [0C CD 63, 05, 05]
-2942; [0C CA 13, 05, 05]
+29AD; [0C CD 6A, 05, 05]
-2943; [0C CA 1A, 05, 05]
+29AE; [0C CD 71, 05, 05]
-2944; [0C CA 21, 05, 05]
+29AF; [0C CD 78, 05, 05]
-2945; [0C CA 28, 05, 05]
+29B0; [0C CD 7F, 05, 05]
-2946; [0C CA 2F, 05, 05]
+29B1; [0C CD 86, 05, 05]
-2947; [0C CA 36, 05, 05]
+29B2; [0C CD 8D, 05, 05]
-2948; [0C CA 3D, 05, 05]
+29B3; [0C CD 94, 05, 05]
-2949; [0C CA 44, 05, 05]
+29B4; [0C CD 9B, 05, 05]
-294A; [0C CA 4B, 05, 05]
+29B5; [0C CD A2, 05, 05]
-294B; [0C CA 52, 05, 05]
+29B6; [0C CD A9, 05, 05]
-294C; [0C CA 59, 05, 05]
+29B7; [0C CD B0, 05, 05]
-294D; [0C CA 60, 05, 05]
+29B8; [0C CD B7, 05, 05]
-294E; [0C CA 67, 05, 05]
+29B9; [0C CD BE, 05, 05]
-294F; [0C CA 6E, 05, 05]
+29BA; [0C CD C5, 05, 05]
-2950; [0C CA 75, 05, 05]
+29BB; [0C CD CC, 05, 05]
-2951; [0C CA 7C, 05, 05]
+29BC; [0C CD D3, 05, 05]
-2952; [0C CA 83, 05, 05]
+29BD; [0C CD DA, 05, 05]
-2953; [0C CA 8A, 05, 05]
+29BE; [0C CD E1, 05, 05]
-2954; [0C CA 91, 05, 05]
+29BF; [0C CD E8, 05, 05]
-2955; [0C CA 98, 05, 05]
+29C0; [0C CD EF, 05, 05]
-2956; [0C CA 9F, 05, 05]
+29C1; [0C CD F6, 05, 05]
-2957; [0C CA A6, 05, 05]
+29C2; [0C CD FD, 05, 05]
-2958; [0C CA AD, 05, 05]
+29C3; [0C CE 06, 05, 05]
-2959; [0C CA B4, 05, 05]
+29C4; [0C CE 0D, 05, 05]
-295A; [0C CA BB, 05, 05]
+29C5; [0C CE 14, 05, 05]
-295B; [0C CA C2, 05, 05]
+29C6; [0C CE 1B, 05, 05]
-295C; [0C CA C9, 05, 05]
+29C7; [0C CE 22, 05, 05]
-295D; [0C CA D0, 05, 05]
+29C8; [0C CE 29, 05, 05]
-295E; [0C CA D7, 05, 05]
+29C9; [0C CE 30, 05, 05]
-295F; [0C CA DE, 05, 05]
+29CA; [0C CE 37, 05, 05]
-2960; [0C CA E5, 05, 05]
+29CB; [0C CE 3E, 05, 05]
-2961; [0C CA EC, 05, 05]
+29CC; [0C CE 45, 05, 05]
-2962; [0C CA F3, 05, 05]
+29CD; [0C CE 4C, 05, 05]
-2963; [0C CA FA, 05, 05]
+29CE; [0C CE 53, 05, 05]
-2964; [0C CB 03, 05, 05]
+29CF; [0C CE 5A, 05, 05]
-2965; [0C CB 0A, 05, 05]
+29D0; [0C CE 61, 05, 05]
-2966; [0C CB 11, 05, 05]
+29D1; [0C CE 68, 05, 05]
-2967; [0C CB 18, 05, 05]
+29D2; [0C CE 6F, 05, 05]
-2968; [0C CB 1F, 05, 05]
+29D3; [0C CE 76, 05, 05]
-2969; [0C CB 26, 05, 05]
+29D4; [0C CE 7D, 05, 05]
-296A; [0C CB 2D, 05, 05]
+29D5; [0C CE 84, 05, 05]
-296B; [0C CB 34, 05, 05]
+29D6; [0C CE 8B, 05, 05]
-296C; [0C CB 3B, 05, 05]
+29D7; [0C CE 92, 05, 05]
-296D; [0C CB 42, 05, 05]
+29DC; [0C CE 99, 05, 05]
-296E; [0C CB 49, 05, 05]
+29DD; [0C CE A0, 05, 05]
-296F; [0C CB 50, 05, 05]
+29DE; [0C CE A7, 05, 05]
-2970; [0C CB 57, 05, 05]
+29DF; [0C CE AE, 05, 05]
-2971; [0C CB 5E, 05, 05]
+29E0; [0C CE B5, 05, 05]
-2972; [0C CB 65, 05, 05]
+29E1; [0C CE BC, 05, 05]
-2973; [0C CB 6C, 05, 05]
+29E2; [0C CE C3, 05, 05]
-2974; [0C CB 73, 05, 05]
+29E3; [0C CE CA, 05, 05]
-2975; [0C CB 7A, 05, 05]
+29E4; [0C CE D1, 05, 05]
-2976; [0C CB 81, 05, 05]
+29E5; [0C CE D8, 05, 05]
-2977; [0C CB 88, 05, 05]
+29E6; [0C CE DF, 05, 05]
-2978; [0C CB 8F, 05, 05]
+29E7; [0C CE E6, 05, 05]
-2979; [0C CB 96, 05, 05]
+29E8; [0C CE ED, 05, 05]
-297A; [0C CB 9D, 05, 05]
+29E9; [0C CE F4, 05, 05]
-297B; [0C CB A4, 05, 05]
+29EA; [0C CE FB, 05, 05]
-297C; [0C CB AB, 05, 05]
+29EB; [0C CF 04, 05, 05]
-297D; [0C CB B2, 05, 05]
+29EC; [0C CF 0B, 05, 05]
-297E; [0C CB B9, 05, 05]
+29ED; [0C CF 12, 05, 05]
-297F; [0C CB C0, 05, 05]
+29EE; [0C CF 19, 05, 05]
-2980; [0C CB C7, 05, 05]
+29EF; [0C CF 20, 05, 05]
-2981; [0C CB CE, 05, 05]
+29F0; [0C CF 27, 05, 05]
-2982; [0C CB D5, 05, 05]
+29F1; [0C CF 2E, 05, 05]
-2999; [0C CB DC, 05, 05]
+29F2; [0C CF 35, 05, 05]
-299A; [0C CB E3, 05, 05]
+29F3; [0C CF 3C, 05, 05]
-299B; [0C CB EA, 05, 05]
+29F4; [0C CF 43, 05, 05]
-299C; [0C CB F1, 05, 05]
+29F5; [0C CF 4A, 05, 05]
-299D; [0C CB F8, 05, 05]
+29F6; [0C CF 51, 05, 05]
-299E; [0C CB FF, 05, 05]
+29F7; [0C CF 58, 05, 05]
-299F; [0C CC 08, 05, 05]
+29F8; [0C CF 5F, 05, 05]
-29A0; [0C CC 0F, 05, 05]
+29F9; [0C CF 66, 05, 05]
-29A1; [0C CC 16, 05, 05]
+29FA; [0C CF 6D, 05, 05]
-29A2; [0C CC 1D, 05, 05]
+29FB; [0C CF 74, 05, 05]
-29A3; [0C CC 24, 05, 05]
+29FE; [0C CF 7B, 05, 05]
-29A4; [0C CC 2B, 05, 05]
+29FF; [0C CF 82, 05, 05]
-29A5; [0C CC 32, 05, 05]
+2A00; [0C CF 89, 05, 05]
-29A6; [0C CC 39, 05, 05]
+2A01; [0C CF 90, 05, 05]
-29A7; [0C CC 40, 05, 05]
+2A02; [0C CF 97, 05, 05]
-29A8; [0C CC 47, 05, 05]
+2A03; [0C CF 9E, 05, 05]
-29A9; [0C CC 4E, 05, 05]
+2A04; [0C CF A5, 05, 05]
-29AA; [0C CC 55, 05, 05]
+2A05; [0C CF AC, 05, 05]
-29AB; [0C CC 5C, 05, 05]
+2A06; [0C CF B3, 05, 05]
-29AC; [0C CC 63, 05, 05]
+2A07; [0C CF BA, 05, 05]
-29AD; [0C CC 6A, 05, 05]
+2A08; [0C CF C1, 05, 05]
-29AE; [0C CC 71, 05, 05]
+2A09; [0C CF C8, 05, 05]
-29AF; [0C CC 78, 05, 05]
+2A0A; [0C CF CF, 05, 05]
-29B0; [0C CC 7F, 05, 05]
+2A0B; [0C CF D6, 05, 05]
-29B1; [0C CC 86, 05, 05]
+2A0D; [0C CF DD, 05, 05]
-29B2; [0C CC 8D, 05, 05]
+2A0E; [0C CF E4, 05, 05]
-29B3; [0C CC 94, 05, 05]
+2A0F; [0C CF EB, 05, 05]
-29B4; [0C CC 9B, 05, 05]
+2A10; [0C CF F2, 05, 05]
-29B5; [0C CC A2, 05, 05]
+2A11; [0C CF F9, 05, 05]
-29B6; [0C CC A9, 05, 05]
+2A12; [0C D0 02, 05, 05]
-29B7; [0C CC B0, 05, 05]
+2A13; [0C D0 09, 05, 05]
-29B8; [0C CC B7, 05, 05]
+2A14; [0C D0 10, 05, 05]
-29B9; [0C CC BE, 05, 05]
+2A15; [0C D0 17, 05, 05]
-29BA; [0C CC C5, 05, 05]
+2A16; [0C D0 1E, 05, 05]
-29BB; [0C CC CC, 05, 05]
+2A17; [0C D0 25, 05, 05]
-29BC; [0C CC D3, 05, 05]
+2A18; [0C D0 2C, 05, 05]
-29BD; [0C CC DA, 05, 05]
+2A19; [0C D0 33, 05, 05]
-29BE; [0C CC E1, 05, 05]
+2A1A; [0C D0 3A, 05, 05]
-29BF; [0C CC E8, 05, 05]
+2A1B; [0C D0 41, 05, 05]
-29C0; [0C CC EF, 05, 05]
+2A1C; [0C D0 48, 05, 05]
-29C1; [0C CC F6, 05, 05]
+2A1D; [0C D0 4F, 05, 05]
-29C2; [0C CC FD, 05, 05]
+2A1E; [0C D0 56, 05, 05]
-29C3; [0C CD 06, 05, 05]
+2A1F; [0C D0 5D, 05, 05]
-29C4; [0C CD 0D, 05, 05]
+2A20; [0C D0 64, 05, 05]
-29C5; [0C CD 14, 05, 05]
+2A21; [0C D0 6B, 05, 05]
-29C6; [0C CD 1B, 05, 05]
+2A22; [0C D0 72, 05, 05]
-29C7; [0C CD 22, 05, 05]
+2A23; [0C D0 79, 05, 05]
-29C8; [0C CD 29, 05, 05]
+2A24; [0C D0 80, 05, 05]
-29C9; [0C CD 30, 05, 05]
+2A25; [0C D0 87, 05, 05]
-29CA; [0C CD 37, 05, 05]
+2A26; [0C D0 8E, 05, 05]
-29CB; [0C CD 3E, 05, 05]
+2A27; [0C D0 95, 05, 05]
-29CC; [0C CD 45, 05, 05]
+2A28; [0C D0 9C, 05, 05]
-29CD; [0C CD 4C, 05, 05]
+2A29; [0C D0 A3, 05, 05]
-29CE; [0C CD 53, 05, 05]
+2A2A; [0C D0 AA, 05, 05]
-29CF; [0C CD 5A, 05, 05]
+2A2B; [0C D0 B1, 05, 05]
-29D0; [0C CD 61, 05, 05]
+2A2C; [0C D0 B8, 05, 05]
-29D1; [0C CD 68, 05, 05]
+2A2D; [0C D0 BF, 05, 05]
-29D2; [0C CD 6F, 05, 05]
+2A2E; [0C D0 C6, 05, 05]
-29D3; [0C CD 76, 05, 05]
+2A2F; [0C D0 CD, 05, 05]
-29D4; [0C CD 7D, 05, 05]
+2A30; [0C D0 D4, 05, 05]
-29D5; [0C CD 84, 05, 05]
+2A31; [0C D0 DB, 05, 05]
-29D6; [0C CD 8B, 05, 05]
+2A32; [0C D0 E2, 05, 05]
-29D7; [0C CD 92, 05, 05]
+2A33; [0C D0 E9, 05, 05]
-29DC; [0C CD 99, 05, 05]
+2A34; [0C D0 F0, 05, 05]
-29DD; [0C CD A0, 05, 05]
+2A35; [0C D0 F7, 05, 05]
-29DE; [0C CD A7, 05, 05]
+2A36; [0C D0 FE, 05, 05]
-29DF; [0C CD AE, 05, 05]
+2A37; [0C D1 07, 05, 05]
-29E0; [0C CD B5, 05, 05]
+2A38; [0C D1 0E, 05, 05]
-29E1; [0C CD BC, 05, 05]
+2A39; [0C D1 15, 05, 05]
-29E2; [0C CD C3, 05, 05]
+2A3A; [0C D1 1C, 05, 05]
-29E3; [0C CD CA, 05, 05]
+2A3B; [0C D1 23, 05, 05]
-29E4; [0C CD D1, 05, 05]
+2A3C; [0C D1 2A, 05, 05]
-29E5; [0C CD D8, 05, 05]
+2A3D; [0C D1 31, 05, 05]
-29E6; [0C CD DF, 05, 05]
+2A3E; [0C D1 38, 05, 05]
-29E7; [0C CD E6, 05, 05]
+2A3F; [0C D1 3F, 05, 05]
-29E8; [0C CD ED, 05, 05]
+2A40; [0C D1 46, 05, 05]
-29E9; [0C CD F4, 05, 05]
+2A41; [0C D1 4D, 05, 05]
-29EA; [0C CD FB, 05, 05]
+2A42; [0C D1 54, 05, 05]
-29EB; [0C CE 04, 05, 05]
+2A43; [0C D1 5B, 05, 05]
-29EC; [0C CE 0B, 05, 05]
+2A44; [0C D1 62, 05, 05]
-29ED; [0C CE 12, 05, 05]
+2A45; [0C D1 69, 05, 05]
-29EE; [0C CE 19, 05, 05]
+2A46; [0C D1 70, 05, 05]
-29EF; [0C CE 20, 05, 05]
+2A47; [0C D1 77, 05, 05]
-29F0; [0C CE 27, 05, 05]
+2A48; [0C D1 7E, 05, 05]
-29F1; [0C CE 2E, 05, 05]
+2A49; [0C D1 85, 05, 05]
-29F2; [0C CE 35, 05, 05]
+2A4A; [0C D1 8C, 05, 05]
-29F3; [0C CE 3C, 05, 05]
+2A4B; [0C D1 93, 05, 05]
-29F4; [0C CE 43, 05, 05]
+2A4C; [0C D1 9A, 05, 05]
-29F5; [0C CE 4A, 05, 05]
+2A4D; [0C D1 A1, 05, 05]
-29F6; [0C CE 51, 05, 05]
+2A4E; [0C D1 A8, 05, 05]
-29F7; [0C CE 58, 05, 05]
+2A4F; [0C D1 AF, 05, 05]
-29F8; [0C CE 5F, 05, 05]
+2A50; [0C D1 B6, 05, 05]
-29F9; [0C CE 66, 05, 05]
+2A51; [0C D1 BD, 05, 05]
-29FA; [0C CE 6D, 05, 05]
+2A52; [0C D1 C4, 05, 05]
-29FB; [0C CE 74, 05, 05]
+2A53; [0C D1 CB, 05, 05]
-29FE; [0C CE 7B, 05, 05]
+2A54; [0C D1 D2, 05, 05]
-29FF; [0C CE 82, 05, 05]
+2A55; [0C D1 D9, 05, 05]
-2A00; [0C CE 89, 05, 05]
+2A56; [0C D1 E0, 05, 05]
-2A01; [0C CE 90, 05, 05]
+2A57; [0C D1 E7, 05, 05]
-2A02; [0C CE 97, 05, 05]
+2A58; [0C D1 EE, 05, 05]
-2A03; [0C CE 9E, 05, 05]
+2A59; [0C D1 F5, 05, 05]
-2A04; [0C CE A5, 05, 05]
+2A5A; [0C D1 FC, 05, 05]
-2A05; [0C CE AC, 05, 05]
+2A5B; [0C D2 05, 05, 05]
-2A06; [0C CE B3, 05, 05]
+2A5C; [0C D2 0C, 05, 05]
-2A07; [0C CE BA, 05, 05]
+2A5D; [0C D2 13, 05, 05]
-2A08; [0C CE C1, 05, 05]
+2A5E; [0C D2 1A, 05, 05]
-2A09; [0C CE C8, 05, 05]
+2A5F; [0C D2 21, 05, 05]
-2A0A; [0C CE CF, 05, 05]
+2A60; [0C D2 28, 05, 05]
-2A0B; [0C CE D6, 05, 05]
+2A61; [0C D2 2F, 05, 05]
-2A0D; [0C CE DD, 05, 05]
+2A62; [0C D2 36, 05, 05]
-2A0E; [0C CE E4, 05, 05]
+2A63; [0C D2 3D, 05, 05]
-2A0F; [0C CE EB, 05, 05]
+2A64; [0C D2 44, 05, 05]
-2A10; [0C CE F2, 05, 05]
+2A65; [0C D2 4B, 05, 05]
-2A11; [0C CE F9, 05, 05]
+2A66; [0C D2 52, 05, 05]
-2A12; [0C CF 02, 05, 05]
+2A67; [0C D2 59, 05, 05]
-2A13; [0C CF 09, 05, 05]
+2A68; [0C D2 60, 05, 05]
-2A14; [0C CF 10, 05, 05]
+2A69; [0C D2 67, 05, 05]
-2A15; [0C CF 17, 05, 05]
+2A6A; [0C D2 6E, 05, 05]
-2A16; [0C CF 1E, 05, 05]
+2A6B; [0C D2 75, 05, 05]
-2A17; [0C CF 25, 05, 05]
+2A6C; [0C D2 7C, 05, 05]
-2A18; [0C CF 2C, 05, 05]
+2A6D; [0C D2 83, 05, 05]
-2A19; [0C CF 33, 05, 05]
+2A6E; [0C D2 8A, 05, 05]
-2A1A; [0C CF 3A, 05, 05]
+2A6F; [0C D2 91, 05, 05]
-2A1B; [0C CF 41, 05, 05]
+2A70; [0C D2 98, 05, 05]
-2A1C; [0C CF 48, 05, 05]
+2A71; [0C D2 9F, 05, 05]
-2A1D; [0C CF 4F, 05, 05]
+2A72; [0C D2 A6, 05, 05]
-2A1E; [0C CF 56, 05, 05]
+2A73; [0C D2 AD, 05, 05]
-2A1F; [0C CF 5D, 05, 05]
+2A77; [0C D2 B4, 05, 05]
-2A20; [0C CF 64, 05, 05]
+2A78; [0C D2 BB, 05, 05]
-2A21; [0C CF 6B, 05, 05]
+2A79; [0C D2 C2, 05, 05]
-2A22; [0C CF 72, 05, 05]
+2A7A; [0C D2 C9, 05, 05]
-2A23; [0C CF 79, 05, 05]
+2A7B; [0C D2 D0, 05, 05]
-2A24; [0C CF 80, 05, 05]
+2A7C; [0C D2 D7, 05, 05]
-2A25; [0C CF 87, 05, 05]
+2A7D; [0C D2 DE, 05, 05]
-2A26; [0C CF 8E, 05, 05]
+2A7E; [0C D2 E5, 05, 05]
-2A27; [0C CF 95, 05, 05]
+2A7F; [0C D2 EC, 05, 05]
-2A28; [0C CF 9C, 05, 05]
+2A80; [0C D2 F3, 05, 05]
-2A29; [0C CF A3, 05, 05]
+2A81; [0C D2 FA, 05, 05]
-2A2A; [0C CF AA, 05, 05]
+2A82; [0C D3 03, 05, 05]
-2A2B; [0C CF B1, 05, 05]
+2A83; [0C D3 0A, 05, 05]
-2A2C; [0C CF B8, 05, 05]
+2A84; [0C D3 11, 05, 05]
-2A2D; [0C CF BF, 05, 05]
+2A85; [0C D3 18, 05, 05]
-2A2E; [0C CF C6, 05, 05]
+2A86; [0C D3 1F, 05, 05]
-2A2F; [0C CF CD, 05, 05]
+2A87; [0C D3 26, 05, 05]
-2A30; [0C CF D4, 05, 05]
+2A88; [0C D3 2D, 05, 05]
-2A31; [0C CF DB, 05, 05]
+2A89; [0C D3 34, 05, 05]
-2A32; [0C CF E2, 05, 05]
+2A8A; [0C D3 3B, 05, 05]
-2A33; [0C CF E9, 05, 05]
+2A8B; [0C D3 42, 05, 05]
-2A34; [0C CF F0, 05, 05]
+2A8C; [0C D3 49, 05, 05]
-2A35; [0C CF F7, 05, 05]
+2A8D; [0C D3 50, 05, 05]
-2A36; [0C CF FE, 05, 05]
+2A8E; [0C D3 57, 05, 05]
-2A37; [0C D0 07, 05, 05]
+2A8F; [0C D3 5E, 05, 05]
-2A38; [0C D0 0E, 05, 05]
+2A90; [0C D3 65, 05, 05]
-2A39; [0C D0 15, 05, 05]
+2A91; [0C D3 6C, 05, 05]
-2A3A; [0C D0 1C, 05, 05]
+2A92; [0C D3 73, 05, 05]
-2A3B; [0C D0 23, 05, 05]
+2A93; [0C D3 7A, 05, 05]
-2A3C; [0C D0 2A, 05, 05]
+2A94; [0C D3 81, 05, 05]
-2A3D; [0C D0 31, 05, 05]
+2A95; [0C D3 88, 05, 05]
-2A3E; [0C D0 38, 05, 05]
+2A96; [0C D3 8F, 05, 05]
-2A3F; [0C D0 3F, 05, 05]
+2A97; [0C D3 96, 05, 05]
-2A40; [0C D0 46, 05, 05]
+2A98; [0C D3 9D, 05, 05]
-2A41; [0C D0 4D, 05, 05]
+2A99; [0C D3 A4, 05, 05]
-2A42; [0C D0 54, 05, 05]
+2A9A; [0C D3 AB, 05, 05]
-2A43; [0C D0 5B, 05, 05]
+2A9B; [0C D3 B2, 05, 05]
-2A44; [0C D0 62, 05, 05]
+2A9C; [0C D3 B9, 05, 05]
-2A45; [0C D0 69, 05, 05]
+2A9D; [0C D3 C0, 05, 05]
-2A46; [0C D0 70, 05, 05]
+2A9E; [0C D3 C7, 05, 05]
-2A47; [0C D0 77, 05, 05]
+2A9F; [0C D3 CE, 05, 05]
-2A48; [0C D0 7E, 05, 05]
+2AA0; [0C D3 D5, 05, 05]
-2A49; [0C D0 85, 05, 05]
+2AA1; [0C D3 DC, 05, 05]
-2A4A; [0C D0 8C, 05, 05]
+2AA2; [0C D3 E3, 05, 05]
-2A4B; [0C D0 93, 05, 05]
+2AA3; [0C D3 EA, 05, 05]
-2A4C; [0C D0 9A, 05, 05]
+2AA4; [0C D3 F1, 05, 05]
-2A4D; [0C D0 A1, 05, 05]
+2AA5; [0C D3 F8, 05, 05]
-2A4E; [0C D0 A8, 05, 05]
+2AA6; [0C D3 FF, 05, 05]
-2A4F; [0C D0 AF, 05, 05]
+2AA7; [0C D4 08, 05, 05]
-2A50; [0C D0 B6, 05, 05]
+2AA8; [0C D4 0F, 05, 05]
-2A51; [0C D0 BD, 05, 05]
+2AA9; [0C D4 16, 05, 05]
-2A52; [0C D0 C4, 05, 05]
+2AAA; [0C D4 1D, 05, 05]
-2A53; [0C D0 CB, 05, 05]
+2AAB; [0C D4 24, 05, 05]
-2A54; [0C D0 D2, 05, 05]
+2AAC; [0C D4 2B, 05, 05]
-2A55; [0C D0 D9, 05, 05]
+2AAD; [0C D4 32, 05, 05]
-2A56; [0C D0 E0, 05, 05]
+2AAE; [0C D4 39, 05, 05]
-2A57; [0C D0 E7, 05, 05]
+2AAF; [0C D4 40, 05, 05]
-2A58; [0C D0 EE, 05, 05]
+2AB0; [0C D4 47, 05, 05]
-2A59; [0C D0 F5, 05, 05]
+2AB1; [0C D4 4E, 05, 05]
-2A5A; [0C D0 FC, 05, 05]
+2AB2; [0C D4 55, 05, 05]
-2A5B; [0C D1 05, 05, 05]
+2AB3; [0C D4 5C, 05, 05]
-2A5C; [0C D1 0C, 05, 05]
+2AB4; [0C D4 63, 05, 05]
-2A5D; [0C D1 13, 05, 05]
+2AB5; [0C D4 6A, 05, 05]
-2A5E; [0C D1 1A, 05, 05]
+2AB6; [0C D4 71, 05, 05]
-2A5F; [0C D1 21, 05, 05]
+2AB7; [0C D4 78, 05, 05]
-2A60; [0C D1 28, 05, 05]
+2AB8; [0C D4 7F, 05, 05]
-2A61; [0C D1 2F, 05, 05]
+2AB9; [0C D4 86, 05, 05]
-2A62; [0C D1 36, 05, 05]
+2ABA; [0C D4 8D, 05, 05]
-2A63; [0C D1 3D, 05, 05]
+2ABB; [0C D4 94, 05, 05]
-2A64; [0C D1 44, 05, 05]
+2ABC; [0C D4 9B, 05, 05]
-2A65; [0C D1 4B, 05, 05]
+2ABD; [0C D4 A2, 05, 05]
-2A66; [0C D1 52, 05, 05]
+2ABE; [0C D4 A9, 05, 05]
-2A67; [0C D1 59, 05, 05]
+2ABF; [0C D4 B0, 05, 05]
-2A68; [0C D1 60, 05, 05]
+2AC0; [0C D4 B7, 05, 05]
-2A69; [0C D1 67, 05, 05]
+2AC1; [0C D4 BE, 05, 05]
-2A6A; [0C D1 6E, 05, 05]
+2AC2; [0C D4 C5, 05, 05]
-2A6B; [0C D1 75, 05, 05]
+2AC3; [0C D4 CC, 05, 05]
-2A6C; [0C D1 7C, 05, 05]
+2AC4; [0C D4 D3, 05, 05]
-2A6D; [0C D1 83, 05, 05]
+2AC5; [0C D4 DA, 05, 05]
-2A6E; [0C D1 8A, 05, 05]
+2AC6; [0C D4 E1, 05, 05]
-2A6F; [0C D1 91, 05, 05]
+2AC7; [0C D4 E8, 05, 05]
-2A70; [0C D1 98, 05, 05]
+2AC8; [0C D4 EF, 05, 05]
-2A71; [0C D1 9F, 05, 05]
+2AC9; [0C D4 F6, 05, 05]
-2A72; [0C D1 A6, 05, 05]
+2ACA; [0C D4 FD, 05, 05]
-2A73; [0C D1 AD, 05, 05]
+2ACB; [0C D5 06, 05, 05]
-2A77; [0C D1 B4, 05, 05]
+2ACC; [0C D5 0D, 05, 05]
-2A78; [0C D1 BB, 05, 05]
+2ACD; [0C D5 14, 05, 05]
-2A79; [0C D1 C2, 05, 05]
+2ACE; [0C D5 1B, 05, 05]
-2A7A; [0C D1 C9, 05, 05]
+2ACF; [0C D5 22, 05, 05]
-2A7B; [0C D1 D0, 05, 05]
+2AD0; [0C D5 29, 05, 05]
-2A7C; [0C D1 D7, 05, 05]
+2AD1; [0C D5 30, 05, 05]
-2A7D; [0C D1 DE, 05, 05]
+2AD2; [0C D5 37, 05, 05]
-2A7E; [0C D1 E5, 05, 05]
+2AD3; [0C D5 3E, 05, 05]
-2A7F; [0C D1 EC, 05, 05]
+2AD4; [0C D5 45, 05, 05]
-2A80; [0C D1 F3, 05, 05]
+2AD5; [0C D5 4C, 05, 05]
-2A81; [0C D1 FA, 05, 05]
+2AD6; [0C D5 53, 05, 05]
-2A82; [0C D2 03, 05, 05]
+2AD7; [0C D5 5A, 05, 05]
-2A83; [0C D2 0A, 05, 05]
+2AD8; [0C D5 61, 05, 05]
-2A84; [0C D2 11, 05, 05]
+2AD9; [0C D5 68, 05, 05]
-2A85; [0C D2 18, 05, 05]
+2ADA; [0C D5 6F, 05, 05]
-2A86; [0C D2 1F, 05, 05]
+2ADB; [0C D5 76, 05, 05]
-2A87; [0C D2 26, 05, 05]
+2ADD; [0C D5 7D, 05, 05]
+2ADC; [0C D5 7D, 05, 05][, 9E, 05]
-2A88; [0C D2 2D, 05, 05]
+2ADE; [0C D5 84, 05, 05]
-2A89; [0C D2 34, 05, 05]
+2ADF; [0C D5 8B, 05, 05]
-2A8A; [0C D2 3B, 05, 05]
+2AE0; [0C D5 92, 05, 05]
-2A8B; [0C D2 42, 05, 05]
+2AE1; [0C D5 99, 05, 05]
-2A8C; [0C D2 49, 05, 05]
+2AE2; [0C D5 A0, 05, 05]
-2A8D; [0C D2 50, 05, 05]
+2AE3; [0C D5 A7, 05, 05]
-2A8E; [0C D2 57, 05, 05]
+2AE4; [0C D5 AE, 05, 05]
-2A8F; [0C D2 5E, 05, 05]
+2AE5; [0C D5 B5, 05, 05]
-2A90; [0C D2 65, 05, 05]
+2AE6; [0C D5 BC, 05, 05]
-2A91; [0C D2 6C, 05, 05]
+2AE7; [0C D5 C3, 05, 05]
-2A92; [0C D2 73, 05, 05]
+2AE8; [0C D5 CA, 05, 05]
-2A93; [0C D2 7A, 05, 05]
+2AE9; [0C D5 D1, 05, 05]
-2A94; [0C D2 81, 05, 05]
+2AEA; [0C D5 D8, 05, 05]
-2A95; [0C D2 88, 05, 05]
+2AEB; [0C D5 DF, 05, 05]
-2A96; [0C D2 8F, 05, 05]
+2AEC; [0C D5 E6, 05, 05]
-2A97; [0C D2 96, 05, 05]
+2AED; [0C D5 ED, 05, 05]
-2A98; [0C D2 9D, 05, 05]
+2AEE; [0C D5 F4, 05, 05]
-2A99; [0C D2 A4, 05, 05]
+2AEF; [0C D5 FB, 05, 05]
-2A9A; [0C D2 AB, 05, 05]
+2AF0; [0C D6 04, 05, 05]
-2A9B; [0C D2 B2, 05, 05]
+2AF1; [0C D6 0B, 05, 05]
-2A9C; [0C D2 B9, 05, 05]
+2AF2; [0C D6 12, 05, 05]
-2A9D; [0C D2 C0, 05, 05]
+2AF3; [0C D6 19, 05, 05]
-2A9E; [0C D2 C7, 05, 05]
+2AF4; [0C D6 20, 05, 05]
-2A9F; [0C D2 CE, 05, 05]
+2AF5; [0C D6 27, 05, 05]
-2AA0; [0C D2 D5, 05, 05]
+2AF6; [0C D6 2E, 05, 05]
-2AA1; [0C D2 DC, 05, 05]
+2AF7; [0C D6 35, 05, 05]
-2AA2; [0C D2 E3, 05, 05]
+2AF8; [0C D6 3C, 05, 05]
-2AA3; [0C D2 EA, 05, 05]
+2AF9; [0C D6 43, 05, 05]
-2AA4; [0C D2 F1, 05, 05]
+2AFA; [0C D6 4A, 05, 05]
-2AA5; [0C D2 F8, 05, 05]
+2AFB; [0C D6 51, 05, 05]
-2AA6; [0C D2 FF, 05, 05]
+2AFC; [0C D6 58, 05, 05]
-2AA7; [0C D3 08, 05, 05]
+2AFD; [0C D6 5F, 05, 05]
-2AA8; [0C D3 0F, 05, 05]
+2AFE; [0C D6 66, 05, 05]
-2AA9; [0C D3 16, 05, 05]
+2AFF; [0C D6 6D, 05, 05]
-2AAA; [0C D3 1D, 05, 05]
+2B00; [0C D6 74, 05, 05]
-2AAB; [0C D3 24, 05, 05]
+2B01; [0C D6 7B, 05, 05]
-2AAC; [0C D3 2B, 05, 05]
+2B02; [0C D6 82, 05, 05]
-2AAD; [0C D3 32, 05, 05]
+2B03; [0C D6 89, 05, 05]
-2AAE; [0C D3 39, 05, 05]
+2B04; [0C D6 90, 05, 05]
-2AAF; [0C D3 40, 05, 05]
+2B05; [0C D6 97, 05, 05]
-2AB0; [0C D3 47, 05, 05]
+2B06; [0C D6 9E, 05, 05]
-2AB1; [0C D3 4E, 05, 05]
+2B07; [0C D6 A5, 05, 05]
-2AB2; [0C D3 55, 05, 05]
+2B08; [0C D6 AC, 05, 05]
-2AB3; [0C D3 5C, 05, 05]
+2B09; [0C D6 B3, 05, 05]
-2AB4; [0C D3 63, 05, 05]
+2B0A; [0C D6 BA, 05, 05]
-2AB5; [0C D3 6A, 05, 05]
+2B0B; [0C D6 C1, 05, 05]
-2AB6; [0C D3 71, 05, 05]
+2B0C; [0C D6 C8, 05, 05]
-2AB7; [0C D3 78, 05, 05]
+2B0D; [0C D6 CF, 05, 05]
-2AB8; [0C D3 7F, 05, 05]
+2B0E; [0C D6 D6, 05, 05]
-2AB9; [0C D3 86, 05, 05]
+2B0F; [0C D6 DD, 05, 05]
-2ABA; [0C D3 8D, 05, 05]
+2B10; [0C D6 E4, 05, 05]
-2ABB; [0C D3 94, 05, 05]
+2B11; [0C D6 EB, 05, 05]
-2ABC; [0C D3 9B, 05, 05]
+2B12; [0C D6 F2, 05, 05]
-2ABD; [0C D3 A2, 05, 05]
+2B13; [0C D6 F9, 05, 05]
-2ABE; [0C D3 A9, 05, 05]
+2B14; [0C D7 02, 05, 05]
-2ABF; [0C D3 B0, 05, 05]
+2B15; [0C D7 09, 05, 05]
-2AC0; [0C D3 B7, 05, 05]
+2B16; [0C D7 10, 05, 05]
-2AC1; [0C D3 BE, 05, 05]
+2B17; [0C D7 17, 05, 05]
-2AC2; [0C D3 C5, 05, 05]
+2B18; [0C D7 1E, 05, 05]
-2AC3; [0C D3 CC, 05, 05]
+2B19; [0C D7 25, 05, 05]
-2AC4; [0C D3 D3, 05, 05]
+2B1A; [0C D7 2C, 05, 05]
-2AC5; [0C D3 DA, 05, 05]
+2B1B; [0C D7 33, 05, 05]
-2AC6; [0C D3 E1, 05, 05]
+2B1C; [0C D7 3A, 05, 05]
-2AC7; [0C D3 E8, 05, 05]
+2B1D; [0C D7 41, 05, 05]
-2AC8; [0C D3 EF, 05, 05]
+2B1E; [0C D7 48, 05, 05]
-2AC9; [0C D3 F6, 05, 05]
+2B1F; [0C D7 4F, 05, 05]
-2ACA; [0C D3 FD, 05, 05]
+2B20; [0C D7 56, 05, 05]
-2ACB; [0C D4 06, 05, 05]
+2B21; [0C D7 5D, 05, 05]
-2ACC; [0C D4 0D, 05, 05]
+2B22; [0C D7 64, 05, 05]
-2ACD; [0C D4 14, 05, 05]
+2B23; [0C D7 6B, 05, 05]
-2ACE; [0C D4 1B, 05, 05]
+2B24; [0C D7 72, 05, 05]
-2ACF; [0C D4 22, 05, 05]
+2B25; [0C D7 79, 05, 05]
-2AD0; [0C D4 29, 05, 05]
+2B26; [0C D7 80, 05, 05]
-2AD1; [0C D4 30, 05, 05]
+2B27; [0C D7 87, 05, 05]
-2AD2; [0C D4 37, 05, 05]
+2B28; [0C D7 8E, 05, 05]
-2AD3; [0C D4 3E, 05, 05]
+2B29; [0C D7 95, 05, 05]
-2AD4; [0C D4 45, 05, 05]
+2B2A; [0C D7 9C, 05, 05]
-2AD5; [0C D4 4C, 05, 05]
+2B2B; [0C D7 A3, 05, 05]
-2AD6; [0C D4 53, 05, 05]
+2B2C; [0C D7 AA, 05, 05]
-2AD7; [0C D4 5A, 05, 05]
+2B2D; [0C D7 B1, 05, 05]
-2AD8; [0C D4 61, 05, 05]
+2B2E; [0C D7 B8, 05, 05]
-2AD9; [0C D4 68, 05, 05]
+2B2F; [0C D7 BF, 05, 05]
-2ADA; [0C D4 6F, 05, 05]
+2B30; [0C D7 C6, 05, 05]
-2ADB; [0C D4 76, 05, 05]
+2B31; [0C D7 CD, 05, 05]
-2ADD; [0C D4 7D, 05, 05]
-2ADC; [0C D4 7D, 05, 05][, 9E, 05]
+2B32; [0C D7 D4, 05, 05]
-2ADE; [0C D4 84, 05, 05]
+2B33; [0C D7 DB, 05, 05]
-2ADF; [0C D4 8B, 05, 05]
+2B34; [0C D7 E2, 05, 05]
-2AE0; [0C D4 92, 05, 05]
+2B35; [0C D7 E9, 05, 05]
-2AE1; [0C D4 99, 05, 05]
+2B36; [0C D7 F0, 05, 05]
-2AE2; [0C D4 A0, 05, 05]
+2B37; [0C D7 F7, 05, 05]
-2AE3; [0C D4 A7, 05, 05]
+2B38; [0C D7 FE, 05, 05]
-2AE4; [0C D4 AE, 05, 05]
+2B39; [0C D8 07, 05, 05]
-2AE5; [0C D4 B5, 05, 05]
+2B3A; [0C D8 0E, 05, 05]
-2AE6; [0C D4 BC, 05, 05]
+2B3B; [0C D8 15, 05, 05]
-2AE7; [0C D4 C3, 05, 05]
+2B3C; [0C D8 1C, 05, 05]
-2AE8; [0C D4 CA, 05, 05]
+2B3D; [0C D8 23, 05, 05]
-2AE9; [0C D4 D1, 05, 05]
+2B3E; [0C D8 2A, 05, 05]
-2AEA; [0C D4 D8, 05, 05]
+2B3F; [0C D8 31, 05, 05]
-2AEB; [0C D4 DF, 05, 05]
+2B40; [0C D8 38, 05, 05]
-2AEC; [0C D4 E6, 05, 05]
+2B41; [0C D8 3F, 05, 05]
-2AED; [0C D4 ED, 05, 05]
+2B42; [0C D8 46, 05, 05]
-2AEE; [0C D4 F4, 05, 05]
+2B43; [0C D8 4D, 05, 05]
-2AEF; [0C D4 FB, 05, 05]
+2B44; [0C D8 54, 05, 05]
-2AF0; [0C D5 04, 05, 05]
+2B45; [0C D8 5B, 05, 05]
-2AF1; [0C D5 0B, 05, 05]
+2B46; [0C D8 62, 05, 05]
-2AF2; [0C D5 12, 05, 05]
+2B47; [0C D8 69, 05, 05]
-2AF3; [0C D5 19, 05, 05]
+2B48; [0C D8 70, 05, 05]
-2AF4; [0C D5 20, 05, 05]
+2B49; [0C D8 77, 05, 05]
-2AF5; [0C D5 27, 05, 05]
+2B4A; [0C D8 7E, 05, 05]
-2AF6; [0C D5 2E, 05, 05]
+2B4B; [0C D8 85, 05, 05]
-2AF7; [0C D5 35, 05, 05]
+2B4C; [0C D8 8C, 05, 05]
-2AF8; [0C D5 3C, 05, 05]
+2B4D; [0C D8 93, 05, 05]
-2AF9; [0C D5 43, 05, 05]
+2B4E; [0C D8 9A, 05, 05]
-2AFA; [0C D5 4A, 05, 05]
+2B4F; [0C D8 A1, 05, 05]
-2AFB; [0C D5 51, 05, 05]
+2B50; [0C D8 A8, 05, 05]
-2AFC; [0C D5 58, 05, 05]
+2B51; [0C D8 AF, 05, 05]
-2AFD; [0C D5 5F, 05, 05]
+2B52; [0C D8 B6, 05, 05]
-2AFE; [0C D5 66, 05, 05]
+2B53; [0C D8 BD, 05, 05]
-2AFF; [0C D5 6D, 05, 05]
+2B54; [0C D8 C4, 05, 05]
-2B00; [0C D5 74, 05, 05]
+2B55; [0C D8 CB, 05, 05]
-2B01; [0C D5 7B, 05, 05]
+2B56; [0C D8 D2, 05, 05]
-2B02; [0C D5 82, 05, 05]
+2B57; [0C D8 D9, 05, 05]
-2B03; [0C D5 89, 05, 05]
+2B58; [0C D8 E0, 05, 05]
-2B04; [0C D5 90, 05, 05]
+2B59; [0C D8 E7, 05, 05]
-2B05; [0C D5 97, 05, 05]
+2B5A; [0C D8 EE, 05, 05]
-2B06; [0C D5 9E, 05, 05]
+2B5B; [0C D8 F5, 05, 05]
-2B07; [0C D5 A5, 05, 05]
+2B5C; [0C D8 FC, 05, 05]
-2B08; [0C D5 AC, 05, 05]
+2B5D; [0C D9 05, 05, 05]
-2B09; [0C D5 B3, 05, 05]
+2B5E; [0C D9 0C, 05, 05]
-2B0A; [0C D5 BA, 05, 05]
+2B5F; [0C D9 13, 05, 05]
-2B0B; [0C D5 C1, 05, 05]
+2B60; [0C D9 1A, 05, 05]
-2B0C; [0C D5 C8, 05, 05]
+2B61; [0C D9 21, 05, 05]
-2B0D; [0C D5 CF, 05, 05]
+2B62; [0C D9 28, 05, 05]
-2B0E; [0C D5 D6, 05, 05]
+2B63; [0C D9 2F, 05, 05]
-2B0F; [0C D5 DD, 05, 05]
+2B64; [0C D9 36, 05, 05]
-2B10; [0C D5 E4, 05, 05]
+2B65; [0C D9 3D, 05, 05]
-2B11; [0C D5 EB, 05, 05]
+2B66; [0C D9 44, 05, 05]
-2B12; [0C D5 F2, 05, 05]
+2B67; [0C D9 4B, 05, 05]
-2B13; [0C D5 F9, 05, 05]
+2B68; [0C D9 52, 05, 05]
-2B14; [0C D6 02, 05, 05]
+2B69; [0C D9 59, 05, 05]
-2B15; [0C D6 09, 05, 05]
+2B6A; [0C D9 60, 05, 05]
-2B16; [0C D6 10, 05, 05]
+2B6B; [0C D9 67, 05, 05]
-2B17; [0C D6 17, 05, 05]
+2B6C; [0C D9 6E, 05, 05]
-2B18; [0C D6 1E, 05, 05]
+2B6D; [0C D9 75, 05, 05]
-2B19; [0C D6 25, 05, 05]
+2B6E; [0C D9 7C, 05, 05]
-2B1A; [0C D6 2C, 05, 05]
+2B6F; [0C D9 83, 05, 05]
-2B1B; [0C D6 33, 05, 05]
+2B70; [0C D9 8A, 05, 05]
-2B1C; [0C D6 3A, 05, 05]
+2B71; [0C D9 91, 05, 05]
-2B1D; [0C D6 41, 05, 05]
+2B72; [0C D9 98, 05, 05]
-2B1E; [0C D6 48, 05, 05]
+2B73; [0C D9 9F, 05, 05]
-2B1F; [0C D6 4F, 05, 05]
+2B76; [0C D9 A6, 05, 05]
-2B20; [0C D6 56, 05, 05]
+2B77; [0C D9 AD, 05, 05]
-2B21; [0C D6 5D, 05, 05]
+2B78; [0C D9 B4, 05, 05]
-2B22; [0C D6 64, 05, 05]
+2B79; [0C D9 BB, 05, 05]
-2B23; [0C D6 6B, 05, 05]
+2B7A; [0C D9 C2, 05, 05]
-2B24; [0C D6 72, 05, 05]
+2B7B; [0C D9 C9, 05, 05]
-2B25; [0C D6 79, 05, 05]
+2B7C; [0C D9 D0, 05, 05]
-2B26; [0C D6 80, 05, 05]
+2B7D; [0C D9 D7, 05, 05]
-2B27; [0C D6 87, 05, 05]
+2B7E; [0C D9 DE, 05, 05]
-2B28; [0C D6 8E, 05, 05]
+2B7F; [0C D9 E5, 05, 05]
-2B29; [0C D6 95, 05, 05]
+2B80; [0C D9 EC, 05, 05]
-2B2A; [0C D6 9C, 05, 05]
+2B81; [0C D9 F3, 05, 05]
-2B2B; [0C D6 A3, 05, 05]
+2B82; [0C D9 FA, 05, 05]
-2B2C; [0C D6 AA, 05, 05]
+2B83; [0C DA 03, 05, 05]
-2B2D; [0C D6 B1, 05, 05]
+2B84; [0C DA 0A, 05, 05]
-2B2E; [0C D6 B8, 05, 05]
+2B85; [0C DA 11, 05, 05]
-2B2F; [0C D6 BF, 05, 05]
+2B86; [0C DA 18, 05, 05]
-2B30; [0C D6 C6, 05, 05]
+2B87; [0C DA 1F, 05, 05]
-2B31; [0C D6 CD, 05, 05]
+2B88; [0C DA 26, 05, 05]
-2B32; [0C D6 D4, 05, 05]
+2B89; [0C DA 2D, 05, 05]
-2B33; [0C D6 DB, 05, 05]
+2B8A; [0C DA 34, 05, 05]
-2B34; [0C D6 E2, 05, 05]
+2B8B; [0C DA 3B, 05, 05]
-2B35; [0C D6 E9, 05, 05]
+2B8C; [0C DA 42, 05, 05]
-2B36; [0C D6 F0, 05, 05]
+2B8D; [0C DA 49, 05, 05]
-2B37; [0C D6 F7, 05, 05]
+2B8E; [0C DA 50, 05, 05]
-2B38; [0C D6 FE, 05, 05]
+2B8F; [0C DA 57, 05, 05]
-2B39; [0C D7 07, 05, 05]
+2B90; [0C DA 5E, 05, 05]
-2B3A; [0C D7 0E, 05, 05]
+2B91; [0C DA 65, 05, 05]
-2B3B; [0C D7 15, 05, 05]
+2B92; [0C DA 6C, 05, 05]
-2B3C; [0C D7 1C, 05, 05]
+2B93; [0C DA 73, 05, 05]
-2B3D; [0C D7 23, 05, 05]
+2B94; [0C DA 7A, 05, 05]
-2B3E; [0C D7 2A, 05, 05]
+2B95; [0C DA 81, 05, 05]
-2B3F; [0C D7 31, 05, 05]
+2B98; [0C DA 88, 05, 05]
-2B40; [0C D7 38, 05, 05]
+2B99; [0C DA 8F, 05, 05]
-2B41; [0C D7 3F, 05, 05]
+2B9A; [0C DA 96, 05, 05]
-2B42; [0C D7 46, 05, 05]
+2B9B; [0C DA 9D, 05, 05]
-2B43; [0C D7 4D, 05, 05]
+2B9C; [0C DA A4, 05, 05]
-2B44; [0C D7 54, 05, 05]
+2B9D; [0C DA AB, 05, 05]
-2B45; [0C D7 5B, 05, 05]
+2B9E; [0C DA B2, 05, 05]
-2B46; [0C D7 62, 05, 05]
+2B9F; [0C DA B9, 05, 05]
-2B47; [0C D7 69, 05, 05]
+2BA0; [0C DA C0, 05, 05]
-2B48; [0C D7 70, 05, 05]
+2BA1; [0C DA C7, 05, 05]
-2B49; [0C D7 77, 05, 05]
+2BA2; [0C DA CE, 05, 05]
-2B4A; [0C D7 7E, 05, 05]
+2BA3; [0C DA D5, 05, 05]
-2B4B; [0C D7 85, 05, 05]
+2BA4; [0C DA DC, 05, 05]
-2B4C; [0C D7 8C, 05, 05]
+2BA5; [0C DA E3, 05, 05]
-2B4D; [0C D7 93, 05, 05]
+2BA6; [0C DA EA, 05, 05]
-2B4E; [0C D7 9A, 05, 05]
+2BA7; [0C DA F1, 05, 05]
-2B4F; [0C D7 A1, 05, 05]
+2BA8; [0C DA F8, 05, 05]
-2B50; [0C D7 A8, 05, 05]
+2BA9; [0C DA FF, 05, 05]
-2B51; [0C D7 AF, 05, 05]
+2BAA; [0C DB 08, 05, 05]
-2B52; [0C D7 B6, 05, 05]
+2BAB; [0C DB 0F, 05, 05]
-2B53; [0C D7 BD, 05, 05]
+2BAC; [0C DB 16, 05, 05]
-2B54; [0C D7 C4, 05, 05]
+2BAD; [0C DB 1D, 05, 05]
-2B55; [0C D7 CB, 05, 05]
+2BAE; [0C DB 24, 05, 05]
-2B56; [0C D7 D2, 05, 05]
+2BAF; [0C DB 2B, 05, 05]
-2B57; [0C D7 D9, 05, 05]
+2BB0; [0C DB 32, 05, 05]
-2B58; [0C D7 E0, 05, 05]
+2BB1; [0C DB 39, 05, 05]
-2B59; [0C D7 E7, 05, 05]
+2BB2; [0C DB 40, 05, 05]
-2B5A; [0C D7 EE, 05, 05]
+2BB3; [0C DB 47, 05, 05]
-2B5B; [0C D7 F5, 05, 05]
+2BB4; [0C DB 4E, 05, 05]
-2B5C; [0C D7 FC, 05, 05]
+2BB5; [0C DB 55, 05, 05]
-2B5D; [0C D8 05, 05, 05]
+2BB6; [0C DB 5C, 05, 05]
-2B5E; [0C D8 0C, 05, 05]
+2BB7; [0C DB 63, 05, 05]
-2B5F; [0C D8 13, 05, 05]
+2BB8; [0C DB 6A, 05, 05]
-2B60; [0C D8 1A, 05, 05]
+2BB9; [0C DB 71, 05, 05]
-2B61; [0C D8 21, 05, 05]
+2BBA; [0C DB 78, 05, 05]
-2B62; [0C D8 28, 05, 05]
+2BBB; [0C DB 7F, 05, 05]
-2B63; [0C D8 2F, 05, 05]
+2BBC; [0C DB 86, 05, 05]
-2B64; [0C D8 36, 05, 05]
+2BBD; [0C DB 8D, 05, 05]
-2B65; [0C D8 3D, 05, 05]
+2BBE; [0C DB 94, 05, 05]
-2B66; [0C D8 44, 05, 05]
+2BBF; [0C DB 9B, 05, 05]
-2B67; [0C D8 4B, 05, 05]
+2BC0; [0C DB A2, 05, 05]
-2B68; [0C D8 52, 05, 05]
+2BC1; [0C DB A9, 05, 05]
-2B69; [0C D8 59, 05, 05]
+2BC2; [0C DB B0, 05, 05]
-2B6A; [0C D8 60, 05, 05]
+2BC3; [0C DB B7, 05, 05]
-2B6B; [0C D8 67, 05, 05]
+2BC4; [0C DB BE, 05, 05]
-2B6C; [0C D8 6E, 05, 05]
+2BC5; [0C DB C5, 05, 05]
-2B6D; [0C D8 75, 05, 05]
+2BC6; [0C DB CC, 05, 05]
-2B6E; [0C D8 7C, 05, 05]
+2BC7; [0C DB D3, 05, 05]
-2B6F; [0C D8 83, 05, 05]
+2BC8; [0C DB DA, 05, 05]
-2B70; [0C D8 8A, 05, 05]
+2BC9; [0C DB E1, 05, 05]
-2B71; [0C D8 91, 05, 05]
+2BCA; [0C DB E8, 05, 05]
-2B72; [0C D8 98, 05, 05]
+2BCB; [0C DB EF, 05, 05]
-2B73; [0C D8 9F, 05, 05]
+2BCC; [0C DB F6, 05, 05]
-2B76; [0C D8 A6, 05, 05]
+2BCD; [0C DB FD, 05, 05]
-2B77; [0C D8 AD, 05, 05]
+2BCE; [0C DC 06, 05, 05]
-2B78; [0C D8 B4, 05, 05]
+2BCF; [0C DC 0D, 05, 05]
-2B79; [0C D8 BB, 05, 05]
+2BD0; [0C DC 14, 05, 05]
-2B7A; [0C D8 C2, 05, 05]
+2BD1; [0C DC 1B, 05, 05]
-2B7B; [0C D8 C9, 05, 05]
+2BD2; [0C DC 22, 05, 05]
-2B7C; [0C D8 D0, 05, 05]
+2BD3; [0C DC 29, 05, 05]
-2B7D; [0C D8 D7, 05, 05]
+2BD4; [0C DC 30, 05, 05]
-2B7E; [0C D8 DE, 05, 05]
+2BD5; [0C DC 37, 05, 05]
-2B7F; [0C D8 E5, 05, 05]
+2BD6; [0C DC 3E, 05, 05]
-2B80; [0C D8 EC, 05, 05]
+2BD7; [0C DC 45, 05, 05]
-2B81; [0C D8 F3, 05, 05]
+2BD8; [0C DC 4C, 05, 05]
-2B82; [0C D8 FA, 05, 05]
+2BD9; [0C DC 53, 05, 05]
-2B83; [0C D9 03, 05, 05]
+2BDA; [0C DC 5A, 05, 05]
-2B84; [0C D9 0A, 05, 05]
+2BDB; [0C DC 61, 05, 05]
-2B85; [0C D9 11, 05, 05]
+2BDC; [0C DC 68, 05, 05]
-2B86; [0C D9 18, 05, 05]
+2BDD; [0C DC 6F, 05, 05]
-2B87; [0C D9 1F, 05, 05]
+2BDE; [0C DC 76, 05, 05]
-2B88; [0C D9 26, 05, 05]
+2BDF; [0C DC 7D, 05, 05]
-2B89; [0C D9 2D, 05, 05]
+2BE0; [0C DC 84, 05, 05]
-2B8A; [0C D9 34, 05, 05]
+2BE1; [0C DC 8B, 05, 05]
-2B8B; [0C D9 3B, 05, 05]
+2BE2; [0C DC 92, 05, 05]
-2B8C; [0C D9 42, 05, 05]
+2BE3; [0C DC 99, 05, 05]
-2B8D; [0C D9 49, 05, 05]
+2BE4; [0C DC A0, 05, 05]
-2B8E; [0C D9 50, 05, 05]
+2BE5; [0C DC A7, 05, 05]
-2B8F; [0C D9 57, 05, 05]
+2BE6; [0C DC AE, 05, 05]
-2B90; [0C D9 5E, 05, 05]
+2BE7; [0C DC B5, 05, 05]
-2B91; [0C D9 65, 05, 05]
+2BE8; [0C DC BC, 05, 05]
-2B92; [0C D9 6C, 05, 05]
+2BE9; [0C DC C3, 05, 05]
-2B93; [0C D9 73, 05, 05]
+2BEA; [0C DC CA, 05, 05]
-2B94; [0C D9 7A, 05, 05]
+2BEB; [0C DC D1, 05, 05]
-2B95; [0C D9 81, 05, 05]
+2BEC; [0C DC D8, 05, 05]
-2B98; [0C D9 88, 05, 05]
+2BED; [0C DC DF, 05, 05]
-2B99; [0C D9 8F, 05, 05]
+2BEE; [0C DC E6, 05, 05]
-2B9A; [0C D9 96, 05, 05]
+2BEF; [0C DC ED, 05, 05]
-2B9B; [0C D9 9D, 05, 05]
+2BF0; [0C DC F4, 05, 05]
-2B9C; [0C D9 A4, 05, 05]
+2BF1; [0C DC FB, 05, 05]
-2B9D; [0C D9 AB, 05, 05]
+2BF2; [0C DD 04, 05, 05]
-2B9E; [0C D9 B2, 05, 05]
+2BF3; [0C DD 0B, 05, 05]
-2B9F; [0C D9 B9, 05, 05]
+2BF4; [0C DD 12, 05, 05]
-2BA0; [0C D9 C0, 05, 05]
+2BF5; [0C DD 19, 05, 05]
-2BA1; [0C D9 C7, 05, 05]
+2BF6; [0C DD 20, 05, 05]
-2BA2; [0C D9 CE, 05, 05]
+2BF7; [0C DD 27, 05, 05]
-2BA3; [0C D9 D5, 05, 05]
+2BF8; [0C DD 2E, 05, 05]
-2BA4; [0C D9 DC, 05, 05]
+2BF9; [0C DD 35, 05, 05]
-2BA5; [0C D9 E3, 05, 05]
+2BFA; [0C DD 3C, 05, 05]
-2BA6; [0C D9 EA, 05, 05]
+2BFB; [0C DD 43, 05, 05]
-2BA7; [0C D9 F1, 05, 05]
+2BFC; [0C DD 4A, 05, 05]
-2BA8; [0C D9 F8, 05, 05]
+2BFD; [0C DD 51, 05, 05]
-2BA9; [0C D9 FF, 05, 05]
+2BFE; [0C DD 58, 05, 05]
-2BAA; [0C DA 08, 05, 05]
+2BFF; [0C DD 5F, 05, 05]
-2BAB; [0C DA 0F, 05, 05]
+2CE5; [0C DD 66, 05, 05]
-2BAC; [0C DA 16, 05, 05]
+2CE6; [0C DD 6D, 05, 05]
-2BAD; [0C DA 1D, 05, 05]
+2CE7; [0C DD 74, 05, 05]
-2BAE; [0C DA 24, 05, 05]
+2CE8; [0C DD 7B, 05, 05]
-2BAF; [0C DA 2B, 05, 05]
+2CE9; [0C DD 82, 05, 05]
-2BB0; [0C DA 32, 05, 05]
+2CEA; [0C DD 89, 05, 05]
-2BB1; [0C DA 39, 05, 05]
+2800; [0C DD 90, 05, 05]
-2BB2; [0C DA 40, 05, 05]
+2801; [0C DD 97, 05, 05]
-2BB3; [0C DA 47, 05, 05]
+2802; [0C DD 9E, 05, 05]
-2BB4; [0C DA 4E, 05, 05]
+2803; [0C DD A5, 05, 05]
-2BB5; [0C DA 55, 05, 05]
+2804; [0C DD AC, 05, 05]
-2BB6; [0C DA 5C, 05, 05]
+2805; [0C DD B3, 05, 05]
-2BB7; [0C DA 63, 05, 05]
+2806; [0C DD BA, 05, 05]
-2BB8; [0C DA 6A, 05, 05]
+2807; [0C DD C1, 05, 05]
-2BB9; [0C DA 71, 05, 05]
+2808; [0C DD C8, 05, 05]
-2BBA; [0C DA 78, 05, 05]
+2809; [0C DD CF, 05, 05]
-2BBB; [0C DA 7F, 05, 05]
+280A; [0C DD D6, 05, 05]
-2BBC; [0C DA 86, 05, 05]
+280B; [0C DD DD, 05, 05]
-2BBD; [0C DA 8D, 05, 05]
+280C; [0C DD E4, 05, 05]
-2BBE; [0C DA 94, 05, 05]
+280D; [0C DD EB, 05, 05]
-2BBF; [0C DA 9B, 05, 05]
+280E; [0C DD F2, 05, 05]
-2BC0; [0C DA A2, 05, 05]
+280F; [0C DD F9, 05, 05]
-2BC1; [0C DA A9, 05, 05]
+2810; [0C DE 02, 05, 05]
-2BC2; [0C DA B0, 05, 05]
+2811; [0C DE 09, 05, 05]
-2BC3; [0C DA B7, 05, 05]
+2812; [0C DE 10, 05, 05]
-2BC4; [0C DA BE, 05, 05]
+2813; [0C DE 17, 05, 05]
-2BC5; [0C DA C5, 05, 05]
+2814; [0C DE 1E, 05, 05]
-2BC6; [0C DA CC, 05, 05]
+2815; [0C DE 25, 05, 05]
-2BC7; [0C DA D3, 05, 05]
+2816; [0C DE 2C, 05, 05]
-2BC8; [0C DA DA, 05, 05]
+2817; [0C DE 33, 05, 05]
-2BCA; [0C DA E1, 05, 05]
+2818; [0C DE 3A, 05, 05]
-2BCB; [0C DA E8, 05, 05]
+2819; [0C DE 41, 05, 05]
-2BCC; [0C DA EF, 05, 05]
+281A; [0C DE 48, 05, 05]
-2BCD; [0C DA F6, 05, 05]
+281B; [0C DE 4F, 05, 05]
-2BCE; [0C DA FD, 05, 05]
+281C; [0C DE 56, 05, 05]
-2BCF; [0C DB 06, 05, 05]
+281D; [0C DE 5D, 05, 05]
-2BD0; [0C DB 0D, 05, 05]
+281E; [0C DE 64, 05, 05]
-2BD1; [0C DB 14, 05, 05]
+281F; [0C DE 6B, 05, 05]
-2BD2; [0C DB 1B, 05, 05]
+2820; [0C DE 72, 05, 05]
-2BD3; [0C DB 22, 05, 05]
+2821; [0C DE 79, 05, 05]
-2BD4; [0C DB 29, 05, 05]
+2822; [0C DE 80, 05, 05]
-2BD5; [0C DB 30, 05, 05]
+2823; [0C DE 87, 05, 05]
-2BD6; [0C DB 37, 05, 05]
+2824; [0C DE 8E, 05, 05]
-2BD7; [0C DB 3E, 05, 05]
+2825; [0C DE 95, 05, 05]
-2BD8; [0C DB 45, 05, 05]
+2826; [0C DE 9C, 05, 05]
-2BD9; [0C DB 4C, 05, 05]
+2827; [0C DE A3, 05, 05]
-2BDA; [0C DB 53, 05, 05]
+2828; [0C DE AA, 05, 05]
-2BDB; [0C DB 5A, 05, 05]
+2829; [0C DE B1, 05, 05]
-2BDC; [0C DB 61, 05, 05]
+282A; [0C DE B8, 05, 05]
-2BDD; [0C DB 68, 05, 05]
+282B; [0C DE BF, 05, 05]
-2BDE; [0C DB 6F, 05, 05]
+282C; [0C DE C6, 05, 05]
-2BDF; [0C DB 76, 05, 05]
+282D; [0C DE CD, 05, 05]
-2BE0; [0C DB 7D, 05, 05]
+282E; [0C DE D4, 05, 05]
-2BE1; [0C DB 84, 05, 05]
+282F; [0C DE DB, 05, 05]
-2BE2; [0C DB 8B, 05, 05]
+2830; [0C DE E2, 05, 05]
-2BE3; [0C DB 92, 05, 05]
+2831; [0C DE E9, 05, 05]
-2BE4; [0C DB 99, 05, 05]
+2832; [0C DE F0, 05, 05]
-2BE5; [0C DB A0, 05, 05]
+2833; [0C DE F7, 05, 05]
-2BE6; [0C DB A7, 05, 05]
+2834; [0C DE FE, 05, 05]
-2BE7; [0C DB AE, 05, 05]
+2835; [0C DF 07, 05, 05]
-2BE8; [0C DB B5, 05, 05]
+2836; [0C DF 0E, 05, 05]
-2BE9; [0C DB BC, 05, 05]
+2837; [0C DF 15, 05, 05]
-2BEA; [0C DB C3, 05, 05]
+2838; [0C DF 1C, 05, 05]
-2BEB; [0C DB CA, 05, 05]
+2839; [0C DF 23, 05, 05]
-2BEC; [0C DB D1, 05, 05]
+283A; [0C DF 2A, 05, 05]
-2BED; [0C DB D8, 05, 05]
+283B; [0C DF 31, 05, 05]
-2BEE; [0C DB DF, 05, 05]
+283C; [0C DF 38, 05, 05]
-2BEF; [0C DB E6, 05, 05]
+283D; [0C DF 3F, 05, 05]
-2BF0; [0C DB ED, 05, 05]
+283E; [0C DF 46, 05, 05]
-2BF1; [0C DB F4, 05, 05]
+283F; [0C DF 4D, 05, 05]
-2BF2; [0C DB FB, 05, 05]
+2840; [0C DF 54, 05, 05]
-2BF3; [0C DC 04, 05, 05]
+2841; [0C DF 5B, 05, 05]
-2BF4; [0C DC 0B, 05, 05]
+2842; [0C DF 62, 05, 05]
-2BF5; [0C DC 12, 05, 05]
+2843; [0C DF 69, 05, 05]
-2BF6; [0C DC 19, 05, 05]
+2844; [0C DF 70, 05, 05]
-2BF7; [0C DC 20, 05, 05]
+2845; [0C DF 77, 05, 05]
-2BF8; [0C DC 27, 05, 05]
+2846; [0C DF 7E, 05, 05]
-2BF9; [0C DC 2E, 05, 05]
+2847; [0C DF 85, 05, 05]
-2BFA; [0C DC 35, 05, 05]
+2848; [0C DF 8C, 05, 05]
-2BFB; [0C DC 3C, 05, 05]
+2849; [0C DF 93, 05, 05]
-2BFC; [0C DC 43, 05, 05]
+284A; [0C DF 9A, 05, 05]
-2BFD; [0C DC 4A, 05, 05]
+284B; [0C DF A1, 05, 05]
-2BFE; [0C DC 51, 05, 05]
+284C; [0C DF A8, 05, 05]
-2CE5; [0C DC 58, 05, 05]
+284D; [0C DF AF, 05, 05]
-2CE6; [0C DC 5F, 05, 05]
+284E; [0C DF B6, 05, 05]
-2CE7; [0C DC 66, 05, 05]
+284F; [0C DF BD, 05, 05]
-2CE8; [0C DC 6D, 05, 05]
+2850; [0C DF C4, 05, 05]
-2CE9; [0C DC 74, 05, 05]
+2851; [0C DF CB, 05, 05]
-2CEA; [0C DC 7B, 05, 05]
+2852; [0C DF D2, 05, 05]
-2800; [0C DC 82, 05, 05]
+2853; [0C DF D9, 05, 05]
-2801; [0C DC 89, 05, 05]
+2854; [0C DF E0, 05, 05]
-2802; [0C DC 90, 05, 05]
+2855; [0C DF E7, 05, 05]
-2803; [0C DC 97, 05, 05]
+2856; [0C DF EE, 05, 05]
-2804; [0C DC 9E, 05, 05]
+2857; [0C DF F5, 05, 05]
-2805; [0C DC A5, 05, 05]
+2858; [0C DF FC, 05, 05]
-2806; [0C DC AC, 05, 05]
+2859; [0C E0 05, 05, 05]
-2807; [0C DC B3, 05, 05]
+285A; [0C E0 0C, 05, 05]
-2808; [0C DC BA, 05, 05]
+285B; [0C E0 13, 05, 05]
-2809; [0C DC C1, 05, 05]
+285C; [0C E0 1A, 05, 05]
-280A; [0C DC C8, 05, 05]
+285D; [0C E0 21, 05, 05]
-280B; [0C DC CF, 05, 05]
+285E; [0C E0 28, 05, 05]
-280C; [0C DC D6, 05, 05]
+285F; [0C E0 2F, 05, 05]
-280D; [0C DC DD, 05, 05]
+2860; [0C E0 36, 05, 05]
-280E; [0C DC E4, 05, 05]
+2861; [0C E0 3D, 05, 05]
-280F; [0C DC EB, 05, 05]
+2862; [0C E0 44, 05, 05]
-2810; [0C DC F2, 05, 05]
+2863; [0C E0 4B, 05, 05]
-2811; [0C DC F9, 05, 05]
+2864; [0C E0 52, 05, 05]
-2812; [0C DD 02, 05, 05]
+2865; [0C E0 59, 05, 05]
-2813; [0C DD 09, 05, 05]
+2866; [0C E0 60, 05, 05]
-2814; [0C DD 10, 05, 05]
+2867; [0C E0 67, 05, 05]
-2815; [0C DD 17, 05, 05]
+2868; [0C E0 6E, 05, 05]
-2816; [0C DD 1E, 05, 05]
+2869; [0C E0 75, 05, 05]
-2817; [0C DD 25, 05, 05]
+286A; [0C E0 7C, 05, 05]
-2818; [0C DD 2C, 05, 05]
+286B; [0C E0 83, 05, 05]
-2819; [0C DD 33, 05, 05]
+286C; [0C E0 8A, 05, 05]
-281A; [0C DD 3A, 05, 05]
+286D; [0C E0 91, 05, 05]
-281B; [0C DD 41, 05, 05]
+286E; [0C E0 98, 05, 05]
-281C; [0C DD 48, 05, 05]
+286F; [0C E0 9F, 05, 05]
-281D; [0C DD 4F, 05, 05]
+2870; [0C E0 A6, 05, 05]
-281E; [0C DD 56, 05, 05]
+2871; [0C E0 AD, 05, 05]
-281F; [0C DD 5D, 05, 05]
+2872; [0C E0 B4, 05, 05]
-2820; [0C DD 64, 05, 05]
+2873; [0C E0 BB, 05, 05]
-2821; [0C DD 6B, 05, 05]
+2874; [0C E0 C2, 05, 05]
-2822; [0C DD 72, 05, 05]
+2875; [0C E0 C9, 05, 05]
-2823; [0C DD 79, 05, 05]
+2876; [0C E0 D0, 05, 05]
-2824; [0C DD 80, 05, 05]
+2877; [0C E0 D7, 05, 05]
-2825; [0C DD 87, 05, 05]
+2878; [0C E0 DE, 05, 05]
-2826; [0C DD 8E, 05, 05]
+2879; [0C E0 E5, 05, 05]
-2827; [0C DD 95, 05, 05]
+287A; [0C E0 EC, 05, 05]
-2828; [0C DD 9C, 05, 05]
+287B; [0C E0 F3, 05, 05]
-2829; [0C DD A3, 05, 05]
+287C; [0C E0 FA, 05, 05]
-282A; [0C DD AA, 05, 05]
+287D; [0C E1 03, 05, 05]
-282B; [0C DD B1, 05, 05]
+287E; [0C E1 0A, 05, 05]
-282C; [0C DD B8, 05, 05]
+287F; [0C E1 11, 05, 05]
-282D; [0C DD BF, 05, 05]
+2880; [0C E1 18, 05, 05]
-282E; [0C DD C6, 05, 05]
+2881; [0C E1 1F, 05, 05]
-282F; [0C DD CD, 05, 05]
+2882; [0C E1 26, 05, 05]
-2830; [0C DD D4, 05, 05]
+2883; [0C E1 2D, 05, 05]
-2831; [0C DD DB, 05, 05]
+2884; [0C E1 34, 05, 05]
-2832; [0C DD E2, 05, 05]
+2885; [0C E1 3B, 05, 05]
-2833; [0C DD E9, 05, 05]
+2886; [0C E1 42, 05, 05]
-2834; [0C DD F0, 05, 05]
+2887; [0C E1 49, 05, 05]
-2835; [0C DD F7, 05, 05]
+2888; [0C E1 50, 05, 05]
-2836; [0C DD FE, 05, 05]
+2889; [0C E1 57, 05, 05]
-2837; [0C DE 07, 05, 05]
+288A; [0C E1 5E, 05, 05]
-2838; [0C DE 0E, 05, 05]
+288B; [0C E1 65, 05, 05]
-2839; [0C DE 15, 05, 05]
+288C; [0C E1 6C, 05, 05]
-283A; [0C DE 1C, 05, 05]
+288D; [0C E1 73, 05, 05]
-283B; [0C DE 23, 05, 05]
+288E; [0C E1 7A, 05, 05]
-283C; [0C DE 2A, 05, 05]
+288F; [0C E1 81, 05, 05]
-283D; [0C DE 31, 05, 05]
+2890; [0C E1 88, 05, 05]
-283E; [0C DE 38, 05, 05]
+2891; [0C E1 8F, 05, 05]
-283F; [0C DE 3F, 05, 05]
+2892; [0C E1 96, 05, 05]
-2840; [0C DE 46, 05, 05]
+2893; [0C E1 9D, 05, 05]
-2841; [0C DE 4D, 05, 05]
+2894; [0C E1 A4, 05, 05]
-2842; [0C DE 54, 05, 05]
+2895; [0C E1 AB, 05, 05]
-2843; [0C DE 5B, 05, 05]
+2896; [0C E1 B2, 05, 05]
-2844; [0C DE 62, 05, 05]
+2897; [0C E1 B9, 05, 05]
-2845; [0C DE 69, 05, 05]
+2898; [0C E1 C0, 05, 05]
-2846; [0C DE 70, 05, 05]
+2899; [0C E1 C7, 05, 05]
-2847; [0C DE 77, 05, 05]
+289A; [0C E1 CE, 05, 05]
-2848; [0C DE 7E, 05, 05]
+289B; [0C E1 D5, 05, 05]
-2849; [0C DE 85, 05, 05]
+289C; [0C E1 DC, 05, 05]
-284A; [0C DE 8C, 05, 05]
+289D; [0C E1 E3, 05, 05]
-284B; [0C DE 93, 05, 05]
+289E; [0C E1 EA, 05, 05]
-284C; [0C DE 9A, 05, 05]
+289F; [0C E1 F1, 05, 05]
-284D; [0C DE A1, 05, 05]
+28A0; [0C E1 F8, 05, 05]
-284E; [0C DE A8, 05, 05]
+28A1; [0C E1 FF, 05, 05]
-284F; [0C DE AF, 05, 05]
+28A2; [0C E2 08, 05, 05]
-2850; [0C DE B6, 05, 05]
+28A3; [0C E2 0F, 05, 05]
-2851; [0C DE BD, 05, 05]
+28A4; [0C E2 16, 05, 05]
-2852; [0C DE C4, 05, 05]
+28A5; [0C E2 1D, 05, 05]
-2853; [0C DE CB, 05, 05]
+28A6; [0C E2 24, 05, 05]
-2854; [0C DE D2, 05, 05]
+28A7; [0C E2 2B, 05, 05]
-2855; [0C DE D9, 05, 05]
+28A8; [0C E2 32, 05, 05]
-2856; [0C DE E0, 05, 05]
+28A9; [0C E2 39, 05, 05]
-2857; [0C DE E7, 05, 05]
+28AA; [0C E2 40, 05, 05]
-2858; [0C DE EE, 05, 05]
+28AB; [0C E2 47, 05, 05]
-2859; [0C DE F5, 05, 05]
+28AC; [0C E2 4E, 05, 05]
-285A; [0C DE FC, 05, 05]
+28AD; [0C E2 55, 05, 05]
-285B; [0C DF 05, 05, 05]
+28AE; [0C E2 5C, 05, 05]
-285C; [0C DF 0C, 05, 05]
+28AF; [0C E2 63, 05, 05]
-285D; [0C DF 13, 05, 05]
+28B0; [0C E2 6A, 05, 05]
-285E; [0C DF 1A, 05, 05]
+28B1; [0C E2 71, 05, 05]
-285F; [0C DF 21, 05, 05]
+28B2; [0C E2 78, 05, 05]
-2860; [0C DF 28, 05, 05]
+28B3; [0C E2 7F, 05, 05]
-2861; [0C DF 2F, 05, 05]
+28B4; [0C E2 86, 05, 05]
-2862; [0C DF 36, 05, 05]
+28B5; [0C E2 8D, 05, 05]
-2863; [0C DF 3D, 05, 05]
+28B6; [0C E2 94, 05, 05]
-2864; [0C DF 44, 05, 05]
+28B7; [0C E2 9B, 05, 05]
-2865; [0C DF 4B, 05, 05]
+28B8; [0C E2 A2, 05, 05]
-2866; [0C DF 52, 05, 05]
+28B9; [0C E2 A9, 05, 05]
-2867; [0C DF 59, 05, 05]
+28BA; [0C E2 B0, 05, 05]
-2868; [0C DF 60, 05, 05]
+28BB; [0C E2 B7, 05, 05]
-2869; [0C DF 67, 05, 05]
+28BC; [0C E2 BE, 05, 05]
-286A; [0C DF 6E, 05, 05]
+28BD; [0C E2 C5, 05, 05]
-286B; [0C DF 75, 05, 05]
+28BE; [0C E2 CC, 05, 05]
-286C; [0C DF 7C, 05, 05]
+28BF; [0C E2 D3, 05, 05]
-286D; [0C DF 83, 05, 05]
+28C0; [0C E2 DA, 05, 05]
-286E; [0C DF 8A, 05, 05]
+28C1; [0C E2 E1, 05, 05]
-286F; [0C DF 91, 05, 05]
+28C2; [0C E2 E8, 05, 05]
-2870; [0C DF 98, 05, 05]
+28C3; [0C E2 EF, 05, 05]
-2871; [0C DF 9F, 05, 05]
+28C4; [0C E2 F6, 05, 05]
-2872; [0C DF A6, 05, 05]
+28C5; [0C E2 FD, 05, 05]
-2873; [0C DF AD, 05, 05]
+28C6; [0C E3 06, 05, 05]
-2874; [0C DF B4, 05, 05]
+28C7; [0C E3 0D, 05, 05]
-2875; [0C DF BB, 05, 05]
+28C8; [0C E3 14, 05, 05]
-2876; [0C DF C2, 05, 05]
+28C9; [0C E3 1B, 05, 05]
-2877; [0C DF C9, 05, 05]
+28CA; [0C E3 22, 05, 05]
-2878; [0C DF D0, 05, 05]
+28CB; [0C E3 29, 05, 05]
-2879; [0C DF D7, 05, 05]
+28CC; [0C E3 30, 05, 05]
-287A; [0C DF DE, 05, 05]
+28CD; [0C E3 37, 05, 05]
-287B; [0C DF E5, 05, 05]
+28CE; [0C E3 3E, 05, 05]
-287C; [0C DF EC, 05, 05]
+28CF; [0C E3 45, 05, 05]
-287D; [0C DF F3, 05, 05]
+28D0; [0C E3 4C, 05, 05]
-287E; [0C DF FA, 05, 05]
+28D1; [0C E3 53, 05, 05]
-287F; [0C E0 03, 05, 05]
+28D2; [0C E3 5A, 05, 05]
-2880; [0C E0 0A, 05, 05]
+28D3; [0C E3 61, 05, 05]
-2881; [0C E0 11, 05, 05]
+28D4; [0C E3 68, 05, 05]
-2882; [0C E0 18, 05, 05]
+28D5; [0C E3 6F, 05, 05]
-2883; [0C E0 1F, 05, 05]
+28D6; [0C E3 76, 05, 05]
-2884; [0C E0 26, 05, 05]
+28D7; [0C E3 7D, 05, 05]
-2885; [0C E0 2D, 05, 05]
+28D8; [0C E3 84, 05, 05]
-2886; [0C E0 34, 05, 05]
+28D9; [0C E3 8B, 05, 05]
-2887; [0C E0 3B, 05, 05]
+28DA; [0C E3 92, 05, 05]
-2888; [0C E0 42, 05, 05]
+28DB; [0C E3 99, 05, 05]
-2889; [0C E0 49, 05, 05]
+28DC; [0C E3 A0, 05, 05]
-288A; [0C E0 50, 05, 05]
+28DD; [0C E3 A7, 05, 05]
-288B; [0C E0 57, 05, 05]
+28DE; [0C E3 AE, 05, 05]
-288C; [0C E0 5E, 05, 05]
+28DF; [0C E3 B5, 05, 05]
-288D; [0C E0 65, 05, 05]
+28E0; [0C E3 BC, 05, 05]
-288E; [0C E0 6C, 05, 05]
+28E1; [0C E3 C3, 05, 05]
-288F; [0C E0 73, 05, 05]
+28E2; [0C E3 CA, 05, 05]
-2890; [0C E0 7A, 05, 05]
+28E3; [0C E3 D1, 05, 05]
-2891; [0C E0 81, 05, 05]
+28E4; [0C E3 D8, 05, 05]
-2892; [0C E0 88, 05, 05]
+28E5; [0C E3 DF, 05, 05]
-2893; [0C E0 8F, 05, 05]
+28E6; [0C E3 E6, 05, 05]
-2894; [0C E0 96, 05, 05]
+28E7; [0C E3 ED, 05, 05]
-2895; [0C E0 9D, 05, 05]
+28E8; [0C E3 F4, 05, 05]
-2896; [0C E0 A4, 05, 05]
+28E9; [0C E3 FB, 05, 05]
-2897; [0C E0 AB, 05, 05]
+28EA; [0C E4 04, 05, 05]
-2898; [0C E0 B2, 05, 05]
+28EB; [0C E4 0B, 05, 05]
-2899; [0C E0 B9, 05, 05]
+28EC; [0C E4 12, 05, 05]
-289A; [0C E0 C0, 05, 05]
+28ED; [0C E4 19, 05, 05]
-289B; [0C E0 C7, 05, 05]
+28EE; [0C E4 20, 05, 05]
-289C; [0C E0 CE, 05, 05]
+28EF; [0C E4 27, 05, 05]
-289D; [0C E0 D5, 05, 05]
+28F0; [0C E4 2E, 05, 05]
-289E; [0C E0 DC, 05, 05]
+28F1; [0C E4 35, 05, 05]
-289F; [0C E0 E3, 05, 05]
+28F2; [0C E4 3C, 05, 05]
-28A0; [0C E0 EA, 05, 05]
+28F3; [0C E4 43, 05, 05]
-28A1; [0C E0 F1, 05, 05]
+28F4; [0C E4 4A, 05, 05]
-28A2; [0C E0 F8, 05, 05]
+28F5; [0C E4 51, 05, 05]
-28A3; [0C E0 FF, 05, 05]
+28F6; [0C E4 58, 05, 05]
-28A4; [0C E1 08, 05, 05]
+28F7; [0C E4 5F, 05, 05]
-28A5; [0C E1 0F, 05, 05]
+28F8; [0C E4 66, 05, 05]
-28A6; [0C E1 16, 05, 05]
+28F9; [0C E4 6D, 05, 05]
-28A7; [0C E1 1D, 05, 05]
+28FA; [0C E4 74, 05, 05]
-28A8; [0C E1 24, 05, 05]
+28FB; [0C E4 7B, 05, 05]
-28A9; [0C E1 2B, 05, 05]
+28FC; [0C E4 82, 05, 05]
-28AA; [0C E1 32, 05, 05]
+28FD; [0C E4 89, 05, 05]
-28AB; [0C E1 39, 05, 05]
+28FE; [0C E4 90, 05, 05]
-28AC; [0C E1 40, 05, 05]
+28FF; [0C E4 97, 05, 05]
-28AD; [0C E1 47, 05, 05]
+268A; [0C E4 9E, 05, 05]
-28AE; [0C E1 4E, 05, 05]
+268B; [0C E4 A5, 05, 05]
-28AF; [0C E1 55, 05, 05]
+268C; [0C E4 AC, 05, 05]
-28B0; [0C E1 5C, 05, 05]
+268D; [0C E4 B3, 05, 05]
-28B1; [0C E1 63, 05, 05]
+268E; [0C E4 BA, 05, 05]
-28B2; [0C E1 6A, 05, 05]
+268F; [0C E4 C1, 05, 05]
-28B3; [0C E1 71, 05, 05]
+2630; [0C E4 C8, 05, 05]
-28B4; [0C E1 78, 05, 05]
+2631; [0C E4 CF, 05, 05]
-28B5; [0C E1 7F, 05, 05]
+2632; [0C E4 D6, 05, 05]
-28B6; [0C E1 86, 05, 05]
+2633; [0C E4 DD, 05, 05]
-28B7; [0C E1 8D, 05, 05]
+2634; [0C E4 E4, 05, 05]
-28B8; [0C E1 94, 05, 05]
+2635; [0C E4 EB, 05, 05]
-28B9; [0C E1 9B, 05, 05]
+2636; [0C E4 F2, 05, 05]
-28BA; [0C E1 A2, 05, 05]
+2637; [0C E4 F9, 05, 05]
-28BB; [0C E1 A9, 05, 05]
+4DC0; [0C E5 02, 05, 05]
-28BC; [0C E1 B0, 05, 05]
+4DC1; [0C E5 09, 05, 05]
-28BD; [0C E1 B7, 05, 05]
+4DC2; [0C E5 10, 05, 05]
-28BE; [0C E1 BE, 05, 05]
+4DC3; [0C E5 17, 05, 05]
-28BF; [0C E1 C5, 05, 05]
+4DC4; [0C E5 1E, 05, 05]
-28C0; [0C E1 CC, 05, 05]
+4DC5; [0C E5 25, 05, 05]
-28C1; [0C E1 D3, 05, 05]
+4DC6; [0C E5 2C, 05, 05]
-28C2; [0C E1 DA, 05, 05]
+4DC7; [0C E5 33, 05, 05]
-28C3; [0C E1 E1, 05, 05]
+4DC8; [0C E5 3A, 05, 05]
-28C4; [0C E1 E8, 05, 05]
+4DC9; [0C E5 41, 05, 05]
-28C5; [0C E1 EF, 05, 05]
+4DCA; [0C E5 48, 05, 05]
-28C6; [0C E1 F6, 05, 05]
+4DCB; [0C E5 4F, 05, 05]
-28C7; [0C E1 FD, 05, 05]
+4DCC; [0C E5 56, 05, 05]
-28C8; [0C E2 06, 05, 05]
+4DCD; [0C E5 5D, 05, 05]
-28C9; [0C E2 0D, 05, 05]
+4DCE; [0C E5 64, 05, 05]
-28CA; [0C E2 14, 05, 05]
+4DCF; [0C E5 6B, 05, 05]
-28CB; [0C E2 1B, 05, 05]
+4DD0; [0C E5 72, 05, 05]
-28CC; [0C E2 22, 05, 05]
+4DD1; [0C E5 79, 05, 05]
-28CD; [0C E2 29, 05, 05]
+4DD2; [0C E5 80, 05, 05]
-28CE; [0C E2 30, 05, 05]
+4DD3; [0C E5 87, 05, 05]
-28CF; [0C E2 37, 05, 05]
+4DD4; [0C E5 8E, 05, 05]
-28D0; [0C E2 3E, 05, 05]
+4DD5; [0C E5 95, 05, 05]
-28D1; [0C E2 45, 05, 05]
+4DD6; [0C E5 9C, 05, 05]
-28D2; [0C E2 4C, 05, 05]
+4DD7; [0C E5 A3, 05, 05]
-28D3; [0C E2 53, 05, 05]
+4DD8; [0C E5 AA, 05, 05]
-28D4; [0C E2 5A, 05, 05]
+4DD9; [0C E5 B1, 05, 05]
-28D5; [0C E2 61, 05, 05]
+4DDA; [0C E5 B8, 05, 05]
-28D6; [0C E2 68, 05, 05]
+4DDB; [0C E5 BF, 05, 05]
-28D7; [0C E2 6F, 05, 05]
+4DDC; [0C E5 C6, 05, 05]
-28D8; [0C E2 76, 05, 05]
+4DDD; [0C E5 CD, 05, 05]
-28D9; [0C E2 7D, 05, 05]
+4DDE; [0C E5 D4, 05, 05]
-28DA; [0C E2 84, 05, 05]
+4DDF; [0C E5 DB, 05, 05]
-28DB; [0C E2 8B, 05, 05]
+4DE0; [0C E5 E2, 05, 05]
-28DC; [0C E2 92, 05, 05]
+4DE1; [0C E5 E9, 05, 05]
-28DD; [0C E2 99, 05, 05]
+4DE2; [0C E5 F0, 05, 05]
-28DE; [0C E2 A0, 05, 05]
+4DE3; [0C E5 F7, 05, 05]
-28DF; [0C E2 A7, 05, 05]
+4DE4; [0C E5 FE, 05, 05]
-28E0; [0C E2 AE, 05, 05]
+4DE5; [0C E6 07, 05, 05]
-28E1; [0C E2 B5, 05, 05]
+4DE6; [0C E6 0E, 05, 05]
-28E2; [0C E2 BC, 05, 05]
+4DE7; [0C E6 15, 05, 05]
-28E3; [0C E2 C3, 05, 05]
+4DE8; [0C E6 1C, 05, 05]
-28E4; [0C E2 CA, 05, 05]
+4DE9; [0C E6 23, 05, 05]
-28E5; [0C E2 D1, 05, 05]
+4DEA; [0C E6 2A, 05, 05]
-28E6; [0C E2 D8, 05, 05]
+4DEB; [0C E6 31, 05, 05]
-28E7; [0C E2 DF, 05, 05]
+4DEC; [0C E6 38, 05, 05]
-28E8; [0C E2 E6, 05, 05]
+4DED; [0C E6 3F, 05, 05]
-28E9; [0C E2 ED, 05, 05]
+4DEE; [0C E6 46, 05, 05]
-28EA; [0C E2 F4, 05, 05]
+4DEF; [0C E6 4D, 05, 05]
-28EB; [0C E2 FB, 05, 05]
+4DF0; [0C E6 54, 05, 05]
-28EC; [0C E3 04, 05, 05]
+4DF1; [0C E6 5B, 05, 05]
-28ED; [0C E3 0B, 05, 05]
+4DF2; [0C E6 62, 05, 05]
-28EE; [0C E3 12, 05, 05]
+4DF3; [0C E6 69, 05, 05]
-28EF; [0C E3 19, 05, 05]
+4DF4; [0C E6 70, 05, 05]
-28F0; [0C E3 20, 05, 05]
+4DF5; [0C E6 77, 05, 05]
-28F1; [0C E3 27, 05, 05]
+4DF6; [0C E6 7E, 05, 05]
-28F2; [0C E3 2E, 05, 05]
+4DF7; [0C E6 85, 05, 05]
-28F3; [0C E3 35, 05, 05]
+4DF8; [0C E6 8C, 05, 05]
-28F4; [0C E3 3C, 05, 05]
+4DF9; [0C E6 93, 05, 05]
-28F5; [0C E3 43, 05, 05]
+4DFA; [0C E6 9A, 05, 05]
-28F6; [0C E3 4A, 05, 05]
+4DFB; [0C E6 A1, 05, 05]
-28F7; [0C E3 51, 05, 05]
+4DFC; [0C E6 A8, 05, 05]
-28F8; [0C E3 58, 05, 05]
+4DFD; [0C E6 AF, 05, 05]
-28F9; [0C E3 5F, 05, 05]
+4DFE; [0C E6 B6, 05, 05]
-28FA; [0C E3 66, 05, 05]
+4DFF; [0C E6 BD, 05, 05]
-28FB; [0C E3 6D, 05, 05]
+1D300; [0C E6 C4, 05, 05]
-28FC; [0C E3 74, 05, 05]
+1D301; [0C E6 CB, 05, 05]
-28FD; [0C E3 7B, 05, 05]
+1D302; [0C E6 D2, 05, 05]
-28FE; [0C E3 82, 05, 05]
+1D303; [0C E6 D9, 05, 05]
-28FF; [0C E3 89, 05, 05]
+1D304; [0C E6 E0, 05, 05]
-268A; [0C E3 90, 05, 05]
+1D305; [0C E6 E7, 05, 05]
-268B; [0C E3 97, 05, 05]
+1D306; [0C E6 EE, 05, 05]
-268C; [0C E3 9E, 05, 05]
+1D307; [0C E6 F5, 05, 05]
-268D; [0C E3 A5, 05, 05]
+1D308; [0C E6 FC, 05, 05]
-268E; [0C E3 AC, 05, 05]
+1D309; [0C E7 05, 05, 05]
-268F; [0C E3 B3, 05, 05]
+1D30A; [0C E7 0C, 05, 05]
-2630; [0C E3 BA, 05, 05]
+1D30B; [0C E7 13, 05, 05]
-2631; [0C E3 C1, 05, 05]
+1D30C; [0C E7 1A, 05, 05]
-2632; [0C E3 C8, 05, 05]
+1D30D; [0C E7 21, 05, 05]
-2633; [0C E3 CF, 05, 05]
+1D30E; [0C E7 28, 05, 05]
-2634; [0C E3 D6, 05, 05]
+1D30F; [0C E7 2F, 05, 05]
-2635; [0C E3 DD, 05, 05]
+1D310; [0C E7 36, 05, 05]
-2636; [0C E3 E4, 05, 05]
+1D311; [0C E7 3D, 05, 05]
-2637; [0C E3 EB, 05, 05]
+1D312; [0C E7 44, 05, 05]
-4DC0; [0C E3 F2, 05, 05]
+1D313; [0C E7 4B, 05, 05]
-4DC1; [0C E3 F9, 05, 05]
+1D314; [0C E7 52, 05, 05]
-4DC2; [0C E4 02, 05, 05]
+1D315; [0C E7 59, 05, 05]
-4DC3; [0C E4 09, 05, 05]
+1D316; [0C E7 60, 05, 05]
-4DC4; [0C E4 10, 05, 05]
+1D317; [0C E7 67, 05, 05]
-4DC5; [0C E4 17, 05, 05]
+1D318; [0C E7 6E, 05, 05]
-4DC6; [0C E4 1E, 05, 05]
+1D319; [0C E7 75, 05, 05]
-4DC7; [0C E4 25, 05, 05]
+1D31A; [0C E7 7C, 05, 05]
-4DC8; [0C E4 2C, 05, 05]
+1D31B; [0C E7 83, 05, 05]
-4DC9; [0C E4 33, 05, 05]
+1D31C; [0C E7 8A, 05, 05]
-4DCA; [0C E4 3A, 05, 05]
+1D31D; [0C E7 91, 05, 05]
-4DCB; [0C E4 41, 05, 05]
+1D31E; [0C E7 98, 05, 05]
-4DCC; [0C E4 48, 05, 05]
+1D31F; [0C E7 9F, 05, 05]
-4DCD; [0C E4 4F, 05, 05]
+1D320; [0C E7 A6, 05, 05]
-4DCE; [0C E4 56, 05, 05]
+1D321; [0C E7 AD, 05, 05]
-4DCF; [0C E4 5D, 05, 05]
+1D322; [0C E7 B4, 05, 05]
-4DD0; [0C E4 64, 05, 05]
+1D323; [0C E7 BB, 05, 05]
-4DD1; [0C E4 6B, 05, 05]
+1D324; [0C E7 C2, 05, 05]
-4DD2; [0C E4 72, 05, 05]
+1D325; [0C E7 C9, 05, 05]
-4DD3; [0C E4 79, 05, 05]
+1D326; [0C E7 D0, 05, 05]
-4DD4; [0C E4 80, 05, 05]
+1D327; [0C E7 D7, 05, 05]
-4DD5; [0C E4 87, 05, 05]
+1D328; [0C E7 DE, 05, 05]
-4DD6; [0C E4 8E, 05, 05]
+1D329; [0C E7 E5, 05, 05]
-4DD7; [0C E4 95, 05, 05]
+1D32A; [0C E7 EC, 05, 05]
-4DD8; [0C E4 9C, 05, 05]
+1D32B; [0C E7 F3, 05, 05]
-4DD9; [0C E4 A3, 05, 05]
+1D32C; [0C E7 FA, 05, 05]
-4DDA; [0C E4 AA, 05, 05]
+1D32D; [0C E8 03, 05, 05]
-4DDB; [0C E4 B1, 05, 05]
+1D32E; [0C E8 0A, 05, 05]
-4DDC; [0C E4 B8, 05, 05]
+1D32F; [0C E8 11, 05, 05]
-4DDD; [0C E4 BF, 05, 05]
+1D330; [0C E8 18, 05, 05]
-4DDE; [0C E4 C6, 05, 05]
+1D331; [0C E8 1F, 05, 05]
-4DDF; [0C E4 CD, 05, 05]
+1D332; [0C E8 26, 05, 05]
-4DE0; [0C E4 D4, 05, 05]
+1D333; [0C E8 2D, 05, 05]
-4DE1; [0C E4 DB, 05, 05]
+1D334; [0C E8 34, 05, 05]
-4DE2; [0C E4 E2, 05, 05]
+1D335; [0C E8 3B, 05, 05]
-4DE3; [0C E4 E9, 05, 05]
+1D336; [0C E8 42, 05, 05]
-4DE4; [0C E4 F0, 05, 05]
+1D337; [0C E8 49, 05, 05]
-4DE5; [0C E4 F7, 05, 05]
+1D338; [0C E8 50, 05, 05]
-4DE6; [0C E4 FE, 05, 05]
+1D339; [0C E8 57, 05, 05]
-4DE7; [0C E5 07, 05, 05]
+1D33A; [0C E8 5E, 05, 05]
-4DE8; [0C E5 0E, 05, 05]
+1D33B; [0C E8 65, 05, 05]
-4DE9; [0C E5 15, 05, 05]
+1D33C; [0C E8 6C, 05, 05]
-4DEA; [0C E5 1C, 05, 05]
+1D33D; [0C E8 73, 05, 05]
-4DEB; [0C E5 23, 05, 05]
+1D33E; [0C E8 7A, 05, 05]
-4DEC; [0C E5 2A, 05, 05]
+1D33F; [0C E8 81, 05, 05]
-4DED; [0C E5 31, 05, 05]
+1D340; [0C E8 88, 05, 05]
-4DEE; [0C E5 38, 05, 05]
+1D341; [0C E8 8F, 05, 05]
-4DEF; [0C E5 3F, 05, 05]
+1D342; [0C E8 96, 05, 05]
-4DF0; [0C E5 46, 05, 05]
+1D343; [0C E8 9D, 05, 05]
-4DF1; [0C E5 4D, 05, 05]
+1D344; [0C E8 A4, 05, 05]
-4DF2; [0C E5 54, 05, 05]
+1D345; [0C E8 AB, 05, 05]
-4DF3; [0C E5 5B, 05, 05]
+1D346; [0C E8 B2, 05, 05]
-4DF4; [0C E5 62, 05, 05]
+1D347; [0C E8 B9, 05, 05]
-4DF5; [0C E5 69, 05, 05]
+1D348; [0C E8 C0, 05, 05]
-4DF6; [0C E5 70, 05, 05]
+1D349; [0C E8 C7, 05, 05]
-4DF7; [0C E5 77, 05, 05]
+1D34A; [0C E8 CE, 05, 05]
-4DF8; [0C E5 7E, 05, 05]
+1D34B; [0C E8 D5, 05, 05]
-4DF9; [0C E5 85, 05, 05]
+1D34C; [0C E8 DC, 05, 05]
-4DFA; [0C E5 8C, 05, 05]
+1D34D; [0C E8 E3, 05, 05]
-4DFB; [0C E5 93, 05, 05]
+1D34E; [0C E8 EA, 05, 05]
-4DFC; [0C E5 9A, 05, 05]
+1D34F; [0C E8 F1, 05, 05]
-4DFD; [0C E5 A1, 05, 05]
+1D350; [0C E8 F8, 05, 05]
-4DFE; [0C E5 A8, 05, 05]
+1D351; [0C E8 FF, 05, 05]
-4DFF; [0C E5 AF, 05, 05]
+1D352; [0C E9 08, 05, 05]
-1D300; [0C E5 B6, 05, 05]
+1D353; [0C E9 0F, 05, 05]
-1D301; [0C E5 BD, 05, 05]
+1D354; [0C E9 16, 05, 05]
-1D302; [0C E5 C4, 05, 05]
+1D355; [0C E9 1D, 05, 05]
-1D303; [0C E5 CB, 05, 05]
+1D356; [0C E9 24, 05, 05]
-1D304; [0C E5 D2, 05, 05]
+A490; [0C E9 2B, 05, 05]
-1D305; [0C E5 D9, 05, 05]
+A491; [0C E9 32, 05, 05]
-1D306; [0C E5 E0, 05, 05]
+A492; [0C E9 39, 05, 05]
-1D307; [0C E5 E7, 05, 05]
+A493; [0C E9 40, 05, 05]
-1D308; [0C E5 EE, 05, 05]
+A494; [0C E9 47, 05, 05]
-1D309; [0C E5 F5, 05, 05]
+A495; [0C E9 4E, 05, 05]
-1D30A; [0C E5 FC, 05, 05]
+A496; [0C E9 55, 05, 05]
-1D30B; [0C E6 05, 05, 05]
+A497; [0C E9 5C, 05, 05]
-1D30C; [0C E6 0C, 05, 05]
+A498; [0C E9 63, 05, 05]
-1D30D; [0C E6 13, 05, 05]
+A499; [0C E9 6A, 05, 05]
-1D30E; [0C E6 1A, 05, 05]
+A49A; [0C E9 71, 05, 05]
-1D30F; [0C E6 21, 05, 05]
+A49B; [0C E9 78, 05, 05]
-1D310; [0C E6 28, 05, 05]
+A49C; [0C E9 7F, 05, 05]
-1D311; [0C E6 2F, 05, 05]
+A49D; [0C E9 86, 05, 05]
-1D312; [0C E6 36, 05, 05]
+A49E; [0C E9 8D, 05, 05]
-1D313; [0C E6 3D, 05, 05]
+A49F; [0C E9 94, 05, 05]
-1D314; [0C E6 44, 05, 05]
+A4A0; [0C E9 9B, 05, 05]
-1D315; [0C E6 4B, 05, 05]
+A4A1; [0C E9 A2, 05, 05]
-1D316; [0C E6 52, 05, 05]
+A4A2; [0C E9 A9, 05, 05]
-1D317; [0C E6 59, 05, 05]
+A4A3; [0C E9 B0, 05, 05]
-1D318; [0C E6 60, 05, 05]
+A4A4; [0C E9 B7, 05, 05]
-1D319; [0C E6 67, 05, 05]
+A4A5; [0C E9 BE, 05, 05]
-1D31A; [0C E6 6E, 05, 05]
+A4A6; [0C E9 C5, 05, 05]
-1D31B; [0C E6 75, 05, 05]
+A4A7; [0C E9 CC, 05, 05]
-1D31C; [0C E6 7C, 05, 05]
+A4A8; [0C E9 D3, 05, 05]
-1D31D; [0C E6 83, 05, 05]
+A4A9; [0C E9 DA, 05, 05]
-1D31E; [0C E6 8A, 05, 05]
+A4AA; [0C E9 E1, 05, 05]
-1D31F; [0C E6 91, 05, 05]
+A4AB; [0C E9 E8, 05, 05]
-1D320; [0C E6 98, 05, 05]
+A4AC; [0C E9 EF, 05, 05]
-1D321; [0C E6 9F, 05, 05]
+A4AD; [0C E9 F6, 05, 05]
-1D322; [0C E6 A6, 05, 05]
+A4AE; [0C E9 FD, 05, 05]
-1D323; [0C E6 AD, 05, 05]
+A4AF; [0C EA 06, 05, 05]
-1D324; [0C E6 B4, 05, 05]
+A4B0; [0C EA 0D, 05, 05]
-1D325; [0C E6 BB, 05, 05]
+A4B1; [0C EA 14, 05, 05]
-1D326; [0C E6 C2, 05, 05]
+A4B2; [0C EA 1B, 05, 05]
-1D327; [0C E6 C9, 05, 05]
+A4B3; [0C EA 22, 05, 05]
-1D328; [0C E6 D0, 05, 05]
+A4B4; [0C EA 29, 05, 05]
-1D329; [0C E6 D7, 05, 05]
+A4B5; [0C EA 30, 05, 05]
-1D32A; [0C E6 DE, 05, 05]
+A4B6; [0C EA 37, 05, 05]
-1D32B; [0C E6 E5, 05, 05]
+A4B7; [0C EA 3E, 05, 05]
-1D32C; [0C E6 EC, 05, 05]
+A4B8; [0C EA 45, 05, 05]
-1D32D; [0C E6 F3, 05, 05]
+A4B9; [0C EA 4C, 05, 05]
-1D32E; [0C E6 FA, 05, 05]
+A4BA; [0C EA 53, 05, 05]
-1D32F; [0C E7 03, 05, 05]
+A4BB; [0C EA 5A, 05, 05]
-1D330; [0C E7 0A, 05, 05]
+A4BC; [0C EA 61, 05, 05]
-1D331; [0C E7 11, 05, 05]
+A4BD; [0C EA 68, 05, 05]
-1D332; [0C E7 18, 05, 05]
+A4BE; [0C EA 6F, 05, 05]
-1D333; [0C E7 1F, 05, 05]
+A4BF; [0C EA 76, 05, 05]
-1D334; [0C E7 26, 05, 05]
+A4C0; [0C EA 7D, 05, 05]
-1D335; [0C E7 2D, 05, 05]
+A4C1; [0C EA 84, 05, 05]
-1D336; [0C E7 34, 05, 05]
+A4C2; [0C EA 8B, 05, 05]
-1D337; [0C E7 3B, 05, 05]
+A4C3; [0C EA 92, 05, 05]
-1D338; [0C E7 42, 05, 05]
+A4C4; [0C EA 99, 05, 05]
-1D339; [0C E7 49, 05, 05]
+A4C5; [0C EA A0, 05, 05]
-1D33A; [0C E7 50, 05, 05]
+A4C6; [0C EA A7, 05, 05]
-1D33B; [0C E7 57, 05, 05]
+10137; [0C EA AE, 05, 05]
-1D33C; [0C E7 5E, 05, 05]
+10138; [0C EA B5, 05, 05]
-1D33D; [0C E7 65, 05, 05]
+10139; [0C EA BC, 05, 05]
-1D33E; [0C E7 6C, 05, 05]
+1013A; [0C EA C3, 05, 05]
-1D33F; [0C E7 73, 05, 05]
+1013B; [0C EA CA, 05, 05]
-1D340; [0C E7 7A, 05, 05]
+1013C; [0C EA D1, 05, 05]
-1D341; [0C E7 81, 05, 05]
+1013D; [0C EA D8, 05, 05]
-1D342; [0C E7 88, 05, 05]
+1013E; [0C EA DF, 05, 05]
-1D343; [0C E7 8F, 05, 05]
+1013F; [0C EA E6, 05, 05]
-1D344; [0C E7 96, 05, 05]
+10179; [0C EA ED, 05, 05]
-1D345; [0C E7 9D, 05, 05]
+1017A; [0C EA F4, 05, 05]
-1D346; [0C E7 A4, 05, 05]
+1017B; [0C EA FB, 05, 05]
-1D347; [0C E7 AB, 05, 05]
+1017C; [0C EB 04, 05, 05]
-1D348; [0C E7 B2, 05, 05]
+1017D; [0C EB 0B, 05, 05]
-1D349; [0C E7 B9, 05, 05]
+1017E; [0C EB 12, 05, 05]
-1D34A; [0C E7 C0, 05, 05]
+1017F; [0C EB 19, 05, 05]
-1D34B; [0C E7 C7, 05, 05]
+10180; [0C EB 20, 05, 05]
-1D34C; [0C E7 CE, 05, 05]
+10181; [0C EB 27, 05, 05]
-1D34D; [0C E7 D5, 05, 05]
+10182; [0C EB 2E, 05, 05]
-1D34E; [0C E7 DC, 05, 05]
+10183; [0C EB 35, 05, 05]
-1D34F; [0C E7 E3, 05, 05]
+10184; [0C EB 3C, 05, 05]
-1D350; [0C E7 EA, 05, 05]
+10185; [0C EB 43, 05, 05]
-1D351; [0C E7 F1, 05, 05]
+10186; [0C EB 4A, 05, 05]
-1D352; [0C E7 F8, 05, 05]
+10187; [0C EB 51, 05, 05]
-1D353; [0C E7 FF, 05, 05]
+10188; [0C EB 58, 05, 05]
-1D354; [0C E8 08, 05, 05]
+10189; [0C EB 5F, 05, 05]
-1D355; [0C E8 0F, 05, 05]
+1018C; [0C EB 66, 05, 05]
-1D356; [0C E8 16, 05, 05]
+1018D; [0C EB 6D, 05, 05]
-A490; [0C E8 1D, 05, 05]
+1018E; [0C EB 74, 05, 05]
-A491; [0C E8 24, 05, 05]
+10190; [0C EB 7B, 05, 05]
-A492; [0C E8 2B, 05, 05]
+10191; [0C EB 82, 05, 05]
-A493; [0C E8 32, 05, 05]
+10192; [0C EB 89, 05, 05]
-A494; [0C E8 39, 05, 05]
+10193; [0C EB 90, 05, 05]
-A495; [0C E8 40, 05, 05]
+10194; [0C EB 97, 05, 05]
-A496; [0C E8 47, 05, 05]
+10195; [0C EB 9E, 05, 05]
-A497; [0C E8 4E, 05, 05]
+10196; [0C EB A5, 05, 05]
-A498; [0C E8 55, 05, 05]
+10197; [0C EB AC, 05, 05]
-A499; [0C E8 5C, 05, 05]
+10198; [0C EB B3, 05, 05]
-A49A; [0C E8 63, 05, 05]
+10199; [0C EB BA, 05, 05]
-A49B; [0C E8 6A, 05, 05]
+1019A; [0C EB C1, 05, 05]
-A49C; [0C E8 71, 05, 05]
+1019B; [0C EB C8, 05, 05]
-A49D; [0C E8 78, 05, 05]
+101A0; [0C EB CF, 05, 05]
-A49E; [0C E8 7F, 05, 05]
+101D0; [0C EB D6, 05, 05]
-A49F; [0C E8 86, 05, 05]
+101D1; [0C EB DD, 05, 05]
-A4A0; [0C E8 8D, 05, 05]
+101D2; [0C EB E4, 05, 05]
-A4A1; [0C E8 94, 05, 05]
+101D3; [0C EB EB, 05, 05]
-A4A2; [0C E8 9B, 05, 05]
+101D4; [0C EB F2, 05, 05]
-A4A3; [0C E8 A2, 05, 05]
+101D5; [0C EB F9, 05, 05]
-A4A4; [0C E8 A9, 05, 05]
+101D6; [0C EC 02, 05, 05]
-A4A5; [0C E8 B0, 05, 05]
+101D7; [0C EC 09, 05, 05]
-A4A6; [0C E8 B7, 05, 05]
+101D8; [0C EC 10, 05, 05]
-A4A7; [0C E8 BE, 05, 05]
+101D9; [0C EC 17, 05, 05]
-A4A8; [0C E8 C5, 05, 05]
+101DA; [0C EC 1E, 05, 05]
-A4A9; [0C E8 CC, 05, 05]
+101DB; [0C EC 25, 05, 05]
-A4AA; [0C E8 D3, 05, 05]
+101DC; [0C EC 2C, 05, 05]
-A4AB; [0C E8 DA, 05, 05]
+101DD; [0C EC 33, 05, 05]
-A4AC; [0C E8 E1, 05, 05]
+101DE; [0C EC 3A, 05, 05]
-A4AD; [0C E8 E8, 05, 05]
+101DF; [0C EC 41, 05, 05]
-A4AE; [0C E8 EF, 05, 05]
+101E0; [0C EC 48, 05, 05]
-A4AF; [0C E8 F6, 05, 05]
+101E1; [0C EC 4F, 05, 05]
-A4B0; [0C E8 FD, 05, 05]
+101E2; [0C EC 56, 05, 05]
-A4B1; [0C E9 06, 05, 05]
+101E3; [0C EC 5D, 05, 05]
-A4B2; [0C E9 0D, 05, 05]
+101E4; [0C EC 64, 05, 05]
-A4B3; [0C E9 14, 05, 05]
+101E5; [0C EC 6B, 05, 05]
-A4B4; [0C E9 1B, 05, 05]
+101E6; [0C EC 72, 05, 05]
-A4B5; [0C E9 22, 05, 05]
+101E7; [0C EC 79, 05, 05]
-A4B6; [0C E9 29, 05, 05]
+101E8; [0C EC 80, 05, 05]
-A4B7; [0C E9 30, 05, 05]
+101E9; [0C EC 87, 05, 05]
-A4B8; [0C E9 37, 05, 05]
+101EA; [0C EC 8E, 05, 05]
-A4B9; [0C E9 3E, 05, 05]
+101EB; [0C EC 95, 05, 05]
-A4BA; [0C E9 45, 05, 05]
+101EC; [0C EC 9C, 05, 05]
-A4BB; [0C E9 4C, 05, 05]
+101ED; [0C EC A3, 05, 05]
-A4BC; [0C E9 53, 05, 05]
+101EE; [0C EC AA, 05, 05]
-A4BD; [0C E9 5A, 05, 05]
+101EF; [0C EC B1, 05, 05]
-A4BE; [0C E9 61, 05, 05]
+101F0; [0C EC B8, 05, 05]
-A4BF; [0C E9 68, 05, 05]
+101F1; [0C EC BF, 05, 05]
-A4C0; [0C E9 6F, 05, 05]
+101F2; [0C EC C6, 05, 05]
-A4C1; [0C E9 76, 05, 05]
+101F3; [0C EC CD, 05, 05]
-A4C2; [0C E9 7D, 05, 05]
+101F4; [0C EC D4, 05, 05]
-A4C3; [0C E9 84, 05, 05]
+101F5; [0C EC DB, 05, 05]
-A4C4; [0C E9 8B, 05, 05]
+101F6; [0C EC E2, 05, 05]
-A4C5; [0C E9 92, 05, 05]
+101F7; [0C EC E9, 05, 05]
-A4C6; [0C E9 99, 05, 05]
+101F8; [0C EC F0, 05, 05]
-10137; [0C E9 A0, 05, 05]
+101F9; [0C EC F7, 05, 05]
-10138; [0C E9 A7, 05, 05]
+101FA; [0C EC FE, 05, 05]
-10139; [0C E9 AE, 05, 05]
+101FB; [0C ED 07, 05, 05]
-1013A; [0C E9 B5, 05, 05]
+101FC; [0C ED 0E, 05, 05]
-1013B; [0C E9 BC, 05, 05]
+10877; [0C ED 15, 05, 05]
-1013C; [0C E9 C3, 05, 05]
+10878; [0C ED 1C, 05, 05]
-1013D; [0C E9 CA, 05, 05]
+16B3C; [0C ED 23, 05, 05]
-1013E; [0C E9 D1, 05, 05]
+16B3D; [0C ED 2A, 05, 05]
-1013F; [0C E9 D8, 05, 05]
+16B3E; [0C ED 31, 05, 05]
-10179; [0C E9 DF, 05, 05]
+16B3F; [0C ED 38, 05, 05]
-1017A; [0C E9 E6, 05, 05]
+16B45; [0C ED 3F, 05, 05]
-1017B; [0C E9 ED, 05, 05]
+1E14F; [0C ED 46, 05, 05]
-1017C; [0C E9 F4, 05, 05]
+1D000; [0C ED 4D, 05, 05]
-1017D; [0C E9 FB, 05, 05]
+1D001; [0C ED 54, 05, 05]
-1017E; [0C EA 04, 05, 05]
+1D002; [0C ED 5B, 05, 05]
-1017F; [0C EA 0B, 05, 05]
+1D003; [0C ED 62, 05, 05]
-10180; [0C EA 12, 05, 05]
+1D004; [0C ED 69, 05, 05]
-10181; [0C EA 19, 05, 05]
+1D005; [0C ED 70, 05, 05]
-10182; [0C EA 20, 05, 05]
+1D006; [0C ED 77, 05, 05]
-10183; [0C EA 27, 05, 05]
+1D007; [0C ED 7E, 05, 05]
-10184; [0C EA 2E, 05, 05]
+1D008; [0C ED 85, 05, 05]
-10185; [0C EA 35, 05, 05]
+1D009; [0C ED 8C, 05, 05]
-10186; [0C EA 3C, 05, 05]
+1D00A; [0C ED 93, 05, 05]
-10187; [0C EA 43, 05, 05]
+1D00B; [0C ED 9A, 05, 05]
-10188; [0C EA 4A, 05, 05]
+1D00C; [0C ED A1, 05, 05]
-10189; [0C EA 51, 05, 05]
+1D00D; [0C ED A8, 05, 05]
-1018C; [0C EA 58, 05, 05]
+1D00E; [0C ED AF, 05, 05]
-1018D; [0C EA 5F, 05, 05]
+1D00F; [0C ED B6, 05, 05]
-1018E; [0C EA 66, 05, 05]
+1D010; [0C ED BD, 05, 05]
-10190; [0C EA 6D, 05, 05]
+1D011; [0C ED C4, 05, 05]
-10191; [0C EA 74, 05, 05]
+1D012; [0C ED CB, 05, 05]
-10192; [0C EA 7B, 05, 05]
+1D013; [0C ED D2, 05, 05]
-10193; [0C EA 82, 05, 05]
+1D014; [0C ED D9, 05, 05]
-10194; [0C EA 89, 05, 05]
+1D015; [0C ED E0, 05, 05]
-10195; [0C EA 90, 05, 05]
+1D016; [0C ED E7, 05, 05]
-10196; [0C EA 97, 05, 05]
+1D017; [0C ED EE, 05, 05]
-10197; [0C EA 9E, 05, 05]
+1D018; [0C ED F5, 05, 05]
-10198; [0C EA A5, 05, 05]
+1D019; [0C ED FC, 05, 05]
-10199; [0C EA AC, 05, 05]
+1D01A; [0C EE 05, 05, 05]
-1019A; [0C EA B3, 05, 05]
+1D01B; [0C EE 0C, 05, 05]
-1019B; [0C EA BA, 05, 05]
+1D01C; [0C EE 13, 05, 05]
-101A0; [0C EA C1, 05, 05]
+1D01D; [0C EE 1A, 05, 05]
-101D0; [0C EA C8, 05, 05]
+1D01E; [0C EE 21, 05, 05]
-101D1; [0C EA CF, 05, 05]
+1D01F; [0C EE 28, 05, 05]
-101D2; [0C EA D6, 05, 05]
+1D020; [0C EE 2F, 05, 05]
-101D3; [0C EA DD, 05, 05]
+1D021; [0C EE 36, 05, 05]
-101D4; [0C EA E4, 05, 05]
+1D022; [0C EE 3D, 05, 05]
-101D5; [0C EA EB, 05, 05]
+1D023; [0C EE 44, 05, 05]
-101D6; [0C EA F2, 05, 05]
+1D024; [0C EE 4B, 05, 05]
-101D7; [0C EA F9, 05, 05]
+1D025; [0C EE 52, 05, 05]
-101D8; [0C EB 02, 05, 05]
+1D026; [0C EE 59, 05, 05]
-101D9; [0C EB 09, 05, 05]
+1D027; [0C EE 60, 05, 05]
-101DA; [0C EB 10, 05, 05]
+1D028; [0C EE 67, 05, 05]
-101DB; [0C EB 17, 05, 05]
+1D029; [0C EE 6E, 05, 05]
-101DC; [0C EB 1E, 05, 05]
+1D02A; [0C EE 75, 05, 05]
-101DD; [0C EB 25, 05, 05]
+1D02B; [0C EE 7C, 05, 05]
-101DE; [0C EB 2C, 05, 05]
+1D02C; [0C EE 83, 05, 05]
-101DF; [0C EB 33, 05, 05]
+1D02D; [0C EE 8A, 05, 05]
-101E0; [0C EB 3A, 05, 05]
+1D02E; [0C EE 91, 05, 05]
-101E1; [0C EB 41, 05, 05]
+1D02F; [0C EE 98, 05, 05]
-101E2; [0C EB 48, 05, 05]
+1D030; [0C EE 9F, 05, 05]
-101E3; [0C EB 4F, 05, 05]
+1D031; [0C EE A6, 05, 05]
-101E4; [0C EB 56, 05, 05]
+1D032; [0C EE AD, 05, 05]
-101E5; [0C EB 5D, 05, 05]
+1D033; [0C EE B4, 05, 05]
-101E6; [0C EB 64, 05, 05]
+1D034; [0C EE BB, 05, 05]
-101E7; [0C EB 6B, 05, 05]
+1D035; [0C EE C2, 05, 05]
-101E8; [0C EB 72, 05, 05]
+1D036; [0C EE C9, 05, 05]
-101E9; [0C EB 79, 05, 05]
+1D037; [0C EE D0, 05, 05]
-101EA; [0C EB 80, 05, 05]
+1D038; [0C EE D7, 05, 05]
-101EB; [0C EB 87, 05, 05]
+1D039; [0C EE DE, 05, 05]
-101EC; [0C EB 8E, 05, 05]
+1D03A; [0C EE E5, 05, 05]
-101ED; [0C EB 95, 05, 05]
+1D03B; [0C EE EC, 05, 05]
-101EE; [0C EB 9C, 05, 05]
+1D03C; [0C EE F3, 05, 05]
-101EF; [0C EB A3, 05, 05]
+1D03D; [0C EE FA, 05, 05]
-101F0; [0C EB AA, 05, 05]
+1D03E; [0C EF 03, 05, 05]
-101F1; [0C EB B1, 05, 05]
+1D03F; [0C EF 0A, 05, 05]
-101F2; [0C EB B8, 05, 05]
+1D040; [0C EF 11, 05, 05]
-101F3; [0C EB BF, 05, 05]
+1D041; [0C EF 18, 05, 05]
-101F4; [0C EB C6, 05, 05]
+1D042; [0C EF 1F, 05, 05]
-101F5; [0C EB CD, 05, 05]
+1D043; [0C EF 26, 05, 05]
-101F6; [0C EB D4, 05, 05]
+1D044; [0C EF 2D, 05, 05]
-101F7; [0C EB DB, 05, 05]
+1D045; [0C EF 34, 05, 05]
-101F8; [0C EB E2, 05, 05]
+1D046; [0C EF 3B, 05, 05]
-101F9; [0C EB E9, 05, 05]
+1D047; [0C EF 42, 05, 05]
-101FA; [0C EB F0, 05, 05]
+1D048; [0C EF 49, 05, 05]
-101FB; [0C EB F7, 05, 05]
+1D049; [0C EF 50, 05, 05]
-101FC; [0C EB FE, 05, 05]
+1D04A; [0C EF 57, 05, 05]
-10877; [0C EC 07, 05, 05]
+1D04B; [0C EF 5E, 05, 05]
-10878; [0C EC 0E, 05, 05]
+1D04C; [0C EF 65, 05, 05]
-16B3C; [0C EC 15, 05, 05]
+1D04D; [0C EF 6C, 05, 05]
-16B3D; [0C EC 1C, 05, 05]
+1D04E; [0C EF 73, 05, 05]
-16B3E; [0C EC 23, 05, 05]
+1D04F; [0C EF 7A, 05, 05]
-16B3F; [0C EC 2A, 05, 05]
+1D050; [0C EF 81, 05, 05]
-16B45; [0C EC 31, 05, 05]
+1D051; [0C EF 88, 05, 05]
-1D000; [0C EC 38, 05, 05]
+1D052; [0C EF 8F, 05, 05]
-1D001; [0C EC 3F, 05, 05]
+1D053; [0C EF 96, 05, 05]
-1D002; [0C EC 46, 05, 05]
+1D054; [0C EF 9D, 05, 05]
-1D003; [0C EC 4D, 05, 05]
+1D055; [0C EF A4, 05, 05]
-1D004; [0C EC 54, 05, 05]
+1D056; [0C EF AB, 05, 05]
-1D005; [0C EC 5B, 05, 05]
+1D057; [0C EF B2, 05, 05]
-1D006; [0C EC 62, 05, 05]
+1D058; [0C EF B9, 05, 05]
-1D007; [0C EC 69, 05, 05]
+1D059; [0C EF C0, 05, 05]
-1D008; [0C EC 70, 05, 05]
+1D05A; [0C EF C7, 05, 05]
-1D009; [0C EC 77, 05, 05]
+1D05B; [0C EF CE, 05, 05]
-1D00A; [0C EC 7E, 05, 05]
+1D05C; [0C EF D5, 05, 05]
-1D00B; [0C EC 85, 05, 05]
+1D05D; [0C EF DC, 05, 05]
-1D00C; [0C EC 8C, 05, 05]
+1D05E; [0C EF E3, 05, 05]
-1D00D; [0C EC 93, 05, 05]
+1D05F; [0C EF EA, 05, 05]
-1D00E; [0C EC 9A, 05, 05]
+1D060; [0C EF F1, 05, 05]
-1D00F; [0C EC A1, 05, 05]
+1D061; [0C EF F8, 05, 05]
-1D010; [0C EC A8, 05, 05]
+1D062; [0C EF FF, 05, 05]
-1D011; [0C EC AF, 05, 05]
+1D063; [0C F0 08, 05, 05]
-1D012; [0C EC B6, 05, 05]
+1D064; [0C F0 0F, 05, 05]
-1D013; [0C EC BD, 05, 05]
+1D065; [0C F0 16, 05, 05]
-1D014; [0C EC C4, 05, 05]
+1D066; [0C F0 1D, 05, 05]
-1D015; [0C EC CB, 05, 05]
+1D067; [0C F0 24, 05, 05]
-1D016; [0C EC D2, 05, 05]
+1D068; [0C F0 2B, 05, 05]
-1D017; [0C EC D9, 05, 05]
+1D069; [0C F0 32, 05, 05]
-1D018; [0C EC E0, 05, 05]
+1D06A; [0C F0 39, 05, 05]
-1D019; [0C EC E7, 05, 05]
+1D06B; [0C F0 40, 05, 05]
-1D01A; [0C EC EE, 05, 05]
+1D06C; [0C F0 47, 05, 05]
-1D01B; [0C EC F5, 05, 05]
+1D06D; [0C F0 4E, 05, 05]
-1D01C; [0C EC FC, 05, 05]
+1D06E; [0C F0 55, 05, 05]
-1D01D; [0C ED 05, 05, 05]
+1D06F; [0C F0 5C, 05, 05]
-1D01E; [0C ED 0C, 05, 05]
+1D070; [0C F0 63, 05, 05]
-1D01F; [0C ED 13, 05, 05]
+1D071; [0C F0 6A, 05, 05]
-1D020; [0C ED 1A, 05, 05]
+1D072; [0C F0 71, 05, 05]
-1D021; [0C ED 21, 05, 05]
+1D073; [0C F0 78, 05, 05]
-1D022; [0C ED 28, 05, 05]
+1D074; [0C F0 7F, 05, 05]
-1D023; [0C ED 2F, 05, 05]
+1D075; [0C F0 86, 05, 05]
-1D024; [0C ED 36, 05, 05]
+1D076; [0C F0 8D, 05, 05]
-1D025; [0C ED 3D, 05, 05]
+1D077; [0C F0 94, 05, 05]
-1D026; [0C ED 44, 05, 05]
+1D078; [0C F0 9B, 05, 05]
-1D027; [0C ED 4B, 05, 05]
+1D079; [0C F0 A2, 05, 05]
-1D028; [0C ED 52, 05, 05]
+1D07A; [0C F0 A9, 05, 05]
-1D029; [0C ED 59, 05, 05]
+1D07B; [0C F0 B0, 05, 05]
-1D02A; [0C ED 60, 05, 05]
+1D07C; [0C F0 B7, 05, 05]
-1D02B; [0C ED 67, 05, 05]
+1D07D; [0C F0 BE, 05, 05]
-1D02C; [0C ED 6E, 05, 05]
+1D07E; [0C F0 C5, 05, 05]
-1D02D; [0C ED 75, 05, 05]
+1D07F; [0C F0 CC, 05, 05]
-1D02E; [0C ED 7C, 05, 05]
+1D080; [0C F0 D3, 05, 05]
-1D02F; [0C ED 83, 05, 05]
+1D081; [0C F0 DA, 05, 05]
-1D030; [0C ED 8A, 05, 05]
+1D082; [0C F0 E1, 05, 05]
-1D031; [0C ED 91, 05, 05]
+1D083; [0C F0 E8, 05, 05]
-1D032; [0C ED 98, 05, 05]
+1D084; [0C F0 EF, 05, 05]
-1D033; [0C ED 9F, 05, 05]
+1D085; [0C F0 F6, 05, 05]
-1D034; [0C ED A6, 05, 05]
+1D086; [0C F0 FD, 05, 05]
-1D035; [0C ED AD, 05, 05]
+1D087; [0C F1 06, 05, 05]
-1D036; [0C ED B4, 05, 05]
+1D088; [0C F1 0D, 05, 05]
-1D037; [0C ED BB, 05, 05]
+1D089; [0C F1 14, 05, 05]
-1D038; [0C ED C2, 05, 05]
+1D08A; [0C F1 1B, 05, 05]
-1D039; [0C ED C9, 05, 05]
+1D08B; [0C F1 22, 05, 05]
-1D03A; [0C ED D0, 05, 05]
+1D08C; [0C F1 29, 05, 05]
-1D03B; [0C ED D7, 05, 05]
+1D08D; [0C F1 30, 05, 05]
-1D03C; [0C ED DE, 05, 05]
+1D08E; [0C F1 37, 05, 05]
-1D03D; [0C ED E5, 05, 05]
+1D08F; [0C F1 3E, 05, 05]
-1D03E; [0C ED EC, 05, 05]
+1D090; [0C F1 45, 05, 05]
-1D03F; [0C ED F3, 05, 05]
+1D091; [0C F1 4C, 05, 05]
-1D040; [0C ED FA, 05, 05]
+1D092; [0C F1 53, 05, 05]
-1D041; [0C EE 03, 05, 05]
+1D093; [0C F1 5A, 05, 05]
-1D042; [0C EE 0A, 05, 05]
+1D094; [0C F1 61, 05, 05]
-1D043; [0C EE 11, 05, 05]
+1D095; [0C F1 68, 05, 05]
-1D044; [0C EE 18, 05, 05]
+1D096; [0C F1 6F, 05, 05]
-1D045; [0C EE 1F, 05, 05]
+1D097; [0C F1 76, 05, 05]
-1D046; [0C EE 26, 05, 05]
+1D098; [0C F1 7D, 05, 05]
-1D047; [0C EE 2D, 05, 05]
+1D099; [0C F1 84, 05, 05]
-1D048; [0C EE 34, 05, 05]
+1D09A; [0C F1 8B, 05, 05]
-1D049; [0C EE 3B, 05, 05]
+1D09B; [0C F1 92, 05, 05]
-1D04A; [0C EE 42, 05, 05]
+1D09C; [0C F1 99, 05, 05]
-1D04B; [0C EE 49, 05, 05]
+1D09D; [0C F1 A0, 05, 05]
-1D04C; [0C EE 50, 05, 05]
+1D09E; [0C F1 A7, 05, 05]
-1D04D; [0C EE 57, 05, 05]
+1D09F; [0C F1 AE, 05, 05]
-1D04E; [0C EE 5E, 05, 05]
+1D0A0; [0C F1 B5, 05, 05]
-1D04F; [0C EE 65, 05, 05]
+1D0A1; [0C F1 BC, 05, 05]
-1D050; [0C EE 6C, 05, 05]
+1D0A2; [0C F1 C3, 05, 05]
-1D051; [0C EE 73, 05, 05]
+1D0A3; [0C F1 CA, 05, 05]
-1D052; [0C EE 7A, 05, 05]
+1D0A4; [0C F1 D1, 05, 05]
-1D053; [0C EE 81, 05, 05]
+1D0A5; [0C F1 D8, 05, 05]
-1D054; [0C EE 88, 05, 05]
+1D0A6; [0C F1 DF, 05, 05]
-1D055; [0C EE 8F, 05, 05]
+1D0A7; [0C F1 E6, 05, 05]
-1D056; [0C EE 96, 05, 05]
+1D0A8; [0C F1 ED, 05, 05]
-1D057; [0C EE 9D, 05, 05]
+1D0A9; [0C F1 F4, 05, 05]
-1D058; [0C EE A4, 05, 05]
+1D0AA; [0C F1 FB, 05, 05]
-1D059; [0C EE AB, 05, 05]
+1D0AB; [0C F2 04, 05, 05]
-1D05A; [0C EE B2, 05, 05]
+1D0AC; [0C F2 0B, 05, 05]
-1D05B; [0C EE B9, 05, 05]
+1D0AD; [0C F2 12, 05, 05]
-1D05C; [0C EE C0, 05, 05]
+1D0AE; [0C F2 19, 05, 05]
-1D05D; [0C EE C7, 05, 05]
+1D0AF; [0C F2 20, 05, 05]
-1D05E; [0C EE CE, 05, 05]
+1D0B0; [0C F2 27, 05, 05]
-1D05F; [0C EE D5, 05, 05]
+1D0B1; [0C F2 2E, 05, 05]
-1D060; [0C EE DC, 05, 05]
+1D0B2; [0C F2 35, 05, 05]
-1D061; [0C EE E3, 05, 05]
+1D0B3; [0C F2 3C, 05, 05]
-1D062; [0C EE EA, 05, 05]
+1D0B4; [0C F2 43, 05, 05]
-1D063; [0C EE F1, 05, 05]
+1D0B5; [0C F2 4A, 05, 05]
-1D064; [0C EE F8, 05, 05]
+1D0B6; [0C F2 51, 05, 05]
-1D065; [0C EE FF, 05, 05]
+1D0B7; [0C F2 58, 05, 05]
-1D066; [0C EF 08, 05, 05]
+1D0B8; [0C F2 5F, 05, 05]
-1D067; [0C EF 0F, 05, 05]
+1D0B9; [0C F2 66, 05, 05]
-1D068; [0C EF 16, 05, 05]
+1D0BA; [0C F2 6D, 05, 05]
-1D069; [0C EF 1D, 05, 05]
+1D0BB; [0C F2 74, 05, 05]
-1D06A; [0C EF 24, 05, 05]
+1D0BC; [0C F2 7B, 05, 05]
-1D06B; [0C EF 2B, 05, 05]
+1D0BD; [0C F2 82, 05, 05]
-1D06C; [0C EF 32, 05, 05]
+1D0BE; [0C F2 89, 05, 05]
-1D06D; [0C EF 39, 05, 05]
+1D0BF; [0C F2 90, 05, 05]
-1D06E; [0C EF 40, 05, 05]
+1D0C0; [0C F2 97, 05, 05]
-1D06F; [0C EF 47, 05, 05]
+1D0C1; [0C F2 9E, 05, 05]
-1D070; [0C EF 4E, 05, 05]
+1D0C2; [0C F2 A5, 05, 05]
-1D071; [0C EF 55, 05, 05]
+1D0C3; [0C F2 AC, 05, 05]
-1D072; [0C EF 5C, 05, 05]
+1D0C4; [0C F2 B3, 05, 05]
-1D073; [0C EF 63, 05, 05]
+1D0C5; [0C F2 BA, 05, 05]
-1D074; [0C EF 6A, 05, 05]
+1D0C6; [0C F2 C1, 05, 05]
-1D075; [0C EF 71, 05, 05]
+1D0C7; [0C F2 C8, 05, 05]
-1D076; [0C EF 78, 05, 05]
+1D0C8; [0C F2 CF, 05, 05]
-1D077; [0C EF 7F, 05, 05]
+1D0C9; [0C F2 D6, 05, 05]
-1D078; [0C EF 86, 05, 05]
+1D0CA; [0C F2 DD, 05, 05]
-1D079; [0C EF 8D, 05, 05]
+1D0CB; [0C F2 E4, 05, 05]
-1D07A; [0C EF 94, 05, 05]
+1D0CC; [0C F2 EB, 05, 05]
-1D07B; [0C EF 9B, 05, 05]
+1D0CD; [0C F2 F2, 05, 05]
-1D07C; [0C EF A2, 05, 05]
+1D0CE; [0C F2 F9, 05, 05]
-1D07D; [0C EF A9, 05, 05]
+1D0CF; [0C F3 02, 05, 05]
-1D07E; [0C EF B0, 05, 05]
+1D0D0; [0C F3 09, 05, 05]
-1D07F; [0C EF B7, 05, 05]
+1D0D1; [0C F3 10, 05, 05]
-1D080; [0C EF BE, 05, 05]
+1D0D2; [0C F3 17, 05, 05]
-1D081; [0C EF C5, 05, 05]
+1D0D3; [0C F3 1E, 05, 05]
-1D082; [0C EF CC, 05, 05]
+1D0D4; [0C F3 25, 05, 05]
-1D083; [0C EF D3, 05, 05]
+1D0D5; [0C F3 2C, 05, 05]
-1D084; [0C EF DA, 05, 05]
+1D0D6; [0C F3 33, 05, 05]
-1D085; [0C EF E1, 05, 05]
+1D0D7; [0C F3 3A, 05, 05]
-1D086; [0C EF E8, 05, 05]
+1D0D8; [0C F3 41, 05, 05]
-1D087; [0C EF EF, 05, 05]
+1D0D9; [0C F3 48, 05, 05]
-1D088; [0C EF F6, 05, 05]
+1D0DA; [0C F3 4F, 05, 05]
-1D089; [0C EF FD, 05, 05]
+1D0DB; [0C F3 56, 05, 05]
-1D08A; [0C F0 06, 05, 05]
+1D0DC; [0C F3 5D, 05, 05]
-1D08B; [0C F0 0D, 05, 05]
+1D0DD; [0C F3 64, 05, 05]
-1D08C; [0C F0 14, 05, 05]
+1D0DE; [0C F3 6B, 05, 05]
-1D08D; [0C F0 1B, 05, 05]
+1D0DF; [0C F3 72, 05, 05]
-1D08E; [0C F0 22, 05, 05]
+1D0E0; [0C F3 79, 05, 05]
-1D08F; [0C F0 29, 05, 05]
+1D0E1; [0C F3 80, 05, 05]
-1D090; [0C F0 30, 05, 05]
+1D0E2; [0C F3 87, 05, 05]
-1D091; [0C F0 37, 05, 05]
+1D0E3; [0C F3 8E, 05, 05]
-1D092; [0C F0 3E, 05, 05]
+1D0E4; [0C F3 95, 05, 05]
-1D093; [0C F0 45, 05, 05]
+1D0E5; [0C F3 9C, 05, 05]
-1D094; [0C F0 4C, 05, 05]
+1D0E6; [0C F3 A3, 05, 05]
-1D095; [0C F0 53, 05, 05]
+1D0E7; [0C F3 AA, 05, 05]
-1D096; [0C F0 5A, 05, 05]
+1D0E8; [0C F3 B1, 05, 05]
-1D097; [0C F0 61, 05, 05]
+1D0E9; [0C F3 B8, 05, 05]
-1D098; [0C F0 68, 05, 05]
+1D0EA; [0C F3 BF, 05, 05]
-1D099; [0C F0 6F, 05, 05]
+1D0EB; [0C F3 C6, 05, 05]
-1D09A; [0C F0 76, 05, 05]
+1D0EC; [0C F3 CD, 05, 05]
-1D09B; [0C F0 7D, 05, 05]
+1D0ED; [0C F3 D4, 05, 05]
-1D09C; [0C F0 84, 05, 05]
+1D0EE; [0C F3 DB, 05, 05]
-1D09D; [0C F0 8B, 05, 05]
+1D0EF; [0C F3 E2, 05, 05]
-1D09E; [0C F0 92, 05, 05]
+1D0F0; [0C F3 E9, 05, 05]
-1D09F; [0C F0 99, 05, 05]
+1D0F1; [0C F3 F0, 05, 05]
-1D0A0; [0C F0 A0, 05, 05]
+1D0F2; [0C F3 F7, 05, 05]
-1D0A1; [0C F0 A7, 05, 05]
+1D0F3; [0C F3 FE, 05, 05]
-1D0A2; [0C F0 AE, 05, 05]
+1D0F4; [0C F4 07, 05, 05]
-1D0A3; [0C F0 B5, 05, 05]
+1D0F5; [0C F4 0E, 05, 05]
-1D0A4; [0C F0 BC, 05, 05]
+1D100; [0C F4 15, 05, 05]
-1D0A5; [0C F0 C3, 05, 05]
+1D101; [0C F4 1C, 05, 05]
-1D0A6; [0C F0 CA, 05, 05]
+1D102; [0C F4 23, 05, 05]
-1D0A7; [0C F0 D1, 05, 05]
+1D103; [0C F4 2A, 05, 05]
-1D0A8; [0C F0 D8, 05, 05]
+1D104; [0C F4 31, 05, 05]
-1D0A9; [0C F0 DF, 05, 05]
+1D105; [0C F4 38, 05, 05]
-1D0AA; [0C F0 E6, 05, 05]
+1D106; [0C F4 3F, 05, 05]
-1D0AB; [0C F0 ED, 05, 05]
+1D107; [0C F4 46, 05, 05]
-1D0AC; [0C F0 F4, 05, 05]
+1D108; [0C F4 4D, 05, 05]
-1D0AD; [0C F0 FB, 05, 05]
+1D109; [0C F4 54, 05, 05]
-1D0AE; [0C F1 04, 05, 05]
+1D10A; [0C F4 5B, 05, 05]
-1D0AF; [0C F1 0B, 05, 05]
+1D10B; [0C F4 62, 05, 05]
-1D0B0; [0C F1 12, 05, 05]
+1D10C; [0C F4 69, 05, 05]
-1D0B1; [0C F1 19, 05, 05]
+1D10D; [0C F4 70, 05, 05]
-1D0B2; [0C F1 20, 05, 05]
+1D10E; [0C F4 77, 05, 05]
-1D0B3; [0C F1 27, 05, 05]
+1D10F; [0C F4 7E, 05, 05]
-1D0B4; [0C F1 2E, 05, 05]
+1D110; [0C F4 85, 05, 05]
-1D0B5; [0C F1 35, 05, 05]
+1D111; [0C F4 8C, 05, 05]
-1D0B6; [0C F1 3C, 05, 05]
+1D112; [0C F4 93, 05, 05]
-1D0B7; [0C F1 43, 05, 05]
+1D113; [0C F4 9A, 05, 05]
-1D0B8; [0C F1 4A, 05, 05]
+1D114; [0C F4 A1, 05, 05]
-1D0B9; [0C F1 51, 05, 05]
+1D115; [0C F4 A8, 05, 05]
-1D0BA; [0C F1 58, 05, 05]
+1D116; [0C F4 AF, 05, 05]
-1D0BB; [0C F1 5F, 05, 05]
+1D117; [0C F4 B6, 05, 05]
-1D0BC; [0C F1 66, 05, 05]
+1D118; [0C F4 BD, 05, 05]
-1D0BD; [0C F1 6D, 05, 05]
+1D119; [0C F4 C4, 05, 05]
-1D0BE; [0C F1 74, 05, 05]
+1D11A; [0C F4 CB, 05, 05]
-1D0BF; [0C F1 7B, 05, 05]
+1D11B; [0C F4 D2, 05, 05]
-1D0C0; [0C F1 82, 05, 05]
+1D11C; [0C F4 D9, 05, 05]
-1D0C1; [0C F1 89, 05, 05]
+1D11D; [0C F4 E0, 05, 05]
-1D0C2; [0C F1 90, 05, 05]
+1D11E; [0C F4 E7, 05, 05]
-1D0C3; [0C F1 97, 05, 05]
+1D11F; [0C F4 EE, 05, 05]
-1D0C4; [0C F1 9E, 05, 05]
+1D120; [0C F4 F5, 05, 05]
-1D0C5; [0C F1 A5, 05, 05]
+1D121; [0C F4 FC, 05, 05]
-1D0C6; [0C F1 AC, 05, 05]
+1D122; [0C F5 05, 05, 05]
-1D0C7; [0C F1 B3, 05, 05]
+1D123; [0C F5 0C, 05, 05]
-1D0C8; [0C F1 BA, 05, 05]
+1D124; [0C F5 13, 05, 05]
-1D0C9; [0C F1 C1, 05, 05]
+1D125; [0C F5 1A, 05, 05]
-1D0CA; [0C F1 C8, 05, 05]
+1D126; [0C F5 21, 05, 05]
-1D0CB; [0C F1 CF, 05, 05]
+266D; [0C F5 28, 05, 05]
-1D0CC; [0C F1 D6, 05, 05]
+266E; [0C F5 2F, 05, 05]
-1D0CD; [0C F1 DD, 05, 05]
+266F; [0C F5 36, 05, 05]
-1D0CE; [0C F1 E4, 05, 05]
+1D12A; [0C F5 3D, 05, 05]
-1D0CF; [0C F1 EB, 05, 05]
+1D12B; [0C F5 44, 05, 05]
-1D0D0; [0C F1 F2, 05, 05]
+1D12C; [0C F5 4B, 05, 05]
-1D0D1; [0C F1 F9, 05, 05]
+1D12D; [0C F5 52, 05, 05]
-1D0D2; [0C F2 02, 05, 05]
+1D12E; [0C F5 59, 05, 05]
-1D0D3; [0C F2 09, 05, 05]
+1D12F; [0C F5 60, 05, 05]
-1D0D4; [0C F2 10, 05, 05]
+1D130; [0C F5 67, 05, 05]
-1D0D5; [0C F2 17, 05, 05]
+1D131; [0C F5 6E, 05, 05]
-1D0D6; [0C F2 1E, 05, 05]
+1D132; [0C F5 75, 05, 05]
-1D0D7; [0C F2 25, 05, 05]
+1D133; [0C F5 7C, 05, 05]
-1D0D8; [0C F2 2C, 05, 05]
+1D134; [0C F5 83, 05, 05]
-1D0D9; [0C F2 33, 05, 05]
+1D135; [0C F5 8A, 05, 05]
-1D0DA; [0C F2 3A, 05, 05]
+1D136; [0C F5 91, 05, 05]
-1D0DB; [0C F2 41, 05, 05]
+1D137; [0C F5 98, 05, 05]
-1D0DC; [0C F2 48, 05, 05]
+1D138; [0C F5 9F, 05, 05]
-1D0DD; [0C F2 4F, 05, 05]
+1D139; [0C F5 A6, 05, 05]
-1D0DE; [0C F2 56, 05, 05]
+1D129; [0C F5 AD, 05, 05]
-1D0DF; [0C F2 5D, 05, 05]
+1D13A; [0C F5 B4, 05, 05]
-1D0E0; [0C F2 64, 05, 05]
+1D13B; [0C F5 BB, 05, 05]
-1D0E1; [0C F2 6B, 05, 05]
+1D13C; [0C F5 C2, 05, 05]
-1D0E2; [0C F2 72, 05, 05]
+1D13D; [0C F5 C9, 05, 05]
-1D0E3; [0C F2 79, 05, 05]
+1D13E; [0C F5 D0, 05, 05]
-1D0E4; [0C F2 80, 05, 05]
+1D13F; [0C F5 D7, 05, 05]
-1D0E5; [0C F2 87, 05, 05]
+1D140; [0C F5 DE, 05, 05]
-1D0E6; [0C F2 8E, 05, 05]
+1D141; [0C F5 E5, 05, 05]
-1D0E7; [0C F2 95, 05, 05]
+1D142; [0C F5 EC, 05, 05]
-1D0E8; [0C F2 9C, 05, 05]
+1D143; [0C F5 F3, 05, 05]
-1D0E9; [0C F2 A3, 05, 05]
+1D144; [0C F5 FA, 05, 05]
-1D0EA; [0C F2 AA, 05, 05]
+1D145; [0C F6 03, 05, 05]
-1D0EB; [0C F2 B1, 05, 05]
+1D146; [0C F6 0A, 05, 05]
-1D0EC; [0C F2 B8, 05, 05]
+1D147; [0C F6 11, 05, 05]
-1D0ED; [0C F2 BF, 05, 05]
+1D148; [0C F6 18, 05, 05]
-1D0EE; [0C F2 C6, 05, 05]
+1D149; [0C F6 1F, 05, 05]
-1D0EF; [0C F2 CD, 05, 05]
+1D14A; [0C F6 26, 05, 05]
-1D0F0; [0C F2 D4, 05, 05]
+1D14B; [0C F6 2D, 05, 05]
-1D0F1; [0C F2 DB, 05, 05]
+1D14C; [0C F6 34, 05, 05]
-1D0F2; [0C F2 E2, 05, 05]
+1D14D; [0C F6 3B, 05, 05]
-1D0F3; [0C F2 E9, 05, 05]
+1D14E; [0C F6 42, 05, 05]
-1D0F4; [0C F2 F0, 05, 05]
+1D14F; [0C F6 49, 05, 05]
-1D0F5; [0C F2 F7, 05, 05]
+1D150; [0C F6 50, 05, 05]
-1D100; [0C F2 FE, 05, 05]
+1D151; [0C F6 57, 05, 05]
-1D101; [0C F3 07, 05, 05]
+1D152; [0C F6 5E, 05, 05]
-1D102; [0C F3 0E, 05, 05]
+1D153; [0C F6 65, 05, 05]
-1D103; [0C F3 15, 05, 05]
+1D154; [0C F6 6C, 05, 05]
-1D104; [0C F3 1C, 05, 05]
+1D155; [0C F6 73, 05, 05]
-1D105; [0C F3 23, 05, 05]
+1D156; [0C F6 7A, 05, 05]
-1D106; [0C F3 2A, 05, 05]
+1D157; [0C F6 81, 05, 05]
+1D15E; [0C F6 81, 05, 05]
-1D107; [0C F3 31, 05, 05]
+1D158; [0C F6 88, 05, 05]
+1D15F; [0C F6 88, 05, 05]
+1D160; [0C F6 88, 05, 05]
+1D161; [0C F6 88, 05, 05]
+1D162; [0C F6 88, 05, 05]
+1D163; [0C F6 88, 05, 05]
+1D164; [0C F6 88, 05, 05]
-1D108; [0C F3 38, 05, 05]
+1D159; [0C F6 8F, 05, 05]
-1D109; [0C F3 3F, 05, 05]
+1D15A; [0C F6 96, 05, 05]
-1D10A; [0C F3 46, 05, 05]
+1D15B; [0C F6 9D, 05, 05]
-1D10B; [0C F3 4D, 05, 05]
+1D15C; [0C F6 A4, 05, 05]
-1D10C; [0C F3 54, 05, 05]
+1D15D; [0C F6 AB, 05, 05]
-1D10D; [0C F3 5B, 05, 05]
+1D16A; [0C F6 B2, 05, 05]
-1D10E; [0C F3 62, 05, 05]
+1D16B; [0C F6 B9, 05, 05]
-1D10F; [0C F3 69, 05, 05]
+1D16C; [0C F6 C0, 05, 05]
-1D110; [0C F3 70, 05, 05]
+1D183; [0C F6 C7, 05, 05]
-1D111; [0C F3 77, 05, 05]
+1D184; [0C F6 CE, 05, 05]
-1D112; [0C F3 7E, 05, 05]
+1D18C; [0C F6 D5, 05, 05]
-1D113; [0C F3 85, 05, 05]
+1D18D; [0C F6 DC, 05, 05]
-1D114; [0C F3 8C, 05, 05]
+1D18E; [0C F6 E3, 05, 05]
-1D115; [0C F3 93, 05, 05]
+1D18F; [0C F6 EA, 05, 05]
-1D116; [0C F3 9A, 05, 05]
+1D190; [0C F6 F1, 05, 05]
-1D117; [0C F3 A1, 05, 05]
+1D191; [0C F6 F8, 05, 05]
-1D118; [0C F3 A8, 05, 05]
+1D192; [0C F6 FF, 05, 05]
-1D119; [0C F3 AF, 05, 05]
+1D193; [0C F7 08, 05, 05]
-1D11A; [0C F3 B6, 05, 05]
+1D194; [0C F7 0F, 05, 05]
-1D11B; [0C F3 BD, 05, 05]
+1D195; [0C F7 16, 05, 05]
-1D11C; [0C F3 C4, 05, 05]
+1D196; [0C F7 1D, 05, 05]
-1D11D; [0C F3 CB, 05, 05]
+1D197; [0C F7 24, 05, 05]
-1D11E; [0C F3 D2, 05, 05]
+1D198; [0C F7 2B, 05, 05]
-1D11F; [0C F3 D9, 05, 05]
+1D199; [0C F7 32, 05, 05]
-1D120; [0C F3 E0, 05, 05]
+1D19A; [0C F7 39, 05, 05]
-1D121; [0C F3 E7, 05, 05]
+1D19B; [0C F7 40, 05, 05]
-1D122; [0C F3 EE, 05, 05]
+1D19C; [0C F7 47, 05, 05]
-1D123; [0C F3 F5, 05, 05]
+1D19D; [0C F7 4E, 05, 05]
-1D124; [0C F3 FC, 05, 05]
+1D19E; [0C F7 55, 05, 05]
-1D125; [0C F4 05, 05, 05]
+1D19F; [0C F7 5C, 05, 05]
-1D126; [0C F4 0C, 05, 05]
+1D1A0; [0C F7 63, 05, 05]
-266D; [0C F4 13, 05, 05]
+1D1A1; [0C F7 6A, 05, 05]
-266E; [0C F4 1A, 05, 05]
+1D1A2; [0C F7 71, 05, 05]
-266F; [0C F4 21, 05, 05]
+1D1A3; [0C F7 78, 05, 05]
-1D12A; [0C F4 28, 05, 05]
+1D1A4; [0C F7 7F, 05, 05]
-1D12B; [0C F4 2F, 05, 05]
+1D1A5; [0C F7 86, 05, 05]
-1D12C; [0C F4 36, 05, 05]
+1D1A6; [0C F7 8D, 05, 05]
-1D12D; [0C F4 3D, 05, 05]
+1D1A7; [0C F7 94, 05, 05]
-1D12E; [0C F4 44, 05, 05]
+1D1A8; [0C F7 9B, 05, 05]
-1D12F; [0C F4 4B, 05, 05]
+1D1A9; [0C F7 A2, 05, 05]
-1D130; [0C F4 52, 05, 05]
+1D1AE; [0C F7 A9, 05, 05]
-1D131; [0C F4 59, 05, 05]
+1D1AF; [0C F7 B0, 05, 05]
-1D132; [0C F4 60, 05, 05]
+1D1B0; [0C F7 B7, 05, 05]
-1D133; [0C F4 67, 05, 05]
+1D1B1; [0C F7 BE, 05, 05]
-1D134; [0C F4 6E, 05, 05]
+1D1B2; [0C F7 C5, 05, 05]
-1D135; [0C F4 75, 05, 05]
+1D1B3; [0C F7 CC, 05, 05]
-1D136; [0C F4 7C, 05, 05]
+1D1B4; [0C F7 D3, 05, 05]
-1D137; [0C F4 83, 05, 05]
+1D1B5; [0C F7 DA, 05, 05]
-1D138; [0C F4 8A, 05, 05]
+1D1B6; [0C F7 E1, 05, 05]
-1D139; [0C F4 91, 05, 05]
+1D1B7; [0C F7 E8, 05, 05]
-1D129; [0C F4 98, 05, 05]
+1D1B8; [0C F7 EF, 05, 05]
-1D13A; [0C F4 9F, 05, 05]
+1D1B9; [0C F7 F6, 05, 05]
+1D1BB; [0C F7 F6, 05, 05]
+1D1BD; [0C F7 F6, 05, 05]
+1D1BF; [0C F7 F6, 05, 05]
-1D13B; [0C F4 A6, 05, 05]
+1D1BA; [0C F7 FD, 05, 05]
+1D1BC; [0C F7 FD, 05, 05]
+1D1BE; [0C F7 FD, 05, 05]
+1D1C0; [0C F7 FD, 05, 05]
-1D13C; [0C F4 AD, 05, 05]
+1D1C1; [0C F8 06, 05, 05]
-1D13D; [0C F4 B4, 05, 05]
+1D1C2; [0C F8 0D, 05, 05]
-1D13E; [0C F4 BB, 05, 05]
+1D1C3; [0C F8 14, 05, 05]
-1D13F; [0C F4 C2, 05, 05]
+1D1C4; [0C F8 1B, 05, 05]
-1D140; [0C F4 C9, 05, 05]
+1D1C5; [0C F8 22, 05, 05]
-1D141; [0C F4 D0, 05, 05]
+1D1C6; [0C F8 29, 05, 05]
-1D142; [0C F4 D7, 05, 05]
+1D1C7; [0C F8 30, 05, 05]
-1D143; [0C F4 DE, 05, 05]
+1D1C8; [0C F8 37, 05, 05]
-1D144; [0C F4 E5, 05, 05]
+1D1C9; [0C F8 3E, 05, 05]
-1D145; [0C F4 EC, 05, 05]
+1D1CA; [0C F8 45, 05, 05]
-1D146; [0C F4 F3, 05, 05]
+1D1CB; [0C F8 4C, 05, 05]
-1D147; [0C F4 FA, 05, 05]
+1D1CC; [0C F8 53, 05, 05]
-1D148; [0C F5 03, 05, 05]
+1D1CD; [0C F8 5A, 05, 05]
-1D149; [0C F5 0A, 05, 05]
+1D1CE; [0C F8 61, 05, 05]
-1D14A; [0C F5 11, 05, 05]
+1D1CF; [0C F8 68, 05, 05]
-1D14B; [0C F5 18, 05, 05]
+1D1D0; [0C F8 6F, 05, 05]
-1D14C; [0C F5 1F, 05, 05]
+1D1D1; [0C F8 76, 05, 05]
-1D14D; [0C F5 26, 05, 05]
+1D1D2; [0C F8 7D, 05, 05]
-1D14E; [0C F5 2D, 05, 05]
+1D1D3; [0C F8 84, 05, 05]
-1D14F; [0C F5 34, 05, 05]
+1D1D4; [0C F8 8B, 05, 05]
-1D150; [0C F5 3B, 05, 05]
+1D1D5; [0C F8 92, 05, 05]
-1D151; [0C F5 42, 05, 05]
+1D1D6; [0C F8 99, 05, 05]
-1D152; [0C F5 49, 05, 05]
+1D1D7; [0C F8 A0, 05, 05]
-1D153; [0C F5 50, 05, 05]
+1D1D8; [0C F8 A7, 05, 05]
-1D154; [0C F5 57, 05, 05]
+1D1D9; [0C F8 AE, 05, 05]
-1D155; [0C F5 5E, 05, 05]
+1D1DA; [0C F8 B5, 05, 05]
-1D156; [0C F5 65, 05, 05]
+1D1DB; [0C F8 BC, 05, 05]
-1D157; [0C F5 6C, 05, 05]
-1D15E; [0C F5 6C, 05, 05]
+1D1DC; [0C F8 C3, 05, 05]
-1D158; [0C F5 73, 05, 05]
-1D15F; [0C F5 73, 05, 05]
-1D160; [0C F5 73, 05, 05]
-1D161; [0C F5 73, 05, 05]
-1D162; [0C F5 73, 05, 05]
-1D163; [0C F5 73, 05, 05]
-1D164; [0C F5 73, 05, 05]
+1D1DD; [0C F8 CA, 05, 05]
-1D159; [0C F5 7A, 05, 05]
+1D1DE; [0C F8 D1, 05, 05]
-1D15A; [0C F5 81, 05, 05]
+1D1DF; [0C F8 D8, 05, 05]
-1D15B; [0C F5 88, 05, 05]
+1D1E0; [0C F8 DF, 05, 05]
-1D15C; [0C F5 8F, 05, 05]
+1D1E1; [0C F8 E6, 05, 05]
-1D15D; [0C F5 96, 05, 05]
+1D1E2; [0C F8 ED, 05, 05]
-1D16A; [0C F5 9D, 05, 05]
+1D1E3; [0C F8 F4, 05, 05]
-1D16B; [0C F5 A4, 05, 05]
+1D1E4; [0C F8 FB, 05, 05]
-1D16C; [0C F5 AB, 05, 05]
+1D1E5; [0C F9 04, 05, 05]
-1D183; [0C F5 B2, 05, 05]
+1D1E6; [0C F9 0B, 05, 05]
-1D184; [0C F5 B9, 05, 05]
+1D1E7; [0C F9 12, 05, 05]
-1D18C; [0C F5 C0, 05, 05]
+1D1E8; [0C F9 19, 05, 05]
-1D18D; [0C F5 C7, 05, 05]
+1D200; [0C F9 20, 05, 05]
-1D18E; [0C F5 CE, 05, 05]
+1D201; [0C F9 27, 05, 05]
-1D18F; [0C F5 D5, 05, 05]
+1D202; [0C F9 2E, 05, 05]
-1D190; [0C F5 DC, 05, 05]
+1D203; [0C F9 35, 05, 05]
-1D191; [0C F5 E3, 05, 05]
+1D204; [0C F9 3C, 05, 05]
-1D192; [0C F5 EA, 05, 05]
+1D205; [0C F9 43, 05, 05]
-1D193; [0C F5 F1, 05, 05]
+1D206; [0C F9 4A, 05, 05]
-1D194; [0C F5 F8, 05, 05]
+1D207; [0C F9 51, 05, 05]
-1D195; [0C F5 FF, 05, 05]
+1D208; [0C F9 58, 05, 05]
-1D196; [0C F6 08, 05, 05]
+1D209; [0C F9 5F, 05, 05]
-1D197; [0C F6 0F, 05, 05]
+1D20A; [0C F9 66, 05, 05]
-1D198; [0C F6 16, 05, 05]
+1D20B; [0C F9 6D, 05, 05]
-1D199; [0C F6 1D, 05, 05]
+1D20C; [0C F9 74, 05, 05]
-1D19A; [0C F6 24, 05, 05]
+1D20D; [0C F9 7B, 05, 05]
-1D19B; [0C F6 2B, 05, 05]
+1D20E; [0C F9 82, 05, 05]
-1D19C; [0C F6 32, 05, 05]
+1D20F; [0C F9 89, 05, 05]
-1D19D; [0C F6 39, 05, 05]
+1D210; [0C F9 90, 05, 05]
-1D19E; [0C F6 40, 05, 05]
+1D211; [0C F9 97, 05, 05]
-1D19F; [0C F6 47, 05, 05]
+1D212; [0C F9 9E, 05, 05]
-1D1A0; [0C F6 4E, 05, 05]
+1D213; [0C F9 A5, 05, 05]
-1D1A1; [0C F6 55, 05, 05]
+1D214; [0C F9 AC, 05, 05]
-1D1A2; [0C F6 5C, 05, 05]
+1D215; [0C F9 B3, 05, 05]
-1D1A3; [0C F6 63, 05, 05]
+1D216; [0C F9 BA, 05, 05]
-1D1A4; [0C F6 6A, 05, 05]
+1D217; [0C F9 C1, 05, 05]
-1D1A5; [0C F6 71, 05, 05]
+1D218; [0C F9 C8, 05, 05]
-1D1A6; [0C F6 78, 05, 05]
+1D219; [0C F9 CF, 05, 05]
-1D1A7; [0C F6 7F, 05, 05]
+1D21A; [0C F9 D6, 05, 05]
-1D1A8; [0C F6 86, 05, 05]
+1D21B; [0C F9 DD, 05, 05]
-1D1A9; [0C F6 8D, 05, 05]
+1D21C; [0C F9 E4, 05, 05]
-1D1AE; [0C F6 94, 05, 05]
+1D21D; [0C F9 EB, 05, 05]
-1D1AF; [0C F6 9B, 05, 05]
+1D21E; [0C F9 F2, 05, 05]
-1D1B0; [0C F6 A2, 05, 05]
+1D21F; [0C F9 F9, 05, 05]
-1D1B1; [0C F6 A9, 05, 05]
+1D220; [0C FA 02, 05, 05]
-1D1B2; [0C F6 B0, 05, 05]
+1D221; [0C FA 09, 05, 05]
-1D1B3; [0C F6 B7, 05, 05]
+1D222; [0C FA 10, 05, 05]
-1D1B4; [0C F6 BE, 05, 05]
+1D223; [0C FA 17, 05, 05]
-1D1B5; [0C F6 C5, 05, 05]
+1D224; [0C FA 1E, 05, 05]
-1D1B6; [0C F6 CC, 05, 05]
+1D225; [0C FA 25, 05, 05]
-1D1B7; [0C F6 D3, 05, 05]
+1D226; [0C FA 2C, 05, 05]
-1D1B8; [0C F6 DA, 05, 05]
+1D227; [0C FA 33, 05, 05]
-1D1B9; [0C F6 E1, 05, 05]
-1D1BB; [0C F6 E1, 05, 05]
-1D1BD; [0C F6 E1, 05, 05]
-1D1BF; [0C F6 E1, 05, 05]
+1D228; [0C FA 3A, 05, 05]
-1D1BA; [0C F6 E8, 05, 05]
-1D1BC; [0C F6 E8, 05, 05]
-1D1BE; [0C F6 E8, 05, 05]
-1D1C0; [0C F6 E8, 05, 05]
+1D229; [0C FA 41, 05, 05]
-1D1C1; [0C F6 EF, 05, 05]
+1D22A; [0C FA 48, 05, 05]
-1D1C2; [0C F6 F6, 05, 05]
+1D22B; [0C FA 4F, 05, 05]
-1D1C3; [0C F6 FD, 05, 05]
+1D22C; [0C FA 56, 05, 05]
-1D1C4; [0C F7 06, 05, 05]
+1D22D; [0C FA 5D, 05, 05]
-1D1C5; [0C F7 0D, 05, 05]
+1D22E; [0C FA 64, 05, 05]
-1D1C6; [0C F7 14, 05, 05]
+1D22F; [0C FA 6B, 05, 05]
-1D1C7; [0C F7 1B, 05, 05]
+1D230; [0C FA 72, 05, 05]
-1D1C8; [0C F7 22, 05, 05]
+1D231; [0C FA 79, 05, 05]
-1D1C9; [0C F7 29, 05, 05]
+1D232; [0C FA 80, 05, 05]
-1D1CA; [0C F7 30, 05, 05]
+1D233; [0C FA 87, 05, 05]
-1D1CB; [0C F7 37, 05, 05]
+1D234; [0C FA 8E, 05, 05]
-1D1CC; [0C F7 3E, 05, 05]
+1D235; [0C FA 95, 05, 05]
-1D1CD; [0C F7 45, 05, 05]
+1D236; [0C FA 9C, 05, 05]
-1D1CE; [0C F7 4C, 05, 05]
+1D237; [0C FA A3, 05, 05]
-1D1CF; [0C F7 53, 05, 05]
+1D238; [0C FA AA, 05, 05]
-1D1D0; [0C F7 5A, 05, 05]
+1D239; [0C FA B1, 05, 05]
-1D1D1; [0C F7 61, 05, 05]
+1D23A; [0C FA B8, 05, 05]
-1D1D2; [0C F7 68, 05, 05]
+1D23B; [0C FA BF, 05, 05]
-1D1D3; [0C F7 6F, 05, 05]
+1D23C; [0C FA C6, 05, 05]
-1D1D4; [0C F7 76, 05, 05]
+1D23D; [0C FA CD, 05, 05]
-1D1D5; [0C F7 7D, 05, 05]
+1D23E; [0C FA D4, 05, 05]
-1D1D6; [0C F7 84, 05, 05]
+1D23F; [0C FA DB, 05, 05]
-1D1D7; [0C F7 8B, 05, 05]
+1D240; [0C FA E2, 05, 05]
-1D1D8; [0C F7 92, 05, 05]
+1D241; [0C FA E9, 05, 05]
-1D1D9; [0C F7 99, 05, 05]
+1D245; [0C FA F0, 05, 05]
-1D1DA; [0C F7 A0, 05, 05]
+1BC9C; [0C FA F7, 05, 05]
-1D1DB; [0C F7 A7, 05, 05]
+1ECAC; [0C FA FE, 05, 05]
-1D1DC; [0C F7 AE, 05, 05]
+1ED2E; [0C FB 07, 05, 05]
-1D1DD; [0C F7 B5, 05, 05]
+1F000; [0C FB 0E, 05, 05]
-1D1DE; [0C F7 BC, 05, 05]
+1F001; [0C FB 15, 05, 05]
-1D1DF; [0C F7 C3, 05, 05]
+1F002; [0C FB 1C, 05, 05]
-1D1E0; [0C F7 CA, 05, 05]
+1F003; [0C FB 23, 05, 05]
-1D1E1; [0C F7 D1, 05, 05]
+1F004; [0C FB 2A, 05, 05]
-1D1E2; [0C F7 D8, 05, 05]
+1F005; [0C FB 31, 05, 05]
-1D1E3; [0C F7 DF, 05, 05]
+1F006; [0C FB 38, 05, 05]
-1D1E4; [0C F7 E6, 05, 05]
+1F007; [0C FB 3F, 05, 05]
-1D1E5; [0C F7 ED, 05, 05]
+1F008; [0C FB 46, 05, 05]
-1D1E6; [0C F7 F4, 05, 05]
+1F009; [0C FB 4D, 05, 05]
-1D1E7; [0C F7 FB, 05, 05]
+1F00A; [0C FB 54, 05, 05]
-1D1E8; [0C F8 04, 05, 05]
+1F00B; [0C FB 5B, 05, 05]
-1D200; [0C F8 0B, 05, 05]
+1F00C; [0C FB 62, 05, 05]
-1D201; [0C F8 12, 05, 05]
+1F00D; [0C FB 69, 05, 05]
-1D202; [0C F8 19, 05, 05]
+1F00E; [0C FB 70, 05, 05]
-1D203; [0C F8 20, 05, 05]
+1F00F; [0C FB 77, 05, 05]
-1D204; [0C F8 27, 05, 05]
+1F010; [0C FB 7E, 05, 05]
-1D205; [0C F8 2E, 05, 05]
+1F011; [0C FB 85, 05, 05]
-1D206; [0C F8 35, 05, 05]
+1F012; [0C FB 8C, 05, 05]
-1D207; [0C F8 3C, 05, 05]
+1F013; [0C FB 93, 05, 05]
-1D208; [0C F8 43, 05, 05]
+1F014; [0C FB 9A, 05, 05]
-1D209; [0C F8 4A, 05, 05]
+1F015; [0C FB A1, 05, 05]
-1D20A; [0C F8 51, 05, 05]
+1F016; [0C FB A8, 05, 05]
-1D20B; [0C F8 58, 05, 05]
+1F017; [0C FB AF, 05, 05]
-1D20C; [0C F8 5F, 05, 05]
+1F018; [0C FB B6, 05, 05]
-1D20D; [0C F8 66, 05, 05]
+1F019; [0C FB BD, 05, 05]
-1D20E; [0C F8 6D, 05, 05]
+1F01A; [0C FB C4, 05, 05]
-1D20F; [0C F8 74, 05, 05]
+1F01B; [0C FB CB, 05, 05]
-1D210; [0C F8 7B, 05, 05]
+1F01C; [0C FB D2, 05, 05]
-1D211; [0C F8 82, 05, 05]
+1F01D; [0C FB D9, 05, 05]
-1D212; [0C F8 89, 05, 05]
+1F01E; [0C FB E0, 05, 05]
-1D213; [0C F8 90, 05, 05]
+1F01F; [0C FB E7, 05, 05]
-1D214; [0C F8 97, 05, 05]
+1F020; [0C FB EE, 05, 05]
-1D215; [0C F8 9E, 05, 05]
+1F021; [0C FB F5, 05, 05]
-1D216; [0C F8 A5, 05, 05]
+1F022; [0C FB FC, 05, 05]
-1D217; [0C F8 AC, 05, 05]
+1F023; [0C FC 05, 05, 05]
-1D218; [0C F8 B3, 05, 05]
+1F024; [0C FC 0C, 05, 05]
-1D219; [0C F8 BA, 05, 05]
+1F025; [0C FC 13, 05, 05]
-1D21A; [0C F8 C1, 05, 05]
+1F026; [0C FC 1A, 05, 05]
-1D21B; [0C F8 C8, 05, 05]
+1F027; [0C FC 21, 05, 05]
-1D21C; [0C F8 CF, 05, 05]
+1F028; [0C FC 28, 05, 05]
-1D21D; [0C F8 D6, 05, 05]
+1F029; [0C FC 2F, 05, 05]
-1D21E; [0C F8 DD, 05, 05]
+1F02A; [0C FC 36, 05, 05]
-1D21F; [0C F8 E4, 05, 05]
+1F02B; [0C FC 3D, 05, 05]
-1D220; [0C F8 EB, 05, 05]
+1F030; [0C FC 44, 05, 05]
-1D221; [0C F8 F2, 05, 05]
+1F031; [0C FC 4B, 05, 05]
-1D222; [0C F8 F9, 05, 05]
+1F032; [0C FC 52, 05, 05]
-1D223; [0C F9 02, 05, 05]
+1F033; [0C FC 59, 05, 05]
-1D224; [0C F9 09, 05, 05]
+1F034; [0C FC 60, 05, 05]
-1D225; [0C F9 10, 05, 05]
+1F035; [0C FC 67, 05, 05]
-1D226; [0C F9 17, 05, 05]
+1F036; [0C FC 6E, 05, 05]
-1D227; [0C F9 1E, 05, 05]
+1F037; [0C FC 75, 05, 05]
-1D228; [0C F9 25, 05, 05]
+1F038; [0C FC 7C, 05, 05]
-1D229; [0C F9 2C, 05, 05]
+1F039; [0C FC 83, 05, 05]
-1D22A; [0C F9 33, 05, 05]
+1F03A; [0C FC 8A, 05, 05]
-1D22B; [0C F9 3A, 05, 05]
+1F03B; [0C FC 91, 05, 05]
-1D22C; [0C F9 41, 05, 05]
+1F03C; [0C FC 98, 05, 05]
-1D22D; [0C F9 48, 05, 05]
+1F03D; [0C FC 9F, 05, 05]
-1D22E; [0C F9 4F, 05, 05]
+1F03E; [0C FC A6, 05, 05]
-1D22F; [0C F9 56, 05, 05]
+1F03F; [0C FC AD, 05, 05]
-1D230; [0C F9 5D, 05, 05]
+1F040; [0C FC B4, 05, 05]
-1D231; [0C F9 64, 05, 05]
+1F041; [0C FC BB, 05, 05]
-1D232; [0C F9 6B, 05, 05]
+1F042; [0C FC C2, 05, 05]
-1D233; [0C F9 72, 05, 05]
+1F043; [0C FC C9, 05, 05]
-1D234; [0C F9 79, 05, 05]
+1F044; [0C FC D0, 05, 05]
-1D235; [0C F9 80, 05, 05]
+1F045; [0C FC D7, 05, 05]
-1D236; [0C F9 87, 05, 05]
+1F046; [0C FC DE, 05, 05]
-1D237; [0C F9 8E, 05, 05]
+1F047; [0C FC E5, 05, 05]
-1D238; [0C F9 95, 05, 05]
+1F048; [0C FC EC, 05, 05]
-1D239; [0C F9 9C, 05, 05]
+1F049; [0C FC F3, 05, 05]
-1D23A; [0C F9 A3, 05, 05]
+1F04A; [0C FC FA, 05, 05]
-1D23B; [0C F9 AA, 05, 05]
+1F04B; [0C FD 03, 05, 05]
-1D23C; [0C F9 B1, 05, 05]
+1F04C; [0C FD 0A, 05, 05]
-1D23D; [0C F9 B8, 05, 05]
+1F04D; [0C FD 11, 05, 05]
-1D23E; [0C F9 BF, 05, 05]
+1F04E; [0C FD 18, 05, 05]
-1D23F; [0C F9 C6, 05, 05]
+1F04F; [0C FD 1F, 05, 05]
-1D240; [0C F9 CD, 05, 05]
+1F050; [0C FD 26, 05, 05]
-1D241; [0C F9 D4, 05, 05]
+1F051; [0C FD 2D, 05, 05]
-1D245; [0C F9 DB, 05, 05]
+1F052; [0C FD 34, 05, 05]
-1BC9C; [0C F9 E2, 05, 05]
+1F053; [0C FD 3B, 05, 05]
-1ECAC; [0C F9 E9, 05, 05]
+1F054; [0C FD 42, 05, 05]
-1F000; [0C F9 F0, 05, 05]
+1F055; [0C FD 49, 05, 05]
-1F001; [0C F9 F7, 05, 05]
+1F056; [0C FD 50, 05, 05]
-1F002; [0C F9 FE, 05, 05]
+1F057; [0C FD 57, 05, 05]
-1F003; [0C FA 07, 05, 05]
+1F058; [0C FD 5E, 05, 05]
-1F004; [0C FA 0E, 05, 05]
+1F059; [0C FD 65, 05, 05]
-1F005; [0C FA 15, 05, 05]
+1F05A; [0C FD 6C, 05, 05]
-1F006; [0C FA 1C, 05, 05]
+1F05B; [0C FD 73, 05, 05]
-1F007; [0C FA 23, 05, 05]
+1F05C; [0C FD 7A, 05, 05]
-1F008; [0C FA 2A, 05, 05]
+1F05D; [0C FD 81, 05, 05]
-1F009; [0C FA 31, 05, 05]
+1F05E; [0C FD 88, 05, 05]
-1F00A; [0C FA 38, 05, 05]
+1F05F; [0C FD 8F, 05, 05]
-1F00B; [0C FA 3F, 05, 05]
+1F060; [0C FD 96, 05, 05]
-1F00C; [0C FA 46, 05, 05]
+1F061; [0C FD 9D, 05, 05]
-1F00D; [0C FA 4D, 05, 05]
+1F062; [0C FD A4, 05, 05]
-1F00E; [0C FA 54, 05, 05]
+1F063; [0C FD AB, 05, 05]
-1F00F; [0C FA 5B, 05, 05]
+1F064; [0C FD B2, 05, 05]
-1F010; [0C FA 62, 05, 05]
+1F065; [0C FD B9, 05, 05]
-1F011; [0C FA 69, 05, 05]
+1F066; [0C FD C0, 05, 05]
-1F012; [0C FA 70, 05, 05]
+1F067; [0C FD C7, 05, 05]
-1F013; [0C FA 77, 05, 05]
+1F068; [0C FD CE, 05, 05]
-1F014; [0C FA 7E, 05, 05]
+1F069; [0C FD D5, 05, 05]
-1F015; [0C FA 85, 05, 05]
+1F06A; [0C FD DC, 05, 05]
-1F016; [0C FA 8C, 05, 05]
+1F06B; [0C FD E3, 05, 05]
-1F017; [0C FA 93, 05, 05]
+1F06C; [0C FD EA, 05, 05]
-1F018; [0C FA 9A, 05, 05]
+1F06D; [0C FD F1, 05, 05]
-1F019; [0C FA A1, 05, 05]
+1F06E; [0C FD F8, 05, 05]
-1F01A; [0C FA A8, 05, 05]
+1F06F; [0C FD FF, 05, 05]
-1F01B; [0C FA AF, 05, 05]
+1F070; [0C FE 08, 05, 05]
-1F01C; [0C FA B6, 05, 05]
+1F071; [0C FE 0F, 05, 05]
-1F01D; [0C FA BD, 05, 05]
+1F072; [0C FE 16, 05, 05]
-1F01E; [0C FA C4, 05, 05]
+1F073; [0C FE 1D, 05, 05]
-1F01F; [0C FA CB, 05, 05]
+1F074; [0C FE 24, 05, 05]
-1F020; [0C FA D2, 05, 05]
+1F075; [0C FE 2B, 05, 05]
-1F021; [0C FA D9, 05, 05]
+1F076; [0C FE 32, 05, 05]
-1F022; [0C FA E0, 05, 05]
+1F077; [0C FE 39, 05, 05]
-1F023; [0C FA E7, 05, 05]
+1F078; [0C FE 40, 05, 05]
-1F024; [0C FA EE, 05, 05]
+1F079; [0C FE 47, 05, 05]
-1F025; [0C FA F5, 05, 05]
+1F07A; [0C FE 4E, 05, 05]
-1F026; [0C FA FC, 05, 05]
+1F07B; [0C FE 55, 05, 05]
-1F027; [0C FB 05, 05, 05]
+1F07C; [0C FE 5C, 05, 05]
-1F028; [0C FB 0C, 05, 05]
+1F07D; [0C FE 63, 05, 05]
-1F029; [0C FB 13, 05, 05]
+1F07E; [0C FE 6A, 05, 05]
-1F02A; [0C FB 1A, 05, 05]
+1F07F; [0C FE 71, 05, 05]
-1F02B; [0C FB 21, 05, 05]
+1F080; [0C FE 78, 05, 05]
-1F030; [0C FB 28, 05, 05]
+1F081; [0C FE 7F, 05, 05]
-1F031; [0C FB 2F, 05, 05]
+1F082; [0C FE 86, 05, 05]
-1F032; [0C FB 36, 05, 05]
+1F083; [0C FE 8D, 05, 05]
-1F033; [0C FB 3D, 05, 05]
+1F084; [0C FE 94, 05, 05]
-1F034; [0C FB 44, 05, 05]
+1F085; [0C FE 9B, 05, 05]
-1F035; [0C FB 4B, 05, 05]
+1F086; [0C FE A2, 05, 05]
-1F036; [0C FB 52, 05, 05]
+1F087; [0C FE A9, 05, 05]
-1F037; [0C FB 59, 05, 05]
+1F088; [0C FE B0, 05, 05]
-1F038; [0C FB 60, 05, 05]
+1F089; [0C FE B7, 05, 05]
-1F039; [0C FB 67, 05, 05]
+1F08A; [0C FE BE, 05, 05]
-1F03A; [0C FB 6E, 05, 05]
+1F08B; [0C FE C5, 05, 05]
-1F03B; [0C FB 75, 05, 05]
+1F08C; [0C FE CC, 05, 05]
-1F03C; [0C FB 7C, 05, 05]
+1F08D; [0C FE D3, 05, 05]
-1F03D; [0C FB 83, 05, 05]
+1F08E; [0C FE DA, 05, 05]
-1F03E; [0C FB 8A, 05, 05]
+1F08F; [0C FE E1, 05, 05]
-1F03F; [0C FB 91, 05, 05]
+1F090; [0C FE E8, 05, 05]
-1F040; [0C FB 98, 05, 05]
+1F091; [0C FE EF, 05, 05]
-1F041; [0C FB 9F, 05, 05]
+1F092; [0C FE F6, 05, 05]
-1F042; [0C FB A6, 05, 05]
+1F093; [0C FE FD, 05, 05]
-1F043; [0C FB AD, 05, 05]
+1F0A0; [0C FF 06, 05, 05]
-1F044; [0C FB B4, 05, 05]
+1F0A1; [0C FF 0D, 05, 05]
-1F045; [0C FB BB, 05, 05]
+1F0A2; [0C FF 14, 05, 05]
-1F046; [0C FB C2, 05, 05]
+1F0A3; [0C FF 1B, 05, 05]
-1F047; [0C FB C9, 05, 05]
+1F0A4; [0C FF 22, 05, 05]
-1F048; [0C FB D0, 05, 05]
+1F0A5; [0C FF 29, 05, 05]
-1F049; [0C FB D7, 05, 05]
+1F0A6; [0C FF 30, 05, 05]
-1F04A; [0C FB DE, 05, 05]
+1F0A7; [0C FF 37, 05, 05]
-1F04B; [0C FB E5, 05, 05]
+1F0A8; [0C FF 3E, 05, 05]
-1F04C; [0C FB EC, 05, 05]
+1F0A9; [0C FF 45, 05, 05]
-1F04D; [0C FB F3, 05, 05]
+1F0AA; [0C FF 4C, 05, 05]
-1F04E; [0C FB FA, 05, 05]
+1F0AB; [0C FF 53, 05, 05]
-1F04F; [0C FC 03, 05, 05]
+1F0AC; [0C FF 5A, 05, 05]
-1F050; [0C FC 0A, 05, 05]
+1F0AD; [0C FF 61, 05, 05]
-1F051; [0C FC 11, 05, 05]
+1F0AE; [0C FF 68, 05, 05]
-1F052; [0C FC 18, 05, 05]
+1F0B1; [0C FF 6F, 05, 05]
-1F053; [0C FC 1F, 05, 05]
+1F0B2; [0C FF 76, 05, 05]
-1F054; [0C FC 26, 05, 05]
+1F0B3; [0C FF 7D, 05, 05]
-1F055; [0C FC 2D, 05, 05]
+1F0B4; [0C FF 84, 05, 05]
-1F056; [0C FC 34, 05, 05]
+1F0B5; [0C FF 8B, 05, 05]
-1F057; [0C FC 3B, 05, 05]
+1F0B6; [0C FF 92, 05, 05]
-1F058; [0C FC 42, 05, 05]
+1F0B7; [0C FF 99, 05, 05]
-1F059; [0C FC 49, 05, 05]
+1F0B8; [0C FF A0, 05, 05]
-1F05A; [0C FC 50, 05, 05]
+1F0B9; [0C FF A7, 05, 05]
-1F05B; [0C FC 57, 05, 05]
+1F0BA; [0C FF AE, 05, 05]
-1F05C; [0C FC 5E, 05, 05]
+1F0BB; [0C FF B5, 05, 05]
-1F05D; [0C FC 65, 05, 05]
+1F0BC; [0C FF BC, 05, 05]
-1F05E; [0C FC 6C, 05, 05]
+1F0BD; [0C FF C3, 05, 05]
-1F05F; [0C FC 73, 05, 05]
+1F0BE; [0C FF CA, 05, 05]
-1F060; [0C FC 7A, 05, 05]
+1F0BF; [0C FF D1, 05, 05]
-1F061; [0C FC 81, 05, 05]
+1F0C1; [0C FF D8, 05, 05]
-1F062; [0C FC 88, 05, 05]
+1F0C2; [0C FF DF, 05, 05]
-1F063; [0C FC 8F, 05, 05]
+1F0C3; [0C FF E6, 05, 05]
-1F064; [0C FC 96, 05, 05]
+1F0C4; [0C FF ED, 05, 05]
-1F065; [0C FC 9D, 05, 05]
+1F0C5; [0C FF F4, 05, 05]
-1F066; [0C FC A4, 05, 05]
+1F0C6; [0C FF FB, 05, 05]
-1F067; [0C FC AB, 05, 05]
+1F0C7; [0D 02 04, 05, 05]
-1F068; [0C FC B2, 05, 05]
+1F0C8; [0D 02 0B, 05, 05]
-1F069; [0C FC B9, 05, 05]
+1F0C9; [0D 02 12, 05, 05]
-1F06A; [0C FC C0, 05, 05]
+1F0CA; [0D 02 19, 05, 05]
-1F06B; [0C FC C7, 05, 05]
+1F0CB; [0D 02 20, 05, 05]
-1F06C; [0C FC CE, 05, 05]
+1F0CC; [0D 02 27, 05, 05]
-1F06D; [0C FC D5, 05, 05]
+1F0CD; [0D 02 2E, 05, 05]
-1F06E; [0C FC DC, 05, 05]
+1F0CE; [0D 02 35, 05, 05]
-1F06F; [0C FC E3, 05, 05]
+1F0CF; [0D 02 3C, 05, 05]
-1F070; [0C FC EA, 05, 05]
+1F0D1; [0D 02 43, 05, 05]
-1F071; [0C FC F1, 05, 05]
+1F0D2; [0D 02 4A, 05, 05]
-1F072; [0C FC F8, 05, 05]
+1F0D3; [0D 02 51, 05, 05]
-1F073; [0C FC FF, 05, 05]
+1F0D4; [0D 02 58, 05, 05]
-1F074; [0C FD 08, 05, 05]
+1F0D5; [0D 02 5F, 05, 05]
-1F075; [0C FD 0F, 05, 05]
+1F0D6; [0D 02 66, 05, 05]
-1F076; [0C FD 16, 05, 05]
+1F0D7; [0D 02 6D, 05, 05]
-1F077; [0C FD 1D, 05, 05]
+1F0D8; [0D 02 74, 05, 05]
-1F078; [0C FD 24, 05, 05]
+1F0D9; [0D 02 7B, 05, 05]
-1F079; [0C FD 2B, 05, 05]
+1F0DA; [0D 02 82, 05, 05]
-1F07A; [0C FD 32, 05, 05]
+1F0DB; [0D 02 89, 05, 05]
-1F07B; [0C FD 39, 05, 05]
+1F0DC; [0D 02 90, 05, 05]
-1F07C; [0C FD 40, 05, 05]
+1F0DD; [0D 02 97, 05, 05]
-1F07D; [0C FD 47, 05, 05]
+1F0DE; [0D 02 9E, 05, 05]
-1F07E; [0C FD 4E, 05, 05]
+1F0DF; [0D 02 A5, 05, 05]
-1F07F; [0C FD 55, 05, 05]
+1F0E0; [0D 02 AC, 05, 05]
-1F080; [0C FD 5C, 05, 05]
+1F0E1; [0D 02 B3, 05, 05]
-1F081; [0C FD 63, 05, 05]
+1F0E2; [0D 02 BA, 05, 05]
-1F082; [0C FD 6A, 05, 05]
+1F0E3; [0D 02 C1, 05, 05]
-1F083; [0C FD 71, 05, 05]
+1F0E4; [0D 02 C8, 05, 05]
-1F084; [0C FD 78, 05, 05]
+1F0E5; [0D 02 CF, 05, 05]
-1F085; [0C FD 7F, 05, 05]
+1F0E6; [0D 02 D6, 05, 05]
-1F086; [0C FD 86, 05, 05]
+1F0E7; [0D 02 DD, 05, 05]
-1F087; [0C FD 8D, 05, 05]
+1F0E8; [0D 02 E4, 05, 05]
-1F088; [0C FD 94, 05, 05]
+1F0E9; [0D 02 EB, 05, 05]
-1F089; [0C FD 9B, 05, 05]
+1F0EA; [0D 02 F2, 05, 05]
-1F08A; [0C FD A2, 05, 05]
+1F0EB; [0D 02 F9, 05, 05]
-1F08B; [0C FD A9, 05, 05]
+1F0EC; [0D 03 02, 05, 05]
-1F08C; [0C FD B0, 05, 05]
+1F0ED; [0D 03 09, 05, 05]
-1F08D; [0C FD B7, 05, 05]
+1F0EE; [0D 03 10, 05, 05]
-1F08E; [0C FD BE, 05, 05]
+1F0EF; [0D 03 17, 05, 05]
-1F08F; [0C FD C5, 05, 05]
+1F0F0; [0D 03 1E, 05, 05]
-1F090; [0C FD CC, 05, 05]
+1F0F1; [0D 03 25, 05, 05]
-1F091; [0C FD D3, 05, 05]
+1F0F2; [0D 03 2C, 05, 05]
-1F092; [0C FD DA, 05, 05]
+1F0F3; [0D 03 33, 05, 05]
-1F093; [0C FD E1, 05, 05]
+1F0F4; [0D 03 3A, 05, 05]
-1F0A0; [0C FD E8, 05, 05]
+1F0F5; [0D 03 41, 05, 05]
-1F0A1; [0C FD EF, 05, 05]
+1FA00; [0D 03 48, 05, 05]
-1F0A2; [0C FD F6, 05, 05]
+1FA01; [0D 03 4F, 05, 05]
-1F0A3; [0C FD FD, 05, 05]
+1FA02; [0D 03 56, 05, 05]
-1F0A4; [0C FE 06, 05, 05]
+1FA03; [0D 03 5D, 05, 05]
-1F0A5; [0C FE 0D, 05, 05]
+1FA04; [0D 03 64, 05, 05]
-1F0A6; [0C FE 14, 05, 05]
+1FA05; [0D 03 6B, 05, 05]
-1F0A7; [0C FE 1B, 05, 05]
+1FA06; [0D 03 72, 05, 05]
-1F0A8; [0C FE 22, 05, 05]
+1FA07; [0D 03 79, 05, 05]
-1F0A9; [0C FE 29, 05, 05]
+1FA08; [0D 03 80, 05, 05]
-1F0AA; [0C FE 30, 05, 05]
+1FA09; [0D 03 87, 05, 05]
-1F0AB; [0C FE 37, 05, 05]
+1FA0A; [0D 03 8E, 05, 05]
-1F0AC; [0C FE 3E, 05, 05]
+1FA0B; [0D 03 95, 05, 05]
-1F0AD; [0C FE 45, 05, 05]
+1FA0C; [0D 03 9C, 05, 05]
-1F0AE; [0C FE 4C, 05, 05]
+1FA0D; [0D 03 A3, 05, 05]
-1F0B1; [0C FE 53, 05, 05]
+1FA0E; [0D 03 AA, 05, 05]
-1F0B2; [0C FE 5A, 05, 05]
+1FA0F; [0D 03 B1, 05, 05]
-1F0B3; [0C FE 61, 05, 05]
+1FA10; [0D 03 B8, 05, 05]
-1F0B4; [0C FE 68, 05, 05]
+1FA11; [0D 03 BF, 05, 05]
-1F0B5; [0C FE 6F, 05, 05]
+1FA12; [0D 03 C6, 05, 05]
-1F0B6; [0C FE 76, 05, 05]
+1FA13; [0D 03 CD, 05, 05]
-1F0B7; [0C FE 7D, 05, 05]
+1FA14; [0D 03 D4, 05, 05]
-1F0B8; [0C FE 84, 05, 05]
+1FA15; [0D 03 DB, 05, 05]
-1F0B9; [0C FE 8B, 05, 05]
+1FA16; [0D 03 E2, 05, 05]
-1F0BA; [0C FE 92, 05, 05]
+1FA17; [0D 03 E9, 05, 05]
-1F0BB; [0C FE 99, 05, 05]
+1FA18; [0D 03 F0, 05, 05]
-1F0BC; [0C FE A0, 05, 05]
+1FA19; [0D 03 F7, 05, 05]
-1F0BD; [0C FE A7, 05, 05]
+1FA1A; [0D 03 FE, 05, 05]
-1F0BE; [0C FE AE, 05, 05]
+1FA1B; [0D 04 07, 05, 05]
-1F0BF; [0C FE B5, 05, 05]
+1FA1C; [0D 04 0E, 05, 05]
-1F0C1; [0C FE BC, 05, 05]
+1FA1D; [0D 04 15, 05, 05]
-1F0C2; [0C FE C3, 05, 05]
+1FA1E; [0D 04 1C, 05, 05]
-1F0C3; [0C FE CA, 05, 05]
+1FA1F; [0D 04 23, 05, 05]
-1F0C4; [0C FE D1, 05, 05]
+1FA20; [0D 04 2A, 05, 05]
-1F0C5; [0C FE D8, 05, 05]
+1FA21; [0D 04 31, 05, 05]
-1F0C6; [0C FE DF, 05, 05]
+1FA22; [0D 04 38, 05, 05]
-1F0C7; [0C FE E6, 05, 05]
+1FA23; [0D 04 3F, 05, 05]
-1F0C8; [0C FE ED, 05, 05]
+1FA24; [0D 04 46, 05, 05]
-1F0C9; [0C FE F4, 05, 05]
+1FA25; [0D 04 4D, 05, 05]
-1F0CA; [0C FE FB, 05, 05]
+1FA26; [0D 04 54, 05, 05]
-1F0CB; [0C FF 04, 05, 05]
+1FA27; [0D 04 5B, 05, 05]
-1F0CC; [0C FF 0B, 05, 05]
+1FA28; [0D 04 62, 05, 05]
-1F0CD; [0C FF 12, 05, 05]
+1FA29; [0D 04 69, 05, 05]
-1F0CE; [0C FF 19, 05, 05]
+1FA2A; [0D 04 70, 05, 05]
-1F0CF; [0C FF 20, 05, 05]
+1FA2B; [0D 04 77, 05, 05]
-1F0D1; [0C FF 27, 05, 05]
+1FA2C; [0D 04 7E, 05, 05]
-1F0D2; [0C FF 2E, 05, 05]
+1FA2D; [0D 04 85, 05, 05]
-1F0D3; [0C FF 35, 05, 05]
+1FA2E; [0D 04 8C, 05, 05]
-1F0D4; [0C FF 3C, 05, 05]
+1FA2F; [0D 04 93, 05, 05]
-1F0D5; [0C FF 43, 05, 05]
+1FA30; [0D 04 9A, 05, 05]
-1F0D6; [0C FF 4A, 05, 05]
+1FA31; [0D 04 A1, 05, 05]
-1F0D7; [0C FF 51, 05, 05]
+1FA32; [0D 04 A8, 05, 05]
-1F0D8; [0C FF 58, 05, 05]
+1FA33; [0D 04 AF, 05, 05]
-1F0D9; [0C FF 5F, 05, 05]
+1FA34; [0D 04 B6, 05, 05]
-1F0DA; [0C FF 66, 05, 05]
+1FA35; [0D 04 BD, 05, 05]
-1F0DB; [0C FF 6D, 05, 05]
+1FA36; [0D 04 C4, 05, 05]
-1F0DC; [0C FF 74, 05, 05]
+1FA37; [0D 04 CB, 05, 05]
-1F0DD; [0C FF 7B, 05, 05]
+1FA38; [0D 04 D2, 05, 05]
-1F0DE; [0C FF 82, 05, 05]
+1FA39; [0D 04 D9, 05, 05]
-1F0DF; [0C FF 89, 05, 05]
+1FA3A; [0D 04 E0, 05, 05]
-1F0E0; [0C FF 90, 05, 05]
+1FA3B; [0D 04 E7, 05, 05]
-1F0E1; [0C FF 97, 05, 05]
+1FA3C; [0D 04 EE, 05, 05]
-1F0E2; [0C FF 9E, 05, 05]
+1FA3D; [0D 04 F5, 05, 05]
-1F0E3; [0C FF A5, 05, 05]
+1FA3E; [0D 04 FC, 05, 05]
-1F0E4; [0C FF AC, 05, 05]
+1FA3F; [0D 05 05, 05, 05]
-1F0E5; [0C FF B3, 05, 05]
+1FA40; [0D 05 0C, 05, 05]
-1F0E6; [0C FF BA, 05, 05]
+1FA41; [0D 05 13, 05, 05]
-1F0E7; [0C FF C1, 05, 05]
+1FA42; [0D 05 1A, 05, 05]
-1F0E8; [0C FF C8, 05, 05]
+1FA43; [0D 05 21, 05, 05]
-1F0E9; [0C FF CF, 05, 05]
+1FA44; [0D 05 28, 05, 05]
-1F0EA; [0C FF D6, 05, 05]
+1FA45; [0D 05 2F, 05, 05]
-1F0EB; [0C FF DD, 05, 05]
+1FA46; [0D 05 36, 05, 05]
-1F0EC; [0C FF E4, 05, 05]
+1FA47; [0D 05 3D, 05, 05]
-1F0ED; [0C FF EB, 05, 05]
+1FA48; [0D 05 44, 05, 05]
-1F0EE; [0C FF F2, 05, 05]
+1FA49; [0D 05 4B, 05, 05]
-1F0EF; [0C FF F9, 05, 05]
+1FA4A; [0D 05 52, 05, 05]
-1F0F0; [0D 02 02, 05, 05]
+1FA4B; [0D 05 59, 05, 05]
-1F0F1; [0D 02 09, 05, 05]
+1FA4C; [0D 05 60, 05, 05]
-1F0F2; [0D 02 10, 05, 05]
+1FA4D; [0D 05 67, 05, 05]
-1F0F3; [0D 02 17, 05, 05]
+1FA4E; [0D 05 6E, 05, 05]
-1F0F4; [0D 02 1E, 05, 05]
+1FA4F; [0D 05 75, 05, 05]
-1F0F5; [0D 02 25, 05, 05]
+1FA50; [0D 05 7C, 05, 05]
-1FA60; [0D 02 2C, 05, 05]
+1FA51; [0D 05 83, 05, 05]
-1FA61; [0D 02 33, 05, 05]
+1FA52; [0D 05 8A, 05, 05]
-1FA62; [0D 02 3A, 05, 05]
+1FA53; [0D 05 91, 05, 05]
-1FA63; [0D 02 41, 05, 05]
+1FA60; [0D 05 98, 05, 05]
-1FA64; [0D 02 48, 05, 05]
+1FA61; [0D 05 9F, 05, 05]
-1FA65; [0D 02 4F, 05, 05]
+1FA62; [0D 05 A6, 05, 05]
-1FA66; [0D 02 56, 05, 05]
+1FA63; [0D 05 AD, 05, 05]
-1FA67; [0D 02 5D, 05, 05]
+1FA64; [0D 05 B4, 05, 05]
-1FA68; [0D 02 64, 05, 05]
+1FA65; [0D 05 BB, 05, 05]
-1FA69; [0D 02 6B, 05, 05]
+1FA66; [0D 05 C2, 05, 05]
-1FA6A; [0D 02 72, 05, 05]
+1FA67; [0D 05 C9, 05, 05]
-1FA6B; [0D 02 79, 05, 05]
+1FA68; [0D 05 D0, 05, 05]
-1FA6C; [0D 02 80, 05, 05]
+1FA69; [0D 05 D7, 05, 05]
-1FA6D; [0D 02 87, 05, 05]
+1FA6A; [0D 05 DE, 05, 05]
-1F260; [0D 02 8E, 05, 05]
+1FA6B; [0D 05 E5, 05, 05]
-1F261; [0D 02 95, 05, 05]
+1FA6C; [0D 05 EC, 05, 05]
-1F262; [0D 02 9C, 05, 05]
+1FA6D; [0D 05 F3, 05, 05]
-1F263; [0D 02 A3, 05, 05]
+1F260; [0D 05 FA, 05, 05]
-1F264; [0D 02 AA, 05, 05]
+1F261; [0D 06 03, 05, 05]
-1F265; [0D 02 B1, 05, 05]
+1F262; [0D 06 0A, 05, 05]
-1F300; [0D 02 B8, 05, 05]
+1F263; [0D 06 11, 05, 05]
-1F301; [0D 02 BF, 05, 05]
+1F264; [0D 06 18, 05, 05]
-1F302; [0D 02 C6, 05, 05]
+1F265; [0D 06 1F, 05, 05]
-1F303; [0D 02 CD, 05, 05]
+1F300; [0D 06 26, 05, 05]
-1F304; [0D 02 D4, 05, 05]
+1F301; [0D 06 2D, 05, 05]
-1F305; [0D 02 DB, 05, 05]
+1F302; [0D 06 34, 05, 05]
-1F306; [0D 02 E2, 05, 05]
+1F303; [0D 06 3B, 05, 05]
-1F307; [0D 02 E9, 05, 05]
+1F304; [0D 06 42, 05, 05]
-1F308; [0D 02 F0, 05, 05]
+1F305; [0D 06 49, 05, 05]
-1F309; [0D 02 F7, 05, 05]
+1F306; [0D 06 50, 05, 05]
-1F30A; [0D 02 FE, 05, 05]
+1F307; [0D 06 57, 05, 05]
-1F30B; [0D 03 07, 05, 05]
+1F308; [0D 06 5E, 05, 05]
-1F30C; [0D 03 0E, 05, 05]
+1F309; [0D 06 65, 05, 05]
-1F30D; [0D 03 15, 05, 05]
+1F30A; [0D 06 6C, 05, 05]
-1F30E; [0D 03 1C, 05, 05]
+1F30B; [0D 06 73, 05, 05]
-1F30F; [0D 03 23, 05, 05]
+1F30C; [0D 06 7A, 05, 05]
-1F310; [0D 03 2A, 05, 05]
+1F30D; [0D 06 81, 05, 05]
-1F311; [0D 03 31, 05, 05]
+1F30E; [0D 06 88, 05, 05]
-1F312; [0D 03 38, 05, 05]
+1F30F; [0D 06 8F, 05, 05]
-1F313; [0D 03 3F, 05, 05]
+1F310; [0D 06 96, 05, 05]
-1F314; [0D 03 46, 05, 05]
+1F311; [0D 06 9D, 05, 05]
-1F315; [0D 03 4D, 05, 05]
+1F312; [0D 06 A4, 05, 05]
-1F316; [0D 03 54, 05, 05]
+1F313; [0D 06 AB, 05, 05]
-1F317; [0D 03 5B, 05, 05]
+1F314; [0D 06 B2, 05, 05]
-1F318; [0D 03 62, 05, 05]
+1F315; [0D 06 B9, 05, 05]
-1F319; [0D 03 69, 05, 05]
+1F316; [0D 06 C0, 05, 05]
-1F31A; [0D 03 70, 05, 05]
+1F317; [0D 06 C7, 05, 05]
-1F31B; [0D 03 77, 05, 05]
+1F318; [0D 06 CE, 05, 05]
-1F31C; [0D 03 7E, 05, 05]
+1F319; [0D 06 D5, 05, 05]
-1F31D; [0D 03 85, 05, 05]
+1F31A; [0D 06 DC, 05, 05]
-1F31E; [0D 03 8C, 05, 05]
+1F31B; [0D 06 E3, 05, 05]
-1F31F; [0D 03 93, 05, 05]
+1F31C; [0D 06 EA, 05, 05]
-1F320; [0D 03 9A, 05, 05]
+1F31D; [0D 06 F1, 05, 05]
-1F321; [0D 03 A1, 05, 05]
+1F31E; [0D 06 F8, 05, 05]
-1F322; [0D 03 A8, 05, 05]
+1F31F; [0D 06 FF, 05, 05]
-1F323; [0D 03 AF, 05, 05]
+1F320; [0D 07 08, 05, 05]
-1F324; [0D 03 B6, 05, 05]
+1F321; [0D 07 0F, 05, 05]
-1F325; [0D 03 BD, 05, 05]
+1F322; [0D 07 16, 05, 05]
-1F326; [0D 03 C4, 05, 05]
+1F323; [0D 07 1D, 05, 05]
-1F327; [0D 03 CB, 05, 05]
+1F324; [0D 07 24, 05, 05]
-1F328; [0D 03 D2, 05, 05]
+1F325; [0D 07 2B, 05, 05]
-1F329; [0D 03 D9, 05, 05]
+1F326; [0D 07 32, 05, 05]
-1F32A; [0D 03 E0, 05, 05]
+1F327; [0D 07 39, 05, 05]
-1F32B; [0D 03 E7, 05, 05]
+1F328; [0D 07 40, 05, 05]
-1F32C; [0D 03 EE, 05, 05]
+1F329; [0D 07 47, 05, 05]
-1F32D; [0D 03 F5, 05, 05]
+1F32A; [0D 07 4E, 05, 05]
-1F32E; [0D 03 FC, 05, 05]
+1F32B; [0D 07 55, 05, 05]
-1F32F; [0D 04 05, 05, 05]
+1F32C; [0D 07 5C, 05, 05]
-1F330; [0D 04 0C, 05, 05]
+1F32D; [0D 07 63, 05, 05]
-1F331; [0D 04 13, 05, 05]
+1F32E; [0D 07 6A, 05, 05]
-1F332; [0D 04 1A, 05, 05]
+1F32F; [0D 07 71, 05, 05]
-1F333; [0D 04 21, 05, 05]
+1F330; [0D 07 78, 05, 05]
-1F334; [0D 04 28, 05, 05]
+1F331; [0D 07 7F, 05, 05]
-1F335; [0D 04 2F, 05, 05]
+1F332; [0D 07 86, 05, 05]
-1F336; [0D 04 36, 05, 05]
+1F333; [0D 07 8D, 05, 05]
-1F337; [0D 04 3D, 05, 05]
+1F334; [0D 07 94, 05, 05]
-1F338; [0D 04 44, 05, 05]
+1F335; [0D 07 9B, 05, 05]
-1F339; [0D 04 4B, 05, 05]
+1F336; [0D 07 A2, 05, 05]
-1F33A; [0D 04 52, 05, 05]
+1F337; [0D 07 A9, 05, 05]
-1F33B; [0D 04 59, 05, 05]
+1F338; [0D 07 B0, 05, 05]
-1F33C; [0D 04 60, 05, 05]
+1F339; [0D 07 B7, 05, 05]
-1F33D; [0D 04 67, 05, 05]
+1F33A; [0D 07 BE, 05, 05]
-1F33E; [0D 04 6E, 05, 05]
+1F33B; [0D 07 C5, 05, 05]
-1F33F; [0D 04 75, 05, 05]
+1F33C; [0D 07 CC, 05, 05]
-1F340; [0D 04 7C, 05, 05]
+1F33D; [0D 07 D3, 05, 05]
-1F341; [0D 04 83, 05, 05]
+1F33E; [0D 07 DA, 05, 05]
-1F342; [0D 04 8A, 05, 05]
+1F33F; [0D 07 E1, 05, 05]
-1F343; [0D 04 91, 05, 05]
+1F340; [0D 07 E8, 05, 05]
-1F344; [0D 04 98, 05, 05]
+1F341; [0D 07 EF, 05, 05]
-1F345; [0D 04 9F, 05, 05]
+1F342; [0D 07 F6, 05, 05]
-1F346; [0D 04 A6, 05, 05]
+1F343; [0D 07 FD, 05, 05]
-1F347; [0D 04 AD, 05, 05]
+1F344; [0D 08 06, 05, 05]
-1F348; [0D 04 B4, 05, 05]
+1F345; [0D 08 0D, 05, 05]
-1F349; [0D 04 BB, 05, 05]
+1F346; [0D 08 14, 05, 05]
-1F34A; [0D 04 C2, 05, 05]
+1F347; [0D 08 1B, 05, 05]
-1F34B; [0D 04 C9, 05, 05]
+1F348; [0D 08 22, 05, 05]
-1F34C; [0D 04 D0, 05, 05]
+1F349; [0D 08 29, 05, 05]
-1F34D; [0D 04 D7, 05, 05]
+1F34A; [0D 08 30, 05, 05]
-1F34E; [0D 04 DE, 05, 05]
+1F34B; [0D 08 37, 05, 05]
-1F34F; [0D 04 E5, 05, 05]
+1F34C; [0D 08 3E, 05, 05]
-1F350; [0D 04 EC, 05, 05]
+1F34D; [0D 08 45, 05, 05]
-1F351; [0D 04 F3, 05, 05]
+1F34E; [0D 08 4C, 05, 05]
-1F352; [0D 04 FA, 05, 05]
+1F34F; [0D 08 53, 05, 05]
-1F353; [0D 05 03, 05, 05]
+1F350; [0D 08 5A, 05, 05]
-1F354; [0D 05 0A, 05, 05]
+1F351; [0D 08 61, 05, 05]
-1F355; [0D 05 11, 05, 05]
+1F352; [0D 08 68, 05, 05]
-1F356; [0D 05 18, 05, 05]
+1F353; [0D 08 6F, 05, 05]
-1F357; [0D 05 1F, 05, 05]
+1F354; [0D 08 76, 05, 05]
-1F358; [0D 05 26, 05, 05]
+1F355; [0D 08 7D, 05, 05]
-1F359; [0D 05 2D, 05, 05]
+1F356; [0D 08 84, 05, 05]
-1F35A; [0D 05 34, 05, 05]
+1F357; [0D 08 8B, 05, 05]
-1F35B; [0D 05 3B, 05, 05]
+1F358; [0D 08 92, 05, 05]
-1F35C; [0D 05 42, 05, 05]
+1F359; [0D 08 99, 05, 05]
-1F35D; [0D 05 49, 05, 05]
+1F35A; [0D 08 A0, 05, 05]
-1F35E; [0D 05 50, 05, 05]
+1F35B; [0D 08 A7, 05, 05]
-1F35F; [0D 05 57, 05, 05]
+1F35C; [0D 08 AE, 05, 05]
-1F360; [0D 05 5E, 05, 05]
+1F35D; [0D 08 B5, 05, 05]
-1F361; [0D 05 65, 05, 05]
+1F35E; [0D 08 BC, 05, 05]
-1F362; [0D 05 6C, 05, 05]
+1F35F; [0D 08 C3, 05, 05]
-1F363; [0D 05 73, 05, 05]
+1F360; [0D 08 CA, 05, 05]
-1F364; [0D 05 7A, 05, 05]
+1F361; [0D 08 D1, 05, 05]
-1F365; [0D 05 81, 05, 05]
+1F362; [0D 08 D8, 05, 05]
-1F366; [0D 05 88, 05, 05]
+1F363; [0D 08 DF, 05, 05]
-1F367; [0D 05 8F, 05, 05]
+1F364; [0D 08 E6, 05, 05]
-1F368; [0D 05 96, 05, 05]
+1F365; [0D 08 ED, 05, 05]
-1F369; [0D 05 9D, 05, 05]
+1F366; [0D 08 F4, 05, 05]
-1F36A; [0D 05 A4, 05, 05]
+1F367; [0D 08 FB, 05, 05]
-1F36B; [0D 05 AB, 05, 05]
+1F368; [0D 09 04, 05, 05]
-1F36C; [0D 05 B2, 05, 05]
+1F369; [0D 09 0B, 05, 05]
-1F36D; [0D 05 B9, 05, 05]
+1F36A; [0D 09 12, 05, 05]
-1F36E; [0D 05 C0, 05, 05]
+1F36B; [0D 09 19, 05, 05]
-1F36F; [0D 05 C7, 05, 05]
+1F36C; [0D 09 20, 05, 05]
-1F370; [0D 05 CE, 05, 05]
+1F36D; [0D 09 27, 05, 05]
-1F371; [0D 05 D5, 05, 05]
+1F36E; [0D 09 2E, 05, 05]
-1F372; [0D 05 DC, 05, 05]
+1F36F; [0D 09 35, 05, 05]
-1F373; [0D 05 E3, 05, 05]
+1F370; [0D 09 3C, 05, 05]
-1F374; [0D 05 EA, 05, 05]
+1F371; [0D 09 43, 05, 05]
-1F375; [0D 05 F1, 05, 05]
+1F372; [0D 09 4A, 05, 05]
-1F376; [0D 05 F8, 05, 05]
+1F373; [0D 09 51, 05, 05]
-1F377; [0D 05 FF, 05, 05]
+1F374; [0D 09 58, 05, 05]
-1F378; [0D 06 08, 05, 05]
+1F375; [0D 09 5F, 05, 05]
-1F379; [0D 06 0F, 05, 05]
+1F376; [0D 09 66, 05, 05]
-1F37A; [0D 06 16, 05, 05]
+1F377; [0D 09 6D, 05, 05]
-1F37B; [0D 06 1D, 05, 05]
+1F378; [0D 09 74, 05, 05]
-1F37C; [0D 06 24, 05, 05]
+1F379; [0D 09 7B, 05, 05]
-1F37D; [0D 06 2B, 05, 05]
+1F37A; [0D 09 82, 05, 05]
-1F37E; [0D 06 32, 05, 05]
+1F37B; [0D 09 89, 05, 05]
-1F37F; [0D 06 39, 05, 05]
+1F37C; [0D 09 90, 05, 05]
-1F380; [0D 06 40, 05, 05]
+1F37D; [0D 09 97, 05, 05]
-1F381; [0D 06 47, 05, 05]
+1F37E; [0D 09 9E, 05, 05]
-1F382; [0D 06 4E, 05, 05]
+1F37F; [0D 09 A5, 05, 05]
-1F383; [0D 06 55, 05, 05]
+1F380; [0D 09 AC, 05, 05]
-1F384; [0D 06 5C, 05, 05]
+1F381; [0D 09 B3, 05, 05]
-1F385; [0D 06 63, 05, 05]
+1F382; [0D 09 BA, 05, 05]
-1F386; [0D 06 6A, 05, 05]
+1F383; [0D 09 C1, 05, 05]
-1F387; [0D 06 71, 05, 05]
+1F384; [0D 09 C8, 05, 05]
-1F388; [0D 06 78, 05, 05]
+1F385; [0D 09 CF, 05, 05]
-1F389; [0D 06 7F, 05, 05]
+1F386; [0D 09 D6, 05, 05]
-1F38A; [0D 06 86, 05, 05]
+1F387; [0D 09 DD, 05, 05]
-1F38B; [0D 06 8D, 05, 05]
+1F388; [0D 09 E4, 05, 05]
-1F38C; [0D 06 94, 05, 05]
+1F389; [0D 09 EB, 05, 05]
-1F38D; [0D 06 9B, 05, 05]
+1F38A; [0D 09 F2, 05, 05]
-1F38E; [0D 06 A2, 05, 05]
+1F38B; [0D 09 F9, 05, 05]
-1F38F; [0D 06 A9, 05, 05]
+1F38C; [0D 0A 02, 05, 05]
-1F390; [0D 06 B0, 05, 05]
+1F38D; [0D 0A 09, 05, 05]
-1F391; [0D 06 B7, 05, 05]
+1F38E; [0D 0A 10, 05, 05]
-1F392; [0D 06 BE, 05, 05]
+1F38F; [0D 0A 17, 05, 05]
-1F393; [0D 06 C5, 05, 05]
+1F390; [0D 0A 1E, 05, 05]
-1F394; [0D 06 CC, 05, 05]
+1F391; [0D 0A 25, 05, 05]
-1F395; [0D 06 D3, 05, 05]
+1F392; [0D 0A 2C, 05, 05]
-1F396; [0D 06 DA, 05, 05]
+1F393; [0D 0A 33, 05, 05]
-1F397; [0D 06 E1, 05, 05]
+1F394; [0D 0A 3A, 05, 05]
-1F398; [0D 06 E8, 05, 05]
+1F395; [0D 0A 41, 05, 05]
-1F399; [0D 06 EF, 05, 05]
+1F396; [0D 0A 48, 05, 05]
-1F39A; [0D 06 F6, 05, 05]
+1F397; [0D 0A 4F, 05, 05]
-1F39B; [0D 06 FD, 05, 05]
+1F398; [0D 0A 56, 05, 05]
-1F39C; [0D 07 06, 05, 05]
+1F399; [0D 0A 5D, 05, 05]
-1F39D; [0D 07 0D, 05, 05]
+1F39A; [0D 0A 64, 05, 05]
-1F39E; [0D 07 14, 05, 05]
+1F39B; [0D 0A 6B, 05, 05]
-1F39F; [0D 07 1B, 05, 05]
+1F39C; [0D 0A 72, 05, 05]
-1F3A0; [0D 07 22, 05, 05]
+1F39D; [0D 0A 79, 05, 05]
-1F3A1; [0D 07 29, 05, 05]
+1F39E; [0D 0A 80, 05, 05]
-1F3A2; [0D 07 30, 05, 05]
+1F39F; [0D 0A 87, 05, 05]
-1F3A3; [0D 07 37, 05, 05]
+1F3A0; [0D 0A 8E, 05, 05]
-1F3A4; [0D 07 3E, 05, 05]
+1F3A1; [0D 0A 95, 05, 05]
-1F3A5; [0D 07 45, 05, 05]
+1F3A2; [0D 0A 9C, 05, 05]
-1F3A6; [0D 07 4C, 05, 05]
+1F3A3; [0D 0A A3, 05, 05]
-1F3A7; [0D 07 53, 05, 05]
+1F3A4; [0D 0A AA, 05, 05]
-1F3A8; [0D 07 5A, 05, 05]
+1F3A5; [0D 0A B1, 05, 05]
-1F3A9; [0D 07 61, 05, 05]
+1F3A6; [0D 0A B8, 05, 05]
-1F3AA; [0D 07 68, 05, 05]
+1F3A7; [0D 0A BF, 05, 05]
-1F3AB; [0D 07 6F, 05, 05]
+1F3A8; [0D 0A C6, 05, 05]
-1F3AC; [0D 07 76, 05, 05]
+1F3A9; [0D 0A CD, 05, 05]
-1F3AD; [0D 07 7D, 05, 05]
+1F3AA; [0D 0A D4, 05, 05]
-1F3AE; [0D 07 84, 05, 05]
+1F3AB; [0D 0A DB, 05, 05]
-1F3AF; [0D 07 8B, 05, 05]
+1F3AC; [0D 0A E2, 05, 05]
-1F3B0; [0D 07 92, 05, 05]
+1F3AD; [0D 0A E9, 05, 05]
-1F3B1; [0D 07 99, 05, 05]
+1F3AE; [0D 0A F0, 05, 05]
-1F3B2; [0D 07 A0, 05, 05]
+1F3AF; [0D 0A F7, 05, 05]
-1F3B3; [0D 07 A7, 05, 05]
+1F3B0; [0D 0A FE, 05, 05]
-1F3B4; [0D 07 AE, 05, 05]
+1F3B1; [0D 0B 07, 05, 05]
-1F3B5; [0D 07 B5, 05, 05]
+1F3B2; [0D 0B 0E, 05, 05]
-1F3B6; [0D 07 BC, 05, 05]
+1F3B3; [0D 0B 15, 05, 05]
-1F3B7; [0D 07 C3, 05, 05]
+1F3B4; [0D 0B 1C, 05, 05]
-1F3B8; [0D 07 CA, 05, 05]
+1F3B5; [0D 0B 23, 05, 05]
-1F3B9; [0D 07 D1, 05, 05]
+1F3B6; [0D 0B 2A, 05, 05]
-1F3BA; [0D 07 D8, 05, 05]
+1F3B7; [0D 0B 31, 05, 05]
-1F3BB; [0D 07 DF, 05, 05]
+1F3B8; [0D 0B 38, 05, 05]
-1F3BC; [0D 07 E6, 05, 05]
+1F3B9; [0D 0B 3F, 05, 05]
-1F3BD; [0D 07 ED, 05, 05]
+1F3BA; [0D 0B 46, 05, 05]
-1F3BE; [0D 07 F4, 05, 05]
+1F3BB; [0D 0B 4D, 05, 05]
-1F3BF; [0D 07 FB, 05, 05]
+1F3BC; [0D 0B 54, 05, 05]
-1F3C0; [0D 08 04, 05, 05]
+1F3BD; [0D 0B 5B, 05, 05]
-1F3C1; [0D 08 0B, 05, 05]
+1F3BE; [0D 0B 62, 05, 05]
-1F3C2; [0D 08 12, 05, 05]
+1F3BF; [0D 0B 69, 05, 05]
-1F3C3; [0D 08 19, 05, 05]
+1F3C0; [0D 0B 70, 05, 05]
-1F3C4; [0D 08 20, 05, 05]
+1F3C1; [0D 0B 77, 05, 05]
-1F3C5; [0D 08 27, 05, 05]
+1F3C2; [0D 0B 7E, 05, 05]
-1F3C6; [0D 08 2E, 05, 05]
+1F3C3; [0D 0B 85, 05, 05]
-1F3C7; [0D 08 35, 05, 05]
+1F3C4; [0D 0B 8C, 05, 05]
-1F3C8; [0D 08 3C, 05, 05]
+1F3C5; [0D 0B 93, 05, 05]
-1F3C9; [0D 08 43, 05, 05]
+1F3C6; [0D 0B 9A, 05, 05]
-1F3CA; [0D 08 4A, 05, 05]
+1F3C7; [0D 0B A1, 05, 05]
-1F3CB; [0D 08 51, 05, 05]
+1F3C8; [0D 0B A8, 05, 05]
-1F3CC; [0D 08 58, 05, 05]
+1F3C9; [0D 0B AF, 05, 05]
-1F3CD; [0D 08 5F, 05, 05]
+1F3CA; [0D 0B B6, 05, 05]
-1F3CE; [0D 08 66, 05, 05]
+1F3CB; [0D 0B BD, 05, 05]
-1F3CF; [0D 08 6D, 05, 05]
+1F3CC; [0D 0B C4, 05, 05]
-1F3D0; [0D 08 74, 05, 05]
+1F3CD; [0D 0B CB, 05, 05]
-1F3D1; [0D 08 7B, 05, 05]
+1F3CE; [0D 0B D2, 05, 05]
-1F3D2; [0D 08 82, 05, 05]
+1F3CF; [0D 0B D9, 05, 05]
-1F3D3; [0D 08 89, 05, 05]
+1F3D0; [0D 0B E0, 05, 05]
-1F3D4; [0D 08 90, 05, 05]
+1F3D1; [0D 0B E7, 05, 05]
-1F3D5; [0D 08 97, 05, 05]
+1F3D2; [0D 0B EE, 05, 05]
-1F3D6; [0D 08 9E, 05, 05]
+1F3D3; [0D 0B F5, 05, 05]
-1F3D7; [0D 08 A5, 05, 05]
+1F3D4; [0D 0B FC, 05, 05]
-1F3D8; [0D 08 AC, 05, 05]
+1F3D5; [0D 0C 05, 05, 05]
-1F3D9; [0D 08 B3, 05, 05]
+1F3D6; [0D 0C 0C, 05, 05]
-1F3DA; [0D 08 BA, 05, 05]
+1F3D7; [0D 0C 13, 05, 05]
-1F3DB; [0D 08 C1, 05, 05]
+1F3D8; [0D 0C 1A, 05, 05]
-1F3DC; [0D 08 C8, 05, 05]
+1F3D9; [0D 0C 21, 05, 05]
-1F3DD; [0D 08 CF, 05, 05]
+1F3DA; [0D 0C 28, 05, 05]
-1F3DE; [0D 08 D6, 05, 05]
+1F3DB; [0D 0C 2F, 05, 05]
-1F3DF; [0D 08 DD, 05, 05]
+1F3DC; [0D 0C 36, 05, 05]
-1F3E0; [0D 08 E4, 05, 05]
+1F3DD; [0D 0C 3D, 05, 05]
-1F3E1; [0D 08 EB, 05, 05]
+1F3DE; [0D 0C 44, 05, 05]
-1F3E2; [0D 08 F2, 05, 05]
+1F3DF; [0D 0C 4B, 05, 05]
-1F3E3; [0D 08 F9, 05, 05]
+1F3E0; [0D 0C 52, 05, 05]
-1F3E4; [0D 09 02, 05, 05]
+1F3E1; [0D 0C 59, 05, 05]
-1F3E5; [0D 09 09, 05, 05]
+1F3E2; [0D 0C 60, 05, 05]
-1F3E6; [0D 09 10, 05, 05]
+1F3E3; [0D 0C 67, 05, 05]
-1F3E7; [0D 09 17, 05, 05]
+1F3E4; [0D 0C 6E, 05, 05]
-1F3E8; [0D 09 1E, 05, 05]
+1F3E5; [0D 0C 75, 05, 05]
-1F3E9; [0D 09 25, 05, 05]
+1F3E6; [0D 0C 7C, 05, 05]
-1F3EA; [0D 09 2C, 05, 05]
+1F3E7; [0D 0C 83, 05, 05]
-1F3EB; [0D 09 33, 05, 05]
+1F3E8; [0D 0C 8A, 05, 05]
-1F3EC; [0D 09 3A, 05, 05]
+1F3E9; [0D 0C 91, 05, 05]
-1F3ED; [0D 09 41, 05, 05]
+1F3EA; [0D 0C 98, 05, 05]
-1F3EE; [0D 09 48, 05, 05]
+1F3EB; [0D 0C 9F, 05, 05]
-1F3EF; [0D 09 4F, 05, 05]
+1F3EC; [0D 0C A6, 05, 05]
-1F3F0; [0D 09 56, 05, 05]
+1F3ED; [0D 0C AD, 05, 05]
-1F3F1; [0D 09 5D, 05, 05]
+1F3EE; [0D 0C B4, 05, 05]
-1F3F2; [0D 09 64, 05, 05]
+1F3EF; [0D 0C BB, 05, 05]
-1F3F3; [0D 09 6B, 05, 05]
+1F3F0; [0D 0C C2, 05, 05]
-1F3F4; [0D 09 72, 05, 05]
+1F3F1; [0D 0C C9, 05, 05]
-1F3F5; [0D 09 79, 05, 05]
+1F3F2; [0D 0C D0, 05, 05]
-1F3F6; [0D 09 80, 05, 05]
+1F3F3; [0D 0C D7, 05, 05]
-1F3F7; [0D 09 87, 05, 05]
+1F3F4; [0D 0C DE, 05, 05]
-1F3F8; [0D 09 8E, 05, 05]
+1F3F5; [0D 0C E5, 05, 05]
-1F3F9; [0D 09 95, 05, 05]
+1F3F6; [0D 0C EC, 05, 05]
-1F3FA; [0D 09 9C, 05, 05]
+1F3F7; [0D 0C F3, 05, 05]
-1F3FB; [0D 09 A3, 05, 05]
+1F3F8; [0D 0C FA, 05, 05]
-1F3FC; [0D 09 AA, 05, 05]
+1F3F9; [0D 0D 03, 05, 05]
-1F3FD; [0D 09 B1, 05, 05]
+1F3FA; [0D 0D 0A, 05, 05]
-1F3FE; [0D 09 B8, 05, 05]
+1F3FB; [0D 0D 11, 05, 05]
-1F3FF; [0D 09 BF, 05, 05]
+1F3FC; [0D 0D 18, 05, 05]
-1F400; [0D 09 C6, 05, 05]
+1F3FD; [0D 0D 1F, 05, 05]
-1F401; [0D 09 CD, 05, 05]
+1F3FE; [0D 0D 26, 05, 05]
-1F402; [0D 09 D4, 05, 05]
+1F3FF; [0D 0D 2D, 05, 05]
-1F403; [0D 09 DB, 05, 05]
+1F400; [0D 0D 34, 05, 05]
-1F404; [0D 09 E2, 05, 05]
+1F401; [0D 0D 3B, 05, 05]
-1F405; [0D 09 E9, 05, 05]
+1F402; [0D 0D 42, 05, 05]
-1F406; [0D 09 F0, 05, 05]
+1F403; [0D 0D 49, 05, 05]
-1F407; [0D 09 F7, 05, 05]
+1F404; [0D 0D 50, 05, 05]
-1F408; [0D 09 FE, 05, 05]
+1F405; [0D 0D 57, 05, 05]
-1F409; [0D 0A 07, 05, 05]
+1F406; [0D 0D 5E, 05, 05]
-1F40A; [0D 0A 0E, 05, 05]
+1F407; [0D 0D 65, 05, 05]
-1F40B; [0D 0A 15, 05, 05]
+1F408; [0D 0D 6C, 05, 05]
-1F40C; [0D 0A 1C, 05, 05]
+1F409; [0D 0D 73, 05, 05]
-1F40D; [0D 0A 23, 05, 05]
+1F40A; [0D 0D 7A, 05, 05]
-1F40E; [0D 0A 2A, 05, 05]
+1F40B; [0D 0D 81, 05, 05]
-1F40F; [0D 0A 31, 05, 05]
+1F40C; [0D 0D 88, 05, 05]
-1F410; [0D 0A 38, 05, 05]
+1F40D; [0D 0D 8F, 05, 05]
-1F411; [0D 0A 3F, 05, 05]
+1F40E; [0D 0D 96, 05, 05]
-1F412; [0D 0A 46, 05, 05]
+1F40F; [0D 0D 9D, 05, 05]
-1F413; [0D 0A 4D, 05, 05]
+1F410; [0D 0D A4, 05, 05]
-1F414; [0D 0A 54, 05, 05]
+1F411; [0D 0D AB, 05, 05]
-1F415; [0D 0A 5B, 05, 05]
+1F412; [0D 0D B2, 05, 05]
-1F416; [0D 0A 62, 05, 05]
+1F413; [0D 0D B9, 05, 05]
-1F417; [0D 0A 69, 05, 05]
+1F414; [0D 0D C0, 05, 05]
-1F418; [0D 0A 70, 05, 05]
+1F415; [0D 0D C7, 05, 05]
-1F419; [0D 0A 77, 05, 05]
+1F416; [0D 0D CE, 05, 05]
-1F41A; [0D 0A 7E, 05, 05]
+1F417; [0D 0D D5, 05, 05]
-1F41B; [0D 0A 85, 05, 05]
+1F418; [0D 0D DC, 05, 05]
-1F41C; [0D 0A 8C, 05, 05]
+1F419; [0D 0D E3, 05, 05]
-1F41D; [0D 0A 93, 05, 05]
+1F41A; [0D 0D EA, 05, 05]
-1F41E; [0D 0A 9A, 05, 05]
+1F41B; [0D 0D F1, 05, 05]
-1F41F; [0D 0A A1, 05, 05]
+1F41C; [0D 0D F8, 05, 05]
-1F420; [0D 0A A8, 05, 05]
+1F41D; [0D 0D FF, 05, 05]
-1F421; [0D 0A AF, 05, 05]
+1F41E; [0D 0E 08, 05, 05]
-1F422; [0D 0A B6, 05, 05]
+1F41F; [0D 0E 0F, 05, 05]
-1F423; [0D 0A BD, 05, 05]
+1F420; [0D 0E 16, 05, 05]
-1F424; [0D 0A C4, 05, 05]
+1F421; [0D 0E 1D, 05, 05]
-1F425; [0D 0A CB, 05, 05]
+1F422; [0D 0E 24, 05, 05]
-1F426; [0D 0A D2, 05, 05]
+1F423; [0D 0E 2B, 05, 05]
-1F427; [0D 0A D9, 05, 05]
+1F424; [0D 0E 32, 05, 05]
-1F428; [0D 0A E0, 05, 05]
+1F425; [0D 0E 39, 05, 05]
-1F429; [0D 0A E7, 05, 05]
+1F426; [0D 0E 40, 05, 05]
-1F42A; [0D 0A EE, 05, 05]
+1F427; [0D 0E 47, 05, 05]
-1F42B; [0D 0A F5, 05, 05]
+1F428; [0D 0E 4E, 05, 05]
-1F42C; [0D 0A FC, 05, 05]
+1F429; [0D 0E 55, 05, 05]
-1F42D; [0D 0B 05, 05, 05]
+1F42A; [0D 0E 5C, 05, 05]
-1F42E; [0D 0B 0C, 05, 05]
+1F42B; [0D 0E 63, 05, 05]
-1F42F; [0D 0B 13, 05, 05]
+1F42C; [0D 0E 6A, 05, 05]
-1F430; [0D 0B 1A, 05, 05]
+1F42D; [0D 0E 71, 05, 05]
-1F431; [0D 0B 21, 05, 05]
+1F42E; [0D 0E 78, 05, 05]
-1F432; [0D 0B 28, 05, 05]
+1F42F; [0D 0E 7F, 05, 05]
-1F433; [0D 0B 2F, 05, 05]
+1F430; [0D 0E 86, 05, 05]
-1F434; [0D 0B 36, 05, 05]
+1F431; [0D 0E 8D, 05, 05]
-1F435; [0D 0B 3D, 05, 05]
+1F432; [0D 0E 94, 05, 05]
-1F436; [0D 0B 44, 05, 05]
+1F433; [0D 0E 9B, 05, 05]
-1F437; [0D 0B 4B, 05, 05]
+1F434; [0D 0E A2, 05, 05]
-1F438; [0D 0B 52, 05, 05]
+1F435; [0D 0E A9, 05, 05]
-1F439; [0D 0B 59, 05, 05]
+1F436; [0D 0E B0, 05, 05]
-1F43A; [0D 0B 60, 05, 05]
+1F437; [0D 0E B7, 05, 05]
-1F43B; [0D 0B 67, 05, 05]
+1F438; [0D 0E BE, 05, 05]
-1F43C; [0D 0B 6E, 05, 05]
+1F439; [0D 0E C5, 05, 05]
-1F43D; [0D 0B 75, 05, 05]
+1F43A; [0D 0E CC, 05, 05]
-1F43E; [0D 0B 7C, 05, 05]
+1F43B; [0D 0E D3, 05, 05]
-1F43F; [0D 0B 83, 05, 05]
+1F43C; [0D 0E DA, 05, 05]
-1F440; [0D 0B 8A, 05, 05]
+1F43D; [0D 0E E1, 05, 05]
-1F441; [0D 0B 91, 05, 05]
+1F43E; [0D 0E E8, 05, 05]
-1F442; [0D 0B 98, 05, 05]
+1F43F; [0D 0E EF, 05, 05]
-1F443; [0D 0B 9F, 05, 05]
+1F440; [0D 0E F6, 05, 05]
-1F444; [0D 0B A6, 05, 05]
+1F441; [0D 0E FD, 05, 05]
-1F445; [0D 0B AD, 05, 05]
+1F442; [0D 0F 06, 05, 05]
-1F446; [0D 0B B4, 05, 05]
+1F443; [0D 0F 0D, 05, 05]
-1F447; [0D 0B BB, 05, 05]
+1F444; [0D 0F 14, 05, 05]
-1F448; [0D 0B C2, 05, 05]
+1F445; [0D 0F 1B, 05, 05]
-1F449; [0D 0B C9, 05, 05]
+1F446; [0D 0F 22, 05, 05]
-1F44A; [0D 0B D0, 05, 05]
+1F447; [0D 0F 29, 05, 05]
-1F44B; [0D 0B D7, 05, 05]
+1F448; [0D 0F 30, 05, 05]
-1F44C; [0D 0B DE, 05, 05]
+1F449; [0D 0F 37, 05, 05]
-1F44D; [0D 0B E5, 05, 05]
+1F44A; [0D 0F 3E, 05, 05]
-1F44E; [0D 0B EC, 05, 05]
+1F44B; [0D 0F 45, 05, 05]
-1F44F; [0D 0B F3, 05, 05]
+1F44C; [0D 0F 4C, 05, 05]
-1F450; [0D 0B FA, 05, 05]
+1F44D; [0D 0F 53, 05, 05]
-1F451; [0D 0C 03, 05, 05]
+1F44E; [0D 0F 5A, 05, 05]
-1F452; [0D 0C 0A, 05, 05]
+1F44F; [0D 0F 61, 05, 05]
-1F453; [0D 0C 11, 05, 05]
+1F450; [0D 0F 68, 05, 05]
-1F454; [0D 0C 18, 05, 05]
+1F451; [0D 0F 6F, 05, 05]
-1F455; [0D 0C 1F, 05, 05]
+1F452; [0D 0F 76, 05, 05]
-1F456; [0D 0C 26, 05, 05]
+1F453; [0D 0F 7D, 05, 05]
-1F457; [0D 0C 2D, 05, 05]
+1F454; [0D 0F 84, 05, 05]
-1F458; [0D 0C 34, 05, 05]
+1F455; [0D 0F 8B, 05, 05]
-1F459; [0D 0C 3B, 05, 05]
+1F456; [0D 0F 92, 05, 05]
-1F45A; [0D 0C 42, 05, 05]
+1F457; [0D 0F 99, 05, 05]
-1F45B; [0D 0C 49, 05, 05]
+1F458; [0D 0F A0, 05, 05]
-1F45C; [0D 0C 50, 05, 05]
+1F459; [0D 0F A7, 05, 05]
-1F45D; [0D 0C 57, 05, 05]
+1F45A; [0D 0F AE, 05, 05]
-1F45E; [0D 0C 5E, 05, 05]
+1F45B; [0D 0F B5, 05, 05]
-1F45F; [0D 0C 65, 05, 05]
+1F45C; [0D 0F BC, 05, 05]
-1F460; [0D 0C 6C, 05, 05]
+1F45D; [0D 0F C3, 05, 05]
-1F461; [0D 0C 73, 05, 05]
+1F45E; [0D 0F CA, 05, 05]
-1F462; [0D 0C 7A, 05, 05]
+1F45F; [0D 0F D1, 05, 05]
-1F463; [0D 0C 81, 05, 05]
+1F460; [0D 0F D8, 05, 05]
-1F464; [0D 0C 88, 05, 05]
+1F461; [0D 0F DF, 05, 05]
-1F465; [0D 0C 8F, 05, 05]
+1F462; [0D 0F E6, 05, 05]
-1F466; [0D 0C 96, 05, 05]
+1F463; [0D 0F ED, 05, 05]
-1F467; [0D 0C 9D, 05, 05]
+1F464; [0D 0F F4, 05, 05]
-1F468; [0D 0C A4, 05, 05]
+1F465; [0D 0F FB, 05, 05]
-1F469; [0D 0C AB, 05, 05]
+1F466; [0D 10 04, 05, 05]
-1F46A; [0D 0C B2, 05, 05]
+1F467; [0D 10 0B, 05, 05]
-1F46B; [0D 0C B9, 05, 05]
+1F468; [0D 10 12, 05, 05]
-1F46C; [0D 0C C0, 05, 05]
+1F469; [0D 10 19, 05, 05]
-1F46D; [0D 0C C7, 05, 05]
+1F46A; [0D 10 20, 05, 05]
-1F46E; [0D 0C CE, 05, 05]
+1F46B; [0D 10 27, 05, 05]
-1F46F; [0D 0C D5, 05, 05]
+1F46C; [0D 10 2E, 05, 05]
-1F470; [0D 0C DC, 05, 05]
+1F46D; [0D 10 35, 05, 05]
-1F471; [0D 0C E3, 05, 05]
+1F46E; [0D 10 3C, 05, 05]
-1F472; [0D 0C EA, 05, 05]
+1F46F; [0D 10 43, 05, 05]
-1F473; [0D 0C F1, 05, 05]
+1F470; [0D 10 4A, 05, 05]
-1F474; [0D 0C F8, 05, 05]
+1F471; [0D 10 51, 05, 05]
-1F475; [0D 0C FF, 05, 05]
+1F472; [0D 10 58, 05, 05]
-1F476; [0D 0D 08, 05, 05]
+1F473; [0D 10 5F, 05, 05]
-1F477; [0D 0D 0F, 05, 05]
+1F474; [0D 10 66, 05, 05]
-1F478; [0D 0D 16, 05, 05]
+1F475; [0D 10 6D, 05, 05]
-1F479; [0D 0D 1D, 05, 05]
+1F476; [0D 10 74, 05, 05]
-1F47A; [0D 0D 24, 05, 05]
+1F477; [0D 10 7B, 05, 05]
-1F47B; [0D 0D 2B, 05, 05]
+1F478; [0D 10 82, 05, 05]
-1F47C; [0D 0D 32, 05, 05]
+1F479; [0D 10 89, 05, 05]
-1F47D; [0D 0D 39, 05, 05]
+1F47A; [0D 10 90, 05, 05]
-1F47E; [0D 0D 40, 05, 05]
+1F47B; [0D 10 97, 05, 05]
-1F47F; [0D 0D 47, 05, 05]
+1F47C; [0D 10 9E, 05, 05]
-1F480; [0D 0D 4E, 05, 05]
+1F47D; [0D 10 A5, 05, 05]
-1F481; [0D 0D 55, 05, 05]
+1F47E; [0D 10 AC, 05, 05]
-1F482; [0D 0D 5C, 05, 05]
+1F47F; [0D 10 B3, 05, 05]
-1F483; [0D 0D 63, 05, 05]
+1F480; [0D 10 BA, 05, 05]
-1F484; [0D 0D 6A, 05, 05]
+1F481; [0D 10 C1, 05, 05]
-1F485; [0D 0D 71, 05, 05]
+1F482; [0D 10 C8, 05, 05]
-1F486; [0D 0D 78, 05, 05]
+1F483; [0D 10 CF, 05, 05]
-1F487; [0D 0D 7F, 05, 05]
+1F484; [0D 10 D6, 05, 05]
-1F488; [0D 0D 86, 05, 05]
+1F485; [0D 10 DD, 05, 05]
-1F489; [0D 0D 8D, 05, 05]
+1F486; [0D 10 E4, 05, 05]
-1F48A; [0D 0D 94, 05, 05]
+1F487; [0D 10 EB, 05, 05]
-1F48B; [0D 0D 9B, 05, 05]
+1F488; [0D 10 F2, 05, 05]
-1F48C; [0D 0D A2, 05, 05]
+1F489; [0D 10 F9, 05, 05]
-1F48D; [0D 0D A9, 05, 05]
+1F48A; [0D 11 02, 05, 05]
-1F48E; [0D 0D B0, 05, 05]
+1F48B; [0D 11 09, 05, 05]
-1F48F; [0D 0D B7, 05, 05]
+1F48C; [0D 11 10, 05, 05]
-1F490; [0D 0D BE, 05, 05]
+1F48D; [0D 11 17, 05, 05]
-1F491; [0D 0D C5, 05, 05]
+1F48E; [0D 11 1E, 05, 05]
-1F492; [0D 0D CC, 05, 05]
+1F48F; [0D 11 25, 05, 05]
-1F493; [0D 0D D3, 05, 05]
+1F490; [0D 11 2C, 05, 05]
-1F494; [0D 0D DA, 05, 05]
+1F491; [0D 11 33, 05, 05]
-1F495; [0D 0D E1, 05, 05]
+1F492; [0D 11 3A, 05, 05]
-1F496; [0D 0D E8, 05, 05]
+1F493; [0D 11 41, 05, 05]
-1F497; [0D 0D EF, 05, 05]
+1F494; [0D 11 48, 05, 05]
-1F498; [0D 0D F6, 05, 05]
+1F495; [0D 11 4F, 05, 05]
-1F499; [0D 0D FD, 05, 05]
+1F496; [0D 11 56, 05, 05]
-1F49A; [0D 0E 06, 05, 05]
+1F497; [0D 11 5D, 05, 05]
-1F49B; [0D 0E 0D, 05, 05]
+1F498; [0D 11 64, 05, 05]
-1F49C; [0D 0E 14, 05, 05]
+1F499; [0D 11 6B, 05, 05]
-1F49D; [0D 0E 1B, 05, 05]
+1F49A; [0D 11 72, 05, 05]
-1F49E; [0D 0E 22, 05, 05]
+1F49B; [0D 11 79, 05, 05]
-1F49F; [0D 0E 29, 05, 05]
+1F49C; [0D 11 80, 05, 05]
-1F4A0; [0D 0E 30, 05, 05]
+1F49D; [0D 11 87, 05, 05]
-1F4A1; [0D 0E 37, 05, 05]
+1F49E; [0D 11 8E, 05, 05]
-1F4A2; [0D 0E 3E, 05, 05]
+1F49F; [0D 11 95, 05, 05]
-1F4A3; [0D 0E 45, 05, 05]
+1F4A0; [0D 11 9C, 05, 05]
-1F4A4; [0D 0E 4C, 05, 05]
+1F4A1; [0D 11 A3, 05, 05]
-1F4A5; [0D 0E 53, 05, 05]
+1F4A2; [0D 11 AA, 05, 05]
-1F4A6; [0D 0E 5A, 05, 05]
+1F4A3; [0D 11 B1, 05, 05]
-1F4A7; [0D 0E 61, 05, 05]
+1F4A4; [0D 11 B8, 05, 05]
-1F4A8; [0D 0E 68, 05, 05]
+1F4A5; [0D 11 BF, 05, 05]
-1F4A9; [0D 0E 6F, 05, 05]
+1F4A6; [0D 11 C6, 05, 05]
-1F4AA; [0D 0E 76, 05, 05]
+1F4A7; [0D 11 CD, 05, 05]
-1F4AB; [0D 0E 7D, 05, 05]
+1F4A8; [0D 11 D4, 05, 05]
-1F4AC; [0D 0E 84, 05, 05]
+1F4A9; [0D 11 DB, 05, 05]
-1F4AD; [0D 0E 8B, 05, 05]
+1F4AA; [0D 11 E2, 05, 05]
-1F4AE; [0D 0E 92, 05, 05]
+1F4AB; [0D 11 E9, 05, 05]
-1F4AF; [0D 0E 99, 05, 05]
+1F4AC; [0D 11 F0, 05, 05]
-1F4B0; [0D 0E A0, 05, 05]
+1F4AD; [0D 11 F7, 05, 05]
-1F4B1; [0D 0E A7, 05, 05]
+1F4AE; [0D 11 FE, 05, 05]
-1F4B2; [0D 0E AE, 05, 05]
+1F4AF; [0D 12 07, 05, 05]
-1F4B3; [0D 0E B5, 05, 05]
+1F4B0; [0D 12 0E, 05, 05]
-1F4B4; [0D 0E BC, 05, 05]
+1F4B1; [0D 12 15, 05, 05]
-1F4B5; [0D 0E C3, 05, 05]
+1F4B2; [0D 12 1C, 05, 05]
-1F4B6; [0D 0E CA, 05, 05]
+1F4B3; [0D 12 23, 05, 05]
-1F4B7; [0D 0E D1, 05, 05]
+1F4B4; [0D 12 2A, 05, 05]
-1F4B8; [0D 0E D8, 05, 05]
+1F4B5; [0D 12 31, 05, 05]
-1F4B9; [0D 0E DF, 05, 05]
+1F4B6; [0D 12 38, 05, 05]
-1F4BA; [0D 0E E6, 05, 05]
+1F4B7; [0D 12 3F, 05, 05]
-1F4BB; [0D 0E ED, 05, 05]
+1F4B8; [0D 12 46, 05, 05]
-1F4BC; [0D 0E F4, 05, 05]
+1F4B9; [0D 12 4D, 05, 05]
-1F4BD; [0D 0E FB, 05, 05]
+1F4BA; [0D 12 54, 05, 05]
-1F4BE; [0D 0F 04, 05, 05]
+1F4BB; [0D 12 5B, 05, 05]
-1F4BF; [0D 0F 0B, 05, 05]
+1F4BC; [0D 12 62, 05, 05]
-1F4C0; [0D 0F 12, 05, 05]
+1F4BD; [0D 12 69, 05, 05]
-1F4C1; [0D 0F 19, 05, 05]
+1F4BE; [0D 12 70, 05, 05]
-1F4C2; [0D 0F 20, 05, 05]
+1F4BF; [0D 12 77, 05, 05]
-1F4C3; [0D 0F 27, 05, 05]
+1F4C0; [0D 12 7E, 05, 05]
-1F4C4; [0D 0F 2E, 05, 05]
+1F4C1; [0D 12 85, 05, 05]
-1F4C5; [0D 0F 35, 05, 05]
+1F4C2; [0D 12 8C, 05, 05]
-1F4C6; [0D 0F 3C, 05, 05]
+1F4C3; [0D 12 93, 05, 05]
-1F4C7; [0D 0F 43, 05, 05]
+1F4C4; [0D 12 9A, 05, 05]
-1F4C8; [0D 0F 4A, 05, 05]
+1F4C5; [0D 12 A1, 05, 05]
-1F4C9; [0D 0F 51, 05, 05]
+1F4C6; [0D 12 A8, 05, 05]
-1F4CA; [0D 0F 58, 05, 05]
+1F4C7; [0D 12 AF, 05, 05]
-1F4CB; [0D 0F 5F, 05, 05]
+1F4C8; [0D 12 B6, 05, 05]
-1F4CC; [0D 0F 66, 05, 05]
+1F4C9; [0D 12 BD, 05, 05]
-1F4CD; [0D 0F 6D, 05, 05]
+1F4CA; [0D 12 C4, 05, 05]
-1F4CE; [0D 0F 74, 05, 05]
+1F4CB; [0D 12 CB, 05, 05]
-1F4CF; [0D 0F 7B, 05, 05]
+1F4CC; [0D 12 D2, 05, 05]
-1F4D0; [0D 0F 82, 05, 05]
+1F4CD; [0D 12 D9, 05, 05]
-1F4D1; [0D 0F 89, 05, 05]
+1F4CE; [0D 12 E0, 05, 05]
-1F4D2; [0D 0F 90, 05, 05]
+1F4CF; [0D 12 E7, 05, 05]
-1F4D3; [0D 0F 97, 05, 05]
+1F4D0; [0D 12 EE, 05, 05]
-1F4D4; [0D 0F 9E, 05, 05]
+1F4D1; [0D 12 F5, 05, 05]
-1F4D5; [0D 0F A5, 05, 05]
+1F4D2; [0D 12 FC, 05, 05]
-1F4D6; [0D 0F AC, 05, 05]
+1F4D3; [0D 13 05, 05, 05]
-1F4D7; [0D 0F B3, 05, 05]
+1F4D4; [0D 13 0C, 05, 05]
-1F4D8; [0D 0F BA, 05, 05]
+1F4D5; [0D 13 13, 05, 05]
-1F4D9; [0D 0F C1, 05, 05]
+1F4D6; [0D 13 1A, 05, 05]
-1F4DA; [0D 0F C8, 05, 05]
+1F4D7; [0D 13 21, 05, 05]
-1F4DB; [0D 0F CF, 05, 05]
+1F4D8; [0D 13 28, 05, 05]
-1F4DC; [0D 0F D6, 05, 05]
+1F4D9; [0D 13 2F, 05, 05]
-1F4DD; [0D 0F DD, 05, 05]
+1F4DA; [0D 13 36, 05, 05]
-1F4DE; [0D 0F E4, 05, 05]
+1F4DB; [0D 13 3D, 05, 05]
-1F4DF; [0D 0F EB, 05, 05]
+1F4DC; [0D 13 44, 05, 05]
-1F4E0; [0D 0F F2, 05, 05]
+1F4DD; [0D 13 4B, 05, 05]
-1F4E1; [0D 0F F9, 05, 05]
+1F4DE; [0D 13 52, 05, 05]
-1F4E2; [0D 10 02, 05, 05]
+1F4DF; [0D 13 59, 05, 05]
-1F4E3; [0D 10 09, 05, 05]
+1F4E0; [0D 13 60, 05, 05]
-1F4E4; [0D 10 10, 05, 05]
+1F4E1; [0D 13 67, 05, 05]
-1F4E5; [0D 10 17, 05, 05]
+1F4E2; [0D 13 6E, 05, 05]
-1F4E6; [0D 10 1E, 05, 05]
+1F4E3; [0D 13 75, 05, 05]
-1F4E7; [0D 10 25, 05, 05]
+1F4E4; [0D 13 7C, 05, 05]
-1F4E8; [0D 10 2C, 05, 05]
+1F4E5; [0D 13 83, 05, 05]
-1F4E9; [0D 10 33, 05, 05]
+1F4E6; [0D 13 8A, 05, 05]
-1F4EA; [0D 10 3A, 05, 05]
+1F4E7; [0D 13 91, 05, 05]
-1F4EB; [0D 10 41, 05, 05]
+1F4E8; [0D 13 98, 05, 05]
-1F4EC; [0D 10 48, 05, 05]
+1F4E9; [0D 13 9F, 05, 05]
-1F4ED; [0D 10 4F, 05, 05]
+1F4EA; [0D 13 A6, 05, 05]
-1F4EE; [0D 10 56, 05, 05]
+1F4EB; [0D 13 AD, 05, 05]
-1F4EF; [0D 10 5D, 05, 05]
+1F4EC; [0D 13 B4, 05, 05]
-1F4F0; [0D 10 64, 05, 05]
+1F4ED; [0D 13 BB, 05, 05]
-1F4F1; [0D 10 6B, 05, 05]
+1F4EE; [0D 13 C2, 05, 05]
-1F4F2; [0D 10 72, 05, 05]
+1F4EF; [0D 13 C9, 05, 05]
-1F4F3; [0D 10 79, 05, 05]
+1F4F0; [0D 13 D0, 05, 05]
-1F4F4; [0D 10 80, 05, 05]
+1F4F1; [0D 13 D7, 05, 05]
-1F4F5; [0D 10 87, 05, 05]
+1F4F2; [0D 13 DE, 05, 05]
-1F4F6; [0D 10 8E, 05, 05]
+1F4F3; [0D 13 E5, 05, 05]
-1F4F7; [0D 10 95, 05, 05]
+1F4F4; [0D 13 EC, 05, 05]
-1F4F8; [0D 10 9C, 05, 05]
+1F4F5; [0D 13 F3, 05, 05]
-1F4F9; [0D 10 A3, 05, 05]
+1F4F6; [0D 13 FA, 05, 05]
-1F4FA; [0D 10 AA, 05, 05]
+1F4F7; [0D 14 03, 05, 05]
-1F4FB; [0D 10 B1, 05, 05]
+1F4F8; [0D 14 0A, 05, 05]
-1F4FC; [0D 10 B8, 05, 05]
+1F4F9; [0D 14 11, 05, 05]
-1F4FD; [0D 10 BF, 05, 05]
+1F4FA; [0D 14 18, 05, 05]
-1F4FE; [0D 10 C6, 05, 05]
+1F4FB; [0D 14 1F, 05, 05]
-1F4FF; [0D 10 CD, 05, 05]
+1F4FC; [0D 14 26, 05, 05]
-1F500; [0D 10 D4, 05, 05]
+1F4FD; [0D 14 2D, 05, 05]
-1F501; [0D 10 DB, 05, 05]
+1F4FE; [0D 14 34, 05, 05]
-1F502; [0D 10 E2, 05, 05]
+1F4FF; [0D 14 3B, 05, 05]
-1F503; [0D 10 E9, 05, 05]
+1F500; [0D 14 42, 05, 05]
-1F504; [0D 10 F0, 05, 05]
+1F501; [0D 14 49, 05, 05]
-1F505; [0D 10 F7, 05, 05]
+1F502; [0D 14 50, 05, 05]
-1F506; [0D 10 FE, 05, 05]
+1F503; [0D 14 57, 05, 05]
-1F507; [0D 11 07, 05, 05]
+1F504; [0D 14 5E, 05, 05]
-1F508; [0D 11 0E, 05, 05]
+1F505; [0D 14 65, 05, 05]
-1F509; [0D 11 15, 05, 05]
+1F506; [0D 14 6C, 05, 05]
-1F50A; [0D 11 1C, 05, 05]
+1F507; [0D 14 73, 05, 05]
-1F50B; [0D 11 23, 05, 05]
+1F508; [0D 14 7A, 05, 05]
-1F50C; [0D 11 2A, 05, 05]
+1F509; [0D 14 81, 05, 05]
-1F50D; [0D 11 31, 05, 05]
+1F50A; [0D 14 88, 05, 05]
-1F50E; [0D 11 38, 05, 05]
+1F50B; [0D 14 8F, 05, 05]
-1F50F; [0D 11 3F, 05, 05]
+1F50C; [0D 14 96, 05, 05]
-1F510; [0D 11 46, 05, 05]
+1F50D; [0D 14 9D, 05, 05]
-1F511; [0D 11 4D, 05, 05]
+1F50E; [0D 14 A4, 05, 05]
-1F512; [0D 11 54, 05, 05]
+1F50F; [0D 14 AB, 05, 05]
-1F513; [0D 11 5B, 05, 05]
+1F510; [0D 14 B2, 05, 05]
-1F514; [0D 11 62, 05, 05]
+1F511; [0D 14 B9, 05, 05]
-1F515; [0D 11 69, 05, 05]
+1F512; [0D 14 C0, 05, 05]
-1F516; [0D 11 70, 05, 05]
+1F513; [0D 14 C7, 05, 05]
-1F517; [0D 11 77, 05, 05]
+1F514; [0D 14 CE, 05, 05]
-1F518; [0D 11 7E, 05, 05]
+1F515; [0D 14 D5, 05, 05]
-1F519; [0D 11 85, 05, 05]
+1F516; [0D 14 DC, 05, 05]
-1F51A; [0D 11 8C, 05, 05]
+1F517; [0D 14 E3, 05, 05]
-1F51B; [0D 11 93, 05, 05]
+1F518; [0D 14 EA, 05, 05]
-1F51C; [0D 11 9A, 05, 05]
+1F519; [0D 14 F1, 05, 05]
-1F51D; [0D 11 A1, 05, 05]
+1F51A; [0D 14 F8, 05, 05]
-1F51E; [0D 11 A8, 05, 05]
+1F51B; [0D 14 FF, 05, 05]
-1F51F; [0D 11 AF, 05, 05]
+1F51C; [0D 15 08, 05, 05]
-1F520; [0D 11 B6, 05, 05]
+1F51D; [0D 15 0F, 05, 05]
-1F521; [0D 11 BD, 05, 05]
+1F51E; [0D 15 16, 05, 05]
-1F522; [0D 11 C4, 05, 05]
+1F51F; [0D 15 1D, 05, 05]
-1F523; [0D 11 CB, 05, 05]
+1F520; [0D 15 24, 05, 05]
-1F524; [0D 11 D2, 05, 05]
+1F521; [0D 15 2B, 05, 05]
-1F525; [0D 11 D9, 05, 05]
+1F522; [0D 15 32, 05, 05]
-1F526; [0D 11 E0, 05, 05]
+1F523; [0D 15 39, 05, 05]
-1F527; [0D 11 E7, 05, 05]
+1F524; [0D 15 40, 05, 05]
-1F528; [0D 11 EE, 05, 05]
+1F525; [0D 15 47, 05, 05]
-1F529; [0D 11 F5, 05, 05]
+1F526; [0D 15 4E, 05, 05]
-1F52A; [0D 11 FC, 05, 05]
+1F527; [0D 15 55, 05, 05]
-1F52B; [0D 12 05, 05, 05]
+1F528; [0D 15 5C, 05, 05]
-1F52C; [0D 12 0C, 05, 05]
+1F529; [0D 15 63, 05, 05]
-1F52D; [0D 12 13, 05, 05]
+1F52A; [0D 15 6A, 05, 05]
-1F52E; [0D 12 1A, 05, 05]
+1F52B; [0D 15 71, 05, 05]
-1F52F; [0D 12 21, 05, 05]
+1F52C; [0D 15 78, 05, 05]
-1F530; [0D 12 28, 05, 05]
+1F52D; [0D 15 7F, 05, 05]
-1F531; [0D 12 2F, 05, 05]
+1F52E; [0D 15 86, 05, 05]
-1F532; [0D 12 36, 05, 05]
+1F52F; [0D 15 8D, 05, 05]
-1F533; [0D 12 3D, 05, 05]
+1F530; [0D 15 94, 05, 05]
-1F534; [0D 12 44, 05, 05]
+1F531; [0D 15 9B, 05, 05]
-1F535; [0D 12 4B, 05, 05]
+1F532; [0D 15 A2, 05, 05]
-1F536; [0D 12 52, 05, 05]
+1F533; [0D 15 A9, 05, 05]
-1F537; [0D 12 59, 05, 05]
+1F534; [0D 15 B0, 05, 05]
-1F538; [0D 12 60, 05, 05]
+1F535; [0D 15 B7, 05, 05]
-1F539; [0D 12 67, 05, 05]
+1F536; [0D 15 BE, 05, 05]
-1F53A; [0D 12 6E, 05, 05]
+1F537; [0D 15 C5, 05, 05]
-1F53B; [0D 12 75, 05, 05]
+1F538; [0D 15 CC, 05, 05]
-1F53C; [0D 12 7C, 05, 05]
+1F539; [0D 15 D3, 05, 05]
-1F53D; [0D 12 83, 05, 05]
+1F53A; [0D 15 DA, 05, 05]
-1F53E; [0D 12 8A, 05, 05]
+1F53B; [0D 15 E1, 05, 05]
-1F53F; [0D 12 91, 05, 05]
+1F53C; [0D 15 E8, 05, 05]
-1F540; [0D 12 98, 05, 05]
+1F53D; [0D 15 EF, 05, 05]
-1F541; [0D 12 9F, 05, 05]
+1F53E; [0D 15 F6, 05, 05]
-1F542; [0D 12 A6, 05, 05]
+1F53F; [0D 15 FD, 05, 05]
-1F543; [0D 12 AD, 05, 05]
+1F540; [0D 16 06, 05, 05]
-1F544; [0D 12 B4, 05, 05]
+1F541; [0D 16 0D, 05, 05]
-1F545; [0D 12 BB, 05, 05]
+1F542; [0D 16 14, 05, 05]
-1F546; [0D 12 C2, 05, 05]
+1F543; [0D 16 1B, 05, 05]
-1F547; [0D 12 C9, 05, 05]
+1F544; [0D 16 22, 05, 05]
-1F548; [0D 12 D0, 05, 05]
+1F545; [0D 16 29, 05, 05]
-1F549; [0D 12 D7, 05, 05]
+1F546; [0D 16 30, 05, 05]
-1F54A; [0D 12 DE, 05, 05]
+1F547; [0D 16 37, 05, 05]
-1F54B; [0D 12 E5, 05, 05]
+1F548; [0D 16 3E, 05, 05]
-1F54C; [0D 12 EC, 05, 05]
+1F549; [0D 16 45, 05, 05]
-1F54D; [0D 12 F3, 05, 05]
+1F54A; [0D 16 4C, 05, 05]
-1F54E; [0D 12 FA, 05, 05]
+1F54B; [0D 16 53, 05, 05]
-1F54F; [0D 13 03, 05, 05]
+1F54C; [0D 16 5A, 05, 05]
-1F550; [0D 13 0A, 05, 05]
+1F54D; [0D 16 61, 05, 05]
-1F551; [0D 13 11, 05, 05]
+1F54E; [0D 16 68, 05, 05]
-1F552; [0D 13 18, 05, 05]
+1F54F; [0D 16 6F, 05, 05]
-1F553; [0D 13 1F, 05, 05]
+1F550; [0D 16 76, 05, 05]
-1F554; [0D 13 26, 05, 05]
+1F551; [0D 16 7D, 05, 05]
-1F555; [0D 13 2D, 05, 05]
+1F552; [0D 16 84, 05, 05]
-1F556; [0D 13 34, 05, 05]
+1F553; [0D 16 8B, 05, 05]
-1F557; [0D 13 3B, 05, 05]
+1F554; [0D 16 92, 05, 05]
-1F558; [0D 13 42, 05, 05]
+1F555; [0D 16 99, 05, 05]
-1F559; [0D 13 49, 05, 05]
+1F556; [0D 16 A0, 05, 05]
-1F55A; [0D 13 50, 05, 05]
+1F557; [0D 16 A7, 05, 05]
-1F55B; [0D 13 57, 05, 05]
+1F558; [0D 16 AE, 05, 05]
-1F55C; [0D 13 5E, 05, 05]
+1F559; [0D 16 B5, 05, 05]
-1F55D; [0D 13 65, 05, 05]
+1F55A; [0D 16 BC, 05, 05]
-1F55E; [0D 13 6C, 05, 05]
+1F55B; [0D 16 C3, 05, 05]
-1F55F; [0D 13 73, 05, 05]
+1F55C; [0D 16 CA, 05, 05]
-1F560; [0D 13 7A, 05, 05]
+1F55D; [0D 16 D1, 05, 05]
-1F561; [0D 13 81, 05, 05]
+1F55E; [0D 16 D8, 05, 05]
-1F562; [0D 13 88, 05, 05]
+1F55F; [0D 16 DF, 05, 05]
-1F563; [0D 13 8F, 05, 05]
+1F560; [0D 16 E6, 05, 05]
-1F564; [0D 13 96, 05, 05]
+1F561; [0D 16 ED, 05, 05]
-1F565; [0D 13 9D, 05, 05]
+1F562; [0D 16 F4, 05, 05]
-1F566; [0D 13 A4, 05, 05]
+1F563; [0D 16 FB, 05, 05]
-1F567; [0D 13 AB, 05, 05]
+1F564; [0D 17 04, 05, 05]
-1F568; [0D 13 B2, 05, 05]
+1F565; [0D 17 0B, 05, 05]
-1F569; [0D 13 B9, 05, 05]
+1F566; [0D 17 12, 05, 05]
-1F56A; [0D 13 C0, 05, 05]
+1F567; [0D 17 19, 05, 05]
-1F56B; [0D 13 C7, 05, 05]
+1F568; [0D 17 20, 05, 05]
-1F56C; [0D 13 CE, 05, 05]
+1F569; [0D 17 27, 05, 05]
-1F56D; [0D 13 D5, 05, 05]
+1F56A; [0D 17 2E, 05, 05]
-1F56E; [0D 13 DC, 05, 05]
+1F56B; [0D 17 35, 05, 05]
-1F56F; [0D 13 E3, 05, 05]
+1F56C; [0D 17 3C, 05, 05]
-1F570; [0D 13 EA, 05, 05]
+1F56D; [0D 17 43, 05, 05]
-1F571; [0D 13 F1, 05, 05]
+1F56E; [0D 17 4A, 05, 05]
-1F572; [0D 13 F8, 05, 05]
+1F56F; [0D 17 51, 05, 05]
-1F573; [0D 13 FF, 05, 05]
+1F570; [0D 17 58, 05, 05]
-1F574; [0D 14 08, 05, 05]
+1F571; [0D 17 5F, 05, 05]
-1F575; [0D 14 0F, 05, 05]
+1F572; [0D 17 66, 05, 05]
-1F576; [0D 14 16, 05, 05]
+1F573; [0D 17 6D, 05, 05]
-1F577; [0D 14 1D, 05, 05]
+1F574; [0D 17 74, 05, 05]
-1F578; [0D 14 24, 05, 05]
+1F575; [0D 17 7B, 05, 05]
-1F579; [0D 14 2B, 05, 05]
+1F576; [0D 17 82, 05, 05]
-1F57A; [0D 14 32, 05, 05]
+1F577; [0D 17 89, 05, 05]
-1F57B; [0D 14 39, 05, 05]
+1F578; [0D 17 90, 05, 05]
-1F57C; [0D 14 40, 05, 05]
+1F579; [0D 17 97, 05, 05]
-1F57D; [0D 14 47, 05, 05]
+1F57A; [0D 17 9E, 05, 05]
-1F57E; [0D 14 4E, 05, 05]
+1F57B; [0D 17 A5, 05, 05]
-1F57F; [0D 14 55, 05, 05]
+1F57C; [0D 17 AC, 05, 05]
-1F580; [0D 14 5C, 05, 05]
+1F57D; [0D 17 B3, 05, 05]
-1F581; [0D 14 63, 05, 05]
+1F57E; [0D 17 BA, 05, 05]
-1F582; [0D 14 6A, 05, 05]
+1F57F; [0D 17 C1, 05, 05]
-1F583; [0D 14 71, 05, 05]
+1F580; [0D 17 C8, 05, 05]
-1F584; [0D 14 78, 05, 05]
+1F581; [0D 17 CF, 05, 05]
-1F585; [0D 14 7F, 05, 05]
+1F582; [0D 17 D6, 05, 05]
-1F586; [0D 14 86, 05, 05]
+1F583; [0D 17 DD, 05, 05]
-1F587; [0D 14 8D, 05, 05]
+1F584; [0D 17 E4, 05, 05]
-1F588; [0D 14 94, 05, 05]
+1F585; [0D 17 EB, 05, 05]
-1F589; [0D 14 9B, 05, 05]
+1F586; [0D 17 F2, 05, 05]
-1F58A; [0D 14 A2, 05, 05]
+1F587; [0D 17 F9, 05, 05]
-1F58B; [0D 14 A9, 05, 05]
+1F588; [0D 18 02, 05, 05]
-1F58C; [0D 14 B0, 05, 05]
+1F589; [0D 18 09, 05, 05]
-1F58D; [0D 14 B7, 05, 05]
+1F58A; [0D 18 10, 05, 05]
-1F58E; [0D 14 BE, 05, 05]
+1F58B; [0D 18 17, 05, 05]
-1F58F; [0D 14 C5, 05, 05]
+1F58C; [0D 18 1E, 05, 05]
-1F590; [0D 14 CC, 05, 05]
+1F58D; [0D 18 25, 05, 05]
-1F591; [0D 14 D3, 05, 05]
+1F58E; [0D 18 2C, 05, 05]
-1F592; [0D 14 DA, 05, 05]
+1F58F; [0D 18 33, 05, 05]
-1F593; [0D 14 E1, 05, 05]
+1F590; [0D 18 3A, 05, 05]
-1F594; [0D 14 E8, 05, 05]
+1F591; [0D 18 41, 05, 05]
-1F595; [0D 14 EF, 05, 05]
+1F592; [0D 18 48, 05, 05]
-1F596; [0D 14 F6, 05, 05]
+1F593; [0D 18 4F, 05, 05]
-1F597; [0D 14 FD, 05, 05]
+1F594; [0D 18 56, 05, 05]
-1F598; [0D 15 06, 05, 05]
+1F595; [0D 18 5D, 05, 05]
-1F599; [0D 15 0D, 05, 05]
+1F596; [0D 18 64, 05, 05]
-1F59A; [0D 15 14, 05, 05]
+1F597; [0D 18 6B, 05, 05]
-1F59B; [0D 15 1B, 05, 05]
+1F598; [0D 18 72, 05, 05]
-1F59C; [0D 15 22, 05, 05]
+1F599; [0D 18 79, 05, 05]
-1F59D; [0D 15 29, 05, 05]
+1F59A; [0D 18 80, 05, 05]
-1F59E; [0D 15 30, 05, 05]
+1F59B; [0D 18 87, 05, 05]
-1F59F; [0D 15 37, 05, 05]
+1F59C; [0D 18 8E, 05, 05]
-1F5A0; [0D 15 3E, 05, 05]
+1F59D; [0D 18 95, 05, 05]
-1F5A1; [0D 15 45, 05, 05]
+1F59E; [0D 18 9C, 05, 05]
-1F5A2; [0D 15 4C, 05, 05]
+1F59F; [0D 18 A3, 05, 05]
-1F5A3; [0D 15 53, 05, 05]
+1F5A0; [0D 18 AA, 05, 05]
-1F5A4; [0D 15 5A, 05, 05]
+1F5A1; [0D 18 B1, 05, 05]
-1F5A5; [0D 15 61, 05, 05]
+1F5A2; [0D 18 B8, 05, 05]
-1F5A6; [0D 15 68, 05, 05]
+1F5A3; [0D 18 BF, 05, 05]
-1F5A7; [0D 15 6F, 05, 05]
+1F5A4; [0D 18 C6, 05, 05]
-1F5A8; [0D 15 76, 05, 05]
+1F5A5; [0D 18 CD, 05, 05]
-1F5A9; [0D 15 7D, 05, 05]
+1F5A6; [0D 18 D4, 05, 05]
-1F5AA; [0D 15 84, 05, 05]
+1F5A7; [0D 18 DB, 05, 05]
-1F5AB; [0D 15 8B, 05, 05]
+1F5A8; [0D 18 E2, 05, 05]
-1F5AC; [0D 15 92, 05, 05]
+1F5A9; [0D 18 E9, 05, 05]
-1F5AD; [0D 15 99, 05, 05]
+1F5AA; [0D 18 F0, 05, 05]
-1F5AE; [0D 15 A0, 05, 05]
+1F5AB; [0D 18 F7, 05, 05]
-1F5AF; [0D 15 A7, 05, 05]
+1F5AC; [0D 18 FE, 05, 05]
-1F5B0; [0D 15 AE, 05, 05]
+1F5AD; [0D 19 07, 05, 05]
-1F5B1; [0D 15 B5, 05, 05]
+1F5AE; [0D 19 0E, 05, 05]
-1F5B2; [0D 15 BC, 05, 05]
+1F5AF; [0D 19 15, 05, 05]
-1F5B3; [0D 15 C3, 05, 05]
+1F5B0; [0D 19 1C, 05, 05]
-1F5B4; [0D 15 CA, 05, 05]
+1F5B1; [0D 19 23, 05, 05]
-1F5B5; [0D 15 D1, 05, 05]
+1F5B2; [0D 19 2A, 05, 05]
-1F5B6; [0D 15 D8, 05, 05]
+1F5B3; [0D 19 31, 05, 05]
-1F5B7; [0D 15 DF, 05, 05]
+1F5B4; [0D 19 38, 05, 05]
-1F5B8; [0D 15 E6, 05, 05]
+1F5B5; [0D 19 3F, 05, 05]
-1F5B9; [0D 15 ED, 05, 05]
+1F5B6; [0D 19 46, 05, 05]
-1F5BA; [0D 15 F4, 05, 05]
+1F5B7; [0D 19 4D, 05, 05]
-1F5BB; [0D 15 FB, 05, 05]
+1F5B8; [0D 19 54, 05, 05]
-1F5BC; [0D 16 04, 05, 05]
+1F5B9; [0D 19 5B, 05, 05]
-1F5BD; [0D 16 0B, 05, 05]
+1F5BA; [0D 19 62, 05, 05]
-1F5BE; [0D 16 12, 05, 05]
+1F5BB; [0D 19 69, 05, 05]
-1F5BF; [0D 16 19, 05, 05]
+1F5BC; [0D 19 70, 05, 05]
-1F5C0; [0D 16 20, 05, 05]
+1F5BD; [0D 19 77, 05, 05]
-1F5C1; [0D 16 27, 05, 05]
+1F5BE; [0D 19 7E, 05, 05]
-1F5C2; [0D 16 2E, 05, 05]
+1F5BF; [0D 19 85, 05, 05]
-1F5C3; [0D 16 35, 05, 05]
+1F5C0; [0D 19 8C, 05, 05]
-1F5C4; [0D 16 3C, 05, 05]
+1F5C1; [0D 19 93, 05, 05]
-1F5C5; [0D 16 43, 05, 05]
+1F5C2; [0D 19 9A, 05, 05]
-1F5C6; [0D 16 4A, 05, 05]
+1F5C3; [0D 19 A1, 05, 05]
-1F5C7; [0D 16 51, 05, 05]
+1F5C4; [0D 19 A8, 05, 05]
-1F5C8; [0D 16 58, 05, 05]
+1F5C5; [0D 19 AF, 05, 05]
-1F5C9; [0D 16 5F, 05, 05]
+1F5C6; [0D 19 B6, 05, 05]
-1F5CA; [0D 16 66, 05, 05]
+1F5C7; [0D 19 BD, 05, 05]
-1F5CB; [0D 16 6D, 05, 05]
+1F5C8; [0D 19 C4, 05, 05]
-1F5CC; [0D 16 74, 05, 05]
+1F5C9; [0D 19 CB, 05, 05]
-1F5CD; [0D 16 7B, 05, 05]
+1F5CA; [0D 19 D2, 05, 05]
-1F5CE; [0D 16 82, 05, 05]
+1F5CB; [0D 19 D9, 05, 05]
-1F5CF; [0D 16 89, 05, 05]
+1F5CC; [0D 19 E0, 05, 05]
-1F5D0; [0D 16 90, 05, 05]
+1F5CD; [0D 19 E7, 05, 05]
-1F5D1; [0D 16 97, 05, 05]
+1F5CE; [0D 19 EE, 05, 05]
-1F5D2; [0D 16 9E, 05, 05]
+1F5CF; [0D 19 F5, 05, 05]
-1F5D3; [0D 16 A5, 05, 05]
+1F5D0; [0D 19 FC, 05, 05]
-1F5D4; [0D 16 AC, 05, 05]
+1F5D1; [0D 1A 05, 05, 05]
-1F5D5; [0D 16 B3, 05, 05]
+1F5D2; [0D 1A 0C, 05, 05]
-1F5D6; [0D 16 BA, 05, 05]
+1F5D3; [0D 1A 13, 05, 05]
-1F5D7; [0D 16 C1, 05, 05]
+1F5D4; [0D 1A 1A, 05, 05]
-1F5D8; [0D 16 C8, 05, 05]
+1F5D5; [0D 1A 21, 05, 05]
-1F5D9; [0D 16 CF, 05, 05]
+1F5D6; [0D 1A 28, 05, 05]
-1F5DA; [0D 16 D6, 05, 05]
+1F5D7; [0D 1A 2F, 05, 05]
-1F5DB; [0D 16 DD, 05, 05]
+1F5D8; [0D 1A 36, 05, 05]
-1F5DC; [0D 16 E4, 05, 05]
+1F5D9; [0D 1A 3D, 05, 05]
-1F5DD; [0D 16 EB, 05, 05]
+1F5DA; [0D 1A 44, 05, 05]
-1F5DE; [0D 16 F2, 05, 05]
+1F5DB; [0D 1A 4B, 05, 05]
-1F5DF; [0D 16 F9, 05, 05]
+1F5DC; [0D 1A 52, 05, 05]
-1F5E0; [0D 17 02, 05, 05]
+1F5DD; [0D 1A 59, 05, 05]
-1F5E1; [0D 17 09, 05, 05]
+1F5DE; [0D 1A 60, 05, 05]
-1F5E2; [0D 17 10, 05, 05]
+1F5DF; [0D 1A 67, 05, 05]
-1F5E3; [0D 17 17, 05, 05]
+1F5E0; [0D 1A 6E, 05, 05]
-1F5E4; [0D 17 1E, 05, 05]
+1F5E1; [0D 1A 75, 05, 05]
-1F5E5; [0D 17 25, 05, 05]
+1F5E2; [0D 1A 7C, 05, 05]
-1F5E6; [0D 17 2C, 05, 05]
+1F5E3; [0D 1A 83, 05, 05]
-1F5E7; [0D 17 33, 05, 05]
+1F5E4; [0D 1A 8A, 05, 05]
-1F5E8; [0D 17 3A, 05, 05]
+1F5E5; [0D 1A 91, 05, 05]
-1F5E9; [0D 17 41, 05, 05]
+1F5E6; [0D 1A 98, 05, 05]
-1F5EA; [0D 17 48, 05, 05]
+1F5E7; [0D 1A 9F, 05, 05]
-1F5EB; [0D 17 4F, 05, 05]
+1F5E8; [0D 1A A6, 05, 05]
-1F5EC; [0D 17 56, 05, 05]
+1F5E9; [0D 1A AD, 05, 05]
-1F5ED; [0D 17 5D, 05, 05]
+1F5EA; [0D 1A B4, 05, 05]
-1F5EE; [0D 17 64, 05, 05]
+1F5EB; [0D 1A BB, 05, 05]
-1F5EF; [0D 17 6B, 05, 05]
+1F5EC; [0D 1A C2, 05, 05]
-1F5F0; [0D 17 72, 05, 05]
+1F5ED; [0D 1A C9, 05, 05]
-1F5F1; [0D 17 79, 05, 05]
+1F5EE; [0D 1A D0, 05, 05]
-1F5F2; [0D 17 80, 05, 05]
+1F5EF; [0D 1A D7, 05, 05]
-1F5F3; [0D 17 87, 05, 05]
+1F5F0; [0D 1A DE, 05, 05]
-1F5F4; [0D 17 8E, 05, 05]
+1F5F1; [0D 1A E5, 05, 05]
-1F5F5; [0D 17 95, 05, 05]
+1F5F2; [0D 1A EC, 05, 05]
-1F5F6; [0D 17 9C, 05, 05]
+1F5F3; [0D 1A F3, 05, 05]
-1F5F7; [0D 17 A3, 05, 05]
+1F5F4; [0D 1A FA, 05, 05]
-1F5F8; [0D 17 AA, 05, 05]
+1F5F5; [0D 1B 03, 05, 05]
-1F5F9; [0D 17 B1, 05, 05]
+1F5F6; [0D 1B 0A, 05, 05]
-1F5FA; [0D 17 B8, 05, 05]
+1F5F7; [0D 1B 11, 05, 05]
-1F5FB; [0D 17 BF, 05, 05]
+1F5F8; [0D 1B 18, 05, 05]
-1F5FC; [0D 17 C6, 05, 05]
+1F5F9; [0D 1B 1F, 05, 05]
-1F5FD; [0D 17 CD, 05, 05]
+1F5FA; [0D 1B 26, 05, 05]
-1F5FE; [0D 17 D4, 05, 05]
+1F5FB; [0D 1B 2D, 05, 05]
-1F5FF; [0D 17 DB, 05, 05]
+1F5FC; [0D 1B 34, 05, 05]
-1F900; [0D 17 E2, 05, 05]
+1F5FD; [0D 1B 3B, 05, 05]
-1F901; [0D 17 E9, 05, 05]
+1F5FE; [0D 1B 42, 05, 05]
-1F902; [0D 17 F0, 05, 05]
+1F5FF; [0D 1B 49, 05, 05]
-1F903; [0D 17 F7, 05, 05]
+1F900; [0D 1B 50, 05, 05]
-1F904; [0D 17 FE, 05, 05]
+1F901; [0D 1B 57, 05, 05]
-1F905; [0D 18 07, 05, 05]
+1F902; [0D 1B 5E, 05, 05]
-1F906; [0D 18 0E, 05, 05]
+1F903; [0D 1B 65, 05, 05]
-1F907; [0D 18 15, 05, 05]
+1F904; [0D 1B 6C, 05, 05]
-1F908; [0D 18 1C, 05, 05]
+1F905; [0D 1B 73, 05, 05]
-1F909; [0D 18 23, 05, 05]
+1F906; [0D 1B 7A, 05, 05]
-1F90A; [0D 18 2A, 05, 05]
+1F907; [0D 1B 81, 05, 05]
-1F90B; [0D 18 31, 05, 05]
+1F908; [0D 1B 88, 05, 05]
-1F910; [0D 18 38, 05, 05]
+1F909; [0D 1B 8F, 05, 05]
-1F911; [0D 18 3F, 05, 05]
+1F90A; [0D 1B 96, 05, 05]
-1F912; [0D 18 46, 05, 05]
+1F90B; [0D 1B 9D, 05, 05]
-1F913; [0D 18 4D, 05, 05]
+1F90D; [0D 1B A4, 05, 05]
-1F914; [0D 18 54, 05, 05]
+1F90E; [0D 1B AB, 05, 05]
-1F915; [0D 18 5B, 05, 05]
+1F90F; [0D 1B B2, 05, 05]
-1F916; [0D 18 62, 05, 05]
+1F910; [0D 1B B9, 05, 05]
-1F917; [0D 18 69, 05, 05]
+1F911; [0D 1B C0, 05, 05]
-1F918; [0D 18 70, 05, 05]
+1F912; [0D 1B C7, 05, 05]
-1F919; [0D 18 77, 05, 05]
+1F913; [0D 1B CE, 05, 05]
-1F91A; [0D 18 7E, 05, 05]
+1F914; [0D 1B D5, 05, 05]
-1F91B; [0D 18 85, 05, 05]
+1F915; [0D 1B DC, 05, 05]
-1F91C; [0D 18 8C, 05, 05]
+1F916; [0D 1B E3, 05, 05]
-1F91D; [0D 18 93, 05, 05]
+1F917; [0D 1B EA, 05, 05]
-1F91E; [0D 18 9A, 05, 05]
+1F918; [0D 1B F1, 05, 05]
-1F91F; [0D 18 A1, 05, 05]
+1F919; [0D 1B F8, 05, 05]
-1F920; [0D 18 A8, 05, 05]
+1F91A; [0D 1B FF, 05, 05]
-1F921; [0D 18 AF, 05, 05]
+1F91B; [0D 1C 08, 05, 05]
-1F922; [0D 18 B6, 05, 05]
+1F91C; [0D 1C 0F, 05, 05]
-1F923; [0D 18 BD, 05, 05]
+1F91D; [0D 1C 16, 05, 05]
-1F924; [0D 18 C4, 05, 05]
+1F91E; [0D 1C 1D, 05, 05]
-1F925; [0D 18 CB, 05, 05]
+1F91F; [0D 1C 24, 05, 05]
-1F926; [0D 18 D2, 05, 05]
+1F920; [0D 1C 2B, 05, 05]
-1F927; [0D 18 D9, 05, 05]
+1F921; [0D 1C 32, 05, 05]
-1F928; [0D 18 E0, 05, 05]
+1F922; [0D 1C 39, 05, 05]
-1F929; [0D 18 E7, 05, 05]
+1F923; [0D 1C 40, 05, 05]
-1F92A; [0D 18 EE, 05, 05]
+1F924; [0D 1C 47, 05, 05]
-1F92B; [0D 18 F5, 05, 05]
+1F925; [0D 1C 4E, 05, 05]
-1F92C; [0D 18 FC, 05, 05]
+1F926; [0D 1C 55, 05, 05]
-1F92D; [0D 19 05, 05, 05]
+1F927; [0D 1C 5C, 05, 05]
-1F92E; [0D 19 0C, 05, 05]
+1F928; [0D 1C 63, 05, 05]
-1F92F; [0D 19 13, 05, 05]
+1F929; [0D 1C 6A, 05, 05]
-1F930; [0D 19 1A, 05, 05]
+1F92A; [0D 1C 71, 05, 05]
-1F931; [0D 19 21, 05, 05]
+1F92B; [0D 1C 78, 05, 05]
-1F932; [0D 19 28, 05, 05]
+1F92C; [0D 1C 7F, 05, 05]
-1F933; [0D 19 2F, 05, 05]
+1F92D; [0D 1C 86, 05, 05]
-1F934; [0D 19 36, 05, 05]
+1F92E; [0D 1C 8D, 05, 05]
-1F935; [0D 19 3D, 05, 05]
+1F92F; [0D 1C 94, 05, 05]
-1F936; [0D 19 44, 05, 05]
+1F930; [0D 1C 9B, 05, 05]
-1F937; [0D 19 4B, 05, 05]
+1F931; [0D 1C A2, 05, 05]
-1F938; [0D 19 52, 05, 05]
+1F932; [0D 1C A9, 05, 05]
-1F939; [0D 19 59, 05, 05]
+1F933; [0D 1C B0, 05, 05]
-1F93A; [0D 19 60, 05, 05]
+1F934; [0D 1C B7, 05, 05]
-1F93B; [0D 19 67, 05, 05]
+1F935; [0D 1C BE, 05, 05]
-1F93C; [0D 19 6E, 05, 05]
+1F936; [0D 1C C5, 05, 05]
-1F93D; [0D 19 75, 05, 05]
+1F937; [0D 1C CC, 05, 05]
-1F93E; [0D 19 7C, 05, 05]
+1F938; [0D 1C D3, 05, 05]
-1F940; [0D 19 83, 05, 05]
+1F939; [0D 1C DA, 05, 05]
-1F941; [0D 19 8A, 05, 05]
+1F93A; [0D 1C E1, 05, 05]
-1F942; [0D 19 91, 05, 05]
+1F93B; [0D 1C E8, 05, 05]
-1F943; [0D 19 98, 05, 05]
+1F93C; [0D 1C EF, 05, 05]
-1F944; [0D 19 9F, 05, 05]
+1F93D; [0D 1C F6, 05, 05]
-1F945; [0D 19 A6, 05, 05]
+1F93E; [0D 1C FD, 05, 05]
-1F946; [0D 19 AD, 05, 05]
+1F93F; [0D 1D 06, 05, 05]
-1F947; [0D 19 B4, 05, 05]
+1F940; [0D 1D 0D, 05, 05]
-1F948; [0D 19 BB, 05, 05]
+1F941; [0D 1D 14, 05, 05]
-1F949; [0D 19 C2, 05, 05]
+1F942; [0D 1D 1B, 05, 05]
-1F94A; [0D 19 C9, 05, 05]
+1F943; [0D 1D 22, 05, 05]
-1F94B; [0D 19 D0, 05, 05]
+1F944; [0D 1D 29, 05, 05]
-1F94C; [0D 19 D7, 05, 05]
+1F945; [0D 1D 30, 05, 05]
-1F94D; [0D 19 DE, 05, 05]
+1F946; [0D 1D 37, 05, 05]
-1F94E; [0D 19 E5, 05, 05]
+1F947; [0D 1D 3E, 05, 05]
-1F94F; [0D 19 EC, 05, 05]
+1F948; [0D 1D 45, 05, 05]
-1F950; [0D 19 F3, 05, 05]
+1F949; [0D 1D 4C, 05, 05]
-1F951; [0D 19 FA, 05, 05]
+1F94A; [0D 1D 53, 05, 05]
-1F952; [0D 1A 03, 05, 05]
+1F94B; [0D 1D 5A, 05, 05]
-1F953; [0D 1A 0A, 05, 05]
+1F94C; [0D 1D 61, 05, 05]
-1F954; [0D 1A 11, 05, 05]
+1F94D; [0D 1D 68, 05, 05]
-1F955; [0D 1A 18, 05, 05]
+1F94E; [0D 1D 6F, 05, 05]
-1F956; [0D 1A 1F, 05, 05]
+1F94F; [0D 1D 76, 05, 05]
-1F957; [0D 1A 26, 05, 05]
+1F950; [0D 1D 7D, 05, 05]
-1F958; [0D 1A 2D, 05, 05]
+1F951; [0D 1D 84, 05, 05]
-1F959; [0D 1A 34, 05, 05]
+1F952; [0D 1D 8B, 05, 05]
-1F95A; [0D 1A 3B, 05, 05]
+1F953; [0D 1D 92, 05, 05]
-1F95B; [0D 1A 42, 05, 05]
+1F954; [0D 1D 99, 05, 05]
-1F95C; [0D 1A 49, 05, 05]
+1F955; [0D 1D A0, 05, 05]
-1F95D; [0D 1A 50, 05, 05]
+1F956; [0D 1D A7, 05, 05]
-1F95E; [0D 1A 57, 05, 05]
+1F957; [0D 1D AE, 05, 05]
-1F95F; [0D 1A 5E, 05, 05]
+1F958; [0D 1D B5, 05, 05]
-1F960; [0D 1A 65, 05, 05]
+1F959; [0D 1D BC, 05, 05]
-1F961; [0D 1A 6C, 05, 05]
+1F95A; [0D 1D C3, 05, 05]
-1F962; [0D 1A 73, 05, 05]
+1F95B; [0D 1D CA, 05, 05]
-1F963; [0D 1A 7A, 05, 05]
+1F95C; [0D 1D D1, 05, 05]
-1F964; [0D 1A 81, 05, 05]
+1F95D; [0D 1D D8, 05, 05]
-1F965; [0D 1A 88, 05, 05]
+1F95E; [0D 1D DF, 05, 05]
-1F966; [0D 1A 8F, 05, 05]
+1F95F; [0D 1D E6, 05, 05]
-1F967; [0D 1A 96, 05, 05]
+1F960; [0D 1D ED, 05, 05]
-1F968; [0D 1A 9D, 05, 05]
+1F961; [0D 1D F4, 05, 05]
-1F969; [0D 1A A4, 05, 05]
+1F962; [0D 1D FB, 05, 05]
-1F96A; [0D 1A AB, 05, 05]
+1F963; [0D 1E 04, 05, 05]
-1F96B; [0D 1A B2, 05, 05]
+1F964; [0D 1E 0B, 05, 05]
-1F96C; [0D 1A B9, 05, 05]
+1F965; [0D 1E 12, 05, 05]
-1F96D; [0D 1A C0, 05, 05]
+1F966; [0D 1E 19, 05, 05]
-1F96E; [0D 1A C7, 05, 05]
+1F967; [0D 1E 20, 05, 05]
-1F96F; [0D 1A CE, 05, 05]
+1F968; [0D 1E 27, 05, 05]
-1F970; [0D 1A D5, 05, 05]
+1F969; [0D 1E 2E, 05, 05]
-1F973; [0D 1A DC, 05, 05]
+1F96A; [0D 1E 35, 05, 05]
-1F974; [0D 1A E3, 05, 05]
+1F96B; [0D 1E 3C, 05, 05]
-1F975; [0D 1A EA, 05, 05]
+1F96C; [0D 1E 43, 05, 05]
-1F976; [0D 1A F1, 05, 05]
+1F96D; [0D 1E 4A, 05, 05]
-1F97A; [0D 1A F8, 05, 05]
+1F96E; [0D 1E 51, 05, 05]
-1F97C; [0D 1A FF, 05, 05]
+1F96F; [0D 1E 58, 05, 05]
-1F97D; [0D 1B 08, 05, 05]
+1F970; [0D 1E 5F, 05, 05]
-1F97E; [0D 1B 0F, 05, 05]
+1F971; [0D 1E 66, 05, 05]
-1F97F; [0D 1B 16, 05, 05]
+1F973; [0D 1E 6D, 05, 05]
-1F980; [0D 1B 1D, 05, 05]
+1F974; [0D 1E 74, 05, 05]
-1F981; [0D 1B 24, 05, 05]
+1F975; [0D 1E 7B, 05, 05]
-1F982; [0D 1B 2B, 05, 05]
+1F976; [0D 1E 82, 05, 05]
-1F983; [0D 1B 32, 05, 05]
+1F97A; [0D 1E 89, 05, 05]
-1F984; [0D 1B 39, 05, 05]
+1F97B; [0D 1E 90, 05, 05]
-1F985; [0D 1B 40, 05, 05]
+1F97C; [0D 1E 97, 05, 05]
-1F986; [0D 1B 47, 05, 05]
+1F97D; [0D 1E 9E, 05, 05]
-1F987; [0D 1B 4E, 05, 05]
+1F97E; [0D 1E A5, 05, 05]
-1F988; [0D 1B 55, 05, 05]
+1F97F; [0D 1E AC, 05, 05]
-1F989; [0D 1B 5C, 05, 05]
+1F980; [0D 1E B3, 05, 05]
-1F98A; [0D 1B 63, 05, 05]
+1F981; [0D 1E BA, 05, 05]
-1F98B; [0D 1B 6A, 05, 05]
+1F982; [0D 1E C1, 05, 05]
-1F98C; [0D 1B 71, 05, 05]
+1F983; [0D 1E C8, 05, 05]
-1F98D; [0D 1B 78, 05, 05]
+1F984; [0D 1E CF, 05, 05]
-1F98E; [0D 1B 7F, 05, 05]
+1F985; [0D 1E D6, 05, 05]
-1F98F; [0D 1B 86, 05, 05]
+1F986; [0D 1E DD, 05, 05]
-1F990; [0D 1B 8D, 05, 05]
+1F987; [0D 1E E4, 05, 05]
-1F991; [0D 1B 94, 05, 05]
+1F988; [0D 1E EB, 05, 05]
-1F992; [0D 1B 9B, 05, 05]
+1F989; [0D 1E F2, 05, 05]
-1F993; [0D 1B A2, 05, 05]
+1F98A; [0D 1E F9, 05, 05]
-1F994; [0D 1B A9, 05, 05]
+1F98B; [0D 1F 02, 05, 05]
-1F995; [0D 1B B0, 05, 05]
+1F98C; [0D 1F 09, 05, 05]
-1F996; [0D 1B B7, 05, 05]
+1F98D; [0D 1F 10, 05, 05]
-1F997; [0D 1B BE, 05, 05]
+1F98E; [0D 1F 17, 05, 05]
-1F998; [0D 1B C5, 05, 05]
+1F98F; [0D 1F 1E, 05, 05]
-1F999; [0D 1B CC, 05, 05]
+1F990; [0D 1F 25, 05, 05]
-1F99A; [0D 1B D3, 05, 05]
+1F991; [0D 1F 2C, 05, 05]
-1F99B; [0D 1B DA, 05, 05]
+1F992; [0D 1F 33, 05, 05]
-1F99C; [0D 1B E1, 05, 05]
+1F993; [0D 1F 3A, 05, 05]
-1F99D; [0D 1B E8, 05, 05]
+1F994; [0D 1F 41, 05, 05]
-1F99E; [0D 1B EF, 05, 05]
+1F995; [0D 1F 48, 05, 05]
-1F99F; [0D 1B F6, 05, 05]
+1F996; [0D 1F 4F, 05, 05]
-1F9A0; [0D 1B FD, 05, 05]
+1F997; [0D 1F 56, 05, 05]
-1F9A1; [0D 1C 06, 05, 05]
+1F998; [0D 1F 5D, 05, 05]
-1F9A2; [0D 1C 0D, 05, 05]
+1F999; [0D 1F 64, 05, 05]
-1F9B0; [0D 1C 14, 05, 05]
+1F99A; [0D 1F 6B, 05, 05]
-1F9B1; [0D 1C 1B, 05, 05]
+1F99B; [0D 1F 72, 05, 05]
-1F9B2; [0D 1C 22, 05, 05]
+1F99C; [0D 1F 79, 05, 05]
-1F9B3; [0D 1C 29, 05, 05]
+1F99D; [0D 1F 80, 05, 05]
-1F9B4; [0D 1C 30, 05, 05]
+1F99E; [0D 1F 87, 05, 05]
-1F9B5; [0D 1C 37, 05, 05]
+1F99F; [0D 1F 8E, 05, 05]
-1F9B6; [0D 1C 3E, 05, 05]
+1F9A0; [0D 1F 95, 05, 05]
-1F9B7; [0D 1C 45, 05, 05]
+1F9A1; [0D 1F 9C, 05, 05]
-1F9B8; [0D 1C 4C, 05, 05]
+1F9A2; [0D 1F A3, 05, 05]
-1F9B9; [0D 1C 53, 05, 05]
+1F9A5; [0D 1F AA, 05, 05]
-1F9C0; [0D 1C 5A, 05, 05]
+1F9A6; [0D 1F B1, 05, 05]
-1F9C1; [0D 1C 61, 05, 05]
+1F9A7; [0D 1F B8, 05, 05]
-1F9C2; [0D 1C 68, 05, 05]
+1F9A8; [0D 1F BF, 05, 05]
-1F9D0; [0D 1C 6F, 05, 05]
+1F9A9; [0D 1F C6, 05, 05]
-1F9D1; [0D 1C 76, 05, 05]
+1F9AA; [0D 1F CD, 05, 05]
-1F9D2; [0D 1C 7D, 05, 05]
+1F9AE; [0D 1F D4, 05, 05]
-1F9D3; [0D 1C 84, 05, 05]
+1F9AF; [0D 1F DB, 05, 05]
-1F9D4; [0D 1C 8B, 05, 05]
+1F9B0; [0D 1F E2, 05, 05]
-1F9D5; [0D 1C 92, 05, 05]
+1F9B1; [0D 1F E9, 05, 05]
-1F9D6; [0D 1C 99, 05, 05]
+1F9B2; [0D 1F F0, 05, 05]
-1F9D7; [0D 1C A0, 05, 05]
+1F9B3; [0D 1F F7, 05, 05]
-1F9D8; [0D 1C A7, 05, 05]
+1F9B4; [0D 1F FE, 05, 05]
-1F9D9; [0D 1C AE, 05, 05]
+1F9B5; [0D 20 07, 05, 05]
-1F9DA; [0D 1C B5, 05, 05]
+1F9B6; [0D 20 0E, 05, 05]
-1F9DB; [0D 1C BC, 05, 05]
+1F9B7; [0D 20 15, 05, 05]
-1F9DC; [0D 1C C3, 05, 05]
+1F9B8; [0D 20 1C, 05, 05]
-1F9DD; [0D 1C CA, 05, 05]
+1F9B9; [0D 20 23, 05, 05]
-1F9DE; [0D 1C D1, 05, 05]
+1F9BA; [0D 20 2A, 05, 05]
-1F9DF; [0D 1C D8, 05, 05]
+1F9BB; [0D 20 31, 05, 05]
-1F9E0; [0D 1C DF, 05, 05]
+1F9BC; [0D 20 38, 05, 05]
-1F9E1; [0D 1C E6, 05, 05]
+1F9BD; [0D 20 3F, 05, 05]
-1F9E2; [0D 1C ED, 05, 05]
+1F9BE; [0D 20 46, 05, 05]
-1F9E3; [0D 1C F4, 05, 05]
+1F9BF; [0D 20 4D, 05, 05]
-1F9E4; [0D 1C FB, 05, 05]
+1F9C0; [0D 20 54, 05, 05]
-1F9E5; [0D 1D 04, 05, 05]
+1F9C1; [0D 20 5B, 05, 05]
-1F9E6; [0D 1D 0B, 05, 05]
+1F9C2; [0D 20 62, 05, 05]
-1F9E7; [0D 1D 12, 05, 05]
+1F9C3; [0D 20 69, 05, 05]
-1F9E8; [0D 1D 19, 05, 05]
+1F9C4; [0D 20 70, 05, 05]
-1F9E9; [0D 1D 20, 05, 05]
+1F9C5; [0D 20 77, 05, 05]
-1F9EA; [0D 1D 27, 05, 05]
+1F9C6; [0D 20 7E, 05, 05]
-1F9EB; [0D 1D 2E, 05, 05]
+1F9C7; [0D 20 85, 05, 05]
-1F9EC; [0D 1D 35, 05, 05]
+1F9C8; [0D 20 8C, 05, 05]
-1F9ED; [0D 1D 3C, 05, 05]
+1F9C9; [0D 20 93, 05, 05]
-1F9EE; [0D 1D 43, 05, 05]
+1F9CA; [0D 20 9A, 05, 05]
-1F9EF; [0D 1D 4A, 05, 05]
+1F9CD; [0D 20 A1, 05, 05]
-1F9F0; [0D 1D 51, 05, 05]
+1F9CE; [0D 20 A8, 05, 05]
-1F9F1; [0D 1D 58, 05, 05]
+1F9CF; [0D 20 AF, 05, 05]
-1F9F2; [0D 1D 5F, 05, 05]
+1F9D0; [0D 20 B6, 05, 05]
-1F9F3; [0D 1D 66, 05, 05]
+1F9D1; [0D 20 BD, 05, 05]
-1F9F4; [0D 1D 6D, 05, 05]
+1F9D2; [0D 20 C4, 05, 05]
-1F9F5; [0D 1D 74, 05, 05]
+1F9D3; [0D 20 CB, 05, 05]
-1F9F6; [0D 1D 7B, 05, 05]
+1F9D4; [0D 20 D2, 05, 05]
-1F9F7; [0D 1D 82, 05, 05]
+1F9D5; [0D 20 D9, 05, 05]
-1F9F8; [0D 1D 89, 05, 05]
+1F9D6; [0D 20 E0, 05, 05]
-1F9F9; [0D 1D 90, 05, 05]
+1F9D7; [0D 20 E7, 05, 05]
-1F9FA; [0D 1D 97, 05, 05]
+1F9D8; [0D 20 EE, 05, 05]
-1F9FB; [0D 1D 9E, 05, 05]
+1F9D9; [0D 20 F5, 05, 05]
-1F9FC; [0D 1D A5, 05, 05]
+1F9DA; [0D 20 FC, 05, 05]
-1F9FD; [0D 1D AC, 05, 05]
+1F9DB; [0D 21 05, 05, 05]
-1F9FE; [0D 1D B3, 05, 05]
+1F9DC; [0D 21 0C, 05, 05]
-1F9FF; [0D 1D BA, 05, 05]
+1F9DD; [0D 21 13, 05, 05]
-1F600; [0D 1D C1, 05, 05]
+1F9DE; [0D 21 1A, 05, 05]
-1F601; [0D 1D C8, 05, 05]
+1F9DF; [0D 21 21, 05, 05]
-1F602; [0D 1D CF, 05, 05]
+1F9E0; [0D 21 28, 05, 05]
-1F603; [0D 1D D6, 05, 05]
+1F9E1; [0D 21 2F, 05, 05]
-1F604; [0D 1D DD, 05, 05]
+1F9E2; [0D 21 36, 05, 05]
-1F605; [0D 1D E4, 05, 05]
+1F9E3; [0D 21 3D, 05, 05]
-1F606; [0D 1D EB, 05, 05]
+1F9E4; [0D 21 44, 05, 05]
-1F607; [0D 1D F2, 05, 05]
+1F9E5; [0D 21 4B, 05, 05]
-1F608; [0D 1D F9, 05, 05]
+1F9E6; [0D 21 52, 05, 05]
-1F609; [0D 1E 02, 05, 05]
+1F9E7; [0D 21 59, 05, 05]
-1F60A; [0D 1E 09, 05, 05]
+1F9E8; [0D 21 60, 05, 05]
-1F60B; [0D 1E 10, 05, 05]
+1F9E9; [0D 21 67, 05, 05]
-1F60C; [0D 1E 17, 05, 05]
+1F9EA; [0D 21 6E, 05, 05]
-1F60D; [0D 1E 1E, 05, 05]
+1F9EB; [0D 21 75, 05, 05]
-1F60E; [0D 1E 25, 05, 05]
+1F9EC; [0D 21 7C, 05, 05]
-1F60F; [0D 1E 2C, 05, 05]
+1F9ED; [0D 21 83, 05, 05]
-1F610; [0D 1E 33, 05, 05]
+1F9EE; [0D 21 8A, 05, 05]
-1F611; [0D 1E 3A, 05, 05]
+1F9EF; [0D 21 91, 05, 05]
-1F612; [0D 1E 41, 05, 05]
+1F9F0; [0D 21 98, 05, 05]
-1F613; [0D 1E 48, 05, 05]
+1F9F1; [0D 21 9F, 05, 05]
-1F614; [0D 1E 4F, 05, 05]
+1F9F2; [0D 21 A6, 05, 05]
-1F615; [0D 1E 56, 05, 05]
+1F9F3; [0D 21 AD, 05, 05]
-1F616; [0D 1E 5D, 05, 05]
+1F9F4; [0D 21 B4, 05, 05]
-1F617; [0D 1E 64, 05, 05]
+1F9F5; [0D 21 BB, 05, 05]
-1F618; [0D 1E 6B, 05, 05]
+1F9F6; [0D 21 C2, 05, 05]
-1F619; [0D 1E 72, 05, 05]
+1F9F7; [0D 21 C9, 05, 05]
-1F61A; [0D 1E 79, 05, 05]
+1F9F8; [0D 21 D0, 05, 05]
-1F61B; [0D 1E 80, 05, 05]
+1F9F9; [0D 21 D7, 05, 05]
-1F61C; [0D 1E 87, 05, 05]
+1F9FA; [0D 21 DE, 05, 05]
-1F61D; [0D 1E 8E, 05, 05]
+1F9FB; [0D 21 E5, 05, 05]
-1F61E; [0D 1E 95, 05, 05]
+1F9FC; [0D 21 EC, 05, 05]
-1F61F; [0D 1E 9C, 05, 05]
+1F9FD; [0D 21 F3, 05, 05]
-1F620; [0D 1E A3, 05, 05]
+1F9FE; [0D 21 FA, 05, 05]
-1F621; [0D 1E AA, 05, 05]
+1F9FF; [0D 22 03, 05, 05]
-1F622; [0D 1E B1, 05, 05]
+1FA70; [0D 22 0A, 05, 05]
-1F623; [0D 1E B8, 05, 05]
+1FA71; [0D 22 11, 05, 05]
-1F624; [0D 1E BF, 05, 05]
+1FA72; [0D 22 18, 05, 05]
-1F625; [0D 1E C6, 05, 05]
+1FA73; [0D 22 1F, 05, 05]
-1F626; [0D 1E CD, 05, 05]
+1FA78; [0D 22 26, 05, 05]
-1F627; [0D 1E D4, 05, 05]
+1FA79; [0D 22 2D, 05, 05]
-1F628; [0D 1E DB, 05, 05]
+1FA7A; [0D 22 34, 05, 05]
-1F629; [0D 1E E2, 05, 05]
+1FA80; [0D 22 3B, 05, 05]
-1F62A; [0D 1E E9, 05, 05]
+1FA81; [0D 22 42, 05, 05]
-1F62B; [0D 1E F0, 05, 05]
+1FA82; [0D 22 49, 05, 05]
-1F62C; [0D 1E F7, 05, 05]
+1FA90; [0D 22 50, 05, 05]
-1F62D; [0D 1E FE, 05, 05]
+1FA91; [0D 22 57, 05, 05]
-1F62E; [0D 1F 07, 05, 05]
+1FA92; [0D 22 5E, 05, 05]
-1F62F; [0D 1F 0E, 05, 05]
+1FA93; [0D 22 65, 05, 05]
-1F630; [0D 1F 15, 05, 05]
+1FA94; [0D 22 6C, 05, 05]
-1F631; [0D 1F 1C, 05, 05]
+1FA95; [0D 22 73, 05, 05]
-1F632; [0D 1F 23, 05, 05]
+1F600; [0D 22 7A, 05, 05]
-1F633; [0D 1F 2A, 05, 05]
+1F601; [0D 22 81, 05, 05]
-1F634; [0D 1F 31, 05, 05]
+1F602; [0D 22 88, 05, 05]
-1F635; [0D 1F 38, 05, 05]
+1F603; [0D 22 8F, 05, 05]
-1F636; [0D 1F 3F, 05, 05]
+1F604; [0D 22 96, 05, 05]
-1F637; [0D 1F 46, 05, 05]
+1F605; [0D 22 9D, 05, 05]
-1F638; [0D 1F 4D, 05, 05]
+1F606; [0D 22 A4, 05, 05]
-1F639; [0D 1F 54, 05, 05]
+1F607; [0D 22 AB, 05, 05]
-1F63A; [0D 1F 5B, 05, 05]
+1F608; [0D 22 B2, 05, 05]
-1F63B; [0D 1F 62, 05, 05]
+1F609; [0D 22 B9, 05, 05]
-1F63C; [0D 1F 69, 05, 05]
+1F60A; [0D 22 C0, 05, 05]
-1F63D; [0D 1F 70, 05, 05]
+1F60B; [0D 22 C7, 05, 05]
-1F63E; [0D 1F 77, 05, 05]
+1F60C; [0D 22 CE, 05, 05]
-1F63F; [0D 1F 7E, 05, 05]
+1F60D; [0D 22 D5, 05, 05]
-1F640; [0D 1F 85, 05, 05]
+1F60E; [0D 22 DC, 05, 05]
-1F641; [0D 1F 8C, 05, 05]
+1F60F; [0D 22 E3, 05, 05]
-1F642; [0D 1F 93, 05, 05]
+1F610; [0D 22 EA, 05, 05]
-1F643; [0D 1F 9A, 05, 05]
+1F611; [0D 22 F1, 05, 05]
-1F644; [0D 1F A1, 05, 05]
+1F612; [0D 22 F8, 05, 05]
-1F645; [0D 1F A8, 05, 05]
+1F613; [0D 22 FF, 05, 05]
-1F646; [0D 1F AF, 05, 05]
+1F614; [0D 23 08, 05, 05]
-1F647; [0D 1F B6, 05, 05]
+1F615; [0D 23 0F, 05, 05]
-1F648; [0D 1F BD, 05, 05]
+1F616; [0D 23 16, 05, 05]
-1F649; [0D 1F C4, 05, 05]
+1F617; [0D 23 1D, 05, 05]
-1F64A; [0D 1F CB, 05, 05]
+1F618; [0D 23 24, 05, 05]
-1F64B; [0D 1F D2, 05, 05]
+1F619; [0D 23 2B, 05, 05]
-1F64C; [0D 1F D9, 05, 05]
+1F61A; [0D 23 32, 05, 05]
-1F64D; [0D 1F E0, 05, 05]
+1F61B; [0D 23 39, 05, 05]
-1F64E; [0D 1F E7, 05, 05]
+1F61C; [0D 23 40, 05, 05]
-1F64F; [0D 1F EE, 05, 05]
+1F61D; [0D 23 47, 05, 05]
-1F650; [0D 1F F5, 05, 05]
+1F61E; [0D 23 4E, 05, 05]
-1F651; [0D 1F FC, 05, 05]
+1F61F; [0D 23 55, 05, 05]
-1F652; [0D 20 05, 05, 05]
+1F620; [0D 23 5C, 05, 05]
-1F653; [0D 20 0C, 05, 05]
+1F621; [0D 23 63, 05, 05]
-1F654; [0D 20 13, 05, 05]
+1F622; [0D 23 6A, 05, 05]
-1F655; [0D 20 1A, 05, 05]
+1F623; [0D 23 71, 05, 05]
-1F656; [0D 20 21, 05, 05]
+1F624; [0D 23 78, 05, 05]
-1F657; [0D 20 28, 05, 05]
+1F625; [0D 23 7F, 05, 05]
-1F658; [0D 20 2F, 05, 05]
+1F626; [0D 23 86, 05, 05]
-1F659; [0D 20 36, 05, 05]
+1F627; [0D 23 8D, 05, 05]
-1F65A; [0D 20 3D, 05, 05]
+1F628; [0D 23 94, 05, 05]
-1F65B; [0D 20 44, 05, 05]
+1F629; [0D 23 9B, 05, 05]
-1F65C; [0D 20 4B, 05, 05]
+1F62A; [0D 23 A2, 05, 05]
-1F65D; [0D 20 52, 05, 05]
+1F62B; [0D 23 A9, 05, 05]
-1F65E; [0D 20 59, 05, 05]
+1F62C; [0D 23 B0, 05, 05]
-1F65F; [0D 20 60, 05, 05]
+1F62D; [0D 23 B7, 05, 05]
-1F660; [0D 20 67, 05, 05]
+1F62E; [0D 23 BE, 05, 05]
-1F661; [0D 20 6E, 05, 05]
+1F62F; [0D 23 C5, 05, 05]
-1F662; [0D 20 75, 05, 05]
+1F630; [0D 23 CC, 05, 05]
-1F663; [0D 20 7C, 05, 05]
+1F631; [0D 23 D3, 05, 05]
-1F664; [0D 20 83, 05, 05]
+1F632; [0D 23 DA, 05, 05]
-1F665; [0D 20 8A, 05, 05]
+1F633; [0D 23 E1, 05, 05]
-1F666; [0D 20 91, 05, 05]
+1F634; [0D 23 E8, 05, 05]
-1F667; [0D 20 98, 05, 05]
+1F635; [0D 23 EF, 05, 05]
-1F668; [0D 20 9F, 05, 05]
+1F636; [0D 23 F6, 05, 05]
-1F669; [0D 20 A6, 05, 05]
+1F637; [0D 23 FD, 05, 05]
-1F66A; [0D 20 AD, 05, 05]
+1F638; [0D 24 06, 05, 05]
-1F66B; [0D 20 B4, 05, 05]
+1F639; [0D 24 0D, 05, 05]
-1F66C; [0D 20 BB, 05, 05]
+1F63A; [0D 24 14, 05, 05]
-1F66D; [0D 20 C2, 05, 05]
+1F63B; [0D 24 1B, 05, 05]
-1F66E; [0D 20 C9, 05, 05]
+1F63C; [0D 24 22, 05, 05]
-1F66F; [0D 20 D0, 05, 05]
+1F63D; [0D 24 29, 05, 05]
-1F670; [0D 20 D7, 05, 05]
+1F63E; [0D 24 30, 05, 05]
-1F671; [0D 20 DE, 05, 05]
+1F63F; [0D 24 37, 05, 05]
-1F672; [0D 20 E5, 05, 05]
+1F640; [0D 24 3E, 05, 05]
-1F673; [0D 20 EC, 05, 05]
+1F641; [0D 24 45, 05, 05]
-1F674; [0D 20 F3, 05, 05]
+1F642; [0D 24 4C, 05, 05]
-1F675; [0D 20 FA, 05, 05]
+1F643; [0D 24 53, 05, 05]
-1F676; [0D 21 03, 05, 05]
+1F644; [0D 24 5A, 05, 05]
-1F677; [0D 21 0A, 05, 05]
+1F645; [0D 24 61, 05, 05]
-1F678; [0D 21 11, 05, 05]
+1F646; [0D 24 68, 05, 05]
-1F679; [0D 21 18, 05, 05]
+1F647; [0D 24 6F, 05, 05]
-1F67A; [0D 21 1F, 05, 05]
+1F648; [0D 24 76, 05, 05]
-1F67B; [0D 21 26, 05, 05]
+1F649; [0D 24 7D, 05, 05]
-1F67C; [0D 21 2D, 05, 05]
+1F64A; [0D 24 84, 05, 05]
-1F67D; [0D 21 34, 05, 05]
+1F64B; [0D 24 8B, 05, 05]
-1F67E; [0D 21 3B, 05, 05]
+1F64C; [0D 24 92, 05, 05]
-1F67F; [0D 21 42, 05, 05]
+1F64D; [0D 24 99, 05, 05]
-1F680; [0D 21 49, 05, 05]
+1F64E; [0D 24 A0, 05, 05]
-1F681; [0D 21 50, 05, 05]
+1F64F; [0D 24 A7, 05, 05]
-1F682; [0D 21 57, 05, 05]
+1F650; [0D 24 AE, 05, 05]
-1F683; [0D 21 5E, 05, 05]
+1F651; [0D 24 B5, 05, 05]
-1F684; [0D 21 65, 05, 05]
+1F652; [0D 24 BC, 05, 05]
-1F685; [0D 21 6C, 05, 05]
+1F653; [0D 24 C3, 05, 05]
-1F686; [0D 21 73, 05, 05]
+1F654; [0D 24 CA, 05, 05]
-1F687; [0D 21 7A, 05, 05]
+1F655; [0D 24 D1, 05, 05]
-1F688; [0D 21 81, 05, 05]
+1F656; [0D 24 D8, 05, 05]
-1F689; [0D 21 88, 05, 05]
+1F657; [0D 24 DF, 05, 05]
-1F68A; [0D 21 8F, 05, 05]
+1F658; [0D 24 E6, 05, 05]
-1F68B; [0D 21 96, 05, 05]
+1F659; [0D 24 ED, 05, 05]
-1F68C; [0D 21 9D, 05, 05]
+1F65A; [0D 24 F4, 05, 05]
-1F68D; [0D 21 A4, 05, 05]
+1F65B; [0D 24 FB, 05, 05]
-1F68E; [0D 21 AB, 05, 05]
+1F65C; [0D 25 04, 05, 05]
-1F68F; [0D 21 B2, 05, 05]
+1F65D; [0D 25 0B, 05, 05]
-1F690; [0D 21 B9, 05, 05]
+1F65E; [0D 25 12, 05, 05]
-1F691; [0D 21 C0, 05, 05]
+1F65F; [0D 25 19, 05, 05]
-1F692; [0D 21 C7, 05, 05]
+1F660; [0D 25 20, 05, 05]
-1F693; [0D 21 CE, 05, 05]
+1F661; [0D 25 27, 05, 05]
-1F694; [0D 21 D5, 05, 05]
+1F662; [0D 25 2E, 05, 05]
-1F695; [0D 21 DC, 05, 05]
+1F663; [0D 25 35, 05, 05]
-1F696; [0D 21 E3, 05, 05]
+1F664; [0D 25 3C, 05, 05]
-1F697; [0D 21 EA, 05, 05]
+1F665; [0D 25 43, 05, 05]
-1F698; [0D 21 F1, 05, 05]
+1F666; [0D 25 4A, 05, 05]
-1F699; [0D 21 F8, 05, 05]
+1F667; [0D 25 51, 05, 05]
-1F69A; [0D 21 FF, 05, 05]
+1F668; [0D 25 58, 05, 05]
-1F69B; [0D 22 08, 05, 05]
+1F669; [0D 25 5F, 05, 05]
-1F69C; [0D 22 0F, 05, 05]
+1F66A; [0D 25 66, 05, 05]
-1F69D; [0D 22 16, 05, 05]
+1F66B; [0D 25 6D, 05, 05]
-1F69E; [0D 22 1D, 05, 05]
+1F66C; [0D 25 74, 05, 05]
-1F69F; [0D 22 24, 05, 05]
+1F66D; [0D 25 7B, 05, 05]
-1F6A0; [0D 22 2B, 05, 05]
+1F66E; [0D 25 82, 05, 05]
-1F6A1; [0D 22 32, 05, 05]
+1F66F; [0D 25 89, 05, 05]
-1F6A2; [0D 22 39, 05, 05]
+1F670; [0D 25 90, 05, 05]
-1F6A3; [0D 22 40, 05, 05]
+1F671; [0D 25 97, 05, 05]
-1F6A4; [0D 22 47, 05, 05]
+1F672; [0D 25 9E, 05, 05]
-1F6A5; [0D 22 4E, 05, 05]
+1F673; [0D 25 A5, 05, 05]
-1F6A6; [0D 22 55, 05, 05]
+1F674; [0D 25 AC, 05, 05]
-1F6A7; [0D 22 5C, 05, 05]
+1F675; [0D 25 B3, 05, 05]
-1F6A8; [0D 22 63, 05, 05]
+1F676; [0D 25 BA, 05, 05]
-1F6A9; [0D 22 6A, 05, 05]
+1F677; [0D 25 C1, 05, 05]
-1F6AA; [0D 22 71, 05, 05]
+1F678; [0D 25 C8, 05, 05]
-1F6AB; [0D 22 78, 05, 05]
+1F679; [0D 25 CF, 05, 05]
-1F6AC; [0D 22 7F, 05, 05]
+1F67A; [0D 25 D6, 05, 05]
-1F6AD; [0D 22 86, 05, 05]
+1F67B; [0D 25 DD, 05, 05]
-1F6AE; [0D 22 8D, 05, 05]
+1F67C; [0D 25 E4, 05, 05]
-1F6AF; [0D 22 94, 05, 05]
+1F67D; [0D 25 EB, 05, 05]
-1F6B0; [0D 22 9B, 05, 05]
+1F67E; [0D 25 F2, 05, 05]
-1F6B1; [0D 22 A2, 05, 05]
+1F67F; [0D 25 F9, 05, 05]
-1F6B2; [0D 22 A9, 05, 05]
+1F680; [0D 26 02, 05, 05]
-1F6B3; [0D 22 B0, 05, 05]
+1F681; [0D 26 09, 05, 05]
-1F6B4; [0D 22 B7, 05, 05]
+1F682; [0D 26 10, 05, 05]
-1F6B5; [0D 22 BE, 05, 05]
+1F683; [0D 26 17, 05, 05]
-1F6B6; [0D 22 C5, 05, 05]
+1F684; [0D 26 1E, 05, 05]
-1F6B7; [0D 22 CC, 05, 05]
+1F685; [0D 26 25, 05, 05]
-1F6B8; [0D 22 D3, 05, 05]
+1F686; [0D 26 2C, 05, 05]
-1F6B9; [0D 22 DA, 05, 05]
+1F687; [0D 26 33, 05, 05]
-1F6BA; [0D 22 E1, 05, 05]
+1F688; [0D 26 3A, 05, 05]
-1F6BB; [0D 22 E8, 05, 05]
+1F689; [0D 26 41, 05, 05]
-1F6BC; [0D 22 EF, 05, 05]
+1F68A; [0D 26 48, 05, 05]
-1F6BD; [0D 22 F6, 05, 05]
+1F68B; [0D 26 4F, 05, 05]
-1F6BE; [0D 22 FD, 05, 05]
+1F68C; [0D 26 56, 05, 05]
-1F6BF; [0D 23 06, 05, 05]
+1F68D; [0D 26 5D, 05, 05]
-1F6C0; [0D 23 0D, 05, 05]
+1F68E; [0D 26 64, 05, 05]
-1F6C1; [0D 23 14, 05, 05]
+1F68F; [0D 26 6B, 05, 05]
-1F6C2; [0D 23 1B, 05, 05]
+1F690; [0D 26 72, 05, 05]
-1F6C3; [0D 23 22, 05, 05]
+1F691; [0D 26 79, 05, 05]
-1F6C4; [0D 23 29, 05, 05]
+1F692; [0D 26 80, 05, 05]
-1F6C5; [0D 23 30, 05, 05]
+1F693; [0D 26 87, 05, 05]
-1F6C6; [0D 23 37, 05, 05]
+1F694; [0D 26 8E, 05, 05]
-1F6C7; [0D 23 3E, 05, 05]
+1F695; [0D 26 95, 05, 05]
-1F6C8; [0D 23 45, 05, 05]
+1F696; [0D 26 9C, 05, 05]
-1F6C9; [0D 23 4C, 05, 05]
+1F697; [0D 26 A3, 05, 05]
-1F6CA; [0D 23 53, 05, 05]
+1F698; [0D 26 AA, 05, 05]
-1F6CB; [0D 23 5A, 05, 05]
+1F699; [0D 26 B1, 05, 05]
-1F6CC; [0D 23 61, 05, 05]
+1F69A; [0D 26 B8, 05, 05]
-1F6CD; [0D 23 68, 05, 05]
+1F69B; [0D 26 BF, 05, 05]
-1F6CE; [0D 23 6F, 05, 05]
+1F69C; [0D 26 C6, 05, 05]
-1F6CF; [0D 23 76, 05, 05]
+1F69D; [0D 26 CD, 05, 05]
-1F6D0; [0D 23 7D, 05, 05]
+1F69E; [0D 26 D4, 05, 05]
-1F6D1; [0D 23 84, 05, 05]
+1F69F; [0D 26 DB, 05, 05]
-1F6D2; [0D 23 8B, 05, 05]
+1F6A0; [0D 26 E2, 05, 05]
-1F6D3; [0D 23 92, 05, 05]
+1F6A1; [0D 26 E9, 05, 05]
-1F6D4; [0D 23 99, 05, 05]
+1F6A2; [0D 26 F0, 05, 05]
-1F6E0; [0D 23 A0, 05, 05]
+1F6A3; [0D 26 F7, 05, 05]
-1F6E1; [0D 23 A7, 05, 05]
+1F6A4; [0D 26 FE, 05, 05]
-1F6E2; [0D 23 AE, 05, 05]
+1F6A5; [0D 27 07, 05, 05]
-1F6E3; [0D 23 B5, 05, 05]
+1F6A6; [0D 27 0E, 05, 05]
-1F6E4; [0D 23 BC, 05, 05]
+1F6A7; [0D 27 15, 05, 05]
-1F6E5; [0D 23 C3, 05, 05]
+1F6A8; [0D 27 1C, 05, 05]
-1F6E6; [0D 23 CA, 05, 05]
+1F6A9; [0D 27 23, 05, 05]
-1F6E7; [0D 23 D1, 05, 05]
+1F6AA; [0D 27 2A, 05, 05]
-1F6E8; [0D 23 D8, 05, 05]
+1F6AB; [0D 27 31, 05, 05]
-1F6E9; [0D 23 DF, 05, 05]
+1F6AC; [0D 27 38, 05, 05]
-1F6EA; [0D 23 E6, 05, 05]
+1F6AD; [0D 27 3F, 05, 05]
-1F6EB; [0D 23 ED, 05, 05]
+1F6AE; [0D 27 46, 05, 05]
-1F6EC; [0D 23 F4, 05, 05]
+1F6AF; [0D 27 4D, 05, 05]
-1F6F0; [0D 23 FB, 05, 05]
+1F6B0; [0D 27 54, 05, 05]
-1F6F1; [0D 24 04, 05, 05]
+1F6B1; [0D 27 5B, 05, 05]
-1F6F2; [0D 24 0B, 05, 05]
+1F6B2; [0D 27 62, 05, 05]
-1F6F3; [0D 24 12, 05, 05]
+1F6B3; [0D 27 69, 05, 05]
-1F6F4; [0D 24 19, 05, 05]
+1F6B4; [0D 27 70, 05, 05]
-1F6F5; [0D 24 20, 05, 05]
+1F6B5; [0D 27 77, 05, 05]
-1F6F6; [0D 24 27, 05, 05]
+1F6B6; [0D 27 7E, 05, 05]
-1F6F7; [0D 24 2E, 05, 05]
+1F6B7; [0D 27 85, 05, 05]
-1F6F8; [0D 24 35, 05, 05]
+1F6B8; [0D 27 8C, 05, 05]
-1F6F9; [0D 24 3C, 05, 05]
+1F6B9; [0D 27 93, 05, 05]
-1F700; [0D 24 43, 05, 05]
+1F6BA; [0D 27 9A, 05, 05]
-1F701; [0D 24 4A, 05, 05]
+1F6BB; [0D 27 A1, 05, 05]
-1F702; [0D 24 51, 05, 05]
+1F6BC; [0D 27 A8, 05, 05]
-1F703; [0D 24 58, 05, 05]
+1F6BD; [0D 27 AF, 05, 05]
-1F704; [0D 24 5F, 05, 05]
+1F6BE; [0D 27 B6, 05, 05]
-1F705; [0D 24 66, 05, 05]
+1F6BF; [0D 27 BD, 05, 05]
-1F706; [0D 24 6D, 05, 05]
+1F6C0; [0D 27 C4, 05, 05]
-1F707; [0D 24 74, 05, 05]
+1F6C1; [0D 27 CB, 05, 05]
-1F708; [0D 24 7B, 05, 05]
+1F6C2; [0D 27 D2, 05, 05]
-1F709; [0D 24 82, 05, 05]
+1F6C3; [0D 27 D9, 05, 05]
-1F70A; [0D 24 89, 05, 05]
+1F6C4; [0D 27 E0, 05, 05]
-1F70B; [0D 24 90, 05, 05]
+1F6C5; [0D 27 E7, 05, 05]
-1F70C; [0D 24 97, 05, 05]
+1F6C6; [0D 27 EE, 05, 05]
-1F70D; [0D 24 9E, 05, 05]
+1F6C7; [0D 27 F5, 05, 05]
-1F70E; [0D 24 A5, 05, 05]
+1F6C8; [0D 27 FC, 05, 05]
-1F70F; [0D 24 AC, 05, 05]
+1F6C9; [0D 28 05, 05, 05]
-1F710; [0D 24 B3, 05, 05]
+1F6CA; [0D 28 0C, 05, 05]
-1F711; [0D 24 BA, 05, 05]
+1F6CB; [0D 28 13, 05, 05]
-1F712; [0D 24 C1, 05, 05]
+1F6CC; [0D 28 1A, 05, 05]
-1F713; [0D 24 C8, 05, 05]
+1F6CD; [0D 28 21, 05, 05]
-1F714; [0D 24 CF, 05, 05]
+1F6CE; [0D 28 28, 05, 05]
-1F715; [0D 24 D6, 05, 05]
+1F6CF; [0D 28 2F, 05, 05]
-1F716; [0D 24 DD, 05, 05]
+1F6D0; [0D 28 36, 05, 05]
-1F717; [0D 24 E4, 05, 05]
+1F6D1; [0D 28 3D, 05, 05]
-1F718; [0D 24 EB, 05, 05]
+1F6D2; [0D 28 44, 05, 05]
-1F719; [0D 24 F2, 05, 05]
+1F6D3; [0D 28 4B, 05, 05]
-1F71A; [0D 24 F9, 05, 05]
+1F6D4; [0D 28 52, 05, 05]
-1F71B; [0D 25 02, 05, 05]
+1F6D5; [0D 28 59, 05, 05]
-1F71C; [0D 25 09, 05, 05]
+1F6E0; [0D 28 60, 05, 05]
-1F71D; [0D 25 10, 05, 05]
+1F6E1; [0D 28 67, 05, 05]
-1F71E; [0D 25 17, 05, 05]
+1F6E2; [0D 28 6E, 05, 05]
-1F71F; [0D 25 1E, 05, 05]
+1F6E3; [0D 28 75, 05, 05]
-1F720; [0D 25 25, 05, 05]
+1F6E4; [0D 28 7C, 05, 05]
-1F721; [0D 25 2C, 05, 05]
+1F6E5; [0D 28 83, 05, 05]
-1F722; [0D 25 33, 05, 05]
+1F6E6; [0D 28 8A, 05, 05]
-1F723; [0D 25 3A, 05, 05]
+1F6E7; [0D 28 91, 05, 05]
-1F724; [0D 25 41, 05, 05]
+1F6E8; [0D 28 98, 05, 05]
-1F725; [0D 25 48, 05, 05]
+1F6E9; [0D 28 9F, 05, 05]
-1F726; [0D 25 4F, 05, 05]
+1F6EA; [0D 28 A6, 05, 05]
-1F727; [0D 25 56, 05, 05]
+1F6EB; [0D 28 AD, 05, 05]
-1F728; [0D 25 5D, 05, 05]
+1F6EC; [0D 28 B4, 05, 05]
-1F729; [0D 25 64, 05, 05]
+1F6F0; [0D 28 BB, 05, 05]
-1F72A; [0D 25 6B, 05, 05]
+1F6F1; [0D 28 C2, 05, 05]
-1F72B; [0D 25 72, 05, 05]
+1F6F2; [0D 28 C9, 05, 05]
-1F72C; [0D 25 79, 05, 05]
+1F6F3; [0D 28 D0, 05, 05]
-1F72D; [0D 25 80, 05, 05]
+1F6F4; [0D 28 D7, 05, 05]
-1F72E; [0D 25 87, 05, 05]
+1F6F5; [0D 28 DE, 05, 05]
-1F72F; [0D 25 8E, 05, 05]
+1F6F6; [0D 28 E5, 05, 05]
-1F730; [0D 25 95, 05, 05]
+1F6F7; [0D 28 EC, 05, 05]
-1F731; [0D 25 9C, 05, 05]
+1F6F8; [0D 28 F3, 05, 05]
-1F732; [0D 25 A3, 05, 05]
+1F6F9; [0D 28 FA, 05, 05]
-1F733; [0D 25 AA, 05, 05]
+1F6FA; [0D 29 03, 05, 05]
-1F734; [0D 25 B1, 05, 05]
+1F700; [0D 29 0A, 05, 05]
-1F735; [0D 25 B8, 05, 05]
+1F701; [0D 29 11, 05, 05]
-1F736; [0D 25 BF, 05, 05]
+1F702; [0D 29 18, 05, 05]
-1F737; [0D 25 C6, 05, 05]
+1F703; [0D 29 1F, 05, 05]
-1F738; [0D 25 CD, 05, 05]
+1F704; [0D 29 26, 05, 05]
-1F739; [0D 25 D4, 05, 05]
+1F705; [0D 29 2D, 05, 05]
-1F73A; [0D 25 DB, 05, 05]
+1F706; [0D 29 34, 05, 05]
-1F73B; [0D 25 E2, 05, 05]
+1F707; [0D 29 3B, 05, 05]
-1F73C; [0D 25 E9, 05, 05]
+1F708; [0D 29 42, 05, 05]
-1F73D; [0D 25 F0, 05, 05]
+1F709; [0D 29 49, 05, 05]
-1F73E; [0D 25 F7, 05, 05]
+1F70A; [0D 29 50, 05, 05]
-1F73F; [0D 25 FE, 05, 05]
+1F70B; [0D 29 57, 05, 05]
-1F740; [0D 26 07, 05, 05]
+1F70C; [0D 29 5E, 05, 05]
-1F741; [0D 26 0E, 05, 05]
+1F70D; [0D 29 65, 05, 05]
-1F742; [0D 26 15, 05, 05]
+1F70E; [0D 29 6C, 05, 05]
-1F743; [0D 26 1C, 05, 05]
+1F70F; [0D 29 73, 05, 05]
-1F744; [0D 26 23, 05, 05]
+1F710; [0D 29 7A, 05, 05]
-1F745; [0D 26 2A, 05, 05]
+1F711; [0D 29 81, 05, 05]
-1F746; [0D 26 31, 05, 05]
+1F712; [0D 29 88, 05, 05]
-1F747; [0D 26 38, 05, 05]
+1F713; [0D 29 8F, 05, 05]
-1F748; [0D 26 3F, 05, 05]
+1F714; [0D 29 96, 05, 05]
-1F749; [0D 26 46, 05, 05]
+1F715; [0D 29 9D, 05, 05]
-1F74A; [0D 26 4D, 05, 05]
+1F716; [0D 29 A4, 05, 05]
-1F74B; [0D 26 54, 05, 05]
+1F717; [0D 29 AB, 05, 05]
-1F74C; [0D 26 5B, 05, 05]
+1F718; [0D 29 B2, 05, 05]
-1F74D; [0D 26 62, 05, 05]
+1F719; [0D 29 B9, 05, 05]
-1F74E; [0D 26 69, 05, 05]
+1F71A; [0D 29 C0, 05, 05]
-1F74F; [0D 26 70, 05, 05]
+1F71B; [0D 29 C7, 05, 05]
-1F750; [0D 26 77, 05, 05]
+1F71C; [0D 29 CE, 05, 05]
-1F751; [0D 26 7E, 05, 05]
+1F71D; [0D 29 D5, 05, 05]
-1F752; [0D 26 85, 05, 05]
+1F71E; [0D 29 DC, 05, 05]
-1F753; [0D 26 8C, 05, 05]
+1F71F; [0D 29 E3, 05, 05]
-1F754; [0D 26 93, 05, 05]
+1F720; [0D 29 EA, 05, 05]
-1F755; [0D 26 9A, 05, 05]
+1F721; [0D 29 F1, 05, 05]
-1F756; [0D 26 A1, 05, 05]
+1F722; [0D 29 F8, 05, 05]
-1F757; [0D 26 A8, 05, 05]
+1F723; [0D 29 FF, 05, 05]
-1F758; [0D 26 AF, 05, 05]
+1F724; [0D 2A 08, 05, 05]
-1F759; [0D 26 B6, 05, 05]
+1F725; [0D 2A 0F, 05, 05]
-1F75A; [0D 26 BD, 05, 05]
+1F726; [0D 2A 16, 05, 05]
-1F75B; [0D 26 C4, 05, 05]
+1F727; [0D 2A 1D, 05, 05]
-1F75C; [0D 26 CB, 05, 05]
+1F728; [0D 2A 24, 05, 05]
-1F75D; [0D 26 D2, 05, 05]
+1F729; [0D 2A 2B, 05, 05]
-1F75E; [0D 26 D9, 05, 05]
+1F72A; [0D 2A 32, 05, 05]
-1F75F; [0D 26 E0, 05, 05]
+1F72B; [0D 2A 39, 05, 05]
-1F760; [0D 26 E7, 05, 05]
+1F72C; [0D 2A 40, 05, 05]
-1F761; [0D 26 EE, 05, 05]
+1F72D; [0D 2A 47, 05, 05]
-1F762; [0D 26 F5, 05, 05]
+1F72E; [0D 2A 4E, 05, 05]
-1F763; [0D 26 FC, 05, 05]
+1F72F; [0D 2A 55, 05, 05]
-1F764; [0D 27 05, 05, 05]
+1F730; [0D 2A 5C, 05, 05]
-1F765; [0D 27 0C, 05, 05]
+1F731; [0D 2A 63, 05, 05]
-1F766; [0D 27 13, 05, 05]
+1F732; [0D 2A 6A, 05, 05]
-1F767; [0D 27 1A, 05, 05]
+1F733; [0D 2A 71, 05, 05]
-1F768; [0D 27 21, 05, 05]
+1F734; [0D 2A 78, 05, 05]
-1F769; [0D 27 28, 05, 05]
+1F735; [0D 2A 7F, 05, 05]
-1F76A; [0D 27 2F, 05, 05]
+1F736; [0D 2A 86, 05, 05]
-1F76B; [0D 27 36, 05, 05]
+1F737; [0D 2A 8D, 05, 05]
-1F76C; [0D 27 3D, 05, 05]
+1F738; [0D 2A 94, 05, 05]
-1F76D; [0D 27 44, 05, 05]
+1F739; [0D 2A 9B, 05, 05]
-1F76E; [0D 27 4B, 05, 05]
+1F73A; [0D 2A A2, 05, 05]
-1F76F; [0D 27 52, 05, 05]
+1F73B; [0D 2A A9, 05, 05]
-1F770; [0D 27 59, 05, 05]
+1F73C; [0D 2A B0, 05, 05]
-1F771; [0D 27 60, 05, 05]
+1F73D; [0D 2A B7, 05, 05]
-1F772; [0D 27 67, 05, 05]
+1F73E; [0D 2A BE, 05, 05]
-1F773; [0D 27 6E, 05, 05]
+1F73F; [0D 2A C5, 05, 05]
-1F780; [0D 27 75, 05, 05]
+1F740; [0D 2A CC, 05, 05]
-1F781; [0D 27 7C, 05, 05]
+1F741; [0D 2A D3, 05, 05]
-1F782; [0D 27 83, 05, 05]
+1F742; [0D 2A DA, 05, 05]
-1F783; [0D 27 8A, 05, 05]
+1F743; [0D 2A E1, 05, 05]
-1F784; [0D 27 91, 05, 05]
+1F744; [0D 2A E8, 05, 05]
-1F785; [0D 27 98, 05, 05]
+1F745; [0D 2A EF, 05, 05]
-1F786; [0D 27 9F, 05, 05]
+1F746; [0D 2A F6, 05, 05]
-1F787; [0D 27 A6, 05, 05]
+1F747; [0D 2A FD, 05, 05]
-1F788; [0D 27 AD, 05, 05]
+1F748; [0D 2B 06, 05, 05]
-1F789; [0D 27 B4, 05, 05]
+1F749; [0D 2B 0D, 05, 05]
-1F78A; [0D 27 BB, 05, 05]
+1F74A; [0D 2B 14, 05, 05]
-1F78B; [0D 27 C2, 05, 05]
+1F74B; [0D 2B 1B, 05, 05]
-1F78C; [0D 27 C9, 05, 05]
+1F74C; [0D 2B 22, 05, 05]
-1F78D; [0D 27 D0, 05, 05]
+1F74D; [0D 2B 29, 05, 05]
-1F78E; [0D 27 D7, 05, 05]
+1F74E; [0D 2B 30, 05, 05]
-1F78F; [0D 27 DE, 05, 05]
+1F74F; [0D 2B 37, 05, 05]
-1F790; [0D 27 E5, 05, 05]
+1F750; [0D 2B 3E, 05, 05]
-1F791; [0D 27 EC, 05, 05]
+1F751; [0D 2B 45, 05, 05]
-1F792; [0D 27 F3, 05, 05]
+1F752; [0D 2B 4C, 05, 05]
-1F793; [0D 27 FA, 05, 05]
+1F753; [0D 2B 53, 05, 05]
-1F794; [0D 28 03, 05, 05]
+1F754; [0D 2B 5A, 05, 05]
-1F795; [0D 28 0A, 05, 05]
+1F755; [0D 2B 61, 05, 05]
-1F796; [0D 28 11, 05, 05]
+1F756; [0D 2B 68, 05, 05]
-1F797; [0D 28 18, 05, 05]
+1F757; [0D 2B 6F, 05, 05]
-1F798; [0D 28 1F, 05, 05]
+1F758; [0D 2B 76, 05, 05]
-1F799; [0D 28 26, 05, 05]
+1F759; [0D 2B 7D, 05, 05]
-1F79A; [0D 28 2D, 05, 05]
+1F75A; [0D 2B 84, 05, 05]
-1F79B; [0D 28 34, 05, 05]
+1F75B; [0D 2B 8B, 05, 05]
-1F79C; [0D 28 3B, 05, 05]
+1F75C; [0D 2B 92, 05, 05]
-1F79D; [0D 28 42, 05, 05]
+1F75D; [0D 2B 99, 05, 05]
-1F79E; [0D 28 49, 05, 05]
+1F75E; [0D 2B A0, 05, 05]
-1F79F; [0D 28 50, 05, 05]
+1F75F; [0D 2B A7, 05, 05]
-1F7A0; [0D 28 57, 05, 05]
+1F760; [0D 2B AE, 05, 05]
-1F7A1; [0D 28 5E, 05, 05]
+1F761; [0D 2B B5, 05, 05]
-1F7A2; [0D 28 65, 05, 05]
+1F762; [0D 2B BC, 05, 05]
-1F7A3; [0D 28 6C, 05, 05]
+1F763; [0D 2B C3, 05, 05]
-1F7A4; [0D 28 73, 05, 05]
+1F764; [0D 2B CA, 05, 05]
-1F7A5; [0D 28 7A, 05, 05]
+1F765; [0D 2B D1, 05, 05]
-1F7A6; [0D 28 81, 05, 05]
+1F766; [0D 2B D8, 05, 05]
-1F7A7; [0D 28 88, 05, 05]
+1F767; [0D 2B DF, 05, 05]
-1F7A8; [0D 28 8F, 05, 05]
+1F768; [0D 2B E6, 05, 05]
-1F7A9; [0D 28 96, 05, 05]
+1F769; [0D 2B ED, 05, 05]
-1F7AA; [0D 28 9D, 05, 05]
+1F76A; [0D 2B F4, 05, 05]
-1F7AB; [0D 28 A4, 05, 05]
+1F76B; [0D 2B FB, 05, 05]
-1F7AC; [0D 28 AB, 05, 05]
+1F76C; [0D 2C 04, 05, 05]
-1F7AD; [0D 28 B2, 05, 05]
+1F76D; [0D 2C 0B, 05, 05]
-1F7AE; [0D 28 B9, 05, 05]
+1F76E; [0D 2C 12, 05, 05]
-1F7AF; [0D 28 C0, 05, 05]
+1F76F; [0D 2C 19, 05, 05]
-1F7B0; [0D 28 C7, 05, 05]
+1F770; [0D 2C 20, 05, 05]
-1F7B1; [0D 28 CE, 05, 05]
+1F771; [0D 2C 27, 05, 05]
-1F7B2; [0D 28 D5, 05, 05]
+1F772; [0D 2C 2E, 05, 05]
-1F7B3; [0D 28 DC, 05, 05]
+1F773; [0D 2C 35, 05, 05]
-1F7B4; [0D 28 E3, 05, 05]
+1F780; [0D 2C 3C, 05, 05]
-1F7B5; [0D 28 EA, 05, 05]
+1F781; [0D 2C 43, 05, 05]
-1F7B6; [0D 28 F1, 05, 05]
+1F782; [0D 2C 4A, 05, 05]
-1F7B7; [0D 28 F8, 05, 05]
+1F783; [0D 2C 51, 05, 05]
-1F7B8; [0D 28 FF, 05, 05]
+1F784; [0D 2C 58, 05, 05]
-1F7B9; [0D 29 08, 05, 05]
+1F785; [0D 2C 5F, 05, 05]
-1F7BA; [0D 29 0F, 05, 05]
+1F786; [0D 2C 66, 05, 05]
-1F7BB; [0D 29 16, 05, 05]
+1F787; [0D 2C 6D, 05, 05]
-1F7BC; [0D 29 1D, 05, 05]
+1F788; [0D 2C 74, 05, 05]
-1F7BD; [0D 29 24, 05, 05]
+1F789; [0D 2C 7B, 05, 05]
-1F7BE; [0D 29 2B, 05, 05]
+1F78A; [0D 2C 82, 05, 05]
-1F7BF; [0D 29 32, 05, 05]
+1F78B; [0D 2C 89, 05, 05]
-1F7C0; [0D 29 39, 05, 05]
+1F78C; [0D 2C 90, 05, 05]
-1F7C1; [0D 29 40, 05, 05]
+1F78D; [0D 2C 97, 05, 05]
-1F7C2; [0D 29 47, 05, 05]
+1F78E; [0D 2C 9E, 05, 05]
-1F7C3; [0D 29 4E, 05, 05]
+1F78F; [0D 2C A5, 05, 05]
-1F7C4; [0D 29 55, 05, 05]
+1F790; [0D 2C AC, 05, 05]
-1F7C5; [0D 29 5C, 05, 05]
+1F791; [0D 2C B3, 05, 05]
-1F7C6; [0D 29 63, 05, 05]
+1F792; [0D 2C BA, 05, 05]
-1F7C7; [0D 29 6A, 05, 05]
+1F793; [0D 2C C1, 05, 05]
-1F7C8; [0D 29 71, 05, 05]
+1F794; [0D 2C C8, 05, 05]
-1F7C9; [0D 29 78, 05, 05]
+1F795; [0D 2C CF, 05, 05]
-1F7CA; [0D 29 7F, 05, 05]
+1F796; [0D 2C D6, 05, 05]
-1F7CB; [0D 29 86, 05, 05]
+1F797; [0D 2C DD, 05, 05]
-1F7CC; [0D 29 8D, 05, 05]
+1F798; [0D 2C E4, 05, 05]
-1F7CD; [0D 29 94, 05, 05]
+1F799; [0D 2C EB, 05, 05]
-1F7CE; [0D 29 9B, 05, 05]
+1F79A; [0D 2C F2, 05, 05]
-1F7CF; [0D 29 A2, 05, 05]
+1F79B; [0D 2C F9, 05, 05]
-1F7D0; [0D 29 A9, 05, 05]
+1F79C; [0D 2D 02, 05, 05]
-1F7D1; [0D 29 B0, 05, 05]
+1F79D; [0D 2D 09, 05, 05]
-1F7D2; [0D 29 B7, 05, 05]
+1F79E; [0D 2D 10, 05, 05]
-1F7D3; [0D 29 BE, 05, 05]
+1F79F; [0D 2D 17, 05, 05]
-1F7D4; [0D 29 C5, 05, 05]
+1F7A0; [0D 2D 1E, 05, 05]
-1F7D5; [0D 29 CC, 05, 05]
+1F7A1; [0D 2D 25, 05, 05]
-1F7D6; [0D 29 D3, 05, 05]
+1F7A2; [0D 2D 2C, 05, 05]
-1F7D7; [0D 29 DA, 05, 05]
+1F7A3; [0D 2D 33, 05, 05]
-1F7D8; [0D 29 E1, 05, 05]
+1F7A4; [0D 2D 3A, 05, 05]
-1F800; [0D 29 E8, 05, 05]
+1F7A5; [0D 2D 41, 05, 05]
-1F801; [0D 29 EF, 05, 05]
+1F7A6; [0D 2D 48, 05, 05]
-1F802; [0D 29 F6, 05, 05]
+1F7A7; [0D 2D 4F, 05, 05]
-1F803; [0D 29 FD, 05, 05]
+1F7A8; [0D 2D 56, 05, 05]
-1F804; [0D 2A 06, 05, 05]
+1F7A9; [0D 2D 5D, 05, 05]
-1F805; [0D 2A 0D, 05, 05]
+1F7AA; [0D 2D 64, 05, 05]
-1F806; [0D 2A 14, 05, 05]
+1F7AB; [0D 2D 6B, 05, 05]
-1F807; [0D 2A 1B, 05, 05]
+1F7AC; [0D 2D 72, 05, 05]
-1F808; [0D 2A 22, 05, 05]
+1F7AD; [0D 2D 79, 05, 05]
-1F809; [0D 2A 29, 05, 05]
+1F7AE; [0D 2D 80, 05, 05]
-1F80A; [0D 2A 30, 05, 05]
+1F7AF; [0D 2D 87, 05, 05]
-1F80B; [0D 2A 37, 05, 05]
+1F7B0; [0D 2D 8E, 05, 05]
-1F810; [0D 2A 3E, 05, 05]
+1F7B1; [0D 2D 95, 05, 05]
-1F811; [0D 2A 45, 05, 05]
+1F7B2; [0D 2D 9C, 05, 05]
-1F812; [0D 2A 4C, 05, 05]
+1F7B3; [0D 2D A3, 05, 05]
-1F813; [0D 2A 53, 05, 05]
+1F7B4; [0D 2D AA, 05, 05]
-1F814; [0D 2A 5A, 05, 05]
+1F7B5; [0D 2D B1, 05, 05]
-1F815; [0D 2A 61, 05, 05]
+1F7B6; [0D 2D B8, 05, 05]
-1F816; [0D 2A 68, 05, 05]
+1F7B7; [0D 2D BF, 05, 05]
-1F817; [0D 2A 6F, 05, 05]
+1F7B8; [0D 2D C6, 05, 05]
-1F818; [0D 2A 76, 05, 05]
+1F7B9; [0D 2D CD, 05, 05]
-1F819; [0D 2A 7D, 05, 05]
+1F7BA; [0D 2D D4, 05, 05]
-1F81A; [0D 2A 84, 05, 05]
+1F7BB; [0D 2D DB, 05, 05]
-1F81B; [0D 2A 8B, 05, 05]
+1F7BC; [0D 2D E2, 05, 05]
-1F81C; [0D 2A 92, 05, 05]
+1F7BD; [0D 2D E9, 05, 05]
-1F81D; [0D 2A 99, 05, 05]
+1F7BE; [0D 2D F0, 05, 05]
-1F81E; [0D 2A A0, 05, 05]
+1F7BF; [0D 2D F7, 05, 05]
-1F81F; [0D 2A A7, 05, 05]
+1F7C0; [0D 2D FE, 05, 05]
-1F820; [0D 2A AE, 05, 05]
+1F7C1; [0D 2E 07, 05, 05]
-1F821; [0D 2A B5, 05, 05]
+1F7C2; [0D 2E 0E, 05, 05]
-1F822; [0D 2A BC, 05, 05]
+1F7C3; [0D 2E 15, 05, 05]
-1F823; [0D 2A C3, 05, 05]
+1F7C4; [0D 2E 1C, 05, 05]
-1F824; [0D 2A CA, 05, 05]
+1F7C5; [0D 2E 23, 05, 05]
-1F825; [0D 2A D1, 05, 05]
+1F7C6; [0D 2E 2A, 05, 05]
-1F826; [0D 2A D8, 05, 05]
+1F7C7; [0D 2E 31, 05, 05]
-1F827; [0D 2A DF, 05, 05]
+1F7C8; [0D 2E 38, 05, 05]
-1F828; [0D 2A E6, 05, 05]
+1F7C9; [0D 2E 3F, 05, 05]
-1F829; [0D 2A ED, 05, 05]
+1F7CA; [0D 2E 46, 05, 05]
-1F82A; [0D 2A F4, 05, 05]
+1F7CB; [0D 2E 4D, 05, 05]
-1F82B; [0D 2A FB, 05, 05]
+1F7CC; [0D 2E 54, 05, 05]
-1F82C; [0D 2B 04, 05, 05]
+1F7CD; [0D 2E 5B, 05, 05]
-1F82D; [0D 2B 0B, 05, 05]
+1F7CE; [0D 2E 62, 05, 05]
-1F82E; [0D 2B 12, 05, 05]
+1F7CF; [0D 2E 69, 05, 05]
-1F82F; [0D 2B 19, 05, 05]
+1F7D0; [0D 2E 70, 05, 05]
-1F830; [0D 2B 20, 05, 05]
+1F7D1; [0D 2E 77, 05, 05]
-1F831; [0D 2B 27, 05, 05]
+1F7D2; [0D 2E 7E, 05, 05]
-1F832; [0D 2B 2E, 05, 05]
+1F7D3; [0D 2E 85, 05, 05]
-1F833; [0D 2B 35, 05, 05]
+1F7D4; [0D 2E 8C, 05, 05]
-1F834; [0D 2B 3C, 05, 05]
+1F7D5; [0D 2E 93, 05, 05]
-1F835; [0D 2B 43, 05, 05]
+1F7D6; [0D 2E 9A, 05, 05]
-1F836; [0D 2B 4A, 05, 05]
+1F7D7; [0D 2E A1, 05, 05]
-1F837; [0D 2B 51, 05, 05]
+1F7D8; [0D 2E A8, 05, 05]
-1F838; [0D 2B 58, 05, 05]
+1F7E0; [0D 2E AF, 05, 05]
-1F839; [0D 2B 5F, 05, 05]
+1F7E1; [0D 2E B6, 05, 05]
-1F83A; [0D 2B 66, 05, 05]
+1F7E2; [0D 2E BD, 05, 05]
-1F83B; [0D 2B 6D, 05, 05]
+1F7E3; [0D 2E C4, 05, 05]
-1F83C; [0D 2B 74, 05, 05]
+1F7E4; [0D 2E CB, 05, 05]
-1F83D; [0D 2B 7B, 05, 05]
+1F7E5; [0D 2E D2, 05, 05]
-1F83E; [0D 2B 82, 05, 05]
+1F7E6; [0D 2E D9, 05, 05]
-1F83F; [0D 2B 89, 05, 05]
+1F7E7; [0D 2E E0, 05, 05]
-1F840; [0D 2B 90, 05, 05]
+1F7E8; [0D 2E E7, 05, 05]
-1F841; [0D 2B 97, 05, 05]
+1F7E9; [0D 2E EE, 05, 05]
-1F842; [0D 2B 9E, 05, 05]
+1F7EA; [0D 2E F5, 05, 05]
-1F843; [0D 2B A5, 05, 05]
+1F7EB; [0D 2E FC, 05, 05]
-1F844; [0D 2B AC, 05, 05]
+1F800; [0D 2F 05, 05, 05]
-1F845; [0D 2B B3, 05, 05]
+1F801; [0D 2F 0C, 05, 05]
-1F846; [0D 2B BA, 05, 05]
+1F802; [0D 2F 13, 05, 05]
-1F847; [0D 2B C1, 05, 05]
+1F803; [0D 2F 1A, 05, 05]
-1F850; [0D 2B C8, 05, 05]
+1F804; [0D 2F 21, 05, 05]
-1F851; [0D 2B CF, 05, 05]
+1F805; [0D 2F 28, 05, 05]
-1F852; [0D 2B D6, 05, 05]
+1F806; [0D 2F 2F, 05, 05]
-1F853; [0D 2B DD, 05, 05]
+1F807; [0D 2F 36, 05, 05]
-1F854; [0D 2B E4, 05, 05]
+1F808; [0D 2F 3D, 05, 05]
-1F855; [0D 2B EB, 05, 05]
+1F809; [0D 2F 44, 05, 05]
-1F856; [0D 2B F2, 05, 05]
+1F80A; [0D 2F 4B, 05, 05]
-1F857; [0D 2B F9, 05, 05]
+1F80B; [0D 2F 52, 05, 05]
-1F858; [0D 2C 02, 05, 05]
+1F810; [0D 2F 59, 05, 05]
-1F859; [0D 2C 09, 05, 05]
+1F811; [0D 2F 60, 05, 05]
-1F860; [0D 2C 10, 05, 05]
+1F812; [0D 2F 67, 05, 05]
-1F861; [0D 2C 17, 05, 05]
+1F813; [0D 2F 6E, 05, 05]
-1F862; [0D 2C 1E, 05, 05]
+1F814; [0D 2F 75, 05, 05]
-1F863; [0D 2C 25, 05, 05]
+1F815; [0D 2F 7C, 05, 05]
-1F864; [0D 2C 2C, 05, 05]
+1F816; [0D 2F 83, 05, 05]
-1F865; [0D 2C 33, 05, 05]
+1F817; [0D 2F 8A, 05, 05]
-1F866; [0D 2C 3A, 05, 05]
+1F818; [0D 2F 91, 05, 05]
-1F867; [0D 2C 41, 05, 05]
+1F819; [0D 2F 98, 05, 05]
-1F868; [0D 2C 48, 05, 05]
+1F81A; [0D 2F 9F, 05, 05]
-1F869; [0D 2C 4F, 05, 05]
+1F81B; [0D 2F A6, 05, 05]
-1F86A; [0D 2C 56, 05, 05]
+1F81C; [0D 2F AD, 05, 05]
-1F86B; [0D 2C 5D, 05, 05]
+1F81D; [0D 2F B4, 05, 05]
-1F86C; [0D 2C 64, 05, 05]
+1F81E; [0D 2F BB, 05, 05]
-1F86D; [0D 2C 6B, 05, 05]
+1F81F; [0D 2F C2, 05, 05]
-1F86E; [0D 2C 72, 05, 05]
+1F820; [0D 2F C9, 05, 05]
-1F86F; [0D 2C 79, 05, 05]
+1F821; [0D 2F D0, 05, 05]
-1F870; [0D 2C 80, 05, 05]
+1F822; [0D 2F D7, 05, 05]
-1F871; [0D 2C 87, 05, 05]
+1F823; [0D 2F DE, 05, 05]
-1F872; [0D 2C 8E, 05, 05]
+1F824; [0D 2F E5, 05, 05]
-1F873; [0D 2C 95, 05, 05]
+1F825; [0D 2F EC, 05, 05]
-1F874; [0D 2C 9C, 05, 05]
+1F826; [0D 2F F3, 05, 05]
-1F875; [0D 2C A3, 05, 05]
+1F827; [0D 2F FA, 05, 05]
-1F876; [0D 2C AA, 05, 05]
+1F828; [0D 30 03, 05, 05]
-1F877; [0D 2C B1, 05, 05]
+1F829; [0D 30 0A, 05, 05]
-1F878; [0D 2C B8, 05, 05]
+1F82A; [0D 30 11, 05, 05]
-1F879; [0D 2C BF, 05, 05]
+1F82B; [0D 30 18, 05, 05]
-1F87A; [0D 2C C6, 05, 05]
+1F82C; [0D 30 1F, 05, 05]
-1F87B; [0D 2C CD, 05, 05]
+1F82D; [0D 30 26, 05, 05]
-1F87C; [0D 2C D4, 05, 05]
+1F82E; [0D 30 2D, 05, 05]
-1F87D; [0D 2C DB, 05, 05]
+1F82F; [0D 30 34, 05, 05]
-1F87E; [0D 2C E2, 05, 05]
+1F830; [0D 30 3B, 05, 05]
-1F87F; [0D 2C E9, 05, 05]
+1F831; [0D 30 42, 05, 05]
-1F880; [0D 2C F0, 05, 05]
+1F832; [0D 30 49, 05, 05]
-1F881; [0D 2C F7, 05, 05]
+1F833; [0D 30 50, 05, 05]
-1F882; [0D 2C FE, 05, 05]
+1F834; [0D 30 57, 05, 05]
-1F883; [0D 2D 07, 05, 05]
+1F835; [0D 30 5E, 05, 05]
-1F884; [0D 2D 0E, 05, 05]
+1F836; [0D 30 65, 05, 05]
-1F885; [0D 2D 15, 05, 05]
+1F837; [0D 30 6C, 05, 05]
-1F886; [0D 2D 1C, 05, 05]
+1F838; [0D 30 73, 05, 05]
-1F887; [0D 2D 23, 05, 05]
+1F839; [0D 30 7A, 05, 05]
-1F890; [0D 2D 2A, 05, 05]
+1F83A; [0D 30 81, 05, 05]
-1F891; [0D 2D 31, 05, 05]
+1F83B; [0D 30 88, 05, 05]
-1F892; [0D 2D 38, 05, 05]
+1F83C; [0D 30 8F, 05, 05]
-1F893; [0D 2D 3F, 05, 05]
+1F83D; [0D 30 96, 05, 05]
-1F894; [0D 2D 46, 05, 05]
+1F83E; [0D 30 9D, 05, 05]
-1F895; [0D 2D 4D, 05, 05]
+1F83F; [0D 30 A4, 05, 05]
-1F896; [0D 2D 54, 05, 05]
+1F840; [0D 30 AB, 05, 05]
-1F897; [0D 2D 5B, 05, 05]
+1F841; [0D 30 B2, 05, 05]
-1F898; [0D 2D 62, 05, 05]
+1F842; [0D 30 B9, 05, 05]
-1F899; [0D 2D 69, 05, 05]
+1F843; [0D 30 C0, 05, 05]
-1F89A; [0D 2D 70, 05, 05]
+1F844; [0D 30 C7, 05, 05]
-1F89B; [0D 2D 77, 05, 05]
+1F845; [0D 30 CE, 05, 05]
-1F89C; [0D 2D 7E, 05, 05]
+1F846; [0D 30 D5, 05, 05]
-1F89D; [0D 2D 85, 05, 05]
+1F847; [0D 30 DC, 05, 05]
-1F89E; [0D 2D 8C, 05, 05]
+1F850; [0D 30 E3, 05, 05]
-1F89F; [0D 2D 93, 05, 05]
+1F851; [0D 30 EA, 05, 05]
-1F8A0; [0D 2D 9A, 05, 05]
+1F852; [0D 30 F1, 05, 05]
-1F8A1; [0D 2D A1, 05, 05]
+1F853; [0D 30 F8, 05, 05]
-1F8A2; [0D 2D A8, 05, 05]
+1F854; [0D 30 FF, 05, 05]
-1F8A3; [0D 2D AF, 05, 05]
+1F855; [0D 31 08, 05, 05]
-1F8A4; [0D 2D B6, 05, 05]
+1F856; [0D 31 0F, 05, 05]
-1F8A5; [0D 2D BD, 05, 05]
+1F857; [0D 31 16, 05, 05]
-1F8A6; [0D 2D C4, 05, 05]
+1F858; [0D 31 1D, 05, 05]
-1F8A7; [0D 2D CB, 05, 05]
+1F859; [0D 31 24, 05, 05]
-1F8A8; [0D 2D D2, 05, 05]
+1F860; [0D 31 2B, 05, 05]
-1F8A9; [0D 2D D9, 05, 05]
+1F861; [0D 31 32, 05, 05]
-1F8AA; [0D 2D E0, 05, 05]
+1F862; [0D 31 39, 05, 05]
-1F8AB; [0D 2D E7, 05, 05]
+1F863; [0D 31 40, 05, 05]
-1F8AC; [0D 2D EE, 05, 05]
+1F864; [0D 31 47, 05, 05]
-1F8AD; [0D 2D F5, 05, 05]
+1F865; [0D 31 4E, 05, 05]
-1D800; [0D 2D FC, 05, 05]
+1F866; [0D 31 55, 05, 05]
-1D801; [0D 2E 05, 05, 05]
+1F867; [0D 31 5C, 05, 05]
-1D802; [0D 2E 0C, 05, 05]
+1F868; [0D 31 63, 05, 05]
-1D803; [0D 2E 13, 05, 05]
+1F869; [0D 31 6A, 05, 05]
-1D804; [0D 2E 1A, 05, 05]
+1F86A; [0D 31 71, 05, 05]
-1D805; [0D 2E 21, 05, 05]
+1F86B; [0D 31 78, 05, 05]
-1D806; [0D 2E 28, 05, 05]
+1F86C; [0D 31 7F, 05, 05]
-1D807; [0D 2E 2F, 05, 05]
+1F86D; [0D 31 86, 05, 05]
-1D808; [0D 2E 36, 05, 05]
+1F86E; [0D 31 8D, 05, 05]
-1D809; [0D 2E 3D, 05, 05]
+1F86F; [0D 31 94, 05, 05]
-1D80A; [0D 2E 44, 05, 05]
+1F870; [0D 31 9B, 05, 05]
-1D80B; [0D 2E 4B, 05, 05]
+1F871; [0D 31 A2, 05, 05]
-1D80C; [0D 2E 52, 05, 05]
+1F872; [0D 31 A9, 05, 05]
-1D80D; [0D 2E 59, 05, 05]
+1F873; [0D 31 B0, 05, 05]
-1D80E; [0D 2E 60, 05, 05]
+1F874; [0D 31 B7, 05, 05]
-1D80F; [0D 2E 67, 05, 05]
+1F875; [0D 31 BE, 05, 05]
-1D810; [0D 2E 6E, 05, 05]
+1F876; [0D 31 C5, 05, 05]
-1D811; [0D 2E 75, 05, 05]
+1F877; [0D 31 CC, 05, 05]
-1D812; [0D 2E 7C, 05, 05]
+1F878; [0D 31 D3, 05, 05]
-1D813; [0D 2E 83, 05, 05]
+1F879; [0D 31 DA, 05, 05]
-1D814; [0D 2E 8A, 05, 05]
+1F87A; [0D 31 E1, 05, 05]
-1D815; [0D 2E 91, 05, 05]
+1F87B; [0D 31 E8, 05, 05]
-1D816; [0D 2E 98, 05, 05]
+1F87C; [0D 31 EF, 05, 05]
-1D817; [0D 2E 9F, 05, 05]
+1F87D; [0D 31 F6, 05, 05]
-1D818; [0D 2E A6, 05, 05]
+1F87E; [0D 31 FD, 05, 05]
-1D819; [0D 2E AD, 05, 05]
+1F87F; [0D 32 06, 05, 05]
-1D81A; [0D 2E B4, 05, 05]
+1F880; [0D 32 0D, 05, 05]
-1D81B; [0D 2E BB, 05, 05]
+1F881; [0D 32 14, 05, 05]
-1D81C; [0D 2E C2, 05, 05]
+1F882; [0D 32 1B, 05, 05]
-1D81D; [0D 2E C9, 05, 05]
+1F883; [0D 32 22, 05, 05]
-1D81E; [0D 2E D0, 05, 05]
+1F884; [0D 32 29, 05, 05]
-1D81F; [0D 2E D7, 05, 05]
+1F885; [0D 32 30, 05, 05]
-1D820; [0D 2E DE, 05, 05]
+1F886; [0D 32 37, 05, 05]
-1D821; [0D 2E E5, 05, 05]
+1F887; [0D 32 3E, 05, 05]
-1D822; [0D 2E EC, 05, 05]
+1F890; [0D 32 45, 05, 05]
-1D823; [0D 2E F3, 05, 05]
+1F891; [0D 32 4C, 05, 05]
-1D824; [0D 2E FA, 05, 05]
+1F892; [0D 32 53, 05, 05]
-1D825; [0D 2F 03, 05, 05]
+1F893; [0D 32 5A, 05, 05]
-1D826; [0D 2F 0A, 05, 05]
+1F894; [0D 32 61, 05, 05]
-1D827; [0D 2F 11, 05, 05]
+1F895; [0D 32 68, 05, 05]
-1D828; [0D 2F 18, 05, 05]
+1F896; [0D 32 6F, 05, 05]
-1D829; [0D 2F 1F, 05, 05]
+1F897; [0D 32 76, 05, 05]
-1D82A; [0D 2F 26, 05, 05]
+1F898; [0D 32 7D, 05, 05]
-1D82B; [0D 2F 2D, 05, 05]
+1F899; [0D 32 84, 05, 05]
-1D82C; [0D 2F 34, 05, 05]
+1F89A; [0D 32 8B, 05, 05]
-1D82D; [0D 2F 3B, 05, 05]
+1F89B; [0D 32 92, 05, 05]
-1D82E; [0D 2F 42, 05, 05]
+1F89C; [0D 32 99, 05, 05]
-1D82F; [0D 2F 49, 05, 05]
+1F89D; [0D 32 A0, 05, 05]
-1D830; [0D 2F 50, 05, 05]
+1F89E; [0D 32 A7, 05, 05]
-1D831; [0D 2F 57, 05, 05]
+1F89F; [0D 32 AE, 05, 05]
-1D832; [0D 2F 5E, 05, 05]
+1F8A0; [0D 32 B5, 05, 05]
-1D833; [0D 2F 65, 05, 05]
+1F8A1; [0D 32 BC, 05, 05]
-1D834; [0D 2F 6C, 05, 05]
+1F8A2; [0D 32 C3, 05, 05]
-1D835; [0D 2F 73, 05, 05]
+1F8A3; [0D 32 CA, 05, 05]
-1D836; [0D 2F 7A, 05, 05]
+1F8A4; [0D 32 D1, 05, 05]
-1D837; [0D 2F 81, 05, 05]
+1F8A5; [0D 32 D8, 05, 05]
-1D838; [0D 2F 88, 05, 05]
+1F8A6; [0D 32 DF, 05, 05]
-1D839; [0D 2F 8F, 05, 05]
+1F8A7; [0D 32 E6, 05, 05]
-1D83A; [0D 2F 96, 05, 05]
+1F8A8; [0D 32 ED, 05, 05]
-1D83B; [0D 2F 9D, 05, 05]
+1F8A9; [0D 32 F4, 05, 05]
-1D83C; [0D 2F A4, 05, 05]
+1F8AA; [0D 32 FB, 05, 05]
-1D83D; [0D 2F AB, 05, 05]
+1F8AB; [0D 33 04, 05, 05]
-1D83E; [0D 2F B2, 05, 05]
+1F8AC; [0D 33 0B, 05, 05]
-1D83F; [0D 2F B9, 05, 05]
+1F8AD; [0D 33 12, 05, 05]
-1D840; [0D 2F C0, 05, 05]
+1D800; [0D 33 19, 05, 05]
-1D841; [0D 2F C7, 05, 05]
+1D801; [0D 33 20, 05, 05]
-1D842; [0D 2F CE, 05, 05]
+1D802; [0D 33 27, 05, 05]
-1D843; [0D 2F D5, 05, 05]
+1D803; [0D 33 2E, 05, 05]
-1D844; [0D 2F DC, 05, 05]
+1D804; [0D 33 35, 05, 05]
-1D845; [0D 2F E3, 05, 05]
+1D805; [0D 33 3C, 05, 05]
-1D846; [0D 2F EA, 05, 05]
+1D806; [0D 33 43, 05, 05]
-1D847; [0D 2F F1, 05, 05]
+1D807; [0D 33 4A, 05, 05]
-1D848; [0D 2F F8, 05, 05]
+1D808; [0D 33 51, 05, 05]
-1D849; [0D 2F FF, 05, 05]
+1D809; [0D 33 58, 05, 05]
-1D84A; [0D 30 08, 05, 05]
+1D80A; [0D 33 5F, 05, 05]
-1D84B; [0D 30 0F, 05, 05]
+1D80B; [0D 33 66, 05, 05]
-1D84C; [0D 30 16, 05, 05]
+1D80C; [0D 33 6D, 05, 05]
-1D84D; [0D 30 1D, 05, 05]
+1D80D; [0D 33 74, 05, 05]
-1D84E; [0D 30 24, 05, 05]
+1D80E; [0D 33 7B, 05, 05]
-1D84F; [0D 30 2B, 05, 05]
+1D80F; [0D 33 82, 05, 05]
-1D850; [0D 30 32, 05, 05]
+1D810; [0D 33 89, 05, 05]
-1D851; [0D 30 39, 05, 05]
+1D811; [0D 33 90, 05, 05]
-1D852; [0D 30 40, 05, 05]
+1D812; [0D 33 97, 05, 05]
-1D853; [0D 30 47, 05, 05]
+1D813; [0D 33 9E, 05, 05]
-1D854; [0D 30 4E, 05, 05]
+1D814; [0D 33 A5, 05, 05]
-1D855; [0D 30 55, 05, 05]
+1D815; [0D 33 AC, 05, 05]
-1D856; [0D 30 5C, 05, 05]
+1D816; [0D 33 B3, 05, 05]
-1D857; [0D 30 63, 05, 05]
+1D817; [0D 33 BA, 05, 05]
-1D858; [0D 30 6A, 05, 05]
+1D818; [0D 33 C1, 05, 05]
-1D859; [0D 30 71, 05, 05]
+1D819; [0D 33 C8, 05, 05]
-1D85A; [0D 30 78, 05, 05]
+1D81A; [0D 33 CF, 05, 05]
-1D85B; [0D 30 7F, 05, 05]
+1D81B; [0D 33 D6, 05, 05]
-1D85C; [0D 30 86, 05, 05]
+1D81C; [0D 33 DD, 05, 05]
-1D85D; [0D 30 8D, 05, 05]
+1D81D; [0D 33 E4, 05, 05]
-1D85E; [0D 30 94, 05, 05]
+1D81E; [0D 33 EB, 05, 05]
-1D85F; [0D 30 9B, 05, 05]
+1D81F; [0D 33 F2, 05, 05]
-1D860; [0D 30 A2, 05, 05]
+1D820; [0D 33 F9, 05, 05]
-1D861; [0D 30 A9, 05, 05]
+1D821; [0D 34 02, 05, 05]
-1D862; [0D 30 B0, 05, 05]
+1D822; [0D 34 09, 05, 05]
-1D863; [0D 30 B7, 05, 05]
+1D823; [0D 34 10, 05, 05]
-1D864; [0D 30 BE, 05, 05]
+1D824; [0D 34 17, 05, 05]
-1D865; [0D 30 C5, 05, 05]
+1D825; [0D 34 1E, 05, 05]
-1D866; [0D 30 CC, 05, 05]
+1D826; [0D 34 25, 05, 05]
-1D867; [0D 30 D3, 05, 05]
+1D827; [0D 34 2C, 05, 05]
-1D868; [0D 30 DA, 05, 05]
+1D828; [0D 34 33, 05, 05]
-1D869; [0D 30 E1, 05, 05]
+1D829; [0D 34 3A, 05, 05]
-1D86A; [0D 30 E8, 05, 05]
+1D82A; [0D 34 41, 05, 05]
-1D86B; [0D 30 EF, 05, 05]
+1D82B; [0D 34 48, 05, 05]
-1D86C; [0D 30 F6, 05, 05]
+1D82C; [0D 34 4F, 05, 05]
-1D86D; [0D 30 FD, 05, 05]
+1D82D; [0D 34 56, 05, 05]
-1D86E; [0D 31 06, 05, 05]
+1D82E; [0D 34 5D, 05, 05]
-1D86F; [0D 31 0D, 05, 05]
+1D82F; [0D 34 64, 05, 05]
-1D870; [0D 31 14, 05, 05]
+1D830; [0D 34 6B, 05, 05]
-1D871; [0D 31 1B, 05, 05]
+1D831; [0D 34 72, 05, 05]
-1D872; [0D 31 22, 05, 05]
+1D832; [0D 34 79, 05, 05]
-1D873; [0D 31 29, 05, 05]
+1D833; [0D 34 80, 05, 05]
-1D874; [0D 31 30, 05, 05]
+1D834; [0D 34 87, 05, 05]
-1D875; [0D 31 37, 05, 05]
+1D835; [0D 34 8E, 05, 05]
-1D876; [0D 31 3E, 05, 05]
+1D836; [0D 34 95, 05, 05]
-1D877; [0D 31 45, 05, 05]
+1D837; [0D 34 9C, 05, 05]
-1D878; [0D 31 4C, 05, 05]
+1D838; [0D 34 A3, 05, 05]
-1D879; [0D 31 53, 05, 05]
+1D839; [0D 34 AA, 05, 05]
-1D87A; [0D 31 5A, 05, 05]
+1D83A; [0D 34 B1, 05, 05]
-1D87B; [0D 31 61, 05, 05]
+1D83B; [0D 34 B8, 05, 05]
-1D87C; [0D 31 68, 05, 05]
+1D83C; [0D 34 BF, 05, 05]
-1D87D; [0D 31 6F, 05, 05]
+1D83D; [0D 34 C6, 05, 05]
-1D87E; [0D 31 76, 05, 05]
+1D83E; [0D 34 CD, 05, 05]
-1D87F; [0D 31 7D, 05, 05]
+1D83F; [0D 34 D4, 05, 05]
-1D880; [0D 31 84, 05, 05]
+1D840; [0D 34 DB, 05, 05]
-1D881; [0D 31 8B, 05, 05]
+1D841; [0D 34 E2, 05, 05]
-1D882; [0D 31 92, 05, 05]
+1D842; [0D 34 E9, 05, 05]
-1D883; [0D 31 99, 05, 05]
+1D843; [0D 34 F0, 05, 05]
-1D884; [0D 31 A0, 05, 05]
+1D844; [0D 34 F7, 05, 05]
-1D885; [0D 31 A7, 05, 05]
+1D845; [0D 34 FE, 05, 05]
-1D886; [0D 31 AE, 05, 05]
+1D846; [0D 35 07, 05, 05]
-1D887; [0D 31 B5, 05, 05]
+1D847; [0D 35 0E, 05, 05]
-1D888; [0D 31 BC, 05, 05]
+1D848; [0D 35 15, 05, 05]
-1D889; [0D 31 C3, 05, 05]
+1D849; [0D 35 1C, 05, 05]
-1D88A; [0D 31 CA, 05, 05]
+1D84A; [0D 35 23, 05, 05]
-1D88B; [0D 31 D1, 05, 05]
+1D84B; [0D 35 2A, 05, 05]
-1D88C; [0D 31 D8, 05, 05]
+1D84C; [0D 35 31, 05, 05]
-1D88D; [0D 31 DF, 05, 05]
+1D84D; [0D 35 38, 05, 05]
-1D88E; [0D 31 E6, 05, 05]
+1D84E; [0D 35 3F, 05, 05]
-1D88F; [0D 31 ED, 05, 05]
+1D84F; [0D 35 46, 05, 05]
-1D890; [0D 31 F4, 05, 05]
+1D850; [0D 35 4D, 05, 05]
-1D891; [0D 31 FB, 05, 05]
+1D851; [0D 35 54, 05, 05]
-1D892; [0D 32 04, 05, 05]
+1D852; [0D 35 5B, 05, 05]
-1D893; [0D 32 0B, 05, 05]
+1D853; [0D 35 62, 05, 05]
-1D894; [0D 32 12, 05, 05]
+1D854; [0D 35 69, 05, 05]
-1D895; [0D 32 19, 05, 05]
+1D855; [0D 35 70, 05, 05]
-1D896; [0D 32 20, 05, 05]
+1D856; [0D 35 77, 05, 05]
-1D897; [0D 32 27, 05, 05]
+1D857; [0D 35 7E, 05, 05]
-1D898; [0D 32 2E, 05, 05]
+1D858; [0D 35 85, 05, 05]
-1D899; [0D 32 35, 05, 05]
+1D859; [0D 35 8C, 05, 05]
-1D89A; [0D 32 3C, 05, 05]
+1D85A; [0D 35 93, 05, 05]
-1D89B; [0D 32 43, 05, 05]
+1D85B; [0D 35 9A, 05, 05]
-1D89C; [0D 32 4A, 05, 05]
+1D85C; [0D 35 A1, 05, 05]
-1D89D; [0D 32 51, 05, 05]
+1D85D; [0D 35 A8, 05, 05]
-1D89E; [0D 32 58, 05, 05]
+1D85E; [0D 35 AF, 05, 05]
-1D89F; [0D 32 5F, 05, 05]
+1D85F; [0D 35 B6, 05, 05]
-1D8A0; [0D 32 66, 05, 05]
+1D860; [0D 35 BD, 05, 05]
-1D8A1; [0D 32 6D, 05, 05]
+1D861; [0D 35 C4, 05, 05]
-1D8A2; [0D 32 74, 05, 05]
+1D862; [0D 35 CB, 05, 05]
-1D8A3; [0D 32 7B, 05, 05]
+1D863; [0D 35 D2, 05, 05]
-1D8A4; [0D 32 82, 05, 05]
+1D864; [0D 35 D9, 05, 05]
-1D8A5; [0D 32 89, 05, 05]
+1D865; [0D 35 E0, 05, 05]
-1D8A6; [0D 32 90, 05, 05]
+1D866; [0D 35 E7, 05, 05]
-1D8A7; [0D 32 97, 05, 05]
+1D867; [0D 35 EE, 05, 05]
-1D8A8; [0D 32 9E, 05, 05]
+1D868; [0D 35 F5, 05, 05]
-1D8A9; [0D 32 A5, 05, 05]
+1D869; [0D 35 FC, 05, 05]
-1D8AA; [0D 32 AC, 05, 05]
+1D86A; [0D 36 05, 05, 05]
-1D8AB; [0D 32 B3, 05, 05]
+1D86B; [0D 36 0C, 05, 05]
-1D8AC; [0D 32 BA, 05, 05]
+1D86C; [0D 36 13, 05, 05]
-1D8AD; [0D 32 C1, 05, 05]
+1D86D; [0D 36 1A, 05, 05]
-1D8AE; [0D 32 C8, 05, 05]
+1D86E; [0D 36 21, 05, 05]
-1D8AF; [0D 32 CF, 05, 05]
+1D86F; [0D 36 28, 05, 05]
-1D8B0; [0D 32 D6, 05, 05]
+1D870; [0D 36 2F, 05, 05]
-1D8B1; [0D 32 DD, 05, 05]
+1D871; [0D 36 36, 05, 05]
-1D8B2; [0D 32 E4, 05, 05]
+1D872; [0D 36 3D, 05, 05]
-1D8B3; [0D 32 EB, 05, 05]
+1D873; [0D 36 44, 05, 05]
-1D8B4; [0D 32 F2, 05, 05]
+1D874; [0D 36 4B, 05, 05]
-1D8B5; [0D 32 F9, 05, 05]
+1D875; [0D 36 52, 05, 05]
-1D8B6; [0D 33 02, 05, 05]
+1D876; [0D 36 59, 05, 05]
-1D8B7; [0D 33 09, 05, 05]
+1D877; [0D 36 60, 05, 05]
-1D8B8; [0D 33 10, 05, 05]
+1D878; [0D 36 67, 05, 05]
-1D8B9; [0D 33 17, 05, 05]
+1D879; [0D 36 6E, 05, 05]
-1D8BA; [0D 33 1E, 05, 05]
+1D87A; [0D 36 75, 05, 05]
-1D8BB; [0D 33 25, 05, 05]
+1D87B; [0D 36 7C, 05, 05]
-1D8BC; [0D 33 2C, 05, 05]
+1D87C; [0D 36 83, 05, 05]
-1D8BD; [0D 33 33, 05, 05]
+1D87D; [0D 36 8A, 05, 05]
-1D8BE; [0D 33 3A, 05, 05]
+1D87E; [0D 36 91, 05, 05]
-1D8BF; [0D 33 41, 05, 05]
+1D87F; [0D 36 98, 05, 05]
-1D8C0; [0D 33 48, 05, 05]
+1D880; [0D 36 9F, 05, 05]
-1D8C1; [0D 33 4F, 05, 05]
+1D881; [0D 36 A6, 05, 05]
-1D8C2; [0D 33 56, 05, 05]
+1D882; [0D 36 AD, 05, 05]
-1D8C3; [0D 33 5D, 05, 05]
+1D883; [0D 36 B4, 05, 05]
-1D8C4; [0D 33 64, 05, 05]
+1D884; [0D 36 BB, 05, 05]
-1D8C5; [0D 33 6B, 05, 05]
+1D885; [0D 36 C2, 05, 05]
-1D8C6; [0D 33 72, 05, 05]
+1D886; [0D 36 C9, 05, 05]
-1D8C7; [0D 33 79, 05, 05]
+1D887; [0D 36 D0, 05, 05]
-1D8C8; [0D 33 80, 05, 05]
+1D888; [0D 36 D7, 05, 05]
-1D8C9; [0D 33 87, 05, 05]
+1D889; [0D 36 DE, 05, 05]
-1D8CA; [0D 33 8E, 05, 05]
+1D88A; [0D 36 E5, 05, 05]
-1D8CB; [0D 33 95, 05, 05]
+1D88B; [0D 36 EC, 05, 05]
-1D8CC; [0D 33 9C, 05, 05]
+1D88C; [0D 36 F3, 05, 05]
-1D8CD; [0D 33 A3, 05, 05]
+1D88D; [0D 36 FA, 05, 05]
-1D8CE; [0D 33 AA, 05, 05]
+1D88E; [0D 37 03, 05, 05]
-1D8CF; [0D 33 B1, 05, 05]
+1D88F; [0D 37 0A, 05, 05]
-1D8D0; [0D 33 B8, 05, 05]
+1D890; [0D 37 11, 05, 05]
-1D8D1; [0D 33 BF, 05, 05]
+1D891; [0D 37 18, 05, 05]
-1D8D2; [0D 33 C6, 05, 05]
+1D892; [0D 37 1F, 05, 05]
-1D8D3; [0D 33 CD, 05, 05]
+1D893; [0D 37 26, 05, 05]
-1D8D4; [0D 33 D4, 05, 05]
+1D894; [0D 37 2D, 05, 05]
-1D8D5; [0D 33 DB, 05, 05]
+1D895; [0D 37 34, 05, 05]
-1D8D6; [0D 33 E2, 05, 05]
+1D896; [0D 37 3B, 05, 05]
-1D8D7; [0D 33 E9, 05, 05]
+1D897; [0D 37 42, 05, 05]
-1D8D8; [0D 33 F0, 05, 05]
+1D898; [0D 37 49, 05, 05]
-1D8D9; [0D 33 F7, 05, 05]
+1D899; [0D 37 50, 05, 05]
-1D8DA; [0D 33 FE, 05, 05]
+1D89A; [0D 37 57, 05, 05]
-1D8DB; [0D 34 07, 05, 05]
+1D89B; [0D 37 5E, 05, 05]
-1D8DC; [0D 34 0E, 05, 05]
+1D89C; [0D 37 65, 05, 05]
-1D8DD; [0D 34 15, 05, 05]
+1D89D; [0D 37 6C, 05, 05]
-1D8DE; [0D 34 1C, 05, 05]
+1D89E; [0D 37 73, 05, 05]
-1D8DF; [0D 34 23, 05, 05]
+1D89F; [0D 37 7A, 05, 05]
-1D8E0; [0D 34 2A, 05, 05]
+1D8A0; [0D 37 81, 05, 05]
-1D8E1; [0D 34 31, 05, 05]
+1D8A1; [0D 37 88, 05, 05]
-1D8E2; [0D 34 38, 05, 05]
+1D8A2; [0D 37 8F, 05, 05]
-1D8E3; [0D 34 3F, 05, 05]
+1D8A3; [0D 37 96, 05, 05]
-1D8E4; [0D 34 46, 05, 05]
+1D8A4; [0D 37 9D, 05, 05]
-1D8E5; [0D 34 4D, 05, 05]
+1D8A5; [0D 37 A4, 05, 05]
-1D8E6; [0D 34 54, 05, 05]
+1D8A6; [0D 37 AB, 05, 05]
-1D8E7; [0D 34 5B, 05, 05]
+1D8A7; [0D 37 B2, 05, 05]
-1D8E8; [0D 34 62, 05, 05]
+1D8A8; [0D 37 B9, 05, 05]
-1D8E9; [0D 34 69, 05, 05]
+1D8A9; [0D 37 C0, 05, 05]
-1D8EA; [0D 34 70, 05, 05]
+1D8AA; [0D 37 C7, 05, 05]
-1D8EB; [0D 34 77, 05, 05]
+1D8AB; [0D 37 CE, 05, 05]
-1D8EC; [0D 34 7E, 05, 05]
+1D8AC; [0D 37 D5, 05, 05]
-1D8ED; [0D 34 85, 05, 05]
+1D8AD; [0D 37 DC, 05, 05]
-1D8EE; [0D 34 8C, 05, 05]
+1D8AE; [0D 37 E3, 05, 05]
-1D8EF; [0D 34 93, 05, 05]
+1D8AF; [0D 37 EA, 05, 05]
-1D8F0; [0D 34 9A, 05, 05]
+1D8B0; [0D 37 F1, 05, 05]
-1D8F1; [0D 34 A1, 05, 05]
+1D8B1; [0D 37 F8, 05, 05]
-1D8F2; [0D 34 A8, 05, 05]
+1D8B2; [0D 37 FF, 05, 05]
-1D8F3; [0D 34 AF, 05, 05]
+1D8B3; [0D 38 08, 05, 05]
-1D8F4; [0D 34 B6, 05, 05]
+1D8B4; [0D 38 0F, 05, 05]
-1D8F5; [0D 34 BD, 05, 05]
+1D8B5; [0D 38 16, 05, 05]
-1D8F6; [0D 34 C4, 05, 05]
+1D8B6; [0D 38 1D, 05, 05]
-1D8F7; [0D 34 CB, 05, 05]
+1D8B7; [0D 38 24, 05, 05]
-1D8F8; [0D 34 D2, 05, 05]
+1D8B8; [0D 38 2B, 05, 05]
-1D8F9; [0D 34 D9, 05, 05]
+1D8B9; [0D 38 32, 05, 05]
-1D8FA; [0D 34 E0, 05, 05]
+1D8BA; [0D 38 39, 05, 05]
-1D8FB; [0D 34 E7, 05, 05]
+1D8BB; [0D 38 40, 05, 05]
-1D8FC; [0D 34 EE, 05, 05]
+1D8BC; [0D 38 47, 05, 05]
-1D8FD; [0D 34 F5, 05, 05]
+1D8BD; [0D 38 4E, 05, 05]
-1D8FE; [0D 34 FC, 05, 05]
+1D8BE; [0D 38 55, 05, 05]
-1D8FF; [0D 35 05, 05, 05]
+1D8BF; [0D 38 5C, 05, 05]
-1D900; [0D 35 0C, 05, 05]
+1D8C0; [0D 38 63, 05, 05]
-1D901; [0D 35 13, 05, 05]
+1D8C1; [0D 38 6A, 05, 05]
-1D902; [0D 35 1A, 05, 05]
+1D8C2; [0D 38 71, 05, 05]
-1D903; [0D 35 21, 05, 05]
+1D8C3; [0D 38 78, 05, 05]
-1D904; [0D 35 28, 05, 05]
+1D8C4; [0D 38 7F, 05, 05]
-1D905; [0D 35 2F, 05, 05]
+1D8C5; [0D 38 86, 05, 05]
-1D906; [0D 35 36, 05, 05]
+1D8C6; [0D 38 8D, 05, 05]
-1D907; [0D 35 3D, 05, 05]
+1D8C7; [0D 38 94, 05, 05]
-1D908; [0D 35 44, 05, 05]
+1D8C8; [0D 38 9B, 05, 05]
-1D909; [0D 35 4B, 05, 05]
+1D8C9; [0D 38 A2, 05, 05]
-1D90A; [0D 35 52, 05, 05]
+1D8CA; [0D 38 A9, 05, 05]
-1D90B; [0D 35 59, 05, 05]
+1D8CB; [0D 38 B0, 05, 05]
-1D90C; [0D 35 60, 05, 05]
+1D8CC; [0D 38 B7, 05, 05]
-1D90D; [0D 35 67, 05, 05]
+1D8CD; [0D 38 BE, 05, 05]
-1D90E; [0D 35 6E, 05, 05]
+1D8CE; [0D 38 C5, 05, 05]
-1D90F; [0D 35 75, 05, 05]
+1D8CF; [0D 38 CC, 05, 05]
-1D910; [0D 35 7C, 05, 05]
+1D8D0; [0D 38 D3, 05, 05]
-1D911; [0D 35 83, 05, 05]
+1D8D1; [0D 38 DA, 05, 05]
-1D912; [0D 35 8A, 05, 05]
+1D8D2; [0D 38 E1, 05, 05]
-1D913; [0D 35 91, 05, 05]
+1D8D3; [0D 38 E8, 05, 05]
-1D914; [0D 35 98, 05, 05]
+1D8D4; [0D 38 EF, 05, 05]
-1D915; [0D 35 9F, 05, 05]
+1D8D5; [0D 38 F6, 05, 05]
-1D916; [0D 35 A6, 05, 05]
+1D8D6; [0D 38 FD, 05, 05]
-1D917; [0D 35 AD, 05, 05]
+1D8D7; [0D 39 06, 05, 05]
-1D918; [0D 35 B4, 05, 05]
+1D8D8; [0D 39 0D, 05, 05]
-1D919; [0D 35 BB, 05, 05]
+1D8D9; [0D 39 14, 05, 05]
-1D91A; [0D 35 C2, 05, 05]
+1D8DA; [0D 39 1B, 05, 05]
-1D91B; [0D 35 C9, 05, 05]
+1D8DB; [0D 39 22, 05, 05]
-1D91C; [0D 35 D0, 05, 05]
+1D8DC; [0D 39 29, 05, 05]
-1D91D; [0D 35 D7, 05, 05]
+1D8DD; [0D 39 30, 05, 05]
-1D91E; [0D 35 DE, 05, 05]
+1D8DE; [0D 39 37, 05, 05]
-1D91F; [0D 35 E5, 05, 05]
+1D8DF; [0D 39 3E, 05, 05]
-1D920; [0D 35 EC, 05, 05]
+1D8E0; [0D 39 45, 05, 05]
-1D921; [0D 35 F3, 05, 05]
+1D8E1; [0D 39 4C, 05, 05]
-1D922; [0D 35 FA, 05, 05]
+1D8E2; [0D 39 53, 05, 05]
-1D923; [0D 36 03, 05, 05]
+1D8E3; [0D 39 5A, 05, 05]
-1D924; [0D 36 0A, 05, 05]
+1D8E4; [0D 39 61, 05, 05]
-1D925; [0D 36 11, 05, 05]
+1D8E5; [0D 39 68, 05, 05]
-1D926; [0D 36 18, 05, 05]
+1D8E6; [0D 39 6F, 05, 05]
-1D927; [0D 36 1F, 05, 05]
+1D8E7; [0D 39 76, 05, 05]
-1D928; [0D 36 26, 05, 05]
+1D8E8; [0D 39 7D, 05, 05]
-1D929; [0D 36 2D, 05, 05]
+1D8E9; [0D 39 84, 05, 05]
-1D92A; [0D 36 34, 05, 05]
+1D8EA; [0D 39 8B, 05, 05]
-1D92B; [0D 36 3B, 05, 05]
+1D8EB; [0D 39 92, 05, 05]
-1D92C; [0D 36 42, 05, 05]
+1D8EC; [0D 39 99, 05, 05]
-1D92D; [0D 36 49, 05, 05]
+1D8ED; [0D 39 A0, 05, 05]
-1D92E; [0D 36 50, 05, 05]
+1D8EE; [0D 39 A7, 05, 05]
-1D92F; [0D 36 57, 05, 05]
+1D8EF; [0D 39 AE, 05, 05]
-1D930; [0D 36 5E, 05, 05]
+1D8F0; [0D 39 B5, 05, 05]
-1D931; [0D 36 65, 05, 05]
+1D8F1; [0D 39 BC, 05, 05]
-1D932; [0D 36 6C, 05, 05]
+1D8F2; [0D 39 C3, 05, 05]
-1D933; [0D 36 73, 05, 05]
+1D8F3; [0D 39 CA, 05, 05]
-1D934; [0D 36 7A, 05, 05]
+1D8F4; [0D 39 D1, 05, 05]
-1D935; [0D 36 81, 05, 05]
+1D8F5; [0D 39 D8, 05, 05]
-1D936; [0D 36 88, 05, 05]
+1D8F6; [0D 39 DF, 05, 05]
-1D937; [0D 36 8F, 05, 05]
+1D8F7; [0D 39 E6, 05, 05]
-1D938; [0D 36 96, 05, 05]
+1D8F8; [0D 39 ED, 05, 05]
-1D939; [0D 36 9D, 05, 05]
+1D8F9; [0D 39 F4, 05, 05]
-1D93A; [0D 36 A4, 05, 05]
+1D8FA; [0D 39 FB, 05, 05]
-1D93B; [0D 36 AB, 05, 05]
+1D8FB; [0D 3A 04, 05, 05]
-1D93C; [0D 36 B2, 05, 05]
+1D8FC; [0D 3A 0B, 05, 05]
-1D93D; [0D 36 B9, 05, 05]
+1D8FD; [0D 3A 12, 05, 05]
-1D93E; [0D 36 C0, 05, 05]
+1D8FE; [0D 3A 19, 05, 05]
-1D93F; [0D 36 C7, 05, 05]
+1D8FF; [0D 3A 20, 05, 05]
-1D940; [0D 36 CE, 05, 05]
+1D900; [0D 3A 27, 05, 05]
-1D941; [0D 36 D5, 05, 05]
+1D901; [0D 3A 2E, 05, 05]
-1D942; [0D 36 DC, 05, 05]
+1D902; [0D 3A 35, 05, 05]
-1D943; [0D 36 E3, 05, 05]
+1D903; [0D 3A 3C, 05, 05]
-1D944; [0D 36 EA, 05, 05]
+1D904; [0D 3A 43, 05, 05]
-1D945; [0D 36 F1, 05, 05]
+1D905; [0D 3A 4A, 05, 05]
-1D946; [0D 36 F8, 05, 05]
+1D906; [0D 3A 51, 05, 05]
-1D947; [0D 36 FF, 05, 05]
+1D907; [0D 3A 58, 05, 05]
-1D948; [0D 37 08, 05, 05]
+1D908; [0D 3A 5F, 05, 05]
-1D949; [0D 37 0F, 05, 05]
+1D909; [0D 3A 66, 05, 05]
-1D94A; [0D 37 16, 05, 05]
+1D90A; [0D 3A 6D, 05, 05]
-1D94B; [0D 37 1D, 05, 05]
+1D90B; [0D 3A 74, 05, 05]
-1D94C; [0D 37 24, 05, 05]
+1D90C; [0D 3A 7B, 05, 05]
-1D94D; [0D 37 2B, 05, 05]
+1D90D; [0D 3A 82, 05, 05]
-1D94E; [0D 37 32, 05, 05]
+1D90E; [0D 3A 89, 05, 05]
-1D94F; [0D 37 39, 05, 05]
+1D90F; [0D 3A 90, 05, 05]
-1D950; [0D 37 40, 05, 05]
+1D910; [0D 3A 97, 05, 05]
-1D951; [0D 37 47, 05, 05]
+1D911; [0D 3A 9E, 05, 05]
-1D952; [0D 37 4E, 05, 05]
+1D912; [0D 3A A5, 05, 05]
-1D953; [0D 37 55, 05, 05]
+1D913; [0D 3A AC, 05, 05]
-1D954; [0D 37 5C, 05, 05]
+1D914; [0D 3A B3, 05, 05]
-1D955; [0D 37 63, 05, 05]
+1D915; [0D 3A BA, 05, 05]
-1D956; [0D 37 6A, 05, 05]
+1D916; [0D 3A C1, 05, 05]
-1D957; [0D 37 71, 05, 05]
+1D917; [0D 3A C8, 05, 05]
-1D958; [0D 37 78, 05, 05]
+1D918; [0D 3A CF, 05, 05]
-1D959; [0D 37 7F, 05, 05]
+1D919; [0D 3A D6, 05, 05]
-1D95A; [0D 37 86, 05, 05]
+1D91A; [0D 3A DD, 05, 05]
-1D95B; [0D 37 8D, 05, 05]
+1D91B; [0D 3A E4, 05, 05]
-1D95C; [0D 37 94, 05, 05]
+1D91C; [0D 3A EB, 05, 05]
-1D95D; [0D 37 9B, 05, 05]
+1D91D; [0D 3A F2, 05, 05]
-1D95E; [0D 37 A2, 05, 05]
+1D91E; [0D 3A F9, 05, 05]
-1D95F; [0D 37 A9, 05, 05]
+1D91F; [0D 3B 02, 05, 05]
-1D960; [0D 37 B0, 05, 05]
+1D920; [0D 3B 09, 05, 05]
-1D961; [0D 37 B7, 05, 05]
+1D921; [0D 3B 10, 05, 05]
-1D962; [0D 37 BE, 05, 05]
+1D922; [0D 3B 17, 05, 05]
-1D963; [0D 37 C5, 05, 05]
+1D923; [0D 3B 1E, 05, 05]
-1D964; [0D 37 CC, 05, 05]
+1D924; [0D 3B 25, 05, 05]
-1D965; [0D 37 D3, 05, 05]
+1D925; [0D 3B 2C, 05, 05]
-1D966; [0D 37 DA, 05, 05]
+1D926; [0D 3B 33, 05, 05]
-1D967; [0D 37 E1, 05, 05]
+1D927; [0D 3B 3A, 05, 05]
-1D968; [0D 37 E8, 05, 05]
+1D928; [0D 3B 41, 05, 05]
-1D969; [0D 37 EF, 05, 05]
+1D929; [0D 3B 48, 05, 05]
-1D96A; [0D 37 F6, 05, 05]
+1D92A; [0D 3B 4F, 05, 05]
-1D96B; [0D 37 FD, 05, 05]
+1D92B; [0D 3B 56, 05, 05]
-1D96C; [0D 38 06, 05, 05]
+1D92C; [0D 3B 5D, 05, 05]
-1D96D; [0D 38 0D, 05, 05]
+1D92D; [0D 3B 64, 05, 05]
-1D96E; [0D 38 14, 05, 05]
+1D92E; [0D 3B 6B, 05, 05]
-1D96F; [0D 38 1B, 05, 05]
+1D92F; [0D 3B 72, 05, 05]
-1D970; [0D 38 22, 05, 05]
+1D930; [0D 3B 79, 05, 05]
-1D971; [0D 38 29, 05, 05]
+1D931; [0D 3B 80, 05, 05]
-1D972; [0D 38 30, 05, 05]
+1D932; [0D 3B 87, 05, 05]
-1D973; [0D 38 37, 05, 05]
+1D933; [0D 3B 8E, 05, 05]
-1D974; [0D 38 3E, 05, 05]
+1D934; [0D 3B 95, 05, 05]
-1D975; [0D 38 45, 05, 05]
+1D935; [0D 3B 9C, 05, 05]
-1D976; [0D 38 4C, 05, 05]
+1D936; [0D 3B A3, 05, 05]
-1D977; [0D 38 53, 05, 05]
+1D937; [0D 3B AA, 05, 05]
-1D978; [0D 38 5A, 05, 05]
+1D938; [0D 3B B1, 05, 05]
-1D979; [0D 38 61, 05, 05]
+1D939; [0D 3B B8, 05, 05]
-1D97A; [0D 38 68, 05, 05]
+1D93A; [0D 3B BF, 05, 05]
-1D97B; [0D 38 6F, 05, 05]
+1D93B; [0D 3B C6, 05, 05]
-1D97C; [0D 38 76, 05, 05]
+1D93C; [0D 3B CD, 05, 05]
-1D97D; [0D 38 7D, 05, 05]
+1D93D; [0D 3B D4, 05, 05]
-1D97E; [0D 38 84, 05, 05]
+1D93E; [0D 3B DB, 05, 05]
-1D97F; [0D 38 8B, 05, 05]
+1D93F; [0D 3B E2, 05, 05]
-1D980; [0D 38 92, 05, 05]
+1D940; [0D 3B E9, 05, 05]
-1D981; [0D 38 99, 05, 05]
+1D941; [0D 3B F0, 05, 05]
-1D982; [0D 38 A0, 05, 05]
+1D942; [0D 3B F7, 05, 05]
-1D983; [0D 38 A7, 05, 05]
+1D943; [0D 3B FE, 05, 05]
-1D984; [0D 38 AE, 05, 05]
+1D944; [0D 3C 07, 05, 05]
-1D985; [0D 38 B5, 05, 05]
+1D945; [0D 3C 0E, 05, 05]
-1D986; [0D 38 BC, 05, 05]
+1D946; [0D 3C 15, 05, 05]
-1D987; [0D 38 C3, 05, 05]
+1D947; [0D 3C 1C, 05, 05]
-1D988; [0D 38 CA, 05, 05]
+1D948; [0D 3C 23, 05, 05]
-1D989; [0D 38 D1, 05, 05]
+1D949; [0D 3C 2A, 05, 05]
-1D98A; [0D 38 D8, 05, 05]
+1D94A; [0D 3C 31, 05, 05]
-1D98B; [0D 38 DF, 05, 05]
+1D94B; [0D 3C 38, 05, 05]
-1D98C; [0D 38 E6, 05, 05]
+1D94C; [0D 3C 3F, 05, 05]
-1D98D; [0D 38 ED, 05, 05]
+1D94D; [0D 3C 46, 05, 05]
-1D98E; [0D 38 F4, 05, 05]
+1D94E; [0D 3C 4D, 05, 05]
-1D98F; [0D 38 FB, 05, 05]
+1D94F; [0D 3C 54, 05, 05]
-1D990; [0D 39 04, 05, 05]
+1D950; [0D 3C 5B, 05, 05]
-1D991; [0D 39 0B, 05, 05]
+1D951; [0D 3C 62, 05, 05]
-1D992; [0D 39 12, 05, 05]
+1D952; [0D 3C 69, 05, 05]
-1D993; [0D 39 19, 05, 05]
+1D953; [0D 3C 70, 05, 05]
-1D994; [0D 39 20, 05, 05]
+1D954; [0D 3C 77, 05, 05]
-1D995; [0D 39 27, 05, 05]
+1D955; [0D 3C 7E, 05, 05]
-1D996; [0D 39 2E, 05, 05]
+1D956; [0D 3C 85, 05, 05]
-1D997; [0D 39 35, 05, 05]
+1D957; [0D 3C 8C, 05, 05]
-1D998; [0D 39 3C, 05, 05]
+1D958; [0D 3C 93, 05, 05]
-1D999; [0D 39 43, 05, 05]
+1D959; [0D 3C 9A, 05, 05]
-1D99A; [0D 39 4A, 05, 05]
+1D95A; [0D 3C A1, 05, 05]
-1D99B; [0D 39 51, 05, 05]
+1D95B; [0D 3C A8, 05, 05]
-1D99C; [0D 39 58, 05, 05]
+1D95C; [0D 3C AF, 05, 05]
-1D99D; [0D 39 5F, 05, 05]
+1D95D; [0D 3C B6, 05, 05]
-1D99E; [0D 39 66, 05, 05]
+1D95E; [0D 3C BD, 05, 05]
-1D99F; [0D 39 6D, 05, 05]
+1D95F; [0D 3C C4, 05, 05]
-1D9A0; [0D 39 74, 05, 05]
+1D960; [0D 3C CB, 05, 05]
-1D9A1; [0D 39 7B, 05, 05]
+1D961; [0D 3C D2, 05, 05]
-1D9A2; [0D 39 82, 05, 05]
+1D962; [0D 3C D9, 05, 05]
-1D9A3; [0D 39 89, 05, 05]
+1D963; [0D 3C E0, 05, 05]
-1D9A4; [0D 39 90, 05, 05]
+1D964; [0D 3C E7, 05, 05]
-1D9A5; [0D 39 97, 05, 05]
+1D965; [0D 3C EE, 05, 05]
-1D9A6; [0D 39 9E, 05, 05]
+1D966; [0D 3C F5, 05, 05]
-1D9A7; [0D 39 A5, 05, 05]
+1D967; [0D 3C FC, 05, 05]
-1D9A8; [0D 39 AC, 05, 05]
+1D968; [0D 3D 05, 05, 05]
-1D9A9; [0D 39 B3, 05, 05]
+1D969; [0D 3D 0C, 05, 05]
-1D9AA; [0D 39 BA, 05, 05]
+1D96A; [0D 3D 13, 05, 05]
-1D9AB; [0D 39 C1, 05, 05]
+1D96B; [0D 3D 1A, 05, 05]
-1D9AC; [0D 39 C8, 05, 05]
+1D96C; [0D 3D 21, 05, 05]
-1D9AD; [0D 39 CF, 05, 05]
+1D96D; [0D 3D 28, 05, 05]
-1D9AE; [0D 39 D6, 05, 05]
+1D96E; [0D 3D 2F, 05, 05]
-1D9AF; [0D 39 DD, 05, 05]
+1D96F; [0D 3D 36, 05, 05]
-1D9B0; [0D 39 E4, 05, 05]
+1D970; [0D 3D 3D, 05, 05]
-1D9B1; [0D 39 EB, 05, 05]
+1D971; [0D 3D 44, 05, 05]
-1D9B2; [0D 39 F2, 05, 05]
+1D972; [0D 3D 4B, 05, 05]
-1D9B3; [0D 39 F9, 05, 05]
+1D973; [0D 3D 52, 05, 05]
-1D9B4; [0D 3A 02, 05, 05]
+1D974; [0D 3D 59, 05, 05]
-1D9B5; [0D 3A 09, 05, 05]
+1D975; [0D 3D 60, 05, 05]
-1D9B6; [0D 3A 10, 05, 05]
+1D976; [0D 3D 67, 05, 05]
-1D9B7; [0D 3A 17, 05, 05]
+1D977; [0D 3D 6E, 05, 05]
-1D9B8; [0D 3A 1E, 05, 05]
+1D978; [0D 3D 75, 05, 05]
-1D9B9; [0D 3A 25, 05, 05]
+1D979; [0D 3D 7C, 05, 05]
-1D9BA; [0D 3A 2C, 05, 05]
+1D97A; [0D 3D 83, 05, 05]
-1D9BB; [0D 3A 33, 05, 05]
+1D97B; [0D 3D 8A, 05, 05]
-1D9BC; [0D 3A 3A, 05, 05]
+1D97C; [0D 3D 91, 05, 05]
-1D9BD; [0D 3A 41, 05, 05]
+1D97D; [0D 3D 98, 05, 05]
-1D9BE; [0D 3A 48, 05, 05]
+1D97E; [0D 3D 9F, 05, 05]
-1D9BF; [0D 3A 4F, 05, 05]
+1D97F; [0D 3D A6, 05, 05]
-1D9C0; [0D 3A 56, 05, 05]
+1D980; [0D 3D AD, 05, 05]
-1D9C1; [0D 3A 5D, 05, 05]
+1D981; [0D 3D B4, 05, 05]
-1D9C2; [0D 3A 64, 05, 05]
+1D982; [0D 3D BB, 05, 05]
-1D9C3; [0D 3A 6B, 05, 05]
+1D983; [0D 3D C2, 05, 05]
-1D9C4; [0D 3A 72, 05, 05]
+1D984; [0D 3D C9, 05, 05]
-1D9C5; [0D 3A 79, 05, 05]
+1D985; [0D 3D D0, 05, 05]
-1D9C6; [0D 3A 80, 05, 05]
+1D986; [0D 3D D7, 05, 05]
-1D9C7; [0D 3A 87, 05, 05]
+1D987; [0D 3D DE, 05, 05]
-1D9C8; [0D 3A 8E, 05, 05]
+1D988; [0D 3D E5, 05, 05]
-1D9C9; [0D 3A 95, 05, 05]
+1D989; [0D 3D EC, 05, 05]
-1D9CA; [0D 3A 9C, 05, 05]
+1D98A; [0D 3D F3, 05, 05]
-1D9CB; [0D 3A A3, 05, 05]
+1D98B; [0D 3D FA, 05, 05]
-1D9CC; [0D 3A AA, 05, 05]
+1D98C; [0D 3E 03, 05, 05]
-1D9CD; [0D 3A B1, 05, 05]
+1D98D; [0D 3E 0A, 05, 05]
-1D9CE; [0D 3A B8, 05, 05]
+1D98E; [0D 3E 11, 05, 05]
-1D9CF; [0D 3A BF, 05, 05]
+1D98F; [0D 3E 18, 05, 05]
-1D9D0; [0D 3A C6, 05, 05]
+1D990; [0D 3E 1F, 05, 05]
-1D9D1; [0D 3A CD, 05, 05]
+1D991; [0D 3E 26, 05, 05]
-1D9D2; [0D 3A D4, 05, 05]
+1D992; [0D 3E 2D, 05, 05]
-1D9D3; [0D 3A DB, 05, 05]
+1D993; [0D 3E 34, 05, 05]
-1D9D4; [0D 3A E2, 05, 05]
+1D994; [0D 3E 3B, 05, 05]
-1D9D5; [0D 3A E9, 05, 05]
+1D995; [0D 3E 42, 05, 05]
-1D9D6; [0D 3A F0, 05, 05]
+1D996; [0D 3E 49, 05, 05]
-1D9D7; [0D 3A F7, 05, 05]
+1D997; [0D 3E 50, 05, 05]
-1D9D8; [0D 3A FE, 05, 05]
+1D998; [0D 3E 57, 05, 05]
-1D9D9; [0D 3B 07, 05, 05]
+1D999; [0D 3E 5E, 05, 05]
-1D9DA; [0D 3B 0E, 05, 05]
+1D99A; [0D 3E 65, 05, 05]
-1D9DB; [0D 3B 15, 05, 05]
+1D99B; [0D 3E 6C, 05, 05]
-1D9DC; [0D 3B 1C, 05, 05]
+1D99C; [0D 3E 73, 05, 05]
-1D9DD; [0D 3B 23, 05, 05]
+1D99D; [0D 3E 7A, 05, 05]
-1D9DE; [0D 3B 2A, 05, 05]
+1D99E; [0D 3E 81, 05, 05]
-1D9DF; [0D 3B 31, 05, 05]
+1D99F; [0D 3E 88, 05, 05]
-1D9E0; [0D 3B 38, 05, 05]
+1D9A0; [0D 3E 8F, 05, 05]
-1D9E1; [0D 3B 3F, 05, 05]
+1D9A1; [0D 3E 96, 05, 05]
-1D9E2; [0D 3B 46, 05, 05]
+1D9A2; [0D 3E 9D, 05, 05]
-1D9E3; [0D 3B 4D, 05, 05]
+1D9A3; [0D 3E A4, 05, 05]
-1D9E4; [0D 3B 54, 05, 05]
+1D9A4; [0D 3E AB, 05, 05]
-1D9E5; [0D 3B 5B, 05, 05]
+1D9A5; [0D 3E B2, 05, 05]
-1D9E6; [0D 3B 62, 05, 05]
+1D9A6; [0D 3E B9, 05, 05]
-1D9E7; [0D 3B 69, 05, 05]
+1D9A7; [0D 3E C0, 05, 05]
-1D9E8; [0D 3B 70, 05, 05]
+1D9A8; [0D 3E C7, 05, 05]
-1D9E9; [0D 3B 77, 05, 05]
+1D9A9; [0D 3E CE, 05, 05]
-1D9EA; [0D 3B 7E, 05, 05]
+1D9AA; [0D 3E D5, 05, 05]
-1D9EB; [0D 3B 85, 05, 05]
+1D9AB; [0D 3E DC, 05, 05]
-1D9EC; [0D 3B 8C, 05, 05]
+1D9AC; [0D 3E E3, 05, 05]
-1D9ED; [0D 3B 93, 05, 05]
+1D9AD; [0D 3E EA, 05, 05]
-1D9EE; [0D 3B 9A, 05, 05]
+1D9AE; [0D 3E F1, 05, 05]
-1D9EF; [0D 3B A1, 05, 05]
+1D9AF; [0D 3E F8, 05, 05]
-1D9F0; [0D 3B A8, 05, 05]
+1D9B0; [0D 3E FF, 05, 05]
-1D9F1; [0D 3B AF, 05, 05]
+1D9B1; [0D 3F 08, 05, 05]
-1D9F2; [0D 3B B6, 05, 05]
+1D9B2; [0D 3F 0F, 05, 05]
-1D9F3; [0D 3B BD, 05, 05]
+1D9B3; [0D 3F 16, 05, 05]
-1D9F4; [0D 3B C4, 05, 05]
+1D9B4; [0D 3F 1D, 05, 05]
-1D9F5; [0D 3B CB, 05, 05]
+1D9B5; [0D 3F 24, 05, 05]
-1D9F6; [0D 3B D2, 05, 05]
+1D9B6; [0D 3F 2B, 05, 05]
-1D9F7; [0D 3B D9, 05, 05]
+1D9B7; [0D 3F 32, 05, 05]
-1D9F8; [0D 3B E0, 05, 05]
+1D9B8; [0D 3F 39, 05, 05]
-1D9F9; [0D 3B E7, 05, 05]
+1D9B9; [0D 3F 40, 05, 05]
-1D9FA; [0D 3B EE, 05, 05]
+1D9BA; [0D 3F 47, 05, 05]
-1D9FB; [0D 3B F5, 05, 05]
+1D9BB; [0D 3F 4E, 05, 05]
-1D9FC; [0D 3B FC, 05, 05]
+1D9BC; [0D 3F 55, 05, 05]
-1D9FD; [0D 3C 05, 05, 05]
+1D9BD; [0D 3F 5C, 05, 05]
-1D9FE; [0D 3C 0C, 05, 05]
+1D9BE; [0D 3F 63, 05, 05]
-1D9FF; [0D 3C 13, 05, 05]
+1D9BF; [0D 3F 6A, 05, 05]
-1DA37; [0D 3C 1A, 05, 05]
+1D9C0; [0D 3F 71, 05, 05]
-1DA38; [0D 3C 21, 05, 05]
+1D9C1; [0D 3F 78, 05, 05]
-1DA39; [0D 3C 28, 05, 05]
+1D9C2; [0D 3F 7F, 05, 05]
-1DA3A; [0D 3C 2F, 05, 05]
+1D9C3; [0D 3F 86, 05, 05]
-1DA6D; [0D 3C 36, 05, 05]
+1D9C4; [0D 3F 8D, 05, 05]
-1DA6E; [0D 3C 3D, 05, 05]
+1D9C5; [0D 3F 94, 05, 05]
-1DA6F; [0D 3C 44, 05, 05]
+1D9C6; [0D 3F 9B, 05, 05]
-1DA70; [0D 3C 4B, 05, 05]
+1D9C7; [0D 3F A2, 05, 05]
-1DA71; [0D 3C 52, 05, 05]
+1D9C8; [0D 3F A9, 05, 05]
-1DA72; [0D 3C 59, 05, 05]
+1D9C9; [0D 3F B0, 05, 05]
-1DA73; [0D 3C 60, 05, 05]
+1D9CA; [0D 3F B7, 05, 05]
-1DA74; [0D 3C 67, 05, 05]
+1D9CB; [0D 3F BE, 05, 05]
-1DA76; [0D 3C 6E, 05, 05]
+1D9CC; [0D 3F C5, 05, 05]
-1DA77; [0D 3C 75, 05, 05]
+1D9CD; [0D 3F CC, 05, 05]
-1DA78; [0D 3C 7C, 05, 05]
+1D9CE; [0D 3F D3, 05, 05]
-1DA79; [0D 3C 83, 05, 05]
+1D9CF; [0D 3F DA, 05, 05]
-1DA7A; [0D 3C 8A, 05, 05]
+1D9D0; [0D 3F E1, 05, 05]
-1DA7B; [0D 3C 91, 05, 05]
+1D9D1; [0D 3F E8, 05, 05]
-1DA7C; [0D 3C 98, 05, 05]
+1D9D2; [0D 3F EF, 05, 05]
-1DA7D; [0D 3C 9F, 05, 05]
+1D9D3; [0D 3F F6, 05, 05]
-1DA7E; [0D 3C A6, 05, 05]
+1D9D4; [0D 3F FD, 05, 05]
-1DA7F; [0D 3C AD, 05, 05]
+1D9D5; [0D 40 06, 05, 05]
-1DA80; [0D 3C B4, 05, 05]
+1D9D6; [0D 40 0D, 05, 05]
-1DA81; [0D 3C BB, 05, 05]
+1D9D7; [0D 40 14, 05, 05]
-1DA82; [0D 3C C2, 05, 05]
+1D9D8; [0D 40 1B, 05, 05]
-1DA83; [0D 3C C9, 05, 05]
+1D9D9; [0D 40 22, 05, 05]
-1DA85; [0D 3C D0, 05, 05]
+1D9DA; [0D 40 29, 05, 05]
-1DA86; [0D 3C D7, 05, 05]
+1D9DB; [0D 40 30, 05, 05]
-2FF0; [0D 3C DE, 05, 05]
+1D9DC; [0D 40 37, 05, 05]
-2FF1; [0D 3C E5, 05, 05]
+1D9DD; [0D 40 3E, 05, 05]
-2FF2; [0D 3C EC, 05, 05]
+1D9DE; [0D 40 45, 05, 05]
-2FF3; [0D 3C F3, 05, 05]
+1D9DF; [0D 40 4C, 05, 05]
-2FF4; [0D 3C FA, 05, 05]
+1D9E0; [0D 40 53, 05, 05]
-2FF5; [0D 3D 03, 05, 05]
+1D9E1; [0D 40 5A, 05, 05]
-2FF6; [0D 3D 0A, 05, 05]
+1D9E2; [0D 40 61, 05, 05]
-2FF7; [0D 3D 11, 05, 05]
+1D9E3; [0D 40 68, 05, 05]
-2FF8; [0D 3D 18, 05, 05]
+1D9E4; [0D 40 6F, 05, 05]
-2FF9; [0D 3D 1F, 05, 05]
+1D9E5; [0D 40 76, 05, 05]
-2FFA; [0D 3D 26, 05, 05]
+1D9E6; [0D 40 7D, 05, 05]
-2FFB; [0D 3D 2D, 05, 05]
+1D9E7; [0D 40 84, 05, 05]
-31C0; [0D 3D 34, 05, 05]
+1D9E8; [0D 40 8B, 05, 05]
-31C1; [0D 3D 3B, 05, 05]
+1D9E9; [0D 40 92, 05, 05]
-31C2; [0D 3D 42, 05, 05]
+1D9EA; [0D 40 99, 05, 05]
-31C3; [0D 3D 49, 05, 05]
+1D9EB; [0D 40 A0, 05, 05]
-31C4; [0D 3D 50, 05, 05]
+1D9EC; [0D 40 A7, 05, 05]
-31C5; [0D 3D 57, 05, 05]
+1D9ED; [0D 40 AE, 05, 05]
-31C6; [0D 3D 5E, 05, 05]
+1D9EE; [0D 40 B5, 05, 05]
-31C7; [0D 3D 65, 05, 05]
+1D9EF; [0D 40 BC, 05, 05]
-31C8; [0D 3D 6C, 05, 05]
+1D9F0; [0D 40 C3, 05, 05]
-31C9; [0D 3D 73, 05, 05]
+1D9F1; [0D 40 CA, 05, 05]
-31CA; [0D 3D 7A, 05, 05]
+1D9F2; [0D 40 D1, 05, 05]
-31CB; [0D 3D 81, 05, 05]
+1D9F3; [0D 40 D8, 05, 05]
-31CC; [0D 3D 88, 05, 05]
+1D9F4; [0D 40 DF, 05, 05]
-31CD; [0D 3D 8F, 05, 05]
+1D9F5; [0D 40 E6, 05, 05]
-31CE; [0D 3D 96, 05, 05]
+1D9F6; [0D 40 ED, 05, 05]
-31CF; [0D 3D 9D, 05, 05]
+1D9F7; [0D 40 F4, 05, 05]
-31D0; [0D 3D A4, 05, 05]
+1D9F8; [0D 40 FB, 05, 05]
-31D1; [0D 3D AB, 05, 05]
+1D9F9; [0D 41 04, 05, 05]
-31D2; [0D 3D B2, 05, 05]
+1D9FA; [0D 41 0B, 05, 05]
-31D3; [0D 3D B9, 05, 05]
+1D9FB; [0D 41 12, 05, 05]
-31D4; [0D 3D C0, 05, 05]
+1D9FC; [0D 41 19, 05, 05]
-31D5; [0D 3D C7, 05, 05]
+1D9FD; [0D 41 20, 05, 05]
-31D6; [0D 3D CE, 05, 05]
+1D9FE; [0D 41 27, 05, 05]
-31D7; [0D 3D D5, 05, 05]
+1D9FF; [0D 41 2E, 05, 05]
-31D8; [0D 3D DC, 05, 05]
+1DA37; [0D 41 35, 05, 05]
-31D9; [0D 3D E3, 05, 05]
+1DA38; [0D 41 3C, 05, 05]
-31DA; [0D 3D EA, 05, 05]
+1DA39; [0D 41 43, 05, 05]
-31DB; [0D 3D F1, 05, 05]
+1DA3A; [0D 41 4A, 05, 05]
-31DC; [0D 3D F8, 05, 05]
+1DA6D; [0D 41 51, 05, 05]
-31DD; [0D 3D FF, 05, 05]
+1DA6E; [0D 41 58, 05, 05]
-31DE; [0D 3E 08, 05, 05]
+1DA6F; [0D 41 5F, 05, 05]
-31DF; [0D 3E 0F, 05, 05]
+1DA70; [0D 41 66, 05, 05]
-31E0; [0D 3E 16, 05, 05]
+1DA71; [0D 41 6D, 05, 05]
-31E1; [0D 3E 1D, 05, 05]
+1DA72; [0D 41 74, 05, 05]
-31E2; [0D 3E 24, 05, 05]
+1DA73; [0D 41 7B, 05, 05]
-31E3; [0D 3E 2B, 05, 05]
+1DA74; [0D 41 82, 05, 05]
-3004; [0D 3E 32, 05, 05]
+1DA76; [0D 41 89, 05, 05]
-3012; [0D 40, 05, 05]
-3036; [0D 40, 05, 20]
+1DA77; [0D 41 90, 05, 05]
-3013; [0D 42 02, 05, 05]
+1DA78; [0D 41 97, 05, 05]
-3020; [0D 42 09, 05, 05]
+1DA79; [0D 41 9E, 05, 05]
-3037; [0D 42 10, 05, 05]
+1DA7A; [0D 41 A5, 05, 05]
-303E; [0D 42 17, 05, 05]
+1DA7B; [0D 41 AC, 05, 05]
-303F; [0D 42 1E, 05, 05]
+1DA7C; [0D 41 B3, 05, 05]
-3190; [0D 42 25, 05, 05]
+1DA7D; [0D 41 BA, 05, 05]
-3191; [0D 42 2C, 05, 05]
+1DA7E; [0D 41 C1, 05, 05]
-327F; [0D 42 33, 05, 05]
+1DA7F; [0D 41 C8, 05, 05]
-FFFC; [0D 42 3A, 05, 05]
+1DA80; [0D 41 CF, 05, 05]
-02D0; [0D 44, 05, 05]
+1DA81; [0D 41 D6, 05, 05]
-02D1; [0D 46, 05, 05]
+1DA82; [0D 41 DD, 05, 05]
-0971; [0D 48, 05, 05]
+1DA83; [0D 41 E4, 05, 05]
-0E46; [0D 4A, 05, 05]
+1DA85; [0D 41 EB, 05, 05]
-0EC6; [0D 4C, 05, 05]
+1DA86; [0D 41 F2, 05, 05]
-17D7; [0D 4E, 05, 05]
+2FF0; [0D 41 F9, 05, 05]
-1AA7; [0D 50, 05, 05]
+2FF1; [0D 42 02, 05, 05]
-A9CF; [0D 52, 05, 05]
+2FF2; [0D 42 09, 05, 05]
-A9E6; [0D 54, 05, 05]
+2FF3; [0D 42 10, 05, 05]
-AA70; [0D 56, 05, 05]
+2FF4; [0D 42 17, 05, 05]
-AADD; [0D 58 02, 05, 05]
+2FF5; [0D 42 1E, 05, 05]
-AAF3; [0D 58 09, 05, 05]
+2FF6; [0D 42 25, 05, 05]
-AAF4; [0D 58 10, 05, 05]
+2FF7; [0D 42 2C, 05, 05]
-16B42; [0D 58 17, 05, 05]
+2FF8; [0D 42 33, 05, 05]
-16B43; [0D 58 1E, 05, 05]
+2FF9; [0D 42 3A, 05, 05]
-3005; [0D 5A, 05, 05]
+2FFA; [0D 42 41, 05, 05]
-303B; [0D 5C, 05, 05]
+2FFB; [0D 42 48, 05, 05]
-16FE0; [0D 5E 02, 05, 05]
+31C0; [0D 42 4F, 05, 05]
-16FE1; [0D 5E 09, 05, 05]
+31C1; [0D 42 56, 05, 05]
-3031; [0D 60, 05, 05]
-3032; [0D 60, 05, 05][, AE, 05]
+31C2; [0D 42 5D, 05, 05]
-3033; [0D 62, 05, 05]
-3034; [0D 62, 05, 05][, AE, 05]
+31C3; [0D 42 64, 05, 05]
-3035; [0D 64, 05, 05]
+31C4; [0D 42 6B, 05, 05]
-309D; [0D 66, 05, 05]
-309E; [0D 66, 05, 05][, AE, 05]
+31C5; [0D 42 72, 05, 05]
-30FC; [0D 68, 05, 05]
-FF70; [0D 68, 05, A0]
+31C6; [0D 42 79, 05, 05]
-30FD; [0D 6A, 05, 05]
-30FE; [0D 6A, 05, 05][, AE, 05]
+31C7; [0D 42 80, 05, 05]
-FDD1 20AC; [0D 76 02, 05, 05] # CURRENCY first primary
+31C8; [0D 42 87, 05, 05]
-00A4; [0D 78, 05, 05]
+31C9; [0D 42 8E, 05, 05]
-00A2; [0D 7A, 05, 05]
-FFE0; [0D 7A, 05, 20]
+31CA; [0D 42 95, 05, 05]
-0024; [0D 7C, 05, 05]
-FF04; [0D 7C, 05, 20]
-FE69; [0D 7C, 05, 2E]
+31CB; [0D 42 9C, 05, 05]
-00A3; [0D 7E, 05, 05]
-FFE1; [0D 7E, 05, 20]
+31CC; [0D 42 A3, 05, 05]
-00A5; [0D 80, 05, 05]
-FFE5; [0D 80, 05, 20]
+31CD; [0D 42 AA, 05, 05]
-058F; [0D 82, 05, 05]
+31CE; [0D 42 B1, 05, 05]
-060B; [0D 84, 05, 05]
+31CF; [0D 42 B8, 05, 05]
-07FE; [0D 86 02, 05, 05]
+31D0; [0D 42 BF, 05, 05]
-07FF; [0D 86 09, 05, 05]
+31D1; [0D 42 C6, 05, 05]
-09F2; [0D 88, 05, 05]
+31D2; [0D 42 CD, 05, 05]
-09F3; [0D 8A, 05, 05]
+31D3; [0D 42 D4, 05, 05]
-09FB; [0D 8C, 05, 05]
+31D4; [0D 42 DB, 05, 05]
-0AF1; [0D 8E, 05, 05]
+31D5; [0D 42 E2, 05, 05]
-A838; [0D 90, 05, 05]
+31D6; [0D 42 E9, 05, 05]
-0BF9; [0D 92, 05, 05]
+31D7; [0D 42 F0, 05, 05]
-0E3F; [0D 94, 05, 05]
+31D8; [0D 42 F7, 05, 05]
-17DB; [0D 96, 05, 05]
+31D9; [0D 42 FE, 05, 05]
-20A0; [0D 98, 05, 05]
+31DA; [0D 43 07, 05, 05]
-20A1; [0D 9A, 05, 05]
+31DB; [0D 43 0E, 05, 05]
-20A2; [0D 9C, 05, 05]
+31DC; [0D 43 15, 05, 05]
-20A3; [0D 9E, 05, 05]
+31DD; [0D 43 1C, 05, 05]
-20A4; [0D A0, 05, 05]
+31DE; [0D 43 23, 05, 05]
-20A5; [0D A2, 05, 05]
+31DF; [0D 43 2A, 05, 05]
-20A6; [0D A4, 05, 05]
+31E0; [0D 43 31, 05, 05]
-20A7; [0D A6, 05, 05]
+31E1; [0D 43 38, 05, 05]
-20A9; [0D A8, 05, 05]
-FFE6; [0D A8, 05, 20]
+31E2; [0D 43 3F, 05, 05]
-20AA; [0D AA, 05, 05]
+31E3; [0D 43 46, 05, 05]
-20AB; [0D AC, 05, 05]
+3004; [0D 43 4D, 05, 05]
-20AC; [0D AE, 05, 05]
+3012; [0D 45, 05, 05]
+3036; [0D 45, 05, 20]
-20AD; [0D B0, 05, 05]
+3013; [0D 47 02, 05, 05]
-20AE; [0D B2, 05, 05]
+3020; [0D 47 09, 05, 05]
-20AF; [0D B4, 05, 05]
+3037; [0D 47 10, 05, 05]
-20B0; [0D B6, 05, 05]
+303E; [0D 47 17, 05, 05]
-20B1; [0D B8, 05, 05]
+303F; [0D 47 1E, 05, 05]
-20B2; [0D BA, 05, 05]
+3190; [0D 47 25, 05, 05]
-20B3; [0D BC, 05, 05]
+3191; [0D 47 2C, 05, 05]
-20B4; [0D BE, 05, 05]
+327F; [0D 47 33, 05, 05]
-20B5; [0D C0, 05, 05]
+FFFC; [0D 47 3A, 05, 05]
-20B6; [0D C2, 05, 05]
+02D0; [0D 49, 05, 05]
-20B7; [0D C4, 05, 05]
+02D1; [0D 4B, 05, 05]
-20B8; [0D C6, 05, 05]
+0971; [0D 4D, 05, 05]
-20B9; [0D C8, 05, 05]
+0E46; [0D 4F, 05, 05]
-1ECB0; [0D CA, 05, 05]
+0EC6; [0D 51, 05, 05]
-20BA; [0D CC, 05, 05]
+17D7; [0D 53, 05, 05]
-20BB; [0D CE, 05, 05]
+1AA7; [0D 55, 05, 05]
-20BC; [0D D0, 05, 05]
+A9CF; [0D 57, 05, 05]
-20BD; [0D D2, 05, 05]
+A9E6; [0D 59, 05, 05]
-20BE; [0D D4, 05, 05]
+AA70; [0D 5B, 05, 05]
-20BF; [0D D6, 05, 05]
+AADD; [0D 5D 02, 05, 05]
-20A8; [0D D8, 05, 05]
+AAF3; [0D 5D 09, 05, 05]
-FDFC; [0D DA, 05, 05]
+AAF4; [0D 5D 10, 05, 05]
+
+16B42; [0D 5D 17, 05, 05]
+
+16B43; [0D 5D 1E, 05, 05]
+
+1E13C; [0D 5D 25, 05, 05]
+
+1E13D; [0D 5D 2C, 05, 05]
+
+3005; [0D 5F, 05, 05]
+
+303B; [0D 61, 05, 05]
+
+16FE0; [0D 63 02, 05, 05]
+
+16FE1; [0D 63 09, 05, 05]
+
+16FE3; [0D 65, 05, 05]
+
+3031; [0D 67, 05, 05]
+3032; [0D 67, 05, 05][, AE, 05]
+
+3033; [0D 69, 05, 05]
+3034; [0D 69, 05, 05][, AE, 05]
+
+3035; [0D 6B, 05, 05]
+
+309D; [0D 6D, 05, 05]
+309E; [0D 6D, 05, 05][, AE, 05]
+
+30FC; [0D 6F, 05, 05]
+FF70; [0D 6F, 05, A0]
+
+30FD; [0D 71, 05, 05]
+30FE; [0D 71, 05, 05][, AE, 05]
+
+FDD1 20AC; [0D 7D 02, 05, 05] # CURRENCY first primary
+
+00A4; [0D 7F, 05, 05]
+
+00A2; [0D 81, 05, 05]
+FFE0; [0D 81, 05, 20]
+
+0024; [0D 83, 05, 05]
+FF04; [0D 83, 05, 20]
+FE69; [0D 83, 05, 2E]
+
+00A3; [0D 85, 05, 05]
+FFE1; [0D 85, 05, 20]
+
+00A5; [0D 87, 05, 05]
+FFE5; [0D 87, 05, 20]
+
+058F; [0D 89, 05, 05]
+
+060B; [0D 8B, 05, 05]
+
+07FE; [0D 8D 02, 05, 05]
+
+07FF; [0D 8D 09, 05, 05]
+
+09F2; [0D 8F, 05, 05]
+
+09F3; [0D 91, 05, 05]
+
+09FB; [0D 93, 05, 05]
+
+0AF1; [0D 95, 05, 05]
+
+A838; [0D 97, 05, 05]
+
+0BF9; [0D 99, 05, 05]
+
+11FDD; [0D 9B, 05, 05]
+
+11FDE; [0D 9D, 05, 05]
+
+11FDF; [0D 9F, 05, 05]
+
+11FE0; [0D A1, 05, 05]
+
+0E3F; [0D A3, 05, 05]
+
+17DB; [0D A5, 05, 05]
+
+1E2FF; [0D A7, 05, 05]
+
+20A0; [0D A9, 05, 05]
+
+20A1; [0D AB, 05, 05]
+
+20A2; [0D AD, 05, 05]
+
+20A3; [0D AF, 05, 05]
+
+20A4; [0D B1, 05, 05]
+
+20A5; [0D B3, 05, 05]
+
+20A6; [0D B5, 05, 05]
+
+20A7; [0D B7, 05, 05]
+
+20A9; [0D B9, 05, 05]
+FFE6; [0D B9, 05, 20]
+
+20AA; [0D BB, 05, 05]
+
+20AB; [0D BD, 05, 05]
+
+20AC; [0D BF, 05, 05]
+
+20AD; [0D C1, 05, 05]
+
+20AE; [0D C3, 05, 05]
+
+20AF; [0D C5, 05, 05]
+
+20B0; [0D C7, 05, 05]
+
+20B1; [0D C9, 05, 05]
+
+20B2; [0D CB, 05, 05]
+
+20B3; [0D CD, 05, 05]
+
+20B4; [0D CF, 05, 05]
+
+20B5; [0D D1, 05, 05]
+
+20B6; [0D D3, 05, 05]
+
+20B7; [0D D5, 05, 05]
+
+20B8; [0D D7, 05, 05]
+
+20B9; [0D D9, 05, 05]
+
+1ECB0; [0D DB, 05, 05]
+
+20BA; [0D DD, 05, 05]
+
+20BB; [0D DF, 05, 05]
+
+20BC; [0D E1, 05, 05]
+
+20BD; [0D E3, 05, 05]
+
+20BE; [0D E5, 05, 05]
+
+20BF; [0D E7, 05, 05]
+
+20A8; [0D E9, 05, 05]
+
+FDFC; [0D EB, 05, 05]
FDD1 0034; [0E 02 02, 05, 05] # DIGIT first primary starts new lead byte
@@ -15634,819 +16030,947 @@ A835; [10 28, 05, 05]
0BF2; [10 2E, 05, 05]
-0D58; [10 30, 05, 05]
+11FC0; [10 30, 05, 05]
+
+11FC1; [10 32, 05, 05]
+
+11FC2; [10 34, 05, 05]
+
+11FC3; [10 36, 05, 05]
+
+11FC4; [10 38, 05, 05]
+
+11FC5; [10 3A, 05, 05]
+
+11FC6; [10 3C, 05, 05]
+
+11FC7; [10 3E, 05, 05]
+
+11FC8; [10 40, 05, 05]
+
+11FC9; [10 42, 05, 05]
+
+11FCA; [10 44, 05, 05]
+
+11FCB; [10 46, 05, 05]
+
+11FCC; [10 48, 05, 05]
+
+11FCD; [10 4A, 05, 05]
+
+11FCE; [10 4C, 05, 05]
+
+11FCF; [10 4E, 05, 05]
+
+11FD0; [10 50, 05, 05]
+
+11FD1; [10 52, 05, 05]
+
+11FD2; [10 54, 05, 05]
+
+11FD3; [10 56, 05, 05]
+
+11FD4; [10 58, 05, 05]
+
+0D58; [10 5A, 05, 05]
+
+0D59; [10 5C, 05, 05]
+
+0D5A; [10 5E, 05, 05]
+
+0D5B; [10 60, 05, 05]
+
+0D5C; [10 62, 05, 05]
+
+0D5D; [10 64, 05, 05]
+
+0D5E; [10 66, 05, 05]
+
+0D70; [10 68, 05, 05]
+
+0D71; [10 6A, 05, 05]
+
+0D72; [10 6C, 05, 05]
+
+0D73; [10 6E, 05, 05]
+
+0D74; [10 70, 05, 05]
+
+0D75; [10 72, 05, 05]
+
+0D76; [10 74, 05, 05]
+
+0D77; [10 76, 05, 05]
+
+0D78; [10 78, 05, 05]
+
+1372; [10 7A, 05, 05]
+
+1373; [10 7C, 05, 05]
+
+1374; [10 7E, 05, 05]
+
+1375; [10 80, 05, 05]
+
+1376; [10 82, 05, 05]
+
+1377; [10 84, 05, 05]
+
+1378; [10 86, 05, 05]
-0D59; [10 32, 05, 05]
+1379; [10 88, 05, 05]
-0D5A; [10 34, 05, 05]
+137A; [10 8A, 05, 05]
-0D5B; [10 36, 05, 05]
+137B; [10 8C, 05, 05]
-0D5C; [10 38, 05, 05]
+137C; [10 8E, 05, 05]
-0D5D; [10 3A, 05, 05]
+2180; [10 90, 05, 05]
-0D5E; [10 3C, 05, 05]
+2181; [10 92, 05, 05]
-0D70; [10 3E, 05, 05]
+2182; [10 94, 05, 05]
-0D71; [10 40, 05, 05]
+2186; [10 96, 05, 05]
-0D72; [10 42, 05, 05]
+2187; [10 98, 05, 05]
-0D73; [10 44, 05, 05]
+2188; [10 9A, 05, 05]
-0D74; [10 46, 05, 05]
+10E69; [10 9C, 05, 05]
-0D75; [10 48, 05, 05]
+10E6A; [10 9E, 05, 05]
-0D76; [10 4A, 05, 05]
+10E6B; [10 A0, 05, 05]
-0D77; [10 4C, 05, 05]
+10E6C; [10 A2, 05, 05]
-0D78; [10 4E, 05, 05]
+10E6D; [10 A4, 05, 05]
-1372; [10 50, 05, 05]
+10E6E; [10 A6, 05, 05]
-1373; [10 52, 05, 05]
+10E6F; [10 A8, 05, 05]
-1374; [10 54, 05, 05]
+10E70; [10 AA, 05, 05]
-1375; [10 56, 05, 05]
+10E71; [10 AC, 05, 05]
-1376; [10 58, 05, 05]
+10E72; [10 AE, 05, 05]
-1377; [10 5A, 05, 05]
+10E73; [10 B0, 05, 05]
-1378; [10 5C, 05, 05]
+10E74; [10 B2, 05, 05]
-1379; [10 5E, 05, 05]
+10E75; [10 B4, 05, 05]
-137A; [10 60, 05, 05]
+10E76; [10 B6, 05, 05]
-137B; [10 62, 05, 05]
+10E77; [10 B8, 05, 05]
-137C; [10 64, 05, 05]
+10E78; [10 BA, 05, 05]
-2180; [10 66, 05, 05]
+10E79; [10 BC, 05, 05]
-2181; [10 68, 05, 05]
+10E7A; [10 BE, 05, 05]
-2182; [10 6A, 05, 05]
+10E7B; [10 C0, 05, 05]
-2186; [10 6C, 05, 05]
+10E7C; [10 C2, 05, 05]
-2187; [10 6E, 05, 05]
+10E7D; [10 C4, 05, 05]
-2188; [10 70, 05, 05]
+10E7E; [10 C6, 05, 05]
-10E69; [10 72, 05, 05]
+2CFD; [10 C8 02, 05, 05]
-10E6A; [10 74, 05, 05]
+10322; [10 C8 09, 05, 05]
-10E6B; [10 76, 05, 05]
+10323; [10 C8 10, 05, 05]
-10E6C; [10 78, 05, 05]
+10CFC; [10 C8 17, 05, 05]
-10E6D; [10 7A, 05, 05]
+10CFD; [10 C8 1E, 05, 05]
-10E6E; [10 7C, 05, 05]
+10CFE; [10 C8 25, 05, 05]
-10E6F; [10 7E, 05, 05]
+10CFF; [10 C8 2C, 05, 05]
-10E70; [10 80, 05, 05]
+10110; [10 CA, 05, 05]
-10E71; [10 82, 05, 05]
+10111; [10 CC, 05, 05]
-10E72; [10 84, 05, 05]
+10112; [10 CE, 05, 05]
-10E73; [10 86, 05, 05]
+10113; [10 D0, 05, 05]
-10E74; [10 88, 05, 05]
+10114; [10 D2, 05, 05]
-10E75; [10 8A, 05, 05]
+10115; [10 D4, 05, 05]
-10E76; [10 8C, 05, 05]
+10116; [10 D6, 05, 05]
-10E77; [10 8E, 05, 05]
+10117; [10 D8, 05, 05]
-10E78; [10 90, 05, 05]
+10118; [10 DA, 05, 05]
-10E79; [10 92, 05, 05]
+10119; [10 DC, 05, 05]
-10E7A; [10 94, 05, 05]
+1011A; [10 DE, 05, 05]
-10E7B; [10 96, 05, 05]
+1011B; [10 E0, 05, 05]
-10E7C; [10 98, 05, 05]
+1011C; [10 E2, 05, 05]
-10E7D; [10 9A, 05, 05]
+1011D; [10 E4, 05, 05]
-10E7E; [10 9C, 05, 05]
+1011E; [10 E6, 05, 05]
-2CFD; [10 9E 02, 05, 05]
+1011F; [10 E8, 05, 05]
-10322; [10 9E 09, 05, 05]
+10120; [10 EA, 05, 05]
-10323; [10 9E 10, 05, 05]
+10121; [10 EC, 05, 05]
-10CFC; [10 9E 17, 05, 05]
+10122; [10 EE, 05, 05]
-10CFD; [10 9E 1E, 05, 05]
+10123; [10 F0, 05, 05]
-10CFE; [10 9E 25, 05, 05]
+10124; [10 F2, 05, 05]
-10CFF; [10 9E 2C, 05, 05]
+10125; [10 F4, 05, 05]
-10110; [10 A0, 05, 05]
+10126; [10 F6, 05, 05]
-10111; [10 A2, 05, 05]
+10127; [10 F8, 05, 05]
-10112; [10 A4, 05, 05]
+10128; [10 FA, 05, 05]
-10113; [10 A6, 05, 05]
+10129; [10 FC, 05, 05]
-10114; [10 A8, 05, 05]
+1012A; [10 FE, 05, 05]
-10115; [10 AA, 05, 05]
+1012B; [11 02, 05, 05]
-10116; [10 AC, 05, 05]
+1012C; [11 04, 05, 05]
-10117; [10 AE, 05, 05]
+1012D; [11 06, 05, 05]
-10118; [10 B0, 05, 05]
+1012E; [11 08, 05, 05]
-10119; [10 B2, 05, 05]
+1012F; [11 0A, 05, 05]
-1011A; [10 B4, 05, 05]
+10130; [11 0C, 05, 05]
-1011B; [10 B6, 05, 05]
+10131; [11 0E, 05, 05]
-1011C; [10 B8, 05, 05]
+10132; [11 10, 05, 05]
-1011D; [10 BA, 05, 05]
+10133; [11 12, 05, 05]
-1011E; [10 BC, 05, 05]
+10140; [11 14, 05, 05]
-1011F; [10 BE, 05, 05]
+10141; [11 16, 05, 05]
-10120; [10 C0, 05, 05]
+10144; [11 18, 05, 05]
-10121; [10 C2, 05, 05]
+10145; [11 1A, 05, 05]
-10122; [10 C4, 05, 05]
+10146; [11 1C, 05, 05]
-10123; [10 C6, 05, 05]
+10147; [11 1E, 05, 05]
-10124; [10 C8, 05, 05]
+10149; [11 20, 05, 05]
-10125; [10 CA, 05, 05]
+1014A; [11 22, 05, 05]
-10126; [10 CC, 05, 05]
+1014B; [11 24, 05, 05]
-10127; [10 CE, 05, 05]
+1014C; [11 26, 05, 05]
-10128; [10 D0, 05, 05]
+1014D; [11 28, 05, 05]
-10129; [10 D2, 05, 05]
+1014E; [11 2A, 05, 05]
-1012A; [10 D4, 05, 05]
+10150; [11 2C, 05, 05]
-1012B; [10 D6, 05, 05]
+10151; [11 2E, 05, 05]
-1012C; [10 D8, 05, 05]
+10152; [11 30, 05, 05]
-1012D; [10 DA, 05, 05]
+10153; [11 32, 05, 05]
-1012E; [10 DC, 05, 05]
+10154; [11 34, 05, 05]
-1012F; [10 DE, 05, 05]
+10155; [11 36, 05, 05]
-10130; [10 E0, 05, 05]
+10156; [11 38, 05, 05]
-10131; [10 E2, 05, 05]
+10157; [11 3A, 05, 05]
-10132; [10 E4, 05, 05]
+10160; [11 3C, 05, 05]
-10133; [10 E6, 05, 05]
+10161; [11 3E, 05, 05]
-10140; [10 E8, 05, 05]
+10162; [11 40, 05, 05]
-10141; [10 EA, 05, 05]
+10163; [11 42, 05, 05]
-10144; [10 EC, 05, 05]
+10164; [11 44, 05, 05]
-10145; [10 EE, 05, 05]
+10165; [11 46, 05, 05]
-10146; [10 F0, 05, 05]
+10166; [11 48, 05, 05]
-10147; [10 F2, 05, 05]
+10167; [11 4A, 05, 05]
-10149; [10 F4, 05, 05]
+10168; [11 4C, 05, 05]
-1014A; [10 F6, 05, 05]
+10169; [11 4E, 05, 05]
-1014B; [10 F8, 05, 05]
+1016A; [11 50, 05, 05]
-1014C; [10 FA, 05, 05]
+1016B; [11 52, 05, 05]
-1014D; [10 FC, 05, 05]
+1016C; [11 54, 05, 05]
-1014E; [10 FE, 05, 05]
+1016D; [11 56, 05, 05]
-10150; [11 02, 05, 05]
+1016E; [11 58, 05, 05]
-10151; [11 04, 05, 05]
+1016F; [11 5A, 05, 05]
-10152; [11 06, 05, 05]
+10170; [11 5C, 05, 05]
-10153; [11 08, 05, 05]
+10171; [11 5E, 05, 05]
-10154; [11 0A, 05, 05]
+10172; [11 60, 05, 05]
-10155; [11 0C, 05, 05]
+10174; [11 62, 05, 05]
-10156; [11 0E, 05, 05]
+10175; [11 64, 05, 05]
-10157; [11 10, 05, 05]
+10176; [11 66, 05, 05]
-10160; [11 12, 05, 05]
+10177; [11 68, 05, 05]
-10161; [11 14, 05, 05]
+10178; [11 6A, 05, 05]
-10162; [11 16, 05, 05]
+1018B; [11 6C, 05, 05]
-10163; [11 18, 05, 05]
+102EA; [11 6E, 05, 05]
-10164; [11 1A, 05, 05]
+102EB; [11 70, 05, 05]
-10165; [11 1C, 05, 05]
+102EC; [11 72, 05, 05]
-10166; [11 1E, 05, 05]
+102ED; [11 74, 05, 05]
-10167; [11 20, 05, 05]
+102EE; [11 76, 05, 05]
-10168; [11 22, 05, 05]
+102EF; [11 78, 05, 05]
-10169; [11 24, 05, 05]
+102F0; [11 7A, 05, 05]
-1016A; [11 26, 05, 05]
+102F1; [11 7C, 05, 05]
-1016B; [11 28, 05, 05]
+102F2; [11 7E, 05, 05]
-1016C; [11 2A, 05, 05]
+102F3; [11 80, 05, 05]
-1016D; [11 2C, 05, 05]
+102F4; [11 82, 05, 05]
-1016E; [11 2E, 05, 05]
+102F5; [11 84, 05, 05]
-1016F; [11 30, 05, 05]
+102F6; [11 86, 05, 05]
-10170; [11 32, 05, 05]
+102F7; [11 88, 05, 05]
-10171; [11 34, 05, 05]
+102F8; [11 8A, 05, 05]
-10172; [11 36, 05, 05]
+102F9; [11 8C, 05, 05]
-10174; [11 38, 05, 05]
+102FA; [11 8E, 05, 05]
-10175; [11 3A, 05, 05]
+102FB; [11 90, 05, 05]
-10176; [11 3C, 05, 05]
+103D3; [11 92 02, 05, 05]
-10177; [11 3E, 05, 05]
+103D4; [11 92 09, 05, 05]
-10178; [11 40, 05, 05]
+103D5; [11 92 10, 05, 05]
-1018B; [11 42, 05, 05]
+1087E; [11 92 17, 05, 05]
-102EA; [11 44, 05, 05]
+1087F; [11 92 1E, 05, 05]
-102EB; [11 46, 05, 05]
+108AD; [11 92 25, 05, 05]
-102EC; [11 48, 05, 05]
+108AE; [11 92 2C, 05, 05]
-102ED; [11 4A, 05, 05]
+108AF; [11 92 33, 05, 05]
-102EE; [11 4C, 05, 05]
+108FD; [11 92 3A, 05, 05]
-102EF; [11 4E, 05, 05]
+108FE; [11 92 41, 05, 05]
-102F0; [11 50, 05, 05]
+108FF; [11 92 48, 05, 05]
-102F1; [11 52, 05, 05]
+10A7E; [11 92 4F, 05, 05]
-102F2; [11 54, 05, 05]
+10A9E; [11 92 56, 05, 05]
-102F3; [11 56, 05, 05]
+10A9F; [11 92 5D, 05, 05]
-102F4; [11 58, 05, 05]
+10917; [11 92 64, 05, 05]
-102F5; [11 5A, 05, 05]
+10918; [11 92 6B, 05, 05]
-102F6; [11 5C, 05, 05]
+10919; [11 92 72, 05, 05]
-102F7; [11 5E, 05, 05]
+1085B; [11 92 79, 05, 05]
-102F8; [11 60, 05, 05]
+1085C; [11 92 80, 05, 05]
-102F9; [11 62, 05, 05]
+1085D; [11 92 87, 05, 05]
-102FA; [11 64, 05, 05]
+1085E; [11 92 8E, 05, 05]
-102FB; [11 66, 05, 05]
+1085F; [11 92 95, 05, 05]
-103D3; [11 68 02, 05, 05]
+10AED; [11 92 9C, 05, 05]
-103D4; [11 68 09, 05, 05]
+10AEE; [11 92 A3, 05, 05]
-103D5; [11 68 10, 05, 05]
+10AEF; [11 92 AA, 05, 05]
-1087E; [11 68 17, 05, 05]
+10B5C; [11 92 B1, 05, 05]
-1087F; [11 68 1E, 05, 05]
+10B5D; [11 92 B8, 05, 05]
-108AD; [11 68 25, 05, 05]
+10B5E; [11 92 BF, 05, 05]
-108AE; [11 68 2C, 05, 05]
+10B5F; [11 92 C6, 05, 05]
-108AF; [11 68 33, 05, 05]
+10B7C; [11 92 CD, 05, 05]
-108FD; [11 68 3A, 05, 05]
+10B7D; [11 92 D4, 05, 05]
-108FE; [11 68 41, 05, 05]
+10B7E; [11 92 DB, 05, 05]
-108FF; [11 68 48, 05, 05]
+10B7F; [11 92 E2, 05, 05]
-10A7E; [11 68 4F, 05, 05]
+10BAD; [11 92 E9, 05, 05]
-10A9E; [11 68 56, 05, 05]
+10BAE; [11 92 F0, 05, 05]
-10A9F; [11 68 5D, 05, 05]
+10BAF; [11 92 F7, 05, 05]
-10917; [11 68 64, 05, 05]
+10F22; [11 92 FE, 05, 05]
-10918; [11 68 6B, 05, 05]
+10F23; [11 93 07, 05, 05]
-10919; [11 68 72, 05, 05]
+10F24; [11 93 0E, 05, 05]
-1085B; [11 68 79, 05, 05]
+10F25; [11 93 15, 05, 05]
-1085C; [11 68 80, 05, 05]
+10F26; [11 93 1C, 05, 05]
-1085D; [11 68 87, 05, 05]
+10F52; [11 93 23, 05, 05]
-1085E; [11 68 8E, 05, 05]
+10F53; [11 93 2A, 05, 05]
-1085F; [11 68 95, 05, 05]
+10F54; [11 93 31, 05, 05]
-10AED; [11 68 9C, 05, 05]
+1173A; [11 93 38, 05, 05]
-10AEE; [11 68 A3, 05, 05]
+1173B; [11 93 3F, 05, 05]
-10AEF; [11 68 AA, 05, 05]
+1105B; [11 93 46, 05, 05]
-10B5C; [11 68 B1, 05, 05]
+1105C; [11 93 4D, 05, 05]
-10B5D; [11 68 B8, 05, 05]
+1105D; [11 93 54, 05, 05]
-10B5E; [11 68 BF, 05, 05]
+1105E; [11 93 5B, 05, 05]
-10B5F; [11 68 C6, 05, 05]
+1105F; [11 93 62, 05, 05]
-10B7C; [11 68 CD, 05, 05]
+11060; [11 93 69, 05, 05]
-10B7D; [11 68 D4, 05, 05]
+11061; [11 93 70, 05, 05]
-10B7E; [11 68 DB, 05, 05]
+11062; [11 93 77, 05, 05]
-10B7F; [11 68 E2, 05, 05]
+11063; [11 93 7E, 05, 05]
-10BAD; [11 68 E9, 05, 05]
+11064; [11 93 85, 05, 05]
-10BAE; [11 68 F0, 05, 05]
+11065; [11 93 8C, 05, 05]
-10BAF; [11 68 F7, 05, 05]
+10A44; [11 93 93, 05, 05]
-10F22; [11 68 FE, 05, 05]
+10A45; [11 93 9A, 05, 05]
-10F23; [11 69 07, 05, 05]
+10A46; [11 93 A1, 05, 05]
-10F24; [11 69 0E, 05, 05]
+10A47; [11 93 A8, 05, 05]
-10F25; [11 69 15, 05, 05]
+10A48; [11 93 AF, 05, 05]
-10F26; [11 69 1C, 05, 05]
+11C63; [11 93 B6, 05, 05]
-10F52; [11 69 23, 05, 05]
+11C64; [11 93 BD, 05, 05]
-10F53; [11 69 2A, 05, 05]
+11C65; [11 93 C4, 05, 05]
-10F54; [11 69 31, 05, 05]
+11C66; [11 93 CB, 05, 05]
-1173A; [11 69 38, 05, 05]
+11C67; [11 93 D2, 05, 05]
-1173B; [11 69 3F, 05, 05]
+11C68; [11 93 D9, 05, 05]
-1105B; [11 69 46, 05, 05]
+11C69; [11 93 E0, 05, 05]
-1105C; [11 69 4D, 05, 05]
+11C6A; [11 93 E7, 05, 05]
-1105D; [11 69 54, 05, 05]
+11C6B; [11 93 EE, 05, 05]
-1105E; [11 69 5B, 05, 05]
+11C6C; [11 93 F5, 05, 05]
-1105F; [11 69 62, 05, 05]
+111EA; [11 95, 05, 05]
-11060; [11 69 69, 05, 05]
+111EB; [11 97, 05, 05]
-11061; [11 69 70, 05, 05]
+111EC; [11 99, 05, 05]
-11062; [11 69 77, 05, 05]
+111ED; [11 9B, 05, 05]
-11063; [11 69 7E, 05, 05]
+111EE; [11 9D, 05, 05]
-11064; [11 69 85, 05, 05]
+111EF; [11 9F, 05, 05]
-11065; [11 69 8C, 05, 05]
+111F0; [11 A1, 05, 05]
-10A44; [11 69 93, 05, 05]
+111F1; [11 A3, 05, 05]
-10A45; [11 69 9A, 05, 05]
+111F2; [11 A5, 05, 05]
-10A46; [11 69 A1, 05, 05]
+111F3; [11 A7, 05, 05]
-10A47; [11 69 A8, 05, 05]
+111F4; [11 A9, 05, 05]
-10A48; [11 69 AF, 05, 05]
+118EA; [11 AB 02, 05, 05]
-11C63; [11 69 B6, 05, 05]
+118EB; [11 AB 09, 05, 05]
-11C64; [11 69 BD, 05, 05]
+118EC; [11 AB 10, 05, 05]
-11C65; [11 69 C4, 05, 05]
+118ED; [11 AB 17, 05, 05]
-11C66; [11 69 CB, 05, 05]
+118EE; [11 AB 1E, 05, 05]
-11C67; [11 69 D2, 05, 05]
+118EF; [11 AB 25, 05, 05]
-11C68; [11 69 D9, 05, 05]
+118F0; [11 AB 2C, 05, 05]
-11C69; [11 69 E0, 05, 05]
+118F1; [11 AB 33, 05, 05]
-11C6A; [11 69 E7, 05, 05]
+118F2; [11 AB 3A, 05, 05]
-11C6B; [11 69 EE, 05, 05]
+16B5B; [11 AB 41, 05, 05]
-11C6C; [11 69 F5, 05, 05]
+16B5C; [11 AB 48, 05, 05]
-111EA; [11 6B, 05, 05]
+16B5D; [11 AB 4F, 05, 05]
-111EB; [11 6D, 05, 05]
+16B5E; [11 AB 56, 05, 05]
-111EC; [11 6F, 05, 05]
+16B5F; [11 AB 5D, 05, 05]
-111ED; [11 71, 05, 05]
+16B60; [11 AB 64, 05, 05]
-111EE; [11 73, 05, 05]
+16B61; [11 AB 6B, 05, 05]
-111EF; [11 75, 05, 05]
+16E8A; [11 AB 72, 05, 05]
-111F0; [11 77, 05, 05]
+16E8B; [11 AB 79, 05, 05]
-111F1; [11 79, 05, 05]
+16E8C; [11 AB 80, 05, 05]
-111F2; [11 7B, 05, 05]
+16E8D; [11 AB 87, 05, 05]
-111F3; [11 7D, 05, 05]
+16E8E; [11 AB 8E, 05, 05]
-111F4; [11 7F, 05, 05]
+16E8F; [11 AB 95, 05, 05]
-118EA; [11 81 02, 05, 05]
+16E90; [11 AB 9C, 05, 05]
-118EB; [11 81 09, 05, 05]
+16E91; [11 AB A3, 05, 05]
-118EC; [11 81 10, 05, 05]
+16E92; [11 AB AA, 05, 05]
-118ED; [11 81 17, 05, 05]
+16E93; [11 AB B1, 05, 05]
-118EE; [11 81 1E, 05, 05]
+1D2EA; [11 AD, 05, 05]
-118EF; [11 81 25, 05, 05]
+1D2EB; [11 AF, 05, 05]
-118F0; [11 81 2C, 05, 05]
+1D2EC; [11 B1, 05, 05]
-118F1; [11 81 33, 05, 05]
+1D2ED; [11 B3, 05, 05]
-118F2; [11 81 3A, 05, 05]
+1D2EE; [11 B5, 05, 05]
-16B5B; [11 81 41, 05, 05]
+1D2EF; [11 B7, 05, 05]
-16B5C; [11 81 48, 05, 05]
+1D2F0; [11 B9, 05, 05]
-16B5D; [11 81 4F, 05, 05]
+1D2F1; [11 BB, 05, 05]
-16B5E; [11 81 56, 05, 05]
+1D2F2; [11 BD, 05, 05]
-16B5F; [11 81 5D, 05, 05]
+1D2F3; [11 BF, 05, 05]
-16B60; [11 81 64, 05, 05]
+1EC7A; [11 C1, 05, 05]
-16B61; [11 81 6B, 05, 05]
+1EC7B; [11 C3, 05, 05]
-16E8A; [11 81 72, 05, 05]
+1EC7C; [11 C5, 05, 05]
-16E8B; [11 81 79, 05, 05]
+1EC7D; [11 C7, 05, 05]
-16E8C; [11 81 80, 05, 05]
+1EC7E; [11 C9, 05, 05]
-16E8D; [11 81 87, 05, 05]
+1EC7F; [11 CB, 05, 05]
-16E8E; [11 81 8E, 05, 05]
+1EC80; [11 CD, 05, 05]
-16E8F; [11 81 95, 05, 05]
+1EC81; [11 CF, 05, 05]
-16E90; [11 81 9C, 05, 05]
+1EC82; [11 D1, 05, 05]
-16E91; [11 81 A3, 05, 05]
+1EC83; [11 D3, 05, 05]
-16E92; [11 81 AA, 05, 05]
+1EC84; [11 D5, 05, 05]
-16E93; [11 81 B1, 05, 05]
+1EC85; [11 D7, 05, 05]
-1D2EA; [11 83, 05, 05]
+1EC86; [11 D9, 05, 05]
-1D2EB; [11 85, 05, 05]
+1EC87; [11 DB, 05, 05]
-1D2EC; [11 87, 05, 05]
+1EC88; [11 DD, 05, 05]
-1D2ED; [11 89, 05, 05]
+1EC89; [11 DF, 05, 05]
-1D2EE; [11 8B, 05, 05]
+1EC8A; [11 E1, 05, 05]
-1D2EF; [11 8D, 05, 05]
+1EC8B; [11 E3, 05, 05]
-1D2F0; [11 8F, 05, 05]
+1EC8C; [11 E5, 05, 05]
-1D2F1; [11 91, 05, 05]
+1EC8D; [11 E7, 05, 05]
-1D2F2; [11 93, 05, 05]
+1EC8E; [11 E9, 05, 05]
-1D2F3; [11 95, 05, 05]
+1EC8F; [11 EB, 05, 05]
-1EC7A; [11 97, 05, 05]
+1EC90; [11 ED, 05, 05]
-1EC7B; [11 99, 05, 05]
+1EC91; [11 EF, 05, 05]
-1EC7C; [11 9B, 05, 05]
+1EC92; [11 F1, 05, 05]
-1EC7D; [11 9D, 05, 05]
+1EC93; [11 F3, 05, 05]
-1EC7E; [11 9F, 05, 05]
+1EC94; [11 F5, 05, 05]
-1EC7F; [11 A1, 05, 05]
+1EC95; [11 F7, 05, 05]
-1EC80; [11 A3, 05, 05]
+1EC96; [11 F9, 05, 05]
-1EC81; [11 A5, 05, 05]
+1EC97; [11 FB, 05, 05]
-1EC82; [11 A7, 05, 05]
+1EC98; [11 FD, 05, 05]
-1EC83; [11 A9, 05, 05]
+1EC99; [11 FF, 05, 05]
-1EC84; [11 AB, 05, 05]
+1EC9A; [12 03, 05, 05]
-1EC85; [11 AD, 05, 05]
+1EC9B; [12 05, 05, 05]
-1EC86; [11 AF, 05, 05]
+1EC9C; [12 07, 05, 05]
-1EC87; [11 B1, 05, 05]
+1EC9D; [12 09, 05, 05]
-1EC88; [11 B3, 05, 05]
+1EC9E; [12 0B, 05, 05]
-1EC89; [11 B5, 05, 05]
+1EC9F; [12 0D, 05, 05]
-1EC8A; [11 B7, 05, 05]
+1ECA0; [12 0F, 05, 05]
-1EC8B; [11 B9, 05, 05]
+1ECA1; [12 11, 05, 05]
-1EC8C; [11 BB, 05, 05]
+1ECA2; [12 13, 05, 05]
-1EC8D; [11 BD, 05, 05]
+1ECAD; [12 15, 05, 05]
-1EC8E; [11 BF, 05, 05]
+1ECAE; [12 17, 05, 05]
-1EC8F; [11 C1, 05, 05]
+1ECAF; [12 19, 05, 05]
-1EC90; [11 C3, 05, 05]
+1ECB3; [12 1B, 05, 05]
-1EC91; [11 C5, 05, 05]
+1ECB4; [12 1D, 05, 05]
-1EC92; [11 C7, 05, 05]
+1ED0A; [12 1F, 05, 05]
-1EC93; [11 C9, 05, 05]
+1ED0B; [12 21, 05, 05]
-1EC94; [11 CB, 05, 05]
+1ED0C; [12 23, 05, 05]
-1EC95; [11 CD, 05, 05]
+1ED0D; [12 25, 05, 05]
-1EC96; [11 CF, 05, 05]
+1ED0E; [12 27, 05, 05]
-1EC97; [11 D1, 05, 05]
+1ED0F; [12 29, 05, 05]
-1EC98; [11 D3, 05, 05]
+1ED10; [12 2B, 05, 05]
-1EC99; [11 D5, 05, 05]
+1ED11; [12 2D, 05, 05]
-1EC9A; [11 D7, 05, 05]
+1ED12; [12 2F, 05, 05]
-1EC9B; [11 D9, 05, 05]
+1ED13; [12 31, 05, 05]
-1EC9C; [11 DB, 05, 05]
+1ED14; [12 33, 05, 05]
-1EC9D; [11 DD, 05, 05]
+1ED15; [12 35, 05, 05]
-1EC9E; [11 DF, 05, 05]
+1ED16; [12 37, 05, 05]
-1EC9F; [11 E1, 05, 05]
+1ED17; [12 39, 05, 05]
-1ECA0; [11 E3, 05, 05]
+1ED18; [12 3B, 05, 05]
-1ECA1; [11 E5, 05, 05]
+1ED19; [12 3D, 05, 05]
-1ECA2; [11 E7, 05, 05]
+1ED1A; [12 3F, 05, 05]
-1ECAD; [11 E9, 05, 05]
+1ED1B; [12 41, 05, 05]
-1ECAE; [11 EB, 05, 05]
+1ED1C; [12 43, 05, 05]
-1ECAF; [11 ED, 05, 05]
+1ED1D; [12 45, 05, 05]
-1ECB3; [11 EF, 05, 05]
+1ED1E; [12 47, 05, 05]
-1ECB4; [11 F1, 05, 05]
+1ED1F; [12 49, 05, 05]
-109C9; [11 F3 02, 05, 05]
+1ED20; [12 4B, 05, 05]
-109CA; [11 F3 09, 05, 05]
+1ED21; [12 4D, 05, 05]
-109CB; [11 F3 10, 05, 05]
+1ED22; [12 4F, 05, 05]
-109CC; [11 F3 17, 05, 05]
+1ED23; [12 51, 05, 05]
-109CD; [11 F3 1E, 05, 05]
+1ED24; [12 53, 05, 05]
-109CE; [11 F3 25, 05, 05]
+1ED25; [12 55, 05, 05]
-109CF; [11 F3 2C, 05, 05]
+1ED26; [12 57, 05, 05]
-109D2; [11 F3 33, 05, 05]
+1ED27; [12 59, 05, 05]
-109D3; [11 F3 3A, 05, 05]
+1ED28; [12 5B, 05, 05]
-109D4; [11 F3 41, 05, 05]
+1ED29; [12 5D, 05, 05]
-109D5; [11 F3 48, 05, 05]
+1ED2A; [12 5F, 05, 05]
-109D6; [11 F3 4F, 05, 05]
+1ED2B; [12 61, 05, 05]
-109D7; [11 F3 56, 05, 05]
+1ED2C; [12 63, 05, 05]
-109D8; [11 F3 5D, 05, 05]
+1ED2D; [12 65, 05, 05]
-109D9; [11 F3 64, 05, 05]
+1ED37; [12 67, 05, 05]
-109DA; [11 F3 6B, 05, 05]
+1ED38; [12 69, 05, 05]
-109DB; [11 F3 72, 05, 05]
+1ED39; [12 6B, 05, 05]
-109DC; [11 F3 79, 05, 05]
+1ED3A; [12 6D, 05, 05]
-109DD; [11 F3 80, 05, 05]
+1ED3B; [12 6F, 05, 05]
-109DE; [11 F3 87, 05, 05]
+1ED3C; [12 71, 05, 05]
-109DF; [11 F3 8E, 05, 05]
+1ED3D; [12 73, 05, 05]
-109E0; [11 F3 95, 05, 05]
+109C9; [12 75 02, 05, 05]
-109E1; [11 F3 9C, 05, 05]
+109CA; [12 75 09, 05, 05]
-109E2; [11 F3 A3, 05, 05]
+109CB; [12 75 10, 05, 05]
-109E3; [11 F3 AA, 05, 05]
+109CC; [12 75 17, 05, 05]
-109E4; [11 F3 B1, 05, 05]
+109CD; [12 75 1E, 05, 05]
-109E5; [11 F3 B8, 05, 05]
+109CE; [12 75 25, 05, 05]
-109E6; [11 F3 BF, 05, 05]
+109CF; [12 75 2C, 05, 05]
-109E7; [11 F3 C6, 05, 05]
+109D2; [12 75 33, 05, 05]
-109E8; [11 F3 CD, 05, 05]
+109D3; [12 75 3A, 05, 05]
-109E9; [11 F3 D4, 05, 05]
+109D4; [12 75 41, 05, 05]
-109EA; [11 F3 DB, 05, 05]
+109D5; [12 75 48, 05, 05]
-109EB; [11 F3 E2, 05, 05]
+109D6; [12 75 4F, 05, 05]
-109EC; [11 F3 E9, 05, 05]
+109D7; [12 75 56, 05, 05]
-109ED; [11 F3 F0, 05, 05]
+109D8; [12 75 5D, 05, 05]
-109EE; [11 F3 F7, 05, 05]
+109D9; [12 75 64, 05, 05]
-109EF; [11 F3 FE, 05, 05]
+109DA; [12 75 6B, 05, 05]
-109F0; [11 F4 07, 05, 05]
+109DB; [12 75 72, 05, 05]
-109F1; [11 F4 0E, 05, 05]
+109DC; [12 75 79, 05, 05]
-109F2; [11 F4 15, 05, 05]
+109DD; [12 75 80, 05, 05]
-109F3; [11 F4 1C, 05, 05]
+109DE; [12 75 87, 05, 05]
-109F4; [11 F4 23, 05, 05]
+109DF; [12 75 8E, 05, 05]
-109F5; [11 F4 2A, 05, 05]
+109E0; [12 75 95, 05, 05]
-109BD; [11 F4 31, 05, 05]
+109E1; [12 75 9C, 05, 05]
-109F6; [11 F4 38, 05, 05]
+109E2; [12 75 A3, 05, 05]
-109F7; [11 F4 3F, 05, 05]
+109E3; [12 75 AA, 05, 05]
-109F8; [11 F4 46, 05, 05]
+109E4; [12 75 B1, 05, 05]
-109F9; [11 F4 4D, 05, 05]
+109E5; [12 75 B8, 05, 05]
-109FA; [11 F4 54, 05, 05]
+109E6; [12 75 BF, 05, 05]
-109FB; [11 F4 5B, 05, 05]
+109E7; [12 75 C6, 05, 05]
-109FC; [11 F4 62, 05, 05]
+109E8; [12 75 CD, 05, 05]
-109FD; [11 F4 69, 05, 05]
+109E9; [12 75 D4, 05, 05]
-109FE; [11 F4 70, 05, 05]
+109EA; [12 75 DB, 05, 05]
-109FF; [11 F4 77, 05, 05]
+109EB; [12 75 E2, 05, 05]
-109BC; [11 F4 7E, 05, 05]
+109EC; [12 75 E9, 05, 05]
-12432; [11 F4 85, 05, 05]
+109ED; [12 75 F0, 05, 05]
-12433; [11 F4 8C, 05, 05]
+109EE; [12 75 F7, 05, 05]
-1245A; [11 F4 93, 05, 05]
+109EF; [12 75 FE, 05, 05]
-1245B; [11 F4 9A, 05, 05]
+109F0; [12 76 07, 05, 05]
-1245C; [11 F4 A1, 05, 05]
+109F1; [12 76 0E, 05, 05]
-1245D; [11 F4 A8, 05, 05]
+109F2; [12 76 15, 05, 05]
-1245E; [11 F4 AF, 05, 05]
+109F3; [12 76 1C, 05, 05]
-1245F; [11 F4 B6, 05, 05]
+109F4; [12 76 23, 05, 05]
-12460; [11 F4 BD, 05, 05]
+109F5; [12 76 2A, 05, 05]
-12461; [11 F4 C4, 05, 05]
+109BD; [12 76 31, 05, 05]
-12462; [11 F4 CB, 05, 05]
+109F6; [12 76 38, 05, 05]
-12463; [11 F4 D2, 05, 05]
+109F7; [12 76 3F, 05, 05]
-12464; [11 F4 D9, 05, 05]
+109F8; [12 76 46, 05, 05]
-12465; [11 F4 E0, 05, 05]
+109F9; [12 76 4D, 05, 05]
-12466; [11 F4 E7, 05, 05]
+109FA; [12 76 54, 05, 05]
-12467; [11 F4 EE, 05, 05]
+109FB; [12 76 5B, 05, 05]
-12468; [11 F4 F5, 05, 05]
+109FC; [12 76 62, 05, 05]
-1D369; [11 F6, 05, 05]
+109FD; [12 76 69, 05, 05]
-1D36A; [11 F8, 05, 05]
+109FE; [12 76 70, 05, 05]
-1D36B; [11 FA, 05, 05]
+109FF; [12 76 77, 05, 05]
-1D36C; [11 FC, 05, 05]
+109BC; [12 76 7E, 05, 05]
-1D36D; [11 FE, 05, 05]
+12432; [12 76 85, 05, 05]
-1D36E; [12 02, 05, 05]
+12433; [12 76 8C, 05, 05]
-1D36F; [12 04, 05, 05]
+1245A; [12 76 93, 05, 05]
-1D370; [12 06, 05, 05]
+1245B; [12 76 9A, 05, 05]
-1D371; [12 08, 05, 05]
+1245C; [12 76 A1, 05, 05]
+
+1245D; [12 76 A8, 05, 05]
+
+1245E; [12 76 AF, 05, 05]
+
+1245F; [12 76 B6, 05, 05]
+
+12460; [12 76 BD, 05, 05]
+
+12461; [12 76 C4, 05, 05]
+
+12462; [12 76 CB, 05, 05]
+
+12463; [12 76 D2, 05, 05]
+
+12464; [12 76 D9, 05, 05]
+
+12465; [12 76 E0, 05, 05]
+
+12466; [12 76 E7, 05, 05]
+
+12467; [12 76 EE, 05, 05]
+
+12468; [12 76 F5, 05, 05]
+
+1D369; [12 78, 05, 05]
+
+1D36A; [12 7A, 05, 05]
+
+1D36B; [12 7C, 05, 05]
+
+1D36C; [12 7E, 05, 05]
+
+1D36D; [12 80, 05, 05]
+
+1D36E; [12 82, 05, 05]
+
+1D36F; [12 84, 05, 05]
+
+1D370; [12 86, 05, 05]
+
+1D371; [12 88, 05, 05]
0030; [13, 05, 05]
0660; [13, 05, 05]
@@ -16508,6 +17032,8 @@ ABF0; [13, 05, 05]
16B50; [13, 05, 05]
16E80; [13, 05, 05]
1D2E0; [13, 05, 05]
+1E140; [13, 05, 05]
+1E2F0; [13, 05, 05]
1E950; [13, 05, 05]
FF10; [13, 05, 10]
0F33; [13, 05, 15]
@@ -16524,7 +17050,7 @@ FF10; [13, 05, 10]
2080; [13, 05, 29]
1F101; [13, 05, 15][06, 05, 1B]
1F100; [13, 05, 15][08, 05, 18]
-2189; [13, 05, 33][0C 94, 05, 20][19, 05, 33]
+2189; [13, 05, 33][0C 95, 05, 20][19, 05, 33]
3358; [13, 05, 15][U+70B9, 10]
0031; [15, 05, 05]
@@ -16626,10 +17152,13 @@ ABF1; [15, 05, 05]
1D360; [15, 05, 05]
1D372; [15, 05, 05]
1D377; [15, 05, 05]
+1E141; [15, 05, 05]
+1E2F1; [15, 05, 05]
1E8C7; [15, 05, 05]
1E951; [15, 05, 05]
1EC71; [15, 05, 05]
1ECA3; [15, 05, 05]
+1ED01; [15, 05, 05]
FF11; [15, 05, 10]
0F2A; [15, 05, 15]
1D7CF; [15, 05, 1A]
@@ -16648,16 +17177,16 @@ FF11; [15, 05, 10]
1ECB1; [15, 70, 05]
1F102; [15, 05, 15][06, 05, 1B]
2488; [15, 05, 15][08, 05, 18]
-215F; [15, 05, 33][0C 94, 05, 20]
-2152; [15, 05, 33][0C 94, 05, 20][15, 05, 33][13, 05, 33]
-00BD; [15, 05, 33][0C 94, 05, 20][17, 05, 33]
-2153; [15, 05, 33][0C 94, 05, 20][19, 05, 33]
-00BC; [15, 05, 33][0C 94, 05, 20][1B, 05, 33]
-2155; [15, 05, 33][0C 94, 05, 20][1D, 05, 33]
-2159; [15, 05, 33][0C 94, 05, 20][1F, 05, 33]
-2150; [15, 05, 33][0C 94, 05, 20][21, 05, 33]
-215B; [15, 05, 33][0C 94, 05, 20][23, 05, 33]
-2151; [15, 05, 33][0C 94, 05, 20][25, 05, 34]
+215F; [15, 05, 33][0C 95, 05, 20]
+2152; [15, 05, 33][0C 95, 05, 20][15, 05, 33][13, 05, 33]
+00BD; [15, 05, 33][0C 95, 05, 20][17, 05, 33]
+2153; [15, 05, 33][0C 95, 05, 20][19, 05, 33]
+00BC; [15, 05, 33][0C 95, 05, 20][1B, 05, 33]
+2155; [15, 05, 33][0C 95, 05, 20][1D, 05, 33]
+2159; [15, 05, 33][0C 95, 05, 20][1F, 05, 33]
+2150; [15, 05, 33][0C 95, 05, 20][21, 05, 33]
+215B; [15, 05, 33][0C 95, 05, 20][23, 05, 33]
+2151; [15, 05, 33][0C 95, 05, 20][25, 05, 34]
2469; [15, 05, 1F][13, 05, 1F]
24FE; [15, 05, 1F][13, 05, 1F]
277F; [15, 05, 1F][13, 05, 1F]
@@ -16814,10 +17343,13 @@ ABF2; [17, 05, 05]
1D2E2; [17, 05, 05]
1D361; [17, 05, 05]
1D373; [17, 05, 05]
+1E142; [17, 05, 05]
+1E2F2; [17, 05, 05]
1E8C8; [17, 05, 05]
1E952; [17, 05, 05]
1EC72; [17, 05, 05]
1ECA4; [17, 05, 05]
+1ED02; [17, 05, 05]
FF12; [17, 05, 10]
0F2B; [17, 05, 15]
1D7D0; [17, 05, 1A]
@@ -16834,10 +17366,11 @@ FF12; [17, 05, 10]
2082; [17, 05, 29]
16E95; [17, 70, 05]
1ECB2; [17, 70, 05]
+1ED2F; [17, 70, 05]
1F103; [17, 05, 15][06, 05, 1B]
2489; [17, 05, 15][08, 05, 18]
-2154; [17, 05, 33][0C 94, 05, 20][19, 05, 33]
-2156; [17, 05, 33][0C 94, 05, 20][1D, 05, 33]
+2154; [17, 05, 33][0C 95, 05, 20][19, 05, 33]
+2156; [17, 05, 33][0C 95, 05, 20][1D, 05, 33]
2473; [17, 05, 1F][13, 05, 1F]
24F4; [17, 05, 1F][13, 05, 1F]
3249; [17, 05, 1F][13, 05, 1F]
@@ -16967,10 +17500,13 @@ ABF3; [19, 05, 05]
1D2E3; [19, 05, 05]
1D362; [19, 05, 05]
1D374; [19, 05, 05]
+1E143; [19, 05, 05]
+1E2F3; [19, 05, 05]
1E8C9; [19, 05, 05]
1E953; [19, 05, 05]
1EC73; [19, 05, 05]
1ECA5; [19, 05, 05]
+1ED03; [19, 05, 05]
FF13; [19, 05, 10]
0F2C; [19, 05, 15]
1D7D1; [19, 05, 1A]
@@ -16986,11 +17522,12 @@ FF13; [19, 05, 10]
00B3; [19, 05, 24]
2083; [19, 05, 29]
16E96; [19, 70, 05]
+1ED30; [19, 70, 20]
1F104; [19, 05, 15][06, 05, 1B]
248A; [19, 05, 15][08, 05, 18]
-00BE; [19, 05, 33][0C 94, 05, 20][1B, 05, 33]
-2157; [19, 05, 33][0C 94, 05, 20][1D, 05, 33]
-215C; [19, 05, 33][0C 94, 05, 20][23, 05, 33]
+00BE; [19, 05, 33][0C 95, 05, 20][1B, 05, 33]
+2157; [19, 05, 33][0C 95, 05, 20][1D, 05, 33]
+215C; [19, 05, 33][0C 95, 05, 20][23, 05, 33]
324A; [19, 05, 1F][13, 05, 1F]
325A; [19, 05, 1F][13, 05, 1F]
33FD; [19, 05, 15][13, 05, 15][U+65E5, 10]
@@ -17101,10 +17638,13 @@ ABF4; [1B, 05, 05]
1D2E4; [1B, 05, 05]
1D363; [1B, 05, 05]
1D375; [1B, 05, 05]
+1E144; [1B, 05, 05]
+1E2F4; [1B, 05, 05]
1E8CA; [1B, 05, 05]
1E954; [1B, 05, 05]
1EC74; [1B, 05, 05]
1ECA6; [1B, 05, 05]
+1ED04; [1B, 05, 05]
FF14; [1B, 05, 10]
0F2D; [1B, 05, 15]
1D7D2; [1B, 05, 1A]
@@ -17119,9 +17659,10 @@ FF14; [1B, 05, 10]
278D; [1B, 05, 1F]
2074; [1B, 05, 24]
2084; [1B, 05, 29]
+1ED31; [1B, 70, 05]
1F105; [1B, 05, 15][06, 05, 1B]
248B; [1B, 05, 15][08, 05, 18]
-2158; [1B, 05, 33][0C 94, 05, 20][1D, 05, 33]
+2158; [1B, 05, 33][0C 95, 05, 20][1D, 05, 33]
324B; [1B, 05, 1F][13, 05, 1F]
32B5; [1B, 05, 1F][13, 05, 1F]
32B6; [1B, 05, 1F][15, 05, 1F]
@@ -17231,10 +17772,13 @@ ABF5; [1D, 05, 05]
1D364; [1D, 05, 05]
1D376; [1D, 05, 05]
1D378; [1D, 05, 05]
+1E145; [1D, 05, 05]
+1E2F5; [1D, 05, 05]
1E8CB; [1D, 05, 05]
1E955; [1D, 05, 05]
1EC75; [1D, 05, 05]
1ECA7; [1D, 05, 05]
+1ED05; [1D, 05, 05]
FF15; [1D, 05, 10]
0F2E; [1D, 05, 15]
1D7D3; [1D, 05, 1A]
@@ -17249,11 +17793,12 @@ FF15; [1D, 05, 10]
278E; [1D, 05, 1F]
2075; [1D, 05, 24]
2085; [1D, 05, 29]
+1ED32; [1D, 70, 05]
1F106; [1D, 05, 15][06, 05, 1B]
248C; [1D, 05, 15][08, 05, 18]
1F1A0; [1D, 05, 2E][08, 05, 30][15, 05, 2E]
-215A; [1D, 05, 33][0C 94, 05, 20][1F, 05, 33]
-215D; [1D, 05, 33][0C 94, 05, 20][23, 05, 33]
+215A; [1D, 05, 33][0C 95, 05, 20][1F, 05, 33]
+215D; [1D, 05, 33][0C 95, 05, 20][23, 05, 33]
324C; [1D, 05, 1F][13, 05, 1F]
32BF; [1D, 05, 1F][13, 05, 1F]
33E4; [1D, 05, 15][U+65E5, 10]
@@ -17336,10 +17881,13 @@ ABF6; [1F, 05, 05]
16E86; [1F, 05, 05]
1D2E6; [1F, 05, 05]
1D365; [1F, 05, 05]
+1E146; [1F, 05, 05]
+1E2F6; [1F, 05, 05]
1E8CC; [1F, 05, 05]
1E956; [1F, 05, 05]
1EC76; [1F, 05, 05]
1ECA8; [1F, 05, 05]
+1ED06; [1F, 05, 05]
FF16; [1F, 05, 10]
0F2F; [1F, 05, 15]
1D7D4; [1F, 05, 1A]
@@ -17354,6 +17902,7 @@ FF16; [1F, 05, 10]
278F; [1F, 05, 1F]
2076; [1F, 05, 24]
2086; [1F, 05, 29]
+1ED33; [1F, 70, 05]
1F107; [1F, 05, 15][06, 05, 1B]
248D; [1F, 05, 15][08, 05, 18]
324D; [1F, 05, 1F][13, 05, 1F]
@@ -17438,10 +17987,13 @@ ABF7; [21, 05, 05]
16E87; [21, 05, 05]
1D2E7; [21, 05, 05]
1D366; [21, 05, 05]
+1E147; [21, 05, 05]
+1E2F7; [21, 05, 05]
1E8CD; [21, 05, 05]
1E957; [21, 05, 05]
1EC77; [21, 05, 05]
1ECA9; [21, 05, 05]
+1ED07; [21, 05, 05]
FF17; [21, 05, 10]
0F30; [21, 05, 15]
1D7D5; [21, 05, 1A]
@@ -17456,10 +18008,11 @@ FF17; [21, 05, 10]
2790; [21, 05, 1F]
2077; [21, 05, 24]
2087; [21, 05, 29]
+1ED34; [21, 70, 05]
1F108; [21, 05, 15][06, 05, 1B]
248E; [21, 05, 15][08, 05, 18]
1F1A1; [21, 05, 2E][08, 05, 30][15, 05, 2E]
-215E; [21, 05, 33][0C 94, 05, 20][23, 05, 33]
+215E; [21, 05, 33][0C 95, 05, 20][23, 05, 33]
324E; [21, 05, 1F][13, 05, 1F]
33E6; [21, 05, 15][U+65E5, 10]
32C6; [21, 05, 15][U+6708, 10]
@@ -17540,10 +18093,13 @@ ABF8; [23, 05, 05]
16E88; [23, 05, 05]
1D2E8; [23, 05, 05]
1D367; [23, 05, 05]
+1E148; [23, 05, 05]
+1E2F8; [23, 05, 05]
1E8CE; [23, 05, 05]
1E958; [23, 05, 05]
1EC78; [23, 05, 05]
1ECAA; [23, 05, 05]
+1ED08; [23, 05, 05]
FF18; [23, 05, 10]
0F31; [23, 05, 15]
1D7D6; [23, 05, 1A]
@@ -17558,6 +18114,7 @@ FF18; [23, 05, 10]
2791; [23, 05, 1F]
2078; [23, 05, 24]
2088; [23, 05, 29]
+1ED35; [23, 70, 05]
1F109; [23, 05, 15][06, 05, 1B]
248F; [23, 05, 15][08, 05, 18]
324F; [23, 05, 1F][13, 05, 1F]
@@ -17643,10 +18200,13 @@ ABF9; [25, 05, 05]
16E89; [25, 05, 05]
1D2E9; [25, 05, 05]
1D368; [25, 05, 05]
+1E149; [25, 05, 05]
+1E2F9; [25, 05, 05]
1E8CF; [25, 05, 05]
1E959; [25, 05, 05]
1EC79; [25, 05, 05]
1ECAB; [25, 05, 05]
+1ED09; [25, 05, 05]
FF19; [25, 05, 10]
0F32; [25, 05, 16]
1D7D7; [25, 05, 1C]
@@ -17661,6 +18221,7 @@ FF19; [25, 05, 10]
2792; [25, 05, 22]
2079; [25, 05, 28]
2089; [25, 05, 2E]
+1ED36; [25, 70, 05]
1F10A; [25, 05, 16][06, 05, 1B]
2490; [25, 05, 16][08, 05, 18]
33E8; [25, 05, 16][U+65E5, 10]
@@ -17778,7 +18339,7 @@ A79A; [2A, 05, A2][, 96, 20]
2100; [2A, 05, 13][0A 8A, 05, 2E][2E, 05, 13]
2101; [2A, 05, 13][0A 8A, 05, 2E][4E, 05, 13]
214D; [2A, 05, A2][0A 8A, 05, 2E][4E, 05, A2]
-33DF; [2A, 05, B4][0C 92, 05, 20][42, 05, 31]
+33DF; [2A, 05, B4][0C 93, 05, 20][42, 05, 31]
A733; [2A, 05, 13][2A, 05, 13]
A732; [2A, 05, A2][2A, 05, A2]
1F18E; [2A, 05, B4][2C, 05, B1]
@@ -17812,31 +18373,34 @@ A73C; [2A, 05, A2][5A, 05, A2]
1D8F; [2B 0A, 05, 05]
-1D01; [2B 0C, 05, 05]
+A7BB; [2B 0C, 05, 05]
+A7BA; [2B 0C, 05, A0]
+
+1D01; [2B 0E, 05, 05]
-1D02; [2B 0E, 05, 05]
-1D46; [2B 0E, 05, 20]
+1D02; [2B 10, 05, 05]
+1D46; [2B 10, 05, 20]
-AB31; [2B 10, 05, 05]
+AB31; [2B 12, 05, 05]
-0250; [2B 12, 05, 05]
-2C6F; [2B 12, 05, A0]
-1D44; [2B 12, 05, 2E]
+0250; [2B 14, 05, 05]
+2C6F; [2B 14, 05, A0]
+1D44; [2B 14, 05, 2E]
-0251; [2B 14, 05, 05]
-1DE7; [2B 14, 05, 10]
-2C6D; [2B 14, 05, 9E]
-1D45; [2B 14, 05, 2C]
+0251; [2B 16, 05, 05]
+1DE7; [2B 16, 05, 10]
+2C6D; [2B 16, 05, 9E]
+1D45; [2B 16, 05, 2C]
-AB30; [2B 16, 05, 05]
+AB30; [2B 18, 05, 05]
-1D90; [2B 18, 05, 05]
+1D90; [2B 1A, 05, 05]
-0252; [2B 1A, 05, 05]
-2C70; [2B 1A, 05, A0]
-1D9B; [2B 1A, 05, 2E]
+0252; [2B 1C, 05, 05]
+2C70; [2B 1C, 05, A0]
+1D9B; [2B 1C, 05, 2E]
-AB64; [2B 1C, 05, 05]
+AB64; [2B 1E, 05, 05]
0062; [2C, 05, 05]
FF42; [2C, 05, 10]
@@ -17966,7 +18530,7 @@ FF23; [2E, 05, 9F]
1E08; [2E, 05, 9C][, A0, 05][, 88, 05]
2105; [2E, 05, 13][0A 8A, 05, 2E][46, 05, 13]
2106; [2E, 05, 13][0A 8A, 05, 2E][52, 05, 13]
-33C6; [2E, 05, B1][0C 92, 05, 20][3E, 05, 31][36, 05, 2E]
+33C6; [2E, 05, B1][0C 93, 05, 20][3E, 05, 31][36, 05, 2E]
3388; [2E, 05, 2E][2A, 05, 31][40, 05, 31]
33C4; [2E, 05, 2E][2E, 05, 2E]
1F12D; [2E, 05, A8][30, 05, A8]
@@ -17987,6 +18551,7 @@ A793; [2F 0A, 05, 05]
A792; [2F 0A, 05, A0]
A794; [2F 0C, 05, 05]
+A7C4; [2F 0C, 05, A0]
0188; [2F 0E, 05, 05]
0187; [2F 0E, 05, A0]
@@ -18079,6 +18644,7 @@ A779; [30, 78, A0]
01C6; [30, 05, 13][5C, 05, 13][, 90, 20]
01C5; [30, 05, A2][5C, 05, 13][, 90, 20]
01C4; [30, 05, A2][5C, 05, A2][, 90, 20]
+AB66; [30, 05, 13][5D 10, 05, 20]
02A5; [30, 05, 13][5D 12, 05, 20]
02A4; [30, 05, 13][5D 1A, 05, 10]
@@ -18627,11 +19193,14 @@ A7F7; [3B 0C, 05, 05]
1D96; [3B 14, 05, 05]
-0269; [3B 16, 05, 05]
-0196; [3B 16, 05, A0]
-1DA5; [3B 16, 05, 2E]
+A7BD; [3B 16, 05, 05]
+A7BC; [3B 16, 05, A0]
-1D7C; [3B 18, 05, 05]
+0269; [3B 18, 05, 05]
+0196; [3B 18, 05, A0]
+1DA5; [3B 18, 05, 2E]
+
+1D7C; [3B 1A, 05, 05]
006A; [3C, 05, 05]
FF4A; [3C, 05, 10]
@@ -18842,8 +19411,8 @@ FF2C; [40, 05, 9F]
1E3C; [40, 05, 9C][, CC, 05]
1E3B; [40, 05, 05][, D2, 05]
1E3A; [40, 05, 9C][, D2, 05]
-0140; [40, 05, 05][, FB D6, 05]
-013F; [40, 05, 9C][, FB D6, 05]
+0140; [40, 05, 05][, FB 99, 05]
+013F; [40, 05, 9C][, FB 99, 05]
01C9; [40, 05, 13][3C, 05, 13]
01C8; [40, 05, A2][3C, 05, 13]
01C7; [40, 05, A2][3C, 05, A2]
@@ -18959,8 +19528,8 @@ FF2D; [42, 05, 9F]
1E40; [42, 05, 9C][, 9C, 05]
1E43; [42, 05, 05][, C4, 05]
1E42; [42, 05, 9C][, C4, 05]
-33A7; [42, 05, 31][0C 92, 05, 20][4E, 05, 31]
-33A8; [42, 05, 31][0C 92, 05, 20][4E, 05, 31][17, 05, 2E]
+33A7; [42, 05, 31][0C 93, 05, 20][4E, 05, 31]
+33A8; [42, 05, 31][0C 93, 05, 20][4E, 05, 31][17, 05, 2E]
33A1; [42, 05, 31][17, 05, 2E]
33A5; [42, 05, 31][19, 05, 2E]
3383; [42, 05, 31][2A, 05, B4]
@@ -18977,6 +19546,7 @@ FF2D; [42, 05, 9F]
33A3; [42, 05, 31][42, 05, 31][19, 05, 2E]
33D6; [42, 05, 31][46, 05, 31][40, 05, 31]
33AB; [42, 05, B4][48, 05, B4][2A, 05, 31]
+1F16C; [42, 05, 2B][4C, 05, 2B]
33B3; [42, 05, 31][4E, 05, 31]
33B7; [42, 05, 31][54, 05, B4]
33B9; [42, 05, B4][54, 05, B4]
@@ -19507,8 +20077,8 @@ A7A6; [4C, 05, A2][, AA, 20]
A783; [4C, 70, 05]
A782; [4C, 70, A0]
33AD; [4C, 05, 31][2A, 05, 31][30, 05, 2E]
-33AE; [4C, 05, 31][2A, 05, 31][30, 05, 2E][0C 92, 05, 20][4E, 05, 31]
-33AF; [4C, 05, 31][2A, 05, 31][30, 05, 2E][0C 92, 05, 20][4E, 05, 31][17, 05, 2E]
+33AE; [4C, 05, 31][2A, 05, 31][30, 05, 2E][0C 93, 05, 20][4E, 05, 31]
+33AF; [4C, 05, 31][2A, 05, 31][30, 05, 2E][0C 93, 05, 20][4E, 05, 31][17, 05, 2E]
AB45; [4D 06, 05, 05]
@@ -19661,7 +20231,8 @@ A731; [4F 06, 05, 05]
1D8A; [4F 0A, 05, 05]
0282; [4F 0C, 05, 05]
-1DB3; [4F 0C, 05, 20]
+A7C5; [4F 0C, 05, 9E]
+1DB3; [4F 0C, 05, 2C]
023F; [4F 0E, 05, 05]
2C7E; [4F 0E, 05, A0]
@@ -19750,6 +20321,7 @@ A786; [50, 78, A0]
2122; [50, 05, 2B][42, 05, 2B]
01BE; [50, 05, 13][4E, 05, 13]
02A6; [50, 05, 13][4E, 05, 13]
+AB67; [50, 05, 13][4F 0C, 05, 10]
02A7; [50, 05, 13][4F 14, 05, 10]
A729; [50, 05, 13][5C, 05, 13]
A728; [50, 05, A2][5C, 05, 13]
@@ -19884,7 +20456,7 @@ A79E; [52, 05, A2][, 96, 20]
1E75; [52, 05, 05][, D0, 05]
1E74; [52, 05, 9C][, D0, 05]
1F1AB; [52, 05, B1][38, 05, B4][30, 05, B1]
-1F199; [52, 05, B1][48, 05, B4][07 56, 05, 30]
+1F199; [52, 05, B1][48, 05, B4][07 5A, 05, 30]
1D1C; [53 06, 05, 05]
1DB8; [53 06, 05, 20]
@@ -19918,30 +20490,33 @@ A7B8; [53 18, 05, A0]
AB52; [53 1E, 05, 05]
AB5F; [53 1E, 05, 20]
-0265; [53 20, 05, 05]
-A78D; [53 20, 05, A0]
-1DA3; [53 20, 05, 2E]
+A7BF; [53 20, 05, 05]
+A7BE; [53 20, 05, A0]
+
+0265; [53 22, 05, 05]
+A78D; [53 22, 05, A0]
+1DA3; [53 22, 05, 2E]
-02AE; [53 22, 05, 05]
+02AE; [53 24, 05, 05]
-02AF; [53 24, 05, 05]
+02AF; [53 26, 05, 05]
-026F; [53 26, 05, 05]
-019C; [53 26, 05, A0]
-1D5A; [53 26, 05, 2E]
+026F; [53 28, 05, 05]
+019C; [53 28, 05, A0]
+1D5A; [53 28, 05, 2E]
-A7FA; [53 28, 05, 05]
+A7FA; [53 2A, 05, 05]
-1D1F; [53 2A, 05, 05]
+1D1F; [53 2C, 05, 05]
-0270; [53 2C, 05, 05]
-1DAD; [53 2C, 05, 20]
+0270; [53 2E, 05, 05]
+1DAD; [53 2E, 05, 20]
-028A; [53 2E, 05, 05]
-01B1; [53 2E, 05, A0]
-1DB7; [53 2E, 05, 2E]
+028A; [53 30, 05, 05]
+01B1; [53 30, 05, A0]
+1DB7; [53 30, 05, 2E]
-1D7F; [53 30, 05, 05]
+1D7F; [53 32, 05, 05]
0076; [54, 05, 05]
FF56; [54, 05, 10]
@@ -19988,7 +20563,7 @@ FF36; [54, 05, 9F]
1E7C; [54, 05, 9C][, 9A, 05]
1E7F; [54, 05, 05][, C4, 05]
1E7E; [54, 05, 9C][, C4, 05]
-33DE; [54, 05, B4][0C 92, 05, 20][42, 05, 31]
+33DE; [54, 05, B4][0C 93, 05, 20][42, 05, 31]
2175; [54, 05, 13][3A, 05, 13]
2165; [54, 05, A2][3A, 05, A2]
2176; [54, 05, 13][3A, 05, 13][3A, 05, 13]
@@ -20080,10 +20655,13 @@ FF37; [56, 05, A4]
1D21; [57 06, 05, 05]
-2C73; [57 08, 05, 05]
-2C72; [57 08, 05, A0]
+A7C3; [57 08, 05, 05]
+A7C2; [57 08, 05, A0]
-028D; [57 0A, 05, 05]
+2C73; [57 0A, 05, 05]
+2C72; [57 0A, 05, A0]
+
+028D; [57 0C, 05, 05]
0078; [58, 05, 05]
FF58; [58, 05, 10]
@@ -20282,12 +20860,13 @@ FF3A; [5C, 05, 9F]
1D76; [5D 0A, 05, 05]
1D8E; [5D 0C, 05, 05]
+A7C6; [5D 0C, 05, A0]
0225; [5D 0E, 05, 05]
0224; [5D 0E, 05, A0]
0290; [5D 10, 05, 05]
-1DBC; [5D 10, 05, 20]
+1DBC; [5D 10, 05, 2E]
0291; [5D 12, 05, 05]
1DBD; [5D 12, 05, 2E]
@@ -22555,103 +23134,103 @@ FDD1 05D0; [65 04 02, 05, 05] # HEBREW first primary starts new lead byte (compr
05D0; [65 06, 05, 05]
2135; [65 06, 05, 20]
FB21; [65 06, 05, 2E]
-FB2E; [65 06, 05, 05][, E3 14, 05]
-FB2F; [65 06, 05, 05][, E3 36, 05]
-FB30; [65 06, 05, 05][, E3 E0, 05]
+FB2E; [65 06, 05, 05][, E3 0C, 05]
+FB2F; [65 06, 05, 05][, E3 2D, 05]
+FB30; [65 06, 05, 05][, E3 D2, 05]
FB4F; [65 06, 05, 20][65 1C, 05, 20]
05D1; [65 08, 05, 05]
2136; [65 08, 05, 20]
-FB31; [65 08, 05, 05][, E3 E0, 05]
-FB4C; [65 08, 05, 05][, E4 04, 05]
+FB31; [65 08, 05, 05][, E3 D2, 05]
+FB4C; [65 08, 05, 05][, E3 F3, 05]
05D2; [65 0A, 05, 05]
2137; [65 0A, 05, 20]
-FB32; [65 0A, 05, 05][, E3 E0, 05]
+FB32; [65 0A, 05, 05][, E3 D2, 05]
05D3; [65 0C, 05, 05]
2138; [65 0C, 05, 20]
FB22; [65 0C, 05, 2E]
-FB33; [65 0C, 05, 05][, E3 E0, 05]
+FB33; [65 0C, 05, 05][, E3 D2, 05]
05D4; [65 0E, 05, 05]
FB23; [65 0E, 05, 2E]
-FB34; [65 0E, 05, 05][, E3 E0, 05]
+FB34; [65 0E, 05, 05][, E3 D2, 05]
05D5; [65 10, 05, 05]
-FB4B; [65 10, 05, 05][, E3 58, 05]
-FB35; [65 10, 05, 05][, E3 E0, 05]
+FB4B; [65 10, 05, 05][, E3 4E, 05]
+FB35; [65 10, 05, 05][, E3 D2, 05]
05F0; [65 10, 05, 20][65 10, 05, 20]
05F1; [65 10, 05, 20][65 18, 05, 20]
05D6; [65 12, 05, 05]
-FB36; [65 12, 05, 05][, E3 E0, 05]
+FB36; [65 12, 05, 05][, E3 D2, 05]
05D7; [65 14, 05, 05]
05D8; [65 16, 05, 05]
-FB38; [65 16, 05, 05][, E3 E0, 05]
+FB38; [65 16, 05, 05][, E3 D2, 05]
05D9; [65 18, 05, 05]
-FB1D; [65 18, 05, 05][, E2 AC, 05]
-FB39; [65 18, 05, 05][, E3 E0, 05]
+FB1D; [65 18, 05, 05][, E2 A7, 05]
+FB39; [65 18, 05, 05][, E3 D2, 05]
05EF; [65 18, 05, 20][65 0E, 05, 20][65 10, 05, 20][65 0E, 05, 20]
05F2; [65 18, 05, 20][65 18, 05, 20]
-FB1F; [65 18, 05, 20][65 18, 05, 20][, E3 14, 05]
+FB1F; [65 18, 05, 20][65 18, 05, 20][, E3 0C, 05]
05DB; [65 1A, 05, 05]
FB24; [65 1A, 05, 20]
05DA; [65 1A, 05, 2E]
-FB3B; [65 1A, 05, 05][, E3 E0, 05]
-FB3A; [65 1A, 05, 2E][, E3 E0, 05]
-FB4D; [65 1A, 05, 05][, E4 04, 05]
+FB3B; [65 1A, 05, 05][, E3 D2, 05]
+FB3A; [65 1A, 05, 2E][, E3 D2, 05]
+FB4D; [65 1A, 05, 05][, E3 F3, 05]
05DC; [65 1C, 05, 05]
FB25; [65 1C, 05, 2E]
-FB3C; [65 1C, 05, 05][, E3 E0, 05]
+FB3C; [65 1C, 05, 05][, E3 D2, 05]
05DE; [65 1E, 05, 05]
FB26; [65 1E, 05, 20]
05DD; [65 1E, 05, 2E]
-FB3E; [65 1E, 05, 05][, E3 E0, 05]
+FB3E; [65 1E, 05, 05][, E3 D2, 05]
05E0; [65 20, 05, 05]
05DF; [65 20, 05, 20]
-FB40; [65 20, 05, 05][, E3 E0, 05]
+FB40; [65 20, 05, 05][, E3 D2, 05]
05E1; [65 22, 05, 05]
-FB41; [65 22, 05, 05][, E3 E0, 05]
+FB41; [65 22, 05, 05][, E3 D2, 05]
05E2; [65 24, 05, 05]
FB20; [65 24, 05, 20]
05E4; [65 26, 05, 05]
05E3; [65 26, 05, 20]
-FB44; [65 26, 05, 05][, E3 E0, 05]
-FB43; [65 26, 05, 20][, E3 E0, 05]
-FB4E; [65 26, 05, 05][, E4 04, 05]
+FB44; [65 26, 05, 05][, E3 D2, 05]
+FB43; [65 26, 05, 20][, E3 D2, 05]
+FB4E; [65 26, 05, 05][, E3 F3, 05]
05E6; [65 28, 05, 05]
05E5; [65 28, 05, 20]
-FB46; [65 28, 05, 05][, E3 E0, 05]
+FB46; [65 28, 05, 05][, E3 D2, 05]
05E7; [65 2A, 05, 05]
-FB47; [65 2A, 05, 05][, E3 E0, 05]
+FB47; [65 2A, 05, 05][, E3 D2, 05]
05E8; [65 2C, 05, 05]
FB27; [65 2C, 05, 20]
-FB48; [65 2C, 05, 05][, E3 E0, 05]
+FB48; [65 2C, 05, 05][, E3 D2, 05]
05E9; [65 2E, 05, 05]
-FB2B; [65 2E, 05, 05][, E3 9C, 05]
-FB2A; [65 2E, 05, 05][, E3 BE, 05]
-FB49; [65 2E, 05, 05][, E3 E0, 05]
-FB2D; [65 2E, 05, 05][, E3 E0, 05][, E3 9C, 05]
-FB2C; [65 2E, 05, 05][, E3 E0, 05][, E3 BE, 05]
+FB2B; [65 2E, 05, 05][, E3 90, 05]
+FB2A; [65 2E, 05, 05][, E3 B1, 05]
+FB49; [65 2E, 05, 05][, E3 D2, 05]
+FB2D; [65 2E, 05, 05][, E3 D2, 05][, E3 90, 05]
+FB2C; [65 2E, 05, 05][, E3 D2, 05][, E3 B1, 05]
05EA; [65 30, 05, 05]
FB28; [65 30, 05, 20]
-FB4A; [65 30, 05, 05][, E3 E0, 05]
+FB4A; [65 30, 05, 05][, E3 D2, 05]
FDD1 10900; [65 32 02, 05, 05] # Phoenician first primary (compressible)
@@ -22847,8 +23426,8 @@ FBF6; [66 16, 05, 31][66 F6, 05, 31]
1EE80; [66 1A, 05, 1B]
FE8E; [66 1A, 05, 26]
FE8D; [66 1A, 05, 31]
-FD3C; [66 1A, 05, 26][, E5 C0, 1E]
-FD3D; [66 1A, 05, 31][, E5 C0, 2C]
+FD3C; [66 1A, 05, 26][, E5 A4, 1E]
+FD3D; [66 1A, 05, 31][, E5 A4, 2C]
0675; [66 1A, 05, 10][66 06, 05, 20]
FDF3; [66 1A, 05, 31][66 B6, 05, 30][66 1E, 05, 30][66 6E, 05, 2C]
FDF2; [66 1A, 05, 31][66 C4, 05, 30][66 C4, 05, 30][66 D6, 05, 30]
@@ -23155,7 +23734,7 @@ FEA9; [66 54, 05, 2C]
1EEB8; [66 56, 05, 10]
FEAC; [66 56, 05, 1E]
FEAB; [66 56, 05, 2C]
-FC5B; [66 56, 05, 2C][, EB 82, 2C]
+FC5B; [66 56, 05, 2C][, EB 3B, 2C]
0688; [66 58, 05, 05]
FB89; [66 58, 05, 20]
@@ -23197,7 +23776,7 @@ FB86; [66 66, 05, 2E]
1EEB3; [66 6E, 05, 10]
FEAE; [66 6E, 05, 1E]
FEAD; [66 6E, 05, 2C]
-FC5C; [66 6E, 05, 2C][, EB 82, 2C]
+FC5C; [66 6E, 05, 2C][, EB 3B, 2C]
FDF6; [66 6E, 05, 2C][66 86, 05, 30][66 DE, 05, 31][66 C4, 05, 30]
0632; [66 70, 05, 05]
@@ -23884,7 +24463,7 @@ FEEB; [66 D6, 05, 18]
FEEC; [66 D6, 05, 20]
FEEA; [66 D6, 05, 28]
FEE9; [66 D6, 05, 30]
-FCD9; [66 D6, 05, 18][, EB 82, 10]
+FCD9; [66 D6, 05, 18][, EB 3B, 10]
FCD7; [66 D6, 05, 18][66 3A, 05, 18]
FC51; [66 D6, 05, 30][66 3A, 05, 30]
FCD8; [66 D6, 05, 18][66 C8, 05, 18]
@@ -23905,16 +24484,16 @@ FBA8; [66 DA, 05, 10]
FBA9; [66 DA, 05, 1B]
FBA7; [66 DA, 05, 26]
FBA6; [66 DA, 05, 31]
-06C2; [66 DA, 05, 05][, E8 B2, 05]
+06C2; [66 DA, 05, 05][, E8 80, 05]
06C3; [66 DC 02, 05, 05]
06FF; [66 DC 09, 05, 05]
06D5; [66 DC 10, 05, 05]
-06C0; [66 DC 10, 05, 05][, E8 B2, 05]
-FBA5; [66 DC 10, 05, 20][, E8 B2, 20]
-FBA4; [66 DC 10, 05, 2E][, E8 B2, 2E]
+06C0; [66 DC 10, 05, 05][, E8 80, 05]
+FBA5; [66 DC 10, 05, 20][, E8 80, 20]
+FBA4; [66 DC 10, 05, 2E][, E8 80, 2E]
0648; [66 DE, 05, 05]
06E5; [66 DE, 05, 10]
@@ -23971,8 +24550,8 @@ FBE8; [66 EC, 05, 10]
FBE9; [66 EC, 05, 1B]
FEF0; [66 EC, 05, 26]
FEEF; [66 EC, 05, 31]
-FC90; [66 EC, 05, 26][, EB 82, 1E]
-FC5D; [66 EC, 05, 31][, EB 82, 2C]
+FC90; [66 EC, 05, 26][, EB 3B, 1E]
+FC5D; [66 EC, 05, 31][, EB 3B, 2C]
064A; [66 EE, 05, 05]
06E6; [66 EE, 05, 10]
@@ -24049,9 +24628,9 @@ FBE4; [66 F6, 05, 31]
06D2; [66 FA, 05, 05]
FBAF; [66 FA, 05, 20]
FBAE; [66 FA, 05, 2E]
-06D3; [66 FA, 05, 05][, E8 B2, 05]
-FBB1; [66 FA, 05, 20][, E8 B2, 20]
-FBB0; [66 FA, 05, 2E][, E8 B2, 2E]
+06D3; [66 FA, 05, 05][, E8 80, 05]
+FBB1; [66 FA, 05, 20][, E8 80, 20]
+FBB0; [66 FA, 05, 2E][, E8 80, 2E]
077A; [66 FC 02, 05, 05]
@@ -25448,13 +26027,13 @@ A8FE; [68 34, 05, 05]
0914; [68 3C, 05, 05]
0915; [68 3E, 05, 05]
-0958; [68 3E, 05, 05][, F1 22, 05]
+0958; [68 3E, 05, 05][, F0 AF, 05]
0916; [68 40, 05, 05]
-0959; [68 40, 05, 05][, F1 22, 05]
+0959; [68 40, 05, 05][, F0 AF, 05]
0917; [68 42, 05, 05]
-095A; [68 42, 05, 05][, F1 22, 05]
+095A; [68 42, 05, 05][, F0 AF, 05]
097B; [68 44, 05, 05]
@@ -25467,7 +26046,7 @@ A8FE; [68 34, 05, 05]
091B; [68 4C, 05, 05]
091C; [68 4E, 05, 05]
-095B; [68 4E, 05, 05][, F1 22, 05]
+095B; [68 4E, 05, 05][, F0 AF, 05]
0979; [68 50, 05, 05]
@@ -25484,12 +26063,12 @@ A8FE; [68 34, 05, 05]
0978; [68 5C, 05, 05]
0921; [68 5E, 05, 05]
-095C; [68 5E, 05, 05][, F1 22, 05]
+095C; [68 5E, 05, 05][, F0 AF, 05]
097E; [68 60, 05, 05]
0922; [68 62, 05, 05]
-095D; [68 62, 05, 05][, F1 22, 05]
+095D; [68 62, 05, 05][, F0 AF, 05]
0923; [68 64, 05, 05]
@@ -25502,12 +26081,12 @@ A8FE; [68 34, 05, 05]
0927; [68 6C, 05, 05]
0928; [68 6E, 05, 05]
-0929; [68 6E, 05, 05][, F1 22, 05]
+0929; [68 6E, 05, 05][, F0 AF, 05]
092A; [68 70, 05, 05]
092B; [68 72, 05, 05]
-095E; [68 72, 05, 05][, F1 22, 05]
+095E; [68 72, 05, 05][, F0 AF, 05]
092C; [68 74, 05, 05]
@@ -25518,17 +26097,17 @@ A8FE; [68 34, 05, 05]
092E; [68 7A, 05, 05]
092F; [68 7C, 05, 05]
-095F; [68 7C, 05, 05][, F1 22, 05]
+095F; [68 7C, 05, 05][, F0 AF, 05]
097A; [68 7E, 05, 05]
0930; [68 80, 05, 05]
-0931; [68 80, 05, 05][, F1 22, 05]
+0931; [68 80, 05, 05][, F0 AF, 05]
0932; [68 82, 05, 05]
0933; [68 84, 05, 05]
-0934; [68 84, 05, 05][, F1 22, 05]
+0934; [68 84, 05, 05][, F0 AF, 05]
0935; [68 86, 05, 05]
@@ -25552,6 +26131,7 @@ A8FE; [68 34, 05, 05]
1CEF; [68 94, 05, 20]
1CF0; [68 94, 05, 20]
1CF1; [68 94, 05, 20]
+1CFA; [68 94, 05, 20]
1CF5; [68 96, 05, 05]
@@ -25675,10 +26255,10 @@ FDD1 0995; [69 04 02, 05, 05] # BENGALI first primary starts new lead byte (comp
09A0; [69 3A, 05, 05]
09A1; [69 3C, 05, 05]
-09DC; [69 3C, 05, 05][, F1 22, 05]
+09DC; [69 3C, 05, 05][, F0 AF, 05]
09A2; [69 3E, 05, 05]
-09DD; [69 3E, 05, 05][, F1 22, 05]
+09DD; [69 3E, 05, 05][, F0 AF, 05]
09A3; [69 40, 05, 05]
@@ -25704,7 +26284,7 @@ FDD1 0995; [69 04 02, 05, 05] # BENGALI first primary starts new lead byte (comp
09AE; [69 54, 05, 05]
09AF; [69 56, 05, 05]
-09DF; [69 56, 05, 05][, F1 22, 05]
+09DF; [69 56, 05, 05][, F0 AF, 05]
09B0; [69 58, 05, 05]
@@ -25787,7 +26367,7 @@ FDD1 0A15; [6A 04 02, 05, 05] # GURMUKHI first primary starts new lead byte (com
0A0F; [6A 1E, 05, 05]
0A38; [6A 20, 05, 05]
-0A36; [6A 20, 05, 05][, F1 22, 05]
+0A36; [6A 20, 05, 05][, F0 AF, 05]
0A39; [6A 22, 05, 05]
@@ -25796,10 +26376,10 @@ FDD1 0A15; [6A 04 02, 05, 05] # GURMUKHI first primary starts new lead byte (com
0A15; [6A 26, 05, 05]
0A16; [6A 28, 05, 05]
-0A59; [6A 28, 05, 05][, F1 22, 05]
+0A59; [6A 28, 05, 05][, F0 AF, 05]
0A17; [6A 2A, 05, 05]
-0A5A; [6A 2A, 05, 05][, F1 22, 05]
+0A5A; [6A 2A, 05, 05][, F0 AF, 05]
0A18; [6A 2C, 05, 05]
@@ -25810,7 +26390,7 @@ FDD1 0A15; [6A 04 02, 05, 05] # GURMUKHI first primary starts new lead byte (com
0A1B; [6A 32, 05, 05]
0A1C; [6A 34, 05, 05]
-0A5B; [6A 34, 05, 05][, F1 22, 05]
+0A5B; [6A 34, 05, 05][, F0 AF, 05]
0A1D; [6A 36, 05, 05]
@@ -25839,7 +26419,7 @@ FDD1 0A15; [6A 04 02, 05, 05] # GURMUKHI first primary starts new lead byte (com
0A2A; [6A 4E, 05, 05]
0A2B; [6A 50, 05, 05]
-0A5E; [6A 50, 05, 05][, F1 22, 05]
+0A5E; [6A 50, 05, 05][, F0 AF, 05]
0A2C; [6A 52, 05, 05]
@@ -25854,7 +26434,7 @@ FDD1 0A15; [6A 04 02, 05, 05] # GURMUKHI first primary starts new lead byte (com
0A30; [6A 5C, 05, 05]
0A32; [6A 5E, 05, 05]
-0A33; [6A 5E, 05, 05][, F1 22, 05]
+0A33; [6A 5E, 05, 05][, F0 AF, 05]
0A35; [6A 60, 05, 05]
@@ -26075,10 +26655,10 @@ FDD1 0B15; [6C 04 02, 05, 05] # ORIYA first primary starts new lead byte (compre
0B20; [6C 38, 05, 05]
0B21; [6C 3A, 05, 05]
-0B5C; [6C 3A, 05, 05][, F1 22, 05]
+0B5C; [6C 3A, 05, 05][, F0 AF, 05]
0B22; [6C 3C, 05, 05]
-0B5D; [6C 3C, 05, 05][, F1 22, 05]
+0B5D; [6C 3C, 05, 05][, F0 AF, 05]
0B23; [6C 3E, 05, 05]
@@ -27289,10 +27869,10 @@ FDD1 11083; [71 A6 02, 05, 05] # Kaithi first primary (compressible)
11098; [71 A6 9C, 05, 05]
11099; [71 A6 A3, 05, 05]
-1109A; [71 A6 A3, 05, 05][, F1 22, 05]
+1109A; [71 A6 A3, 05, 05][, F0 AF, 05]
1109B; [71 A6 AA, 05, 05]
-1109C; [71 A6 AA, 05, 05][, F1 22, 05]
+1109C; [71 A6 AA, 05, 05][, F0 AF, 05]
1109D; [71 A6 B1, 05, 05]
@@ -27311,7 +27891,7 @@ FDD1 11083; [71 A6 02, 05, 05] # Kaithi first primary (compressible)
110A4; [71 A6 E2, 05, 05]
110A5; [71 A6 E9, 05, 05]
-110AB; [71 A6 E9, 05, 05][, F1 22, 05]
+110AB; [71 A6 E9, 05, 05][, F0 AF, 05]
110A6; [71 A6 F0, 05, 05]
@@ -28117,1412 +28697,1542 @@ FDD1 11412; [71 B4 02, 05, 05] # Newa first primary (compressible)
11448; [71 B5 93, 05, 05]
-11435; [71 B5 9A, 05, 05]
+1145F; [71 B5 9A, 05, 05]
+
+11435; [71 B5 A1, 05, 05]
+
+11436; [71 B5 A8, 05, 05]
+
+11437; [71 B5 AF, 05, 05]
+
+11438; [71 B5 B6, 05, 05]
+
+11439; [71 B5 BD, 05, 05]
+
+1143A; [71 B5 C4, 05, 05]
+
+1143B; [71 B5 CB, 05, 05]
+
+1143C; [71 B5 D2, 05, 05]
+
+1143D; [71 B5 D9, 05, 05]
+
+1143E; [71 B5 E0, 05, 05]
+
+1143F; [71 B5 E7, 05, 05]
+
+11440; [71 B5 EE, 05, 05]
+
+11441; [71 B5 F5, 05, 05]
+
+11442; [71 B5 FC, 05, 05]
+
+FDD1 11484; [71 B7 02, 05, 05] # Tirhuta first primary (compressible)
+
+114C7; [71 B7 09, 05, 05]
+
+11480; [71 B7 10, 05, 05]
+
+11481; [71 B7 17, 05, 05]
+
+11482; [71 B7 1E, 05, 05]
+
+11483; [71 B7 25, 05, 05]
+
+11484; [71 B7 2C, 05, 05]
+
+11485; [71 B7 33, 05, 05]
+
+11486; [71 B7 3A, 05, 05]
+
+11487; [71 B7 41, 05, 05]
+
+11488; [71 B7 48, 05, 05]
+
+11489; [71 B7 4F, 05, 05]
+
+1148A; [71 B7 56, 05, 05]
+
+1148B; [71 B7 5D, 05, 05]
+
+1148C; [71 B7 64, 05, 05]
+
+1148D; [71 B7 6B, 05, 05]
+
+1148E; [71 B7 72, 05, 05]
+
+1148F; [71 B7 79, 05, 05]
+
+11490; [71 B7 80, 05, 05]
-11436; [71 B5 A1, 05, 05]
+11491; [71 B7 87, 05, 05]
-11437; [71 B5 A8, 05, 05]
+11492; [71 B7 8E, 05, 05]
-11438; [71 B5 AF, 05, 05]
+11493; [71 B7 95, 05, 05]
-11439; [71 B5 B6, 05, 05]
+11494; [71 B7 9C, 05, 05]
-1143A; [71 B5 BD, 05, 05]
+11495; [71 B7 A3, 05, 05]
-1143B; [71 B5 C4, 05, 05]
+11496; [71 B7 AA, 05, 05]
-1143C; [71 B5 CB, 05, 05]
+11497; [71 B7 B1, 05, 05]
-1143D; [71 B5 D2, 05, 05]
+11498; [71 B7 B8, 05, 05]
-1143E; [71 B5 D9, 05, 05]
+11499; [71 B7 BF, 05, 05]
-1143F; [71 B5 E0, 05, 05]
+1149A; [71 B7 C6, 05, 05]
-11440; [71 B5 E7, 05, 05]
+1149B; [71 B7 CD, 05, 05]
-11441; [71 B5 EE, 05, 05]
+1149C; [71 B7 D4, 05, 05]
-11442; [71 B5 F5, 05, 05]
+1149D; [71 B7 DB, 05, 05]
-FDD1 11484; [71 B6 02, 05, 05] # Tirhuta first primary (compressible)
+1149E; [71 B7 E2, 05, 05]
-114C7; [71 B6 09, 05, 05]
+1149F; [71 B7 E9, 05, 05]
-11480; [71 B6 10, 05, 05]
+114A0; [71 B7 F0, 05, 05]
-11481; [71 B6 17, 05, 05]
+114A1; [71 B7 F7, 05, 05]
-11482; [71 B6 1E, 05, 05]
+114A2; [71 B7 FE, 05, 05]
-11483; [71 B6 25, 05, 05]
+114A3; [71 B8 07, 05, 05]
-11484; [71 B6 2C, 05, 05]
+114A4; [71 B8 0E, 05, 05]
-11485; [71 B6 33, 05, 05]
+114A5; [71 B8 15, 05, 05]
-11486; [71 B6 3A, 05, 05]
+114A6; [71 B8 1C, 05, 05]
-11487; [71 B6 41, 05, 05]
+114A7; [71 B8 23, 05, 05]
-11488; [71 B6 48, 05, 05]
+114A8; [71 B8 2A, 05, 05]
-11489; [71 B6 4F, 05, 05]
+114A9; [71 B8 31, 05, 05]
-1148A; [71 B6 56, 05, 05]
+114AA; [71 B8 38, 05, 05]
-1148B; [71 B6 5D, 05, 05]
+114AB; [71 B8 3F, 05, 05]
-1148C; [71 B6 64, 05, 05]
+114AC; [71 B8 46, 05, 05]
-1148D; [71 B6 6B, 05, 05]
+114AD; [71 B8 4D, 05, 05]
-1148E; [71 B6 72, 05, 05]
+114AE; [71 B8 54, 05, 05]
-1148F; [71 B6 79, 05, 05]
+114AF; [71 B8 5B, 05, 05]
-11490; [71 B6 80, 05, 05]
+114C4; [71 B8 62, 05, 05]
-11491; [71 B6 87, 05, 05]
+114C5; [71 B8 69, 05, 05]
-11492; [71 B6 8E, 05, 05]
+114B0; [71 B8 70, 05, 05]
-11493; [71 B6 95, 05, 05]
+114B1; [71 B8 77, 05, 05]
-11494; [71 B6 9C, 05, 05]
+114B2; [71 B8 7E, 05, 05]
-11495; [71 B6 A3, 05, 05]
+114B3; [71 B8 85, 05, 05]
-11496; [71 B6 AA, 05, 05]
+114B4; [71 B8 8C, 05, 05]
-11497; [71 B6 B1, 05, 05]
+114B5; [71 B8 93, 05, 05]
-11498; [71 B6 B8, 05, 05]
+114B6; [71 B8 9A, 05, 05]
-11499; [71 B6 BF, 05, 05]
+114B7; [71 B8 A1, 05, 05]
-1149A; [71 B6 C6, 05, 05]
+114B8; [71 B8 A8, 05, 05]
-1149B; [71 B6 CD, 05, 05]
+114B9; [71 B8 AF, 05, 05]
-1149C; [71 B6 D4, 05, 05]
+114BA; [71 B8 B6, 05, 05]
-1149D; [71 B6 DB, 05, 05]
+114B9 114BA; [71 B8 BD, 05, 05]
+114BB; [71 B8 BD, 05, 05]
-1149E; [71 B6 E2, 05, 05]
+114B9 114B0; [71 B8 C4, 05, 05]
+114BC; [71 B8 C4, 05, 05]
-1149F; [71 B6 E9, 05, 05]
+114BD; [71 B8 CB, 05, 05]
-114A0; [71 B6 F0, 05, 05]
+114B9 114BD; [71 B8 D2, 05, 05]
+114BE; [71 B8 D2, 05, 05]
-114A1; [71 B6 F7, 05, 05]
+114C2; [71 B8 D9, 05, 05]
-114A2; [71 B6 FE, 05, 05]
+FDD1 1158E; [71 B9 02, 05, 05] # Siddham first primary (compressible)
-114A3; [71 B7 07, 05, 05]
+11580; [71 B9 09, 05, 05]
-114A4; [71 B7 0E, 05, 05]
+11581; [71 B9 10, 05, 05]
-114A5; [71 B7 15, 05, 05]
+11582; [71 BB, 05, 05]
+115D8; [71 BB, 70, 05]
+115D9; [71 BB, 78, 05]
-114A6; [71 B7 1C, 05, 05]
+11583; [71 BD, 05, 05]
+115DA; [71 BD, 70, 05]
-114A7; [71 B7 23, 05, 05]
+11584; [71 BF, 05, 05]
+115DB; [71 BF, 70, 05]
-114A8; [71 B7 2A, 05, 05]
+11585; [71 C1 02, 05, 05]
-114A9; [71 B7 31, 05, 05]
+11586; [71 C1 09, 05, 05]
-114AA; [71 B7 38, 05, 05]
+11587; [71 C1 10, 05, 05]
-114AB; [71 B7 3F, 05, 05]
+11588; [71 C1 17, 05, 05]
-114AC; [71 B7 46, 05, 05]
+11589; [71 C1 1E, 05, 05]
-114AD; [71 B7 4D, 05, 05]
+1158A; [71 C1 25, 05, 05]
-114AE; [71 B7 54, 05, 05]
+1158B; [71 C1 2C, 05, 05]
-114AF; [71 B7 5B, 05, 05]
+1158C; [71 C1 33, 05, 05]
-114C4; [71 B7 62, 05, 05]
+1158D; [71 C1 3A, 05, 05]
-114C5; [71 B7 69, 05, 05]
+1158E; [71 C1 41, 05, 05]
-114B0; [71 B7 70, 05, 05]
+1158F; [71 C1 48, 05, 05]
-114B1; [71 B7 77, 05, 05]
+11590; [71 C1 4F, 05, 05]
-114B2; [71 B7 7E, 05, 05]
+11591; [71 C1 56, 05, 05]
-114B3; [71 B7 85, 05, 05]
+11592; [71 C1 5D, 05, 05]
-114B4; [71 B7 8C, 05, 05]
+11593; [71 C1 64, 05, 05]
-114B5; [71 B7 93, 05, 05]
+11594; [71 C1 6B, 05, 05]
-114B6; [71 B7 9A, 05, 05]
+11595; [71 C1 72, 05, 05]
-114B7; [71 B7 A1, 05, 05]
+11596; [71 C1 79, 05, 05]
-114B8; [71 B7 A8, 05, 05]
+11597; [71 C1 80, 05, 05]
-114B9; [71 B7 AF, 05, 05]
+11598; [71 C1 87, 05, 05]
-114BA; [71 B7 B6, 05, 05]
+11599; [71 C1 8E, 05, 05]
-114B9 114BA; [71 B7 BD, 05, 05]
-114BB; [71 B7 BD, 05, 05]
+1159A; [71 C1 95, 05, 05]
-114B9 114B0; [71 B7 C4, 05, 05]
-114BC; [71 B7 C4, 05, 05]
+1159B; [71 C1 9C, 05, 05]
-114BD; [71 B7 CB, 05, 05]
+1159C; [71 C1 A3, 05, 05]
-114B9 114BD; [71 B7 D2, 05, 05]
-114BE; [71 B7 D2, 05, 05]
+1159D; [71 C1 AA, 05, 05]
-114C2; [71 B7 D9, 05, 05]
+1159E; [71 C1 B1, 05, 05]
-FDD1 1158E; [71 B8 02, 05, 05] # Siddham first primary (compressible)
+1159F; [71 C1 B8, 05, 05]
-11580; [71 B8 09, 05, 05]
+115A0; [71 C1 BF, 05, 05]
-11581; [71 B8 10, 05, 05]
+115A1; [71 C1 C6, 05, 05]
-11582; [71 BA, 05, 05]
-115D8; [71 BA, 70, 05]
-115D9; [71 BA, 78, 05]
+115A2; [71 C1 CD, 05, 05]
-11583; [71 BC, 05, 05]
-115DA; [71 BC, 70, 05]
+115A3; [71 C1 D4, 05, 05]
-11584; [71 BE, 05, 05]
-115DB; [71 BE, 70, 05]
+115A4; [71 C1 DB, 05, 05]
-11585; [71 C0 02, 05, 05]
+115A5; [71 C1 E2, 05, 05]
-11586; [71 C0 09, 05, 05]
+115A6; [71 C1 E9, 05, 05]
-11587; [71 C0 10, 05, 05]
+115A7; [71 C1 F0, 05, 05]
-11588; [71 C0 17, 05, 05]
+115A8; [71 C1 F7, 05, 05]
-11589; [71 C0 1E, 05, 05]
+115A9; [71 C1 FE, 05, 05]
-1158A; [71 C0 25, 05, 05]
+115AA; [71 C2 07, 05, 05]
-1158B; [71 C0 2C, 05, 05]
+115AB; [71 C2 0E, 05, 05]
-1158C; [71 C0 33, 05, 05]
+115AC; [71 C2 15, 05, 05]
-1158D; [71 C0 3A, 05, 05]
+115AD; [71 C2 1C, 05, 05]
-1158E; [71 C0 41, 05, 05]
+115AE; [71 C2 23, 05, 05]
-1158F; [71 C0 48, 05, 05]
+115AF; [71 C2 2A, 05, 05]
-11590; [71 C0 4F, 05, 05]
+115B0; [71 C2 31, 05, 05]
-11591; [71 C0 56, 05, 05]
+115B1; [71 C2 38, 05, 05]
-11592; [71 C0 5D, 05, 05]
+115B2; [71 C4, 05, 05]
+115DC; [71 C4, 70, 05]
-11593; [71 C0 64, 05, 05]
+115B3; [71 C6, 05, 05]
+115DD; [71 C6, 70, 05]
-11594; [71 C0 6B, 05, 05]
+115B4; [71 C8 02, 05, 05]
-11595; [71 C0 72, 05, 05]
+115B5; [71 C8 09, 05, 05]
-11596; [71 C0 79, 05, 05]
+115B8; [71 C8 10, 05, 05]
-11597; [71 C0 80, 05, 05]
+115B9; [71 C8 17, 05, 05]
-11598; [71 C0 87, 05, 05]
+115B8 115AF; [71 C8 1E, 05, 05]
+115BA; [71 C8 1E, 05, 05]
-11599; [71 C0 8E, 05, 05]
+115B9 115AF; [71 C8 25, 05, 05]
+115BB; [71 C8 25, 05, 05]
-1159A; [71 C0 95, 05, 05]
+115BF; [71 C8 2C, 05, 05]
-1159B; [71 C0 9C, 05, 05]
+FDD1 1160E; [71 C9 02, 05, 05] # Modi first primary (compressible)
-1159C; [71 C0 A3, 05, 05]
+11600; [71 C9 09, 05, 05]
-1159D; [71 C0 AA, 05, 05]
+11601; [71 C9 10, 05, 05]
-1159E; [71 C0 B1, 05, 05]
+11602; [71 C9 17, 05, 05]
-1159F; [71 C0 B8, 05, 05]
+11603; [71 C9 1E, 05, 05]
-115A0; [71 C0 BF, 05, 05]
+11604; [71 C9 25, 05, 05]
-115A1; [71 C0 C6, 05, 05]
+11605; [71 C9 2C, 05, 05]
-115A2; [71 C0 CD, 05, 05]
+11606; [71 C9 33, 05, 05]
-115A3; [71 C0 D4, 05, 05]
+11607; [71 C9 3A, 05, 05]
-115A4; [71 C0 DB, 05, 05]
+11608; [71 C9 41, 05, 05]
-115A5; [71 C0 E2, 05, 05]
+11609; [71 C9 48, 05, 05]
-115A6; [71 C0 E9, 05, 05]
+1160A; [71 C9 4F, 05, 05]
-115A7; [71 C0 F0, 05, 05]
+1160B; [71 C9 56, 05, 05]
-115A8; [71 C0 F7, 05, 05]
+1160C; [71 C9 5D, 05, 05]
-115A9; [71 C0 FE, 05, 05]
+1160D; [71 C9 64, 05, 05]
-115AA; [71 C1 07, 05, 05]
+1160E; [71 C9 6B, 05, 05]
-115AB; [71 C1 0E, 05, 05]
+1160F; [71 C9 72, 05, 05]
-115AC; [71 C1 15, 05, 05]
+11610; [71 C9 79, 05, 05]
-115AD; [71 C1 1C, 05, 05]
+11611; [71 C9 80, 05, 05]
-115AE; [71 C1 23, 05, 05]
+11612; [71 C9 87, 05, 05]
-115AF; [71 C1 2A, 05, 05]
+11613; [71 C9 8E, 05, 05]
-115B0; [71 C1 31, 05, 05]
+11614; [71 C9 95, 05, 05]
-115B1; [71 C1 38, 05, 05]
+11615; [71 C9 9C, 05, 05]
-115B2; [71 C3, 05, 05]
-115DC; [71 C3, 70, 05]
+11616; [71 C9 A3, 05, 05]
-115B3; [71 C5, 05, 05]
-115DD; [71 C5, 70, 05]
+11617; [71 C9 AA, 05, 05]
-115B4; [71 C7 02, 05, 05]
+11618; [71 C9 B1, 05, 05]
-115B5; [71 C7 09, 05, 05]
+11619; [71 C9 B8, 05, 05]
-115B8; [71 C7 10, 05, 05]
+1161A; [71 C9 BF, 05, 05]
-115B9; [71 C7 17, 05, 05]
+1161B; [71 C9 C6, 05, 05]
-115B8 115AF; [71 C7 1E, 05, 05]
-115BA; [71 C7 1E, 05, 05]
+1161C; [71 C9 CD, 05, 05]
-115B9 115AF; [71 C7 25, 05, 05]
-115BB; [71 C7 25, 05, 05]
+1161D; [71 C9 D4, 05, 05]
-115BF; [71 C7 2C, 05, 05]
+1161E; [71 C9 DB, 05, 05]
-FDD1 1160E; [71 C8 02, 05, 05] # Modi first primary (compressible)
+1161F; [71 C9 E2, 05, 05]
-11600; [71 C8 09, 05, 05]
+11620; [71 C9 E9, 05, 05]
-11601; [71 C8 10, 05, 05]
+11621; [71 C9 F0, 05, 05]
-11602; [71 C8 17, 05, 05]
+11622; [71 C9 F7, 05, 05]
-11603; [71 C8 1E, 05, 05]
+11623; [71 C9 FE, 05, 05]
-11604; [71 C8 25, 05, 05]
+11624; [71 CA 07, 05, 05]
-11605; [71 C8 2C, 05, 05]
+11625; [71 CA 0E, 05, 05]
-11606; [71 C8 33, 05, 05]
+11626; [71 CA 15, 05, 05]
-11607; [71 C8 3A, 05, 05]
+11627; [71 CA 1C, 05, 05]
-11608; [71 C8 41, 05, 05]
+11628; [71 CA 23, 05, 05]
-11609; [71 C8 48, 05, 05]
+11629; [71 CA 2A, 05, 05]
-1160A; [71 C8 4F, 05, 05]
+1162A; [71 CA 31, 05, 05]
-1160B; [71 C8 56, 05, 05]
+1162B; [71 CA 38, 05, 05]
-1160C; [71 C8 5D, 05, 05]
+1162C; [71 CA 3F, 05, 05]
-1160D; [71 C8 64, 05, 05]
+1162D; [71 CA 46, 05, 05]
-1160E; [71 C8 6B, 05, 05]
+1162E; [71 CA 4D, 05, 05]
-1160F; [71 C8 72, 05, 05]
+1162F; [71 CA 54, 05, 05]
-11610; [71 C8 79, 05, 05]
+11630; [71 CA 5B, 05, 05]
-11611; [71 C8 80, 05, 05]
+11631; [71 CA 62, 05, 05]
-11612; [71 C8 87, 05, 05]
+11632; [71 CA 69, 05, 05]
-11613; [71 C8 8E, 05, 05]
+11633; [71 CA 70, 05, 05]
-11614; [71 C8 95, 05, 05]
+11634; [71 CA 77, 05, 05]
-11615; [71 C8 9C, 05, 05]
+11635; [71 CA 7E, 05, 05]
-11616; [71 C8 A3, 05, 05]
+11636; [71 CA 85, 05, 05]
-11617; [71 C8 AA, 05, 05]
+11637; [71 CA 8C, 05, 05]
-11618; [71 C8 B1, 05, 05]
+11638; [71 CA 93, 05, 05]
-11619; [71 C8 B8, 05, 05]
+11639; [71 CA 9A, 05, 05]
-1161A; [71 C8 BF, 05, 05]
+1163A; [71 CA A1, 05, 05]
-1161B; [71 C8 C6, 05, 05]
+1163B; [71 CA A8, 05, 05]
-1161C; [71 C8 CD, 05, 05]
+1163C; [71 CA AF, 05, 05]
-1161D; [71 C8 D4, 05, 05]
+1163F; [71 CA B6, 05, 05]
-1161E; [71 C8 DB, 05, 05]
+11644; [71 CA BD, 05, 05]
-1161F; [71 C8 E2, 05, 05]
+FDD1 11680; [71 CB 02, 05, 05] # Takri first primary (compressible)
-11620; [71 C8 E9, 05, 05]
+11680; [71 CB 09, 05, 05]
-11621; [71 C8 F0, 05, 05]
+11681; [71 CB 10, 05, 05]
-11622; [71 C8 F7, 05, 05]
+11682; [71 CB 17, 05, 05]
-11623; [71 C8 FE, 05, 05]
+11683; [71 CB 1E, 05, 05]
-11624; [71 C9 07, 05, 05]
+11684; [71 CB 25, 05, 05]
-11625; [71 C9 0E, 05, 05]
+11685; [71 CB 2C, 05, 05]
-11626; [71 C9 15, 05, 05]
+11686; [71 CB 33, 05, 05]
-11627; [71 C9 1C, 05, 05]
+11687; [71 CB 3A, 05, 05]
-11628; [71 C9 23, 05, 05]
+11688; [71 CB 41, 05, 05]
-11629; [71 C9 2A, 05, 05]
+11689; [71 CB 48, 05, 05]
-1162A; [71 C9 31, 05, 05]
+116A8; [71 CB 4F, 05, 05]
-1162B; [71 C9 38, 05, 05]
+116A7; [71 CB 56, 05, 05]
-1162C; [71 C9 3F, 05, 05]
+116A9; [71 CB 5D, 05, 05]
-1162D; [71 C9 46, 05, 05]
+1168A; [71 CB 64, 05, 05]
-1162E; [71 C9 4D, 05, 05]
+1168B; [71 CB 6B, 05, 05]
-1162F; [71 C9 54, 05, 05]
+116B8; [71 CB 72, 05, 05]
-11630; [71 C9 5B, 05, 05]
+1168C; [71 CB 79, 05, 05]
-11631; [71 C9 62, 05, 05]
+1168D; [71 CB 80, 05, 05]
-11632; [71 C9 69, 05, 05]
+1168E; [71 CB 87, 05, 05]
-11633; [71 C9 70, 05, 05]
+1168F; [71 CB 8E, 05, 05]
-11634; [71 C9 77, 05, 05]
+11690; [71 CB 95, 05, 05]
-11635; [71 C9 7E, 05, 05]
+11691; [71 CB 9C, 05, 05]
-11636; [71 C9 85, 05, 05]
+11692; [71 CB A3, 05, 05]
-11637; [71 C9 8C, 05, 05]
+11693; [71 CB AA, 05, 05]
-11638; [71 C9 93, 05, 05]
+11694; [71 CB B1, 05, 05]
-11639; [71 C9 9A, 05, 05]
+11695; [71 CB B8, 05, 05]
-1163A; [71 C9 A1, 05, 05]
+11696; [71 CB BF, 05, 05]
-1163B; [71 C9 A8, 05, 05]
+11697; [71 CB C6, 05, 05]
-1163C; [71 C9 AF, 05, 05]
+11698; [71 CB CD, 05, 05]
-1163F; [71 C9 B6, 05, 05]
+11699; [71 CB D4, 05, 05]
-11644; [71 C9 BD, 05, 05]
+1169A; [71 CB DB, 05, 05]
-FDD1 11680; [71 CA 02, 05, 05] # Takri first primary (compressible)
+1169B; [71 CB E2, 05, 05]
-11680; [71 CA 09, 05, 05]
+1169C; [71 CB E9, 05, 05]
-11681; [71 CA 10, 05, 05]
+1169D; [71 CB F0, 05, 05]
-11682; [71 CA 17, 05, 05]
+1169E; [71 CB F7, 05, 05]
-11683; [71 CA 1E, 05, 05]
+1169F; [71 CB FE, 05, 05]
-11684; [71 CA 25, 05, 05]
+116A0; [71 CC 07, 05, 05]
-11685; [71 CA 2C, 05, 05]
+116A1; [71 CC 0E, 05, 05]
-11686; [71 CA 33, 05, 05]
+116A2; [71 CC 15, 05, 05]
-11687; [71 CA 3A, 05, 05]
+116A3; [71 CC 1C, 05, 05]
-11688; [71 CA 41, 05, 05]
+116A4; [71 CC 23, 05, 05]
-11689; [71 CA 48, 05, 05]
+116A5; [71 CC 2A, 05, 05]
-116A8; [71 CA 4F, 05, 05]
+116A6; [71 CC 31, 05, 05]
-116A7; [71 CA 56, 05, 05]
+116AA; [71 CC 38, 05, 05]
-116A9; [71 CA 5D, 05, 05]
+116AD; [71 CC 3F, 05, 05]
-1168A; [71 CA 64, 05, 05]
+116AE; [71 CC 46, 05, 05]
-1168B; [71 CA 6B, 05, 05]
+116AF; [71 CC 4D, 05, 05]
-1168C; [71 CA 72, 05, 05]
+116B0; [71 CC 54, 05, 05]
-1168D; [71 CA 79, 05, 05]
+116B1; [71 CC 5B, 05, 05]
-1168E; [71 CA 80, 05, 05]
+116B2; [71 CC 62, 05, 05]
-1168F; [71 CA 87, 05, 05]
+116B3; [71 CC 69, 05, 05]
-11690; [71 CA 8E, 05, 05]
+116B4; [71 CC 70, 05, 05]
-11691; [71 CA 95, 05, 05]
+116B5; [71 CC 77, 05, 05]
-11692; [71 CA 9C, 05, 05]
+116B6; [71 CC 7E, 05, 05]
-11693; [71 CA A3, 05, 05]
+FDD1 119CE; [71 CD 02, 05, 05] # Nandinagari first primary (compressible)
-11694; [71 CA AA, 05, 05]
+119A0; [71 CD 09, 05, 05]
-11695; [71 CA B1, 05, 05]
+119A1; [71 CD 10, 05, 05]
-11696; [71 CA B8, 05, 05]
+119A2; [71 CD 17, 05, 05]
-11697; [71 CA BF, 05, 05]
+119A3; [71 CD 1E, 05, 05]
-11698; [71 CA C6, 05, 05]
+119A4; [71 CD 25, 05, 05]
-11699; [71 CA CD, 05, 05]
+119A5; [71 CD 2C, 05, 05]
-1169A; [71 CA D4, 05, 05]
+119A6; [71 CD 33, 05, 05]
-1169B; [71 CA DB, 05, 05]
+119A7; [71 CD 3A, 05, 05]
-1169C; [71 CA E2, 05, 05]
+119AA; [71 CD 41, 05, 05]
-1169D; [71 CA E9, 05, 05]
+119AB; [71 CD 48, 05, 05]
-1169E; [71 CA F0, 05, 05]
+119AC; [71 CD 4F, 05, 05]
-1169F; [71 CA F7, 05, 05]
+119AD; [71 CD 56, 05, 05]
-116A0; [71 CA FE, 05, 05]
+119AE; [71 CD 5D, 05, 05]
-116A1; [71 CB 07, 05, 05]
+119AF; [71 CD 64, 05, 05]
-116A2; [71 CB 0E, 05, 05]
+119B0; [71 CD 6B, 05, 05]
-116A3; [71 CB 15, 05, 05]
+119B1; [71 CD 72, 05, 05]
-116A4; [71 CB 1C, 05, 05]
+119B2; [71 CD 79, 05, 05]
-116A5; [71 CB 23, 05, 05]
+119B3; [71 CD 80, 05, 05]
-116A6; [71 CB 2A, 05, 05]
+119B4; [71 CD 87, 05, 05]
-116AA; [71 CB 31, 05, 05]
+119B5; [71 CD 8E, 05, 05]
-116AD; [71 CB 38, 05, 05]
+119B6; [71 CD 95, 05, 05]
-116AE; [71 CB 3F, 05, 05]
+119B7; [71 CD 9C, 05, 05]
-116AF; [71 CB 46, 05, 05]
+119B8; [71 CD A3, 05, 05]
-116B0; [71 CB 4D, 05, 05]
+119B9; [71 CD AA, 05, 05]
-116B1; [71 CB 54, 05, 05]
+119BA; [71 CD B1, 05, 05]
-116B2; [71 CB 5B, 05, 05]
+119BB; [71 CD B8, 05, 05]
-116B3; [71 CB 62, 05, 05]
+119BC; [71 CD BF, 05, 05]
-116B4; [71 CB 69, 05, 05]
+119BD; [71 CD C6, 05, 05]
-116B5; [71 CB 70, 05, 05]
+119BE; [71 CD CD, 05, 05]
-116B6; [71 CB 77, 05, 05]
+119BF; [71 CD D4, 05, 05]
-FDD1 1180B; [71 CC 02, 05, 05] # Dogra first primary (compressible)
+119C0; [71 CD DB, 05, 05]
-11800; [71 CC 09, 05, 05]
+119C1; [71 CD E2, 05, 05]
-11801; [71 CC 10, 05, 05]
+119C2; [71 CD E9, 05, 05]
-11802; [71 CC 17, 05, 05]
+119C3; [71 CD F0, 05, 05]
-11803; [71 CC 1E, 05, 05]
+119C4; [71 CD F7, 05, 05]
-11804; [71 CC 25, 05, 05]
+119C5; [71 CD FE, 05, 05]
-11805; [71 CC 2C, 05, 05]
+119C6; [71 CE 07, 05, 05]
-11806; [71 CC 33, 05, 05]
+119C7; [71 CE 0E, 05, 05]
-11807; [71 CC 3A, 05, 05]
+119C8; [71 CE 15, 05, 05]
-11808; [71 CC 41, 05, 05]
+119C9; [71 CE 1C, 05, 05]
-11809; [71 CC 48, 05, 05]
+119CA; [71 CE 23, 05, 05]
-1180A; [71 CC 4F, 05, 05]
+119CB; [71 CE 2A, 05, 05]
-1180B; [71 CC 56, 05, 05]
+119CC; [71 CE 31, 05, 05]
-1180C; [71 CC 5D, 05, 05]
+119CD; [71 CE 38, 05, 05]
-1180D; [71 CC 64, 05, 05]
+119CE; [71 CE 3F, 05, 05]
-1180E; [71 CC 6B, 05, 05]
+119CF; [71 CE 46, 05, 05]
-1180F; [71 CC 72, 05, 05]
+119D0; [71 CE 4D, 05, 05]
-11810; [71 CC 79, 05, 05]
+119E1; [71 CE 54, 05, 05]
-11811; [71 CC 80, 05, 05]
+119E3; [71 CE 5B, 05, 05]
-11812; [71 CC 87, 05, 05]
+119D1; [71 CE 62, 05, 05]
-11813; [71 CC 8E, 05, 05]
+119D2; [71 CE 69, 05, 05]
-11814; [71 CC 95, 05, 05]
+119D3; [71 CE 70, 05, 05]
-11815; [71 CC 9C, 05, 05]
+119D4; [71 CE 77, 05, 05]
-11816; [71 CC A3, 05, 05]
+119D5; [71 CE 7E, 05, 05]
-11817; [71 CC AA, 05, 05]
+119D6; [71 CE 85, 05, 05]
-11818; [71 CC B1, 05, 05]
+119D7; [71 CE 8C, 05, 05]
-11819; [71 CC B8, 05, 05]
+119DA; [71 CE 93, 05, 05]
-1181A; [71 CC BF, 05, 05]
+119E4; [71 CE 9A, 05, 05]
-1181B; [71 CC C6, 05, 05]
+119DB; [71 CE A1, 05, 05]
-1181C; [71 CC CD, 05, 05]
+119DC; [71 CE A8, 05, 05]
-1181D; [71 CC D4, 05, 05]
+119DD; [71 CE AF, 05, 05]
-1181E; [71 CC DB, 05, 05]
+119E0; [71 CE B6, 05, 05]
-1181F; [71 CC E2, 05, 05]
+FDD1 1180B; [71 CF 02, 05, 05] # Dogra first primary (compressible)
-11820; [71 CC E9, 05, 05]
+11800; [71 CF 09, 05, 05]
-11821; [71 CC F0, 05, 05]
+11801; [71 CF 10, 05, 05]
-11822; [71 CC F7, 05, 05]
+11802; [71 CF 17, 05, 05]
-11823; [71 CC FE, 05, 05]
+11803; [71 CF 1E, 05, 05]
-11824; [71 CD 07, 05, 05]
+11804; [71 CF 25, 05, 05]
-11825; [71 CD 0E, 05, 05]
+11805; [71 CF 2C, 05, 05]
-11826; [71 CD 15, 05, 05]
+11806; [71 CF 33, 05, 05]
-11827; [71 CD 1C, 05, 05]
+11807; [71 CF 3A, 05, 05]
-11828; [71 CD 23, 05, 05]
+11808; [71 CF 41, 05, 05]
-11829; [71 CD 2A, 05, 05]
+11809; [71 CF 48, 05, 05]
-1182A; [71 CD 31, 05, 05]
+1180A; [71 CF 4F, 05, 05]
-1182B; [71 CD 38, 05, 05]
+1180B; [71 CF 56, 05, 05]
-1182C; [71 CD 3F, 05, 05]
+1180C; [71 CF 5D, 05, 05]
-1182D; [71 CD 46, 05, 05]
+1180D; [71 CF 64, 05, 05]
-1182E; [71 CD 4D, 05, 05]
+1180E; [71 CF 6B, 05, 05]
-1182F; [71 CD 54, 05, 05]
+1180F; [71 CF 72, 05, 05]
-11830; [71 CD 5B, 05, 05]
+11810; [71 CF 79, 05, 05]
-11831; [71 CD 62, 05, 05]
+11811; [71 CF 80, 05, 05]
-11832; [71 CD 69, 05, 05]
+11812; [71 CF 87, 05, 05]
-11833; [71 CD 70, 05, 05]
+11813; [71 CF 8E, 05, 05]
-11834; [71 CD 77, 05, 05]
+11814; [71 CF 95, 05, 05]
-11835; [71 CD 7E, 05, 05]
+11815; [71 CF 9C, 05, 05]
-11836; [71 CD 85, 05, 05]
+11816; [71 CF A3, 05, 05]
-11839; [71 CD 8C, 05, 05]
+11817; [71 CF AA, 05, 05]
-FDD1 11717; [71 CE 02, 05, 05] # Ahom first primary (compressible)
+11818; [71 CF B1, 05, 05]
-11700; [71 CE 09, 05, 05]
+11819; [71 CF B8, 05, 05]
-11701; [71 CE 10, 05, 05]
+1181A; [71 CF BF, 05, 05]
-11702; [71 CE 17, 05, 05]
+1181B; [71 CF C6, 05, 05]
-11703; [71 CE 1E, 05, 05]
+1181C; [71 CF CD, 05, 05]
-11704; [71 D0, 05, 05]
-11705; [71 D0, 70, 05]
+1181D; [71 CF D4, 05, 05]
-11706; [71 D2 02, 05, 05]
+1181E; [71 CF DB, 05, 05]
-11707; [71 D2 09, 05, 05]
+1181F; [71 CF E2, 05, 05]
-11708; [71 D4, 05, 05]
-1171A; [71 D4, 70, 05]
+11820; [71 CF E9, 05, 05]
-11709; [71 D6 02, 05, 05]
+11821; [71 CF F0, 05, 05]
-1170A; [71 D6 09, 05, 05]
+11822; [71 CF F7, 05, 05]
-1170B; [71 D6 10, 05, 05]
+11823; [71 CF FE, 05, 05]
-1170C; [71 D6 17, 05, 05]
+11824; [71 D0 07, 05, 05]
-1170D; [71 D6 1E, 05, 05]
+11825; [71 D0 0E, 05, 05]
-1170E; [71 D6 25, 05, 05]
+11826; [71 D0 15, 05, 05]
-1170F; [71 D6 2C, 05, 05]
+11827; [71 D0 1C, 05, 05]
-11710; [71 D6 33, 05, 05]
+11828; [71 D0 23, 05, 05]
-11711; [71 D6 3A, 05, 05]
+11829; [71 D0 2A, 05, 05]
-11712; [71 D6 41, 05, 05]
+1182A; [71 D0 31, 05, 05]
-11713; [71 D6 48, 05, 05]
+1182B; [71 D0 38, 05, 05]
-11714; [71 D6 4F, 05, 05]
+1182C; [71 D0 3F, 05, 05]
-11715; [71 D8, 05, 05]
-11716; [71 D8, 70, 05]
+1182D; [71 D0 46, 05, 05]
-11717; [71 DA 02, 05, 05]
+1182E; [71 D0 4D, 05, 05]
-11718; [71 DA 09, 05, 05]
+1182F; [71 D0 54, 05, 05]
-11719; [71 DA 10, 05, 05]
+11830; [71 D0 5B, 05, 05]
-11720; [71 DA 17, 05, 05]
+11831; [71 D0 62, 05, 05]
-11721; [71 DA 1E, 05, 05]
+11832; [71 D0 69, 05, 05]
-11722; [71 DA 25, 05, 05]
+11833; [71 D0 70, 05, 05]
-11723; [71 DA 2C, 05, 05]
+11834; [71 D0 77, 05, 05]
-11724; [71 DA 33, 05, 05]
+11835; [71 D0 7E, 05, 05]
-11725; [71 DA 3A, 05, 05]
+11836; [71 D0 85, 05, 05]
-11726; [71 DA 41, 05, 05]
+11839; [71 D0 8C, 05, 05]
-11727; [71 DA 48, 05, 05]
+FDD1 11717; [71 D1 02, 05, 05] # Ahom first primary (compressible)
-11728; [71 DA 4F, 05, 05]
+11700; [71 D1 09, 05, 05]
-11729; [71 DA 56, 05, 05]
+11701; [71 D1 10, 05, 05]
-1172A; [71 DA 5D, 05, 05]
+11702; [71 D1 17, 05, 05]
-1172B; [71 DA 64, 05, 05]
+11703; [71 D1 1E, 05, 05]
-1171D; [71 DA 6B, 05, 05]
+11704; [71 D3, 05, 05]
+11705; [71 D3, 70, 05]
-1171E; [71 DA 72, 05, 05]
+11706; [71 D5 02, 05, 05]
-1171F; [71 DA 79, 05, 05]
+11707; [71 D5 09, 05, 05]
-FDD1 11D10; [71 DB 02, 05, 05] # Masaram_Gondi first primary (compressible)
+11708; [71 D7, 05, 05]
+1171A; [71 D7, 70, 05]
-11D00; [71 DB 09, 05, 05]
+11709; [71 D9 02, 05, 05]
-11D01; [71 DB 10, 05, 05]
+1170A; [71 D9 09, 05, 05]
-11D02; [71 DB 17, 05, 05]
+1170B; [71 D9 10, 05, 05]
-11D03; [71 DB 1E, 05, 05]
+1170C; [71 D9 17, 05, 05]
-11D04; [71 DB 25, 05, 05]
+1170D; [71 D9 1E, 05, 05]
-11D05; [71 DB 2C, 05, 05]
+1170E; [71 D9 25, 05, 05]
-11D06; [71 DB 33, 05, 05]
+1170F; [71 D9 2C, 05, 05]
-11D08; [71 DB 3A, 05, 05]
+11710; [71 D9 33, 05, 05]
-11D09; [71 DB 41, 05, 05]
+11711; [71 D9 3A, 05, 05]
-11D0B; [71 DB 48, 05, 05]
+11712; [71 D9 41, 05, 05]
-11D0C; [71 DB 4F, 05, 05]
+11713; [71 D9 48, 05, 05]
-11D0D; [71 DB 56, 05, 05]
+11714; [71 D9 4F, 05, 05]
-11D0E; [71 DB 5D, 05, 05]
+11715; [71 DB, 05, 05]
+11716; [71 DB, 70, 05]
-11D0F; [71 DB 64, 05, 05]
+11717; [71 DD 02, 05, 05]
-11D10; [71 DB 6B, 05, 05]
+11718; [71 DD 09, 05, 05]
-11D11; [71 DB 72, 05, 05]
+11719; [71 DD 10, 05, 05]
-11D12; [71 DB 79, 05, 05]
+11720; [71 DD 17, 05, 05]
-11D13; [71 DB 80, 05, 05]
+11721; [71 DD 1E, 05, 05]
-11D14; [71 DB 87, 05, 05]
+11722; [71 DD 25, 05, 05]
-11D15; [71 DB 8E, 05, 05]
+11723; [71 DD 2C, 05, 05]
-11D16; [71 DB 95, 05, 05]
+11724; [71 DD 33, 05, 05]
-11D17; [71 DB 9C, 05, 05]
+11725; [71 DD 3A, 05, 05]
-11D18; [71 DB A3, 05, 05]
+11726; [71 DD 41, 05, 05]
-11D19; [71 DB AA, 05, 05]
+11727; [71 DD 48, 05, 05]
-11D1A; [71 DB B1, 05, 05]
+11728; [71 DD 4F, 05, 05]
-11D1B; [71 DB B8, 05, 05]
+11729; [71 DD 56, 05, 05]
-11D1C; [71 DB BF, 05, 05]
+1172A; [71 DD 5D, 05, 05]
-11D1D; [71 DB C6, 05, 05]
+1172B; [71 DD 64, 05, 05]
-11D1E; [71 DB CD, 05, 05]
+1171D; [71 DD 6B, 05, 05]
-11D1F; [71 DB D4, 05, 05]
+1171E; [71 DD 72, 05, 05]
-11D20; [71 DB DB, 05, 05]
+1171F; [71 DD 79, 05, 05]
-11D21; [71 DB E2, 05, 05]
+FDD1 11D10; [71 DE 02, 05, 05] # Masaram_Gondi first primary (compressible)
-11D22; [71 DB E9, 05, 05]
+11D00; [71 DE 09, 05, 05]
-11D23; [71 DB F0, 05, 05]
+11D01; [71 DE 10, 05, 05]
-11D24; [71 DB F7, 05, 05]
+11D02; [71 DE 17, 05, 05]
-11D25; [71 DB FE, 05, 05]
+11D03; [71 DE 1E, 05, 05]
-11D26; [71 DD, 05, 05]
-11D46; [71 DD, 05, 20]
-11D47; [71 DD, 05, 2E]
+11D04; [71 DE 25, 05, 05]
-11D27; [71 DF 02, 05, 05]
+11D05; [71 DE 2C, 05, 05]
-11D28; [71 DF 09, 05, 05]
+11D06; [71 DE 33, 05, 05]
-11D29; [71 DF 10, 05, 05]
+11D08; [71 DE 3A, 05, 05]
-11D2A; [71 DF 17, 05, 05]
+11D09; [71 DE 41, 05, 05]
-11D2B; [71 DF 1E, 05, 05]
+11D0B; [71 DE 48, 05, 05]
-11D2C; [71 DF 25, 05, 05]
+11D0C; [71 DE 4F, 05, 05]
-11D2D; [71 DF 2C, 05, 05]
+11D0D; [71 DE 56, 05, 05]
-11D2E; [71 DF 33, 05, 05]
+11D0E; [71 DE 5D, 05, 05]
-11D2F; [71 DF 3A, 05, 05]
+11D0F; [71 DE 64, 05, 05]
-11D30; [71 DF 41, 05, 05]
+11D10; [71 DE 6B, 05, 05]
-11D31; [71 DF 48, 05, 05]
+11D11; [71 DE 72, 05, 05]
-11D32; [71 DF 4F, 05, 05]
+11D12; [71 DE 79, 05, 05]
-11D33; [71 DF 56, 05, 05]
+11D13; [71 DE 80, 05, 05]
-11D34; [71 DF 5D, 05, 05]
+11D14; [71 DE 87, 05, 05]
-11D35; [71 DF 64, 05, 05]
+11D15; [71 DE 8E, 05, 05]
-11D36; [71 DF 6B, 05, 05]
+11D16; [71 DE 95, 05, 05]
-11D3A; [71 DF 72, 05, 05]
+11D17; [71 DE 9C, 05, 05]
-11D3C; [71 DF 79, 05, 05]
+11D18; [71 DE A3, 05, 05]
-11D3D; [71 DF 80, 05, 05]
+11D19; [71 DE AA, 05, 05]
-11D3F; [71 DF 87, 05, 05]
+11D1A; [71 DE B1, 05, 05]
-11D44; [71 DF 8E, 05, 05]
+11D1B; [71 DE B8, 05, 05]
-11D45; [71 DF 95, 05, 05]
+11D1C; [71 DE BF, 05, 05]
-FDD1 11D71; [71 E0 02, 05, 05] # Gunjala_Gondi first primary (compressible)
+11D1D; [71 DE C6, 05, 05]
-11D98; [71 E0 09, 05, 05]
+11D1E; [71 DE CD, 05, 05]
-11D60; [71 E0 10, 05, 05]
+11D1F; [71 DE D4, 05, 05]
-11D61; [71 E0 17, 05, 05]
+11D20; [71 DE DB, 05, 05]
-11D62; [71 E0 1E, 05, 05]
+11D21; [71 DE E2, 05, 05]
-11D63; [71 E0 25, 05, 05]
+11D22; [71 DE E9, 05, 05]
-11D64; [71 E0 2C, 05, 05]
+11D23; [71 DE F0, 05, 05]
-11D65; [71 E0 33, 05, 05]
+11D24; [71 DE F7, 05, 05]
-11D67; [71 E0 3A, 05, 05]
+11D25; [71 DE FE, 05, 05]
-11D68; [71 E0 41, 05, 05]
+11D26; [71 E0, 05, 05]
+11D46; [71 E0, 05, 20]
+11D47; [71 E0, 05, 2E]
-11D6A; [71 E0 48, 05, 05]
+11D27; [71 E2 02, 05, 05]
-11D6B; [71 E0 4F, 05, 05]
+11D28; [71 E2 09, 05, 05]
-11D6C; [71 E0 56, 05, 05]
+11D29; [71 E2 10, 05, 05]
-11D6D; [71 E0 5D, 05, 05]
+11D2A; [71 E2 17, 05, 05]
-11D6E; [71 E0 64, 05, 05]
+11D2B; [71 E2 1E, 05, 05]
-11D6F; [71 E0 6B, 05, 05]
+11D2C; [71 E2 25, 05, 05]
-11D70; [71 E0 72, 05, 05]
+11D2D; [71 E2 2C, 05, 05]
-11D71; [71 E0 79, 05, 05]
+11D2E; [71 E2 33, 05, 05]
-11D72; [71 E0 80, 05, 05]
+11D2F; [71 E2 3A, 05, 05]
-11D73; [71 E0 87, 05, 05]
+11D30; [71 E2 41, 05, 05]
-11D74; [71 E0 8E, 05, 05]
+11D31; [71 E2 48, 05, 05]
-11D75; [71 E0 95, 05, 05]
+11D32; [71 E2 4F, 05, 05]
-11D76; [71 E0 9C, 05, 05]
+11D33; [71 E2 56, 05, 05]
-11D77; [71 E0 A3, 05, 05]
+11D34; [71 E2 5D, 05, 05]
-11D78; [71 E0 AA, 05, 05]
+11D35; [71 E2 64, 05, 05]
-11D79; [71 E0 B1, 05, 05]
+11D36; [71 E2 6B, 05, 05]
-11D7A; [71 E0 B8, 05, 05]
+11D3A; [71 E2 72, 05, 05]
-11D7B; [71 E0 BF, 05, 05]
+11D3C; [71 E2 79, 05, 05]
-11D7C; [71 E0 C6, 05, 05]
+11D3D; [71 E2 80, 05, 05]
-11D7D; [71 E0 CD, 05, 05]
+11D3F; [71 E2 87, 05, 05]
-11D7E; [71 E0 D4, 05, 05]
+11D44; [71 E2 8E, 05, 05]
-11D7F; [71 E0 DB, 05, 05]
+11D45; [71 E2 95, 05, 05]
-11D80; [71 E0 E2, 05, 05]
+FDD1 11D71; [71 E3 02, 05, 05] # Gunjala_Gondi first primary (compressible)
-11D81; [71 E0 E9, 05, 05]
+11D98; [71 E3 09, 05, 05]
-11D82; [71 E0 F0, 05, 05]
+11D60; [71 E3 10, 05, 05]
-11D83; [71 E0 F7, 05, 05]
+11D61; [71 E3 17, 05, 05]
-11D84; [71 E0 FE, 05, 05]
+11D62; [71 E3 1E, 05, 05]
-11D85; [71 E1 07, 05, 05]
+11D63; [71 E3 25, 05, 05]
-11D86; [71 E1 0E, 05, 05]
+11D64; [71 E3 2C, 05, 05]
-11D87; [71 E1 15, 05, 05]
+11D65; [71 E3 33, 05, 05]
-11D88; [71 E1 1C, 05, 05]
+11D67; [71 E3 3A, 05, 05]
-11D89; [71 E1 23, 05, 05]
+11D68; [71 E3 41, 05, 05]
-11D8A; [71 E1 2A, 05, 05]
+11D6A; [71 E3 48, 05, 05]
-11D8B; [71 E1 31, 05, 05]
+11D6B; [71 E3 4F, 05, 05]
-11D8C; [71 E1 38, 05, 05]
+11D6C; [71 E3 56, 05, 05]
-11D8D; [71 E1 3F, 05, 05]
+11D6D; [71 E3 5D, 05, 05]
-11D8E; [71 E1 46, 05, 05]
+11D6E; [71 E3 64, 05, 05]
-11D90; [71 E1 4D, 05, 05]
+11D6F; [71 E3 6B, 05, 05]
-11D91; [71 E1 54, 05, 05]
+11D70; [71 E3 72, 05, 05]
-11D93; [71 E1 5B, 05, 05]
+11D71; [71 E3 79, 05, 05]
-11D94; [71 E1 62, 05, 05]
+11D72; [71 E3 80, 05, 05]
-11D97; [71 E1 69, 05, 05]
+11D73; [71 E3 87, 05, 05]
-FDD1 1B83; [71 E2 02, 05, 05] # Sundanese first primary (compressible)
+11D74; [71 E3 8E, 05, 05]
-1B83; [71 E4, 05, 05]
-1BBA; [71 E4, 05, 20]
+11D75; [71 E3 95, 05, 05]
-1B84; [71 E6 02, 05, 05]
+11D76; [71 E3 9C, 05, 05]
-1B85; [71 E6 09, 05, 05]
+11D77; [71 E3 A3, 05, 05]
-1B86; [71 E6 10, 05, 05]
+11D78; [71 E3 AA, 05, 05]
-1B87; [71 E6 17, 05, 05]
+11D79; [71 E3 B1, 05, 05]
-1B88; [71 E6 1E, 05, 05]
+11D7A; [71 E3 B8, 05, 05]
-1B89; [71 E6 25, 05, 05]
+11D7B; [71 E3 BF, 05, 05]
-1B8A; [71 E8, 05, 05]
-1BBE; [71 E8, 05, 20]
+11D7C; [71 E3 C6, 05, 05]
-1BAE; [71 EA 02, 05, 05]
+11D7D; [71 E3 CD, 05, 05]
-1B8B; [71 EA 09, 05, 05]
+11D7E; [71 E3 D4, 05, 05]
-1B8C; [71 EA 10, 05, 05]
+11D7F; [71 E3 DB, 05, 05]
-1B8D; [71 EA 17, 05, 05]
+11D80; [71 E3 E2, 05, 05]
-1B8E; [71 EA 1E, 05, 05]
+11D81; [71 E3 E9, 05, 05]
-1B8F; [71 EA 25, 05, 05]
+11D82; [71 E3 F0, 05, 05]
-1B90; [71 EA 2C, 05, 05]
+11D83; [71 E3 F7, 05, 05]
-1B91; [71 EA 33, 05, 05]
+11D84; [71 E3 FE, 05, 05]
-1B92; [71 EA 3A, 05, 05]
+11D85; [71 E4 07, 05, 05]
-1B93; [71 EA 41, 05, 05]
+11D86; [71 E4 0E, 05, 05]
-1B94; [71 EA 48, 05, 05]
+11D87; [71 E4 15, 05, 05]
-1B95; [71 EA 4F, 05, 05]
+11D88; [71 E4 1C, 05, 05]
-1B96; [71 EA 56, 05, 05]
+11D89; [71 E4 23, 05, 05]
-1B97; [71 EA 5D, 05, 05]
+11D8A; [71 E4 2A, 05, 05]
-1B98; [71 EA 64, 05, 05]
+11D8B; [71 E4 31, 05, 05]
-1BBD; [71 EA 6B, 05, 05]
+11D8C; [71 E4 38, 05, 05]
-1B99; [71 EC, 05, 05]
-1BBF; [71 EC, 05, 20]
+11D8D; [71 E4 3F, 05, 05]
-1BAC; [71 EE 02, 05, 05]
+11D8E; [71 E4 46, 05, 05]
-1B9A; [71 EE 09, 05, 05]
+11D90; [71 E4 4D, 05, 05]
-1BA1; [71 EE 10, 05, 05]
+11D91; [71 E4 54, 05, 05]
-1B9B; [71 EE 17, 05, 05]
+11D93; [71 E4 5B, 05, 05]
-1BA2; [71 EE 1E, 05, 05]
+11D94; [71 E4 62, 05, 05]
-1BBB; [71 EE 25, 05, 05]
+11D97; [71 E4 69, 05, 05]
-1B9C; [71 EE 2C, 05, 05]
+FDD1 1B83; [71 E5 02, 05, 05] # Sundanese first primary (compressible)
-1BA3; [71 EE 33, 05, 05]
+1B83; [71 E7, 05, 05]
+1BBA; [71 E7, 05, 20]
-1BBC; [71 EE 3A, 05, 05]
+1B84; [71 E9 02, 05, 05]
-1B9D; [71 EE 41, 05, 05]
+1B85; [71 E9 09, 05, 05]
-1BAD; [71 EE 48, 05, 05]
+1B86; [71 E9 10, 05, 05]
-1B9E; [71 EE 4F, 05, 05]
+1B87; [71 E9 17, 05, 05]
-1B9F; [71 EE 56, 05, 05]
+1B88; [71 E9 1E, 05, 05]
-1BAF; [71 EE 5D, 05, 05]
+1B89; [71 E9 25, 05, 05]
-1BA0; [71 EE 64, 05, 05]
+1B8A; [71 EB, 05, 05]
+1BBE; [71 EB, 05, 20]
-1BA4; [71 EE 6B, 05, 05]
+1BAE; [71 ED 02, 05, 05]
-1BA5; [71 EE 72, 05, 05]
+1B8B; [71 ED 09, 05, 05]
-1BA6; [71 EE 79, 05, 05]
+1B8C; [71 ED 10, 05, 05]
-1BA7; [71 EE 80, 05, 05]
+1B8D; [71 ED 17, 05, 05]
-1BA8; [71 EE 87, 05, 05]
+1B8E; [71 ED 1E, 05, 05]
-1BA9; [71 EE 8E, 05, 05]
+1B8F; [71 ED 25, 05, 05]
-1BAA; [71 EE 95, 05, 05]
+1B90; [71 ED 2C, 05, 05]
-1BAB; [71 EE 9C, 05, 05]
+1B91; [71 ED 33, 05, 05]
-FDD1 11005; [71 EF 02, 05, 05] # Brahmi first primary (compressible)
+1B92; [71 ED 3A, 05, 05]
-11005; [71 EF 09, 05, 05]
+1B93; [71 ED 41, 05, 05]
-11006; [71 EF 10, 05, 05]
+1B94; [71 ED 48, 05, 05]
-11007; [71 EF 17, 05, 05]
+1B95; [71 ED 4F, 05, 05]
-11008; [71 EF 1E, 05, 05]
+1B96; [71 ED 56, 05, 05]
-11009; [71 EF 25, 05, 05]
+1B97; [71 ED 5D, 05, 05]
-1100A; [71 EF 2C, 05, 05]
+1B98; [71 ED 64, 05, 05]
-1100B; [71 EF 33, 05, 05]
+1BBD; [71 ED 6B, 05, 05]
-1100C; [71 EF 3A, 05, 05]
+1B99; [71 EF, 05, 05]
+1BBF; [71 EF, 05, 20]
-1100D; [71 EF 41, 05, 05]
+1BAC; [71 F1 02, 05, 05]
-1100E; [71 EF 48, 05, 05]
+1B9A; [71 F1 09, 05, 05]
-1100F; [71 EF 4F, 05, 05]
+1BA1; [71 F1 10, 05, 05]
-11010; [71 EF 56, 05, 05]
+1B9B; [71 F1 17, 05, 05]
-11011; [71 EF 5D, 05, 05]
+1BA2; [71 F1 1E, 05, 05]
-11012; [71 EF 64, 05, 05]
+1BBB; [71 F1 25, 05, 05]
-11013; [71 EF 6B, 05, 05]
+1B9C; [71 F1 2C, 05, 05]
-11014; [71 EF 72, 05, 05]
+1BA3; [71 F1 33, 05, 05]
-11015; [71 EF 79, 05, 05]
+1BBC; [71 F1 3A, 05, 05]
-11016; [71 EF 80, 05, 05]
+1B9D; [71 F1 41, 05, 05]
-11017; [71 EF 87, 05, 05]
+1BAD; [71 F1 48, 05, 05]
-11018; [71 EF 8E, 05, 05]
+1B9E; [71 F1 4F, 05, 05]
-11019; [71 EF 95, 05, 05]
+1B9F; [71 F1 56, 05, 05]
-1101A; [71 EF 9C, 05, 05]
+1BAF; [71 F1 5D, 05, 05]
-1101B; [71 EF A3, 05, 05]
+1BA0; [71 F1 64, 05, 05]
-1101C; [71 EF AA, 05, 05]
+1BA4; [71 F1 6B, 05, 05]
-1101D; [71 EF B1, 05, 05]
+1BA5; [71 F1 72, 05, 05]
-1101E; [71 EF B8, 05, 05]
+1BA6; [71 F1 79, 05, 05]
-1101F; [71 EF BF, 05, 05]
+1BA7; [71 F1 80, 05, 05]
-11020; [71 EF C6, 05, 05]
+1BA8; [71 F1 87, 05, 05]
-11021; [71 EF CD, 05, 05]
+1BA9; [71 F1 8E, 05, 05]
-11022; [71 EF D4, 05, 05]
+1BAA; [71 F1 95, 05, 05]
-11023; [71 EF DB, 05, 05]
+1BAB; [71 F1 9C, 05, 05]
-11024; [71 EF E2, 05, 05]
+FDD1 11005; [71 F2 02, 05, 05] # Brahmi first primary (compressible)
-11025; [71 EF E9, 05, 05]
+11005; [71 F2 09, 05, 05]
-11026; [71 EF F0, 05, 05]
+11006; [71 F2 10, 05, 05]
-11027; [71 EF F7, 05, 05]
+11007; [71 F2 17, 05, 05]
-11028; [71 EF FE, 05, 05]
+11008; [71 F2 1E, 05, 05]
-11029; [71 F0 07, 05, 05]
+11009; [71 F2 25, 05, 05]
-1102A; [71 F0 0E, 05, 05]
+1100A; [71 F2 2C, 05, 05]
-1102B; [71 F0 15, 05, 05]
+1100B; [71 F2 33, 05, 05]
-1102C; [71 F0 1C, 05, 05]
+1100C; [71 F2 3A, 05, 05]
-1102D; [71 F0 23, 05, 05]
+1100D; [71 F2 41, 05, 05]
-1102E; [71 F0 2A, 05, 05]
+1100E; [71 F2 48, 05, 05]
-1102F; [71 F0 31, 05, 05]
+1100F; [71 F2 4F, 05, 05]
-11030; [71 F0 38, 05, 05]
+11010; [71 F2 56, 05, 05]
-11031; [71 F0 3F, 05, 05]
+11011; [71 F2 5D, 05, 05]
-11032; [71 F0 46, 05, 05]
+11012; [71 F2 64, 05, 05]
-11033; [71 F0 4D, 05, 05]
+11013; [71 F2 6B, 05, 05]
-11003; [71 F0 54, 05, 05]
+11014; [71 F2 72, 05, 05]
-11004; [71 F0 5B, 05, 05]
+11015; [71 F2 79, 05, 05]
-11034; [71 F0 62, 05, 05]
+11016; [71 F2 80, 05, 05]
-11035; [71 F0 69, 05, 05]
+11017; [71 F2 87, 05, 05]
-11036; [71 F0 70, 05, 05]
+11018; [71 F2 8E, 05, 05]
-11037; [71 F0 77, 05, 05]
+11019; [71 F2 95, 05, 05]
-11038; [71 F0 7E, 05, 05]
+1101A; [71 F2 9C, 05, 05]
-11039; [71 F0 85, 05, 05]
+1101B; [71 F2 A3, 05, 05]
-1103A; [71 F0 8C, 05, 05]
+1101C; [71 F2 AA, 05, 05]
-1103B; [71 F0 93, 05, 05]
+1101D; [71 F2 B1, 05, 05]
-1103C; [71 F0 9A, 05, 05]
+1101E; [71 F2 B8, 05, 05]
-1103D; [71 F0 A1, 05, 05]
+1101F; [71 F2 BF, 05, 05]
-1103E; [71 F0 A8, 05, 05]
+11020; [71 F2 C6, 05, 05]
-1103F; [71 F0 AF, 05, 05]
+11021; [71 F2 CD, 05, 05]
-11040; [71 F0 B6, 05, 05]
+11022; [71 F2 D4, 05, 05]
-11041; [71 F0 BD, 05, 05]
+11023; [71 F2 DB, 05, 05]
-11042; [71 F0 C4, 05, 05]
+11024; [71 F2 E2, 05, 05]
-11043; [71 F0 CB, 05, 05]
+11025; [71 F2 E9, 05, 05]
-11044; [71 F0 D2, 05, 05]
+11026; [71 F2 F0, 05, 05]
-11045; [71 F0 D9, 05, 05]
+11027; [71 F2 F7, 05, 05]
-11046; [71 F0 E0, 05, 05]
+11028; [71 F2 FE, 05, 05]
-1107F; [71 F0 E7, 05, 05]
+11029; [71 F3 07, 05, 05]
-FDD1 10A00; [71 F1 02, 05, 05] # KHAROSHTHI first primary (compressible)
+1102A; [71 F3 0E, 05, 05]
-10A00; [71 F1 09, 05, 05]
+1102B; [71 F3 15, 05, 05]
-10A01; [71 F1 10, 05, 05]
+1102C; [71 F3 1C, 05, 05]
-10A02; [71 F1 17, 05, 05]
+1102D; [71 F3 23, 05, 05]
-10A03; [71 F1 1E, 05, 05]
+1102E; [71 F3 2A, 05, 05]
-10A05; [71 F1 25, 05, 05]
+1102F; [71 F3 31, 05, 05]
-10A06; [71 F1 2C, 05, 05]
+11030; [71 F3 38, 05, 05]
-10A0C; [71 F1 33, 05, 05]
+11031; [71 F3 3F, 05, 05]
-10A10; [71 F1 3A, 05, 05]
+11032; [71 F3 46, 05, 05]
-10A32; [71 F1 41, 05, 05]
+11033; [71 F3 4D, 05, 05]
-10A11; [71 F1 48, 05, 05]
+11003; [71 F3 54, 05, 05]
-10A12; [71 F1 4F, 05, 05]
+11004; [71 F3 5B, 05, 05]
-10A13; [71 F1 56, 05, 05]
+11034; [71 F3 62, 05, 05]
-10A15; [71 F1 5D, 05, 05]
+11035; [71 F3 69, 05, 05]
-10A16; [71 F1 64, 05, 05]
+11036; [71 F3 70, 05, 05]
-10A17; [71 F1 6B, 05, 05]
+11037; [71 F3 77, 05, 05]
-10A19; [71 F1 72, 05, 05]
+11038; [71 F3 7E, 05, 05]
-10A1A; [71 F1 79, 05, 05]
+11039; [71 F3 85, 05, 05]
-10A34; [71 F1 80, 05, 05]
+1103A; [71 F3 8C, 05, 05]
-10A1B; [71 F1 87, 05, 05]
+1103B; [71 F3 93, 05, 05]
-10A33; [71 F1 8E, 05, 05]
+1103C; [71 F3 9A, 05, 05]
-10A1C; [71 F1 95, 05, 05]
+1103D; [71 F3 A1, 05, 05]
-10A1D; [71 F1 9C, 05, 05]
+1103E; [71 F3 A8, 05, 05]
-10A1E; [71 F1 A3, 05, 05]
+1103F; [71 F3 AF, 05, 05]
-10A1F; [71 F1 AA, 05, 05]
+11040; [71 F3 B6, 05, 05]
-10A20; [71 F1 B1, 05, 05]
+11041; [71 F3 BD, 05, 05]
-10A21; [71 F1 B8, 05, 05]
+11042; [71 F3 C4, 05, 05]
-10A22; [71 F1 BF, 05, 05]
+11043; [71 F3 CB, 05, 05]
-10A23; [71 F1 C6, 05, 05]
+11044; [71 F3 D2, 05, 05]
-10A24; [71 F1 CD, 05, 05]
+11045; [71 F3 D9, 05, 05]
-10A25; [71 F1 D4, 05, 05]
+11046; [71 F3 E0, 05, 05]
-10A26; [71 F1 DB, 05, 05]
+1107F; [71 F3 E7, 05, 05]
-10A27; [71 F1 E2, 05, 05]
+FDD1 10A00; [71 F4 02, 05, 05] # KHAROSHTHI first primary (compressible)
-10A28; [71 F1 E9, 05, 05]
+10A00; [71 F4 09, 05, 05]
-10A29; [71 F1 F0, 05, 05]
+10A01; [71 F4 10, 05, 05]
-10A2A; [71 F1 F7, 05, 05]
+10A02; [71 F4 17, 05, 05]
-10A2B; [71 F1 FE, 05, 05]
+10A03; [71 F4 1E, 05, 05]
-10A2C; [71 F2 07, 05, 05]
+10A05; [71 F4 25, 05, 05]
-10A35; [71 F2 0E, 05, 05]
+10A06; [71 F4 2C, 05, 05]
-10A2D; [71 F2 15, 05, 05]
+10A0C; [71 F4 33, 05, 05]
-10A2E; [71 F2 1C, 05, 05]
+10A10; [71 F4 3A, 05, 05]
-10A2F; [71 F2 23, 05, 05]
+10A32; [71 F4 41, 05, 05]
-10A30; [71 F2 2A, 05, 05]
+10A11; [71 F4 48, 05, 05]
-10A31; [71 F2 31, 05, 05]
+10A12; [71 F4 4F, 05, 05]
-10A3F; [71 F2 38, 05, 05]
+10A13; [71 F4 56, 05, 05]
-FDD1 11C0E; [71 F3 02, 05, 05] # Bhaiksuki first primary (compressible)
+10A15; [71 F4 5D, 05, 05]
-11C00; [71 F3 09, 05, 05]
+10A16; [71 F4 64, 05, 05]
-11C01; [71 F3 10, 05, 05]
+10A17; [71 F4 6B, 05, 05]
-11C02; [71 F3 17, 05, 05]
+10A19; [71 F4 72, 05, 05]
-11C03; [71 F3 1E, 05, 05]
+10A1A; [71 F4 79, 05, 05]
-11C04; [71 F3 25, 05, 05]
+10A34; [71 F4 80, 05, 05]
-11C05; [71 F3 2C, 05, 05]
+10A1B; [71 F4 87, 05, 05]
-11C06; [71 F3 33, 05, 05]
+10A33; [71 F4 8E, 05, 05]
-11C07; [71 F3 3A, 05, 05]
+10A1C; [71 F4 95, 05, 05]
-11C08; [71 F3 41, 05, 05]
+10A1D; [71 F4 9C, 05, 05]
-11C0A; [71 F3 48, 05, 05]
+10A1E; [71 F4 A3, 05, 05]
-11C0B; [71 F3 4F, 05, 05]
+10A1F; [71 F4 AA, 05, 05]
-11C0C; [71 F3 56, 05, 05]
+10A20; [71 F4 B1, 05, 05]
-11C0D; [71 F3 5D, 05, 05]
+10A21; [71 F4 B8, 05, 05]
-11C0E; [71 F3 64, 05, 05]
+10A22; [71 F4 BF, 05, 05]
-11C0F; [71 F3 6B, 05, 05]
+10A23; [71 F4 C6, 05, 05]
-11C10; [71 F3 72, 05, 05]
+10A24; [71 F4 CD, 05, 05]
-11C11; [71 F3 79, 05, 05]
+10A25; [71 F4 D4, 05, 05]
-11C12; [71 F3 80, 05, 05]
+10A26; [71 F4 DB, 05, 05]
-11C13; [71 F3 87, 05, 05]
+10A27; [71 F4 E2, 05, 05]
-11C14; [71 F3 8E, 05, 05]
+10A28; [71 F4 E9, 05, 05]
-11C15; [71 F3 95, 05, 05]
+10A29; [71 F4 F0, 05, 05]
-11C16; [71 F3 9C, 05, 05]
+10A2A; [71 F4 F7, 05, 05]
-11C17; [71 F3 A3, 05, 05]
+10A2B; [71 F4 FE, 05, 05]
-11C18; [71 F3 AA, 05, 05]
+10A2C; [71 F5 07, 05, 05]
-11C19; [71 F3 B1, 05, 05]
+10A35; [71 F5 0E, 05, 05]
-11C1A; [71 F3 B8, 05, 05]
+10A2D; [71 F5 15, 05, 05]
-11C1B; [71 F3 BF, 05, 05]
+10A2E; [71 F5 1C, 05, 05]
-11C1C; [71 F3 C6, 05, 05]
+10A2F; [71 F5 23, 05, 05]
-11C1D; [71 F3 CD, 05, 05]
+10A30; [71 F5 2A, 05, 05]
-11C1E; [71 F3 D4, 05, 05]
+10A31; [71 F5 31, 05, 05]
-11C1F; [71 F3 DB, 05, 05]
+10A3F; [71 F5 38, 05, 05]
-11C20; [71 F3 E2, 05, 05]
+FDD1 11C0E; [71 F6 02, 05, 05] # Bhaiksuki first primary (compressible)
-11C21; [71 F3 E9, 05, 05]
+11C00; [71 F6 09, 05, 05]
-11C22; [71 F3 F0, 05, 05]
+11C01; [71 F6 10, 05, 05]
-11C23; [71 F3 F7, 05, 05]
+11C02; [71 F6 17, 05, 05]
-11C24; [71 F3 FE, 05, 05]
+11C03; [71 F6 1E, 05, 05]
-11C25; [71 F4 07, 05, 05]
+11C04; [71 F6 25, 05, 05]
-11C26; [71 F4 0E, 05, 05]
+11C05; [71 F6 2C, 05, 05]
-11C27; [71 F4 15, 05, 05]
+11C06; [71 F6 33, 05, 05]
-11C28; [71 F4 1C, 05, 05]
+11C07; [71 F6 3A, 05, 05]
-11C29; [71 F4 23, 05, 05]
+11C08; [71 F6 41, 05, 05]
-11C2A; [71 F4 2A, 05, 05]
+11C0A; [71 F6 48, 05, 05]
-11C2B; [71 F4 31, 05, 05]
+11C0B; [71 F6 4F, 05, 05]
-11C2C; [71 F4 38, 05, 05]
+11C0C; [71 F6 56, 05, 05]
-11C2D; [71 F4 3F, 05, 05]
+11C0D; [71 F6 5D, 05, 05]
-11C2E; [71 F4 46, 05, 05]
+11C0E; [71 F6 64, 05, 05]
-11C40; [71 F4 4D, 05, 05]
+11C0F; [71 F6 6B, 05, 05]
-11C2F; [71 F4 54, 05, 05]
+11C10; [71 F6 72, 05, 05]
-11C30; [71 F4 5B, 05, 05]
+11C11; [71 F6 79, 05, 05]
-11C31; [71 F4 62, 05, 05]
+11C12; [71 F6 80, 05, 05]
-11C32; [71 F4 69, 05, 05]
+11C13; [71 F6 87, 05, 05]
-11C33; [71 F4 70, 05, 05]
+11C14; [71 F6 8E, 05, 05]
-11C34; [71 F4 77, 05, 05]
+11C15; [71 F6 95, 05, 05]
-11C35; [71 F4 7E, 05, 05]
+11C16; [71 F6 9C, 05, 05]
-11C36; [71 F4 85, 05, 05]
+11C17; [71 F6 A3, 05, 05]
-11C38; [71 F4 8C, 05, 05]
+11C18; [71 F6 AA, 05, 05]
-11C39; [71 F4 93, 05, 05]
+11C19; [71 F6 B1, 05, 05]
-11C3A; [71 F4 9A, 05, 05]
+11C1A; [71 F6 B8, 05, 05]
-11C3B; [71 F4 A1, 05, 05]
+11C1B; [71 F6 BF, 05, 05]
-11C3F; [71 F4 A8, 05, 05]
+11C1C; [71 F6 C6, 05, 05]
+
+11C1D; [71 F6 CD, 05, 05]
+
+11C1E; [71 F6 D4, 05, 05]
+
+11C1F; [71 F6 DB, 05, 05]
+
+11C20; [71 F6 E2, 05, 05]
+
+11C21; [71 F6 E9, 05, 05]
+
+11C22; [71 F6 F0, 05, 05]
+
+11C23; [71 F6 F7, 05, 05]
+
+11C24; [71 F6 FE, 05, 05]
+
+11C25; [71 F7 07, 05, 05]
+
+11C26; [71 F7 0E, 05, 05]
+
+11C27; [71 F7 15, 05, 05]
+
+11C28; [71 F7 1C, 05, 05]
+
+11C29; [71 F7 23, 05, 05]
+
+11C2A; [71 F7 2A, 05, 05]
+
+11C2B; [71 F7 31, 05, 05]
+
+11C2C; [71 F7 38, 05, 05]
+
+11C2D; [71 F7 3F, 05, 05]
+
+11C2E; [71 F7 46, 05, 05]
+
+11C40; [71 F7 4D, 05, 05]
+
+11C2F; [71 F7 54, 05, 05]
+
+11C30; [71 F7 5B, 05, 05]
+
+11C31; [71 F7 62, 05, 05]
+
+11C32; [71 F7 69, 05, 05]
+
+11C33; [71 F7 70, 05, 05]
+
+11C34; [71 F7 77, 05, 05]
+
+11C35; [71 F7 7E, 05, 05]
+
+11C36; [71 F7 85, 05, 05]
+
+11C38; [71 F7 8C, 05, 05]
+
+11C39; [71 F7 93, 05, 05]
+
+11C3A; [71 F7 9A, 05, 05]
+
+11C3B; [71 F7 A1, 05, 05]
+
+11C3F; [71 F7 A8, 05, 05]
FDD1 0E17; [72 04 02, 05, 05] # THAI first primary starts new lead byte (compressible)
@@ -29888,634 +30598,734 @@ FDD1 0E17; [72 04 02, 05, 05] # THAI first primary starts new lead byte (compres
FDD1 0EA5; [73 04 02, 05, 05] # LAO first primary starts new lead byte (compressible)
0EDE; [73 06, 05, 05]
-0EC0 0EDE; [73 06, 05, 05][73 5C, 05, 05]
-0EC1 0EDE; [73 06, 05, 05][73 5E, 05, 05]
-0EC2 0EDE; [73 06, 05, 05][73 60, 05, 05]
-0EC3 0EDE; [73 06, 05, 05][73 62, 05, 05]
-0EC4 0EDE; [73 06, 05, 05][73 64, 05, 05]
+0EC0 0EDE; [73 06, 05, 05][73 7A, 05, 05]
+0EC1 0EDE; [73 06, 05, 05][73 7C, 05, 05]
+0EC2 0EDE; [73 06, 05, 05][73 7E, 05, 05]
+0EC3 0EDE; [73 06, 05, 05][73 80, 05, 05]
+0EC4 0EDE; [73 06, 05, 05][73 82, 05, 05]
0E81; [73 08, 05, 05]
-0EC0 0E81; [73 08, 05, 05][73 5C, 05, 05]
-0EC1 0E81; [73 08, 05, 05][73 5E, 05, 05]
-0EC2 0E81; [73 08, 05, 05][73 60, 05, 05]
-0EC3 0E81; [73 08, 05, 05][73 62, 05, 05]
-0EC4 0E81; [73 08, 05, 05][73 64, 05, 05]
+0EC0 0E81; [73 08, 05, 05][73 7A, 05, 05]
+0EC1 0E81; [73 08, 05, 05][73 7C, 05, 05]
+0EC2 0E81; [73 08, 05, 05][73 7E, 05, 05]
+0EC3 0E81; [73 08, 05, 05][73 80, 05, 05]
+0EC4 0E81; [73 08, 05, 05][73 82, 05, 05]
0E82; [73 0A, 05, 05]
-0EC0 0E82; [73 0A, 05, 05][73 5C, 05, 05]
-0EC1 0E82; [73 0A, 05, 05][73 5E, 05, 05]
-0EC2 0E82; [73 0A, 05, 05][73 60, 05, 05]
-0EC3 0E82; [73 0A, 05, 05][73 62, 05, 05]
-0EC4 0E82; [73 0A, 05, 05][73 64, 05, 05]
+0EC0 0E82; [73 0A, 05, 05][73 7A, 05, 05]
+0EC1 0E82; [73 0A, 05, 05][73 7C, 05, 05]
+0EC2 0E82; [73 0A, 05, 05][73 7E, 05, 05]
+0EC3 0E82; [73 0A, 05, 05][73 80, 05, 05]
+0EC4 0E82; [73 0A, 05, 05][73 82, 05, 05]
0E84; [73 0C, 05, 05]
-0EC0 0E84; [73 0C, 05, 05][73 5C, 05, 05]
-0EC1 0E84; [73 0C, 05, 05][73 5E, 05, 05]
-0EC2 0E84; [73 0C, 05, 05][73 60, 05, 05]
-0EC3 0E84; [73 0C, 05, 05][73 62, 05, 05]
-0EC4 0E84; [73 0C, 05, 05][73 64, 05, 05]
-
-0E87; [73 0E, 05, 05]
-0EC0 0E87; [73 0E, 05, 05][73 5C, 05, 05]
-0EC1 0E87; [73 0E, 05, 05][73 5E, 05, 05]
-0EC2 0E87; [73 0E, 05, 05][73 60, 05, 05]
-0EC3 0E87; [73 0E, 05, 05][73 62, 05, 05]
-0EC4 0E87; [73 0E, 05, 05][73 64, 05, 05]
-
-0E88; [73 10, 05, 05]
-0EC0 0E88; [73 10, 05, 05][73 5C, 05, 05]
-0EC1 0E88; [73 10, 05, 05][73 5E, 05, 05]
-0EC2 0E88; [73 10, 05, 05][73 60, 05, 05]
-0EC3 0E88; [73 10, 05, 05][73 62, 05, 05]
-0EC4 0E88; [73 10, 05, 05][73 64, 05, 05]
-
-0EAA; [73 12, 05, 05]
-0EC0 0EAA; [73 12, 05, 05][73 5C, 05, 05]
-0EC1 0EAA; [73 12, 05, 05][73 5E, 05, 05]
-0EC2 0EAA; [73 12, 05, 05][73 60, 05, 05]
-0EC3 0EAA; [73 12, 05, 05][73 62, 05, 05]
-0EC4 0EAA; [73 12, 05, 05][73 64, 05, 05]
-
-0E8A; [73 14, 05, 05]
-0EC0 0E8A; [73 14, 05, 05][73 5C, 05, 05]
-0EC1 0E8A; [73 14, 05, 05][73 5E, 05, 05]
-0EC2 0E8A; [73 14, 05, 05][73 60, 05, 05]
-0EC3 0E8A; [73 14, 05, 05][73 62, 05, 05]
-0EC4 0E8A; [73 14, 05, 05][73 64, 05, 05]
-
-0EDF; [73 16, 05, 05]
-0EC0 0EDF; [73 16, 05, 05][73 5C, 05, 05]
-0EC1 0EDF; [73 16, 05, 05][73 5E, 05, 05]
-0EC2 0EDF; [73 16, 05, 05][73 60, 05, 05]
-0EC3 0EDF; [73 16, 05, 05][73 62, 05, 05]
-0EC4 0EDF; [73 16, 05, 05][73 64, 05, 05]
-
-0E8D; [73 18, 05, 05]
-0EC0 0E8D; [73 18, 05, 05][73 5C, 05, 05]
-0EC1 0E8D; [73 18, 05, 05][73 5E, 05, 05]
-0EC2 0E8D; [73 18, 05, 05][73 60, 05, 05]
-0EC3 0E8D; [73 18, 05, 05][73 62, 05, 05]
-0EC4 0E8D; [73 18, 05, 05][73 64, 05, 05]
-
-0E94; [73 1A, 05, 05]
-0EC0 0E94; [73 1A, 05, 05][73 5C, 05, 05]
-0EC1 0E94; [73 1A, 05, 05][73 5E, 05, 05]
-0EC2 0E94; [73 1A, 05, 05][73 60, 05, 05]
-0EC3 0E94; [73 1A, 05, 05][73 62, 05, 05]
-0EC4 0E94; [73 1A, 05, 05][73 64, 05, 05]
-
-0E95; [73 1C, 05, 05]
-0EC0 0E95; [73 1C, 05, 05][73 5C, 05, 05]
-0EC1 0E95; [73 1C, 05, 05][73 5E, 05, 05]
-0EC2 0E95; [73 1C, 05, 05][73 60, 05, 05]
-0EC3 0E95; [73 1C, 05, 05][73 62, 05, 05]
-0EC4 0E95; [73 1C, 05, 05][73 64, 05, 05]
-
-0E96; [73 1E, 05, 05]
-0EC0 0E96; [73 1E, 05, 05][73 5C, 05, 05]
-0EC1 0E96; [73 1E, 05, 05][73 5E, 05, 05]
-0EC2 0E96; [73 1E, 05, 05][73 60, 05, 05]
-0EC3 0E96; [73 1E, 05, 05][73 62, 05, 05]
-0EC4 0E96; [73 1E, 05, 05][73 64, 05, 05]
-
-0E97; [73 20, 05, 05]
-0EC0 0E97; [73 20, 05, 05][73 5C, 05, 05]
-0EC1 0E97; [73 20, 05, 05][73 5E, 05, 05]
-0EC2 0E97; [73 20, 05, 05][73 60, 05, 05]
-0EC3 0E97; [73 20, 05, 05][73 62, 05, 05]
-0EC4 0E97; [73 20, 05, 05][73 64, 05, 05]
-
-0E99; [73 22, 05, 05]
-0EC0 0E99; [73 22, 05, 05][73 5C, 05, 05]
-0EC1 0E99; [73 22, 05, 05][73 5E, 05, 05]
-0EC2 0E99; [73 22, 05, 05][73 60, 05, 05]
-0EC3 0E99; [73 22, 05, 05][73 62, 05, 05]
-0EC4 0E99; [73 22, 05, 05][73 64, 05, 05]
-
-0E9A; [73 24, 05, 05]
-0EC0 0E9A; [73 24, 05, 05][73 5C, 05, 05]
-0EC1 0E9A; [73 24, 05, 05][73 5E, 05, 05]
-0EC2 0E9A; [73 24, 05, 05][73 60, 05, 05]
-0EC3 0E9A; [73 24, 05, 05][73 62, 05, 05]
-0EC4 0E9A; [73 24, 05, 05][73 64, 05, 05]
-
-0E9B; [73 26, 05, 05]
-0EC0 0E9B; [73 26, 05, 05][73 5C, 05, 05]
-0EC1 0E9B; [73 26, 05, 05][73 5E, 05, 05]
-0EC2 0E9B; [73 26, 05, 05][73 60, 05, 05]
-0EC3 0E9B; [73 26, 05, 05][73 62, 05, 05]
-0EC4 0E9B; [73 26, 05, 05][73 64, 05, 05]
-
-0E9C; [73 28, 05, 05]
-0EC0 0E9C; [73 28, 05, 05][73 5C, 05, 05]
-0EC1 0E9C; [73 28, 05, 05][73 5E, 05, 05]
-0EC2 0E9C; [73 28, 05, 05][73 60, 05, 05]
-0EC3 0E9C; [73 28, 05, 05][73 62, 05, 05]
-0EC4 0E9C; [73 28, 05, 05][73 64, 05, 05]
-
-0E9D; [73 2A, 05, 05]
-0EC0 0E9D; [73 2A, 05, 05][73 5C, 05, 05]
-0EC1 0E9D; [73 2A, 05, 05][73 5E, 05, 05]
-0EC2 0E9D; [73 2A, 05, 05][73 60, 05, 05]
-0EC3 0E9D; [73 2A, 05, 05][73 62, 05, 05]
-0EC4 0E9D; [73 2A, 05, 05][73 64, 05, 05]
-
-0E9E; [73 2C, 05, 05]
-0EC0 0E9E; [73 2C, 05, 05][73 5C, 05, 05]
-0EC1 0E9E; [73 2C, 05, 05][73 5E, 05, 05]
-0EC2 0E9E; [73 2C, 05, 05][73 60, 05, 05]
-0EC3 0E9E; [73 2C, 05, 05][73 62, 05, 05]
-0EC4 0E9E; [73 2C, 05, 05][73 64, 05, 05]
-
-0E9F; [73 2E, 05, 05]
-0EC0 0E9F; [73 2E, 05, 05][73 5C, 05, 05]
-0EC1 0E9F; [73 2E, 05, 05][73 5E, 05, 05]
-0EC2 0E9F; [73 2E, 05, 05][73 60, 05, 05]
-0EC3 0E9F; [73 2E, 05, 05][73 62, 05, 05]
-0EC4 0E9F; [73 2E, 05, 05][73 64, 05, 05]
-
-0EA1; [73 30, 05, 05]
-0EC0 0EA1; [73 30, 05, 05][73 5C, 05, 05]
-0EC1 0EA1; [73 30, 05, 05][73 5E, 05, 05]
-0EC2 0EA1; [73 30, 05, 05][73 60, 05, 05]
-0EC3 0EA1; [73 30, 05, 05][73 62, 05, 05]
-0EC4 0EA1; [73 30, 05, 05][73 64, 05, 05]
-
-0EA2; [73 32, 05, 05]
-0EC0 0EA2; [73 32, 05, 05][73 5C, 05, 05]
-0EC1 0EA2; [73 32, 05, 05][73 5E, 05, 05]
-0EC2 0EA2; [73 32, 05, 05][73 60, 05, 05]
-0EC3 0EA2; [73 32, 05, 05][73 62, 05, 05]
-0EC4 0EA2; [73 32, 05, 05][73 64, 05, 05]
-
-0EA3; [73 34, 05, 05]
-0EC0 0EA3; [73 34, 05, 05][73 5C, 05, 05]
-0EC1 0EA3; [73 34, 05, 05][73 5E, 05, 05]
-0EC2 0EA3; [73 34, 05, 05][73 60, 05, 05]
-0EC3 0EA3; [73 34, 05, 05][73 62, 05, 05]
-0EC4 0EA3; [73 34, 05, 05][73 64, 05, 05]
-
-0EA5; [73 36, 05, 05]
-0EC0 0EA5; [73 36, 05, 05][73 5C, 05, 05]
-0EC1 0EA5; [73 36, 05, 05][73 5E, 05, 05]
-0EC2 0EA5; [73 36, 05, 05][73 60, 05, 05]
-0EC3 0EA5; [73 36, 05, 05][73 62, 05, 05]
-0EC4 0EA5; [73 36, 05, 05][73 64, 05, 05]
-
-0EA7; [73 38, 05, 05]
-0EC0 0EA7; [73 38, 05, 05][73 5C, 05, 05]
-0EC1 0EA7; [73 38, 05, 05][73 5E, 05, 05]
-0EC2 0EA7; [73 38, 05, 05][73 60, 05, 05]
-0EC3 0EA7; [73 38, 05, 05][73 62, 05, 05]
-0EC4 0EA7; [73 38, 05, 05][73 64, 05, 05]
-
-0EAB; [73 3A, 05, 05]
-0EDC; [73 3A, 05, 20][73 22, 05, 20]
-0EC0 0EDC; [73 3A, 05, 20][73 22, 05, 20][73 5C, 05, 05]
-0EC1 0EDC; [73 3A, 05, 20][73 22, 05, 20][73 5E, 05, 05]
-0EC2 0EDC; [73 3A, 05, 20][73 22, 05, 20][73 60, 05, 05]
-0EC3 0EDC; [73 3A, 05, 20][73 22, 05, 20][73 62, 05, 05]
-0EC4 0EDC; [73 3A, 05, 20][73 22, 05, 20][73 64, 05, 05]
-0EDD; [73 3A, 05, 20][73 30, 05, 20]
-0EC0 0EDD; [73 3A, 05, 20][73 30, 05, 20][73 5C, 05, 05]
-0EC1 0EDD; [73 3A, 05, 20][73 30, 05, 20][73 5E, 05, 05]
-0EC2 0EDD; [73 3A, 05, 20][73 30, 05, 20][73 60, 05, 05]
-0EC3 0EDD; [73 3A, 05, 20][73 30, 05, 20][73 62, 05, 05]
-0EC4 0EDD; [73 3A, 05, 20][73 30, 05, 20][73 64, 05, 05]
-0EC0 0EAB; [73 3A, 05, 05][73 5C, 05, 05]
-0EC1 0EAB; [73 3A, 05, 05][73 5E, 05, 05]
-0EC2 0EAB; [73 3A, 05, 05][73 60, 05, 05]
-0EC3 0EAB; [73 3A, 05, 05][73 62, 05, 05]
-0EC4 0EAB; [73 3A, 05, 05][73 64, 05, 05]
-
-0EAD; [73 3C, 05, 05]
-0EC0 0EAD; [73 3C, 05, 05][73 5C, 05, 05]
-0EC1 0EAD; [73 3C, 05, 05][73 5E, 05, 05]
-0EC2 0EAD; [73 3C, 05, 05][73 60, 05, 05]
-0EC3 0EAD; [73 3C, 05, 05][73 62, 05, 05]
-0EC4 0EAD; [73 3C, 05, 05][73 64, 05, 05]
-
-0EAE; [73 3E, 05, 05]
-0EC0 0EAE; [73 3E, 05, 05][73 5C, 05, 05]
-0EC1 0EAE; [73 3E, 05, 05][73 5E, 05, 05]
-0EC2 0EAE; [73 3E, 05, 05][73 60, 05, 05]
-0EC3 0EAE; [73 3E, 05, 05][73 62, 05, 05]
-0EC4 0EAE; [73 3E, 05, 05][73 64, 05, 05]
-
-0EAF; [73 40, 05, 05]
-
-0EB0; [73 42, 05, 05]
-
-0EB1; [73 44, 05, 05]
-
-0EB2; [73 46, 05, 05]
-
-0EB3; [73 48, 05, 05]
-0ECD 0EB2; [73 48, 05, 05]
-
-0EB4; [73 4A, 05, 05]
-
-0EB5; [73 4C, 05, 05]
-
-0EB6; [73 4E, 05, 05]
-
-0EB7; [73 50, 05, 05]
-
-0EB8; [73 52, 05, 05]
-
-0EB9; [73 54, 05, 05]
-
-0EBB; [73 56, 05, 05]
-
-0EBC; [73 58, 05, 05]
-
-0EBD; [73 5A, 05, 05]
-
-0EC0; [73 5C, 05, 05]
-
-0EC1; [73 5E, 05, 05]
-
-0EC2; [73 60, 05, 05]
-
-0EC3; [73 62, 05, 05]
-
-0EC4; [73 64, 05, 05]
-
-FDD1 AA80; [73 66 02, 05, 05] # Tai Viet first primary (compressible)
-
-AA80; [73 66 09, 05, 05]
-AAB5 AA80; [73 66 09, 05, 05][73 67 7E, 05, 05]
-AAB6 AA80; [73 66 09, 05, 05][73 67 85, 05, 05]
-AAB9 AA80; [73 66 09, 05, 05][73 67 9A, 05, 05]
-AABB AA80; [73 66 09, 05, 05][73 67 A8, 05, 05]
-AABC AA80; [73 66 09, 05, 05][73 67 AF, 05, 05]
-
-AA81; [73 66 10, 05, 05]
-AAB5 AA81; [73 66 10, 05, 05][73 67 7E, 05, 05]
-AAB6 AA81; [73 66 10, 05, 05][73 67 85, 05, 05]
-AAB9 AA81; [73 66 10, 05, 05][73 67 9A, 05, 05]
-AABB AA81; [73 66 10, 05, 05][73 67 A8, 05, 05]
-AABC AA81; [73 66 10, 05, 05][73 67 AF, 05, 05]
-
-AA82; [73 66 17, 05, 05]
-AAB5 AA82; [73 66 17, 05, 05][73 67 7E, 05, 05]
-AAB6 AA82; [73 66 17, 05, 05][73 67 85, 05, 05]
-AAB9 AA82; [73 66 17, 05, 05][73 67 9A, 05, 05]
-AABB AA82; [73 66 17, 05, 05][73 67 A8, 05, 05]
-AABC AA82; [73 66 17, 05, 05][73 67 AF, 05, 05]
-
-AA83; [73 66 1E, 05, 05]
-AAB5 AA83; [73 66 1E, 05, 05][73 67 7E, 05, 05]
-AAB6 AA83; [73 66 1E, 05, 05][73 67 85, 05, 05]
-AAB9 AA83; [73 66 1E, 05, 05][73 67 9A, 05, 05]
-AABB AA83; [73 66 1E, 05, 05][73 67 A8, 05, 05]
-AABC AA83; [73 66 1E, 05, 05][73 67 AF, 05, 05]
-
-AA84; [73 66 25, 05, 05]
-AAB5 AA84; [73 66 25, 05, 05][73 67 7E, 05, 05]
-AAB6 AA84; [73 66 25, 05, 05][73 67 85, 05, 05]
-AAB9 AA84; [73 66 25, 05, 05][73 67 9A, 05, 05]
-AABB AA84; [73 66 25, 05, 05][73 67 A8, 05, 05]
-AABC AA84; [73 66 25, 05, 05][73 67 AF, 05, 05]
-
-AA85; [73 66 2C, 05, 05]
-AAB5 AA85; [73 66 2C, 05, 05][73 67 7E, 05, 05]
-AAB6 AA85; [73 66 2C, 05, 05][73 67 85, 05, 05]
-AAB9 AA85; [73 66 2C, 05, 05][73 67 9A, 05, 05]
-AABB AA85; [73 66 2C, 05, 05][73 67 A8, 05, 05]
-AABC AA85; [73 66 2C, 05, 05][73 67 AF, 05, 05]
-
-AA86; [73 66 33, 05, 05]
-AAB5 AA86; [73 66 33, 05, 05][73 67 7E, 05, 05]
-AAB6 AA86; [73 66 33, 05, 05][73 67 85, 05, 05]
-AAB9 AA86; [73 66 33, 05, 05][73 67 9A, 05, 05]
-AABB AA86; [73 66 33, 05, 05][73 67 A8, 05, 05]
-AABC AA86; [73 66 33, 05, 05][73 67 AF, 05, 05]
-
-AA87; [73 66 3A, 05, 05]
-AAB5 AA87; [73 66 3A, 05, 05][73 67 7E, 05, 05]
-AAB6 AA87; [73 66 3A, 05, 05][73 67 85, 05, 05]
-AAB9 AA87; [73 66 3A, 05, 05][73 67 9A, 05, 05]
-AABB AA87; [73 66 3A, 05, 05][73 67 A8, 05, 05]
-AABC AA87; [73 66 3A, 05, 05][73 67 AF, 05, 05]
-
-AA88; [73 66 41, 05, 05]
-AAB5 AA88; [73 66 41, 05, 05][73 67 7E, 05, 05]
-AAB6 AA88; [73 66 41, 05, 05][73 67 85, 05, 05]
-AAB9 AA88; [73 66 41, 05, 05][73 67 9A, 05, 05]
-AABB AA88; [73 66 41, 05, 05][73 67 A8, 05, 05]
-AABC AA88; [73 66 41, 05, 05][73 67 AF, 05, 05]
-
-AA89; [73 66 48, 05, 05]
-AAB5 AA89; [73 66 48, 05, 05][73 67 7E, 05, 05]
-AAB6 AA89; [73 66 48, 05, 05][73 67 85, 05, 05]
-AAB9 AA89; [73 66 48, 05, 05][73 67 9A, 05, 05]
-AABB AA89; [73 66 48, 05, 05][73 67 A8, 05, 05]
-AABC AA89; [73 66 48, 05, 05][73 67 AF, 05, 05]
-
-AA8A; [73 66 4F, 05, 05]
-AAB5 AA8A; [73 66 4F, 05, 05][73 67 7E, 05, 05]
-AAB6 AA8A; [73 66 4F, 05, 05][73 67 85, 05, 05]
-AAB9 AA8A; [73 66 4F, 05, 05][73 67 9A, 05, 05]
-AABB AA8A; [73 66 4F, 05, 05][73 67 A8, 05, 05]
-AABC AA8A; [73 66 4F, 05, 05][73 67 AF, 05, 05]
-
-AA8B; [73 66 56, 05, 05]
-AAB5 AA8B; [73 66 56, 05, 05][73 67 7E, 05, 05]
-AAB6 AA8B; [73 66 56, 05, 05][73 67 85, 05, 05]
-AAB9 AA8B; [73 66 56, 05, 05][73 67 9A, 05, 05]
-AABB AA8B; [73 66 56, 05, 05][73 67 A8, 05, 05]
-AABC AA8B; [73 66 56, 05, 05][73 67 AF, 05, 05]
-
-AA8C; [73 66 5D, 05, 05]
-AAB5 AA8C; [73 66 5D, 05, 05][73 67 7E, 05, 05]
-AAB6 AA8C; [73 66 5D, 05, 05][73 67 85, 05, 05]
-AAB9 AA8C; [73 66 5D, 05, 05][73 67 9A, 05, 05]
-AABB AA8C; [73 66 5D, 05, 05][73 67 A8, 05, 05]
-AABC AA8C; [73 66 5D, 05, 05][73 67 AF, 05, 05]
-
-AA8D; [73 66 64, 05, 05]
-AAB5 AA8D; [73 66 64, 05, 05][73 67 7E, 05, 05]
-AAB6 AA8D; [73 66 64, 05, 05][73 67 85, 05, 05]
-AAB9 AA8D; [73 66 64, 05, 05][73 67 9A, 05, 05]
-AABB AA8D; [73 66 64, 05, 05][73 67 A8, 05, 05]
-AABC AA8D; [73 66 64, 05, 05][73 67 AF, 05, 05]
-
-AA8E; [73 66 6B, 05, 05]
-AAB5 AA8E; [73 66 6B, 05, 05][73 67 7E, 05, 05]
-AAB6 AA8E; [73 66 6B, 05, 05][73 67 85, 05, 05]
-AAB9 AA8E; [73 66 6B, 05, 05][73 67 9A, 05, 05]
-AABB AA8E; [73 66 6B, 05, 05][73 67 A8, 05, 05]
-AABC AA8E; [73 66 6B, 05, 05][73 67 AF, 05, 05]
-
-AA8F; [73 66 72, 05, 05]
-AAB5 AA8F; [73 66 72, 05, 05][73 67 7E, 05, 05]
-AAB6 AA8F; [73 66 72, 05, 05][73 67 85, 05, 05]
-AAB9 AA8F; [73 66 72, 05, 05][73 67 9A, 05, 05]
-AABB AA8F; [73 66 72, 05, 05][73 67 A8, 05, 05]
-AABC AA8F; [73 66 72, 05, 05][73 67 AF, 05, 05]
-
-AA90; [73 66 79, 05, 05]
-AAB5 AA90; [73 66 79, 05, 05][73 67 7E, 05, 05]
-AAB6 AA90; [73 66 79, 05, 05][73 67 85, 05, 05]
-AAB9 AA90; [73 66 79, 05, 05][73 67 9A, 05, 05]
-AABB AA90; [73 66 79, 05, 05][73 67 A8, 05, 05]
-AABC AA90; [73 66 79, 05, 05][73 67 AF, 05, 05]
-
-AA91; [73 66 80, 05, 05]
-AAB5 AA91; [73 66 80, 05, 05][73 67 7E, 05, 05]
-AAB6 AA91; [73 66 80, 05, 05][73 67 85, 05, 05]
-AAB9 AA91; [73 66 80, 05, 05][73 67 9A, 05, 05]
-AABB AA91; [73 66 80, 05, 05][73 67 A8, 05, 05]
-AABC AA91; [73 66 80, 05, 05][73 67 AF, 05, 05]
-
-AA92; [73 66 87, 05, 05]
-AAB5 AA92; [73 66 87, 05, 05][73 67 7E, 05, 05]
-AAB6 AA92; [73 66 87, 05, 05][73 67 85, 05, 05]
-AAB9 AA92; [73 66 87, 05, 05][73 67 9A, 05, 05]
-AABB AA92; [73 66 87, 05, 05][73 67 A8, 05, 05]
-AABC AA92; [73 66 87, 05, 05][73 67 AF, 05, 05]
-
-AA93; [73 66 8E, 05, 05]
-AAB5 AA93; [73 66 8E, 05, 05][73 67 7E, 05, 05]
-AAB6 AA93; [73 66 8E, 05, 05][73 67 85, 05, 05]
-AAB9 AA93; [73 66 8E, 05, 05][73 67 9A, 05, 05]
-AABB AA93; [73 66 8E, 05, 05][73 67 A8, 05, 05]
-AABC AA93; [73 66 8E, 05, 05][73 67 AF, 05, 05]
-
-AA94; [73 66 95, 05, 05]
-AAB5 AA94; [73 66 95, 05, 05][73 67 7E, 05, 05]
-AAB6 AA94; [73 66 95, 05, 05][73 67 85, 05, 05]
-AAB9 AA94; [73 66 95, 05, 05][73 67 9A, 05, 05]
-AABB AA94; [73 66 95, 05, 05][73 67 A8, 05, 05]
-AABC AA94; [73 66 95, 05, 05][73 67 AF, 05, 05]
-
-AA95; [73 66 9C, 05, 05]
-AAB5 AA95; [73 66 9C, 05, 05][73 67 7E, 05, 05]
-AAB6 AA95; [73 66 9C, 05, 05][73 67 85, 05, 05]
-AAB9 AA95; [73 66 9C, 05, 05][73 67 9A, 05, 05]
-AABB AA95; [73 66 9C, 05, 05][73 67 A8, 05, 05]
-AABC AA95; [73 66 9C, 05, 05][73 67 AF, 05, 05]
-
-AA96; [73 66 A3, 05, 05]
-AAB5 AA96; [73 66 A3, 05, 05][73 67 7E, 05, 05]
-AAB6 AA96; [73 66 A3, 05, 05][73 67 85, 05, 05]
-AAB9 AA96; [73 66 A3, 05, 05][73 67 9A, 05, 05]
-AABB AA96; [73 66 A3, 05, 05][73 67 A8, 05, 05]
-AABC AA96; [73 66 A3, 05, 05][73 67 AF, 05, 05]
-
-AA97; [73 66 AA, 05, 05]
-AAB5 AA97; [73 66 AA, 05, 05][73 67 7E, 05, 05]
-AAB6 AA97; [73 66 AA, 05, 05][73 67 85, 05, 05]
-AAB9 AA97; [73 66 AA, 05, 05][73 67 9A, 05, 05]
-AABB AA97; [73 66 AA, 05, 05][73 67 A8, 05, 05]
-AABC AA97; [73 66 AA, 05, 05][73 67 AF, 05, 05]
-
-AA98; [73 66 B1, 05, 05]
-AAB5 AA98; [73 66 B1, 05, 05][73 67 7E, 05, 05]
-AAB6 AA98; [73 66 B1, 05, 05][73 67 85, 05, 05]
-AAB9 AA98; [73 66 B1, 05, 05][73 67 9A, 05, 05]
-AABB AA98; [73 66 B1, 05, 05][73 67 A8, 05, 05]
-AABC AA98; [73 66 B1, 05, 05][73 67 AF, 05, 05]
-
-AA99; [73 66 B8, 05, 05]
-AAB5 AA99; [73 66 B8, 05, 05][73 67 7E, 05, 05]
-AAB6 AA99; [73 66 B8, 05, 05][73 67 85, 05, 05]
-AAB9 AA99; [73 66 B8, 05, 05][73 67 9A, 05, 05]
-AABB AA99; [73 66 B8, 05, 05][73 67 A8, 05, 05]
-AABC AA99; [73 66 B8, 05, 05][73 67 AF, 05, 05]
-
-AA9A; [73 66 BF, 05, 05]
-AAB5 AA9A; [73 66 BF, 05, 05][73 67 7E, 05, 05]
-AAB6 AA9A; [73 66 BF, 05, 05][73 67 85, 05, 05]
-AAB9 AA9A; [73 66 BF, 05, 05][73 67 9A, 05, 05]
-AABB AA9A; [73 66 BF, 05, 05][73 67 A8, 05, 05]
-AABC AA9A; [73 66 BF, 05, 05][73 67 AF, 05, 05]
-
-AA9B; [73 66 C6, 05, 05]
-AAB5 AA9B; [73 66 C6, 05, 05][73 67 7E, 05, 05]
-AAB6 AA9B; [73 66 C6, 05, 05][73 67 85, 05, 05]
-AAB9 AA9B; [73 66 C6, 05, 05][73 67 9A, 05, 05]
-AABB AA9B; [73 66 C6, 05, 05][73 67 A8, 05, 05]
-AABC AA9B; [73 66 C6, 05, 05][73 67 AF, 05, 05]
-
-AA9C; [73 66 CD, 05, 05]
-AAB5 AA9C; [73 66 CD, 05, 05][73 67 7E, 05, 05]
-AAB6 AA9C; [73 66 CD, 05, 05][73 67 85, 05, 05]
-AAB9 AA9C; [73 66 CD, 05, 05][73 67 9A, 05, 05]
-AABB AA9C; [73 66 CD, 05, 05][73 67 A8, 05, 05]
-AABC AA9C; [73 66 CD, 05, 05][73 67 AF, 05, 05]
-
-AA9D; [73 66 D4, 05, 05]
-AAB5 AA9D; [73 66 D4, 05, 05][73 67 7E, 05, 05]
-AAB6 AA9D; [73 66 D4, 05, 05][73 67 85, 05, 05]
-AAB9 AA9D; [73 66 D4, 05, 05][73 67 9A, 05, 05]
-AABB AA9D; [73 66 D4, 05, 05][73 67 A8, 05, 05]
-AABC AA9D; [73 66 D4, 05, 05][73 67 AF, 05, 05]
-
-AA9E; [73 66 DB, 05, 05]
-AAB5 AA9E; [73 66 DB, 05, 05][73 67 7E, 05, 05]
-AAB6 AA9E; [73 66 DB, 05, 05][73 67 85, 05, 05]
-AAB9 AA9E; [73 66 DB, 05, 05][73 67 9A, 05, 05]
-AABB AA9E; [73 66 DB, 05, 05][73 67 A8, 05, 05]
-AABC AA9E; [73 66 DB, 05, 05][73 67 AF, 05, 05]
-
-AA9F; [73 66 E2, 05, 05]
-AAB5 AA9F; [73 66 E2, 05, 05][73 67 7E, 05, 05]
-AAB6 AA9F; [73 66 E2, 05, 05][73 67 85, 05, 05]
-AAB9 AA9F; [73 66 E2, 05, 05][73 67 9A, 05, 05]
-AABB AA9F; [73 66 E2, 05, 05][73 67 A8, 05, 05]
-AABC AA9F; [73 66 E2, 05, 05][73 67 AF, 05, 05]
-
-AAA0; [73 66 E9, 05, 05]
-AAB5 AAA0; [73 66 E9, 05, 05][73 67 7E, 05, 05]
-AAB6 AAA0; [73 66 E9, 05, 05][73 67 85, 05, 05]
-AAB9 AAA0; [73 66 E9, 05, 05][73 67 9A, 05, 05]
-AABB AAA0; [73 66 E9, 05, 05][73 67 A8, 05, 05]
-AABC AAA0; [73 66 E9, 05, 05][73 67 AF, 05, 05]
-
-AAA1; [73 66 F0, 05, 05]
-AAB5 AAA1; [73 66 F0, 05, 05][73 67 7E, 05, 05]
-AAB6 AAA1; [73 66 F0, 05, 05][73 67 85, 05, 05]
-AAB9 AAA1; [73 66 F0, 05, 05][73 67 9A, 05, 05]
-AABB AAA1; [73 66 F0, 05, 05][73 67 A8, 05, 05]
-AABC AAA1; [73 66 F0, 05, 05][73 67 AF, 05, 05]
-
-AAA2; [73 66 F7, 05, 05]
-AAB5 AAA2; [73 66 F7, 05, 05][73 67 7E, 05, 05]
-AAB6 AAA2; [73 66 F7, 05, 05][73 67 85, 05, 05]
-AAB9 AAA2; [73 66 F7, 05, 05][73 67 9A, 05, 05]
-AABB AAA2; [73 66 F7, 05, 05][73 67 A8, 05, 05]
-AABC AAA2; [73 66 F7, 05, 05][73 67 AF, 05, 05]
-
-AAA3; [73 66 FE, 05, 05]
-AAB5 AAA3; [73 66 FE, 05, 05][73 67 7E, 05, 05]
-AAB6 AAA3; [73 66 FE, 05, 05][73 67 85, 05, 05]
-AAB9 AAA3; [73 66 FE, 05, 05][73 67 9A, 05, 05]
-AABB AAA3; [73 66 FE, 05, 05][73 67 A8, 05, 05]
-AABC AAA3; [73 66 FE, 05, 05][73 67 AF, 05, 05]
-
-AAA4; [73 67 07, 05, 05]
-AAB5 AAA4; [73 67 07, 05, 05][73 67 7E, 05, 05]
-AAB6 AAA4; [73 67 07, 05, 05][73 67 85, 05, 05]
-AAB9 AAA4; [73 67 07, 05, 05][73 67 9A, 05, 05]
-AABB AAA4; [73 67 07, 05, 05][73 67 A8, 05, 05]
-AABC AAA4; [73 67 07, 05, 05][73 67 AF, 05, 05]
-
-AAA5; [73 67 0E, 05, 05]
-AAB5 AAA5; [73 67 0E, 05, 05][73 67 7E, 05, 05]
-AAB6 AAA5; [73 67 0E, 05, 05][73 67 85, 05, 05]
-AAB9 AAA5; [73 67 0E, 05, 05][73 67 9A, 05, 05]
-AABB AAA5; [73 67 0E, 05, 05][73 67 A8, 05, 05]
-AABC AAA5; [73 67 0E, 05, 05][73 67 AF, 05, 05]
-
-AAA6; [73 67 15, 05, 05]
-AAB5 AAA6; [73 67 15, 05, 05][73 67 7E, 05, 05]
-AAB6 AAA6; [73 67 15, 05, 05][73 67 85, 05, 05]
-AAB9 AAA6; [73 67 15, 05, 05][73 67 9A, 05, 05]
-AABB AAA6; [73 67 15, 05, 05][73 67 A8, 05, 05]
-AABC AAA6; [73 67 15, 05, 05][73 67 AF, 05, 05]
-
-AAA7; [73 67 1C, 05, 05]
-AAB5 AAA7; [73 67 1C, 05, 05][73 67 7E, 05, 05]
-AAB6 AAA7; [73 67 1C, 05, 05][73 67 85, 05, 05]
-AAB9 AAA7; [73 67 1C, 05, 05][73 67 9A, 05, 05]
-AABB AAA7; [73 67 1C, 05, 05][73 67 A8, 05, 05]
-AABC AAA7; [73 67 1C, 05, 05][73 67 AF, 05, 05]
-
-AAA8; [73 67 23, 05, 05]
-AAB5 AAA8; [73 67 23, 05, 05][73 67 7E, 05, 05]
-AAB6 AAA8; [73 67 23, 05, 05][73 67 85, 05, 05]
-AAB9 AAA8; [73 67 23, 05, 05][73 67 9A, 05, 05]
-AABB AAA8; [73 67 23, 05, 05][73 67 A8, 05, 05]
-AABC AAA8; [73 67 23, 05, 05][73 67 AF, 05, 05]
-
-AAA9; [73 67 2A, 05, 05]
-AAB5 AAA9; [73 67 2A, 05, 05][73 67 7E, 05, 05]
-AAB6 AAA9; [73 67 2A, 05, 05][73 67 85, 05, 05]
-AAB9 AAA9; [73 67 2A, 05, 05][73 67 9A, 05, 05]
-AABB AAA9; [73 67 2A, 05, 05][73 67 A8, 05, 05]
-AABC AAA9; [73 67 2A, 05, 05][73 67 AF, 05, 05]
-
-AAAA; [73 67 31, 05, 05]
-AAB5 AAAA; [73 67 31, 05, 05][73 67 7E, 05, 05]
-AAB6 AAAA; [73 67 31, 05, 05][73 67 85, 05, 05]
-AAB9 AAAA; [73 67 31, 05, 05][73 67 9A, 05, 05]
-AABB AAAA; [73 67 31, 05, 05][73 67 A8, 05, 05]
-AABC AAAA; [73 67 31, 05, 05][73 67 AF, 05, 05]
-
-AAAB; [73 67 38, 05, 05]
-AAB5 AAAB; [73 67 38, 05, 05][73 67 7E, 05, 05]
-AAB6 AAAB; [73 67 38, 05, 05][73 67 85, 05, 05]
-AAB9 AAAB; [73 67 38, 05, 05][73 67 9A, 05, 05]
-AABB AAAB; [73 67 38, 05, 05][73 67 A8, 05, 05]
-AABC AAAB; [73 67 38, 05, 05][73 67 AF, 05, 05]
-
-AAAC; [73 67 3F, 05, 05]
-AAB5 AAAC; [73 67 3F, 05, 05][73 67 7E, 05, 05]
-AAB6 AAAC; [73 67 3F, 05, 05][73 67 85, 05, 05]
-AAB9 AAAC; [73 67 3F, 05, 05][73 67 9A, 05, 05]
-AABB AAAC; [73 67 3F, 05, 05][73 67 A8, 05, 05]
-AABC AAAC; [73 67 3F, 05, 05][73 67 AF, 05, 05]
-
-AAAD; [73 67 46, 05, 05]
-AAB5 AAAD; [73 67 46, 05, 05][73 67 7E, 05, 05]
-AAB6 AAAD; [73 67 46, 05, 05][73 67 85, 05, 05]
-AAB9 AAAD; [73 67 46, 05, 05][73 67 9A, 05, 05]
-AABB AAAD; [73 67 46, 05, 05][73 67 A8, 05, 05]
-AABC AAAD; [73 67 46, 05, 05][73 67 AF, 05, 05]
-
-AAAE; [73 67 4D, 05, 05]
-AAB5 AAAE; [73 67 4D, 05, 05][73 67 7E, 05, 05]
-AAB6 AAAE; [73 67 4D, 05, 05][73 67 85, 05, 05]
-AAB9 AAAE; [73 67 4D, 05, 05][73 67 9A, 05, 05]
-AABB AAAE; [73 67 4D, 05, 05][73 67 A8, 05, 05]
-AABC AAAE; [73 67 4D, 05, 05][73 67 AF, 05, 05]
-
-AAAF; [73 67 54, 05, 05]
-AAB5 AAAF; [73 67 54, 05, 05][73 67 7E, 05, 05]
-AAB6 AAAF; [73 67 54, 05, 05][73 67 85, 05, 05]
-AAB9 AAAF; [73 67 54, 05, 05][73 67 9A, 05, 05]
-AABB AAAF; [73 67 54, 05, 05][73 67 A8, 05, 05]
-AABC AAAF; [73 67 54, 05, 05][73 67 AF, 05, 05]
+0EC0 0E84; [73 0C, 05, 05][73 7A, 05, 05]
+0EC1 0E84; [73 0C, 05, 05][73 7C, 05, 05]
+0EC2 0E84; [73 0C, 05, 05][73 7E, 05, 05]
+0EC3 0E84; [73 0C, 05, 05][73 80, 05, 05]
+0EC4 0E84; [73 0C, 05, 05][73 82, 05, 05]
+
+0E86; [73 0E, 05, 05]
+0EC0 0E86; [73 0E, 05, 05][73 7A, 05, 05]
+0EC1 0E86; [73 0E, 05, 05][73 7C, 05, 05]
+0EC2 0E86; [73 0E, 05, 05][73 7E, 05, 05]
+0EC3 0E86; [73 0E, 05, 05][73 80, 05, 05]
+0EC4 0E86; [73 0E, 05, 05][73 82, 05, 05]
+
+0E87; [73 10, 05, 05]
+0EC0 0E87; [73 10, 05, 05][73 7A, 05, 05]
+0EC1 0E87; [73 10, 05, 05][73 7C, 05, 05]
+0EC2 0E87; [73 10, 05, 05][73 7E, 05, 05]
+0EC3 0E87; [73 10, 05, 05][73 80, 05, 05]
+0EC4 0E87; [73 10, 05, 05][73 82, 05, 05]
+
+0E88; [73 12, 05, 05]
+0EC0 0E88; [73 12, 05, 05][73 7A, 05, 05]
+0EC1 0E88; [73 12, 05, 05][73 7C, 05, 05]
+0EC2 0E88; [73 12, 05, 05][73 7E, 05, 05]
+0EC3 0E88; [73 12, 05, 05][73 80, 05, 05]
+0EC4 0E88; [73 12, 05, 05][73 82, 05, 05]
+
+0E89; [73 14, 05, 05]
+0EC0 0E89; [73 14, 05, 05][73 7A, 05, 05]
+0EC1 0E89; [73 14, 05, 05][73 7C, 05, 05]
+0EC2 0E89; [73 14, 05, 05][73 7E, 05, 05]
+0EC3 0E89; [73 14, 05, 05][73 80, 05, 05]
+0EC4 0E89; [73 14, 05, 05][73 82, 05, 05]
+
+0EAA; [73 16, 05, 05]
+0EC0 0EAA; [73 16, 05, 05][73 7A, 05, 05]
+0EC1 0EAA; [73 16, 05, 05][73 7C, 05, 05]
+0EC2 0EAA; [73 16, 05, 05][73 7E, 05, 05]
+0EC3 0EAA; [73 16, 05, 05][73 80, 05, 05]
+0EC4 0EAA; [73 16, 05, 05][73 82, 05, 05]
+
+0E8A; [73 18, 05, 05]
+0EC0 0E8A; [73 18, 05, 05][73 7A, 05, 05]
+0EC1 0E8A; [73 18, 05, 05][73 7C, 05, 05]
+0EC2 0E8A; [73 18, 05, 05][73 7E, 05, 05]
+0EC3 0E8A; [73 18, 05, 05][73 80, 05, 05]
+0EC4 0E8A; [73 18, 05, 05][73 82, 05, 05]
+
+0E8C; [73 1A, 05, 05]
+0EC0 0E8C; [73 1A, 05, 05][73 7A, 05, 05]
+0EC1 0E8C; [73 1A, 05, 05][73 7C, 05, 05]
+0EC2 0E8C; [73 1A, 05, 05][73 7E, 05, 05]
+0EC3 0E8C; [73 1A, 05, 05][73 80, 05, 05]
+0EC4 0E8C; [73 1A, 05, 05][73 82, 05, 05]
+
+0E8E; [73 1C, 05, 05]
+0EC0 0E8E; [73 1C, 05, 05][73 7A, 05, 05]
+0EC1 0E8E; [73 1C, 05, 05][73 7C, 05, 05]
+0EC2 0E8E; [73 1C, 05, 05][73 7E, 05, 05]
+0EC3 0E8E; [73 1C, 05, 05][73 80, 05, 05]
+0EC4 0E8E; [73 1C, 05, 05][73 82, 05, 05]
+
+0EDF; [73 1E, 05, 05]
+0EC0 0EDF; [73 1E, 05, 05][73 7A, 05, 05]
+0EC1 0EDF; [73 1E, 05, 05][73 7C, 05, 05]
+0EC2 0EDF; [73 1E, 05, 05][73 7E, 05, 05]
+0EC3 0EDF; [73 1E, 05, 05][73 80, 05, 05]
+0EC4 0EDF; [73 1E, 05, 05][73 82, 05, 05]
+
+0E8D; [73 20, 05, 05]
+0EC0 0E8D; [73 20, 05, 05][73 7A, 05, 05]
+0EC1 0E8D; [73 20, 05, 05][73 7C, 05, 05]
+0EC2 0E8D; [73 20, 05, 05][73 7E, 05, 05]
+0EC3 0E8D; [73 20, 05, 05][73 80, 05, 05]
+0EC4 0E8D; [73 20, 05, 05][73 82, 05, 05]
+
+0E8F; [73 22, 05, 05]
+0EC0 0E8F; [73 22, 05, 05][73 7A, 05, 05]
+0EC1 0E8F; [73 22, 05, 05][73 7C, 05, 05]
+0EC2 0E8F; [73 22, 05, 05][73 7E, 05, 05]
+0EC3 0E8F; [73 22, 05, 05][73 80, 05, 05]
+0EC4 0E8F; [73 22, 05, 05][73 82, 05, 05]
+
+0E90; [73 24, 05, 05]
+0EC0 0E90; [73 24, 05, 05][73 7A, 05, 05]
+0EC1 0E90; [73 24, 05, 05][73 7C, 05, 05]
+0EC2 0E90; [73 24, 05, 05][73 7E, 05, 05]
+0EC3 0E90; [73 24, 05, 05][73 80, 05, 05]
+0EC4 0E90; [73 24, 05, 05][73 82, 05, 05]
+
+0E91; [73 26, 05, 05]
+0EC0 0E91; [73 26, 05, 05][73 7A, 05, 05]
+0EC1 0E91; [73 26, 05, 05][73 7C, 05, 05]
+0EC2 0E91; [73 26, 05, 05][73 7E, 05, 05]
+0EC3 0E91; [73 26, 05, 05][73 80, 05, 05]
+0EC4 0E91; [73 26, 05, 05][73 82, 05, 05]
+
+0E92; [73 28, 05, 05]
+0EC0 0E92; [73 28, 05, 05][73 7A, 05, 05]
+0EC1 0E92; [73 28, 05, 05][73 7C, 05, 05]
+0EC2 0E92; [73 28, 05, 05][73 7E, 05, 05]
+0EC3 0E92; [73 28, 05, 05][73 80, 05, 05]
+0EC4 0E92; [73 28, 05, 05][73 82, 05, 05]
+
+0E93; [73 2A, 05, 05]
+0EC0 0E93; [73 2A, 05, 05][73 7A, 05, 05]
+0EC1 0E93; [73 2A, 05, 05][73 7C, 05, 05]
+0EC2 0E93; [73 2A, 05, 05][73 7E, 05, 05]
+0EC3 0E93; [73 2A, 05, 05][73 80, 05, 05]
+0EC4 0E93; [73 2A, 05, 05][73 82, 05, 05]
+
+0E94; [73 2C, 05, 05]
+0EC0 0E94; [73 2C, 05, 05][73 7A, 05, 05]
+0EC1 0E94; [73 2C, 05, 05][73 7C, 05, 05]
+0EC2 0E94; [73 2C, 05, 05][73 7E, 05, 05]
+0EC3 0E94; [73 2C, 05, 05][73 80, 05, 05]
+0EC4 0E94; [73 2C, 05, 05][73 82, 05, 05]
+
+0E95; [73 2E, 05, 05]
+0EC0 0E95; [73 2E, 05, 05][73 7A, 05, 05]
+0EC1 0E95; [73 2E, 05, 05][73 7C, 05, 05]
+0EC2 0E95; [73 2E, 05, 05][73 7E, 05, 05]
+0EC3 0E95; [73 2E, 05, 05][73 80, 05, 05]
+0EC4 0E95; [73 2E, 05, 05][73 82, 05, 05]
+
+0E96; [73 30, 05, 05]
+0EC0 0E96; [73 30, 05, 05][73 7A, 05, 05]
+0EC1 0E96; [73 30, 05, 05][73 7C, 05, 05]
+0EC2 0E96; [73 30, 05, 05][73 7E, 05, 05]
+0EC3 0E96; [73 30, 05, 05][73 80, 05, 05]
+0EC4 0E96; [73 30, 05, 05][73 82, 05, 05]
+
+0E97; [73 32, 05, 05]
+0EC0 0E97; [73 32, 05, 05][73 7A, 05, 05]
+0EC1 0E97; [73 32, 05, 05][73 7C, 05, 05]
+0EC2 0E97; [73 32, 05, 05][73 7E, 05, 05]
+0EC3 0E97; [73 32, 05, 05][73 80, 05, 05]
+0EC4 0E97; [73 32, 05, 05][73 82, 05, 05]
+
+0E98; [73 34, 05, 05]
+0EC0 0E98; [73 34, 05, 05][73 7A, 05, 05]
+0EC1 0E98; [73 34, 05, 05][73 7C, 05, 05]
+0EC2 0E98; [73 34, 05, 05][73 7E, 05, 05]
+0EC3 0E98; [73 34, 05, 05][73 80, 05, 05]
+0EC4 0E98; [73 34, 05, 05][73 82, 05, 05]
+
+0E99; [73 36, 05, 05]
+0EC0 0E99; [73 36, 05, 05][73 7A, 05, 05]
+0EC1 0E99; [73 36, 05, 05][73 7C, 05, 05]
+0EC2 0E99; [73 36, 05, 05][73 7E, 05, 05]
+0EC3 0E99; [73 36, 05, 05][73 80, 05, 05]
+0EC4 0E99; [73 36, 05, 05][73 82, 05, 05]
+
+0E9A; [73 38, 05, 05]
+0EC0 0E9A; [73 38, 05, 05][73 7A, 05, 05]
+0EC1 0E9A; [73 38, 05, 05][73 7C, 05, 05]
+0EC2 0E9A; [73 38, 05, 05][73 7E, 05, 05]
+0EC3 0E9A; [73 38, 05, 05][73 80, 05, 05]
+0EC4 0E9A; [73 38, 05, 05][73 82, 05, 05]
+
+0E9B; [73 3A, 05, 05]
+0EC0 0E9B; [73 3A, 05, 05][73 7A, 05, 05]
+0EC1 0E9B; [73 3A, 05, 05][73 7C, 05, 05]
+0EC2 0E9B; [73 3A, 05, 05][73 7E, 05, 05]
+0EC3 0E9B; [73 3A, 05, 05][73 80, 05, 05]
+0EC4 0E9B; [73 3A, 05, 05][73 82, 05, 05]
+
+0E9C; [73 3C, 05, 05]
+0EC0 0E9C; [73 3C, 05, 05][73 7A, 05, 05]
+0EC1 0E9C; [73 3C, 05, 05][73 7C, 05, 05]
+0EC2 0E9C; [73 3C, 05, 05][73 7E, 05, 05]
+0EC3 0E9C; [73 3C, 05, 05][73 80, 05, 05]
+0EC4 0E9C; [73 3C, 05, 05][73 82, 05, 05]
+
+0E9D; [73 3E, 05, 05]
+0EC0 0E9D; [73 3E, 05, 05][73 7A, 05, 05]
+0EC1 0E9D; [73 3E, 05, 05][73 7C, 05, 05]
+0EC2 0E9D; [73 3E, 05, 05][73 7E, 05, 05]
+0EC3 0E9D; [73 3E, 05, 05][73 80, 05, 05]
+0EC4 0E9D; [73 3E, 05, 05][73 82, 05, 05]
+
+0E9E; [73 40, 05, 05]
+0EC0 0E9E; [73 40, 05, 05][73 7A, 05, 05]
+0EC1 0E9E; [73 40, 05, 05][73 7C, 05, 05]
+0EC2 0E9E; [73 40, 05, 05][73 7E, 05, 05]
+0EC3 0E9E; [73 40, 05, 05][73 80, 05, 05]
+0EC4 0E9E; [73 40, 05, 05][73 82, 05, 05]
+
+0E9F; [73 42, 05, 05]
+0EC0 0E9F; [73 42, 05, 05][73 7A, 05, 05]
+0EC1 0E9F; [73 42, 05, 05][73 7C, 05, 05]
+0EC2 0E9F; [73 42, 05, 05][73 7E, 05, 05]
+0EC3 0E9F; [73 42, 05, 05][73 80, 05, 05]
+0EC4 0E9F; [73 42, 05, 05][73 82, 05, 05]
+
+0EA0; [73 44, 05, 05]
+0EC0 0EA0; [73 44, 05, 05][73 7A, 05, 05]
+0EC1 0EA0; [73 44, 05, 05][73 7C, 05, 05]
+0EC2 0EA0; [73 44, 05, 05][73 7E, 05, 05]
+0EC3 0EA0; [73 44, 05, 05][73 80, 05, 05]
+0EC4 0EA0; [73 44, 05, 05][73 82, 05, 05]
+
+0EA1; [73 46, 05, 05]
+0EC0 0EA1; [73 46, 05, 05][73 7A, 05, 05]
+0EC1 0EA1; [73 46, 05, 05][73 7C, 05, 05]
+0EC2 0EA1; [73 46, 05, 05][73 7E, 05, 05]
+0EC3 0EA1; [73 46, 05, 05][73 80, 05, 05]
+0EC4 0EA1; [73 46, 05, 05][73 82, 05, 05]
+
+0EA2; [73 48, 05, 05]
+0EC0 0EA2; [73 48, 05, 05][73 7A, 05, 05]
+0EC1 0EA2; [73 48, 05, 05][73 7C, 05, 05]
+0EC2 0EA2; [73 48, 05, 05][73 7E, 05, 05]
+0EC3 0EA2; [73 48, 05, 05][73 80, 05, 05]
+0EC4 0EA2; [73 48, 05, 05][73 82, 05, 05]
+
+0EA3; [73 4A, 05, 05]
+0EC0 0EA3; [73 4A, 05, 05][73 7A, 05, 05]
+0EC1 0EA3; [73 4A, 05, 05][73 7C, 05, 05]
+0EC2 0EA3; [73 4A, 05, 05][73 7E, 05, 05]
+0EC3 0EA3; [73 4A, 05, 05][73 80, 05, 05]
+0EC4 0EA3; [73 4A, 05, 05][73 82, 05, 05]
+
+0EA5; [73 4C, 05, 05]
+0EC0 0EA5; [73 4C, 05, 05][73 7A, 05, 05]
+0EC1 0EA5; [73 4C, 05, 05][73 7C, 05, 05]
+0EC2 0EA5; [73 4C, 05, 05][73 7E, 05, 05]
+0EC3 0EA5; [73 4C, 05, 05][73 80, 05, 05]
+0EC4 0EA5; [73 4C, 05, 05][73 82, 05, 05]
+
+0EA7; [73 4E, 05, 05]
+0EC0 0EA7; [73 4E, 05, 05][73 7A, 05, 05]
+0EC1 0EA7; [73 4E, 05, 05][73 7C, 05, 05]
+0EC2 0EA7; [73 4E, 05, 05][73 7E, 05, 05]
+0EC3 0EA7; [73 4E, 05, 05][73 80, 05, 05]
+0EC4 0EA7; [73 4E, 05, 05][73 82, 05, 05]
+
+0EA8; [73 50, 05, 05]
+0EC0 0EA8; [73 50, 05, 05][73 7A, 05, 05]
+0EC1 0EA8; [73 50, 05, 05][73 7C, 05, 05]
+0EC2 0EA8; [73 50, 05, 05][73 7E, 05, 05]
+0EC3 0EA8; [73 50, 05, 05][73 80, 05, 05]
+0EC4 0EA8; [73 50, 05, 05][73 82, 05, 05]
+
+0EA9; [73 52, 05, 05]
+0EC0 0EA9; [73 52, 05, 05][73 7A, 05, 05]
+0EC1 0EA9; [73 52, 05, 05][73 7C, 05, 05]
+0EC2 0EA9; [73 52, 05, 05][73 7E, 05, 05]
+0EC3 0EA9; [73 52, 05, 05][73 80, 05, 05]
+0EC4 0EA9; [73 52, 05, 05][73 82, 05, 05]
+
+0EAB; [73 54, 05, 05]
+0EDC; [73 54, 05, 20][73 36, 05, 20]
+0EC0 0EDC; [73 54, 05, 20][73 36, 05, 20][73 7A, 05, 05]
+0EC1 0EDC; [73 54, 05, 20][73 36, 05, 20][73 7C, 05, 05]
+0EC2 0EDC; [73 54, 05, 20][73 36, 05, 20][73 7E, 05, 05]
+0EC3 0EDC; [73 54, 05, 20][73 36, 05, 20][73 80, 05, 05]
+0EC4 0EDC; [73 54, 05, 20][73 36, 05, 20][73 82, 05, 05]
+0EDD; [73 54, 05, 20][73 46, 05, 20]
+0EC0 0EDD; [73 54, 05, 20][73 46, 05, 20][73 7A, 05, 05]
+0EC1 0EDD; [73 54, 05, 20][73 46, 05, 20][73 7C, 05, 05]
+0EC2 0EDD; [73 54, 05, 20][73 46, 05, 20][73 7E, 05, 05]
+0EC3 0EDD; [73 54, 05, 20][73 46, 05, 20][73 80, 05, 05]
+0EC4 0EDD; [73 54, 05, 20][73 46, 05, 20][73 82, 05, 05]
+0EC0 0EAB; [73 54, 05, 05][73 7A, 05, 05]
+0EC1 0EAB; [73 54, 05, 05][73 7C, 05, 05]
+0EC2 0EAB; [73 54, 05, 05][73 7E, 05, 05]
+0EC3 0EAB; [73 54, 05, 05][73 80, 05, 05]
+0EC4 0EAB; [73 54, 05, 05][73 82, 05, 05]
+
+0EAC; [73 56, 05, 05]
+0EC0 0EAC; [73 56, 05, 05][73 7A, 05, 05]
+0EC1 0EAC; [73 56, 05, 05][73 7C, 05, 05]
+0EC2 0EAC; [73 56, 05, 05][73 7E, 05, 05]
+0EC3 0EAC; [73 56, 05, 05][73 80, 05, 05]
+0EC4 0EAC; [73 56, 05, 05][73 82, 05, 05]
+
+0EAD; [73 58, 05, 05]
+0EC0 0EAD; [73 58, 05, 05][73 7A, 05, 05]
+0EC1 0EAD; [73 58, 05, 05][73 7C, 05, 05]
+0EC2 0EAD; [73 58, 05, 05][73 7E, 05, 05]
+0EC3 0EAD; [73 58, 05, 05][73 80, 05, 05]
+0EC4 0EAD; [73 58, 05, 05][73 82, 05, 05]
+
+0EAE; [73 5A, 05, 05]
+0EC0 0EAE; [73 5A, 05, 05][73 7A, 05, 05]
+0EC1 0EAE; [73 5A, 05, 05][73 7C, 05, 05]
+0EC2 0EAE; [73 5A, 05, 05][73 7E, 05, 05]
+0EC3 0EAE; [73 5A, 05, 05][73 80, 05, 05]
+0EC4 0EAE; [73 5A, 05, 05][73 82, 05, 05]
+
+0EAF; [73 5C, 05, 05]
+
+0EB0; [73 5E, 05, 05]
+
+0EB1; [73 60, 05, 05]
+
+0EB2; [73 62, 05, 05]
+
+0EB3; [73 64, 05, 05]
+0ECD 0EB2; [73 64, 05, 05]
+
+0EB4; [73 66, 05, 05]
+
+0EB5; [73 68, 05, 05]
+
+0EB6; [73 6A, 05, 05]
+
+0EB7; [73 6C, 05, 05]
+
+0EB8; [73 6E, 05, 05]
+
+0EB9; [73 70, 05, 05]
+
+0EBA; [73 72, 05, 05]
+
+0EBB; [73 74, 05, 05]
+
+0EBC; [73 76, 05, 05]
+
+0EBD; [73 78, 05, 05]
+
+0EC0; [73 7A, 05, 05]
+
+0EC1; [73 7C, 05, 05]
+
+0EC2; [73 7E, 05, 05]
+
+0EC3; [73 80, 05, 05]
+
+0EC4; [73 82, 05, 05]
+
+FDD1 AA80; [73 84 02, 05, 05] # Tai Viet first primary (compressible)
+
+AA80; [73 84 09, 05, 05]
+AAB5 AA80; [73 84 09, 05, 05][73 85 7E, 05, 05]
+AAB6 AA80; [73 84 09, 05, 05][73 85 85, 05, 05]
+AAB9 AA80; [73 84 09, 05, 05][73 85 9A, 05, 05]
+AABB AA80; [73 84 09, 05, 05][73 85 A8, 05, 05]
+AABC AA80; [73 84 09, 05, 05][73 85 AF, 05, 05]
+
+AA81; [73 84 10, 05, 05]
+AAB5 AA81; [73 84 10, 05, 05][73 85 7E, 05, 05]
+AAB6 AA81; [73 84 10, 05, 05][73 85 85, 05, 05]
+AAB9 AA81; [73 84 10, 05, 05][73 85 9A, 05, 05]
+AABB AA81; [73 84 10, 05, 05][73 85 A8, 05, 05]
+AABC AA81; [73 84 10, 05, 05][73 85 AF, 05, 05]
+
+AA82; [73 84 17, 05, 05]
+AAB5 AA82; [73 84 17, 05, 05][73 85 7E, 05, 05]
+AAB6 AA82; [73 84 17, 05, 05][73 85 85, 05, 05]
+AAB9 AA82; [73 84 17, 05, 05][73 85 9A, 05, 05]
+AABB AA82; [73 84 17, 05, 05][73 85 A8, 05, 05]
+AABC AA82; [73 84 17, 05, 05][73 85 AF, 05, 05]
+
+AA83; [73 84 1E, 05, 05]
+AAB5 AA83; [73 84 1E, 05, 05][73 85 7E, 05, 05]
+AAB6 AA83; [73 84 1E, 05, 05][73 85 85, 05, 05]
+AAB9 AA83; [73 84 1E, 05, 05][73 85 9A, 05, 05]
+AABB AA83; [73 84 1E, 05, 05][73 85 A8, 05, 05]
+AABC AA83; [73 84 1E, 05, 05][73 85 AF, 05, 05]
+
+AA84; [73 84 25, 05, 05]
+AAB5 AA84; [73 84 25, 05, 05][73 85 7E, 05, 05]
+AAB6 AA84; [73 84 25, 05, 05][73 85 85, 05, 05]
+AAB9 AA84; [73 84 25, 05, 05][73 85 9A, 05, 05]
+AABB AA84; [73 84 25, 05, 05][73 85 A8, 05, 05]
+AABC AA84; [73 84 25, 05, 05][73 85 AF, 05, 05]
+
+AA85; [73 84 2C, 05, 05]
+AAB5 AA85; [73 84 2C, 05, 05][73 85 7E, 05, 05]
+AAB6 AA85; [73 84 2C, 05, 05][73 85 85, 05, 05]
+AAB9 AA85; [73 84 2C, 05, 05][73 85 9A, 05, 05]
+AABB AA85; [73 84 2C, 05, 05][73 85 A8, 05, 05]
+AABC AA85; [73 84 2C, 05, 05][73 85 AF, 05, 05]
+
+AA86; [73 84 33, 05, 05]
+AAB5 AA86; [73 84 33, 05, 05][73 85 7E, 05, 05]
+AAB6 AA86; [73 84 33, 05, 05][73 85 85, 05, 05]
+AAB9 AA86; [73 84 33, 05, 05][73 85 9A, 05, 05]
+AABB AA86; [73 84 33, 05, 05][73 85 A8, 05, 05]
+AABC AA86; [73 84 33, 05, 05][73 85 AF, 05, 05]
+
+AA87; [73 84 3A, 05, 05]
+AAB5 AA87; [73 84 3A, 05, 05][73 85 7E, 05, 05]
+AAB6 AA87; [73 84 3A, 05, 05][73 85 85, 05, 05]
+AAB9 AA87; [73 84 3A, 05, 05][73 85 9A, 05, 05]
+AABB AA87; [73 84 3A, 05, 05][73 85 A8, 05, 05]
+AABC AA87; [73 84 3A, 05, 05][73 85 AF, 05, 05]
+
+AA88; [73 84 41, 05, 05]
+AAB5 AA88; [73 84 41, 05, 05][73 85 7E, 05, 05]
+AAB6 AA88; [73 84 41, 05, 05][73 85 85, 05, 05]
+AAB9 AA88; [73 84 41, 05, 05][73 85 9A, 05, 05]
+AABB AA88; [73 84 41, 05, 05][73 85 A8, 05, 05]
+AABC AA88; [73 84 41, 05, 05][73 85 AF, 05, 05]
+
+AA89; [73 84 48, 05, 05]
+AAB5 AA89; [73 84 48, 05, 05][73 85 7E, 05, 05]
+AAB6 AA89; [73 84 48, 05, 05][73 85 85, 05, 05]
+AAB9 AA89; [73 84 48, 05, 05][73 85 9A, 05, 05]
+AABB AA89; [73 84 48, 05, 05][73 85 A8, 05, 05]
+AABC AA89; [73 84 48, 05, 05][73 85 AF, 05, 05]
+
+AA8A; [73 84 4F, 05, 05]
+AAB5 AA8A; [73 84 4F, 05, 05][73 85 7E, 05, 05]
+AAB6 AA8A; [73 84 4F, 05, 05][73 85 85, 05, 05]
+AAB9 AA8A; [73 84 4F, 05, 05][73 85 9A, 05, 05]
+AABB AA8A; [73 84 4F, 05, 05][73 85 A8, 05, 05]
+AABC AA8A; [73 84 4F, 05, 05][73 85 AF, 05, 05]
+
+AA8B; [73 84 56, 05, 05]
+AAB5 AA8B; [73 84 56, 05, 05][73 85 7E, 05, 05]
+AAB6 AA8B; [73 84 56, 05, 05][73 85 85, 05, 05]
+AAB9 AA8B; [73 84 56, 05, 05][73 85 9A, 05, 05]
+AABB AA8B; [73 84 56, 05, 05][73 85 A8, 05, 05]
+AABC AA8B; [73 84 56, 05, 05][73 85 AF, 05, 05]
+
+AA8C; [73 84 5D, 05, 05]
+AAB5 AA8C; [73 84 5D, 05, 05][73 85 7E, 05, 05]
+AAB6 AA8C; [73 84 5D, 05, 05][73 85 85, 05, 05]
+AAB9 AA8C; [73 84 5D, 05, 05][73 85 9A, 05, 05]
+AABB AA8C; [73 84 5D, 05, 05][73 85 A8, 05, 05]
+AABC AA8C; [73 84 5D, 05, 05][73 85 AF, 05, 05]
+
+AA8D; [73 84 64, 05, 05]
+AAB5 AA8D; [73 84 64, 05, 05][73 85 7E, 05, 05]
+AAB6 AA8D; [73 84 64, 05, 05][73 85 85, 05, 05]
+AAB9 AA8D; [73 84 64, 05, 05][73 85 9A, 05, 05]
+AABB AA8D; [73 84 64, 05, 05][73 85 A8, 05, 05]
+AABC AA8D; [73 84 64, 05, 05][73 85 AF, 05, 05]
+
+AA8E; [73 84 6B, 05, 05]
+AAB5 AA8E; [73 84 6B, 05, 05][73 85 7E, 05, 05]
+AAB6 AA8E; [73 84 6B, 05, 05][73 85 85, 05, 05]
+AAB9 AA8E; [73 84 6B, 05, 05][73 85 9A, 05, 05]
+AABB AA8E; [73 84 6B, 05, 05][73 85 A8, 05, 05]
+AABC AA8E; [73 84 6B, 05, 05][73 85 AF, 05, 05]
+
+AA8F; [73 84 72, 05, 05]
+AAB5 AA8F; [73 84 72, 05, 05][73 85 7E, 05, 05]
+AAB6 AA8F; [73 84 72, 05, 05][73 85 85, 05, 05]
+AAB9 AA8F; [73 84 72, 05, 05][73 85 9A, 05, 05]
+AABB AA8F; [73 84 72, 05, 05][73 85 A8, 05, 05]
+AABC AA8F; [73 84 72, 05, 05][73 85 AF, 05, 05]
+
+AA90; [73 84 79, 05, 05]
+AAB5 AA90; [73 84 79, 05, 05][73 85 7E, 05, 05]
+AAB6 AA90; [73 84 79, 05, 05][73 85 85, 05, 05]
+AAB9 AA90; [73 84 79, 05, 05][73 85 9A, 05, 05]
+AABB AA90; [73 84 79, 05, 05][73 85 A8, 05, 05]
+AABC AA90; [73 84 79, 05, 05][73 85 AF, 05, 05]
+
+AA91; [73 84 80, 05, 05]
+AAB5 AA91; [73 84 80, 05, 05][73 85 7E, 05, 05]
+AAB6 AA91; [73 84 80, 05, 05][73 85 85, 05, 05]
+AAB9 AA91; [73 84 80, 05, 05][73 85 9A, 05, 05]
+AABB AA91; [73 84 80, 05, 05][73 85 A8, 05, 05]
+AABC AA91; [73 84 80, 05, 05][73 85 AF, 05, 05]
+
+AA92; [73 84 87, 05, 05]
+AAB5 AA92; [73 84 87, 05, 05][73 85 7E, 05, 05]
+AAB6 AA92; [73 84 87, 05, 05][73 85 85, 05, 05]
+AAB9 AA92; [73 84 87, 05, 05][73 85 9A, 05, 05]
+AABB AA92; [73 84 87, 05, 05][73 85 A8, 05, 05]
+AABC AA92; [73 84 87, 05, 05][73 85 AF, 05, 05]
+
+AA93; [73 84 8E, 05, 05]
+AAB5 AA93; [73 84 8E, 05, 05][73 85 7E, 05, 05]
+AAB6 AA93; [73 84 8E, 05, 05][73 85 85, 05, 05]
+AAB9 AA93; [73 84 8E, 05, 05][73 85 9A, 05, 05]
+AABB AA93; [73 84 8E, 05, 05][73 85 A8, 05, 05]
+AABC AA93; [73 84 8E, 05, 05][73 85 AF, 05, 05]
+
+AA94; [73 84 95, 05, 05]
+AAB5 AA94; [73 84 95, 05, 05][73 85 7E, 05, 05]
+AAB6 AA94; [73 84 95, 05, 05][73 85 85, 05, 05]
+AAB9 AA94; [73 84 95, 05, 05][73 85 9A, 05, 05]
+AABB AA94; [73 84 95, 05, 05][73 85 A8, 05, 05]
+AABC AA94; [73 84 95, 05, 05][73 85 AF, 05, 05]
+
+AA95; [73 84 9C, 05, 05]
+AAB5 AA95; [73 84 9C, 05, 05][73 85 7E, 05, 05]
+AAB6 AA95; [73 84 9C, 05, 05][73 85 85, 05, 05]
+AAB9 AA95; [73 84 9C, 05, 05][73 85 9A, 05, 05]
+AABB AA95; [73 84 9C, 05, 05][73 85 A8, 05, 05]
+AABC AA95; [73 84 9C, 05, 05][73 85 AF, 05, 05]
+
+AA96; [73 84 A3, 05, 05]
+AAB5 AA96; [73 84 A3, 05, 05][73 85 7E, 05, 05]
+AAB6 AA96; [73 84 A3, 05, 05][73 85 85, 05, 05]
+AAB9 AA96; [73 84 A3, 05, 05][73 85 9A, 05, 05]
+AABB AA96; [73 84 A3, 05, 05][73 85 A8, 05, 05]
+AABC AA96; [73 84 A3, 05, 05][73 85 AF, 05, 05]
+
+AA97; [73 84 AA, 05, 05]
+AAB5 AA97; [73 84 AA, 05, 05][73 85 7E, 05, 05]
+AAB6 AA97; [73 84 AA, 05, 05][73 85 85, 05, 05]
+AAB9 AA97; [73 84 AA, 05, 05][73 85 9A, 05, 05]
+AABB AA97; [73 84 AA, 05, 05][73 85 A8, 05, 05]
+AABC AA97; [73 84 AA, 05, 05][73 85 AF, 05, 05]
+
+AA98; [73 84 B1, 05, 05]
+AAB5 AA98; [73 84 B1, 05, 05][73 85 7E, 05, 05]
+AAB6 AA98; [73 84 B1, 05, 05][73 85 85, 05, 05]
+AAB9 AA98; [73 84 B1, 05, 05][73 85 9A, 05, 05]
+AABB AA98; [73 84 B1, 05, 05][73 85 A8, 05, 05]
+AABC AA98; [73 84 B1, 05, 05][73 85 AF, 05, 05]
+
+AA99; [73 84 B8, 05, 05]
+AAB5 AA99; [73 84 B8, 05, 05][73 85 7E, 05, 05]
+AAB6 AA99; [73 84 B8, 05, 05][73 85 85, 05, 05]
+AAB9 AA99; [73 84 B8, 05, 05][73 85 9A, 05, 05]
+AABB AA99; [73 84 B8, 05, 05][73 85 A8, 05, 05]
+AABC AA99; [73 84 B8, 05, 05][73 85 AF, 05, 05]
+
+AA9A; [73 84 BF, 05, 05]
+AAB5 AA9A; [73 84 BF, 05, 05][73 85 7E, 05, 05]
+AAB6 AA9A; [73 84 BF, 05, 05][73 85 85, 05, 05]
+AAB9 AA9A; [73 84 BF, 05, 05][73 85 9A, 05, 05]
+AABB AA9A; [73 84 BF, 05, 05][73 85 A8, 05, 05]
+AABC AA9A; [73 84 BF, 05, 05][73 85 AF, 05, 05]
+
+AA9B; [73 84 C6, 05, 05]
+AAB5 AA9B; [73 84 C6, 05, 05][73 85 7E, 05, 05]
+AAB6 AA9B; [73 84 C6, 05, 05][73 85 85, 05, 05]
+AAB9 AA9B; [73 84 C6, 05, 05][73 85 9A, 05, 05]
+AABB AA9B; [73 84 C6, 05, 05][73 85 A8, 05, 05]
+AABC AA9B; [73 84 C6, 05, 05][73 85 AF, 05, 05]
+
+AA9C; [73 84 CD, 05, 05]
+AAB5 AA9C; [73 84 CD, 05, 05][73 85 7E, 05, 05]
+AAB6 AA9C; [73 84 CD, 05, 05][73 85 85, 05, 05]
+AAB9 AA9C; [73 84 CD, 05, 05][73 85 9A, 05, 05]
+AABB AA9C; [73 84 CD, 05, 05][73 85 A8, 05, 05]
+AABC AA9C; [73 84 CD, 05, 05][73 85 AF, 05, 05]
+
+AA9D; [73 84 D4, 05, 05]
+AAB5 AA9D; [73 84 D4, 05, 05][73 85 7E, 05, 05]
+AAB6 AA9D; [73 84 D4, 05, 05][73 85 85, 05, 05]
+AAB9 AA9D; [73 84 D4, 05, 05][73 85 9A, 05, 05]
+AABB AA9D; [73 84 D4, 05, 05][73 85 A8, 05, 05]
+AABC AA9D; [73 84 D4, 05, 05][73 85 AF, 05, 05]
+
+AA9E; [73 84 DB, 05, 05]
+AAB5 AA9E; [73 84 DB, 05, 05][73 85 7E, 05, 05]
+AAB6 AA9E; [73 84 DB, 05, 05][73 85 85, 05, 05]
+AAB9 AA9E; [73 84 DB, 05, 05][73 85 9A, 05, 05]
+AABB AA9E; [73 84 DB, 05, 05][73 85 A8, 05, 05]
+AABC AA9E; [73 84 DB, 05, 05][73 85 AF, 05, 05]
+
+AA9F; [73 84 E2, 05, 05]
+AAB5 AA9F; [73 84 E2, 05, 05][73 85 7E, 05, 05]
+AAB6 AA9F; [73 84 E2, 05, 05][73 85 85, 05, 05]
+AAB9 AA9F; [73 84 E2, 05, 05][73 85 9A, 05, 05]
+AABB AA9F; [73 84 E2, 05, 05][73 85 A8, 05, 05]
+AABC AA9F; [73 84 E2, 05, 05][73 85 AF, 05, 05]
+
+AAA0; [73 84 E9, 05, 05]
+AAB5 AAA0; [73 84 E9, 05, 05][73 85 7E, 05, 05]
+AAB6 AAA0; [73 84 E9, 05, 05][73 85 85, 05, 05]
+AAB9 AAA0; [73 84 E9, 05, 05][73 85 9A, 05, 05]
+AABB AAA0; [73 84 E9, 05, 05][73 85 A8, 05, 05]
+AABC AAA0; [73 84 E9, 05, 05][73 85 AF, 05, 05]
+
+AAA1; [73 84 F0, 05, 05]
+AAB5 AAA1; [73 84 F0, 05, 05][73 85 7E, 05, 05]
+AAB6 AAA1; [73 84 F0, 05, 05][73 85 85, 05, 05]
+AAB9 AAA1; [73 84 F0, 05, 05][73 85 9A, 05, 05]
+AABB AAA1; [73 84 F0, 05, 05][73 85 A8, 05, 05]
+AABC AAA1; [73 84 F0, 05, 05][73 85 AF, 05, 05]
+
+AAA2; [73 84 F7, 05, 05]
+AAB5 AAA2; [73 84 F7, 05, 05][73 85 7E, 05, 05]
+AAB6 AAA2; [73 84 F7, 05, 05][73 85 85, 05, 05]
+AAB9 AAA2; [73 84 F7, 05, 05][73 85 9A, 05, 05]
+AABB AAA2; [73 84 F7, 05, 05][73 85 A8, 05, 05]
+AABC AAA2; [73 84 F7, 05, 05][73 85 AF, 05, 05]
+
+AAA3; [73 84 FE, 05, 05]
+AAB5 AAA3; [73 84 FE, 05, 05][73 85 7E, 05, 05]
+AAB6 AAA3; [73 84 FE, 05, 05][73 85 85, 05, 05]
+AAB9 AAA3; [73 84 FE, 05, 05][73 85 9A, 05, 05]
+AABB AAA3; [73 84 FE, 05, 05][73 85 A8, 05, 05]
+AABC AAA3; [73 84 FE, 05, 05][73 85 AF, 05, 05]
+
+AAA4; [73 85 07, 05, 05]
+AAB5 AAA4; [73 85 07, 05, 05][73 85 7E, 05, 05]
+AAB6 AAA4; [73 85 07, 05, 05][73 85 85, 05, 05]
+AAB9 AAA4; [73 85 07, 05, 05][73 85 9A, 05, 05]
+AABB AAA4; [73 85 07, 05, 05][73 85 A8, 05, 05]
+AABC AAA4; [73 85 07, 05, 05][73 85 AF, 05, 05]
+
+AAA5; [73 85 0E, 05, 05]
+AAB5 AAA5; [73 85 0E, 05, 05][73 85 7E, 05, 05]
+AAB6 AAA5; [73 85 0E, 05, 05][73 85 85, 05, 05]
+AAB9 AAA5; [73 85 0E, 05, 05][73 85 9A, 05, 05]
+AABB AAA5; [73 85 0E, 05, 05][73 85 A8, 05, 05]
+AABC AAA5; [73 85 0E, 05, 05][73 85 AF, 05, 05]
+
+AAA6; [73 85 15, 05, 05]
+AAB5 AAA6; [73 85 15, 05, 05][73 85 7E, 05, 05]
+AAB6 AAA6; [73 85 15, 05, 05][73 85 85, 05, 05]
+AAB9 AAA6; [73 85 15, 05, 05][73 85 9A, 05, 05]
+AABB AAA6; [73 85 15, 05, 05][73 85 A8, 05, 05]
+AABC AAA6; [73 85 15, 05, 05][73 85 AF, 05, 05]
+
+AAA7; [73 85 1C, 05, 05]
+AAB5 AAA7; [73 85 1C, 05, 05][73 85 7E, 05, 05]
+AAB6 AAA7; [73 85 1C, 05, 05][73 85 85, 05, 05]
+AAB9 AAA7; [73 85 1C, 05, 05][73 85 9A, 05, 05]
+AABB AAA7; [73 85 1C, 05, 05][73 85 A8, 05, 05]
+AABC AAA7; [73 85 1C, 05, 05][73 85 AF, 05, 05]
+
+AAA8; [73 85 23, 05, 05]
+AAB5 AAA8; [73 85 23, 05, 05][73 85 7E, 05, 05]
+AAB6 AAA8; [73 85 23, 05, 05][73 85 85, 05, 05]
+AAB9 AAA8; [73 85 23, 05, 05][73 85 9A, 05, 05]
+AABB AAA8; [73 85 23, 05, 05][73 85 A8, 05, 05]
+AABC AAA8; [73 85 23, 05, 05][73 85 AF, 05, 05]
+
+AAA9; [73 85 2A, 05, 05]
+AAB5 AAA9; [73 85 2A, 05, 05][73 85 7E, 05, 05]
+AAB6 AAA9; [73 85 2A, 05, 05][73 85 85, 05, 05]
+AAB9 AAA9; [73 85 2A, 05, 05][73 85 9A, 05, 05]
+AABB AAA9; [73 85 2A, 05, 05][73 85 A8, 05, 05]
+AABC AAA9; [73 85 2A, 05, 05][73 85 AF, 05, 05]
+
+AAAA; [73 85 31, 05, 05]
+AAB5 AAAA; [73 85 31, 05, 05][73 85 7E, 05, 05]
+AAB6 AAAA; [73 85 31, 05, 05][73 85 85, 05, 05]
+AAB9 AAAA; [73 85 31, 05, 05][73 85 9A, 05, 05]
+AABB AAAA; [73 85 31, 05, 05][73 85 A8, 05, 05]
+AABC AAAA; [73 85 31, 05, 05][73 85 AF, 05, 05]
+
+AAAB; [73 85 38, 05, 05]
+AAB5 AAAB; [73 85 38, 05, 05][73 85 7E, 05, 05]
+AAB6 AAAB; [73 85 38, 05, 05][73 85 85, 05, 05]
+AAB9 AAAB; [73 85 38, 05, 05][73 85 9A, 05, 05]
+AABB AAAB; [73 85 38, 05, 05][73 85 A8, 05, 05]
+AABC AAAB; [73 85 38, 05, 05][73 85 AF, 05, 05]
+
+AAAC; [73 85 3F, 05, 05]
+AAB5 AAAC; [73 85 3F, 05, 05][73 85 7E, 05, 05]
+AAB6 AAAC; [73 85 3F, 05, 05][73 85 85, 05, 05]
+AAB9 AAAC; [73 85 3F, 05, 05][73 85 9A, 05, 05]
+AABB AAAC; [73 85 3F, 05, 05][73 85 A8, 05, 05]
+AABC AAAC; [73 85 3F, 05, 05][73 85 AF, 05, 05]
+
+AAAD; [73 85 46, 05, 05]
+AAB5 AAAD; [73 85 46, 05, 05][73 85 7E, 05, 05]
+AAB6 AAAD; [73 85 46, 05, 05][73 85 85, 05, 05]
+AAB9 AAAD; [73 85 46, 05, 05][73 85 9A, 05, 05]
+AABB AAAD; [73 85 46, 05, 05][73 85 A8, 05, 05]
+AABC AAAD; [73 85 46, 05, 05][73 85 AF, 05, 05]
+
+AAAE; [73 85 4D, 05, 05]
+AAB5 AAAE; [73 85 4D, 05, 05][73 85 7E, 05, 05]
+AAB6 AAAE; [73 85 4D, 05, 05][73 85 85, 05, 05]
+AAB9 AAAE; [73 85 4D, 05, 05][73 85 9A, 05, 05]
+AABB AAAE; [73 85 4D, 05, 05][73 85 A8, 05, 05]
+AABC AAAE; [73 85 4D, 05, 05][73 85 AF, 05, 05]
+
+AAAF; [73 85 54, 05, 05]
+AAB5 AAAF; [73 85 54, 05, 05][73 85 7E, 05, 05]
+AAB6 AAAF; [73 85 54, 05, 05][73 85 85, 05, 05]
+AAB9 AAAF; [73 85 54, 05, 05][73 85 9A, 05, 05]
+AABB AAAF; [73 85 54, 05, 05][73 85 A8, 05, 05]
+AABC AAAF; [73 85 54, 05, 05][73 85 AF, 05, 05]
-AAB0; [73 67 5B, 05, 05]
+AAB0; [73 85 5B, 05, 05]
-AAB1; [73 67 62, 05, 05]
+AAB1; [73 85 62, 05, 05]
-AAB2; [73 67 69, 05, 05]
+AAB2; [73 85 69, 05, 05]
-AAB3; [73 67 70, 05, 05]
+AAB3; [73 85 70, 05, 05]
-AAB4; [73 67 77, 05, 05]
+AAB4; [73 85 77, 05, 05]
-AAB5; [73 67 7E, 05, 05]
+AAB5; [73 85 7E, 05, 05]
-AAB6; [73 67 85, 05, 05]
+AAB6; [73 85 85, 05, 05]
-AAB7; [73 67 8C, 05, 05]
+AAB7; [73 85 8C, 05, 05]
-AAB8; [73 67 93, 05, 05]
+AAB8; [73 85 93, 05, 05]
-AAB9; [73 67 9A, 05, 05]
+AAB9; [73 85 9A, 05, 05]
-AABA; [73 67 A1, 05, 05]
+AABA; [73 85 A1, 05, 05]
-AABB; [73 67 A8, 05, 05]
+AABB; [73 85 A8, 05, 05]
-AABC; [73 67 AF, 05, 05]
+AABC; [73 85 AF, 05, 05]
-AABD; [73 67 B6, 05, 05]
+AABD; [73 85 B6, 05, 05]
-AABE; [73 67 BD, 05, 05]
+AABE; [73 85 BD, 05, 05]
-AAC0; [73 67 C4, 05, 05]
+AAC0; [73 85 C4, 05, 05]
-AAC2; [73 67 CB, 05, 05]
+AAC2; [73 85 CB, 05, 05]
-AADB; [73 67 D2, 05, 05]
+AADB; [73 85 D2, 05, 05]
-AADC; [73 67 D9, 05, 05]
+AADC; [73 85 D9, 05, 05]
FDD1 0F40; [74 04 02, 05, 05] # TIBETAN first primary starts new lead byte (compressible)
@@ -30686,7 +31496,7 @@ FDD1 0F40; [74 04 02, 05, 05] # TIBETAN first primary starts new lead byte (comp
0FB7; [74 90, 05, 05]
0F68; [74 92, 05, 05]
-0F00; [74 92, 05, 20][74 C0, 05, 20][, F1 66, 20]
+0F00; [74 92, 05, 20][74 C0, 05, 20][, F0 F1, 20]
0FB8; [74 94, 05, 05]
@@ -30982,9 +31792,13 @@ FDD1 11A5C; [74 D1 02, 05, 05] # Soyombo first primary (compressible)
11A82; [74 FD 02, 05, 05]
-11A99; [74 FD 09, 05, 05]
+11A84; [74 FD 09, 05, 05]
+
+11A85; [74 FD 10, 05, 05]
-11A9D; [74 FD 10, 05, 05]
+11A99; [74 FD 17, 05, 05]
+
+11A9D; [74 FD 1E, 05, 05]
FDD1 11C72; [75 04 02, 05, 05] # Marchen first primary starts new lead byte (compressible)
@@ -38688,6 +39502,8 @@ FDD1 1E909; [78 A7 02, 05, 05] # Adlam first primary (compressible)
1E943; [78 EB, 05, 05]
1E921; [78 EB, 05, A0]
+1E94B; [78 ED 02, 05, 05]
+
FDD1 AC00; [79 04 02, 05, 05] # HANGUL first primary starts new lead byte (compressible)
1100; [79 06, 05, 05]
@@ -39592,10 +40408,10 @@ FF67; [7A 06, 05, 17]
30A2; [7A 06, 05, 9E]
FF71; [7A 06, 05, A5]
32D0; [7A 06, 05, 2C]
-3303; [7A 06, 05, 33][0D 68, 05, 2E][7A 58, 05, 30]
-3300; [7A 06, 05, 33][7A 3A, 05, 30][, B0, 2E][0D 68, 05, 2E][7A 2E, 05, 33]
+3303; [7A 06, 05, 33][0D 6F, 05, 2E][7A 58, 05, 30]
+3300; [7A 06, 05, 33][7A 3A, 05, 30][, B0, 2E][0D 6F, 05, 2E][7A 2E, 05, 33]
3301; [7A 06, 05, 33][7A 58, 05, 30][7A 3E, 05, 30][7A 06, 05, 33]
-3302; [7A 06, 05, 33][7A 66, 05, 2C][7A 40, 05, 30][, B0, 2E][7A 06, 05, 33]
+3302; [7A 06, 05, 33][7A 66, 05, 31][7A 40, 05, 30][, B0, 2E][7A 06, 05, 33]
3043; [7A 08, 05, 03]
3044; [7A 08, 05, 85]
@@ -39604,8 +40420,8 @@ FF68; [7A 08, 05, 17]
30A4; [7A 08, 05, 9E]
FF72; [7A 08, 05, A5]
32D1; [7A 08, 05, 2C]
-3304; [7A 08, 05, 33][7A 32, 05, 31][7A 66, 05, 2C][7A 16, 05, 30][, AE, 2E]
-3305; [7A 08, 05, 33][7A 66, 05, 2C][7A 28, 05, 31]
+3304; [7A 08, 05, 33][7A 32, 05, 31][7A 66, 05, 31][7A 16, 05, 30][, AE, 2E]
+3305; [7A 08, 05, 33][7A 66, 05, 31][7A 28, 05, 31]
3045; [7A 0A, 05, 03]
3046; [7A 0A, 05, 85]
@@ -39616,7 +40432,7 @@ FF73; [7A 0A, 05, A5]
32D2; [7A 0A, 05, 2C]
3094; [7A 0A, 05, 85][, AE, 05]
30F4; [7A 0A, 05, 9E][, AE, 05]
-3306; [7A 0A, 05, 33][7A 10, 05, 33][7A 66, 05, 2C]
+3306; [7A 0A, 05, 33][7A 10, 05, 33][7A 66, 05, 31]
1B000; [7A 0C, 05, 85]
@@ -39627,8 +40443,8 @@ FF6A; [7A 0E, 05, 17]
30A8; [7A 0E, 05, 9E]
FF74; [7A 0E, 05, A5]
32D3; [7A 0E, 05, 2C]
-3308; [7A 0E, 05, 33][0D 68, 05, 2E][7A 12, 05, 30][0D 68, 05, 2E]
-3307; [7A 0E, 05, 33][7A 20, 05, 30][7A 16, 05, 30][0D 68, 05, 2E][7A 2E, 05, 33][, AE, 2E]
+3308; [7A 0E, 05, 33][0D 6F, 05, 2E][7A 12, 05, 30][0D 6F, 05, 2E]
+3307; [7A 0E, 05, 33][7A 20, 05, 30][7A 16, 05, 30][0D 6F, 05, 2E][7A 2E, 05, 33][, AE, 2E]
3049; [7A 10, 05, 03]
304A; [7A 10, 05, 85]
@@ -39637,8 +40453,8 @@ FF6B; [7A 10, 05, 17]
30AA; [7A 10, 05, 9E]
FF75; [7A 10, 05, A5]
32D4; [7A 10, 05, 2C]
-330A; [7A 10, 05, 33][0D 68, 05, 2E][7A 48, 05, 30]
-3309; [7A 10, 05, 33][7A 66, 05, 2C][7A 20, 05, 30]
+330A; [7A 10, 05, 33][0D 6F, 05, 2E][7A 48, 05, 30]
+3309; [7A 10, 05, 33][7A 66, 05, 31][7A 20, 05, 30]
3095; [7A 12, 05, 03]
304B; [7A 12, 05, 85]
@@ -39650,9 +40466,9 @@ FF76; [7A 12, 05, A0]
30AC; [7A 12, 05, 98][, AE, 05]
330B; [7A 12, 05, 30][7A 08, 05, 33][7A 56, 05, 33]
330C; [7A 12, 05, 30][7A 54, 05, 30][7A 2A, 05, 33][7A 2E, 05, 33]
-330D; [7A 12, 05, 30][7A 5C, 05, 30][7A 56, 05, 33][0D 68, 05, 2E]
-330E; [7A 12, 05, 30][, AE, 2E][7A 5C, 05, 30][7A 66, 05, 2C]
-330F; [7A 12, 05, 30][, AE, 2E][7A 66, 05, 2C][7A 44, 05, 31]
+330D; [7A 12, 05, 30][7A 5C, 05, 30][7A 56, 05, 33][0D 6F, 05, 2E]
+330E; [7A 12, 05, 30][, AE, 2E][7A 5C, 05, 30][7A 66, 05, 31]
+330F; [7A 12, 05, 30][, AE, 2E][7A 66, 05, 31][7A 44, 05, 31]
304D; [7A 14, 05, 85]
30AD; [7A 14, 05, 90]
@@ -39661,12 +40477,12 @@ FF77; [7A 14, 05, 9B]
304E; [7A 14, 05, 85][, AE, 05]
30AE; [7A 14, 05, 90][, AE, 05]
3310; [7A 14, 05, 31][, AE, 2E][7A 12, 05, 30][, AE, 2E]
-3311; [7A 14, 05, 31][, AE, 2E][7A 32, 05, 31][0D 68, 05, 2E]
-3312; [7A 14, 05, 31][7A 50, 05, 33][7A 56, 05, 33][0D 68, 05, 2E]
-3313; [7A 14, 05, 31][, AE, 2E][7A 58, 05, 30][7A 26, 05, 31][, AE, 2E][0D 68, 05, 2E]
+3311; [7A 14, 05, 31][, AE, 2E][7A 32, 05, 31][0D 6F, 05, 2E]
+3312; [7A 14, 05, 31][7A 50, 05, 33][7A 56, 05, 33][0D 6F, 05, 2E]
+3313; [7A 14, 05, 31][, AE, 2E][7A 58, 05, 30][7A 26, 05, 31][, AE, 2E][0D 6F, 05, 2E]
3314; [7A 14, 05, 31][7A 5C, 05, 30]
3315; [7A 14, 05, 31][7A 5C, 05, 30][7A 16, 05, 30][, AE, 2E][7A 54, 05, 30][7A 48, 05, 30]
-3316; [7A 14, 05, 31][7A 5C, 05, 30][7A 4A, 05, 31][0D 68, 05, 2E][7A 2E, 05, 33][7A 58, 05, 30]
+3316; [7A 14, 05, 31][7A 5C, 05, 30][7A 4A, 05, 31][0D 6F, 05, 2E][7A 2E, 05, 33][7A 58, 05, 30]
3317; [7A 14, 05, 31][7A 5C, 05, 30][7A 5E, 05, 30][7A 2A, 05, 33][7A 2E, 05, 33]
304F; [7A 16, 05, 85]
@@ -39677,9 +40493,9 @@ FF78; [7A 16, 05, A0]
3050; [7A 16, 05, 85][, AE, 05]
30B0; [7A 16, 05, 98][, AE, 05]
3318; [7A 16, 05, 30][, AE, 2E][7A 54, 05, 30][7A 48, 05, 30]
-3319; [7A 16, 05, 30][, AE, 2E][7A 54, 05, 30][7A 48, 05, 30][7A 2E, 05, 33][7A 66, 05, 2C]
+3319; [7A 16, 05, 30][, AE, 2E][7A 54, 05, 30][7A 48, 05, 30][7A 2E, 05, 33][7A 66, 05, 31]
331A; [7A 16, 05, 30][7A 58, 05, 30][7A 22, 05, 31][, AE, 2E][7A 08, 05, 33][7A 5C, 05, 30]
-331B; [7A 16, 05, 30][7A 5C, 05, 30][0D 68, 05, 2E][7A 36, 05, 31]
+331B; [7A 16, 05, 30][7A 5C, 05, 30][0D 6F, 05, 2E][7A 36, 05, 31]
3096; [7A 18, 05, 03]
3051; [7A 18, 05, 85]
@@ -39689,7 +40505,7 @@ FF79; [7A 18, 05, A0]
32D8; [7A 18, 05, 28]
3052; [7A 18, 05, 85][, AE, 05]
30B2; [7A 18, 05, 98][, AE, 05]
-331C; [7A 18, 05, 30][0D 68, 05, 2E][7A 20, 05, 30]
+331C; [7A 18, 05, 30][0D 6F, 05, 2E][7A 20, 05, 30]
3053; [7A 1A, 05, 85]
30B3; [7A 1A, 05, 90]
@@ -39697,7 +40513,7 @@ FF7A; [7A 1A, 05, 98]
32D9; [7A 1A, 05, 20]
3054; [7A 1A, 05, 85][, AE, 05]
30B4; [7A 1A, 05, 90][, AE, 05]
-331E; [7A 1A, 05, 30][0D 68, 05, 2E][7A 42, 05, 30][, B0, 2E]
+331E; [7A 1A, 05, 30][0D 6F, 05, 2E][7A 42, 05, 30][, B0, 2E]
1F201; [7A 1A, 05, 30][7A 1A, 05, 30]
30FF; [7A 1A, 05, 28][7A 2E, 05, 2C]
331D; [7A 1A, 05, 30][7A 58, 05, 30][7A 30, 05, 31]
@@ -39710,7 +40526,7 @@ FF7B; [7A 1C, 05, 9B]
3056; [7A 1C, 05, 85][, AE, 05]
30B6; [7A 1C, 05, 90][, AE, 05]
331F; [7A 1C, 05, 31][7A 08, 05, 33][7A 16, 05, 30][7A 58, 05, 30]
-3320; [7A 1C, 05, 31][7A 66, 05, 2C][7A 28, 05, 31][0D 68, 05, 2E][7A 48, 05, 30]
+3320; [7A 1C, 05, 31][7A 66, 05, 31][7A 28, 05, 31][0D 6F, 05, 2E][7A 48, 05, 30]
3057; [7A 1E, 05, 85]
31F1; [7A 1E, 05, 10]
@@ -39720,7 +40536,7 @@ FF7C; [7A 1E, 05, A0]
3058; [7A 1E, 05, 85][, AE, 05]
30B8; [7A 1E, 05, 98][, AE, 05]
3006; [7A 1E, 05, 03][7A 4A, 05, 03]
-3321; [7A 1E, 05, 30][7A 56, 05, 33][7A 66, 05, 2C][7A 16, 05, 30][, AE, 2E]
+3321; [7A 1E, 05, 30][7A 56, 05, 33][7A 66, 05, 31][7A 16, 05, 30][, AE, 2E]
3059; [7A 20, 05, 85]
31F2; [7A 20, 05, 10]
@@ -39736,8 +40552,8 @@ FF7E; [7A 22, 05, 9B]
32DD; [7A 22, 05, 26]
305C; [7A 22, 05, 85][, AE, 05]
30BC; [7A 22, 05, 90][, AE, 05]
-3322; [7A 22, 05, 31][7A 66, 05, 2C][7A 28, 05, 31]
-3323; [7A 22, 05, 31][7A 66, 05, 2C][7A 2E, 05, 33]
+3322; [7A 22, 05, 31][7A 66, 05, 31][7A 28, 05, 31]
+3323; [7A 22, 05, 31][7A 66, 05, 31][7A 2E, 05, 33]
305D; [7A 24, 05, 85]
30BD; [7A 24, 05, 90]
@@ -39752,7 +40568,7 @@ FF80; [7A 26, 05, 9B]
32DF; [7A 26, 05, 26]
3060; [7A 26, 05, 85][, AE, 05]
30C0; [7A 26, 05, 90][, AE, 05]
-3324; [7A 26, 05, 31][, AE, 2E][0D 68, 05, 2E][7A 20, 05, 30]
+3324; [7A 26, 05, 31][, AE, 2E][0D 6F, 05, 2E][7A 20, 05, 30]
3061; [7A 28, 05, 85]
30C1; [7A 28, 05, 90]
@@ -39788,7 +40604,7 @@ FF84; [7A 2E, 05, 9E]
3069; [7A 2E, 05, 85][, AE, 05]
30C9; [7A 2E, 05, 97][, AE, 05]
3326; [7A 2E, 05, 33][, AE, 2E][7A 58, 05, 30]
-3327; [7A 2E, 05, 33][7A 66, 05, 2C]
+3327; [7A 2E, 05, 33][7A 66, 05, 31]
306A; [7A 30, 05, 85]
30CA; [7A 30, 05, 90]
@@ -39827,9 +40643,9 @@ FF8A; [7A 3A, 05, A0]
30D0; [7A 3A, 05, 98][, AE, 05]
3071; [7A 3A, 05, 85][, B0, 05]
30D1; [7A 3A, 05, 98][, B0, 05]
-332B; [7A 3A, 05, 30][, B0, 2E][0D 68, 05, 2E][7A 22, 05, 31][7A 66, 05, 2C][7A 2E, 05, 33]
-332C; [7A 3A, 05, 30][, B0, 2E][0D 68, 05, 2E][7A 2A, 05, 33]
-332D; [7A 3A, 05, 30][, AE, 2E][0D 68, 05, 2E][7A 5A, 05, 30][7A 58, 05, 30]
+332B; [7A 3A, 05, 30][, B0, 2E][0D 6F, 05, 2E][7A 22, 05, 31][7A 66, 05, 31][7A 2E, 05, 33]
+332C; [7A 3A, 05, 30][, B0, 2E][0D 6F, 05, 2E][7A 2A, 05, 33]
+332D; [7A 3A, 05, 30][, AE, 2E][0D 6F, 05, 2E][7A 5A, 05, 30][7A 58, 05, 30]
332A; [7A 3A, 05, 30][7A 08, 05, 33][7A 2A, 05, 33]
3072; [7A 3C, 05, 85]
@@ -39856,9 +40672,9 @@ FF8C; [7A 3E, 05, A0]
3077; [7A 3E, 05, 85][, B0, 05]
30D7; [7A 3E, 05, 98][, B0, 05]
3332; [7A 3E, 05, 30][7A 06, 05, 33][7A 54, 05, 30][7A 2A, 05, 33][7A 2E, 05, 33][, AE, 2E]
-3333; [7A 3E, 05, 30][7A 08, 05, 33][0D 68, 05, 2E][7A 2E, 05, 33]
+3333; [7A 3E, 05, 30][7A 08, 05, 33][0D 6F, 05, 2E][7A 2E, 05, 33]
3334; [7A 3E, 05, 30][, AE, 2E][7A 2A, 05, 33][7A 1E, 05, 30][7A 0E, 05, 33][7A 58, 05, 30]
-3335; [7A 3E, 05, 30][7A 54, 05, 30][7A 66, 05, 2C]
+3335; [7A 3E, 05, 30][7A 54, 05, 30][7A 66, 05, 31]
3078; [7A 40, 05, 85]
31F8; [7A 40, 05, 10]
@@ -39869,13 +40685,13 @@ FF8D; [7A 40, 05, A0]
30D9; [7A 40, 05, 98][, AE, 05]
307A; [7A 40, 05, 85][, B0, 05]
30DA; [7A 40, 05, 98][, B0, 05]
-333B; [7A 40, 05, 30][, B0, 2E][0D 68, 05, 2E][7A 1E, 05, 30][, AE, 2E]
-333C; [7A 40, 05, 30][, AE, 2E][0D 68, 05, 2E][7A 26, 05, 31]
-3336; [7A 40, 05, 30][7A 16, 05, 30][7A 26, 05, 31][0D 68, 05, 2E][7A 58, 05, 30]
+333B; [7A 40, 05, 30][, B0, 2E][0D 6F, 05, 2E][7A 1E, 05, 30][, AE, 2E]
+333C; [7A 40, 05, 30][, AE, 2E][0D 6F, 05, 2E][7A 26, 05, 31]
+3336; [7A 40, 05, 30][7A 16, 05, 30][7A 26, 05, 31][0D 6F, 05, 2E][7A 58, 05, 30]
3337; [7A 40, 05, 30][, B0, 2E][7A 24, 05, 31]
3338; [7A 40, 05, 30][, B0, 2E][7A 32, 05, 31][7A 3C, 05, 30]
3339; [7A 40, 05, 30][7A 58, 05, 30][7A 2A, 05, 33]
-333A; [7A 40, 05, 30][, B0, 2E][7A 66, 05, 2C][7A 20, 05, 30]
+333A; [7A 40, 05, 30][, B0, 2E][7A 66, 05, 31][7A 20, 05, 30]
307B; [7A 42, 05, 85]
31F9; [7A 42, 05, 10]
@@ -39886,13 +40702,13 @@ FF8E; [7A 42, 05, A0]
30DC; [7A 42, 05, 98][, AE, 05]
307D; [7A 42, 05, 85][, B0, 05]
30DD; [7A 42, 05, 98][, B0, 05]
-3341; [7A 42, 05, 30][0D 68, 05, 2E][7A 58, 05, 30]
-3342; [7A 42, 05, 30][0D 68, 05, 2E][7A 66, 05, 2C]
-333D; [7A 42, 05, 30][, B0, 2E][7A 08, 05, 33][7A 66, 05, 2C][7A 2E, 05, 33]
+3341; [7A 42, 05, 30][0D 6F, 05, 2E][7A 58, 05, 30]
+3342; [7A 42, 05, 30][0D 6F, 05, 2E][7A 66, 05, 31]
+333D; [7A 42, 05, 30][, B0, 2E][7A 08, 05, 33][7A 66, 05, 31][7A 2E, 05, 33]
1F200; [7A 42, 05, 30][7A 12, 05, 30]
333E; [7A 42, 05, 30][, AE, 2E][7A 58, 05, 30][7A 2E, 05, 33]
-333F; [7A 42, 05, 30][7A 66, 05, 2C]
-3340; [7A 42, 05, 30][, B0, 2E][7A 66, 05, 2C][7A 2E, 05, 33][, AE, 2E]
+333F; [7A 42, 05, 30][7A 66, 05, 31]
+3340; [7A 42, 05, 30][, B0, 2E][7A 66, 05, 31][7A 2E, 05, 33][, AE, 2E]
307E; [7A 44, 05, 85]
30DE; [7A 44, 05, 90]
@@ -39903,15 +40719,15 @@ FF8F; [7A 44, 05, 9B]
303C; [7A 44, 05, 03][7A 20, 05, 03]
3345; [7A 44, 05, 31][7A 2A, 05, 33][7A 3A, 05, 30]
3346; [7A 44, 05, 31][7A 58, 05, 30][7A 16, 05, 30]
-3347; [7A 44, 05, 31][7A 66, 05, 2C][7A 1E, 05, 30][7A 52, 05, 34][7A 66, 05, 2C]
+3347; [7A 44, 05, 31][7A 66, 05, 31][7A 1E, 05, 30][7A 52, 05, 34][7A 66, 05, 31]
307F; [7A 46, 05, 85]
30DF; [7A 46, 05, 90]
FF90; [7A 46, 05, 9B]
32EF; [7A 46, 05, 26]
-3348; [7A 46, 05, 31][7A 16, 05, 30][7A 5C, 05, 30][7A 66, 05, 2C]
+3348; [7A 46, 05, 31][7A 16, 05, 30][7A 5C, 05, 30][7A 66, 05, 31]
3349; [7A 46, 05, 31][7A 56, 05, 33]
-334A; [7A 46, 05, 31][7A 56, 05, 33][7A 3A, 05, 30][, AE, 2E][0D 68, 05, 2E][7A 58, 05, 30]
+334A; [7A 46, 05, 31][7A 56, 05, 33][7A 3A, 05, 30][, AE, 2E][0D 6F, 05, 2E][7A 58, 05, 30]
3080; [7A 48, 05, 85]
31FA; [7A 48, 05, 10]
@@ -39923,9 +40739,9 @@ FF91; [7A 48, 05, A0]
30E1; [7A 4A, 05, 90]
FF92; [7A 4A, 05, 9B]
32F1; [7A 4A, 05, 26]
-334D; [7A 4A, 05, 31][0D 68, 05, 2E][7A 2E, 05, 33][7A 58, 05, 30]
+334D; [7A 4A, 05, 31][0D 6F, 05, 2E][7A 2E, 05, 33][7A 58, 05, 30]
334B; [7A 4A, 05, 31][7A 12, 05, 30][, AE, 2E]
-334C; [7A 4A, 05, 31][7A 12, 05, 30][, AE, 2E][7A 2E, 05, 33][7A 66, 05, 2C]
+334C; [7A 4A, 05, 31][7A 12, 05, 30][, AE, 2E][7A 2E, 05, 33][7A 66, 05, 31]
3082; [7A 4C, 05, 85]
30E2; [7A 4C, 05, 90]
@@ -39939,8 +40755,8 @@ FF6C; [7A 4E, 05, 17]
30E4; [7A 4E, 05, 9E]
FF94; [7A 4E, 05, A5]
32F3; [7A 4E, 05, 2C]
-334E; [7A 4E, 05, 33][0D 68, 05, 2E][7A 2E, 05, 33][, AE, 2E]
-334F; [7A 4E, 05, 33][0D 68, 05, 2E][7A 58, 05, 30]
+334E; [7A 4E, 05, 33][0D 6F, 05, 2E][7A 2E, 05, 33][, AE, 2E]
+334F; [7A 4E, 05, 33][0D 6F, 05, 2E][7A 58, 05, 30]
3085; [7A 50, 05, 03]
3086; [7A 50, 05, 85]
@@ -39949,7 +40765,7 @@ FF6D; [7A 50, 05, 17]
30E6; [7A 50, 05, 9E]
FF95; [7A 50, 05, A5]
32F4; [7A 50, 05, 2C]
-3350; [7A 50, 05, 33][7A 06, 05, 33][7A 66, 05, 2C]
+3350; [7A 50, 05, 33][7A 06, 05, 33][7A 66, 05, 31]
3087; [7A 52, 05, 03]
3088; [7A 52, 05, 85]
@@ -39979,8 +40795,8 @@ FF98; [7A 56, 05, 9E]
30EB; [7A 58, 05, 98]
FF99; [7A 58, 05, A0]
32F8; [7A 58, 05, 28]
-3354; [7A 58, 05, 30][0D 68, 05, 2E][7A 3E, 05, 30][, AE, 2E][7A 58, 05, 30]
-3353; [7A 58, 05, 30][7A 3C, 05, 30][, B0, 2E][0D 68, 05, 2E]
+3354; [7A 58, 05, 30][0D 6F, 05, 2E][7A 3E, 05, 30][, AE, 2E][7A 58, 05, 30]
+3353; [7A 58, 05, 30][7A 3C, 05, 30][, B0, 2E][0D 6F, 05, 2E]
308C; [7A 5A, 05, 85]
31FE; [7A 5A, 05, 10]
@@ -39988,7 +40804,7 @@ FF99; [7A 58, 05, A0]
FF9A; [7A 5A, 05, A0]
32F9; [7A 5A, 05, 28]
3355; [7A 5A, 05, 30][7A 48, 05, 30]
-3356; [7A 5A, 05, 30][7A 66, 05, 2C][7A 2E, 05, 33][7A 18, 05, 30][, AE, 2E][7A 66, 05, 2C]
+3356; [7A 5A, 05, 30][7A 66, 05, 31][7A 2E, 05, 33][7A 18, 05, 30][, AE, 2E][7A 66, 05, 31]
308D; [7A 5C, 05, 85]
31FF; [7A 5C, 05, 10]
@@ -40005,25 +40821,32 @@ FF9C; [7A 5E, 05, A0]
30F7; [7A 5E, 05, 98][, AE, 05]
3357; [7A 5E, 05, 30][7A 2A, 05, 33][7A 2E, 05, 33]
+1B150; [7A 60, 05, 03]
3090; [7A 60, 05, 85]
-30F0; [7A 60, 05, A0]
-32FC; [7A 60, 05, 2E]
-30F8; [7A 60, 05, A0][, AE, 05]
+1B164; [7A 60, 05, 10]
+30F0; [7A 60, 05, 9E]
+32FC; [7A 60, 05, 2C]
+30F8; [7A 60, 05, 9E][, AE, 05]
+1B151; [7A 62, 05, 03]
3091; [7A 62, 05, 85]
-30F1; [7A 62, 05, A0]
-32FD; [7A 62, 05, 2E]
-30F9; [7A 62, 05, A0][, AE, 05]
+1B165; [7A 62, 05, 10]
+30F1; [7A 62, 05, 9E]
+32FD; [7A 62, 05, 2C]
+30F9; [7A 62, 05, 9E][, AE, 05]
+1B152; [7A 64, 05, 03]
3092; [7A 64, 05, 85]
-30F2; [7A 64, 05, 90]
-FF66; [7A 64, 05, 9E]
-32FE; [7A 64, 05, 2C]
-30FA; [7A 64, 05, 90][, AE, 05]
+1B166; [7A 64, 05, 10]
+30F2; [7A 64, 05, 9B]
+FF66; [7A 64, 05, A6]
+32FE; [7A 64, 05, 31]
+30FA; [7A 64, 05, 9B][, AE, 05]
3093; [7A 66, 05, 85]
-30F3; [7A 66, 05, 90]
-FF9D; [7A 66, 05, 9E]
+1B167; [7A 66, 05, 10]
+30F3; [7A 66, 05, 9B]
+FF9D; [7A 66, 05, A6]
1B002; [7A 68 02, 05, 05]
@@ -43157,6 +43980,8 @@ FDD1 16F00; [7B 91 02, 05, 05] # Miao first primary (compressible)
16F03; [7B 91 1E, 05, 05]
+16F45; [7B 91 25, 05, 05]
+
16F04; [7B 93, 05, 05]
16F06; [7B 93, 05, 20]
@@ -43176,9 +44001,13 @@ FDD1 16F00; [7B 91 02, 05, 05] # Miao first primary (compressible)
16F0D; [7B 95 33, 05, 05]
-16F0E; [7B 95 3A, 05, 05]
+16F48; [7B 95 3A, 05, 05]
-16F0F; [7B 95 41, 05, 05]
+16F0E; [7B 95 41, 05, 05]
+
+16F0F; [7B 95 48, 05, 05]
+
+16F4A; [7B 95 4F, 05, 05]
16F10; [7B 97, 05, 05]
16F13; [7B 97, 05, 20]
@@ -43248,25 +44077,31 @@ FDD1 16F00; [7B 91 02, 05, 05] # Miao first primary (compressible)
16F32; [7B 9D 5D, 05, 05]
-16F33; [7B 9D 64, 05, 05]
+16F47; [7B 9D 64, 05, 05]
+
+16F33; [7B 9D 6B, 05, 05]
+
+16F46; [7B 9D 72, 05, 05]
-16F34; [7B 9D 6B, 05, 05]
+16F34; [7B 9D 79, 05, 05]
-16F35; [7B 9D 72, 05, 05]
+16F35; [7B 9D 80, 05, 05]
-16F36; [7B 9D 79, 05, 05]
+16F36; [7B 9D 87, 05, 05]
-16F37; [7B 9D 80, 05, 05]
+16F37; [7B 9D 8E, 05, 05]
-16F38; [7B 9D 87, 05, 05]
+16F38; [7B 9D 95, 05, 05]
-16F39; [7B 9D 8E, 05, 05]
+16F39; [7B 9D 9C, 05, 05]
-16F3A; [7B 9D 95, 05, 05]
+16F49; [7B 9D A3, 05, 05]
-16F3B; [7B 9D 9C, 05, 05]
+16F3A; [7B 9D AA, 05, 05]
-16F3C; [7B 9D A3, 05, 05]
+16F3B; [7B 9D B1, 05, 05]
+
+16F3C; [7B 9D B8, 05, 05]
16F3D; [7B 9F, 05, 05]
16F3F; [7B 9F, 05, 20]
@@ -43291,865 +44126,1079 @@ FDD1 16F00; [7B 91 02, 05, 05] # Miao first primary (compressible)
16F53; [7B A1 41, 05, 05]
-16F54; [7B A1 48, 05, 05]
+16F4F; [7B A1 48, 05, 05]
+
+16F54; [7B A1 4F, 05, 05]
+
+16F55; [7B A1 56, 05, 05]
+
+16F56; [7B A1 5D, 05, 05]
+
+16F57; [7B A1 64, 05, 05]
+
+16F58; [7B A1 6B, 05, 05]
+
+16F81; [7B A1 72, 05, 05]
+
+16F59; [7B A1 79, 05, 05]
+
+16F5A; [7B A1 80, 05, 05]
+
+16F5B; [7B A1 87, 05, 05]
+
+16F5C; [7B A1 8E, 05, 05]
+
+16F83; [7B A1 95, 05, 05]
+
+16F5D; [7B A1 9C, 05, 05]
+
+16F5E; [7B A1 A3, 05, 05]
+
+16F5F; [7B A1 AA, 05, 05]
+
+16F60; [7B A1 B1, 05, 05]
+
+16F84; [7B A1 B8, 05, 05]
-16F55; [7B A1 4F, 05, 05]
+16F61; [7B A1 BF, 05, 05]
-16F56; [7B A1 56, 05, 05]
+16F62; [7B A1 C6, 05, 05]
-16F57; [7B A1 5D, 05, 05]
+16F63; [7B A1 CD, 05, 05]
-16F58; [7B A1 64, 05, 05]
+16F64; [7B A1 D4, 05, 05]
-16F59; [7B A1 6B, 05, 05]
+16F65; [7B A1 DB, 05, 05]
-16F5A; [7B A1 72, 05, 05]
+16F86; [7B A1 E2, 05, 05]
-16F5B; [7B A1 79, 05, 05]
+16F66; [7B A1 E9, 05, 05]
-16F5C; [7B A1 80, 05, 05]
+16F67; [7B A1 F0, 05, 05]
-16F5D; [7B A1 87, 05, 05]
+16F68; [7B A1 F7, 05, 05]
-16F5E; [7B A1 8E, 05, 05]
+16F69; [7B A1 FE, 05, 05]
-16F5F; [7B A1 95, 05, 05]
+16F6A; [7B A2 07, 05, 05]
-16F60; [7B A1 9C, 05, 05]
+16F6B; [7B A2 0E, 05, 05]
-16F61; [7B A1 A3, 05, 05]
+16F6C; [7B A2 15, 05, 05]
-16F62; [7B A1 AA, 05, 05]
+16F6D; [7B A2 1C, 05, 05]
-16F63; [7B A1 B1, 05, 05]
+16F7F; [7B A2 23, 05, 05]
-16F64; [7B A1 B8, 05, 05]
+16F87; [7B A2 2A, 05, 05]
-16F65; [7B A1 BF, 05, 05]
+16F6E; [7B A2 31, 05, 05]
-16F66; [7B A1 C6, 05, 05]
+16F6F; [7B A2 38, 05, 05]
-16F67; [7B A1 CD, 05, 05]
+16F70; [7B A2 3F, 05, 05]
-16F68; [7B A1 D4, 05, 05]
+16F71; [7B A2 46, 05, 05]
-16F69; [7B A1 DB, 05, 05]
+16F72; [7B A2 4D, 05, 05]
-16F6A; [7B A1 E2, 05, 05]
+16F80; [7B A2 54, 05, 05]
-16F6B; [7B A1 E9, 05, 05]
+16F73; [7B A2 5B, 05, 05]
-16F6C; [7B A1 F0, 05, 05]
+16F74; [7B A2 62, 05, 05]
-16F6D; [7B A1 F7, 05, 05]
+16F85; [7B A2 69, 05, 05]
-16F6E; [7B A1 FE, 05, 05]
+16F82; [7B A2 70, 05, 05]
-16F6F; [7B A2 07, 05, 05]
+16F75; [7B A2 77, 05, 05]
-16F70; [7B A2 0E, 05, 05]
+16F76; [7B A2 7E, 05, 05]
-16F71; [7B A2 15, 05, 05]
+16F77; [7B A2 85, 05, 05]
-16F72; [7B A2 1C, 05, 05]
+16F78; [7B A2 8C, 05, 05]
-16F73; [7B A2 23, 05, 05]
+16F79; [7B A2 93, 05, 05]
-16F74; [7B A2 2A, 05, 05]
+16F7A; [7B A2 9A, 05, 05]
-16F75; [7B A2 31, 05, 05]
+16F7B; [7B A2 A1, 05, 05]
-16F76; [7B A2 38, 05, 05]
+16F7C; [7B A2 A8, 05, 05]
-16F77; [7B A2 3F, 05, 05]
+16F7D; [7B A2 AF, 05, 05]
-16F78; [7B A2 46, 05, 05]
+16F7E; [7B A2 B6, 05, 05]
-16F79; [7B A2 4D, 05, 05]
+16F8F; [7B A2 BD, 05, 05]
-16F7A; [7B A2 54, 05, 05]
+16F90; [7B A2 C4, 05, 05]
-16F7B; [7B A2 5B, 05, 05]
+16F91; [7B A2 CB, 05, 05]
-16F7C; [7B A2 62, 05, 05]
+16F92; [7B A2 D2, 05, 05]
-16F7D; [7B A2 69, 05, 05]
+16F93; [7B A2 D9, 05, 05]
-16F7E; [7B A2 70, 05, 05]
+16F94; [7B A2 E0, 05, 05]
-16F8F; [7B A2 77, 05, 05]
+16F95; [7B A2 E7, 05, 05]
-16F90; [7B A2 7E, 05, 05]
+16F96; [7B A2 EE, 05, 05]
-16F91; [7B A2 85, 05, 05]
+16F97; [7B A2 F5, 05, 05]
-16F92; [7B A2 8C, 05, 05]
+16F98; [7B A2 FC, 05, 05]
-16F93; [7B A2 93, 05, 05]
+16F99; [7B A3 05, 05, 05]
-16F94; [7B A2 9A, 05, 05]
+16F9A; [7B A3 0C, 05, 05]
-16F95; [7B A2 A1, 05, 05]
+16F9B; [7B A3 13, 05, 05]
-16F96; [7B A2 A8, 05, 05]
+16F9C; [7B A3 1A, 05, 05]
-16F97; [7B A2 AF, 05, 05]
+16F9D; [7B A3 21, 05, 05]
-16F98; [7B A2 B6, 05, 05]
+16F9E; [7B A3 28, 05, 05]
-16F99; [7B A2 BD, 05, 05]
+16F9F; [7B A3 2F, 05, 05]
-16F9A; [7B A2 C4, 05, 05]
+FDD1 118B4; [7B A4 02, 05, 05] # Warang_Citi first primary (compressible)
-16F9B; [7B A2 CB, 05, 05]
+118FF; [7B A4 09, 05, 05]
-16F9C; [7B A2 D2, 05, 05]
+118C0; [7B A6, 05, 05]
+118A0; [7B A6, 05, A0]
-16F9D; [7B A2 D9, 05, 05]
+118C1; [7B A8, 05, 05]
+118A1; [7B A8, 05, A0]
-16F9E; [7B A2 E0, 05, 05]
+118C2; [7B AA, 05, 05]
+118A2; [7B AA, 05, A0]
-16F9F; [7B A2 E7, 05, 05]
+118C3; [7B AC, 05, 05]
+118A3; [7B AC, 05, A0]
-FDD1 118B4; [7B A3 02, 05, 05] # Warang_Citi first primary (compressible)
+118C4; [7B AE, 05, 05]
+118A4; [7B AE, 05, A0]
-118FF; [7B A3 09, 05, 05]
+118C5; [7B B0, 05, 05]
+118A5; [7B B0, 05, A0]
-118C0; [7B A5, 05, 05]
-118A0; [7B A5, 05, A0]
+118C6; [7B B2, 05, 05]
+118A6; [7B B2, 05, A0]
-118C1; [7B A7, 05, 05]
-118A1; [7B A7, 05, A0]
+118C7; [7B B4, 05, 05]
+118A7; [7B B4, 05, A0]
-118C2; [7B A9, 05, 05]
-118A2; [7B A9, 05, A0]
+118C8; [7B B6, 05, 05]
+118A8; [7B B6, 05, A0]
-118C3; [7B AB, 05, 05]
-118A3; [7B AB, 05, A0]
+118C9; [7B B8, 05, 05]
+118A9; [7B B8, 05, A0]
-118C4; [7B AD, 05, 05]
-118A4; [7B AD, 05, A0]
+118CA; [7B BA, 05, 05]
+118AA; [7B BA, 05, A0]
-118C5; [7B AF, 05, 05]
-118A5; [7B AF, 05, A0]
+118CB; [7B BC, 05, 05]
+118AB; [7B BC, 05, A0]
-118C6; [7B B1, 05, 05]
-118A6; [7B B1, 05, A0]
+118CC; [7B BE, 05, 05]
+118AC; [7B BE, 05, A0]
-118C7; [7B B3, 05, 05]
-118A7; [7B B3, 05, A0]
+118CD; [7B C0, 05, 05]
+118AD; [7B C0, 05, A0]
-118C8; [7B B5, 05, 05]
-118A8; [7B B5, 05, A0]
+118CE; [7B C2, 05, 05]
+118AE; [7B C2, 05, A0]
-118C9; [7B B7, 05, 05]
-118A9; [7B B7, 05, A0]
+118CF; [7B C4, 05, 05]
+118AF; [7B C4, 05, A0]
-118CA; [7B B9, 05, 05]
-118AA; [7B B9, 05, A0]
+118D0; [7B C6, 05, 05]
+118B0; [7B C6, 05, A0]
-118CB; [7B BB, 05, 05]
-118AB; [7B BB, 05, A0]
+118D1; [7B C8, 05, 05]
+118B1; [7B C8, 05, A0]
-118CC; [7B BD, 05, 05]
-118AC; [7B BD, 05, A0]
+118D2; [7B CA, 05, 05]
+118B2; [7B CA, 05, A0]
-118CD; [7B BF, 05, 05]
-118AD; [7B BF, 05, A0]
+118D3; [7B CC, 05, 05]
+118B3; [7B CC, 05, A0]
-118CE; [7B C1, 05, 05]
-118AE; [7B C1, 05, A0]
+118D4; [7B CE, 05, 05]
+118B4; [7B CE, 05, A0]
-118CF; [7B C3, 05, 05]
-118AF; [7B C3, 05, A0]
+118D5; [7B D0, 05, 05]
+118B5; [7B D0, 05, A0]
-118D0; [7B C5, 05, 05]
-118B0; [7B C5, 05, A0]
+118D6; [7B D2, 05, 05]
+118B6; [7B D2, 05, A0]
-118D1; [7B C7, 05, 05]
-118B1; [7B C7, 05, A0]
+118D7; [7B D4, 05, 05]
+118B7; [7B D4, 05, A0]
-118D2; [7B C9, 05, 05]
-118B2; [7B C9, 05, A0]
+118D8; [7B D6, 05, 05]
+118B8; [7B D6, 05, A0]
-118D3; [7B CB, 05, 05]
-118B3; [7B CB, 05, A0]
+118D9; [7B D8, 05, 05]
+118B9; [7B D8, 05, A0]
-118D4; [7B CD, 05, 05]
-118B4; [7B CD, 05, A0]
+118DA; [7B DA, 05, 05]
+118BA; [7B DA, 05, A0]
-118D5; [7B CF, 05, 05]
-118B5; [7B CF, 05, A0]
+118DB; [7B DC, 05, 05]
+118BB; [7B DC, 05, A0]
-118D6; [7B D1, 05, 05]
-118B6; [7B D1, 05, A0]
+118DC; [7B DE, 05, 05]
+118BC; [7B DE, 05, A0]
-118D7; [7B D3, 05, 05]
-118B7; [7B D3, 05, A0]
+118DD; [7B E0, 05, 05]
+118BD; [7B E0, 05, A0]
-118D8; [7B D5, 05, 05]
-118B8; [7B D5, 05, A0]
+118DE; [7B E2, 05, 05]
+118BE; [7B E2, 05, A0]
-118D9; [7B D7, 05, 05]
-118B9; [7B D7, 05, A0]
+118DF; [7B E4, 05, 05]
+118BF; [7B E4, 05, A0]
-118DA; [7B D9, 05, 05]
-118BA; [7B D9, 05, A0]
+FDD1 11AC0; [7B E6 02, 05, 05] # Pau_Cin_Hau first primary (compressible)
-118DB; [7B DB, 05, 05]
-118BB; [7B DB, 05, A0]
+11AD5; [7B E6 09, 05, 05]
-118DC; [7B DD, 05, 05]
-118BC; [7B DD, 05, A0]
+11AD6; [7B E6 10, 05, 05]
-118DD; [7B DF, 05, 05]
-118BD; [7B DF, 05, A0]
+11AD7; [7B E6 17, 05, 05]
-118DE; [7B E1, 05, 05]
-118BE; [7B E1, 05, A0]
+11AD8; [7B E6 1E, 05, 05]
-118DF; [7B E3, 05, 05]
-118BF; [7B E3, 05, A0]
+11AD9; [7B E6 25, 05, 05]
-FDD1 11AC0; [7B E5 02, 05, 05] # Pau_Cin_Hau first primary (compressible)
+11ADA; [7B E6 2C, 05, 05]
-11AD5; [7B E5 09, 05, 05]
+11ADB; [7B E6 33, 05, 05]
-11AD6; [7B E5 10, 05, 05]
+11AC0; [7B E6 3A, 05, 05]
-11AD7; [7B E5 17, 05, 05]
+11AC1; [7B E6 41, 05, 05]
-11AD8; [7B E5 1E, 05, 05]
+11AC2; [7B E6 48, 05, 05]
-11AD9; [7B E5 25, 05, 05]
+11AC3; [7B E6 4F, 05, 05]
-11ADA; [7B E5 2C, 05, 05]
+11AC4; [7B E6 56, 05, 05]
-11ADB; [7B E5 33, 05, 05]
+11AC5; [7B E6 5D, 05, 05]
-11AC0; [7B E5 3A, 05, 05]
+11AC6; [7B E6 64, 05, 05]
-11AC1; [7B E5 41, 05, 05]
+11AC7; [7B E6 6B, 05, 05]
-11AC2; [7B E5 48, 05, 05]
+11AC8; [7B E6 72, 05, 05]
-11AC3; [7B E5 4F, 05, 05]
+11AC9; [7B E6 79, 05, 05]
-11AC4; [7B E5 56, 05, 05]
+11ACA; [7B E6 80, 05, 05]
-11AC5; [7B E5 5D, 05, 05]
+11ACB; [7B E6 87, 05, 05]
-11AC6; [7B E5 64, 05, 05]
+11ACC; [7B E6 8E, 05, 05]
-11AC7; [7B E5 6B, 05, 05]
+11ACD; [7B E6 95, 05, 05]
-11AC8; [7B E5 72, 05, 05]
+11ACE; [7B E6 9C, 05, 05]
-11AC9; [7B E5 79, 05, 05]
+11ACF; [7B E6 A3, 05, 05]
-11ACA; [7B E5 80, 05, 05]
+11AD0; [7B E6 AA, 05, 05]
-11ACB; [7B E5 87, 05, 05]
+11AD1; [7B E6 B1, 05, 05]
-11ACC; [7B E5 8E, 05, 05]
+11AD2; [7B E6 B8, 05, 05]
-11ACD; [7B E5 95, 05, 05]
+11AD3; [7B E6 BF, 05, 05]
-11ACE; [7B E5 9C, 05, 05]
+11AD4; [7B E6 C6, 05, 05]
-11ACF; [7B E5 A3, 05, 05]
+11ADC; [7B E6 CD, 05, 05]
-11AD0; [7B E5 AA, 05, 05]
+11ADD; [7B E6 D4, 05, 05]
-11AD1; [7B E5 B1, 05, 05]
+11ADF; [7B E6 DB, 05, 05]
-11AD2; [7B E5 B8, 05, 05]
+11AE0; [7B E6 E2, 05, 05]
-11AD3; [7B E5 BF, 05, 05]
+11AE1; [7B E6 E9, 05, 05]
-11AD4; [7B E5 C6, 05, 05]
+11AE2; [7B E6 F0, 05, 05]
-11ADC; [7B E5 CD, 05, 05]
+11AE3; [7B E6 F7, 05, 05]
-11ADD; [7B E5 D4, 05, 05]
+11ADE; [7B E6 FE, 05, 05]
-11ADF; [7B E5 DB, 05, 05]
+11AE4; [7B E7 07, 05, 05]
-11AE0; [7B E5 E2, 05, 05]
+11AEF; [7B E7 0E, 05, 05]
-11AE1; [7B E5 E9, 05, 05]
+11AF2; [7B E7 15, 05, 05]
-11AE2; [7B E5 F0, 05, 05]
+11AF1; [7B E7 1C, 05, 05]
-11AE3; [7B E5 F7, 05, 05]
+11AE6; [7B E7 23, 05, 05]
-11ADE; [7B E5 FE, 05, 05]
+11AE9; [7B E7 2A, 05, 05]
-11AE4; [7B E6 07, 05, 05]
+11AE5; [7B E7 31, 05, 05]
-11AEF; [7B E6 0E, 05, 05]
+11AE8; [7B E7 38, 05, 05]
-11AF2; [7B E6 15, 05, 05]
+11AF4; [7B E7 3F, 05, 05]
-11AF1; [7B E6 1C, 05, 05]
+11AF7; [7B E7 46, 05, 05]
-11AE6; [7B E6 23, 05, 05]
+11AF3; [7B E7 4D, 05, 05]
-11AE9; [7B E6 2A, 05, 05]
+11AF6; [7B E7 54, 05, 05]
-11AE5; [7B E6 31, 05, 05]
+11AEC; [7B E7 5B, 05, 05]
-11AE8; [7B E6 38, 05, 05]
+11AEE; [7B E7 62, 05, 05]
-11AF4; [7B E6 3F, 05, 05]
+11AEB; [7B E7 69, 05, 05]
-11AF7; [7B E6 46, 05, 05]
+11AED; [7B E7 70, 05, 05]
-11AF3; [7B E6 4D, 05, 05]
+11AF5; [7B E7 77, 05, 05]
-11AF6; [7B E6 54, 05, 05]
+11AF8; [7B E7 7E, 05, 05]
-11AEC; [7B E6 5B, 05, 05]
+11AE7; [7B E7 85, 05, 05]
-11AEE; [7B E6 62, 05, 05]
+11AEA; [7B E7 8C, 05, 05]
-11AEB; [7B E6 69, 05, 05]
+11AF0; [7B E7 93, 05, 05]
-11AED; [7B E6 70, 05, 05]
+FDD1 16B1C; [7B E8 02, 05, 05] # Pahawh_Hmong first primary (compressible)
-11AF5; [7B E6 77, 05, 05]
+16B00; [7B E8 09, 05, 05]
-11AF8; [7B E6 7E, 05, 05]
+16B01; [7B E8 10, 05, 05]
-11AE7; [7B E6 85, 05, 05]
+16B02; [7B E8 17, 05, 05]
-11AEA; [7B E6 8C, 05, 05]
+16B03; [7B E8 1E, 05, 05]
-11AF0; [7B E6 93, 05, 05]
+16B04; [7B E8 25, 05, 05]
-FDD1 16B1C; [7B E7 02, 05, 05] # Pahawh_Hmong first primary (compressible)
+16B05; [7B E8 2C, 05, 05]
-16B00; [7B E7 09, 05, 05]
+16B06; [7B E8 33, 05, 05]
-16B01; [7B E7 10, 05, 05]
+16B07; [7B E8 3A, 05, 05]
-16B02; [7B E7 17, 05, 05]
+16B08; [7B E8 41, 05, 05]
-16B03; [7B E7 1E, 05, 05]
+16B09; [7B E8 48, 05, 05]
-16B04; [7B E7 25, 05, 05]
+16B0A; [7B E8 4F, 05, 05]
-16B05; [7B E7 2C, 05, 05]
+16B0B; [7B E8 56, 05, 05]
-16B06; [7B E7 33, 05, 05]
+16B0C; [7B E8 5D, 05, 05]
-16B07; [7B E7 3A, 05, 05]
+16B0D; [7B E8 64, 05, 05]
-16B08; [7B E7 41, 05, 05]
+16B0E; [7B E8 6B, 05, 05]
-16B09; [7B E7 48, 05, 05]
+16B0F; [7B E8 72, 05, 05]
-16B0A; [7B E7 4F, 05, 05]
+16B10; [7B E8 79, 05, 05]
-16B0B; [7B E7 56, 05, 05]
+16B11; [7B E8 80, 05, 05]
-16B0C; [7B E7 5D, 05, 05]
+16B12; [7B E8 87, 05, 05]
-16B0D; [7B E7 64, 05, 05]
+16B13; [7B E8 8E, 05, 05]
-16B0E; [7B E7 6B, 05, 05]
+16B14; [7B E8 95, 05, 05]
-16B0F; [7B E7 72, 05, 05]
+16B15; [7B E8 9C, 05, 05]
-16B10; [7B E7 79, 05, 05]
+16B16; [7B E8 A3, 05, 05]
-16B11; [7B E7 80, 05, 05]
+16B17; [7B E8 AA, 05, 05]
-16B12; [7B E7 87, 05, 05]
+16B18; [7B E8 B1, 05, 05]
-16B13; [7B E7 8E, 05, 05]
+16B19; [7B E8 B8, 05, 05]
-16B14; [7B E7 95, 05, 05]
+16B1A; [7B E8 BF, 05, 05]
-16B15; [7B E7 9C, 05, 05]
+16B1B; [7B E8 C6, 05, 05]
-16B16; [7B E7 A3, 05, 05]
+16B1C; [7B E8 CD, 05, 05]
-16B17; [7B E7 AA, 05, 05]
+16B1D; [7B E8 D4, 05, 05]
-16B18; [7B E7 B1, 05, 05]
+16B1E; [7B E8 DB, 05, 05]
-16B19; [7B E7 B8, 05, 05]
+16B1F; [7B E8 E2, 05, 05]
-16B1A; [7B E7 BF, 05, 05]
+16B20; [7B E8 E9, 05, 05]
-16B1B; [7B E7 C6, 05, 05]
+16B21; [7B E8 F0, 05, 05]
-16B1C; [7B E7 CD, 05, 05]
+16B22; [7B E8 F7, 05, 05]
-16B1D; [7B E7 D4, 05, 05]
+16B23; [7B E8 FE, 05, 05]
-16B1E; [7B E7 DB, 05, 05]
+16B24; [7B E9 07, 05, 05]
-16B1F; [7B E7 E2, 05, 05]
+16B25; [7B E9 0E, 05, 05]
-16B20; [7B E7 E9, 05, 05]
+16B26; [7B E9 15, 05, 05]
-16B21; [7B E7 F0, 05, 05]
+16B27; [7B E9 1C, 05, 05]
-16B22; [7B E7 F7, 05, 05]
+16B28; [7B E9 23, 05, 05]
-16B23; [7B E7 FE, 05, 05]
+16B29; [7B E9 2A, 05, 05]
-16B24; [7B E8 07, 05, 05]
+16B2A; [7B E9 31, 05, 05]
-16B25; [7B E8 0E, 05, 05]
+16B2B; [7B E9 38, 05, 05]
-16B26; [7B E8 15, 05, 05]
+16B2C; [7B E9 3F, 05, 05]
-16B27; [7B E8 1C, 05, 05]
+16B2D; [7B E9 46, 05, 05]
-16B28; [7B E8 23, 05, 05]
+16B2E; [7B E9 4D, 05, 05]
-16B29; [7B E8 2A, 05, 05]
+16B2F; [7B E9 54, 05, 05]
-16B2A; [7B E8 31, 05, 05]
+16B40; [7B E9 5B, 05, 05]
-16B2B; [7B E8 38, 05, 05]
+16B41; [7B E9 62, 05, 05]
-16B2C; [7B E8 3F, 05, 05]
+16B63; [7B E9 69, 05, 05]
-16B2D; [7B E8 46, 05, 05]
+16B64; [7B E9 70, 05, 05]
-16B2E; [7B E8 4D, 05, 05]
+16B65; [7B E9 77, 05, 05]
-16B2F; [7B E8 54, 05, 05]
+16B66; [7B E9 7E, 05, 05]
-16B40; [7B E8 5B, 05, 05]
+16B67; [7B E9 85, 05, 05]
-16B41; [7B E8 62, 05, 05]
+16B68; [7B E9 8C, 05, 05]
-16B63; [7B E8 69, 05, 05]
+16B69; [7B E9 93, 05, 05]
-16B64; [7B E8 70, 05, 05]
+16B6A; [7B E9 9A, 05, 05]
-16B65; [7B E8 77, 05, 05]
+16B6B; [7B E9 A1, 05, 05]
-16B66; [7B E8 7E, 05, 05]
+16B6C; [7B E9 A8, 05, 05]
-16B67; [7B E8 85, 05, 05]
+16B6D; [7B E9 AF, 05, 05]
-16B68; [7B E8 8C, 05, 05]
+16B6E; [7B E9 B6, 05, 05]
-16B69; [7B E8 93, 05, 05]
+16B6F; [7B E9 BD, 05, 05]
-16B6A; [7B E8 9A, 05, 05]
+16B70; [7B E9 C4, 05, 05]
-16B6B; [7B E8 A1, 05, 05]
+16B71; [7B E9 CB, 05, 05]
-16B6C; [7B E8 A8, 05, 05]
+16B72; [7B E9 D2, 05, 05]
-16B6D; [7B E8 AF, 05, 05]
+16B73; [7B E9 D9, 05, 05]
-16B6E; [7B E8 B6, 05, 05]
+16B74; [7B E9 E0, 05, 05]
-16B6F; [7B E8 BD, 05, 05]
+16B75; [7B E9 E7, 05, 05]
-16B70; [7B E8 C4, 05, 05]
+16B76; [7B E9 EE, 05, 05]
-16B71; [7B E8 CB, 05, 05]
+16B77; [7B E9 F5, 05, 05]
-16B72; [7B E8 D2, 05, 05]
+16B7D; [7B E9 FC, 05, 05]
-16B73; [7B E8 D9, 05, 05]
+16B7E; [7B EA 05, 05, 05]
-16B74; [7B E8 E0, 05, 05]
+16B7F; [7B EA 0C, 05, 05]
-16B75; [7B E8 E7, 05, 05]
+16B80; [7B EA 13, 05, 05]
-16B76; [7B E8 EE, 05, 05]
+16B81; [7B EA 1A, 05, 05]
-16B77; [7B E8 F5, 05, 05]
+16B82; [7B EA 21, 05, 05]
-16B7D; [7B E8 FC, 05, 05]
+16B83; [7B EA 28, 05, 05]
-16B7E; [7B E9 05, 05, 05]
+16B84; [7B EA 2F, 05, 05]
-16B7F; [7B E9 0C, 05, 05]
+16B85; [7B EA 36, 05, 05]
-16B80; [7B E9 13, 05, 05]
+16B86; [7B EA 3D, 05, 05]
-16B81; [7B E9 1A, 05, 05]
+16B87; [7B EA 44, 05, 05]
-16B82; [7B E9 21, 05, 05]
+16B88; [7B EA 4B, 05, 05]
-16B83; [7B E9 28, 05, 05]
+16B89; [7B EA 52, 05, 05]
-16B84; [7B E9 2F, 05, 05]
+16B8A; [7B EA 59, 05, 05]
-16B85; [7B E9 36, 05, 05]
+16B8B; [7B EA 60, 05, 05]
-16B86; [7B E9 3D, 05, 05]
+16B8C; [7B EA 67, 05, 05]
-16B87; [7B E9 44, 05, 05]
+16B8D; [7B EA 6E, 05, 05]
-16B88; [7B E9 4B, 05, 05]
+16B8E; [7B EA 75, 05, 05]
-16B89; [7B E9 52, 05, 05]
+16B8F; [7B EA 7C, 05, 05]
-16B8A; [7B E9 59, 05, 05]
+FDD1 1E108; [7B EB 02, 05, 05] # Nyiakeng_Puachue_Hmong first primary (compressible)
-16B8B; [7B E9 60, 05, 05]
+1E100; [7B EB 09, 05, 05]
-16B8C; [7B E9 67, 05, 05]
+1E101; [7B EB 10, 05, 05]
-16B8D; [7B E9 6E, 05, 05]
+1E102; [7B EB 17, 05, 05]
-16B8E; [7B E9 75, 05, 05]
+1E103; [7B EB 1E, 05, 05]
-16B8F; [7B E9 7C, 05, 05]
+1E104; [7B EB 25, 05, 05]
-FDD1 10280; [7B EA 02, 05, 05] # Lycian first primary (compressible)
+1E105; [7B EB 2C, 05, 05]
-10280; [7B EA 09, 05, 05]
+1E106; [7B EB 33, 05, 05]
-10281; [7B EA 10, 05, 05]
+1E107; [7B EB 3A, 05, 05]
-10282; [7B EA 17, 05, 05]
+1E108; [7B EB 41, 05, 05]
-10283; [7B EA 1E, 05, 05]
+1E109; [7B EB 48, 05, 05]
-10284; [7B EA 25, 05, 05]
+1E10A; [7B EB 4F, 05, 05]
-10285; [7B EA 2C, 05, 05]
+1E10B; [7B EB 56, 05, 05]
-10286; [7B EA 33, 05, 05]
+1E10C; [7B EB 5D, 05, 05]
-10287; [7B EA 3A, 05, 05]
+1E10D; [7B EB 64, 05, 05]
-10288; [7B EA 41, 05, 05]
+1E10E; [7B EB 6B, 05, 05]
-10289; [7B EA 48, 05, 05]
+1E10F; [7B EB 72, 05, 05]
-1028A; [7B EA 4F, 05, 05]
+1E110; [7B EB 79, 05, 05]
-1028B; [7B EA 56, 05, 05]
+1E111; [7B EB 80, 05, 05]
-1028C; [7B EA 5D, 05, 05]
+1E112; [7B EB 87, 05, 05]
-1028D; [7B EA 64, 05, 05]
+1E113; [7B EB 8E, 05, 05]
-1028E; [7B EA 6B, 05, 05]
+1E114; [7B EB 95, 05, 05]
-1028F; [7B EA 72, 05, 05]
+1E115; [7B EB 9C, 05, 05]
-10290; [7B EA 79, 05, 05]
+1E116; [7B EB A3, 05, 05]
-10291; [7B EA 80, 05, 05]
+1E117; [7B EB AA, 05, 05]
-10292; [7B EA 87, 05, 05]
+1E118; [7B EB B1, 05, 05]
-10293; [7B EA 8E, 05, 05]
+1E119; [7B EB B8, 05, 05]
-10294; [7B EA 95, 05, 05]
+1E11A; [7B EB BF, 05, 05]
-10295; [7B EA 9C, 05, 05]
+1E11B; [7B EB C6, 05, 05]
-10296; [7B EA A3, 05, 05]
+1E11C; [7B EB CD, 05, 05]
-10297; [7B EA AA, 05, 05]
+1E11D; [7B EB D4, 05, 05]
-10298; [7B EA B1, 05, 05]
+1E11E; [7B EB DB, 05, 05]
-10299; [7B EA B8, 05, 05]
+1E11F; [7B EB E2, 05, 05]
-1029A; [7B EA BF, 05, 05]
+1E120; [7B EB E9, 05, 05]
-1029B; [7B EA C6, 05, 05]
+1E121; [7B EB F0, 05, 05]
-1029C; [7B EA CD, 05, 05]
+1E122; [7B EB F7, 05, 05]
-FDD1 102A0; [7B EB 02, 05, 05] # Carian first primary (compressible)
+1E123; [7B EB FE, 05, 05]
-102A0; [7B EB 09, 05, 05]
+1E124; [7B EC 07, 05, 05]
-102A1; [7B EB 10, 05, 05]
+1E125; [7B EC 0E, 05, 05]
-102A2; [7B EB 17, 05, 05]
+1E126; [7B EC 15, 05, 05]
-102A3; [7B EB 1E, 05, 05]
+1E127; [7B EC 1C, 05, 05]
-102A4; [7B EB 25, 05, 05]
+1E128; [7B EC 23, 05, 05]
-102A5; [7B EB 2C, 05, 05]
+1E129; [7B EC 2A, 05, 05]
-102A6; [7B EB 33, 05, 05]
+1E12A; [7B EC 31, 05, 05]
-102A7; [7B EB 3A, 05, 05]
+1E12B; [7B EC 38, 05, 05]
-102A8; [7B EB 41, 05, 05]
+1E12C; [7B EC 3F, 05, 05]
-102A9; [7B EB 48, 05, 05]
+1E137; [7B EC 46, 05, 05]
-102AA; [7B EB 4F, 05, 05]
+1E138; [7B EC 4D, 05, 05]
-102AB; [7B EB 56, 05, 05]
+1E139; [7B EC 54, 05, 05]
-102AC; [7B EB 5D, 05, 05]
+1E13A; [7B EC 5B, 05, 05]
-102AD; [7B EB 64, 05, 05]
+1E13B; [7B EC 62, 05, 05]
-102AE; [7B EB 6B, 05, 05]
+1E14E; [7B EC 69, 05, 05]
-102AF; [7B EB 72, 05, 05]
+FDD1 1E2E1; [7B ED 02, 05, 05] # Wancho first primary (compressible)
-102B0; [7B EB 79, 05, 05]
+1E2C0; [7B ED 09, 05, 05]
-102B1; [7B EB 80, 05, 05]
+1E2C1; [7B ED 10, 05, 05]
-102B2; [7B EB 87, 05, 05]
+1E2C2; [7B ED 17, 05, 05]
-102B3; [7B EB 8E, 05, 05]
+1E2C3; [7B ED 1E, 05, 05]
-102B4; [7B EB 95, 05, 05]
+1E2C4; [7B ED 25, 05, 05]
-102B5; [7B EB 9C, 05, 05]
+1E2C5; [7B ED 2C, 05, 05]
-102B6; [7B EB A3, 05, 05]
+1E2C6; [7B ED 33, 05, 05]
-102B7; [7B EB AA, 05, 05]
+1E2C7; [7B ED 3A, 05, 05]
-102B8; [7B EB B1, 05, 05]
+1E2C8; [7B ED 41, 05, 05]
-102B9; [7B EB B8, 05, 05]
+1E2C9; [7B ED 48, 05, 05]
-102BA; [7B EB BF, 05, 05]
+1E2CA; [7B ED 4F, 05, 05]
-102BB; [7B EB C6, 05, 05]
+1E2CB; [7B ED 56, 05, 05]
-102BC; [7B EB CD, 05, 05]
+1E2CC; [7B ED 5D, 05, 05]
-102BD; [7B EB D4, 05, 05]
+1E2CD; [7B ED 64, 05, 05]
-102BE; [7B EB DB, 05, 05]
+1E2CE; [7B ED 6B, 05, 05]
-102BF; [7B EB E2, 05, 05]
+1E2CF; [7B ED 72, 05, 05]
-102C0; [7B EB E9, 05, 05]
+1E2D0; [7B ED 79, 05, 05]
-102C1; [7B EB F0, 05, 05]
+1E2D1; [7B ED 80, 05, 05]
-102C2; [7B EB F7, 05, 05]
+1E2D2; [7B ED 87, 05, 05]
-102C3; [7B EB FE, 05, 05]
+1E2D3; [7B ED 8E, 05, 05]
-102C4; [7B EC 07, 05, 05]
+1E2D4; [7B ED 95, 05, 05]
-102C5; [7B EC 0E, 05, 05]
+1E2D5; [7B ED 9C, 05, 05]
-102C6; [7B EC 15, 05, 05]
+1E2D6; [7B ED A3, 05, 05]
-102C7; [7B EC 1C, 05, 05]
+1E2D7; [7B ED AA, 05, 05]
-102C8; [7B EC 23, 05, 05]
+1E2D8; [7B ED B1, 05, 05]
-102C9; [7B EC 2A, 05, 05]
+1E2D9; [7B ED B8, 05, 05]
-102CA; [7B EC 31, 05, 05]
+1E2DA; [7B ED BF, 05, 05]
-102CB; [7B EC 38, 05, 05]
+1E2DB; [7B ED C6, 05, 05]
-102CC; [7B EC 3F, 05, 05]
+1E2DC; [7B ED CD, 05, 05]
-102CD; [7B EC 46, 05, 05]
+1E2DD; [7B ED D4, 05, 05]
-102CE; [7B EC 4D, 05, 05]
+1E2DE; [7B ED DB, 05, 05]
-102CF; [7B EC 54, 05, 05]
+1E2DF; [7B ED E2, 05, 05]
-102D0; [7B EC 5B, 05, 05]
+1E2E0; [7B ED E9, 05, 05]
-FDD1 10920; [7B ED 02, 05, 05] # Lydian first primary (compressible)
+1E2E1; [7B ED F0, 05, 05]
-10920; [7B ED 09, 05, 05]
+1E2E2; [7B ED F7, 05, 05]
-10921; [7B ED 10, 05, 05]
+1E2E3; [7B ED FE, 05, 05]
-10922; [7B ED 17, 05, 05]
+1E2E4; [7B EE 07, 05, 05]
-10923; [7B ED 1E, 05, 05]
+1E2E5; [7B EE 0E, 05, 05]
-10924; [7B ED 25, 05, 05]
+1E2E6; [7B EE 15, 05, 05]
-10925; [7B ED 2C, 05, 05]
+1E2E7; [7B EE 1C, 05, 05]
-10926; [7B ED 33, 05, 05]
+1E2E8; [7B EE 23, 05, 05]
-10927; [7B ED 3A, 05, 05]
+1E2E9; [7B EE 2A, 05, 05]
-10928; [7B ED 41, 05, 05]
+1E2EA; [7B EE 31, 05, 05]
-10929; [7B ED 48, 05, 05]
+1E2EB; [7B EE 38, 05, 05]
-1092A; [7B ED 4F, 05, 05]
+FDD1 10280; [7B EF 02, 05, 05] # Lycian first primary (compressible)
-1092B; [7B ED 56, 05, 05]
+10280; [7B EF 09, 05, 05]
-1092C; [7B ED 5D, 05, 05]
+10281; [7B EF 10, 05, 05]
-1092D; [7B ED 64, 05, 05]
+10282; [7B EF 17, 05, 05]
-1092E; [7B ED 6B, 05, 05]
+10283; [7B EF 1E, 05, 05]
-1092F; [7B ED 72, 05, 05]
+10284; [7B EF 25, 05, 05]
-10930; [7B ED 79, 05, 05]
+10285; [7B EF 2C, 05, 05]
-10931; [7B ED 80, 05, 05]
+10286; [7B EF 33, 05, 05]
-10932; [7B ED 87, 05, 05]
+10287; [7B EF 3A, 05, 05]
-10933; [7B ED 8E, 05, 05]
+10288; [7B EF 41, 05, 05]
-10934; [7B ED 95, 05, 05]
+10289; [7B EF 48, 05, 05]
-10935; [7B ED 9C, 05, 05]
+1028A; [7B EF 4F, 05, 05]
-10936; [7B ED A3, 05, 05]
+1028B; [7B EF 56, 05, 05]
-10937; [7B ED AA, 05, 05]
+1028C; [7B EF 5D, 05, 05]
-10938; [7B ED B1, 05, 05]
+1028D; [7B EF 64, 05, 05]
-10939; [7B ED B8, 05, 05]
+1028E; [7B EF 6B, 05, 05]
-FDD1 10300; [7B EE 02, 05, 05] # OLD_ITALIC first primary (compressible)
+1028F; [7B EF 72, 05, 05]
-10300; [7B EE 09, 05, 05]
+10290; [7B EF 79, 05, 05]
-10301; [7B EE 10, 05, 05]
+10291; [7B EF 80, 05, 05]
-10302; [7B EE 17, 05, 05]
+10292; [7B EF 87, 05, 05]
-10303; [7B EE 1E, 05, 05]
+10293; [7B EF 8E, 05, 05]
-10304; [7B EE 25, 05, 05]
+10294; [7B EF 95, 05, 05]
-10305; [7B EE 2C, 05, 05]
+10295; [7B EF 9C, 05, 05]
-10306; [7B EE 33, 05, 05]
+10296; [7B EF A3, 05, 05]
-10307; [7B EE 3A, 05, 05]
+10297; [7B EF AA, 05, 05]
-10308; [7B EE 41, 05, 05]
+10298; [7B EF B1, 05, 05]
-10309; [7B EE 48, 05, 05]
+10299; [7B EF B8, 05, 05]
-1030A; [7B EE 4F, 05, 05]
+1029A; [7B EF BF, 05, 05]
-1030B; [7B EE 56, 05, 05]
+1029B; [7B EF C6, 05, 05]
-1030C; [7B EE 5D, 05, 05]
+1029C; [7B EF CD, 05, 05]
-1030D; [7B EE 64, 05, 05]
+FDD1 102A0; [7B F0 02, 05, 05] # Carian first primary (compressible)
-1030E; [7B EE 6B, 05, 05]
+102A0; [7B F0 09, 05, 05]
-1031F; [7B EE 72, 05, 05]
+102A1; [7B F0 10, 05, 05]
-1030F; [7B EE 79, 05, 05]
+102A2; [7B F0 17, 05, 05]
-10310; [7B EE 80, 05, 05]
+102A3; [7B F0 1E, 05, 05]
-10311; [7B EE 87, 05, 05]
+102A4; [7B F0 25, 05, 05]
-10312; [7B EE 8E, 05, 05]
+102A5; [7B F0 2C, 05, 05]
-10313; [7B EE 95, 05, 05]
+102A6; [7B F0 33, 05, 05]
-10314; [7B EE 9C, 05, 05]
+102A7; [7B F0 3A, 05, 05]
-10315; [7B EE A3, 05, 05]
+102A8; [7B F0 41, 05, 05]
-10316; [7B EE AA, 05, 05]
+102A9; [7B F0 48, 05, 05]
-10317; [7B EE B1, 05, 05]
+102AA; [7B F0 4F, 05, 05]
-10318; [7B EE B8, 05, 05]
+102AB; [7B F0 56, 05, 05]
-10319; [7B EE BF, 05, 05]
+102AC; [7B F0 5D, 05, 05]
-1031A; [7B EE C6, 05, 05]
+102AD; [7B F0 64, 05, 05]
-1031B; [7B EE CD, 05, 05]
+102AE; [7B F0 6B, 05, 05]
-1031C; [7B EE D4, 05, 05]
+102AF; [7B F0 72, 05, 05]
-1031D; [7B EE DB, 05, 05]
+102B0; [7B F0 79, 05, 05]
-1031E; [7B EE E2, 05, 05]
+102B1; [7B F0 80, 05, 05]
-1032D; [7B EE E9, 05, 05]
+102B2; [7B F0 87, 05, 05]
-1032E; [7B EE F0, 05, 05]
+102B3; [7B F0 8E, 05, 05]
-1032F; [7B EE F7, 05, 05]
+102B4; [7B F0 95, 05, 05]
-FDD1 10330; [7B EF 02, 05, 05] # GOTHIC first primary (compressible)
+102B5; [7B F0 9C, 05, 05]
-10330; [7B EF 09, 05, 05]
+102B6; [7B F0 A3, 05, 05]
-10331; [7B EF 10, 05, 05]
+102B7; [7B F0 AA, 05, 05]
-10332; [7B EF 17, 05, 05]
+102B8; [7B F0 B1, 05, 05]
-10333; [7B EF 1E, 05, 05]
+102B9; [7B F0 B8, 05, 05]
-10334; [7B EF 25, 05, 05]
+102BA; [7B F0 BF, 05, 05]
-10335; [7B EF 2C, 05, 05]
+102BB; [7B F0 C6, 05, 05]
-10336; [7B EF 33, 05, 05]
+102BC; [7B F0 CD, 05, 05]
-10337; [7B EF 3A, 05, 05]
+102BD; [7B F0 D4, 05, 05]
-10338; [7B EF 41, 05, 05]
+102BE; [7B F0 DB, 05, 05]
-10339; [7B EF 48, 05, 05]
+102BF; [7B F0 E2, 05, 05]
-1033A; [7B EF 4F, 05, 05]
+102C0; [7B F0 E9, 05, 05]
-1033B; [7B EF 56, 05, 05]
+102C1; [7B F0 F0, 05, 05]
-1033C; [7B EF 5D, 05, 05]
+102C2; [7B F0 F7, 05, 05]
-1033D; [7B EF 64, 05, 05]
+102C3; [7B F0 FE, 05, 05]
-1033E; [7B EF 6B, 05, 05]
+102C4; [7B F1 07, 05, 05]
-1033F; [7B EF 72, 05, 05]
+102C5; [7B F1 0E, 05, 05]
-10340; [7B EF 79, 05, 05]
+102C6; [7B F1 15, 05, 05]
-10341; [7B EF 80, 05, 05]
+102C7; [7B F1 1C, 05, 05]
-10342; [7B EF 87, 05, 05]
+102C8; [7B F1 23, 05, 05]
-10343; [7B EF 8E, 05, 05]
+102C9; [7B F1 2A, 05, 05]
-10344; [7B EF 95, 05, 05]
+102CA; [7B F1 31, 05, 05]
-10345; [7B EF 9C, 05, 05]
+102CB; [7B F1 38, 05, 05]
-10346; [7B EF A3, 05, 05]
+102CC; [7B F1 3F, 05, 05]
-10347; [7B EF AA, 05, 05]
+102CD; [7B F1 46, 05, 05]
-10348; [7B EF B1, 05, 05]
+102CE; [7B F1 4D, 05, 05]
-10349; [7B EF B8, 05, 05]
+102CF; [7B F1 54, 05, 05]
-1034A; [7B EF BF, 05, 05]
+102D0; [7B F1 5B, 05, 05]
+
+FDD1 10920; [7B F2 02, 05, 05] # Lydian first primary (compressible)
+
+10920; [7B F2 09, 05, 05]
+
+10921; [7B F2 10, 05, 05]
+
+10922; [7B F2 17, 05, 05]
+
+10923; [7B F2 1E, 05, 05]
+
+10924; [7B F2 25, 05, 05]
+
+10925; [7B F2 2C, 05, 05]
+
+10926; [7B F2 33, 05, 05]
+
+10927; [7B F2 3A, 05, 05]
+
+10928; [7B F2 41, 05, 05]
+
+10929; [7B F2 48, 05, 05]
+
+1092A; [7B F2 4F, 05, 05]
+
+1092B; [7B F2 56, 05, 05]
+
+1092C; [7B F2 5D, 05, 05]
+
+1092D; [7B F2 64, 05, 05]
+
+1092E; [7B F2 6B, 05, 05]
+
+1092F; [7B F2 72, 05, 05]
+
+10930; [7B F2 79, 05, 05]
+
+10931; [7B F2 80, 05, 05]
+
+10932; [7B F2 87, 05, 05]
+
+10933; [7B F2 8E, 05, 05]
+
+10934; [7B F2 95, 05, 05]
+
+10935; [7B F2 9C, 05, 05]
+
+10936; [7B F2 A3, 05, 05]
+
+10937; [7B F2 AA, 05, 05]
+
+10938; [7B F2 B1, 05, 05]
+
+10939; [7B F2 B8, 05, 05]
+
+FDD1 10300; [7B F3 02, 05, 05] # OLD_ITALIC first primary (compressible)
+
+10300; [7B F3 09, 05, 05]
+
+10301; [7B F3 10, 05, 05]
+
+10302; [7B F3 17, 05, 05]
+
+10303; [7B F3 1E, 05, 05]
+
+10304; [7B F3 25, 05, 05]
+
+10305; [7B F3 2C, 05, 05]
+
+10306; [7B F3 33, 05, 05]
+
+10307; [7B F3 3A, 05, 05]
+
+10308; [7B F3 41, 05, 05]
+
+10309; [7B F3 48, 05, 05]
+
+1030A; [7B F3 4F, 05, 05]
+
+1030B; [7B F3 56, 05, 05]
+
+1030C; [7B F3 5D, 05, 05]
+
+1030D; [7B F3 64, 05, 05]
+
+1030E; [7B F3 6B, 05, 05]
+
+1031F; [7B F3 72, 05, 05]
+
+1030F; [7B F3 79, 05, 05]
+
+10310; [7B F3 80, 05, 05]
+
+10311; [7B F3 87, 05, 05]
+
+10312; [7B F3 8E, 05, 05]
+
+10313; [7B F3 95, 05, 05]
+
+10314; [7B F3 9C, 05, 05]
+
+10315; [7B F3 A3, 05, 05]
+
+10316; [7B F3 AA, 05, 05]
+
+10317; [7B F3 B1, 05, 05]
+
+10318; [7B F3 B8, 05, 05]
+
+10319; [7B F3 BF, 05, 05]
+
+1031A; [7B F3 C6, 05, 05]
+
+1031B; [7B F3 CD, 05, 05]
+
+1031C; [7B F3 D4, 05, 05]
+
+1031D; [7B F3 DB, 05, 05]
+
+1031E; [7B F3 E2, 05, 05]
+
+1032D; [7B F3 E9, 05, 05]
+
+1032E; [7B F3 F0, 05, 05]
+
+1032F; [7B F3 F7, 05, 05]
+
+FDD1 10330; [7B F4 02, 05, 05] # GOTHIC first primary (compressible)
+
+10330; [7B F4 09, 05, 05]
+
+10331; [7B F4 10, 05, 05]
+
+10332; [7B F4 17, 05, 05]
+
+10333; [7B F4 1E, 05, 05]
+
+10334; [7B F4 25, 05, 05]
+
+10335; [7B F4 2C, 05, 05]
+
+10336; [7B F4 33, 05, 05]
+
+10337; [7B F4 3A, 05, 05]
+
+10338; [7B F4 41, 05, 05]
+
+10339; [7B F4 48, 05, 05]
+
+1033A; [7B F4 4F, 05, 05]
+
+1033B; [7B F4 56, 05, 05]
+
+1033C; [7B F4 5D, 05, 05]
+
+1033D; [7B F4 64, 05, 05]
+
+1033E; [7B F4 6B, 05, 05]
+
+1033F; [7B F4 72, 05, 05]
+
+10340; [7B F4 79, 05, 05]
+
+10341; [7B F4 80, 05, 05]
+
+10342; [7B F4 87, 05, 05]
+
+10343; [7B F4 8E, 05, 05]
+
+10344; [7B F4 95, 05, 05]
+
+10345; [7B F4 9C, 05, 05]
+
+10346; [7B F4 A3, 05, 05]
+
+10347; [7B F4 AA, 05, 05]
+
+10348; [7B F4 B1, 05, 05]
+
+10349; [7B F4 B8, 05, 05]
+
+1034A; [7B F4 BF, 05, 05]
FDD1 10414; [7C 04 02, 05, 05] # DESERET first primary starts new lead byte (compressible)
@@ -46782,2566 +47831,2613 @@ FDD1 10B8F; [7C A1 02, 05, 05] # Psalter_Pahlavi first primary (compressible)
10B91; [7C A1 80, 05, 05]
-FDD1 10AD8; [7C A2 02, 05, 05] # Manichaean first primary (compressible)
+FDD1 10FF1; [7C A2 02, 05, 05] # Elymaic first primary (compressible)
+
+10FE0; [7C A2 09, 05, 05]
+
+10FE1; [7C A2 10, 05, 05]
+
+10FE2; [7C A2 17, 05, 05]
+
+10FE3; [7C A2 1E, 05, 05]
+
+10FE4; [7C A2 25, 05, 05]
+
+10FE5; [7C A2 2C, 05, 05]
+
+10FE6; [7C A2 33, 05, 05]
+10FF6; [7C A2 33, 05, 20][7C A2 48, 05, 20]
+
+10FE7; [7C A2 3A, 05, 05]
+
+10FE8; [7C A2 41, 05, 05]
+
+10FE9; [7C A2 48, 05, 05]
+
+10FEA; [7C A2 4F, 05, 05]
+
+10FEB; [7C A2 56, 05, 05]
+
+10FEC; [7C A2 5D, 05, 05]
+
+10FED; [7C A2 64, 05, 05]
+
+10FEE; [7C A2 6B, 05, 05]
+
+10FEF; [7C A2 72, 05, 05]
+
+10FF0; [7C A2 79, 05, 05]
+
+10FF1; [7C A2 80, 05, 05]
+
+10FF2; [7C A2 87, 05, 05]
+
+10FF3; [7C A2 8E, 05, 05]
+
+10FF4; [7C A2 95, 05, 05]
+
+10FF5; [7C A2 9C, 05, 05]
+
+FDD1 10AD8; [7C A3 02, 05, 05] # Manichaean first primary (compressible)
-10AC0; [7C A2 09, 05, 05]
+10AC0; [7C A3 09, 05, 05]
-10AC1; [7C A2 10, 05, 05]
+10AC1; [7C A3 10, 05, 05]
-10AC2; [7C A2 17, 05, 05]
+10AC2; [7C A3 17, 05, 05]
-10AC3; [7C A2 1E, 05, 05]
+10AC3; [7C A3 1E, 05, 05]
-10AC4; [7C A2 25, 05, 05]
+10AC4; [7C A3 25, 05, 05]
-10AC5; [7C A2 2C, 05, 05]
+10AC5; [7C A3 2C, 05, 05]
-10AC6; [7C A2 33, 05, 05]
+10AC6; [7C A3 33, 05, 05]
-10AC7; [7C A4, 05, 05]
-10AC8; [7C A4, 70, 05]
+10AC7; [7C A5, 05, 05]
+10AC8; [7C A5, 70, 05]
-10AC9; [7C A6 02, 05, 05]
+10AC9; [7C A7 02, 05, 05]
-10ACA; [7C A6 09, 05, 05]
+10ACA; [7C A7 09, 05, 05]
-10ACB; [7C A6 10, 05, 05]
+10ACB; [7C A7 10, 05, 05]
-10ACC; [7C A6 17, 05, 05]
+10ACC; [7C A7 17, 05, 05]
-10ACD; [7C A6 1E, 05, 05]
+10ACD; [7C A7 1E, 05, 05]
-10ACE; [7C A6 25, 05, 05]
+10ACE; [7C A7 25, 05, 05]
-10ACF; [7C A6 2C, 05, 05]
+10ACF; [7C A7 2C, 05, 05]
-10AD0; [7C A6 33, 05, 05]
+10AD0; [7C A7 33, 05, 05]
-10AD1; [7C A6 3A, 05, 05]
+10AD1; [7C A7 3A, 05, 05]
-10AD2; [7C A6 41, 05, 05]
+10AD2; [7C A7 41, 05, 05]
-10AD3; [7C A6 48, 05, 05]
+10AD3; [7C A7 48, 05, 05]
-10AD4; [7C A6 4F, 05, 05]
+10AD4; [7C A7 4F, 05, 05]
-10AD5; [7C A6 56, 05, 05]
+10AD5; [7C A7 56, 05, 05]
-10AD6; [7C A6 5D, 05, 05]
+10AD6; [7C A7 5D, 05, 05]
-10AD7; [7C A6 64, 05, 05]
+10AD7; [7C A7 64, 05, 05]
-10AD8; [7C A6 6B, 05, 05]
+10AD8; [7C A7 6B, 05, 05]
-10AD9; [7C A6 72, 05, 05]
+10AD9; [7C A7 72, 05, 05]
-10ADA; [7C A6 79, 05, 05]
+10ADA; [7C A7 79, 05, 05]
-10ADB; [7C A6 80, 05, 05]
+10ADB; [7C A7 80, 05, 05]
-10ADC; [7C A6 87, 05, 05]
+10ADC; [7C A7 87, 05, 05]
-10ADD; [7C A6 8E, 05, 05]
+10ADD; [7C A7 8E, 05, 05]
-10ADE; [7C A6 95, 05, 05]
+10ADE; [7C A7 95, 05, 05]
-10ADF; [7C A6 9C, 05, 05]
+10ADF; [7C A7 9C, 05, 05]
-10AE0; [7C A6 A3, 05, 05]
+10AE0; [7C A7 A3, 05, 05]
-10AE1; [7C A6 AA, 05, 05]
+10AE1; [7C A7 AA, 05, 05]
-10AE2; [7C A6 B1, 05, 05]
+10AE2; [7C A7 B1, 05, 05]
-10AE3; [7C A6 B8, 05, 05]
+10AE3; [7C A7 B8, 05, 05]
-10AE4; [7C A6 BF, 05, 05]
+10AE4; [7C A7 BF, 05, 05]
-FDD1 10F19; [7C A7 02, 05, 05] # Old_Sogdian first primary (compressible)
+FDD1 10F19; [7C A8 02, 05, 05] # Old_Sogdian first primary (compressible)
-10F00; [7C A9, 05, 05]
-10F01; [7C A9, 05, 20]
+10F00; [7C AA, 05, 05]
+10F01; [7C AA, 05, 20]
-10F02; [7C AB, 05, 05]
-10F03; [7C AB, 05, 20]
+10F02; [7C AC, 05, 05]
+10F03; [7C AC, 05, 20]
-10F04; [7C AD, 05, 05]
+10F04; [7C AE, 05, 05]
-10F05; [7C AF, 05, 05]
-10F06; [7C AF, 05, 20]
+10F05; [7C B0, 05, 05]
+10F06; [7C B0, 05, 20]
-10F07; [7C B1 02, 05, 05]
+10F07; [7C B2 02, 05, 05]
-10F08; [7C B1 09, 05, 05]
+10F08; [7C B2 09, 05, 05]
-10F09; [7C B1 10, 05, 05]
+10F09; [7C B2 10, 05, 05]
-10F0A; [7C B1 17, 05, 05]
+10F0A; [7C B2 17, 05, 05]
-10F0B; [7C B1 1E, 05, 05]
+10F0B; [7C B2 1E, 05, 05]
-10F0C; [7C B1 25, 05, 05]
+10F0C; [7C B2 25, 05, 05]
-10F0D; [7C B1 2C, 05, 05]
+10F0D; [7C B2 2C, 05, 05]
-10F0E; [7C B3, 05, 05]
-10F0F; [7C B3, 05, 20]
-10F10; [7C B3, 70, 05]
+10F0E; [7C B4, 05, 05]
+10F0F; [7C B4, 05, 20]
+10F10; [7C B4, 70, 05]
-10F11; [7C B5, 05, 05]
+10F11; [7C B6, 05, 05]
-10F12; [7C B7, 05, 05]
-10F13; [7C B7, 70, 05]
-10F27; [7C B7, 05, 20][7C BD, 05, 20]
+10F12; [7C B8, 05, 05]
+10F13; [7C B8, 70, 05]
+10F27; [7C B8, 05, 20][7C BE, 05, 20]
-10F14; [7C B9, 05, 05]
+10F14; [7C BA, 05, 05]
-10F15; [7C BB, 05, 05]
-10F16; [7C BB, 05, 20]
-10F17; [7C BB, 70, 05]
+10F15; [7C BC, 05, 05]
+10F16; [7C BC, 05, 20]
+10F17; [7C BC, 70, 05]
-10F18; [7C BD, 05, 05]
+10F18; [7C BE, 05, 05]
-10F19; [7C BF, 05, 05]
+10F19; [7C C0, 05, 05]
-10F1A; [7C C1, 05, 05]
-10F1B; [7C C1, 05, 20]
-10F1C; [7C C1, 70, 05]
+10F1A; [7C C2, 05, 05]
+10F1B; [7C C2, 05, 20]
+10F1C; [7C C2, 70, 05]
-FDD1 10F42; [7C C3 02, 05, 05] # Sogdian first primary (compressible)
+FDD1 10F42; [7C C4 02, 05, 05] # Sogdian first primary (compressible)
-10F30; [7C C3 09, 05, 05]
+10F30; [7C C4 09, 05, 05]
-10F31; [7C C3 10, 05, 05]
+10F31; [7C C4 10, 05, 05]
-10F32; [7C C3 17, 05, 05]
+10F32; [7C C4 17, 05, 05]
-10F33; [7C C3 1E, 05, 05]
+10F33; [7C C4 1E, 05, 05]
-10F34; [7C C3 25, 05, 05]
+10F34; [7C C4 25, 05, 05]
-10F35; [7C C3 2C, 05, 05]
+10F35; [7C C4 2C, 05, 05]
-10F36; [7C C3 33, 05, 05]
+10F36; [7C C4 33, 05, 05]
-10F37; [7C C3 3A, 05, 05]
+10F37; [7C C4 3A, 05, 05]
-10F38; [7C C3 41, 05, 05]
+10F38; [7C C4 41, 05, 05]
-10F39; [7C C3 48, 05, 05]
+10F39; [7C C4 48, 05, 05]
-10F3A; [7C C3 4F, 05, 05]
+10F3A; [7C C4 4F, 05, 05]
-10F3B; [7C C3 56, 05, 05]
+10F3B; [7C C4 56, 05, 05]
-10F3C; [7C C3 5D, 05, 05]
+10F3C; [7C C4 5D, 05, 05]
-10F3D; [7C C3 64, 05, 05]
+10F3D; [7C C4 64, 05, 05]
-10F3E; [7C C3 6B, 05, 05]
+10F3E; [7C C4 6B, 05, 05]
-10F3F; [7C C3 72, 05, 05]
+10F3F; [7C C4 72, 05, 05]
-10F40; [7C C3 79, 05, 05]
+10F40; [7C C4 79, 05, 05]
-10F41; [7C C5, 05, 05]
-10F45; [7C C5, 70, 05]
+10F41; [7C C6, 05, 05]
+10F45; [7C C6, 70, 05]
-10F42; [7C C7 02, 05, 05]
+10F42; [7C C8 02, 05, 05]
-10F43; [7C C7 09, 05, 05]
+10F43; [7C C8 09, 05, 05]
-10F44; [7C C7 10, 05, 05]
+10F44; [7C C8 10, 05, 05]
-FDD1 10380; [7C C8 02, 05, 05] # UGARITIC first primary (compressible)
+FDD1 10380; [7C C9 02, 05, 05] # UGARITIC first primary (compressible)
-10380; [7C C8 09, 05, 05]
+10380; [7C C9 09, 05, 05]
-10381; [7C C8 10, 05, 05]
+10381; [7C C9 10, 05, 05]
-10382; [7C C8 17, 05, 05]
+10382; [7C C9 17, 05, 05]
-10383; [7C C8 1E, 05, 05]
+10383; [7C C9 1E, 05, 05]
-10384; [7C C8 25, 05, 05]
+10384; [7C C9 25, 05, 05]
-10385; [7C C8 2C, 05, 05]
+10385; [7C C9 2C, 05, 05]
-10386; [7C C8 33, 05, 05]
+10386; [7C C9 33, 05, 05]
-10387; [7C C8 3A, 05, 05]
+10387; [7C C9 3A, 05, 05]
-10388; [7C C8 41, 05, 05]
+10388; [7C C9 41, 05, 05]
-10389; [7C C8 48, 05, 05]
+10389; [7C C9 48, 05, 05]
-1038A; [7C C8 4F, 05, 05]
+1038A; [7C C9 4F, 05, 05]
-1038B; [7C C8 56, 05, 05]
+1038B; [7C C9 56, 05, 05]
-1038C; [7C C8 5D, 05, 05]
+1038C; [7C C9 5D, 05, 05]
-1038D; [7C C8 64, 05, 05]
+1038D; [7C C9 64, 05, 05]
-1038E; [7C C8 6B, 05, 05]
+1038E; [7C C9 6B, 05, 05]
-1038F; [7C C8 72, 05, 05]
+1038F; [7C C9 72, 05, 05]
-10390; [7C C8 79, 05, 05]
+10390; [7C C9 79, 05, 05]
-10391; [7C C8 80, 05, 05]
+10391; [7C C9 80, 05, 05]
-10392; [7C C8 87, 05, 05]
+10392; [7C C9 87, 05, 05]
-10393; [7C C8 8E, 05, 05]
+10393; [7C C9 8E, 05, 05]
-10394; [7C C8 95, 05, 05]
+10394; [7C C9 95, 05, 05]
-10395; [7C C8 9C, 05, 05]
+10395; [7C C9 9C, 05, 05]
-10396; [7C C8 A3, 05, 05]
+10396; [7C C9 A3, 05, 05]
-10397; [7C C8 AA, 05, 05]
+10397; [7C C9 AA, 05, 05]
-10398; [7C C8 B1, 05, 05]
+10398; [7C C9 B1, 05, 05]
-10399; [7C C8 B8, 05, 05]
+10399; [7C C9 B8, 05, 05]
-1039A; [7C C8 BF, 05, 05]
+1039A; [7C C9 BF, 05, 05]
-1039B; [7C C8 C6, 05, 05]
+1039B; [7C C9 C6, 05, 05]
-1039C; [7C C8 CD, 05, 05]
+1039C; [7C C9 CD, 05, 05]
-1039D; [7C C8 D4, 05, 05]
+1039D; [7C C9 D4, 05, 05]
-FDD1 103A0; [7C C9 02, 05, 05] # OLD_PERSIAN first primary (compressible)
+FDD1 103A0; [7C CA 02, 05, 05] # OLD_PERSIAN first primary (compressible)
-103A0; [7C C9 09, 05, 05]
+103A0; [7C CA 09, 05, 05]
-103A1; [7C C9 10, 05, 05]
+103A1; [7C CA 10, 05, 05]
-103A2; [7C C9 17, 05, 05]
+103A2; [7C CA 17, 05, 05]
-103A3; [7C C9 1E, 05, 05]
+103A3; [7C CA 1E, 05, 05]
-103A4; [7C C9 25, 05, 05]
+103A4; [7C CA 25, 05, 05]
-103A5; [7C C9 2C, 05, 05]
+103A5; [7C CA 2C, 05, 05]
-103A6; [7C C9 33, 05, 05]
+103A6; [7C CA 33, 05, 05]
-103A7; [7C C9 3A, 05, 05]
+103A7; [7C CA 3A, 05, 05]
-103A8; [7C C9 41, 05, 05]
+103A8; [7C CA 41, 05, 05]
-103A9; [7C C9 48, 05, 05]
+103A9; [7C CA 48, 05, 05]
-103AA; [7C C9 4F, 05, 05]
+103AA; [7C CA 4F, 05, 05]
-103AB; [7C C9 56, 05, 05]
+103AB; [7C CA 56, 05, 05]
-103AC; [7C C9 5D, 05, 05]
+103AC; [7C CA 5D, 05, 05]
-103AD; [7C C9 64, 05, 05]
+103AD; [7C CA 64, 05, 05]
-103AE; [7C C9 6B, 05, 05]
+103AE; [7C CA 6B, 05, 05]
-103AF; [7C C9 72, 05, 05]
+103AF; [7C CA 72, 05, 05]
-103B0; [7C C9 79, 05, 05]
+103B0; [7C CA 79, 05, 05]
-103B1; [7C C9 80, 05, 05]
+103B1; [7C CA 80, 05, 05]
-103B2; [7C C9 87, 05, 05]
+103B2; [7C CA 87, 05, 05]
-103B3; [7C C9 8E, 05, 05]
+103B3; [7C CA 8E, 05, 05]
-103B4; [7C C9 95, 05, 05]
+103B4; [7C CA 95, 05, 05]
-103B5; [7C C9 9C, 05, 05]
+103B5; [7C CA 9C, 05, 05]
-103B6; [7C C9 A3, 05, 05]
+103B6; [7C CA A3, 05, 05]
-103B7; [7C C9 AA, 05, 05]
+103B7; [7C CA AA, 05, 05]
-103B8; [7C C9 B1, 05, 05]
+103B8; [7C CA B1, 05, 05]
-103B9; [7C C9 B8, 05, 05]
+103B9; [7C CA B8, 05, 05]
-103BA; [7C C9 BF, 05, 05]
+103BA; [7C CA BF, 05, 05]
-103BB; [7C C9 C6, 05, 05]
+103BB; [7C CA C6, 05, 05]
-103BC; [7C C9 CD, 05, 05]
+103BC; [7C CA CD, 05, 05]
-103BD; [7C C9 D4, 05, 05]
+103BD; [7C CA D4, 05, 05]
-103BE; [7C C9 DB, 05, 05]
+103BE; [7C CA DB, 05, 05]
-103BF; [7C C9 E2, 05, 05]
+103BF; [7C CA E2, 05, 05]
-103C0; [7C C9 E9, 05, 05]
+103C0; [7C CA E9, 05, 05]
-103C1; [7C C9 F0, 05, 05]
+103C1; [7C CA F0, 05, 05]
-103C2; [7C C9 F7, 05, 05]
+103C2; [7C CA F7, 05, 05]
-103C3; [7C C9 FE, 05, 05]
+103C3; [7C CA FE, 05, 05]
-103C8; [7C CA 07, 05, 05]
+103C8; [7C CB 07, 05, 05]
-103C9; [7C CA 0E, 05, 05]
+103C9; [7C CB 0E, 05, 05]
-103CA; [7C CA 15, 05, 05]
+103CA; [7C CB 15, 05, 05]
-103CB; [7C CA 1C, 05, 05]
+103CB; [7C CB 1C, 05, 05]
-103CC; [7C CA 23, 05, 05]
+103CC; [7C CB 23, 05, 05]
-103CD; [7C CA 2A, 05, 05]
+103CD; [7C CB 2A, 05, 05]
-103CE; [7C CA 31, 05, 05]
+103CE; [7C CB 31, 05, 05]
-103CF; [7C CA 38, 05, 05]
+103CF; [7C CB 38, 05, 05]
-FDD1 12000; [7C CB 02, 05, 05] # Cuneiform first primary (compressible)
+FDD1 12000; [7C CC 02, 05, 05] # Cuneiform first primary (compressible)
-12000; [7C CB 09, 05, 05]
+12000; [7C CC 09, 05, 05]
-12001; [7C CB 10, 05, 05]
+12001; [7C CC 10, 05, 05]
-12002; [7C CB 17, 05, 05]
+12002; [7C CC 17, 05, 05]
-12003; [7C CB 1E, 05, 05]
+12003; [7C CC 1E, 05, 05]
-12004; [7C CB 25, 05, 05]
+12004; [7C CC 25, 05, 05]
-12005; [7C CB 2C, 05, 05]
+12005; [7C CC 2C, 05, 05]
-12006; [7C CB 33, 05, 05]
+12006; [7C CC 33, 05, 05]
-12007; [7C CB 3A, 05, 05]
+12007; [7C CC 3A, 05, 05]
-12008; [7C CB 41, 05, 05]
+12008; [7C CC 41, 05, 05]
-12009; [7C CB 48, 05, 05]
+12009; [7C CC 48, 05, 05]
-1200A; [7C CB 4F, 05, 05]
+1200A; [7C CC 4F, 05, 05]
-1200B; [7C CB 56, 05, 05]
+1200B; [7C CC 56, 05, 05]
-1200C; [7C CB 5D, 05, 05]
+1200C; [7C CC 5D, 05, 05]
-1200D; [7C CB 64, 05, 05]
+1200D; [7C CC 64, 05, 05]
-1200E; [7C CB 6B, 05, 05]
+1200E; [7C CC 6B, 05, 05]
-1200F; [7C CB 72, 05, 05]
+1200F; [7C CC 72, 05, 05]
-12010; [7C CB 79, 05, 05]
+12010; [7C CC 79, 05, 05]
-12011; [7C CB 80, 05, 05]
+12011; [7C CC 80, 05, 05]
-12012; [7C CB 87, 05, 05]
+12012; [7C CC 87, 05, 05]
-12013; [7C CB 8E, 05, 05]
+12013; [7C CC 8E, 05, 05]
-12014; [7C CB 95, 05, 05]
+12014; [7C CC 95, 05, 05]
-12015; [7C CB 9C, 05, 05]
+12015; [7C CC 9C, 05, 05]
-12016; [7C CB A3, 05, 05]
+12016; [7C CC A3, 05, 05]
-12017; [7C CB AA, 05, 05]
+12017; [7C CC AA, 05, 05]
-12018; [7C CB B1, 05, 05]
+12018; [7C CC B1, 05, 05]
-12019; [7C CB B8, 05, 05]
+12019; [7C CC B8, 05, 05]
-1201A; [7C CB BF, 05, 05]
+1201A; [7C CC BF, 05, 05]
-1201B; [7C CB C6, 05, 05]
+1201B; [7C CC C6, 05, 05]
-1201C; [7C CB CD, 05, 05]
+1201C; [7C CC CD, 05, 05]
-1201D; [7C CB D4, 05, 05]
+1201D; [7C CC D4, 05, 05]
-1201E; [7C CB DB, 05, 05]
+1201E; [7C CC DB, 05, 05]
-1201F; [7C CB E2, 05, 05]
+1201F; [7C CC E2, 05, 05]
-12020; [7C CB E9, 05, 05]
+12020; [7C CC E9, 05, 05]
-12021; [7C CB F0, 05, 05]
+12021; [7C CC F0, 05, 05]
-12022; [7C CB F7, 05, 05]
+12022; [7C CC F7, 05, 05]
-12023; [7C CB FE, 05, 05]
+12023; [7C CC FE, 05, 05]
-12024; [7C CC 07, 05, 05]
+12024; [7C CD 07, 05, 05]
-12025; [7C CC 0E, 05, 05]
+12025; [7C CD 0E, 05, 05]
-12026; [7C CC 15, 05, 05]
+12026; [7C CD 15, 05, 05]
-12027; [7C CC 1C, 05, 05]
+12027; [7C CD 1C, 05, 05]
-12028; [7C CC 23, 05, 05]
+12028; [7C CD 23, 05, 05]
-12029; [7C CC 2A, 05, 05]
+12029; [7C CD 2A, 05, 05]
-1202A; [7C CC 31, 05, 05]
+1202A; [7C CD 31, 05, 05]
-1202B; [7C CC 38, 05, 05]
+1202B; [7C CD 38, 05, 05]
-1202C; [7C CC 3F, 05, 05]
+1202C; [7C CD 3F, 05, 05]
-1202D; [7C CC 46, 05, 05]
+1202D; [7C CD 46, 05, 05]
-1202E; [7C CC 4D, 05, 05]
+1202E; [7C CD 4D, 05, 05]
-1202F; [7C CC 54, 05, 05]
+1202F; [7C CD 54, 05, 05]
-12030; [7C CC 5B, 05, 05]
+12030; [7C CD 5B, 05, 05]
-12031; [7C CC 62, 05, 05]
+12031; [7C CD 62, 05, 05]
-12032; [7C CC 69, 05, 05]
+12032; [7C CD 69, 05, 05]
-12033; [7C CC 70, 05, 05]
+12033; [7C CD 70, 05, 05]
-12034; [7C CC 77, 05, 05]
+12034; [7C CD 77, 05, 05]
-12035; [7C CC 7E, 05, 05]
+12035; [7C CD 7E, 05, 05]
-12036; [7C CC 85, 05, 05]
+12036; [7C CD 85, 05, 05]
-12037; [7C CC 8C, 05, 05]
+12037; [7C CD 8C, 05, 05]
-12038; [7C CC 93, 05, 05]
+12038; [7C CD 93, 05, 05]
-12039; [7C CC 9A, 05, 05]
+12039; [7C CD 9A, 05, 05]
-1203A; [7C CC A1, 05, 05]
+1203A; [7C CD A1, 05, 05]
-1203B; [7C CC A8, 05, 05]
+1203B; [7C CD A8, 05, 05]
-1203C; [7C CC AF, 05, 05]
+1203C; [7C CD AF, 05, 05]
-1203D; [7C CC B6, 05, 05]
+1203D; [7C CD B6, 05, 05]
-1203E; [7C CC BD, 05, 05]
+1203E; [7C CD BD, 05, 05]
-1203F; [7C CC C4, 05, 05]
+1203F; [7C CD C4, 05, 05]
-12040; [7C CC CB, 05, 05]
+12040; [7C CD CB, 05, 05]
-12041; [7C CC D2, 05, 05]
+12041; [7C CD D2, 05, 05]
-12042; [7C CC D9, 05, 05]
+12042; [7C CD D9, 05, 05]
-12043; [7C CC E0, 05, 05]
+12043; [7C CD E0, 05, 05]
-12044; [7C CC E7, 05, 05]
+12044; [7C CD E7, 05, 05]
-12045; [7C CC EE, 05, 05]
+12045; [7C CD EE, 05, 05]
-12046; [7C CC F5, 05, 05]
+12046; [7C CD F5, 05, 05]
-12047; [7C CC FC, 05, 05]
+12047; [7C CD FC, 05, 05]
-12048; [7C CD 05, 05, 05]
+12048; [7C CE 05, 05, 05]
-12049; [7C CD 0C, 05, 05]
+12049; [7C CE 0C, 05, 05]
-1204A; [7C CD 13, 05, 05]
+1204A; [7C CE 13, 05, 05]
-1204B; [7C CD 1A, 05, 05]
+1204B; [7C CE 1A, 05, 05]
-1204C; [7C CD 21, 05, 05]
+1204C; [7C CE 21, 05, 05]
-1204D; [7C CD 28, 05, 05]
+1204D; [7C CE 28, 05, 05]
-1204E; [7C CD 2F, 05, 05]
+1204E; [7C CE 2F, 05, 05]
-1204F; [7C CD 36, 05, 05]
+1204F; [7C CE 36, 05, 05]
-12050; [7C CD 3D, 05, 05]
+12050; [7C CE 3D, 05, 05]
-12051; [7C CD 44, 05, 05]
+12051; [7C CE 44, 05, 05]
-12052; [7C CD 4B, 05, 05]
+12052; [7C CE 4B, 05, 05]
-12053; [7C CD 52, 05, 05]
+12053; [7C CE 52, 05, 05]
-12054; [7C CD 59, 05, 05]
+12054; [7C CE 59, 05, 05]
-12055; [7C CD 60, 05, 05]
+12055; [7C CE 60, 05, 05]
-12056; [7C CD 67, 05, 05]
+12056; [7C CE 67, 05, 05]
-12057; [7C CD 6E, 05, 05]
+12057; [7C CE 6E, 05, 05]
-12058; [7C CD 75, 05, 05]
+12058; [7C CE 75, 05, 05]
-12059; [7C CD 7C, 05, 05]
+12059; [7C CE 7C, 05, 05]
-1205A; [7C CD 83, 05, 05]
+1205A; [7C CE 83, 05, 05]
-1205B; [7C CD 8A, 05, 05]
+1205B; [7C CE 8A, 05, 05]
-1205C; [7C CD 91, 05, 05]
+1205C; [7C CE 91, 05, 05]
-1205D; [7C CD 98, 05, 05]
+1205D; [7C CE 98, 05, 05]
-1205E; [7C CD 9F, 05, 05]
+1205E; [7C CE 9F, 05, 05]
-1205F; [7C CD A6, 05, 05]
+1205F; [7C CE A6, 05, 05]
-12060; [7C CD AD, 05, 05]
+12060; [7C CE AD, 05, 05]
-12061; [7C CD B4, 05, 05]
+12061; [7C CE B4, 05, 05]
-12062; [7C CD BB, 05, 05]
+12062; [7C CE BB, 05, 05]
-12063; [7C CD C2, 05, 05]
+12063; [7C CE C2, 05, 05]
-12064; [7C CD C9, 05, 05]
+12064; [7C CE C9, 05, 05]
-12065; [7C CD D0, 05, 05]
+12065; [7C CE D0, 05, 05]
-12066; [7C CD D7, 05, 05]
+12066; [7C CE D7, 05, 05]
-12067; [7C CD DE, 05, 05]
+12067; [7C CE DE, 05, 05]
-12068; [7C CD E5, 05, 05]
+12068; [7C CE E5, 05, 05]
-12069; [7C CD EC, 05, 05]
+12069; [7C CE EC, 05, 05]
-1206A; [7C CD F3, 05, 05]
+1206A; [7C CE F3, 05, 05]
-1206B; [7C CD FA, 05, 05]
+1206B; [7C CE FA, 05, 05]
-1206C; [7C CE 03, 05, 05]
+1206C; [7C CF 03, 05, 05]
-1206D; [7C CE 0A, 05, 05]
+1206D; [7C CF 0A, 05, 05]
-1206E; [7C CE 11, 05, 05]
+1206E; [7C CF 11, 05, 05]
-1206F; [7C CE 18, 05, 05]
+1206F; [7C CF 18, 05, 05]
-12070; [7C CE 1F, 05, 05]
+12070; [7C CF 1F, 05, 05]
-12071; [7C CE 26, 05, 05]
+12071; [7C CF 26, 05, 05]
-12072; [7C CE 2D, 05, 05]
+12072; [7C CF 2D, 05, 05]
-12073; [7C CE 34, 05, 05]
+12073; [7C CF 34, 05, 05]
-12074; [7C CE 3B, 05, 05]
+12074; [7C CF 3B, 05, 05]
-12075; [7C CE 42, 05, 05]
+12075; [7C CF 42, 05, 05]
-12076; [7C CE 49, 05, 05]
+12076; [7C CF 49, 05, 05]
-12077; [7C CE 50, 05, 05]
+12077; [7C CF 50, 05, 05]
-12078; [7C CE 57, 05, 05]
+12078; [7C CF 57, 05, 05]
-12079; [7C CE 5E, 05, 05]
+12079; [7C CF 5E, 05, 05]
-1207A; [7C CE 65, 05, 05]
+1207A; [7C CF 65, 05, 05]
-1207B; [7C CE 6C, 05, 05]
+1207B; [7C CF 6C, 05, 05]
-1207C; [7C CE 73, 05, 05]
+1207C; [7C CF 73, 05, 05]
-1207D; [7C CE 7A, 05, 05]
+1207D; [7C CF 7A, 05, 05]
-1207E; [7C CE 81, 05, 05]
+1207E; [7C CF 81, 05, 05]
-1207F; [7C CE 88, 05, 05]
+1207F; [7C CF 88, 05, 05]
-12080; [7C CE 8F, 05, 05]
+12080; [7C CF 8F, 05, 05]
-12081; [7C CE 96, 05, 05]
+12081; [7C CF 96, 05, 05]
-12082; [7C CE 9D, 05, 05]
+12082; [7C CF 9D, 05, 05]
-12083; [7C CE A4, 05, 05]
+12083; [7C CF A4, 05, 05]
-12084; [7C CE AB, 05, 05]
+12084; [7C CF AB, 05, 05]
-12085; [7C CE B2, 05, 05]
+12085; [7C CF B2, 05, 05]
-12086; [7C CE B9, 05, 05]
+12086; [7C CF B9, 05, 05]
-12087; [7C CE C0, 05, 05]
+12087; [7C CF C0, 05, 05]
-12088; [7C CE C7, 05, 05]
+12088; [7C CF C7, 05, 05]
-12089; [7C CE CE, 05, 05]
+12089; [7C CF CE, 05, 05]
-1208A; [7C CE D5, 05, 05]
+1208A; [7C CF D5, 05, 05]
-1208B; [7C CE DC, 05, 05]
+1208B; [7C CF DC, 05, 05]
-1208C; [7C CE E3, 05, 05]
+1208C; [7C CF E3, 05, 05]
-1208D; [7C CE EA, 05, 05]
+1208D; [7C CF EA, 05, 05]
-1208E; [7C CE F1, 05, 05]
+1208E; [7C CF F1, 05, 05]
-1208F; [7C CE F8, 05, 05]
+1208F; [7C CF F8, 05, 05]
-12090; [7C CE FF, 05, 05]
+12090; [7C CF FF, 05, 05]
-12091; [7C CF 08, 05, 05]
+12091; [7C D0 08, 05, 05]
-12092; [7C CF 0F, 05, 05]
+12092; [7C D0 0F, 05, 05]
-12093; [7C CF 16, 05, 05]
+12093; [7C D0 16, 05, 05]
-12094; [7C CF 1D, 05, 05]
+12094; [7C D0 1D, 05, 05]
-12095; [7C CF 24, 05, 05]
+12095; [7C D0 24, 05, 05]
-12096; [7C CF 2B, 05, 05]
+12096; [7C D0 2B, 05, 05]
-12097; [7C CF 32, 05, 05]
+12097; [7C D0 32, 05, 05]
-12098; [7C CF 39, 05, 05]
+12098; [7C D0 39, 05, 05]
-12099; [7C CF 40, 05, 05]
+12099; [7C D0 40, 05, 05]
-1209A; [7C CF 47, 05, 05]
+1209A; [7C D0 47, 05, 05]
-1209B; [7C CF 4E, 05, 05]
+1209B; [7C D0 4E, 05, 05]
-1209C; [7C CF 55, 05, 05]
+1209C; [7C D0 55, 05, 05]
-1209D; [7C CF 5C, 05, 05]
+1209D; [7C D0 5C, 05, 05]
-1209E; [7C CF 63, 05, 05]
+1209E; [7C D0 63, 05, 05]
-1209F; [7C CF 6A, 05, 05]
+1209F; [7C D0 6A, 05, 05]
-120A0; [7C CF 71, 05, 05]
+120A0; [7C D0 71, 05, 05]
-120A1; [7C CF 78, 05, 05]
+120A1; [7C D0 78, 05, 05]
-120A2; [7C CF 7F, 05, 05]
+120A2; [7C D0 7F, 05, 05]
-120A3; [7C CF 86, 05, 05]
+120A3; [7C D0 86, 05, 05]
-120A4; [7C CF 8D, 05, 05]
+120A4; [7C D0 8D, 05, 05]
-120A5; [7C CF 94, 05, 05]
+120A5; [7C D0 94, 05, 05]
-120A6; [7C CF 9B, 05, 05]
+120A6; [7C D0 9B, 05, 05]
-120A7; [7C CF A2, 05, 05]
+120A7; [7C D0 A2, 05, 05]
-120A8; [7C CF A9, 05, 05]
+120A8; [7C D0 A9, 05, 05]
-120A9; [7C CF B0, 05, 05]
+120A9; [7C D0 B0, 05, 05]
-120AA; [7C CF B7, 05, 05]
+120AA; [7C D0 B7, 05, 05]
-120AB; [7C CF BE, 05, 05]
+120AB; [7C D0 BE, 05, 05]
-120AC; [7C CF C5, 05, 05]
+120AC; [7C D0 C5, 05, 05]
-120AD; [7C CF CC, 05, 05]
+120AD; [7C D0 CC, 05, 05]
-120AE; [7C CF D3, 05, 05]
+120AE; [7C D0 D3, 05, 05]
-120AF; [7C CF DA, 05, 05]
+120AF; [7C D0 DA, 05, 05]
-120B0; [7C CF E1, 05, 05]
+120B0; [7C D0 E1, 05, 05]
-120B1; [7C CF E8, 05, 05]
+120B1; [7C D0 E8, 05, 05]
-120B2; [7C CF EF, 05, 05]
+120B2; [7C D0 EF, 05, 05]
-120B3; [7C CF F6, 05, 05]
+120B3; [7C D0 F6, 05, 05]
-120B4; [7C CF FD, 05, 05]
+120B4; [7C D0 FD, 05, 05]
-120B5; [7C D0 06, 05, 05]
+120B5; [7C D1 06, 05, 05]
-120B6; [7C D0 0D, 05, 05]
+120B6; [7C D1 0D, 05, 05]
-120B7; [7C D0 14, 05, 05]
+120B7; [7C D1 14, 05, 05]
-120B8; [7C D0 1B, 05, 05]
+120B8; [7C D1 1B, 05, 05]
-120B9; [7C D0 22, 05, 05]
+120B9; [7C D1 22, 05, 05]
-120BA; [7C D0 29, 05, 05]
+120BA; [7C D1 29, 05, 05]
-120BB; [7C D0 30, 05, 05]
+120BB; [7C D1 30, 05, 05]
-120BC; [7C D0 37, 05, 05]
+120BC; [7C D1 37, 05, 05]
-120BD; [7C D0 3E, 05, 05]
+120BD; [7C D1 3E, 05, 05]
-120BE; [7C D0 45, 05, 05]
+120BE; [7C D1 45, 05, 05]
-120BF; [7C D0 4C, 05, 05]
+120BF; [7C D1 4C, 05, 05]
-120C0; [7C D0 53, 05, 05]
+120C0; [7C D1 53, 05, 05]
-120C1; [7C D0 5A, 05, 05]
+120C1; [7C D1 5A, 05, 05]
-120C2; [7C D0 61, 05, 05]
+120C2; [7C D1 61, 05, 05]
-120C3; [7C D0 68, 05, 05]
+120C3; [7C D1 68, 05, 05]
-120C4; [7C D0 6F, 05, 05]
+120C4; [7C D1 6F, 05, 05]
-120C5; [7C D0 76, 05, 05]
+120C5; [7C D1 76, 05, 05]
-120C6; [7C D0 7D, 05, 05]
+120C6; [7C D1 7D, 05, 05]
-120C7; [7C D0 84, 05, 05]
+120C7; [7C D1 84, 05, 05]
-120C8; [7C D0 8B, 05, 05]
+120C8; [7C D1 8B, 05, 05]
-120C9; [7C D0 92, 05, 05]
+120C9; [7C D1 92, 05, 05]
-120CA; [7C D0 99, 05, 05]
+120CA; [7C D1 99, 05, 05]
-120CB; [7C D0 A0, 05, 05]
+120CB; [7C D1 A0, 05, 05]
-120CC; [7C D0 A7, 05, 05]
+120CC; [7C D1 A7, 05, 05]
-120CD; [7C D0 AE, 05, 05]
+120CD; [7C D1 AE, 05, 05]
-120CE; [7C D0 B5, 05, 05]
+120CE; [7C D1 B5, 05, 05]
-120CF; [7C D0 BC, 05, 05]
+120CF; [7C D1 BC, 05, 05]
-120D0; [7C D0 C3, 05, 05]
+120D0; [7C D1 C3, 05, 05]
-120D1; [7C D0 CA, 05, 05]
+120D1; [7C D1 CA, 05, 05]
-120D2; [7C D0 D1, 05, 05]
+120D2; [7C D1 D1, 05, 05]
-120D3; [7C D0 D8, 05, 05]
+120D3; [7C D1 D8, 05, 05]
-120D4; [7C D0 DF, 05, 05]
+120D4; [7C D1 DF, 05, 05]
-120D5; [7C D0 E6, 05, 05]
+120D5; [7C D1 E6, 05, 05]
-120D6; [7C D0 ED, 05, 05]
+120D6; [7C D1 ED, 05, 05]
-120D7; [7C D0 F4, 05, 05]
+120D7; [7C D1 F4, 05, 05]
-120D8; [7C D0 FB, 05, 05]
+120D8; [7C D1 FB, 05, 05]
-120D9; [7C D1 04, 05, 05]
+120D9; [7C D2 04, 05, 05]
-120DA; [7C D1 0B, 05, 05]
+120DA; [7C D2 0B, 05, 05]
-120DB; [7C D1 12, 05, 05]
+120DB; [7C D2 12, 05, 05]
-120DC; [7C D1 19, 05, 05]
+120DC; [7C D2 19, 05, 05]
-120DD; [7C D1 20, 05, 05]
+120DD; [7C D2 20, 05, 05]
-120DE; [7C D1 27, 05, 05]
+120DE; [7C D2 27, 05, 05]
-120DF; [7C D1 2E, 05, 05]
+120DF; [7C D2 2E, 05, 05]
-120E0; [7C D1 35, 05, 05]
+120E0; [7C D2 35, 05, 05]
-120E1; [7C D1 3C, 05, 05]
+120E1; [7C D2 3C, 05, 05]
-120E2; [7C D1 43, 05, 05]
+120E2; [7C D2 43, 05, 05]
-120E3; [7C D1 4A, 05, 05]
+120E3; [7C D2 4A, 05, 05]
-120E4; [7C D1 51, 05, 05]
+120E4; [7C D2 51, 05, 05]
-120E5; [7C D1 58, 05, 05]
+120E5; [7C D2 58, 05, 05]
-120E6; [7C D1 5F, 05, 05]
+120E6; [7C D2 5F, 05, 05]
-120E7; [7C D1 66, 05, 05]
+120E7; [7C D2 66, 05, 05]
-120E8; [7C D1 6D, 05, 05]
+120E8; [7C D2 6D, 05, 05]
-120E9; [7C D1 74, 05, 05]
+120E9; [7C D2 74, 05, 05]
-120EA; [7C D1 7B, 05, 05]
+120EA; [7C D2 7B, 05, 05]
-120EB; [7C D1 82, 05, 05]
+120EB; [7C D2 82, 05, 05]
-120EC; [7C D1 89, 05, 05]
+120EC; [7C D2 89, 05, 05]
-120ED; [7C D1 90, 05, 05]
+120ED; [7C D2 90, 05, 05]
-120EE; [7C D1 97, 05, 05]
+120EE; [7C D2 97, 05, 05]
-120EF; [7C D1 9E, 05, 05]
+120EF; [7C D2 9E, 05, 05]
-120F0; [7C D1 A5, 05, 05]
+120F0; [7C D2 A5, 05, 05]
-120F1; [7C D1 AC, 05, 05]
+120F1; [7C D2 AC, 05, 05]
-120F2; [7C D1 B3, 05, 05]
+120F2; [7C D2 B3, 05, 05]
-120F3; [7C D1 BA, 05, 05]
+120F3; [7C D2 BA, 05, 05]
-120F4; [7C D1 C1, 05, 05]
+120F4; [7C D2 C1, 05, 05]
-120F5; [7C D1 C8, 05, 05]
+120F5; [7C D2 C8, 05, 05]
-120F6; [7C D1 CF, 05, 05]
+120F6; [7C D2 CF, 05, 05]
-120F7; [7C D1 D6, 05, 05]
+120F7; [7C D2 D6, 05, 05]
-120F8; [7C D1 DD, 05, 05]
+120F8; [7C D2 DD, 05, 05]
-120F9; [7C D1 E4, 05, 05]
+120F9; [7C D2 E4, 05, 05]
-120FA; [7C D1 EB, 05, 05]
+120FA; [7C D2 EB, 05, 05]
-120FB; [7C D1 F2, 05, 05]
+120FB; [7C D2 F2, 05, 05]
-120FC; [7C D1 F9, 05, 05]
+120FC; [7C D2 F9, 05, 05]
-120FD; [7C D2 02, 05, 05]
+120FD; [7C D3 02, 05, 05]
-120FE; [7C D2 09, 05, 05]
+120FE; [7C D3 09, 05, 05]
-120FF; [7C D2 10, 05, 05]
+120FF; [7C D3 10, 05, 05]
-12100; [7C D2 17, 05, 05]
+12100; [7C D3 17, 05, 05]
-12101; [7C D2 1E, 05, 05]
+12101; [7C D3 1E, 05, 05]
-12102; [7C D2 25, 05, 05]
+12102; [7C D3 25, 05, 05]
-12103; [7C D2 2C, 05, 05]
+12103; [7C D3 2C, 05, 05]
-12104; [7C D2 33, 05, 05]
+12104; [7C D3 33, 05, 05]
-12105; [7C D2 3A, 05, 05]
+12105; [7C D3 3A, 05, 05]
-12106; [7C D2 41, 05, 05]
+12106; [7C D3 41, 05, 05]
-12107; [7C D2 48, 05, 05]
+12107; [7C D3 48, 05, 05]
-12108; [7C D2 4F, 05, 05]
+12108; [7C D3 4F, 05, 05]
-12109; [7C D2 56, 05, 05]
+12109; [7C D3 56, 05, 05]
-1210A; [7C D2 5D, 05, 05]
+1210A; [7C D3 5D, 05, 05]
-1210B; [7C D2 64, 05, 05]
+1210B; [7C D3 64, 05, 05]
-1210C; [7C D2 6B, 05, 05]
+1210C; [7C D3 6B, 05, 05]
-1210D; [7C D2 72, 05, 05]
+1210D; [7C D3 72, 05, 05]
-1210E; [7C D2 79, 05, 05]
+1210E; [7C D3 79, 05, 05]
-1210F; [7C D2 80, 05, 05]
+1210F; [7C D3 80, 05, 05]
-12110; [7C D2 87, 05, 05]
+12110; [7C D3 87, 05, 05]
-12111; [7C D2 8E, 05, 05]
+12111; [7C D3 8E, 05, 05]
-12112; [7C D2 95, 05, 05]
+12112; [7C D3 95, 05, 05]
-12113; [7C D2 9C, 05, 05]
+12113; [7C D3 9C, 05, 05]
-12114; [7C D2 A3, 05, 05]
+12114; [7C D3 A3, 05, 05]
-12115; [7C D2 AA, 05, 05]
+12115; [7C D3 AA, 05, 05]
-12116; [7C D2 B1, 05, 05]
+12116; [7C D3 B1, 05, 05]
-12117; [7C D2 B8, 05, 05]
+12117; [7C D3 B8, 05, 05]
-12118; [7C D2 BF, 05, 05]
+12118; [7C D3 BF, 05, 05]
-12119; [7C D2 C6, 05, 05]
+12119; [7C D3 C6, 05, 05]
-1211A; [7C D2 CD, 05, 05]
+1211A; [7C D3 CD, 05, 05]
-1211B; [7C D2 D4, 05, 05]
+1211B; [7C D3 D4, 05, 05]
-1211C; [7C D2 DB, 05, 05]
+1211C; [7C D3 DB, 05, 05]
-1211D; [7C D2 E2, 05, 05]
+1211D; [7C D3 E2, 05, 05]
-1211E; [7C D2 E9, 05, 05]
+1211E; [7C D3 E9, 05, 05]
-1211F; [7C D2 F0, 05, 05]
+1211F; [7C D3 F0, 05, 05]
-12120; [7C D2 F7, 05, 05]
+12120; [7C D3 F7, 05, 05]
-12121; [7C D2 FE, 05, 05]
+12121; [7C D3 FE, 05, 05]
-12122; [7C D3 07, 05, 05]
+12122; [7C D4 07, 05, 05]
-12123; [7C D3 0E, 05, 05]
+12123; [7C D4 0E, 05, 05]
-12124; [7C D3 15, 05, 05]
+12124; [7C D4 15, 05, 05]
-12125; [7C D3 1C, 05, 05]
+12125; [7C D4 1C, 05, 05]
-12126; [7C D3 23, 05, 05]
+12126; [7C D4 23, 05, 05]
-12127; [7C D3 2A, 05, 05]
+12127; [7C D4 2A, 05, 05]
-12128; [7C D3 31, 05, 05]
+12128; [7C D4 31, 05, 05]
-12129; [7C D3 38, 05, 05]
+12129; [7C D4 38, 05, 05]
-1212A; [7C D3 3F, 05, 05]
+1212A; [7C D4 3F, 05, 05]
-1212B; [7C D3 46, 05, 05]
+1212B; [7C D4 46, 05, 05]
-1212C; [7C D3 4D, 05, 05]
+1212C; [7C D4 4D, 05, 05]
-1212D; [7C D3 54, 05, 05]
+1212D; [7C D4 54, 05, 05]
-1212E; [7C D3 5B, 05, 05]
+1212E; [7C D4 5B, 05, 05]
-1212F; [7C D3 62, 05, 05]
+1212F; [7C D4 62, 05, 05]
-12130; [7C D3 69, 05, 05]
+12130; [7C D4 69, 05, 05]
-12131; [7C D3 70, 05, 05]
+12131; [7C D4 70, 05, 05]
-12132; [7C D3 77, 05, 05]
+12132; [7C D4 77, 05, 05]
-12133; [7C D3 7E, 05, 05]
+12133; [7C D4 7E, 05, 05]
-12134; [7C D3 85, 05, 05]
+12134; [7C D4 85, 05, 05]
-12135; [7C D3 8C, 05, 05]
+12135; [7C D4 8C, 05, 05]
-12136; [7C D3 93, 05, 05]
+12136; [7C D4 93, 05, 05]
-12137; [7C D3 9A, 05, 05]
+12137; [7C D4 9A, 05, 05]
-12138; [7C D3 A1, 05, 05]
+12138; [7C D4 A1, 05, 05]
-12139; [7C D3 A8, 05, 05]
+12139; [7C D4 A8, 05, 05]
-1213A; [7C D3 AF, 05, 05]
+1213A; [7C D4 AF, 05, 05]
-1213B; [7C D3 B6, 05, 05]
+1213B; [7C D4 B6, 05, 05]
-1213C; [7C D3 BD, 05, 05]
+1213C; [7C D4 BD, 05, 05]
-1213D; [7C D3 C4, 05, 05]
+1213D; [7C D4 C4, 05, 05]
-1213E; [7C D3 CB, 05, 05]
+1213E; [7C D4 CB, 05, 05]
-1213F; [7C D3 D2, 05, 05]
+1213F; [7C D4 D2, 05, 05]
-12140; [7C D3 D9, 05, 05]
+12140; [7C D4 D9, 05, 05]
-12141; [7C D3 E0, 05, 05]
+12141; [7C D4 E0, 05, 05]
-12142; [7C D3 E7, 05, 05]
+12142; [7C D4 E7, 05, 05]
-12143; [7C D3 EE, 05, 05]
+12143; [7C D4 EE, 05, 05]
-12144; [7C D3 F5, 05, 05]
+12144; [7C D4 F5, 05, 05]
-12145; [7C D3 FC, 05, 05]
+12145; [7C D4 FC, 05, 05]
-12146; [7C D4 05, 05, 05]
+12146; [7C D5 05, 05, 05]
-12147; [7C D4 0C, 05, 05]
+12147; [7C D5 0C, 05, 05]
-12148; [7C D4 13, 05, 05]
+12148; [7C D5 13, 05, 05]
-12149; [7C D4 1A, 05, 05]
+12149; [7C D5 1A, 05, 05]
-1214A; [7C D4 21, 05, 05]
+1214A; [7C D5 21, 05, 05]
-1214B; [7C D4 28, 05, 05]
+1214B; [7C D5 28, 05, 05]
-1214C; [7C D4 2F, 05, 05]
+1214C; [7C D5 2F, 05, 05]
-1214D; [7C D4 36, 05, 05]
+1214D; [7C D5 36, 05, 05]
-1214E; [7C D4 3D, 05, 05]
+1214E; [7C D5 3D, 05, 05]
-1214F; [7C D4 44, 05, 05]
+1214F; [7C D5 44, 05, 05]
-12150; [7C D4 4B, 05, 05]
+12150; [7C D5 4B, 05, 05]
-12151; [7C D4 52, 05, 05]
+12151; [7C D5 52, 05, 05]
-12152; [7C D4 59, 05, 05]
+12152; [7C D5 59, 05, 05]
-12153; [7C D4 60, 05, 05]
+12153; [7C D5 60, 05, 05]
-12154; [7C D4 67, 05, 05]
+12154; [7C D5 67, 05, 05]
-12155; [7C D4 6E, 05, 05]
+12155; [7C D5 6E, 05, 05]
-12156; [7C D4 75, 05, 05]
+12156; [7C D5 75, 05, 05]
-12157; [7C D4 7C, 05, 05]
+12157; [7C D5 7C, 05, 05]
-12158; [7C D4 83, 05, 05]
+12158; [7C D5 83, 05, 05]
-12159; [7C D4 8A, 05, 05]
+12159; [7C D5 8A, 05, 05]
-1215A; [7C D4 91, 05, 05]
+1215A; [7C D5 91, 05, 05]
-1215B; [7C D4 98, 05, 05]
+1215B; [7C D5 98, 05, 05]
-1215C; [7C D4 9F, 05, 05]
+1215C; [7C D5 9F, 05, 05]
-1215D; [7C D4 A6, 05, 05]
+1215D; [7C D5 A6, 05, 05]
-1215E; [7C D4 AD, 05, 05]
+1215E; [7C D5 AD, 05, 05]
-1215F; [7C D4 B4, 05, 05]
+1215F; [7C D5 B4, 05, 05]
-12160; [7C D4 BB, 05, 05]
+12160; [7C D5 BB, 05, 05]
-12161; [7C D4 C2, 05, 05]
+12161; [7C D5 C2, 05, 05]
-12162; [7C D4 C9, 05, 05]
+12162; [7C D5 C9, 05, 05]
-12163; [7C D4 D0, 05, 05]
+12163; [7C D5 D0, 05, 05]
-12164; [7C D4 D7, 05, 05]
+12164; [7C D5 D7, 05, 05]
-12165; [7C D4 DE, 05, 05]
+12165; [7C D5 DE, 05, 05]
-12166; [7C D4 E5, 05, 05]
+12166; [7C D5 E5, 05, 05]
-12167; [7C D4 EC, 05, 05]
+12167; [7C D5 EC, 05, 05]
-12168; [7C D4 F3, 05, 05]
+12168; [7C D5 F3, 05, 05]
-12169; [7C D4 FA, 05, 05]
+12169; [7C D5 FA, 05, 05]
-1216A; [7C D5 03, 05, 05]
+1216A; [7C D6 03, 05, 05]
-1216B; [7C D5 0A, 05, 05]
+1216B; [7C D6 0A, 05, 05]
-1216C; [7C D5 11, 05, 05]
+1216C; [7C D6 11, 05, 05]
-1216D; [7C D5 18, 05, 05]
+1216D; [7C D6 18, 05, 05]
-1216E; [7C D5 1F, 05, 05]
+1216E; [7C D6 1F, 05, 05]
-1216F; [7C D5 26, 05, 05]
+1216F; [7C D6 26, 05, 05]
-12170; [7C D5 2D, 05, 05]
+12170; [7C D6 2D, 05, 05]
-12171; [7C D5 34, 05, 05]
+12171; [7C D6 34, 05, 05]
-12172; [7C D5 3B, 05, 05]
+12172; [7C D6 3B, 05, 05]
-12173; [7C D5 42, 05, 05]
+12173; [7C D6 42, 05, 05]
-12174; [7C D5 49, 05, 05]
+12174; [7C D6 49, 05, 05]
-12175; [7C D5 50, 05, 05]
+12175; [7C D6 50, 05, 05]
-12176; [7C D5 57, 05, 05]
+12176; [7C D6 57, 05, 05]
-12177; [7C D5 5E, 05, 05]
+12177; [7C D6 5E, 05, 05]
-12178; [7C D5 65, 05, 05]
+12178; [7C D6 65, 05, 05]
-12179; [7C D5 6C, 05, 05]
+12179; [7C D6 6C, 05, 05]
-1217A; [7C D5 73, 05, 05]
+1217A; [7C D6 73, 05, 05]
-1217B; [7C D5 7A, 05, 05]
+1217B; [7C D6 7A, 05, 05]
-1217C; [7C D5 81, 05, 05]
+1217C; [7C D6 81, 05, 05]
-1217D; [7C D5 88, 05, 05]
+1217D; [7C D6 88, 05, 05]
-1217E; [7C D5 8F, 05, 05]
+1217E; [7C D6 8F, 05, 05]
-1217F; [7C D5 96, 05, 05]
+1217F; [7C D6 96, 05, 05]
-12180; [7C D5 9D, 05, 05]
+12180; [7C D6 9D, 05, 05]
-12181; [7C D5 A4, 05, 05]
+12181; [7C D6 A4, 05, 05]
-12182; [7C D5 AB, 05, 05]
+12182; [7C D6 AB, 05, 05]
-12183; [7C D5 B2, 05, 05]
+12183; [7C D6 B2, 05, 05]
-12184; [7C D5 B9, 05, 05]
+12184; [7C D6 B9, 05, 05]
-12185; [7C D5 C0, 05, 05]
+12185; [7C D6 C0, 05, 05]
-12186; [7C D5 C7, 05, 05]
+12186; [7C D6 C7, 05, 05]
-12187; [7C D5 CE, 05, 05]
+12187; [7C D6 CE, 05, 05]
-12188; [7C D5 D5, 05, 05]
+12188; [7C D6 D5, 05, 05]
-12189; [7C D5 DC, 05, 05]
+12189; [7C D6 DC, 05, 05]
-1218A; [7C D5 E3, 05, 05]
+1218A; [7C D6 E3, 05, 05]
-1218B; [7C D5 EA, 05, 05]
+1218B; [7C D6 EA, 05, 05]
-1218C; [7C D5 F1, 05, 05]
+1218C; [7C D6 F1, 05, 05]
-1218D; [7C D5 F8, 05, 05]
+1218D; [7C D6 F8, 05, 05]
-1218E; [7C D5 FF, 05, 05]
+1218E; [7C D6 FF, 05, 05]
-1218F; [7C D6 08, 05, 05]
+1218F; [7C D7 08, 05, 05]
-12190; [7C D6 0F, 05, 05]
+12190; [7C D7 0F, 05, 05]
-12191; [7C D6 16, 05, 05]
+12191; [7C D7 16, 05, 05]
-12192; [7C D6 1D, 05, 05]
+12192; [7C D7 1D, 05, 05]
-12193; [7C D6 24, 05, 05]
+12193; [7C D7 24, 05, 05]
-12194; [7C D6 2B, 05, 05]
+12194; [7C D7 2B, 05, 05]
-12195; [7C D6 32, 05, 05]
+12195; [7C D7 32, 05, 05]
-12196; [7C D6 39, 05, 05]
+12196; [7C D7 39, 05, 05]
-12197; [7C D6 40, 05, 05]
+12197; [7C D7 40, 05, 05]
-12198; [7C D6 47, 05, 05]
+12198; [7C D7 47, 05, 05]
-12199; [7C D6 4E, 05, 05]
+12199; [7C D7 4E, 05, 05]
-1219A; [7C D6 55, 05, 05]
+1219A; [7C D7 55, 05, 05]
-1219B; [7C D6 5C, 05, 05]
+1219B; [7C D7 5C, 05, 05]
-1219C; [7C D6 63, 05, 05]
+1219C; [7C D7 63, 05, 05]
-1219D; [7C D6 6A, 05, 05]
+1219D; [7C D7 6A, 05, 05]
-1219E; [7C D6 71, 05, 05]
+1219E; [7C D7 71, 05, 05]
-1219F; [7C D6 78, 05, 05]
+1219F; [7C D7 78, 05, 05]
-121A0; [7C D6 7F, 05, 05]
+121A0; [7C D7 7F, 05, 05]
-121A1; [7C D6 86, 05, 05]
+121A1; [7C D7 86, 05, 05]
-121A2; [7C D6 8D, 05, 05]
+121A2; [7C D7 8D, 05, 05]
-121A3; [7C D6 94, 05, 05]
+121A3; [7C D7 94, 05, 05]
-121A4; [7C D6 9B, 05, 05]
+121A4; [7C D7 9B, 05, 05]
-121A5; [7C D6 A2, 05, 05]
+121A5; [7C D7 A2, 05, 05]
-121A6; [7C D6 A9, 05, 05]
+121A6; [7C D7 A9, 05, 05]
-121A7; [7C D6 B0, 05, 05]
+121A7; [7C D7 B0, 05, 05]
-121A8; [7C D6 B7, 05, 05]
+121A8; [7C D7 B7, 05, 05]
-121A9; [7C D6 BE, 05, 05]
+121A9; [7C D7 BE, 05, 05]
-121AA; [7C D6 C5, 05, 05]
+121AA; [7C D7 C5, 05, 05]
-121AB; [7C D6 CC, 05, 05]
+121AB; [7C D7 CC, 05, 05]
-121AC; [7C D6 D3, 05, 05]
+121AC; [7C D7 D3, 05, 05]
-121AD; [7C D6 DA, 05, 05]
+121AD; [7C D7 DA, 05, 05]
-121AE; [7C D6 E1, 05, 05]
+121AE; [7C D7 E1, 05, 05]
-121AF; [7C D6 E8, 05, 05]
+121AF; [7C D7 E8, 05, 05]
-121B0; [7C D6 EF, 05, 05]
+121B0; [7C D7 EF, 05, 05]
-121B1; [7C D6 F6, 05, 05]
+121B1; [7C D7 F6, 05, 05]
-121B2; [7C D6 FD, 05, 05]
+121B2; [7C D7 FD, 05, 05]
-121B3; [7C D7 06, 05, 05]
+121B3; [7C D8 06, 05, 05]
-121B4; [7C D7 0D, 05, 05]
+121B4; [7C D8 0D, 05, 05]
-121B5; [7C D7 14, 05, 05]
+121B5; [7C D8 14, 05, 05]
-121B6; [7C D7 1B, 05, 05]
+121B6; [7C D8 1B, 05, 05]
-121B7; [7C D7 22, 05, 05]
+121B7; [7C D8 22, 05, 05]
-121B8; [7C D7 29, 05, 05]
+121B8; [7C D8 29, 05, 05]
-121B9; [7C D7 30, 05, 05]
+121B9; [7C D8 30, 05, 05]
-121BA; [7C D7 37, 05, 05]
+121BA; [7C D8 37, 05, 05]
-121BB; [7C D7 3E, 05, 05]
+121BB; [7C D8 3E, 05, 05]
-121BC; [7C D7 45, 05, 05]
+121BC; [7C D8 45, 05, 05]
-121BD; [7C D7 4C, 05, 05]
+121BD; [7C D8 4C, 05, 05]
-121BE; [7C D7 53, 05, 05]
+121BE; [7C D8 53, 05, 05]
-121BF; [7C D7 5A, 05, 05]
+121BF; [7C D8 5A, 05, 05]
-121C0; [7C D7 61, 05, 05]
+121C0; [7C D8 61, 05, 05]
-121C1; [7C D7 68, 05, 05]
+121C1; [7C D8 68, 05, 05]
-121C2; [7C D7 6F, 05, 05]
+121C2; [7C D8 6F, 05, 05]
-121C3; [7C D7 76, 05, 05]
+121C3; [7C D8 76, 05, 05]
-121C4; [7C D7 7D, 05, 05]
+121C4; [7C D8 7D, 05, 05]
-121C5; [7C D7 84, 05, 05]
+121C5; [7C D8 84, 05, 05]
-121C6; [7C D7 8B, 05, 05]
+121C6; [7C D8 8B, 05, 05]
-121C7; [7C D7 92, 05, 05]
+121C7; [7C D8 92, 05, 05]
-121C8; [7C D7 99, 05, 05]
+121C8; [7C D8 99, 05, 05]
-121C9; [7C D7 A0, 05, 05]
+121C9; [7C D8 A0, 05, 05]
-121CA; [7C D7 A7, 05, 05]
+121CA; [7C D8 A7, 05, 05]
-121CB; [7C D7 AE, 05, 05]
+121CB; [7C D8 AE, 05, 05]
-121CC; [7C D7 B5, 05, 05]
+121CC; [7C D8 B5, 05, 05]
-121CD; [7C D7 BC, 05, 05]
+121CD; [7C D8 BC, 05, 05]
-121CE; [7C D7 C3, 05, 05]
+121CE; [7C D8 C3, 05, 05]
-121CF; [7C D7 CA, 05, 05]
+121CF; [7C D8 CA, 05, 05]
-121D0; [7C D7 D1, 05, 05]
+121D0; [7C D8 D1, 05, 05]
-121D1; [7C D7 D8, 05, 05]
+121D1; [7C D8 D8, 05, 05]
-121D2; [7C D7 DF, 05, 05]
+121D2; [7C D8 DF, 05, 05]
-121D3; [7C D7 E6, 05, 05]
+121D3; [7C D8 E6, 05, 05]
-121D4; [7C D7 ED, 05, 05]
+121D4; [7C D8 ED, 05, 05]
-121D5; [7C D7 F4, 05, 05]
+121D5; [7C D8 F4, 05, 05]
-121D6; [7C D7 FB, 05, 05]
+121D6; [7C D8 FB, 05, 05]
-121D7; [7C D8 04, 05, 05]
+121D7; [7C D9 04, 05, 05]
-121D8; [7C D8 0B, 05, 05]
+121D8; [7C D9 0B, 05, 05]
-121D9; [7C D8 12, 05, 05]
+121D9; [7C D9 12, 05, 05]
-121DA; [7C D8 19, 05, 05]
+121DA; [7C D9 19, 05, 05]
-121DB; [7C D8 20, 05, 05]
+121DB; [7C D9 20, 05, 05]
-121DC; [7C D8 27, 05, 05]
+121DC; [7C D9 27, 05, 05]
-121DD; [7C D8 2E, 05, 05]
+121DD; [7C D9 2E, 05, 05]
-121DE; [7C D8 35, 05, 05]
+121DE; [7C D9 35, 05, 05]
-121DF; [7C D8 3C, 05, 05]
+121DF; [7C D9 3C, 05, 05]
-121E0; [7C D8 43, 05, 05]
+121E0; [7C D9 43, 05, 05]
-121E1; [7C D8 4A, 05, 05]
+121E1; [7C D9 4A, 05, 05]
-121E2; [7C D8 51, 05, 05]
+121E2; [7C D9 51, 05, 05]
-121E3; [7C D8 58, 05, 05]
+121E3; [7C D9 58, 05, 05]
-121E4; [7C D8 5F, 05, 05]
+121E4; [7C D9 5F, 05, 05]
-121E5; [7C D8 66, 05, 05]
+121E5; [7C D9 66, 05, 05]
-121E6; [7C D8 6D, 05, 05]
+121E6; [7C D9 6D, 05, 05]
-121E7; [7C D8 74, 05, 05]
+121E7; [7C D9 74, 05, 05]
-121E8; [7C D8 7B, 05, 05]
+121E8; [7C D9 7B, 05, 05]
-121E9; [7C D8 82, 05, 05]
+121E9; [7C D9 82, 05, 05]
-121EA; [7C D8 89, 05, 05]
+121EA; [7C D9 89, 05, 05]
-121EB; [7C D8 90, 05, 05]
+121EB; [7C D9 90, 05, 05]
-121EC; [7C D8 97, 05, 05]
+121EC; [7C D9 97, 05, 05]
-121ED; [7C D8 9E, 05, 05]
+121ED; [7C D9 9E, 05, 05]
-121EE; [7C D8 A5, 05, 05]
+121EE; [7C D9 A5, 05, 05]
-121EF; [7C D8 AC, 05, 05]
+121EF; [7C D9 AC, 05, 05]
-121F0; [7C D8 B3, 05, 05]
+121F0; [7C D9 B3, 05, 05]
-121F1; [7C D8 BA, 05, 05]
+121F1; [7C D9 BA, 05, 05]
-121F2; [7C D8 C1, 05, 05]
+121F2; [7C D9 C1, 05, 05]
-121F3; [7C D8 C8, 05, 05]
+121F3; [7C D9 C8, 05, 05]
-121F4; [7C D8 CF, 05, 05]
+121F4; [7C D9 CF, 05, 05]
-121F5; [7C D8 D6, 05, 05]
+121F5; [7C D9 D6, 05, 05]
-121F6; [7C D8 DD, 05, 05]
+121F6; [7C D9 DD, 05, 05]
-121F7; [7C D8 E4, 05, 05]
+121F7; [7C D9 E4, 05, 05]
-121F8; [7C D8 EB, 05, 05]
+121F8; [7C D9 EB, 05, 05]
-121F9; [7C D8 F2, 05, 05]
+121F9; [7C D9 F2, 05, 05]
-121FA; [7C D8 F9, 05, 05]
+121FA; [7C D9 F9, 05, 05]
-121FB; [7C D9 02, 05, 05]
+121FB; [7C DA 02, 05, 05]
-121FC; [7C D9 09, 05, 05]
+121FC; [7C DA 09, 05, 05]
-121FD; [7C D9 10, 05, 05]
+121FD; [7C DA 10, 05, 05]
-121FE; [7C D9 17, 05, 05]
+121FE; [7C DA 17, 05, 05]
-121FF; [7C D9 1E, 05, 05]
+121FF; [7C DA 1E, 05, 05]
-12200; [7C D9 25, 05, 05]
+12200; [7C DA 25, 05, 05]
-12201; [7C D9 2C, 05, 05]
+12201; [7C DA 2C, 05, 05]
-12202; [7C D9 33, 05, 05]
+12202; [7C DA 33, 05, 05]
-12203; [7C D9 3A, 05, 05]
+12203; [7C DA 3A, 05, 05]
-12204; [7C D9 41, 05, 05]
+12204; [7C DA 41, 05, 05]
-12205; [7C D9 48, 05, 05]
+12205; [7C DA 48, 05, 05]
-12206; [7C D9 4F, 05, 05]
+12206; [7C DA 4F, 05, 05]
-12207; [7C D9 56, 05, 05]
+12207; [7C DA 56, 05, 05]
-12208; [7C D9 5D, 05, 05]
+12208; [7C DA 5D, 05, 05]
-12209; [7C D9 64, 05, 05]
+12209; [7C DA 64, 05, 05]
-1220A; [7C D9 6B, 05, 05]
+1220A; [7C DA 6B, 05, 05]
-1220B; [7C D9 72, 05, 05]
+1220B; [7C DA 72, 05, 05]
-1220C; [7C D9 79, 05, 05]
+1220C; [7C DA 79, 05, 05]
-1220D; [7C D9 80, 05, 05]
+1220D; [7C DA 80, 05, 05]
-1220E; [7C D9 87, 05, 05]
+1220E; [7C DA 87, 05, 05]
-1220F; [7C D9 8E, 05, 05]
+1220F; [7C DA 8E, 05, 05]
-12210; [7C D9 95, 05, 05]
+12210; [7C DA 95, 05, 05]
-12211; [7C D9 9C, 05, 05]
+12211; [7C DA 9C, 05, 05]
-12212; [7C D9 A3, 05, 05]
+12212; [7C DA A3, 05, 05]
-12213; [7C D9 AA, 05, 05]
+12213; [7C DA AA, 05, 05]
-12214; [7C D9 B1, 05, 05]
+12214; [7C DA B1, 05, 05]
-12215; [7C D9 B8, 05, 05]
+12215; [7C DA B8, 05, 05]
-12216; [7C D9 BF, 05, 05]
+12216; [7C DA BF, 05, 05]
-12217; [7C D9 C6, 05, 05]
+12217; [7C DA C6, 05, 05]
-12218; [7C D9 CD, 05, 05]
+12218; [7C DA CD, 05, 05]
-12219; [7C D9 D4, 05, 05]
+12219; [7C DA D4, 05, 05]
-1221A; [7C D9 DB, 05, 05]
+1221A; [7C DA DB, 05, 05]
-1221B; [7C D9 E2, 05, 05]
+1221B; [7C DA E2, 05, 05]
-1221C; [7C D9 E9, 05, 05]
+1221C; [7C DA E9, 05, 05]
-1221D; [7C D9 F0, 05, 05]
+1221D; [7C DA F0, 05, 05]
-1221E; [7C D9 F7, 05, 05]
+1221E; [7C DA F7, 05, 05]
-1221F; [7C D9 FE, 05, 05]
+1221F; [7C DA FE, 05, 05]
-12220; [7C DA 07, 05, 05]
+12220; [7C DB 07, 05, 05]
-12221; [7C DA 0E, 05, 05]
+12221; [7C DB 0E, 05, 05]
-12222; [7C DA 15, 05, 05]
+12222; [7C DB 15, 05, 05]
-12223; [7C DA 1C, 05, 05]
+12223; [7C DB 1C, 05, 05]
-12224; [7C DA 23, 05, 05]
+12224; [7C DB 23, 05, 05]
-12225; [7C DA 2A, 05, 05]
+12225; [7C DB 2A, 05, 05]
-12226; [7C DA 31, 05, 05]
+12226; [7C DB 31, 05, 05]
-12227; [7C DA 38, 05, 05]
+12227; [7C DB 38, 05, 05]
-12228; [7C DA 3F, 05, 05]
+12228; [7C DB 3F, 05, 05]
-12229; [7C DA 46, 05, 05]
+12229; [7C DB 46, 05, 05]
-1222A; [7C DA 4D, 05, 05]
+1222A; [7C DB 4D, 05, 05]
-1222B; [7C DA 54, 05, 05]
+1222B; [7C DB 54, 05, 05]
-1222C; [7C DA 5B, 05, 05]
+1222C; [7C DB 5B, 05, 05]
-1222D; [7C DA 62, 05, 05]
+1222D; [7C DB 62, 05, 05]
-1222E; [7C DA 69, 05, 05]
+1222E; [7C DB 69, 05, 05]
-1222F; [7C DA 70, 05, 05]
+1222F; [7C DB 70, 05, 05]
-12230; [7C DA 77, 05, 05]
+12230; [7C DB 77, 05, 05]
-12231; [7C DA 7E, 05, 05]
+12231; [7C DB 7E, 05, 05]
-12232; [7C DA 85, 05, 05]
+12232; [7C DB 85, 05, 05]
-12233; [7C DA 8C, 05, 05]
+12233; [7C DB 8C, 05, 05]
-12234; [7C DA 93, 05, 05]
+12234; [7C DB 93, 05, 05]
-12235; [7C DA 9A, 05, 05]
+12235; [7C DB 9A, 05, 05]
-12236; [7C DA A1, 05, 05]
+12236; [7C DB A1, 05, 05]
-12237; [7C DA A8, 05, 05]
+12237; [7C DB A8, 05, 05]
-12238; [7C DA AF, 05, 05]
+12238; [7C DB AF, 05, 05]
-12239; [7C DA B6, 05, 05]
+12239; [7C DB B6, 05, 05]
-1223A; [7C DA BD, 05, 05]
+1223A; [7C DB BD, 05, 05]
-1223B; [7C DA C4, 05, 05]
+1223B; [7C DB C4, 05, 05]
-1223C; [7C DA CB, 05, 05]
+1223C; [7C DB CB, 05, 05]
-1223D; [7C DA D2, 05, 05]
+1223D; [7C DB D2, 05, 05]
-1223E; [7C DA D9, 05, 05]
+1223E; [7C DB D9, 05, 05]
-1223F; [7C DA E0, 05, 05]
+1223F; [7C DB E0, 05, 05]
-12240; [7C DA E7, 05, 05]
+12240; [7C DB E7, 05, 05]
-12241; [7C DA EE, 05, 05]
+12241; [7C DB EE, 05, 05]
-12242; [7C DA F5, 05, 05]
+12242; [7C DB F5, 05, 05]
-12243; [7C DA FC, 05, 05]
+12243; [7C DB FC, 05, 05]
-12244; [7C DB 05, 05, 05]
+12244; [7C DC 05, 05, 05]
-12245; [7C DB 0C, 05, 05]
+12245; [7C DC 0C, 05, 05]
-12246; [7C DB 13, 05, 05]
+12246; [7C DC 13, 05, 05]
-12247; [7C DB 1A, 05, 05]
+12247; [7C DC 1A, 05, 05]
-12248; [7C DB 21, 05, 05]
+12248; [7C DC 21, 05, 05]
-12249; [7C DB 28, 05, 05]
+12249; [7C DC 28, 05, 05]
-1224A; [7C DB 2F, 05, 05]
+1224A; [7C DC 2F, 05, 05]
-1224B; [7C DB 36, 05, 05]
+1224B; [7C DC 36, 05, 05]
-1224C; [7C DB 3D, 05, 05]
+1224C; [7C DC 3D, 05, 05]
-1224D; [7C DB 44, 05, 05]
+1224D; [7C DC 44, 05, 05]
-1224E; [7C DB 4B, 05, 05]
+1224E; [7C DC 4B, 05, 05]
-1224F; [7C DB 52, 05, 05]
+1224F; [7C DC 52, 05, 05]
-12250; [7C DB 59, 05, 05]
+12250; [7C DC 59, 05, 05]
-12251; [7C DB 60, 05, 05]
+12251; [7C DC 60, 05, 05]
-12252; [7C DB 67, 05, 05]
+12252; [7C DC 67, 05, 05]
-12253; [7C DB 6E, 05, 05]
+12253; [7C DC 6E, 05, 05]
-12254; [7C DB 75, 05, 05]
+12254; [7C DC 75, 05, 05]
-12255; [7C DB 7C, 05, 05]
+12255; [7C DC 7C, 05, 05]
-12256; [7C DB 83, 05, 05]
+12256; [7C DC 83, 05, 05]
-12257; [7C DB 8A, 05, 05]
+12257; [7C DC 8A, 05, 05]
-12258; [7C DB 91, 05, 05]
+12258; [7C DC 91, 05, 05]
-12259; [7C DB 98, 05, 05]
+12259; [7C DC 98, 05, 05]
-1225A; [7C DB 9F, 05, 05]
+1225A; [7C DC 9F, 05, 05]
-1225B; [7C DB A6, 05, 05]
+1225B; [7C DC A6, 05, 05]
-1225C; [7C DB AD, 05, 05]
+1225C; [7C DC AD, 05, 05]
-1225D; [7C DB B4, 05, 05]
+1225D; [7C DC B4, 05, 05]
-1225E; [7C DB BB, 05, 05]
+1225E; [7C DC BB, 05, 05]
-1225F; [7C DB C2, 05, 05]
+1225F; [7C DC C2, 05, 05]
-12260; [7C DB C9, 05, 05]
+12260; [7C DC C9, 05, 05]
-12261; [7C DB D0, 05, 05]
+12261; [7C DC D0, 05, 05]
-12262; [7C DB D7, 05, 05]
+12262; [7C DC D7, 05, 05]
-122D4; [7C DB DE, 05, 05]
+122D4; [7C DC DE, 05, 05]
-122D5; [7C DB E5, 05, 05]
+122D5; [7C DC E5, 05, 05]
-12263; [7C DB EC, 05, 05]
+12263; [7C DC EC, 05, 05]
-12264; [7C DB F3, 05, 05]
+12264; [7C DC F3, 05, 05]
-12265; [7C DB FA, 05, 05]
+12265; [7C DC FA, 05, 05]
-12266; [7C DC 03, 05, 05]
+12266; [7C DD 03, 05, 05]
-12267; [7C DC 0A, 05, 05]
+12267; [7C DD 0A, 05, 05]
-12268; [7C DC 11, 05, 05]
+12268; [7C DD 11, 05, 05]
-12269; [7C DC 18, 05, 05]
+12269; [7C DD 18, 05, 05]
-1226A; [7C DC 1F, 05, 05]
+1226A; [7C DD 1F, 05, 05]
-1226B; [7C DC 26, 05, 05]
+1226B; [7C DD 26, 05, 05]
-1226C; [7C DC 2D, 05, 05]
+1226C; [7C DD 2D, 05, 05]
-1226D; [7C DC 34, 05, 05]
+1226D; [7C DD 34, 05, 05]
-1226E; [7C DC 3B, 05, 05]
+1226E; [7C DD 3B, 05, 05]
-1226F; [7C DC 42, 05, 05]
+1226F; [7C DD 42, 05, 05]
-12270; [7C DC 49, 05, 05]
+12270; [7C DD 49, 05, 05]
-12271; [7C DC 50, 05, 05]
+12271; [7C DD 50, 05, 05]
-12272; [7C DC 57, 05, 05]
+12272; [7C DD 57, 05, 05]
-12273; [7C DC 5E, 05, 05]
+12273; [7C DD 5E, 05, 05]
-12274; [7C DC 65, 05, 05]
+12274; [7C DD 65, 05, 05]
-12275; [7C DC 6C, 05, 05]
+12275; [7C DD 6C, 05, 05]
-12276; [7C DC 73, 05, 05]
+12276; [7C DD 73, 05, 05]
-12277; [7C DC 7A, 05, 05]
+12277; [7C DD 7A, 05, 05]
-12278; [7C DC 81, 05, 05]
+12278; [7C DD 81, 05, 05]
-12279; [7C DC 88, 05, 05]
+12279; [7C DD 88, 05, 05]
-1227A; [7C DC 8F, 05, 05]
+1227A; [7C DD 8F, 05, 05]
-1227B; [7C DC 96, 05, 05]
+1227B; [7C DD 96, 05, 05]
-1227C; [7C DC 9D, 05, 05]
+1227C; [7C DD 9D, 05, 05]
-1227D; [7C DC A4, 05, 05]
+1227D; [7C DD A4, 05, 05]
-1227E; [7C DC AB, 05, 05]
+1227E; [7C DD AB, 05, 05]
-1227F; [7C DC B2, 05, 05]
+1227F; [7C DD B2, 05, 05]
-12280; [7C DC B9, 05, 05]
+12280; [7C DD B9, 05, 05]
-12281; [7C DC C0, 05, 05]
+12281; [7C DD C0, 05, 05]
-12282; [7C DC C7, 05, 05]
+12282; [7C DD C7, 05, 05]
-12283; [7C DC CE, 05, 05]
+12283; [7C DD CE, 05, 05]
-12284; [7C DC D5, 05, 05]
+12284; [7C DD D5, 05, 05]
-12285; [7C DC DC, 05, 05]
+12285; [7C DD DC, 05, 05]
-12286; [7C DC E3, 05, 05]
+12286; [7C DD E3, 05, 05]
-12287; [7C DC EA, 05, 05]
+12287; [7C DD EA, 05, 05]
-12288; [7C DC F1, 05, 05]
+12288; [7C DD F1, 05, 05]
-12289; [7C DC F8, 05, 05]
+12289; [7C DD F8, 05, 05]
-1228A; [7C DC FF, 05, 05]
+1228A; [7C DD FF, 05, 05]
-1228B; [7C DD 08, 05, 05]
+1228B; [7C DE 08, 05, 05]
-1228C; [7C DD 0F, 05, 05]
+1228C; [7C DE 0F, 05, 05]
-1228D; [7C DD 16, 05, 05]
+1228D; [7C DE 16, 05, 05]
-1228E; [7C DD 1D, 05, 05]
+1228E; [7C DE 1D, 05, 05]
-1228F; [7C DD 24, 05, 05]
+1228F; [7C DE 24, 05, 05]
-12290; [7C DD 2B, 05, 05]
+12290; [7C DE 2B, 05, 05]
-12291; [7C DD 32, 05, 05]
+12291; [7C DE 32, 05, 05]
-12292; [7C DD 39, 05, 05]
+12292; [7C DE 39, 05, 05]
-12293; [7C DD 40, 05, 05]
+12293; [7C DE 40, 05, 05]
-12294; [7C DD 47, 05, 05]
+12294; [7C DE 47, 05, 05]
-12295; [7C DD 4E, 05, 05]
+12295; [7C DE 4E, 05, 05]
-12296; [7C DD 55, 05, 05]
+12296; [7C DE 55, 05, 05]
-12297; [7C DD 5C, 05, 05]
+12297; [7C DE 5C, 05, 05]
-12298; [7C DD 63, 05, 05]
+12298; [7C DE 63, 05, 05]
-12299; [7C DD 6A, 05, 05]
+12299; [7C DE 6A, 05, 05]
-1229A; [7C DD 71, 05, 05]
+1229A; [7C DE 71, 05, 05]
-1229B; [7C DD 78, 05, 05]
+1229B; [7C DE 78, 05, 05]
-1229C; [7C DD 7F, 05, 05]
+1229C; [7C DE 7F, 05, 05]
-1229D; [7C DD 86, 05, 05]
+1229D; [7C DE 86, 05, 05]
-1229E; [7C DD 8D, 05, 05]
+1229E; [7C DE 8D, 05, 05]
-1229F; [7C DD 94, 05, 05]
+1229F; [7C DE 94, 05, 05]
-122A0; [7C DD 9B, 05, 05]
+122A0; [7C DE 9B, 05, 05]
-122A1; [7C DD A2, 05, 05]
+122A1; [7C DE A2, 05, 05]
-122A2; [7C DD A9, 05, 05]
+122A2; [7C DE A9, 05, 05]
-122A3; [7C DD B0, 05, 05]
+122A3; [7C DE B0, 05, 05]
-122A4; [7C DD B7, 05, 05]
+122A4; [7C DE B7, 05, 05]
-122A5; [7C DD BE, 05, 05]
+122A5; [7C DE BE, 05, 05]
-122A6; [7C DD C5, 05, 05]
+122A6; [7C DE C5, 05, 05]
-122A7; [7C DD CC, 05, 05]
+122A7; [7C DE CC, 05, 05]
-122A8; [7C DD D3, 05, 05]
+122A8; [7C DE D3, 05, 05]
-122A9; [7C DD DA, 05, 05]
+122A9; [7C DE DA, 05, 05]
-122AA; [7C DD E1, 05, 05]
+122AA; [7C DE E1, 05, 05]
-122AB; [7C DD E8, 05, 05]
+122AB; [7C DE E8, 05, 05]
-122AC; [7C DD EF, 05, 05]
+122AC; [7C DE EF, 05, 05]
-122AD; [7C DD F6, 05, 05]
+122AD; [7C DE F6, 05, 05]
-122AE; [7C DD FD, 05, 05]
+122AE; [7C DE FD, 05, 05]
-122AF; [7C DE 06, 05, 05]
+122AF; [7C DF 06, 05, 05]
-122B0; [7C DE 0D, 05, 05]
+122B0; [7C DF 0D, 05, 05]
-122B1; [7C DE 14, 05, 05]
+122B1; [7C DF 14, 05, 05]
-122B2; [7C DE 1B, 05, 05]
+122B2; [7C DF 1B, 05, 05]
-122B3; [7C DE 22, 05, 05]
+122B3; [7C DF 22, 05, 05]
-122B4; [7C DE 29, 05, 05]
+122B4; [7C DF 29, 05, 05]
-122B5; [7C DE 30, 05, 05]
+122B5; [7C DF 30, 05, 05]
-122B6; [7C DE 37, 05, 05]
+122B6; [7C DF 37, 05, 05]
-122B7; [7C DE 3E, 05, 05]
+122B7; [7C DF 3E, 05, 05]
-122B8; [7C DE 45, 05, 05]
+122B8; [7C DF 45, 05, 05]
-122B9; [7C DE 4C, 05, 05]
+122B9; [7C DF 4C, 05, 05]
-122BA; [7C DE 53, 05, 05]
+122BA; [7C DF 53, 05, 05]
-122BB; [7C DE 5A, 05, 05]
+122BB; [7C DF 5A, 05, 05]
-122BC; [7C DE 61, 05, 05]
+122BC; [7C DF 61, 05, 05]
-122BD; [7C DE 68, 05, 05]
+122BD; [7C DF 68, 05, 05]
-122BE; [7C DE 6F, 05, 05]
+122BE; [7C DF 6F, 05, 05]
-122BF; [7C DE 76, 05, 05]
+122BF; [7C DF 76, 05, 05]
-122C0; [7C DE 7D, 05, 05]
+122C0; [7C DF 7D, 05, 05]
-122C1; [7C DE 84, 05, 05]
+122C1; [7C DF 84, 05, 05]
-122C2; [7C DE 8B, 05, 05]
+122C2; [7C DF 8B, 05, 05]
-122C3; [7C DE 92, 05, 05]
+122C3; [7C DF 92, 05, 05]
-122C4; [7C DE 99, 05, 05]
+122C4; [7C DF 99, 05, 05]
-122C5; [7C DE A0, 05, 05]
+122C5; [7C DF A0, 05, 05]
-122C6; [7C DE A7, 05, 05]
+122C6; [7C DF A7, 05, 05]
-122C7; [7C DE AE, 05, 05]
+122C7; [7C DF AE, 05, 05]
-122C8; [7C DE B5, 05, 05]
+122C8; [7C DF B5, 05, 05]
-122C9; [7C DE BC, 05, 05]
+122C9; [7C DF BC, 05, 05]
-122CA; [7C DE C3, 05, 05]
+122CA; [7C DF C3, 05, 05]
-122CB; [7C DE CA, 05, 05]
+122CB; [7C DF CA, 05, 05]
-122CC; [7C DE D1, 05, 05]
+122CC; [7C DF D1, 05, 05]
-122CD; [7C DE D8, 05, 05]
+122CD; [7C DF D8, 05, 05]
-122CE; [7C DE DF, 05, 05]
+122CE; [7C DF DF, 05, 05]
-122CF; [7C DE E6, 05, 05]
+122CF; [7C DF E6, 05, 05]
-122D0; [7C DE ED, 05, 05]
+122D0; [7C DF ED, 05, 05]
-122D1; [7C DE F4, 05, 05]
+122D1; [7C DF F4, 05, 05]
-122D2; [7C DE FB, 05, 05]
+122D2; [7C DF FB, 05, 05]
-122D3; [7C DF 04, 05, 05]
+122D3; [7C E0 04, 05, 05]
-122D6; [7C DF 0B, 05, 05]
+122D6; [7C E0 0B, 05, 05]
-122D7; [7C DF 12, 05, 05]
+122D7; [7C E0 12, 05, 05]
-122D8; [7C DF 19, 05, 05]
+122D8; [7C E0 19, 05, 05]
-122D9; [7C DF 20, 05, 05]
+122D9; [7C E0 20, 05, 05]
-122DA; [7C DF 27, 05, 05]
+122DA; [7C E0 27, 05, 05]
-122DB; [7C DF 2E, 05, 05]
+122DB; [7C E0 2E, 05, 05]
-122DC; [7C DF 35, 05, 05]
+122DC; [7C E0 35, 05, 05]
-122DD; [7C DF 3C, 05, 05]
+122DD; [7C E0 3C, 05, 05]
-122DE; [7C DF 43, 05, 05]
+122DE; [7C E0 43, 05, 05]
-122DF; [7C DF 4A, 05, 05]
+122DF; [7C E0 4A, 05, 05]
-122E0; [7C DF 51, 05, 05]
+122E0; [7C E0 51, 05, 05]
-122E1; [7C DF 58, 05, 05]
+122E1; [7C E0 58, 05, 05]
-122E2; [7C DF 5F, 05, 05]
+122E2; [7C E0 5F, 05, 05]
-122E3; [7C DF 66, 05, 05]
+122E3; [7C E0 66, 05, 05]
-122E4; [7C DF 6D, 05, 05]
+122E4; [7C E0 6D, 05, 05]
-122E5; [7C DF 74, 05, 05]
+122E5; [7C E0 74, 05, 05]
-122E6; [7C DF 7B, 05, 05]
+122E6; [7C E0 7B, 05, 05]
-122E7; [7C DF 82, 05, 05]
+122E7; [7C E0 82, 05, 05]
-122E8; [7C DF 89, 05, 05]
+122E8; [7C E0 89, 05, 05]
-122E9; [7C DF 90, 05, 05]
+122E9; [7C E0 90, 05, 05]
-122EA; [7C DF 97, 05, 05]
+122EA; [7C E0 97, 05, 05]
-122EB; [7C DF 9E, 05, 05]
+122EB; [7C E0 9E, 05, 05]
-122EC; [7C DF A5, 05, 05]
+122EC; [7C E0 A5, 05, 05]
-122ED; [7C DF AC, 05, 05]
+122ED; [7C E0 AC, 05, 05]
-122EE; [7C DF B3, 05, 05]
+122EE; [7C E0 B3, 05, 05]
-122EF; [7C DF BA, 05, 05]
+122EF; [7C E0 BA, 05, 05]
-122F0; [7C DF C1, 05, 05]
+122F0; [7C E0 C1, 05, 05]
-122F1; [7C DF C8, 05, 05]
+122F1; [7C E0 C8, 05, 05]
-122F2; [7C DF CF, 05, 05]
+122F2; [7C E0 CF, 05, 05]
-122F3; [7C DF D6, 05, 05]
+122F3; [7C E0 D6, 05, 05]
-122F4; [7C DF DD, 05, 05]
+122F4; [7C E0 DD, 05, 05]
-122F5; [7C DF E4, 05, 05]
+122F5; [7C E0 E4, 05, 05]
-122F6; [7C DF EB, 05, 05]
+122F6; [7C E0 EB, 05, 05]
-122F7; [7C DF F2, 05, 05]
+122F7; [7C E0 F2, 05, 05]
-122F8; [7C DF F9, 05, 05]
+122F8; [7C E0 F9, 05, 05]
-122F9; [7C E0 02, 05, 05]
+122F9; [7C E1 02, 05, 05]
-122FA; [7C E0 09, 05, 05]
+122FA; [7C E1 09, 05, 05]
-122FB; [7C E0 10, 05, 05]
+122FB; [7C E1 10, 05, 05]
-122FC; [7C E0 17, 05, 05]
+122FC; [7C E1 17, 05, 05]
-122FD; [7C E0 1E, 05, 05]
+122FD; [7C E1 1E, 05, 05]
-122FE; [7C E0 25, 05, 05]
+122FE; [7C E1 25, 05, 05]
-122FF; [7C E0 2C, 05, 05]
+122FF; [7C E1 2C, 05, 05]
-12300; [7C E0 33, 05, 05]
+12300; [7C E1 33, 05, 05]
-12301; [7C E0 3A, 05, 05]
+12301; [7C E1 3A, 05, 05]
-12302; [7C E0 41, 05, 05]
+12302; [7C E1 41, 05, 05]
-12303; [7C E0 48, 05, 05]
+12303; [7C E1 48, 05, 05]
-12304; [7C E0 4F, 05, 05]
+12304; [7C E1 4F, 05, 05]
-12305; [7C E0 56, 05, 05]
+12305; [7C E1 56, 05, 05]
-12306; [7C E0 5D, 05, 05]
+12306; [7C E1 5D, 05, 05]
-12307; [7C E0 64, 05, 05]
+12307; [7C E1 64, 05, 05]
-12308; [7C E0 6B, 05, 05]
+12308; [7C E1 6B, 05, 05]
-12309; [7C E0 72, 05, 05]
+12309; [7C E1 72, 05, 05]
-1230A; [7C E0 79, 05, 05]
+1230A; [7C E1 79, 05, 05]
-1230B; [7C E0 80, 05, 05]
+1230B; [7C E1 80, 05, 05]
-1230C; [7C E0 87, 05, 05]
+1230C; [7C E1 87, 05, 05]
-1230D; [7C E0 8E, 05, 05]
+1230D; [7C E1 8E, 05, 05]
-1230E; [7C E0 95, 05, 05]
+1230E; [7C E1 95, 05, 05]
-1230F; [7C E0 9C, 05, 05]
+1230F; [7C E1 9C, 05, 05]
-12310; [7C E0 A3, 05, 05]
+12310; [7C E1 A3, 05, 05]
-12311; [7C E0 AA, 05, 05]
+12311; [7C E1 AA, 05, 05]
-12312; [7C E0 B1, 05, 05]
+12312; [7C E1 B1, 05, 05]
-12313; [7C E0 B8, 05, 05]
+12313; [7C E1 B8, 05, 05]
-12314; [7C E0 BF, 05, 05]
+12314; [7C E1 BF, 05, 05]
-12315; [7C E0 C6, 05, 05]
+12315; [7C E1 C6, 05, 05]
-12316; [7C E0 CD, 05, 05]
+12316; [7C E1 CD, 05, 05]
-12317; [7C E0 D4, 05, 05]
+12317; [7C E1 D4, 05, 05]
-12318; [7C E0 DB, 05, 05]
+12318; [7C E1 DB, 05, 05]
-12319; [7C E0 E2, 05, 05]
+12319; [7C E1 E2, 05, 05]
-1231A; [7C E0 E9, 05, 05]
+1231A; [7C E1 E9, 05, 05]
-1231B; [7C E0 F0, 05, 05]
+1231B; [7C E1 F0, 05, 05]
-1231C; [7C E0 F7, 05, 05]
+1231C; [7C E1 F7, 05, 05]
-1231D; [7C E0 FE, 05, 05]
+1231D; [7C E1 FE, 05, 05]
-1231E; [7C E1 07, 05, 05]
+1231E; [7C E2 07, 05, 05]
-1231F; [7C E1 0E, 05, 05]
+1231F; [7C E2 0E, 05, 05]
-12320; [7C E1 15, 05, 05]
+12320; [7C E2 15, 05, 05]
-12321; [7C E1 1C, 05, 05]
+12321; [7C E2 1C, 05, 05]
-12322; [7C E1 23, 05, 05]
+12322; [7C E2 23, 05, 05]
-12323; [7C E1 2A, 05, 05]
+12323; [7C E2 2A, 05, 05]
-12324; [7C E1 31, 05, 05]
+12324; [7C E2 31, 05, 05]
-12325; [7C E1 38, 05, 05]
+12325; [7C E2 38, 05, 05]
-12326; [7C E1 3F, 05, 05]
+12326; [7C E2 3F, 05, 05]
-12327; [7C E1 46, 05, 05]
+12327; [7C E2 46, 05, 05]
-12328; [7C E1 4D, 05, 05]
+12328; [7C E2 4D, 05, 05]
-12329; [7C E1 54, 05, 05]
+12329; [7C E2 54, 05, 05]
-1232A; [7C E1 5B, 05, 05]
+1232A; [7C E2 5B, 05, 05]
-1232B; [7C E1 62, 05, 05]
+1232B; [7C E2 62, 05, 05]
-1232C; [7C E1 69, 05, 05]
+1232C; [7C E2 69, 05, 05]
-1232D; [7C E1 70, 05, 05]
+1232D; [7C E2 70, 05, 05]
-1232E; [7C E1 77, 05, 05]
+1232E; [7C E2 77, 05, 05]
-1232F; [7C E1 7E, 05, 05]
+1232F; [7C E2 7E, 05, 05]
-12330; [7C E1 85, 05, 05]
+12330; [7C E2 85, 05, 05]
-12331; [7C E1 8C, 05, 05]
+12331; [7C E2 8C, 05, 05]
-12332; [7C E1 93, 05, 05]
+12332; [7C E2 93, 05, 05]
-12333; [7C E1 9A, 05, 05]
+12333; [7C E2 9A, 05, 05]
-12334; [7C E1 A1, 05, 05]
+12334; [7C E2 A1, 05, 05]
-12335; [7C E1 A8, 05, 05]
+12335; [7C E2 A8, 05, 05]
-12336; [7C E1 AF, 05, 05]
+12336; [7C E2 AF, 05, 05]
-12337; [7C E1 B6, 05, 05]
+12337; [7C E2 B6, 05, 05]
-12338; [7C E1 BD, 05, 05]
+12338; [7C E2 BD, 05, 05]
-12339; [7C E1 C4, 05, 05]
+12339; [7C E2 C4, 05, 05]
-1233A; [7C E1 CB, 05, 05]
+1233A; [7C E2 CB, 05, 05]
-1233B; [7C E1 D2, 05, 05]
+1233B; [7C E2 D2, 05, 05]
-1233C; [7C E1 D9, 05, 05]
+1233C; [7C E2 D9, 05, 05]
-1233D; [7C E1 E0, 05, 05]
+1233D; [7C E2 E0, 05, 05]
-1233E; [7C E1 E7, 05, 05]
+1233E; [7C E2 E7, 05, 05]
-1233F; [7C E1 EE, 05, 05]
+1233F; [7C E2 EE, 05, 05]
-12340; [7C E1 F5, 05, 05]
+12340; [7C E2 F5, 05, 05]
-12341; [7C E1 FC, 05, 05]
+12341; [7C E2 FC, 05, 05]
-12342; [7C E2 05, 05, 05]
+12342; [7C E3 05, 05, 05]
-12343; [7C E2 0C, 05, 05]
+12343; [7C E3 0C, 05, 05]
-12344; [7C E2 13, 05, 05]
+12344; [7C E3 13, 05, 05]
-12345; [7C E2 1A, 05, 05]
+12345; [7C E3 1A, 05, 05]
-12346; [7C E2 21, 05, 05]
+12346; [7C E3 21, 05, 05]
-12347; [7C E2 28, 05, 05]
+12347; [7C E3 28, 05, 05]
-12348; [7C E2 2F, 05, 05]
+12348; [7C E3 2F, 05, 05]
-12349; [7C E2 36, 05, 05]
+12349; [7C E3 36, 05, 05]
-1234A; [7C E2 3D, 05, 05]
+1234A; [7C E3 3D, 05, 05]
-1234B; [7C E2 44, 05, 05]
+1234B; [7C E3 44, 05, 05]
-1234C; [7C E2 4B, 05, 05]
+1234C; [7C E3 4B, 05, 05]
-1234D; [7C E2 52, 05, 05]
+1234D; [7C E3 52, 05, 05]
-1234E; [7C E2 59, 05, 05]
+1234E; [7C E3 59, 05, 05]
-1234F; [7C E2 60, 05, 05]
+1234F; [7C E3 60, 05, 05]
-12350; [7C E2 67, 05, 05]
+12350; [7C E3 67, 05, 05]
-12351; [7C E2 6E, 05, 05]
+12351; [7C E3 6E, 05, 05]
-12352; [7C E2 75, 05, 05]
+12352; [7C E3 75, 05, 05]
-12353; [7C E2 7C, 05, 05]
+12353; [7C E3 7C, 05, 05]
-12354; [7C E2 83, 05, 05]
+12354; [7C E3 83, 05, 05]
-12355; [7C E2 8A, 05, 05]
+12355; [7C E3 8A, 05, 05]
-12356; [7C E2 91, 05, 05]
+12356; [7C E3 91, 05, 05]
-12357; [7C E2 98, 05, 05]
+12357; [7C E3 98, 05, 05]
-12358; [7C E2 9F, 05, 05]
+12358; [7C E3 9F, 05, 05]
-12359; [7C E2 A6, 05, 05]
+12359; [7C E3 A6, 05, 05]
-1235A; [7C E2 AD, 05, 05]
+1235A; [7C E3 AD, 05, 05]
-1235B; [7C E2 B4, 05, 05]
+1235B; [7C E3 B4, 05, 05]
-1235C; [7C E2 BB, 05, 05]
+1235C; [7C E3 BB, 05, 05]
-1235D; [7C E2 C2, 05, 05]
+1235D; [7C E3 C2, 05, 05]
-1235E; [7C E2 C9, 05, 05]
+1235E; [7C E3 C9, 05, 05]
-1235F; [7C E2 D0, 05, 05]
+1235F; [7C E3 D0, 05, 05]
-12360; [7C E2 D7, 05, 05]
+12360; [7C E3 D7, 05, 05]
-12361; [7C E2 DE, 05, 05]
+12361; [7C E3 DE, 05, 05]
-12362; [7C E2 E5, 05, 05]
+12362; [7C E3 E5, 05, 05]
-12363; [7C E2 EC, 05, 05]
+12363; [7C E3 EC, 05, 05]
-12364; [7C E2 F3, 05, 05]
+12364; [7C E3 F3, 05, 05]
-12365; [7C E2 FA, 05, 05]
+12365; [7C E3 FA, 05, 05]
-12366; [7C E3 03, 05, 05]
+12366; [7C E4 03, 05, 05]
-12367; [7C E3 0A, 05, 05]
+12367; [7C E4 0A, 05, 05]
-12368; [7C E3 11, 05, 05]
+12368; [7C E4 11, 05, 05]
-12369; [7C E3 18, 05, 05]
+12369; [7C E4 18, 05, 05]
-1236A; [7C E3 1F, 05, 05]
+1236A; [7C E4 1F, 05, 05]
-1236B; [7C E3 26, 05, 05]
+1236B; [7C E4 26, 05, 05]
-1236C; [7C E3 2D, 05, 05]
+1236C; [7C E4 2D, 05, 05]
-1236D; [7C E3 34, 05, 05]
+1236D; [7C E4 34, 05, 05]
-1236E; [7C E3 3B, 05, 05]
+1236E; [7C E4 3B, 05, 05]
-1236F; [7C E3 42, 05, 05]
+1236F; [7C E4 42, 05, 05]
-12370; [7C E3 49, 05, 05]
+12370; [7C E4 49, 05, 05]
-12371; [7C E3 50, 05, 05]
+12371; [7C E4 50, 05, 05]
-12372; [7C E3 57, 05, 05]
+12372; [7C E4 57, 05, 05]
-12373; [7C E3 5E, 05, 05]
+12373; [7C E4 5E, 05, 05]
-12374; [7C E3 65, 05, 05]
+12374; [7C E4 65, 05, 05]
-12375; [7C E3 6C, 05, 05]
+12375; [7C E4 6C, 05, 05]
-12376; [7C E3 73, 05, 05]
+12376; [7C E4 73, 05, 05]
-12377; [7C E3 7A, 05, 05]
+12377; [7C E4 7A, 05, 05]
-12378; [7C E3 81, 05, 05]
+12378; [7C E4 81, 05, 05]
-12379; [7C E3 88, 05, 05]
+12379; [7C E4 88, 05, 05]
-1237A; [7C E3 8F, 05, 05]
+1237A; [7C E4 8F, 05, 05]
-1237B; [7C E3 96, 05, 05]
+1237B; [7C E4 96, 05, 05]
-1237C; [7C E3 9D, 05, 05]
+1237C; [7C E4 9D, 05, 05]
-1237D; [7C E3 A4, 05, 05]
+1237D; [7C E4 A4, 05, 05]
-1237E; [7C E3 AB, 05, 05]
+1237E; [7C E4 AB, 05, 05]
-1237F; [7C E3 B2, 05, 05]
+1237F; [7C E4 B2, 05, 05]
-12380; [7C E3 B9, 05, 05]
+12380; [7C E4 B9, 05, 05]
-12381; [7C E3 C0, 05, 05]
+12381; [7C E4 C0, 05, 05]
-12382; [7C E3 C7, 05, 05]
+12382; [7C E4 C7, 05, 05]
-12383; [7C E3 CE, 05, 05]
+12383; [7C E4 CE, 05, 05]
-12384; [7C E3 D5, 05, 05]
+12384; [7C E4 D5, 05, 05]
-12385; [7C E3 DC, 05, 05]
+12385; [7C E4 DC, 05, 05]
-12386; [7C E3 E3, 05, 05]
+12386; [7C E4 E3, 05, 05]
-12387; [7C E3 EA, 05, 05]
+12387; [7C E4 EA, 05, 05]
-12388; [7C E3 F1, 05, 05]
+12388; [7C E4 F1, 05, 05]
-12389; [7C E3 F8, 05, 05]
+12389; [7C E4 F8, 05, 05]
-1238A; [7C E3 FF, 05, 05]
+1238A; [7C E4 FF, 05, 05]
-1238B; [7C E4 08, 05, 05]
+1238B; [7C E5 08, 05, 05]
-1238C; [7C E4 0F, 05, 05]
+1238C; [7C E5 0F, 05, 05]
-1238D; [7C E4 16, 05, 05]
+1238D; [7C E5 16, 05, 05]
-1238E; [7C E4 1D, 05, 05]
+1238E; [7C E5 1D, 05, 05]
-1238F; [7C E4 24, 05, 05]
+1238F; [7C E5 24, 05, 05]
-12390; [7C E4 2B, 05, 05]
+12390; [7C E5 2B, 05, 05]
-12391; [7C E4 32, 05, 05]
+12391; [7C E5 32, 05, 05]
-12392; [7C E4 39, 05, 05]
+12392; [7C E5 39, 05, 05]
-12393; [7C E4 40, 05, 05]
+12393; [7C E5 40, 05, 05]
-12394; [7C E4 47, 05, 05]
+12394; [7C E5 47, 05, 05]
-12395; [7C E4 4E, 05, 05]
+12395; [7C E5 4E, 05, 05]
-12396; [7C E4 55, 05, 05]
+12396; [7C E5 55, 05, 05]
-12397; [7C E4 5C, 05, 05]
+12397; [7C E5 5C, 05, 05]
-12398; [7C E4 63, 05, 05]
+12398; [7C E5 63, 05, 05]
-12399; [7C E4 6A, 05, 05]
+12399; [7C E5 6A, 05, 05]
-12480; [7C E4 71, 05, 05]
+12480; [7C E5 71, 05, 05]
-12481; [7C E4 78, 05, 05]
+12481; [7C E5 78, 05, 05]
-12482; [7C E4 7F, 05, 05]
+12482; [7C E5 7F, 05, 05]
-12483; [7C E4 86, 05, 05]
+12483; [7C E5 86, 05, 05]
-12484; [7C E4 8D, 05, 05]
+12484; [7C E5 8D, 05, 05]
-12485; [7C E4 94, 05, 05]
+12485; [7C E5 94, 05, 05]
-12486; [7C E4 9B, 05, 05]
+12486; [7C E5 9B, 05, 05]
-12487; [7C E4 A2, 05, 05]
+12487; [7C E5 A2, 05, 05]
-12488; [7C E4 A9, 05, 05]
+12488; [7C E5 A9, 05, 05]
-12489; [7C E4 B0, 05, 05]
+12489; [7C E5 B0, 05, 05]
-1248A; [7C E4 B7, 05, 05]
+1248A; [7C E5 B7, 05, 05]
-1248B; [7C E4 BE, 05, 05]
+1248B; [7C E5 BE, 05, 05]
-1248C; [7C E4 C5, 05, 05]
+1248C; [7C E5 C5, 05, 05]
-1248D; [7C E4 CC, 05, 05]
+1248D; [7C E5 CC, 05, 05]
-1248E; [7C E4 D3, 05, 05]
+1248E; [7C E5 D3, 05, 05]
-1248F; [7C E4 DA, 05, 05]
+1248F; [7C E5 DA, 05, 05]
-12490; [7C E4 E1, 05, 05]
+12490; [7C E5 E1, 05, 05]
-12491; [7C E4 E8, 05, 05]
+12491; [7C E5 E8, 05, 05]
-12492; [7C E4 EF, 05, 05]
+12492; [7C E5 EF, 05, 05]
-12493; [7C E4 F6, 05, 05]
+12493; [7C E5 F6, 05, 05]
-12494; [7C E4 FD, 05, 05]
+12494; [7C E5 FD, 05, 05]
-12495; [7C E5 06, 05, 05]
+12495; [7C E6 06, 05, 05]
-12496; [7C E5 0D, 05, 05]
+12496; [7C E6 0D, 05, 05]
-12497; [7C E5 14, 05, 05]
+12497; [7C E6 14, 05, 05]
-12498; [7C E5 1B, 05, 05]
+12498; [7C E6 1B, 05, 05]
-12499; [7C E5 22, 05, 05]
+12499; [7C E6 22, 05, 05]
-1249A; [7C E5 29, 05, 05]
+1249A; [7C E6 29, 05, 05]
-1249B; [7C E5 30, 05, 05]
+1249B; [7C E6 30, 05, 05]
-1249C; [7C E5 37, 05, 05]
+1249C; [7C E6 37, 05, 05]
-1249D; [7C E5 3E, 05, 05]
+1249D; [7C E6 3E, 05, 05]
-1249E; [7C E5 45, 05, 05]
+1249E; [7C E6 45, 05, 05]
-1249F; [7C E5 4C, 05, 05]
+1249F; [7C E6 4C, 05, 05]
-124A0; [7C E5 53, 05, 05]
+124A0; [7C E6 53, 05, 05]
-124A1; [7C E5 5A, 05, 05]
+124A1; [7C E6 5A, 05, 05]
-124A2; [7C E5 61, 05, 05]
+124A2; [7C E6 61, 05, 05]
-124A3; [7C E5 68, 05, 05]
+124A3; [7C E6 68, 05, 05]
-124A4; [7C E5 6F, 05, 05]
+124A4; [7C E6 6F, 05, 05]
-124A5; [7C E5 76, 05, 05]
+124A5; [7C E6 76, 05, 05]
-124A6; [7C E5 7D, 05, 05]
+124A6; [7C E6 7D, 05, 05]
-124A7; [7C E5 84, 05, 05]
+124A7; [7C E6 84, 05, 05]
-124A8; [7C E5 8B, 05, 05]
+124A8; [7C E6 8B, 05, 05]
-124A9; [7C E5 92, 05, 05]
+124A9; [7C E6 92, 05, 05]
-124AA; [7C E5 99, 05, 05]
+124AA; [7C E6 99, 05, 05]
-124AB; [7C E5 A0, 05, 05]
+124AB; [7C E6 A0, 05, 05]
-124AC; [7C E5 A7, 05, 05]
+124AC; [7C E6 A7, 05, 05]
-124AD; [7C E5 AE, 05, 05]
+124AD; [7C E6 AE, 05, 05]
-124AE; [7C E5 B5, 05, 05]
+124AE; [7C E6 B5, 05, 05]
-124AF; [7C E5 BC, 05, 05]
+124AF; [7C E6 BC, 05, 05]
-124B0; [7C E5 C3, 05, 05]
+124B0; [7C E6 C3, 05, 05]
-124B1; [7C E5 CA, 05, 05]
+124B1; [7C E6 CA, 05, 05]
-124B2; [7C E5 D1, 05, 05]
+124B2; [7C E6 D1, 05, 05]
-124B3; [7C E5 D8, 05, 05]
+124B3; [7C E6 D8, 05, 05]
-124B4; [7C E5 DF, 05, 05]
+124B4; [7C E6 DF, 05, 05]
-124B5; [7C E5 E6, 05, 05]
+124B5; [7C E6 E6, 05, 05]
-124B6; [7C E5 ED, 05, 05]
+124B6; [7C E6 ED, 05, 05]
-124B7; [7C E5 F4, 05, 05]
+124B7; [7C E6 F4, 05, 05]
-124B8; [7C E5 FB, 05, 05]
+124B8; [7C E6 FB, 05, 05]
-124B9; [7C E6 04, 05, 05]
+124B9; [7C E7 04, 05, 05]
-124BA; [7C E6 0B, 05, 05]
+124BA; [7C E7 0B, 05, 05]
-124BB; [7C E6 12, 05, 05]
+124BB; [7C E7 12, 05, 05]
-124BC; [7C E6 19, 05, 05]
+124BC; [7C E7 19, 05, 05]
-124BD; [7C E6 20, 05, 05]
+124BD; [7C E7 20, 05, 05]
-124BE; [7C E6 27, 05, 05]
+124BE; [7C E7 27, 05, 05]
-124BF; [7C E6 2E, 05, 05]
+124BF; [7C E7 2E, 05, 05]
-124C0; [7C E6 35, 05, 05]
+124C0; [7C E7 35, 05, 05]
-124C1; [7C E6 3C, 05, 05]
+124C1; [7C E7 3C, 05, 05]
-124C2; [7C E6 43, 05, 05]
+124C2; [7C E7 43, 05, 05]
-124C3; [7C E6 4A, 05, 05]
+124C3; [7C E7 4A, 05, 05]
-124C4; [7C E6 51, 05, 05]
+124C4; [7C E7 51, 05, 05]
-124C5; [7C E6 58, 05, 05]
+124C5; [7C E7 58, 05, 05]
-124C6; [7C E6 5F, 05, 05]
+124C6; [7C E7 5F, 05, 05]
-124C7; [7C E6 66, 05, 05]
+124C7; [7C E7 66, 05, 05]
-124C8; [7C E6 6D, 05, 05]
+124C8; [7C E7 6D, 05, 05]
-124C9; [7C E6 74, 05, 05]
+124C9; [7C E7 74, 05, 05]
-124CA; [7C E6 7B, 05, 05]
+124CA; [7C E7 7B, 05, 05]
-124CB; [7C E6 82, 05, 05]
+124CB; [7C E7 82, 05, 05]
-124CC; [7C E6 89, 05, 05]
+124CC; [7C E7 89, 05, 05]
-124CD; [7C E6 90, 05, 05]
+124CD; [7C E7 90, 05, 05]
-124CE; [7C E6 97, 05, 05]
+124CE; [7C E7 97, 05, 05]
-124CF; [7C E6 9E, 05, 05]
+124CF; [7C E7 9E, 05, 05]
-124D0; [7C E6 A5, 05, 05]
+124D0; [7C E7 A5, 05, 05]
-124D1; [7C E6 AC, 05, 05]
+124D1; [7C E7 AC, 05, 05]
-124D2; [7C E6 B3, 05, 05]
+124D2; [7C E7 B3, 05, 05]
-124D3; [7C E6 BA, 05, 05]
+124D3; [7C E7 BA, 05, 05]
-124D4; [7C E6 C1, 05, 05]
+124D4; [7C E7 C1, 05, 05]
-124D5; [7C E6 C8, 05, 05]
+124D5; [7C E7 C8, 05, 05]
-124D6; [7C E6 CF, 05, 05]
+124D6; [7C E7 CF, 05, 05]
-124D7; [7C E6 D6, 05, 05]
+124D7; [7C E7 D6, 05, 05]
-124D8; [7C E6 DD, 05, 05]
+124D8; [7C E7 DD, 05, 05]
-124D9; [7C E6 E4, 05, 05]
+124D9; [7C E7 E4, 05, 05]
-124DA; [7C E6 EB, 05, 05]
+124DA; [7C E7 EB, 05, 05]
-124DB; [7C E6 F2, 05, 05]
+124DB; [7C E7 F2, 05, 05]
-124DC; [7C E6 F9, 05, 05]
+124DC; [7C E7 F9, 05, 05]
-124DD; [7C E7 02, 05, 05]
+124DD; [7C E8 02, 05, 05]
-124DE; [7C E7 09, 05, 05]
+124DE; [7C E8 09, 05, 05]
-124DF; [7C E7 10, 05, 05]
+124DF; [7C E8 10, 05, 05]
-124E0; [7C E7 17, 05, 05]
+124E0; [7C E8 17, 05, 05]
-124E1; [7C E7 1E, 05, 05]
+124E1; [7C E8 1E, 05, 05]
-124E2; [7C E7 25, 05, 05]
+124E2; [7C E8 25, 05, 05]
-124E3; [7C E7 2C, 05, 05]
+124E3; [7C E8 2C, 05, 05]
-124E4; [7C E7 33, 05, 05]
+124E4; [7C E8 33, 05, 05]
-124E5; [7C E7 3A, 05, 05]
+124E5; [7C E8 3A, 05, 05]
-124E6; [7C E7 41, 05, 05]
+124E6; [7C E8 41, 05, 05]
-124E7; [7C E7 48, 05, 05]
+124E7; [7C E8 48, 05, 05]
-124E8; [7C E7 4F, 05, 05]
+124E8; [7C E8 4F, 05, 05]
-124E9; [7C E7 56, 05, 05]
+124E9; [7C E8 56, 05, 05]
-124EA; [7C E7 5D, 05, 05]
+124EA; [7C E8 5D, 05, 05]
-124EB; [7C E7 64, 05, 05]
+124EB; [7C E8 64, 05, 05]
-124EC; [7C E7 6B, 05, 05]
+124EC; [7C E8 6B, 05, 05]
-124ED; [7C E7 72, 05, 05]
+124ED; [7C E8 72, 05, 05]
-124EE; [7C E7 79, 05, 05]
+124EE; [7C E8 79, 05, 05]
-124EF; [7C E7 80, 05, 05]
+124EF; [7C E8 80, 05, 05]
-124F0; [7C E7 87, 05, 05]
+124F0; [7C E8 87, 05, 05]
-124F1; [7C E7 8E, 05, 05]
+124F1; [7C E8 8E, 05, 05]
-124F2; [7C E7 95, 05, 05]
+124F2; [7C E8 95, 05, 05]
-124F3; [7C E7 9C, 05, 05]
+124F3; [7C E8 9C, 05, 05]
-124F4; [7C E7 A3, 05, 05]
+124F4; [7C E8 A3, 05, 05]
-124F5; [7C E7 AA, 05, 05]
+124F5; [7C E8 AA, 05, 05]
-124F6; [7C E7 B1, 05, 05]
+124F6; [7C E8 B1, 05, 05]
-124F7; [7C E7 B8, 05, 05]
+124F7; [7C E8 B8, 05, 05]
-124F8; [7C E7 BF, 05, 05]
+124F8; [7C E8 BF, 05, 05]
-124F9; [7C E7 C6, 05, 05]
+124F9; [7C E8 C6, 05, 05]
-124FA; [7C E7 CD, 05, 05]
+124FA; [7C E8 CD, 05, 05]
-124FB; [7C E7 D4, 05, 05]
+124FB; [7C E8 D4, 05, 05]
-124FC; [7C E7 DB, 05, 05]
+124FC; [7C E8 DB, 05, 05]
-124FD; [7C E7 E2, 05, 05]
+124FD; [7C E8 E2, 05, 05]
-124FE; [7C E7 E9, 05, 05]
+124FE; [7C E8 E9, 05, 05]
-124FF; [7C E7 F0, 05, 05]
+124FF; [7C E8 F0, 05, 05]
-12500; [7C E7 F7, 05, 05]
+12500; [7C E8 F7, 05, 05]
-12501; [7C E7 FE, 05, 05]
+12501; [7C E8 FE, 05, 05]
-12502; [7C E8 07, 05, 05]
+12502; [7C E9 07, 05, 05]
-12503; [7C E8 0E, 05, 05]
+12503; [7C E9 0E, 05, 05]
-12504; [7C E8 15, 05, 05]
+12504; [7C E9 15, 05, 05]
-12505; [7C E8 1C, 05, 05]
+12505; [7C E9 1C, 05, 05]
-12506; [7C E8 23, 05, 05]
+12506; [7C E9 23, 05, 05]
-12507; [7C E8 2A, 05, 05]
+12507; [7C E9 2A, 05, 05]
-12508; [7C E8 31, 05, 05]
+12508; [7C E9 31, 05, 05]
-12509; [7C E8 38, 05, 05]
+12509; [7C E9 38, 05, 05]
-1250A; [7C E8 3F, 05, 05]
+1250A; [7C E9 3F, 05, 05]
-1250B; [7C E8 46, 05, 05]
+1250B; [7C E9 46, 05, 05]
-1250C; [7C E8 4D, 05, 05]
+1250C; [7C E9 4D, 05, 05]
-1250D; [7C E8 54, 05, 05]
+1250D; [7C E9 54, 05, 05]
-1250E; [7C E8 5B, 05, 05]
+1250E; [7C E9 5B, 05, 05]
-1250F; [7C E8 62, 05, 05]
+1250F; [7C E9 62, 05, 05]
-12510; [7C E8 69, 05, 05]
+12510; [7C E9 69, 05, 05]
-12511; [7C E8 70, 05, 05]
+12511; [7C E9 70, 05, 05]
-12512; [7C E8 77, 05, 05]
+12512; [7C E9 77, 05, 05]
-12513; [7C E8 7E, 05, 05]
+12513; [7C E9 7E, 05, 05]
-12514; [7C E8 85, 05, 05]
+12514; [7C E9 85, 05, 05]
-12515; [7C E8 8C, 05, 05]
+12515; [7C E9 8C, 05, 05]
-12516; [7C E8 93, 05, 05]
+12516; [7C E9 93, 05, 05]
-12517; [7C E8 9A, 05, 05]
+12517; [7C E9 9A, 05, 05]
-12518; [7C E8 A1, 05, 05]
+12518; [7C E9 A1, 05, 05]
-12519; [7C E8 A8, 05, 05]
+12519; [7C E9 A8, 05, 05]
-1251A; [7C E8 AF, 05, 05]
+1251A; [7C E9 AF, 05, 05]
-1251B; [7C E8 B6, 05, 05]
+1251B; [7C E9 B6, 05, 05]
-1251C; [7C E8 BD, 05, 05]
+1251C; [7C E9 BD, 05, 05]
-1251D; [7C E8 C4, 05, 05]
+1251D; [7C E9 C4, 05, 05]
-1251E; [7C E8 CB, 05, 05]
+1251E; [7C E9 CB, 05, 05]
-1251F; [7C E8 D2, 05, 05]
+1251F; [7C E9 D2, 05, 05]
-12520; [7C E8 D9, 05, 05]
+12520; [7C E9 D9, 05, 05]
-12521; [7C E8 E0, 05, 05]
+12521; [7C E9 E0, 05, 05]
-12522; [7C E8 E7, 05, 05]
+12522; [7C E9 E7, 05, 05]
-12523; [7C E8 EE, 05, 05]
+12523; [7C E9 EE, 05, 05]
-12524; [7C E8 F5, 05, 05]
+12524; [7C E9 F5, 05, 05]
-12525; [7C E8 FC, 05, 05]
+12525; [7C E9 FC, 05, 05]
-12526; [7C E9 05, 05, 05]
+12526; [7C EA 05, 05, 05]
-12527; [7C E9 0C, 05, 05]
+12527; [7C EA 0C, 05, 05]
-12528; [7C E9 13, 05, 05]
+12528; [7C EA 13, 05, 05]
-12529; [7C E9 1A, 05, 05]
+12529; [7C EA 1A, 05, 05]
-1252A; [7C E9 21, 05, 05]
+1252A; [7C EA 21, 05, 05]
-1252B; [7C E9 28, 05, 05]
+1252B; [7C EA 28, 05, 05]
-1252C; [7C E9 2F, 05, 05]
+1252C; [7C EA 2F, 05, 05]
-1252D; [7C E9 36, 05, 05]
+1252D; [7C EA 36, 05, 05]
-1252E; [7C E9 3D, 05, 05]
+1252E; [7C EA 3D, 05, 05]
-1252F; [7C E9 44, 05, 05]
+1252F; [7C EA 44, 05, 05]
-12530; [7C E9 4B, 05, 05]
+12530; [7C EA 4B, 05, 05]
-12531; [7C E9 52, 05, 05]
+12531; [7C EA 52, 05, 05]
-12532; [7C E9 59, 05, 05]
+12532; [7C EA 59, 05, 05]
-12533; [7C E9 60, 05, 05]
+12533; [7C EA 60, 05, 05]
-12534; [7C E9 67, 05, 05]
+12534; [7C EA 67, 05, 05]
-12535; [7C E9 6E, 05, 05]
+12535; [7C EA 6E, 05, 05]
-12536; [7C E9 75, 05, 05]
+12536; [7C EA 75, 05, 05]
-12537; [7C E9 7C, 05, 05]
+12537; [7C EA 7C, 05, 05]
-12538; [7C E9 83, 05, 05]
+12538; [7C EA 83, 05, 05]
-12539; [7C E9 8A, 05, 05]
+12539; [7C EA 8A, 05, 05]
-1253A; [7C E9 91, 05, 05]
+1253A; [7C EA 91, 05, 05]
-1253B; [7C E9 98, 05, 05]
+1253B; [7C EA 98, 05, 05]
-1253C; [7C E9 9F, 05, 05]
+1253C; [7C EA 9F, 05, 05]
-1253D; [7C E9 A6, 05, 05]
+1253D; [7C EA A6, 05, 05]
-1253E; [7C E9 AD, 05, 05]
+1253E; [7C EA AD, 05, 05]
-1253F; [7C E9 B4, 05, 05]
+1253F; [7C EA B4, 05, 05]
-12540; [7C E9 BB, 05, 05]
+12540; [7C EA BB, 05, 05]
-12541; [7C E9 C2, 05, 05]
+12541; [7C EA C2, 05, 05]
-12542; [7C E9 C9, 05, 05]
+12542; [7C EA C9, 05, 05]
-12543; [7C E9 D0, 05, 05]
+12543; [7C EA D0, 05, 05]
FDD1 13153; [7D 04 02, 05, 05] # Egyptian Hieroglyphs first primary starts new lead byte (compressible)
@@ -58876,761 +59972,767 @@ FDD1 18229; [7D 64 02, 05, 05] # Tangut first primary (compressible)
187EF; [7D 94 42, 05, 05]
187F0; [7D 94 44, 05, 05]
187F1; [7D 94 46, 05, 05]
-18800; [7D 94 48, 05, 05]
-18801; [7D 94 4A, 05, 05]
-18802; [7D 94 4C, 05, 05]
-18803; [7D 94 4E, 05, 05]
-18804; [7D 94 50, 05, 05]
-18805; [7D 94 52, 05, 05]
-18806; [7D 94 54, 05, 05]
-18807; [7D 94 56, 05, 05]
-18808; [7D 94 58, 05, 05]
-18809; [7D 94 5A, 05, 05]
-1880A; [7D 94 5C, 05, 05]
-1880B; [7D 94 5E, 05, 05]
-1880C; [7D 94 60, 05, 05]
-1880D; [7D 94 62, 05, 05]
-1880E; [7D 94 64, 05, 05]
-1880F; [7D 94 66, 05, 05]
-18810; [7D 94 68, 05, 05]
-18811; [7D 94 6A, 05, 05]
-18812; [7D 94 6C, 05, 05]
-18813; [7D 94 6E, 05, 05]
-18814; [7D 94 70, 05, 05]
-18815; [7D 94 72, 05, 05]
-18816; [7D 94 74, 05, 05]
-18817; [7D 94 76, 05, 05]
-18818; [7D 94 78, 05, 05]
-18819; [7D 94 7A, 05, 05]
-1881A; [7D 94 7C, 05, 05]
-1881B; [7D 94 7E, 05, 05]
-1881C; [7D 94 80, 05, 05]
-1881D; [7D 94 82, 05, 05]
-1881E; [7D 94 84, 05, 05]
-1881F; [7D 94 86, 05, 05]
-18820; [7D 94 88, 05, 05]
-18821; [7D 94 8A, 05, 05]
-18822; [7D 94 8C, 05, 05]
-18823; [7D 94 8E, 05, 05]
-18824; [7D 94 90, 05, 05]
-18825; [7D 94 92, 05, 05]
-18826; [7D 94 94, 05, 05]
-18827; [7D 94 96, 05, 05]
-18828; [7D 94 98, 05, 05]
-18829; [7D 94 9A, 05, 05]
-1882A; [7D 94 9C, 05, 05]
-1882B; [7D 94 9E, 05, 05]
-1882C; [7D 94 A0, 05, 05]
-1882D; [7D 94 A2, 05, 05]
-1882E; [7D 94 A4, 05, 05]
-1882F; [7D 94 A6, 05, 05]
-18830; [7D 94 A8, 05, 05]
-18831; [7D 94 AA, 05, 05]
-18832; [7D 94 AC, 05, 05]
-18833; [7D 94 AE, 05, 05]
-18834; [7D 94 B0, 05, 05]
-18835; [7D 94 B2, 05, 05]
-18836; [7D 94 B4, 05, 05]
-18837; [7D 94 B6, 05, 05]
-18838; [7D 94 B8, 05, 05]
-18839; [7D 94 BA, 05, 05]
-1883A; [7D 94 BC, 05, 05]
-1883B; [7D 94 BE, 05, 05]
-1883C; [7D 94 C0, 05, 05]
-1883D; [7D 94 C2, 05, 05]
-1883E; [7D 94 C4, 05, 05]
-1883F; [7D 94 C6, 05, 05]
-18840; [7D 94 C8, 05, 05]
-18841; [7D 94 CA, 05, 05]
-18842; [7D 94 CC, 05, 05]
-18843; [7D 94 CE, 05, 05]
-18844; [7D 94 D0, 05, 05]
-18845; [7D 94 D2, 05, 05]
-18846; [7D 94 D4, 05, 05]
-18847; [7D 94 D6, 05, 05]
-18848; [7D 94 D8, 05, 05]
-18849; [7D 94 DA, 05, 05]
-1884A; [7D 94 DC, 05, 05]
-1884B; [7D 94 DE, 05, 05]
-1884C; [7D 94 E0, 05, 05]
-1884D; [7D 94 E2, 05, 05]
-1884E; [7D 94 E4, 05, 05]
-1884F; [7D 94 E6, 05, 05]
-18850; [7D 94 E8, 05, 05]
-18851; [7D 94 EA, 05, 05]
-18852; [7D 94 EC, 05, 05]
-18853; [7D 94 EE, 05, 05]
-18854; [7D 94 F0, 05, 05]
-18855; [7D 94 F2, 05, 05]
-18856; [7D 94 F4, 05, 05]
-18857; [7D 94 F6, 05, 05]
-18858; [7D 94 F8, 05, 05]
-18859; [7D 94 FA, 05, 05]
-1885A; [7D 94 FC, 05, 05]
-1885B; [7D 94 FE, 05, 05]
-1885C; [7D 95 02, 05, 05]
-1885D; [7D 95 04, 05, 05]
-1885E; [7D 95 06, 05, 05]
-1885F; [7D 95 08, 05, 05]
-18860; [7D 95 0A, 05, 05]
-18861; [7D 95 0C, 05, 05]
-18862; [7D 95 0E, 05, 05]
-18863; [7D 95 10, 05, 05]
-18864; [7D 95 12, 05, 05]
-18865; [7D 95 14, 05, 05]
-18866; [7D 95 16, 05, 05]
-18867; [7D 95 18, 05, 05]
-18868; [7D 95 1A, 05, 05]
-18869; [7D 95 1C, 05, 05]
-1886A; [7D 95 1E, 05, 05]
-1886B; [7D 95 20, 05, 05]
-1886C; [7D 95 22, 05, 05]
-1886D; [7D 95 24, 05, 05]
-1886E; [7D 95 26, 05, 05]
-1886F; [7D 95 28, 05, 05]
-18870; [7D 95 2A, 05, 05]
-18871; [7D 95 2C, 05, 05]
-18872; [7D 95 2E, 05, 05]
-18873; [7D 95 30, 05, 05]
-18874; [7D 95 32, 05, 05]
-18875; [7D 95 34, 05, 05]
-18876; [7D 95 36, 05, 05]
-18877; [7D 95 38, 05, 05]
-18878; [7D 95 3A, 05, 05]
-18879; [7D 95 3C, 05, 05]
-1887A; [7D 95 3E, 05, 05]
-1887B; [7D 95 40, 05, 05]
-1887C; [7D 95 42, 05, 05]
-1887D; [7D 95 44, 05, 05]
-1887E; [7D 95 46, 05, 05]
-1887F; [7D 95 48, 05, 05]
-18880; [7D 95 4A, 05, 05]
-18881; [7D 95 4C, 05, 05]
-18882; [7D 95 4E, 05, 05]
-18883; [7D 95 50, 05, 05]
-18884; [7D 95 52, 05, 05]
-18885; [7D 95 54, 05, 05]
-18886; [7D 95 56, 05, 05]
-18887; [7D 95 58, 05, 05]
-18888; [7D 95 5A, 05, 05]
-18889; [7D 95 5C, 05, 05]
-1888A; [7D 95 5E, 05, 05]
-1888B; [7D 95 60, 05, 05]
-1888C; [7D 95 62, 05, 05]
-1888D; [7D 95 64, 05, 05]
-1888E; [7D 95 66, 05, 05]
-1888F; [7D 95 68, 05, 05]
-18890; [7D 95 6A, 05, 05]
-18891; [7D 95 6C, 05, 05]
-18892; [7D 95 6E, 05, 05]
-18893; [7D 95 70, 05, 05]
-18894; [7D 95 72, 05, 05]
-18895; [7D 95 74, 05, 05]
-18896; [7D 95 76, 05, 05]
-18897; [7D 95 78, 05, 05]
-18898; [7D 95 7A, 05, 05]
-18899; [7D 95 7C, 05, 05]
-1889A; [7D 95 7E, 05, 05]
-1889B; [7D 95 80, 05, 05]
-1889C; [7D 95 82, 05, 05]
-1889D; [7D 95 84, 05, 05]
-1889E; [7D 95 86, 05, 05]
-1889F; [7D 95 88, 05, 05]
-188A0; [7D 95 8A, 05, 05]
-188A1; [7D 95 8C, 05, 05]
-188A2; [7D 95 8E, 05, 05]
-188A3; [7D 95 90, 05, 05]
-188A4; [7D 95 92, 05, 05]
-188A5; [7D 95 94, 05, 05]
-188A6; [7D 95 96, 05, 05]
-188A7; [7D 95 98, 05, 05]
-188A8; [7D 95 9A, 05, 05]
-188A9; [7D 95 9C, 05, 05]
-188AA; [7D 95 9E, 05, 05]
-188AB; [7D 95 A0, 05, 05]
-188AC; [7D 95 A2, 05, 05]
-188AD; [7D 95 A4, 05, 05]
-188AE; [7D 95 A6, 05, 05]
-188AF; [7D 95 A8, 05, 05]
-188B0; [7D 95 AA, 05, 05]
-188B1; [7D 95 AC, 05, 05]
-188B2; [7D 95 AE, 05, 05]
-188B3; [7D 95 B0, 05, 05]
-188B4; [7D 95 B2, 05, 05]
-188B5; [7D 95 B4, 05, 05]
-188B6; [7D 95 B6, 05, 05]
-188B7; [7D 95 B8, 05, 05]
-188B8; [7D 95 BA, 05, 05]
-188B9; [7D 95 BC, 05, 05]
-188BA; [7D 95 BE, 05, 05]
-188BB; [7D 95 C0, 05, 05]
-188BC; [7D 95 C2, 05, 05]
-188BD; [7D 95 C4, 05, 05]
-188BE; [7D 95 C6, 05, 05]
-188BF; [7D 95 C8, 05, 05]
-188C0; [7D 95 CA, 05, 05]
-188C1; [7D 95 CC, 05, 05]
-188C2; [7D 95 CE, 05, 05]
-188C3; [7D 95 D0, 05, 05]
-188C4; [7D 95 D2, 05, 05]
-188C5; [7D 95 D4, 05, 05]
-188C6; [7D 95 D6, 05, 05]
-188C7; [7D 95 D8, 05, 05]
-188C8; [7D 95 DA, 05, 05]
-188C9; [7D 95 DC, 05, 05]
-188CA; [7D 95 DE, 05, 05]
-188CB; [7D 95 E0, 05, 05]
-188CC; [7D 95 E2, 05, 05]
-188CD; [7D 95 E4, 05, 05]
-188CE; [7D 95 E6, 05, 05]
-188CF; [7D 95 E8, 05, 05]
-188D0; [7D 95 EA, 05, 05]
-188D1; [7D 95 EC, 05, 05]
-188D2; [7D 95 EE, 05, 05]
-188D3; [7D 95 F0, 05, 05]
-188D4; [7D 95 F2, 05, 05]
-188D5; [7D 95 F4, 05, 05]
-188D6; [7D 95 F6, 05, 05]
-188D7; [7D 95 F8, 05, 05]
-188D8; [7D 95 FA, 05, 05]
-188D9; [7D 95 FC, 05, 05]
-188DA; [7D 95 FE, 05, 05]
-188DB; [7D 96 02, 05, 05]
-188DC; [7D 96 04, 05, 05]
-188DD; [7D 96 06, 05, 05]
-188DE; [7D 96 08, 05, 05]
-188DF; [7D 96 0A, 05, 05]
-188E0; [7D 96 0C, 05, 05]
-188E1; [7D 96 0E, 05, 05]
-188E2; [7D 96 10, 05, 05]
-188E3; [7D 96 12, 05, 05]
-188E4; [7D 96 14, 05, 05]
-188E5; [7D 96 16, 05, 05]
-188E6; [7D 96 18, 05, 05]
-188E7; [7D 96 1A, 05, 05]
-188E8; [7D 96 1C, 05, 05]
-188E9; [7D 96 1E, 05, 05]
-188EA; [7D 96 20, 05, 05]
-188EB; [7D 96 22, 05, 05]
-188EC; [7D 96 24, 05, 05]
-188ED; [7D 96 26, 05, 05]
-188EE; [7D 96 28, 05, 05]
-188EF; [7D 96 2A, 05, 05]
-188F0; [7D 96 2C, 05, 05]
-188F1; [7D 96 2E, 05, 05]
-188F2; [7D 96 30, 05, 05]
-188F3; [7D 96 32, 05, 05]
-188F4; [7D 96 34, 05, 05]
-188F5; [7D 96 36, 05, 05]
-188F6; [7D 96 38, 05, 05]
-188F7; [7D 96 3A, 05, 05]
-188F8; [7D 96 3C, 05, 05]
-188F9; [7D 96 3E, 05, 05]
-188FA; [7D 96 40, 05, 05]
-188FB; [7D 96 42, 05, 05]
-188FC; [7D 96 44, 05, 05]
-188FD; [7D 96 46, 05, 05]
-188FE; [7D 96 48, 05, 05]
-188FF; [7D 96 4A, 05, 05]
-18900; [7D 96 4C, 05, 05]
-18901; [7D 96 4E, 05, 05]
-18902; [7D 96 50, 05, 05]
-18903; [7D 96 52, 05, 05]
-18904; [7D 96 54, 05, 05]
-18905; [7D 96 56, 05, 05]
-18906; [7D 96 58, 05, 05]
-18907; [7D 96 5A, 05, 05]
-18908; [7D 96 5C, 05, 05]
-18909; [7D 96 5E, 05, 05]
-1890A; [7D 96 60, 05, 05]
-1890B; [7D 96 62, 05, 05]
-1890C; [7D 96 64, 05, 05]
-1890D; [7D 96 66, 05, 05]
-1890E; [7D 96 68, 05, 05]
-1890F; [7D 96 6A, 05, 05]
-18910; [7D 96 6C, 05, 05]
-18911; [7D 96 6E, 05, 05]
-18912; [7D 96 70, 05, 05]
-18913; [7D 96 72, 05, 05]
-18914; [7D 96 74, 05, 05]
-18915; [7D 96 76, 05, 05]
-18916; [7D 96 78, 05, 05]
-18917; [7D 96 7A, 05, 05]
-18918; [7D 96 7C, 05, 05]
-18919; [7D 96 7E, 05, 05]
-1891A; [7D 96 80, 05, 05]
-1891B; [7D 96 82, 05, 05]
-1891C; [7D 96 84, 05, 05]
-1891D; [7D 96 86, 05, 05]
-1891E; [7D 96 88, 05, 05]
-1891F; [7D 96 8A, 05, 05]
-18920; [7D 96 8C, 05, 05]
-18921; [7D 96 8E, 05, 05]
-18922; [7D 96 90, 05, 05]
-18923; [7D 96 92, 05, 05]
-18924; [7D 96 94, 05, 05]
-18925; [7D 96 96, 05, 05]
-18926; [7D 96 98, 05, 05]
-18927; [7D 96 9A, 05, 05]
-18928; [7D 96 9C, 05, 05]
-18929; [7D 96 9E, 05, 05]
-1892A; [7D 96 A0, 05, 05]
-1892B; [7D 96 A2, 05, 05]
-1892C; [7D 96 A4, 05, 05]
-1892D; [7D 96 A6, 05, 05]
-1892E; [7D 96 A8, 05, 05]
-1892F; [7D 96 AA, 05, 05]
-18930; [7D 96 AC, 05, 05]
-18931; [7D 96 AE, 05, 05]
-18932; [7D 96 B0, 05, 05]
-18933; [7D 96 B2, 05, 05]
-18934; [7D 96 B4, 05, 05]
-18935; [7D 96 B6, 05, 05]
-18936; [7D 96 B8, 05, 05]
-18937; [7D 96 BA, 05, 05]
-18938; [7D 96 BC, 05, 05]
-18939; [7D 96 BE, 05, 05]
-1893A; [7D 96 C0, 05, 05]
-1893B; [7D 96 C2, 05, 05]
-1893C; [7D 96 C4, 05, 05]
-1893D; [7D 96 C6, 05, 05]
-1893E; [7D 96 C8, 05, 05]
-1893F; [7D 96 CA, 05, 05]
-18940; [7D 96 CC, 05, 05]
-18941; [7D 96 CE, 05, 05]
-18942; [7D 96 D0, 05, 05]
-18943; [7D 96 D2, 05, 05]
-18944; [7D 96 D4, 05, 05]
-18945; [7D 96 D6, 05, 05]
-18946; [7D 96 D8, 05, 05]
-18947; [7D 96 DA, 05, 05]
-18948; [7D 96 DC, 05, 05]
-18949; [7D 96 DE, 05, 05]
-1894A; [7D 96 E0, 05, 05]
-1894B; [7D 96 E2, 05, 05]
-1894C; [7D 96 E4, 05, 05]
-1894D; [7D 96 E6, 05, 05]
-1894E; [7D 96 E8, 05, 05]
-1894F; [7D 96 EA, 05, 05]
-18950; [7D 96 EC, 05, 05]
-18951; [7D 96 EE, 05, 05]
-18952; [7D 96 F0, 05, 05]
-18953; [7D 96 F2, 05, 05]
-18954; [7D 96 F4, 05, 05]
-18955; [7D 96 F6, 05, 05]
-18956; [7D 96 F8, 05, 05]
-18957; [7D 96 FA, 05, 05]
-18958; [7D 96 FC, 05, 05]
-18959; [7D 96 FE, 05, 05]
-1895A; [7D 97 02, 05, 05]
-1895B; [7D 97 04, 05, 05]
-1895C; [7D 97 06, 05, 05]
-1895D; [7D 97 08, 05, 05]
-1895E; [7D 97 0A, 05, 05]
-1895F; [7D 97 0C, 05, 05]
-18960; [7D 97 0E, 05, 05]
-18961; [7D 97 10, 05, 05]
-18962; [7D 97 12, 05, 05]
-18963; [7D 97 14, 05, 05]
-18964; [7D 97 16, 05, 05]
-18965; [7D 97 18, 05, 05]
-18966; [7D 97 1A, 05, 05]
-18967; [7D 97 1C, 05, 05]
-18968; [7D 97 1E, 05, 05]
-18969; [7D 97 20, 05, 05]
-1896A; [7D 97 22, 05, 05]
-1896B; [7D 97 24, 05, 05]
-1896C; [7D 97 26, 05, 05]
-1896D; [7D 97 28, 05, 05]
-1896E; [7D 97 2A, 05, 05]
-1896F; [7D 97 2C, 05, 05]
-18970; [7D 97 2E, 05, 05]
-18971; [7D 97 30, 05, 05]
-18972; [7D 97 32, 05, 05]
-18973; [7D 97 34, 05, 05]
-18974; [7D 97 36, 05, 05]
-18975; [7D 97 38, 05, 05]
-18976; [7D 97 3A, 05, 05]
-18977; [7D 97 3C, 05, 05]
-18978; [7D 97 3E, 05, 05]
-18979; [7D 97 40, 05, 05]
-1897A; [7D 97 42, 05, 05]
-1897B; [7D 97 44, 05, 05]
-1897C; [7D 97 46, 05, 05]
-1897D; [7D 97 48, 05, 05]
-1897E; [7D 97 4A, 05, 05]
-1897F; [7D 97 4C, 05, 05]
-18980; [7D 97 4E, 05, 05]
-18981; [7D 97 50, 05, 05]
-18982; [7D 97 52, 05, 05]
-18983; [7D 97 54, 05, 05]
-18984; [7D 97 56, 05, 05]
-18985; [7D 97 58, 05, 05]
-18986; [7D 97 5A, 05, 05]
-18987; [7D 97 5C, 05, 05]
-18988; [7D 97 5E, 05, 05]
-18989; [7D 97 60, 05, 05]
-1898A; [7D 97 62, 05, 05]
-1898B; [7D 97 64, 05, 05]
-1898C; [7D 97 66, 05, 05]
-1898D; [7D 97 68, 05, 05]
-1898E; [7D 97 6A, 05, 05]
-1898F; [7D 97 6C, 05, 05]
-18990; [7D 97 6E, 05, 05]
-18991; [7D 97 70, 05, 05]
-18992; [7D 97 72, 05, 05]
-18993; [7D 97 74, 05, 05]
-18994; [7D 97 76, 05, 05]
-18995; [7D 97 78, 05, 05]
-18996; [7D 97 7A, 05, 05]
-18997; [7D 97 7C, 05, 05]
-18998; [7D 97 7E, 05, 05]
-18999; [7D 97 80, 05, 05]
-1899A; [7D 97 82, 05, 05]
-1899B; [7D 97 84, 05, 05]
-1899C; [7D 97 86, 05, 05]
-1899D; [7D 97 88, 05, 05]
-1899E; [7D 97 8A, 05, 05]
-1899F; [7D 97 8C, 05, 05]
-189A0; [7D 97 8E, 05, 05]
-189A1; [7D 97 90, 05, 05]
-189A2; [7D 97 92, 05, 05]
-189A3; [7D 97 94, 05, 05]
-189A4; [7D 97 96, 05, 05]
-189A5; [7D 97 98, 05, 05]
-189A6; [7D 97 9A, 05, 05]
-189A7; [7D 97 9C, 05, 05]
-189A8; [7D 97 9E, 05, 05]
-189A9; [7D 97 A0, 05, 05]
-189AA; [7D 97 A2, 05, 05]
-189AB; [7D 97 A4, 05, 05]
-189AC; [7D 97 A6, 05, 05]
-189AD; [7D 97 A8, 05, 05]
-189AE; [7D 97 AA, 05, 05]
-189AF; [7D 97 AC, 05, 05]
-189B0; [7D 97 AE, 05, 05]
-189B1; [7D 97 B0, 05, 05]
-189B2; [7D 97 B2, 05, 05]
-189B3; [7D 97 B4, 05, 05]
-189B4; [7D 97 B6, 05, 05]
-189B5; [7D 97 B8, 05, 05]
-189B6; [7D 97 BA, 05, 05]
-189B7; [7D 97 BC, 05, 05]
-189B8; [7D 97 BE, 05, 05]
-189B9; [7D 97 C0, 05, 05]
-189BA; [7D 97 C2, 05, 05]
-189BB; [7D 97 C4, 05, 05]
-189BC; [7D 97 C6, 05, 05]
-189BD; [7D 97 C8, 05, 05]
-189BE; [7D 97 CA, 05, 05]
-189BF; [7D 97 CC, 05, 05]
-189C0; [7D 97 CE, 05, 05]
-189C1; [7D 97 D0, 05, 05]
-189C2; [7D 97 D2, 05, 05]
-189C3; [7D 97 D4, 05, 05]
-189C4; [7D 97 D6, 05, 05]
-189C5; [7D 97 D8, 05, 05]
-189C6; [7D 97 DA, 05, 05]
-189C7; [7D 97 DC, 05, 05]
-189C8; [7D 97 DE, 05, 05]
-189C9; [7D 97 E0, 05, 05]
-189CA; [7D 97 E2, 05, 05]
-189CB; [7D 97 E4, 05, 05]
-189CC; [7D 97 E6, 05, 05]
-189CD; [7D 97 E8, 05, 05]
-189CE; [7D 97 EA, 05, 05]
-189CF; [7D 97 EC, 05, 05]
-189D0; [7D 97 EE, 05, 05]
-189D1; [7D 97 F0, 05, 05]
-189D2; [7D 97 F2, 05, 05]
-189D3; [7D 97 F4, 05, 05]
-189D4; [7D 97 F6, 05, 05]
-189D5; [7D 97 F8, 05, 05]
-189D6; [7D 97 FA, 05, 05]
-189D7; [7D 97 FC, 05, 05]
-189D8; [7D 97 FE, 05, 05]
-189D9; [7D 98 02, 05, 05]
-189DA; [7D 98 04, 05, 05]
-189DB; [7D 98 06, 05, 05]
-189DC; [7D 98 08, 05, 05]
-189DD; [7D 98 0A, 05, 05]
-189DE; [7D 98 0C, 05, 05]
-189DF; [7D 98 0E, 05, 05]
-189E0; [7D 98 10, 05, 05]
-189E1; [7D 98 12, 05, 05]
-189E2; [7D 98 14, 05, 05]
-189E3; [7D 98 16, 05, 05]
-189E4; [7D 98 18, 05, 05]
-189E5; [7D 98 1A, 05, 05]
-189E6; [7D 98 1C, 05, 05]
-189E7; [7D 98 1E, 05, 05]
-189E8; [7D 98 20, 05, 05]
-189E9; [7D 98 22, 05, 05]
-189EA; [7D 98 24, 05, 05]
-189EB; [7D 98 26, 05, 05]
-189EC; [7D 98 28, 05, 05]
-189ED; [7D 98 2A, 05, 05]
-189EE; [7D 98 2C, 05, 05]
-189EF; [7D 98 2E, 05, 05]
-189F0; [7D 98 30, 05, 05]
-189F1; [7D 98 32, 05, 05]
-189F2; [7D 98 34, 05, 05]
-189F3; [7D 98 36, 05, 05]
-189F4; [7D 98 38, 05, 05]
-189F5; [7D 98 3A, 05, 05]
-189F6; [7D 98 3C, 05, 05]
-189F7; [7D 98 3E, 05, 05]
-189F8; [7D 98 40, 05, 05]
-189F9; [7D 98 42, 05, 05]
-189FA; [7D 98 44, 05, 05]
-189FB; [7D 98 46, 05, 05]
-189FC; [7D 98 48, 05, 05]
-189FD; [7D 98 4A, 05, 05]
-189FE; [7D 98 4C, 05, 05]
-189FF; [7D 98 4E, 05, 05]
-18A00; [7D 98 50, 05, 05]
-18A01; [7D 98 52, 05, 05]
-18A02; [7D 98 54, 05, 05]
-18A03; [7D 98 56, 05, 05]
-18A04; [7D 98 58, 05, 05]
-18A05; [7D 98 5A, 05, 05]
-18A06; [7D 98 5C, 05, 05]
-18A07; [7D 98 5E, 05, 05]
-18A08; [7D 98 60, 05, 05]
-18A09; [7D 98 62, 05, 05]
-18A0A; [7D 98 64, 05, 05]
-18A0B; [7D 98 66, 05, 05]
-18A0C; [7D 98 68, 05, 05]
-18A0D; [7D 98 6A, 05, 05]
-18A0E; [7D 98 6C, 05, 05]
-18A0F; [7D 98 6E, 05, 05]
-18A10; [7D 98 70, 05, 05]
-18A11; [7D 98 72, 05, 05]
-18A12; [7D 98 74, 05, 05]
-18A13; [7D 98 76, 05, 05]
-18A14; [7D 98 78, 05, 05]
-18A15; [7D 98 7A, 05, 05]
-18A16; [7D 98 7C, 05, 05]
-18A17; [7D 98 7E, 05, 05]
-18A18; [7D 98 80, 05, 05]
-18A19; [7D 98 82, 05, 05]
-18A1A; [7D 98 84, 05, 05]
-18A1B; [7D 98 86, 05, 05]
-18A1C; [7D 98 88, 05, 05]
-18A1D; [7D 98 8A, 05, 05]
-18A1E; [7D 98 8C, 05, 05]
-18A1F; [7D 98 8E, 05, 05]
-18A20; [7D 98 90, 05, 05]
-18A21; [7D 98 92, 05, 05]
-18A22; [7D 98 94, 05, 05]
-18A23; [7D 98 96, 05, 05]
-18A24; [7D 98 98, 05, 05]
-18A25; [7D 98 9A, 05, 05]
-18A26; [7D 98 9C, 05, 05]
-18A27; [7D 98 9E, 05, 05]
-18A28; [7D 98 A0, 05, 05]
-18A29; [7D 98 A2, 05, 05]
-18A2A; [7D 98 A4, 05, 05]
-18A2B; [7D 98 A6, 05, 05]
-18A2C; [7D 98 A8, 05, 05]
-18A2D; [7D 98 AA, 05, 05]
-18A2E; [7D 98 AC, 05, 05]
-18A2F; [7D 98 AE, 05, 05]
-18A30; [7D 98 B0, 05, 05]
-18A31; [7D 98 B2, 05, 05]
-18A32; [7D 98 B4, 05, 05]
-18A33; [7D 98 B6, 05, 05]
-18A34; [7D 98 B8, 05, 05]
-18A35; [7D 98 BA, 05, 05]
-18A36; [7D 98 BC, 05, 05]
-18A37; [7D 98 BE, 05, 05]
-18A38; [7D 98 C0, 05, 05]
-18A39; [7D 98 C2, 05, 05]
-18A3A; [7D 98 C4, 05, 05]
-18A3B; [7D 98 C6, 05, 05]
-18A3C; [7D 98 C8, 05, 05]
-18A3D; [7D 98 CA, 05, 05]
-18A3E; [7D 98 CC, 05, 05]
-18A3F; [7D 98 CE, 05, 05]
-18A40; [7D 98 D0, 05, 05]
-18A41; [7D 98 D2, 05, 05]
-18A42; [7D 98 D4, 05, 05]
-18A43; [7D 98 D6, 05, 05]
-18A44; [7D 98 D8, 05, 05]
-18A45; [7D 98 DA, 05, 05]
-18A46; [7D 98 DC, 05, 05]
-18A47; [7D 98 DE, 05, 05]
-18A48; [7D 98 E0, 05, 05]
-18A49; [7D 98 E2, 05, 05]
-18A4A; [7D 98 E4, 05, 05]
-18A4B; [7D 98 E6, 05, 05]
-18A4C; [7D 98 E8, 05, 05]
-18A4D; [7D 98 EA, 05, 05]
-18A4E; [7D 98 EC, 05, 05]
-18A4F; [7D 98 EE, 05, 05]
-18A50; [7D 98 F0, 05, 05]
-18A51; [7D 98 F2, 05, 05]
-18A52; [7D 98 F4, 05, 05]
-18A53; [7D 98 F6, 05, 05]
-18A54; [7D 98 F8, 05, 05]
-18A55; [7D 98 FA, 05, 05]
-18A56; [7D 98 FC, 05, 05]
-18A57; [7D 98 FE, 05, 05]
-18A58; [7D 99 02, 05, 05]
-18A59; [7D 99 04, 05, 05]
-18A5A; [7D 99 06, 05, 05]
-18A5B; [7D 99 08, 05, 05]
-18A5C; [7D 99 0A, 05, 05]
-18A5D; [7D 99 0C, 05, 05]
-18A5E; [7D 99 0E, 05, 05]
-18A5F; [7D 99 10, 05, 05]
-18A60; [7D 99 12, 05, 05]
-18A61; [7D 99 14, 05, 05]
-18A62; [7D 99 16, 05, 05]
-18A63; [7D 99 18, 05, 05]
-18A64; [7D 99 1A, 05, 05]
-18A65; [7D 99 1C, 05, 05]
-18A66; [7D 99 1E, 05, 05]
-18A67; [7D 99 20, 05, 05]
-18A68; [7D 99 22, 05, 05]
-18A69; [7D 99 24, 05, 05]
-18A6A; [7D 99 26, 05, 05]
-18A6B; [7D 99 28, 05, 05]
-18A6C; [7D 99 2A, 05, 05]
-18A6D; [7D 99 2C, 05, 05]
-18A6E; [7D 99 2E, 05, 05]
-18A6F; [7D 99 30, 05, 05]
-18A70; [7D 99 32, 05, 05]
-18A71; [7D 99 34, 05, 05]
-18A72; [7D 99 36, 05, 05]
-18A73; [7D 99 38, 05, 05]
-18A74; [7D 99 3A, 05, 05]
-18A75; [7D 99 3C, 05, 05]
-18A76; [7D 99 3E, 05, 05]
-18A77; [7D 99 40, 05, 05]
-18A78; [7D 99 42, 05, 05]
-18A79; [7D 99 44, 05, 05]
-18A7A; [7D 99 46, 05, 05]
-18A7B; [7D 99 48, 05, 05]
-18A7C; [7D 99 4A, 05, 05]
-18A7D; [7D 99 4C, 05, 05]
-18A7E; [7D 99 4E, 05, 05]
-18A7F; [7D 99 50, 05, 05]
-18A80; [7D 99 52, 05, 05]
-18A81; [7D 99 54, 05, 05]
-18A82; [7D 99 56, 05, 05]
-18A83; [7D 99 58, 05, 05]
-18A84; [7D 99 5A, 05, 05]
-18A85; [7D 99 5C, 05, 05]
-18A86; [7D 99 5E, 05, 05]
-18A87; [7D 99 60, 05, 05]
-18A88; [7D 99 62, 05, 05]
-18A89; [7D 99 64, 05, 05]
-18A8A; [7D 99 66, 05, 05]
-18A8B; [7D 99 68, 05, 05]
-18A8C; [7D 99 6A, 05, 05]
-18A8D; [7D 99 6C, 05, 05]
-18A8E; [7D 99 6E, 05, 05]
-18A8F; [7D 99 70, 05, 05]
-18A90; [7D 99 72, 05, 05]
-18A91; [7D 99 74, 05, 05]
-18A92; [7D 99 76, 05, 05]
-18A93; [7D 99 78, 05, 05]
-18A94; [7D 99 7A, 05, 05]
-18A95; [7D 99 7C, 05, 05]
-18A96; [7D 99 7E, 05, 05]
-18A97; [7D 99 80, 05, 05]
-18A98; [7D 99 82, 05, 05]
-18A99; [7D 99 84, 05, 05]
-18A9A; [7D 99 86, 05, 05]
-18A9B; [7D 99 88, 05, 05]
-18A9C; [7D 99 8A, 05, 05]
-18A9D; [7D 99 8C, 05, 05]
-18A9E; [7D 99 8E, 05, 05]
-18A9F; [7D 99 90, 05, 05]
-18AA0; [7D 99 92, 05, 05]
-18AA1; [7D 99 94, 05, 05]
-18AA2; [7D 99 96, 05, 05]
-18AA3; [7D 99 98, 05, 05]
-18AA4; [7D 99 9A, 05, 05]
-18AA5; [7D 99 9C, 05, 05]
-18AA6; [7D 99 9E, 05, 05]
-18AA7; [7D 99 A0, 05, 05]
-18AA8; [7D 99 A2, 05, 05]
-18AA9; [7D 99 A4, 05, 05]
-18AAA; [7D 99 A6, 05, 05]
-18AAB; [7D 99 A8, 05, 05]
-18AAC; [7D 99 AA, 05, 05]
-18AAD; [7D 99 AC, 05, 05]
-18AAE; [7D 99 AE, 05, 05]
-18AAF; [7D 99 B0, 05, 05]
-18AB0; [7D 99 B2, 05, 05]
-18AB1; [7D 99 B4, 05, 05]
-18AB2; [7D 99 B6, 05, 05]
-18AB3; [7D 99 B8, 05, 05]
-18AB4; [7D 99 BA, 05, 05]
-18AB5; [7D 99 BC, 05, 05]
-18AB6; [7D 99 BE, 05, 05]
-18AB7; [7D 99 C0, 05, 05]
-18AB8; [7D 99 C2, 05, 05]
-18AB9; [7D 99 C4, 05, 05]
-18ABA; [7D 99 C6, 05, 05]
-18ABB; [7D 99 C8, 05, 05]
-18ABC; [7D 99 CA, 05, 05]
-18ABD; [7D 99 CC, 05, 05]
-18ABE; [7D 99 CE, 05, 05]
-18ABF; [7D 99 D0, 05, 05]
-18AC0; [7D 99 D2, 05, 05]
-18AC1; [7D 99 D4, 05, 05]
-18AC2; [7D 99 D6, 05, 05]
-18AC3; [7D 99 D8, 05, 05]
-18AC4; [7D 99 DA, 05, 05]
-18AC5; [7D 99 DC, 05, 05]
-18AC6; [7D 99 DE, 05, 05]
-18AC7; [7D 99 E0, 05, 05]
-18AC8; [7D 99 E2, 05, 05]
-18AC9; [7D 99 E4, 05, 05]
-18ACA; [7D 99 E6, 05, 05]
-18ACB; [7D 99 E8, 05, 05]
-18ACC; [7D 99 EA, 05, 05]
-18ACD; [7D 99 EC, 05, 05]
-18ACE; [7D 99 EE, 05, 05]
-18ACF; [7D 99 F0, 05, 05]
-18AD0; [7D 99 F2, 05, 05]
-18AD1; [7D 99 F4, 05, 05]
-18AD2; [7D 99 F6, 05, 05]
-18AD3; [7D 99 F8, 05, 05]
-18AD4; [7D 99 FA, 05, 05]
-18AD5; [7D 99 FC, 05, 05]
-18AD6; [7D 99 FE, 05, 05]
-18AD7; [7D 9A 02, 05, 05]
-18AD8; [7D 9A 04, 05, 05]
-18AD9; [7D 9A 06, 05, 05]
-18ADA; [7D 9A 08, 05, 05]
-18ADB; [7D 9A 0A, 05, 05]
-18ADC; [7D 9A 0C, 05, 05]
-18ADD; [7D 9A 0E, 05, 05]
-18ADE; [7D 9A 10, 05, 05]
-18ADF; [7D 9A 12, 05, 05]
-18AE0; [7D 9A 14, 05, 05]
-18AE1; [7D 9A 16, 05, 05]
-18AE2; [7D 9A 18, 05, 05]
-18AE3; [7D 9A 1A, 05, 05]
-18AE4; [7D 9A 1C, 05, 05]
-18AE5; [7D 9A 1E, 05, 05]
-18AE6; [7D 9A 20, 05, 05]
-18AE7; [7D 9A 22, 05, 05]
-18AE8; [7D 9A 24, 05, 05]
-18AE9; [7D 9A 26, 05, 05]
-18AEA; [7D 9A 28, 05, 05]
-18AEB; [7D 9A 2A, 05, 05]
-18AEC; [7D 9A 2C, 05, 05]
-18AED; [7D 9A 2E, 05, 05]
-18AEE; [7D 9A 30, 05, 05]
-18AEF; [7D 9A 32, 05, 05]
-18AF0; [7D 9A 34, 05, 05]
-18AF1; [7D 9A 36, 05, 05]
-18AF2; [7D 9A 38, 05, 05]
+187F2; [7D 94 48, 05, 05]
+187F3; [7D 94 4A, 05, 05]
+187F4; [7D 94 4C, 05, 05]
+187F5; [7D 94 4E, 05, 05]
+187F6; [7D 94 50, 05, 05]
+187F7; [7D 94 52, 05, 05]
+18800; [7D 94 54, 05, 05]
+18801; [7D 94 56, 05, 05]
+18802; [7D 94 58, 05, 05]
+18803; [7D 94 5A, 05, 05]
+18804; [7D 94 5C, 05, 05]
+18805; [7D 94 5E, 05, 05]
+18806; [7D 94 60, 05, 05]
+18807; [7D 94 62, 05, 05]
+18808; [7D 94 64, 05, 05]
+18809; [7D 94 66, 05, 05]
+1880A; [7D 94 68, 05, 05]
+1880B; [7D 94 6A, 05, 05]
+1880C; [7D 94 6C, 05, 05]
+1880D; [7D 94 6E, 05, 05]
+1880E; [7D 94 70, 05, 05]
+1880F; [7D 94 72, 05, 05]
+18810; [7D 94 74, 05, 05]
+18811; [7D 94 76, 05, 05]
+18812; [7D 94 78, 05, 05]
+18813; [7D 94 7A, 05, 05]
+18814; [7D 94 7C, 05, 05]
+18815; [7D 94 7E, 05, 05]
+18816; [7D 94 80, 05, 05]
+18817; [7D 94 82, 05, 05]
+18818; [7D 94 84, 05, 05]
+18819; [7D 94 86, 05, 05]
+1881A; [7D 94 88, 05, 05]
+1881B; [7D 94 8A, 05, 05]
+1881C; [7D 94 8C, 05, 05]
+1881D; [7D 94 8E, 05, 05]
+1881E; [7D 94 90, 05, 05]
+1881F; [7D 94 92, 05, 05]
+18820; [7D 94 94, 05, 05]
+18821; [7D 94 96, 05, 05]
+18822; [7D 94 98, 05, 05]
+18823; [7D 94 9A, 05, 05]
+18824; [7D 94 9C, 05, 05]
+18825; [7D 94 9E, 05, 05]
+18826; [7D 94 A0, 05, 05]
+18827; [7D 94 A2, 05, 05]
+18828; [7D 94 A4, 05, 05]
+18829; [7D 94 A6, 05, 05]
+1882A; [7D 94 A8, 05, 05]
+1882B; [7D 94 AA, 05, 05]
+1882C; [7D 94 AC, 05, 05]
+1882D; [7D 94 AE, 05, 05]
+1882E; [7D 94 B0, 05, 05]
+1882F; [7D 94 B2, 05, 05]
+18830; [7D 94 B4, 05, 05]
+18831; [7D 94 B6, 05, 05]
+18832; [7D 94 B8, 05, 05]
+18833; [7D 94 BA, 05, 05]
+18834; [7D 94 BC, 05, 05]
+18835; [7D 94 BE, 05, 05]
+18836; [7D 94 C0, 05, 05]
+18837; [7D 94 C2, 05, 05]
+18838; [7D 94 C4, 05, 05]
+18839; [7D 94 C6, 05, 05]
+1883A; [7D 94 C8, 05, 05]
+1883B; [7D 94 CA, 05, 05]
+1883C; [7D 94 CC, 05, 05]
+1883D; [7D 94 CE, 05, 05]
+1883E; [7D 94 D0, 05, 05]
+1883F; [7D 94 D2, 05, 05]
+18840; [7D 94 D4, 05, 05]
+18841; [7D 94 D6, 05, 05]
+18842; [7D 94 D8, 05, 05]
+18843; [7D 94 DA, 05, 05]
+18844; [7D 94 DC, 05, 05]
+18845; [7D 94 DE, 05, 05]
+18846; [7D 94 E0, 05, 05]
+18847; [7D 94 E2, 05, 05]
+18848; [7D 94 E4, 05, 05]
+18849; [7D 94 E6, 05, 05]
+1884A; [7D 94 E8, 05, 05]
+1884B; [7D 94 EA, 05, 05]
+1884C; [7D 94 EC, 05, 05]
+1884D; [7D 94 EE, 05, 05]
+1884E; [7D 94 F0, 05, 05]
+1884F; [7D 94 F2, 05, 05]
+18850; [7D 94 F4, 05, 05]
+18851; [7D 94 F6, 05, 05]
+18852; [7D 94 F8, 05, 05]
+18853; [7D 94 FA, 05, 05]
+18854; [7D 94 FC, 05, 05]
+18855; [7D 94 FE, 05, 05]
+18856; [7D 95 02, 05, 05]
+18857; [7D 95 04, 05, 05]
+18858; [7D 95 06, 05, 05]
+18859; [7D 95 08, 05, 05]
+1885A; [7D 95 0A, 05, 05]
+1885B; [7D 95 0C, 05, 05]
+1885C; [7D 95 0E, 05, 05]
+1885D; [7D 95 10, 05, 05]
+1885E; [7D 95 12, 05, 05]
+1885F; [7D 95 14, 05, 05]
+18860; [7D 95 16, 05, 05]
+18861; [7D 95 18, 05, 05]
+18862; [7D 95 1A, 05, 05]
+18863; [7D 95 1C, 05, 05]
+18864; [7D 95 1E, 05, 05]
+18865; [7D 95 20, 05, 05]
+18866; [7D 95 22, 05, 05]
+18867; [7D 95 24, 05, 05]
+18868; [7D 95 26, 05, 05]
+18869; [7D 95 28, 05, 05]
+1886A; [7D 95 2A, 05, 05]
+1886B; [7D 95 2C, 05, 05]
+1886C; [7D 95 2E, 05, 05]
+1886D; [7D 95 30, 05, 05]
+1886E; [7D 95 32, 05, 05]
+1886F; [7D 95 34, 05, 05]
+18870; [7D 95 36, 05, 05]
+18871; [7D 95 38, 05, 05]
+18872; [7D 95 3A, 05, 05]
+18873; [7D 95 3C, 05, 05]
+18874; [7D 95 3E, 05, 05]
+18875; [7D 95 40, 05, 05]
+18876; [7D 95 42, 05, 05]
+18877; [7D 95 44, 05, 05]
+18878; [7D 95 46, 05, 05]
+18879; [7D 95 48, 05, 05]
+1887A; [7D 95 4A, 05, 05]
+1887B; [7D 95 4C, 05, 05]
+1887C; [7D 95 4E, 05, 05]
+1887D; [7D 95 50, 05, 05]
+1887E; [7D 95 52, 05, 05]
+1887F; [7D 95 54, 05, 05]
+18880; [7D 95 56, 05, 05]
+18881; [7D 95 58, 05, 05]
+18882; [7D 95 5A, 05, 05]
+18883; [7D 95 5C, 05, 05]
+18884; [7D 95 5E, 05, 05]
+18885; [7D 95 60, 05, 05]
+18886; [7D 95 62, 05, 05]
+18887; [7D 95 64, 05, 05]
+18888; [7D 95 66, 05, 05]
+18889; [7D 95 68, 05, 05]
+1888A; [7D 95 6A, 05, 05]
+1888B; [7D 95 6C, 05, 05]
+1888C; [7D 95 6E, 05, 05]
+1888D; [7D 95 70, 05, 05]
+1888E; [7D 95 72, 05, 05]
+1888F; [7D 95 74, 05, 05]
+18890; [7D 95 76, 05, 05]
+18891; [7D 95 78, 05, 05]
+18892; [7D 95 7A, 05, 05]
+18893; [7D 95 7C, 05, 05]
+18894; [7D 95 7E, 05, 05]
+18895; [7D 95 80, 05, 05]
+18896; [7D 95 82, 05, 05]
+18897; [7D 95 84, 05, 05]
+18898; [7D 95 86, 05, 05]
+18899; [7D 95 88, 05, 05]
+1889A; [7D 95 8A, 05, 05]
+1889B; [7D 95 8C, 05, 05]
+1889C; [7D 95 8E, 05, 05]
+1889D; [7D 95 90, 05, 05]
+1889E; [7D 95 92, 05, 05]
+1889F; [7D 95 94, 05, 05]
+188A0; [7D 95 96, 05, 05]
+188A1; [7D 95 98, 05, 05]
+188A2; [7D 95 9A, 05, 05]
+188A3; [7D 95 9C, 05, 05]
+188A4; [7D 95 9E, 05, 05]
+188A5; [7D 95 A0, 05, 05]
+188A6; [7D 95 A2, 05, 05]
+188A7; [7D 95 A4, 05, 05]
+188A8; [7D 95 A6, 05, 05]
+188A9; [7D 95 A8, 05, 05]
+188AA; [7D 95 AA, 05, 05]
+188AB; [7D 95 AC, 05, 05]
+188AC; [7D 95 AE, 05, 05]
+188AD; [7D 95 B0, 05, 05]
+188AE; [7D 95 B2, 05, 05]
+188AF; [7D 95 B4, 05, 05]
+188B0; [7D 95 B6, 05, 05]
+188B1; [7D 95 B8, 05, 05]
+188B2; [7D 95 BA, 05, 05]
+188B3; [7D 95 BC, 05, 05]
+188B4; [7D 95 BE, 05, 05]
+188B5; [7D 95 C0, 05, 05]
+188B6; [7D 95 C2, 05, 05]
+188B7; [7D 95 C4, 05, 05]
+188B8; [7D 95 C6, 05, 05]
+188B9; [7D 95 C8, 05, 05]
+188BA; [7D 95 CA, 05, 05]
+188BB; [7D 95 CC, 05, 05]
+188BC; [7D 95 CE, 05, 05]
+188BD; [7D 95 D0, 05, 05]
+188BE; [7D 95 D2, 05, 05]
+188BF; [7D 95 D4, 05, 05]
+188C0; [7D 95 D6, 05, 05]
+188C1; [7D 95 D8, 05, 05]
+188C2; [7D 95 DA, 05, 05]
+188C3; [7D 95 DC, 05, 05]
+188C4; [7D 95 DE, 05, 05]
+188C5; [7D 95 E0, 05, 05]
+188C6; [7D 95 E2, 05, 05]
+188C7; [7D 95 E4, 05, 05]
+188C8; [7D 95 E6, 05, 05]
+188C9; [7D 95 E8, 05, 05]
+188CA; [7D 95 EA, 05, 05]
+188CB; [7D 95 EC, 05, 05]
+188CC; [7D 95 EE, 05, 05]
+188CD; [7D 95 F0, 05, 05]
+188CE; [7D 95 F2, 05, 05]
+188CF; [7D 95 F4, 05, 05]
+188D0; [7D 95 F6, 05, 05]
+188D1; [7D 95 F8, 05, 05]
+188D2; [7D 95 FA, 05, 05]
+188D3; [7D 95 FC, 05, 05]
+188D4; [7D 95 FE, 05, 05]
+188D5; [7D 96 02, 05, 05]
+188D6; [7D 96 04, 05, 05]
+188D7; [7D 96 06, 05, 05]
+188D8; [7D 96 08, 05, 05]
+188D9; [7D 96 0A, 05, 05]
+188DA; [7D 96 0C, 05, 05]
+188DB; [7D 96 0E, 05, 05]
+188DC; [7D 96 10, 05, 05]
+188DD; [7D 96 12, 05, 05]
+188DE; [7D 96 14, 05, 05]
+188DF; [7D 96 16, 05, 05]
+188E0; [7D 96 18, 05, 05]
+188E1; [7D 96 1A, 05, 05]
+188E2; [7D 96 1C, 05, 05]
+188E3; [7D 96 1E, 05, 05]
+188E4; [7D 96 20, 05, 05]
+188E5; [7D 96 22, 05, 05]
+188E6; [7D 96 24, 05, 05]
+188E7; [7D 96 26, 05, 05]
+188E8; [7D 96 28, 05, 05]
+188E9; [7D 96 2A, 05, 05]
+188EA; [7D 96 2C, 05, 05]
+188EB; [7D 96 2E, 05, 05]
+188EC; [7D 96 30, 05, 05]
+188ED; [7D 96 32, 05, 05]
+188EE; [7D 96 34, 05, 05]
+188EF; [7D 96 36, 05, 05]
+188F0; [7D 96 38, 05, 05]
+188F1; [7D 96 3A, 05, 05]
+188F2; [7D 96 3C, 05, 05]
+188F3; [7D 96 3E, 05, 05]
+188F4; [7D 96 40, 05, 05]
+188F5; [7D 96 42, 05, 05]
+188F6; [7D 96 44, 05, 05]
+188F7; [7D 96 46, 05, 05]
+188F8; [7D 96 48, 05, 05]
+188F9; [7D 96 4A, 05, 05]
+188FA; [7D 96 4C, 05, 05]
+188FB; [7D 96 4E, 05, 05]
+188FC; [7D 96 50, 05, 05]
+188FD; [7D 96 52, 05, 05]
+188FE; [7D 96 54, 05, 05]
+188FF; [7D 96 56, 05, 05]
+18900; [7D 96 58, 05, 05]
+18901; [7D 96 5A, 05, 05]
+18902; [7D 96 5C, 05, 05]
+18903; [7D 96 5E, 05, 05]
+18904; [7D 96 60, 05, 05]
+18905; [7D 96 62, 05, 05]
+18906; [7D 96 64, 05, 05]
+18907; [7D 96 66, 05, 05]
+18908; [7D 96 68, 05, 05]
+18909; [7D 96 6A, 05, 05]
+1890A; [7D 96 6C, 05, 05]
+1890B; [7D 96 6E, 05, 05]
+1890C; [7D 96 70, 05, 05]
+1890D; [7D 96 72, 05, 05]
+1890E; [7D 96 74, 05, 05]
+1890F; [7D 96 76, 05, 05]
+18910; [7D 96 78, 05, 05]
+18911; [7D 96 7A, 05, 05]
+18912; [7D 96 7C, 05, 05]
+18913; [7D 96 7E, 05, 05]
+18914; [7D 96 80, 05, 05]
+18915; [7D 96 82, 05, 05]
+18916; [7D 96 84, 05, 05]
+18917; [7D 96 86, 05, 05]
+18918; [7D 96 88, 05, 05]
+18919; [7D 96 8A, 05, 05]
+1891A; [7D 96 8C, 05, 05]
+1891B; [7D 96 8E, 05, 05]
+1891C; [7D 96 90, 05, 05]
+1891D; [7D 96 92, 05, 05]
+1891E; [7D 96 94, 05, 05]
+1891F; [7D 96 96, 05, 05]
+18920; [7D 96 98, 05, 05]
+18921; [7D 96 9A, 05, 05]
+18922; [7D 96 9C, 05, 05]
+18923; [7D 96 9E, 05, 05]
+18924; [7D 96 A0, 05, 05]
+18925; [7D 96 A2, 05, 05]
+18926; [7D 96 A4, 05, 05]
+18927; [7D 96 A6, 05, 05]
+18928; [7D 96 A8, 05, 05]
+18929; [7D 96 AA, 05, 05]
+1892A; [7D 96 AC, 05, 05]
+1892B; [7D 96 AE, 05, 05]
+1892C; [7D 96 B0, 05, 05]
+1892D; [7D 96 B2, 05, 05]
+1892E; [7D 96 B4, 05, 05]
+1892F; [7D 96 B6, 05, 05]
+18930; [7D 96 B8, 05, 05]
+18931; [7D 96 BA, 05, 05]
+18932; [7D 96 BC, 05, 05]
+18933; [7D 96 BE, 05, 05]
+18934; [7D 96 C0, 05, 05]
+18935; [7D 96 C2, 05, 05]
+18936; [7D 96 C4, 05, 05]
+18937; [7D 96 C6, 05, 05]
+18938; [7D 96 C8, 05, 05]
+18939; [7D 96 CA, 05, 05]
+1893A; [7D 96 CC, 05, 05]
+1893B; [7D 96 CE, 05, 05]
+1893C; [7D 96 D0, 05, 05]
+1893D; [7D 96 D2, 05, 05]
+1893E; [7D 96 D4, 05, 05]
+1893F; [7D 96 D6, 05, 05]
+18940; [7D 96 D8, 05, 05]
+18941; [7D 96 DA, 05, 05]
+18942; [7D 96 DC, 05, 05]
+18943; [7D 96 DE, 05, 05]
+18944; [7D 96 E0, 05, 05]
+18945; [7D 96 E2, 05, 05]
+18946; [7D 96 E4, 05, 05]
+18947; [7D 96 E6, 05, 05]
+18948; [7D 96 E8, 05, 05]
+18949; [7D 96 EA, 05, 05]
+1894A; [7D 96 EC, 05, 05]
+1894B; [7D 96 EE, 05, 05]
+1894C; [7D 96 F0, 05, 05]
+1894D; [7D 96 F2, 05, 05]
+1894E; [7D 96 F4, 05, 05]
+1894F; [7D 96 F6, 05, 05]
+18950; [7D 96 F8, 05, 05]
+18951; [7D 96 FA, 05, 05]
+18952; [7D 96 FC, 05, 05]
+18953; [7D 96 FE, 05, 05]
+18954; [7D 97 02, 05, 05]
+18955; [7D 97 04, 05, 05]
+18956; [7D 97 06, 05, 05]
+18957; [7D 97 08, 05, 05]
+18958; [7D 97 0A, 05, 05]
+18959; [7D 97 0C, 05, 05]
+1895A; [7D 97 0E, 05, 05]
+1895B; [7D 97 10, 05, 05]
+1895C; [7D 97 12, 05, 05]
+1895D; [7D 97 14, 05, 05]
+1895E; [7D 97 16, 05, 05]
+1895F; [7D 97 18, 05, 05]
+18960; [7D 97 1A, 05, 05]
+18961; [7D 97 1C, 05, 05]
+18962; [7D 97 1E, 05, 05]
+18963; [7D 97 20, 05, 05]
+18964; [7D 97 22, 05, 05]
+18965; [7D 97 24, 05, 05]
+18966; [7D 97 26, 05, 05]
+18967; [7D 97 28, 05, 05]
+18968; [7D 97 2A, 05, 05]
+18969; [7D 97 2C, 05, 05]
+1896A; [7D 97 2E, 05, 05]
+1896B; [7D 97 30, 05, 05]
+1896C; [7D 97 32, 05, 05]
+1896D; [7D 97 34, 05, 05]
+1896E; [7D 97 36, 05, 05]
+1896F; [7D 97 38, 05, 05]
+18970; [7D 97 3A, 05, 05]
+18971; [7D 97 3C, 05, 05]
+18972; [7D 97 3E, 05, 05]
+18973; [7D 97 40, 05, 05]
+18974; [7D 97 42, 05, 05]
+18975; [7D 97 44, 05, 05]
+18976; [7D 97 46, 05, 05]
+18977; [7D 97 48, 05, 05]
+18978; [7D 97 4A, 05, 05]
+18979; [7D 97 4C, 05, 05]
+1897A; [7D 97 4E, 05, 05]
+1897B; [7D 97 50, 05, 05]
+1897C; [7D 97 52, 05, 05]
+1897D; [7D 97 54, 05, 05]
+1897E; [7D 97 56, 05, 05]
+1897F; [7D 97 58, 05, 05]
+18980; [7D 97 5A, 05, 05]
+18981; [7D 97 5C, 05, 05]
+18982; [7D 97 5E, 05, 05]
+18983; [7D 97 60, 05, 05]
+18984; [7D 97 62, 05, 05]
+18985; [7D 97 64, 05, 05]
+18986; [7D 97 66, 05, 05]
+18987; [7D 97 68, 05, 05]
+18988; [7D 97 6A, 05, 05]
+18989; [7D 97 6C, 05, 05]
+1898A; [7D 97 6E, 05, 05]
+1898B; [7D 97 70, 05, 05]
+1898C; [7D 97 72, 05, 05]
+1898D; [7D 97 74, 05, 05]
+1898E; [7D 97 76, 05, 05]
+1898F; [7D 97 78, 05, 05]
+18990; [7D 97 7A, 05, 05]
+18991; [7D 97 7C, 05, 05]
+18992; [7D 97 7E, 05, 05]
+18993; [7D 97 80, 05, 05]
+18994; [7D 97 82, 05, 05]
+18995; [7D 97 84, 05, 05]
+18996; [7D 97 86, 05, 05]
+18997; [7D 97 88, 05, 05]
+18998; [7D 97 8A, 05, 05]
+18999; [7D 97 8C, 05, 05]
+1899A; [7D 97 8E, 05, 05]
+1899B; [7D 97 90, 05, 05]
+1899C; [7D 97 92, 05, 05]
+1899D; [7D 97 94, 05, 05]
+1899E; [7D 97 96, 05, 05]
+1899F; [7D 97 98, 05, 05]
+189A0; [7D 97 9A, 05, 05]
+189A1; [7D 97 9C, 05, 05]
+189A2; [7D 97 9E, 05, 05]
+189A3; [7D 97 A0, 05, 05]
+189A4; [7D 97 A2, 05, 05]
+189A5; [7D 97 A4, 05, 05]
+189A6; [7D 97 A6, 05, 05]
+189A7; [7D 97 A8, 05, 05]
+189A8; [7D 97 AA, 05, 05]
+189A9; [7D 97 AC, 05, 05]
+189AA; [7D 97 AE, 05, 05]
+189AB; [7D 97 B0, 05, 05]
+189AC; [7D 97 B2, 05, 05]
+189AD; [7D 97 B4, 05, 05]
+189AE; [7D 97 B6, 05, 05]
+189AF; [7D 97 B8, 05, 05]
+189B0; [7D 97 BA, 05, 05]
+189B1; [7D 97 BC, 05, 05]
+189B2; [7D 97 BE, 05, 05]
+189B3; [7D 97 C0, 05, 05]
+189B4; [7D 97 C2, 05, 05]
+189B5; [7D 97 C4, 05, 05]
+189B6; [7D 97 C6, 05, 05]
+189B7; [7D 97 C8, 05, 05]
+189B8; [7D 97 CA, 05, 05]
+189B9; [7D 97 CC, 05, 05]
+189BA; [7D 97 CE, 05, 05]
+189BB; [7D 97 D0, 05, 05]
+189BC; [7D 97 D2, 05, 05]
+189BD; [7D 97 D4, 05, 05]
+189BE; [7D 97 D6, 05, 05]
+189BF; [7D 97 D8, 05, 05]
+189C0; [7D 97 DA, 05, 05]
+189C1; [7D 97 DC, 05, 05]
+189C2; [7D 97 DE, 05, 05]
+189C3; [7D 97 E0, 05, 05]
+189C4; [7D 97 E2, 05, 05]
+189C5; [7D 97 E4, 05, 05]
+189C6; [7D 97 E6, 05, 05]
+189C7; [7D 97 E8, 05, 05]
+189C8; [7D 97 EA, 05, 05]
+189C9; [7D 97 EC, 05, 05]
+189CA; [7D 97 EE, 05, 05]
+189CB; [7D 97 F0, 05, 05]
+189CC; [7D 97 F2, 05, 05]
+189CD; [7D 97 F4, 05, 05]
+189CE; [7D 97 F6, 05, 05]
+189CF; [7D 97 F8, 05, 05]
+189D0; [7D 97 FA, 05, 05]
+189D1; [7D 97 FC, 05, 05]
+189D2; [7D 97 FE, 05, 05]
+189D3; [7D 98 02, 05, 05]
+189D4; [7D 98 04, 05, 05]
+189D5; [7D 98 06, 05, 05]
+189D6; [7D 98 08, 05, 05]
+189D7; [7D 98 0A, 05, 05]
+189D8; [7D 98 0C, 05, 05]
+189D9; [7D 98 0E, 05, 05]
+189DA; [7D 98 10, 05, 05]
+189DB; [7D 98 12, 05, 05]
+189DC; [7D 98 14, 05, 05]
+189DD; [7D 98 16, 05, 05]
+189DE; [7D 98 18, 05, 05]
+189DF; [7D 98 1A, 05, 05]
+189E0; [7D 98 1C, 05, 05]
+189E1; [7D 98 1E, 05, 05]
+189E2; [7D 98 20, 05, 05]
+189E3; [7D 98 22, 05, 05]
+189E4; [7D 98 24, 05, 05]
+189E5; [7D 98 26, 05, 05]
+189E6; [7D 98 28, 05, 05]
+189E7; [7D 98 2A, 05, 05]
+189E8; [7D 98 2C, 05, 05]
+189E9; [7D 98 2E, 05, 05]
+189EA; [7D 98 30, 05, 05]
+189EB; [7D 98 32, 05, 05]
+189EC; [7D 98 34, 05, 05]
+189ED; [7D 98 36, 05, 05]
+189EE; [7D 98 38, 05, 05]
+189EF; [7D 98 3A, 05, 05]
+189F0; [7D 98 3C, 05, 05]
+189F1; [7D 98 3E, 05, 05]
+189F2; [7D 98 40, 05, 05]
+189F3; [7D 98 42, 05, 05]
+189F4; [7D 98 44, 05, 05]
+189F5; [7D 98 46, 05, 05]
+189F6; [7D 98 48, 05, 05]
+189F7; [7D 98 4A, 05, 05]
+189F8; [7D 98 4C, 05, 05]
+189F9; [7D 98 4E, 05, 05]
+189FA; [7D 98 50, 05, 05]
+189FB; [7D 98 52, 05, 05]
+189FC; [7D 98 54, 05, 05]
+189FD; [7D 98 56, 05, 05]
+189FE; [7D 98 58, 05, 05]
+189FF; [7D 98 5A, 05, 05]
+18A00; [7D 98 5C, 05, 05]
+18A01; [7D 98 5E, 05, 05]
+18A02; [7D 98 60, 05, 05]
+18A03; [7D 98 62, 05, 05]
+18A04; [7D 98 64, 05, 05]
+18A05; [7D 98 66, 05, 05]
+18A06; [7D 98 68, 05, 05]
+18A07; [7D 98 6A, 05, 05]
+18A08; [7D 98 6C, 05, 05]
+18A09; [7D 98 6E, 05, 05]
+18A0A; [7D 98 70, 05, 05]
+18A0B; [7D 98 72, 05, 05]
+18A0C; [7D 98 74, 05, 05]
+18A0D; [7D 98 76, 05, 05]
+18A0E; [7D 98 78, 05, 05]
+18A0F; [7D 98 7A, 05, 05]
+18A10; [7D 98 7C, 05, 05]
+18A11; [7D 98 7E, 05, 05]
+18A12; [7D 98 80, 05, 05]
+18A13; [7D 98 82, 05, 05]
+18A14; [7D 98 84, 05, 05]
+18A15; [7D 98 86, 05, 05]
+18A16; [7D 98 88, 05, 05]
+18A17; [7D 98 8A, 05, 05]
+18A18; [7D 98 8C, 05, 05]
+18A19; [7D 98 8E, 05, 05]
+18A1A; [7D 98 90, 05, 05]
+18A1B; [7D 98 92, 05, 05]
+18A1C; [7D 98 94, 05, 05]
+18A1D; [7D 98 96, 05, 05]
+18A1E; [7D 98 98, 05, 05]
+18A1F; [7D 98 9A, 05, 05]
+18A20; [7D 98 9C, 05, 05]
+18A21; [7D 98 9E, 05, 05]
+18A22; [7D 98 A0, 05, 05]
+18A23; [7D 98 A2, 05, 05]
+18A24; [7D 98 A4, 05, 05]
+18A25; [7D 98 A6, 05, 05]
+18A26; [7D 98 A8, 05, 05]
+18A27; [7D 98 AA, 05, 05]
+18A28; [7D 98 AC, 05, 05]
+18A29; [7D 98 AE, 05, 05]
+18A2A; [7D 98 B0, 05, 05]
+18A2B; [7D 98 B2, 05, 05]
+18A2C; [7D 98 B4, 05, 05]
+18A2D; [7D 98 B6, 05, 05]
+18A2E; [7D 98 B8, 05, 05]
+18A2F; [7D 98 BA, 05, 05]
+18A30; [7D 98 BC, 05, 05]
+18A31; [7D 98 BE, 05, 05]
+18A32; [7D 98 C0, 05, 05]
+18A33; [7D 98 C2, 05, 05]
+18A34; [7D 98 C4, 05, 05]
+18A35; [7D 98 C6, 05, 05]
+18A36; [7D 98 C8, 05, 05]
+18A37; [7D 98 CA, 05, 05]
+18A38; [7D 98 CC, 05, 05]
+18A39; [7D 98 CE, 05, 05]
+18A3A; [7D 98 D0, 05, 05]
+18A3B; [7D 98 D2, 05, 05]
+18A3C; [7D 98 D4, 05, 05]
+18A3D; [7D 98 D6, 05, 05]
+18A3E; [7D 98 D8, 05, 05]
+18A3F; [7D 98 DA, 05, 05]
+18A40; [7D 98 DC, 05, 05]
+18A41; [7D 98 DE, 05, 05]
+18A42; [7D 98 E0, 05, 05]
+18A43; [7D 98 E2, 05, 05]
+18A44; [7D 98 E4, 05, 05]
+18A45; [7D 98 E6, 05, 05]
+18A46; [7D 98 E8, 05, 05]
+18A47; [7D 98 EA, 05, 05]
+18A48; [7D 98 EC, 05, 05]
+18A49; [7D 98 EE, 05, 05]
+18A4A; [7D 98 F0, 05, 05]
+18A4B; [7D 98 F2, 05, 05]
+18A4C; [7D 98 F4, 05, 05]
+18A4D; [7D 98 F6, 05, 05]
+18A4E; [7D 98 F8, 05, 05]
+18A4F; [7D 98 FA, 05, 05]
+18A50; [7D 98 FC, 05, 05]
+18A51; [7D 98 FE, 05, 05]
+18A52; [7D 99 02, 05, 05]
+18A53; [7D 99 04, 05, 05]
+18A54; [7D 99 06, 05, 05]
+18A55; [7D 99 08, 05, 05]
+18A56; [7D 99 0A, 05, 05]
+18A57; [7D 99 0C, 05, 05]
+18A58; [7D 99 0E, 05, 05]
+18A59; [7D 99 10, 05, 05]
+18A5A; [7D 99 12, 05, 05]
+18A5B; [7D 99 14, 05, 05]
+18A5C; [7D 99 16, 05, 05]
+18A5D; [7D 99 18, 05, 05]
+18A5E; [7D 99 1A, 05, 05]
+18A5F; [7D 99 1C, 05, 05]
+18A60; [7D 99 1E, 05, 05]
+18A61; [7D 99 20, 05, 05]
+18A62; [7D 99 22, 05, 05]
+18A63; [7D 99 24, 05, 05]
+18A64; [7D 99 26, 05, 05]
+18A65; [7D 99 28, 05, 05]
+18A66; [7D 99 2A, 05, 05]
+18A67; [7D 99 2C, 05, 05]
+18A68; [7D 99 2E, 05, 05]
+18A69; [7D 99 30, 05, 05]
+18A6A; [7D 99 32, 05, 05]
+18A6B; [7D 99 34, 05, 05]
+18A6C; [7D 99 36, 05, 05]
+18A6D; [7D 99 38, 05, 05]
+18A6E; [7D 99 3A, 05, 05]
+18A6F; [7D 99 3C, 05, 05]
+18A70; [7D 99 3E, 05, 05]
+18A71; [7D 99 40, 05, 05]
+18A72; [7D 99 42, 05, 05]
+18A73; [7D 99 44, 05, 05]
+18A74; [7D 99 46, 05, 05]
+18A75; [7D 99 48, 05, 05]
+18A76; [7D 99 4A, 05, 05]
+18A77; [7D 99 4C, 05, 05]
+18A78; [7D 99 4E, 05, 05]
+18A79; [7D 99 50, 05, 05]
+18A7A; [7D 99 52, 05, 05]
+18A7B; [7D 99 54, 05, 05]
+18A7C; [7D 99 56, 05, 05]
+18A7D; [7D 99 58, 05, 05]
+18A7E; [7D 99 5A, 05, 05]
+18A7F; [7D 99 5C, 05, 05]
+18A80; [7D 99 5E, 05, 05]
+18A81; [7D 99 60, 05, 05]
+18A82; [7D 99 62, 05, 05]
+18A83; [7D 99 64, 05, 05]
+18A84; [7D 99 66, 05, 05]
+18A85; [7D 99 68, 05, 05]
+18A86; [7D 99 6A, 05, 05]
+18A87; [7D 99 6C, 05, 05]
+18A88; [7D 99 6E, 05, 05]
+18A89; [7D 99 70, 05, 05]
+18A8A; [7D 99 72, 05, 05]
+18A8B; [7D 99 74, 05, 05]
+18A8C; [7D 99 76, 05, 05]
+18A8D; [7D 99 78, 05, 05]
+18A8E; [7D 99 7A, 05, 05]
+18A8F; [7D 99 7C, 05, 05]
+18A90; [7D 99 7E, 05, 05]
+18A91; [7D 99 80, 05, 05]
+18A92; [7D 99 82, 05, 05]
+18A93; [7D 99 84, 05, 05]
+18A94; [7D 99 86, 05, 05]
+18A95; [7D 99 88, 05, 05]
+18A96; [7D 99 8A, 05, 05]
+18A97; [7D 99 8C, 05, 05]
+18A98; [7D 99 8E, 05, 05]
+18A99; [7D 99 90, 05, 05]
+18A9A; [7D 99 92, 05, 05]
+18A9B; [7D 99 94, 05, 05]
+18A9C; [7D 99 96, 05, 05]
+18A9D; [7D 99 98, 05, 05]
+18A9E; [7D 99 9A, 05, 05]
+18A9F; [7D 99 9C, 05, 05]
+18AA0; [7D 99 9E, 05, 05]
+18AA1; [7D 99 A0, 05, 05]
+18AA2; [7D 99 A2, 05, 05]
+18AA3; [7D 99 A4, 05, 05]
+18AA4; [7D 99 A6, 05, 05]
+18AA5; [7D 99 A8, 05, 05]
+18AA6; [7D 99 AA, 05, 05]
+18AA7; [7D 99 AC, 05, 05]
+18AA8; [7D 99 AE, 05, 05]
+18AA9; [7D 99 B0, 05, 05]
+18AAA; [7D 99 B2, 05, 05]
+18AAB; [7D 99 B4, 05, 05]
+18AAC; [7D 99 B6, 05, 05]
+18AAD; [7D 99 B8, 05, 05]
+18AAE; [7D 99 BA, 05, 05]
+18AAF; [7D 99 BC, 05, 05]
+18AB0; [7D 99 BE, 05, 05]
+18AB1; [7D 99 C0, 05, 05]
+18AB2; [7D 99 C2, 05, 05]
+18AB3; [7D 99 C4, 05, 05]
+18AB4; [7D 99 C6, 05, 05]
+18AB5; [7D 99 C8, 05, 05]
+18AB6; [7D 99 CA, 05, 05]
+18AB7; [7D 99 CC, 05, 05]
+18AB8; [7D 99 CE, 05, 05]
+18AB9; [7D 99 D0, 05, 05]
+18ABA; [7D 99 D2, 05, 05]
+18ABB; [7D 99 D4, 05, 05]
+18ABC; [7D 99 D6, 05, 05]
+18ABD; [7D 99 D8, 05, 05]
+18ABE; [7D 99 DA, 05, 05]
+18ABF; [7D 99 DC, 05, 05]
+18AC0; [7D 99 DE, 05, 05]
+18AC1; [7D 99 E0, 05, 05]
+18AC2; [7D 99 E2, 05, 05]
+18AC3; [7D 99 E4, 05, 05]
+18AC4; [7D 99 E6, 05, 05]
+18AC5; [7D 99 E8, 05, 05]
+18AC6; [7D 99 EA, 05, 05]
+18AC7; [7D 99 EC, 05, 05]
+18AC8; [7D 99 EE, 05, 05]
+18AC9; [7D 99 F0, 05, 05]
+18ACA; [7D 99 F2, 05, 05]
+18ACB; [7D 99 F4, 05, 05]
+18ACC; [7D 99 F6, 05, 05]
+18ACD; [7D 99 F8, 05, 05]
+18ACE; [7D 99 FA, 05, 05]
+18ACF; [7D 99 FC, 05, 05]
+18AD0; [7D 99 FE, 05, 05]
+18AD1; [7D 9A 02, 05, 05]
+18AD2; [7D 9A 04, 05, 05]
+18AD3; [7D 9A 06, 05, 05]
+18AD4; [7D 9A 08, 05, 05]
+18AD5; [7D 9A 0A, 05, 05]
+18AD6; [7D 9A 0C, 05, 05]
+18AD7; [7D 9A 0E, 05, 05]
+18AD8; [7D 9A 10, 05, 05]
+18AD9; [7D 9A 12, 05, 05]
+18ADA; [7D 9A 14, 05, 05]
+18ADB; [7D 9A 16, 05, 05]
+18ADC; [7D 9A 18, 05, 05]
+18ADD; [7D 9A 1A, 05, 05]
+18ADE; [7D 9A 1C, 05, 05]
+18ADF; [7D 9A 1E, 05, 05]
+18AE0; [7D 9A 20, 05, 05]
+18AE1; [7D 9A 22, 05, 05]
+18AE2; [7D 9A 24, 05, 05]
+18AE3; [7D 9A 26, 05, 05]
+18AE4; [7D 9A 28, 05, 05]
+18AE5; [7D 9A 2A, 05, 05]
+18AE6; [7D 9A 2C, 05, 05]
+18AE7; [7D 9A 2E, 05, 05]
+18AE8; [7D 9A 30, 05, 05]
+18AE9; [7D 9A 32, 05, 05]
+18AEA; [7D 9A 34, 05, 05]
+18AEB; [7D 9A 36, 05, 05]
+18AEC; [7D 9A 38, 05, 05]
+18AED; [7D 9A 3A, 05, 05]
+18AEE; [7D 9A 3C, 05, 05]
+18AEF; [7D 9A 3E, 05, 05]
+18AF0; [7D 9A 40, 05, 05]
+18AF1; [7D 9A 42, 05, 05]
+18AF2; [7D 9A 44, 05, 05]
FDD1 1B1C4; [7D 9B 02, 05, 05] # Nushu first primary (compressible)
@@ -60085,6 +61187,7 @@ F977; [U+4EAE]
F9FD; [U+4EC0]
2F819; [U+4ECC]
F9A8; [U+4EE4]
+32FF; [U+4EE4, 31][U+548C, 31]
32AD; [U+4F01, 1B]
32A1; [U+4F11, 1B]
2F804; [U+4F60]
@@ -61520,13 +62623,13 @@ FDD0 0045; [, AA, 20]
FDD0 0046; [, AE, 2E]
FDD0 0047; [, B0, 2E]
FDD0 0048; [, B2, 20]
-FDD0 0049; [, E5 C0, 1E]
-FDD0 004A; [, E8 B2, 20]
-FDD0 004B; [, E8 B2, 2E]
-FDD0 004C; [, EB 82, 10]
-FDD0 004D; [, EB 82, 1E]
-FDD0 004E; [, EB 82, 2C]
-FDD0 004F; [, F1 66, 20]
+FDD0 0049; [, E5 A4, 1E]
+FDD0 004A; [, E8 80, 20]
+FDD0 004B; [, E8 80, 2E]
+FDD0 004C; [, EB 3B, 10]
+FDD0 004D; [, EB 3B, 1E]
+FDD0 004E; [, EB 3B, 2C]
+FDD0 004F; [, F0 F1, 20]
FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE
# VALUES BASED ON UCA
@@ -61540,9 +62643,9 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE
[first secondary in primary non-ignorable [X, 05, X]] # U+0009 <CHARACTER TABULATION>
[last secondary in primary non-ignorable [X, 7C, X]] # U+16AE RUNIC LETTER O
[first primary ignorable [, 82, 05]] # U+0332 COMBINING LOW LINE
-[last primary ignorable [, FB D6, 05]] # U+00B7 MIDDLE DOT
+[last primary ignorable [, FB 99, 05]] # U+00B7 MIDDLE DOT
[first variable [03 04, 05, 05]] # U+0009 <CHARACTER TABULATION>
-[last variable [0B 78 59, 05, 05]] # U+10A7F OLD SOUTH ARABIAN NUMERIC INDICATOR
+[last variable [0B 7D 5D, 05, 05]] # U+10A7F OLD SOUTH ARABIAN NUMERIC INDICATOR
[variable top = 0B FF FF FF]
[first regular [0C 04, 05, 05]] # U+0060 GRAVE ACCENT
[last regular [7D A5 EA, 05, 05]] # U+1B2FB NUSHU CHARACTER-1B2FB
@@ -61585,6 +62688,7 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE
[reorderingTokens Dupl 7C=140 ]
[reorderingTokens Egyp 7D=1072 ]
[reorderingTokens Elba 7C=41 ]
+[reorderingTokens Elym 7C=24 ]
[reorderingTokens Ethi 67=454 ]
[reorderingTokens FIELD-SEPARATOR 02=1 ]
[reorderingTokens Geor 63=174 ]
@@ -61606,13 +62710,14 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE
[reorderingTokens Hira 7A=1 ]
[reorderingTokens Hluw 7D=584 ]
[reorderingTokens Hmng 7B=89 ]
+[reorderingTokens Hmnp 7B=47 ]
[reorderingTokens Hrkt 7A=1 ]
[reorderingTokens Hung 77=103 ]
[reorderingTokens IMPLICIT E0=5 E1=5 E2=5 E3=5 E4=5 ]
[reorderingTokens Ital 7B=36 ]
[reorderingTokens Java 76=48 ]
[reorderingTokens Kali 75=29 ]
-[reorderingTokens Kana 7A=676 ]
+[reorderingTokens Kana 7A=683 ]
[reorderingTokens Khar 71=38 ]
[reorderingTokens Khmr 75=54 ]
[reorderingTokens Khoj 71=44 ]
@@ -61620,8 +62725,8 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE
[reorderingTokens Kthi 71=46 ]
[reorderingTokens LEVEL-SEPARATOR 01=1 ]
[reorderingTokens Lana 76=54 ]
-[reorderingTokens Laoo 73=196 ]
-[reorderingTokens Latn 29=2234 2A=2234 2B=2234 2C=2234 2D=2234 2E=2234 2F=2234 30=2234 31=2234 32=2234 33=2234 34=2234 35=2234 36=2234 37=2234 38=2234 39=2234 3A=2234 3B=2234 3C=2234 3D=2234 3E=2234 3F=2234 40=2234 41=2234 42=2234 43=2234 44=2234 45=2234 46=2234 47=2234 48=2234 49=2234 4A=2234 4B=2234 4C=2234 4D=2234 4E=2234 4F=2234 50=2234 51=2234 52=2234 53=2234 54=2234 55=2234 56=2234 57=2234 58=2234 59=2234 5A=2234 5B=2234 5C=2234 5D=2234 ]
+[reorderingTokens Laoo 73=280 ]
+[reorderingTokens Latn 29=2248 2A=2248 2B=2248 2C=2248 2D=2248 2E=2248 2F=2248 30=2248 31=2248 32=2248 33=2248 34=2248 35=2248 36=2248 37=2248 38=2248 39=2248 3A=2248 3B=2248 3C=2248 3D=2248 3E=2248 3F=2248 40=2248 41=2248 42=2248 43=2248 44=2248 45=2248 46=2248 47=2248 48=2248 49=2248 4A=2248 4B=2248 4C=2248 4D=2248 4E=2248 4F=2248 50=2248 51=2248 52=2248 53=2248 54=2248 55=2248 56=2248 57=2248 58=2248 59=2248 5A=2248 5B=2248 5C=2248 5D=2248 ]
[reorderingTokens Lepc 75=40 ]
[reorderingTokens Limb 75=32 ]
[reorderingTokens Lina 7C=342 ]
@@ -61645,9 +62750,10 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE
[reorderingTokens Mtei 71=48 ]
[reorderingTokens Mult 71=38 ]
[reorderingTokens Mymr 75=120 ]
+[reorderingTokens Nand 71=50 ]
[reorderingTokens Narb 7C=30 ]
[reorderingTokens Nbat 7C=32 ]
-[reorderingTokens Newa 71=58 ]
+[reorderingTokens Newa 71=59 ]
[reorderingTokens Nkoo 67=34 ]
[reorderingTokens Nshu 7D=1 ]
[reorderingTokens Ogam 76=27 ]
@@ -61664,7 +62770,7 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE
[reorderingTokens Phli 7C=20 ]
[reorderingTokens Phlp 7C=19 ]
[reorderingTokens Phnx 65=23 ]
-[reorderingTokens Plrd 7B=71 ]
+[reorderingTokens Plrd 7B=77 ]
[reorderingTokens Prti 7C=23 ]
[reorderingTokens Rjng 75=24 ]
[reorderingTokens Rohg 75=37 ]
@@ -61683,14 +62789,14 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE
[reorderingTokens Sogd 7C=23 ]
[reorderingTokens Sogo 7C=31 ]
[reorderingTokens Sora 7C=26 ]
-[reorderingTokens Soyo 74=47 ]
+[reorderingTokens Soyo 74=49 ]
[reorderingTokens Sund 71=39 ]
[reorderingTokens Sylo 71=33 ]
[reorderingTokens Syrc 67=46 ]
[reorderingTokens TERMINATOR 00=1 ]
[reorderingTokens TRAILING E5=11 E6=11 E7=11 E8=11 E9=11 EA=11 EB=11 EC=11 ED=11 EE=11 EF=11 ]
[reorderingTokens Tagb 75=17 ]
-[reorderingTokens Takr 71=44 ]
+[reorderingTokens Takr 71=45 ]
[reorderingTokens Tale 76=36 ]
[reorderingTokens Talu 76=247 ]
[reorderingTokens Taml 6D=39 ]
@@ -61706,6 +62812,7 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE
[reorderingTokens Ugar 7C=31 ]
[reorderingTokens Vaii 78=287 ]
[reorderingTokens Wara 7B=66 ]
+[reorderingTokens Wcho 7B=45 ]
[reorderingTokens Xpeo 7C=45 ]
[reorderingTokens Xsux 7C=1119 ]
[reorderingTokens Yiii 7B=1165 ]
@@ -61714,24 +62821,24 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE
# General Categories => Top Byte
[categories Cc 03{SPACE}=6 ]
-[categories Lm 0C{SYMBOL}=24 0D{CURRENCY}=30 29{Latn}=12 2A{Latn}=12 2B{Latn}=12 2C{Latn}=12 2D{Latn}=12 2E{Latn}=12 2F{Latn}=12 30{Latn}=12 31{Latn}=12 32{Latn}=12 33{Latn}=12 34{Latn}=12 35{Latn}=12 36{Latn}=12 37{Latn}=12 38{Latn}=12 39{Latn}=12 3A{Latn}=12 3B{Latn}=12 3C{Latn}=12 3D{Latn}=12 3E{Latn}=12 3F{Latn}=12 40{Latn}=12 41{Latn}=12 42{Latn}=12 43{Latn}=12 44{Latn}=12 45{Latn}=12 46{Latn}=12 47{Latn}=12 48{Latn}=12 49{Latn}=12 4A{Latn}=12 4B{Latn}=12 4C{Latn}=12 4D{Latn}=12 4E{Latn}=12 4F{Latn}=12 50{Latn}=12 51{Latn}=12 52{Latn}=12 53{Latn}=12 54{Latn}=12 55{Latn}=12 56{Latn}=12 57{Latn}=12 58{Latn}=12 59{Latn}=12 5A{Latn}=12 5B{Latn}=12 5C{Latn}=12 5D{Latn}=12 61{Cyrl}=2 64{Armn}=1 65{Hebr Phnx Samr}=1 66{Arab}=2 67{Syrc Mand Thaa Nkoo Tfng Ethi}=2 76{Tale Talu Lana Cham Bali Java Mong Olck Cher Osge Cans Ogam}=7 78{Vaii Bamu Bass Mend Medf Adlm}=1 7B{Bopo Yiii Lisu Plrd Wara Pauc Hmng Lyci Cari Lydi Ital Goth}=22 ]
-[categories Lo 68{Deva}=10 7A{Hira Hrkt Kana}=2 ]
-[categories Mc 68{Deva}=10 69{Beng}=10 6A{Guru}=3 6B{Gujr}=6 6C{Orya}=10 6D{Taml}=14 6E{Telu}=4 6F{Knda}=7 70{Mlym}=13 71{Sinh Mtei Sylo Saur Kthi Mahj Shrd Khoj Sind Mult Gran Newa Tirh Sidd Modi Takr Dogr Ahom Gonm Gong Sund Brah Khar Bhks}=133 74{Tibt Zanb Soyo}=2 75{Marc Lepc Phag Limb Tglg Hano Buhd Tagb Bugi Maka Batk Rjng Kali Mymr Rohg Cakm Khmr}=84 76{Tale Talu Lana Cham Bali Java Mong Olck Cher Osge Cans Ogam}=32 7B{Bopo Yiii Lisu Plrd Wara Pauc Hmng Lyci Cari Lydi Ital Goth}=46 ]
-[categories Mn 29{Latn}=49 2A{Latn}=49 2B{Latn}=49 2C{Latn}=49 2D{Latn}=49 2E{Latn}=49 2F{Latn}=49 30{Latn}=49 31{Latn}=49 32{Latn}=49 33{Latn}=49 34{Latn}=49 35{Latn}=49 36{Latn}=49 37{Latn}=49 38{Latn}=49 39{Latn}=49 3A{Latn}=49 3B{Latn}=49 3C{Latn}=49 3D{Latn}=49 3E{Latn}=49 3F{Latn}=49 40{Latn}=49 41{Latn}=49 42{Latn}=49 43{Latn}=49 44{Latn}=49 45{Latn}=49 46{Latn}=49 47{Latn}=49 48{Latn}=49 49{Latn}=49 4A{Latn}=49 4B{Latn}=49 4C{Latn}=49 4D{Latn}=49 4E{Latn}=49 4F{Latn}=49 50{Latn}=49 51{Latn}=49 52{Latn}=49 53{Latn}=49 54{Latn}=49 55{Latn}=49 56{Latn}=49 57{Latn}=49 58{Latn}=49 59{Latn}=49 5A{Latn}=49 5B{Latn}=49 5C{Latn}=49 5D{Latn}=49 61{Cyrl}=42 62{Glag Perm}=43 65{Hebr Phnx Samr}=3 67{Syrc Mand Thaa Nkoo Tfng Ethi}=11 68{Deva}=16 69{Beng}=7 6A{Guru}=9 6B{Gujr}=10 6C{Orya}=9 6D{Taml}=2 6E{Telu}=15 6F{Knda}=17 70{Mlym}=9 71{Sinh Mtei Sylo Saur Kthi Mahj Shrd Khoj Sind Mult Gran Newa Tirh Sidd Modi Takr Dogr Ahom Gonm Gong Sund Brah Khar Bhks}=162 72{Thai}=10 73{Laoo Tavt}=18 74{Tibt Zanb Soyo}=120 75{Marc Lepc Phag Limb Tglg Hano Buhd Tagb Bugi Maka Batk Rjng Kali Mymr Rohg Cakm Khmr}=134 76{Tale Talu Lana Cham Bali Java Mong Olck Cher Osge Cans Ogam}=52 7B{Bopo Yiii Lisu Plrd Wara Pauc Hmng Lyci Cari Lydi Ital Goth}=4 ]
-[categories Nd 0E{DIGIT}=1 0F{DIGIT}=1 13{DIGIT}=68 15{DIGIT}=122 17{DIGIT}=97 19{DIGIT}=84 1B{DIGIT}=80 1D{DIGIT}=72 1F{DIGIT}=69 21{DIGIT}=70 23{DIGIT}=69 25{DIGIT}=69 ]
-[categories Nl 10{DIGIT}=18 11{DIGIT}=48 13{DIGIT}=1 15{DIGIT}=12 17{DIGIT}=16 19{DIGIT}=16 1B{DIGIT}=17 1D{DIGIT}=18 1F{DIGIT}=10 21{DIGIT}=10 23{DIGIT}=9 25{DIGIT}=11 77{Runr Hung Orkh}=3 78{Vaii Bamu Bass Mend Medf Adlm}=10 7B{Bopo Yiii Lisu Plrd Wara Pauc Hmng Lyci Cari Lydi Ital Goth}=2 ]
-[categories No 10{DIGIT}=113 11{DIGIT}=245 12{DIGIT}=4 13{DIGIT}=9 15{DIGIT}=57 17{DIGIT}=36 19{DIGIT}=34 1B{DIGIT}=30 1D{DIGIT}=30 1F{DIGIT}=21 21{DIGIT}=21 23{DIGIT}=21 25{DIGIT}=20 ]
+[categories Lm 0C{SYMBOL}=24 0D{CURRENCY}=33 29{Latn}=12 2A{Latn}=12 2B{Latn}=12 2C{Latn}=12 2D{Latn}=12 2E{Latn}=12 2F{Latn}=12 30{Latn}=12 31{Latn}=12 32{Latn}=12 33{Latn}=12 34{Latn}=12 35{Latn}=12 36{Latn}=12 37{Latn}=12 38{Latn}=12 39{Latn}=12 3A{Latn}=12 3B{Latn}=12 3C{Latn}=12 3D{Latn}=12 3E{Latn}=12 3F{Latn}=12 40{Latn}=12 41{Latn}=12 42{Latn}=12 43{Latn}=12 44{Latn}=12 45{Latn}=12 46{Latn}=12 47{Latn}=12 48{Latn}=12 49{Latn}=12 4A{Latn}=12 4B{Latn}=12 4C{Latn}=12 4D{Latn}=12 4E{Latn}=12 4F{Latn}=12 50{Latn}=12 51{Latn}=12 52{Latn}=12 53{Latn}=12 54{Latn}=12 55{Latn}=12 56{Latn}=12 57{Latn}=12 58{Latn}=12 59{Latn}=12 5A{Latn}=12 5B{Latn}=12 5C{Latn}=12 5D{Latn}=12 61{Cyrl}=2 64{Armn}=1 65{Hebr Phnx Samr}=1 66{Arab}=2 67{Syrc Mand Thaa Nkoo Tfng Ethi}=2 76{Tale Talu Lana Cham Bali Java Mong Olck Cher Osge Cans Ogam}=7 78{Vaii Bamu Bass Mend Medf Adlm}=2 7B{Bopo Yiii Lisu Plrd Wara Pauc Hmng Hmnp Wcho Lyci Cari Lydi Ital Goth}=27 ]
+[categories Lo 68{Deva}=11 7A{Hira Hrkt Kana}=2 ]
+[categories Mc 68{Deva}=10 69{Beng}=10 6A{Guru}=3 6B{Gujr}=6 6C{Orya}=10 6D{Taml}=14 6E{Telu}=4 6F{Knda}=7 70{Mlym}=13 71{Sinh Mtei Sylo Saur Kthi Mahj Shrd Khoj Sind Mult Gran Newa Tirh Sidd Modi Takr Nand Dogr Ahom Gonm Gong Sund Brah Khar Bhks}=139 74{Tibt Zanb Soyo}=2 75{Marc Lepc Phag Limb Tglg Hano Buhd Tagb Bugi Maka Batk Rjng Kali Mymr Rohg Cakm Khmr}=84 76{Tale Talu Lana Cham Bali Java Mong Olck Cher Osge Cans Ogam}=31 7B{Bopo Yiii Lisu Plrd Wara Pauc Hmng Hmnp Wcho Lyci Cari Lydi Ital Goth}=55 ]
+[categories Mn 29{Latn}=49 2A{Latn}=49 2B{Latn}=49 2C{Latn}=49 2D{Latn}=49 2E{Latn}=49 2F{Latn}=49 30{Latn}=49 31{Latn}=49 32{Latn}=49 33{Latn}=49 34{Latn}=49 35{Latn}=49 36{Latn}=49 37{Latn}=49 38{Latn}=49 39{Latn}=49 3A{Latn}=49 3B{Latn}=49 3C{Latn}=49 3D{Latn}=49 3E{Latn}=49 3F{Latn}=49 40{Latn}=49 41{Latn}=49 42{Latn}=49 43{Latn}=49 44{Latn}=49 45{Latn}=49 46{Latn}=49 47{Latn}=49 48{Latn}=49 49{Latn}=49 4A{Latn}=49 4B{Latn}=49 4C{Latn}=49 4D{Latn}=49 4E{Latn}=49 4F{Latn}=49 50{Latn}=49 51{Latn}=49 52{Latn}=49 53{Latn}=49 54{Latn}=49 55{Latn}=49 56{Latn}=49 57{Latn}=49 58{Latn}=49 59{Latn}=49 5A{Latn}=49 5B{Latn}=49 5C{Latn}=49 5D{Latn}=49 61{Cyrl}=42 62{Glag Perm}=43 65{Hebr Phnx Samr}=3 67{Syrc Mand Thaa Nkoo Tfng Ethi}=11 68{Deva}=16 69{Beng}=7 6A{Guru}=9 6B{Gujr}=10 6C{Orya}=9 6D{Taml}=2 6E{Telu}=15 6F{Knda}=17 70{Mlym}=9 71{Sinh Mtei Sylo Saur Kthi Mahj Shrd Khoj Sind Mult Gran Newa Tirh Sidd Modi Takr Nand Dogr Ahom Gonm Gong Sund Brah Khar Bhks}=169 72{Thai}=10 73{Laoo Tavt}=19 74{Tibt Zanb Soyo}=120 75{Marc Lepc Phag Limb Tglg Hano Buhd Tagb Bugi Maka Batk Rjng Kali Mymr Rohg Cakm Khmr}=134 76{Tale Talu Lana Cham Bali Java Mong Olck Cher Osge Cans Ogam}=53 7B{Bopo Yiii Lisu Plrd Wara Pauc Hmng Hmnp Wcho Lyci Cari Lydi Ital Goth}=5 ]
+[categories Nd 0E{DIGIT}=1 0F{DIGIT}=1 13{DIGIT}=70 15{DIGIT}=124 17{DIGIT}=99 19{DIGIT}=86 1B{DIGIT}=82 1D{DIGIT}=74 1F{DIGIT}=71 21{DIGIT}=72 23{DIGIT}=71 25{DIGIT}=71 ]
+[categories Nl 10{DIGIT}=6 11{DIGIT}=43 12{DIGIT}=17 13{DIGIT}=1 15{DIGIT}=12 17{DIGIT}=16 19{DIGIT}=16 1B{DIGIT}=17 1D{DIGIT}=18 1F{DIGIT}=10 21{DIGIT}=10 23{DIGIT}=9 25{DIGIT}=11 77{Runr Hung Orkh}=3 78{Vaii Bamu Bass Mend Medf Adlm}=10 7B{Bopo Yiii Lisu Plrd Wara Pauc Hmng Hmnp Wcho Lyci Cari Lydi Ital Goth}=2 ]
+[categories No 10{DIGIT}=125 11{DIGIT}=180 12{DIGIT}=121 13{DIGIT}=9 15{DIGIT}=58 17{DIGIT}=38 19{DIGIT}=36 1B{DIGIT}=32 1D{DIGIT}=32 1F{DIGIT}=23 21{DIGIT}=23 23{DIGIT}=23 25{DIGIT}=22 ]
[categories Pc 05{PUNCTUATION}=7 0A{PUNCTUATION}=3 ]
[categories Pd 05{PUNCTUATION}=22 0A{PUNCTUATION}=1 0B{PUNCTUATION}=1 ]
[categories Pe 09{PUNCTUATION}=42 0A{PUNCTUATION}=31 ]
[categories Pf 09{PUNCTUATION}=4 0A{PUNCTUATION}=6 ]
[categories Pi 05{PUNCTUATION}=1 09{PUNCTUATION}=6 0A{PUNCTUATION}=6 ]
-[categories Po 05{PUNCTUATION}=6 06{PUNCTUATION}=4 07{PUNCTUATION}=109 08{PUNCTUATION}=8 09{PUNCTUATION}=156 0A{PUNCTUATION}=87 0B{PUNCTUATION}=207 ]
+[categories Po 05{PUNCTUATION}=6 06{PUNCTUATION}=4 07{PUNCTUATION}=111 08{PUNCTUATION}=8 09{PUNCTUATION}=156 0A{PUNCTUATION}=87 0B{PUNCTUATION}=209 ]
[categories Ps 09{PUNCTUATION}=183 0A{PUNCTUATION}=41 ]
-[categories Sc 0D{CURRENCY}=56 ]
+[categories Sc 0D{CURRENCY}=61 ]
[categories Sk 0C{SYMBOL}=87 0D{CURRENCY}=5 ]
[categories Sm 0C{SYMBOL}=947 ]
-[categories So 0C{SYMBOL}=2700 0D{CURRENCY}=2191 15{DIGIT}=1 17{DIGIT}=3 19{DIGIT}=1 1B{DIGIT}=1 1D{DIGIT}=1 1F{DIGIT}=1 21{DIGIT}=1 23{DIGIT}=1 29{Latn}=77 2A{Latn}=77 2B{Latn}=77 2C{Latn}=77 2D{Latn}=77 2E{Latn}=77 2F{Latn}=77 30{Latn}=77 31{Latn}=77 32{Latn}=77 33{Latn}=77 34{Latn}=77 35{Latn}=77 36{Latn}=77 37{Latn}=77 38{Latn}=77 39{Latn}=77 3A{Latn}=77 3B{Latn}=77 3C{Latn}=77 3D{Latn}=77 3E{Latn}=77 3F{Latn}=77 40{Latn}=77 41{Latn}=77 42{Latn}=77 43{Latn}=77 44{Latn}=77 45{Latn}=77 46{Latn}=77 47{Latn}=77 48{Latn}=77 49{Latn}=77 4A{Latn}=77 4B{Latn}=77 4C{Latn}=77 4D{Latn}=77 4E{Latn}=77 4F{Latn}=77 50{Latn}=77 51{Latn}=77 52{Latn}=77 53{Latn}=77 54{Latn}=77 55{Latn}=77 56{Latn}=77 57{Latn}=77 58{Latn}=77 59{Latn}=77 5A{Latn}=77 5B{Latn}=77 5C{Latn}=77 5D{Latn}=77 66{Arab}=2 76{Tale Talu Lana Cham Bali Java Mong Olck Cher Osge Cans Ogam}=2 7C{Dsrt Shaw Dupl Osma Elba Aghb Sora Mroo Linb Lina Cprt Sarb Narb Avst Palm Nbat Hatr Armi Prti Phli Phlp Mani Sogo Sogd Ugar Xpeo Xsux}=1 E5{TRAILING}=1 E6{TRAILING}=1 E7{TRAILING}=1 E8{TRAILING}=1 E9{TRAILING}=1 EA{TRAILING}=1 EB{TRAILING}=1 EC{TRAILING}=1 ED{TRAILING}=1 EE{TRAILING}=1 EF{TRAILING}=1 ]
+[categories So 0C{SYMBOL}=2690 0D{CURRENCY}=2376 15{DIGIT}=1 17{DIGIT}=3 19{DIGIT}=1 1B{DIGIT}=1 1D{DIGIT}=1 1F{DIGIT}=1 21{DIGIT}=1 23{DIGIT}=1 29{Latn}=77 2A{Latn}=77 2B{Latn}=77 2C{Latn}=77 2D{Latn}=77 2E{Latn}=77 2F{Latn}=77 30{Latn}=77 31{Latn}=77 32{Latn}=77 33{Latn}=77 34{Latn}=77 35{Latn}=77 36{Latn}=77 37{Latn}=77 38{Latn}=77 39{Latn}=77 3A{Latn}=77 3B{Latn}=77 3C{Latn}=77 3D{Latn}=77 3E{Latn}=77 3F{Latn}=77 40{Latn}=77 41{Latn}=77 42{Latn}=77 43{Latn}=77 44{Latn}=77 45{Latn}=77 46{Latn}=77 47{Latn}=77 48{Latn}=77 49{Latn}=77 4A{Latn}=77 4B{Latn}=77 4C{Latn}=77 4D{Latn}=77 4E{Latn}=77 4F{Latn}=77 50{Latn}=77 51{Latn}=77 52{Latn}=77 53{Latn}=77 54{Latn}=77 55{Latn}=77 56{Latn}=77 57{Latn}=77 58{Latn}=77 59{Latn}=77 5A{Latn}=77 5B{Latn}=77 5C{Latn}=77 5D{Latn}=77 66{Arab}=2 76{Tale Talu Lana Cham Bali Java Mong Olck Cher Osge Cans Ogam}=2 7C{Dsrt Shaw Dupl Osma Elba Aghb Sora Mroo Linb Lina Cprt Sarb Narb Avst Palm Nbat Hatr Armi Prti Phli Phlp Elym Mani Sogo Sogd Ugar Xpeo Xsux}=1 E5{TRAILING}=1 E6{TRAILING}=1 E7{TRAILING}=1 E8{TRAILING}=1 E9{TRAILING}=1 EA{TRAILING}=1 EB{TRAILING}=1 EC{TRAILING}=1 ED{TRAILING}=1 EE{TRAILING}=1 EF{TRAILING}=1 ]
[categories Zl 03{SPACE}=1 ]
[categories Zp 03{SPACE}=1 ]
[categories Zs 03{SPACE}=1 04{SPACE}=17 05{PUNCTUATION}=6 0C{SYMBOL}=29 60{Grek Copt}=1 ]
diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/NormalizationCorrections.txt b/Build/source/libs/icu/icu-src/source/data/unidata/NormalizationCorrections.txt
index 8b3cd2b13f8..360f49cc928 100644
--- a/Build/source/libs/icu/icu-src/source/data/unidata/NormalizationCorrections.txt
+++ b/Build/source/libs/icu/icu-src/source/data/unidata/NormalizationCorrections.txt
@@ -1,6 +1,6 @@
-# NormalizationCorrections-11.0.0.txt
-# Date: 2017-12-06, 01:00:00 GMT [KW, LI]
-# © 2017 Unicode®, Inc.
+# NormalizationCorrections-12.1.0.txt
+# Date: 2019-03-08, 23:59:00 GMT [KW, LI]
+# © 2019 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
# Unicode Character Database
diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/NormalizationTest.txt b/Build/source/libs/icu/icu-src/source/data/unidata/NormalizationTest.txt
index 15270455eb4..cf4c3a9bae5 100644
--- a/Build/source/libs/icu/icu-src/source/data/unidata/NormalizationTest.txt
+++ b/Build/source/libs/icu/icu-src/source/data/unidata/NormalizationTest.txt
@@ -1,6 +1,6 @@
-# NormalizationTest-11.0.0.txt
-# Date: 2018-02-19, 18:33:08 GMT
-# © 2018 Unicode®, Inc.
+# NormalizationTest-12.1.0.txt
+# Date: 2019-04-01, 09:10:28 GMT
+# © 2019 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@@ -2149,6 +2149,7 @@
32FC;32FC;32FC;30F0;30F0;
32FD;32FD;32FD;30F1;30F1;
32FE;32FE;32FE;30F2;30F2;
+32FF;32FF;32FF;4EE4 548C;4EE4 548C;
3300;3300;3300;30A2 30D1 30FC 30C8;30A2 30CF 309A 30FC 30C8;
3301;3301;3301;30A2 30EB 30D5 30A1;30A2 30EB 30D5 30A1;
3302;3302;3302;30A2 30F3 30DA 30A2;30A2 30F3 30D8 309A 30A2;
@@ -16363,6 +16364,7 @@ FFEE;FFEE;FFEE;25CB;25CB;
1F14F;1F14F;1F14F;0057 0043;0057 0043;
1F16A;1F16A;1F16A;004D 0043;004D 0043;
1F16B;1F16B;1F16B;004D 0044;004D 0044;
+1F16C;1F16C;1F16C;004D 0052;004D 0052;
1F190;1F190;1F190;0044 004A;0044 004A;
1F200;1F200;1F200;307B 304B;307B 304B;
1F201;1F201;1F201;30B3 30B3;30B3 30B3;
@@ -17685,6 +17687,8 @@ FFEE;FFEE;FFEE;25CB;25CB;
0061 0EB8 0EC8 0EB8 0E48 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;
0061 0EC8 0EB8 0E48 0EB9 0062;0061 0E48 0EB8 0EB9 0EC8 0062;0061 0E48 0EB8 0EB9 0EC8 0062;0061 0E48 0EB8 0EB9 0EC8 0062;0061 0E48 0EB8 0EB9 0EC8 0062;
0061 0EB9 0EC8 0EB8 0E48 0062;0061 0E48 0EB9 0EB8 0EC8 0062;0061 0E48 0EB9 0EB8 0EC8 0062;0061 0E48 0EB9 0EB8 0EC8 0062;0061 0E48 0EB9 0EB8 0EC8 0062;
+0061 05B0 094D 3099 0EBA 0062;0061 3099 094D 0EBA 05B0 0062;0061 3099 094D 0EBA 05B0 0062;0061 3099 094D 0EBA 05B0 0062;0061 3099 094D 0EBA 05B0 0062;
+0061 0EBA 05B0 094D 3099 0062;0061 3099 0EBA 094D 05B0 0062;0061 3099 0EBA 094D 05B0 0062;0061 3099 0EBA 094D 05B0 0062;0061 3099 0EBA 094D 05B0 0062;
0061 0F71 0EC8 0EB8 0EC8 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;
0061 0EC8 0F71 0EC8 0EB8 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;
0061 0F71 0EC8 0EB8 0EC9 0062;0061 0EB8 0EC8 0EC9 0F71 0062;0061 0EB8 0EC8 0EC9 0F71 0062;0061 0EB8 0EC8 0EC9 0F71 0062;0061 0EB8 0EC8 0EC9 0F71 0062;
@@ -18453,6 +18457,8 @@ FFEE;FFEE;FFEE;25CB;25CB;
0061 11839 05B0 094D 3099 0062;0061 3099 11839 094D 05B0 0062;0061 3099 11839 094D 05B0 0062;0061 3099 11839 094D 05B0 0062;0061 3099 11839 094D 05B0 0062;
0061 3099 093C 0334 1183A 0062;0061 0334 093C 1183A 3099 0062;0061 0334 093C 1183A 3099 0062;0061 0334 093C 1183A 3099 0062;0061 0334 093C 1183A 3099 0062;
0061 1183A 3099 093C 0334 0062;0061 0334 1183A 093C 3099 0062;0061 0334 1183A 093C 3099 0062;0061 0334 1183A 093C 3099 0062;0061 0334 1183A 093C 3099 0062;
+0061 05B0 094D 3099 119E0 0062;0061 3099 094D 119E0 05B0 0062;0061 3099 094D 119E0 05B0 0062;0061 3099 094D 119E0 05B0 0062;0061 3099 094D 119E0 05B0 0062;
+0061 119E0 05B0 094D 3099 0062;0061 3099 119E0 094D 05B0 0062;0061 3099 119E0 094D 05B0 0062;0061 3099 119E0 094D 05B0 0062;0061 3099 119E0 094D 05B0 0062;
0061 05B0 094D 3099 11A34 0062;0061 3099 094D 11A34 05B0 0062;0061 3099 094D 11A34 05B0 0062;0061 3099 094D 11A34 05B0 0062;0061 3099 094D 11A34 05B0 0062;
0061 11A34 05B0 094D 3099 0062;0061 3099 11A34 094D 05B0 0062;0061 3099 11A34 094D 05B0 0062;0061 3099 11A34 094D 05B0 0062;0061 3099 11A34 094D 05B0 0062;
0061 05B0 094D 3099 11A47 0062;0061 3099 094D 11A47 05B0 0062;0061 3099 094D 11A47 05B0 0062;0061 3099 094D 11A47 05B0 0062;0061 3099 094D 11A47 05B0 0062;
@@ -18637,6 +18643,28 @@ FFEE;FFEE;FFEE;25CB;25CB;
0061 1E029 0315 0300 05AE 0062;0061 05AE 1E029 0300 0315 0062;0061 05AE 1E029 0300 0315 0062;0061 05AE 1E029 0300 0315 0062;0061 05AE 1E029 0300 0315 0062;
0061 0315 0300 05AE 1E02A 0062;00E0 05AE 1E02A 0315 0062;0061 05AE 0300 1E02A 0315 0062;00E0 05AE 1E02A 0315 0062;0061 05AE 0300 1E02A 0315 0062;
0061 1E02A 0315 0300 05AE 0062;0061 05AE 1E02A 0300 0315 0062;0061 05AE 1E02A 0300 0315 0062;0061 05AE 1E02A 0300 0315 0062;0061 05AE 1E02A 0300 0315 0062;
+0061 0315 0300 05AE 1E130 0062;00E0 05AE 1E130 0315 0062;0061 05AE 0300 1E130 0315 0062;00E0 05AE 1E130 0315 0062;0061 05AE 0300 1E130 0315 0062;
+0061 1E130 0315 0300 05AE 0062;0061 05AE 1E130 0300 0315 0062;0061 05AE 1E130 0300 0315 0062;0061 05AE 1E130 0300 0315 0062;0061 05AE 1E130 0300 0315 0062;
+0061 0315 0300 05AE 1E131 0062;00E0 05AE 1E131 0315 0062;0061 05AE 0300 1E131 0315 0062;00E0 05AE 1E131 0315 0062;0061 05AE 0300 1E131 0315 0062;
+0061 1E131 0315 0300 05AE 0062;0061 05AE 1E131 0300 0315 0062;0061 05AE 1E131 0300 0315 0062;0061 05AE 1E131 0300 0315 0062;0061 05AE 1E131 0300 0315 0062;
+0061 0315 0300 05AE 1E132 0062;00E0 05AE 1E132 0315 0062;0061 05AE 0300 1E132 0315 0062;00E0 05AE 1E132 0315 0062;0061 05AE 0300 1E132 0315 0062;
+0061 1E132 0315 0300 05AE 0062;0061 05AE 1E132 0300 0315 0062;0061 05AE 1E132 0300 0315 0062;0061 05AE 1E132 0300 0315 0062;0061 05AE 1E132 0300 0315 0062;
+0061 0315 0300 05AE 1E133 0062;00E0 05AE 1E133 0315 0062;0061 05AE 0300 1E133 0315 0062;00E0 05AE 1E133 0315 0062;0061 05AE 0300 1E133 0315 0062;
+0061 1E133 0315 0300 05AE 0062;0061 05AE 1E133 0300 0315 0062;0061 05AE 1E133 0300 0315 0062;0061 05AE 1E133 0300 0315 0062;0061 05AE 1E133 0300 0315 0062;
+0061 0315 0300 05AE 1E134 0062;00E0 05AE 1E134 0315 0062;0061 05AE 0300 1E134 0315 0062;00E0 05AE 1E134 0315 0062;0061 05AE 0300 1E134 0315 0062;
+0061 1E134 0315 0300 05AE 0062;0061 05AE 1E134 0300 0315 0062;0061 05AE 1E134 0300 0315 0062;0061 05AE 1E134 0300 0315 0062;0061 05AE 1E134 0300 0315 0062;
+0061 0315 0300 05AE 1E135 0062;00E0 05AE 1E135 0315 0062;0061 05AE 0300 1E135 0315 0062;00E0 05AE 1E135 0315 0062;0061 05AE 0300 1E135 0315 0062;
+0061 1E135 0315 0300 05AE 0062;0061 05AE 1E135 0300 0315 0062;0061 05AE 1E135 0300 0315 0062;0061 05AE 1E135 0300 0315 0062;0061 05AE 1E135 0300 0315 0062;
+0061 0315 0300 05AE 1E136 0062;00E0 05AE 1E136 0315 0062;0061 05AE 0300 1E136 0315 0062;00E0 05AE 1E136 0315 0062;0061 05AE 0300 1E136 0315 0062;
+0061 1E136 0315 0300 05AE 0062;0061 05AE 1E136 0300 0315 0062;0061 05AE 1E136 0300 0315 0062;0061 05AE 1E136 0300 0315 0062;0061 05AE 1E136 0300 0315 0062;
+0061 0315 0300 05AE 1E2EC 0062;00E0 05AE 1E2EC 0315 0062;0061 05AE 0300 1E2EC 0315 0062;00E0 05AE 1E2EC 0315 0062;0061 05AE 0300 1E2EC 0315 0062;
+0061 1E2EC 0315 0300 05AE 0062;0061 05AE 1E2EC 0300 0315 0062;0061 05AE 1E2EC 0300 0315 0062;0061 05AE 1E2EC 0300 0315 0062;0061 05AE 1E2EC 0300 0315 0062;
+0061 0315 0300 05AE 1E2ED 0062;00E0 05AE 1E2ED 0315 0062;0061 05AE 0300 1E2ED 0315 0062;00E0 05AE 1E2ED 0315 0062;0061 05AE 0300 1E2ED 0315 0062;
+0061 1E2ED 0315 0300 05AE 0062;0061 05AE 1E2ED 0300 0315 0062;0061 05AE 1E2ED 0300 0315 0062;0061 05AE 1E2ED 0300 0315 0062;0061 05AE 1E2ED 0300 0315 0062;
+0061 0315 0300 05AE 1E2EE 0062;00E0 05AE 1E2EE 0315 0062;0061 05AE 0300 1E2EE 0315 0062;00E0 05AE 1E2EE 0315 0062;0061 05AE 0300 1E2EE 0315 0062;
+0061 1E2EE 0315 0300 05AE 0062;0061 05AE 1E2EE 0300 0315 0062;0061 05AE 1E2EE 0300 0315 0062;0061 05AE 1E2EE 0300 0315 0062;0061 05AE 1E2EE 0300 0315 0062;
+0061 0315 0300 05AE 1E2EF 0062;00E0 05AE 1E2EF 0315 0062;0061 05AE 0300 1E2EF 0315 0062;00E0 05AE 1E2EF 0315 0062;0061 05AE 0300 1E2EF 0315 0062;
+0061 1E2EF 0315 0300 05AE 0062;0061 05AE 1E2EF 0300 0315 0062;0061 05AE 1E2EF 0300 0315 0062;0061 05AE 1E2EF 0300 0315 0062;0061 05AE 1E2EF 0300 0315 0062;
0061 059A 0316 302A 1E8D0 0062;0061 302A 0316 1E8D0 059A 0062;0061 302A 0316 1E8D0 059A 0062;0061 302A 0316 1E8D0 059A 0062;0061 302A 0316 1E8D0 059A 0062;
0061 1E8D0 059A 0316 302A 0062;0061 302A 1E8D0 0316 059A 0062;0061 302A 1E8D0 0316 059A 0062;0061 302A 1E8D0 0316 059A 0062;0061 302A 1E8D0 0316 059A 0062;
0061 059A 0316 302A 1E8D1 0062;0061 302A 0316 1E8D1 059A 0062;0061 302A 0316 1E8D1 059A 0062;0061 302A 0316 1E8D1 059A 0062;0061 302A 0316 1E8D1 059A 0062;
diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/SpecialCasing.txt b/Build/source/libs/icu/icu-src/source/data/unidata/SpecialCasing.txt
index c90d09acb3a..1c04aacf975 100644
--- a/Build/source/libs/icu/icu-src/source/data/unidata/SpecialCasing.txt
+++ b/Build/source/libs/icu/icu-src/source/data/unidata/SpecialCasing.txt
@@ -1,6 +1,6 @@
-# SpecialCasing-11.0.0.txt
-# Date: 2018-02-22, 06:16:47 GMT
-# © 2018 Unicode®, Inc.
+# SpecialCasing-12.1.0.txt
+# Date: 2019-03-10, 10:53:28 GMT
+# © 2019 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/UCARules.txt b/Build/source/libs/icu/icu-src/source/data/unidata/UCARules.txt
index b7998bfa66f..264fa88732f 100644
--- a/Build/source/libs/icu/icu-src/source/data/unidata/UCARules.txt
+++ b/Build/source/libs/icu/icu-src/source/data/unidata/UCARules.txt
@@ -1,10 +1,10 @@
# UCA_Rules_SHORT.txt
-# Date: 2018-05-21, 23:52:44 GMT
-# © 2018 Unicode®, Inc.
+# Date: 2019-04-01, 20:17:28 GMT
+# © 2019 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
-# UCA Version: 11.0.0
-# UCD Version: 11.0.0
+# UCA Version: 12.1.0
+# UCD Version: 12.1.0
# For a description of the format and usage, see
# http://www.unicode.org/reports/tr35/tr35-collation.html#Root_Data_Files
@@ -331,6 +331,15 @@
= 𑍲
= 𑍳
= 𑍴
+ = '\U00013430'
+ = '\U00013431'
+ = '\U00013432'
+ = '\U00013433'
+ = '\U00013434'
+ = '\U00013435'
+ = '\U00013436'
+ = '\U00013437'
+ = '\U00013438'
= '\U0001BCA0'
= '\U0001BCA1'
= '\U0001BCA2'
@@ -1306,6 +1315,7 @@
= 𑘽
= 𑚫
= 𑠷
+ = 𑧞
= 𑨸
= 𑪖
= 𑰽
@@ -1342,6 +1352,7 @@
= 𑘾
= 𑚬
= 𑠸
+ = 𑧟
= 𑨹
= 𑪗
= 𑰾
@@ -1398,12 +1409,23 @@
<< ᤺
<< ᤻
<< 𖬰
+ = 𞄱
<< 𖬱
+ = 𞄶
<< 𖬲
+ = 𞄲
<< 𖬳
+ = 𞄳
<< 𖬴
+ = 𞄰
<< 𖬵
+ = 𞄴
<< 𖬶
+ = 𞄵
+ << 𞋬
+ << 𞋭
+ << 𞋮
+ << 𞋯
<< 〪
<< 〫
<< 〬
@@ -1503,6 +1525,7 @@
< ⹁
< ⹌
< ⹎
+ < ⹏
< ՝
< ،
< ‎؍‎
@@ -1521,6 +1544,7 @@
<<< ︑
< ﹅
< ﹆
+ < 𖿢
< ';'
<<< ;
<<< ﹔
@@ -1787,26 +1811,26 @@
< »
< '('
<<< (
- <<< ⑴ / ‎𞲣')'‎
- <<< ⑽ / ‎𞲣𞥐')'‎
- <<< ⑾ / ‎𞲣𞲣')'‎
- <<< ⑿ / ‎𞲣𞲤')'‎
- <<< ⒀ / ‎𞲣𞲥')'‎
- <<< ⒁ / ‎𞲣𞲦')'‎
- <<< ⒂ / ‎𞲣𞲧')'‎
- <<< ⒃ / ‎𞲣𞲨')'‎
- <<< ⒄ / ‎𞲣𞲩')'‎
- <<< ⒅ / ‎𞲣𞲪')'‎
- <<< ⒆ / ‎𞲣𞲫')'‎
- <<< ⑵ / ‎𞲤')'‎
- <<< ⒇ / ‎𞲤𞥐')'‎
- <<< ⑶ / ‎𞲥')'‎
- <<< ⑷ / ‎𞲦')'‎
- <<< ⑸ / ‎𞲧')'‎
- <<< ⑹ / ‎𞲨')'‎
- <<< ⑺ / ‎𞲩')'‎
- <<< ⑻ / ‎𞲪')'‎
- <<< ⑼ / ‎𞲫')'‎
+ <<< ⑴ / ‎𞴁')'‎
+ <<< ⑽ / ‎𞴁𞥐')'‎
+ <<< ⑾ / ‎𞴁𞴁')'‎
+ <<< ⑿ / ‎𞴁𞴂')'‎
+ <<< ⒀ / ‎𞴁𞴃')'‎
+ <<< ⒁ / ‎𞴁𞴄')'‎
+ <<< ⒂ / ‎𞴁𞴅')'‎
+ <<< ⒃ / ‎𞴁𞴆')'‎
+ <<< ⒄ / ‎𞴁𞴇')'‎
+ <<< ⒅ / ‎𞴁𞴈')'‎
+ <<< ⒆ / ‎𞴁𞴉')'‎
+ <<< ⑵ / ‎𞴂')'‎
+ <<< ⒇ / ‎𞴂𞥐')'‎
+ <<< ⑶ / ‎𞴃')'‎
+ <<< ⑷ / ‎𞴄')'‎
+ <<< ⑸ / ‎𞴅')'‎
+ <<< ⑹ / ‎𞴆')'‎
+ <<< ⑺ / ‎𞴇')'‎
+ <<< ⑻ / ‎𞴈')'‎
+ <<< ⑼ / ‎𞴉')'‎
<<< ⒜ / a')'
<<< 🄐 / A')'
<<< ⒝ / b')'
@@ -2215,6 +2239,7 @@
< ৽
< ੶
< ૰
+ < ౷
< ಄
< ෴
< ๏
@@ -2282,7 +2307,6 @@
< ᪦
< ᪬
< ᪭
- < ᙭
< ᳀
< ᳁
< ᳂
@@ -2371,6 +2395,8 @@
< 𑗗
< 𑙃
< 𑠻
+ < 𑧢
+ < 𑿿
< 𖬷
< 𖬸
< 𖬹
@@ -2548,6 +2574,31 @@
< ௷
< ௸
< ௺
+ < 𑿕
+ < 𑿖
+ < 𑿗
+ < 𑿘
+ < 𑿙
+ < 𑿚
+ < 𑿛
+ < 𑿜
+ < 𑿡
+ < 𑿢
+ < 𑿣
+ < 𑿤
+ < 𑿥
+ < 𑿦
+ < 𑿧
+ < 𑿨
+ < 𑿩
+ < 𑿪
+ < 𑿫
+ < 𑿬
+ < 𑿭
+ < 𑿮
+ < 𑿯
+ < 𑿰
+ < 𑿱
< ౿
< ൏
< ൹
@@ -2594,6 +2645,7 @@
< ࿖
< ࿗
< ࿘
+ < ᙭
< ᥀
< ႞
< ႟
@@ -4755,6 +4807,7 @@
< ⯆
< ⯇
< ⯈
+ < ⯉
< ⯊
< ⯋
< ⯌
@@ -4808,6 +4861,7 @@
< ⯼
< ⯽
< ⯾
+ < ⯿
< ⳥
< ⳦
< ⳧
@@ -5384,6 +5438,7 @@
< 𖬾
< 𖬿
< 𖭅
+ < 𞅏
< 𝀀
< 𝀁
< 𝀂
@@ -5882,6 +5937,7 @@
< 𝉅
< 𛲜
< ‎𞲬‎
+ < ‎𞴮‎
< 🀀
< 🀁
< 🀂
@@ -6108,6 +6164,90 @@
< 🃳
< 🃴
< 🃵
+ < 🨀
+ < 🨁
+ < 🨂
+ < 🨃
+ < 🨄
+ < 🨅
+ < 🨆
+ < 🨇
+ < 🨈
+ < 🨉
+ < 🨊
+ < 🨋
+ < 🨌
+ < 🨍
+ < 🨎
+ < 🨏
+ < 🨐
+ < 🨑
+ < 🨒
+ < 🨓
+ < 🨔
+ < 🨕
+ < 🨖
+ < 🨗
+ < 🨘
+ < 🨙
+ < 🨚
+ < 🨛
+ < 🨜
+ < 🨝
+ < 🨞
+ < 🨟
+ < 🨠
+ < 🨡
+ < 🨢
+ < 🨣
+ < 🨤
+ < 🨥
+ < 🨦
+ < 🨧
+ < 🨨
+ < 🨩
+ < 🨪
+ < 🨫
+ < 🨬
+ < 🨭
+ < 🨮
+ < 🨯
+ < 🨰
+ < 🨱
+ < 🨲
+ < 🨳
+ < 🨴
+ < 🨵
+ < 🨶
+ < 🨷
+ < 🨸
+ < 🨹
+ < 🨺
+ < 🨻
+ < 🨼
+ < 🨽
+ < 🨾
+ < 🨿
+ < 🩀
+ < 🩁
+ < 🩂
+ < 🩃
+ < 🩄
+ < 🩅
+ < 🩆
+ < 🩇
+ < 🩈
+ < 🩉
+ < 🩊
+ < 🩋
+ < 🩌
+ < 🩍
+ < 🩎
+ < 🩏
+ < 🩐
+ < 🩑
+ < 🩒
+ < 🩓
< 🩠
< 🩡
< 🩢
@@ -6908,6 +7048,9 @@
< 🤉
< 🤊
< 🤋
+ < 🤍
+ < 🤎
+ < 🤏
< 🤐
< 🤑
< 🤒
@@ -6955,6 +7098,7 @@
< 🤼
< 🤽
< 🤾
+ < 🤿
< 🥀
< 🥁
< 🥂
@@ -7004,11 +7148,13 @@
< 🥮
< 🥯
< 🥰
+ < 🥱
< 🥳
< 🥴
< 🥵
< 🥶
< 🥺
+ < 🥻
< 🥼
< 🥽
< 🥾
@@ -7048,6 +7194,14 @@
< 🦠
< 🦡
< 🦢
+ < 🦥
+ < 🦦
+ < 🦧
+ < 🦨
+ < 🦩
+ < 🦪
+ < 🦮
+ < 🦯
< 🦰
< 🦱
< 🦲
@@ -7058,9 +7212,26 @@
< 🦷
< 🦸
< 🦹
+ < 🦺
+ < 🦻
+ < 🦼
+ < 🦽
+ < 🦾
+ < 🦿
< 🧀
< 🧁
< 🧂
+ < 🧃
+ < 🧄
+ < 🧅
+ < 🧆
+ < 🧇
+ < 🧈
+ < 🧉
+ < 🧊
+ < 🧍
+ < 🧎
+ < 🧏
< 🧐
< 🧑
< 🧒
@@ -7109,6 +7280,22 @@
< 🧽
< 🧾
< 🧿
+ < 🩰
+ < 🩱
+ < 🩲
+ < 🩳
+ < 🩸
+ < 🩹
+ < 🩺
+ < 🪀
+ < 🪁
+ < 🪂
+ < 🪐
+ < 🪑
+ < 🪒
+ < 🪓
+ < 🪔
+ < 🪕
< 😀
< 😁
< 😂
@@ -7322,6 +7509,7 @@
< 🛒
< 🛓
< 🛔
+ < 🛕
< 🛠
< 🛡
< 🛢
@@ -7345,6 +7533,7 @@
< 🛷
< 🛸
< 🛹
+ < 🛺
< 🜀
< 🜁
< 🜂
@@ -7550,6 +7739,18 @@
< 🟖
< 🟗
< 🟘
+ < 🟠
+ < 🟡
+ < 🟢
+ < 🟣
+ < 🟤
+ < 🟥
+ < 🟦
+ < 🟧
+ < 🟨
+ < 🟩
+ < 🟪
+ < 🟫
< 🠀
< 🠁
< 🠂
@@ -8313,10 +8514,13 @@
< ꫴ
< 𖭂
< 𖭃
+ < 𞄼
+ < 𞄽
< 々
< 〻
< 𖿠
< 𖿡
+ < 𖿣
< 〱
<<< 〲 / ゙
< 〳
@@ -8347,8 +8551,13 @@
< ૱
< ꠸
< ௹
+ < 𑿝
+ < 𑿞
+ < 𑿟
+ < 𑿠
< ฿
< ៛
+ < 𞋿
< ₠
< ₡
< ₢
@@ -8406,6 +8615,27 @@
< ௰
< ௱
< ௲
+ < 𑿀
+ < 𑿁
+ < 𑿂
+ < 𑿃
+ < 𑿄
+ < 𑿅
+ < 𑿆
+ < 𑿇
+ < 𑿈
+ < 𑿉
+ < 𑿊
+ < 𑿋
+ < 𑿌
+ < 𑿍
+ < 𑿎
+ < 𑿏
+ < 𑿐
+ < 𑿑
+ < 𑿒
+ < 𑿓
+ < 𑿔
< ൘
< ൙
< ൚
@@ -8732,6 +8962,49 @@
< ‎𞲯‎
< ‎𞲳‎
< ‎𞲴‎
+ < ‎𞴊‎
+ < ‎𞴋‎
+ < ‎𞴌‎
+ < ‎𞴍‎
+ < ‎𞴎‎
+ < ‎𞴏‎
+ < ‎𞴐‎
+ < ‎𞴑‎
+ < ‎𞴒‎
+ < ‎𞴓‎
+ < ‎𞴔‎
+ < ‎𞴕‎
+ < ‎𞴖‎
+ < ‎𞴗‎
+ < ‎𞴘‎
+ < ‎𞴙‎
+ < ‎𞴚‎
+ < ‎𞴛‎
+ < ‎𞴜‎
+ < ‎𞴝‎
+ < ‎𞴞‎
+ < ‎𞴟‎
+ < ‎𞴠‎
+ < ‎𞴡‎
+ < ‎𞴢‎
+ < ‎𞴣‎
+ < ‎𞴤‎
+ < ‎𞴥‎
+ < ‎𞴦‎
+ < ‎𞴧‎
+ < ‎𞴨‎
+ < ‎𞴩‎
+ < ‎𞴪‎
+ < ‎𞴫‎
+ < ‎𞴬‎
+ < ‎𞴭‎
+ < ‎𞴷‎
+ < ‎𞴸‎
+ < ‎𞴹‎
+ < ‎𞴺‎
+ < ‎𞴻‎
+ < ‎𞴼‎
+ < ‎𞴽‎
< ‎𐧉‎
< ‎𐧊‎
< ‎𐧋‎
@@ -8873,6 +9146,8 @@
= 𖭐
= 𖺀
= 𝋠
+ = 𞅀
+ = 𞋰
= ‎𞥐‎
<<< 0
<<< ༳
@@ -8890,7 +9165,7 @@
= 🄌
<<< ⁰
<<< ₀
- <<< ↉ / ‎⁄𞲥‎
+ <<< ↉ / ‎⁄𞴃‎
< 1
= ١
= ۱
@@ -8990,10 +9265,13 @@
= 𝍠
= 𝍲
= 𝍷
+ = 𞅁
+ = 𞋱
= ‎𞣇‎
= ‎𞥑‎
= ‎𞱱‎
= ‎𞲣‎
+ = ‎𞴁‎
<<< 1
<<< ༪
<<< 🄂 / ','
@@ -9002,35 +9280,35 @@
<<< ㏩ / ‎𞥐日‎
<<< ㋉ / ‎𞥐月‎
<<< ㍢ / ‎𞥐点‎
- <<< ⒒ / ‎𞲣'.'‎
- <<< ㏪ / ‎𞲣日‎
- <<< ㋊ / ‎𞲣月‎
- <<< ㍣ / ‎𞲣点‎
- <<< ⒓ / ‎𞲤'.'‎
- <<< ㏫ / ‎𞲤日‎
- <<< ㋋ / ‎𞲤月‎
- <<< ㍤ / ‎𞲤点‎
- <<< ⒔ / ‎𞲥'.'‎
- <<< ㏬ / ‎𞲥日‎
- <<< ㍥ / ‎𞲥点‎
- <<< ⒕ / ‎𞲦'.'‎
- <<< ㏭ / ‎𞲦日‎
- <<< ㍦ / ‎𞲦点‎
- <<< ⒖ / ‎𞲧'.'‎
- <<< ㏮ / ‎𞲧日‎
- <<< ㍧ / ‎𞲧点‎
- <<< ⒗ / ‎𞲨'.'‎
- <<< ㏯ / ‎𞲨日‎
- <<< ㍨ / ‎𞲨点‎
- <<< ⒘ / ‎𞲩'.'‎
- <<< ㏰ / ‎𞲩日‎
- <<< ㍩ / ‎𞲩点‎
- <<< ⒙ / ‎𞲪'.'‎
- <<< ㏱ / ‎𞲪日‎
- <<< ㍪ / ‎𞲪点‎
- <<< ⒚ / ‎𞲫'.'‎
- <<< ㏲ / ‎𞲫日‎
- <<< ㍫ / ‎𞲫点‎
+ <<< ⒒ / ‎𞴁'.'‎
+ <<< ㏪ / ‎𞴁日‎
+ <<< ㋊ / ‎𞴁月‎
+ <<< ㍣ / ‎𞴁点‎
+ <<< ⒓ / ‎𞴂'.'‎
+ <<< ㏫ / ‎𞴂日‎
+ <<< ㋋ / ‎𞴂月‎
+ <<< ㍤ / ‎𞴂点‎
+ <<< ⒔ / ‎𞴃'.'‎
+ <<< ㏬ / ‎𞴃日‎
+ <<< ㍥ / ‎𞴃点‎
+ <<< ⒕ / ‎𞴄'.'‎
+ <<< ㏭ / ‎𞴄日‎
+ <<< ㍦ / ‎𞴄点‎
+ <<< ⒖ / ‎𞴅'.'‎
+ <<< ㏮ / ‎𞴅日‎
+ <<< ㍧ / ‎𞴅点‎
+ <<< ⒗ / ‎𞴆'.'‎
+ <<< ㏯ / ‎𞴆日‎
+ <<< ㍨ / ‎𞴆点‎
+ <<< ⒘ / ‎𞴇'.'‎
+ <<< ㏰ / ‎𞴇日‎
+ <<< ㍩ / ‎𞴇点‎
+ <<< ⒙ / ‎𞴈'.'‎
+ <<< ㏱ / ‎𞴈日‎
+ <<< ㍪ / ‎𞴈点‎
+ <<< ⒚ / ‎𞴉'.'‎
+ <<< ㏲ / ‎𞴉日‎
+ <<< ㍫ / ‎𞴉点‎
<<< ㏠ / 日
<<< ㋀ / 月
<<< ㍙ / 点
@@ -9050,37 +9328,37 @@
= ➉ / ‎𞥐‎
= ➓ / ‎𞥐‎
= ㉈ / ‎𞥐‎
- <<< ⑪ / ‎𞲣‎
- = ⓫ / ‎𞲣‎
- <<< ⑫ / ‎𞲤‎
- = ⓬ / ‎𞲤‎
- <<< ⑬ / ‎𞲥‎
- = ⓭ / ‎𞲥‎
- <<< ⑭ / ‎𞲦‎
- = ⓮ / ‎𞲦‎
- <<< ⑮ / ‎𞲧‎
- = ⓯ / ‎𞲧‎
- <<< ⑯ / ‎𞲨‎
- = ⓰ / ‎𞲨‎
- <<< ⑰ / ‎𞲩‎
- = ⓱ / ‎𞲩‎
- <<< ⑱ / ‎𞲪‎
- = ⓲ / ‎𞲪‎
- <<< ⑲ / ‎𞲫‎
- = ⓳ / ‎𞲫‎
+ <<< ⑪ / ‎𞴁‎
+ = ⓫ / ‎𞴁‎
+ <<< ⑫ / ‎𞴂‎
+ = ⓬ / ‎𞴂‎
+ <<< ⑬ / ‎𞴃‎
+ = ⓭ / ‎𞴃‎
+ <<< ⑭ / ‎𞴄‎
+ = ⓮ / ‎𞴄‎
+ <<< ⑮ / ‎𞴅‎
+ = ⓯ / ‎𞴅‎
+ <<< ⑯ / ‎𞴆‎
+ = ⓰ / ‎𞴆‎
+ <<< ⑰ / ‎𞴇‎
+ = ⓱ / ‎𞴇‎
+ <<< ⑱ / ‎𞴈‎
+ = ⓲ / ‎𞴈‎
+ <<< ⑲ / ‎𞴉‎
+ = ⓳ / ‎𞴉‎
<<< ¹
<<< ₁
- <<< 🆤 / ‎𞲤𞥐P‎
+ <<< 🆤 / ‎𞴂𞥐P‎
<<< ⅟ / ⁄
- <<< ⅒ / ‎⁄𞲣𞥐‎
- <<< ½ / ‎⁄𞲤‎
- <<< ⅓ / ‎⁄𞲥‎
- <<< ¼ / ‎⁄𞲦‎
- <<< ⅕ / ‎⁄𞲧‎
- <<< ⅙ / ‎⁄𞲨‎
- <<< ⅐ / ‎⁄𞲩‎
- <<< ⅛ / ‎⁄𞲪‎
- <<< ⅑ / ‎⁄𞲫‎
+ <<< ⅒ / ‎⁄𞴁𞥐‎
+ <<< ½ / ‎⁄𞴂‎
+ <<< ⅓ / ‎⁄𞴃‎
+ <<< ¼ / ‎⁄𞴄‎
+ <<< ⅕ / ‎⁄𞴅‎
+ <<< ⅙ / ‎⁄𞴆‎
+ <<< ⅐ / ‎⁄𞴇‎
+ <<< ⅛ / ‎⁄𞴈‎
+ <<< ⅑ / ‎⁄𞴉‎
<< 𖺔
= ‎𞲱‎
< 2
@@ -9177,10 +9455,13 @@
= 𝋢
= 𝍡
= 𝍳
+ = 𞅂
+ = 𞋲
= ‎𞣈‎
= ‎𞥒‎
= ‎𞱲‎
= ‎𞲤‎
+ = ‎𞴂‎
<<< 2
<<< ༫
<<< 🄃 / ','
@@ -9188,19 +9469,19 @@
<<< ⒛ / ‎𞥐'.'‎
<<< ㏳ / ‎𞥐日‎
<<< ㍬ / ‎𞥐点‎
- <<< ㏴ / ‎𞲣日‎
- <<< ㍭ / ‎𞲣点‎
- <<< ㏵ / ‎𞲤日‎
- <<< ㍮ / ‎𞲤点‎
- <<< ㏶ / ‎𞲥日‎
- <<< ㍯ / ‎𞲥点‎
- <<< ㏷ / ‎𞲦日‎
- <<< ㍰ / ‎𞲦点‎
- <<< ㏸ / ‎𞲧日‎
- <<< ㏹ / ‎𞲨日‎
- <<< ㏺ / ‎𞲩日‎
- <<< ㏻ / ‎𞲪日‎
- <<< ㏼ / ‎𞲫日‎
+ <<< ㏴ / ‎𞴁日‎
+ <<< ㍭ / ‎𞴁点‎
+ <<< ㏵ / ‎𞴂日‎
+ <<< ㍮ / ‎𞴂点‎
+ <<< ㏶ / ‎𞴃日‎
+ <<< ㍯ / ‎𞴃点‎
+ <<< ㏷ / ‎𞴄日‎
+ <<< ㍰ / ‎𞴄点‎
+ <<< ㏸ / ‎𞴅日‎
+ <<< ㏹ / ‎𞴆日‎
+ <<< ㏺ / ‎𞴇日‎
+ <<< ㏻ / ‎𞴈日‎
+ <<< ㏼ / ‎𞴉日‎
<<< ㏡ / 日
<<< ㋁ / 月
<<< ㍚ / 点
@@ -9217,24 +9498,25 @@
<<< ⑳ / ‎𞥐‎
= ⓴ / ‎𞥐‎
= ㉉ / ‎𞥐‎
- <<< ㉑ / ‎𞲣‎
- <<< ㉒ / ‎𞲤‎
- <<< ㉓ / ‎𞲥‎
- <<< ㉔ / ‎𞲦‎
- <<< ㉕ / ‎𞲧‎
- <<< ㉖ / ‎𞲨‎
- <<< ㉗ / ‎𞲩‎
- <<< ㉘ / ‎𞲪‎
- <<< ㉙ / ‎𞲫‎
+ <<< ㉑ / ‎𞴁‎
+ <<< ㉒ / ‎𞴂‎
+ <<< ㉓ / ‎𞴃‎
+ <<< ㉔ / ‎𞴄‎
+ <<< ㉕ / ‎𞴅‎
+ <<< ㉖ / ‎𞴆‎
+ <<< ㉗ / ‎𞴇‎
+ <<< ㉘ / ‎𞴈‎
+ <<< ㉙ / ‎𞴉‎
<<< ²
<<< ₂
- <<< 🆢 / ‎𞲤'.'𞲤‎
+ <<< 🆢 / ‎𞴂'.'𞴂‎
<<< 🆝 / K
<<< 🆜 / nd' 'Scr
- <<< ⅔ / ‎⁄𞲥‎
- <<< ⅖ / ‎⁄𞲧‎
+ <<< ⅔ / ‎⁄𞴃‎
+ <<< ⅖ / ‎⁄𞴅‎
<< 𖺕
= ‎𞲲‎
+ = ‎𞴯‎
< 3
= ٣
= ۳
@@ -9329,16 +9611,19 @@
= 𝋣
= 𝍢
= 𝍴
+ = 𞅃
+ = 𞋳
= ‎𞣉‎
= ‎𞥓‎
= ‎𞱳‎
= ‎𞲥‎
+ = ‎𞴃‎
<<< 3
<<< ༬
<<< 🄄 / ','
<<< ⒊ / '.'
<<< ㏽ / ‎𞥐日‎
- <<< ㏾ / ‎𞲣日‎
+ <<< ㏾ / ‎𞴁日‎
<<< ㏢ / 日
<<< ㋂ / 月
<<< ㍛ / 点
@@ -9354,22 +9639,23 @@
= ➌
<<< ㉊ / ‎𞥐‎
= ㉚ / ‎𞥐‎
- <<< ㉛ / ‎𞲣‎
- <<< ㉜ / ‎𞲤‎
- <<< ㉝ / ‎𞲥‎
- <<< ㉞ / ‎𞲦‎
- <<< ㉟ / ‎𞲧‎
- <<< ㊱ / ‎𞲨‎
- <<< ㊲ / ‎𞲩‎
- <<< ㊳ / ‎𞲪‎
- <<< ㊴ / ‎𞲫‎
+ <<< ㉛ / ‎𞴁‎
+ <<< ㉜ / ‎𞴂‎
+ <<< ㉝ / ‎𞴃‎
+ <<< ㉞ / ‎𞴄‎
+ <<< ㉟ / ‎𞴅‎
+ <<< ㊱ / ‎𞴆‎
+ <<< ㊲ / ‎𞴇‎
+ <<< ㊳ / ‎𞴈‎
+ <<< ㊴ / ‎𞴉‎
<<< ³
<<< ₃
<<< 🆛 / D
- <<< ¾ / ‎⁄𞲦‎
- <<< ⅗ / ‎⁄𞲧‎
- <<< ⅜ / ‎⁄𞲪‎
+ <<< ¾ / ‎⁄𞴄‎
+ <<< ⅗ / ‎⁄𞴅‎
+ <<< ⅜ / ‎⁄𞴈‎
<< 𖺖
+ <<< ‎𞴰‎
< 4
= ٤
= ۴
@@ -9462,10 +9748,13 @@
= 𝋤
= 𝍣
= 𝍵
+ = 𞅄
+ = 𞋴
= ‎𞣊‎
= ‎𞥔‎
= ‎𞱴‎
= ‎𞲦‎
+ = ‎𞴄‎
<<< 4
<<< ༭
<<< 🄅 / ','
@@ -9485,19 +9774,20 @@
= ➍
<<< ㉋ / ‎𞥐‎
= ㊵ / ‎𞥐‎
- <<< ㊶ / ‎𞲣‎
- <<< ㊷ / ‎𞲤‎
- <<< ㊸ / ‎𞲥‎
- <<< ㊹ / ‎𞲦‎
- <<< ㊺ / ‎𞲧‎
- <<< ㊻ / ‎𞲨‎
- <<< ㊼ / ‎𞲩‎
- <<< ㊽ / ‎𞲪‎
- <<< ㊾ / ‎𞲫‎
+ <<< ㊶ / ‎𞴁‎
+ <<< ㊷ / ‎𞴂‎
+ <<< ㊸ / ‎𞴃‎
+ <<< ㊹ / ‎𞴄‎
+ <<< ㊺ / ‎𞴅‎
+ <<< ㊻ / ‎𞴆‎
+ <<< ㊼ / ‎𞴇‎
+ <<< ㊽ / ‎𞴈‎
+ <<< ㊾ / ‎𞴉‎
<<< ⁴
<<< ₄
<<< 🆞 / K
- <<< ⅘ / ‎⁄𞲧‎
+ <<< ⅘ / ‎⁄𞴅‎
+ << ‎𞴱‎
< 5
= ٥
= ۵
@@ -9591,10 +9881,13 @@
= 𝍤
= 𝍶
= 𝍸
+ = 𞅅
+ = 𞋵
= ‎𞣋‎
= ‎𞥕‎
= ‎𞱵‎
= ‎𞲧‎
+ = ‎𞴅‎
<<< 5
<<< ༮
<<< 🄆 / ','
@@ -9616,9 +9909,10 @@
= ㊿ / ‎𞥐‎
<<< ⁵
<<< ₅
- <<< 🆠 / ‎'.'𞲣‎
- <<< ⅚ / ‎⁄𞲨‎
- <<< ⅝ / ‎⁄𞲪‎
+ <<< 🆠 / ‎'.'𞴁‎
+ <<< ⅚ / ‎⁄𞴆‎
+ <<< ⅝ / ‎⁄𞴈‎
+ << ‎𞴲‎
< 6
= ٦
= ۶
@@ -9695,10 +9989,13 @@
= 𖺆
= 𝋦
= 𝍥
+ = 𞅆
+ = 𞋶
= ‎𞣌‎
= ‎𞥖‎
= ‎𞱶‎
= ‎𞲨‎
+ = ‎𞴆‎
<<< 6
<<< ༯
<<< 🄇 / ','
@@ -9720,6 +10017,7 @@
<<< ⁶
<<< ₆
<<< 🆣 / ‎𞥐P‎
+ << ‎𞴳‎
< 7
= ٧
= ۷
@@ -9796,10 +10094,13 @@
= 𖺇
= 𝋧
= 𝍦
+ = 𞅇
+ = 𞋷
= ‎𞣍‎
= ‎𞥗‎
= ‎𞱷‎
= ‎𞲩‎
+ = ‎𞴇‎
<<< 7
<<< ༰
<<< 🄈 / ','
@@ -9820,8 +10121,9 @@
<<< ㉎ / ‎𞥐‎
<<< ⁷
<<< ₇
- <<< 🆡 / ‎'.'𞲣‎
- <<< ⅞ / ‎⁄𞲪‎
+ <<< 🆡 / ‎'.'𞴁‎
+ <<< ⅞ / ‎⁄𞴈‎
+ << ‎𞴴‎
< 8
= ٨
= ۸
@@ -9897,10 +10199,13 @@
= 𖺈
= 𝋨
= 𝍧
+ = 𞅈
+ = 𞋸
= ‎𞣎‎
= ‎𞥘‎
= ‎𞱸‎
= ‎𞲪‎
+ = ‎𞴈‎
<<< 8
<<< ༱
<<< 🄉 / ','
@@ -9922,6 +10227,7 @@
<<< ⁸
<<< ₈
<<< 🆟 / K
+ << ‎𞴵‎
< 9
= ٩
= ۹
@@ -9999,10 +10305,13 @@
= 𖺉
= 𝋩
= 𝍨
+ = 𞅉
+ = 𞋹
= ‎𞣏‎
= ‎𞥙‎
= ‎𞱹‎
= ‎𞲫‎
+ = ‎𞴉‎
<<< 9
<<< ༲
<<< 🄊 / ','
@@ -10022,6 +10331,7 @@
= ➒
<<< ⁹
<<< ₉
+ << ‎𞴶‎
< a
<<< a
<<< ͣ
@@ -10096,6 +10406,8 @@
< ⱥ
<<< Ⱥ
< ᶏ
+ < ꞻ
+ <<< Ꞻ
< ᴁ
< ᴂ
<<< ᵆ
@@ -10215,8 +10527,8 @@
<<< ㏄ / c
<<< ㏅ / d
<<< ㎝ / m
- <<< ㎠ / ‎m𞲤‎
- <<< ㎤ / ‎m𞲥‎
+ <<< ㎠ / ‎m𞴂‎
+ <<< ㎤ / ‎m𞴃‎
<<< 🄲
= 🅲
<<< ㏆ / ∕kg
@@ -10229,6 +10541,7 @@
< ꞓ
<<< Ꞓ
< ꞔ
+ <<< Ꞔ
< ƈ
<<< Ƈ
< ɕ
@@ -10246,6 +10559,7 @@
<<< dz / z
= ʣ / z
<<< dž / ž
+ <<< ꭦ / ʐ
<<< ʥ / ʑ
<<< ʤ / ʒ
<<< ⅆ
@@ -10293,8 +10607,8 @@
<<< ㏈ / B
<<< ㎗ / l
<<< ㍷ / m
- <<< ㍸ / ‎m𞲤‎
- <<< ㍹ / ‎m𞲥‎
+ <<< ㍸ / ‎m𞴂‎
+ <<< ㍹ / ‎m𞴃‎
<<< ᴰ
= 🄳
= 🅳
@@ -10664,6 +10978,8 @@
< ᵻ
<<< ᶧ
< ᶖ
+ < ꞽ
+ <<< Ꞽ
< ɩ
<<< Ɩ
<<< ᶥ
@@ -10762,8 +11078,8 @@
<<< ㎑ / Hz
<<< ㎘ / l
<<< ㎞ / m
- <<< ㎢ / ‎m𞲤‎
- <<< ㎦ / ‎m𞲥‎
+ <<< ㎢ / ‎m𞴂‎
+ <<< ㎦ / ‎m𞴃‎
<<< ㎪ / Pa
<<< ㏏ / t
<<< ㎸ / V
@@ -10925,19 +11241,20 @@
<<< ᵐ
<<< 🅪 / c
<<< 🅫 / d
+ <<< 🅬 / r
<<< ₘ
<<< ㎧ / ∕s
- <<< ㎨ / ‎∕s𞲤‎
- <<< ㎡ / ‎𞲤‎
- <<< ㎥ / ‎𞲥‎
+ <<< ㎨ / ‎∕s𞴂‎
+ <<< ㎡ / ‎𞴂‎
+ <<< ㎥ / ‎𞴃‎
<<< ㎃ / A
<<< ㏔ / b
<<< ㎎ / g
<<< ㏕ / il
<<< ㎖ / l
<<< ㎜ / m
- <<< ㎟ / ‎m𞲤‎
- <<< ㎣ / ‎m𞲥‎
+ <<< ㎟ / ‎m𞴂‎
+ <<< ㎣ / ‎m𞴃‎
<<< ㏖ / ol
<<< ㎳ / s
<<< ㎷ / V
@@ -11289,7 +11606,7 @@
<<< ᵣ
<<< ㎭ / ad
<<< ㎮ / ad∕s
- <<< ㎯ / ‎ad∕s𞲤‎
+ <<< ㎯ / ‎ad∕s𞴂‎
<<< ᴿ
= 🅁
= 🆁
@@ -11393,6 +11710,7 @@
< ᵴ
< ᶊ
< ʂ
+ <<< Ʂ
<<< ᶳ
< ȿ
<<< Ȿ
@@ -11414,6 +11732,7 @@
<<< ʨ / ɕ
<<< ƾ / s
= ʦ / s
+ <<< ꭧ / ʂ
<<< ʧ / ʃ
<<< ꜩ / z
<<< 𝐭
@@ -11539,6 +11858,8 @@
< ᶙ
< ꭒ
<<< ꭟ
+ < ꞿ
+ <<< Ꞿ
< ɥ
<<< Ɥ
<<< ᶣ
@@ -11664,6 +11985,8 @@
<<< 🅏 / C
= 🆏 / C
< ᴡ
+ < ꟃ
+ <<< Ꟃ
< ⱳ
<<< Ⱳ
< ʍ
@@ -11809,6 +12132,7 @@
<<< Ƶ
< ᵶ
< ᶎ
+ <<< Ᶎ
< ȥ
<<< Ȥ
< ʐ
@@ -15147,6 +15471,7 @@
= ᳯ
= ᳰ
= ᳱ
+ = ᳺ
< ᳵ
< ᳶ
< ꣲ
@@ -16400,6 +16725,7 @@
< 𑐴
< 𑑇
< 𑑈
+ < 𑑟
< 𑐵
< 𑐶
< 𑐷
@@ -16624,6 +16950,7 @@
< 𑚩
< 𑚊
< 𑚋
+ < 𑚸
< 𑚌
< 𑚍
< 𑚎
@@ -16662,6 +16989,68 @@
< 𑚴
< 𑚵
< 𑚶
+ < 𑦠
+ < 𑦡
+ < 𑦢
+ < 𑦣
+ < 𑦤
+ < 𑦥
+ < 𑦦
+ < 𑦧
+ < 𑦪
+ < 𑦫
+ < 𑦬
+ < 𑦭
+ < 𑦮
+ < 𑦯
+ < 𑦰
+ < 𑦱
+ < 𑦲
+ < 𑦳
+ < 𑦴
+ < 𑦵
+ < 𑦶
+ < 𑦷
+ < 𑦸
+ < 𑦹
+ < 𑦺
+ < 𑦻
+ < 𑦼
+ < 𑦽
+ < 𑦾
+ < 𑦿
+ < 𑧀
+ < 𑧁
+ < 𑧂
+ < 𑧃
+ < 𑧄
+ < 𑧅
+ < 𑧆
+ < 𑧇
+ < 𑧈
+ < 𑧉
+ < 𑧊
+ < 𑧋
+ < 𑧌
+ < 𑧍
+ < 𑧎
+ < 𑧏
+ < 𑧐
+ < 𑧡
+ < 𑧣
+ < 𑧑
+ < 𑧒
+ < 𑧓
+ < 𑧔
+ < 𑧕
+ < 𑧖
+ < 𑧗
+ < 𑧚
+ < 𑧤
+ < 𑧛
+ < 𑧜
+ < 𑧝
+ < 𑧠
< 𑠀
< 𑠁
< 𑠂
@@ -17165,16 +17554,26 @@
< ກ
< ຂ
< ຄ
+ < ຆ
< ງ
< ຈ
+ < ຉ
< ສ
< ຊ
+ < ຌ
+ < ຎ
< ໟ
< ຍ
+ < ຏ
+ < ຐ
+ < ຑ
+ < ຒ
+ < ຓ
< ດ
< ຕ
< ຖ
< ທ
+ < ຘ
< ນ
< ບ
< ປ
@@ -17182,14 +17581,18 @@
< ຝ
< ພ
< ຟ
+ < ຠ
< ມ
< ຢ
< ຣ
< ລ
< ວ
+ < ຨ
+ < ຩ
< ຫ
<<< ໜ / ນ
<<< ໝ / ມ
+ < ຬ
< ອ
< ຮ
< ຯ
@@ -17204,6 +17607,7 @@
< ື
< ຸ
< ູ
+ < ຺
< ົ
< ຼ
< ຽ
@@ -17520,6 +17924,8 @@
<<< 𑪉
<<< 𑪔
< 𑪂
+ < 𑪄
+ < 𑪅
< 𑪙
< 𑪝
< 𑱲
@@ -21424,6 +21830,7 @@
<<< ‎𞤠‎
< ‎𞥃‎
<<< ‎𞤡‎
+ < ‎𞥋‎
< ᄀ
<<< ㄱ
<<< ㉠
@@ -22280,17 +22687,24 @@
<<< ワ
<<< ㋻
<<< ㍗ / つと
- < ゐ
+ < 𛅐
+ <<< ゐ
+ <<< 𛅤
<<< ヰ
<<< ㋼
- < ゑ
+ < 𛅑
+ <<< ゑ
+ <<< 𛅥
<<< ヱ
<<< ㋽
- < を
+ < 𛅒
+ <<< を
+ <<< 𛅦
<<< ヲ
<<< ヲ
<<< ㋾
< ん
+ <<< 𛅧
<<< ン
<<< ン
< 𛀂
@@ -23864,6 +24278,7 @@
< 𖼁
< 𖼂
< 𖼃
+ < 𖽅
< 𖼄
<<< 𖼆
< 𖼅
@@ -23874,8 +24289,10 @@
< 𖼋
< 𖼌
< 𖼍
+ < 𖽈
< 𖼎
< 𖼏
+ < 𖽊
< 𖼐
<<< 𖼓
< 𖼑
@@ -23911,13 +24328,16 @@
< 𖼰
< 𖼱
< 𖼲
+ < 𖽇
< 𖼳
+ < 𖽆
< 𖼴
< 𖼵
< 𖼶
< 𖼷
< 𖼸
< 𖼹
+ < 𖽉
< 𖼺
< 𖼻
< 𖼼
@@ -23933,24 +24353,29 @@
< 𖽑
< 𖽒
< 𖽓
+ < 𖽏
< 𖽔
< 𖽕
< 𖽖
< 𖽗
< 𖽘
+ < 𖾁
< 𖽙
< 𖽚
< 𖽛
< 𖽜
+ < 𖾃
< 𖽝
< 𖽞
< 𖽟
< 𖽠
+ < 𖾄
< 𖽡
< 𖽢
< 𖽣
< 𖽤
< 𖽥
+ < 𖾆
< 𖽦
< 𖽧
< 𖽨
@@ -23959,13 +24384,18 @@
< 𖽫
< 𖽬
< 𖽭
+ < 𖽿
+ < 𖾇
< 𖽮
< 𖽯
< 𖽰
< 𖽱
< 𖽲
+ < 𖾀
< 𖽳
< 𖽴
+ < 𖾅
+ < 𖾂
< 𖽵
< 𖽶
< 𖽷
@@ -24205,6 +24635,101 @@
< 𖮍
< 𖮎
< 𖮏
+ < 𞄀
+ < 𞄁
+ < 𞄂
+ < 𞄃
+ < 𞄄
+ < 𞄅
+ < 𞄆
+ < 𞄇
+ < 𞄈
+ < 𞄉
+ < 𞄊
+ < 𞄋
+ < 𞄌
+ < 𞄍
+ < 𞄎
+ < 𞄏
+ < 𞄐
+ < 𞄑
+ < 𞄒
+ < 𞄓
+ < 𞄔
+ < 𞄕
+ < 𞄖
+ < 𞄗
+ < 𞄘
+ < 𞄙
+ < 𞄚
+ < 𞄛
+ < 𞄜
+ < 𞄝
+ < 𞄞
+ < 𞄟
+ < 𞄠
+ < 𞄡
+ < 𞄢
+ < 𞄣
+ < 𞄤
+ < 𞄥
+ < 𞄦
+ < 𞄧
+ < 𞄨
+ < 𞄩
+ < 𞄪
+ < 𞄫
+ < 𞄬
+ < 𞄷
+ < 𞄸
+ < 𞄹
+ < 𞄺
+ < 𞄻
+ < 𞅎
+ < 𞋀
+ < 𞋁
+ < 𞋂
+ < 𞋃
+ < 𞋄
+ < 𞋅
+ < 𞋆
+ < 𞋇
+ < 𞋈
+ < 𞋉
+ < 𞋊
+ < 𞋋
+ < 𞋌
+ < 𞋍
+ < 𞋎
+ < 𞋏
+ < 𞋐
+ < 𞋑
+ < 𞋒
+ < 𞋓
+ < 𞋔
+ < 𞋕
+ < 𞋖
+ < 𞋗
+ < 𞋘
+ < 𞋙
+ < 𞋚
+ < 𞋛
+ < 𞋜
+ < 𞋝
+ < 𞋞
+ < 𞋟
+ < 𞋠
+ < 𞋡
+ < 𞋢
+ < 𞋣
+ < 𞋤
+ < 𞋥
+ < 𞋦
+ < 𞋧
+ < 𞋨
+ < 𞋩
+ < 𞋪
+ < 𞋫
< 𐊀
< 𐊁
< 𐊂
@@ -25691,6 +26216,29 @@
< ‎𐮏‎
< ‎𐮐‎
< ‎𐮑‎
+ < ‎𐿠‎
+ < ‎𐿡‎
+ < ‎𐿢‎
+ < ‎𐿣‎
+ < ‎𐿤‎
+ < ‎𐿥‎
+ < ‎𐿦‎
+ <<< ‎𐿶‎ / ‎𐿩‎
+ < ‎𐿧‎
+ < ‎𐿨‎
+ < ‎𐿩‎
+ < ‎𐿪‎
+ < ‎𐿫‎
+ < ‎𐿬‎
+ < ‎𐿭‎
+ < ‎𐿮‎
+ < ‎𐿯‎
+ < ‎𐿰‎
+ < ‎𐿱‎
+ < ‎𐿲‎
+ < ‎𐿳‎
+ < ‎𐿴‎
+ < ‎𐿵‎
< ‎𐫀‎
< ‎𐫁‎
< ‎𐫂‎
@@ -28746,6 +29294,8 @@
<<< ㆟
& 亻
<<< ⺅
+& 令
+ < ㋿ / 和
& 企
<<< ㊭
& 休
@@ -29768,6 +30318,11 @@
& ຄໂ = ໂຄ
& ຄໃ = ໃຄ
& ຄໄ = ໄຄ
+& ຆເ = ເຆ
+& ຆແ = ແຆ
+& ຆໂ = ໂຆ
+& ຆໃ = ໃຆ
+& ຆໄ = ໄຆ
& ງເ = ເງ
& ງແ = ແງ
& ງໂ = ໂງ
@@ -29778,6 +30333,11 @@
& ຈໂ = ໂຈ
& ຈໃ = ໃຈ
& ຈໄ = ໄຈ
+& ຉເ = ເຉ
+& ຉແ = ແຉ
+& ຉໂ = ໂຉ
+& ຉໃ = ໃຉ
+& ຉໄ = ໄຉ
& ສເ = ເສ
& ສແ = ແສ
& ສໂ = ໂສ
@@ -29788,6 +30348,16 @@
& ຊໂ = ໂຊ
& ຊໃ = ໃຊ
& ຊໄ = ໄຊ
+& ຌເ = ເຌ
+& ຌແ = ແຌ
+& ຌໂ = ໂຌ
+& ຌໃ = ໃຌ
+& ຌໄ = ໄຌ
+& ຎເ = ເຎ
+& ຎແ = ແຎ
+& ຎໂ = ໂຎ
+& ຎໃ = ໃຎ
+& ຎໄ = ໄຎ
& ໟເ = ເໟ
& ໟແ = ແໟ
& ໟໂ = ໂໟ
@@ -29798,6 +30368,31 @@
& ຍໂ = ໂຍ
& ຍໃ = ໃຍ
& ຍໄ = ໄຍ
+& ຏເ = ເຏ
+& ຏແ = ແຏ
+& ຏໂ = ໂຏ
+& ຏໃ = ໃຏ
+& ຏໄ = ໄຏ
+& ຐເ = ເຐ
+& ຐແ = ແຐ
+& ຐໂ = ໂຐ
+& ຐໃ = ໃຐ
+& ຐໄ = ໄຐ
+& ຑເ = ເຑ
+& ຑແ = ແຑ
+& ຑໂ = ໂຑ
+& ຑໃ = ໃຑ
+& ຑໄ = ໄຑ
+& ຒເ = ເຒ
+& ຒແ = ແຒ
+& ຒໂ = ໂຒ
+& ຒໃ = ໃຒ
+& ຒໄ = ໄຒ
+& ຓເ = ເຓ
+& ຓແ = ແຓ
+& ຓໂ = ໂຓ
+& ຓໃ = ໃຓ
+& ຓໄ = ໄຓ
& ດເ = ເດ
& ດແ = ແດ
& ດໂ = ໂດ
@@ -29818,6 +30413,11 @@
& ທໂ = ໂທ
& ທໃ = ໃທ
& ທໄ = ໄທ
+& ຘເ = ເຘ
+& ຘແ = ແຘ
+& ຘໂ = ໂຘ
+& ຘໃ = ໃຘ
+& ຘໄ = ໄຘ
& ນເ = ເນ
& ນແ = ແນ
& ນໂ = ໂນ
@@ -29853,6 +30453,11 @@
& ຟໂ = ໂຟ
& ຟໃ = ໃຟ
& ຟໄ = ໄຟ
+& ຠເ = ເຠ
+& ຠແ = ແຠ
+& ຠໂ = ໂຠ
+& ຠໃ = ໃຠ
+& ຠໄ = ໄຠ
& ມເ = ເມ
& ມແ = ແມ
& ມໂ = ໂມ
@@ -29878,6 +30483,16 @@
& ວໂ = ໂວ
& ວໃ = ໃວ
& ວໄ = ໄວ
+& ຨເ = ເຨ
+& ຨແ = ແຨ
+& ຨໂ = ໂຨ
+& ຨໃ = ໃຨ
+& ຨໄ = ໄຨ
+& ຩເ = ເຩ
+& ຩແ = ແຩ
+& ຩໂ = ໂຩ
+& ຩໃ = ໃຩ
+& ຩໄ = ໄຩ
& ຫເ = ເຫ
& ຫແ = ແຫ
& ຫໂ = ໂຫ
@@ -29893,6 +30508,11 @@
& ໝໂ = ໂໝ
& ໝໃ = ໃໝ
& ໝໄ = ໄໝ
+& ຬເ = ເຬ
+& ຬແ = ແຬ
+& ຬໂ = ໂຬ
+& ຬໃ = ໃຬ
+& ຬໄ = ໄຬ
& ອເ = ເອ
& ອແ = ແອ
& ອໂ = ໂອ
diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/UnicodeData.txt b/Build/source/libs/icu/icu-src/source/data/unidata/UnicodeData.txt
index ec32fafbce5..e65aec52f71 100644
--- a/Build/source/libs/icu/icu-src/source/data/unidata/UnicodeData.txt
+++ b/Build/source/libs/icu/icu-src/source/data/unidata/UnicodeData.txt
@@ -640,7 +640,7 @@
027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;;
0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;;01A6;;01A6
0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;;
-0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;;
+0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;A7C5;;A7C5
0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9
0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;;
0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;;
@@ -2809,6 +2809,7 @@
0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0C77;TELUGU SIGN SIDDHAM;Po;0;L;;;;;N;;;;;
0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;;
0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;;
0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;;
@@ -3203,14 +3204,24 @@
0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;;
0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;;
0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;;
+0E86;LAO LETTER PALI GHA;Lo;0;L;;;;;N;;;;;
0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;;
0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;;
+0E89;LAO LETTER PALI CHA;Lo;0;L;;;;;N;;;;;
0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;;
+0E8C;LAO LETTER PALI JHA;Lo;0;L;;;;;N;;;;;
0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;;
+0E8E;LAO LETTER PALI NYA;Lo;0;L;;;;;N;;;;;
+0E8F;LAO LETTER PALI TTA;Lo;0;L;;;;;N;;;;;
+0E90;LAO LETTER PALI TTHA;Lo;0;L;;;;;N;;;;;
+0E91;LAO LETTER PALI DDA;Lo;0;L;;;;;N;;;;;
+0E92;LAO LETTER PALI DDHA;Lo;0;L;;;;;N;;;;;
+0E93;LAO LETTER PALI NNA;Lo;0;L;;;;;N;;;;;
0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;;
0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;;
0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;;
0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;;
+0E98;LAO LETTER PALI DHA;Lo;0;L;;;;;N;;;;;
0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;;
0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;;
0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;;
@@ -3218,13 +3229,17 @@
0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;;
0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;;
0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;;
+0EA0;LAO LETTER PALI BHA;Lo;0;L;;;;;N;;;;;
0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;;
0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;;
0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;;
0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;;
0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;;
+0EA8;LAO LETTER SANSKRIT SHA;Lo;0;L;;;;;N;;;;;
+0EA9;LAO LETTER SANSKRIT SSA;Lo;0;L;;;;;N;;;;;
0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;;
0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;;
+0EAC;LAO LETTER PALI LLA;Lo;0;L;;;;;N;;;;;
0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;;
0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;;
0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;;
@@ -3238,6 +3253,7 @@
0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;;
0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;;
0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;;
+0EBA;LAO SIGN PALI VIRAMA;Mn;9;NSM;;;;;N;;;;;
0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;;
0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;;
0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;;
@@ -5079,7 +5095,7 @@
166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;;
166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;;
166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;;
-166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;;
+166D;CANADIAN SYLLABICS CHI SIGN;So;0;L;;;;;N;;;;;
166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;;
166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;;
1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;;
@@ -6488,14 +6504,15 @@
1CEF;VEDIC SIGN LONG ANUSVARA;Lo;0;L;;;;;N;;;;;
1CF0;VEDIC SIGN RTHANG LONG ANUSVARA;Lo;0;L;;;;;N;;;;;
1CF1;VEDIC SIGN ANUSVARA UBHAYATO MUKHA;Lo;0;L;;;;;N;;;;;
-1CF2;VEDIC SIGN ARDHAVISARGA;Mc;0;L;;;;;N;;;;;
-1CF3;VEDIC SIGN ROTATED ARDHAVISARGA;Mc;0;L;;;;;N;;;;;
+1CF2;VEDIC SIGN ARDHAVISARGA;Lo;0;L;;;;;N;;;;;
+1CF3;VEDIC SIGN ROTATED ARDHAVISARGA;Lo;0;L;;;;;N;;;;;
1CF4;VEDIC TONE CANDRA ABOVE;Mn;230;NSM;;;;;N;;;;;
1CF5;VEDIC SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;;
1CF6;VEDIC SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;;
1CF7;VEDIC SIGN ATIKRAMA;Mc;0;L;;;;;N;;;;;
1CF8;VEDIC TONE RING ABOVE;Mn;230;NSM;;;;;N;;;;;
1CF9;VEDIC TONE DOUBLE RING ABOVE;Mn;230;NSM;;;;;N;;;;;
+1CFA;VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA;Lo;0;L;;;;;N;;;;;
1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;;
1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;;
1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;;
@@ -6638,7 +6655,7 @@
1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
-1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;A7C6;;A7C6
1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;;
@@ -10165,6 +10182,7 @@
2BC6;BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;;
2BC7;BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;;
2BC8;BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;;
+2BC9;NEPTUNE FORM TWO;So;0;ON;;;;;N;;;;;
2BCA;TOP HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;;
2BCB;BOTTOM HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;;
2BCC;LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;;
@@ -10218,6 +10236,7 @@
2BFC;DOUBLED SYMBOL;So;0;ON;;;;;N;;;;;
2BFD;PASSED SYMBOL;So;0;ON;;;;;N;;;;;
2BFE;REVERSED RIGHT ANGLE;So;0;ON;;;;;Y;;;;;
+2BFF;HELLSCHREIBER PAUSE SYMBOL;So;0;ON;;;;;N;;;;;
2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30;
2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31;
2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32;
@@ -10756,6 +10775,7 @@
2E4C;MEDIEVAL COMMA;Po;0;ON;;;;;N;;;;;
2E4D;PARAGRAPHUS MARK;Po;0;ON;;;;;N;;;;;
2E4E;PUNCTUS ELEVATUS MARK;Po;0;ON;;;;;N;;;;;
+2E4F;CORNISH VERSE DIVIDER;Po;0;ON;;;;;N;;;;;
2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;;
2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;;
2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;;
@@ -11836,6 +11856,7 @@
32FC;CIRCLED KATAKANA WI;So;0;L;<circle> 30F0;;;;N;;;;;
32FD;CIRCLED KATAKANA WE;So;0;L;<circle> 30F1;;;;N;;;;;
32FE;CIRCLED KATAKANA WO;So;0;L;<circle> 30F2;;;;N;;;;;
+32FF;SQUARE ERA NAME REIWA;So;0;L;<square> 4EE4 548C;;;;N;;;;;
3300;SQUARE APAATO;So;0;L;<square> 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;;
3301;SQUARE ARUHUA;So;0;L;<square> 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;;
3302;SQUARE ANPEA;So;0;L;<square> 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;;
@@ -14060,7 +14081,7 @@ A790;LATIN CAPITAL LETTER N WITH DESCENDER;Lu;0;L;;;;;N;;;;A791;
A791;LATIN SMALL LETTER N WITH DESCENDER;Ll;0;L;;;;;N;;;A790;;A790
A792;LATIN CAPITAL LETTER C WITH BAR;Lu;0;L;;;;;N;;;;A793;
A793;LATIN SMALL LETTER C WITH BAR;Ll;0;L;;;;;N;;;A792;;A792
-A794;LATIN SMALL LETTER C WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+A794;LATIN SMALL LETTER C WITH PALATAL HOOK;Ll;0;L;;;;;N;;;A7C4;;A7C4
A795;LATIN SMALL LETTER H WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
A796;LATIN CAPITAL LETTER B WITH FLOURISH;Lu;0;L;;;;;N;;;;A797;
A797;LATIN SMALL LETTER B WITH FLOURISH;Ll;0;L;;;;;N;;;A796;;A796
@@ -14098,6 +14119,17 @@ A7B6;LATIN CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;A7B7;
A7B7;LATIN SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;A7B6;;A7B6
A7B8;LATIN CAPITAL LETTER U WITH STROKE;Lu;0;L;;;;;N;;;;A7B9;
A7B9;LATIN SMALL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;A7B8;;A7B8
+A7BA;LATIN CAPITAL LETTER GLOTTAL A;Lu;0;L;;;;;N;;;;A7BB;
+A7BB;LATIN SMALL LETTER GLOTTAL A;Ll;0;L;;;;;N;;;A7BA;;A7BA
+A7BC;LATIN CAPITAL LETTER GLOTTAL I;Lu;0;L;;;;;N;;;;A7BD;
+A7BD;LATIN SMALL LETTER GLOTTAL I;Ll;0;L;;;;;N;;;A7BC;;A7BC
+A7BE;LATIN CAPITAL LETTER GLOTTAL U;Lu;0;L;;;;;N;;;;A7BF;
+A7BF;LATIN SMALL LETTER GLOTTAL U;Ll;0;L;;;;;N;;;A7BE;;A7BE
+A7C2;LATIN CAPITAL LETTER ANGLICANA W;Lu;0;L;;;;;N;;;;A7C3;
+A7C3;LATIN SMALL LETTER ANGLICANA W;Ll;0;L;;;;;N;;;A7C2;;A7C2
+A7C4;LATIN CAPITAL LETTER C WITH PALATAL HOOK;Lu;0;L;;;;;N;;;;A794;
+A7C5;LATIN CAPITAL LETTER S WITH HOOK;Lu;0;L;;;;;N;;;;0282;
+A7C6;LATIN CAPITAL LETTER Z WITH PALATAL HOOK;Lu;0;L;;;;;N;;;;1D8E;
A7F7;LATIN EPIGRAPHIC LETTER SIDEWAYS I;Lo;0;L;;;;;N;;;;;
A7F8;MODIFIER LETTER CAPITAL H WITH STROKE;Lm;0;L;<super> 0126;;;;N;;;;;
A7F9;MODIFIER LETTER SMALL LIGATURE OE;Lm;0;L;<super> 0153;;;;N;;;;;
@@ -14506,7 +14538,7 @@ A9B9;JAVANESE VOWEL SIGN SUKU MENDUT;Mn;0;NSM;;;;;N;;;;;
A9BA;JAVANESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;;
A9BB;JAVANESE VOWEL SIGN DIRGA MURE;Mc;0;L;;;;;N;;;;;
A9BC;JAVANESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;;
-A9BD;JAVANESE CONSONANT SIGN KERET;Mc;0;L;;;;;N;;;;;
+A9BD;JAVANESE CONSONANT SIGN KERET;Mn;0;NSM;;;;;N;;;;;
A9BE;JAVANESE CONSONANT SIGN PENGKAL;Mc;0;L;;;;;N;;;;;
A9BF;JAVANESE CONSONANT SIGN CAKRA;Mc;0;L;;;;;N;;;;;
A9C0;JAVANESE PANGKON;Mc;9;L;;;;;N;;;;;
@@ -14863,6 +14895,8 @@ AB62;LATIN SMALL LETTER OPEN OE;Ll;0;L;;;;;N;;;;;
AB63;LATIN SMALL LETTER UO;Ll;0;L;;;;;N;;;;;
AB64;LATIN SMALL LETTER INVERTED ALPHA;Ll;0;L;;;;;N;;;;;
AB65;GREEK LETTER SMALL CAPITAL OMEGA;Ll;0;L;;;;;N;;;;;
+AB66;LATIN SMALL LETTER DZ DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+AB67;LATIN SMALL LETTER TS DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
AB70;CHEROKEE SMALL LETTER A;Ll;0;L;;;;;N;;;13A0;;13A0
AB71;CHEROKEE SMALL LETTER E;Ll;0;L;;;;;N;;;13A1;;13A1
AB72;CHEROKEE SMALL LETTER I;Ll;0;L;;;;;N;;;13A2;;13A2
@@ -19105,6 +19139,29 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
10F57;SOGDIAN PUNCTUATION CIRCLE WITH DOT;Po;0;AL;;;;;N;;;;;
10F58;SOGDIAN PUNCTUATION TWO CIRCLES WITH DOTS;Po;0;AL;;;;;N;;;;;
10F59;SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT;Po;0;AL;;;;;N;;;;;
+10FE0;ELYMAIC LETTER ALEPH;Lo;0;R;;;;;N;;;;;
+10FE1;ELYMAIC LETTER BETH;Lo;0;R;;;;;N;;;;;
+10FE2;ELYMAIC LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+10FE3;ELYMAIC LETTER DALETH;Lo;0;R;;;;;N;;;;;
+10FE4;ELYMAIC LETTER HE;Lo;0;R;;;;;N;;;;;
+10FE5;ELYMAIC LETTER WAW;Lo;0;R;;;;;N;;;;;
+10FE6;ELYMAIC LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+10FE7;ELYMAIC LETTER HETH;Lo;0;R;;;;;N;;;;;
+10FE8;ELYMAIC LETTER TETH;Lo;0;R;;;;;N;;;;;
+10FE9;ELYMAIC LETTER YODH;Lo;0;R;;;;;N;;;;;
+10FEA;ELYMAIC LETTER KAPH;Lo;0;R;;;;;N;;;;;
+10FEB;ELYMAIC LETTER LAMEDH;Lo;0;R;;;;;N;;;;;
+10FEC;ELYMAIC LETTER MEM;Lo;0;R;;;;;N;;;;;
+10FED;ELYMAIC LETTER NUN;Lo;0;R;;;;;N;;;;;
+10FEE;ELYMAIC LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+10FEF;ELYMAIC LETTER AYIN;Lo;0;R;;;;;N;;;;;
+10FF0;ELYMAIC LETTER PE;Lo;0;R;;;;;N;;;;;
+10FF1;ELYMAIC LETTER SADHE;Lo;0;R;;;;;N;;;;;
+10FF2;ELYMAIC LETTER QOPH;Lo;0;R;;;;;N;;;;;
+10FF3;ELYMAIC LETTER RESH;Lo;0;R;;;;;N;;;;;
+10FF4;ELYMAIC LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10FF5;ELYMAIC LETTER TAW;Lo;0;R;;;;;N;;;;;
+10FF6;ELYMAIC LIGATURE ZAYIN-YODH;Lo;0;R;;;;;N;;;;;
11000;BRAHMI SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;;
11001;BRAHMI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
11002;BRAHMI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
@@ -19887,6 +19944,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1145B;NEWA PLACEHOLDER MARK;Po;0;L;;;;;N;;;;;
1145D;NEWA INSERTION SIGN;Po;0;L;;;;;N;;;;;
1145E;NEWA SANDHI MARK;Mn;230;NSM;;;;;N;;;;;
+1145F;NEWA LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;;
11480;TIRHUTA ANJI;Lo;0;L;;;;;N;;;;;
11481;TIRHUTA LETTER A;Lo;0;L;;;;;N;;;;;
11482;TIRHUTA LETTER AA;Lo;0;L;;;;;N;;;;;
@@ -20209,6 +20267,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
116B5;TAKRI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
116B6;TAKRI SIGN VIRAMA;Mc;9;L;;;;;N;;;;;
116B7;TAKRI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+116B8;TAKRI LETTER ARCHAIC KHA;Lo;0;L;;;;;N;;;;;
116C0;TAKRI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
116C1;TAKRI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
116C2;TAKRI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
@@ -20421,6 +20480,71 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
118F1;WARANG CITI NUMBER EIGHTY;No;0;L;;;;80;N;;;;;
118F2;WARANG CITI NUMBER NINETY;No;0;L;;;;90;N;;;;;
118FF;WARANG CITI OM;Lo;0;L;;;;;N;;;;;
+119A0;NANDINAGARI LETTER A;Lo;0;L;;;;;N;;;;;
+119A1;NANDINAGARI LETTER AA;Lo;0;L;;;;;N;;;;;
+119A2;NANDINAGARI LETTER I;Lo;0;L;;;;;N;;;;;
+119A3;NANDINAGARI LETTER II;Lo;0;L;;;;;N;;;;;
+119A4;NANDINAGARI LETTER U;Lo;0;L;;;;;N;;;;;
+119A5;NANDINAGARI LETTER UU;Lo;0;L;;;;;N;;;;;
+119A6;NANDINAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+119A7;NANDINAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+119AA;NANDINAGARI LETTER E;Lo;0;L;;;;;N;;;;;
+119AB;NANDINAGARI LETTER AI;Lo;0;L;;;;;N;;;;;
+119AC;NANDINAGARI LETTER O;Lo;0;L;;;;;N;;;;;
+119AD;NANDINAGARI LETTER AU;Lo;0;L;;;;;N;;;;;
+119AE;NANDINAGARI LETTER KA;Lo;0;L;;;;;N;;;;;
+119AF;NANDINAGARI LETTER KHA;Lo;0;L;;;;;N;;;;;
+119B0;NANDINAGARI LETTER GA;Lo;0;L;;;;;N;;;;;
+119B1;NANDINAGARI LETTER GHA;Lo;0;L;;;;;N;;;;;
+119B2;NANDINAGARI LETTER NGA;Lo;0;L;;;;;N;;;;;
+119B3;NANDINAGARI LETTER CA;Lo;0;L;;;;;N;;;;;
+119B4;NANDINAGARI LETTER CHA;Lo;0;L;;;;;N;;;;;
+119B5;NANDINAGARI LETTER JA;Lo;0;L;;;;;N;;;;;
+119B6;NANDINAGARI LETTER JHA;Lo;0;L;;;;;N;;;;;
+119B7;NANDINAGARI LETTER NYA;Lo;0;L;;;;;N;;;;;
+119B8;NANDINAGARI LETTER TTA;Lo;0;L;;;;;N;;;;;
+119B9;NANDINAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+119BA;NANDINAGARI LETTER DDA;Lo;0;L;;;;;N;;;;;
+119BB;NANDINAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+119BC;NANDINAGARI LETTER NNA;Lo;0;L;;;;;N;;;;;
+119BD;NANDINAGARI LETTER TA;Lo;0;L;;;;;N;;;;;
+119BE;NANDINAGARI LETTER THA;Lo;0;L;;;;;N;;;;;
+119BF;NANDINAGARI LETTER DA;Lo;0;L;;;;;N;;;;;
+119C0;NANDINAGARI LETTER DHA;Lo;0;L;;;;;N;;;;;
+119C1;NANDINAGARI LETTER NA;Lo;0;L;;;;;N;;;;;
+119C2;NANDINAGARI LETTER PA;Lo;0;L;;;;;N;;;;;
+119C3;NANDINAGARI LETTER PHA;Lo;0;L;;;;;N;;;;;
+119C4;NANDINAGARI LETTER BA;Lo;0;L;;;;;N;;;;;
+119C5;NANDINAGARI LETTER BHA;Lo;0;L;;;;;N;;;;;
+119C6;NANDINAGARI LETTER MA;Lo;0;L;;;;;N;;;;;
+119C7;NANDINAGARI LETTER YA;Lo;0;L;;;;;N;;;;;
+119C8;NANDINAGARI LETTER RA;Lo;0;L;;;;;N;;;;;
+119C9;NANDINAGARI LETTER LA;Lo;0;L;;;;;N;;;;;
+119CA;NANDINAGARI LETTER VA;Lo;0;L;;;;;N;;;;;
+119CB;NANDINAGARI LETTER SHA;Lo;0;L;;;;;N;;;;;
+119CC;NANDINAGARI LETTER SSA;Lo;0;L;;;;;N;;;;;
+119CD;NANDINAGARI LETTER SA;Lo;0;L;;;;;N;;;;;
+119CE;NANDINAGARI LETTER HA;Lo;0;L;;;;;N;;;;;
+119CF;NANDINAGARI LETTER LLA;Lo;0;L;;;;;N;;;;;
+119D0;NANDINAGARI LETTER RRA;Lo;0;L;;;;;N;;;;;
+119D1;NANDINAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+119D2;NANDINAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+119D3;NANDINAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+119D4;NANDINAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+119D5;NANDINAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+119D6;NANDINAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+119D7;NANDINAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+119DA;NANDINAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+119DB;NANDINAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+119DC;NANDINAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+119DD;NANDINAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+119DE;NANDINAGARI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+119DF;NANDINAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+119E0;NANDINAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+119E1;NANDINAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+119E2;NANDINAGARI SIGN SIDDHAM;Po;0;L;;;;;N;;;;;
+119E3;NANDINAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;;
+119E4;NANDINAGARI VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;;
11A00;ZANABAZAR SQUARE LETTER A;Lo;0;L;;;;;N;;;;;
11A01;ZANABAZAR SQUARE VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
11A02;ZANABAZAR SQUARE VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;;
@@ -20545,6 +20669,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
11A81;SOYOMBO LETTER SA;Lo;0;L;;;;;N;;;;;
11A82;SOYOMBO LETTER HA;Lo;0;L;;;;;N;;;;;
11A83;SOYOMBO LETTER KSSA;Lo;0;L;;;;;N;;;;;
+11A84;SOYOMBO SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;;
+11A85;SOYOMBO SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;;
11A86;SOYOMBO CLUSTER-INITIAL LETTER RA;Lo;0;L;;;;;N;;;;;
11A87;SOYOMBO CLUSTER-INITIAL LETTER LA;Lo;0;L;;;;;N;;;;;
11A88;SOYOMBO CLUSTER-INITIAL LETTER SHA;Lo;0;L;;;;;N;;;;;
@@ -20959,6 +21085,57 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
11EF6;MAKASAR VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
11EF7;MAKASAR PASSIMBANG;Po;0;L;;;;;N;;;;;
11EF8;MAKASAR END OF SECTION;Po;0;L;;;;;N;;;;;
+11FC0;TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH;No;0;L;;;;1/320;N;;;;;
+11FC1;TAMIL FRACTION ONE ONE-HUNDRED-AND-SIXTIETH;No;0;L;;;;1/160;N;;;;;
+11FC2;TAMIL FRACTION ONE EIGHTIETH;No;0;L;;;;1/80;N;;;;;
+11FC3;TAMIL FRACTION ONE SIXTY-FOURTH;No;0;L;;;;1/64;N;;;;;
+11FC4;TAMIL FRACTION ONE FORTIETH;No;0;L;;;;1/40;N;;;;;
+11FC5;TAMIL FRACTION ONE THIRTY-SECOND;No;0;L;;;;1/32;N;;;;;
+11FC6;TAMIL FRACTION THREE EIGHTIETHS;No;0;L;;;;3/80;N;;;;;
+11FC7;TAMIL FRACTION THREE SIXTY-FOURTHS;No;0;L;;;;3/64;N;;;;;
+11FC8;TAMIL FRACTION ONE TWENTIETH;No;0;L;;;;1/20;N;;;;;
+11FC9;TAMIL FRACTION ONE SIXTEENTH-1;No;0;L;;;;1/16;N;;;;;
+11FCA;TAMIL FRACTION ONE SIXTEENTH-2;No;0;L;;;;1/16;N;;;;;
+11FCB;TAMIL FRACTION ONE TENTH;No;0;L;;;;1/10;N;;;;;
+11FCC;TAMIL FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;;
+11FCD;TAMIL FRACTION THREE TWENTIETHS;No;0;L;;;;3/20;N;;;;;
+11FCE;TAMIL FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;;
+11FCF;TAMIL FRACTION ONE FIFTH;No;0;L;;;;1/5;N;;;;;
+11FD0;TAMIL FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;;
+11FD1;TAMIL FRACTION ONE HALF-1;No;0;L;;;;1/2;N;;;;;
+11FD2;TAMIL FRACTION ONE HALF-2;No;0;L;;;;1/2;N;;;;;
+11FD3;TAMIL FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;;
+11FD4;TAMIL FRACTION DOWNSCALING FACTOR KIIZH;No;0;L;;;;1/320;N;;;;;
+11FD5;TAMIL SIGN NEL;So;0;ON;;;;;N;;;;;
+11FD6;TAMIL SIGN CEVITU;So;0;ON;;;;;N;;;;;
+11FD7;TAMIL SIGN AAZHAAKKU;So;0;ON;;;;;N;;;;;
+11FD8;TAMIL SIGN UZHAKKU;So;0;ON;;;;;N;;;;;
+11FD9;TAMIL SIGN MUUVUZHAKKU;So;0;ON;;;;;N;;;;;
+11FDA;TAMIL SIGN KURUNI;So;0;ON;;;;;N;;;;;
+11FDB;TAMIL SIGN PATHAKKU;So;0;ON;;;;;N;;;;;
+11FDC;TAMIL SIGN MUKKURUNI;So;0;ON;;;;;N;;;;;
+11FDD;TAMIL SIGN KAACU;Sc;0;ET;;;;;N;;;;;
+11FDE;TAMIL SIGN PANAM;Sc;0;ET;;;;;N;;;;;
+11FDF;TAMIL SIGN PON;Sc;0;ET;;;;;N;;;;;
+11FE0;TAMIL SIGN VARAAKAN;Sc;0;ET;;;;;N;;;;;
+11FE1;TAMIL SIGN PAARAM;So;0;ON;;;;;N;;;;;
+11FE2;TAMIL SIGN KUZHI;So;0;ON;;;;;N;;;;;
+11FE3;TAMIL SIGN VELI;So;0;ON;;;;;N;;;;;
+11FE4;TAMIL WET CULTIVATION SIGN;So;0;ON;;;;;N;;;;;
+11FE5;TAMIL DRY CULTIVATION SIGN;So;0;ON;;;;;N;;;;;
+11FE6;TAMIL LAND SIGN;So;0;ON;;;;;N;;;;;
+11FE7;TAMIL SALT PAN SIGN;So;0;ON;;;;;N;;;;;
+11FE8;TAMIL TRADITIONAL CREDIT SIGN;So;0;ON;;;;;N;;;;;
+11FE9;TAMIL TRADITIONAL NUMBER SIGN;So;0;ON;;;;;N;;;;;
+11FEA;TAMIL CURRENT SIGN;So;0;ON;;;;;N;;;;;
+11FEB;TAMIL AND ODD SIGN;So;0;ON;;;;;N;;;;;
+11FEC;TAMIL SPENT SIGN;So;0;ON;;;;;N;;;;;
+11FED;TAMIL TOTAL SIGN;So;0;ON;;;;;N;;;;;
+11FEE;TAMIL IN POSSESSION SIGN;So;0;ON;;;;;N;;;;;
+11FEF;TAMIL STARTING FROM SIGN;So;0;ON;;;;;N;;;;;
+11FF0;TAMIL SIGN MUTHALIYA;So;0;ON;;;;;N;;;;;
+11FF1;TAMIL SIGN VAKAIYARAA;So;0;ON;;;;;N;;;;;
+11FFF;TAMIL PUNCTUATION END OF TEXT;Po;0;L;;;;;N;;;;;
12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;;
12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;;
12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;;
@@ -23264,6 +23441,15 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1342C;EGYPTIAN HIEROGLYPH AA030;Lo;0;L;;;;;N;;;;;
1342D;EGYPTIAN HIEROGLYPH AA031;Lo;0;L;;;;;N;;;;;
1342E;EGYPTIAN HIEROGLYPH AA032;Lo;0;L;;;;;N;;;;;
+13430;EGYPTIAN HIEROGLYPH VERTICAL JOINER;Cf;0;L;;;;;N;;;;;
+13431;EGYPTIAN HIEROGLYPH HORIZONTAL JOINER;Cf;0;L;;;;;N;;;;;
+13432;EGYPTIAN HIEROGLYPH INSERT AT TOP START;Cf;0;L;;;;;N;;;;;
+13433;EGYPTIAN HIEROGLYPH INSERT AT BOTTOM START;Cf;0;L;;;;;N;;;;;
+13434;EGYPTIAN HIEROGLYPH INSERT AT TOP END;Cf;0;L;;;;;N;;;;;
+13435;EGYPTIAN HIEROGLYPH INSERT AT BOTTOM END;Cf;0;L;;;;;N;;;;;
+13436;EGYPTIAN HIEROGLYPH OVERLAY MIDDLE;Cf;0;L;;;;;N;;;;;
+13437;EGYPTIAN HIEROGLYPH BEGIN SEGMENT;Cf;0;L;;;;;N;;;;;
+13438;EGYPTIAN HIEROGLYPH END SEGMENT;Cf;0;L;;;;;N;;;;;
14400;ANATOLIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;;
14401;ANATOLIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;;
14402;ANATOLIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;;
@@ -24782,6 +24968,13 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
16F42;MIAO LETTER WA;Lo;0;L;;;;;N;;;;;
16F43;MIAO LETTER AH;Lo;0;L;;;;;N;;;;;
16F44;MIAO LETTER HHA;Lo;0;L;;;;;N;;;;;
+16F45;MIAO LETTER BRI;Lo;0;L;;;;;N;;;;;
+16F46;MIAO LETTER SYI;Lo;0;L;;;;;N;;;;;
+16F47;MIAO LETTER DZYI;Lo;0;L;;;;;N;;;;;
+16F48;MIAO LETTER TE;Lo;0;L;;;;;N;;;;;
+16F49;MIAO LETTER TSE;Lo;0;L;;;;;N;;;;;
+16F4A;MIAO LETTER RTE;Lo;0;L;;;;;N;;;;;
+16F4F;MIAO SIGN CONSONANT MODIFIER BAR;Mn;0;NSM;;;;;N;;;;;
16F50;MIAO LETTER NASALIZATION;Lo;0;L;;;;;N;;;;;
16F51;MIAO SIGN ASPIRATION;Mc;0;L;;;;;N;;;;;
16F52;MIAO SIGN REFORMED VOICING;Mc;0;L;;;;;N;;;;;
@@ -24829,6 +25022,15 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
16F7C;MIAO VOWEL SIGN OU;Mc;0;L;;;;;N;;;;;
16F7D;MIAO VOWEL SIGN N;Mc;0;L;;;;;N;;;;;
16F7E;MIAO VOWEL SIGN NG;Mc;0;L;;;;;N;;;;;
+16F7F;MIAO VOWEL SIGN UOG;Mc;0;L;;;;;N;;;;;
+16F80;MIAO VOWEL SIGN YUI;Mc;0;L;;;;;N;;;;;
+16F81;MIAO VOWEL SIGN OG;Mc;0;L;;;;;N;;;;;
+16F82;MIAO VOWEL SIGN OER;Mc;0;L;;;;;N;;;;;
+16F83;MIAO VOWEL SIGN VW;Mc;0;L;;;;;N;;;;;
+16F84;MIAO VOWEL SIGN IG;Mc;0;L;;;;;N;;;;;
+16F85;MIAO VOWEL SIGN EA;Mc;0;L;;;;;N;;;;;
+16F86;MIAO VOWEL SIGN IONG;Mc;0;L;;;;;N;;;;;
+16F87;MIAO VOWEL SIGN UI;Mc;0;L;;;;;N;;;;;
16F8F;MIAO TONE RIGHT;Mn;0;NSM;;;;;N;;;;;
16F90;MIAO TONE TOP RIGHT;Mn;0;NSM;;;;;N;;;;;
16F91;MIAO TONE ABOVE;Mn;0;NSM;;;;;N;;;;;
@@ -24848,8 +25050,10 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
16F9F;MIAO LETTER REFORMED TONE-8;Lm;0;L;;;;;N;;;;;
16FE0;TANGUT ITERATION MARK;Lm;0;L;;;;;N;;;;;
16FE1;NUSHU ITERATION MARK;Lm;0;L;;;;;N;;;;;
+16FE2;OLD CHINESE HOOK MARK;Po;0;ON;;;;;N;;;;;
+16FE3;OLD CHINESE ITERATION MARK;Lm;0;L;;;;;N;;;;;
17000;<Tangut Ideograph, First>;Lo;0;L;;;;;N;;;;;
-187F1;<Tangut Ideograph, Last>;Lo;0;L;;;;;N;;;;;
+187F7;<Tangut Ideograph, Last>;Lo;0;L;;;;;N;;;;;
18800;TANGUT COMPONENT-001;Lo;0;L;;;;;N;;;;;
18801;TANGUT COMPONENT-002;Lo;0;L;;;;;N;;;;;
18802;TANGUT COMPONENT-003;Lo;0;L;;;;;N;;;;;
@@ -25892,6 +26096,13 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1B11C;HENTAIGANA LETTER WO-7;Lo;0;L;;;;;N;;;;;
1B11D;HENTAIGANA LETTER N-MU-MO-1;Lo;0;L;;;;;N;;;;;
1B11E;HENTAIGANA LETTER N-MU-MO-2;Lo;0;L;;;;;N;;;;;
+1B150;HIRAGANA LETTER SMALL WI;Lo;0;L;;;;;N;;;;;
+1B151;HIRAGANA LETTER SMALL WE;Lo;0;L;;;;;N;;;;;
+1B152;HIRAGANA LETTER SMALL WO;Lo;0;L;;;;;N;;;;;
+1B164;KATAKANA LETTER SMALL WI;Lo;0;L;;;;;N;;;;;
+1B165;KATAKANA LETTER SMALL WE;Lo;0;L;;;;;N;;;;;
+1B166;KATAKANA LETTER SMALL WO;Lo;0;L;;;;;N;;;;;
+1B167;KATAKANA LETTER SMALL N;Lo;0;L;;;;;N;;;;;
1B170;NUSHU CHARACTER-1B170;Lo;0;L;;;;;N;;;;;
1B171;NUSHU CHARACTER-1B171;Lo;0;L;;;;;N;;;;;
1B172;NUSHU CHARACTER-1B172;Lo;0;L;;;;;N;;;;;
@@ -28820,6 +29031,136 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1E028;COMBINING GLAGOLITIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;;
1E029;COMBINING GLAGOLITIC LETTER IOTATED BIG YUS;Mn;230;NSM;;;;;N;;;;;
1E02A;COMBINING GLAGOLITIC LETTER FITA;Mn;230;NSM;;;;;N;;;;;
+1E100;NYIAKENG PUACHUE HMONG LETTER MA;Lo;0;L;;;;;N;;;;;
+1E101;NYIAKENG PUACHUE HMONG LETTER TSA;Lo;0;L;;;;;N;;;;;
+1E102;NYIAKENG PUACHUE HMONG LETTER NTA;Lo;0;L;;;;;N;;;;;
+1E103;NYIAKENG PUACHUE HMONG LETTER TA;Lo;0;L;;;;;N;;;;;
+1E104;NYIAKENG PUACHUE HMONG LETTER HA;Lo;0;L;;;;;N;;;;;
+1E105;NYIAKENG PUACHUE HMONG LETTER NA;Lo;0;L;;;;;N;;;;;
+1E106;NYIAKENG PUACHUE HMONG LETTER XA;Lo;0;L;;;;;N;;;;;
+1E107;NYIAKENG PUACHUE HMONG LETTER NKA;Lo;0;L;;;;;N;;;;;
+1E108;NYIAKENG PUACHUE HMONG LETTER CA;Lo;0;L;;;;;N;;;;;
+1E109;NYIAKENG PUACHUE HMONG LETTER LA;Lo;0;L;;;;;N;;;;;
+1E10A;NYIAKENG PUACHUE HMONG LETTER SA;Lo;0;L;;;;;N;;;;;
+1E10B;NYIAKENG PUACHUE HMONG LETTER ZA;Lo;0;L;;;;;N;;;;;
+1E10C;NYIAKENG PUACHUE HMONG LETTER NCA;Lo;0;L;;;;;N;;;;;
+1E10D;NYIAKENG PUACHUE HMONG LETTER NTSA;Lo;0;L;;;;;N;;;;;
+1E10E;NYIAKENG PUACHUE HMONG LETTER KA;Lo;0;L;;;;;N;;;;;
+1E10F;NYIAKENG PUACHUE HMONG LETTER DA;Lo;0;L;;;;;N;;;;;
+1E110;NYIAKENG PUACHUE HMONG LETTER NYA;Lo;0;L;;;;;N;;;;;
+1E111;NYIAKENG PUACHUE HMONG LETTER NRA;Lo;0;L;;;;;N;;;;;
+1E112;NYIAKENG PUACHUE HMONG LETTER VA;Lo;0;L;;;;;N;;;;;
+1E113;NYIAKENG PUACHUE HMONG LETTER NTXA;Lo;0;L;;;;;N;;;;;
+1E114;NYIAKENG PUACHUE HMONG LETTER TXA;Lo;0;L;;;;;N;;;;;
+1E115;NYIAKENG PUACHUE HMONG LETTER FA;Lo;0;L;;;;;N;;;;;
+1E116;NYIAKENG PUACHUE HMONG LETTER RA;Lo;0;L;;;;;N;;;;;
+1E117;NYIAKENG PUACHUE HMONG LETTER QA;Lo;0;L;;;;;N;;;;;
+1E118;NYIAKENG PUACHUE HMONG LETTER YA;Lo;0;L;;;;;N;;;;;
+1E119;NYIAKENG PUACHUE HMONG LETTER NQA;Lo;0;L;;;;;N;;;;;
+1E11A;NYIAKENG PUACHUE HMONG LETTER PA;Lo;0;L;;;;;N;;;;;
+1E11B;NYIAKENG PUACHUE HMONG LETTER XYA;Lo;0;L;;;;;N;;;;;
+1E11C;NYIAKENG PUACHUE HMONG LETTER NPA;Lo;0;L;;;;;N;;;;;
+1E11D;NYIAKENG PUACHUE HMONG LETTER DLA;Lo;0;L;;;;;N;;;;;
+1E11E;NYIAKENG PUACHUE HMONG LETTER NPLA;Lo;0;L;;;;;N;;;;;
+1E11F;NYIAKENG PUACHUE HMONG LETTER HAH;Lo;0;L;;;;;N;;;;;
+1E120;NYIAKENG PUACHUE HMONG LETTER MLA;Lo;0;L;;;;;N;;;;;
+1E121;NYIAKENG PUACHUE HMONG LETTER PLA;Lo;0;L;;;;;N;;;;;
+1E122;NYIAKENG PUACHUE HMONG LETTER GA;Lo;0;L;;;;;N;;;;;
+1E123;NYIAKENG PUACHUE HMONG LETTER RRA;Lo;0;L;;;;;N;;;;;
+1E124;NYIAKENG PUACHUE HMONG LETTER A;Lo;0;L;;;;;N;;;;;
+1E125;NYIAKENG PUACHUE HMONG LETTER AA;Lo;0;L;;;;;N;;;;;
+1E126;NYIAKENG PUACHUE HMONG LETTER I;Lo;0;L;;;;;N;;;;;
+1E127;NYIAKENG PUACHUE HMONG LETTER U;Lo;0;L;;;;;N;;;;;
+1E128;NYIAKENG PUACHUE HMONG LETTER O;Lo;0;L;;;;;N;;;;;
+1E129;NYIAKENG PUACHUE HMONG LETTER OO;Lo;0;L;;;;;N;;;;;
+1E12A;NYIAKENG PUACHUE HMONG LETTER E;Lo;0;L;;;;;N;;;;;
+1E12B;NYIAKENG PUACHUE HMONG LETTER EE;Lo;0;L;;;;;N;;;;;
+1E12C;NYIAKENG PUACHUE HMONG LETTER W;Lo;0;L;;;;;N;;;;;
+1E130;NYIAKENG PUACHUE HMONG TONE-B;Mn;230;NSM;;;;;N;;;;;
+1E131;NYIAKENG PUACHUE HMONG TONE-M;Mn;230;NSM;;;;;N;;;;;
+1E132;NYIAKENG PUACHUE HMONG TONE-J;Mn;230;NSM;;;;;N;;;;;
+1E133;NYIAKENG PUACHUE HMONG TONE-V;Mn;230;NSM;;;;;N;;;;;
+1E134;NYIAKENG PUACHUE HMONG TONE-S;Mn;230;NSM;;;;;N;;;;;
+1E135;NYIAKENG PUACHUE HMONG TONE-G;Mn;230;NSM;;;;;N;;;;;
+1E136;NYIAKENG PUACHUE HMONG TONE-D;Mn;230;NSM;;;;;N;;;;;
+1E137;NYIAKENG PUACHUE HMONG SIGN FOR PERSON;Lm;0;L;;;;;N;;;;;
+1E138;NYIAKENG PUACHUE HMONG SIGN FOR THING;Lm;0;L;;;;;N;;;;;
+1E139;NYIAKENG PUACHUE HMONG SIGN FOR LOCATION;Lm;0;L;;;;;N;;;;;
+1E13A;NYIAKENG PUACHUE HMONG SIGN FOR ANIMAL;Lm;0;L;;;;;N;;;;;
+1E13B;NYIAKENG PUACHUE HMONG SIGN FOR INVERTEBRATE;Lm;0;L;;;;;N;;;;;
+1E13C;NYIAKENG PUACHUE HMONG SIGN XW XW;Lm;0;L;;;;;N;;;;;
+1E13D;NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;;
+1E140;NYIAKENG PUACHUE HMONG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1E141;NYIAKENG PUACHUE HMONG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1E142;NYIAKENG PUACHUE HMONG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1E143;NYIAKENG PUACHUE HMONG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1E144;NYIAKENG PUACHUE HMONG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1E145;NYIAKENG PUACHUE HMONG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1E146;NYIAKENG PUACHUE HMONG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1E147;NYIAKENG PUACHUE HMONG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1E148;NYIAKENG PUACHUE HMONG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1E149;NYIAKENG PUACHUE HMONG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1E14E;NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ;Lo;0;L;;;;;N;;;;;
+1E14F;NYIAKENG PUACHUE HMONG CIRCLED CA;So;0;L;;;;;N;;;;;
+1E2C0;WANCHO LETTER AA;Lo;0;L;;;;;N;;;;;
+1E2C1;WANCHO LETTER A;Lo;0;L;;;;;N;;;;;
+1E2C2;WANCHO LETTER BA;Lo;0;L;;;;;N;;;;;
+1E2C3;WANCHO LETTER CA;Lo;0;L;;;;;N;;;;;
+1E2C4;WANCHO LETTER DA;Lo;0;L;;;;;N;;;;;
+1E2C5;WANCHO LETTER GA;Lo;0;L;;;;;N;;;;;
+1E2C6;WANCHO LETTER YA;Lo;0;L;;;;;N;;;;;
+1E2C7;WANCHO LETTER PHA;Lo;0;L;;;;;N;;;;;
+1E2C8;WANCHO LETTER LA;Lo;0;L;;;;;N;;;;;
+1E2C9;WANCHO LETTER NA;Lo;0;L;;;;;N;;;;;
+1E2CA;WANCHO LETTER PA;Lo;0;L;;;;;N;;;;;
+1E2CB;WANCHO LETTER TA;Lo;0;L;;;;;N;;;;;
+1E2CC;WANCHO LETTER THA;Lo;0;L;;;;;N;;;;;
+1E2CD;WANCHO LETTER FA;Lo;0;L;;;;;N;;;;;
+1E2CE;WANCHO LETTER SA;Lo;0;L;;;;;N;;;;;
+1E2CF;WANCHO LETTER SHA;Lo;0;L;;;;;N;;;;;
+1E2D0;WANCHO LETTER JA;Lo;0;L;;;;;N;;;;;
+1E2D1;WANCHO LETTER ZA;Lo;0;L;;;;;N;;;;;
+1E2D2;WANCHO LETTER WA;Lo;0;L;;;;;N;;;;;
+1E2D3;WANCHO LETTER VA;Lo;0;L;;;;;N;;;;;
+1E2D4;WANCHO LETTER KA;Lo;0;L;;;;;N;;;;;
+1E2D5;WANCHO LETTER O;Lo;0;L;;;;;N;;;;;
+1E2D6;WANCHO LETTER AU;Lo;0;L;;;;;N;;;;;
+1E2D7;WANCHO LETTER RA;Lo;0;L;;;;;N;;;;;
+1E2D8;WANCHO LETTER MA;Lo;0;L;;;;;N;;;;;
+1E2D9;WANCHO LETTER KHA;Lo;0;L;;;;;N;;;;;
+1E2DA;WANCHO LETTER HA;Lo;0;L;;;;;N;;;;;
+1E2DB;WANCHO LETTER E;Lo;0;L;;;;;N;;;;;
+1E2DC;WANCHO LETTER I;Lo;0;L;;;;;N;;;;;
+1E2DD;WANCHO LETTER NGA;Lo;0;L;;;;;N;;;;;
+1E2DE;WANCHO LETTER U;Lo;0;L;;;;;N;;;;;
+1E2DF;WANCHO LETTER LLHA;Lo;0;L;;;;;N;;;;;
+1E2E0;WANCHO LETTER TSA;Lo;0;L;;;;;N;;;;;
+1E2E1;WANCHO LETTER TRA;Lo;0;L;;;;;N;;;;;
+1E2E2;WANCHO LETTER ONG;Lo;0;L;;;;;N;;;;;
+1E2E3;WANCHO LETTER AANG;Lo;0;L;;;;;N;;;;;
+1E2E4;WANCHO LETTER ANG;Lo;0;L;;;;;N;;;;;
+1E2E5;WANCHO LETTER ING;Lo;0;L;;;;;N;;;;;
+1E2E6;WANCHO LETTER ON;Lo;0;L;;;;;N;;;;;
+1E2E7;WANCHO LETTER EN;Lo;0;L;;;;;N;;;;;
+1E2E8;WANCHO LETTER AAN;Lo;0;L;;;;;N;;;;;
+1E2E9;WANCHO LETTER NYA;Lo;0;L;;;;;N;;;;;
+1E2EA;WANCHO LETTER UEN;Lo;0;L;;;;;N;;;;;
+1E2EB;WANCHO LETTER YIH;Lo;0;L;;;;;N;;;;;
+1E2EC;WANCHO TONE TUP;Mn;230;NSM;;;;;N;;;;;
+1E2ED;WANCHO TONE TUPNI;Mn;230;NSM;;;;;N;;;;;
+1E2EE;WANCHO TONE KOI;Mn;230;NSM;;;;;N;;;;;
+1E2EF;WANCHO TONE KOINI;Mn;230;NSM;;;;;N;;;;;
+1E2F0;WANCHO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1E2F1;WANCHO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1E2F2;WANCHO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1E2F3;WANCHO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1E2F4;WANCHO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1E2F5;WANCHO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1E2F6;WANCHO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1E2F7;WANCHO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1E2F8;WANCHO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1E2F9;WANCHO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1E2FF;WANCHO NGUN SIGN;Sc;0;ET;;;;;N;;;;;
1E800;MENDE KIKAKUI SYLLABLE M001 KI;Lo;0;R;;;;;N;;;;;
1E801;MENDE KIKAKUI SYLLABLE M002 KA;Lo;0;R;;;;;N;;;;;
1E802;MENDE KIKAKUI SYLLABLE M003 KU;Lo;0;R;;;;;N;;;;;
@@ -29108,6 +29449,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1E948;ADLAM CONSONANT MODIFIER;Mn;230;NSM;;;;;N;;;;;
1E949;ADLAM GEMINATE CONSONANT MODIFIER;Mn;230;NSM;;;;;N;;;;;
1E94A;ADLAM NUKTA;Mn;7;NSM;;;;;N;;;;;
+1E94B;ADLAM NASALIZATION MARK;Lm;0;R;;;;;N;;;;;
1E950;ADLAM DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;;
1E951;ADLAM DIGIT ONE;Nd;0;R;;1;1;1;N;;;;;
1E952;ADLAM DIGIT TWO;Nd;0;R;;2;2;2;N;;;;;
@@ -29188,6 +29530,67 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1ECB2;INDIC SIYAQ NUMBER ALTERNATE TWO;No;0;AL;;;;2;N;;;;;
1ECB3;INDIC SIYAQ NUMBER ALTERNATE TEN THOUSAND;No;0;AL;;;;10000;N;;;;;
1ECB4;INDIC SIYAQ ALTERNATE LAKH MARK;No;0;AL;;;;100000;N;;;;;
+1ED01;OTTOMAN SIYAQ NUMBER ONE;No;0;AL;;;;1;N;;;;;
+1ED02;OTTOMAN SIYAQ NUMBER TWO;No;0;AL;;;;2;N;;;;;
+1ED03;OTTOMAN SIYAQ NUMBER THREE;No;0;AL;;;;3;N;;;;;
+1ED04;OTTOMAN SIYAQ NUMBER FOUR;No;0;AL;;;;4;N;;;;;
+1ED05;OTTOMAN SIYAQ NUMBER FIVE;No;0;AL;;;;5;N;;;;;
+1ED06;OTTOMAN SIYAQ NUMBER SIX;No;0;AL;;;;6;N;;;;;
+1ED07;OTTOMAN SIYAQ NUMBER SEVEN;No;0;AL;;;;7;N;;;;;
+1ED08;OTTOMAN SIYAQ NUMBER EIGHT;No;0;AL;;;;8;N;;;;;
+1ED09;OTTOMAN SIYAQ NUMBER NINE;No;0;AL;;;;9;N;;;;;
+1ED0A;OTTOMAN SIYAQ NUMBER TEN;No;0;AL;;;;10;N;;;;;
+1ED0B;OTTOMAN SIYAQ NUMBER TWENTY;No;0;AL;;;;20;N;;;;;
+1ED0C;OTTOMAN SIYAQ NUMBER THIRTY;No;0;AL;;;;30;N;;;;;
+1ED0D;OTTOMAN SIYAQ NUMBER FORTY;No;0;AL;;;;40;N;;;;;
+1ED0E;OTTOMAN SIYAQ NUMBER FIFTY;No;0;AL;;;;50;N;;;;;
+1ED0F;OTTOMAN SIYAQ NUMBER SIXTY;No;0;AL;;;;60;N;;;;;
+1ED10;OTTOMAN SIYAQ NUMBER SEVENTY;No;0;AL;;;;70;N;;;;;
+1ED11;OTTOMAN SIYAQ NUMBER EIGHTY;No;0;AL;;;;80;N;;;;;
+1ED12;OTTOMAN SIYAQ NUMBER NINETY;No;0;AL;;;;90;N;;;;;
+1ED13;OTTOMAN SIYAQ NUMBER ONE HUNDRED;No;0;AL;;;;100;N;;;;;
+1ED14;OTTOMAN SIYAQ NUMBER TWO HUNDRED;No;0;AL;;;;200;N;;;;;
+1ED15;OTTOMAN SIYAQ NUMBER THREE HUNDRED;No;0;AL;;;;300;N;;;;;
+1ED16;OTTOMAN SIYAQ NUMBER FOUR HUNDRED;No;0;AL;;;;400;N;;;;;
+1ED17;OTTOMAN SIYAQ NUMBER FIVE HUNDRED;No;0;AL;;;;500;N;;;;;
+1ED18;OTTOMAN SIYAQ NUMBER SIX HUNDRED;No;0;AL;;;;600;N;;;;;
+1ED19;OTTOMAN SIYAQ NUMBER SEVEN HUNDRED;No;0;AL;;;;700;N;;;;;
+1ED1A;OTTOMAN SIYAQ NUMBER EIGHT HUNDRED;No;0;AL;;;;800;N;;;;;
+1ED1B;OTTOMAN SIYAQ NUMBER NINE HUNDRED;No;0;AL;;;;900;N;;;;;
+1ED1C;OTTOMAN SIYAQ NUMBER ONE THOUSAND;No;0;AL;;;;1000;N;;;;;
+1ED1D;OTTOMAN SIYAQ NUMBER TWO THOUSAND;No;0;AL;;;;2000;N;;;;;
+1ED1E;OTTOMAN SIYAQ NUMBER THREE THOUSAND;No;0;AL;;;;3000;N;;;;;
+1ED1F;OTTOMAN SIYAQ NUMBER FOUR THOUSAND;No;0;AL;;;;4000;N;;;;;
+1ED20;OTTOMAN SIYAQ NUMBER FIVE THOUSAND;No;0;AL;;;;5000;N;;;;;
+1ED21;OTTOMAN SIYAQ NUMBER SIX THOUSAND;No;0;AL;;;;6000;N;;;;;
+1ED22;OTTOMAN SIYAQ NUMBER SEVEN THOUSAND;No;0;AL;;;;7000;N;;;;;
+1ED23;OTTOMAN SIYAQ NUMBER EIGHT THOUSAND;No;0;AL;;;;8000;N;;;;;
+1ED24;OTTOMAN SIYAQ NUMBER NINE THOUSAND;No;0;AL;;;;9000;N;;;;;
+1ED25;OTTOMAN SIYAQ NUMBER TEN THOUSAND;No;0;AL;;;;10000;N;;;;;
+1ED26;OTTOMAN SIYAQ NUMBER TWENTY THOUSAND;No;0;AL;;;;20000;N;;;;;
+1ED27;OTTOMAN SIYAQ NUMBER THIRTY THOUSAND;No;0;AL;;;;30000;N;;;;;
+1ED28;OTTOMAN SIYAQ NUMBER FORTY THOUSAND;No;0;AL;;;;40000;N;;;;;
+1ED29;OTTOMAN SIYAQ NUMBER FIFTY THOUSAND;No;0;AL;;;;50000;N;;;;;
+1ED2A;OTTOMAN SIYAQ NUMBER SIXTY THOUSAND;No;0;AL;;;;60000;N;;;;;
+1ED2B;OTTOMAN SIYAQ NUMBER SEVENTY THOUSAND;No;0;AL;;;;70000;N;;;;;
+1ED2C;OTTOMAN SIYAQ NUMBER EIGHTY THOUSAND;No;0;AL;;;;80000;N;;;;;
+1ED2D;OTTOMAN SIYAQ NUMBER NINETY THOUSAND;No;0;AL;;;;90000;N;;;;;
+1ED2E;OTTOMAN SIYAQ MARRATAN;So;0;AL;;;;;N;;;;;
+1ED2F;OTTOMAN SIYAQ ALTERNATE NUMBER TWO;No;0;AL;;;;2;N;;;;;
+1ED30;OTTOMAN SIYAQ ALTERNATE NUMBER THREE;No;0;AL;;;;3;N;;;;;
+1ED31;OTTOMAN SIYAQ ALTERNATE NUMBER FOUR;No;0;AL;;;;4;N;;;;;
+1ED32;OTTOMAN SIYAQ ALTERNATE NUMBER FIVE;No;0;AL;;;;5;N;;;;;
+1ED33;OTTOMAN SIYAQ ALTERNATE NUMBER SIX;No;0;AL;;;;6;N;;;;;
+1ED34;OTTOMAN SIYAQ ALTERNATE NUMBER SEVEN;No;0;AL;;;;7;N;;;;;
+1ED35;OTTOMAN SIYAQ ALTERNATE NUMBER EIGHT;No;0;AL;;;;8;N;;;;;
+1ED36;OTTOMAN SIYAQ ALTERNATE NUMBER NINE;No;0;AL;;;;9;N;;;;;
+1ED37;OTTOMAN SIYAQ ALTERNATE NUMBER TEN;No;0;AL;;;;10;N;;;;;
+1ED38;OTTOMAN SIYAQ ALTERNATE NUMBER FOUR HUNDRED;No;0;AL;;;;400;N;;;;;
+1ED39;OTTOMAN SIYAQ ALTERNATE NUMBER SIX HUNDRED;No;0;AL;;;;600;N;;;;;
+1ED3A;OTTOMAN SIYAQ ALTERNATE NUMBER TWO THOUSAND;No;0;AL;;;;2000;N;;;;;
+1ED3B;OTTOMAN SIYAQ ALTERNATE NUMBER TEN THOUSAND;No;0;AL;;;;10000;N;;;;;
+1ED3C;OTTOMAN SIYAQ FRACTION ONE HALF;No;0;AL;;;;1/2;N;;;;;
+1ED3D;OTTOMAN SIYAQ FRACTION ONE SIXTH;No;0;AL;;;;1/6;N;;;;;
1EE00;ARABIC MATHEMATICAL ALEF;Lo;0;AL;<font> 0627;;;;N;;;;;
1EE01;ARABIC MATHEMATICAL BEH;Lo;0;AL;<font> 0628;;;;N;;;;;
1EE02;ARABIC MATHEMATICAL JEEM;Lo;0;AL;<font> 062C;;;;N;;;;;
@@ -29662,6 +30065,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F169;NEGATIVE CIRCLED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;;
1F16A;RAISED MC SIGN;So;0;ON;<super> 004D 0043;;;;N;;;;;
1F16B;RAISED MD SIGN;So;0;ON;<super> 004D 0044;;;;N;;;;;
+1F16C;RAISED MR SIGN;So;0;ON;<super> 004D 0052;;;;N;;;;;
1F170;NEGATIVE SQUARED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;;
1F171;NEGATIVE SQUARED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;;
1F172;NEGATIVE SQUARED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;;
@@ -30794,6 +31198,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F6D2;SHOPPING TROLLEY;So;0;ON;;;;;N;;;;;
1F6D3;STUPA;So;0;ON;;;;;N;;;;;
1F6D4;PAGODA;So;0;ON;;;;;N;;;;;
+1F6D5;HINDU TEMPLE;So;0;ON;;;;;N;;;;;
1F6E0;HAMMER AND WRENCH;So;0;ON;;;;;N;;;;;
1F6E1;SHIELD;So;0;ON;;;;;N;;;;;
1F6E2;OIL DRUM;So;0;ON;;;;;N;;;;;
@@ -30817,6 +31222,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F6F7;SLED;So;0;ON;;;;;N;;;;;
1F6F8;FLYING SAUCER;So;0;ON;;;;;N;;;;;
1F6F9;SKATEBOARD;So;0;ON;;;;;N;;;;;
+1F6FA;AUTO RICKSHAW;So;0;ON;;;;;N;;;;;
1F700;ALCHEMICAL SYMBOL FOR QUINTESSENCE;So;0;ON;;;;;N;;;;;
1F701;ALCHEMICAL SYMBOL FOR AIR;So;0;ON;;;;;N;;;;;
1F702;ALCHEMICAL SYMBOL FOR FIRE;So;0;ON;;;;;N;;;;;
@@ -31022,6 +31428,18 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F7D6;NEGATIVE CIRCLED TRIANGLE;So;0;ON;;;;;N;;;;;
1F7D7;CIRCLED SQUARE;So;0;ON;;;;;N;;;;;
1F7D8;NEGATIVE CIRCLED SQUARE;So;0;ON;;;;;N;;;;;
+1F7E0;LARGE ORANGE CIRCLE;So;0;ON;;;;;N;;;;;
+1F7E1;LARGE YELLOW CIRCLE;So;0;ON;;;;;N;;;;;
+1F7E2;LARGE GREEN CIRCLE;So;0;ON;;;;;N;;;;;
+1F7E3;LARGE PURPLE CIRCLE;So;0;ON;;;;;N;;;;;
+1F7E4;LARGE BROWN CIRCLE;So;0;ON;;;;;N;;;;;
+1F7E5;LARGE RED SQUARE;So;0;ON;;;;;N;;;;;
+1F7E6;LARGE BLUE SQUARE;So;0;ON;;;;;N;;;;;
+1F7E7;LARGE ORANGE SQUARE;So;0;ON;;;;;N;;;;;
+1F7E8;LARGE YELLOW SQUARE;So;0;ON;;;;;N;;;;;
+1F7E9;LARGE GREEN SQUARE;So;0;ON;;;;;N;;;;;
+1F7EA;LARGE PURPLE SQUARE;So;0;ON;;;;;N;;;;;
+1F7EB;LARGE BROWN SQUARE;So;0;ON;;;;;N;;;;;
1F800;LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
1F801;UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
1F802;RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
@@ -31182,6 +31600,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F909;DOWNWARD FACING NOTCHED HOOK;So;0;ON;;;;;N;;;;;
1F90A;DOWNWARD FACING HOOK WITH DOT;So;0;ON;;;;;N;;;;;
1F90B;DOWNWARD FACING NOTCHED HOOK WITH DOT;So;0;ON;;;;;N;;;;;
+1F90D;WHITE HEART;So;0;ON;;;;;N;;;;;
+1F90E;BROWN HEART;So;0;ON;;;;;N;;;;;
+1F90F;PINCHING HAND;So;0;ON;;;;;N;;;;;
1F910;ZIPPER-MOUTH FACE;So;0;ON;;;;;N;;;;;
1F911;MONEY-MOUTH FACE;So;0;ON;;;;;N;;;;;
1F912;FACE WITH THERMOMETER;So;0;ON;;;;;N;;;;;
@@ -31229,6 +31650,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F93C;WRESTLERS;So;0;ON;;;;;N;;;;;
1F93D;WATER POLO;So;0;ON;;;;;N;;;;;
1F93E;HANDBALL;So;0;ON;;;;;N;;;;;
+1F93F;DIVING MASK;So;0;ON;;;;;N;;;;;
1F940;WILTED FLOWER;So;0;ON;;;;;N;;;;;
1F941;DRUM WITH DRUMSTICKS;So;0;ON;;;;;N;;;;;
1F942;CLINKING GLASSES;So;0;ON;;;;;N;;;;;
@@ -31278,11 +31700,13 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F96E;MOON CAKE;So;0;ON;;;;;N;;;;;
1F96F;BAGEL;So;0;ON;;;;;N;;;;;
1F970;SMILING FACE WITH SMILING EYES AND THREE HEARTS;So;0;ON;;;;;N;;;;;
+1F971;YAWNING FACE;So;0;ON;;;;;N;;;;;
1F973;FACE WITH PARTY HORN AND PARTY HAT;So;0;ON;;;;;N;;;;;
1F974;FACE WITH UNEVEN EYES AND WAVY MOUTH;So;0;ON;;;;;N;;;;;
1F975;OVERHEATED FACE;So;0;ON;;;;;N;;;;;
1F976;FREEZING FACE;So;0;ON;;;;;N;;;;;
1F97A;FACE WITH PLEADING EYES;So;0;ON;;;;;N;;;;;
+1F97B;SARI;So;0;ON;;;;;N;;;;;
1F97C;LAB COAT;So;0;ON;;;;;N;;;;;
1F97D;GOGGLES;So;0;ON;;;;;N;;;;;
1F97E;HIKING BOOT;So;0;ON;;;;;N;;;;;
@@ -31322,6 +31746,14 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F9A0;MICROBE;So;0;ON;;;;;N;;;;;
1F9A1;BADGER;So;0;ON;;;;;N;;;;;
1F9A2;SWAN;So;0;ON;;;;;N;;;;;
+1F9A5;SLOTH;So;0;ON;;;;;N;;;;;
+1F9A6;OTTER;So;0;ON;;;;;N;;;;;
+1F9A7;ORANGUTAN;So;0;ON;;;;;N;;;;;
+1F9A8;SKUNK;So;0;ON;;;;;N;;;;;
+1F9A9;FLAMINGO;So;0;ON;;;;;N;;;;;
+1F9AA;OYSTER;So;0;ON;;;;;N;;;;;
+1F9AE;GUIDE DOG;So;0;ON;;;;;N;;;;;
+1F9AF;PROBING CANE;So;0;ON;;;;;N;;;;;
1F9B0;EMOJI COMPONENT RED HAIR;So;0;ON;;;;;N;;;;;
1F9B1;EMOJI COMPONENT CURLY HAIR;So;0;ON;;;;;N;;;;;
1F9B2;EMOJI COMPONENT BALD;So;0;ON;;;;;N;;;;;
@@ -31332,9 +31764,26 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F9B7;TOOTH;So;0;ON;;;;;N;;;;;
1F9B8;SUPERHERO;So;0;ON;;;;;N;;;;;
1F9B9;SUPERVILLAIN;So;0;ON;;;;;N;;;;;
+1F9BA;SAFETY VEST;So;0;ON;;;;;N;;;;;
+1F9BB;EAR WITH HEARING AID;So;0;ON;;;;;N;;;;;
+1F9BC;MOTORIZED WHEELCHAIR;So;0;ON;;;;;N;;;;;
+1F9BD;MANUAL WHEELCHAIR;So;0;ON;;;;;N;;;;;
+1F9BE;MECHANICAL ARM;So;0;ON;;;;;N;;;;;
+1F9BF;MECHANICAL LEG;So;0;ON;;;;;N;;;;;
1F9C0;CHEESE WEDGE;So;0;ON;;;;;N;;;;;
1F9C1;CUPCAKE;So;0;ON;;;;;N;;;;;
1F9C2;SALT SHAKER;So;0;ON;;;;;N;;;;;
+1F9C3;BEVERAGE BOX;So;0;ON;;;;;N;;;;;
+1F9C4;GARLIC;So;0;ON;;;;;N;;;;;
+1F9C5;ONION;So;0;ON;;;;;N;;;;;
+1F9C6;FALAFEL;So;0;ON;;;;;N;;;;;
+1F9C7;WAFFLE;So;0;ON;;;;;N;;;;;
+1F9C8;BUTTER;So;0;ON;;;;;N;;;;;
+1F9C9;MATE DRINK;So;0;ON;;;;;N;;;;;
+1F9CA;ICE CUBE;So;0;ON;;;;;N;;;;;
+1F9CD;STANDING PERSON;So;0;ON;;;;;N;;;;;
+1F9CE;KNEELING PERSON;So;0;ON;;;;;N;;;;;
+1F9CF;DEAF PERSON;So;0;ON;;;;;N;;;;;
1F9D0;FACE WITH MONOCLE;So;0;ON;;;;;N;;;;;
1F9D1;ADULT;So;0;ON;;;;;N;;;;;
1F9D2;CHILD;So;0;ON;;;;;N;;;;;
@@ -31383,6 +31832,90 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F9FD;SPONGE;So;0;ON;;;;;N;;;;;
1F9FE;RECEIPT;So;0;ON;;;;;N;;;;;
1F9FF;NAZAR AMULET;So;0;ON;;;;;N;;;;;
+1FA00;NEUTRAL CHESS KING;So;0;ON;;;;;N;;;;;
+1FA01;NEUTRAL CHESS QUEEN;So;0;ON;;;;;N;;;;;
+1FA02;NEUTRAL CHESS ROOK;So;0;ON;;;;;N;;;;;
+1FA03;NEUTRAL CHESS BISHOP;So;0;ON;;;;;N;;;;;
+1FA04;NEUTRAL CHESS KNIGHT;So;0;ON;;;;;N;;;;;
+1FA05;NEUTRAL CHESS PAWN;So;0;ON;;;;;N;;;;;
+1FA06;WHITE CHESS KNIGHT ROTATED FORTY-FIVE DEGREES;So;0;ON;;;;;N;;;;;
+1FA07;BLACK CHESS KNIGHT ROTATED FORTY-FIVE DEGREES;So;0;ON;;;;;N;;;;;
+1FA08;NEUTRAL CHESS KNIGHT ROTATED FORTY-FIVE DEGREES;So;0;ON;;;;;N;;;;;
+1FA09;WHITE CHESS KING ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA0A;WHITE CHESS QUEEN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA0B;WHITE CHESS ROOK ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA0C;WHITE CHESS BISHOP ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA0D;WHITE CHESS KNIGHT ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA0E;WHITE CHESS PAWN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA0F;BLACK CHESS KING ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA10;BLACK CHESS QUEEN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA11;BLACK CHESS ROOK ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA12;BLACK CHESS BISHOP ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA13;BLACK CHESS KNIGHT ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA14;BLACK CHESS PAWN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA15;NEUTRAL CHESS KING ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA16;NEUTRAL CHESS QUEEN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA17;NEUTRAL CHESS ROOK ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA18;NEUTRAL CHESS BISHOP ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA19;NEUTRAL CHESS KNIGHT ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA1A;NEUTRAL CHESS PAWN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA1B;WHITE CHESS KNIGHT ROTATED ONE HUNDRED THIRTY-FIVE DEGREES;So;0;ON;;;;;N;;;;;
+1FA1C;BLACK CHESS KNIGHT ROTATED ONE HUNDRED THIRTY-FIVE DEGREES;So;0;ON;;;;;N;;;;;
+1FA1D;NEUTRAL CHESS KNIGHT ROTATED ONE HUNDRED THIRTY-FIVE DEGREES;So;0;ON;;;;;N;;;;;
+1FA1E;WHITE CHESS TURNED KING;So;0;ON;;;;;N;;;;;
+1FA1F;WHITE CHESS TURNED QUEEN;So;0;ON;;;;;N;;;;;
+1FA20;WHITE CHESS TURNED ROOK;So;0;ON;;;;;N;;;;;
+1FA21;WHITE CHESS TURNED BISHOP;So;0;ON;;;;;N;;;;;
+1FA22;WHITE CHESS TURNED KNIGHT;So;0;ON;;;;;N;;;;;
+1FA23;WHITE CHESS TURNED PAWN;So;0;ON;;;;;N;;;;;
+1FA24;BLACK CHESS TURNED KING;So;0;ON;;;;;N;;;;;
+1FA25;BLACK CHESS TURNED QUEEN;So;0;ON;;;;;N;;;;;
+1FA26;BLACK CHESS TURNED ROOK;So;0;ON;;;;;N;;;;;
+1FA27;BLACK CHESS TURNED BISHOP;So;0;ON;;;;;N;;;;;
+1FA28;BLACK CHESS TURNED KNIGHT;So;0;ON;;;;;N;;;;;
+1FA29;BLACK CHESS TURNED PAWN;So;0;ON;;;;;N;;;;;
+1FA2A;NEUTRAL CHESS TURNED KING;So;0;ON;;;;;N;;;;;
+1FA2B;NEUTRAL CHESS TURNED QUEEN;So;0;ON;;;;;N;;;;;
+1FA2C;NEUTRAL CHESS TURNED ROOK;So;0;ON;;;;;N;;;;;
+1FA2D;NEUTRAL CHESS TURNED BISHOP;So;0;ON;;;;;N;;;;;
+1FA2E;NEUTRAL CHESS TURNED KNIGHT;So;0;ON;;;;;N;;;;;
+1FA2F;NEUTRAL CHESS TURNED PAWN;So;0;ON;;;;;N;;;;;
+1FA30;WHITE CHESS KNIGHT ROTATED TWO HUNDRED TWENTY-FIVE DEGREES;So;0;ON;;;;;N;;;;;
+1FA31;BLACK CHESS KNIGHT ROTATED TWO HUNDRED TWENTY-FIVE DEGREES;So;0;ON;;;;;N;;;;;
+1FA32;NEUTRAL CHESS KNIGHT ROTATED TWO HUNDRED TWENTY-FIVE DEGREES;So;0;ON;;;;;N;;;;;
+1FA33;WHITE CHESS KING ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;;
+1FA34;WHITE CHESS QUEEN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;;
+1FA35;WHITE CHESS ROOK ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;;
+1FA36;WHITE CHESS BISHOP ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;;
+1FA37;WHITE CHESS KNIGHT ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;;
+1FA38;WHITE CHESS PAWN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;;
+1FA39;BLACK CHESS KING ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;;
+1FA3A;BLACK CHESS QUEEN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;;
+1FA3B;BLACK CHESS ROOK ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;;
+1FA3C;BLACK CHESS BISHOP ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;;
+1FA3D;BLACK CHESS KNIGHT ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;;
+1FA3E;BLACK CHESS PAWN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;;
+1FA3F;NEUTRAL CHESS KING ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;;
+1FA40;NEUTRAL CHESS QUEEN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;;
+1FA41;NEUTRAL CHESS ROOK ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;;
+1FA42;NEUTRAL CHESS BISHOP ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;;
+1FA43;NEUTRAL CHESS KNIGHT ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;;
+1FA44;NEUTRAL CHESS PAWN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;;
+1FA45;WHITE CHESS KNIGHT ROTATED THREE HUNDRED FIFTEEN DEGREES;So;0;ON;;;;;N;;;;;
+1FA46;BLACK CHESS KNIGHT ROTATED THREE HUNDRED FIFTEEN DEGREES;So;0;ON;;;;;N;;;;;
+1FA47;NEUTRAL CHESS KNIGHT ROTATED THREE HUNDRED FIFTEEN DEGREES;So;0;ON;;;;;N;;;;;
+1FA48;WHITE CHESS EQUIHOPPER;So;0;ON;;;;;N;;;;;
+1FA49;BLACK CHESS EQUIHOPPER;So;0;ON;;;;;N;;;;;
+1FA4A;NEUTRAL CHESS EQUIHOPPER;So;0;ON;;;;;N;;;;;
+1FA4B;WHITE CHESS EQUIHOPPER ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA4C;BLACK CHESS EQUIHOPPER ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA4D;NEUTRAL CHESS EQUIHOPPER ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;;
+1FA4E;WHITE CHESS KNIGHT-QUEEN;So;0;ON;;;;;N;;;;;
+1FA4F;WHITE CHESS KNIGHT-ROOK;So;0;ON;;;;;N;;;;;
+1FA50;WHITE CHESS KNIGHT-BISHOP;So;0;ON;;;;;N;;;;;
+1FA51;BLACK CHESS KNIGHT-QUEEN;So;0;ON;;;;;N;;;;;
+1FA52;BLACK CHESS KNIGHT-ROOK;So;0;ON;;;;;N;;;;;
+1FA53;BLACK CHESS KNIGHT-BISHOP;So;0;ON;;;;;N;;;;;
1FA60;XIANGQI RED GENERAL;So;0;ON;;;;;N;;;;;
1FA61;XIANGQI RED MANDARIN;So;0;ON;;;;;N;;;;;
1FA62;XIANGQI RED ELEPHANT;So;0;ON;;;;;N;;;;;
@@ -31397,6 +31930,22 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1FA6B;XIANGQI BLACK CHARIOT;So;0;ON;;;;;N;;;;;
1FA6C;XIANGQI BLACK CANNON;So;0;ON;;;;;N;;;;;
1FA6D;XIANGQI BLACK SOLDIER;So;0;ON;;;;;N;;;;;
+1FA70;BALLET SHOES;So;0;ON;;;;;N;;;;;
+1FA71;ONE-PIECE SWIMSUIT;So;0;ON;;;;;N;;;;;
+1FA72;BRIEFS;So;0;ON;;;;;N;;;;;
+1FA73;SHORTS;So;0;ON;;;;;N;;;;;
+1FA78;DROP OF BLOOD;So;0;ON;;;;;N;;;;;
+1FA79;ADHESIVE BANDAGE;So;0;ON;;;;;N;;;;;
+1FA7A;STETHOSCOPE;So;0;ON;;;;;N;;;;;
+1FA80;YO-YO;So;0;ON;;;;;N;;;;;
+1FA81;KITE;So;0;ON;;;;;N;;;;;
+1FA82;PARACHUTE;So;0;ON;;;;;N;;;;;
+1FA90;RINGED PLANET;So;0;ON;;;;;N;;;;;
+1FA91;CHAIR;So;0;ON;;;;;N;;;;;
+1FA92;RAZOR;So;0;ON;;;;;N;;;;;
+1FA93;AXE;So;0;ON;;;;;N;;;;;
+1FA94;DIYA LAMP;So;0;ON;;;;;N;;;;;
+1FA95;BANJO;So;0;ON;;;;;N;;;;;
20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;;
2A6D6;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;;
2A700;<CJK Ideograph Extension C, First>;Lo;0;L;;;;;N;;;;;
diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/changes.txt b/Build/source/libs/icu/icu-src/source/data/unidata/changes.txt
index 8ec57e7675a..833868fb96d 100644
--- a/Build/source/libs/icu/icu-src/source/data/unidata/changes.txt
+++ b/Build/source/libs/icu/icu-src/source/data/unidata/changes.txt
@@ -49,6 +49,606 @@ For new script codes see http://www.unicode.org/iso15924/codechanges.html
---------------------------------------------------------------------------- ***
+Unicode 12.1 update for ICU 64.2
+
+** This is an abbreviated update with one new character for the new
+** Japanese era expected to start on 2019-May-01: U+32FF SQUARE ERA NAME REIWA
+https://en.wikipedia.org/wiki/Reiwa_period
+
+http://www.unicode.org/versions/Unicode12.1.0/
+
+ICU-20497 Unicode 12.1
+
+cldrbug 11978: Unicode 12.1
+
+* Command-line environment setup
+
+UNICODE_DATA=~/unidata/uni121/20190403
+CLDR_SRC=~/svn.cldr/uni
+ICU_ROOT=~/icu/uni
+ICU_SRC=$ICU_ROOT/src
+ICUDT=icudt64b
+ICU4C_DATA_IN=$ICU_SRC/icu4c/source/data/in
+ICU4C_UNIDATA=$ICU_SRC/icu4c/source/data/unidata
+export LD_LIBRARY_PATH=$ICU_ROOT/dbg/icu4c/lib
+
+*** Unicode version numbers
+- makedata.mak
+- uchar.h
+- com.ibm.icu.util.VersionInfo
+- com.ibm.icu.dev.test.lang.UCharacterTest.VERSION_
+
+- Run ICU4C "configure" _after_ updating the Unicode version number in uchar.h
+ so that the makefiles see the new version number.
+ cd $ICU_ROOT/dbg/icu4c
+ ICU_DATA_BUILDTOOL_OPTS=--include_uni_core_data ../../../doconfig-clang-dbg.sh
+
+*** data files & enums & parser code
+
+* download files
+- mkdir -p $UNICODE_DATA
+- download Unicode files into $UNICODE_DATA
+ + subfolders: emoji, idna, security, ucd, uca
+ + inside ucd: extract Unihan.zip to "here" (.../ucd/Unihan/*.txt), delete Unihan.zip
+
+* for manual diffs and for Unicode Tools input data updates:
+ remove version suffixes from the file names
+ ~$ unidata/desuffixucd.py $UNICODE_DATA
+ (see https://sites.google.com/site/unicodetools/inputdata)
+
+* process and/or copy files
+- $ICU_SRC/tools/unicode$ py/preparseucd.py $UNICODE_DATA $ICU_SRC
+ + This writes files (especially ppucd.txt) to the ICU4C unidata and testdata subfolders.
+ + For debugging, and tweaking how ppucd.txt is written,
+ the tool has an --only_ppucd option:
+ py/preparseucd.py $UNICODE_DATA --only_ppucd path/to/ppucd/outputfile
+
+- cp -v $UNICODE_DATA/security/confusables.txt $ICU4C_UNIDATA
+
+* build ICU (make install)
+ so that the tools build can pick up the new definitions from the installed header files.
+
+ $ICU_ROOT/dbg/icu4c$ echo;echo; date; make -j7 install &> out.txt ; tail -n 30 out.txt ; date
+
+* update spoof checker UnicodeSet initializers:
+ inclusionPat & recommendedPat in uspoof.cpp
+ INCLUSION & RECOMMENDED in SpoofChecker.java
+- make sure that the Unicode Tools tree contains the latest security data files
+- go to Unicode Tools org.unicode.text.tools.RecommendedSetGenerator
+- update the hardcoded version number there in the DIRECTORY path
+- run the tool (no special environment variables needed)
+- copy & paste from the Console output into the .cpp & .java files
+
+* generate normalization data files
+ cd $ICU_ROOT/dbg/icu4c
+ bin/gennorm2 -o $ICU_SRC/icu4c/source/common/norm2_nfc_data.h -s $ICU4C_UNIDATA/norm2 nfc.txt --csource
+ bin/gennorm2 -o $ICU4C_DATA_IN/nfc.nrm -s $ICU4C_UNIDATA/norm2 nfc.txt
+ bin/gennorm2 -o $ICU4C_DATA_IN/nfkc.nrm -s $ICU4C_UNIDATA/norm2 nfc.txt nfkc.txt
+ bin/gennorm2 -o $ICU4C_DATA_IN/nfkc_cf.nrm -s $ICU4C_UNIDATA/norm2 nfc.txt nfkc.txt nfkc_cf.txt
+ bin/gennorm2 -o $ICU4C_DATA_IN/uts46.nrm -s $ICU4C_UNIDATA/norm2 nfc.txt uts46.txt
+
+* build ICU (make install)
+ so that the tools build can pick up the new definitions from the installed header files.
+
+ $ICU_ROOT/dbg/icu4c$ echo;echo; make -j7 install &> out.txt ; tail -n 30 out.txt ; date
+
+* build Unicode tools using CMake+make
+
+$ICU_SRC/tools/unicode/c/icudefs.txt:
+
+# Location (--prefix) of where ICU was installed.
+set(ICU_INST_DIR /usr/local/google/home/mscherer/icu/mine/inst/icu4c)
+# Location of the ICU4C source tree.
+set(ICU4C_SRC_DIR /usr/local/google/home/mscherer/icu/uni/src/icu4c)
+
+ $ICU_ROOT/dbg$
+ mkdir -p tools/unicode/c
+ cd tools/unicode/c
+
+ $ICU_ROOT/dbg/tools/unicode/c$
+ cmake ../../../../src/tools/unicode/c
+ make
+
+* generate core properties data files
+ $ICU_ROOT/dbg/tools/unicode/c$
+ genprops/genprops $ICU_SRC/icu4c
+ genuca/genuca --hanOrder implicit $ICU_SRC/icu4c && \
+ genuca/genuca --hanOrder radical-stroke $ICU_SRC/icu4c
+- rebuild ICU (make install) & tools
+
+* update uts46test.cpp and UTS46Test.java if there are new characters that are equivalent to
+ sequences with non-LDH ASCII (that is, their decompositions contain '=' or similar)
+- grep IdnaMappingTable.txt or uts46.txt for "disallowed_STD3_valid" on non-ASCII characters
+- Unicode 6.0..12.1: U+2260, U+226E, U+226F
+- nothing new in this Unicode version, no test file to update
+
+* run & fix ICU4C tests
+- Andy handles RBBI & spoof check test failures
+
+* collation: CLDR collation root, UCA DUCET
+
+- UCA DUCET goes into Mark's Unicode tools, see
+ https://sites.google.com/site/unicodetools/home#TOC-UCA
+ diff the main mapping file, look for bad changes
+ (for example, more bytes per weight for common characters)
+ ~/svn.unitools/trunk$ sed -r -f ~/svn.cldr/uni/tools/scripts/uca/blankweights.sed ../Generated/UCA/12.1.0/CollationAuxiliary/FractionalUCA.txt > ../frac-12.1.txt
+ ~/svn.unitools/trunk$ meld ../frac-12.txt ../frac-12.1.txt
+
+- CLDR root data files are checked into $CLDR_SRC/common/uca/
+ cp (Unicode Tools UCA generated)/CollationAuxiliary/* $CLDR_SRC/common/uca/
+
+- update source/data/unidata/FractionalUCA.txt with FractionalUCA_SHORT.txt
+ cp -v $CLDR_SRC/common/uca/FractionalUCA_SHORT.txt $ICU4C_UNIDATA/FractionalUCA.txt
+- update source/data/unidata/UCARules.txt with UCA_Rules_SHORT.txt
+ cp -v $ICU4C_UNIDATA/UCARules.txt /tmp/UCARules-old.txt
+ (note removing the underscore before "Rules")
+ cp -v $CLDR_SRC/common/uca/UCA_Rules_SHORT.txt $ICU4C_UNIDATA/UCARules.txt
+- restore TODO diffs in UCARules.txt
+ meld /tmp/UCARules-old.txt $ICU4C_UNIDATA/UCARules.txt
+- update (ICU4C)/source/test/testdata/CollationTest_*.txt
+ and (ICU4J)/main/tests/collate/src/com/ibm/icu/dev/data/CollationTest_*.txt
+ from the CLDR root files (..._CLDR_..._SHORT.txt)
+ cp -v $CLDR_SRC/common/uca/CollationTest_CLDR_NON_IGNORABLE_SHORT.txt $ICU_SRC/icu4c/source/test/testdata/CollationTest_NON_IGNORABLE_SHORT.txt
+ cp -v $CLDR_SRC/common/uca/CollationTest_CLDR_SHIFTED_SHORT.txt $ICU_SRC/icu4c/source/test/testdata/CollationTest_SHIFTED_SHORT.txt
+ cp -v $ICU_SRC/icu4c/source/test/testdata/CollationTest_*.txt $ICU_SRC/icu4j/main/tests/collate/src/com/ibm/icu/dev/data
+- if CLDR common/uca/unihan-index.txt changes, then update
+ CLDR common/collation/root.xml <collation type="private-unihan">
+ and regenerate (or update in parallel) $ICU_SRC/icu4c/source/data/coll/root.txt
+
+- run genuca, see command line above
+- rebuild ICU4C
+
+* Unihan collators
+ https://sites.google.com/site/unicodetools/unihan
+- run Unicode Tools
+ org.unicode.draft.GenerateUnihanCollators
+ with VM arguments
+ -ea
+ -DSVN_WORKSPACE=/usr/local/google/home/mscherer/svn.unitools/trunk
+ -DOTHER_WORKSPACE=/usr/local/google/home/mscherer/svn.unitools
+ -DUCD_DIR=/usr/local/google/home/mscherer/svn.unitools/trunk/data
+ -DCLDR_DIR=/usr/local/google/home/mscherer/svn.cldr/uni
+ -DUVERSION=12.1.0
+- run Unicode Tools
+ org.unicode.draft.GenerateUnihanCollatorFiles
+ with the same arguments
+- check CLDR diffs
+ cd $CLDR_SRC
+ meld common/collation/zh.xml ../Generated/cldr/han/replace/zh.xml
+ meld common/transforms/Han-Latin.xml ../Generated/cldr/han/replace/Han-Latin.xml
+- copy to CLDR
+ cd $CLDR_SRC
+ cp ../Generated/cldr/han/replace/zh.xml common/collation/zh.xml
+ cp ../Generated/cldr/han/replace/Han-Latin.xml common/transforms/Han-Latin.xml
+- run CLDR unit tests, commit to CLDR
+- generate ICU zh collation data: run CLDR
+ org.unicode.cldr.icu.NewLdml2IcuConverter
+ with program arguments
+ -t collation
+ -s /usr/local/google/home/mscherer/svn.cldr/uni/common/collation
+ -m /usr/local/google/home/mscherer/svn.cldr/uni/common/supplemental
+ -d /usr/local/google/home/mscherer/icu/uni/src/icu4c/source/data/coll
+ -p /usr/local/google/home/mscherer/icu/uni/src/icu4c/source/data/xml/collation
+ zh
+ and VM arguments
+ -ea
+ -DCLDR_DIR=/usr/local/google/home/mscherer/svn.cldr/uni
+- rebuild ICU4C
+
+* run & fix ICU4C tests, now with new CLDR collation root data
+- run all tests with the collation test data *_SHORT.txt or the full files
+ (the full ones have comments, useful for debugging)
+- note on intltest: if collate/UCAConformanceTest fails, then
+ utility/MultithreadTest/TestCollators will fail as well;
+ fix the conformance test before looking into the multi-thread test
+
+* update Java data files
+- refresh just the UCD/UCA-related/derived files, just to be safe
+- see (ICU4C)/source/data/icu4j-readme.txt
+- mkdir -p /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT
+- $ICU_ROOT/dbg/icu4c$ make ICU4J_ROOT=/tmp/icu4j icu4j-data-install
+ output:
+ ...
+ make[1]: Entering directory '/usr/local/google/home/mscherer/icu/uni/dbg/icu4c/data'
+ mkdir -p ./out/icu4j/com/ibm/icu/impl/data/icudt64b
+ mkdir -p ./out/icu4j/tzdata/com/ibm/icu/impl/data/icudt64b
+ LD_LIBRARY_PATH=../lib:../stubdata:../tools/ctestfw:$LD_LIBRARY_PATH ../bin/icupkg ./out/tmp/icudt64l.dat ./out/icu4j/icudt64b.dat -s ./out/build/icudt64l -x '*' -tb -d ./out/icu4j/com/ibm/icu/impl/data/icudt64b
+ mv ./out/icu4j/"com/ibm/icu/impl/data/icudt64b/zoneinfo64.res" ./out/icu4j/"com/ibm/icu/impl/data/icudt64b/metaZones.res" ./out/icu4j/"com/ibm/icu/impl/data/icudt64b/timezoneTypes.res" ./out/icu4j/"com/ibm/icu/impl/data/icudt64b/windowsZones.res" "./out/icu4j/tzdata/com/ibm/icu/impl/data/icudt64b"
+ jar cf ./out/icu4j/icudata.jar -C ./out/icu4j com/ibm/icu/impl/data/icudt64b/
+ mkdir -p /tmp/icu4j/main/shared/data
+ cp ./out/icu4j/icudata.jar /tmp/icu4j/main/shared/data
+ jar cf ./out/icu4j/icutzdata.jar -C ./out/icu4j/tzdata com/ibm/icu/impl/data/icudt64b/
+ mkdir -p /tmp/icu4j/main/shared/data
+ cp ./out/icu4j/icutzdata.jar /tmp/icu4j/main/shared/data
+ make[1]: Leaving directory '/usr/local/google/home/mscherer/icu/uni/dbg/icu4c/data'
+- copy the big-endian Unicode data files to another location,
+ separate from the other data files,
+ and then refresh ICU4J
+ cd $ICU_ROOT/dbg/icu4c/data/out/icu4j
+ mkdir -p /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT/coll
+ mkdir -p /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT/brkitr
+ cp -v com/ibm/icu/impl/data/$ICUDT/confusables.cfu /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT
+ cp -v com/ibm/icu/impl/data/$ICUDT/*.icu /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT
+ rm /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT/cnvalias.icu
+ cp -v com/ibm/icu/impl/data/$ICUDT/*.nrm /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT
+ cp -v com/ibm/icu/impl/data/$ICUDT/coll/* /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT/coll
+ cp -v com/ibm/icu/impl/data/$ICUDT/brkitr/* /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT/brkitr
+ jar uvf $ICU_SRC/icu4j/main/shared/data/icudata.jar -C /tmp/icu4j com/ibm/icu/impl/data/$ICUDT
+
+* When refreshing all of ICU4J data from ICU4C
+- $ICU_ROOT/dbg/icu4c$ make ICU4J_ROOT=/tmp/icu4j icu4j-data-install
+- cp /tmp/icu4j/main/shared/data/icudata.jar $ICU_SRC/icu4j/main/shared/data
+or
+- $ICU_ROOT/dbg/icu4c$ make ICU4J_ROOT=$ICU_SRC/icu4j icu4j-data-install
+
+* update CollationFCD.java
+ + copy & paste the initializers of lcccIndex[] etc. from
+ ICU4C/source/i18n/collationfcd.cpp to
+ ICU4J/main/classes/collate/src/com/ibm/icu/impl/coll/CollationFCD.java
+
+* refresh Java test .txt files
+- copy new .txt files into ICU4J's main/tests/core/src/com/ibm/icu/dev/data/unicode
+ cd $ICU_SRC/icu4c/source/data/unidata
+ cp -v confusables.txt confusablesWholeScript.txt NormalizationCorrections.txt NormalizationTest.txt SpecialCasing.txt UnicodeData.txt $ICU_SRC/icu4j/main/tests/core/src/com/ibm/icu/dev/data/unicode
+ cd ../../test/testdata
+ cp -v BidiCharacterTest.txt BidiTest.txt IdnaTestV2.txt $ICU_SRC/icu4j/main/tests/core/src/com/ibm/icu/dev/data/unicode
+ cp -v $UNICODE_DATA/ucd/CompositionExclusions.txt $ICU_SRC/icu4j/main/tests/core/src/com/ibm/icu/dev/data/unicode
+
+* run & fix ICU4J tests
+
+*** API additions
+- send notice to icu-design about new born-@stable API (enum constants etc.)
+
+*** CLDR numbering systems
+- look for new sets of decimal digits (gc=ND & nv=4) and add to CLDR
+ for example, look for
+ ~/icu/uni/src$ egrep ';gc=Nd.+;nv=4' icu4c/source/data/unidata/ppucd.txt
+ in new blocks (Blocks.txt)
+ Unicode 12: using Unicode 12 CLDR ticket #11478
+ hmnp 1E140..1E149 Nyiakeng_Puachue_Hmong
+ wcho 1E2F0..1E2F9 Wancho
+ Unicode 11: using Unicode 11 CLDR ticket #10978
+ rohg 10D30..10D39 Hanifi_Rohingya
+ gong 11DA0..11DA9 Gunjala_Gondi
+ Earlier: CLDR tickets specific to adding new numbering systems.
+ Unicode 10: http://unicode.org/cldr/trac/ticket/10219
+ Unicode 9: http://unicode.org/cldr/trac/ticket/9692
+
+*** merge the Unicode update branches back onto the trunk
+- do not merge the icudata.jar and testdata.jar,
+ instead rebuild them from merged & tested ICU4C
+- make sure that changes to Unicode tools are checked in:
+ http://www.unicode.org/utility/trac/log/trunk/unicodetools
+
+---------------------------------------------------------------------------- ***
+
+Unicode 12.0 update for ICU 64
+
+http://www.unicode.org/versions/Unicode12.0.0/
+http://unicode.org/versions/beta-12.0.0.html
+https://www.unicode.org/review/pri389/
+http://www.unicode.org/reports/uax-proposed-updates.html
+http://www.unicode.org/reports/tr44/tr44-23.html
+
+ICU-20203 Unicode 12
+
+ICU-20111 move text layout properties data into a data file
+
+cldrbug 11478: Unicode 12
+Accidentally used ^/trunk instead of ^/branches/markus/uni12
+
+* Command-line environment setup
+
+UNICODE_DATA=~/unidata/uni12/20190309
+CLDR_SRC=~/svn.cldr/uni
+ICU_ROOT=~/icu/uni
+ICU_SRC=$ICU_ROOT/src
+ICUDT=icudt63b
+ICU4C_DATA_IN=$ICU_SRC/icu4c/source/data/in
+ICU4C_UNIDATA=$ICU_SRC/icu4c/source/data/unidata
+export LD_LIBRARY_PATH=$ICU_ROOT/dbg/icu4c/lib
+
+*** Unicode version numbers
+- makedata.mak
+- uchar.h
+- com.ibm.icu.util.VersionInfo
+- com.ibm.icu.dev.test.lang.UCharacterTest.VERSION_
+
+- Run ICU4C "configure" _after_ updating the Unicode version number in uchar.h
+ so that the makefiles see the new version number.
+
+*** data files & enums & parser code
+
+* download files
+- mkdir -p $UNICODE_DATA
+- download Unicode files into $UNICODE_DATA
+ + subfolders: emoji, idna, security, ucd, uca
+ + inside ucd: extract Unihan.zip to "here" (.../ucd/Unihan/*.txt), delete Unihan.zip
+
+* for manual diffs and for Unicode Tools input data updates:
+ remove version suffixes from the file names
+ ~$ unidata/desuffixucd.py $UNICODE_DATA
+ (see https://sites.google.com/site/unicodetools/inputdata)
+
+* process and/or copy files
+- $ICU_SRC/tools/unicode$ py/preparseucd.py $UNICODE_DATA $ICU_SRC
+ + This writes files (especially ppucd.txt) to the ICU4C unidata and testdata subfolders.
+ + For debugging, and tweaking how ppucd.txt is written,
+ the tool has an --only_ppucd option:
+ py/preparseucd.py $UNICODE_DATA --only_ppucd path/to/ppucd/outputfile
+
+- cp $UNICODE_DATA/security/confusables.txt $ICU4C_UNIDATA
+
+* build ICU (make install)
+ so that the tools build can pick up the new definitions from the installed header files.
+
+ $ICU_ROOT/dbg/icu4c$ echo;echo; date; make -j7 install &> out.txt ; tail -n 30 out.txt ; date
+
+* new constants for new property values
+- preparseucd.py error:
+ ValueError: missing uchar.h enum constants for some property values:
+ [(u'blk', set([u'Symbols_And_Pictographs_Ext_A', u'Elymaic',
+ u'Ottoman_Siyaq_Numbers', u'Nandinagari', u'Nyiakeng_Puachue_Hmong',
+ u'Small_Kana_Ext', u'Egyptian_Hieroglyph_Format_Controls', u'Wancho', u'Tamil_Sup'])),
+ (u'sc', set([u'Nand', u'Wcho', u'Elym', u'Hmnp']))]
+ = PropertyValueAliases.txt new property values (diff old & new .txt files)
+ blk; Egyptian_Hieroglyph_Format_Controls; Egyptian_Hieroglyph_Format_Controls
+ blk; Elymaic ; Elymaic
+ blk; Nandinagari ; Nandinagari
+ blk; Nyiakeng_Puachue_Hmong ; Nyiakeng_Puachue_Hmong
+ blk; Ottoman_Siyaq_Numbers ; Ottoman_Siyaq_Numbers
+ blk; Small_Kana_Ext ; Small_Kana_Extension
+ blk; Symbols_And_Pictographs_Ext_A ; Symbols_And_Pictographs_Extended_A
+ blk; Tamil_Sup ; Tamil_Supplement
+ blk; Wancho ; Wancho
+ -> add to uchar.h
+ use long property names for enum constants,
+ for the trailing comment get the block start code point: diff old & new Blocks.txt
+ -> add to UCharacter.UnicodeBlock IDs
+ Eclipse find UBLOCK_([^ ]+) = ([0-9]+), (/.+)
+ replace public static final int \1_ID = \2; \3
+ -> add to UCharacter.UnicodeBlock objects
+ Eclipse find UBLOCK_([^ ]+) = [0-9]+, (/.+)
+ replace public static final UnicodeBlock \1 = new UnicodeBlock("\1", \1_ID); \3
+
+ sc ; Elym ; Elymaic
+ sc ; Hmnp ; Nyiakeng_Puachue_Hmong
+ sc ; Nand ; Nandinagari
+ sc ; Wcho ; Wancho
+ -> uscript.h & com.ibm.icu.lang.UScript
+ -> fix expectedLong names in cucdapi.c/TestUScriptCodeAPI()
+ and in com.ibm.icu.dev.test.lang.TestUScript.java
+
+* update Script metadata: SCRIPT_PROPS[] in uscript_props.cpp & UScript.ScriptMetadata
+ (not strictly necessary for NOT_ENCODED scripts)
+ $ICU_SRC/tools/unicode$ py/parsescriptmetadata.py $ICU_SRC/icu4c/source/common/unicode/uscript.h $CLDR_SRC/common/properties/scriptMetadata.txt
+
+* update spoof checker UnicodeSet initializers:
+ inclusionPat & recommendedPat in uspoof.cpp
+ INCLUSION & RECOMMENDED in SpoofChecker.java
+- make sure that the Unicode Tools tree contains the latest security data files
+- go to Unicode Tools org.unicode.text.tools.RecommendedSetGenerator
+- update the hardcoded version number there in the DIRECTORY path
+- run the tool (no special environment variables needed)
+- copy & paste from the Console output into the .cpp & .java files
+
+* generate normalization data files
+ cd $ICU_ROOT/dbg/icu4c
+ bin/gennorm2 -o $ICU_SRC/icu4c/source/common/norm2_nfc_data.h -s $ICU4C_UNIDATA/norm2 nfc.txt --csource
+ bin/gennorm2 -o $ICU4C_DATA_IN/nfc.nrm -s $ICU4C_UNIDATA/norm2 nfc.txt
+ bin/gennorm2 -o $ICU4C_DATA_IN/nfkc.nrm -s $ICU4C_UNIDATA/norm2 nfc.txt nfkc.txt
+ bin/gennorm2 -o $ICU4C_DATA_IN/nfkc_cf.nrm -s $ICU4C_UNIDATA/norm2 nfc.txt nfkc.txt nfkc_cf.txt
+ bin/gennorm2 -o $ICU4C_DATA_IN/uts46.nrm -s $ICU4C_UNIDATA/norm2 nfc.txt uts46.txt
+
+* build ICU (make install)
+ so that the tools build can pick up the new definitions from the installed header files.
+
+ $ICU_ROOT/dbg/icu4c$ echo;echo; make -j7 install &> out.txt ; tail -n 30 out.txt ; date
+
+* build Unicode tools using CMake+make
+
+$ICU_SRC/tools/unicode/c/icudefs.txt:
+
+# Location (--prefix) of where ICU was installed.
+set(ICU_INST_DIR /usr/local/google/home/mscherer/icu/mine/inst/icu4c)
+# Location of the ICU4C source tree.
+set(ICU4C_SRC_DIR /usr/local/google/home/mscherer/icu/uni/src/icu4c)
+
+ $ICU_ROOT/dbg$
+ mkdir -p tools/unicode/c
+ cd tools/unicode/c
+
+ $ICU_ROOT/dbg/tools/unicode/c$
+ cmake ../../../../src/tools/unicode/c
+ make
+
+* generate core properties data files
+ $ICU_ROOT/dbg/tools/unicode/c$
+ genprops/genprops $ICU_SRC/icu4c
+ genuca/genuca --hanOrder implicit $ICU_SRC/icu4c && \
+ genuca/genuca --hanOrder radical-stroke $ICU_SRC/icu4c
+- rebuild ICU (make install) & tools
+
+* update uts46test.cpp and UTS46Test.java if there are new characters that are equivalent to
+ sequences with non-LDH ASCII (that is, their decompositions contain '=' or similar)
+- grep IdnaMappingTable.txt or uts46.txt for "disallowed_STD3_valid" on non-ASCII characters
+- Unicode 6.0..12.0: U+2260, U+226E, U+226F
+- nothing new in this Unicode version, no test file to update
+
+* run & fix ICU4C tests
+- update test of default bidi classes:
+ Bidi range \U0001ED00-\U0001ED4F changes default from R to AL,
+ see diffs in DerivedBidiClass.txt
+ + /tsutil/cucdtst/TestUnicodeData enumDefaultsRange() defaultBidi[]
+ + UCharacterTest.java TestIteration() defaultBidi[]
+- Andy handles RBBI & spoof check test failures
+
+* collation: CLDR collation root, UCA DUCET
+
+- UCA DUCET goes into Mark's Unicode tools, see
+ https://sites.google.com/site/unicodetools/home#TOC-UCA
+ diff the main mapping file, look for bad changes
+ (for example, more bytes per weight for common characters)
+ ~/svn.unitools/trunk$ sed -r -f ~/svn.cldr/uni/tools/scripts/uca/blankweights.sed ../Generated/UCA/12.0.0/CollationAuxiliary/FractionalUCA.txt > ../frac-12.txt
+ ~/svn.unitools/trunk$ meld ../frac-11.txt ../frac-12.txt
+
+- CLDR root data files are checked into $CLDR_SRC/common/uca/
+ cp (Unicode Tools UCA generated)/CollationAuxiliary/* $CLDR_SRC/common/uca/
+
+- update source/data/unidata/FractionalUCA.txt with FractionalUCA_SHORT.txt
+ cp $CLDR_SRC/common/uca/FractionalUCA_SHORT.txt $ICU4C_UNIDATA/FractionalUCA.txt
+- update source/data/unidata/UCARules.txt with UCA_Rules_SHORT.txt
+ cp $ICU4C_UNIDATA/UCARules.txt /tmp/UCARules-old.txt
+ (note removing the underscore before "Rules")
+ cp $CLDR_SRC/common/uca/UCA_Rules_SHORT.txt $ICU4C_UNIDATA/UCARules.txt
+- restore TODO diffs in UCARules.txt
+ meld /tmp/UCARules-old.txt $ICU4C_UNIDATA/UCARules.txt
+- update (ICU4C)/source/test/testdata/CollationTest_*.txt
+ and (ICU4J)/main/tests/collate/src/com/ibm/icu/dev/data/CollationTest_*.txt
+ from the CLDR root files (..._CLDR_..._SHORT.txt)
+ cp $CLDR_SRC/common/uca/CollationTest_CLDR_NON_IGNORABLE_SHORT.txt $ICU_SRC/icu4c/source/test/testdata/CollationTest_NON_IGNORABLE_SHORT.txt
+ cp $CLDR_SRC/common/uca/CollationTest_CLDR_SHIFTED_SHORT.txt $ICU_SRC/icu4c/source/test/testdata/CollationTest_SHIFTED_SHORT.txt
+ cp $ICU_SRC/icu4c/source/test/testdata/CollationTest_*.txt $ICU_SRC/icu4j/main/tests/collate/src/com/ibm/icu/dev/data
+- if CLDR common/uca/unihan-index.txt changes, then update
+ CLDR common/collation/root.xml <collation type="private-unihan">
+ and regenerate (or update in parallel) $ICU_SRC/icu4c/source/data/coll/root.txt
+
+- run genuca, see command line above;
+ deal with
+ Error: Unknown script for first-primary sample character U+119CE on line 29233 of /usr/local/google/home/mscherer/icu/uni/src/icu4c/source/data/unidata/FractionalUCA.txt:
+ FDD1 119CE; [71 CD 02, 05, 05] # Nandinagari first primary (compressible)
+ (add the character to genuca.cpp sampleCharsToScripts[])
+ + This time, I added code to genuca.cpp to use uscript_getSampleUnicodeString(script)
+ and cache its values.
+ Works as long as the script metadata is updated before the collation data.
+- rebuild ICU4C
+
+* Unihan collators
+ https://sites.google.com/site/unicodetools/unihan
+- run Unicode Tools
+ org.unicode.draft.GenerateUnihanCollators
+ with VM arguments
+ -ea
+ -DSVN_WORKSPACE=/usr/local/google/home/mscherer/svn.unitools/trunk
+ -DOTHER_WORKSPACE=/usr/local/google/home/mscherer/svn.unitools
+ -DUCD_DIR=/usr/local/google/home/mscherer/svn.unitools/trunk/data
+ -DCLDR_DIR=/usr/local/google/home/mscherer/svn.cldr/uni
+ -DUVERSION=12.0.0
+- run Unicode Tools
+ org.unicode.draft.GenerateUnihanCollatorFiles
+ with the same arguments
+- check CLDR diffs
+ cd $CLDR_SRC
+ meld common/collation/zh.xml ../Generated/cldr/han/replace/zh.xml
+ meld common/transforms/Han-Latin.xml ../Generated/cldr/han/replace/Han-Latin.xml
+- copy to CLDR
+ cd $CLDR_SRC
+ cp ../Generated/cldr/han/replace/zh.xml common/collation/zh.xml
+ cp ../Generated/cldr/han/replace/Han-Latin.xml common/transforms/Han-Latin.xml
+- run CLDR unit tests, commit to CLDR
+- generate ICU zh collation data: run CLDR
+ org.unicode.cldr.icu.NewLdml2IcuConverter
+ with program arguments
+ -t collation
+ -s /usr/local/google/home/mscherer/svn.cldr/uni/common/collation
+ -m /usr/local/google/home/mscherer/svn.cldr/uni/common/supplemental
+ -d /usr/local/google/home/mscherer/icu/uni/src/icu4c/source/data/coll
+ -p /usr/local/google/home/mscherer/icu/uni/src/icu4c/source/data/xml/collation
+ zh
+ and VM arguments
+ -ea
+ -DCLDR_DIR=/usr/local/google/home/mscherer/svn.cldr/uni
+- rebuild ICU4C
+
+* run & fix ICU4C tests, now with new CLDR collation root data
+- run all tests with the collation test data *_SHORT.txt or the full files
+ (the full ones have comments, useful for debugging)
+- note on intltest: if collate/UCAConformanceTest fails, then
+ utility/MultithreadTest/TestCollators will fail as well;
+ fix the conformance test before looking into the multi-thread test
+
+* update Java data files
+- refresh just the UCD/UCA-related/derived files, just to be safe
+- see (ICU4C)/source/data/icu4j-readme.txt
+- mkdir -p /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT
+- $ICU_ROOT/dbg/icu4c$ make ICU4J_ROOT=/tmp/icu4j icu4j-data-install
+ output:
+ ...
+ Unicode .icu files built to ./out/build/icudt63l
+ echo timestamp > uni-core-data
+ mkdir -p ./out/icu4j/com/ibm/icu/impl/data/icudt63b
+ mkdir -p ./out/icu4j/tzdata/com/ibm/icu/impl/data/icudt63b
+ echo pnames.icu uprops.icu ucase.icu ubidi.icu nfc.nrm > ./out/icu4j/add.txt
+ LD_LIBRARY_PATH=../lib:../stubdata:../tools/ctestfw:$LD_LIBRARY_PATH ../bin/icupkg ./out/tmp/icudt63l.dat ./out/icu4j/icudt63b.dat -a ./out/icu4j/add.txt -s ./out/build/icudt63l -x '*' -tb -d ./out/icu4j/com/ibm/icu/impl/data/icudt63b
+ mv ./out/icu4j/"com/ibm/icu/impl/data/icudt63b/zoneinfo64.res" ./out/icu4j/"com/ibm/icu/impl/data/icudt63b/metaZones.res" ./out/icu4j/"com/ibm/icu/impl/data/icudt63b/timezoneTypes.res" ./out/icu4j/"com/ibm/icu/impl/data/icudt63b/windowsZones.res" "./out/icu4j/tzdata/com/ibm/icu/impl/data/icudt63b"
+ jar cf ./out/icu4j/icudata.jar -C ./out/icu4j com/ibm/icu/impl/data/icudt63b/
+ mkdir -p /tmp/icu4j/main/shared/data
+ cp ./out/icu4j/icudata.jar /tmp/icu4j/main/shared/data
+ jar cf ./out/icu4j/icutzdata.jar -C ./out/icu4j/tzdata com/ibm/icu/impl/data/icudt63b/
+ mkdir -p /tmp/icu4j/main/shared/data
+ cp ./out/icu4j/icutzdata.jar /tmp/icu4j/main/shared/data
+ make[1]: Leaving directory '/usr/local/google/home/mscherer/icu/uni/dbg/icu4c/data'
+- copy the big-endian Unicode data files to another location,
+ separate from the other data files,
+ and then refresh ICU4J
+ cd $ICU_ROOT/dbg/icu4c/data/out/icu4j
+ mkdir -p /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT/coll
+ mkdir -p /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT/brkitr
+ cp -v com/ibm/icu/impl/data/$ICUDT/confusables.cfu /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT
+ cp -v com/ibm/icu/impl/data/$ICUDT/*.icu /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT
+ rm /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT/cnvalias.icu
+ cp -v com/ibm/icu/impl/data/$ICUDT/*.nrm /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT
+ cp -v com/ibm/icu/impl/data/$ICUDT/coll/* /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT/coll
+ cp -v com/ibm/icu/impl/data/$ICUDT/brkitr/* /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT/brkitr
+ jar uvf $ICU_SRC/icu4j/main/shared/data/icudata.jar -C /tmp/icu4j com/ibm/icu/impl/data/$ICUDT
+
+* When refreshing all of ICU4J data from ICU4C
+- $ICU_ROOT/dbg/icu4c$ make ICU4J_ROOT=/tmp/icu4j icu4j-data-install
+- cp /tmp/icu4j/main/shared/data/icudata.jar $ICU_SRC/icu4j/main/shared/data
+or
+- $ICU_ROOT/dbg/icu4c$ make ICU4J_ROOT=$ICU_SRC/icu4j icu4j-data-install
+
+* update CollationFCD.java
+ + copy & paste the initializers of lcccIndex[] etc. from
+ ICU4C/source/i18n/collationfcd.cpp to
+ ICU4J/main/classes/collate/src/com/ibm/icu/impl/coll/CollationFCD.java
+
+* refresh Java test .txt files
+- copy new .txt files into ICU4J's main/tests/core/src/com/ibm/icu/dev/data/unicode
+ cd $ICU_SRC/icu4c/source/data/unidata
+ cp confusables.txt confusablesWholeScript.txt NormalizationCorrections.txt NormalizationTest.txt SpecialCasing.txt UnicodeData.txt $ICU_SRC/icu4j/main/tests/core/src/com/ibm/icu/dev/data/unicode
+ cd ../../test/testdata
+ cp BidiCharacterTest.txt BidiTest.txt IdnaTestV2.txt $ICU_SRC/icu4j/main/tests/core/src/com/ibm/icu/dev/data/unicode
+ cp $UNICODE_DATA/ucd/CompositionExclusions.txt $ICU_SRC/icu4j/main/tests/core/src/com/ibm/icu/dev/data/unicode
+
+* run & fix ICU4J tests
+
+*** API additions
+- send notice to icu-design about new born-@stable API (enum constants etc.)
+
+*** CLDR numbering systems
+- look for new sets of decimal digits (gc=ND & nv=4) and add to CLDR
+ for example, look for
+ ~/icu/uni/src$ egrep ';gc=Nd.+;nv=4' icu4c/source/data/unidata/ppucd.txt
+ in new blocks (Blocks.txt)
+ Unicode 12: using Unicode 12 CLDR ticket #11478
+ hmnp 1E140..1E149 Nyiakeng_Puachue_Hmong
+ wcho 1E2F0..1E2F9 Wancho
+ Unicode 11: using Unicode 11 CLDR ticket #10978
+ rohg 10D30..10D39 Hanifi_Rohingya
+ gong 11DA0..11DA9 Gunjala_Gondi
+ Earlier: CLDR tickets specific to adding new numbering systems.
+ Unicode 10: http://unicode.org/cldr/trac/ticket/10219
+ Unicode 9: http://unicode.org/cldr/trac/ticket/9692
+
+*** merge the Unicode update branches back onto the trunk
+- do not merge the icudata.jar and testdata.jar,
+ instead rebuild them from merged & tested ICU4C
+- make sure that changes to Unicode tools are checked in:
+ http://www.unicode.org/utility/trac/log/trunk/unicodetools
+
+---------------------------------------------------------------------------- ***
+
ICU 63 addition of ICU support of text layout properties InPC, InSC, vo
* Command-line environment setup
diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/confusables.txt b/Build/source/libs/icu/icu-src/source/data/unidata/confusables.txt
index 0b8c1c5ff67..ee85eeeef20 100644
--- a/Build/source/libs/icu/icu-src/source/data/unidata/confusables.txt
+++ b/Build/source/libs/icu/icu-src/source/data/unidata/confusables.txt
@@ -1,11 +1,11 @@
# confusables.txt
-# Date: 2018-03-13, 10:46:37 GMT
-# © 2018 Unicode®, Inc.
+# Date: 2019-04-01, 21:59:19 GMT
+# © 2019 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
# Unicode Security Mechanisms for UTS #39
-# Version: 11.0.0
+# Version: 12.1.0
#
# For documentation and usage, see http://www.unicode.org/reports/tr39
#
@@ -2353,7 +2353,7 @@ A6B1 ; 2C75 ; MA # ( ꚱ → Ⱶ ) BAMUM LETTER NDAA → LATIN CAPITAL LETTER HA
A795 ; A727 ; MA # ( ꞕ → ꜧ ) LATIN SMALL LETTER H WITH PALATAL HOOK → LATIN SMALL LETTER HENG #
02DB ; 0069 ; MA #* ( ˛ → i ) OGONEK → LATIN SMALL LETTER I # →ͺ→→ι→→ι→
-2373 ; 0069 ; MA #* ( ⍳ → i ) APL FUNCTIONAL SYMBOL IOTA → LATIN SMALL LETTER I # →ɩ→
+2373 ; 0069 ; MA #* ( ⍳ → i ) APL FUNCTIONAL SYMBOL IOTA → LATIN SMALL LETTER I # →ι→
FF49 ; 0069 ; MA # ( i → i ) FULLWIDTH LATIN SMALL LETTER I → LATIN SMALL LETTER I # →і→
2170 ; 0069 ; MA # ( ⅰ → i ) SMALL ROMAN NUMERAL ONE → LATIN SMALL LETTER I #
2139 ; 0069 ; MA # ( ℹ → i ) INFORMATION SOURCE → LATIN SMALL LETTER I #
diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfc.txt b/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfc.txt
index 51bc9fc538b..31dc256d102 100644
--- a/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfc.txt
+++ b/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfc.txt
@@ -9,7 +9,7 @@
#
# Complete data for Unicode NFC normalization.
-* Unicode 11.0.0
+* Unicode 12.1.0
# Canonical_Combining_Class (ccc) values
0300..0314:230
@@ -176,6 +176,7 @@
0E3A:9
0E48..0E4B:107
0EB8..0EB9:118
+0EBA:9
0EC8..0ECB:122
0F18..0F19:220
0F35:220
@@ -340,6 +341,7 @@ FE2E..FE2F:230
1172B:9
11839:9
1183A:7
+119E0:9
11A34:9
11A47:9
11A99:9
@@ -364,6 +366,8 @@ FE2E..FE2F:230
1E01B..1E021:230
1E023..1E024:230
1E026..1E02A:230
+1E130..1E136:230
+1E2EC..1E2EF:230
1E8D0..1E8D6:220
1E944..1E949:230
1E94A:7
diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfkc.txt b/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfkc.txt
index 416c6800ec2..a1e363faecb 100644
--- a/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfkc.txt
+++ b/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfkc.txt
@@ -13,7 +13,7 @@
# to NFKC one-way mappings.
# Use this file as the second gennorm2 input file after nfc.txt.
-* Unicode 11.0.0
+* Unicode 12.1.0
00A0>0020
00A8>0020 0308
@@ -1107,6 +1107,7 @@
32FC>30F0
32FD>30F1
32FE>30F2
+32FF>4EE4 548C
3300>30A2 30D1 30FC 30C8
3301>30A2 30EB 30D5 30A1
3302>30A2 30F3 30DA 30A2
@@ -3630,6 +3631,7 @@ FFEE>25CB
1F14F>0057 0043
1F16A>004D 0043
1F16B>004D 0044
+1F16C>004D 0052
1F190>0044 004A
1F200>307B 304B
1F201>30B3 30B3
diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfkc_cf.txt b/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfkc_cf.txt
index d37386e0506..3248c3ac03d 100644
--- a/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfkc_cf.txt
+++ b/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfkc_cf.txt
@@ -12,7 +12,7 @@
# and reformatted into syntax for the gennorm2 Normalizer2 data generator tool.
# Use this file as the third gennorm2 input file after nfc.txt and nfkc.txt.
-* Unicode 11.0.0
+* Unicode 12.1.0
0041>0061
0042>0062
@@ -2082,6 +2082,7 @@
32FC>30F0
32FD>30F1
32FE>30F2
+32FF>4EE4 548C
3300>30A2 30D1 30FC 30C8
3301>30A2 30EB 30D5 30A1
3302>30A2 30F3 30DA 30A2
@@ -2450,6 +2451,13 @@ A7B3>AB53
A7B4>A7B5
A7B6>A7B7
A7B8>A7B9
+A7BA>A7BB
+A7BC>A7BD
+A7BE>A7BF
+A7C2>A7C3
+A7C4>A794
+A7C5>0282
+A7C6>1D8E
A7F8>0127
A7F9>0153
AB5C>A727
@@ -5319,6 +5327,7 @@ FFF0..FFF8>
1F14F>0077 0063
1F16A>006D 0063
1F16B>006D 0064
+1F16C>006D 0072
1F190>0064 006A
1F200>307B 304B
1F201>30B3 30B3
diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/norm2/uts46.txt b/Build/source/libs/icu/icu-src/source/data/unidata/norm2/uts46.txt
index e360044f856..15427fc4daf 100644
--- a/Build/source/libs/icu/icu-src/source/data/unidata/norm2/uts46.txt
+++ b/Build/source/libs/icu/icu-src/source/data/unidata/norm2/uts46.txt
@@ -1,12 +1,14 @@
# Original file:
-# IdnaMappingTable-11.0.0.txt
-# Date: 2018-03-14, 08:27:19 GMT
-# © 2018 Unicode®, Inc.
+# IdnaMappingTable.txt
+# Date: 2019-04-01, 09:17:25 GMT
+# © 2019 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
-# Unicode IDNA Compatible Preprocessing (UTS #46)
-# For documentation, see http://www.unicode.org/reports/tr46/
+# Unicode IDNA Compatible Preprocessing for UTS #46
+# Version: 12.1.0
+#
+# For documentation and usage, see http://www.unicode.org/reports/tr46
# ================================================
# This file has been reformatted into syntax for the
@@ -23,7 +25,7 @@
#
# Use this file as the second gennorm2 input file after nfc.txt.
# ================================================
-
+#
# 0000..002C disallowed_STD3_valid # 1.1 <control-0000>..COMMA
# 002D..002E valid # 1.1 HYPHEN-MINUS..FULL STOP
# 002F disallowed_STD3_valid # 1.1 SOLIDUS
@@ -1246,7 +1248,8 @@
# 0C62..0C63 valid # 5.1 TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
0C64..0C65 >FFFD # NA <reserved-0C64>..<reserved-0C65>
# 0C66..0C6F valid # 1.1 TELUGU DIGIT ZERO..TELUGU DIGIT NINE
-0C70..0C77 >FFFD # NA <reserved-0C70>..<reserved-0C77>
+0C70..0C76 >FFFD # NA <reserved-0C70>..<reserved-0C76>
+# 0C77 valid # 12.0 TELUGU SIGN SIDDHAM
# 0C78..0C7F valid # 5.1 TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU SIGN TUUMU
# 0C80 valid # 9.0 KANNADA SIGN SPACING CANDRABINDU
# 0C81 valid # 7.0 KANNADA SIGN CANDRABINDU
@@ -1354,29 +1357,31 @@
# 0E81..0E82 valid # 1.1 LAO LETTER KO..LAO LETTER KHO SUNG
0E83 >FFFD # NA <reserved-0E83>
# 0E84 valid # 1.1 LAO LETTER KHO TAM
-0E85..0E86 >FFFD # NA <reserved-0E85>..<reserved-0E86>
+0E85 >FFFD # NA <reserved-0E85>
+# 0E86 valid # 12.0 LAO LETTER PALI GHA
# 0E87..0E88 valid # 1.1 LAO LETTER NGO..LAO LETTER CO
-0E89 >FFFD # NA <reserved-0E89>
+# 0E89 valid # 12.0 LAO LETTER PALI CHA
# 0E8A valid # 1.1 LAO LETTER SO TAM
-0E8B..0E8C >FFFD # NA <reserved-0E8B>..<reserved-0E8C>
+0E8B >FFFD # NA <reserved-0E8B>
+# 0E8C valid # 12.0 LAO LETTER PALI JHA
# 0E8D valid # 1.1 LAO LETTER NYO
-0E8E..0E93 >FFFD # NA <reserved-0E8E>..<reserved-0E93>
+# 0E8E..0E93 valid # 12.0 LAO LETTER PALI NYA..LAO LETTER PALI NNA
# 0E94..0E97 valid # 1.1 LAO LETTER DO..LAO LETTER THO TAM
-0E98 >FFFD # NA <reserved-0E98>
+# 0E98 valid # 12.0 LAO LETTER PALI DHA
# 0E99..0E9F valid # 1.1 LAO LETTER NO..LAO LETTER FO SUNG
-0EA0 >FFFD # NA <reserved-0EA0>
+# 0EA0 valid # 12.0 LAO LETTER PALI BHA
# 0EA1..0EA3 valid # 1.1 LAO LETTER MO..LAO LETTER LO LING
0EA4 >FFFD # NA <reserved-0EA4>
# 0EA5 valid # 1.1 LAO LETTER LO LOOT
0EA6 >FFFD # NA <reserved-0EA6>
# 0EA7 valid # 1.1 LAO LETTER WO
-0EA8..0EA9 >FFFD # NA <reserved-0EA8>..<reserved-0EA9>
+# 0EA8..0EA9 valid # 12.0 LAO LETTER SANSKRIT SHA..LAO LETTER SANSKRIT SSA
# 0EAA..0EAB valid # 1.1 LAO LETTER SO SUNG..LAO LETTER HO SUNG
-0EAC >FFFD # NA <reserved-0EAC>
+# 0EAC valid # 12.0 LAO LETTER PALI LLA
# 0EAD..0EB2 valid # 1.1 LAO LETTER O..LAO VOWEL SIGN AA
0EB3 >0ECD 0EB2 # 1.1 LAO VOWEL SIGN AM
# 0EB4..0EB9 valid # 1.1 LAO VOWEL SIGN I..LAO VOWEL SIGN UU
-0EBA >FFFD # NA <reserved-0EBA>
+# 0EBA valid # 12.0 LAO SIGN PALI VIRAMA
# 0EBB..0EBD valid # 1.1 LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN NYO
0EBE..0EBF >FFFD # NA <reserved-0EBE>..<reserved-0EBF>
# 0EC0..0EC4 valid # 1.1 LAO VOWEL SIGN E..LAO VOWEL SIGN AI
@@ -1701,9 +1706,53 @@
1C87 >0463 # 9.0 CYRILLIC SMALL LETTER TALL YAT
1C88 >A64B # 9.0 CYRILLIC SMALL LETTER UNBLENDED UK
1C89..1C8F >FFFD # NA <reserved-1C89>..<reserved-1C8F>
-1C90..1CBA >FFFD # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN
+1C90 >10D0 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER AN
+1C91 >10D1 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER BAN
+1C92 >10D2 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER GAN
+1C93 >10D3 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER DON
+1C94 >10D4 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER EN
+1C95 >10D5 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER VIN
+1C96 >10D6 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER ZEN
+1C97 >10D7 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER TAN
+1C98 >10D8 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER IN
+1C99 >10D9 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER KAN
+1C9A >10DA # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER LAS
+1C9B >10DB # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER MAN
+1C9C >10DC # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER NAR
+1C9D >10DD # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER ON
+1C9E >10DE # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER PAR
+1C9F >10DF # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER ZHAR
+1CA0 >10E0 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER RAE
+1CA1 >10E1 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER SAN
+1CA2 >10E2 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER TAR
+1CA3 >10E3 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER UN
+1CA4 >10E4 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER PHAR
+1CA5 >10E5 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER KHAR
+1CA6 >10E6 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER GHAN
+1CA7 >10E7 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER QAR
+1CA8 >10E8 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER SHIN
+1CA9 >10E9 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER CHIN
+1CAA >10EA # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER CAN
+1CAB >10EB # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER JIL
+1CAC >10EC # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER CIL
+1CAD >10ED # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER CHAR
+1CAE >10EE # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER XAN
+1CAF >10EF # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER JHAN
+1CB0 >10F0 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER HAE
+1CB1 >10F1 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER HE
+1CB2 >10F2 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER HIE
+1CB3 >10F3 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER WE
+1CB4 >10F4 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER HAR
+1CB5 >10F5 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER HOE
+1CB6 >10F6 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER FI
+1CB7 >10F7 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER YN
+1CB8 >10F8 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER ELIFI
+1CB9 >10F9 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN
+1CBA >10FA # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER AIN
1CBB..1CBC >FFFD # NA <reserved-1CBB>..<reserved-1CBC>
-1CBD..1CBF >FFFD # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN
+1CBD >10FD # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER AEN
+1CBE >10FE # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN
+1CBF >10FF # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN
# 1CC0..1CC7 valid # 6.1 SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA
1CC8..1CCF >FFFD # NA <reserved-1CC8>..<reserved-1CCF>
# 1CD0..1CD2 valid # 5.2 VEDIC TONE KARSHANA..VEDIC TONE PRENKHA
@@ -1712,7 +1761,8 @@
# 1CF3..1CF6 valid # 6.1 VEDIC SIGN ROTATED ARDHAVISARGA..VEDIC SIGN UPADHMANIYA
# 1CF7 valid # 10.0 VEDIC SIGN ATIKRAMA
# 1CF8..1CF9 valid # 7.0 VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE
-1CFA..1CFF >FFFD # NA <reserved-1CFA>..<reserved-1CFF>
+# 1CFA valid # 12.0 VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA
+1CFB..1CFF >FFFD # NA <reserved-1CFB>..<reserved-1CFF>
# 1D00..1D2B valid # 4.0 LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL
1D2C >0061 # 4.0 MODIFIER LETTER CAPITAL A
1D2D >00E6 # 4.0 MODIFIER LETTER CAPITAL AE
@@ -2752,13 +2802,13 @@
# 2B98..2BB9 valid # 7.0 THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..UP ARROWHEAD IN A RECTANGLE BOX
# 2BBA..2BBC valid # 11.0 OVERLAPPING WHITE SQUARES..OVERLAPPING BLACK SQUARES
# 2BBD..2BC8 valid # 7.0 BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
-2BC9 >FFFD # NA <reserved-2BC9>
+# 2BC9 valid # 12.0 NEPTUNE FORM TWO
# 2BCA..2BD1 valid # 7.0 TOP HALF BLACK CIRCLE..UNCERTAINTY SIGN
# 2BD2 valid # 10.0 GROUP MARK
# 2BD3..2BEB valid # 11.0 PLUTO FORM TWO..STAR WITH RIGHT HALF BLACK
# 2BEC..2BEF valid # 8.0 LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS
# 2BF0..2BFE valid # 11.0 ERIS FORM ONE..REVERSED RIGHT ANGLE
-2BFF >FFFD # NA <reserved-2BFF>
+# 2BFF valid # 12.0 HELLSCHREIBER PAUSE SYMBOL
2C00 >2C30 # 4.1 GLAGOLITIC CAPITAL LETTER AZU
2C01 >2C31 # 4.1 GLAGOLITIC CAPITAL LETTER BUKY
2C02 >2C32 # 4.1 GLAGOLITIC CAPITAL LETTER VEDE
@@ -2989,7 +3039,8 @@
# 2E43..2E44 valid # 9.0 DASH WITH LEFT UPTURN..DOUBLE SUSPENSION MARK
# 2E45..2E49 valid # 10.0 INVERTED LOW KAVYKA..DOUBLE STACKED COMMA
# 2E4A..2E4E valid # 11.0 DOTTED SOLIDUS..PUNCTUS ELEVATUS MARK
-2E4F..2E7F >FFFD # NA <reserved-2E4F>..<reserved-2E7F>
+# 2E4F valid # 12.0 CORNISH VERSE DIVIDER
+2E50..2E7F >FFFD # NA <reserved-2E50>..<reserved-2E7F>
# 2E80..2E99 valid # 3.0 CJK RADICAL REPEAT..CJK RADICAL RAP
2E9A >FFFD # NA <reserved-2E9A>
# 2E9B..2E9E valid # 3.0 CJK RADICAL CHOKE..CJK RADICAL DEATH
@@ -3615,7 +3666,7 @@
32FC >30F0 # 1.1 CIRCLED KATAKANA WI
32FD >30F1 # 1.1 CIRCLED KATAKANA WE
32FE >30F2 # 1.1 CIRCLED KATAKANA WO
-32FF >FFFD # NA <reserved-32FF>
+32FF >4EE4 548C # 12.1 SQUARE ERA NAME REIWA
3300 >30A2 30D1 30FC 30C8 #1.1 SQUARE APAATO
3301 >30A2 30EB 30D5 30A1 #1.1 SQUARE ARUHUA
3302 >30A2 30F3 30DA 30A2 #1.1 SQUARE ANPEA
@@ -4132,9 +4183,21 @@ A7B4 >A7B5 # 8.0 LATIN CAPITAL LETTER BETA
# A7B5 valid # 8.0 LATIN SMALL LETTER BETA
A7B6 >A7B7 # 8.0 LATIN CAPITAL LETTER OMEGA
# A7B7 valid # 8.0 LATIN SMALL LETTER OMEGA
-A7B8 >FFFD # 11.0 LATIN CAPITAL LETTER U WITH STROKE
+A7B8 >A7B9 # 11.0 LATIN CAPITAL LETTER U WITH STROKE
# A7B9 valid # 11.0 LATIN SMALL LETTER U WITH STROKE
-A7BA..A7F6 >FFFD # NA <reserved-A7BA>..<reserved-A7F6>
+A7BA >A7BB # 12.0 LATIN CAPITAL LETTER GLOTTAL A
+# A7BB valid # 12.0 LATIN SMALL LETTER GLOTTAL A
+A7BC >A7BD # 12.0 LATIN CAPITAL LETTER GLOTTAL I
+# A7BD valid # 12.0 LATIN SMALL LETTER GLOTTAL I
+A7BE >A7BF # 12.0 LATIN CAPITAL LETTER GLOTTAL U
+# A7BF valid # 12.0 LATIN SMALL LETTER GLOTTAL U
+A7C0..A7C1 >FFFD # NA <reserved-A7C0>..<reserved-A7C1>
+A7C2 >A7C3 # 12.0 LATIN CAPITAL LETTER ANGLICANA W
+# A7C3 valid # 12.0 LATIN SMALL LETTER ANGLICANA W
+A7C4 >A794 # 12.0 LATIN CAPITAL LETTER C WITH PALATAL HOOK
+A7C5 >0282 # 12.0 LATIN CAPITAL LETTER S WITH HOOK
+A7C6 >1D8E # 12.0 LATIN CAPITAL LETTER Z WITH PALATAL HOOK
+A7C7..A7F6 >FFFD # NA <reserved-A7C7>..<reserved-A7F6>
# A7F7 valid # 7.0 LATIN EPIGRAPHIC LETTER SIDEWAYS I
A7F8 >0127 # 6.1 MODIFIER LETTER CAPITAL H WITH STROKE
A7F9 >0153 # 6.1 MODIFIER LETTER SMALL LIGATURE OE
@@ -4212,7 +4275,8 @@ AB5E >026B # 7.0 MODIFIER LETTER SMALL L WITH MIDD
AB5F >AB52 # 7.0 MODIFIER LETTER SMALL U WITH LEFT HOOK
# AB60..AB63 valid # 8.0 LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER UO
# AB64..AB65 valid # 7.0 LATIN SMALL LETTER INVERTED ALPHA..GREEK LETTER SMALL CAPITAL OMEGA
-AB66..AB6F >FFFD # NA <reserved-AB66>..<reserved-AB6F>
+# AB66..AB67 valid # 12.0 LATIN SMALL LETTER DZ DIGRAPH WITH RETROFLEX HOOK..LATIN SMALL LETTER TS DIGRAPH WITH RETROFLEX HOOK
+AB68..AB6F >FFFD # NA <reserved-AB68>..<reserved-AB6F>
AB70 >13A0 # 8.0 CHEROKEE SMALL LETTER A
AB71 >13A1 # 8.0 CHEROKEE SMALL LETTER E
AB72 >13A2 # 8.0 CHEROKEE SMALL LETTER I
@@ -4305,7 +4369,7 @@ D7A4..D7AF >FFFD # NA <reserved-D7A4>..<reserved-D7AF>
D7C7..D7CA >FFFD # NA <reserved-D7C7>..<reserved-D7CA>
# D7CB..D7FB valid # 5.2 HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH
D7FC..D7FF >FFFD # NA <reserved-D7FC>..<reserved-D7FF>
-# D800..DFFF >FFFD # 2.0 <surrogate-D800>..<surrogate-DFFF>
+# D800..DFFF disallowed in code # 2.0 <surrogate-D800>..<surrogate-DFFF>
E000..F8FF >FFFD # 1.1 <private-use-E000>..<private-use-F8FF>
F900 >8C48 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F900
F901 >66F4 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F901
@@ -6000,7 +6064,9 @@ FFFE..FFFF >FFFD # 1.1 <noncharacter-FFFE>..<noncharacte
10F28..10F2F >FFFD # NA <reserved-10F28>..<reserved-10F2F>
# 10F30..10F50valid # 11.0 SOGDIAN LETTER ALEPH..SOGDIAN COMBINING STROKE BELOW
# 10F51..10F59valid # 11.0 SOGDIAN NUMBER ONE..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT
-10F5A..10FFF >FFFD # NA <reserved-10F5A>..<reserved-10FFF>
+10F5A..10FDF >FFFD # NA <reserved-10F5A>..<reserved-10FDF>
+# 10FE0..10FF6valid # 12.0 ELYMAIC LETTER ALEPH..ELYMAIC LIGATURE ZAYIN-YODH
+10FF7..10FFF >FFFD # NA <reserved-10FF7>..<reserved-10FFF>
# 11000..11046valid # 6.0 BRAHMI SIGN CANDRABINDU..BRAHMI VIRAMA
# 11047..1104Dvalid # 6.0 BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS
1104E..11051 >FFFD # NA <reserved-1104E>..<reserved-11051>
@@ -6103,7 +6169,8 @@ FFFE..FFFF >FFFD # 1.1 <noncharacter-FFFE>..<noncharacte
1145C >FFFD # NA <reserved-1145C>
# 1145D valid # 9.0 NEWA INSERTION SIGN
# 1145E valid # 11.0 NEWA SANDHI MARK
-1145F..1147F >FFFD # NA <reserved-1145F>..<reserved-1147F>
+# 1145F valid # 12.0 NEWA LETTER VEDIC ANUSVARA
+11460..1147F >FFFD # NA <reserved-11460>..<reserved-1147F>
# 11480..114C5valid # 7.0 TIRHUTA ANJI..TIRHUTA GVANG
# 114C6 valid # 7.0 TIRHUTA ABBREVIATION SIGN
# 114C7 valid # 7.0 TIRHUTA OM
@@ -6126,7 +6193,8 @@ FFFE..FFFF >FFFD # 1.1 <noncharacter-FFFE>..<noncharacte
# 11660..1166Cvalid # 9.0 MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT
1166D..1167F >FFFD # NA <reserved-1166D>..<reserved-1167F>
# 11680..116B7valid # 6.1 TAKRI LETTER A..TAKRI SIGN NUKTA
-116B8..116BF >FFFD # NA <reserved-116B8>..<reserved-116BF>
+# 116B8 valid # 12.0 TAKRI LETTER ARCHAIC KHA
+116B9..116BF >FFFD # NA <reserved-116B9>..<reserved-116BF>
# 116C0..116C9valid # 6.1 TAKRI DIGIT ZERO..TAKRI DIGIT NINE
116CA..116FF >FFFD # NA <reserved-116CA>..<reserved-116FF>
# 11700..11719valid # 8.0 AHOM LETTER KA..AHOM LETTER JHA
@@ -6176,13 +6244,21 @@ FFFE..FFFF >FFFD # 1.1 <noncharacter-FFFE>..<noncharacte
# 118EA..118F2valid # 7.0 WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY
118F3..118FE >FFFD # NA <reserved-118F3>..<reserved-118FE>
# 118FF valid # 7.0 WARANG CITI OM
-11900..119FF >FFFD # NA <reserved-11900>..<reserved-119FF>
+11900..1199F >FFFD # NA <reserved-11900>..<reserved-1199F>
+# 119A0..119A7valid # 12.0 NANDINAGARI LETTER A..NANDINAGARI LETTER VOCALIC RR
+119A8..119A9 >FFFD # NA <reserved-119A8>..<reserved-119A9>
+# 119AA..119D7valid # 12.0 NANDINAGARI LETTER E..NANDINAGARI VOWEL SIGN VOCALIC RR
+119D8..119D9 >FFFD # NA <reserved-119D8>..<reserved-119D9>
+# 119DA..119E1valid # 12.0 NANDINAGARI VOWEL SIGN E..NANDINAGARI SIGN AVAGRAHA
+# 119E2 valid # 12.0 NANDINAGARI SIGN SIDDHAM
+# 119E3..119E4valid # 12.0 NANDINAGARI HEADSTROKE..NANDINAGARI VOWEL SIGN PRISHTHAMATRA E
+119E5..119FF >FFFD # NA <reserved-119E5>..<reserved-119FF>
# 11A00..11A3Evalid # 10.0 ZANABAZAR SQUARE LETTER A..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA
# 11A3F..11A46valid # 10.0 ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK
# 11A47 valid # 10.0 ZANABAZAR SQUARE SUBJOINER
11A48..11A4F >FFFD # NA <reserved-11A48>..<reserved-11A4F>
# 11A50..11A83valid # 10.0 SOYOMBO LETTER A..SOYOMBO LETTER KSSA
-11A84..11A85 >FFFD # NA <reserved-11A84>..<reserved-11A85>
+# 11A84..11A85valid # 12.0 SOYOMBO SIGN JIHVAMULIYA..SOYOMBO SIGN UPADHMANIYA
# 11A86..11A99valid # 10.0 SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO SUBJOINER
# 11A9A..11A9Cvalid # 10.0 SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD
# 11A9D valid # 11.0 SOYOMBO MARK PLUTA
@@ -6235,7 +6311,10 @@ FFFE..FFFF >FFFD # 1.1 <noncharacter-FFFE>..<noncharacte
11DAA..11EDF >FFFD # NA <reserved-11DAA>..<reserved-11EDF>
# 11EE0..11EF6valid # 11.0 MAKASAR LETTER KA..MAKASAR VOWEL SIGN O
# 11EF7..11EF8valid # 11.0 MAKASAR PASSIMBANG..MAKASAR END OF SECTION
-11EF9..11FFF >FFFD # NA <reserved-11EF9>..<reserved-11FFF>
+11EF9..11FBF >FFFD # NA <reserved-11EF9>..<reserved-11FBF>
+# 11FC0..11FF1valid # 12.0 TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL SIGN VAKAIYARAA
+11FF2..11FFE >FFFD # NA <reserved-11FF2>..<reserved-11FFE>
+# 11FFF valid # 12.0 TAMIL PUNCTUATION END OF TEXT
# 12000..1236Evalid # 5.0 CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM
# 1236F..12398valid # 7.0 CUNEIFORM SIGN KAP ELAMITE..CUNEIFORM SIGN UM TIMES ME
# 12399 valid # 8.0 CUNEIFORM SIGN U U
@@ -6249,7 +6328,9 @@ FFFE..FFFF >FFFD # 1.1 <noncharacter-FFFE>..<noncharacte
# 12480..12543valid # 8.0 CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
12544..12FFF >FFFD # NA <reserved-12544>..<reserved-12FFF>
# 13000..1342Evalid # 5.2 EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
-1342F..143FF >FFFD # NA <reserved-1342F>..<reserved-143FF>
+1342F >FFFD # NA <reserved-1342F>
+13430..13438 >FFFD # 12.0 EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT
+13439..143FF >FFFD # NA <reserved-13439>..<reserved-143FF>
# 14400..14646valid # 8.0 ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530
14647..167FF >FFFD # NA <reserved-14647>..<reserved-167FF>
# 16800..16A38valid # 6.0 BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ
@@ -6278,27 +6359,68 @@ FFFE..FFFF >FFFD # 1.1 <noncharacter-FFFE>..<noncharacte
16B78..16B7C >FFFD # NA <reserved-16B78>..<reserved-16B7C>
# 16B7D..16B8Fvalid # 7.0 PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ
16B90..16E3F >FFFD # NA <reserved-16B90>..<reserved-16E3F>
-16E40..16E5F >FFFD # 11.0 MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN CAPITAL LETTER Y
+16E40 >16E60 # 11.0 MEDEFAIDRIN CAPITAL LETTER M
+16E41 >16E61 # 11.0 MEDEFAIDRIN CAPITAL LETTER S
+16E42 >16E62 # 11.0 MEDEFAIDRIN CAPITAL LETTER V
+16E43 >16E63 # 11.0 MEDEFAIDRIN CAPITAL LETTER W
+16E44 >16E64 # 11.0 MEDEFAIDRIN CAPITAL LETTER ATIU
+16E45 >16E65 # 11.0 MEDEFAIDRIN CAPITAL LETTER Z
+16E46 >16E66 # 11.0 MEDEFAIDRIN CAPITAL LETTER KP
+16E47 >16E67 # 11.0 MEDEFAIDRIN CAPITAL LETTER P
+16E48 >16E68 # 11.0 MEDEFAIDRIN CAPITAL LETTER T
+16E49 >16E69 # 11.0 MEDEFAIDRIN CAPITAL LETTER G
+16E4A >16E6A # 11.0 MEDEFAIDRIN CAPITAL LETTER F
+16E4B >16E6B # 11.0 MEDEFAIDRIN CAPITAL LETTER I
+16E4C >16E6C # 11.0 MEDEFAIDRIN CAPITAL LETTER K
+16E4D >16E6D # 11.0 MEDEFAIDRIN CAPITAL LETTER A
+16E4E >16E6E # 11.0 MEDEFAIDRIN CAPITAL LETTER J
+16E4F >16E6F # 11.0 MEDEFAIDRIN CAPITAL LETTER E
+16E50 >16E70 # 11.0 MEDEFAIDRIN CAPITAL LETTER B
+16E51 >16E71 # 11.0 MEDEFAIDRIN CAPITAL LETTER C
+16E52 >16E72 # 11.0 MEDEFAIDRIN CAPITAL LETTER U
+16E53 >16E73 # 11.0 MEDEFAIDRIN CAPITAL LETTER YU
+16E54 >16E74 # 11.0 MEDEFAIDRIN CAPITAL LETTER L
+16E55 >16E75 # 11.0 MEDEFAIDRIN CAPITAL LETTER Q
+16E56 >16E76 # 11.0 MEDEFAIDRIN CAPITAL LETTER HP
+16E57 >16E77 # 11.0 MEDEFAIDRIN CAPITAL LETTER NY
+16E58 >16E78 # 11.0 MEDEFAIDRIN CAPITAL LETTER X
+16E59 >16E79 # 11.0 MEDEFAIDRIN CAPITAL LETTER D
+16E5A >16E7A # 11.0 MEDEFAIDRIN CAPITAL LETTER OE
+16E5B >16E7B # 11.0 MEDEFAIDRIN CAPITAL LETTER N
+16E5C >16E7C # 11.0 MEDEFAIDRIN CAPITAL LETTER R
+16E5D >16E7D # 11.0 MEDEFAIDRIN CAPITAL LETTER O
+16E5E >16E7E # 11.0 MEDEFAIDRIN CAPITAL LETTER AI
+16E5F >16E7F # 11.0 MEDEFAIDRIN CAPITAL LETTER Y
# 16E60..16E7Fvalid # 11.0 MEDEFAIDRIN SMALL LETTER M..MEDEFAIDRIN SMALL LETTER Y
# 16E80..16E9Avalid # 11.0 MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN EXCLAMATION OH
16E9B..16EFF >FFFD # NA <reserved-16E9B>..<reserved-16EFF>
# 16F00..16F44valid # 6.1 MIAO LETTER PA..MIAO LETTER HHA
-16F45..16F4F >FFFD # NA <reserved-16F45>..<reserved-16F4F>
+# 16F45..16F4Avalid # 12.0 MIAO LETTER BRI..MIAO LETTER RTE
+16F4B..16F4E >FFFD # NA <reserved-16F4B>..<reserved-16F4E>
+# 16F4F valid # 12.0 MIAO SIGN CONSONANT MODIFIER BAR
# 16F50..16F7Evalid # 6.1 MIAO LETTER NASALIZATION..MIAO VOWEL SIGN NG
-16F7F..16F8E >FFFD # NA <reserved-16F7F>..<reserved-16F8E>
+# 16F7F..16F87valid # 12.0 MIAO VOWEL SIGN UOG..MIAO VOWEL SIGN UI
+16F88..16F8E >FFFD # NA <reserved-16F88>..<reserved-16F8E>
# 16F8F..16F9Fvalid # 6.1 MIAO TONE RIGHT..MIAO LETTER REFORMED TONE-8
16FA0..16FDF >FFFD # NA <reserved-16FA0>..<reserved-16FDF>
# 16FE0 valid # 9.0 TANGUT ITERATION MARK
# 16FE1 valid # 10.0 NUSHU ITERATION MARK
-16FE2..16FFF >FFFD # NA <reserved-16FE2>..<reserved-16FFF>
+# 16FE2 valid # 12.0 OLD CHINESE HOOK MARK
+# 16FE3 valid # 12.0 OLD CHINESE ITERATION MARK
+16FE4..16FFF >FFFD # NA <reserved-16FE4>..<reserved-16FFF>
# 17000..187ECvalid # 9.0 TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC
# 187ED..187F1valid # 11.0 TANGUT IDEOGRAPH-187ED..TANGUT IDEOGRAPH-187F1
-187F2..187FF >FFFD # NA <reserved-187F2>..<reserved-187FF>
+# 187F2..187F7valid # 12.0 TANGUT IDEOGRAPH-187F2..TANGUT IDEOGRAPH-187F7
+187F8..187FF >FFFD # NA <reserved-187F8>..<reserved-187FF>
# 18800..18AF2valid # 9.0 TANGUT COMPONENT-001..TANGUT COMPONENT-755
18AF3..1AFFF >FFFD # NA <reserved-18AF3>..<reserved-1AFFF>
# 1B000..1B001valid # 6.0 KATAKANA LETTER ARCHAIC E..HIRAGANA LETTER ARCHAIC YE
# 1B002..1B11Evalid # 10.0 HENTAIGANA LETTER A-1..HENTAIGANA LETTER N-MU-MO-2
-1B11F..1B16F >FFFD # NA <reserved-1B11F>..<reserved-1B16F>
+1B11F..1B14F >FFFD # NA <reserved-1B11F>..<reserved-1B14F>
+# 1B150..1B152valid # 12.0 HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO
+1B153..1B163 >FFFD # NA <reserved-1B153>..<reserved-1B163>
+# 1B164..1B167valid # 12.0 KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N
+1B168..1B16F >FFFD # NA <reserved-1B168>..<reserved-1B16F>
# 1B170..1B2FBvalid # 10.0 NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
1B2FC..1BBFF >FFFD # NA <reserved-1B2FC>..<reserved-1BBFF>
# 1BC00..1BC6Avalid # 7.0 DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M
@@ -7381,7 +7503,20 @@ FFFE..FFFF >FFFD # 1.1 <noncharacter-FFFE>..<noncharacte
# 1E023..1E024valid # 9.0 COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
1E025 >FFFD # NA <reserved-1E025>
# 1E026..1E02Avalid # 9.0 COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
-1E02B..1E7FF >FFFD # NA <reserved-1E02B>..<reserved-1E7FF>
+1E02B..1E0FF >FFFD # NA <reserved-1E02B>..<reserved-1E0FF>
+# 1E100..1E12Cvalid # 12.0 NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W
+1E12D..1E12F >FFFD # NA <reserved-1E12D>..<reserved-1E12F>
+# 1E130..1E13Dvalid # 12.0 NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
+1E13E..1E13F >FFFD # NA <reserved-1E13E>..<reserved-1E13F>
+# 1E140..1E149valid # 12.0 NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE
+1E14A..1E14D >FFFD # NA <reserved-1E14A>..<reserved-1E14D>
+# 1E14E valid # 12.0 NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ
+# 1E14F valid # 12.0 NYIAKENG PUACHUE HMONG CIRCLED CA
+1E150..1E2BF >FFFD # NA <reserved-1E150>..<reserved-1E2BF>
+# 1E2C0..1E2F9valid # 12.0 WANCHO LETTER AA..WANCHO DIGIT NINE
+1E2FA..1E2FE >FFFD # NA <reserved-1E2FA>..<reserved-1E2FE>
+# 1E2FF valid # 12.0 WANCHO NGUN SIGN
+1E300..1E7FF >FFFD # NA <reserved-1E300>..<reserved-1E7FF>
# 1E800..1E8C4valid # 7.0 MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON
1E8C5..1E8C6 >FFFD # NA <reserved-1E8C5>..<reserved-1E8C6>
# 1E8C7..1E8CFvalid # 7.0 MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE
@@ -7422,13 +7557,16 @@ FFFE..FFFF >FFFD # 1.1 <noncharacter-FFFE>..<noncharacte
1E920 >1E942 # 9.0 ADLAM CAPITAL LETTER KPO
1E921 >1E943 # 9.0 ADLAM CAPITAL LETTER SHA
# 1E922..1E94Avalid # 9.0 ADLAM SMALL LETTER ALIF..ADLAM NUKTA
-1E94B..1E94F >FFFD # NA <reserved-1E94B>..<reserved-1E94F>
+# 1E94B valid # 12.0 ADLAM NASALIZATION MARK
+1E94C..1E94F >FFFD # NA <reserved-1E94C>..<reserved-1E94F>
# 1E950..1E959valid # 9.0 ADLAM DIGIT ZERO..ADLAM DIGIT NINE
1E95A..1E95D >FFFD # NA <reserved-1E95A>..<reserved-1E95D>
# 1E95E..1E95Fvalid # 9.0 ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK
1E960..1EC70 >FFFD # NA <reserved-1E960>..<reserved-1EC70>
# 1EC71..1ECB4valid # 11.0 INDIC SIYAQ NUMBER ONE..INDIC SIYAQ ALTERNATE LAKH MARK
-1ECB5..1EDFF >FFFD # NA <reserved-1ECB5>..<reserved-1EDFF>
+1ECB5..1ED00 >FFFD # NA <reserved-1ECB5>..<reserved-1ED00>
+# 1ED01..1ED3Dvalid # 12.0 OTTOMAN SIYAQ NUMBER ONE..OTTOMAN SIYAQ FRACTION ONE SIXTH
+1ED3E..1EDFF >FFFD # NA <reserved-1ED3E>..<reserved-1EDFF>
1EE00 >0627 # 6.1 ARABIC MATHEMATICAL ALEF
1EE01 >0628 # 6.1 ARABIC MATHEMATICAL BEH
1EE02 >062C # 6.1 ARABIC MATHEMATICAL JEEM
@@ -7703,7 +7841,8 @@ FFFE..FFFF >FFFD # 1.1 <noncharacter-FFFE>..<noncharacte
# 1F160..1F169valid # 6.0 NEGATIVE CIRCLED LATIN CAPITAL LETTER Q..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z
1F16A >006D 0063 # 6.1 RAISED MC SIGN
1F16B >006D 0064 # 6.1 RAISED MD SIGN
-1F16C..1F16F >FFFD # NA <reserved-1F16C>..<reserved-1F16F>
+1F16C >006D 0072 # 12.0 RAISED MR SIGN
+1F16D..1F16F >FFFD # NA <reserved-1F16D>..<reserved-1F16F>
# 1F170..1F178valid # 6.0 NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER I
# 1F179 valid # 5.2 NEGATIVE SQUARED LATIN CAPITAL LETTER J
# 1F17A valid # 6.0 NEGATIVE SQUARED LATIN CAPITAL LETTER K
@@ -7853,19 +7992,23 @@ FFFE..FFFF >FFFD # 1.1 <noncharacter-FFFE>..<noncharacte
# 1F6D0 valid # 8.0 PLACE OF WORSHIP
# 1F6D1..1F6D2valid # 9.0 OCTAGONAL SIGN..SHOPPING TROLLEY
# 1F6D3..1F6D4valid # 10.0 STUPA..PAGODA
-1F6D5..1F6DF >FFFD # NA <reserved-1F6D5>..<reserved-1F6DF>
+# 1F6D5 valid # 12.0 HINDU TEMPLE
+1F6D6..1F6DF >FFFD # NA <reserved-1F6D6>..<reserved-1F6DF>
# 1F6E0..1F6ECvalid # 7.0 HAMMER AND WRENCH..AIRPLANE ARRIVING
1F6ED..1F6EF >FFFD # NA <reserved-1F6ED>..<reserved-1F6EF>
# 1F6F0..1F6F3valid # 7.0 SATELLITE..PASSENGER SHIP
# 1F6F4..1F6F6valid # 9.0 SCOOTER..CANOE
# 1F6F7..1F6F8valid # 10.0 SLED..FLYING SAUCER
# 1F6F9 valid # 11.0 SKATEBOARD
-1F6FA..1F6FF >FFFD # NA <reserved-1F6FA>..<reserved-1F6FF>
+# 1F6FA valid # 12.0 AUTO RICKSHAW
+1F6FB..1F6FF >FFFD # NA <reserved-1F6FB>..<reserved-1F6FF>
# 1F700..1F773valid # 6.0 ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE
1F774..1F77F >FFFD # NA <reserved-1F774>..<reserved-1F77F>
# 1F780..1F7D4valid # 7.0 BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR
# 1F7D5..1F7D8valid # 11.0 CIRCLED TRIANGLE..NEGATIVE CIRCLED SQUARE
-1F7D9..1F7FF >FFFD # NA <reserved-1F7D9>..<reserved-1F7FF>
+1F7D9..1F7DF >FFFD # NA <reserved-1F7D9>..<reserved-1F7DF>
+# 1F7E0..1F7EBvalid # 12.0 LARGE ORANGE CIRCLE..LARGE BROWN SQUARE
+1F7EC..1F7FF >FFFD # NA <reserved-1F7EC>..<reserved-1F7FF>
# 1F800..1F80Bvalid # 7.0 LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD
1F80C..1F80F >FFFD # NA <reserved-1F80C>..<reserved-1F80F>
# 1F810..1F847valid # 7.0 LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW
@@ -7877,7 +8020,8 @@ FFFE..FFFF >FFFD # 1.1 <noncharacter-FFFE>..<noncharacte
# 1F890..1F8ADvalid # 7.0 LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS
1F8AE..1F8FF >FFFD # NA <reserved-1F8AE>..<reserved-1F8FF>
# 1F900..1F90Bvalid # 10.0 CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT
-1F90C..1F90F >FFFD # NA <reserved-1F90C>..<reserved-1F90F>
+1F90C >FFFD # NA <reserved-1F90C>
+# 1F90D..1F90Fvalid # 12.0 WHITE HEART..PINCHING HAND
# 1F910..1F918valid # 8.0 ZIPPER-MOUTH FACE..SIGN OF THE HORNS
# 1F919..1F91Evalid # 9.0 CALL ME HAND..HAND WITH INDEX AND MIDDLE FINGERS CROSSED
# 1F91F valid # 10.0 I LOVE YOU HAND SIGN
@@ -7886,34 +8030,49 @@ FFFE..FFFF >FFFD # 1.1 <noncharacter-FFFE>..<noncharacte
# 1F930 valid # 9.0 PREGNANT WOMAN
# 1F931..1F932valid # 10.0 BREAST-FEEDING..PALMS UP TOGETHER
# 1F933..1F93Evalid # 9.0 SELFIE..HANDBALL
-1F93F >FFFD # NA <reserved-1F93F>
+# 1F93F valid # 12.0 DIVING MASK
# 1F940..1F94Bvalid # 9.0 WILTED FLOWER..MARTIAL ARTS UNIFORM
# 1F94C valid # 10.0 CURLING STONE
# 1F94D..1F94Fvalid # 11.0 LACROSSE STICK AND BALL..FLYING DISC
# 1F950..1F95Evalid # 9.0 CROISSANT..PANCAKES
# 1F95F..1F96Bvalid # 10.0 DUMPLING..CANNED FOOD
# 1F96C..1F970valid # 11.0 LEAFY GREEN..SMILING FACE WITH SMILING EYES AND THREE HEARTS
-1F971..1F972 >FFFD # NA <reserved-1F971>..<reserved-1F972>
+# 1F971 valid # 12.0 YAWNING FACE
+1F972 >FFFD # NA <reserved-1F972>
# 1F973..1F976valid # 11.0 FACE WITH PARTY HORN AND PARTY HAT..FREEZING FACE
1F977..1F979 >FFFD # NA <reserved-1F977>..<reserved-1F979>
# 1F97A valid # 11.0 FACE WITH PLEADING EYES
-1F97B >FFFD # NA <reserved-1F97B>
+# 1F97B valid # 12.0 SARI
# 1F97C..1F97Fvalid # 11.0 LAB COAT..FLAT SHOE
# 1F980..1F984valid # 8.0 CRAB..UNICORN FACE
# 1F985..1F991valid # 9.0 EAGLE..SQUID
# 1F992..1F997valid # 10.0 GIRAFFE FACE..CRICKET
# 1F998..1F9A2valid # 11.0 KANGAROO..SWAN
-1F9A3..1F9AF >FFFD # NA <reserved-1F9A3>..<reserved-1F9AF>
+1F9A3..1F9A4 >FFFD # NA <reserved-1F9A3>..<reserved-1F9A4>
+# 1F9A5..1F9AAvalid # 12.0 SLOTH..OYSTER
+1F9AB..1F9AD >FFFD # NA <reserved-1F9AB>..<reserved-1F9AD>
+# 1F9AE..1F9AFvalid # 12.0 GUIDE DOG..PROBING CANE
# 1F9B0..1F9B9valid # 11.0 EMOJI COMPONENT RED HAIR..SUPERVILLAIN
-1F9BA..1F9BF >FFFD # NA <reserved-1F9BA>..<reserved-1F9BF>
+# 1F9BA..1F9BFvalid # 12.0 SAFETY VEST..MECHANICAL LEG
# 1F9C0 valid # 8.0 CHEESE WEDGE
# 1F9C1..1F9C2valid # 11.0 CUPCAKE..SALT SHAKER
-1F9C3..1F9CF >FFFD # NA <reserved-1F9C3>..<reserved-1F9CF>
+# 1F9C3..1F9CAvalid # 12.0 BEVERAGE BOX..ICE CUBE
+1F9CB..1F9CC >FFFD # NA <reserved-1F9CB>..<reserved-1F9CC>
+# 1F9CD..1F9CFvalid # 12.0 STANDING PERSON..DEAF PERSON
# 1F9D0..1F9E6valid # 10.0 FACE WITH MONOCLE..SOCKS
# 1F9E7..1F9FFvalid # 11.0 RED GIFT ENVELOPE..NAZAR AMULET
-1FA00..1FA5F >FFFD # NA <reserved-1FA00>..<reserved-1FA5F>
+# 1FA00..1FA53valid # 12.0 NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP
+1FA54..1FA5F >FFFD # NA <reserved-1FA54>..<reserved-1FA5F>
# 1FA60..1FA6Dvalid # 11.0 XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER
-1FA6E..1FFFD >FFFD # NA <reserved-1FA6E>..<reserved-1FFFD>
+1FA6E..1FA6F >FFFD # NA <reserved-1FA6E>..<reserved-1FA6F>
+# 1FA70..1FA73valid # 12.0 BALLET SHOES..SHORTS
+1FA74..1FA77 >FFFD # NA <reserved-1FA74>..<reserved-1FA77>
+# 1FA78..1FA7Avalid # 12.0 DROP OF BLOOD..STETHOSCOPE
+1FA7B..1FA7F >FFFD # NA <reserved-1FA7B>..<reserved-1FA7F>
+# 1FA80..1FA82valid # 12.0 YO-YO..PARACHUTE
+1FA83..1FA8F >FFFD # NA <reserved-1FA83>..<reserved-1FA8F>
+# 1FA90..1FA95valid # 12.0 RINGED PLANET..BANJO
+1FA96..1FFFD >FFFD # NA <reserved-1FA96>..<reserved-1FFFD>
1FFFE..1FFFF >FFFD # 2.0 <noncharacter-1FFFE>..<noncharacter-1FFFF>
# 20000..2A6D6valid # 3.1 CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
2A6D7..2A6FF >FFFD # NA <reserved-2A6D7>..<reserved-2A6FF>
diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/ppucd.txt b/Build/source/libs/icu/icu-src/source/data/unidata/ppucd.txt
index 068dfe8b019..83a8e59245e 100644
--- a/Build/source/libs/icu/icu-src/source/data/unidata/ppucd.txt
+++ b/Build/source/libs/icu/icu-src/source/data/unidata/ppucd.txt
@@ -1,7 +1,7 @@
# Preparsed UCD generated by ICU preparseucd.py
# Copyright (C) 1991 and later: Unicode, Inc. and others.
# License & terms of use: http://www.unicode.org/copyright.html
-ucd;11.0.0
+ucd;12.1.0
property;Catalog;age;Age
property;Binary;AHex;ASCII_Hex_Digit
@@ -123,6 +123,8 @@ binary;Y;Yes;T;True
value;age;1.1;V1_1
value;age;10.0;V10_0
value;age;11.0;V11_0
+value;age;12.0;V12_0
+value;age;12.1;V12_1
value;age;2.0;V2_0
value;age;2.1;V2_1
value;age;3.0;V3_0
@@ -246,8 +248,10 @@ value;blk;Dogra;Dogra
value;blk;Domino;Domino_Tiles
value;blk;Duployan;Duployan
value;blk;Early_Dynastic_Cuneiform;Early_Dynastic_Cuneiform
+value;blk;Egyptian_Hieroglyph_Format_Controls;Egyptian_Hieroglyph_Format_Controls
value;blk;Egyptian_Hieroglyphs;Egyptian_Hieroglyphs
value;blk;Elbasan;Elbasan
+value;blk;Elymaic;Elymaic
value;blk;Emoticons;Emoticons
value;blk;Enclosed_Alphanum;Enclosed_Alphanumerics
value;blk;Enclosed_Alphanum_Sup;Enclosed_Alphanumeric_Supplement
@@ -363,10 +367,12 @@ value;blk;Myanmar_Ext_B;Myanmar_Extended_B
value;blk;NB;No_Block
value;blk;NKo;NKo
value;blk;Nabataean;Nabataean
+value;blk;Nandinagari;Nandinagari
value;blk;New_Tai_Lue;New_Tai_Lue
value;blk;Newa;Newa
value;blk;Number_Forms;Number_Forms
value;blk;Nushu;Nushu
+value;blk;Nyiakeng_Puachue_Hmong;Nyiakeng_Puachue_Hmong
value;blk;OCR;Optical_Character_Recognition
value;blk;Ogham;Ogham
value;blk;Ol_Chiki;Ol_Chiki
@@ -382,6 +388,7 @@ value;blk;Oriya;Oriya
value;blk;Ornamental_Dingbats;Ornamental_Dingbats
value;blk;Osage;Osage
value;blk;Osmanya;Osmanya
+value;blk;Ottoman_Siyaq_Numbers;Ottoman_Siyaq_Numbers
value;blk;PUA;Private_Use_Area;Private_Use
value;blk;Pahawh_Hmong;Pahawh_Hmong
value;blk;Palmyrene;Palmyrene
@@ -406,6 +413,7 @@ value;blk;Siddham;Siddham
value;blk;Sinhala;Sinhala
value;blk;Sinhala_Archaic_Numbers;Sinhala_Archaic_Numbers
value;blk;Small_Forms;Small_Form_Variants
+value;blk;Small_Kana_Ext;Small_Kana_Extension
value;blk;Sogdian;Sogdian
value;blk;Sora_Sompeng;Sora_Sompeng
value;blk;Soyombo;Soyombo
@@ -423,6 +431,7 @@ value;blk;Sup_Symbols_And_Pictographs;Supplemental_Symbols_And_Pictographs
value;blk;Super_And_Sub;Superscripts_And_Subscripts
value;blk;Sutton_SignWriting;Sutton_SignWriting
value;blk;Syloti_Nagri;Syloti_Nagri
+value;blk;Symbols_And_Pictographs_Ext_A;Symbols_And_Pictographs_Extended_A
value;blk;Syriac;Syriac
value;blk;Syriac_Sup;Syriac_Supplement
value;blk;Tagalog;Tagalog
@@ -434,6 +443,7 @@ value;blk;Tai_Viet;Tai_Viet
value;blk;Tai_Xuan_Jing;Tai_Xuan_Jing_Symbols
value;blk;Takri;Takri
value;blk;Tamil;Tamil
+value;blk;Tamil_Sup;Tamil_Supplement
value;blk;Tangut;Tangut
value;blk;Tangut_Components;Tangut_Components
value;blk;Telugu;Telugu
@@ -451,6 +461,7 @@ value;blk;VS_Sup;Variation_Selectors_Supplement
value;blk;Vai;Vai
value;blk;Vedic_Ext;Vedic_Extensions
value;blk;Vertical_Forms;Vertical_Forms
+value;blk;Wancho;Wancho
value;blk;Warang_Citi;Warang_Citi
value;blk;Yi_Radicals;Yi_Radicals
value;blk;Yi_Syllables;Yi_Syllables
@@ -966,6 +977,7 @@ value;sc;Egyd;Egyd
value;sc;Egyh;Egyh
value;sc;Egyp;Egyptian_Hieroglyphs
value;sc;Elba;Elbasan
+value;sc;Elym;Elymaic
value;sc;Ethi;Ethiopic
value;sc;Geok;Geok
value;sc;Geor;Georgian
@@ -988,6 +1000,7 @@ value;sc;Hebr;Hebrew
value;sc;Hira;Hiragana
value;sc;Hluw;Anatolian_Hieroglyphs
value;sc;Hmng;Pahawh_Hmong
+value;sc;Hmnp;Nyiakeng_Puachue_Hmong
value;sc;Hrkt;Katakana_Or_Hiragana
value;sc;Hung;Old_Hungarian
value;sc;Inds;Inds
@@ -1036,6 +1049,7 @@ value;sc;Mroo;Mro
value;sc;Mtei;Meetei_Mayek
value;sc;Mult;Multani
value;sc;Mymr;Myanmar
+value;sc;Nand;Nandinagari
value;sc;Narb;Old_North_Arabian
value;sc;Nbat;Nabataean
value;sc;Newa;Newa
@@ -1101,6 +1115,7 @@ value;sc;Ugar;Ugaritic
value;sc;Vaii;Vai
value;sc;Visp;Visp
value;sc;Wara;Warang_Citi
+value;sc;Wcho;Wancho
value;sc;Wole;Wole
value;sc;Xpeo;Old_Persian
value;sc;Xsux;Cuneiform
@@ -1893,7 +1908,7 @@ cp;027E;na=LATIN SMALL LETTER R WITH FISHHOOK
cp;027F;na=LATIN SMALL LETTER REVERSED R WITH FISHHOOK
cp;0280;CWCM;CWT;CWU;na=LATIN LETTER SMALL CAPITAL R;stc=01A6;suc=01A6
cp;0281;na=LATIN LETTER SMALL CAPITAL INVERTED R
-cp;0282;na=LATIN SMALL LETTER S WITH HOOK
+cp;0282;CWCM;CWT;CWU;na=LATIN SMALL LETTER S WITH HOOK;stc=A7C5;suc=A7C5
cp;0283;CWCM;CWT;CWU;na=LATIN SMALL LETTER ESH;stc=01A9;suc=01A9
cp;0284;na=LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
cp;0285;na=LATIN SMALL LETTER SQUAT REVERSED ESH
@@ -2881,7 +2896,7 @@ cp;0608;age=5.1;-Alpha;gc=Sm;-IDC;-IDS;jt=U;Math;na=ARABIC RAY;SB=XX;WB=XX;-XIDC
# Punctuation
cp;0609;age=5.1;-Alpha;bc=ET;gc=Po;-IDC;-IDS;jt=U;lb=PO;na=ARABIC-INDIC PER MILLE SIGN;SB=XX;WB=XX;-XIDC;-XIDS
cp;060A;age=5.1;-Alpha;bc=ET;gc=Po;-IDC;-IDS;jt=U;lb=PO;na=ARABIC-INDIC PER TEN THOUSAND SIGN;SB=XX;WB=XX;-XIDC;-XIDS
-# Currency sign
+# Currency symbol
cp;060B;age=4.1;-Alpha;gc=Sc;-IDC;-IDS;jt=U;lb=PO;na=AFGHANI SIGN;SB=XX;WB=XX;-XIDC;-XIDS
# Punctuation
cp;060C;-Alpha;bc=CS;gc=Po;-IDC;-IDS;jt=U;lb=IS;na=ARABIC COMMA;SB=SC;sc=Zyyy;scx=Arab Rohg Syrc Thaa;Term;WB=MN;-XIDC;-XIDS
@@ -3435,7 +3450,7 @@ cp;07FA;CI;Ext;gc=Lm;jt=C;na=NKO LAJANYALAN
unassigned;07FB..07FC;bc=R
# Abbreviation sign
cp;07FD;age=11.0;-Alpha;bc=NSM;ccc=220;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=NKO DANTAYALAN;SB=EX;WB=Extend;-XIDS
-# Currency signs
+# Currency symbols
cp;07FE;age=11.0;-Alpha;gc=Sc;-IDC;-IDS;jt=U;lb=PR;na=NKO DOROME SIGN;SB=XX;WB=XX;-XIDC;-XIDS
cp;07FF;age=11.0;-Alpha;gc=Sc;-IDC;-IDS;jt=U;lb=PR;na=NKO TAMAN SIGN;SB=XX;WB=XX;-XIDC;-XIDS
@@ -3755,8 +3770,8 @@ cp;0950;InSC=Other;na=DEVANAGARI OM
cp;0951;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Cantillation_Mark;jt=T;lb=CM;na=DEVANAGARI STRESS SIGN UDATTA;SB=EX;sc=Zinh;scx=Beng Deva Gran Gujr Guru Knda Latn Mlym Orya Shrd Taml Telu Tirh;WB=Extend;-XIDS
cp;0952;-Alpha;bc=NSM;ccc=220;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Bottom;InSC=Cantillation_Mark;jt=T;lb=CM;na=DEVANAGARI STRESS SIGN ANUDATTA;SB=EX;sc=Zinh;scx=Beng Deva Gran Gujr Guru Knda Latn Mlym Orya Taml Telu Tirh;WB=Extend;-XIDS
# Accent marks
-cp;0953;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Other;jt=T;lb=CM;na=DEVANAGARI GRAVE ACCENT;SB=EX;WB=Extend;-XIDS
-cp;0954;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Other;jt=T;lb=CM;na=DEVANAGARI ACUTE ACCENT;SB=EX;WB=Extend;-XIDS
+cp;0953;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Other;jt=T;lb=CM;na=DEVANAGARI GRAVE ACCENT;SB=EX;sc=Zinh;WB=Extend;-XIDS
+cp;0954;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Other;jt=T;lb=CM;na=DEVANAGARI ACUTE ACCENT;SB=EX;sc=Zinh;WB=Extend;-XIDS
# Dependent vowel sign
cp;0955;age=5.2;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Vowel_Dependent;jt=T;lb=CM;na=DEVANAGARI VOWEL SIGN CANDRA LONG E;SB=EX;WB=Extend;-XIDS
# Dependent vowel signs for Kashmiri
@@ -3777,8 +3792,8 @@ cp;0961;InSC=Vowel_Independent;na=DEVANAGARI LETTER VOCALIC LL
cp;0962;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Bottom;InSC=Vowel_Dependent;jt=T;lb=CM;na=DEVANAGARI VOWEL SIGN VOCALIC L;SB=EX;WB=Extend;-XIDS
cp;0963;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Bottom;InSC=Vowel_Dependent;jt=T;lb=CM;na=DEVANAGARI VOWEL SIGN VOCALIC LL;SB=EX;WB=Extend;-XIDS
# Generic punctuation for scripts of India
-cp;0964;-Alpha;gc=Po;-IDC;-IDS;InSC=Other;lb=BA;na=DEVANAGARI DANDA;SB=ST;sc=Zyyy;scx=Beng Deva Dogr Gong Gran Gujr Guru Knda Mahj Mlym Orya Sind Sinh Sylo Takr Taml Telu Tirh;STerm;Term;WB=XX;-XIDC;-XIDS
-cp;0965;-Alpha;gc=Po;-IDC;-IDS;InSC=Other;lb=BA;na=DEVANAGARI DOUBLE DANDA;SB=ST;sc=Zyyy;scx=Beng Deva Dogr Gong Gran Gujr Guru Knda Limb Mahj Mlym Orya Sind Sinh Sylo Takr Taml Telu Tirh;STerm;Term;WB=XX;-XIDC;-XIDS
+cp;0964;-Alpha;gc=Po;-IDC;-IDS;InSC=Other;lb=BA;na=DEVANAGARI DANDA;SB=ST;sc=Zyyy;scx=Beng Deva Dogr Gong Gonm Gran Gujr Guru Knda Mahj Mlym Nand Orya Sind Sinh Sylo Takr Taml Telu Tirh;STerm;Term;WB=XX;-XIDC;-XIDS
+cp;0965;-Alpha;gc=Po;-IDC;-IDS;InSC=Other;lb=BA;na=DEVANAGARI DOUBLE DANDA;SB=ST;sc=Zyyy;scx=Beng Deva Dogr Gong Gonm Gran Gujr Guru Knda Limb Mahj Mlym Nand Orya Sind Sinh Sylo Takr Taml Telu Tirh;STerm;Term;WB=XX;-XIDC;-XIDS
# Digits
cp;0966;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=DEVANAGARI DIGIT ZERO;nt=De;nv=0;SB=NU;scx=Deva Dogr Kthi Mahj;WB=NU;-XIDS
cp;0967;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=DEVANAGARI DIGIT ONE;nt=De;nv=1;SB=NU;scx=Deva Dogr Kthi Mahj;WB=NU;-XIDS
@@ -3790,7 +3805,7 @@ cp;096C;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=DEVANAGARI DIGIT SIX;nt=De;nv=6;S
cp;096D;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=DEVANAGARI DIGIT SEVEN;nt=De;nv=7;SB=NU;scx=Deva Dogr Kthi Mahj;WB=NU;-XIDS
cp;096E;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=DEVANAGARI DIGIT EIGHT;nt=De;nv=8;SB=NU;scx=Deva Dogr Kthi Mahj;WB=NU;-XIDS
cp;096F;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=DEVANAGARI DIGIT NINE;nt=De;nv=9;SB=NU;scx=Deva Dogr Kthi Mahj;WB=NU;-XIDS
-# Abbreviation sign
+# Additional signs
cp;0970;-Alpha;gc=Po;-IDC;-IDS;InSC=Other;na=DEVANAGARI ABBREVIATION SIGN;SB=XX;WB=XX;-XIDC;-XIDS
cp;0971;age=5.1;CI;Dia;gc=Lm;InSC=Other;na=DEVANAGARI SIGN HIGH SPACING DOT
# Independent vowel for Marathi
@@ -3927,7 +3942,7 @@ cp;09EF;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=BENGALI DIGIT NINE;nt=De;nv=9;SB=
# Additions for Assamese
cp;09F0;na=BENGALI LETTER RA WITH MIDDLE DIAGONAL
cp;09F1;na=BENGALI LETTER RA WITH LOWER DIAGONAL
-# Currency signs
+# Currency symbols
cp;09F2;-Alpha;bc=ET;gc=Sc;-IDC;-IDS;InSC=Other;lb=PO;na=BENGALI RUPEE MARK;SB=XX;WB=XX;-XIDC;-XIDS
cp;09F3;-Alpha;bc=ET;gc=Sc;-IDC;-IDS;InSC=Other;lb=PO;na=BENGALI RUPEE SIGN;SB=XX;WB=XX;-XIDC;-XIDS
# Historic symbols for fractional values
@@ -4026,7 +4041,7 @@ cp;0A4C;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Vowel_Dependen
cp;0A4D;-Alpha;bc=NSM;ccc=9;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;Gr_Link;-IDS;InPC=Bottom;InSC=Virama;jt=T;lb=CM;na=GURMUKHI SIGN VIRAMA;SB=EX;WB=Extend;-XIDS
unassigned;0A4E..0A50
# Sign
-cp;0A51;age=5.1;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InSC=Cantillation_Mark;jt=T;lb=CM;na=GURMUKHI SIGN UDAAT;SB=EX;WB=Extend;-XIDS
+cp;0A51;age=5.1;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Bottom;InSC=Cantillation_Mark;jt=T;lb=CM;na=GURMUKHI SIGN UDAAT;SB=EX;WB=Extend;-XIDS
unassigned;0A52..0A58
# Additional consonants
cp;0A59;Comp_Ex;CWKCF;dm=0A16 0A3C;dt=Can;na=GURMUKHI LETTER KHHA;NFC_QC=N;NFD_QC=N;NFKC_CF=0A16 0A3C;NFKC_QC=N;NFKD_QC=N
@@ -4170,7 +4185,7 @@ cp;0AEE;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=GUJARATI DIGIT EIGHT;nt=De;nv=8;S
cp;0AEF;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=GUJARATI DIGIT NINE;nt=De;nv=9;SB=NU;scx=Gujr Khoj;WB=NU;-XIDS
# Abbreviation sign
cp;0AF0;age=6.1;-Alpha;gc=Po;-IDC;-IDS;InSC=Other;na=GUJARATI ABBREVIATION SIGN;SB=XX;WB=XX;-XIDC;-XIDS
-# Currency sign
+# Currency symbol
cp;0AF1;age=4.0;-Alpha;bc=ET;gc=Sc;-IDC;-IDS;InSC=Other;lb=PR;na=GUJARATI RUPEE SIGN;SB=XX;WB=XX;-XIDC;-XIDS
unassigned;0AF2..0AF8
# Additional consonant
@@ -4410,7 +4425,7 @@ cp;0BF7;age=4.0;-Alpha;bc=ON;gc=So;-IDC;InSC=Other;na=TAMIL CREDIT SIGN;SB=XX;WB
cp;0BF8;age=4.0;-Alpha;bc=ON;gc=So;-IDC;InSC=Other;na=TAMIL AS ABOVE SIGN;SB=XX;WB=XX;-XIDC
# Currency symbol
cp;0BF9;age=4.0;-Alpha;bc=ET;gc=Sc;-IDC;InSC=Other;lb=PR;na=TAMIL RUPEE SIGN;SB=XX;WB=XX;-XIDC
-# Tamil symbol
+# Tamil clerical symbol
cp;0BFA;age=4.0;-Alpha;bc=ON;gc=So;-IDC;InSC=Other;na=TAMIL NUMBER SIGN;SB=XX;WB=XX;-XIDC
unassigned;0BFB..0BFF
@@ -4527,7 +4542,9 @@ cp;0C6C;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=TELUGU DIGIT SIX;nt=De;nv=6;SB=NU
cp;0C6D;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=TELUGU DIGIT SEVEN;nt=De;nv=7;SB=NU;WB=NU;-XIDS
cp;0C6E;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=TELUGU DIGIT EIGHT;nt=De;nv=8;SB=NU;WB=NU;-XIDS
cp;0C6F;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=TELUGU DIGIT NINE;nt=De;nv=9;SB=NU;WB=NU;-XIDS
-unassigned;0C70..0C77
+unassigned;0C70..0C76
+# Sign
+cp;0C77;age=12.0;-Alpha;gc=Po;-IDC;-IDS;InSC=Other;lb=BB;na=TELUGU SIGN SIDDHAM;SB=XX;WB=XX;-XIDC;-XIDS
# Telugu fractions and weights
cp;0C78;age=5.1;-Alpha;bc=ON;gc=No;-IDC;-IDS;InSC=Other;na=TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;nt=Nu;nv=0;SB=XX;WB=XX;-XIDC;-XIDS
cp;0C79;age=5.1;-Alpha;bc=ON;gc=No;-IDC;-IDS;InSC=Other;na=TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;nt=Nu;nv=1;SB=XX;WB=XX;-XIDC;-XIDS
@@ -4541,7 +4558,7 @@ cp;0C7F;age=5.1;-Alpha;gc=So;-IDC;-IDS;InSC=Other;na=TELUGU SIGN TUUMU;SB=XX;WB=
block;0C80..0CFF;age=1.1;Alpha;blk=Kannada;gc=Lo;Gr_Base;IDC;IDS;InSC=Consonant;lb=AL;SB=LE;sc=Knda;WB=LE;XIDC;XIDS
# 0C80..0CFF Kannada
# Various signs
-cp;0C80;age=9.0;InSC=Other;na=KANNADA SIGN SPACING CANDRABINDU
+cp;0C80;age=9.0;InSC=Bindu;na=KANNADA SIGN SPACING CANDRABINDU
cp;0C81;age=7.0;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Bindu;jt=T;lb=CM;na=KANNADA SIGN CANDRABINDU;SB=EX;WB=Extend;-XIDS
cp;0C82;gc=Mc;GCB=SM;-IDS;InPC=Right;InSC=Bindu;lb=CM;na=KANNADA SIGN ANUSVARA;SB=EX;WB=Extend;-XIDS
cp;0C83;gc=Mc;GCB=SM;-IDS;InPC=Right;InSC=Visarga;lb=CM;na=KANNADA SIGN VISARGA;SB=EX;WB=Extend;-XIDS
@@ -4640,16 +4657,16 @@ cp;0CE3;age=5.0;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Bottom;InSC=Vow
# Reserved
unassigned;0CE4..0CE5
# Digits
-cp;0CE6;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT ZERO;nt=De;nv=0;SB=NU;WB=NU;-XIDS
-cp;0CE7;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT ONE;nt=De;nv=1;SB=NU;WB=NU;-XIDS
-cp;0CE8;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT TWO;nt=De;nv=2;SB=NU;WB=NU;-XIDS
-cp;0CE9;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT THREE;nt=De;nv=3;SB=NU;WB=NU;-XIDS
-cp;0CEA;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT FOUR;nt=De;nv=4;SB=NU;WB=NU;-XIDS
-cp;0CEB;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT FIVE;nt=De;nv=5;SB=NU;WB=NU;-XIDS
-cp;0CEC;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT SIX;nt=De;nv=6;SB=NU;WB=NU;-XIDS
-cp;0CED;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT SEVEN;nt=De;nv=7;SB=NU;WB=NU;-XIDS
-cp;0CEE;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT EIGHT;nt=De;nv=8;SB=NU;WB=NU;-XIDS
-cp;0CEF;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT NINE;nt=De;nv=9;SB=NU;WB=NU;-XIDS
+cp;0CE6;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT ZERO;nt=De;nv=0;SB=NU;scx=Knda Nand;WB=NU;-XIDS
+cp;0CE7;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT ONE;nt=De;nv=1;SB=NU;scx=Knda Nand;WB=NU;-XIDS
+cp;0CE8;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT TWO;nt=De;nv=2;SB=NU;scx=Knda Nand;WB=NU;-XIDS
+cp;0CE9;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT THREE;nt=De;nv=3;SB=NU;scx=Knda Nand;WB=NU;-XIDS
+cp;0CEA;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT FOUR;nt=De;nv=4;SB=NU;scx=Knda Nand;WB=NU;-XIDS
+cp;0CEB;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT FIVE;nt=De;nv=5;SB=NU;scx=Knda Nand;WB=NU;-XIDS
+cp;0CEC;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT SIX;nt=De;nv=6;SB=NU;scx=Knda Nand;WB=NU;-XIDS
+cp;0CED;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT SEVEN;nt=De;nv=7;SB=NU;scx=Knda Nand;WB=NU;-XIDS
+cp;0CEE;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT EIGHT;nt=De;nv=8;SB=NU;scx=Knda Nand;WB=NU;-XIDS
+cp;0CEF;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=KANNADA DIGIT NINE;nt=De;nv=9;SB=NU;scx=Knda Nand;WB=NU;-XIDS
unassigned;0CF0
# Signs used in Sanskrit
cp;0CF1;age=5.0;InSC=Consonant_With_Stacker;na=KANNADA SIGN JIHVAMULIYA
@@ -5034,19 +5051,26 @@ cp;0E81;na=LAO LETTER KO
cp;0E82;na=LAO LETTER KHO SUNG
unassigned;0E83
cp;0E84;na=LAO LETTER KHO TAM
-unassigned;0E85..0E86
+unassigned;0E85
+cp;0E86;age=12.0;na=LAO LETTER PALI GHA
cp;0E87;na=LAO LETTER NGO
cp;0E88;na=LAO LETTER CO
-unassigned;0E89
+cp;0E89;age=12.0;na=LAO LETTER PALI CHA
cp;0E8A;na=LAO LETTER SO TAM
-unassigned;0E8B..0E8C
+unassigned;0E8B
+cp;0E8C;age=12.0;na=LAO LETTER PALI JHA
cp;0E8D;na=LAO LETTER NYO
-unassigned;0E8E..0E93
+cp;0E8E;age=12.0;na=LAO LETTER PALI NYA
+cp;0E8F;age=12.0;na=LAO LETTER PALI TTA
+cp;0E90;age=12.0;na=LAO LETTER PALI TTHA
+cp;0E91;age=12.0;na=LAO LETTER PALI DDA
+cp;0E92;age=12.0;na=LAO LETTER PALI DDHA
+cp;0E93;age=12.0;na=LAO LETTER PALI NNA
cp;0E94;na=LAO LETTER DO
cp;0E95;na=LAO LETTER TO
cp;0E96;na=LAO LETTER THO SUNG
cp;0E97;na=LAO LETTER THO TAM
-unassigned;0E98
+cp;0E98;age=12.0;na=LAO LETTER PALI DHA
cp;0E99;na=LAO LETTER NO
cp;0E9A;na=LAO LETTER BO
cp;0E9B;na=LAO LETTER PO
@@ -5054,7 +5078,7 @@ cp;0E9C;na=LAO LETTER PHO SUNG
cp;0E9D;na=LAO LETTER FO TAM;Name_Alias=correction=LAO LETTER FO FON
cp;0E9E;na=LAO LETTER PHO TAM
cp;0E9F;na=LAO LETTER FO SUNG;Name_Alias=correction=LAO LETTER FO FAY
-unassigned;0EA0
+cp;0EA0;age=12.0;na=LAO LETTER PALI BHA
cp;0EA1;na=LAO LETTER MO
cp;0EA2;na=LAO LETTER YO
cp;0EA3;na=LAO LETTER LO LING;Name_Alias=correction=LAO LETTER RO
@@ -5062,10 +5086,11 @@ unassigned;0EA4
cp;0EA5;na=LAO LETTER LO LOOT;Name_Alias=correction=LAO LETTER LO
unassigned;0EA6
cp;0EA7;na=LAO LETTER WO
-unassigned;0EA8..0EA9
+cp;0EA8;age=12.0;na=LAO LETTER SANSKRIT SHA
+cp;0EA9;age=12.0;na=LAO LETTER SANSKRIT SSA
cp;0EAA;na=LAO LETTER SO SUNG
cp;0EAB;na=LAO LETTER HO SUNG
-unassigned;0EAC
+cp;0EAC;age=12.0;na=LAO LETTER PALI LLA
cp;0EAD;na=LAO LETTER O
cp;0EAE;na=LAO LETTER HO TAM
# Sign
@@ -5081,7 +5106,9 @@ cp;0EB6;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Vowel_Dependen
cp;0EB7;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Vowel_Dependent;jt=T;na=LAO VOWEL SIGN YY;SB=EX;WB=Extend;-XIDS
cp;0EB8;bc=NSM;ccc=118;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Bottom;InSC=Vowel_Dependent;jt=T;na=LAO VOWEL SIGN U;SB=EX;WB=Extend;-XIDS
cp;0EB9;bc=NSM;ccc=118;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Bottom;InSC=Vowel_Dependent;jt=T;na=LAO VOWEL SIGN UU;SB=EX;WB=Extend;-XIDS
-unassigned;0EBA
+# Virama
+cp;0EBA;age=12.0;-Alpha;bc=NSM;ccc=9;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;Gr_Link;-IDS;InPC=Bottom;InSC=Pure_Killer;jt=T;na=LAO SIGN PALI VIRAMA;SB=EX;WB=Extend;-XIDS
+# Vowel
cp;0EBB;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Vowel_Dependent;jt=T;na=LAO VOWEL SIGN MAI KON;SB=EX;WB=Extend;-XIDS
# Signs
cp;0EBC;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Bottom;InSC=Consonant_Medial;jt=T;na=LAO SEMIVOWEL SIGN LO;SB=EX;WB=Extend;-XIDS
@@ -5487,18 +5514,18 @@ cp;1060;age=5.1;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Bottom;InSC=Consonan
# Extensions for S'gaw Karen
cp;1061;age=5.1;IDS;na=MYANMAR LETTER SGAW KAREN SHA;WB=XX;XIDS
cp;1062;age=5.1;gc=Mc;InPC=Right;InSC=Vowel_Dependent;na=MYANMAR VOWEL SIGN SGAW KAREN EU;SB=EX
-cp;1063;age=5.1;-Alpha;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR TONE MARK SGAW KAREN HATHI;SB=EX
-cp;1064;age=5.1;-Alpha;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR TONE MARK SGAW KAREN KE PHO;SB=EX
+cp;1063;age=5.1;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR TONE MARK SGAW KAREN HATHI;SB=EX
+cp;1064;age=5.1;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR TONE MARK SGAW KAREN KE PHO;SB=EX
# Extensions for Western Pwo Karen
cp;1065;age=5.1;IDS;na=MYANMAR LETTER WESTERN PWO KAREN THA;WB=XX;XIDS
cp;1066;age=5.1;IDS;na=MYANMAR LETTER WESTERN PWO KAREN PWA;WB=XX;XIDS
cp;1067;age=5.1;gc=Mc;InPC=Right;InSC=Vowel_Dependent;na=MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;SB=EX
cp;1068;age=5.1;gc=Mc;InPC=Right;InSC=Vowel_Dependent;na=MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;SB=EX
-cp;1069;age=5.1;-Alpha;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN WESTERN PWO KAREN TONE-1;SB=EX
-cp;106A;age=5.1;-Alpha;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN WESTERN PWO KAREN TONE-2;SB=EX
-cp;106B;age=5.1;-Alpha;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN WESTERN PWO KAREN TONE-3;SB=EX
-cp;106C;age=5.1;-Alpha;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN WESTERN PWO KAREN TONE-4;SB=EX
-cp;106D;age=5.1;-Alpha;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN WESTERN PWO KAREN TONE-5;SB=EX
+cp;1069;age=5.1;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN WESTERN PWO KAREN TONE-1;SB=EX
+cp;106A;age=5.1;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN WESTERN PWO KAREN TONE-2;SB=EX
+cp;106B;age=5.1;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN WESTERN PWO KAREN TONE-3;SB=EX
+cp;106C;age=5.1;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN WESTERN PWO KAREN TONE-4;SB=EX
+cp;106D;age=5.1;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN WESTERN PWO KAREN TONE-5;SB=EX
# Extensions for Eastern Pwo Karen
cp;106E;age=5.1;IDS;na=MYANMAR LETTER EASTERN PWO KAREN NNA;WB=XX;XIDS
cp;106F;age=5.1;IDS;na=MYANMAR LETTER EASTERN PWO KAREN YWA;WB=XX;XIDS
@@ -5528,16 +5555,16 @@ cp;1083;age=5.1;gc=Mc;InPC=Right;InSC=Vowel_Dependent;na=MYANMAR VOWEL SIGN SHAN
cp;1084;age=5.1;gc=Mc;GCB=SM;InPC=Left;InSC=Vowel_Dependent;na=MYANMAR VOWEL SIGN SHAN E;SB=EX
cp;1085;age=5.1;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Vowel_Dependent;jt=T;na=MYANMAR VOWEL SIGN SHAN E ABOVE;SB=EX
cp;1086;age=5.1;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Vowel_Dependent;jt=T;na=MYANMAR VOWEL SIGN SHAN FINAL Y;SB=EX
-cp;1087;age=5.1;-Alpha;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN SHAN TONE-2;SB=EX
-cp;1088;age=5.1;-Alpha;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN SHAN TONE-3;SB=EX
-cp;1089;age=5.1;-Alpha;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN SHAN TONE-5;SB=EX
-cp;108A;age=5.1;-Alpha;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN SHAN TONE-6;SB=EX
-cp;108B;age=5.1;-Alpha;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN SHAN COUNCIL TONE-2;SB=EX
-cp;108C;age=5.1;-Alpha;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN SHAN COUNCIL TONE-3;SB=EX
-cp;108D;age=5.1;-Alpha;bc=NSM;ccc=220;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Bottom;InSC=Tone_Mark;jt=T;na=MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;SB=EX
+cp;1087;age=5.1;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN SHAN TONE-2;SB=EX
+cp;1088;age=5.1;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN SHAN TONE-3;SB=EX
+cp;1089;age=5.1;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN SHAN TONE-5;SB=EX
+cp;108A;age=5.1;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN SHAN TONE-6;SB=EX
+cp;108B;age=5.1;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN SHAN COUNCIL TONE-2;SB=EX
+cp;108C;age=5.1;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN SHAN COUNCIL TONE-3;SB=EX
+cp;108D;age=5.1;bc=NSM;ccc=220;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Bottom;InSC=Tone_Mark;jt=T;na=MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;SB=EX
# Extensions for Rumai Palaung
cp;108E;age=5.1;IDS;na=MYANMAR LETTER RUMAI PALAUNG FA;WB=XX;XIDS
-cp;108F;age=5.1;-Alpha;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN RUMAI PALAUNG TONE-5;SB=EX
+cp;108F;age=5.1;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN RUMAI PALAUNG TONE-5;SB=EX
# Shan digits
cp;1090;age=5.1;-Alpha;gc=Nd;InSC=Number;lb=NU;na=MYANMAR SHAN DIGIT ZERO;nt=De;nv=0;SB=NU;WB=NU
cp;1091;age=5.1;-Alpha;gc=Nd;InSC=Number;lb=NU;na=MYANMAR SHAN DIGIT ONE;nt=De;nv=1;SB=NU;WB=NU
@@ -5550,8 +5577,8 @@ cp;1097;age=5.1;-Alpha;gc=Nd;InSC=Number;lb=NU;na=MYANMAR SHAN DIGIT SEVEN;nt=De
cp;1098;age=5.1;-Alpha;gc=Nd;InSC=Number;lb=NU;na=MYANMAR SHAN DIGIT EIGHT;nt=De;nv=8;SB=NU;WB=NU
cp;1099;age=5.1;-Alpha;gc=Nd;InSC=Number;lb=NU;na=MYANMAR SHAN DIGIT NINE;nt=De;nv=9;SB=NU;WB=NU
# Extensions for Khamti Shan
-cp;109A;age=5.2;-Alpha;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN KHAMTI TONE-1;SB=EX
-cp;109B;age=5.2;-Alpha;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN KHAMTI TONE-3;SB=EX
+cp;109A;age=5.2;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN KHAMTI TONE-1;SB=EX
+cp;109B;age=5.2;Dia;gc=Mc;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN KHAMTI TONE-3;SB=EX
# Extensions for Aiton and Phake
cp;109C;age=5.2;gc=Mc;InPC=Right;InSC=Vowel_Dependent;na=MYANMAR VOWEL SIGN AITON A;SB=EX
cp;109D;age=5.2;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Vowel_Dependent;jt=T;na=MYANMAR VOWEL SIGN AITON AI;SB=EX
@@ -5559,7 +5586,7 @@ cp;109D;age=5.2;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Vowel_Depen
cp;109E;age=5.1;-Alpha;gc=So;-IDC;InSC=Other;na=MYANMAR SYMBOL SHAN ONE;SB=XX;WB=XX;-XIDC
cp;109F;age=5.1;-Alpha;gc=So;-IDC;InSC=Other;na=MYANMAR SYMBOL SHAN EXCLAMATION;SB=XX;WB=XX;-XIDC
-block;10A0..10FF;age=1.1;Alpha;blk=Georgian;Cased;CWCM;gc=Ll;Gr_Base;IDC;IDS;lb=AL;SB=LO;sc=Geor;WB=LE;XIDC;XIDS
+block;10A0..10FF;age=1.1;Alpha;blk=Georgian;Cased;CWCM;gc=Ll;Gr_Base;IDC;IDS;lb=AL;SB=LE;sc=Geor;WB=LE;XIDC;XIDS
# 10A0..10FF Georgian
# Capital letters (Khutsuri)
cp;10A0;cf=2D00;CWCF;CWKCF;CWL;gc=Lu;na=GEORGIAN CAPITAL LETTER AN;NFKC_CF=2D00;SB=UP;scf=2D00;slc=2D00;Upper
@@ -5657,7 +5684,7 @@ cp;10FA;age=4.1;CWU;Lower;na=GEORGIAN LETTER AIN;stc=10FA;suc=1CBA
# Punctuation
cp;10FB;-Alpha;-Cased;-CWCM;gc=Po;-IDC;-IDS;na=GEORGIAN PARAGRAPH SEPARATOR;SB=XX;sc=Zyyy;scx=Geor Latn;WB=XX;-XIDC;-XIDS
# Modifier letter
-cp;10FC;age=4.1;-Cased;CI;-CWCM;CWKCF;dm=10DC;dt=Sup;gc=Lm;na=MODIFIER LETTER GEORGIAN NAR;NFKC_CF=10DC;NFKC_QC=N;NFKD_QC=N;SB=LE
+cp;10FC;age=4.1;-Cased;CI;-CWCM;CWKCF;dm=10DC;dt=Sup;gc=Lm;na=MODIFIER LETTER GEORGIAN NAR;NFKC_CF=10DC;NFKC_QC=N;NFKD_QC=N
# Additional letters for Ossetian and Abkhaz
cp;10FD;age=6.1;CWU;Lower;na=GEORGIAN LETTER AEN;stc=10FD;suc=1CBD
cp;10FE;age=6.1;CWU;Lower;na=GEORGIAN LETTER HARD SIGN;stc=10FE;suc=1CBE
@@ -6274,9 +6301,9 @@ cp;1359;na=ETHIOPIC SYLLABLE MYA
cp;135A;na=ETHIOPIC SYLLABLE FYA
unassigned;135B..135C
# Combining marks
-cp;135D;age=6.0;-Alpha;bc=NSM;ccc=230;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK;SB=EX;WB=Extend;-XIDS
-cp;135E;age=6.0;-Alpha;bc=NSM;ccc=230;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=ETHIOPIC COMBINING VOWEL LENGTH MARK;SB=EX;WB=Extend;-XIDS
-cp;135F;age=4.1;bc=NSM;ccc=230;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=ETHIOPIC COMBINING GEMINATION MARK;SB=EX;WB=Extend;-XIDS
+cp;135D;age=6.0;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK;SB=EX;WB=Extend;-XIDS
+cp;135E;age=6.0;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=ETHIOPIC COMBINING VOWEL LENGTH MARK;SB=EX;WB=Extend;-XIDS
+cp;135F;age=4.1;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=ETHIOPIC COMBINING GEMINATION MARK;SB=EX;WB=Extend;-XIDS
# Punctuation
cp;1360;age=4.1;-Alpha;gc=Po;-IDC;-IDS;na=ETHIOPIC SECTION MARK;SB=XX;WB=XX;-XIDC;-XIDS
cp;1361;-Alpha;gc=Po;-IDC;-IDS;lb=BA;na=ETHIOPIC WORDSPACE;SB=XX;Term;WB=XX;-XIDC;-XIDS
@@ -7070,7 +7097,7 @@ cp;166A;na=CANADIAN SYLLABICS CARRIER TTSEE
cp;166B;na=CANADIAN SYLLABICS CARRIER TTSI
cp;166C;na=CANADIAN SYLLABICS CARRIER TTSA
# Symbol
-cp;166D;-Alpha;gc=Po;-IDC;-IDS;na=CANADIAN SYLLABICS CHI SIGN;SB=XX;Term;WB=XX;-XIDC;-XIDS
+cp;166D;-Alpha;gc=So;-IDC;-IDS;na=CANADIAN SYLLABICS CHI SIGN;SB=XX;WB=XX;-XIDC;-XIDS
# Punctuation
cp;166E;-Alpha;gc=Po;-IDC;-IDS;na=CANADIAN SYLLABICS FULL STOP;SB=ST;STerm;Term;WB=XX;-XIDC;-XIDS
# Syllables
@@ -7944,7 +7971,7 @@ cp;19D6;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=NEW TAI LUE DIGIT SIX;nt=De;nv=6;
cp;19D7;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=NEW TAI LUE DIGIT SEVEN;nt=De;nv=7;SB=NU;WB=NU;-XIDS
cp;19D8;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=NEW TAI LUE DIGIT EIGHT;nt=De;nv=8;SB=NU;WB=NU;-XIDS
cp;19D9;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=NEW TAI LUE DIGIT NINE;nt=De;nv=9;SB=NU;WB=NU;-XIDS
-cp;19DA;age=5.2;-Alpha;gc=No;-IDS;InSC=Other;na=NEW TAI LUE THAM DIGIT ONE;nt=Di;nv=1;SB=XX;-XIDS
+cp;19DA;age=5.2;-Alpha;gc=No;-IDS;InSC=Number;na=NEW TAI LUE THAM DIGIT ONE;nt=Di;nv=1;SB=XX;-XIDS
unassigned;19DB..19DD
# Various signs
cp;19DE;-Alpha;bc=ON;gc=So;-IDC;-IDS;InSC=Other;na=NEW TAI LUE SIGN LAE;SB=XX;-XIDC;-XIDS
@@ -8253,7 +8280,7 @@ cp;1B33;IDS;na=BALINESE LETTER HA;XIDS
# Sign
cp;1B34;-Alpha;bc=NSM;ccc=7;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Nukta;jt=T;lb=CM;na=BALINESE SIGN REREKAN;SB=EX;WB=Extend
# Dependent vowel signs
-cp;1B35;gc=Mc;GCB=SM;InPC=Right;InSC=Vowel_Dependent;lb=CM;na=BALINESE VOWEL SIGN TEDUNG;NFC_QC=M;NFKC_QC=M;SB=EX;WB=Extend
+cp;1B35;gc=Mc;GCB=EX;-Gr_Base;Gr_Ext;InPC=Right;InSC=Vowel_Dependent;lb=CM;na=BALINESE VOWEL SIGN TEDUNG;NFC_QC=M;NFKC_QC=M;SB=EX;WB=Extend
cp;1B36;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Vowel_Dependent;jt=T;lb=CM;na=BALINESE VOWEL SIGN ULU;SB=EX;WB=Extend
cp;1B37;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Vowel_Dependent;jt=T;lb=CM;na=BALINESE VOWEL SIGN ULU SARI;SB=EX;WB=Extend
cp;1B38;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Bottom;InSC=Vowel_Dependent;jt=T;lb=CM;na=BALINESE VOWEL SIGN SUKU;SB=EX;WB=Extend
@@ -8536,7 +8563,7 @@ cp;1C33;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Consonant_Final;jt=
cp;1C34;gc=Mc;GCB=SM;InPC=Left;InSC=Bindu;lb=CM;na=LEPCHA CONSONANT SIGN NYIN-DO;SB=EX;WB=Extend
cp;1C35;gc=Mc;GCB=SM;InPC=Left;InSC=Bindu;lb=CM;na=LEPCHA CONSONANT SIGN KANG;SB=EX;WB=Extend
# Various signs
-cp;1C36;-Alpha;bc=NSM;CI;Dia;Ext;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Syllable_Modifier;jt=T;lb=CM;na=LEPCHA SIGN RAN;SB=EX;WB=Extend
+cp;1C36;bc=NSM;CI;Dia;Ext;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Syllable_Modifier;jt=T;lb=CM;na=LEPCHA SIGN RAN;SB=EX;WB=Extend
cp;1C37;-Alpha;bc=NSM;ccc=7;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Bottom;InSC=Nukta;jt=T;lb=CM;na=LEPCHA SIGN NUKTA;SB=EX;WB=Extend
unassigned;1C38..1C3A
# Punctuation
@@ -8631,7 +8658,7 @@ cp;1C87;cf=0463;na=CYRILLIC SMALL LETTER TALL YAT;NFKC_CF=0463;scf=0463;stc=0462
cp;1C88;cf=A64B;na=CYRILLIC SMALL LETTER UNBLENDED UK;NFKC_CF=A64B;scf=A64B;stc=A64A;suc=A64A
unassigned;1C89..1C8F
-block;1C90..1CBF;age=11.0;Alpha;blk=Georgian_Ext;Cased;CWCF;CWCM;CWKCF;CWL;gc=Lu;Gr_Base;IDC;IDS;lb=AL;SB=UP;sc=Geor;Upper;WB=LE;XIDC;XIDS
+block;1C90..1CBF;age=11.0;Alpha;blk=Georgian_Ext;Cased;CWCF;CWCM;CWKCF;CWL;gc=Lu;Gr_Base;IDC;IDS;lb=AL;SB=LE;sc=Geor;Upper;WB=LE;XIDC;XIDS
# 1C90..1CBF Georgian Extended
# Capital letters (Mtavruli)
cp;1C90;cf=10D0;na=GEORGIAN MTAVRULI CAPITAL LETTER AN;NFKC_CF=10D0;scf=10D0;slc=10D0
@@ -8667,6 +8694,7 @@ cp;1CAD;cf=10ED;na=GEORGIAN MTAVRULI CAPITAL LETTER CHAR;NFKC_CF=10ED;scf=10ED;s
cp;1CAE;cf=10EE;na=GEORGIAN MTAVRULI CAPITAL LETTER XAN;NFKC_CF=10EE;scf=10EE;slc=10EE
cp;1CAF;cf=10EF;na=GEORGIAN MTAVRULI CAPITAL LETTER JHAN;NFKC_CF=10EF;scf=10EF;slc=10EF
cp;1CB0;cf=10F0;na=GEORGIAN MTAVRULI CAPITAL LETTER HAE;NFKC_CF=10F0;scf=10F0;slc=10F0
+# Archaic letters
cp;1CB1;cf=10F1;na=GEORGIAN MTAVRULI CAPITAL LETTER HE;NFKC_CF=10F1;scf=10F1;slc=10F1
cp;1CB2;cf=10F2;na=GEORGIAN MTAVRULI CAPITAL LETTER HIE;NFKC_CF=10F2;scf=10F2;slc=10F2
cp;1CB3;cf=10F3;na=GEORGIAN MTAVRULI CAPITAL LETTER WE;NFKC_CF=10F3;scf=10F3;slc=10F3
@@ -8732,8 +8760,8 @@ cp;1CE5;ccc=1;InPC=Overstruck;InSC=Other;na=VEDIC SIGN VISARGA ANUDATTA
cp;1CE6;ccc=1;InPC=Overstruck;InSC=Other;na=VEDIC SIGN REVERSED VISARGA ANUDATTA
cp;1CE7;ccc=1;InPC=Overstruck;InSC=Other;na=VEDIC SIGN VISARGA UDATTA WITH TAIL
cp;1CE8;ccc=1;InPC=Overstruck;InSC=Other;na=VEDIC SIGN VISARGA ANUDATTA WITH TAIL
-# Marks of nasalization
-cp;1CE9;Alpha;bc=L;-CI;-Dia;gc=Lo;GCB=XX;Gr_Base;-Gr_Ext;IDS;InSC=Other;jt=U;lb=AL;na=VEDIC SIGN ANUSVARA ANTARGOMUKHA;SB=LE;sc=Zyyy;WB=LE;XIDS
+# Nasalization signs
+cp;1CE9;Alpha;bc=L;-CI;-Dia;gc=Lo;GCB=XX;Gr_Base;-Gr_Ext;IDS;InSC=Other;jt=U;lb=AL;na=VEDIC SIGN ANUSVARA ANTARGOMUKHA;SB=LE;sc=Zyyy;scx=Deva Nand;WB=LE;XIDS
cp;1CEA;Alpha;bc=L;-CI;-Dia;gc=Lo;GCB=XX;Gr_Base;-Gr_Ext;IDS;InSC=Other;jt=U;lb=AL;na=VEDIC SIGN ANUSVARA BAHIRGOMUKHA;SB=LE;sc=Zyyy;scx=Beng Deva;WB=LE;XIDS
cp;1CEB;Alpha;bc=L;-CI;-Dia;gc=Lo;GCB=XX;Gr_Base;-Gr_Ext;IDS;InSC=Other;jt=U;lb=AL;na=VEDIC SIGN ANUSVARA VAMAGOMUKHA;SB=LE;sc=Zyyy;WB=LE;XIDS
cp;1CEC;Alpha;bc=L;-CI;-Dia;gc=Lo;GCB=XX;Gr_Base;-Gr_Ext;IDS;InSC=Other;jt=U;lb=AL;na=VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL;SB=LE;sc=Zyyy;WB=LE;XIDS
@@ -8743,8 +8771,8 @@ cp;1CEF;Alpha;bc=L;-CI;-Dia;gc=Lo;GCB=XX;Gr_Base;-Gr_Ext;IDS;InSC=Other;jt=U;lb=
cp;1CF0;Alpha;bc=L;-CI;-Dia;gc=Lo;GCB=XX;Gr_Base;-Gr_Ext;IDS;InSC=Other;jt=U;lb=AL;na=VEDIC SIGN RTHANG LONG ANUSVARA;SB=LE;sc=Zyyy;WB=LE;XIDS
cp;1CF1;Alpha;bc=L;-CI;-Dia;gc=Lo;GCB=XX;Gr_Base;-Gr_Ext;IDS;InSC=Other;jt=U;lb=AL;na=VEDIC SIGN ANUSVARA UBHAYATO MUKHA;SB=LE;sc=Zyyy;WB=LE;XIDS
# Ardhavisarga
-cp;1CF2;Alpha;bc=L;-CI;-Dia;gc=Mc;GCB=SM;Gr_Base;-Gr_Ext;InSC=Visarga;jt=U;na=VEDIC SIGN ARDHAVISARGA;sc=Zyyy;scx=Deva Gran
-cp;1CF3;age=6.1;Alpha;bc=L;-CI;-Dia;gc=Mc;GCB=SM;Gr_Base;-Gr_Ext;InSC=Visarga;jt=U;na=VEDIC SIGN ROTATED ARDHAVISARGA;sc=Zyyy;scx=Deva Gran
+cp;1CF2;Alpha;bc=L;-CI;-Dia;gc=Lo;GCB=XX;Gr_Base;-Gr_Ext;IDS;InSC=Consonant_Dead;jt=U;lb=AL;na=VEDIC SIGN ARDHAVISARGA;SB=LE;sc=Zyyy;scx=Beng Deva Gran Knda Nand Orya Telu Tirh;WB=LE;XIDS
+cp;1CF3;age=6.1;Alpha;bc=L;-CI;-Dia;gc=Lo;GCB=XX;Gr_Base;-Gr_Ext;IDS;InSC=Consonant_Dead;jt=U;lb=AL;na=VEDIC SIGN ROTATED ARDHAVISARGA;SB=LE;sc=Zyyy;scx=Deva Gran;WB=LE;XIDS
# Sign for Yajurvedic
cp;1CF4;age=6.1;ccc=230;InPC=Top;na=VEDIC TONE CANDRA ABOVE;scx=Deva Gran Knda
# Signs
@@ -8754,7 +8782,9 @@ cp;1CF7;age=10.0;bc=L;-CI;gc=Mc;GCB=SM;Gr_Base;-Gr_Ext;InPC=Right;jt=U;na=VEDIC
# Signs for Jaiminiya Sama Veda
cp;1CF8;age=7.0;ccc=230;na=VEDIC TONE RING ABOVE;scx=Deva Gran
cp;1CF9;age=7.0;ccc=230;na=VEDIC TONE DOUBLE RING ABOVE;scx=Deva Gran
-unassigned;1CFA..1CFF
+# Nasalization sign
+cp;1CFA;age=12.0;Alpha;bc=L;-CI;-Dia;gc=Lo;GCB=XX;Gr_Base;-Gr_Ext;IDS;InSC=Consonant_Placeholder;jt=U;lb=AL;na=VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA;SB=LE;sc=Zyyy;scx=Nand;WB=LE;XIDS
+unassigned;1CFB..1CFF
block;1D00..1D7F;age=4.0;Alpha;blk=Phonetic_Ext;Cased;gc=Ll;Gr_Base;IDC;IDS;lb=AL;Lower;SB=LO;sc=Latn;WB=LE;XIDC;XIDS
# 1D00..1D7F Phonetic Extensions
@@ -8915,7 +8945,7 @@ cp;1D8A;-CWKCF;dt=None;gc=Ll;na=LATIN SMALL LETTER S WITH PALATAL HOOK;NFKC_QC=Y
cp;1D8B;-CWKCF;dt=None;gc=Ll;na=LATIN SMALL LETTER ESH WITH PALATAL HOOK;NFKC_QC=Y;NFKD_QC=Y
cp;1D8C;-CWKCF;dt=None;gc=Ll;na=LATIN SMALL LETTER V WITH PALATAL HOOK;NFKC_QC=Y;NFKD_QC=Y
cp;1D8D;-CWKCF;dt=None;gc=Ll;na=LATIN SMALL LETTER X WITH PALATAL HOOK;NFKC_QC=Y;NFKD_QC=Y
-cp;1D8E;-CWKCF;dt=None;gc=Ll;na=LATIN SMALL LETTER Z WITH PALATAL HOOK;NFKC_QC=Y;NFKD_QC=Y
+cp;1D8E;CWCM;-CWKCF;CWT;CWU;dt=None;gc=Ll;na=LATIN SMALL LETTER Z WITH PALATAL HOOK;NFKC_QC=Y;NFKD_QC=Y;stc=A7C6;suc=A7C6
# Latin letters with retroflex hook
cp;1D8F;-CWKCF;dt=None;gc=Ll;na=LATIN SMALL LETTER A WITH RETROFLEX HOOK;NFKC_QC=Y;NFKD_QC=Y
cp;1D90;-CWKCF;dt=None;gc=Ll;na=LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;NFKC_QC=Y;NFKD_QC=Y
@@ -9625,7 +9655,7 @@ cp;202B;bc=RLE;Bidi_C;CI;CWKCF;DI;gc=Cf;GCB=CN;-Gr_Base;jt=T;lb=CM;na=RIGHT-TO-L
cp;202C;bc=PDF;Bidi_C;CI;CWKCF;DI;gc=Cf;GCB=CN;-Gr_Base;jt=T;lb=CM;na=POP DIRECTIONAL FORMATTING;Name_Alias=abbreviation=PDF;NFKC_CF=;-Pat_Syn;SB=FO;WB=FO
cp;202D;bc=LRO;Bidi_C;CI;CWKCF;DI;gc=Cf;GCB=CN;-Gr_Base;jt=T;lb=CM;na=LEFT-TO-RIGHT OVERRIDE;Name_Alias=abbreviation=LRO;NFKC_CF=;-Pat_Syn;SB=FO;WB=FO
cp;202E;bc=RLO;Bidi_C;CI;CWKCF;DI;gc=Cf;GCB=CN;-Gr_Base;jt=T;lb=CM;na=RIGHT-TO-LEFT OVERRIDE;Name_Alias=abbreviation=RLO;NFKC_CF=;-Pat_Syn;SB=FO;WB=FO
-cp;202F;age=3.0;bc=CS;CWKCF;dm=0020;dt=Nb;gc=Zs;lb=GL;na=NARROW NO-BREAK SPACE;Name_Alias=abbreviation=NNBSP;NFKC_CF=0020;NFKC_QC=N;NFKD_QC=N;-Pat_Syn;SB=SP;WB=EX;WSpace
+cp;202F;age=3.0;bc=CS;CWKCF;dm=0020;dt=Nb;gc=Zs;lb=GL;na=NARROW NO-BREAK SPACE;Name_Alias=abbreviation=NNBSP;NFKC_CF=0020;NFKC_QC=N;NFKD_QC=N;-Pat_Syn;SB=SP;scx=Latn Mong;WB=EX;WSpace
# General punctuation
cp;2030;bc=ET;ea=A;lb=PO;na=PER MILLE SIGN;vo=U
cp;2031;bc=ET;lb=PO;na=PER TEN THOUSAND SIGN;vo=U
@@ -9834,7 +9864,7 @@ cp;20EC;age=5.0;ccc=220;na=COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS
cp;20ED;age=5.0;ccc=220;na=COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS
cp;20EE;age=5.0;ccc=220;na=COMBINING LEFT ARROW BELOW
cp;20EF;age=5.0;ccc=220;na=COMBINING RIGHT ARROW BELOW
-cp;20F0;age=5.1;-Math;na=COMBINING ASTERISK ABOVE;scx=Deva Gran Latn
+cp;20F0;age=5.1;InPC=Top;InSC=Cantillation_Mark;-Math;na=COMBINING ASTERISK ABOVE;scx=Deva Gran Latn
unassigned;20F1..20FF
block;2100..214F;age=1.1;Alpha;blk=Letterlike_Symbols;CWKCF;dt=Font;gc=Lu;Gr_Base;IDC;IDS;lb=AL;Math;NFKC_QC=N;NFKD_QC=N;sc=Zyyy;vo=U;WB=LE;XIDC;XIDS
@@ -12912,7 +12942,8 @@ cp;2BC5;na=BLACK MEDIUM UP-POINTING TRIANGLE CENTRED;vo=U
cp;2BC6;na=BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED;vo=U
cp;2BC7;na=BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED;vo=U
cp;2BC8;na=BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED;vo=U
-unassigned;2BC9;Pat_Syn;vo=U
+# Astronomical symbol
+cp;2BC9;age=12.0;na=NEPTUNE FORM TWO;vo=U
# Half circles
cp;2BCA;na=TOP HALF BLACK CIRCLE;vo=U
cp;2BCB;na=BOTTOM HALF BLACK CIRCLE;vo=U
@@ -12977,7 +13008,8 @@ cp;2BFB;age=11.0;na=SEPARATED SYMBOL;vo=U
cp;2BFC;age=11.0;na=DOUBLED SYMBOL;vo=U
cp;2BFD;age=11.0;na=PASSED SYMBOL;vo=U
cp;2BFE;age=11.0;Bidi_M;bmg=221F;na=REVERSED RIGHT ANGLE;vo=U
-unassigned;2BFF;Pat_Syn;vo=U
+# Miscellaneous symbol
+cp;2BFF;age=12.0;na=HELLSCHREIBER PAUSE SYMBOL;vo=U
block;2C00..2C5F;age=4.1;Alpha;blk=Glagolitic;Cased;CWCM;gc=Ll;Gr_Base;IDC;IDS;lb=AL;SB=LO;sc=Glag;WB=LE;XIDC;XIDS
# 2C00..2C5F Glagolitic
@@ -13403,7 +13435,7 @@ cp;2D94;na=ETHIOPIC SYLLABLE GGWI
cp;2D95;na=ETHIOPIC SYLLABLE GGWEE
cp;2D96;na=ETHIOPIC SYLLABLE GGWE
unassigned;2D97..2D9F
-# Syllables for Sebatbeit
+# Syllables for Bench
cp;2DA0;na=ETHIOPIC SYLLABLE SSA
cp;2DA1;na=ETHIOPIC SYLLABLE SSU
cp;2DA2;na=ETHIOPIC SYLLABLE SSI
@@ -13436,6 +13468,7 @@ cp;2DBC;na=ETHIOPIC SYLLABLE CCHEE
cp;2DBD;na=ETHIOPIC SYLLABLE CCHE
cp;2DBE;na=ETHIOPIC SYLLABLE CCHO
unassigned;2DBF
+# Syllables for Sebatbeit
cp;2DC0;na=ETHIOPIC SYLLABLE QYA
cp;2DC1;na=ETHIOPIC SYLLABLE QYU
cp;2DC2;na=ETHIOPIC SYLLABLE QYI
@@ -13608,7 +13641,8 @@ cp;2E4B;age=11.0;lb=AL;na=TRIPLE DAGGER
cp;2E4C;age=11.0;na=MEDIEVAL COMMA;Term
cp;2E4D;age=11.0;lb=AL;na=PARAGRAPHUS MARK
cp;2E4E;age=11.0;na=PUNCTUS ELEVATUS MARK;Term
-unassigned;2E4F..2E7F;Pat_Syn
+cp;2E4F;age=12.0;na=CORNISH VERSE DIVIDER;Term
+unassigned;2E50..2E7F;Pat_Syn
block;2E80..2EFF;age=3.0;bc=ON;blk=CJK_Radicals_Sup;ea=W;gc=So;Gr_Base;lb=ID;Radical;sc=Hani;vo=U
# 2E80..2EFF CJK Radicals Supplement
@@ -14804,7 +14838,8 @@ cp;32FB;dm=30EF;na=CIRCLED KATAKANA WA;NFKC_CF=30EF;sc=Kana;WB=KA
cp;32FC;dm=30F0;na=CIRCLED KATAKANA WI;NFKC_CF=30F0;sc=Kana;WB=KA
cp;32FD;dm=30F1;na=CIRCLED KATAKANA WE;NFKC_CF=30F1;sc=Kana;WB=KA
cp;32FE;dm=30F2;na=CIRCLED KATAKANA WO;NFKC_CF=30F2;sc=Kana;WB=KA
-unassigned;32FF;vo=U
+# Japanese era name
+cp;32FF;age=12.1;dm=4EE4 548C;dt=Sqr;na=SQUARE ERA NAME REIWA;NFKC_CF=4EE4 548C;scx=Hani;vo=Tu
block;3300..33FF;age=1.1;blk=CJK_Compat;CWKCF;dt=Sqr;ea=W;gc=So;Gr_Base;lb=ID;NFKC_QC=N;NFKD_QC=N;sc=Zyyy;vo=U
# 3300..33FF CJK Compatibility
@@ -17024,7 +17059,7 @@ cp;A6F6;-Alpha;gc=Po;-IDC;-IDS;lb=BA;na=BAMUM SEMICOLON;SB=XX;Term;WB=XX;-XIDC;-
cp;A6F7;-Alpha;gc=Po;-IDC;-IDS;lb=BA;na=BAMUM QUESTION MARK;SB=ST;STerm;Term;WB=XX;-XIDC;-XIDS
unassigned;A6F8..A6FF
-block;A700..A71F;age=4.1;bc=ON;blk=Modifier_Tone_Letters;CI;gc=Sk;Gr_Base;lb=AL;sc=Zyyy
+block;A700..A71F;age=4.1;bc=ON;blk=Modifier_Tone_Letters;CI;Dia;gc=Sk;Gr_Base;lb=AL;sc=Zyyy
# A700..A71F Modifier Tone Letters
# Corner tone marks for Chinese
cp;A700;na=MODIFIER LETTER CHINESE TONE YIN PING
@@ -17053,16 +17088,16 @@ cp;A714;na=MODIFIER LETTER MID LEFT-STEM TONE BAR
cp;A715;na=MODIFIER LETTER LOW LEFT-STEM TONE BAR
cp;A716;na=MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
# Chinantec tone marks
-cp;A717;age=5.0;Alpha;Dia;gc=Lm;IDC;IDS;na=MODIFIER LETTER DOT VERTICAL BAR;SB=LE;WB=LE;XIDC;XIDS
-cp;A718;age=5.0;Alpha;Dia;gc=Lm;IDC;IDS;na=MODIFIER LETTER DOT SLASH;SB=LE;WB=LE;XIDC;XIDS
-cp;A719;age=5.0;Alpha;Dia;gc=Lm;IDC;IDS;na=MODIFIER LETTER DOT HORIZONTAL BAR;SB=LE;WB=LE;XIDC;XIDS
-cp;A71A;age=5.0;Alpha;Dia;gc=Lm;IDC;IDS;na=MODIFIER LETTER LOWER RIGHT CORNER ANGLE;SB=LE;WB=LE;XIDC;XIDS
+cp;A717;age=5.0;Alpha;gc=Lm;IDC;IDS;na=MODIFIER LETTER DOT VERTICAL BAR;SB=LE;WB=LE;XIDC;XIDS
+cp;A718;age=5.0;Alpha;gc=Lm;IDC;IDS;na=MODIFIER LETTER DOT SLASH;SB=LE;WB=LE;XIDC;XIDS
+cp;A719;age=5.0;Alpha;gc=Lm;IDC;IDS;na=MODIFIER LETTER DOT HORIZONTAL BAR;SB=LE;WB=LE;XIDC;XIDS
+cp;A71A;age=5.0;Alpha;gc=Lm;IDC;IDS;na=MODIFIER LETTER LOWER RIGHT CORNER ANGLE;SB=LE;WB=LE;XIDC;XIDS
# Africanist tone letters
-cp;A71B;age=5.1;Alpha;Dia;gc=Lm;IDC;IDS;na=MODIFIER LETTER RAISED UP ARROW;SB=LE;WB=LE;XIDC;XIDS
-cp;A71C;age=5.1;Alpha;Dia;gc=Lm;IDC;IDS;na=MODIFIER LETTER RAISED DOWN ARROW;SB=LE;WB=LE;XIDC;XIDS
-cp;A71D;age=5.1;Alpha;Dia;gc=Lm;IDC;IDS;na=MODIFIER LETTER RAISED EXCLAMATION MARK;SB=LE;WB=LE;XIDC;XIDS
-cp;A71E;age=5.1;Alpha;Dia;gc=Lm;IDC;IDS;na=MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;SB=LE;WB=LE;XIDC;XIDS
-cp;A71F;age=5.1;Alpha;Dia;gc=Lm;IDC;IDS;na=MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;SB=LE;WB=LE;XIDC;XIDS
+cp;A71B;age=5.1;Alpha;gc=Lm;IDC;IDS;na=MODIFIER LETTER RAISED UP ARROW;SB=LE;WB=LE;XIDC;XIDS
+cp;A71C;age=5.1;Alpha;gc=Lm;IDC;IDS;na=MODIFIER LETTER RAISED DOWN ARROW;SB=LE;WB=LE;XIDC;XIDS
+cp;A71D;age=5.1;Alpha;gc=Lm;IDC;IDS;na=MODIFIER LETTER RAISED EXCLAMATION MARK;SB=LE;WB=LE;XIDC;XIDS
+cp;A71E;age=5.1;Alpha;gc=Lm;IDC;IDS;na=MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;SB=LE;WB=LE;XIDC;XIDS
+cp;A71F;age=5.1;Alpha;gc=Lm;IDC;IDS;na=MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;SB=LE;WB=LE;XIDC;XIDS
block;A720..A7FF;age=5.1;Alpha;blk=Latin_Ext_D;Cased;CWCM;gc=Ll;Gr_Base;IDC;IDS;lb=AL;SB=LO;sc=Latn;WB=LE;XIDC;XIDS
# A720..A7FF Latin Extended-D
@@ -17177,8 +17212,8 @@ cp;A786;cf=A787;CWCF;CWKCF;CWL;gc=Lu;na=LATIN CAPITAL LETTER INSULAR T;NFKC_CF=A
cp;A787;CWT;CWU;Lower;na=LATIN SMALL LETTER INSULAR T;stc=A786;suc=A786
# Modifier letters
cp;A788;bc=ON;-Cased;CI;-CWCM;Dia;gc=Lm;na=MODIFIER LETTER LOW CIRCUMFLEX ACCENT;SB=LE;sc=Zyyy
-cp;A789;-Alpha;-Cased;CI;-CWCM;gc=Sk;-IDC;-IDS;na=MODIFIER LETTER COLON;SB=XX;sc=Zyyy;-XIDC;-XIDS
-cp;A78A;-Alpha;-Cased;CI;-CWCM;gc=Sk;-IDC;-IDS;na=MODIFIER LETTER SHORT EQUALS SIGN;SB=XX;sc=Zyyy;-XIDC;-XIDS
+cp;A789;-Alpha;-Cased;CI;-CWCM;Dia;gc=Sk;-IDC;-IDS;na=MODIFIER LETTER COLON;SB=XX;sc=Zyyy;-XIDC;-XIDS
+cp;A78A;-Alpha;-Cased;CI;-CWCM;Dia;gc=Sk;-IDC;-IDS;na=MODIFIER LETTER SHORT EQUALS SIGN;SB=XX;sc=Zyyy;-XIDC;-XIDS
# Orthographic letters for glottals
cp;A78B;cf=A78C;CWCF;CWKCF;CWL;gc=Lu;na=LATIN CAPITAL LETTER SALTILLO;NFKC_CF=A78C;SB=UP;scf=A78C;slc=A78C;Upper
cp;A78C;CWT;CWU;Lower;na=LATIN SMALL LETTER SALTILLO;stc=A78B;suc=A78B
@@ -17194,7 +17229,7 @@ cp;A791;age=6.0;CWT;CWU;Lower;na=LATIN SMALL LETTER N WITH DESCENDER;stc=A790;su
cp;A792;age=6.1;cf=A793;CWCF;CWKCF;CWL;gc=Lu;na=LATIN CAPITAL LETTER C WITH BAR;NFKC_CF=A793;SB=UP;scf=A793;slc=A793;Upper
cp;A793;age=6.1;CWT;CWU;Lower;na=LATIN SMALL LETTER C WITH BAR;stc=A792;suc=A792
# Additions for Lithuanian dialectology
-cp;A794;age=7.0;-CWCM;Lower;na=LATIN SMALL LETTER C WITH PALATAL HOOK
+cp;A794;age=7.0;CWT;CWU;Lower;na=LATIN SMALL LETTER C WITH PALATAL HOOK;stc=A7C4;suc=A7C4
cp;A795;age=7.0;-CWCM;Lower;na=LATIN SMALL LETTER H WITH PALATAL HOOK
# Letters for Middle Vietnamese
cp;A796;age=7.0;cf=A797;CWCF;CWKCF;CWL;gc=Lu;na=LATIN CAPITAL LETTER B WITH FLOURISH;NFKC_CF=A797;SB=UP;scf=A797;slc=A797;Upper
@@ -17244,7 +17279,22 @@ cp;A7B7;age=8.0;CWT;CWU;Lower;na=LATIN SMALL LETTER OMEGA;stc=A7B6;suc=A7B6
# Letters for Mazahua (Mexico)
cp;A7B8;age=11.0;cf=A7B9;CWCF;CWKCF;CWL;gc=Lu;na=LATIN CAPITAL LETTER U WITH STROKE;NFKC_CF=A7B9;SB=UP;scf=A7B9;slc=A7B9;Upper
cp;A7B9;age=11.0;CWT;CWU;Lower;na=LATIN SMALL LETTER U WITH STROKE;stc=A7B8;suc=A7B8
-unassigned;A7BA..A7F6
+# Letters for Ugaritic and Egyptological transliteration
+cp;A7BA;age=12.0;cf=A7BB;CWCF;CWKCF;CWL;gc=Lu;na=LATIN CAPITAL LETTER GLOTTAL A;NFKC_CF=A7BB;SB=UP;scf=A7BB;slc=A7BB;Upper
+cp;A7BB;age=12.0;CWT;CWU;Lower;na=LATIN SMALL LETTER GLOTTAL A;stc=A7BA;suc=A7BA
+cp;A7BC;age=12.0;cf=A7BD;CWCF;CWKCF;CWL;gc=Lu;na=LATIN CAPITAL LETTER GLOTTAL I;NFKC_CF=A7BD;SB=UP;scf=A7BD;slc=A7BD;Upper
+cp;A7BD;age=12.0;CWT;CWU;Lower;na=LATIN SMALL LETTER GLOTTAL I;stc=A7BC;suc=A7BC
+cp;A7BE;age=12.0;cf=A7BF;CWCF;CWKCF;CWL;gc=Lu;na=LATIN CAPITAL LETTER GLOTTAL U;NFKC_CF=A7BF;SB=UP;scf=A7BF;slc=A7BF;Upper
+cp;A7BF;age=12.0;CWT;CWU;Lower;na=LATIN SMALL LETTER GLOTTAL U;stc=A7BE;suc=A7BE
+unassigned;A7C0..A7C1
+# Additional letters
+cp;A7C2;age=12.0;cf=A7C3;CWCF;CWKCF;CWL;gc=Lu;na=LATIN CAPITAL LETTER ANGLICANA W;NFKC_CF=A7C3;SB=UP;scf=A7C3;slc=A7C3;Upper
+cp;A7C3;age=12.0;CWT;CWU;Lower;na=LATIN SMALL LETTER ANGLICANA W;stc=A7C2;suc=A7C2
+# Letters used in early Pinyin romanization
+cp;A7C4;age=12.0;cf=A794;CWCF;CWKCF;CWL;gc=Lu;na=LATIN CAPITAL LETTER C WITH PALATAL HOOK;NFKC_CF=A794;SB=UP;scf=A794;slc=A794;Upper
+cp;A7C5;age=12.0;cf=0282;CWCF;CWKCF;CWL;gc=Lu;na=LATIN CAPITAL LETTER S WITH HOOK;NFKC_CF=0282;SB=UP;scf=0282;slc=0282;Upper
+cp;A7C6;age=12.0;cf=1D8E;CWCF;CWKCF;CWL;gc=Lu;na=LATIN CAPITAL LETTER Z WITH PALATAL HOOK;NFKC_CF=1D8E;SB=UP;scf=1D8E;slc=1D8E;Upper
+unassigned;A7C7..A7F6
# Additional letter
cp;A7F7;age=7.0;-Cased;-CWCM;gc=Lo;na=LATIN EPIGRAPHIC LETTER SIDEWAYS I;SB=LE
# Additions for Extended IPA
@@ -17264,18 +17314,18 @@ block;A800..A82F;age=4.1;Alpha;blk=Syloti_Nagri;gc=Lo;Gr_Base;IDC;IDS;InSC=Conso
# Independent vowels and dvisvara
cp;A800;InSC=Vowel_Independent;na=SYLOTI NAGRI LETTER A
cp;A801;InSC=Vowel_Independent;na=SYLOTI NAGRI LETTER I
-cp;A802;-Alpha;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InSC=Other;jt=T;lb=CM;na=SYLOTI NAGRI SIGN DVISVARA;SB=EX;WB=Extend;-XIDS
+cp;A802;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Vowel_Dependent;jt=T;lb=CM;na=SYLOTI NAGRI SIGN DVISVARA;SB=EX;WB=Extend;-XIDS
cp;A803;InSC=Vowel_Independent;na=SYLOTI NAGRI LETTER U
cp;A804;InSC=Vowel_Independent;na=SYLOTI NAGRI LETTER E
cp;A805;InSC=Vowel_Independent;na=SYLOTI NAGRI LETTER O
# Sign
-cp;A806;-Alpha;bc=NSM;ccc=9;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;Gr_Link;-IDS;InPC=Top;InSC=Pure_Killer;jt=T;lb=CM;na=SYLOTI NAGRI SIGN HASANTA;SB=EX;WB=Extend;-XIDS
+cp;A806;-Alpha;bc=NSM;ccc=9;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;Gr_Link;-IDS;InPC=Top;InSC=Virama;jt=T;lb=CM;na=SYLOTI NAGRI SIGN HASANTA;SB=EX;WB=Extend;-XIDS
# Consonants and consonant signs
cp;A807;na=SYLOTI NAGRI LETTER KO
cp;A808;na=SYLOTI NAGRI LETTER KHO
cp;A809;na=SYLOTI NAGRI LETTER GO
cp;A80A;na=SYLOTI NAGRI LETTER GHO
-cp;A80B;-Alpha;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Bindu;jt=T;lb=CM;na=SYLOTI NAGRI SIGN ANUSVARA;SB=EX;WB=Extend;-XIDS
+cp;A80B;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Bindu;jt=T;lb=CM;na=SYLOTI NAGRI SIGN ANUSVARA;SB=EX;WB=Extend;-XIDS
cp;A80C;na=SYLOTI NAGRI LETTER CO
cp;A80D;na=SYLOTI NAGRI LETTER CHO
cp;A80E;na=SYLOTI NAGRI LETTER JO
@@ -17315,16 +17365,16 @@ unassigned;A82C..A82F
block;A830..A83F;age=5.2;blk=Indic_Number_Forms;gc=No;Gr_Base;lb=AL;sc=Zyyy;scx=Deva Dogr Gujr Guru Khoj Kthi Mahj Modi Sind Takr Tirh
# A830..A83F Common Indic Number Forms
# Number forms
-cp;A830;na=NORTH INDIC FRACTION ONE QUARTER;nt=Nu;nv=1/4;scx=Deva Dogr Gujr Guru Khoj Knda Kthi Mahj Mlym Modi Sind Takr Tirh
-cp;A831;na=NORTH INDIC FRACTION ONE HALF;nt=Nu;nv=1/2;scx=Deva Dogr Gujr Guru Khoj Knda Kthi Mahj Mlym Modi Sind Takr Tirh
-cp;A832;na=NORTH INDIC FRACTION THREE QUARTERS;nt=Nu;nv=3/4;scx=Deva Dogr Gujr Guru Khoj Knda Kthi Mahj Mlym Modi Sind Takr Tirh
-cp;A833;na=NORTH INDIC FRACTION ONE SIXTEENTH;nt=Nu;nv=1/16;scx=Deva Dogr Gujr Guru Khoj Knda Kthi Mahj Modi Sind Takr Tirh
-cp;A834;na=NORTH INDIC FRACTION ONE EIGHTH;nt=Nu;nv=1/8;scx=Deva Dogr Gujr Guru Khoj Knda Kthi Mahj Modi Sind Takr Tirh
-cp;A835;na=NORTH INDIC FRACTION THREE SIXTEENTHS;nt=Nu;nv=3/16;scx=Deva Dogr Gujr Guru Khoj Knda Kthi Mahj Modi Sind Takr Tirh
+cp;A830;na=NORTH INDIC FRACTION ONE QUARTER;nt=Nu;nv=1/4;scx=Deva Dogr Gujr Guru Khoj Knda Kthi Mahj Mlym Modi Nand Sind Takr Tirh
+cp;A831;na=NORTH INDIC FRACTION ONE HALF;nt=Nu;nv=1/2;scx=Deva Dogr Gujr Guru Khoj Knda Kthi Mahj Mlym Modi Nand Sind Takr Tirh
+cp;A832;na=NORTH INDIC FRACTION THREE QUARTERS;nt=Nu;nv=3/4;scx=Deva Dogr Gujr Guru Khoj Knda Kthi Mahj Mlym Modi Nand Sind Takr Tirh
+cp;A833;na=NORTH INDIC FRACTION ONE SIXTEENTH;nt=Nu;nv=1/16;scx=Deva Dogr Gujr Guru Khoj Knda Kthi Mahj Modi Nand Sind Takr Tirh
+cp;A834;na=NORTH INDIC FRACTION ONE EIGHTH;nt=Nu;nv=1/8;scx=Deva Dogr Gujr Guru Khoj Knda Kthi Mahj Modi Nand Sind Takr Tirh
+cp;A835;na=NORTH INDIC FRACTION THREE SIXTEENTHS;nt=Nu;nv=3/16;scx=Deva Dogr Gujr Guru Khoj Knda Kthi Mahj Modi Nand Sind Takr Tirh
cp;A836;gc=So;na=NORTH INDIC QUARTER MARK
# Miscellaneous sign
cp;A837;gc=So;na=NORTH INDIC PLACEHOLDER MARK
-# Currency sign
+# Currency symbol
cp;A838;bc=ET;gc=Sc;lb=PO;na=NORTH INDIC RUPEE MARK
# Miscellaneous sign
cp;A839;bc=ET;gc=So;na=NORTH INDIC QUANTITY MARK
@@ -17536,7 +17586,7 @@ cp;A8FC;age=8.0;bc=L;ccc=0;-CI;gc=Po;GCB=XX;Gr_Base;-Gr_Ext;-IDC;InPC=NA;InSC=Ot
cp;A8FD;age=8.0;Alpha;bc=L;ccc=0;-CI;gc=Lo;GCB=XX;Gr_Base;-Gr_Ext;IDS;InPC=NA;InSC=Other;jt=U;lb=AL;na=DEVANAGARI JAIN OM;SB=LE;WB=LE;XIDS
# Additional vowel and vowel sign
cp;A8FE;age=11.0;Alpha;bc=L;ccc=0;-CI;gc=Lo;GCB=XX;Gr_Base;-Gr_Ext;IDS;InPC=NA;InSC=Vowel_Independent;jt=U;lb=AL;na=DEVANAGARI LETTER AY;SB=LE;WB=LE;XIDS
-cp;A8FF;age=11.0;ccc=0;InSC=Vowel_Dependent;na=DEVANAGARI VOWEL SIGN AY
+cp;A8FF;age=11.0;Alpha;ccc=0;InSC=Vowel_Dependent;na=DEVANAGARI VOWEL SIGN AY
block;A900..A92F;age=5.1;Alpha;blk=Kayah_Li;gc=Lo;Gr_Base;IDC;IDS;InSC=Consonant;lb=AL;SB=LE;sc=Kali;WB=LE;XIDC;XIDS
# A900..A92F Kayah Li
@@ -17742,7 +17792,7 @@ cp;A9BA;gc=Mc;GCB=SM;InPC=Left;InSC=Vowel_Dependent;lb=CM;na=JAVANESE VOWEL SIGN
cp;A9BB;gc=Mc;GCB=SM;InPC=Left;InSC=Vowel_Dependent;lb=CM;na=JAVANESE VOWEL SIGN DIRGA MURE;SB=EX;WB=Extend
cp;A9BC;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Vowel_Dependent;jt=T;lb=CM;na=JAVANESE VOWEL SIGN PEPET;SB=EX;WB=Extend
# Dependent consonant signs
-cp;A9BD;gc=Mc;GCB=SM;InPC=Right;InSC=Consonant_Subjoined;lb=CM;na=JAVANESE CONSONANT SIGN KERET;SB=EX;WB=Extend
+cp;A9BD;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Bottom;InSC=Consonant_Medial;jt=T;lb=CM;na=JAVANESE CONSONANT SIGN KERET;SB=EX;WB=Extend
cp;A9BE;gc=Mc;GCB=SM;InPC=Right;InSC=Consonant_Medial;lb=CM;na=JAVANESE CONSONANT SIGN PENGKAL;SB=EX;WB=Extend
cp;A9BF;gc=Mc;GCB=SM;InPC=Bottom_And_Left;InSC=Consonant_Medial;lb=CM;na=JAVANESE CONSONANT SIGN CAKRA;SB=EX;WB=Extend
# Sign
@@ -17788,7 +17838,7 @@ cp;A9E1;na=MYANMAR LETTER SHAN CHA
cp;A9E2;na=MYANMAR LETTER SHAN JHA
cp;A9E3;na=MYANMAR LETTER SHAN NNA
cp;A9E4;na=MYANMAR LETTER SHAN BHA
-cp;A9E5;-Alpha;bc=NSM;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Vowel_Dependent;jt=T;na=MYANMAR SIGN SHAN SAW;SB=EX;WB=Extend;-XIDS
+cp;A9E5;bc=NSM;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Vowel_Dependent;jt=T;na=MYANMAR SIGN SHAN SAW;SB=EX;WB=Extend;-XIDS
# Reduplication mark
cp;A9E6;CI;Ext;gc=Lm;InSC=Other;na=MYANMAR MODIFIER LETTER SHAN REDUPLICATION
# Tai Laing consonants
@@ -17949,10 +17999,10 @@ cp;AA78;-Alpha;gc=So;-IDC;-IDS;InSC=Other;na=MYANMAR SYMBOL AITON ONE;SB=XX;-XID
cp;AA79;-Alpha;gc=So;-IDC;-IDS;InSC=Other;na=MYANMAR SYMBOL AITON TWO;SB=XX;-XIDC;-XIDS
cp;AA7A;na=MYANMAR LETTER AITON RA
# Pa'o Karen tone mark
-cp;AA7B;-Alpha;Dia;gc=Mc;-IDS;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN PAO KAREN TONE;SB=EX;WB=Extend;-XIDS
+cp;AA7B;Dia;gc=Mc;-IDS;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN PAO KAREN TONE;SB=EX;WB=Extend;-XIDS
# Tai Laing tone marks
-cp;AA7C;age=7.0;-Alpha;bc=NSM;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Tone_Mark;jt=T;na=MYANMAR SIGN TAI LAING TONE-2;SB=EX;WB=Extend;-XIDS
-cp;AA7D;age=7.0;-Alpha;Dia;gc=Mc;-IDS;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN TAI LAING TONE-5;SB=EX;WB=Extend;-XIDS
+cp;AA7C;age=7.0;bc=NSM;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Tone_Mark;jt=T;na=MYANMAR SIGN TAI LAING TONE-2;SB=EX;WB=Extend;-XIDS
+cp;AA7D;age=7.0;Dia;gc=Mc;-IDS;InPC=Right;InSC=Tone_Mark;na=MYANMAR SIGN TAI LAING TONE-5;SB=EX;WB=Extend;-XIDS
# Shwe Palaung letters
cp;AA7E;age=7.0;na=MYANMAR LETTER SHWE PALAUNG CHA
cp;AA7F;age=7.0;na=MYANMAR LETTER SHWE PALAUNG SHA
@@ -18178,7 +18228,10 @@ cp;AB63;age=8.0;na=LATIN SMALL LETTER UO
# Letters for Americanist orthographies
cp;AB64;na=LATIN SMALL LETTER INVERTED ALPHA
cp;AB65;na=GREEK LETTER SMALL CAPITAL OMEGA;sc=Grek
-unassigned;AB66..AB6F
+# Letters for Sinological transcription
+cp;AB66;age=12.0;na=LATIN SMALL LETTER DZ DIGRAPH WITH RETROFLEX HOOK
+cp;AB67;age=12.0;na=LATIN SMALL LETTER TS DIGRAPH WITH RETROFLEX HOOK
+unassigned;AB68..AB6F
block;AB70..ABBF;age=8.0;Alpha;blk=Cherokee_Sup;Cased;CWCF;CWCM;CWKCF;CWT;CWU;gc=Ll;Gr_Base;IDC;IDS;lb=AL;Lower;SB=LO;sc=Cher;WB=LE;XIDC;XIDS
# AB70..ABBF Cherokee Supplement
@@ -19212,13 +19265,13 @@ cp;D7FA;na=HANGUL JONGSEONG PHIEUPH-SIOS
cp;D7FB;na=HANGUL JONGSEONG PHIEUPH-THIEUTH
unassigned;D7FC..D7FF;vo=U
-block;D800..DB7F;age=2.0;blk=High_Surrogates;gc=Cs;GCB=CN;lb=SG
+block;D800..DB7F;age=2.0;blk=High_Surrogates;gc=Cs;lb=SG
# D800..DB7F High Surrogates
-block;DB80..DBFF;age=2.0;blk=High_PU_Surrogates;gc=Cs;GCB=CN;lb=SG
+block;DB80..DBFF;age=2.0;blk=High_PU_Surrogates;gc=Cs;lb=SG
# DB80..DBFF High Private Use Surrogates
-block;DC00..DFFF;age=2.0;blk=Low_Surrogates;gc=Cs;GCB=CN;lb=SG
+block;DC00..DFFF;age=2.0;blk=Low_Surrogates;gc=Cs;lb=SG
# DC00..DFFF Low Surrogates
block;E000..F8FF;age=1.1;blk=PUA;ea=A;gc=Co;vo=U
@@ -20403,7 +20456,7 @@ cp;FDF8;dm=0648 0633 0644 0645;dt=Iso;na=ARABIC LIGATURE WASALLAM ISOLATED FORM;
cp;FDF9;dm=0635 0644 0649;dt=Iso;na=ARABIC LIGATURE SALLA ISOLATED FORM;NFKC_CF=0635 0644 0649
cp;FDFA;dm=0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;dt=Iso;na=ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;NFKC_CF=0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;-XIDC;-XIDS
cp;FDFB;dm=062C 0644 0020 062C 0644 0627 0644 0647;dt=Iso;na=ARABIC LIGATURE JALLAJALALOUHOU;NFKC_CF=062C 0644 0020 062C 0644 0627 0644 0647;-XIDC;-XIDS
-# Currency sign
+# Currency symbol
cp;FDFC;age=3.2;-Alpha;dm=0631 06CC 0627 0644;dt=Iso;gc=Sc;-IDC;-IDS;lb=PO;na=RIAL SIGN;NFKC_CF=0631 06CC 0627 0644;SB=XX;WB=XX;-XIDC;-XIDS
# Symbol
cp;FDFD;age=4.0;-Alpha;bc=ON;-CWKCF;dt=None;gc=So;-IDC;-IDS;na=ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;NFKC_QC=Y;NFKD_QC=Y;SB=XX;scx=Arab Thaa;WB=XX;-XIDC;-XIDS
@@ -20710,16 +20763,16 @@ cp;FF0C;-Alpha;bc=CS;dm=002C;dt=Wide;ea=F;gc=Po;-IDC;-IDS;lb=CL;na=FULLWIDTH COM
cp;FF0D;-Alpha;bc=ES;Dash;dm=002D;dt=Wide;ea=F;gc=Pd;Hyphen;-IDC;-IDS;na=FULLWIDTH HYPHEN-MINUS;NFKC_CF=002D;SB=SC;WB=XX;-XIDC;-XIDS
cp;FF0E;-Alpha;bc=CS;CI;dm=002E;dt=Wide;ea=F;gc=Po;-IDC;-IDS;lb=CL;na=FULLWIDTH FULL STOP;NFKC_CF=002E;SB=AT;STerm;Term;vo=Tu;WB=MB;-XIDC;-XIDS
cp;FF0F;-Alpha;bc=CS;dm=002F;dt=Wide;ea=F;gc=Po;-IDC;-IDS;na=FULLWIDTH SOLIDUS;NFKC_CF=002F;SB=XX;vo=U;WB=XX;-XIDC;-XIDS
-cp;FF10;-Alpha;bc=EN;dm=0030;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT ZERO;NFKC_CF=0030;nt=De;nv=0;SB=XX;vo=U;WB=XX;-XIDS
-cp;FF11;-Alpha;bc=EN;dm=0031;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT ONE;NFKC_CF=0031;nt=De;nv=1;SB=XX;vo=U;WB=XX;-XIDS
-cp;FF12;-Alpha;bc=EN;dm=0032;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT TWO;NFKC_CF=0032;nt=De;nv=2;SB=XX;vo=U;WB=XX;-XIDS
-cp;FF13;-Alpha;bc=EN;dm=0033;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT THREE;NFKC_CF=0033;nt=De;nv=3;SB=XX;vo=U;WB=XX;-XIDS
-cp;FF14;-Alpha;bc=EN;dm=0034;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT FOUR;NFKC_CF=0034;nt=De;nv=4;SB=XX;vo=U;WB=XX;-XIDS
-cp;FF15;-Alpha;bc=EN;dm=0035;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT FIVE;NFKC_CF=0035;nt=De;nv=5;SB=XX;vo=U;WB=XX;-XIDS
-cp;FF16;-Alpha;bc=EN;dm=0036;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT SIX;NFKC_CF=0036;nt=De;nv=6;SB=XX;vo=U;WB=XX;-XIDS
-cp;FF17;-Alpha;bc=EN;dm=0037;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT SEVEN;NFKC_CF=0037;nt=De;nv=7;SB=XX;vo=U;WB=XX;-XIDS
-cp;FF18;-Alpha;bc=EN;dm=0038;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT EIGHT;NFKC_CF=0038;nt=De;nv=8;SB=XX;vo=U;WB=XX;-XIDS
-cp;FF19;-Alpha;bc=EN;dm=0039;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT NINE;NFKC_CF=0039;nt=De;nv=9;SB=XX;vo=U;WB=XX;-XIDS
+cp;FF10;-Alpha;bc=EN;dm=0030;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT ZERO;NFKC_CF=0030;nt=De;nv=0;SB=NU;vo=U;WB=NU;-XIDS
+cp;FF11;-Alpha;bc=EN;dm=0031;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT ONE;NFKC_CF=0031;nt=De;nv=1;SB=NU;vo=U;WB=NU;-XIDS
+cp;FF12;-Alpha;bc=EN;dm=0032;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT TWO;NFKC_CF=0032;nt=De;nv=2;SB=NU;vo=U;WB=NU;-XIDS
+cp;FF13;-Alpha;bc=EN;dm=0033;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT THREE;NFKC_CF=0033;nt=De;nv=3;SB=NU;vo=U;WB=NU;-XIDS
+cp;FF14;-Alpha;bc=EN;dm=0034;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT FOUR;NFKC_CF=0034;nt=De;nv=4;SB=NU;vo=U;WB=NU;-XIDS
+cp;FF15;-Alpha;bc=EN;dm=0035;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT FIVE;NFKC_CF=0035;nt=De;nv=5;SB=NU;vo=U;WB=NU;-XIDS
+cp;FF16;-Alpha;bc=EN;dm=0036;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT SIX;NFKC_CF=0036;nt=De;nv=6;SB=NU;vo=U;WB=NU;-XIDS
+cp;FF17;-Alpha;bc=EN;dm=0037;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT SEVEN;NFKC_CF=0037;nt=De;nv=7;SB=NU;vo=U;WB=NU;-XIDS
+cp;FF18;-Alpha;bc=EN;dm=0038;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT EIGHT;NFKC_CF=0038;nt=De;nv=8;SB=NU;vo=U;WB=NU;-XIDS
+cp;FF19;-Alpha;bc=EN;dm=0039;dt=Wide;ea=F;gc=Nd;Hex;-IDS;na=FULLWIDTH DIGIT NINE;NFKC_CF=0039;nt=De;nv=9;SB=NU;vo=U;WB=NU;-XIDS
cp;FF1A;-Alpha;bc=CS;CI;dm=003A;dt=Wide;ea=F;gc=Po;-IDC;-IDS;lb=NS;na=FULLWIDTH COLON;NFKC_CF=003A;SB=SC;Term;vo=Tr;WB=ML;-XIDC;-XIDS
cp;FF1B;-Alpha;bc=ON;dm=003B;dt=Wide;ea=F;gc=Po;-IDC;-IDS;lb=NS;na=FULLWIDTH SEMICOLON;NFKC_CF=003B;SB=XX;Term;vo=Tr;WB=MN;-XIDC;-XIDS
cp;FF1C;-Alpha;bc=ON;Bidi_M;bmg=FF1E;dm=003C;dt=Wide;ea=F;gc=Sm;-IDC;-IDS;Math;na=FULLWIDTH LESS-THAN SIGN;NFKC_CF=003C;SB=XX;WB=XX;-XIDC;-XIDS
@@ -23723,7 +23776,36 @@ cp;10F59;gc=Po;-IDC;jt=U;na=SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT;SB=ST;STerm
unassigned;10F5A..10F6F;bc=AL
# No block
-unassigned;10F70..10FFF;bc=R
+unassigned;10F70..10FDF;bc=R
+
+block;10FE0..10FFF;age=12.0;Alpha;bc=R;blk=Elymaic;gc=Lo;Gr_Base;IDC;IDS;lb=AL;SB=LE;sc=Elym;WB=LE;XIDC;XIDS
+# 10FE0..10FFF Elymaic
+# Letters
+cp;10FE0;na=ELYMAIC LETTER ALEPH
+cp;10FE1;na=ELYMAIC LETTER BETH
+cp;10FE2;na=ELYMAIC LETTER GIMEL
+cp;10FE3;na=ELYMAIC LETTER DALETH
+cp;10FE4;na=ELYMAIC LETTER HE
+cp;10FE5;na=ELYMAIC LETTER WAW
+cp;10FE6;na=ELYMAIC LETTER ZAYIN
+cp;10FE7;na=ELYMAIC LETTER HETH
+cp;10FE8;na=ELYMAIC LETTER TETH
+cp;10FE9;na=ELYMAIC LETTER YODH
+cp;10FEA;na=ELYMAIC LETTER KAPH
+cp;10FEB;na=ELYMAIC LETTER LAMEDH
+cp;10FEC;na=ELYMAIC LETTER MEM
+cp;10FED;na=ELYMAIC LETTER NUN
+cp;10FEE;na=ELYMAIC LETTER SAMEKH
+cp;10FEF;na=ELYMAIC LETTER AYIN
+cp;10FF0;na=ELYMAIC LETTER PE
+cp;10FF1;na=ELYMAIC LETTER SADHE
+cp;10FF2;na=ELYMAIC LETTER QOPH
+cp;10FF3;na=ELYMAIC LETTER RESH
+cp;10FF4;na=ELYMAIC LETTER SHIN
+cp;10FF5;na=ELYMAIC LETTER TAW
+# Ligature
+cp;10FF6;na=ELYMAIC LIGATURE ZAYIN-YODH
+unassigned;10FF7..10FFF;bc=R
block;11000..1107F;age=6.0;Alpha;blk=Brahmi;gc=Lo;Gr_Base;IDC;InSC=Consonant;lb=AL;SB=LE;sc=Brah;WB=LE;XIDC
# 11000..1107F Brahmi
@@ -24189,7 +24271,7 @@ cp;111C8;-Alpha;gc=Po;-IDC;-IDS;InSC=Other;lb=BA;na=SHARADA SEPARATOR;SB=XX;WB=X
# Sign
cp;111C9;age=8.0;-Alpha;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Bottom;InSC=Syllable_Modifier;jt=T;lb=CM;na=SHARADA SANDHI MARK;SB=EX;WB=Extend;-XIDS
# Signs for Kashmiri
-cp;111CA;age=8.0;-Alpha;bc=NSM;ccc=7;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InSC=Nukta;jt=T;lb=CM;na=SHARADA SIGN NUKTA;SB=EX;WB=Extend;-XIDS
+cp;111CA;age=8.0;-Alpha;bc=NSM;ccc=7;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Bottom;InSC=Nukta;jt=T;lb=CM;na=SHARADA SIGN NUKTA;SB=EX;WB=Extend;-XIDS
cp;111CB;age=8.0;-Alpha;bc=NSM;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Vowel_Dependent;jt=T;lb=CM;na=SHARADA VOWEL MODIFIER MARK;SB=EX;WB=Extend;-XIDS
cp;111CC;age=8.0;-Alpha;bc=NSM;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Bottom;InSC=Vowel_Dependent;jt=T;lb=CM;na=SHARADA EXTRA SHORT VOWEL MARK;SB=EX;WB=Extend;-XIDS
# Punctuation
@@ -24447,7 +24529,7 @@ unassigned;112FA..112FF
block;11300..1137F;age=7.0;Alpha;blk=Grantha;gc=Lo;Gr_Base;IDC;IDS;InSC=Consonant;lb=AL;SB=LE;sc=Gran;WB=Extend;XIDC;XIDS
# 11300..1137F Grantha
# Various signs
-cp;11300;age=8.0;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InSC=Bindu;jt=T;lb=CM;na=GRANTHA SIGN COMBINING ANUSVARA ABOVE;SB=EX;-XIDS
+cp;11300;age=8.0;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Bindu;jt=T;lb=CM;na=GRANTHA SIGN COMBINING ANUSVARA ABOVE;SB=EX;-XIDS
cp;11301;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Bindu;jt=T;lb=CM;na=GRANTHA SIGN CANDRABINDU;SB=EX;scx=Gran Taml;-XIDS
cp;11302;gc=Mc;GCB=SM;-IDS;InPC=Right;InSC=Bindu;lb=CM;na=GRANTHA SIGN ANUSVARA;SB=EX;-XIDS
cp;11303;gc=Mc;GCB=SM;-IDS;InPC=Right;InSC=Visarga;lb=CM;na=GRANTHA SIGN VISARGA;SB=EX;scx=Gran Taml;-XIDS
@@ -24667,7 +24749,8 @@ cp;1145B;-Alpha;gc=Po;-IDC;-IDS;InSC=Other;lb=BA;na=NEWA PLACEHOLDER MARK;SB=XX;
unassigned;1145C
cp;1145D;-Alpha;gc=Po;-IDC;-IDS;InSC=Other;na=NEWA INSERTION SIGN;SB=XX;WB=XX;-XIDC;-XIDS
cp;1145E;age=11.0;-Alpha;bc=NSM;ccc=230;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Syllable_Modifier;jt=T;lb=CM;na=NEWA SANDHI MARK;SB=EX;WB=Extend;-XIDS
-unassigned;1145F..1147F
+cp;1145F;age=12.0;InSC=Bindu;na=NEWA LETTER VEDIC ANUSVARA
+unassigned;11460..1147F
block;11480..114DF;age=7.0;Alpha;blk=Tirhuta;gc=Lo;Gr_Base;IDC;IDS;InSC=Consonant;lb=AL;SB=LE;sc=Tirh;WB=LE;XIDC;XIDS
# 11480..114DF Tirhuta
@@ -25043,7 +25126,9 @@ cp;116B5;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Vowel_Depende
cp;116B6;-Alpha;ccc=9;Dia;gc=Mc;GCB=SM;Gr_Link;-IDS;InPC=Right;InSC=Virama;lb=CM;na=TAKRI SIGN VIRAMA;SB=EX;WB=Extend;-XIDS
# Nukta
cp;116B7;-Alpha;bc=NSM;ccc=7;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Bottom;InSC=Nukta;jt=T;lb=CM;na=TAKRI SIGN NUKTA;SB=EX;WB=Extend;-XIDS
-unassigned;116B8..116BF
+# Consonant
+cp;116B8;age=12.0;na=TAKRI LETTER ARCHAIC KHA
+unassigned;116B9..116BF
# Digits
cp;116C0;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=TAKRI DIGIT ZERO;nt=De;nv=0;SB=NU;WB=NU;-XIDS
cp;116C1;-Alpha;gc=Nd;-IDS;InSC=Number;lb=NU;na=TAKRI DIGIT ONE;nt=De;nv=1;SB=NU;WB=NU;-XIDS
@@ -25290,6 +25375,83 @@ unassigned;118F3..118FE
# Sign
cp;118FF;-Cased;-CWCM;gc=Lo;na=WARANG CITI OM;SB=LE
+block;119A0..119FF;age=12.0;Alpha;blk=Nandinagari;gc=Lo;Gr_Base;IDC;IDS;InSC=Consonant;lb=AL;SB=LE;sc=Nand;WB=LE;XIDC;XIDS
+# 119A0..119FF Nandinagari
+# Independent vowels
+cp;119A0;InSC=Vowel_Independent;na=NANDINAGARI LETTER A
+cp;119A1;InSC=Vowel_Independent;na=NANDINAGARI LETTER AA
+cp;119A2;InSC=Vowel_Independent;na=NANDINAGARI LETTER I
+cp;119A3;InSC=Vowel_Independent;na=NANDINAGARI LETTER II
+cp;119A4;InSC=Vowel_Independent;na=NANDINAGARI LETTER U
+cp;119A5;InSC=Vowel_Independent;na=NANDINAGARI LETTER UU
+cp;119A6;InSC=Vowel_Independent;na=NANDINAGARI LETTER VOCALIC R
+cp;119A7;InSC=Vowel_Independent;na=NANDINAGARI LETTER VOCALIC RR
+unassigned;119A8..119A9
+cp;119AA;InSC=Vowel_Independent;na=NANDINAGARI LETTER E
+cp;119AB;InSC=Vowel_Independent;na=NANDINAGARI LETTER AI
+cp;119AC;InSC=Vowel_Independent;na=NANDINAGARI LETTER O
+cp;119AD;InSC=Vowel_Independent;na=NANDINAGARI LETTER AU
+# Consonants
+cp;119AE;na=NANDINAGARI LETTER KA
+cp;119AF;na=NANDINAGARI LETTER KHA
+cp;119B0;na=NANDINAGARI LETTER GA
+cp;119B1;na=NANDINAGARI LETTER GHA
+cp;119B2;na=NANDINAGARI LETTER NGA
+cp;119B3;na=NANDINAGARI LETTER CA
+cp;119B4;na=NANDINAGARI LETTER CHA
+cp;119B5;na=NANDINAGARI LETTER JA
+cp;119B6;na=NANDINAGARI LETTER JHA
+cp;119B7;na=NANDINAGARI LETTER NYA
+cp;119B8;na=NANDINAGARI LETTER TTA
+cp;119B9;na=NANDINAGARI LETTER TTHA
+cp;119BA;na=NANDINAGARI LETTER DDA
+cp;119BB;na=NANDINAGARI LETTER DDHA
+cp;119BC;na=NANDINAGARI LETTER NNA
+cp;119BD;na=NANDINAGARI LETTER TA
+cp;119BE;na=NANDINAGARI LETTER THA
+cp;119BF;na=NANDINAGARI LETTER DA
+cp;119C0;na=NANDINAGARI LETTER DHA
+cp;119C1;na=NANDINAGARI LETTER NA
+cp;119C2;na=NANDINAGARI LETTER PA
+cp;119C3;na=NANDINAGARI LETTER PHA
+cp;119C4;na=NANDINAGARI LETTER BA
+cp;119C5;na=NANDINAGARI LETTER BHA
+cp;119C6;na=NANDINAGARI LETTER MA
+cp;119C7;na=NANDINAGARI LETTER YA
+cp;119C8;na=NANDINAGARI LETTER RA
+cp;119C9;na=NANDINAGARI LETTER LA
+cp;119CA;na=NANDINAGARI LETTER VA
+cp;119CB;na=NANDINAGARI LETTER SHA
+cp;119CC;na=NANDINAGARI LETTER SSA
+cp;119CD;na=NANDINAGARI LETTER SA
+cp;119CE;na=NANDINAGARI LETTER HA
+cp;119CF;na=NANDINAGARI LETTER LLA
+cp;119D0;na=NANDINAGARI LETTER RRA
+# Dependent vowel signs
+cp;119D1;gc=Mc;GCB=SM;-IDS;InPC=Right;InSC=Vowel_Dependent;lb=CM;na=NANDINAGARI VOWEL SIGN AA;SB=EX;WB=Extend;-XIDS
+cp;119D2;gc=Mc;GCB=SM;-IDS;InPC=Left;InSC=Vowel_Dependent;lb=CM;na=NANDINAGARI VOWEL SIGN I;SB=EX;WB=Extend;-XIDS
+cp;119D3;gc=Mc;GCB=SM;-IDS;InPC=Right;InSC=Vowel_Dependent;lb=CM;na=NANDINAGARI VOWEL SIGN II;SB=EX;WB=Extend;-XIDS
+cp;119D4;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Bottom;InSC=Vowel_Dependent;jt=T;lb=CM;na=NANDINAGARI VOWEL SIGN U;SB=EX;WB=Extend;-XIDS
+cp;119D5;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Bottom;InSC=Vowel_Dependent;jt=T;lb=CM;na=NANDINAGARI VOWEL SIGN UU;SB=EX;WB=Extend;-XIDS
+cp;119D6;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Bottom;InSC=Vowel_Dependent;jt=T;lb=CM;na=NANDINAGARI VOWEL SIGN VOCALIC R;SB=EX;WB=Extend;-XIDS
+cp;119D7;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Bottom;InSC=Vowel_Dependent;jt=T;lb=CM;na=NANDINAGARI VOWEL SIGN VOCALIC RR;SB=EX;WB=Extend;-XIDS
+unassigned;119D8..119D9
+cp;119DA;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Vowel_Dependent;jt=T;lb=CM;na=NANDINAGARI VOWEL SIGN E;SB=EX;WB=Extend;-XIDS
+cp;119DB;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Vowel_Dependent;jt=T;lb=CM;na=NANDINAGARI VOWEL SIGN AI;SB=EX;WB=Extend;-XIDS
+cp;119DC;gc=Mc;GCB=SM;-IDS;InPC=Right;InSC=Vowel_Dependent;lb=CM;na=NANDINAGARI VOWEL SIGN O;SB=EX;WB=Extend;-XIDS
+cp;119DD;gc=Mc;GCB=SM;-IDS;InPC=Right;InSC=Vowel_Dependent;lb=CM;na=NANDINAGARI VOWEL SIGN AU;SB=EX;WB=Extend;-XIDS
+# Various signs
+cp;119DE;gc=Mc;GCB=SM;-IDS;InPC=Right;InSC=Bindu;lb=CM;na=NANDINAGARI SIGN ANUSVARA;SB=EX;WB=Extend;-XIDS
+cp;119DF;gc=Mc;GCB=SM;-IDS;InPC=Right;InSC=Visarga;lb=CM;na=NANDINAGARI SIGN VISARGA;SB=EX;WB=Extend;-XIDS
+cp;119E0;-Alpha;bc=NSM;ccc=9;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;Gr_Link;-IDS;InPC=Bottom;InSC=Virama;jt=T;lb=CM;na=NANDINAGARI SIGN VIRAMA;SB=EX;WB=Extend;-XIDS
+cp;119E1;InSC=Avagraha;na=NANDINAGARI SIGN AVAGRAHA
+cp;119E2;-Alpha;gc=Po;-IDC;-IDS;InSC=Other;lb=BB;na=NANDINAGARI SIGN SIDDHAM;SB=XX;WB=XX;-XIDC;-XIDS
+# Punctuation
+cp;119E3;InSC=Other;na=NANDINAGARI HEADSTROKE
+# Dependent vowel sign
+cp;119E4;gc=Mc;GCB=SM;-IDS;InPC=Left;InSC=Vowel_Dependent;lb=CM;na=NANDINAGARI VOWEL SIGN PRISHTHAMATRA E;SB=EX;WB=Extend;-XIDS
+unassigned;119E5..119FF
+
block;11A00..11A4F;age=10.0;Alpha;blk=Zanabazar_Square;gc=Lo;Gr_Base;IDC;IDS;InSC=Consonant;lb=AL;SB=LE;sc=Zanb;vo=U;WB=LE;XIDC;XIDS
# 11A00..11A4F Zanabazar Square
# Vowel letter
@@ -25438,7 +25600,9 @@ cp;11A80;na=SOYOMBO LETTER SSA
cp;11A81;na=SOYOMBO LETTER SA
cp;11A82;na=SOYOMBO LETTER HA
cp;11A83;na=SOYOMBO LETTER KSSA
-unassigned;11A84..11A85;vo=U
+# Alternate visarga signs
+cp;11A84;age=12.0;GCB=PP;InSC=Consonant_Prefixed;na=SOYOMBO SIGN JIHVAMULIYA
+cp;11A85;age=12.0;GCB=PP;InSC=Consonant_Prefixed;na=SOYOMBO SIGN UPADHMANIYA
# Cluster-initial letters
cp;11A86;GCB=PP;InSC=Consonant_Prefixed;na=SOYOMBO CLUSTER-INITIAL LETTER RA
cp;11A87;GCB=PP;InSC=Consonant_Prefixed;na=SOYOMBO CLUSTER-INITIAL LETTER LA
@@ -25940,6 +26104,69 @@ cp;11EF7;-Alpha;gc=Po;-IDC;-IDS;InSC=Other;na=MAKASAR PASSIMBANG;SB=ST;STerm;Ter
cp;11EF8;-Alpha;gc=Po;-IDC;-IDS;InSC=Other;na=MAKASAR END OF SECTION;SB=ST;STerm;Term;WB=XX;-XIDC;-XIDS
unassigned;11EF9..11EFF
+block;11FC0..11FFF;age=12.0;bc=ON;blk=Tamil_Sup;gc=So;Gr_Base;lb=AL;sc=Taml
+# 11FC0..11FFF Tamil Supplement
+# Fractions
+cp;11FC0;bc=L;gc=No;na=TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH;nt=Nu;nv=1/320
+cp;11FC1;bc=L;gc=No;na=TAMIL FRACTION ONE ONE-HUNDRED-AND-SIXTIETH;nt=Nu;nv=1/160
+cp;11FC2;bc=L;gc=No;na=TAMIL FRACTION ONE EIGHTIETH;nt=Nu;nv=1/80
+cp;11FC3;bc=L;gc=No;na=TAMIL FRACTION ONE SIXTY-FOURTH;nt=Nu;nv=1/64
+cp;11FC4;bc=L;gc=No;na=TAMIL FRACTION ONE FORTIETH;nt=Nu;nv=1/40
+cp;11FC5;bc=L;gc=No;na=TAMIL FRACTION ONE THIRTY-SECOND;nt=Nu;nv=1/32
+cp;11FC6;bc=L;gc=No;na=TAMIL FRACTION THREE EIGHTIETHS;nt=Nu;nv=3/80
+cp;11FC7;bc=L;gc=No;na=TAMIL FRACTION THREE SIXTY-FOURTHS;nt=Nu;nv=3/64
+cp;11FC8;bc=L;gc=No;na=TAMIL FRACTION ONE TWENTIETH;nt=Nu;nv=1/20
+cp;11FC9;bc=L;gc=No;na=TAMIL FRACTION ONE SIXTEENTH-1;nt=Nu;nv=1/16
+cp;11FCA;bc=L;gc=No;na=TAMIL FRACTION ONE SIXTEENTH-2;nt=Nu;nv=1/16
+cp;11FCB;bc=L;gc=No;na=TAMIL FRACTION ONE TENTH;nt=Nu;nv=1/10
+cp;11FCC;bc=L;gc=No;na=TAMIL FRACTION ONE EIGHTH;nt=Nu;nv=1/8
+cp;11FCD;bc=L;gc=No;na=TAMIL FRACTION THREE TWENTIETHS;nt=Nu;nv=3/20
+cp;11FCE;bc=L;gc=No;na=TAMIL FRACTION THREE SIXTEENTHS;nt=Nu;nv=3/16
+cp;11FCF;bc=L;gc=No;na=TAMIL FRACTION ONE FIFTH;nt=Nu;nv=1/5
+cp;11FD0;bc=L;gc=No;na=TAMIL FRACTION ONE QUARTER;nt=Nu;nv=1/4;scx=Gran Taml
+cp;11FD1;bc=L;gc=No;na=TAMIL FRACTION ONE HALF-1;nt=Nu;nv=1/2;scx=Gran Taml
+cp;11FD2;bc=L;gc=No;na=TAMIL FRACTION ONE HALF-2;nt=Nu;nv=1/2
+cp;11FD3;bc=L;gc=No;na=TAMIL FRACTION THREE QUARTERS;nt=Nu;nv=3/4;scx=Gran Taml
+cp;11FD4;bc=L;gc=No;na=TAMIL FRACTION DOWNSCALING FACTOR KIIZH;nt=Nu;nv=1/320
+# Measures of grain
+cp;11FD5;na=TAMIL SIGN NEL
+cp;11FD6;na=TAMIL SIGN CEVITU
+cp;11FD7;na=TAMIL SIGN AAZHAAKKU
+cp;11FD8;na=TAMIL SIGN UZHAKKU
+cp;11FD9;na=TAMIL SIGN MUUVUZHAKKU
+cp;11FDA;na=TAMIL SIGN KURUNI
+cp;11FDB;na=TAMIL SIGN PATHAKKU
+cp;11FDC;na=TAMIL SIGN MUKKURUNI
+# Old currency symbols
+cp;11FDD;bc=ET;gc=Sc;lb=PO;na=TAMIL SIGN KAACU
+cp;11FDE;bc=ET;gc=Sc;lb=PO;na=TAMIL SIGN PANAM
+cp;11FDF;bc=ET;gc=Sc;lb=PO;na=TAMIL SIGN PON
+cp;11FE0;bc=ET;gc=Sc;lb=PO;na=TAMIL SIGN VARAAKAN
+# Symbols of weight, length, and area
+cp;11FE1;na=TAMIL SIGN PAARAM
+cp;11FE2;na=TAMIL SIGN KUZHI
+cp;11FE3;na=TAMIL SIGN VELI
+# Agricultural symbols
+cp;11FE4;na=TAMIL WET CULTIVATION SIGN
+cp;11FE5;na=TAMIL DRY CULTIVATION SIGN
+cp;11FE6;na=TAMIL LAND SIGN
+cp;11FE7;na=TAMIL SALT PAN SIGN
+# Clerical symbols
+cp;11FE8;na=TAMIL TRADITIONAL CREDIT SIGN
+cp;11FE9;na=TAMIL TRADITIONAL NUMBER SIGN
+cp;11FEA;na=TAMIL CURRENT SIGN
+cp;11FEB;na=TAMIL AND ODD SIGN
+cp;11FEC;na=TAMIL SPENT SIGN
+cp;11FED;na=TAMIL TOTAL SIGN
+# Other symbols and abbreviations
+cp;11FEE;na=TAMIL IN POSSESSION SIGN
+cp;11FEF;na=TAMIL STARTING FROM SIGN
+cp;11FF0;na=TAMIL SIGN MUTHALIYA
+cp;11FF1;na=TAMIL SIGN VAKAIYARAA
+unassigned;11FF2..11FFE
+# Punctuation
+cp;11FFF;bc=L;gc=Po;lb=BA;na=TAMIL PUNCTUATION END OF TEXT
+
block;12000..123FF;age=5.0;Alpha;blk=Cuneiform;gc=Lo;Gr_Base;IDC;IDS;lb=AL;SB=LE;sc=Xsux;WB=LE;XIDC;XIDS
# 12000..123FF Cuneiform
# Signs
@@ -28300,6 +28527,23 @@ cp;1342D;na=EGYPTIAN HIEROGLYPH AA031
cp;1342E;na=EGYPTIAN HIEROGLYPH AA032
unassigned;1342F;vo=U
+block;13430..1343F;age=12.0;blk=Egyptian_Hieroglyph_Format_Controls;CI;gc=Cf;GCB=CN;jt=T;lb=GL;SB=FO;sc=Egyp;vo=U;WB=FO
+# 13430..1343F Egyptian Hieroglyph Format Controls
+# Joiners
+cp;13430;na=EGYPTIAN HIEROGLYPH VERTICAL JOINER
+cp;13431;na=EGYPTIAN HIEROGLYPH HORIZONTAL JOINER
+# Sign insertion controls
+cp;13432;na=EGYPTIAN HIEROGLYPH INSERT AT TOP START
+cp;13433;na=EGYPTIAN HIEROGLYPH INSERT AT BOTTOM START
+cp;13434;na=EGYPTIAN HIEROGLYPH INSERT AT TOP END
+cp;13435;na=EGYPTIAN HIEROGLYPH INSERT AT BOTTOM END
+# Sign stacking control
+cp;13436;na=EGYPTIAN HIEROGLYPH OVERLAY MIDDLE
+# Segment scoping delimiters
+cp;13437;lb=OP;na=EGYPTIAN HIEROGLYPH BEGIN SEGMENT
+cp;13438;lb=CL;na=EGYPTIAN HIEROGLYPH END SEGMENT
+unassigned;13439..1343F;vo=U
+
block;14400..1467F;age=8.0;Alpha;blk=Anatolian_Hieroglyphs;gc=Lo;Gr_Base;IDC;IDS;lb=AL;SB=LE;sc=Hluw;vo=U;WB=LE;XIDC;XIDS
# 14400..1467F Anatolian Hieroglyphs
# A. The human body and clothing
@@ -29626,13 +29870,13 @@ cp;16B2D;na=PAHAWH HMONG CONSONANT AU
cp;16B2E;na=PAHAWH HMONG CONSONANT XAU
cp;16B2F;na=PAHAWH HMONG CONSONANT CAU
# Combining diacritical marks
-cp;16B30;bc=NSM;ccc=230;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=PAHAWH HMONG MARK CIM TUB;SB=EX;WB=Extend;-XIDS
-cp;16B31;bc=NSM;ccc=230;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=PAHAWH HMONG MARK CIM SO;SB=EX;WB=Extend;-XIDS
-cp;16B32;bc=NSM;ccc=230;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=PAHAWH HMONG MARK CIM KES;SB=EX;WB=Extend;-XIDS
-cp;16B33;bc=NSM;ccc=230;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=PAHAWH HMONG MARK CIM KHAV;SB=EX;WB=Extend;-XIDS
-cp;16B34;bc=NSM;ccc=230;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=PAHAWH HMONG MARK CIM SUAM;SB=EX;WB=Extend;-XIDS
-cp;16B35;bc=NSM;ccc=230;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=PAHAWH HMONG MARK CIM HOM;SB=EX;WB=Extend;-XIDS
-cp;16B36;bc=NSM;ccc=230;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=PAHAWH HMONG MARK CIM TAUM;SB=EX;WB=Extend;-XIDS
+cp;16B30;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=PAHAWH HMONG MARK CIM TUB;SB=EX;WB=Extend;-XIDS
+cp;16B31;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=PAHAWH HMONG MARK CIM SO;SB=EX;WB=Extend;-XIDS
+cp;16B32;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=PAHAWH HMONG MARK CIM KES;SB=EX;WB=Extend;-XIDS
+cp;16B33;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=PAHAWH HMONG MARK CIM KHAV;SB=EX;WB=Extend;-XIDS
+cp;16B34;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=PAHAWH HMONG MARK CIM SUAM;SB=EX;WB=Extend;-XIDS
+cp;16B35;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=PAHAWH HMONG MARK CIM HOM;SB=EX;WB=Extend;-XIDS
+cp;16B36;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=PAHAWH HMONG MARK CIM TAUM;SB=EX;WB=Extend;-XIDS
# Punctuation
cp;16B37;-Alpha;gc=Po;-IDC;-IDS;lb=BA;na=PAHAWH HMONG SIGN VOS THOM;SB=ST;STerm;Term;WB=XX;-XIDC;-XIDS
cp;16B38;-Alpha;gc=Po;-IDC;-IDS;lb=BA;na=PAHAWH HMONG SIGN VOS TSHAB CEEB;SB=ST;STerm;Term;WB=XX;-XIDC;-XIDS
@@ -29820,164 +30064,184 @@ cp;16E99;-Alpha;-Cased;-CWCM;gc=Po;-IDC;-IDS;na=MEDEFAIDRIN SYMBOL AIVA;SB=XX;WB
cp;16E9A;-Alpha;-Cased;-CWCM;gc=Po;-IDC;-IDS;na=MEDEFAIDRIN EXCLAMATION OH;SB=XX;WB=XX;-XIDC;-XIDS
unassigned;16E9B..16E9F
-block;16F00..16F9F;age=6.1;Alpha;blk=Miao;gc=Lo;Gr_Base;IDC;IDS;lb=AL;SB=LE;sc=Plrd;WB=LE;XIDC;XIDS
+block;16F00..16F9F;age=6.1;Alpha;blk=Miao;gc=Lo;Gr_Base;IDC;IDS;lb=AL;SB=LE;sc=Plrd;WB=Extend;XIDC;XIDS
# 16F00..16F9F Miao
# Consonant onsets
-cp;16F00;na=MIAO LETTER PA
-cp;16F01;na=MIAO LETTER BA
-cp;16F02;na=MIAO LETTER YI PA
-cp;16F03;na=MIAO LETTER PLA
-cp;16F04;na=MIAO LETTER MA
-cp;16F05;na=MIAO LETTER MHA
-cp;16F06;na=MIAO LETTER ARCHAIC MA
-cp;16F07;na=MIAO LETTER FA
-cp;16F08;na=MIAO LETTER VA
-cp;16F09;na=MIAO LETTER VFA
-cp;16F0A;na=MIAO LETTER TA
-cp;16F0B;na=MIAO LETTER DA
-cp;16F0C;na=MIAO LETTER YI TTA
-cp;16F0D;na=MIAO LETTER YI TA
-cp;16F0E;na=MIAO LETTER TTA
-cp;16F0F;na=MIAO LETTER DDA
-cp;16F10;na=MIAO LETTER NA
-cp;16F11;na=MIAO LETTER NHA
-cp;16F12;na=MIAO LETTER YI NNA
-cp;16F13;na=MIAO LETTER ARCHAIC NA
-cp;16F14;na=MIAO LETTER NNA
-cp;16F15;na=MIAO LETTER NNHA
-cp;16F16;na=MIAO LETTER LA
-cp;16F17;na=MIAO LETTER LYA
-cp;16F18;na=MIAO LETTER LHA
-cp;16F19;na=MIAO LETTER LHYA
-cp;16F1A;na=MIAO LETTER TLHA
-cp;16F1B;na=MIAO LETTER DLHA
-cp;16F1C;na=MIAO LETTER TLHYA
-cp;16F1D;na=MIAO LETTER DLHYA
-cp;16F1E;na=MIAO LETTER KA
-cp;16F1F;na=MIAO LETTER GA
-cp;16F20;na=MIAO LETTER YI KA
-cp;16F21;na=MIAO LETTER QA
-cp;16F22;na=MIAO LETTER QGA
-cp;16F23;na=MIAO LETTER NGA
-cp;16F24;na=MIAO LETTER NGHA
-cp;16F25;na=MIAO LETTER ARCHAIC NGA
-cp;16F26;na=MIAO LETTER HA
-cp;16F27;na=MIAO LETTER XA
-cp;16F28;na=MIAO LETTER GHA
-cp;16F29;na=MIAO LETTER GHHA
-cp;16F2A;na=MIAO LETTER TSSA
-cp;16F2B;na=MIAO LETTER DZZA
-cp;16F2C;na=MIAO LETTER NYA
-cp;16F2D;na=MIAO LETTER NYHA
-cp;16F2E;na=MIAO LETTER TSHA
-cp;16F2F;na=MIAO LETTER DZHA
-cp;16F30;na=MIAO LETTER YI TSHA
-cp;16F31;na=MIAO LETTER YI DZHA
-cp;16F32;na=MIAO LETTER REFORMED TSHA
-cp;16F33;na=MIAO LETTER SHA
-cp;16F34;na=MIAO LETTER SSA
-cp;16F35;na=MIAO LETTER ZHA
-cp;16F36;na=MIAO LETTER ZSHA
-cp;16F37;na=MIAO LETTER TSA
-cp;16F38;na=MIAO LETTER DZA
-cp;16F39;na=MIAO LETTER YI TSA
-cp;16F3A;na=MIAO LETTER SA
-cp;16F3B;na=MIAO LETTER ZA
-cp;16F3C;na=MIAO LETTER ZSA
-cp;16F3D;na=MIAO LETTER ZZA
-cp;16F3E;na=MIAO LETTER ZZSA
-cp;16F3F;na=MIAO LETTER ARCHAIC ZZA
-cp;16F40;na=MIAO LETTER ZZYA
-cp;16F41;na=MIAO LETTER ZZSYA
-cp;16F42;na=MIAO LETTER WA
-cp;16F43;na=MIAO LETTER AH
-cp;16F44;na=MIAO LETTER HHA
-unassigned;16F45..16F4F
+cp;16F00;na=MIAO LETTER PA;WB=LE
+cp;16F01;na=MIAO LETTER BA;WB=LE
+cp;16F02;na=MIAO LETTER YI PA;WB=LE
+cp;16F03;na=MIAO LETTER PLA;WB=LE
+cp;16F04;na=MIAO LETTER MA;WB=LE
+cp;16F05;na=MIAO LETTER MHA;WB=LE
+cp;16F06;na=MIAO LETTER ARCHAIC MA;WB=LE
+cp;16F07;na=MIAO LETTER FA;WB=LE
+cp;16F08;na=MIAO LETTER VA;WB=LE
+cp;16F09;na=MIAO LETTER VFA;WB=LE
+cp;16F0A;na=MIAO LETTER TA;WB=LE
+cp;16F0B;na=MIAO LETTER DA;WB=LE
+cp;16F0C;na=MIAO LETTER YI TTA;WB=LE
+cp;16F0D;na=MIAO LETTER YI TA;WB=LE
+cp;16F0E;na=MIAO LETTER TTA;WB=LE
+cp;16F0F;na=MIAO LETTER DDA;WB=LE
+cp;16F10;na=MIAO LETTER NA;WB=LE
+cp;16F11;na=MIAO LETTER NHA;WB=LE
+cp;16F12;na=MIAO LETTER YI NNA;WB=LE
+cp;16F13;na=MIAO LETTER ARCHAIC NA;WB=LE
+cp;16F14;na=MIAO LETTER NNA;WB=LE
+cp;16F15;na=MIAO LETTER NNHA;WB=LE
+cp;16F16;na=MIAO LETTER LA;WB=LE
+cp;16F17;na=MIAO LETTER LYA;WB=LE
+cp;16F18;na=MIAO LETTER LHA;WB=LE
+cp;16F19;na=MIAO LETTER LHYA;WB=LE
+cp;16F1A;na=MIAO LETTER TLHA;WB=LE
+cp;16F1B;na=MIAO LETTER DLHA;WB=LE
+cp;16F1C;na=MIAO LETTER TLHYA;WB=LE
+cp;16F1D;na=MIAO LETTER DLHYA;WB=LE
+cp;16F1E;na=MIAO LETTER KA;WB=LE
+cp;16F1F;na=MIAO LETTER GA;WB=LE
+cp;16F20;na=MIAO LETTER YI KA;WB=LE
+cp;16F21;na=MIAO LETTER QA;WB=LE
+cp;16F22;na=MIAO LETTER QGA;WB=LE
+cp;16F23;na=MIAO LETTER NGA;WB=LE
+cp;16F24;na=MIAO LETTER NGHA;WB=LE
+cp;16F25;na=MIAO LETTER ARCHAIC NGA;WB=LE
+cp;16F26;na=MIAO LETTER HA;WB=LE
+cp;16F27;na=MIAO LETTER XA;WB=LE
+cp;16F28;na=MIAO LETTER GHA;WB=LE
+cp;16F29;na=MIAO LETTER GHHA;WB=LE
+cp;16F2A;na=MIAO LETTER TSSA;WB=LE
+cp;16F2B;na=MIAO LETTER DZZA;WB=LE
+cp;16F2C;na=MIAO LETTER NYA;WB=LE
+cp;16F2D;na=MIAO LETTER NYHA;WB=LE
+cp;16F2E;na=MIAO LETTER TSHA;WB=LE
+cp;16F2F;na=MIAO LETTER DZHA;WB=LE
+cp;16F30;na=MIAO LETTER YI TSHA;WB=LE
+cp;16F31;na=MIAO LETTER YI DZHA;WB=LE
+cp;16F32;na=MIAO LETTER REFORMED TSHA;WB=LE
+cp;16F33;na=MIAO LETTER SHA;WB=LE
+cp;16F34;na=MIAO LETTER SSA;WB=LE
+cp;16F35;na=MIAO LETTER ZHA;WB=LE
+cp;16F36;na=MIAO LETTER ZSHA;WB=LE
+cp;16F37;na=MIAO LETTER TSA;WB=LE
+cp;16F38;na=MIAO LETTER DZA;WB=LE
+cp;16F39;na=MIAO LETTER YI TSA;WB=LE
+cp;16F3A;na=MIAO LETTER SA;WB=LE
+cp;16F3B;na=MIAO LETTER ZA;WB=LE
+cp;16F3C;na=MIAO LETTER ZSA;WB=LE
+cp;16F3D;na=MIAO LETTER ZZA;WB=LE
+cp;16F3E;na=MIAO LETTER ZZSA;WB=LE
+cp;16F3F;na=MIAO LETTER ARCHAIC ZZA;WB=LE
+cp;16F40;na=MIAO LETTER ZZYA;WB=LE
+cp;16F41;na=MIAO LETTER ZZSYA;WB=LE
+cp;16F42;na=MIAO LETTER WA;WB=LE
+cp;16F43;na=MIAO LETTER AH;WB=LE
+cp;16F44;na=MIAO LETTER HHA;WB=LE
+cp;16F45;age=12.0;na=MIAO LETTER BRI;WB=LE
+cp;16F46;age=12.0;na=MIAO LETTER SYI;WB=LE
+cp;16F47;age=12.0;na=MIAO LETTER DZYI;WB=LE
+cp;16F48;age=12.0;na=MIAO LETTER TE;WB=LE
+cp;16F49;age=12.0;na=MIAO LETTER TSE;WB=LE
+cp;16F4A;age=12.0;na=MIAO LETTER RTE;WB=LE
+unassigned;16F4B..16F4E
# Modifiers
-cp;16F50;na=MIAO LETTER NASALIZATION
-cp;16F51;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO SIGN ASPIRATION;SB=EX;WB=Extend;-XIDS
-cp;16F52;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO SIGN REFORMED VOICING;SB=EX;WB=Extend;-XIDS
-cp;16F53;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO SIGN REFORMED ASPIRATION;SB=EX;WB=Extend;-XIDS
+cp;16F4F;age=12.0;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=MIAO SIGN CONSONANT MODIFIER BAR;SB=EX;-XIDS
+cp;16F50;na=MIAO LETTER NASALIZATION;WB=LE
+cp;16F51;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO SIGN ASPIRATION;SB=EX;-XIDS
+cp;16F52;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO SIGN REFORMED VOICING;SB=EX;-XIDS
+cp;16F53;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO SIGN REFORMED ASPIRATION;SB=EX;-XIDS
# Vowels and finals
-cp;16F54;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN A;SB=EX;WB=Extend;-XIDS
-cp;16F55;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN AA;SB=EX;WB=Extend;-XIDS
-cp;16F56;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN AHH;SB=EX;WB=Extend;-XIDS
-cp;16F57;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN AN;SB=EX;WB=Extend;-XIDS
-cp;16F58;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN ANG;SB=EX;WB=Extend;-XIDS
-cp;16F59;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN O;SB=EX;WB=Extend;-XIDS
-cp;16F5A;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN OO;SB=EX;WB=Extend;-XIDS
-cp;16F5B;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN WO;SB=EX;WB=Extend;-XIDS
-cp;16F5C;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN W;SB=EX;WB=Extend;-XIDS
-cp;16F5D;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN E;SB=EX;WB=Extend;-XIDS
-cp;16F5E;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN EN;SB=EX;WB=Extend;-XIDS
-cp;16F5F;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN ENG;SB=EX;WB=Extend;-XIDS
-cp;16F60;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN OEY;SB=EX;WB=Extend;-XIDS
-cp;16F61;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN I;SB=EX;WB=Extend;-XIDS
-cp;16F62;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN IA;SB=EX;WB=Extend;-XIDS
-cp;16F63;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN IAN;SB=EX;WB=Extend;-XIDS
-cp;16F64;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN IANG;SB=EX;WB=Extend;-XIDS
-cp;16F65;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN IO;SB=EX;WB=Extend;-XIDS
-cp;16F66;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN IE;SB=EX;WB=Extend;-XIDS
-cp;16F67;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN II;SB=EX;WB=Extend;-XIDS
-cp;16F68;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN IU;SB=EX;WB=Extend;-XIDS
-cp;16F69;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN ING;SB=EX;WB=Extend;-XIDS
-cp;16F6A;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN U;SB=EX;WB=Extend;-XIDS
-cp;16F6B;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN UA;SB=EX;WB=Extend;-XIDS
-cp;16F6C;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN UAN;SB=EX;WB=Extend;-XIDS
-cp;16F6D;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN UANG;SB=EX;WB=Extend;-XIDS
-cp;16F6E;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN UU;SB=EX;WB=Extend;-XIDS
-cp;16F6F;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN UEI;SB=EX;WB=Extend;-XIDS
-cp;16F70;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN UNG;SB=EX;WB=Extend;-XIDS
-cp;16F71;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN Y;SB=EX;WB=Extend;-XIDS
-cp;16F72;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN YI;SB=EX;WB=Extend;-XIDS
-cp;16F73;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN AE;SB=EX;WB=Extend;-XIDS
-cp;16F74;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN AEE;SB=EX;WB=Extend;-XIDS
-cp;16F75;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN ERR;SB=EX;WB=Extend;-XIDS
-cp;16F76;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN ROUNDED ERR;SB=EX;WB=Extend;-XIDS
-cp;16F77;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN ER;SB=EX;WB=Extend;-XIDS
-cp;16F78;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN ROUNDED ER;SB=EX;WB=Extend;-XIDS
-cp;16F79;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN AI;SB=EX;WB=Extend;-XIDS
-cp;16F7A;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN EI;SB=EX;WB=Extend;-XIDS
-cp;16F7B;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN AU;SB=EX;WB=Extend;-XIDS
-cp;16F7C;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN OU;SB=EX;WB=Extend;-XIDS
-cp;16F7D;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN N;SB=EX;WB=Extend;-XIDS
-cp;16F7E;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN NG;SB=EX;WB=Extend;-XIDS
-unassigned;16F7F..16F8E
+cp;16F54;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN A;SB=EX;-XIDS
+cp;16F55;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN AA;SB=EX;-XIDS
+cp;16F56;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN AHH;SB=EX;-XIDS
+cp;16F57;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN AN;SB=EX;-XIDS
+cp;16F58;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN ANG;SB=EX;-XIDS
+cp;16F59;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN O;SB=EX;-XIDS
+cp;16F5A;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN OO;SB=EX;-XIDS
+cp;16F5B;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN WO;SB=EX;-XIDS
+cp;16F5C;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN W;SB=EX;-XIDS
+cp;16F5D;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN E;SB=EX;-XIDS
+cp;16F5E;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN EN;SB=EX;-XIDS
+cp;16F5F;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN ENG;SB=EX;-XIDS
+cp;16F60;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN OEY;SB=EX;-XIDS
+cp;16F61;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN I;SB=EX;-XIDS
+cp;16F62;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN IA;SB=EX;-XIDS
+cp;16F63;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN IAN;SB=EX;-XIDS
+cp;16F64;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN IANG;SB=EX;-XIDS
+cp;16F65;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN IO;SB=EX;-XIDS
+cp;16F66;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN IE;SB=EX;-XIDS
+cp;16F67;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN II;SB=EX;-XIDS
+cp;16F68;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN IU;SB=EX;-XIDS
+cp;16F69;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN ING;SB=EX;-XIDS
+cp;16F6A;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN U;SB=EX;-XIDS
+cp;16F6B;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN UA;SB=EX;-XIDS
+cp;16F6C;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN UAN;SB=EX;-XIDS
+cp;16F6D;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN UANG;SB=EX;-XIDS
+cp;16F6E;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN UU;SB=EX;-XIDS
+cp;16F6F;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN UEI;SB=EX;-XIDS
+cp;16F70;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN UNG;SB=EX;-XIDS
+cp;16F71;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN Y;SB=EX;-XIDS
+cp;16F72;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN YI;SB=EX;-XIDS
+cp;16F73;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN AE;SB=EX;-XIDS
+cp;16F74;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN AEE;SB=EX;-XIDS
+cp;16F75;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN ERR;SB=EX;-XIDS
+cp;16F76;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN ROUNDED ERR;SB=EX;-XIDS
+cp;16F77;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN ER;SB=EX;-XIDS
+cp;16F78;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN ROUNDED ER;SB=EX;-XIDS
+cp;16F79;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN AI;SB=EX;-XIDS
+cp;16F7A;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN EI;SB=EX;-XIDS
+cp;16F7B;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN AU;SB=EX;-XIDS
+cp;16F7C;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN OU;SB=EX;-XIDS
+cp;16F7D;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN N;SB=EX;-XIDS
+cp;16F7E;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN NG;SB=EX;-XIDS
+cp;16F7F;age=12.0;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN UOG;SB=EX;-XIDS
+cp;16F80;age=12.0;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN YUI;SB=EX;-XIDS
+cp;16F81;age=12.0;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN OG;SB=EX;-XIDS
+cp;16F82;age=12.0;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN OER;SB=EX;-XIDS
+cp;16F83;age=12.0;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN VW;SB=EX;-XIDS
+cp;16F84;age=12.0;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN IG;SB=EX;-XIDS
+cp;16F85;age=12.0;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN EA;SB=EX;-XIDS
+cp;16F86;age=12.0;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN IONG;SB=EX;-XIDS
+cp;16F87;age=12.0;gc=Mc;GCB=SM;-IDS;lb=CM;na=MIAO VOWEL SIGN UI;SB=EX;-XIDS
+unassigned;16F88..16F8E
# Positioning tone marks
-cp;16F8F;-Alpha;bc=NSM;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=MIAO TONE RIGHT;SB=EX;WB=Extend;-XIDS
-cp;16F90;-Alpha;bc=NSM;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=MIAO TONE TOP RIGHT;SB=EX;WB=Extend;-XIDS
-cp;16F91;-Alpha;bc=NSM;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=MIAO TONE ABOVE;SB=EX;WB=Extend;-XIDS
-cp;16F92;-Alpha;bc=NSM;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=MIAO TONE BELOW;SB=EX;WB=Extend;-XIDS
+cp;16F8F;bc=NSM;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=MIAO TONE RIGHT;SB=EX;-XIDS
+cp;16F90;bc=NSM;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=MIAO TONE TOP RIGHT;SB=EX;-XIDS
+cp;16F91;bc=NSM;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=MIAO TONE ABOVE;SB=EX;-XIDS
+cp;16F92;bc=NSM;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=MIAO TONE BELOW;SB=EX;-XIDS
# Baseline tone marks
-cp;16F93;CI;Dia;gc=Lm;na=MIAO LETTER TONE-2
-cp;16F94;CI;Dia;gc=Lm;na=MIAO LETTER TONE-3
-cp;16F95;CI;Dia;gc=Lm;na=MIAO LETTER TONE-4
-cp;16F96;CI;Dia;gc=Lm;na=MIAO LETTER TONE-5
-cp;16F97;CI;Dia;gc=Lm;na=MIAO LETTER TONE-6
-cp;16F98;CI;Dia;gc=Lm;na=MIAO LETTER TONE-7
-cp;16F99;CI;Dia;gc=Lm;na=MIAO LETTER TONE-8
+cp;16F93;CI;Dia;gc=Lm;na=MIAO LETTER TONE-2;WB=LE
+cp;16F94;CI;Dia;gc=Lm;na=MIAO LETTER TONE-3;WB=LE
+cp;16F95;CI;Dia;gc=Lm;na=MIAO LETTER TONE-4;WB=LE
+cp;16F96;CI;Dia;gc=Lm;na=MIAO LETTER TONE-5;WB=LE
+cp;16F97;CI;Dia;gc=Lm;na=MIAO LETTER TONE-6;WB=LE
+cp;16F98;CI;Dia;gc=Lm;na=MIAO LETTER TONE-7;WB=LE
+cp;16F99;CI;Dia;gc=Lm;na=MIAO LETTER TONE-8;WB=LE
# Archaic baseline tone marks
-cp;16F9A;CI;Dia;gc=Lm;na=MIAO LETTER REFORMED TONE-1
-cp;16F9B;CI;Dia;gc=Lm;na=MIAO LETTER REFORMED TONE-2
-cp;16F9C;CI;Dia;gc=Lm;na=MIAO LETTER REFORMED TONE-4
-cp;16F9D;CI;Dia;gc=Lm;na=MIAO LETTER REFORMED TONE-5
-cp;16F9E;CI;Dia;gc=Lm;na=MIAO LETTER REFORMED TONE-6
-cp;16F9F;CI;Dia;gc=Lm;na=MIAO LETTER REFORMED TONE-8
-
-block;16FE0..16FFF;Alpha;blk=Ideographic_Symbols;CI;ea=W;Ext;gc=Lm;Gr_Base;IDC;IDS;lb=NS;SB=LE;vo=U;WB=LE;XIDC;XIDS
+cp;16F9A;CI;Dia;gc=Lm;na=MIAO LETTER REFORMED TONE-1;WB=LE
+cp;16F9B;CI;Dia;gc=Lm;na=MIAO LETTER REFORMED TONE-2;WB=LE
+cp;16F9C;CI;Dia;gc=Lm;na=MIAO LETTER REFORMED TONE-4;WB=LE
+cp;16F9D;CI;Dia;gc=Lm;na=MIAO LETTER REFORMED TONE-5;WB=LE
+cp;16F9E;CI;Dia;gc=Lm;na=MIAO LETTER REFORMED TONE-6;WB=LE
+cp;16F9F;CI;Dia;gc=Lm;na=MIAO LETTER REFORMED TONE-8;WB=LE
+
+block;16FE0..16FFF;age=12.0;Alpha;blk=Ideographic_Symbols;CI;ea=W;Ext;gc=Lm;Gr_Base;IDC;IDS;lb=NS;SB=LE;sc=Zyyy;vo=U;WB=LE;XIDC;XIDS
# 16FE0..16FFF Ideographic Symbols and Punctuation
# Tangut mark
cp;16FE0;age=9.0;na=TANGUT ITERATION MARK;sc=Tang
# Nushu mark
cp;16FE1;age=10.0;na=NUSHU ITERATION MARK;sc=Nshu
-unassigned;16FE2..16FFF;vo=U
+# Marks used in ancient Chinese texts
+cp;16FE2;-Alpha;bc=ON;-CI;-Ext;gc=Po;-IDC;-IDS;na=OLD CHINESE HOOK MARK;SB=XX;WB=XX;-XIDC;-XIDS
+cp;16FE3;na=OLD CHINESE ITERATION MARK
+unassigned;16FE4..16FFF;vo=U
block;17000..187FF;Alpha;blk=Tangut;ea=W;gc=Lo;Gr_Base;IDC;Ideo;IDS;lb=ID;SB=LE;sc=Tang;vo=U;XIDC;XIDS
-# 17000..187F1 Tangut
-algnamesrange;17000..187F1;han;TANGUT IDEOGRAPH-
+# 17000..187F7 Tangut
+algnamesrange;17000..187F7;han;TANGUT IDEOGRAPH-
cp;17000..187EC;age=9.0
cp;187ED..187F1;age=11.0
-unassigned;187F2..187FF;vo=U
+cp;187F2..187F7;age=12.0
+unassigned;187F8..187FF;vo=U
block;18800..18AFF;age=9.0;Alpha;blk=Tangut_Components;ea=W;gc=Lo;Gr_Base;IDC;Ideo;IDS;lb=ID;SB=LE;sc=Tang;vo=U;XIDC;XIDS
# 18800..18AFF Tangut Components
@@ -31050,6 +31314,21 @@ cp;1B11D;na=HENTAIGANA LETTER N-MU-MO-1
cp;1B11E;na=HENTAIGANA LETTER N-MU-MO-2
unassigned;1B11F..1B12F;vo=U
+block;1B130..1B16F;age=12.0;Alpha;blk=Small_Kana_Ext;ea=W;gc=Lo;Gr_Base;IDC;IDS;lb=CJ;SB=LE;sc=Kana;vo=U;XIDC;XIDS
+# 1B130..1B16F Small Kana Extension
+unassigned;1B130..1B14F;vo=U
+# Historic small hiragana letters
+cp;1B150;na=HIRAGANA LETTER SMALL WI;sc=Hira
+cp;1B151;na=HIRAGANA LETTER SMALL WE;sc=Hira
+cp;1B152;na=HIRAGANA LETTER SMALL WO;sc=Hira
+unassigned;1B153..1B163;vo=U
+# Historic small katakana letters
+cp;1B164;na=KATAKANA LETTER SMALL WI;WB=KA
+cp;1B165;na=KATAKANA LETTER SMALL WE;WB=KA
+cp;1B166;na=KATAKANA LETTER SMALL WO;WB=KA
+cp;1B167;na=KATAKANA LETTER SMALL N;WB=KA
+unassigned;1B168..1B16F;vo=U
+
block;1B170..1B2FF;age=10.0;Alpha;blk=Nushu;ea=W;gc=Lo;Gr_Base;IDC;Ideo;IDS;lb=ID;SB=LE;sc=Nshu;vo=U;XIDC;XIDS
# 1B170..1B2FF Nushu
# One-stroke character
@@ -34206,6 +34485,158 @@ cp;1E029;na=COMBINING GLAGOLITIC LETTER IOTATED BIG YUS
cp;1E02A;na=COMBINING GLAGOLITIC LETTER FITA
unassigned;1E02B..1E02F
+block;1E100..1E14F;age=12.0;Alpha;blk=Nyiakeng_Puachue_Hmong;gc=Lo;Gr_Base;IDC;IDS;lb=AL;SB=LE;sc=Hmnp;WB=LE;XIDC;XIDS
+# 1E100..1E14F Nyiakeng Puachue Hmong
+# Consonant onsets
+cp;1E100;na=NYIAKENG PUACHUE HMONG LETTER MA
+cp;1E101;na=NYIAKENG PUACHUE HMONG LETTER TSA
+cp;1E102;na=NYIAKENG PUACHUE HMONG LETTER NTA
+cp;1E103;na=NYIAKENG PUACHUE HMONG LETTER TA
+cp;1E104;na=NYIAKENG PUACHUE HMONG LETTER HA
+cp;1E105;na=NYIAKENG PUACHUE HMONG LETTER NA
+cp;1E106;na=NYIAKENG PUACHUE HMONG LETTER XA
+cp;1E107;na=NYIAKENG PUACHUE HMONG LETTER NKA
+cp;1E108;na=NYIAKENG PUACHUE HMONG LETTER CA
+cp;1E109;na=NYIAKENG PUACHUE HMONG LETTER LA
+cp;1E10A;na=NYIAKENG PUACHUE HMONG LETTER SA
+cp;1E10B;na=NYIAKENG PUACHUE HMONG LETTER ZA
+cp;1E10C;na=NYIAKENG PUACHUE HMONG LETTER NCA
+cp;1E10D;na=NYIAKENG PUACHUE HMONG LETTER NTSA
+cp;1E10E;na=NYIAKENG PUACHUE HMONG LETTER KA
+cp;1E10F;na=NYIAKENG PUACHUE HMONG LETTER DA
+cp;1E110;na=NYIAKENG PUACHUE HMONG LETTER NYA
+cp;1E111;na=NYIAKENG PUACHUE HMONG LETTER NRA
+cp;1E112;na=NYIAKENG PUACHUE HMONG LETTER VA
+cp;1E113;na=NYIAKENG PUACHUE HMONG LETTER NTXA
+cp;1E114;na=NYIAKENG PUACHUE HMONG LETTER TXA
+cp;1E115;na=NYIAKENG PUACHUE HMONG LETTER FA
+cp;1E116;na=NYIAKENG PUACHUE HMONG LETTER RA
+cp;1E117;na=NYIAKENG PUACHUE HMONG LETTER QA
+cp;1E118;na=NYIAKENG PUACHUE HMONG LETTER YA
+cp;1E119;na=NYIAKENG PUACHUE HMONG LETTER NQA
+cp;1E11A;na=NYIAKENG PUACHUE HMONG LETTER PA
+cp;1E11B;na=NYIAKENG PUACHUE HMONG LETTER XYA
+cp;1E11C;na=NYIAKENG PUACHUE HMONG LETTER NPA
+cp;1E11D;na=NYIAKENG PUACHUE HMONG LETTER DLA
+cp;1E11E;na=NYIAKENG PUACHUE HMONG LETTER NPLA
+cp;1E11F;na=NYIAKENG PUACHUE HMONG LETTER HAH
+cp;1E120;na=NYIAKENG PUACHUE HMONG LETTER MLA
+cp;1E121;na=NYIAKENG PUACHUE HMONG LETTER PLA
+cp;1E122;na=NYIAKENG PUACHUE HMONG LETTER GA
+cp;1E123;na=NYIAKENG PUACHUE HMONG LETTER RRA
+# Vowel rimes
+cp;1E124;na=NYIAKENG PUACHUE HMONG LETTER A
+cp;1E125;na=NYIAKENG PUACHUE HMONG LETTER AA
+cp;1E126;na=NYIAKENG PUACHUE HMONG LETTER I
+cp;1E127;na=NYIAKENG PUACHUE HMONG LETTER U
+cp;1E128;na=NYIAKENG PUACHUE HMONG LETTER O
+cp;1E129;na=NYIAKENG PUACHUE HMONG LETTER OO
+cp;1E12A;na=NYIAKENG PUACHUE HMONG LETTER E
+cp;1E12B;na=NYIAKENG PUACHUE HMONG LETTER EE
+cp;1E12C;na=NYIAKENG PUACHUE HMONG LETTER W
+unassigned;1E12D..1E12F
+# Tone marks
+cp;1E130;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=NYIAKENG PUACHUE HMONG TONE-B;SB=EX;WB=Extend;-XIDS
+cp;1E131;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=NYIAKENG PUACHUE HMONG TONE-M;SB=EX;WB=Extend;-XIDS
+cp;1E132;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=NYIAKENG PUACHUE HMONG TONE-J;SB=EX;WB=Extend;-XIDS
+cp;1E133;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=NYIAKENG PUACHUE HMONG TONE-V;SB=EX;WB=Extend;-XIDS
+cp;1E134;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=NYIAKENG PUACHUE HMONG TONE-S;SB=EX;WB=Extend;-XIDS
+cp;1E135;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=NYIAKENG PUACHUE HMONG TONE-G;SB=EX;WB=Extend;-XIDS
+cp;1E136;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=NYIAKENG PUACHUE HMONG TONE-D;SB=EX;WB=Extend;-XIDS
+# Determinatives
+cp;1E137;CI;gc=Lm;na=NYIAKENG PUACHUE HMONG SIGN FOR PERSON
+cp;1E138;CI;gc=Lm;na=NYIAKENG PUACHUE HMONG SIGN FOR THING
+cp;1E139;CI;gc=Lm;na=NYIAKENG PUACHUE HMONG SIGN FOR LOCATION
+cp;1E13A;CI;gc=Lm;na=NYIAKENG PUACHUE HMONG SIGN FOR ANIMAL
+cp;1E13B;CI;gc=Lm;na=NYIAKENG PUACHUE HMONG SIGN FOR INVERTEBRATE
+# Repetition mark
+cp;1E13C;CI;Ext;gc=Lm;na=NYIAKENG PUACHUE HMONG SIGN XW XW
+# Syllable lengthener
+cp;1E13D;CI;Ext;gc=Lm;na=NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
+unassigned;1E13E..1E13F
+# Digits
+cp;1E140;-Alpha;gc=Nd;-IDS;lb=NU;na=NYIAKENG PUACHUE HMONG DIGIT ZERO;nt=De;nv=0;SB=NU;WB=NU;-XIDS
+cp;1E141;-Alpha;gc=Nd;-IDS;lb=NU;na=NYIAKENG PUACHUE HMONG DIGIT ONE;nt=De;nv=1;SB=NU;WB=NU;-XIDS
+cp;1E142;-Alpha;gc=Nd;-IDS;lb=NU;na=NYIAKENG PUACHUE HMONG DIGIT TWO;nt=De;nv=2;SB=NU;WB=NU;-XIDS
+cp;1E143;-Alpha;gc=Nd;-IDS;lb=NU;na=NYIAKENG PUACHUE HMONG DIGIT THREE;nt=De;nv=3;SB=NU;WB=NU;-XIDS
+cp;1E144;-Alpha;gc=Nd;-IDS;lb=NU;na=NYIAKENG PUACHUE HMONG DIGIT FOUR;nt=De;nv=4;SB=NU;WB=NU;-XIDS
+cp;1E145;-Alpha;gc=Nd;-IDS;lb=NU;na=NYIAKENG PUACHUE HMONG DIGIT FIVE;nt=De;nv=5;SB=NU;WB=NU;-XIDS
+cp;1E146;-Alpha;gc=Nd;-IDS;lb=NU;na=NYIAKENG PUACHUE HMONG DIGIT SIX;nt=De;nv=6;SB=NU;WB=NU;-XIDS
+cp;1E147;-Alpha;gc=Nd;-IDS;lb=NU;na=NYIAKENG PUACHUE HMONG DIGIT SEVEN;nt=De;nv=7;SB=NU;WB=NU;-XIDS
+cp;1E148;-Alpha;gc=Nd;-IDS;lb=NU;na=NYIAKENG PUACHUE HMONG DIGIT EIGHT;nt=De;nv=8;SB=NU;WB=NU;-XIDS
+cp;1E149;-Alpha;gc=Nd;-IDS;lb=NU;na=NYIAKENG PUACHUE HMONG DIGIT NINE;nt=De;nv=9;SB=NU;WB=NU;-XIDS
+unassigned;1E14A..1E14D
+# Symbols
+cp;1E14E;na=NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ
+cp;1E14F;-Alpha;gc=So;-IDC;-IDS;na=NYIAKENG PUACHUE HMONG CIRCLED CA;SB=XX;WB=XX;-XIDC;-XIDS
+
+block;1E2C0..1E2FF;age=12.0;Alpha;blk=Wancho;gc=Lo;Gr_Base;IDC;IDS;lb=AL;SB=LE;sc=Wcho;WB=LE;XIDC;XIDS
+# 1E2C0..1E2FF Wancho
+# Letters
+cp;1E2C0;na=WANCHO LETTER AA
+cp;1E2C1;na=WANCHO LETTER A
+cp;1E2C2;na=WANCHO LETTER BA
+cp;1E2C3;na=WANCHO LETTER CA
+cp;1E2C4;na=WANCHO LETTER DA
+cp;1E2C5;na=WANCHO LETTER GA
+cp;1E2C6;na=WANCHO LETTER YA
+cp;1E2C7;na=WANCHO LETTER PHA
+cp;1E2C8;na=WANCHO LETTER LA
+cp;1E2C9;na=WANCHO LETTER NA
+cp;1E2CA;na=WANCHO LETTER PA
+cp;1E2CB;na=WANCHO LETTER TA
+cp;1E2CC;na=WANCHO LETTER THA
+cp;1E2CD;na=WANCHO LETTER FA
+cp;1E2CE;na=WANCHO LETTER SA
+cp;1E2CF;na=WANCHO LETTER SHA
+cp;1E2D0;na=WANCHO LETTER JA
+cp;1E2D1;na=WANCHO LETTER ZA
+cp;1E2D2;na=WANCHO LETTER WA
+cp;1E2D3;na=WANCHO LETTER VA
+cp;1E2D4;na=WANCHO LETTER KA
+cp;1E2D5;na=WANCHO LETTER O
+cp;1E2D6;na=WANCHO LETTER AU
+cp;1E2D7;na=WANCHO LETTER RA
+cp;1E2D8;na=WANCHO LETTER MA
+cp;1E2D9;na=WANCHO LETTER KHA
+cp;1E2DA;na=WANCHO LETTER HA
+cp;1E2DB;na=WANCHO LETTER E
+cp;1E2DC;na=WANCHO LETTER I
+cp;1E2DD;na=WANCHO LETTER NGA
+cp;1E2DE;na=WANCHO LETTER U
+cp;1E2DF;na=WANCHO LETTER LLHA
+cp;1E2E0;na=WANCHO LETTER TSA
+cp;1E2E1;na=WANCHO LETTER TRA
+cp;1E2E2;na=WANCHO LETTER ONG
+cp;1E2E3;na=WANCHO LETTER AANG
+cp;1E2E4;na=WANCHO LETTER ANG
+cp;1E2E5;na=WANCHO LETTER ING
+cp;1E2E6;na=WANCHO LETTER ON
+cp;1E2E7;na=WANCHO LETTER EN
+cp;1E2E8;na=WANCHO LETTER AAN
+cp;1E2E9;na=WANCHO LETTER NYA
+cp;1E2EA;na=WANCHO LETTER UEN
+cp;1E2EB;na=WANCHO LETTER YIH
+# Tone marks
+cp;1E2EC;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=WANCHO TONE TUP;SB=EX;WB=Extend;-XIDS
+cp;1E2ED;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=WANCHO TONE TUPNI;SB=EX;WB=Extend;-XIDS
+cp;1E2EE;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=WANCHO TONE KOI;SB=EX;WB=Extend;-XIDS
+cp;1E2EF;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=WANCHO TONE KOINI;SB=EX;WB=Extend;-XIDS
+# Digits
+cp;1E2F0;-Alpha;gc=Nd;-IDS;lb=NU;na=WANCHO DIGIT ZERO;nt=De;nv=0;SB=NU;WB=NU;-XIDS
+cp;1E2F1;-Alpha;gc=Nd;-IDS;lb=NU;na=WANCHO DIGIT ONE;nt=De;nv=1;SB=NU;WB=NU;-XIDS
+cp;1E2F2;-Alpha;gc=Nd;-IDS;lb=NU;na=WANCHO DIGIT TWO;nt=De;nv=2;SB=NU;WB=NU;-XIDS
+cp;1E2F3;-Alpha;gc=Nd;-IDS;lb=NU;na=WANCHO DIGIT THREE;nt=De;nv=3;SB=NU;WB=NU;-XIDS
+cp;1E2F4;-Alpha;gc=Nd;-IDS;lb=NU;na=WANCHO DIGIT FOUR;nt=De;nv=4;SB=NU;WB=NU;-XIDS
+cp;1E2F5;-Alpha;gc=Nd;-IDS;lb=NU;na=WANCHO DIGIT FIVE;nt=De;nv=5;SB=NU;WB=NU;-XIDS
+cp;1E2F6;-Alpha;gc=Nd;-IDS;lb=NU;na=WANCHO DIGIT SIX;nt=De;nv=6;SB=NU;WB=NU;-XIDS
+cp;1E2F7;-Alpha;gc=Nd;-IDS;lb=NU;na=WANCHO DIGIT SEVEN;nt=De;nv=7;SB=NU;WB=NU;-XIDS
+cp;1E2F8;-Alpha;gc=Nd;-IDS;lb=NU;na=WANCHO DIGIT EIGHT;nt=De;nv=8;SB=NU;WB=NU;-XIDS
+cp;1E2F9;-Alpha;gc=Nd;-IDS;lb=NU;na=WANCHO DIGIT NINE;nt=De;nv=9;SB=NU;WB=NU;-XIDS
+unassigned;1E2FA..1E2FE
+# Currency symbol
+cp;1E2FF;-Alpha;bc=ET;gc=Sc;-IDC;-IDS;lb=PR;na=WANCHO NGUN SIGN;SB=XX;WB=XX;-XIDC;-XIDS
+
block;1E800..1E8DF;age=7.0;Alpha;bc=R;blk=Mende_Kikakui;gc=Lo;Gr_Base;IDC;IDS;lb=AL;SB=LE;sc=Mend;WB=LE;XIDC;XIDS
# 1E800..1E8DF Mende Kikakui
# Syllables in k-
@@ -34538,7 +34969,9 @@ cp;1E947;bc=NSM;-Cased;ccc=230;CI;-CWCM;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;l
cp;1E948;-Alpha;bc=NSM;-Cased;ccc=230;CI;-CWCM;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=ADLAM CONSONANT MODIFIER;SB=EX;WB=Extend;-XIDS
cp;1E949;-Alpha;bc=NSM;-Cased;ccc=230;CI;-CWCM;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=ADLAM GEMINATE CONSONANT MODIFIER;SB=EX;WB=Extend;-XIDS
cp;1E94A;-Alpha;bc=NSM;-Cased;ccc=7;CI;-CWCM;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=ADLAM NUKTA;SB=EX;WB=Extend;-XIDS
-unassigned;1E94B..1E94F;bc=R
+# Modifier letter
+cp;1E94B;age=12.0;-Cased;CI;-CWCM;gc=Lm;jt=T;na=ADLAM NASALIZATION MARK;SB=LE
+unassigned;1E94C..1E94F;bc=R
# Digits
cp;1E950;-Alpha;-Cased;-CWCM;gc=Nd;-IDS;jt=U;lb=NU;na=ADLAM DIGIT ZERO;nt=De;nv=0;SB=NU;WB=NU;-XIDS
cp;1E951;-Alpha;-Cased;-CWCM;gc=Nd;-IDS;jt=U;lb=NU;na=ADLAM DIGIT ONE;nt=De;nv=1;SB=NU;WB=NU;-XIDS
@@ -34634,7 +35067,7 @@ cp;1ECAC;gc=So;lb=PO;na=INDIC SIYAQ PLACEHOLDER;nt=None;nv=NaN
cp;1ECAD;na=INDIC SIYAQ FRACTION ONE QUARTER;nv=1/4
cp;1ECAE;na=INDIC SIYAQ FRACTION ONE HALF;nv=1/2
cp;1ECAF;na=INDIC SIYAQ FRACTION THREE QUARTERS;nv=3/4
-# Currency sign
+# Currency symbol
cp;1ECB0;gc=Sc;lb=PO;na=INDIC SIYAQ RUPEE MARK;nt=None;nv=NaN
# Alternate forms
cp;1ECB1;na=INDIC SIYAQ NUMBER ALTERNATE ONE;nv=1
@@ -34644,7 +35077,84 @@ cp;1ECB4;na=INDIC SIYAQ ALTERNATE LAKH MARK
unassigned;1ECB5..1ECBF;bc=AL
# No block
-unassigned;1ECC0..1EDFF;bc=R
+unassigned;1ECC0..1ECFF;bc=R
+
+block;1ED00..1ED4F;age=12.0;bc=AL;blk=Ottoman_Siyaq_Numbers;gc=No;Gr_Base;lb=AL;nt=Nu;nv=10000;sc=Zyyy
+# 1ED00..1ED4F Ottoman Siyaq Numbers
+unassigned;1ED00;bc=AL
+# Primary numbers
+cp;1ED01;na=OTTOMAN SIYAQ NUMBER ONE;nv=1
+cp;1ED02;na=OTTOMAN SIYAQ NUMBER TWO;nv=2
+cp;1ED03;na=OTTOMAN SIYAQ NUMBER THREE;nv=3
+cp;1ED04;na=OTTOMAN SIYAQ NUMBER FOUR;nv=4
+cp;1ED05;na=OTTOMAN SIYAQ NUMBER FIVE;nv=5
+cp;1ED06;na=OTTOMAN SIYAQ NUMBER SIX;nv=6
+cp;1ED07;na=OTTOMAN SIYAQ NUMBER SEVEN;nv=7
+cp;1ED08;na=OTTOMAN SIYAQ NUMBER EIGHT;nv=8
+cp;1ED09;na=OTTOMAN SIYAQ NUMBER NINE;nv=9
+# Tens
+cp;1ED0A;na=OTTOMAN SIYAQ NUMBER TEN;nv=10
+cp;1ED0B;na=OTTOMAN SIYAQ NUMBER TWENTY;nv=20
+cp;1ED0C;na=OTTOMAN SIYAQ NUMBER THIRTY;nv=30
+cp;1ED0D;na=OTTOMAN SIYAQ NUMBER FORTY;nv=40
+cp;1ED0E;na=OTTOMAN SIYAQ NUMBER FIFTY;nv=50
+cp;1ED0F;na=OTTOMAN SIYAQ NUMBER SIXTY;nv=60
+cp;1ED10;na=OTTOMAN SIYAQ NUMBER SEVENTY;nv=70
+cp;1ED11;na=OTTOMAN SIYAQ NUMBER EIGHTY;nv=80
+cp;1ED12;na=OTTOMAN SIYAQ NUMBER NINETY;nv=90
+# Hundreds
+cp;1ED13;na=OTTOMAN SIYAQ NUMBER ONE HUNDRED;nv=100
+cp;1ED14;na=OTTOMAN SIYAQ NUMBER TWO HUNDRED;nv=200
+cp;1ED15;na=OTTOMAN SIYAQ NUMBER THREE HUNDRED;nv=300
+cp;1ED16;na=OTTOMAN SIYAQ NUMBER FOUR HUNDRED;nv=400
+cp;1ED17;na=OTTOMAN SIYAQ NUMBER FIVE HUNDRED;nv=500
+cp;1ED18;na=OTTOMAN SIYAQ NUMBER SIX HUNDRED;nv=600
+cp;1ED19;na=OTTOMAN SIYAQ NUMBER SEVEN HUNDRED;nv=700
+cp;1ED1A;na=OTTOMAN SIYAQ NUMBER EIGHT HUNDRED;nv=800
+cp;1ED1B;na=OTTOMAN SIYAQ NUMBER NINE HUNDRED;nv=900
+# Thousands
+cp;1ED1C;na=OTTOMAN SIYAQ NUMBER ONE THOUSAND;nv=1000
+cp;1ED1D;na=OTTOMAN SIYAQ NUMBER TWO THOUSAND;nv=2000
+cp;1ED1E;na=OTTOMAN SIYAQ NUMBER THREE THOUSAND;nv=3000
+cp;1ED1F;na=OTTOMAN SIYAQ NUMBER FOUR THOUSAND;nv=4000
+cp;1ED20;na=OTTOMAN SIYAQ NUMBER FIVE THOUSAND;nv=5000
+cp;1ED21;na=OTTOMAN SIYAQ NUMBER SIX THOUSAND;nv=6000
+cp;1ED22;na=OTTOMAN SIYAQ NUMBER SEVEN THOUSAND;nv=7000
+cp;1ED23;na=OTTOMAN SIYAQ NUMBER EIGHT THOUSAND;nv=8000
+cp;1ED24;na=OTTOMAN SIYAQ NUMBER NINE THOUSAND;nv=9000
+# Ten thousands
+cp;1ED25;na=OTTOMAN SIYAQ NUMBER TEN THOUSAND
+cp;1ED26;na=OTTOMAN SIYAQ NUMBER TWENTY THOUSAND;nv=20000
+cp;1ED27;na=OTTOMAN SIYAQ NUMBER THIRTY THOUSAND;nv=30000
+cp;1ED28;na=OTTOMAN SIYAQ NUMBER FORTY THOUSAND;nv=40000
+cp;1ED29;na=OTTOMAN SIYAQ NUMBER FIFTY THOUSAND;nv=50000
+cp;1ED2A;na=OTTOMAN SIYAQ NUMBER SIXTY THOUSAND;nv=60000
+cp;1ED2B;na=OTTOMAN SIYAQ NUMBER SEVENTY THOUSAND;nv=70000
+cp;1ED2C;na=OTTOMAN SIYAQ NUMBER EIGHTY THOUSAND;nv=80000
+cp;1ED2D;na=OTTOMAN SIYAQ NUMBER NINETY THOUSAND;nv=90000
+# Multiplier
+cp;1ED2E;gc=So;na=OTTOMAN SIYAQ MARRATAN;nt=None;nv=NaN
+# Alternate forms
+cp;1ED2F;na=OTTOMAN SIYAQ ALTERNATE NUMBER TWO;nv=2
+cp;1ED30;na=OTTOMAN SIYAQ ALTERNATE NUMBER THREE;nv=3
+cp;1ED31;na=OTTOMAN SIYAQ ALTERNATE NUMBER FOUR;nv=4
+cp;1ED32;na=OTTOMAN SIYAQ ALTERNATE NUMBER FIVE;nv=5
+cp;1ED33;na=OTTOMAN SIYAQ ALTERNATE NUMBER SIX;nv=6
+cp;1ED34;na=OTTOMAN SIYAQ ALTERNATE NUMBER SEVEN;nv=7
+cp;1ED35;na=OTTOMAN SIYAQ ALTERNATE NUMBER EIGHT;nv=8
+cp;1ED36;na=OTTOMAN SIYAQ ALTERNATE NUMBER NINE;nv=9
+cp;1ED37;na=OTTOMAN SIYAQ ALTERNATE NUMBER TEN;nv=10
+cp;1ED38;na=OTTOMAN SIYAQ ALTERNATE NUMBER FOUR HUNDRED;nv=400
+cp;1ED39;na=OTTOMAN SIYAQ ALTERNATE NUMBER SIX HUNDRED;nv=600
+cp;1ED3A;na=OTTOMAN SIYAQ ALTERNATE NUMBER TWO THOUSAND;nv=2000
+cp;1ED3B;na=OTTOMAN SIYAQ ALTERNATE NUMBER TEN THOUSAND
+# Fractions
+cp;1ED3C;na=OTTOMAN SIYAQ FRACTION ONE HALF;nv=1/2
+cp;1ED3D;na=OTTOMAN SIYAQ FRACTION ONE SIXTH;nv=1/6
+unassigned;1ED3E..1ED4F;bc=AL
+
+# No block
+unassigned;1ED50..1EDFF;bc=R
block;1EE00..1EEFF;age=6.1;Alpha;bc=AL;blk=Arabic_Math;CWKCF;dt=Font;gc=Lo;Gr_Base;IDC;IDS;lb=AL;Math;NFKC_QC=N;NFKD_QC=N;SB=LE;sc=Arab;WB=LE;XIDC;XIDS
# 1EE00..1EEFF Arabic Mathematical Alphabetic Symbols
@@ -35228,7 +35738,8 @@ cp;1F169;Alpha;Cased;na=NEGATIVE CIRCLED LATIN CAPITAL LETTER Z;SB=UP;Upper;WB=L
# Raised squared Latin sequences
cp;1F16A;age=6.1;bc=ON;CWKCF;dm=004D 0043;dt=Sup;ea=N;FC_NFKC=006D 0063;lb=AL;na=RAISED MC SIGN;NFKC_CF=006D 0063;NFKC_QC=N;NFKD_QC=N
cp;1F16B;age=6.1;bc=ON;CWKCF;dm=004D 0044;dt=Sup;ea=N;FC_NFKC=006D 0064;lb=AL;na=RAISED MD SIGN;NFKC_CF=006D 0064;NFKC_QC=N;NFKD_QC=N
-unassigned;1F16C..1F16F;ExtPict;lb=ID;vo=U
+cp;1F16C;age=12.0;bc=ON;CWKCF;dm=004D 0052;dt=Sup;ea=N;ExtPict;FC_NFKC=006D 0072;lb=AL;na=RAISED MR SIGN;NFKC_CF=006D 0072;NFKC_QC=N;NFKD_QC=N
+unassigned;1F16D..1F16F;ExtPict;lb=ID;vo=U
# White on black squared Latin letters
cp;1F170;Alpha;Cased;Emoji;ExtPict;na=NEGATIVE SQUARED LATIN CAPITAL LETTER A;SB=UP;Upper;WB=LE
cp;1F171;Alpha;Cased;Emoji;ExtPict;na=NEGATIVE SQUARED LATIN CAPITAL LETTER B;SB=UP;Upper;WB=LE
@@ -35796,12 +36307,12 @@ cp;1F466;EBase;lb=EB;na=BOY
cp;1F467;EBase;lb=EB;na=GIRL
cp;1F468;EBase;lb=EB;na=MAN
cp;1F469;EBase;lb=EB;na=WOMAN
-cp;1F46A;na=FAMILY
-cp;1F46B;na=MAN AND WOMAN HOLDING HANDS
-cp;1F46C;na=TWO MEN HOLDING HANDS
-cp;1F46D;na=TWO WOMEN HOLDING HANDS
+cp;1F46A;EBase;lb=EB;na=FAMILY
+cp;1F46B;EBase;lb=EB;na=MAN AND WOMAN HOLDING HANDS
+cp;1F46C;EBase;lb=EB;na=TWO MEN HOLDING HANDS
+cp;1F46D;EBase;lb=EB;na=TWO WOMEN HOLDING HANDS
cp;1F46E;EBase;lb=EB;na=POLICE OFFICER
-cp;1F46F;na=WOMAN WITH BUNNY EARS
+cp;1F46F;EBase;lb=EB;na=WOMAN WITH BUNNY EARS
cp;1F470;EBase;lb=EB;na=BRIDE WITH VEIL
cp;1F471;EBase;lb=EB;na=PERSON WITH BLOND HAIR
cp;1F472;EBase;lb=EB;na=MAN WITH GUA PI MAO
@@ -35838,9 +36349,9 @@ cp;1F48B;na=KISS MARK
cp;1F48C;na=LOVE LETTER
cp;1F48D;na=RING
cp;1F48E;na=GEM STONE
-cp;1F48F;na=KISS
+cp;1F48F;EBase;lb=EB;na=KISS
cp;1F490;na=BOUQUET
-cp;1F491;na=COUPLE WITH HEART
+cp;1F491;EBase;lb=EB;na=COUPLE WITH HEART
cp;1F492;na=WEDDING
# Heart symbols
cp;1F493;na=BEATING HEART
@@ -36483,7 +36994,8 @@ cp;1F6D2;age=9.0;na=SHOPPING TROLLEY
# Map symbols
cp;1F6D3;age=10.0;ea=N;-Emoji;-EPres;na=STUPA
cp;1F6D4;age=10.0;ea=N;-Emoji;-EPres;na=PAGODA
-unassigned;1F6D5..1F6DF;ExtPict;lb=ID;vo=U
+cp;1F6D5;age=12.0;na=HINDU TEMPLE
+unassigned;1F6D6..1F6DF;ExtPict;lb=ID;vo=U
# Miscellaneous symbols
cp;1F6E0;age=7.0;ea=N;-EPres;na=HAMMER AND WRENCH
cp;1F6E1;age=7.0;ea=N;-EPres;na=SHIELD
@@ -36510,7 +37022,8 @@ cp;1F6F6;age=9.0;na=CANOE
cp;1F6F7;age=10.0;na=SLED
cp;1F6F8;age=10.0;na=FLYING SAUCER
cp;1F6F9;age=11.0;na=SKATEBOARD
-unassigned;1F6FA..1F6FF;ExtPict;lb=ID;vo=U
+cp;1F6FA;age=12.0;na=AUTO RICKSHAW
+unassigned;1F6FB..1F6FF;ExtPict;lb=ID;vo=U
block;1F700..1F77F;age=6.0;bc=ON;blk=Alchemical;gc=So;Gr_Base;lb=AL;sc=Zyyy;vo=U
# 1F700..1F77F Alchemical Symbols
@@ -36763,7 +37276,22 @@ cp;1F7D5;age=11.0;ExtPict;lb=ID;na=CIRCLED TRIANGLE
cp;1F7D6;age=11.0;ExtPict;lb=ID;na=NEGATIVE CIRCLED TRIANGLE
cp;1F7D7;age=11.0;ExtPict;lb=ID;na=CIRCLED SQUARE
cp;1F7D8;age=11.0;ExtPict;lb=ID;na=NEGATIVE CIRCLED SQUARE
-unassigned;1F7D9..1F7FF;ExtPict;lb=ID;vo=U
+unassigned;1F7D9..1F7DF;ExtPict;lb=ID;vo=U
+# Colored circles
+cp;1F7E0;age=12.0;ea=W;Emoji;EPres;ExtPict;lb=ID;na=LARGE ORANGE CIRCLE
+cp;1F7E1;age=12.0;ea=W;Emoji;EPres;ExtPict;lb=ID;na=LARGE YELLOW CIRCLE
+cp;1F7E2;age=12.0;ea=W;Emoji;EPres;ExtPict;lb=ID;na=LARGE GREEN CIRCLE
+cp;1F7E3;age=12.0;ea=W;Emoji;EPres;ExtPict;lb=ID;na=LARGE PURPLE CIRCLE
+cp;1F7E4;age=12.0;ea=W;Emoji;EPres;ExtPict;lb=ID;na=LARGE BROWN CIRCLE
+# Colored squares
+cp;1F7E5;age=12.0;ea=W;Emoji;EPres;ExtPict;lb=ID;na=LARGE RED SQUARE
+cp;1F7E6;age=12.0;ea=W;Emoji;EPres;ExtPict;lb=ID;na=LARGE BLUE SQUARE
+cp;1F7E7;age=12.0;ea=W;Emoji;EPres;ExtPict;lb=ID;na=LARGE ORANGE SQUARE
+cp;1F7E8;age=12.0;ea=W;Emoji;EPres;ExtPict;lb=ID;na=LARGE YELLOW SQUARE
+cp;1F7E9;age=12.0;ea=W;Emoji;EPres;ExtPict;lb=ID;na=LARGE GREEN SQUARE
+cp;1F7EA;age=12.0;ea=W;Emoji;EPres;ExtPict;lb=ID;na=LARGE PURPLE SQUARE
+cp;1F7EB;age=12.0;ea=W;Emoji;EPres;ExtPict;lb=ID;na=LARGE BROWN SQUARE
+unassigned;1F7EC..1F7FF;ExtPict;lb=ID;vo=U
block;1F800..1F8FF;age=7.0;bc=ON;blk=Sup_Arrows_C;gc=So;Gr_Base;lb=AL;sc=Zyyy
# 1F800..1F8FF Supplemental Arrows-C
@@ -36950,7 +37478,12 @@ cp;1F908;ea=N;-Emoji;-EPres;-ExtPict;lb=AL;na=DOWNWARD FACING HOOK
cp;1F909;ea=N;-Emoji;-EPres;-ExtPict;lb=AL;na=DOWNWARD FACING NOTCHED HOOK
cp;1F90A;ea=N;-Emoji;-EPres;-ExtPict;lb=AL;na=DOWNWARD FACING HOOK WITH DOT
cp;1F90B;ea=N;-Emoji;-EPres;-ExtPict;lb=AL;na=DOWNWARD FACING NOTCHED HOOK WITH DOT
-unassigned;1F90C..1F90F;ExtPict;lb=ID;vo=U
+unassigned;1F90C;ExtPict;lb=ID;vo=U
+# Colored heart symbols
+cp;1F90D;age=12.0;na=WHITE HEART
+cp;1F90E;age=12.0;na=BROWN HEART
+# Hand symbol
+cp;1F90F;age=12.0;EBase;lb=EB;na=PINCHING HAND
# Emoticon faces
cp;1F910;age=8.0;na=ZIPPER-MOUTH FACE
cp;1F911;age=8.0;na=MONEY-MOUTH FACE
@@ -36966,7 +37499,7 @@ cp;1F919;age=9.0;EBase;lb=EB;na=CALL ME HAND
cp;1F91A;age=9.0;EBase;lb=EB;na=RAISED BACK OF HAND
cp;1F91B;age=9.0;EBase;lb=EB;na=LEFT-FACING FIST
cp;1F91C;age=9.0;EBase;lb=EB;na=RIGHT-FACING FIST
-cp;1F91D;age=9.0;na=HANDSHAKE
+cp;1F91D;age=9.0;EBase;lb=EB;na=HANDSHAKE
cp;1F91E;age=9.0;EBase;lb=EB;na=HAND WITH INDEX AND MIDDLE FINGERS CROSSED
cp;1F91F;EBase;lb=EB;na=I LOVE YOU HAND SIGN
# Emoticon faces
@@ -36995,14 +37528,15 @@ cp;1F934;age=9.0;EBase;lb=EB;na=PRINCE
cp;1F935;age=9.0;EBase;lb=EB;na=MAN IN TUXEDO
cp;1F936;age=9.0;EBase;lb=EB;na=MOTHER CHRISTMAS
cp;1F937;age=9.0;EBase;lb=EB;na=SHRUG
+# Sport symbols
cp;1F938;age=9.0;EBase;lb=EB;na=PERSON DOING CARTWHEEL
cp;1F939;age=9.0;EBase;lb=EB;na=JUGGLING
cp;1F93A;age=9.0;na=FENCER
cp;1F93B;age=9.0;-Emoji;-EPres;-ExtPict;na=MODERN PENTATHLON
-cp;1F93C;age=9.0;na=WRESTLERS
+cp;1F93C;age=9.0;EBase;lb=EB;na=WRESTLERS
cp;1F93D;age=9.0;EBase;lb=EB;na=WATER POLO
cp;1F93E;age=9.0;EBase;lb=EB;na=HANDBALL
-unassigned;1F93F;ExtPict;lb=ID;vo=U
+cp;1F93F;age=12.0;na=DIVING MASK
# Miscellaneous symbols
cp;1F940;age=9.0;na=WILTED FLOWER
cp;1F941;age=9.0;na=DRUM WITH DRUMSTICKS
@@ -37055,15 +37589,16 @@ cp;1F96E;age=11.0;na=MOON CAKE
cp;1F96F;age=11.0;na=BAGEL
# Faces
cp;1F970;age=11.0;na=SMILING FACE WITH SMILING EYES AND THREE HEARTS
-unassigned;1F971..1F972;ExtPict;lb=ID;vo=U
+cp;1F971;age=12.0;na=YAWNING FACE
+unassigned;1F972;ExtPict;lb=ID;vo=U
cp;1F973;age=11.0;na=FACE WITH PARTY HORN AND PARTY HAT
cp;1F974;age=11.0;na=FACE WITH UNEVEN EYES AND WAVY MOUTH
cp;1F975;age=11.0;na=OVERHEATED FACE
cp;1F976;age=11.0;na=FREEZING FACE
unassigned;1F977..1F979;ExtPict;lb=ID;vo=U
cp;1F97A;age=11.0;na=FACE WITH PLEADING EYES
-unassigned;1F97B;ExtPict;lb=ID;vo=U
# Clothing
+cp;1F97B;age=12.0;na=SARI
cp;1F97C;age=11.0;na=LAB COAT
cp;1F97D;age=11.0;na=GOGGLES
cp;1F97E;age=11.0;na=HIKING BOOT
@@ -37104,7 +37639,17 @@ cp;1F99F;age=11.0;na=MOSQUITO
cp;1F9A0;age=11.0;na=MICROBE
cp;1F9A1;age=11.0;na=BADGER
cp;1F9A2;age=11.0;na=SWAN
-unassigned;1F9A3..1F9AF;ExtPict;lb=ID;vo=U
+unassigned;1F9A3..1F9A4;ExtPict;lb=ID;vo=U
+cp;1F9A5;age=12.0;na=SLOTH
+cp;1F9A6;age=12.0;na=OTTER
+cp;1F9A7;age=12.0;na=ORANGUTAN
+cp;1F9A8;age=12.0;na=SKUNK
+cp;1F9A9;age=12.0;na=FLAMINGO
+cp;1F9AA;age=12.0;na=OYSTER
+unassigned;1F9AB..1F9AD;ExtPict;lb=ID;vo=U
+# Accessibility symbols
+cp;1F9AE;age=12.0;na=GUIDE DOG
+cp;1F9AF;age=12.0;na=PROBING CANE
# Emoji components
cp;1F9B0;age=11.0;EComp;na=EMOJI COMPONENT RED HAIR
cp;1F9B1;age=11.0;EComp;na=EMOJI COMPONENT CURLY HAIR
@@ -37118,12 +37663,30 @@ cp;1F9B7;age=11.0;na=TOOTH
# Role symbols
cp;1F9B8;age=11.0;EBase;lb=EB;na=SUPERHERO
cp;1F9B9;age=11.0;EBase;lb=EB;na=SUPERVILLAIN
-unassigned;1F9BA..1F9BF;ExtPict;lb=ID;vo=U
+# Accessibility symbols
+cp;1F9BA;age=12.0;na=SAFETY VEST
+cp;1F9BB;age=12.0;EBase;lb=EB;na=EAR WITH HEARING AID
+cp;1F9BC;age=12.0;na=MOTORIZED WHEELCHAIR
+cp;1F9BD;age=12.0;na=MANUAL WHEELCHAIR
+cp;1F9BE;age=12.0;na=MECHANICAL ARM
+cp;1F9BF;age=12.0;na=MECHANICAL LEG
# Food symbols
cp;1F9C0;age=8.0;na=CHEESE WEDGE
cp;1F9C1;age=11.0;na=CUPCAKE
cp;1F9C2;age=11.0;na=SALT SHAKER
-unassigned;1F9C3..1F9CF;ExtPict;lb=ID;vo=U
+cp;1F9C3;age=12.0;na=BEVERAGE BOX
+cp;1F9C4;age=12.0;na=GARLIC
+cp;1F9C5;age=12.0;na=ONION
+cp;1F9C6;age=12.0;na=FALAFEL
+cp;1F9C7;age=12.0;na=WAFFLE
+cp;1F9C8;age=12.0;na=BUTTER
+cp;1F9C9;age=12.0;na=MATE DRINK
+cp;1F9CA;age=12.0;na=ICE CUBE
+unassigned;1F9CB..1F9CC;ExtPict;lb=ID;vo=U
+# Portrait and accessibility symbols
+cp;1F9CD;age=12.0;EBase;lb=EB;na=STANDING PERSON
+cp;1F9CE;age=12.0;EBase;lb=EB;na=KNEELING PERSON
+cp;1F9CF;age=12.0;EBase;lb=EB;na=DEAF PERSON
# Portrait and role symbols
cp;1F9D0;na=FACE WITH MONOCLE
cp;1F9D1;EBase;lb=EB;na=ADULT
@@ -37178,28 +37741,151 @@ cp;1F9FD;age=11.0;na=SPONGE
cp;1F9FE;age=11.0;na=RECEIPT
cp;1F9FF;age=11.0;na=NAZAR AMULET
-block;1FA00..1FA6F;age=11.0;bc=ON;blk=Chess_Symbols;ExtPict;gc=So;Gr_Base;lb=ID;sc=Zyyy;vo=U
+block;1FA00..1FA6F;age=12.0;bc=ON;blk=Chess_Symbols;ExtPict;gc=So;Gr_Base;lb=AL;sc=Zyyy;vo=U
# 1FA00..1FA6F Chess Symbols
-unassigned;1FA00..1FA5F;ExtPict;lb=ID;vo=U
+# Neutral chess symbols
+cp;1FA00;na=NEUTRAL CHESS KING
+cp;1FA01;na=NEUTRAL CHESS QUEEN
+cp;1FA02;na=NEUTRAL CHESS ROOK
+cp;1FA03;na=NEUTRAL CHESS BISHOP
+cp;1FA04;na=NEUTRAL CHESS KNIGHT
+cp;1FA05;na=NEUTRAL CHESS PAWN
+# Chess symbols rotated 45 degrees
+cp;1FA06;na=WHITE CHESS KNIGHT ROTATED FORTY-FIVE DEGREES
+cp;1FA07;na=BLACK CHESS KNIGHT ROTATED FORTY-FIVE DEGREES
+cp;1FA08;na=NEUTRAL CHESS KNIGHT ROTATED FORTY-FIVE DEGREES
+# Chess symbols rotated 90 degrees
+cp;1FA09;na=WHITE CHESS KING ROTATED NINETY DEGREES
+cp;1FA0A;na=WHITE CHESS QUEEN ROTATED NINETY DEGREES
+cp;1FA0B;na=WHITE CHESS ROOK ROTATED NINETY DEGREES
+cp;1FA0C;na=WHITE CHESS BISHOP ROTATED NINETY DEGREES
+cp;1FA0D;na=WHITE CHESS KNIGHT ROTATED NINETY DEGREES
+cp;1FA0E;na=WHITE CHESS PAWN ROTATED NINETY DEGREES
+cp;1FA0F;na=BLACK CHESS KING ROTATED NINETY DEGREES
+cp;1FA10;na=BLACK CHESS QUEEN ROTATED NINETY DEGREES
+cp;1FA11;na=BLACK CHESS ROOK ROTATED NINETY DEGREES
+cp;1FA12;na=BLACK CHESS BISHOP ROTATED NINETY DEGREES
+cp;1FA13;na=BLACK CHESS KNIGHT ROTATED NINETY DEGREES
+cp;1FA14;na=BLACK CHESS PAWN ROTATED NINETY DEGREES
+cp;1FA15;na=NEUTRAL CHESS KING ROTATED NINETY DEGREES
+cp;1FA16;na=NEUTRAL CHESS QUEEN ROTATED NINETY DEGREES
+cp;1FA17;na=NEUTRAL CHESS ROOK ROTATED NINETY DEGREES
+cp;1FA18;na=NEUTRAL CHESS BISHOP ROTATED NINETY DEGREES
+cp;1FA19;na=NEUTRAL CHESS KNIGHT ROTATED NINETY DEGREES
+cp;1FA1A;na=NEUTRAL CHESS PAWN ROTATED NINETY DEGREES
+# Chess symbols rotated 135 degrees
+cp;1FA1B;na=WHITE CHESS KNIGHT ROTATED ONE HUNDRED THIRTY-FIVE DEGREES
+cp;1FA1C;na=BLACK CHESS KNIGHT ROTATED ONE HUNDRED THIRTY-FIVE DEGREES
+cp;1FA1D;na=NEUTRAL CHESS KNIGHT ROTATED ONE HUNDRED THIRTY-FIVE DEGREES
+# Chess symbols rotated 180 degrees (turned)
+cp;1FA1E;na=WHITE CHESS TURNED KING
+cp;1FA1F;na=WHITE CHESS TURNED QUEEN
+cp;1FA20;na=WHITE CHESS TURNED ROOK
+cp;1FA21;na=WHITE CHESS TURNED BISHOP
+cp;1FA22;na=WHITE CHESS TURNED KNIGHT
+cp;1FA23;na=WHITE CHESS TURNED PAWN
+cp;1FA24;na=BLACK CHESS TURNED KING
+cp;1FA25;na=BLACK CHESS TURNED QUEEN
+cp;1FA26;na=BLACK CHESS TURNED ROOK
+cp;1FA27;na=BLACK CHESS TURNED BISHOP
+cp;1FA28;na=BLACK CHESS TURNED KNIGHT
+cp;1FA29;na=BLACK CHESS TURNED PAWN
+cp;1FA2A;na=NEUTRAL CHESS TURNED KING
+cp;1FA2B;na=NEUTRAL CHESS TURNED QUEEN
+cp;1FA2C;na=NEUTRAL CHESS TURNED ROOK
+cp;1FA2D;na=NEUTRAL CHESS TURNED BISHOP
+cp;1FA2E;na=NEUTRAL CHESS TURNED KNIGHT
+cp;1FA2F;na=NEUTRAL CHESS TURNED PAWN
+# Chess symbols rotated 225 degrees
+cp;1FA30;na=WHITE CHESS KNIGHT ROTATED TWO HUNDRED TWENTY-FIVE DEGREES
+cp;1FA31;na=BLACK CHESS KNIGHT ROTATED TWO HUNDRED TWENTY-FIVE DEGREES
+cp;1FA32;na=NEUTRAL CHESS KNIGHT ROTATED TWO HUNDRED TWENTY-FIVE DEGREES
+# Chess symbols rotated 270 degrees
+cp;1FA33;na=WHITE CHESS KING ROTATED TWO HUNDRED SEVENTY DEGREES
+cp;1FA34;na=WHITE CHESS QUEEN ROTATED TWO HUNDRED SEVENTY DEGREES
+cp;1FA35;na=WHITE CHESS ROOK ROTATED TWO HUNDRED SEVENTY DEGREES
+cp;1FA36;na=WHITE CHESS BISHOP ROTATED TWO HUNDRED SEVENTY DEGREES
+cp;1FA37;na=WHITE CHESS KNIGHT ROTATED TWO HUNDRED SEVENTY DEGREES
+cp;1FA38;na=WHITE CHESS PAWN ROTATED TWO HUNDRED SEVENTY DEGREES
+cp;1FA39;na=BLACK CHESS KING ROTATED TWO HUNDRED SEVENTY DEGREES
+cp;1FA3A;na=BLACK CHESS QUEEN ROTATED TWO HUNDRED SEVENTY DEGREES
+cp;1FA3B;na=BLACK CHESS ROOK ROTATED TWO HUNDRED SEVENTY DEGREES
+cp;1FA3C;na=BLACK CHESS BISHOP ROTATED TWO HUNDRED SEVENTY DEGREES
+cp;1FA3D;na=BLACK CHESS KNIGHT ROTATED TWO HUNDRED SEVENTY DEGREES
+cp;1FA3E;na=BLACK CHESS PAWN ROTATED TWO HUNDRED SEVENTY DEGREES
+cp;1FA3F;na=NEUTRAL CHESS KING ROTATED TWO HUNDRED SEVENTY DEGREES
+cp;1FA40;na=NEUTRAL CHESS QUEEN ROTATED TWO HUNDRED SEVENTY DEGREES
+cp;1FA41;na=NEUTRAL CHESS ROOK ROTATED TWO HUNDRED SEVENTY DEGREES
+cp;1FA42;na=NEUTRAL CHESS BISHOP ROTATED TWO HUNDRED SEVENTY DEGREES
+cp;1FA43;na=NEUTRAL CHESS KNIGHT ROTATED TWO HUNDRED SEVENTY DEGREES
+cp;1FA44;na=NEUTRAL CHESS PAWN ROTATED TWO HUNDRED SEVENTY DEGREES
+# Chess symbols rotated 315 degrees
+cp;1FA45;na=WHITE CHESS KNIGHT ROTATED THREE HUNDRED FIFTEEN DEGREES
+cp;1FA46;na=BLACK CHESS KNIGHT ROTATED THREE HUNDRED FIFTEEN DEGREES
+cp;1FA47;na=NEUTRAL CHESS KNIGHT ROTATED THREE HUNDRED FIFTEEN DEGREES
+# Chess equihoppers
+cp;1FA48;na=WHITE CHESS EQUIHOPPER
+cp;1FA49;na=BLACK CHESS EQUIHOPPER
+cp;1FA4A;na=NEUTRAL CHESS EQUIHOPPER
+# Chess equihoppers rotated 90 degrees
+cp;1FA4B;na=WHITE CHESS EQUIHOPPER ROTATED NINETY DEGREES
+cp;1FA4C;na=BLACK CHESS EQUIHOPPER ROTATED NINETY DEGREES
+cp;1FA4D;na=NEUTRAL CHESS EQUIHOPPER ROTATED NINETY DEGREES
+# Hybrid chess symbols
+cp;1FA4E;na=WHITE CHESS KNIGHT-QUEEN
+cp;1FA4F;na=WHITE CHESS KNIGHT-ROOK
+cp;1FA50;na=WHITE CHESS KNIGHT-BISHOP
+cp;1FA51;na=BLACK CHESS KNIGHT-QUEEN
+cp;1FA52;na=BLACK CHESS KNIGHT-ROOK
+cp;1FA53;na=BLACK CHESS KNIGHT-BISHOP
+unassigned;1FA54..1FA5F;ExtPict;lb=ID;vo=U
# Xiangqi symbols
-cp;1FA60;na=XIANGQI RED GENERAL
-cp;1FA61;na=XIANGQI RED MANDARIN
-cp;1FA62;na=XIANGQI RED ELEPHANT
-cp;1FA63;na=XIANGQI RED HORSE
-cp;1FA64;na=XIANGQI RED CHARIOT
-cp;1FA65;na=XIANGQI RED CANNON
-cp;1FA66;na=XIANGQI RED SOLDIER
-cp;1FA67;na=XIANGQI BLACK GENERAL
-cp;1FA68;na=XIANGQI BLACK MANDARIN
-cp;1FA69;na=XIANGQI BLACK ELEPHANT
-cp;1FA6A;na=XIANGQI BLACK HORSE
-cp;1FA6B;na=XIANGQI BLACK CHARIOT
-cp;1FA6C;na=XIANGQI BLACK CANNON
-cp;1FA6D;na=XIANGQI BLACK SOLDIER
+cp;1FA60;age=11.0;lb=ID;na=XIANGQI RED GENERAL
+cp;1FA61;age=11.0;lb=ID;na=XIANGQI RED MANDARIN
+cp;1FA62;age=11.0;lb=ID;na=XIANGQI RED ELEPHANT
+cp;1FA63;age=11.0;lb=ID;na=XIANGQI RED HORSE
+cp;1FA64;age=11.0;lb=ID;na=XIANGQI RED CHARIOT
+cp;1FA65;age=11.0;lb=ID;na=XIANGQI RED CANNON
+cp;1FA66;age=11.0;lb=ID;na=XIANGQI RED SOLDIER
+cp;1FA67;age=11.0;lb=ID;na=XIANGQI BLACK GENERAL
+cp;1FA68;age=11.0;lb=ID;na=XIANGQI BLACK MANDARIN
+cp;1FA69;age=11.0;lb=ID;na=XIANGQI BLACK ELEPHANT
+cp;1FA6A;age=11.0;lb=ID;na=XIANGQI BLACK HORSE
+cp;1FA6B;age=11.0;lb=ID;na=XIANGQI BLACK CHARIOT
+cp;1FA6C;age=11.0;lb=ID;na=XIANGQI BLACK CANNON
+cp;1FA6D;age=11.0;lb=ID;na=XIANGQI BLACK SOLDIER
unassigned;1FA6E..1FA6F;ExtPict;lb=ID;vo=U
+block;1FA70..1FAFF;age=12.0;bc=ON;blk=Symbols_And_Pictographs_Ext_A;ea=W;Emoji;EPres;ExtPict;gc=So;Gr_Base;lb=ID;sc=Zyyy;vo=U
+# 1FA70..1FAFF Symbols and Pictographs Extended-A
+# Clothing
+cp;1FA70;na=BALLET SHOES
+cp;1FA71;na=ONE-PIECE SWIMSUIT
+cp;1FA72;na=BRIEFS
+cp;1FA73;na=SHORTS
+unassigned;1FA74..1FA77;ExtPict;lb=ID;vo=U
+# Medical symbols
+cp;1FA78;na=DROP OF BLOOD
+cp;1FA79;na=ADHESIVE BANDAGE
+cp;1FA7A;na=STETHOSCOPE
+unassigned;1FA7B..1FA7F;ExtPict;lb=ID;vo=U
+# Toys and sport symbols
+cp;1FA80;na=YO-YO
+cp;1FA81;na=KITE
+cp;1FA82;na=PARACHUTE
+unassigned;1FA83..1FA8F;ExtPict;lb=ID;vo=U
+# Miscellaneous objects
+cp;1FA90;na=RINGED PLANET
+cp;1FA91;na=CHAIR
+cp;1FA92;na=RAZOR
+cp;1FA93;na=AXE
+cp;1FA94;na=DIYA LAMP
+cp;1FA95;na=BANJO
+unassigned;1FA96..1FA9F;ExtPict;lb=ID;vo=U
+unassigned;1FAA0..1FAFF;ExtPict;lb=ID
+
# No block
-unassigned;1FA70..1FF7F;ExtPict;lb=ID
+unassigned;1FB00..1FF7F;ExtPict;lb=ID
# 1FF80..1FFFF Unassigned
unassigned;1FF80..1FFFD;ExtPict;lb=ID
# Noncharacters
diff --git a/Build/source/libs/icu/icu-src/source/extra/Makefile.in b/Build/source/libs/icu/icu-src/source/extra/Makefile.in
index 4dd2818bdb9..2e48dba73d7 100644
--- a/Build/source/libs/icu/icu-src/source/extra/Makefile.in
+++ b/Build/source/libs/icu/icu-src/source/extra/Makefile.in
@@ -23,7 +23,7 @@ subdir = extra
## Files to remove for 'make clean'
CLEANFILES = *~
-SUBDIRS = uconv
+SUBDIRS = scrptrun uconv
## List of phony targets
.PHONY : all all-local all-recursive install install-local \
diff --git a/Build/source/libs/icu/icu-src/source/extra/scrptrun/scrptrun.cpp b/Build/source/libs/icu/icu-src/source/extra/scrptrun/scrptrun.cpp
index d36ec614c46..0a438c316a6 100644
--- a/Build/source/libs/icu/icu-src/source/extra/scrptrun/scrptrun.cpp
+++ b/Build/source/libs/icu/icu-src/source/extra/scrptrun/scrptrun.cpp
@@ -19,6 +19,8 @@
#include "cmemory.h"
#include "scrptrun.h"
+U_NAMESPACE_BEGIN
+
const char ScriptRun::fgClassID=0;
UChar32 ScriptRun::pairedChars[] = {
@@ -201,3 +203,4 @@ UBool ScriptRun::next()
return true;
}
+U_NAMESPACE_END
diff --git a/Build/source/libs/icu/icu-src/source/extra/scrptrun/scrptrun.h b/Build/source/libs/icu/icu-src/source/extra/scrptrun/scrptrun.h
index 0ef5df24bbf..ac6bfe327e8 100644
--- a/Build/source/libs/icu/icu-src/source/extra/scrptrun/scrptrun.h
+++ b/Build/source/libs/icu/icu-src/source/extra/scrptrun/scrptrun.h
@@ -20,6 +20,8 @@
#include "unicode/uobject.h"
#include "unicode/uscript.h"
+U_NAMESPACE_BEGIN
+
struct ScriptRecord
{
UChar32 startChar;
@@ -152,5 +154,6 @@ inline void ScriptRun::reset(const UChar chars[], int32_t start, int32_t length)
reset(start, length);
}
+U_NAMESPACE_END
#endif
diff --git a/Build/source/libs/icu/icu-src/source/extra/scrptrun/srtest.cpp b/Build/source/libs/icu/icu-src/source/extra/scrptrun/srtest.cpp
index 5792071ff0f..8d59fb9ef6a 100644
--- a/Build/source/libs/icu/icu-src/source/extra/scrptrun/srtest.cpp
+++ b/Build/source/libs/icu/icu-src/source/extra/scrptrun/srtest.cpp
@@ -27,9 +27,9 @@ UChar testChars[] = {
int32_t testLength = UPRV_LENGTHOF(testChars);
-void main()
+int main()
{
- ScriptRun scriptRun(testChars, 0, testLength);
+ icu::ScriptRun scriptRun(testChars, 0, testLength);
while (scriptRun.next()) {
int32_t start = scriptRun.getScriptStart();
@@ -38,4 +38,5 @@ void main()
printf("Script '%s' from %d to %d.\n", uscript_getName(code), start, end);
}
+ return 0;
}
diff --git a/Build/source/libs/icu/icu-src/source/extra/uconv/makedata.mak b/Build/source/libs/icu/icu-src/source/extra/uconv/makedata.mak
index 2cc07d61096..b30f59728b5 100644
--- a/Build/source/libs/icu/icu-src/source/extra/uconv/makedata.mak
+++ b/Build/source/libs/icu/icu-src/source/extra/uconv/makedata.mak
@@ -17,7 +17,7 @@ CFG=Debug
!ENDIF
#Here we test if a valid configuration is given
-!IF "$(CFG)" != "Release" && "$(CFG)" != "release" && "$(CFG)" != "Debug" && "$(CFG)" != "debug" && "$(CFG)" != "x86\Release" && "$(CFG)" != "x86\Debug" && "$(CFG)" != "x64\Release" && "$(CFG)" != "x64\Debug"
+!IF "$(CFG)" != "Release" && "$(CFG)" != "release" && "$(CFG)" != "Debug" && "$(CFG)" != "debug" && "$(CFG)" != "x86\Release" && "$(CFG)" != "x86\Debug" && "$(CFG)" != "x64\Release" && "$(CFG)" != "x64\Debug" && "$(CFG)" != "ARM\Release" && "$(CFG)" != "ARM\Debug" && "$(CFG)" != "ARM64\Release" && "$(CFG)" != "ARM64\Debug"
!MESSAGE Invalid configuration "$(CFG)" specified.
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
@@ -51,7 +51,9 @@ PKGMODE=static
ICD=$(ICUDATA)^\
DATA_PATH=$(ICUP)\data^\
-!IF "$(CFG)" == "x64\Release" || "$(CFG)" == "x64\Debug"
+# Use the x64 tools for building ARM and ARM64.
+# Note: This is similar to the TOOLS CFG PATH in source\data\makedata.mak
+!IF "$(CFG)" == "x64\Release" || "$(CFG)" == "x64\Debug" || "$(CFG)" == "ARM\Release" || "$(CFG)" == "ARM\Debug" || "$(CFG)" == "ARM64\Release" || "$(CFG)" == "ARM64\Debug"
ICUTOOLS=$(ICUP)\bin64
PATH = $(ICUP)\bin64;$(PATH)
!ELSE
@@ -59,14 +61,29 @@ ICUTOOLS=$(ICUP)\bin
PATH = $(ICUP)\bin;$(PATH)
!ENDIF
+# If building ARM/ARM, then we need to pass the arch as an argument.
+EXTRA_PKGDATA_ARGUMENTS=
+!IF "$(CFG)" == "ARM\Release" || "$(CFG)" == "ARM\Debug"
+EXTRA_PKGDATA_ARGUMENTS=-a ARM
+!ENDIF
+!IF "$(CFG)" == "ARM64\Release" || "$(CFG)" == "ARM64\Debug"
+EXTRA_PKGDATA_ARGUMENTS=-a ARM64
+!ENDIF
+
# Make sure the necessary tools exist before continuing. (This is to prevent cryptic errors from NMAKE).
!IF !EXISTS($(ICUTOOLS)\pkgdata.exe)
!MESSAGE Unable to find "$(ICUTOOLS)\pkgdata.exe"
!ERROR The tool 'pkgdata.exe' does not exist! (Have you built all of ICU yet?).
+!IF "$(CFG)" == "ARM\Release" || "$(CFG)" == "ARM\Debug" || "$(CFG)" == "ARM64\Release" || "$(CFG)" == "ARM64\Debug"
+!ERROR Note that the ARM and ARM64 builds require building x64 first.
+!ENDIF
!ENDIF
!IF !EXISTS($(ICUTOOLS)\genrb.exe)
!MESSAGE Unable to find "$(ICUTOOLS)\genrb.exe"
!ERROR The tool 'genrb.exe' does not exist! (Have you built all of ICU yet?).
+!IF "$(CFG)" == "ARM\Release" || "$(CFG)" == "ARM\Debug" || "$(CFG)" == "ARM64\Release" || "$(CFG)" == "ARM64\Debug"
+!ERROR Note that the ARM and ARM64 builds require building x64 first.
+!ENDIF
!ENDIF
# Suffixes for data files
@@ -98,7 +115,7 @@ ALL : $(OUTPUT)
# invoke pkgdata - static
"$(DLL_OUTPUT)\$(RESNAME).lib" : $(RB_FILES) $(RESFILES)
@echo Building $(RESNAME).lib
- @"$(ICUTOOLS)\pkgdata" -f -v -m static -c -p $(RESNAME) -d "$(DLL_OUTPUT)" -s "$(RESDIR)" <<pkgdatain.txt
+ @"$(ICUTOOLS)\pkgdata" -f -v -m static -c -p $(RESNAME) -d "$(DLL_OUTPUT)" $(EXTRA_PKGDATA_ARGUMENTS) -s "$(RESDIR)" <<pkgdatain.txt
$(RES_FILES:.res =.res
)
<<KEEP
@@ -107,7 +124,7 @@ $(RES_FILES:.res =.res
CLEAN :
-@erase "$(RB_FILES)"
-@erase "$(CFG)\*uconvmsg*.*"
- -@"$(ICUTOOLS)\pkgdata" -f --clean -v -m static -c -p $(RESNAME) -d "$(DLL_OUTPUT)" -s "$(RESDIR)" pkgdatain.txt
+ -@"$(ICUTOOLS)\pkgdata" -f --clean -v -m static -c -p $(RESNAME) -d "$(DLL_OUTPUT)" $(EXTRA_PKGDATA_ARGUMENTS) -s "$(RESDIR)" pkgdatain.txt
# Inference rule for creating resource bundles
{$(RESDIR)}.txt{$(RESDIR)}.res:
diff --git a/Build/source/libs/icu/icu-src/source/extra/uconv/pkgdataMakefile.in b/Build/source/libs/icu/icu-src/source/extra/uconv/pkgdataMakefile.in
index c5916f2a148..f8a684fc280 100644
--- a/Build/source/libs/icu/icu-src/source/extra/uconv/pkgdataMakefile.in
+++ b/Build/source/libs/icu/icu-src/source/extra/uconv/pkgdataMakefile.in
@@ -14,9 +14,9 @@ top_builddir = ../..
## All the flags and other definitions are included here.
include $(top_builddir)/icudefs.mk
-MIDDLE_SO_TARGET=
-
OUTPUTFILE=pkgdata.inc
+MIDDLE_SO_TARGET=
+PKGDATA_TRAILING_SPACE=" "
all : clean
@echo GENCCODE_ASSEMBLY_TYPE=$(GENCCODE_ASSEMBLY) >> $(OUTPUTFILE)
diff --git a/Build/source/libs/icu/icu-src/source/extra/uconv/uconv.cpp b/Build/source/libs/icu/icu-src/source/extra/uconv/uconv.cpp
index 3bc807c819d..c3dca05ad8b 100644
--- a/Build/source/libs/icu/icu-src/source/extra/uconv/uconv.cpp
+++ b/Build/source/libs/icu/icu-src/source/extra/uconv/uconv.cpp
@@ -736,7 +736,7 @@ ConvertFile::convertFile(const char *pname,
willexit = FALSE;
// input file offset at the beginning of the next buffer
- infoffset += rd;
+ infoffset += static_cast<uint32_t>(rd);
rd = fread(buf, 1, bufsz, infile);
if (ferror(infile) != 0) {
@@ -974,7 +974,7 @@ ConvertFile::convertFile(const char *pname,
// input file offset of the current byte buffer +
// byte buffer offset of where the current Unicode buffer is converted from +
// fromoffsets[Unicode offset]
- ferroffset = infoffset + (prevbufp - buf) + fromoffset;
+ ferroffset = static_cast<int32_t>(infoffset + (prevbufp - buf) + fromoffset);
errtag = "problemCvtFromU";
} else {
// Do not use fromoffsets if (t != NULL) because the Unicode text may
diff --git a/Build/source/libs/icu/icu-src/source/extra/uconv/uconv.vcxproj b/Build/source/libs/icu/icu-src/source/extra/uconv/uconv.vcxproj
index ff28d9b159b..1929ac470f9 100644
--- a/Build/source/libs/icu/icu-src/source/extra/uconv/uconv.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/extra/uconv/uconv.vcxproj
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Label="Globals">
<ProjectGuid>{DBA4088D-F6F9-4F8F-8820-082A4765C16C}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -33,138 +33,62 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <MakeCFG>$(Platform)\$(Configuration)</MakeCFG>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <MakeCFG Condition="'$(Platform)'=='Win32'">x86\$(Configuration)</MakeCFG>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
- <!-- Options that are common to *all* project configurations -->
+ <!-- Options that are common to *all* configurations -->
<ItemDefinitionGroup>
- <ClCompile>
- <AdditionalIncludeDirectories>..\..\..\include;..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>UCONVMSG_LINK;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <WarningLevel>Level3</WarningLevel>
- </ClCompile>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>$(ProjectDir)..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
<Midl>
- <TypeLibraryName>.\x86\Release/uconv.tlb</TypeLibraryName>
+ <TypeLibraryName>$(OutDir)\uconv.tlb</TypeLibraryName>
</Midl>
<ClCompile>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>.\x86\Release/uconv.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
<CompileAs>Default</CompileAs>
+ <DisableLanguageExtensions>true</DisableLanguageExtensions>
+ <AdditionalIncludeDirectories>..\..\..\include;..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>UCONVMSG_LINK;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PrecompiledHeaderOutputFile>$(OutDir)\uconv.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)\uconv.pdb</ProgramDataBaseFileName>
</ClCompile>
<Link>
- <AdditionalDependencies>uconvmsg.lib;icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <OutputFile>.\x86\Release/uconv.exe</OutputFile>
- <AdditionalLibraryDirectories>x86\Release;..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x86\Release/uconv.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <OutputFile>$(OutDir)\uconv.exe</OutputFile>
+ <AdditionalDependencies>uconvmsg.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>$(OutDir);..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>$(ProjectDir)..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
+ <Command>copy "$(TargetPath)" ..\..\..\$(IcuBinOutputDir)</Command>
+ <Outputs>..\..\..\$(IcuBinOutputDir)\$(TargetFileName);%(Outputs)</Outputs>
</CustomBuildStep>
- <Midl>
- <TypeLibraryName>.\x86\Debug/uconv.tlb</TypeLibraryName>
- </Midl>
+ </ItemDefinitionGroup>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
+ <BrowseInformation>true</BrowseInformation>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x86\Debug/uconv.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
</ClCompile>
<Link>
- <AdditionalDependencies>uconvmsg.lib;icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <OutputFile>.\x86\Debug/uconv.exe</OutputFile>
- <AdditionalLibraryDirectories>x86\Debug;..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x86\Debug/uconv.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>$(ProjectDir)..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TypeLibraryName>.\x64\Release/uconv.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>.\x64\Release/uconv.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- <CompileAs>Default</CompileAs>
- </ClCompile>
- <Link>
- <AdditionalDependencies>uconvmsg.lib;icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <OutputFile>.\x64\Release/uconv.exe</OutputFile>
- <AdditionalLibraryDirectories>x64\Release;..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x64\Release/uconv.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>$(ProjectDir)..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TypeLibraryName>.\x64\Debug/uconv.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x64\Debug/uconv.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
</ClCompile>
<Link>
- <AdditionalDependencies>uconvmsg.lib;icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <OutputFile>.\x64\Debug/uconv.exe</OutputFile>
- <AdditionalLibraryDirectories>x64\Debug;..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x64\Debug/uconv.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
+ <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
@@ -178,18 +102,8 @@
<None Include="resources\fr.txt" />
<None Include="resources\root.txt" />
<CustomBuild Include="makedata.mak">
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">nmake /nologo /f %(Filename).mak icup="$(ProjectDir)..\..\.." CFG=x86\Debug
-</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\Debug/uconvmsg.lib;%(Outputs)</Outputs>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">nmake /nologo /f %(Filename).mak icup="$(ProjectDir)..\..\.." CFG=x64\Debug
-</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\Debug/uconvmsg.lib;%(Outputs)</Outputs>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">nmake /nologo /f %(Filename).mak icup="$(ProjectDir)..\..\.." CFG=x86\Release
-</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\Release/uconvmsg.lib;%(Outputs)</Outputs>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">nmake /nologo /f %(Filename).mak icup="$(ProjectDir)..\..\.." CFG=x64\Release
-</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\Release/uconvmsg.lib;%(Outputs)</Outputs>
+ <Command>nmake /nologo /f %(Filename).mak icup="$(ProjectDir)..\..\.." CFG=$(MakeCFG)</Command>
+ <Outputs>$(MakeCFG)\uconvmsg.lib;%(Outputs)</Outputs>
</CustomBuild>
<None Include="resfiles.mk" />
</ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/extra/uconv/uwmsg.c b/Build/source/libs/icu/icu-src/source/extra/uconv/uwmsg.c
index d5b0f627863..fdfb1c863f9 100644
--- a/Build/source/libs/icu/icu-src/source/extra/uconv/uwmsg.c
+++ b/Build/source/libs/icu/icu-src/source/extra/uconv/uwmsg.c
@@ -156,6 +156,7 @@ U_CFUNC int u_wmsg(FILE *fp, const char *tag, ... )
uprint(msg,msgLen, fp, &err);
}
#else
+ (void)gNoFormatting; // suppress -Wunused-variable
va_start(ap, tag);
resultLength = u_vformatMessage(uloc_getDefault(), msg, msgLen, result, resultLength, ap, &err);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/Makefile.in b/Build/source/libs/icu/icu-src/source/i18n/Makefile.in
index fb5eb146bec..f22c20eabca 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/Makefile.in
+++ b/Build/source/libs/icu/icu-src/source/i18n/Makefile.in
@@ -101,18 +101,20 @@ uregion.o reldatefmt.o quantityformatter.o measunit.o \
sharedbreakiterator.o scientificnumberformatter.o dayperiodrules.o nounit.o \
number_affixutils.o number_compact.o number_decimalquantity.o \
number_decimfmtprops.o number_fluent.o number_formatimpl.o number_grouping.o \
-number_integerwidth.o number_longnames.o number_modifiers.o number_notation.o \
+number_integerwidth.o number_longnames.o number_modifiers.o number_notation.o number_output.o \
number_padding.o number_patternmodifier.o number_patternstring.o \
-number_rounding.o number_scientific.o number_stringbuilder.o number_utils.o number_asformat.o \
+number_rounding.o number_scientific.o number_utils.o number_asformat.o \
number_mapper.o number_multiplier.o number_currencysymbols.o number_skeletons.o number_capi.o \
-double-conversion.o double-conversion-bignum-dtoa.o double-conversion-bignum.o \
-double-conversion-cached-powers.o double-conversion-diy-fp.o \
+double-conversion-string-to-double.o double-conversion-double-to-string.o \
+double-conversion-bignum-dtoa.o double-conversion-bignum.o \
+double-conversion-cached-powers.o \
double-conversion-fast-dtoa.o double-conversion-strtod.o \
-numparse_stringsegment.o numparse_parsednumber.o numparse_impl.o \
+string_segment.o numparse_parsednumber.o numparse_impl.o \
numparse_symbols.o numparse_decimal.o numparse_scientific.o numparse_currency.o \
numparse_affixes.o numparse_compositions.o numparse_validators.o \
numrange_fluent.o numrange_impl.o \
-erarules.o
+erarules.o \
+formattedvalue.o formattedval_iterimpl.o formattedval_sbimpl.o formatted_string_builder.o
## Header files to install
HEADERS = $(srcdir)/unicode/*.h
diff --git a/Build/source/libs/icu/icu-src/source/i18n/alphaindex.cpp b/Build/source/libs/icu/icu-src/source/i18n/alphaindex.cpp
index 3950d1a13f1..9c312bd8e67 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/alphaindex.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/alphaindex.cpp
@@ -260,8 +260,7 @@ AlphabeticIndex::ImmutableIndex *AlphabeticIndex::buildImmutableIndex(UErrorCode
// but that would be worth it only if this method is called multiple times,
// or called after using the old-style bucket iterator API.
LocalPointer<BucketList> immutableBucketList(createBucketList(errorCode));
- LocalPointer<RuleBasedCollator> coll(
- static_cast<RuleBasedCollator *>(collatorPrimaryOnly_->clone()));
+ LocalPointer<RuleBasedCollator> coll(collatorPrimaryOnly_->clone());
if (immutableBucketList.isNull() || coll.isNull()) {
errorCode = U_MEMORY_ALLOCATION_ERROR;
return NULL;
@@ -907,7 +906,7 @@ void AlphabeticIndex::init(const Locale *locale, UErrorCode &status) {
return;
}
}
- collatorPrimaryOnly_ = static_cast<RuleBasedCollator *>(collator_->clone());
+ collatorPrimaryOnly_ = collator_->clone();
if (collatorPrimaryOnly_ == NULL) {
status = U_MEMORY_ALLOCATION_ERROR;
return;
@@ -958,7 +957,7 @@ collatorComparator(const void *context, const void *left, const void *right) {
}
if (leftString == NULL) {
return 1;
- };
+ }
if (rightString == NULL) {
return -1;
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/anytrans.cpp b/Build/source/libs/icu/icu-src/source/i18n/anytrans.cpp
index 6e382b824b9..167b0185285 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/anytrans.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/anytrans.cpp
@@ -226,7 +226,7 @@ AnyTransliterator::AnyTransliterator(const AnyTransliterator& o) :
/**
* Transliterator API.
*/
-Transliterator* AnyTransliterator::clone() const {
+AnyTransliterator* AnyTransliterator::clone() const {
return new AnyTransliterator(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/anytrans.h b/Build/source/libs/icu/icu-src/source/i18n/anytrans.h
index 703d42b6d4b..627dee3c814 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/anytrans.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/anytrans.h
@@ -66,7 +66,7 @@ public:
/**
* Transliterator API.
*/
- virtual Transliterator* clone() const;
+ virtual AnyTransliterator* clone() const;
/**
* Implements {@link Transliterator#handleTransliterate}.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/astro.cpp b/Build/source/libs/icu/icu-src/source/i18n/astro.cpp
index 8f9cf7a4d93..f17b6db9128 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/astro.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/astro.cpp
@@ -65,7 +65,7 @@ static inline UBool isINVALID(double d) {
return(uprv_isNaN(d));
}
-static UMutex ccLock = U_MUTEX_INITIALIZER;
+static icu::UMutex ccLock;
U_CDECL_BEGIN
static UBool calendar_astro_cleanup(void) {
diff --git a/Build/source/libs/icu/icu-src/source/i18n/bocsu.h b/Build/source/libs/icu/icu-src/source/i18n/bocsu.h
index 6b8ed519709..631e29aa768 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/bocsu.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/bocsu.h
@@ -144,14 +144,14 @@ U_NAMESPACE_END
* yields negative modulo results and quotients that are one more than
* what we need here.
*/
-#define NEGDIVMOD(n, d, m) { \
+#define NEGDIVMOD(n, d, m) UPRV_BLOCK_MACRO_BEGIN { \
(m)=(n)%(d); \
(n)/=(d); \
if((m)<0) { \
--(n); \
(m)+=(d); \
} \
-}
+} UPRV_BLOCK_MACRO_END
U_CFUNC UChar32
u_writeIdenticalLevelRun(UChar32 prev, const UChar *s, int32_t length, icu::ByteSink &sink);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/brktrans.cpp b/Build/source/libs/icu/icu-src/source/i18n/brktrans.cpp
index ab5a8038420..46b0e345dae 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/brktrans.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/brktrans.cpp
@@ -10,6 +10,8 @@
**********************************************************************
*/
+#include <utility>
+
#include "unicode/utypes.h"
#if !UCONFIG_NO_TRANSLITERATION && !UCONFIG_NO_BREAK_ITERATION
@@ -62,7 +64,7 @@ BreakTransliterator::BreakTransliterator(const BreakTransliterator& o) :
/**
* Transliterator API.
*/
-Transliterator* BreakTransliterator::clone(void) const {
+BreakTransliterator* BreakTransliterator::clone() const {
return new BreakTransliterator(*this);
}
@@ -79,8 +81,8 @@ void BreakTransliterator::handleTransliterate(Replaceable& text, UTransPosition&
{
Mutex m;
BreakTransliterator *nonConstThis = const_cast<BreakTransliterator *>(this);
- boundaries.moveFrom(nonConstThis->cachedBoundaries);
- bi.moveFrom(nonConstThis->cachedBI);
+ boundaries = std::move(nonConstThis->cachedBoundaries);
+ bi = std::move(nonConstThis->cachedBI);
}
if (bi.isNull()) {
bi.adoptInstead(BreakIterator::createWordInstance(Locale::getEnglish(), status));
@@ -145,10 +147,10 @@ void BreakTransliterator::handleTransliterate(Replaceable& text, UTransPosition&
Mutex m;
BreakTransliterator *nonConstThis = const_cast<BreakTransliterator *>(this);
if (nonConstThis->cachedBI.isNull()) {
- nonConstThis->cachedBI.moveFrom(bi);
+ nonConstThis->cachedBI = std::move(bi);
}
if (nonConstThis->cachedBoundaries.isNull()) {
- nonConstThis->cachedBoundaries.moveFrom(boundaries);
+ nonConstThis->cachedBoundaries = std::move(boundaries);
}
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/brktrans.h b/Build/source/libs/icu/icu-src/source/i18n/brktrans.h
index 30cf4eaed04..cb3def9e926 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/brktrans.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/brktrans.h
@@ -54,7 +54,7 @@ public:
* Transliterator API.
* @return A copy of the object.
*/
- virtual Transliterator* clone(void) const;
+ virtual BreakTransliterator* clone() const;
virtual const UnicodeString &getInsertion() const;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/buddhcal.cpp b/Build/source/libs/icu/icu-src/source/i18n/buddhcal.cpp
index 6fac7a80c75..6083349ecd6 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/buddhcal.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/buddhcal.cpp
@@ -53,7 +53,7 @@ BuddhistCalendar& BuddhistCalendar::operator= ( const BuddhistCalendar& right)
return *this;
}
-Calendar* BuddhistCalendar::clone(void) const
+BuddhistCalendar* BuddhistCalendar::clone() const
{
return new BuddhistCalendar(*this);
}
@@ -133,7 +133,7 @@ void BuddhistCalendar::timeToFields(UDate theTime, UBool quick, UErrorCode& stat
*/
static UDate gSystemDefaultCenturyStart = DBL_MIN;
static int32_t gSystemDefaultCenturyStartYear = -1;
-static icu::UInitOnce gBCInitOnce;
+static icu::UInitOnce gBCInitOnce = U_INITONCE_INITIALIZER;
UBool BuddhistCalendar::haveDefaultCentury() const
diff --git a/Build/source/libs/icu/icu-src/source/i18n/buddhcal.h b/Build/source/libs/icu/icu-src/source/i18n/buddhcal.h
index 88509ba9037..0ad0886df12 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/buddhcal.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/buddhcal.h
@@ -94,7 +94,7 @@ public:
* @return return a polymorphic copy of this calendar.
* @internal
*/
- virtual Calendar* clone(void) const;
+ virtual BuddhistCalendar* clone() const;
public:
/**
diff --git a/Build/source/libs/icu/icu-src/source/i18n/calendar.cpp b/Build/source/libs/icu/icu-src/source/i18n/calendar.cpp
index 7a2a6ee383e..c043bb31861 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/calendar.cpp
+++ b/Build/source/libs/icu/icu-src/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;
@@ -327,68 +329,73 @@ static ECalType getCalendarTypeForLocale(const char *locid) {
}
static Calendar *createStandardCalendar(ECalType calType, const Locale &loc, UErrorCode& status) {
- Calendar *cal = NULL;
+ if (U_FAILURE(status)) {
+ return nullptr;
+ }
+ LocalPointer<Calendar> cal;
switch (calType) {
case CALTYPE_GREGORIAN:
- cal = new GregorianCalendar(loc, status);
+ cal.adoptInsteadAndCheckErrorCode(new GregorianCalendar(loc, status), status);
break;
case CALTYPE_JAPANESE:
- cal = new JapaneseCalendar(loc, status);
+ cal.adoptInsteadAndCheckErrorCode(new JapaneseCalendar(loc, status), status);
break;
case CALTYPE_BUDDHIST:
- cal = new BuddhistCalendar(loc, status);
+ cal.adoptInsteadAndCheckErrorCode(new BuddhistCalendar(loc, status), status);
break;
case CALTYPE_ROC:
- cal = new TaiwanCalendar(loc, status);
+ cal.adoptInsteadAndCheckErrorCode(new TaiwanCalendar(loc, status), status);
break;
case CALTYPE_PERSIAN:
- cal = new PersianCalendar(loc, status);
+ cal.adoptInsteadAndCheckErrorCode(new PersianCalendar(loc, status), status);
break;
case CALTYPE_ISLAMIC_TBLA:
- cal = new IslamicCalendar(loc, status, IslamicCalendar::TBLA);
+ cal.adoptInsteadAndCheckErrorCode(new IslamicCalendar(loc, status, IslamicCalendar::TBLA), status);
break;
case CALTYPE_ISLAMIC_CIVIL:
- cal = new IslamicCalendar(loc, status, IslamicCalendar::CIVIL);
+ cal.adoptInsteadAndCheckErrorCode(new IslamicCalendar(loc, status, IslamicCalendar::CIVIL), status);
break;
case CALTYPE_ISLAMIC_RGSA:
// default any region specific not handled individually to islamic
case CALTYPE_ISLAMIC:
- cal = new IslamicCalendar(loc, status, IslamicCalendar::ASTRONOMICAL);
+ cal.adoptInsteadAndCheckErrorCode(new IslamicCalendar(loc, status, IslamicCalendar::ASTRONOMICAL), status);
break;
case CALTYPE_ISLAMIC_UMALQURA:
- cal = new IslamicCalendar(loc, status, IslamicCalendar::UMALQURA);
+ cal.adoptInsteadAndCheckErrorCode(new IslamicCalendar(loc, status, IslamicCalendar::UMALQURA), status);
break;
case CALTYPE_HEBREW:
- cal = new HebrewCalendar(loc, status);
+ cal.adoptInsteadAndCheckErrorCode(new HebrewCalendar(loc, status), status);
break;
case CALTYPE_CHINESE:
- cal = new ChineseCalendar(loc, status);
+ cal.adoptInsteadAndCheckErrorCode(new ChineseCalendar(loc, status), status);
break;
case CALTYPE_INDIAN:
- cal = new IndianCalendar(loc, status);
+ cal.adoptInsteadAndCheckErrorCode(new IndianCalendar(loc, status), status);
break;
case CALTYPE_COPTIC:
- cal = new CopticCalendar(loc, status);
+ cal.adoptInsteadAndCheckErrorCode(new CopticCalendar(loc, status), status);
break;
case CALTYPE_ETHIOPIC:
- cal = new EthiopicCalendar(loc, status, EthiopicCalendar::AMETE_MIHRET_ERA);
+ cal.adoptInsteadAndCheckErrorCode(new EthiopicCalendar(loc, status, EthiopicCalendar::AMETE_MIHRET_ERA), status);
break;
case CALTYPE_ETHIOPIC_AMETE_ALEM:
- cal = new EthiopicCalendar(loc, status, EthiopicCalendar::AMETE_ALEM_ERA);
+ cal.adoptInsteadAndCheckErrorCode(new EthiopicCalendar(loc, status, EthiopicCalendar::AMETE_ALEM_ERA), status);
break;
case CALTYPE_ISO8601:
- cal = new GregorianCalendar(loc, status);
- cal->setFirstDayOfWeek(UCAL_MONDAY);
- cal->setMinimalDaysInFirstWeek(4);
+ cal.adoptInsteadAndCheckErrorCode(new GregorianCalendar(loc, status), status);
+ if (cal.isValid()) {
+ cal->setFirstDayOfWeek(UCAL_MONDAY);
+ cal->setMinimalDaysInFirstWeek(4);
+ }
break;
case CALTYPE_DANGI:
- cal = new DangiCalendar(loc, status);
+ cal.adoptInsteadAndCheckErrorCode(new DangiCalendar(loc, status), status);
break;
default:
status = U_UNSUPPORTED_ERROR;
}
- return cal;
+ return cal.orphan();
}
@@ -536,6 +543,10 @@ public:
fprintf(stderr, "CalSvc:handleDefault for currentLoc %s, canloc %s\n", (const char*)loc.getName(), (const char*)loc2.getName());
#endif
Calendar *nc = new GregorianCalendar(loc, status);
+ if (nc == nullptr) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return nc;
+ }
#ifdef U_DEBUG_CALSVC
UErrorCode status2 = U_ZERO_ERROR;
@@ -739,6 +750,7 @@ fSkippedWallTime(UCAL_WALLTIME_LAST)
validLocale[0] = 0;
actualLocale[0] = 0;
if (U_FAILURE(success)) {
+ delete zone;
return;
}
if(zone == 0) {
@@ -1093,7 +1105,11 @@ Calendar::getKeywordValuesForLocale(const char* key,
uenum_close(uenum);
return NULL;
}
- return new UStringEnumeration(uenum);
+ UStringEnumeration* ustringenum = new UStringEnumeration(uenum);
+ if (ustringenum == nullptr) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ }
+ return ustringenum;
}
// -------------------------------------
@@ -2579,7 +2595,7 @@ Calendar::isWeekend(UDate date, UErrorCode &status) const
return FALSE;
}
// clone the calendar so we don't mess with the real one.
- Calendar *work = (Calendar*)this->clone();
+ Calendar *work = this->clone();
if (work == NULL) {
status = U_MEMORY_ALLOCATION_ERROR;
return FALSE;
@@ -2739,7 +2755,7 @@ Calendar::getActualMinimum(UCalendarDateFields field, UErrorCode& status) const
// clone the calendar so we don't mess with the real one, and set it to
// accept anything for the field values
- Calendar *work = (Calendar*)this->clone();
+ Calendar *work = this->clone();
if (work == NULL) {
status = U_MEMORY_ALLOCATION_ERROR;
return 0;
@@ -3783,18 +3799,16 @@ Calendar::setWeekData(const Locale& desiredLocale, const char *type, UErrorCode&
// 2). If the locale has a script designation then we ignore it,
// then remove it ( i.e. "en_Latn_US" becomes "en_US" )
- char minLocaleID[ULOC_FULLNAME_CAPACITY] = { 0 };
UErrorCode myStatus = U_ZERO_ERROR;
- uloc_minimizeSubtags(desiredLocale.getName(),minLocaleID,ULOC_FULLNAME_CAPACITY,&myStatus);
- Locale min = Locale::createFromName(minLocaleID);
+ Locale min(desiredLocale);
+ min.minimizeSubtags(myStatus);
Locale useLocale;
if ( uprv_strlen(desiredLocale.getCountry()) == 0 ||
(uprv_strlen(desiredLocale.getScript()) > 0 && uprv_strlen(min.getScript()) == 0) ) {
- char maxLocaleID[ULOC_FULLNAME_CAPACITY] = { 0 };
myStatus = U_ZERO_ERROR;
- uloc_addLikelySubtags(desiredLocale.getName(),maxLocaleID,ULOC_FULLNAME_CAPACITY,&myStatus);
- Locale max = Locale::createFromName(maxLocaleID);
+ Locale max(desiredLocale);
+ max.addLikelySubtags(myStatus);
useLocale = Locale(max.getLanguage(),max.getCountry());
} else {
useLocale = desiredLocale;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/casetrn.cpp b/Build/source/libs/icu/icu-src/source/i18n/casetrn.cpp
index ac28365c04d..bb650f8fa29 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/casetrn.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/casetrn.cpp
@@ -125,7 +125,7 @@ CaseMapTransliterator::CaseMapTransliterator(const CaseMapTransliterator& o) :
/**
* Transliterator API.
*/
-/*Transliterator* CaseMapTransliterator::clone(void) const {
+/*CaseMapTransliterator* CaseMapTransliterator::clone() const {
return new CaseMapTransliterator(*this);
}*/
diff --git a/Build/source/libs/icu/icu-src/source/i18n/casetrn.h b/Build/source/libs/icu/icu-src/source/i18n/casetrn.h
index 744406e95f9..2ec3e736deb 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/casetrn.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/casetrn.h
@@ -58,7 +58,7 @@ public:
* Transliterator API.
* @return a copy of the object.
*/
- virtual Transliterator* clone(void) const = 0;
+ virtual CaseMapTransliterator* clone() const = 0;
/**
* ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/chnsecal.cpp b/Build/source/libs/icu/icu-src/source/i18n/chnsecal.cpp
index 82d1c3f3469..4c038127159 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/chnsecal.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/chnsecal.cpp
@@ -51,7 +51,7 @@ static void debug_chnsecal_msg(const char *pat, ...)
// --- The cache --
-static UMutex astroLock = U_MUTEX_INITIALIZER; // Protects access to gChineseCalendarAstro.
+static icu::UMutex astroLock;
static icu::CalendarAstronomer *gChineseCalendarAstro = NULL;
// Lazy Creation & Access synchronized by class CalendarCache with a mutex.
@@ -118,7 +118,7 @@ U_NAMESPACE_BEGIN
//-------------------------------------------------------------------------
-Calendar* ChineseCalendar::clone() const {
+ChineseCalendar* ChineseCalendar::clone() const {
return new ChineseCalendar(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/chnsecal.h b/Build/source/libs/icu/icu-src/source/i18n/chnsecal.h
index 11a9b43b539..a0c21b6b5c2 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/chnsecal.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/chnsecal.h
@@ -144,7 +144,7 @@ class U_I18N_API ChineseCalendar : public Calendar {
virtual ~ChineseCalendar();
// clone
- virtual Calendar* clone() const;
+ virtual ChineseCalendar* clone() const;
private:
diff --git a/Build/source/libs/icu/icu-src/source/i18n/choicfmt.cpp b/Build/source/libs/icu/icu-src/source/i18n/choicfmt.cpp
index 42e1fa28103..7e26bb7a1f6 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/choicfmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/choicfmt.cpp
@@ -563,7 +563,7 @@ ChoiceFormat::matchStringUntilLimitPart(
// -------------------------------------
-Format*
+ChoiceFormat*
ChoiceFormat::clone() const
{
ChoiceFormat *aCopy = new ChoiceFormat(*this);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/coll.cpp b/Build/source/libs/icu/icu-src/source/i18n/coll.cpp
index d9c6b4607f3..7b87b41dff2 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/coll.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/coll.cpp
@@ -67,7 +67,7 @@ static int32_t availableLocaleListCount;
static icu::ICULocaleService* gService = NULL;
static icu::UInitOnce gServiceInitOnce = U_INITONCE_INITIALIZER;
#endif
-static icu::UInitOnce gAvailableLocaleListInitOnce;
+static icu::UInitOnce gAvailableLocaleListInitOnce = U_INITONCE_INITIALIZER;
/**
* Release all static memory held by collator.
@@ -226,27 +226,25 @@ initAvailableLocaleList(UErrorCode &status) {
U_ASSERT(availableLocaleList == NULL);
// for now, there is a hardcoded list, so just walk through that list and set it up.
UResourceBundle *index = NULL;
- UResourceBundle installed;
+ StackUResourceBundle installed;
int32_t i = 0;
- ures_initStackObject(&installed);
index = ures_openDirect(U_ICUDATA_COLL, "res_index", &status);
- ures_getByKey(index, "InstalledLocales", &installed, &status);
-
+ ures_getByKey(index, "InstalledLocales", installed.getAlias(), &status);
+
if(U_SUCCESS(status)) {
- availableLocaleListCount = ures_getSize(&installed);
+ availableLocaleListCount = ures_getSize(installed.getAlias());
availableLocaleList = new Locale[availableLocaleListCount];
if (availableLocaleList != NULL) {
- ures_resetIterator(&installed);
- while(ures_hasNext(&installed)) {
+ ures_resetIterator(installed.getAlias());
+ while(ures_hasNext(installed.getAlias())) {
const char *tempKey = NULL;
- ures_getNextString(&installed, NULL, &tempKey, &status);
+ ures_getNextString(installed.getAlias(), NULL, &tempKey, &status);
availableLocaleList[i++] = Locale(tempKey);
}
}
U_ASSERT(availableLocaleListCount == i);
- ures_close(&installed);
}
ures_close(index);
ucln_i18n_registerCleanup(UCLN_I18N_COLLATOR, collator_cleanup);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/collationbuilder.cpp b/Build/source/libs/icu/icu-src/source/i18n/collationbuilder.cpp
index 954a20d2d97..45ac6ddcd58 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/collationbuilder.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/collationbuilder.cpp
@@ -577,8 +577,7 @@ CollationBuilder::getSpecialResetPosition(const UnicodeString &str,
parserErrorReason = "LDML forbids tailoring to U+FFFF";
return 0;
default:
- U_ASSERT(FALSE);
- return 0;
+ UPRV_UNREACHABLE;
}
int32_t index = findOrInsertNodeForRootCE(ce, strength, errorCode);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/collationdatabuilder.cpp b/Build/source/libs/icu/icu-src/source/i18n/collationdatabuilder.cpp
index 98a6ce7e9c6..53361b86c7c 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/collationdatabuilder.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/collationdatabuilder.cpp
@@ -852,8 +852,7 @@ CollationDataBuilder::copyFromBaseCE32(UChar32 c, uint32_t ce32, UBool withConte
ce32 = encodeOneCE(Collation::unassignedCEFromCodePoint(c), errorCode);
break;
default:
- U_ASSERT(FALSE); // require ce32 == base->getFinalCE32(ce32)
- break;
+ UPRV_UNREACHABLE; // require ce32 == base->getFinalCE32(ce32)
}
return ce32;
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/collationfcd.cpp b/Build/source/libs/icu/icu-src/source/i18n/collationfcd.cpp
index 1aff936dee1..2527f2f055a 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/collationfcd.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/collationfcd.cpp
@@ -25,7 +25,7 @@ const uint8_t CollationFCD::lcccIndex[2048]={
0x11,0x12,0x13,0,0,0,0x14,0x15,0,0x16,0x17,0,0,0x16,0x18,0x19,
0,0x16,0x18,0,0,0x16,0x18,0,0,0x16,0x18,0,0,0,0x18,0,
0,0,0x1a,0,0,0x16,0x18,0,0,0x1b,0x18,0,0,0,0x1c,0,
-0,0x1d,0x1e,0,0,0x1f,0x1e,0,0x1f,0x20,0,0x21,0x22,0,0x23,0,
+0,0x1d,0x1e,0,0,0x1d,0x1e,0,0x1f,0x20,0,0x21,0x22,0,0x23,0,
0,0x24,0,0,0x18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0x25,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -164,7 +164,7 @@ const uint8_t CollationFCD::tcccIndex[2048]={
0x26,0x27,0x28,0,0,0,0x29,0x2a,0,0x2b,0x2c,0,0,0x2d,0x2e,0x2f,
0,0x30,0x31,0,0,0x2d,0x32,0,0,0x2d,0x33,0,0,0,0x32,0,
0,0,0x34,0,0,0x2d,0x32,0,0,0x35,0x32,0,0,0,0x36,0,
-0,0x37,0x38,0,0,0x39,0x38,0,0x39,0x3a,0,0x3b,0x3c,0,0x3d,0,
+0,0x37,0x38,0,0,0x37,0x38,0,0x39,0x3a,0,0x3b,0x3c,0,0x3d,0,
0,0x3e,0,0,0x32,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0x3f,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
diff --git a/Build/source/libs/icu/icu-src/source/i18n/collationiterator.cpp b/Build/source/libs/icu/icu-src/source/i18n/collationiterator.cpp
index 961c9e9acef..18ccf014f0a 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/collationiterator.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/collationiterator.cpp
@@ -872,7 +872,7 @@ CollationIterator::previousCE(UVector32 &offsets, UErrorCode &errorCode) {
// consistent with forward iteration.
while(offsets.size() <= ceBuffer.length) {
offsets.addElement(limitOffset, errorCode);
- };
+ }
}
return ceBuffer.get(--ceBuffer.length);
} else {
@@ -932,7 +932,7 @@ CollationIterator::previousCEUnsafe(UChar32 c, UVector32 &offsets, UErrorCode &e
offset = getOffset();
while(offsets.size() < ceBuffer.length) {
offsets.addElement(offset, errorCode);
- };
+ }
}
U_ASSERT(offsets.size() == ceBuffer.length);
// End offset corresponding to just after the unsafe-backwards segment.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/collationruleparser.cpp b/Build/source/libs/icu/icu-src/source/i18n/collationruleparser.cpp
index 96dcc0d940b..ade6ecb552a 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/collationruleparser.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/collationruleparser.cpp
@@ -622,8 +622,11 @@ CollationRuleParser::parseSetting(UErrorCode &errorCode) {
setParseError("expected language tag in [import langTag]", errorCode);
return;
}
- if(length == 3 && uprv_memcmp(baseID, "und", 3) == 0) {
+ if(length == 0) {
uprv_strcpy(baseID, "root");
+ } else if(*baseID == '_') {
+ uprv_memmove(baseID + 3, baseID, length + 1);
+ uprv_memcpy(baseID, "und", 3);
}
// @collation=type, or length=0 if not specified
char collationType[ULOC_KEYWORDS_CAPACITY];
diff --git a/Build/source/libs/icu/icu-src/source/i18n/compactdecimalformat.cpp b/Build/source/libs/icu/icu-src/source/i18n/compactdecimalformat.cpp
index 4dd2241b23d..a4c9dad25c4 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/compactdecimalformat.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/compactdecimalformat.cpp
@@ -30,9 +30,9 @@ CompactDecimalFormat::CompactDecimalFormat(const Locale& inLocale, UNumberCompac
: DecimalFormat(new DecimalFormatSymbols(inLocale, status), status) {
if (U_FAILURE(status)) return;
// Minimal properties: let the non-shim code path do most of the logic for us.
- fields->properties->compactStyle = style;
- fields->properties->groupingSize = -2; // do not forward grouping information
- fields->properties->minimumGroupingDigits = 2;
+ fields->properties.compactStyle = style;
+ fields->properties.groupingSize = -2; // do not forward grouping information
+ fields->properties.minimumGroupingDigits = 2;
touch(status);
}
@@ -45,7 +45,7 @@ CompactDecimalFormat& CompactDecimalFormat::operator=(const CompactDecimalFormat
return *this;
}
-Format* CompactDecimalFormat::clone() const {
+CompactDecimalFormat* CompactDecimalFormat::clone() const {
return new CompactDecimalFormat(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/coptccal.cpp b/Build/source/libs/icu/icu-src/source/i18n/coptccal.cpp
index ba2040dc0c7..9c2b1ebbb7f 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/coptccal.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/coptccal.cpp
@@ -40,7 +40,7 @@ CopticCalendar::~CopticCalendar()
{
}
-Calendar*
+CopticCalendar*
CopticCalendar::clone() const
{
return new CopticCalendar(*this);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/coptccal.h b/Build/source/libs/icu/icu-src/source/i18n/coptccal.h
index 5c38aa6ada7..e9e812dbc7f 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/coptccal.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/coptccal.h
@@ -145,7 +145,7 @@ public:
* @return return a polymorphic copy of this calendar.
* @internal
*/
- virtual Calendar* clone(void) const;
+ virtual CopticCalendar* clone() const;
/**
* return the calendar type, "coptic"
diff --git a/Build/source/libs/icu/icu-src/source/i18n/cpdtrans.cpp b/Build/source/libs/icu/icu-src/source/i18n/cpdtrans.cpp
index db2ddb70348..82ee54a77b5 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/cpdtrans.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/cpdtrans.cpp
@@ -323,7 +323,7 @@ CompoundTransliterator& CompoundTransliterator::operator=(
/**
* Transliterator API.
*/
-Transliterator* CompoundTransliterator::clone(void) const {
+CompoundTransliterator* CompoundTransliterator::clone() const {
return new CompoundTransliterator(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/cpdtrans.h b/Build/source/libs/icu/icu-src/source/i18n/cpdtrans.h
index 076296a5ef6..a2c7abbd691 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/cpdtrans.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/cpdtrans.h
@@ -98,7 +98,7 @@ public:
/**
* Transliterator API.
*/
- virtual Transliterator* clone(void) const;
+ virtual CompoundTransliterator* clone() const;
/**
* Returns the number of transliterators in this chain.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/csdetect.cpp b/Build/source/libs/icu/icu-src/source/i18n/csdetect.cpp
index 36552c4b762..babb3084302 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/csdetect.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/csdetect.cpp
@@ -36,9 +36,9 @@ U_NAMESPACE_BEGIN
struct CSRecognizerInfo : public UMemory {
CSRecognizerInfo(CharsetRecognizer *recognizer, UBool isDefaultEnabled)
- : recognizer(recognizer), isDefaultEnabled(isDefaultEnabled) {};
+ : recognizer(recognizer), isDefaultEnabled(isDefaultEnabled) {}
- ~CSRecognizerInfo() {delete recognizer;};
+ ~CSRecognizerInfo() {delete recognizer;}
CharsetRecognizer *recognizer;
UBool isDefaultEnabled;
@@ -47,7 +47,7 @@ struct CSRecognizerInfo : public UMemory {
U_NAMESPACE_END
static icu::CSRecognizerInfo **fCSRecognizers = NULL;
-static icu::UInitOnce gCSRecognizersInitOnce;
+static icu::UInitOnce gCSRecognizersInitOnce = U_INITONCE_INITIALIZER;
static int32_t fCSRecognizers_size = 0;
U_CDECL_BEGIN
diff --git a/Build/source/libs/icu/icu-src/source/i18n/curramt.cpp b/Build/source/libs/icu/icu-src/source/i18n/curramt.cpp
index d2242707a1e..6fd2ea2fda5 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/curramt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/curramt.cpp
@@ -38,7 +38,7 @@ CurrencyAmount& CurrencyAmount::operator=(const CurrencyAmount& other) {
return *this;
}
-UObject* CurrencyAmount::clone() const {
+CurrencyAmount* CurrencyAmount::clone() const {
return new CurrencyAmount(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/currfmt.cpp b/Build/source/libs/icu/icu-src/source/i18n/currfmt.cpp
index 06bdad042aa..0ad0492ee7a 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/currfmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/currfmt.cpp
@@ -21,22 +21,19 @@
U_NAMESPACE_BEGIN
CurrencyFormat::CurrencyFormat(const Locale& locale, UErrorCode& ec) :
- MeasureFormat(locale, UMEASFMT_WIDTH_WIDE, ec), fmt(NULL)
+ MeasureFormat(locale, UMEASFMT_WIDTH_WIDE, ec)
{
- fmt = NumberFormat::createCurrencyInstance(locale, ec);
}
CurrencyFormat::CurrencyFormat(const CurrencyFormat& other) :
- MeasureFormat(other), fmt(NULL)
+ MeasureFormat(other)
{
- fmt = (NumberFormat*) other.fmt->clone();
}
CurrencyFormat::~CurrencyFormat() {
- delete fmt;
}
-Format* CurrencyFormat::clone() const {
+CurrencyFormat* CurrencyFormat::clone() const {
return new CurrencyFormat(*this);
}
@@ -45,14 +42,14 @@ UnicodeString& CurrencyFormat::format(const Formattable& obj,
FieldPosition& pos,
UErrorCode& ec) const
{
- return fmt->format(obj, appendTo, pos, ec);
+ return getCurrencyFormatInternal().format(obj, appendTo, pos, ec);
}
void CurrencyFormat::parseObject(const UnicodeString& source,
Formattable& result,
ParsePosition& pos) const
{
- CurrencyAmount* currAmt = fmt->parseCurrency(source, pos);
+ CurrencyAmount* currAmt = getCurrencyFormatInternal().parseCurrency(source, pos);
if (currAmt != NULL) {
result.adoptObject(currAmt);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/currfmt.h b/Build/source/libs/icu/icu-src/source/i18n/currfmt.h
index 97d44cbb1d1..69a031957bc 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/currfmt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/currfmt.h
@@ -57,7 +57,7 @@ class CurrencyFormat : public MeasureFormat {
/**
* Override Format API.
*/
- virtual Format* clone() const;
+ virtual CurrencyFormat* clone() const;
using MeasureFormat::format;
@@ -86,10 +86,6 @@ class CurrencyFormat : public MeasureFormat {
* Returns the class ID for this class.
*/
static UClassID U_EXPORT2 getStaticClassID();
-
- private:
-
- NumberFormat* fmt;
};
U_NAMESPACE_END
diff --git a/Build/source/libs/icu/icu-src/source/i18n/currunit.cpp b/Build/source/libs/icu/icu-src/source/i18n/currunit.cpp
index 7f3490d406b..dab6dda5368 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/currunit.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/currunit.cpp
@@ -18,8 +18,10 @@
#include "unicode/ustring.h"
#include "cstring.h"
#include "uinvchar.h"
+#include "charstr.h"
static constexpr char16_t kDefaultCurrency[] = u"XXX";
+static constexpr char kDefaultCurrency8[] = "XXX";
U_NAMESPACE_BEGIN
@@ -50,6 +52,30 @@ CurrencyUnit::CurrencyUnit(ConstChar16Ptr _isoCode, UErrorCode& ec) {
initCurrency(simpleIsoCode);
}
+CurrencyUnit::CurrencyUnit(StringPiece _isoCode, UErrorCode& ec) {
+ // Note: unlike the old constructor, reject empty arguments with an error.
+ char isoCodeBuffer[4];
+ const char* isoCodeToUse;
+ // uprv_memchr checks that the string contains no internal NULs
+ if (_isoCode.length() != 3 || uprv_memchr(_isoCode.data(), 0, 3) != nullptr) {
+ isoCodeToUse = kDefaultCurrency8;
+ ec = U_ILLEGAL_ARGUMENT_ERROR;
+ } else if (!uprv_isInvariantString(_isoCode.data(), 3)) {
+ // TODO: Perform a more strict ASCII check like in ICU4J isAlpha3Code?
+ isoCodeToUse = kDefaultCurrency8;
+ ec = U_INVARIANT_CONVERSION_ERROR;
+ } else {
+ // Have to use isoCodeBuffer to ensure the string is NUL-terminated
+ uprv_strncpy(isoCodeBuffer, _isoCode.data(), 3);
+ isoCodeBuffer[3] = 0;
+ isoCodeToUse = isoCodeBuffer;
+ }
+ // TODO: Perform uppercasing here like in ICU4J Currency.getInstance()?
+ u_charsToUChars(isoCodeToUse, isoCode, 3);
+ isoCode[3] = 0;
+ initCurrency(isoCodeToUse);
+}
+
CurrencyUnit::CurrencyUnit(const CurrencyUnit& other) : MeasureUnit(other) {
u_strcpy(isoCode, other.isoCode);
}
@@ -83,7 +109,7 @@ CurrencyUnit& CurrencyUnit::operator=(const CurrencyUnit& other) {
return *this;
}
-UObject* CurrencyUnit::clone() const {
+CurrencyUnit* CurrencyUnit::clone() const {
return new CurrencyUnit(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/dangical.cpp b/Build/source/libs/icu/icu-src/source/i18n/dangical.cpp
index 73bc4213f14..02db40368ec 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/dangical.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/dangical.cpp
@@ -65,7 +65,7 @@ DangiCalendar::~DangiCalendar()
{
}
-Calendar*
+DangiCalendar*
DangiCalendar::clone() const
{
return new DangiCalendar(*this);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/dangical.h b/Build/source/libs/icu/icu-src/source/i18n/dangical.h
index 04bd67bb5d2..ece805e36d3 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/dangical.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/dangical.h
@@ -66,7 +66,7 @@ class DangiCalendar : public ChineseCalendar {
* Clone.
* @internal
*/
- virtual Calendar* clone() const;
+ virtual DangiCalendar* clone() const;
//----------------------------------------------------------------------
// Internal methods & astronomical calculations
diff --git a/Build/source/libs/icu/icu-src/source/i18n/datefmt.cpp b/Build/source/libs/icu/icu-src/source/i18n/datefmt.cpp
index e8641f43200..a0e039cd507 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/datefmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/datefmt.cpp
@@ -154,7 +154,7 @@ DateFormat& DateFormat::operator=(const DateFormat& other)
fCalendar = NULL;
}
if(other.fNumberFormat) {
- fNumberFormat = (NumberFormat*)other.fNumberFormat->clone();
+ fNumberFormat = other.fNumberFormat->clone();
} else {
fNumberFormat = NULL;
}
@@ -460,7 +460,12 @@ DateFormat::createInstanceForSkeleton(
status = U_ILLEGAL_ARGUMENT_ERROR;
return NULL;
}
- DateFormat *result = createInstanceForSkeleton(skeleton, locale, status);
+ Locale localeWithCalendar = locale;
+ localeWithCalendar.setKeywordValue("calendar", calendar->getType(), status);
+ if (U_FAILURE(status)) {
+ return NULL;
+ }
+ DateFormat *result = createInstanceForSkeleton(skeleton, localeWithCalendar, status);
if (U_FAILURE(status)) {
return NULL;
}
@@ -593,7 +598,7 @@ DateFormat::adoptNumberFormat(NumberFormat* newNumberFormat)
void
DateFormat::setNumberFormat(const NumberFormat& newNumberFormat)
{
- NumberFormat* newNumFmtClone = (NumberFormat*)newNumberFormat.clone();
+ NumberFormat* newNumFmtClone = newNumberFormat.clone();
if (newNumFmtClone != NULL) {
adoptNumberFormat(newNumFmtClone);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/decNumberLocal.h b/Build/source/libs/icu/icu-src/source/i18n/decNumberLocal.h
index a45b7d8cc63..e8d1b38653e 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/decNumberLocal.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/decNumberLocal.h
@@ -166,7 +166,9 @@
/* Set DECDPUNMAX -- the maximum integer that fits in DECDPUN */
/* digits, and D2UTABLE -- the initializer for the D2U table */
- #if DECDPUN==1
+ #ifndef DECDPUN
+ // no-op
+ #elif DECDPUN==1
#define DECDPUNMAX 9
#define D2UTABLE {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17, \
18,19,20,21,22,23,24,25,26,27,28,29,30,31,32, \
@@ -212,7 +214,7 @@
#define D2UTABLE {0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3, \
3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5, \
5,5,6,6,6,6}
- #elif defined(DECDPUN)
+ #else
#error DECDPUN must be in the range 1-9
#endif
@@ -228,9 +230,9 @@
/* D2U -- return the number of Units needed to hold d digits */
/* (runtime version, with table lookaside for small d) */
- #if DECDPUN==8
+ #if defined(DECDPUN) && DECDPUN==8
#define D2U(d) ((unsigned)((d)<=DECMAXD2U?d2utable[d]:((d)+7)>>3))
- #elif DECDPUN==4
+ #elif defined(DECDPUN) && DECDPUN==4
#define D2U(d) ((unsigned)((d)<=DECMAXD2U?d2utable[d]:((d)+3)>>2))
#else
#define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
@@ -257,7 +259,7 @@
/* 2,000,000,000 (as is needed for negative exponents of */
/* subnormals). The unsigned integer pow is used as a temporary */
/* variable. */
- #define TODIGIT(u, cut, c, pow) { \
+ #define TODIGIT(u, cut, c, pow) UPRV_BLOCK_MACRO_BEGIN { \
*(c)='0'; \
pow=DECPOWERS[cut]*2; \
if ((u)>pow) { \
@@ -270,7 +272,7 @@
if ((u)>=pow) {(u)-=pow; *(c)+=2;} \
pow/=2; \
if ((u)>=pow) {(u)-=pow; *(c)+=1;} \
- }
+ } UPRV_BLOCK_MACRO_END
/* ---------------------------------------------------------------- */
/* Definitions for fixed-precision modules (only valid after */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/decimfmt.cpp b/Build/source/libs/icu/icu-src/source/i18n/decimfmt.cpp
index edd8910d9d4..d19f6518880 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/decimfmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/decimfmt.cpp
@@ -31,7 +31,7 @@ using namespace icu::numparse::impl;
using ERoundingMode = icu::DecimalFormat::ERoundingMode;
using EPadPosition = icu::DecimalFormat::EPadPosition;
-// MSVC warns C4805 when comparing bool with UBool
+// MSVC VS2015 warns C4805 when comparing bool with UBool, VS2017 no longer emits this warning.
// TODO: Move this macro into a better place?
#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
#define UBOOL_TO_BOOL(b) static_cast<bool>(b)
@@ -45,6 +45,7 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DecimalFormat)
DecimalFormat::DecimalFormat(UErrorCode& status)
: DecimalFormat(nullptr, status) {
+ if (U_FAILURE(status)) { return; }
// Use the default locale and decimal pattern.
const char* localeName = Locale::getDefault().getName();
LocalPointer<NumberingSystem> ns(NumberingSystem::createInstance(status));
@@ -59,6 +60,7 @@ DecimalFormat::DecimalFormat(UErrorCode& status)
DecimalFormat::DecimalFormat(const UnicodeString& pattern, UErrorCode& status)
: DecimalFormat(nullptr, status) {
+ if (U_FAILURE(status)) { return; }
setPropertiesFromPattern(pattern, IGNORE_ROUNDING_IF_CURRENCY, status);
touch(status);
}
@@ -66,6 +68,7 @@ DecimalFormat::DecimalFormat(const UnicodeString& pattern, UErrorCode& status)
DecimalFormat::DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt,
UErrorCode& status)
: DecimalFormat(symbolsToAdopt, status) {
+ if (U_FAILURE(status)) { return; }
setPropertiesFromPattern(pattern, IGNORE_ROUNDING_IF_CURRENCY, status);
touch(status);
}
@@ -73,8 +76,10 @@ DecimalFormat::DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols*
DecimalFormat::DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt,
UNumberFormatStyle style, UErrorCode& status)
: DecimalFormat(symbolsToAdopt, status) {
+ if (U_FAILURE(status)) { return; }
// If choice is a currency type, ignore the rounding information.
- if (style == UNumberFormatStyle::UNUM_CURRENCY || style == UNumberFormatStyle::UNUM_CURRENCY_ISO ||
+ if (style == UNumberFormatStyle::UNUM_CURRENCY ||
+ style == UNumberFormatStyle::UNUM_CURRENCY_ISO ||
style == UNumberFormatStyle::UNUM_CURRENCY_ACCOUNTING ||
style == UNumberFormatStyle::UNUM_CASH_CURRENCY ||
style == UNumberFormatStyle::UNUM_CURRENCY_STANDARD ||
@@ -90,35 +95,39 @@ DecimalFormat::DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols*
new CurrencyPluralInfo(fields->symbols->getLocale(), status),
status);
if (U_FAILURE(status)) { return; }
- fields->properties->currencyPluralInfo.fPtr.adoptInstead(cpi.orphan());
+ fields->properties.currencyPluralInfo.fPtr.adoptInstead(cpi.orphan());
}
touch(status);
}
DecimalFormat::DecimalFormat(const DecimalFormatSymbols* symbolsToAdopt, UErrorCode& status) {
+ // we must take ownership of symbolsToAdopt, even in a failure case.
LocalPointer<const DecimalFormatSymbols> adoptedSymbols(symbolsToAdopt);
- fields = new DecimalFormatFields();
if (U_FAILURE(status)) {
return;
}
+ fields = new DecimalFormatFields();
if (fields == nullptr) {
status = U_MEMORY_ALLOCATION_ERROR;
return;
}
- fields->properties.adoptInsteadAndCheckErrorCode(new DecimalFormatProperties(), status);
- fields->exportedProperties.adoptInsteadAndCheckErrorCode(new DecimalFormatProperties(), status);
if (adoptedSymbols.isNull()) {
fields->symbols.adoptInsteadAndCheckErrorCode(new DecimalFormatSymbols(status), status);
} else {
fields->symbols.adoptInsteadAndCheckErrorCode(adoptedSymbols.orphan(), status);
}
+ if (U_FAILURE(status)) {
+ delete fields;
+ fields = nullptr;
+ }
}
#if UCONFIG_HAVE_PARSEALLINPUT
void DecimalFormat::setParseAllInput(UNumberFormatAttributeValue value) {
- if (value == fields->properties->parseAllInput) { return; }
- fields->properties->parseAllInput = value;
+ if (fields == nullptr) { return; }
+ if (value == fields->properties.parseAllInput) { return; }
+ fields->properties.parseAllInput = value;
}
#endif
@@ -127,6 +136,12 @@ DecimalFormat&
DecimalFormat::setAttribute(UNumberFormatAttribute attr, int32_t newValue, UErrorCode& status) {
if (U_FAILURE(status)) { return *this; }
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return *this;
+ }
+
switch (attr) {
case UNUM_LENIENT_PARSE:
setLenient(newValue != 0);
@@ -254,6 +269,13 @@ DecimalFormat::setAttribute(UNumberFormatAttribute attr, int32_t newValue, UErro
int32_t DecimalFormat::getAttribute(UNumberFormatAttribute attr, UErrorCode& status) const {
if (U_FAILURE(status)) { return -1; }
+
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return -1;
+ }
+
switch (attr) {
case UNUM_LENIENT_PARSE:
return isLenient();
@@ -347,30 +369,40 @@ int32_t DecimalFormat::getAttribute(UNumberFormatAttribute attr, UErrorCode& sta
}
void DecimalFormat::setGroupingUsed(UBool enabled) {
- if (UBOOL_TO_BOOL(enabled) == fields->properties->groupingUsed) { return; }
+ if (fields == nullptr) {
+ return;
+ }
+ if (UBOOL_TO_BOOL(enabled) == fields->properties.groupingUsed) { return; }
NumberFormat::setGroupingUsed(enabled); // to set field for compatibility
- fields->properties->groupingUsed = enabled;
+ fields->properties.groupingUsed = enabled;
touchNoError();
}
void DecimalFormat::setParseIntegerOnly(UBool value) {
- if (UBOOL_TO_BOOL(value) == fields->properties->parseIntegerOnly) { return; }
+ if (fields == nullptr) {
+ return;
+ }
+ if (UBOOL_TO_BOOL(value) == fields->properties.parseIntegerOnly) { return; }
NumberFormat::setParseIntegerOnly(value); // to set field for compatibility
- fields->properties->parseIntegerOnly = value;
+ fields->properties.parseIntegerOnly = value;
touchNoError();
}
void DecimalFormat::setLenient(UBool enable) {
+ if (fields == nullptr) {
+ return;
+ }
ParseMode mode = enable ? PARSE_MODE_LENIENT : PARSE_MODE_STRICT;
- if (!fields->properties->parseMode.isNull() && mode == fields->properties->parseMode.getNoError()) { return; }
+ if (!fields->properties.parseMode.isNull() && mode == fields->properties.parseMode.getNoError()) { return; }
NumberFormat::setLenient(enable); // to set field for compatibility
- fields->properties->parseMode = mode;
+ fields->properties.parseMode = mode;
touchNoError();
}
DecimalFormat::DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt,
UParseError&, UErrorCode& status)
: DecimalFormat(symbolsToAdopt, status) {
+ if (U_FAILURE(status)) { return; }
// TODO: What is parseError for?
setPropertiesFromPattern(pattern, IGNORE_ROUNDING_IF_CURRENCY, status);
touch(status);
@@ -378,44 +410,91 @@ DecimalFormat::DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols*
DecimalFormat::DecimalFormat(const UnicodeString& pattern, const DecimalFormatSymbols& symbols,
UErrorCode& status)
- : DecimalFormat(new DecimalFormatSymbols(symbols), status) {
+ : DecimalFormat(nullptr, status) {
+ if (U_FAILURE(status)) { return; }
+ LocalPointer<DecimalFormatSymbols> dfs(new DecimalFormatSymbols(symbols), status);
+ if (U_FAILURE(status)) {
+ // If we failed to allocate DecimalFormatSymbols, then release fields and its members.
+ // We must have a fully complete fields object, we cannot have partially populated members.
+ delete fields;
+ fields = nullptr;
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ fields->symbols.adoptInstead(dfs.orphan());
setPropertiesFromPattern(pattern, IGNORE_ROUNDING_IF_CURRENCY, status);
touch(status);
}
DecimalFormat::DecimalFormat(const DecimalFormat& source) : NumberFormat(source) {
+ // If the object that we are copying from is invalid, no point in going further.
+ if (source.fields == nullptr) {
+ return;
+ }
// Note: it is not safe to copy fields->formatter or fWarehouse directly because fields->formatter might have
// dangling pointers to fields inside fWarehouse. The safe thing is to re-construct fields->formatter from
// the property bag, despite being somewhat slower.
- fields = new DecimalFormatFields();
+ fields = new DecimalFormatFields(source.fields->properties);
if (fields == nullptr) {
- return;
+ return; // no way to report an error.
}
- fields->properties.adoptInstead(new DecimalFormatProperties(*source.fields->properties));
- fields->symbols.adoptInstead(new DecimalFormatSymbols(*source.fields->symbols));
- fields->exportedProperties.adoptInstead(new DecimalFormatProperties());
- if (fields->properties == nullptr || fields->symbols == nullptr || fields->exportedProperties == nullptr) {
+ UErrorCode status = U_ZERO_ERROR;
+ fields->symbols.adoptInsteadAndCheckErrorCode(new DecimalFormatSymbols(*source.fields->symbols), status);
+ // In order to simplify error handling logic in the various getters/setters/etc, we do not allow
+ // any partially populated DecimalFormatFields object. We must have a fully complete fields object
+ // or else we set it to nullptr.
+ if (U_FAILURE(status)) {
+ delete fields;
+ fields = nullptr;
return;
}
- touchNoError();
+ touch(status);
}
DecimalFormat& DecimalFormat::operator=(const DecimalFormat& rhs) {
- *fields->properties = *rhs.fields->properties;
- fields->exportedProperties->clear();
- fields->symbols.adoptInstead(new DecimalFormatSymbols(*rhs.fields->symbols));
- touchNoError();
+ // guard against self-assignment
+ if (this == &rhs) {
+ return *this;
+ }
+ // Make sure both objects are valid.
+ if (fields == nullptr || rhs.fields == nullptr) {
+ return *this; // unfortunately, no way to report an error.
+ }
+ fields->properties = rhs.fields->properties;
+ fields->exportedProperties.clear();
+ UErrorCode status = U_ZERO_ERROR;
+ LocalPointer<DecimalFormatSymbols> dfs(new DecimalFormatSymbols(*rhs.fields->symbols), status);
+ if (U_FAILURE(status)) {
+ // We failed to allocate DecimalFormatSymbols, release fields and its members.
+ // We must have a fully complete fields object, we cannot have partially populated members.
+ delete fields;
+ fields = nullptr;
+ return *this;
+ }
+ fields->symbols.adoptInstead(dfs.orphan());
+ touch(status);
+
return *this;
}
DecimalFormat::~DecimalFormat() {
+ if (fields == nullptr) { return; }
+
delete fields->atomicParser.exchange(nullptr);
delete fields->atomicCurrencyParser.exchange(nullptr);
- delete fields;
+ delete fields;
}
-Format* DecimalFormat::clone() const {
- return new DecimalFormat(*this);
+DecimalFormat* DecimalFormat::clone() const {
+ // can only clone valid objects.
+ if (fields == nullptr) {
+ return nullptr;
+ }
+ LocalPointer<DecimalFormat> df(new DecimalFormat(*this));
+ if (df.isValid() && df->fields != nullptr) {
+ return df.orphan();
+ }
+ return nullptr;
}
UBool DecimalFormat::operator==(const Format& other) const {
@@ -423,43 +502,70 @@ UBool DecimalFormat::operator==(const Format& other) const {
if (otherDF == nullptr) {
return false;
}
- return *fields->properties == *otherDF->fields->properties && *fields->symbols == *otherDF->fields->symbols;
+ // If either object is in an invalid state, prevent dereferencing nullptr below.
+ // Additionally, invalid objects should not be considered equal to anything.
+ if (fields == nullptr || otherDF->fields == nullptr) {
+ return false;
+ }
+ return fields->properties == otherDF->fields->properties && *fields->symbols == *otherDF->fields->symbols;
}
UnicodeString& DecimalFormat::format(double number, UnicodeString& appendTo, FieldPosition& pos) const {
+ if (fields == nullptr) {
+ appendTo.setToBogus();
+ return appendTo;
+ }
if (pos.getField() == FieldPosition::DONT_CARE && fastFormatDouble(number, appendTo)) {
return appendTo;
}
UErrorCode localStatus = U_ZERO_ERROR;
- FormattedNumber output = fields->formatter->formatDouble(number, localStatus);
+ FormattedNumber output = fields->formatter.formatDouble(number, localStatus);
fieldPositionHelper(output, pos, appendTo.length(), localStatus);
auto appendable = UnicodeStringAppendable(appendTo);
- output.appendTo(appendable);
+ output.appendTo(appendable, localStatus);
return appendTo;
}
UnicodeString& DecimalFormat::format(double number, UnicodeString& appendTo, FieldPosition& pos,
UErrorCode& status) const {
+ if (U_FAILURE(status)) {
+ return appendTo; // don't overwrite status if it's already a failure.
+ }
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ status = U_MEMORY_ALLOCATION_ERROR;
+ appendTo.setToBogus();
+ return appendTo;
+ }
if (pos.getField() == FieldPosition::DONT_CARE && fastFormatDouble(number, appendTo)) {
return appendTo;
}
- FormattedNumber output = fields->formatter->formatDouble(number, status);
+ FormattedNumber output = fields->formatter.formatDouble(number, status);
fieldPositionHelper(output, pos, appendTo.length(), status);
auto appendable = UnicodeStringAppendable(appendTo);
- output.appendTo(appendable);
+ output.appendTo(appendable, status);
return appendTo;
}
UnicodeString&
DecimalFormat::format(double number, UnicodeString& appendTo, FieldPositionIterator* posIter,
UErrorCode& status) const {
+ if (U_FAILURE(status)) {
+ return appendTo; // don't overwrite status if it's already a failure.
+ }
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ status = U_MEMORY_ALLOCATION_ERROR;
+ appendTo.setToBogus();
+ return appendTo;
+ }
if (posIter == nullptr && fastFormatDouble(number, appendTo)) {
return appendTo;
}
- FormattedNumber output = fields->formatter->formatDouble(number, status);
+ FormattedNumber output = fields->formatter.formatDouble(number, status);
fieldPositionIteratorHelper(output, posIter, appendTo.length(), status);
auto appendable = UnicodeStringAppendable(appendTo);
- output.appendTo(appendable);
+ output.appendTo(appendable, status);
return appendTo;
}
@@ -479,74 +585,130 @@ DecimalFormat::format(int32_t number, UnicodeString& appendTo, FieldPositionIter
}
UnicodeString& DecimalFormat::format(int64_t number, UnicodeString& appendTo, FieldPosition& pos) const {
+ if (fields == nullptr) {
+ appendTo.setToBogus();
+ return appendTo;
+ }
if (pos.getField() == FieldPosition::DONT_CARE && fastFormatInt64(number, appendTo)) {
return appendTo;
}
UErrorCode localStatus = U_ZERO_ERROR;
- FormattedNumber output = fields->formatter->formatInt(number, localStatus);
+ FormattedNumber output = fields->formatter.formatInt(number, localStatus);
fieldPositionHelper(output, pos, appendTo.length(), localStatus);
auto appendable = UnicodeStringAppendable(appendTo);
- output.appendTo(appendable);
+ output.appendTo(appendable, localStatus);
return appendTo;
}
UnicodeString& DecimalFormat::format(int64_t number, UnicodeString& appendTo, FieldPosition& pos,
UErrorCode& status) const {
+ if (U_FAILURE(status)) {
+ return appendTo; // don't overwrite status if it's already a failure.
+ }
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ status = U_MEMORY_ALLOCATION_ERROR;
+ appendTo.setToBogus();
+ return appendTo;
+ }
if (pos.getField() == FieldPosition::DONT_CARE && fastFormatInt64(number, appendTo)) {
return appendTo;
}
- FormattedNumber output = fields->formatter->formatInt(number, status);
+ FormattedNumber output = fields->formatter.formatInt(number, status);
fieldPositionHelper(output, pos, appendTo.length(), status);
auto appendable = UnicodeStringAppendable(appendTo);
- output.appendTo(appendable);
+ output.appendTo(appendable, status);
return appendTo;
}
UnicodeString&
DecimalFormat::format(int64_t number, UnicodeString& appendTo, FieldPositionIterator* posIter,
UErrorCode& status) const {
+ if (U_FAILURE(status)) {
+ return appendTo; // don't overwrite status if it's already a failure.
+ }
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ status = U_MEMORY_ALLOCATION_ERROR;
+ appendTo.setToBogus();
+ return appendTo;
+ }
if (posIter == nullptr && fastFormatInt64(number, appendTo)) {
return appendTo;
}
- FormattedNumber output = fields->formatter->formatInt(number, status);
+ FormattedNumber output = fields->formatter.formatInt(number, status);
fieldPositionIteratorHelper(output, posIter, appendTo.length(), status);
auto appendable = UnicodeStringAppendable(appendTo);
- output.appendTo(appendable);
+ output.appendTo(appendable, status);
return appendTo;
}
UnicodeString&
DecimalFormat::format(StringPiece number, UnicodeString& appendTo, FieldPositionIterator* posIter,
UErrorCode& status) const {
- FormattedNumber output = fields->formatter->formatDecimal(number, status);
+ if (U_FAILURE(status)) {
+ return appendTo; // don't overwrite status if it's already a failure.
+ }
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ status = U_MEMORY_ALLOCATION_ERROR;
+ appendTo.setToBogus();
+ return appendTo;
+ }
+ FormattedNumber output = fields->formatter.formatDecimal(number, status);
fieldPositionIteratorHelper(output, posIter, appendTo.length(), status);
auto appendable = UnicodeStringAppendable(appendTo);
- output.appendTo(appendable);
+ output.appendTo(appendable, status);
return appendTo;
}
UnicodeString& DecimalFormat::format(const DecimalQuantity& number, UnicodeString& appendTo,
FieldPositionIterator* posIter, UErrorCode& status) const {
- FormattedNumber output = fields->formatter->formatDecimalQuantity(number, status);
+ if (U_FAILURE(status)) {
+ return appendTo; // don't overwrite status if it's already a failure.
+ }
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ status = U_MEMORY_ALLOCATION_ERROR;
+ appendTo.setToBogus();
+ return appendTo;
+ }
+ FormattedNumber output = fields->formatter.formatDecimalQuantity(number, status);
fieldPositionIteratorHelper(output, posIter, appendTo.length(), status);
auto appendable = UnicodeStringAppendable(appendTo);
- output.appendTo(appendable);
+ output.appendTo(appendable, status);
return appendTo;
}
UnicodeString&
DecimalFormat::format(const DecimalQuantity& number, UnicodeString& appendTo, FieldPosition& pos,
UErrorCode& status) const {
- FormattedNumber output = fields->formatter->formatDecimalQuantity(number, status);
+ if (U_FAILURE(status)) {
+ return appendTo; // don't overwrite status if it's already a failure.
+ }
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ status = U_MEMORY_ALLOCATION_ERROR;
+ appendTo.setToBogus();
+ return appendTo;
+ }
+ FormattedNumber output = fields->formatter.formatDecimalQuantity(number, status);
fieldPositionHelper(output, pos, appendTo.length(), status);
auto appendable = UnicodeStringAppendable(appendTo);
- output.appendTo(appendable);
+ output.appendTo(appendable, status);
return appendTo;
}
void DecimalFormat::parse(const UnicodeString& text, Formattable& output,
ParsePosition& parsePosition) const {
+ if (fields == nullptr) {
+ return;
+ }
if (parsePosition.getIndex() < 0 || parsePosition.getIndex() >= text.length()) {
+ if (parsePosition.getIndex() == text.length()) {
+ // If there is nothing to parse, it is an error
+ parsePosition.setErrorIndex(parsePosition.getIndex());
+ }
return;
}
@@ -556,8 +718,13 @@ void DecimalFormat::parse(const UnicodeString& text, Formattable& output,
// parseCurrency method (backwards compatibility)
int32_t startIndex = parsePosition.getIndex();
const NumberParserImpl* parser = getParser(status);
- if (U_FAILURE(status)) { return; }
+ if (U_FAILURE(status)) {
+ return; // unfortunately no way to report back the error.
+ }
parser->parse(text, startIndex, true, result, status);
+ if (U_FAILURE(status)) {
+ return; // unfortunately no way to report back the error.
+ }
// TODO: Do we need to check for fImpl->properties->parseAllInput (UCONFIG_HAVE_PARSEALLINPUT) here?
if (result.success()) {
parsePosition.setIndex(result.charEnd);
@@ -568,6 +735,9 @@ void DecimalFormat::parse(const UnicodeString& text, Formattable& output,
}
CurrencyAmount* DecimalFormat::parseCurrency(const UnicodeString& text, ParsePosition& parsePosition) const {
+ if (fields == nullptr) {
+ return nullptr;
+ }
if (parsePosition.getIndex() < 0 || parsePosition.getIndex() >= text.length()) {
return nullptr;
}
@@ -578,14 +748,24 @@ CurrencyAmount* DecimalFormat::parseCurrency(const UnicodeString& text, ParsePos
// parseCurrency method (backwards compatibility)
int32_t startIndex = parsePosition.getIndex();
const NumberParserImpl* parser = getCurrencyParser(status);
- if (U_FAILURE(status)) { return nullptr; }
+ if (U_FAILURE(status)) {
+ return nullptr;
+ }
parser->parse(text, startIndex, true, result, status);
+ if (U_FAILURE(status)) {
+ return nullptr;
+ }
// TODO: Do we need to check for fImpl->properties->parseAllInput (UCONFIG_HAVE_PARSEALLINPUT) here?
if (result.success()) {
parsePosition.setIndex(result.charEnd);
Formattable formattable;
result.populateFormattable(formattable, parser->getParseFlags());
- return new CurrencyAmount(formattable, result.currencyCode, status);
+ LocalPointer<CurrencyAmount> currencyAmount(
+ new CurrencyAmount(formattable, result.currencyCode, status), status);
+ if (U_FAILURE(status)) {
+ return nullptr;
+ }
+ return currencyAmount.orphan();
} else {
parsePosition.setErrorIndex(startIndex + result.charEnd);
return nullptr;
@@ -593,6 +773,9 @@ CurrencyAmount* DecimalFormat::parseCurrency(const UnicodeString& text, ParsePos
}
const DecimalFormatSymbols* DecimalFormat::getDecimalFormatSymbols(void) const {
+ if (fields == nullptr) {
+ return nullptr;
+ }
return fields->symbols.getAlias();
}
@@ -600,102 +783,180 @@ void DecimalFormat::adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdo
if (symbolsToAdopt == nullptr) {
return; // do not allow caller to set fields->symbols to NULL
}
- fields->symbols.adoptInstead(symbolsToAdopt);
+ // we must take ownership of symbolsToAdopt, even in a failure case.
+ LocalPointer<DecimalFormatSymbols> dfs(symbolsToAdopt);
+ if (fields == nullptr) {
+ return;
+ }
+ fields->symbols.adoptInstead(dfs.orphan());
touchNoError();
}
void DecimalFormat::setDecimalFormatSymbols(const DecimalFormatSymbols& symbols) {
- fields->symbols.adoptInstead(new DecimalFormatSymbols(symbols));
+ if (fields == nullptr) {
+ return;
+ }
+ UErrorCode status = U_ZERO_ERROR;
+ LocalPointer<DecimalFormatSymbols> dfs(new DecimalFormatSymbols(symbols), status);
+ if (U_FAILURE(status)) {
+ // We failed to allocate DecimalFormatSymbols, release fields and its members.
+ // We must have a fully complete fields object, we cannot have partially populated members.
+ delete fields;
+ fields = nullptr;
+ return;
+ }
+ fields->symbols.adoptInstead(dfs.orphan());
touchNoError();
}
const CurrencyPluralInfo* DecimalFormat::getCurrencyPluralInfo(void) const {
- return fields->properties->currencyPluralInfo.fPtr.getAlias();
+ if (fields == nullptr) {
+ return nullptr;
+ }
+ return fields->properties.currencyPluralInfo.fPtr.getAlias();
}
void DecimalFormat::adoptCurrencyPluralInfo(CurrencyPluralInfo* toAdopt) {
- fields->properties->currencyPluralInfo.fPtr.adoptInstead(toAdopt);
+ // TODO: should we guard against nullptr input, like in adoptDecimalFormatSymbols?
+ // we must take ownership of toAdopt, even in a failure case.
+ LocalPointer<CurrencyPluralInfo> cpi(toAdopt);
+ if (fields == nullptr) {
+ return;
+ }
+ fields->properties.currencyPluralInfo.fPtr.adoptInstead(cpi.orphan());
touchNoError();
}
void DecimalFormat::setCurrencyPluralInfo(const CurrencyPluralInfo& info) {
- if (fields->properties->currencyPluralInfo.fPtr.isNull()) {
- fields->properties->currencyPluralInfo.fPtr.adoptInstead(info.clone());
+ if (fields == nullptr) {
+ return;
+ }
+ if (fields->properties.currencyPluralInfo.fPtr.isNull()) {
+ // Note: clone() can fail with OOM error, but we have no way to report it. :(
+ fields->properties.currencyPluralInfo.fPtr.adoptInstead(info.clone());
} else {
- *fields->properties->currencyPluralInfo.fPtr = info; // copy-assignment operator
+ *fields->properties.currencyPluralInfo.fPtr = info; // copy-assignment operator
}
touchNoError();
}
UnicodeString& DecimalFormat::getPositivePrefix(UnicodeString& result) const {
- ErrorCode localStatus;
- fields->formatter->getAffixImpl(true, false, result, localStatus);
+ if (fields == nullptr) {
+ result.setToBogus();
+ return result;
+ }
+ UErrorCode status = U_ZERO_ERROR;
+ fields->formatter.getAffixImpl(true, false, result, status);
+ if (U_FAILURE(status)) { result.setToBogus(); }
return result;
}
void DecimalFormat::setPositivePrefix(const UnicodeString& newValue) {
- if (newValue == fields->properties->positivePrefix) { return; }
- fields->properties->positivePrefix = newValue;
+ if (fields == nullptr) {
+ return;
+ }
+ if (newValue == fields->properties.positivePrefix) { return; }
+ fields->properties.positivePrefix = newValue;
touchNoError();
}
UnicodeString& DecimalFormat::getNegativePrefix(UnicodeString& result) const {
- ErrorCode localStatus;
- fields->formatter->getAffixImpl(true, true, result, localStatus);
+ if (fields == nullptr) {
+ result.setToBogus();
+ return result;
+ }
+ UErrorCode status = U_ZERO_ERROR;
+ fields->formatter.getAffixImpl(true, true, result, status);
+ if (U_FAILURE(status)) { result.setToBogus(); }
return result;
}
void DecimalFormat::setNegativePrefix(const UnicodeString& newValue) {
- if (newValue == fields->properties->negativePrefix) { return; }
- fields->properties->negativePrefix = newValue;
+ if (fields == nullptr) {
+ return;
+ }
+ if (newValue == fields->properties.negativePrefix) { return; }
+ fields->properties.negativePrefix = newValue;
touchNoError();
}
UnicodeString& DecimalFormat::getPositiveSuffix(UnicodeString& result) const {
- ErrorCode localStatus;
- fields->formatter->getAffixImpl(false, false, result, localStatus);
+ if (fields == nullptr) {
+ result.setToBogus();
+ return result;
+ }
+ UErrorCode status = U_ZERO_ERROR;
+ fields->formatter.getAffixImpl(false, false, result, status);
+ if (U_FAILURE(status)) { result.setToBogus(); }
return result;
}
void DecimalFormat::setPositiveSuffix(const UnicodeString& newValue) {
- if (newValue == fields->properties->positiveSuffix) { return; }
- fields->properties->positiveSuffix = newValue;
+ if (fields == nullptr) {
+ return;
+ }
+ if (newValue == fields->properties.positiveSuffix) { return; }
+ fields->properties.positiveSuffix = newValue;
touchNoError();
}
UnicodeString& DecimalFormat::getNegativeSuffix(UnicodeString& result) const {
- ErrorCode localStatus;
- fields->formatter->getAffixImpl(false, true, result, localStatus);
+ if (fields == nullptr) {
+ result.setToBogus();
+ return result;
+ }
+ UErrorCode status = U_ZERO_ERROR;
+ fields->formatter.getAffixImpl(false, true, result, status);
+ if (U_FAILURE(status)) { result.setToBogus(); }
return result;
}
void DecimalFormat::setNegativeSuffix(const UnicodeString& newValue) {
- if (newValue == fields->properties->negativeSuffix) { return; }
- fields->properties->negativeSuffix = newValue;
+ if (fields == nullptr) {
+ return;
+ }
+ if (newValue == fields->properties.negativeSuffix) { return; }
+ fields->properties.negativeSuffix = newValue;
touchNoError();
}
UBool DecimalFormat::isSignAlwaysShown() const {
- return fields->properties->signAlwaysShown;
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ return DecimalFormatProperties::getDefault().signAlwaysShown;
+ }
+ return fields->properties.signAlwaysShown;
}
void DecimalFormat::setSignAlwaysShown(UBool value) {
- if (UBOOL_TO_BOOL(value) == fields->properties->signAlwaysShown) { return; }
- fields->properties->signAlwaysShown = value;
+ if (fields == nullptr) { return; }
+ if (UBOOL_TO_BOOL(value) == fields->properties.signAlwaysShown) { return; }
+ fields->properties.signAlwaysShown = value;
touchNoError();
}
int32_t DecimalFormat::getMultiplier(void) const {
- if (fields->properties->multiplier != 1) {
- return fields->properties->multiplier;
- } else if (fields->properties->magnitudeMultiplier != 0) {
- return static_cast<int32_t>(uprv_pow10(fields->properties->magnitudeMultiplier));
+ const DecimalFormatProperties *dfp;
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ dfp = &(DecimalFormatProperties::getDefault());
+ } else {
+ dfp = &fields->properties;
+ }
+ if (dfp->multiplier != 1) {
+ return dfp->multiplier;
+ } else if (dfp->magnitudeMultiplier != 0) {
+ return static_cast<int32_t>(uprv_pow10(dfp->magnitudeMultiplier));
} else {
return 1;
}
}
void DecimalFormat::setMultiplier(int32_t multiplier) {
+ if (fields == nullptr) {
+ return;
+ }
if (multiplier == 0) {
multiplier = 1; // one being the benign default value for a multiplier.
}
@@ -713,147 +974,207 @@ void DecimalFormat::setMultiplier(int32_t multiplier) {
value = temp;
}
if (delta != -1) {
- fields->properties->magnitudeMultiplier = delta;
- fields->properties->multiplier = 1;
+ fields->properties.magnitudeMultiplier = delta;
+ fields->properties.multiplier = 1;
} else {
- fields->properties->magnitudeMultiplier = 0;
- fields->properties->multiplier = multiplier;
+ fields->properties.magnitudeMultiplier = 0;
+ fields->properties.multiplier = multiplier;
}
touchNoError();
}
int32_t DecimalFormat::getMultiplierScale() const {
- return fields->properties->multiplierScale;
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ return DecimalFormatProperties::getDefault().multiplierScale;
+ }
+ return fields->properties.multiplierScale;
}
void DecimalFormat::setMultiplierScale(int32_t newValue) {
- if (newValue == fields->properties->multiplierScale) { return; }
- fields->properties->multiplierScale = newValue;
+ if (fields == nullptr) { return; }
+ if (newValue == fields->properties.multiplierScale) { return; }
+ fields->properties.multiplierScale = newValue;
touchNoError();
}
double DecimalFormat::getRoundingIncrement(void) const {
- return fields->exportedProperties->roundingIncrement;
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ return DecimalFormatProperties::getDefault().roundingIncrement;
+ }
+ return fields->exportedProperties.roundingIncrement;
}
void DecimalFormat::setRoundingIncrement(double newValue) {
- if (newValue == fields->properties->roundingIncrement) { return; }
- fields->properties->roundingIncrement = newValue;
+ if (fields == nullptr) { return; }
+ if (newValue == fields->properties.roundingIncrement) { return; }
+ fields->properties.roundingIncrement = newValue;
touchNoError();
}
ERoundingMode DecimalFormat::getRoundingMode(void) const {
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ return static_cast<ERoundingMode>(DecimalFormatProperties::getDefault().roundingMode.getNoError());
+ }
// UNumberFormatRoundingMode and ERoundingMode have the same values.
- return static_cast<ERoundingMode>(fields->exportedProperties->roundingMode.getNoError());
+ return static_cast<ERoundingMode>(fields->exportedProperties.roundingMode.getNoError());
}
void DecimalFormat::setRoundingMode(ERoundingMode roundingMode) {
+ if (fields == nullptr) { return; }
auto uRoundingMode = static_cast<UNumberFormatRoundingMode>(roundingMode);
- if (!fields->properties->roundingMode.isNull() && uRoundingMode == fields->properties->roundingMode.getNoError()) {
+ if (!fields->properties.roundingMode.isNull() && uRoundingMode == fields->properties.roundingMode.getNoError()) {
return;
}
NumberFormat::setMaximumIntegerDigits(roundingMode); // to set field for compatibility
- fields->properties->roundingMode = uRoundingMode;
+ fields->properties.roundingMode = uRoundingMode;
touchNoError();
}
int32_t DecimalFormat::getFormatWidth(void) const {
- return fields->properties->formatWidth;
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ return DecimalFormatProperties::getDefault().formatWidth;
+ }
+ return fields->properties.formatWidth;
}
void DecimalFormat::setFormatWidth(int32_t width) {
- if (width == fields->properties->formatWidth) { return; }
- fields->properties->formatWidth = width;
+ if (fields == nullptr) { return; }
+ if (width == fields->properties.formatWidth) { return; }
+ fields->properties.formatWidth = width;
touchNoError();
}
UnicodeString DecimalFormat::getPadCharacterString() const {
- if (fields->properties->padString.isBogus()) {
+ if (fields == nullptr || fields->properties.padString.isBogus()) {
// Readonly-alias the static string kFallbackPaddingString
return {TRUE, kFallbackPaddingString, -1};
} else {
- return fields->properties->padString;
+ return fields->properties.padString;
}
}
void DecimalFormat::setPadCharacter(const UnicodeString& padChar) {
- if (padChar == fields->properties->padString) { return; }
+ if (fields == nullptr) { return; }
+ if (padChar == fields->properties.padString) { return; }
if (padChar.length() > 0) {
- fields->properties->padString = UnicodeString(padChar.char32At(0));
+ fields->properties.padString = UnicodeString(padChar.char32At(0));
} else {
- fields->properties->padString.setToBogus();
+ fields->properties.padString.setToBogus();
}
touchNoError();
}
EPadPosition DecimalFormat::getPadPosition(void) const {
- if (fields->properties->padPosition.isNull()) {
+ if (fields == nullptr || fields->properties.padPosition.isNull()) {
return EPadPosition::kPadBeforePrefix;
} else {
// UNumberFormatPadPosition and EPadPosition have the same values.
- return static_cast<EPadPosition>(fields->properties->padPosition.getNoError());
+ return static_cast<EPadPosition>(fields->properties.padPosition.getNoError());
}
}
void DecimalFormat::setPadPosition(EPadPosition padPos) {
+ if (fields == nullptr) { return; }
auto uPadPos = static_cast<UNumberFormatPadPosition>(padPos);
- if (!fields->properties->padPosition.isNull() && uPadPos == fields->properties->padPosition.getNoError()) {
+ if (!fields->properties.padPosition.isNull() && uPadPos == fields->properties.padPosition.getNoError()) {
return;
}
- fields->properties->padPosition = uPadPos;
+ fields->properties.padPosition = uPadPos;
touchNoError();
}
UBool DecimalFormat::isScientificNotation(void) const {
- return fields->properties->minimumExponentDigits != -1;
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ return (DecimalFormatProperties::getDefault().minimumExponentDigits != -1);
+ }
+ return (fields->properties.minimumExponentDigits != -1);
}
void DecimalFormat::setScientificNotation(UBool useScientific) {
+ if (fields == nullptr) { return; }
int32_t minExp = useScientific ? 1 : -1;
- if (fields->properties->minimumExponentDigits == minExp) { return; }
+ if (fields->properties.minimumExponentDigits == minExp) { return; }
if (useScientific) {
- fields->properties->minimumExponentDigits = 1;
+ fields->properties.minimumExponentDigits = 1;
} else {
- fields->properties->minimumExponentDigits = -1;
+ fields->properties.minimumExponentDigits = -1;
}
touchNoError();
}
int8_t DecimalFormat::getMinimumExponentDigits(void) const {
- return static_cast<int8_t>(fields->properties->minimumExponentDigits);
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ return static_cast<int8_t>(DecimalFormatProperties::getDefault().minimumExponentDigits);
+ }
+ return static_cast<int8_t>(fields->properties.minimumExponentDigits);
}
void DecimalFormat::setMinimumExponentDigits(int8_t minExpDig) {
- if (minExpDig == fields->properties->minimumExponentDigits) { return; }
- fields->properties->minimumExponentDigits = minExpDig;
+ if (fields == nullptr) { return; }
+ if (minExpDig == fields->properties.minimumExponentDigits) { return; }
+ fields->properties.minimumExponentDigits = minExpDig;
touchNoError();
}
UBool DecimalFormat::isExponentSignAlwaysShown(void) const {
- return fields->properties->exponentSignAlwaysShown;
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ return DecimalFormatProperties::getDefault().exponentSignAlwaysShown;
+ }
+ return fields->properties.exponentSignAlwaysShown;
}
void DecimalFormat::setExponentSignAlwaysShown(UBool expSignAlways) {
- if (UBOOL_TO_BOOL(expSignAlways) == fields->properties->exponentSignAlwaysShown) { return; }
- fields->properties->exponentSignAlwaysShown = expSignAlways;
+ if (fields == nullptr) { return; }
+ if (UBOOL_TO_BOOL(expSignAlways) == fields->properties.exponentSignAlwaysShown) { return; }
+ fields->properties.exponentSignAlwaysShown = expSignAlways;
touchNoError();
}
int32_t DecimalFormat::getGroupingSize(void) const {
- if (fields->properties->groupingSize < 0) {
+ int32_t groupingSize;
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ groupingSize = DecimalFormatProperties::getDefault().groupingSize;
+ } else {
+ groupingSize = fields->properties.groupingSize;
+ }
+ if (groupingSize < 0) {
return 0;
}
- return fields->properties->groupingSize;
+ return groupingSize;
}
void DecimalFormat::setGroupingSize(int32_t newValue) {
- if (newValue == fields->properties->groupingSize) { return; }
- fields->properties->groupingSize = newValue;
+ if (fields == nullptr) { return; }
+ if (newValue == fields->properties.groupingSize) { return; }
+ fields->properties.groupingSize = newValue;
touchNoError();
}
int32_t DecimalFormat::getSecondaryGroupingSize(void) const {
- int grouping2 = fields->properties->secondaryGroupingSize;
+ int32_t grouping2;
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ grouping2 = DecimalFormatProperties::getDefault().secondaryGroupingSize;
+ } else {
+ grouping2 = fields->properties.secondaryGroupingSize;
+ }
if (grouping2 < 0) {
return 0;
}
@@ -861,94 +1182,143 @@ int32_t DecimalFormat::getSecondaryGroupingSize(void) const {
}
void DecimalFormat::setSecondaryGroupingSize(int32_t newValue) {
- if (newValue == fields->properties->secondaryGroupingSize) { return; }
- fields->properties->secondaryGroupingSize = newValue;
+ if (fields == nullptr) { return; }
+ if (newValue == fields->properties.secondaryGroupingSize) { return; }
+ fields->properties.secondaryGroupingSize = newValue;
touchNoError();
}
int32_t DecimalFormat::getMinimumGroupingDigits() const {
- return fields->properties->minimumGroupingDigits;
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ return DecimalFormatProperties::getDefault().minimumGroupingDigits;
+ }
+ return fields->properties.minimumGroupingDigits;
}
void DecimalFormat::setMinimumGroupingDigits(int32_t newValue) {
- if (newValue == fields->properties->minimumGroupingDigits) { return; }
- fields->properties->minimumGroupingDigits = newValue;
+ if (fields == nullptr) { return; }
+ if (newValue == fields->properties.minimumGroupingDigits) { return; }
+ fields->properties.minimumGroupingDigits = newValue;
touchNoError();
}
UBool DecimalFormat::isDecimalSeparatorAlwaysShown(void) const {
- return fields->properties->decimalSeparatorAlwaysShown;
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ return DecimalFormatProperties::getDefault().decimalSeparatorAlwaysShown;
+ }
+ return fields->properties.decimalSeparatorAlwaysShown;
}
void DecimalFormat::setDecimalSeparatorAlwaysShown(UBool newValue) {
- if (UBOOL_TO_BOOL(newValue) == fields->properties->decimalSeparatorAlwaysShown) { return; }
- fields->properties->decimalSeparatorAlwaysShown = newValue;
+ if (fields == nullptr) { return; }
+ if (UBOOL_TO_BOOL(newValue) == fields->properties.decimalSeparatorAlwaysShown) { return; }
+ fields->properties.decimalSeparatorAlwaysShown = newValue;
touchNoError();
}
UBool DecimalFormat::isDecimalPatternMatchRequired(void) const {
- return fields->properties->decimalPatternMatchRequired;
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ return DecimalFormatProperties::getDefault().decimalPatternMatchRequired;
+ }
+ return fields->properties.decimalPatternMatchRequired;
}
void DecimalFormat::setDecimalPatternMatchRequired(UBool newValue) {
- if (UBOOL_TO_BOOL(newValue) == fields->properties->decimalPatternMatchRequired) { return; }
- fields->properties->decimalPatternMatchRequired = newValue;
+ if (fields == nullptr) { return; }
+ if (UBOOL_TO_BOOL(newValue) == fields->properties.decimalPatternMatchRequired) { return; }
+ fields->properties.decimalPatternMatchRequired = newValue;
touchNoError();
}
UBool DecimalFormat::isParseNoExponent() const {
- return fields->properties->parseNoExponent;
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ return DecimalFormatProperties::getDefault().parseNoExponent;
+ }
+ return fields->properties.parseNoExponent;
}
void DecimalFormat::setParseNoExponent(UBool value) {
- if (UBOOL_TO_BOOL(value) == fields->properties->parseNoExponent) { return; }
- fields->properties->parseNoExponent = value;
+ if (fields == nullptr) { return; }
+ if (UBOOL_TO_BOOL(value) == fields->properties.parseNoExponent) { return; }
+ fields->properties.parseNoExponent = value;
touchNoError();
}
UBool DecimalFormat::isParseCaseSensitive() const {
- return fields->properties->parseCaseSensitive;
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ return DecimalFormatProperties::getDefault().parseCaseSensitive;
+ }
+ return fields->properties.parseCaseSensitive;
}
void DecimalFormat::setParseCaseSensitive(UBool value) {
- if (UBOOL_TO_BOOL(value) == fields->properties->parseCaseSensitive) { return; }
- fields->properties->parseCaseSensitive = value;
+ if (fields == nullptr) { return; }
+ if (UBOOL_TO_BOOL(value) == fields->properties.parseCaseSensitive) { return; }
+ fields->properties.parseCaseSensitive = value;
touchNoError();
}
UBool DecimalFormat::isFormatFailIfMoreThanMaxDigits() const {
- return fields->properties->formatFailIfMoreThanMaxDigits;
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ return DecimalFormatProperties::getDefault().formatFailIfMoreThanMaxDigits;
+ }
+ return fields->properties.formatFailIfMoreThanMaxDigits;
}
void DecimalFormat::setFormatFailIfMoreThanMaxDigits(UBool value) {
- if (UBOOL_TO_BOOL(value) == fields->properties->formatFailIfMoreThanMaxDigits) { return; }
- fields->properties->formatFailIfMoreThanMaxDigits = value;
+ if (fields == nullptr) { return; }
+ if (UBOOL_TO_BOOL(value) == fields->properties.formatFailIfMoreThanMaxDigits) { return; }
+ fields->properties.formatFailIfMoreThanMaxDigits = value;
touchNoError();
}
UnicodeString& DecimalFormat::toPattern(UnicodeString& result) const {
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ result.setToBogus();
+ return result;
+ }
// Pull some properties from exportedProperties and others from properties
// to keep affix patterns intact. In particular, pull rounding properties
// so that CurrencyUsage is reflected properly.
// TODO: Consider putting this logic in number_patternstring.cpp instead.
ErrorCode localStatus;
- DecimalFormatProperties tprops(*fields->properties);
- bool useCurrency = ((!tprops.currency.isNull()) || !tprops.currencyPluralInfo.fPtr.isNull() ||
- !tprops.currencyUsage.isNull() || AffixUtils::hasCurrencySymbols(
- tprops.positivePrefixPattern, localStatus) || AffixUtils::hasCurrencySymbols(
- tprops.positiveSuffixPattern, localStatus) || AffixUtils::hasCurrencySymbols(
- tprops.negativePrefixPattern, localStatus) || AffixUtils::hasCurrencySymbols(
- tprops.negativeSuffixPattern, localStatus));
+ DecimalFormatProperties tprops(fields->properties);
+ bool useCurrency = (
+ !tprops.currency.isNull() ||
+ !tprops.currencyPluralInfo.fPtr.isNull() ||
+ !tprops.currencyUsage.isNull() ||
+ AffixUtils::hasCurrencySymbols(tprops.positivePrefixPattern, localStatus) ||
+ AffixUtils::hasCurrencySymbols(tprops.positiveSuffixPattern, localStatus) ||
+ AffixUtils::hasCurrencySymbols(tprops.negativePrefixPattern, localStatus) ||
+ AffixUtils::hasCurrencySymbols(tprops.negativeSuffixPattern, localStatus));
if (useCurrency) {
- tprops.minimumFractionDigits = fields->exportedProperties->minimumFractionDigits;
- tprops.maximumFractionDigits = fields->exportedProperties->maximumFractionDigits;
- tprops.roundingIncrement = fields->exportedProperties->roundingIncrement;
+ tprops.minimumFractionDigits = fields->exportedProperties.minimumFractionDigits;
+ tprops.maximumFractionDigits = fields->exportedProperties.maximumFractionDigits;
+ tprops.roundingIncrement = fields->exportedProperties.roundingIncrement;
}
result = PatternStringUtils::propertiesToPatternString(tprops, localStatus);
return result;
}
UnicodeString& DecimalFormat::toLocalizedPattern(UnicodeString& result) const {
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ result.setToBogus();
+ return result;
+ }
ErrorCode localStatus;
result = toPattern(result);
result = PatternStringUtils::convertLocalized(result, *fields->symbols, true, localStatus);
@@ -961,6 +1331,13 @@ void DecimalFormat::applyPattern(const UnicodeString& pattern, UParseError&, UEr
}
void DecimalFormat::applyPattern(const UnicodeString& pattern, UErrorCode& status) {
+ // don't overwrite status if it's already a failure.
+ if (U_FAILURE(status)) { return; }
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
setPropertiesFromPattern(pattern, IGNORE_ROUNDING_NEVER, status);
touch(status);
}
@@ -972,117 +1349,159 @@ void DecimalFormat::applyLocalizedPattern(const UnicodeString& localizedPattern,
}
void DecimalFormat::applyLocalizedPattern(const UnicodeString& localizedPattern, UErrorCode& status) {
- if (U_SUCCESS(status)) {
- UnicodeString pattern = PatternStringUtils::convertLocalized(
- localizedPattern, *fields->symbols, false, status);
- applyPattern(pattern, status);
+ // don't overwrite status if it's already a failure.
+ if (U_FAILURE(status)) { return; }
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return;
}
+ UnicodeString pattern = PatternStringUtils::convertLocalized(
+ localizedPattern, *fields->symbols, false, status);
+ applyPattern(pattern, status);
}
void DecimalFormat::setMaximumIntegerDigits(int32_t newValue) {
- if (newValue == fields->properties->maximumIntegerDigits) { return; }
+ if (fields == nullptr) { return; }
+ if (newValue == fields->properties.maximumIntegerDigits) { return; }
// For backwards compatibility, conflicting min/max need to keep the most recent setting.
- int32_t min = fields->properties->minimumIntegerDigits;
+ int32_t min = fields->properties.minimumIntegerDigits;
if (min >= 0 && min > newValue) {
- fields->properties->minimumIntegerDigits = newValue;
+ fields->properties.minimumIntegerDigits = newValue;
}
- fields->properties->maximumIntegerDigits = newValue;
+ fields->properties.maximumIntegerDigits = newValue;
touchNoError();
}
void DecimalFormat::setMinimumIntegerDigits(int32_t newValue) {
- if (newValue == fields->properties->minimumIntegerDigits) { return; }
+ if (fields == nullptr) { return; }
+ if (newValue == fields->properties.minimumIntegerDigits) { return; }
// For backwards compatibility, conflicting min/max need to keep the most recent setting.
- int32_t max = fields->properties->maximumIntegerDigits;
+ int32_t max = fields->properties.maximumIntegerDigits;
if (max >= 0 && max < newValue) {
- fields->properties->maximumIntegerDigits = newValue;
+ fields->properties.maximumIntegerDigits = newValue;
}
- fields->properties->minimumIntegerDigits = newValue;
+ fields->properties.minimumIntegerDigits = newValue;
touchNoError();
}
void DecimalFormat::setMaximumFractionDigits(int32_t newValue) {
- if (newValue == fields->properties->maximumFractionDigits) { return; }
+ if (fields == nullptr) { return; }
+ if (newValue == fields->properties.maximumFractionDigits) { return; }
+ // cap for backward compatibility, formerly 340, now 999
+ if (newValue > kMaxIntFracSig) {
+ newValue = kMaxIntFracSig;
+ }
// For backwards compatibility, conflicting min/max need to keep the most recent setting.
- int32_t min = fields->properties->minimumFractionDigits;
+ int32_t min = fields->properties.minimumFractionDigits;
if (min >= 0 && min > newValue) {
- fields->properties->minimumFractionDigits = newValue;
+ fields->properties.minimumFractionDigits = newValue;
}
- fields->properties->maximumFractionDigits = newValue;
+ fields->properties.maximumFractionDigits = newValue;
touchNoError();
}
void DecimalFormat::setMinimumFractionDigits(int32_t newValue) {
- if (newValue == fields->properties->minimumFractionDigits) { return; }
+ if (fields == nullptr) { return; }
+ if (newValue == fields->properties.minimumFractionDigits) { return; }
// For backwards compatibility, conflicting min/max need to keep the most recent setting.
- int32_t max = fields->properties->maximumFractionDigits;
+ int32_t max = fields->properties.maximumFractionDigits;
if (max >= 0 && max < newValue) {
- fields->properties->maximumFractionDigits = newValue;
+ fields->properties.maximumFractionDigits = newValue;
}
- fields->properties->minimumFractionDigits = newValue;
+ fields->properties.minimumFractionDigits = newValue;
touchNoError();
}
int32_t DecimalFormat::getMinimumSignificantDigits() const {
- return fields->exportedProperties->minimumSignificantDigits;
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ return DecimalFormatProperties::getDefault().minimumSignificantDigits;
+ }
+ return fields->exportedProperties.minimumSignificantDigits;
}
int32_t DecimalFormat::getMaximumSignificantDigits() const {
- return fields->exportedProperties->maximumSignificantDigits;
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ return DecimalFormatProperties::getDefault().maximumSignificantDigits;
+ }
+ return fields->exportedProperties.maximumSignificantDigits;
}
void DecimalFormat::setMinimumSignificantDigits(int32_t value) {
- if (value == fields->properties->minimumSignificantDigits) { return; }
- int32_t max = fields->properties->maximumSignificantDigits;
+ if (fields == nullptr) { return; }
+ if (value == fields->properties.minimumSignificantDigits) { return; }
+ int32_t max = fields->properties.maximumSignificantDigits;
if (max >= 0 && max < value) {
- fields->properties->maximumSignificantDigits = value;
+ fields->properties.maximumSignificantDigits = value;
}
- fields->properties->minimumSignificantDigits = value;
+ fields->properties.minimumSignificantDigits = value;
touchNoError();
}
void DecimalFormat::setMaximumSignificantDigits(int32_t value) {
- if (value == fields->properties->maximumSignificantDigits) { return; }
- int32_t min = fields->properties->minimumSignificantDigits;
+ if (fields == nullptr) { return; }
+ if (value == fields->properties.maximumSignificantDigits) { return; }
+ int32_t min = fields->properties.minimumSignificantDigits;
if (min >= 0 && min > value) {
- fields->properties->minimumSignificantDigits = value;
+ fields->properties.minimumSignificantDigits = value;
}
- fields->properties->maximumSignificantDigits = value;
+ fields->properties.maximumSignificantDigits = value;
touchNoError();
}
UBool DecimalFormat::areSignificantDigitsUsed() const {
- return fields->properties->minimumSignificantDigits != -1 || fields->properties->maximumSignificantDigits != -1;
+ const DecimalFormatProperties* dfp;
+ // Not much we can do to report an error.
+ if (fields == nullptr) {
+ // Fallback to using the default instance of DecimalFormatProperties.
+ dfp = &(DecimalFormatProperties::getDefault());
+ } else {
+ dfp = &fields->properties;
+ }
+ return dfp->minimumSignificantDigits != -1 || dfp->maximumSignificantDigits != -1;
}
void DecimalFormat::setSignificantDigitsUsed(UBool useSignificantDigits) {
+ if (fields == nullptr) { return; }
+
// These are the default values from the old implementation.
if (useSignificantDigits) {
- if (fields->properties->minimumSignificantDigits != -1 ||
- fields->properties->maximumSignificantDigits != -1) {
+ if (fields->properties.minimumSignificantDigits != -1 ||
+ fields->properties.maximumSignificantDigits != -1) {
return;
}
} else {
- if (fields->properties->minimumSignificantDigits == -1 &&
- fields->properties->maximumSignificantDigits == -1) {
+ if (fields->properties.minimumSignificantDigits == -1 &&
+ fields->properties.maximumSignificantDigits == -1) {
return;
}
}
int32_t minSig = useSignificantDigits ? 1 : -1;
int32_t maxSig = useSignificantDigits ? 6 : -1;
- fields->properties->minimumSignificantDigits = minSig;
- fields->properties->maximumSignificantDigits = maxSig;
+ fields->properties.minimumSignificantDigits = minSig;
+ fields->properties.maximumSignificantDigits = maxSig;
touchNoError();
}
void DecimalFormat::setCurrency(const char16_t* theCurrency, UErrorCode& ec) {
+ // don't overwrite ec if it's already a failure.
+ if (U_FAILURE(ec)) { return; }
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ ec = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
CurrencyUnit currencyUnit(theCurrency, ec);
if (U_FAILURE(ec)) { return; }
- if (!fields->properties->currency.isNull() && fields->properties->currency.getNoError() == currencyUnit) {
+ if (!fields->properties.currency.isNull() && fields->properties.currency.getNoError() == currencyUnit) {
return;
}
NumberFormat::setCurrency(theCurrency, ec); // to set field for compatibility
- fields->properties->currency = currencyUnit;
+ fields->properties.currency = currencyUnit;
// TODO: Set values in fields->symbols, too?
touchNoError();
}
@@ -1093,47 +1512,78 @@ void DecimalFormat::setCurrency(const char16_t* theCurrency) {
}
void DecimalFormat::setCurrencyUsage(UCurrencyUsage newUsage, UErrorCode* ec) {
- if (U_FAILURE(*ec)) {
+ // don't overwrite ec if it's already a failure.
+ if (U_FAILURE(*ec)) { return; }
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ *ec = U_MEMORY_ALLOCATION_ERROR;
return;
}
- if (!fields->properties->currencyUsage.isNull() && newUsage == fields->properties->currencyUsage.getNoError()) {
+ if (!fields->properties.currencyUsage.isNull() && newUsage == fields->properties.currencyUsage.getNoError()) {
return;
}
- fields->properties->currencyUsage = newUsage;
+ fields->properties.currencyUsage = newUsage;
touch(*ec);
}
UCurrencyUsage DecimalFormat::getCurrencyUsage() const {
// CurrencyUsage is not exported, so we have to get it from the input property bag.
// TODO: Should we export CurrencyUsage instead?
- if (fields->properties->currencyUsage.isNull()) {
+ if (fields == nullptr || fields->properties.currencyUsage.isNull()) {
return UCURR_USAGE_STANDARD;
}
- return fields->properties->currencyUsage.getNoError();
+ return fields->properties.currencyUsage.getNoError();
}
void
DecimalFormat::formatToDecimalQuantity(double number, DecimalQuantity& output, UErrorCode& status) const {
- fields->formatter->formatDouble(number, status).getDecimalQuantity(output, status);
+ // don't overwrite status if it's already a failure.
+ if (U_FAILURE(status)) { return; }
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ fields->formatter.formatDouble(number, status).getDecimalQuantity(output, status);
}
void DecimalFormat::formatToDecimalQuantity(const Formattable& number, DecimalQuantity& output,
UErrorCode& status) const {
+ // don't overwrite status if it's already a failure.
+ if (U_FAILURE(status)) { return; }
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
UFormattedNumberData obj;
number.populateDecimalQuantity(obj.quantity, status);
- fields->formatter->formatImpl(&obj, status);
+ fields->formatter.formatImpl(&obj, status);
output = std::move(obj.quantity);
}
-const number::LocalizedNumberFormatter& DecimalFormat::toNumberFormatter() const {
- return *fields->formatter;
+const number::LocalizedNumberFormatter* DecimalFormat::toNumberFormatter(UErrorCode& status) const {
+ // We sometimes need to return nullptr here (see ICU-20380)
+ if (U_FAILURE(status)) { return nullptr; }
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return nullptr;
+ }
+ return &fields->formatter;
}
/** Rebuilds the formatter object from the property bag. */
void DecimalFormat::touch(UErrorCode& status) {
- if (fields->exportedProperties == nullptr) {
- // fields->exportedProperties is null only when the formatter is not ready yet.
- // The only time when this happens is during legacy deserialization.
+ if (U_FAILURE(status)) {
+ return;
+ }
+ if (fields == nullptr) {
+ // We only get here if an OOM error happend during construction, copy construction, assignment, or modification.
+ // For regular construction, the caller should have checked the status variable for errors.
+ // For copy construction, there is unfortunately nothing to report the error, so we need to guard against
+ // this possible bad state here and set the status to an error.
+ status = U_MEMORY_ALLOCATION_ERROR;
return;
}
@@ -1141,14 +1591,15 @@ void DecimalFormat::touch(UErrorCode& status) {
Locale locale = fields->symbols->getLocale();
// Note: The formatter is relatively cheap to create, and we need it to populate fields->exportedProperties,
- // so automatically compute it here. The parser is a bit more expensive and is not needed until the
+ // so automatically recompute it here. The parser is a bit more expensive and is not needed until the
// parse method is called, so defer that until needed.
// TODO: Only update the pieces that changed instead of re-computing the whole formatter?
- fields->formatter.adoptInstead(
- new LocalizedNumberFormatter(
- NumberPropertyMapper::create(
- *fields->properties, *fields->symbols, fields->warehouse, *fields->exportedProperties, status).locale(
- locale)));
+
+ // Since memory has already been allocated for the formatter, we can move assign a stack-allocated object
+ // and don't need to call new. (Which is slower and could possibly fail).
+ fields->formatter = NumberPropertyMapper::create(
+ fields->properties, *fields->symbols, fields->warehouse, fields->exportedProperties, status
+ ).locale(locale);
// Do this after fields->exportedProperties are set up
setupFastFormat();
@@ -1158,13 +1609,13 @@ void DecimalFormat::touch(UErrorCode& status) {
delete fields->atomicCurrencyParser.exchange(nullptr);
// In order for the getters to work, we need to populate some fields in NumberFormat.
- NumberFormat::setCurrency(fields->exportedProperties->currency.get(status).getISOCurrency(), status);
- NumberFormat::setMaximumIntegerDigits(fields->exportedProperties->maximumIntegerDigits);
- NumberFormat::setMinimumIntegerDigits(fields->exportedProperties->minimumIntegerDigits);
- NumberFormat::setMaximumFractionDigits(fields->exportedProperties->maximumFractionDigits);
- NumberFormat::setMinimumFractionDigits(fields->exportedProperties->minimumFractionDigits);
+ NumberFormat::setCurrency(fields->exportedProperties.currency.get(status).getISOCurrency(), status);
+ NumberFormat::setMaximumIntegerDigits(fields->exportedProperties.maximumIntegerDigits);
+ NumberFormat::setMinimumIntegerDigits(fields->exportedProperties.minimumIntegerDigits);
+ NumberFormat::setMaximumFractionDigits(fields->exportedProperties.maximumFractionDigits);
+ NumberFormat::setMinimumFractionDigits(fields->exportedProperties.minimumFractionDigits);
// fImpl->properties, not fields->exportedProperties, since this information comes from the pattern:
- NumberFormat::setGroupingUsed(fields->properties->groupingUsed);
+ NumberFormat::setGroupingUsed(fields->properties.groupingUsed);
}
void DecimalFormat::touchNoError() {
@@ -1177,7 +1628,7 @@ void DecimalFormat::setPropertiesFromPattern(const UnicodeString& pattern, int32
if (U_SUCCESS(status)) {
// Cast workaround to get around putting the enum in the public header file
auto actualIgnoreRounding = static_cast<IgnoreRounding>(ignoreRounding);
- PatternParser::parseToExistingProperties(pattern, *fields->properties, actualIgnoreRounding, status);
+ PatternParser::parseToExistingProperties(pattern, fields->properties, actualIgnoreRounding, status);
}
}
@@ -1196,7 +1647,7 @@ const numparse::impl::NumberParserImpl* DecimalFormat::getParser(UErrorCode& sta
}
// Try computing the parser on our own
- auto* temp = NumberParserImpl::createParserFromProperties(*fields->properties, *fields->symbols, false, status);
+ auto* temp = NumberParserImpl::createParserFromProperties(fields->properties, *fields->symbols, false, status);
if (U_FAILURE(status)) {
return nullptr;
}
@@ -1229,7 +1680,7 @@ const numparse::impl::NumberParserImpl* DecimalFormat::getCurrencyParser(UErrorC
}
// Try computing the parser on our own
- auto* temp = NumberParserImpl::createParserFromProperties(*fields->properties, *fields->symbols, true, status);
+ auto* temp = NumberParserImpl::createParserFromProperties(fields->properties, *fields->symbols, true, status);
if (temp == nullptr) {
status = U_MEMORY_ALLOCATION_ERROR;
// although we may still dereference, call sites should be guarded
@@ -1251,6 +1702,7 @@ const numparse::impl::NumberParserImpl* DecimalFormat::getCurrencyParser(UErrorC
void
DecimalFormat::fieldPositionHelper(const number::FormattedNumber& formatted, FieldPosition& fieldPosition,
int32_t offset, UErrorCode& status) {
+ if (U_FAILURE(status)) { return; }
// always return first occurrence:
fieldPosition.setBeginIndex(0);
fieldPosition.setEndIndex(0);
@@ -1264,7 +1716,7 @@ DecimalFormat::fieldPositionHelper(const number::FormattedNumber& formatted, Fie
void
DecimalFormat::fieldPositionIteratorHelper(const number::FormattedNumber& formatted, FieldPositionIterator* fpi,
int32_t offset, UErrorCode& status) {
- if (fpi != nullptr) {
+ if (U_SUCCESS(status) && (fpi != nullptr)) {
FieldPositionIteratorHandler fpih(fpi, status);
fpih.setShift(offset);
formatted.getAllFieldPositionsImpl(fpih, status);
@@ -1276,7 +1728,7 @@ DecimalFormat::fieldPositionIteratorHelper(const number::FormattedNumber& format
void DecimalFormat::setupFastFormat() {
// Check the majority of properties:
- if (!fields->properties->equalsDefaultExceptFastFormat()) {
+ if (!fields->properties.equalsDefaultExceptFastFormat()) {
trace("no fast format: equality\n");
fields->canUseFastFormat = false;
return;
@@ -1284,12 +1736,12 @@ void DecimalFormat::setupFastFormat() {
// Now check the remaining properties.
// Nontrivial affixes:
- UBool trivialPP = fields->properties->positivePrefixPattern.isEmpty();
- UBool trivialPS = fields->properties->positiveSuffixPattern.isEmpty();
- UBool trivialNP = fields->properties->negativePrefixPattern.isBogus() || (
- fields->properties->negativePrefixPattern.length() == 1 &&
- fields->properties->negativePrefixPattern.charAt(0) == u'-');
- UBool trivialNS = fields->properties->negativeSuffixPattern.isEmpty();
+ UBool trivialPP = fields->properties.positivePrefixPattern.isEmpty();
+ UBool trivialPS = fields->properties.positiveSuffixPattern.isEmpty();
+ UBool trivialNP = fields->properties.negativePrefixPattern.isBogus() || (
+ fields->properties.negativePrefixPattern.length() == 1 &&
+ fields->properties.negativePrefixPattern.charAt(0) == u'-');
+ UBool trivialNS = fields->properties.negativeSuffixPattern.isEmpty();
if (!trivialPP || !trivialPS || !trivialNP || !trivialNS) {
trace("no fast format: affixes\n");
fields->canUseFastFormat = false;
@@ -1297,8 +1749,8 @@ void DecimalFormat::setupFastFormat() {
}
// Grouping (secondary grouping is forbidden in equalsDefaultExceptFastFormat):
- bool groupingUsed = fields->properties->groupingUsed;
- int32_t groupingSize = fields->properties->groupingSize;
+ bool groupingUsed = fields->properties.groupingUsed;
+ int32_t groupingSize = fields->properties.groupingSize;
bool unusualGroupingSize = groupingSize > 0 && groupingSize != 3;
const UnicodeString& groupingString = fields->symbols->getConstSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol);
if (groupingUsed && (unusualGroupingSize || groupingString.length() != 1)) {
@@ -1308,8 +1760,8 @@ void DecimalFormat::setupFastFormat() {
}
// Integer length:
- int32_t minInt = fields->exportedProperties->minimumIntegerDigits;
- int32_t maxInt = fields->exportedProperties->maximumIntegerDigits;
+ int32_t minInt = fields->exportedProperties.minimumIntegerDigits;
+ int32_t maxInt = fields->exportedProperties.maximumIntegerDigits;
// Fastpath supports up to only 10 digits (length of INT32_MIN)
if (minInt > 10) {
trace("no fast format: integer\n");
@@ -1318,7 +1770,7 @@ void DecimalFormat::setupFastFormat() {
}
// Fraction length (no fraction part allowed in fast path):
- int32_t minFrac = fields->exportedProperties->minimumFractionDigits;
+ int32_t minFrac = fields->exportedProperties.minimumFractionDigits;
if (minFrac > 0) {
trace("no fast format: fraction\n");
fields->canUseFastFormat = false;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-bignum-dtoa.cpp b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-bignum-dtoa.cpp
index 07d0b0eb0f8..a95910df042 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-bignum-dtoa.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-bignum-dtoa.cpp
@@ -34,7 +34,7 @@
#include "unicode/utypes.h"
#if !UCONFIG_NO_FORMATTING
-#include <math.h>
+#include <cmath>
// ICU PATCH: Customize header file paths for ICU.
@@ -49,7 +49,7 @@ U_NAMESPACE_BEGIN
namespace double_conversion {
static int NormalizedExponent(uint64_t significand, int exponent) {
- ASSERT(significand != 0);
+ DOUBLE_CONVERSION_ASSERT(significand != 0);
while ((significand & Double::kHiddenBit) == 0) {
significand = significand << 1;
exponent = exponent - 1;
@@ -90,26 +90,26 @@ static void GenerateShortestDigits(Bignum* numerator, Bignum* denominator,
// Generates 'requested_digits' after the decimal point.
static void BignumToFixed(int requested_digits, int* decimal_point,
Bignum* numerator, Bignum* denominator,
- Vector<char>(buffer), int* length);
+ Vector<char> buffer, int* length);
// Generates 'count' digits of numerator/denominator.
// Once 'count' digits have been produced rounds the result depending on the
// remainder (remainders of exactly .5 round upwards). Might update the
// decimal_point when rounding up (for example for 0.9999).
static void GenerateCountedDigits(int count, int* decimal_point,
Bignum* numerator, Bignum* denominator,
- Vector<char>(buffer), int* length);
+ Vector<char> buffer, int* length);
void BignumDtoa(double v, BignumDtoaMode mode, int requested_digits,
Vector<char> buffer, int* length, int* decimal_point) {
- ASSERT(v > 0);
- ASSERT(!Double(v).IsSpecial());
+ DOUBLE_CONVERSION_ASSERT(v > 0);
+ DOUBLE_CONVERSION_ASSERT(!Double(v).IsSpecial());
uint64_t significand;
int exponent;
bool lower_boundary_is_closer;
if (mode == BIGNUM_DTOA_SHORTEST_SINGLE) {
float f = static_cast<float>(v);
- ASSERT(f == v);
+ DOUBLE_CONVERSION_ASSERT(f == v);
significand = Single(f).Significand();
exponent = Single(f).Exponent();
lower_boundary_is_closer = Single(f).LowerBoundaryIsCloser();
@@ -148,7 +148,7 @@ void BignumDtoa(double v, BignumDtoaMode mode, int requested_digits,
// 4e-324. In this case the denominator needs fewer than 324*4 binary digits.
// The maximum double is 1.7976931348623157e308 which needs fewer than
// 308*4 binary digits.
- ASSERT(Bignum::kMaxSignificantBits >= 324*4);
+ DOUBLE_CONVERSION_ASSERT(Bignum::kMaxSignificantBits >= 324*4);
InitialScaledStartValues(significand, exponent, lower_boundary_is_closer,
estimated_power, need_boundary_deltas,
&numerator, &denominator,
@@ -177,7 +177,7 @@ void BignumDtoa(double v, BignumDtoaMode mode, int requested_digits,
buffer, length);
break;
default:
- UNREACHABLE();
+ DOUBLE_CONVERSION_UNREACHABLE();
}
buffer[*length] = '\0';
}
@@ -209,7 +209,7 @@ static void GenerateShortestDigits(Bignum* numerator, Bignum* denominator,
for (;;) {
uint16_t digit;
digit = numerator->DivideModuloIntBignum(*denominator);
- ASSERT(digit <= 9); // digit is a uint16_t and therefore always positive.
+ DOUBLE_CONVERSION_ASSERT(digit <= 9); // digit is a uint16_t and therefore always positive.
// digit = numerator / denominator (integer division).
// numerator = numerator % denominator.
buffer[(*length)++] = static_cast<char>(digit + '0');
@@ -255,7 +255,7 @@ static void GenerateShortestDigits(Bignum* numerator, Bignum* denominator,
// loop would have stopped earlier.
// We still have an assert here in case the preconditions were not
// satisfied.
- ASSERT(buffer[(*length) - 1] != '9');
+ DOUBLE_CONVERSION_ASSERT(buffer[(*length) - 1] != '9');
buffer[(*length) - 1]++;
} else {
// Halfway case.
@@ -266,7 +266,7 @@ static void GenerateShortestDigits(Bignum* numerator, Bignum* denominator,
if ((buffer[(*length) - 1] - '0') % 2 == 0) {
// Round down => Do nothing.
} else {
- ASSERT(buffer[(*length) - 1] != '9');
+ DOUBLE_CONVERSION_ASSERT(buffer[(*length) - 1] != '9');
buffer[(*length) - 1]++;
}
}
@@ -278,9 +278,9 @@ static void GenerateShortestDigits(Bignum* numerator, Bignum* denominator,
// Round up.
// Note again that the last digit could not be '9' since this would have
// stopped the loop earlier.
- // We still have an ASSERT here, in case the preconditions were not
+ // We still have an DOUBLE_CONVERSION_ASSERT here, in case the preconditions were not
// satisfied.
- ASSERT(buffer[(*length) -1] != '9');
+ DOUBLE_CONVERSION_ASSERT(buffer[(*length) -1] != '9');
buffer[(*length) - 1]++;
return;
}
@@ -297,11 +297,11 @@ static void GenerateShortestDigits(Bignum* numerator, Bignum* denominator,
static void GenerateCountedDigits(int count, int* decimal_point,
Bignum* numerator, Bignum* denominator,
Vector<char> buffer, int* length) {
- ASSERT(count >= 0);
+ DOUBLE_CONVERSION_ASSERT(count >= 0);
for (int i = 0; i < count - 1; ++i) {
uint16_t digit;
digit = numerator->DivideModuloIntBignum(*denominator);
- ASSERT(digit <= 9); // digit is a uint16_t and therefore always positive.
+ DOUBLE_CONVERSION_ASSERT(digit <= 9); // digit is a uint16_t and therefore always positive.
// digit = numerator / denominator (integer division).
// numerator = numerator % denominator.
buffer[i] = static_cast<char>(digit + '0');
@@ -314,7 +314,7 @@ static void GenerateCountedDigits(int count, int* decimal_point,
if (Bignum::PlusCompare(*numerator, *numerator, *denominator) >= 0) {
digit++;
}
- ASSERT(digit <= 10);
+ DOUBLE_CONVERSION_ASSERT(digit <= 10);
buffer[count - 1] = static_cast<char>(digit + '0');
// Correct bad digits (in case we had a sequence of '9's). Propagate the
// carry until we hat a non-'9' or til we reach the first digit.
@@ -339,7 +339,7 @@ static void GenerateCountedDigits(int count, int* decimal_point,
// Input verifies: 1 <= (numerator + delta) / denominator < 10.
static void BignumToFixed(int requested_digits, int* decimal_point,
Bignum* numerator, Bignum* denominator,
- Vector<char>(buffer), int* length) {
+ Vector<char> buffer, int* length) {
// Note that we have to look at more than just the requested_digits, since
// a number could be rounded up. Example: v=0.5 with requested_digits=0.
// Even though the power of v equals 0 we can't just stop here.
@@ -355,7 +355,7 @@ static void BignumToFixed(int requested_digits, int* decimal_point,
} else if (-(*decimal_point) == requested_digits) {
// We only need to verify if the number rounds down or up.
// Ex: 0.04 and 0.06 with requested_digits == 1.
- ASSERT(*decimal_point == -requested_digits);
+ DOUBLE_CONVERSION_ASSERT(*decimal_point == -requested_digits);
// Initially the fraction lies in range (1, 10]. Multiply the denominator
// by 10 so that we can compare more easily.
denominator->Times10();
@@ -434,7 +434,7 @@ static void InitialScaledStartValuesPositiveExponent(
Bignum* numerator, Bignum* denominator,
Bignum* delta_minus, Bignum* delta_plus) {
// A positive exponent implies a positive power.
- ASSERT(estimated_power >= 0);
+ DOUBLE_CONVERSION_ASSERT(estimated_power >= 0);
// Since the estimated_power is positive we simply multiply the denominator
// by 10^estimated_power.
@@ -520,7 +520,7 @@ static void InitialScaledStartValuesNegativeExponentNegativePower(
// numerator = v * 10^-estimated_power * 2 * 2^-exponent.
// Remember: numerator has been abused as power_ten. So no need to assign it
// to itself.
- ASSERT(numerator == power_ten);
+ DOUBLE_CONVERSION_ASSERT(numerator == power_ten);
numerator->MultiplyByUInt64(significand);
// denominator = 2 * 2^-exponent with exponent < 0.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-bignum.cpp b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-bignum.cpp
index d5682af35f8..996d75c9f60 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-bignum.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-bignum.cpp
@@ -34,6 +34,9 @@
#include "unicode/utypes.h"
#if !UCONFIG_NO_FORMATTING
+#include <algorithm>
+#include <cstring>
+
// ICU PATCH: Customize header file paths for ICU.
#include "double-conversion-bignum.h"
@@ -44,136 +47,129 @@ U_NAMESPACE_BEGIN
namespace double_conversion {
-Bignum::Bignum()
- : bigits_(bigits_buffer_, kBigitCapacity), used_digits_(0), exponent_(0) {
- for (int i = 0; i < kBigitCapacity; ++i) {
- bigits_[i] = 0;
- }
+Bignum::Chunk& Bignum::RawBigit(const int index) {
+ DOUBLE_CONVERSION_ASSERT(static_cast<unsigned>(index) < kBigitCapacity);
+ return bigits_buffer_[index];
+}
+
+
+const Bignum::Chunk& Bignum::RawBigit(const int index) const {
+ DOUBLE_CONVERSION_ASSERT(static_cast<unsigned>(index) < kBigitCapacity);
+ return bigits_buffer_[index];
}
template<typename S>
-static int BitSize(S value) {
+static int BitSize(const S value) {
(void) value; // Mark variable as used.
return 8 * sizeof(value);
}
// Guaranteed to lie in one Bigit.
-void Bignum::AssignUInt16(uint16_t value) {
- ASSERT(kBigitSize >= BitSize(value));
+void Bignum::AssignUInt16(const uint16_t value) {
+ DOUBLE_CONVERSION_ASSERT(kBigitSize >= BitSize(value));
Zero();
- if (value == 0) return;
-
- EnsureCapacity(1);
- bigits_[0] = value;
- used_digits_ = 1;
+ if (value > 0) {
+ RawBigit(0) = value;
+ used_bigits_ = 1;
+ }
}
void Bignum::AssignUInt64(uint64_t value) {
- const int kUInt64Size = 64;
-
Zero();
- if (value == 0) return;
-
- int needed_bigits = kUInt64Size / kBigitSize + 1;
- EnsureCapacity(needed_bigits);
- for (int i = 0; i < needed_bigits; ++i) {
- bigits_[i] = value & kBigitMask;
- value = value >> kBigitSize;
+ for(int i = 0; value > 0; ++i) {
+ RawBigit(i) = value & kBigitMask;
+ value >>= kBigitSize;
+ ++used_bigits_;
}
- used_digits_ = needed_bigits;
- Clamp();
}
void Bignum::AssignBignum(const Bignum& other) {
exponent_ = other.exponent_;
- for (int i = 0; i < other.used_digits_; ++i) {
- bigits_[i] = other.bigits_[i];
+ for (int i = 0; i < other.used_bigits_; ++i) {
+ RawBigit(i) = other.RawBigit(i);
}
- // Clear the excess digits (if there were any).
- for (int i = other.used_digits_; i < used_digits_; ++i) {
- bigits_[i] = 0;
- }
- used_digits_ = other.used_digits_;
+ used_bigits_ = other.used_bigits_;
}
-static uint64_t ReadUInt64(Vector<const char> buffer,
- int from,
- int digits_to_read) {
+static uint64_t ReadUInt64(const Vector<const char> buffer,
+ const int from,
+ const int digits_to_read) {
uint64_t result = 0;
for (int i = from; i < from + digits_to_read; ++i) {
- int digit = buffer[i] - '0';
- ASSERT(0 <= digit && digit <= 9);
+ const int digit = buffer[i] - '0';
+ DOUBLE_CONVERSION_ASSERT(0 <= digit && digit <= 9);
result = result * 10 + digit;
}
return result;
}
-void Bignum::AssignDecimalString(Vector<const char> value) {
+void Bignum::AssignDecimalString(const Vector<const char> value) {
// 2^64 = 18446744073709551616 > 10^19
- const int kMaxUint64DecimalDigits = 19;
+ static const int kMaxUint64DecimalDigits = 19;
Zero();
int length = value.length();
- unsigned int pos = 0;
+ unsigned pos = 0;
// Let's just say that each digit needs 4 bits.
while (length >= kMaxUint64DecimalDigits) {
- uint64_t digits = ReadUInt64(value, pos, kMaxUint64DecimalDigits);
+ const uint64_t digits = ReadUInt64(value, pos, kMaxUint64DecimalDigits);
pos += kMaxUint64DecimalDigits;
length -= kMaxUint64DecimalDigits;
MultiplyByPowerOfTen(kMaxUint64DecimalDigits);
AddUInt64(digits);
}
- uint64_t digits = ReadUInt64(value, pos, length);
+ const uint64_t digits = ReadUInt64(value, pos, length);
MultiplyByPowerOfTen(length);
AddUInt64(digits);
Clamp();
}
-static int HexCharValue(char c) {
- if ('0' <= c && c <= '9') return c - '0';
- if ('a' <= c && c <= 'f') return 10 + c - 'a';
- ASSERT('A' <= c && c <= 'F');
+static uint64_t HexCharValue(const int c) {
+ if ('0' <= c && c <= '9') {
+ return c - '0';
+ }
+ if ('a' <= c && c <= 'f') {
+ return 10 + c - 'a';
+ }
+ DOUBLE_CONVERSION_ASSERT('A' <= c && c <= 'F');
return 10 + c - 'A';
}
+// Unlike AssignDecimalString(), this function is "only" used
+// for unit-tests and therefore not performance critical.
void Bignum::AssignHexString(Vector<const char> value) {
Zero();
- int length = value.length();
-
- int needed_bigits = length * 4 / kBigitSize + 1;
- EnsureCapacity(needed_bigits);
- int string_index = length - 1;
- for (int i = 0; i < needed_bigits - 1; ++i) {
- // These bigits are guaranteed to be "full".
- Chunk current_bigit = 0;
- for (int j = 0; j < kBigitSize / 4; j++) {
- current_bigit += HexCharValue(value[string_index--]) << (j * 4);
+ // Required capacity could be reduced by ignoring leading zeros.
+ EnsureCapacity(((value.length() * 4) + kBigitSize - 1) / kBigitSize);
+ DOUBLE_CONVERSION_ASSERT(sizeof(uint64_t) * 8 >= kBigitSize + 4); // TODO: static_assert
+ // Accumulates converted hex digits until at least kBigitSize bits.
+ // Works with non-factor-of-four kBigitSizes.
+ uint64_t tmp = 0; // Accumulates converted hex digits until at least
+ for (int cnt = 0; !value.is_empty(); value.pop_back()) {
+ tmp |= (HexCharValue(value.last()) << cnt);
+ if ((cnt += 4) >= kBigitSize) {
+ RawBigit(used_bigits_++) = (tmp & kBigitMask);
+ cnt -= kBigitSize;
+ tmp >>= kBigitSize;
}
- bigits_[i] = current_bigit;
- }
- used_digits_ = needed_bigits - 1;
-
- Chunk most_significant_bigit = 0; // Could be = 0;
- for (int j = 0; j <= string_index; ++j) {
- most_significant_bigit <<= 4;
- most_significant_bigit += HexCharValue(value[j]);
}
- if (most_significant_bigit != 0) {
- bigits_[used_digits_] = most_significant_bigit;
- used_digits_++;
+ if (tmp > 0) {
+ RawBigit(used_bigits_++) = tmp;
}
Clamp();
}
-void Bignum::AddUInt64(uint64_t operand) {
- if (operand == 0) return;
+void Bignum::AddUInt64(const uint64_t operand) {
+ if (operand == 0) {
+ return;
+ }
Bignum other;
other.AssignUInt64(operand);
AddBignum(other);
@@ -181,8 +177,8 @@ void Bignum::AddUInt64(uint64_t operand) {
void Bignum::AddBignum(const Bignum& other) {
- ASSERT(IsClamped());
- ASSERT(other.IsClamped());
+ DOUBLE_CONVERSION_ASSERT(IsClamped());
+ DOUBLE_CONVERSION_ASSERT(other.IsClamped());
// If this has a greater exponent than other append zero-bigits to this.
// After this call exponent_ <= other.exponent_.
@@ -200,48 +196,52 @@ void Bignum::AddBignum(const Bignum& other) {
// cccccccccccc 0000
// In both cases we might need a carry bigit.
- EnsureCapacity(1 + Max(BigitLength(), other.BigitLength()) - exponent_);
+ EnsureCapacity(1 + (std::max)(BigitLength(), other.BigitLength()) - exponent_);
Chunk carry = 0;
int bigit_pos = other.exponent_ - exponent_;
- ASSERT(bigit_pos >= 0);
- for (int i = 0; i < other.used_digits_; ++i) {
- Chunk sum = bigits_[bigit_pos] + other.bigits_[i] + carry;
- bigits_[bigit_pos] = sum & kBigitMask;
+ DOUBLE_CONVERSION_ASSERT(bigit_pos >= 0);
+ for (int i = used_bigits_; i < bigit_pos; ++i) {
+ RawBigit(i) = 0;
+ }
+ for (int i = 0; i < other.used_bigits_; ++i) {
+ const Chunk my = (bigit_pos < used_bigits_) ? RawBigit(bigit_pos) : 0;
+ const Chunk sum = my + other.RawBigit(i) + carry;
+ RawBigit(bigit_pos) = sum & kBigitMask;
carry = sum >> kBigitSize;
- bigit_pos++;
+ ++bigit_pos;
}
-
while (carry != 0) {
- Chunk sum = bigits_[bigit_pos] + carry;
- bigits_[bigit_pos] = sum & kBigitMask;
+ const Chunk my = (bigit_pos < used_bigits_) ? RawBigit(bigit_pos) : 0;
+ const Chunk sum = my + carry;
+ RawBigit(bigit_pos) = sum & kBigitMask;
carry = sum >> kBigitSize;
- bigit_pos++;
+ ++bigit_pos;
}
- used_digits_ = Max(bigit_pos, used_digits_);
- ASSERT(IsClamped());
+ used_bigits_ = (std::max)(bigit_pos, static_cast<int>(used_bigits_));
+ DOUBLE_CONVERSION_ASSERT(IsClamped());
}
void Bignum::SubtractBignum(const Bignum& other) {
- ASSERT(IsClamped());
- ASSERT(other.IsClamped());
+ DOUBLE_CONVERSION_ASSERT(IsClamped());
+ DOUBLE_CONVERSION_ASSERT(other.IsClamped());
// We require this to be bigger than other.
- ASSERT(LessEqual(other, *this));
+ DOUBLE_CONVERSION_ASSERT(LessEqual(other, *this));
Align(other);
- int offset = other.exponent_ - exponent_;
+ const int offset = other.exponent_ - exponent_;
Chunk borrow = 0;
int i;
- for (i = 0; i < other.used_digits_; ++i) {
- ASSERT((borrow == 0) || (borrow == 1));
- Chunk difference = bigits_[i + offset] - other.bigits_[i] - borrow;
- bigits_[i + offset] = difference & kBigitMask;
+ for (i = 0; i < other.used_bigits_; ++i) {
+ DOUBLE_CONVERSION_ASSERT((borrow == 0) || (borrow == 1));
+ const Chunk difference = RawBigit(i + offset) - other.RawBigit(i) - borrow;
+ RawBigit(i + offset) = difference & kBigitMask;
borrow = difference >> (kChunkSize - 1);
}
while (borrow != 0) {
- Chunk difference = bigits_[i + offset] - borrow;
- bigits_[i + offset] = difference & kBigitMask;
+ const Chunk difference = RawBigit(i + offset) - borrow;
+ RawBigit(i + offset) = difference & kBigitMask;
borrow = difference >> (kChunkSize - 1);
++i;
}
@@ -249,91 +249,105 @@ void Bignum::SubtractBignum(const Bignum& other) {
}
-void Bignum::ShiftLeft(int shift_amount) {
- if (used_digits_ == 0) return;
- exponent_ += shift_amount / kBigitSize;
- int local_shift = shift_amount % kBigitSize;
- EnsureCapacity(used_digits_ + 1);
+void Bignum::ShiftLeft(const int shift_amount) {
+ if (used_bigits_ == 0) {
+ return;
+ }
+ exponent_ += (shift_amount / kBigitSize);
+ const int local_shift = shift_amount % kBigitSize;
+ EnsureCapacity(used_bigits_ + 1);
BigitsShiftLeft(local_shift);
}
-void Bignum::MultiplyByUInt32(uint32_t factor) {
- if (factor == 1) return;
+void Bignum::MultiplyByUInt32(const uint32_t factor) {
+ if (factor == 1) {
+ return;
+ }
if (factor == 0) {
Zero();
return;
}
- if (used_digits_ == 0) return;
-
+ if (used_bigits_ == 0) {
+ return;
+ }
// The product of a bigit with the factor is of size kBigitSize + 32.
// Assert that this number + 1 (for the carry) fits into double chunk.
- ASSERT(kDoubleChunkSize >= kBigitSize + 32 + 1);
+ DOUBLE_CONVERSION_ASSERT(kDoubleChunkSize >= kBigitSize + 32 + 1);
DoubleChunk carry = 0;
- for (int i = 0; i < used_digits_; ++i) {
- DoubleChunk product = static_cast<DoubleChunk>(factor) * bigits_[i] + carry;
- bigits_[i] = static_cast<Chunk>(product & kBigitMask);
+ for (int i = 0; i < used_bigits_; ++i) {
+ const DoubleChunk product = static_cast<DoubleChunk>(factor) * RawBigit(i) + carry;
+ RawBigit(i) = static_cast<Chunk>(product & kBigitMask);
carry = (product >> kBigitSize);
}
while (carry != 0) {
- EnsureCapacity(used_digits_ + 1);
- bigits_[used_digits_] = carry & kBigitMask;
- used_digits_++;
+ EnsureCapacity(used_bigits_ + 1);
+ RawBigit(used_bigits_) = carry & kBigitMask;
+ used_bigits_++;
carry >>= kBigitSize;
}
}
-void Bignum::MultiplyByUInt64(uint64_t factor) {
- if (factor == 1) return;
+void Bignum::MultiplyByUInt64(const uint64_t factor) {
+ if (factor == 1) {
+ return;
+ }
if (factor == 0) {
Zero();
return;
}
- ASSERT(kBigitSize < 32);
+ if (used_bigits_ == 0) {
+ return;
+ }
+ DOUBLE_CONVERSION_ASSERT(kBigitSize < 32);
uint64_t carry = 0;
- uint64_t low = factor & 0xFFFFFFFF;
- uint64_t high = factor >> 32;
- for (int i = 0; i < used_digits_; ++i) {
- uint64_t product_low = low * bigits_[i];
- uint64_t product_high = high * bigits_[i];
- uint64_t tmp = (carry & kBigitMask) + product_low;
- bigits_[i] = tmp & kBigitMask;
+ const uint64_t low = factor & 0xFFFFFFFF;
+ const uint64_t high = factor >> 32;
+ for (int i = 0; i < used_bigits_; ++i) {
+ const uint64_t product_low = low * RawBigit(i);
+ const uint64_t product_high = high * RawBigit(i);
+ const uint64_t tmp = (carry & kBigitMask) + product_low;
+ RawBigit(i) = tmp & kBigitMask;
carry = (carry >> kBigitSize) + (tmp >> kBigitSize) +
(product_high << (32 - kBigitSize));
}
while (carry != 0) {
- EnsureCapacity(used_digits_ + 1);
- bigits_[used_digits_] = carry & kBigitMask;
- used_digits_++;
+ EnsureCapacity(used_bigits_ + 1);
+ RawBigit(used_bigits_) = carry & kBigitMask;
+ used_bigits_++;
carry >>= kBigitSize;
}
}
-void Bignum::MultiplyByPowerOfTen(int exponent) {
- const uint64_t kFive27 = UINT64_2PART_C(0x6765c793, fa10079d);
- const uint16_t kFive1 = 5;
- const uint16_t kFive2 = kFive1 * 5;
- const uint16_t kFive3 = kFive2 * 5;
- const uint16_t kFive4 = kFive3 * 5;
- const uint16_t kFive5 = kFive4 * 5;
- const uint16_t kFive6 = kFive5 * 5;
- const uint32_t kFive7 = kFive6 * 5;
- const uint32_t kFive8 = kFive7 * 5;
- const uint32_t kFive9 = kFive8 * 5;
- const uint32_t kFive10 = kFive9 * 5;
- const uint32_t kFive11 = kFive10 * 5;
- const uint32_t kFive12 = kFive11 * 5;
- const uint32_t kFive13 = kFive12 * 5;
- const uint32_t kFive1_to_12[] =
+void Bignum::MultiplyByPowerOfTen(const int exponent) {
+ static const uint64_t kFive27 = DOUBLE_CONVERSION_UINT64_2PART_C(0x6765c793, fa10079d);
+ static const uint16_t kFive1 = 5;
+ static const uint16_t kFive2 = kFive1 * 5;
+ static const uint16_t kFive3 = kFive2 * 5;
+ static const uint16_t kFive4 = kFive3 * 5;
+ static const uint16_t kFive5 = kFive4 * 5;
+ static const uint16_t kFive6 = kFive5 * 5;
+ static const uint32_t kFive7 = kFive6 * 5;
+ static const uint32_t kFive8 = kFive7 * 5;
+ static const uint32_t kFive9 = kFive8 * 5;
+ static const uint32_t kFive10 = kFive9 * 5;
+ static const uint32_t kFive11 = kFive10 * 5;
+ static const uint32_t kFive12 = kFive11 * 5;
+ static const uint32_t kFive13 = kFive12 * 5;
+ static const uint32_t kFive1_to_12[] =
{ kFive1, kFive2, kFive3, kFive4, kFive5, kFive6,
kFive7, kFive8, kFive9, kFive10, kFive11, kFive12 };
- ASSERT(exponent >= 0);
- if (exponent == 0) return;
- if (used_digits_ == 0) return;
+ DOUBLE_CONVERSION_ASSERT(exponent >= 0);
+ if (exponent == 0) {
+ return;
+ }
+ if (used_bigits_ == 0) {
+ return;
+ }
// We shift by exponent at the end just before returning.
int remaining_exponent = exponent;
while (remaining_exponent >= 27) {
@@ -352,8 +366,8 @@ void Bignum::MultiplyByPowerOfTen(int exponent) {
void Bignum::Square() {
- ASSERT(IsClamped());
- int product_length = 2 * used_digits_;
+ DOUBLE_CONVERSION_ASSERT(IsClamped());
+ const int product_length = 2 * used_bigits_;
EnsureCapacity(product_length);
// Comba multiplication: compute each column separately.
@@ -368,64 +382,64 @@ void Bignum::Square() {
//
// Assert that the additional number of bits in a DoubleChunk are enough to
// sum up used_digits of Bigit*Bigit.
- if ((1 << (2 * (kChunkSize - kBigitSize))) <= used_digits_) {
- UNIMPLEMENTED();
+ if ((1 << (2 * (kChunkSize - kBigitSize))) <= used_bigits_) {
+ DOUBLE_CONVERSION_UNIMPLEMENTED();
}
DoubleChunk accumulator = 0;
// First shift the digits so we don't overwrite them.
- int copy_offset = used_digits_;
- for (int i = 0; i < used_digits_; ++i) {
- bigits_[copy_offset + i] = bigits_[i];
+ const int copy_offset = used_bigits_;
+ for (int i = 0; i < used_bigits_; ++i) {
+ RawBigit(copy_offset + i) = RawBigit(i);
}
// We have two loops to avoid some 'if's in the loop.
- for (int i = 0; i < used_digits_; ++i) {
+ for (int i = 0; i < used_bigits_; ++i) {
// Process temporary digit i with power i.
// The sum of the two indices must be equal to i.
int bigit_index1 = i;
int bigit_index2 = 0;
// Sum all of the sub-products.
while (bigit_index1 >= 0) {
- Chunk chunk1 = bigits_[copy_offset + bigit_index1];
- Chunk chunk2 = bigits_[copy_offset + bigit_index2];
+ const Chunk chunk1 = RawBigit(copy_offset + bigit_index1);
+ const Chunk chunk2 = RawBigit(copy_offset + bigit_index2);
accumulator += static_cast<DoubleChunk>(chunk1) * chunk2;
bigit_index1--;
bigit_index2++;
}
- bigits_[i] = static_cast<Chunk>(accumulator) & kBigitMask;
+ RawBigit(i) = static_cast<Chunk>(accumulator) & kBigitMask;
accumulator >>= kBigitSize;
}
- for (int i = used_digits_; i < product_length; ++i) {
- int bigit_index1 = used_digits_ - 1;
+ for (int i = used_bigits_; i < product_length; ++i) {
+ int bigit_index1 = used_bigits_ - 1;
int bigit_index2 = i - bigit_index1;
// Invariant: sum of both indices is again equal to i.
// Inner loop runs 0 times on last iteration, emptying accumulator.
- while (bigit_index2 < used_digits_) {
- Chunk chunk1 = bigits_[copy_offset + bigit_index1];
- Chunk chunk2 = bigits_[copy_offset + bigit_index2];
+ while (bigit_index2 < used_bigits_) {
+ const Chunk chunk1 = RawBigit(copy_offset + bigit_index1);
+ const Chunk chunk2 = RawBigit(copy_offset + bigit_index2);
accumulator += static_cast<DoubleChunk>(chunk1) * chunk2;
bigit_index1--;
bigit_index2++;
}
- // The overwritten bigits_[i] will never be read in further loop iterations,
+ // The overwritten RawBigit(i) will never be read in further loop iterations,
// because bigit_index1 and bigit_index2 are always greater
- // than i - used_digits_.
- bigits_[i] = static_cast<Chunk>(accumulator) & kBigitMask;
+ // than i - used_bigits_.
+ RawBigit(i) = static_cast<Chunk>(accumulator) & kBigitMask;
accumulator >>= kBigitSize;
}
// Since the result was guaranteed to lie inside the number the
// accumulator must be 0 now.
- ASSERT(accumulator == 0);
+ DOUBLE_CONVERSION_ASSERT(accumulator == 0);
// Don't forget to update the used_digits and the exponent.
- used_digits_ = product_length;
+ used_bigits_ = product_length;
exponent_ *= 2;
Clamp();
}
-void Bignum::AssignPowerUInt16(uint16_t base, int power_exponent) {
- ASSERT(base != 0);
- ASSERT(power_exponent >= 0);
+void Bignum::AssignPowerUInt16(uint16_t base, const int power_exponent) {
+ DOUBLE_CONVERSION_ASSERT(base != 0);
+ DOUBLE_CONVERSION_ASSERT(power_exponent >= 0);
if (power_exponent == 0) {
AssignUInt16(1);
return;
@@ -445,7 +459,7 @@ void Bignum::AssignPowerUInt16(uint16_t base, int power_exponent) {
tmp_base >>= 1;
bit_size++;
}
- int final_size = bit_size * power_exponent;
+ const int final_size = bit_size * power_exponent;
// 1 extra bigit for the shifting, and one for rounded final_size.
EnsureCapacity(final_size / kBigitSize + 2);
@@ -459,26 +473,27 @@ void Bignum::AssignPowerUInt16(uint16_t base, int power_exponent) {
mask >>= 2;
uint64_t this_value = base;
- bool delayed_multipliciation = false;
+ bool delayed_multiplication = false;
const uint64_t max_32bits = 0xFFFFFFFF;
while (mask != 0 && this_value <= max_32bits) {
this_value = this_value * this_value;
// Verify that there is enough space in this_value to perform the
// multiplication. The first bit_size bits must be 0.
if ((power_exponent & mask) != 0) {
- uint64_t base_bits_mask =
- ~((static_cast<uint64_t>(1) << (64 - bit_size)) - 1);
- bool high_bits_zero = (this_value & base_bits_mask) == 0;
+ DOUBLE_CONVERSION_ASSERT(bit_size > 0);
+ const uint64_t base_bits_mask =
+ ~((static_cast<uint64_t>(1) << (64 - bit_size)) - 1);
+ const bool high_bits_zero = (this_value & base_bits_mask) == 0;
if (high_bits_zero) {
this_value *= base;
} else {
- delayed_multipliciation = true;
+ delayed_multiplication = true;
}
}
mask >>= 1;
}
AssignUInt64(this_value);
- if (delayed_multipliciation) {
+ if (delayed_multiplication) {
MultiplyByUInt32(base);
}
@@ -498,9 +513,9 @@ void Bignum::AssignPowerUInt16(uint16_t base, int power_exponent) {
// Precondition: this/other < 16bit.
uint16_t Bignum::DivideModuloIntBignum(const Bignum& other) {
- ASSERT(IsClamped());
- ASSERT(other.IsClamped());
- ASSERT(other.used_digits_ > 0);
+ DOUBLE_CONVERSION_ASSERT(IsClamped());
+ DOUBLE_CONVERSION_ASSERT(other.IsClamped());
+ DOUBLE_CONVERSION_ASSERT(other.used_bigits_ > 0);
// Easy case: if we have less digits than the divisor than the result is 0.
// Note: this handles the case where this == 0, too.
@@ -518,34 +533,34 @@ uint16_t Bignum::DivideModuloIntBignum(const Bignum& other) {
// This naive approach is extremely inefficient if `this` divided by other
// is big. This function is implemented for doubleToString where
// the result should be small (less than 10).
- ASSERT(other.bigits_[other.used_digits_ - 1] >= ((1 << kBigitSize) / 16));
- ASSERT(bigits_[used_digits_ - 1] < 0x10000);
+ DOUBLE_CONVERSION_ASSERT(other.RawBigit(other.used_bigits_ - 1) >= ((1 << kBigitSize) / 16));
+ DOUBLE_CONVERSION_ASSERT(RawBigit(used_bigits_ - 1) < 0x10000);
// Remove the multiples of the first digit.
// Example this = 23 and other equals 9. -> Remove 2 multiples.
- result += static_cast<uint16_t>(bigits_[used_digits_ - 1]);
- SubtractTimes(other, bigits_[used_digits_ - 1]);
+ result += static_cast<uint16_t>(RawBigit(used_bigits_ - 1));
+ SubtractTimes(other, RawBigit(used_bigits_ - 1));
}
- ASSERT(BigitLength() == other.BigitLength());
+ DOUBLE_CONVERSION_ASSERT(BigitLength() == other.BigitLength());
// Both bignums are at the same length now.
// Since other has more than 0 digits we know that the access to
- // bigits_[used_digits_ - 1] is safe.
- Chunk this_bigit = bigits_[used_digits_ - 1];
- Chunk other_bigit = other.bigits_[other.used_digits_ - 1];
+ // RawBigit(used_bigits_ - 1) is safe.
+ const Chunk this_bigit = RawBigit(used_bigits_ - 1);
+ const Chunk other_bigit = other.RawBigit(other.used_bigits_ - 1);
- if (other.used_digits_ == 1) {
+ if (other.used_bigits_ == 1) {
// Shortcut for easy (and common) case.
int quotient = this_bigit / other_bigit;
- bigits_[used_digits_ - 1] = this_bigit - other_bigit * quotient;
- ASSERT(quotient < 0x10000);
+ RawBigit(used_bigits_ - 1) = this_bigit - other_bigit * quotient;
+ DOUBLE_CONVERSION_ASSERT(quotient < 0x10000);
result += static_cast<uint16_t>(quotient);
Clamp();
return result;
}
- int division_estimate = this_bigit / (other_bigit + 1);
- ASSERT(division_estimate < 0x10000);
+ const int division_estimate = this_bigit / (other_bigit + 1);
+ DOUBLE_CONVERSION_ASSERT(division_estimate < 0x10000);
result += static_cast<uint16_t>(division_estimate);
SubtractTimes(other, division_estimate);
@@ -565,7 +580,7 @@ uint16_t Bignum::DivideModuloIntBignum(const Bignum& other) {
template<typename S>
static int SizeInHexChars(S number) {
- ASSERT(number > 0);
+ DOUBLE_CONVERSION_ASSERT(number > 0);
int result = 0;
while (number != 0) {
number >>= 4;
@@ -575,29 +590,35 @@ static int SizeInHexChars(S number) {
}
-static char HexCharOfValue(int value) {
- ASSERT(0 <= value && value <= 16);
- if (value < 10) return static_cast<char>(value + '0');
+static char HexCharOfValue(const int value) {
+ DOUBLE_CONVERSION_ASSERT(0 <= value && value <= 16);
+ if (value < 10) {
+ return static_cast<char>(value + '0');
+ }
return static_cast<char>(value - 10 + 'A');
}
-bool Bignum::ToHexString(char* buffer, int buffer_size) const {
- ASSERT(IsClamped());
+bool Bignum::ToHexString(char* buffer, const int buffer_size) const {
+ DOUBLE_CONVERSION_ASSERT(IsClamped());
// Each bigit must be printable as separate hex-character.
- ASSERT(kBigitSize % 4 == 0);
- const int kHexCharsPerBigit = kBigitSize / 4;
+ DOUBLE_CONVERSION_ASSERT(kBigitSize % 4 == 0);
+ static const int kHexCharsPerBigit = kBigitSize / 4;
- if (used_digits_ == 0) {
- if (buffer_size < 2) return false;
+ if (used_bigits_ == 0) {
+ if (buffer_size < 2) {
+ return false;
+ }
buffer[0] = '0';
buffer[1] = '\0';
return true;
}
// We add 1 for the terminating '\0' character.
- int needed_chars = (BigitLength() - 1) * kHexCharsPerBigit +
- SizeInHexChars(bigits_[used_digits_ - 1]) + 1;
- if (needed_chars > buffer_size) return false;
+ const int needed_chars = (BigitLength() - 1) * kHexCharsPerBigit +
+ SizeInHexChars(RawBigit(used_bigits_ - 1)) + 1;
+ if (needed_chars > buffer_size) {
+ return false;
+ }
int string_index = needed_chars - 1;
buffer[string_index--] = '\0';
for (int i = 0; i < exponent_; ++i) {
@@ -605,15 +626,15 @@ bool Bignum::ToHexString(char* buffer, int buffer_size) const {
buffer[string_index--] = '0';
}
}
- for (int i = 0; i < used_digits_ - 1; ++i) {
- Chunk current_bigit = bigits_[i];
+ for (int i = 0; i < used_bigits_ - 1; ++i) {
+ Chunk current_bigit = RawBigit(i);
for (int j = 0; j < kHexCharsPerBigit; ++j) {
buffer[string_index--] = HexCharOfValue(current_bigit & 0xF);
current_bigit >>= 4;
}
}
// And finally the last bigit.
- Chunk most_significant_bigit = bigits_[used_digits_ - 1];
+ Chunk most_significant_bigit = RawBigit(used_bigits_ - 1);
while (most_significant_bigit != 0) {
buffer[string_index--] = HexCharOfValue(most_significant_bigit & 0xF);
most_significant_bigit >>= 4;
@@ -622,25 +643,37 @@ bool Bignum::ToHexString(char* buffer, int buffer_size) const {
}
-Bignum::Chunk Bignum::BigitAt(int index) const {
- if (index >= BigitLength()) return 0;
- if (index < exponent_) return 0;
- return bigits_[index - exponent_];
+Bignum::Chunk Bignum::BigitOrZero(const int index) const {
+ if (index >= BigitLength()) {
+ return 0;
+ }
+ if (index < exponent_) {
+ return 0;
+ }
+ return RawBigit(index - exponent_);
}
int Bignum::Compare(const Bignum& a, const Bignum& b) {
- ASSERT(a.IsClamped());
- ASSERT(b.IsClamped());
- int bigit_length_a = a.BigitLength();
- int bigit_length_b = b.BigitLength();
- if (bigit_length_a < bigit_length_b) return -1;
- if (bigit_length_a > bigit_length_b) return +1;
- for (int i = bigit_length_a - 1; i >= Min(a.exponent_, b.exponent_); --i) {
- Chunk bigit_a = a.BigitAt(i);
- Chunk bigit_b = b.BigitAt(i);
- if (bigit_a < bigit_b) return -1;
- if (bigit_a > bigit_b) return +1;
+ DOUBLE_CONVERSION_ASSERT(a.IsClamped());
+ DOUBLE_CONVERSION_ASSERT(b.IsClamped());
+ const int bigit_length_a = a.BigitLength();
+ const int bigit_length_b = b.BigitLength();
+ if (bigit_length_a < bigit_length_b) {
+ return -1;
+ }
+ if (bigit_length_a > bigit_length_b) {
+ return +1;
+ }
+ for (int i = bigit_length_a - 1; i >= (std::min)(a.exponent_, b.exponent_); --i) {
+ const Chunk bigit_a = a.BigitOrZero(i);
+ const Chunk bigit_b = b.BigitOrZero(i);
+ if (bigit_a < bigit_b) {
+ return -1;
+ }
+ if (bigit_a > bigit_b) {
+ return +1;
+ }
// Otherwise they are equal up to this digit. Try the next digit.
}
return 0;
@@ -648,14 +681,18 @@ int Bignum::Compare(const Bignum& a, const Bignum& b) {
int Bignum::PlusCompare(const Bignum& a, const Bignum& b, const Bignum& c) {
- ASSERT(a.IsClamped());
- ASSERT(b.IsClamped());
- ASSERT(c.IsClamped());
+ DOUBLE_CONVERSION_ASSERT(a.IsClamped());
+ DOUBLE_CONVERSION_ASSERT(b.IsClamped());
+ DOUBLE_CONVERSION_ASSERT(c.IsClamped());
if (a.BigitLength() < b.BigitLength()) {
return PlusCompare(b, a, c);
}
- if (a.BigitLength() + 1 < c.BigitLength()) return -1;
- if (a.BigitLength() > c.BigitLength()) return +1;
+ if (a.BigitLength() + 1 < c.BigitLength()) {
+ return -1;
+ }
+ if (a.BigitLength() > c.BigitLength()) {
+ return +1;
+ }
// The exponent encodes 0-bigits. So if there are more 0-digits in 'a' than
// 'b' has digits, then the bigit-length of 'a'+'b' must be equal to the one
// of 'a'.
@@ -665,92 +702,83 @@ int Bignum::PlusCompare(const Bignum& a, const Bignum& b, const Bignum& c) {
Chunk borrow = 0;
// Starting at min_exponent all digits are == 0. So no need to compare them.
- int min_exponent = Min(Min(a.exponent_, b.exponent_), c.exponent_);
+ const int min_exponent = (std::min)((std::min)(a.exponent_, b.exponent_), c.exponent_);
for (int i = c.BigitLength() - 1; i >= min_exponent; --i) {
- Chunk chunk_a = a.BigitAt(i);
- Chunk chunk_b = b.BigitAt(i);
- Chunk chunk_c = c.BigitAt(i);
- Chunk sum = chunk_a + chunk_b;
+ const Chunk chunk_a = a.BigitOrZero(i);
+ const Chunk chunk_b = b.BigitOrZero(i);
+ const Chunk chunk_c = c.BigitOrZero(i);
+ const Chunk sum = chunk_a + chunk_b;
if (sum > chunk_c + borrow) {
return +1;
} else {
borrow = chunk_c + borrow - sum;
- if (borrow > 1) return -1;
+ if (borrow > 1) {
+ return -1;
+ }
borrow <<= kBigitSize;
}
}
- if (borrow == 0) return 0;
+ if (borrow == 0) {
+ return 0;
+ }
return -1;
}
void Bignum::Clamp() {
- while (used_digits_ > 0 && bigits_[used_digits_ - 1] == 0) {
- used_digits_--;
+ while (used_bigits_ > 0 && RawBigit(used_bigits_ - 1) == 0) {
+ used_bigits_--;
}
- if (used_digits_ == 0) {
+ if (used_bigits_ == 0) {
// Zero.
exponent_ = 0;
}
}
-bool Bignum::IsClamped() const {
- return used_digits_ == 0 || bigits_[used_digits_ - 1] != 0;
-}
-
-
-void Bignum::Zero() {
- for (int i = 0; i < used_digits_; ++i) {
- bigits_[i] = 0;
- }
- used_digits_ = 0;
- exponent_ = 0;
-}
-
-
void Bignum::Align(const Bignum& other) {
if (exponent_ > other.exponent_) {
- // If "X" represents a "hidden" digit (by the exponent) then we are in the
+ // If "X" represents a "hidden" bigit (by the exponent) then we are in the
// following case (a == this, b == other):
// a: aaaaaaXXXX or a: aaaaaXXX
// b: bbbbbbX b: bbbbbbbbXX
// We replace some of the hidden digits (X) of a with 0 digits.
// a: aaaaaa000X or a: aaaaa0XX
- int zero_digits = exponent_ - other.exponent_;
- EnsureCapacity(used_digits_ + zero_digits);
- for (int i = used_digits_ - 1; i >= 0; --i) {
- bigits_[i + zero_digits] = bigits_[i];
+ const int zero_bigits = exponent_ - other.exponent_;
+ EnsureCapacity(used_bigits_ + zero_bigits);
+ for (int i = used_bigits_ - 1; i >= 0; --i) {
+ RawBigit(i + zero_bigits) = RawBigit(i);
}
- for (int i = 0; i < zero_digits; ++i) {
- bigits_[i] = 0;
+ for (int i = 0; i < zero_bigits; ++i) {
+ RawBigit(i) = 0;
}
- used_digits_ += zero_digits;
- exponent_ -= zero_digits;
- ASSERT(used_digits_ >= 0);
- ASSERT(exponent_ >= 0);
+ used_bigits_ += zero_bigits;
+ exponent_ -= zero_bigits;
+
+ DOUBLE_CONVERSION_ASSERT(used_bigits_ >= 0);
+ DOUBLE_CONVERSION_ASSERT(exponent_ >= 0);
}
}
-void Bignum::BigitsShiftLeft(int shift_amount) {
- ASSERT(shift_amount < kBigitSize);
- ASSERT(shift_amount >= 0);
+void Bignum::BigitsShiftLeft(const int shift_amount) {
+ DOUBLE_CONVERSION_ASSERT(shift_amount < kBigitSize);
+ DOUBLE_CONVERSION_ASSERT(shift_amount >= 0);
Chunk carry = 0;
- for (int i = 0; i < used_digits_; ++i) {
- Chunk new_carry = bigits_[i] >> (kBigitSize - shift_amount);
- bigits_[i] = ((bigits_[i] << shift_amount) + carry) & kBigitMask;
+ for (int i = 0; i < used_bigits_; ++i) {
+ const Chunk new_carry = RawBigit(i) >> (kBigitSize - shift_amount);
+ RawBigit(i) = ((RawBigit(i) << shift_amount) + carry) & kBigitMask;
carry = new_carry;
}
if (carry != 0) {
- bigits_[used_digits_] = carry;
- used_digits_++;
+ RawBigit(used_bigits_) = carry;
+ used_bigits_++;
}
}
-void Bignum::SubtractTimes(const Bignum& other, int factor) {
- ASSERT(exponent_ <= other.exponent_);
+void Bignum::SubtractTimes(const Bignum& other, const int factor) {
+ DOUBLE_CONVERSION_ASSERT(exponent_ <= other.exponent_);
if (factor < 3) {
for (int i = 0; i < factor; ++i) {
SubtractBignum(other);
@@ -758,19 +786,21 @@ void Bignum::SubtractTimes(const Bignum& other, int factor) {
return;
}
Chunk borrow = 0;
- int exponent_diff = other.exponent_ - exponent_;
- for (int i = 0; i < other.used_digits_; ++i) {
- DoubleChunk product = static_cast<DoubleChunk>(factor) * other.bigits_[i];
- DoubleChunk remove = borrow + product;
- Chunk difference = bigits_[i + exponent_diff] - (remove & kBigitMask);
- bigits_[i + exponent_diff] = difference & kBigitMask;
+ const int exponent_diff = other.exponent_ - exponent_;
+ for (int i = 0; i < other.used_bigits_; ++i) {
+ const DoubleChunk product = static_cast<DoubleChunk>(factor) * other.RawBigit(i);
+ const DoubleChunk remove = borrow + product;
+ const Chunk difference = RawBigit(i + exponent_diff) - (remove & kBigitMask);
+ RawBigit(i + exponent_diff) = difference & kBigitMask;
borrow = static_cast<Chunk>((difference >> (kChunkSize - 1)) +
(remove >> kBigitSize));
}
- for (int i = other.used_digits_ + exponent_diff; i < used_digits_; ++i) {
- if (borrow == 0) return;
- Chunk difference = bigits_[i] - borrow;
- bigits_[i] = difference & kBigitMask;
+ for (int i = other.used_bigits_ + exponent_diff; i < used_bigits_; ++i) {
+ if (borrow == 0) {
+ return;
+ }
+ const Chunk difference = RawBigit(i) - borrow;
+ RawBigit(i) = difference & kBigitMask;
borrow = difference >> (kChunkSize - 1);
}
Clamp();
diff --git a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-bignum.h b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-bignum.h
index d1af3bf5e77..bae900a15a7 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-bignum.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-bignum.h
@@ -53,26 +53,27 @@ class Bignum {
// exponent.
static const int kMaxSignificantBits = 3584;
- Bignum();
- void AssignUInt16(uint16_t value);
+ Bignum() : used_bigits_(0), exponent_(0) {}
+
+ void AssignUInt16(const uint16_t value);
void AssignUInt64(uint64_t value);
void AssignBignum(const Bignum& other);
- void AssignDecimalString(Vector<const char> value);
- void AssignHexString(Vector<const char> value);
+ void AssignDecimalString(const Vector<const char> value);
+ void AssignHexString(const Vector<const char> value);
- void AssignPowerUInt16(uint16_t base, int exponent);
+ void AssignPowerUInt16(uint16_t base, const int exponent);
- void AddUInt64(uint64_t operand);
+ void AddUInt64(const uint64_t operand);
void AddBignum(const Bignum& other);
// Precondition: this >= other.
void SubtractBignum(const Bignum& other);
void Square();
- void ShiftLeft(int shift_amount);
- void MultiplyByUInt32(uint32_t factor);
- void MultiplyByUInt64(uint64_t factor);
- void MultiplyByPowerOfTen(int exponent);
+ void ShiftLeft(const int shift_amount);
+ void MultiplyByUInt32(const uint32_t factor);
+ void MultiplyByUInt64(const uint64_t factor);
+ void MultiplyByPowerOfTen(const int exponent);
void Times10() { return MultiplyByUInt32(10); }
// Pseudocode:
// int result = this / other;
@@ -80,7 +81,7 @@ class Bignum {
// In the worst case this function is in O(this/other).
uint16_t DivideModuloIntBignum(const Bignum& other);
- bool ToHexString(char* buffer, int buffer_size) const;
+ bool ToHexString(char* buffer, const int buffer_size) const;
// Returns
// -1 if a < b,
@@ -124,33 +125,40 @@ class Bignum {
// grow. There are no checks if the stack-allocated space is sufficient.
static const int kBigitCapacity = kMaxSignificantBits / kBigitSize;
- void EnsureCapacity(int size) {
+ static void EnsureCapacity(const int size) {
if (size > kBigitCapacity) {
- UNREACHABLE();
+ DOUBLE_CONVERSION_UNREACHABLE();
}
}
void Align(const Bignum& other);
void Clamp();
- bool IsClamped() const;
- void Zero();
+ bool IsClamped() const {
+ return used_bigits_ == 0 || RawBigit(used_bigits_ - 1) != 0;
+ }
+ void Zero() {
+ used_bigits_ = 0;
+ exponent_ = 0;
+ }
// Requires this to have enough capacity (no tests done).
- // Updates used_digits_ if necessary.
+ // Updates used_bigits_ if necessary.
// shift_amount must be < kBigitSize.
- void BigitsShiftLeft(int shift_amount);
- // BigitLength includes the "hidden" digits encoded in the exponent.
- int BigitLength() const { return used_digits_ + exponent_; }
- Chunk BigitAt(int index) const;
- void SubtractTimes(const Bignum& other, int factor);
-
+ void BigitsShiftLeft(const int shift_amount);
+ // BigitLength includes the "hidden" bigits encoded in the exponent.
+ int BigitLength() const { return used_bigits_ + exponent_; }
+ Chunk& RawBigit(const int index);
+ const Chunk& RawBigit(const int index) const;
+ Chunk BigitOrZero(const int index) const;
+ void SubtractTimes(const Bignum& other, const int factor);
+
+ // The Bignum's value is value(bigits_buffer_) * 2^(exponent_ * kBigitSize),
+ // where the value of the buffer consists of the lower kBigitSize bits of
+ // the first used_bigits_ Chunks in bigits_buffer_, first chunk has lowest
+ // significant bits.
+ int16_t used_bigits_;
+ int16_t exponent_;
Chunk bigits_buffer_[kBigitCapacity];
- // A vector backed by bigits_buffer_. This way accesses to the array are
- // checked for out-of-bounds errors.
- Vector<Chunk> bigits_;
- int used_digits_;
- // The Bignum's value equals value(bigits_) * 2^(exponent_ * kBigitSize).
- int exponent_;
-
- DISALLOW_COPY_AND_ASSIGN(Bignum);
+
+ DOUBLE_CONVERSION_DISALLOW_COPY_AND_ASSIGN(Bignum);
};
} // namespace double_conversion
diff --git a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-cached-powers.cpp b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-cached-powers.cpp
index e49700444c6..3bc35c8aaf8 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-cached-powers.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-cached-powers.cpp
@@ -34,9 +34,9 @@
#include "unicode/utypes.h"
#if !UCONFIG_NO_FORMATTING
-#include <stdarg.h>
-#include <limits.h>
-#include <math.h>
+#include <climits>
+#include <cmath>
+#include <cstdarg>
// ICU PATCH: Customize header file paths for ICU.
@@ -49,6 +49,8 @@ U_NAMESPACE_BEGIN
namespace double_conversion {
+namespace PowersOfTenCache {
+
struct CachedPower {
uint64_t significand;
int16_t binary_exponent;
@@ -56,103 +58,99 @@ struct CachedPower {
};
static const CachedPower kCachedPowers[] = {
- {UINT64_2PART_C(0xfa8fd5a0, 081c0288), -1220, -348},
- {UINT64_2PART_C(0xbaaee17f, a23ebf76), -1193, -340},
- {UINT64_2PART_C(0x8b16fb20, 3055ac76), -1166, -332},
- {UINT64_2PART_C(0xcf42894a, 5dce35ea), -1140, -324},
- {UINT64_2PART_C(0x9a6bb0aa, 55653b2d), -1113, -316},
- {UINT64_2PART_C(0xe61acf03, 3d1a45df), -1087, -308},
- {UINT64_2PART_C(0xab70fe17, c79ac6ca), -1060, -300},
- {UINT64_2PART_C(0xff77b1fc, bebcdc4f), -1034, -292},
- {UINT64_2PART_C(0xbe5691ef, 416bd60c), -1007, -284},
- {UINT64_2PART_C(0x8dd01fad, 907ffc3c), -980, -276},
- {UINT64_2PART_C(0xd3515c28, 31559a83), -954, -268},
- {UINT64_2PART_C(0x9d71ac8f, ada6c9b5), -927, -260},
- {UINT64_2PART_C(0xea9c2277, 23ee8bcb), -901, -252},
- {UINT64_2PART_C(0xaecc4991, 4078536d), -874, -244},
- {UINT64_2PART_C(0x823c1279, 5db6ce57), -847, -236},
- {UINT64_2PART_C(0xc2109436, 4dfb5637), -821, -228},
- {UINT64_2PART_C(0x9096ea6f, 3848984f), -794, -220},
- {UINT64_2PART_C(0xd77485cb, 25823ac7), -768, -212},
- {UINT64_2PART_C(0xa086cfcd, 97bf97f4), -741, -204},
- {UINT64_2PART_C(0xef340a98, 172aace5), -715, -196},
- {UINT64_2PART_C(0xb23867fb, 2a35b28e), -688, -188},
- {UINT64_2PART_C(0x84c8d4df, d2c63f3b), -661, -180},
- {UINT64_2PART_C(0xc5dd4427, 1ad3cdba), -635, -172},
- {UINT64_2PART_C(0x936b9fce, bb25c996), -608, -164},
- {UINT64_2PART_C(0xdbac6c24, 7d62a584), -582, -156},
- {UINT64_2PART_C(0xa3ab6658, 0d5fdaf6), -555, -148},
- {UINT64_2PART_C(0xf3e2f893, dec3f126), -529, -140},
- {UINT64_2PART_C(0xb5b5ada8, aaff80b8), -502, -132},
- {UINT64_2PART_C(0x87625f05, 6c7c4a8b), -475, -124},
- {UINT64_2PART_C(0xc9bcff60, 34c13053), -449, -116},
- {UINT64_2PART_C(0x964e858c, 91ba2655), -422, -108},
- {UINT64_2PART_C(0xdff97724, 70297ebd), -396, -100},
- {UINT64_2PART_C(0xa6dfbd9f, b8e5b88f), -369, -92},
- {UINT64_2PART_C(0xf8a95fcf, 88747d94), -343, -84},
- {UINT64_2PART_C(0xb9447093, 8fa89bcf), -316, -76},
- {UINT64_2PART_C(0x8a08f0f8, bf0f156b), -289, -68},
- {UINT64_2PART_C(0xcdb02555, 653131b6), -263, -60},
- {UINT64_2PART_C(0x993fe2c6, d07b7fac), -236, -52},
- {UINT64_2PART_C(0xe45c10c4, 2a2b3b06), -210, -44},
- {UINT64_2PART_C(0xaa242499, 697392d3), -183, -36},
- {UINT64_2PART_C(0xfd87b5f2, 8300ca0e), -157, -28},
- {UINT64_2PART_C(0xbce50864, 92111aeb), -130, -20},
- {UINT64_2PART_C(0x8cbccc09, 6f5088cc), -103, -12},
- {UINT64_2PART_C(0xd1b71758, e219652c), -77, -4},
- {UINT64_2PART_C(0x9c400000, 00000000), -50, 4},
- {UINT64_2PART_C(0xe8d4a510, 00000000), -24, 12},
- {UINT64_2PART_C(0xad78ebc5, ac620000), 3, 20},
- {UINT64_2PART_C(0x813f3978, f8940984), 30, 28},
- {UINT64_2PART_C(0xc097ce7b, c90715b3), 56, 36},
- {UINT64_2PART_C(0x8f7e32ce, 7bea5c70), 83, 44},
- {UINT64_2PART_C(0xd5d238a4, abe98068), 109, 52},
- {UINT64_2PART_C(0x9f4f2726, 179a2245), 136, 60},
- {UINT64_2PART_C(0xed63a231, d4c4fb27), 162, 68},
- {UINT64_2PART_C(0xb0de6538, 8cc8ada8), 189, 76},
- {UINT64_2PART_C(0x83c7088e, 1aab65db), 216, 84},
- {UINT64_2PART_C(0xc45d1df9, 42711d9a), 242, 92},
- {UINT64_2PART_C(0x924d692c, a61be758), 269, 100},
- {UINT64_2PART_C(0xda01ee64, 1a708dea), 295, 108},
- {UINT64_2PART_C(0xa26da399, 9aef774a), 322, 116},
- {UINT64_2PART_C(0xf209787b, b47d6b85), 348, 124},
- {UINT64_2PART_C(0xb454e4a1, 79dd1877), 375, 132},
- {UINT64_2PART_C(0x865b8692, 5b9bc5c2), 402, 140},
- {UINT64_2PART_C(0xc83553c5, c8965d3d), 428, 148},
- {UINT64_2PART_C(0x952ab45c, fa97a0b3), 455, 156},
- {UINT64_2PART_C(0xde469fbd, 99a05fe3), 481, 164},
- {UINT64_2PART_C(0xa59bc234, db398c25), 508, 172},
- {UINT64_2PART_C(0xf6c69a72, a3989f5c), 534, 180},
- {UINT64_2PART_C(0xb7dcbf53, 54e9bece), 561, 188},
- {UINT64_2PART_C(0x88fcf317, f22241e2), 588, 196},
- {UINT64_2PART_C(0xcc20ce9b, d35c78a5), 614, 204},
- {UINT64_2PART_C(0x98165af3, 7b2153df), 641, 212},
- {UINT64_2PART_C(0xe2a0b5dc, 971f303a), 667, 220},
- {UINT64_2PART_C(0xa8d9d153, 5ce3b396), 694, 228},
- {UINT64_2PART_C(0xfb9b7cd9, a4a7443c), 720, 236},
- {UINT64_2PART_C(0xbb764c4c, a7a44410), 747, 244},
- {UINT64_2PART_C(0x8bab8eef, b6409c1a), 774, 252},
- {UINT64_2PART_C(0xd01fef10, a657842c), 800, 260},
- {UINT64_2PART_C(0x9b10a4e5, e9913129), 827, 268},
- {UINT64_2PART_C(0xe7109bfb, a19c0c9d), 853, 276},
- {UINT64_2PART_C(0xac2820d9, 623bf429), 880, 284},
- {UINT64_2PART_C(0x80444b5e, 7aa7cf85), 907, 292},
- {UINT64_2PART_C(0xbf21e440, 03acdd2d), 933, 300},
- {UINT64_2PART_C(0x8e679c2f, 5e44ff8f), 960, 308},
- {UINT64_2PART_C(0xd433179d, 9c8cb841), 986, 316},
- {UINT64_2PART_C(0x9e19db92, b4e31ba9), 1013, 324},
- {UINT64_2PART_C(0xeb96bf6e, badf77d9), 1039, 332},
- {UINT64_2PART_C(0xaf87023b, 9bf0ee6b), 1066, 340},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xfa8fd5a0, 081c0288), -1220, -348},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xbaaee17f, a23ebf76), -1193, -340},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x8b16fb20, 3055ac76), -1166, -332},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xcf42894a, 5dce35ea), -1140, -324},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x9a6bb0aa, 55653b2d), -1113, -316},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xe61acf03, 3d1a45df), -1087, -308},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xab70fe17, c79ac6ca), -1060, -300},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xff77b1fc, bebcdc4f), -1034, -292},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xbe5691ef, 416bd60c), -1007, -284},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x8dd01fad, 907ffc3c), -980, -276},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xd3515c28, 31559a83), -954, -268},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x9d71ac8f, ada6c9b5), -927, -260},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xea9c2277, 23ee8bcb), -901, -252},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xaecc4991, 4078536d), -874, -244},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x823c1279, 5db6ce57), -847, -236},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xc2109436, 4dfb5637), -821, -228},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x9096ea6f, 3848984f), -794, -220},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xd77485cb, 25823ac7), -768, -212},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xa086cfcd, 97bf97f4), -741, -204},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xef340a98, 172aace5), -715, -196},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xb23867fb, 2a35b28e), -688, -188},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x84c8d4df, d2c63f3b), -661, -180},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xc5dd4427, 1ad3cdba), -635, -172},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x936b9fce, bb25c996), -608, -164},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xdbac6c24, 7d62a584), -582, -156},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xa3ab6658, 0d5fdaf6), -555, -148},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xf3e2f893, dec3f126), -529, -140},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xb5b5ada8, aaff80b8), -502, -132},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x87625f05, 6c7c4a8b), -475, -124},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xc9bcff60, 34c13053), -449, -116},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x964e858c, 91ba2655), -422, -108},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xdff97724, 70297ebd), -396, -100},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xa6dfbd9f, b8e5b88f), -369, -92},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xf8a95fcf, 88747d94), -343, -84},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xb9447093, 8fa89bcf), -316, -76},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x8a08f0f8, bf0f156b), -289, -68},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xcdb02555, 653131b6), -263, -60},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x993fe2c6, d07b7fac), -236, -52},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xe45c10c4, 2a2b3b06), -210, -44},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xaa242499, 697392d3), -183, -36},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xfd87b5f2, 8300ca0e), -157, -28},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xbce50864, 92111aeb), -130, -20},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x8cbccc09, 6f5088cc), -103, -12},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xd1b71758, e219652c), -77, -4},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x9c400000, 00000000), -50, 4},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xe8d4a510, 00000000), -24, 12},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xad78ebc5, ac620000), 3, 20},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x813f3978, f8940984), 30, 28},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xc097ce7b, c90715b3), 56, 36},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x8f7e32ce, 7bea5c70), 83, 44},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xd5d238a4, abe98068), 109, 52},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x9f4f2726, 179a2245), 136, 60},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xed63a231, d4c4fb27), 162, 68},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xb0de6538, 8cc8ada8), 189, 76},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x83c7088e, 1aab65db), 216, 84},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xc45d1df9, 42711d9a), 242, 92},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x924d692c, a61be758), 269, 100},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xda01ee64, 1a708dea), 295, 108},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xa26da399, 9aef774a), 322, 116},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xf209787b, b47d6b85), 348, 124},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xb454e4a1, 79dd1877), 375, 132},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x865b8692, 5b9bc5c2), 402, 140},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xc83553c5, c8965d3d), 428, 148},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x952ab45c, fa97a0b3), 455, 156},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xde469fbd, 99a05fe3), 481, 164},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xa59bc234, db398c25), 508, 172},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xf6c69a72, a3989f5c), 534, 180},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xb7dcbf53, 54e9bece), 561, 188},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x88fcf317, f22241e2), 588, 196},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xcc20ce9b, d35c78a5), 614, 204},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x98165af3, 7b2153df), 641, 212},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xe2a0b5dc, 971f303a), 667, 220},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xa8d9d153, 5ce3b396), 694, 228},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xfb9b7cd9, a4a7443c), 720, 236},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xbb764c4c, a7a44410), 747, 244},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x8bab8eef, b6409c1a), 774, 252},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xd01fef10, a657842c), 800, 260},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x9b10a4e5, e9913129), 827, 268},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xe7109bfb, a19c0c9d), 853, 276},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xac2820d9, 623bf429), 880, 284},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x80444b5e, 7aa7cf85), 907, 292},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xbf21e440, 03acdd2d), 933, 300},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x8e679c2f, 5e44ff8f), 960, 308},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xd433179d, 9c8cb841), 986, 316},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0x9e19db92, b4e31ba9), 1013, 324},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xeb96bf6e, badf77d9), 1039, 332},
+ {DOUBLE_CONVERSION_UINT64_2PART_C(0xaf87023b, 9bf0ee6b), 1066, 340},
};
static const int kCachedPowersOffset = 348; // -1 * the first decimal_exponent.
static const double kD_1_LOG2_10 = 0.30102999566398114; // 1 / lg(10)
-// Difference between the decimal exponents in the table above.
-const int PowersOfTenCache::kDecimalExponentDistance = 8;
-const int PowersOfTenCache::kMinDecimalExponent = -348;
-const int PowersOfTenCache::kMaxDecimalExponent = 340;
-void PowersOfTenCache::GetCachedPowerForBinaryExponentRange(
+void GetCachedPowerForBinaryExponentRange(
int min_exponent,
int max_exponent,
DiyFp* power,
@@ -162,30 +160,32 @@ void PowersOfTenCache::GetCachedPowerForBinaryExponentRange(
int foo = kCachedPowersOffset;
int index =
(foo + static_cast<int>(k) - 1) / kDecimalExponentDistance + 1;
- ASSERT(0 <= index && index < static_cast<int>(ARRAY_SIZE(kCachedPowers)));
+ DOUBLE_CONVERSION_ASSERT(0 <= index && index < static_cast<int>(DOUBLE_CONVERSION_ARRAY_SIZE(kCachedPowers)));
CachedPower cached_power = kCachedPowers[index];
- ASSERT(min_exponent <= cached_power.binary_exponent);
+ DOUBLE_CONVERSION_ASSERT(min_exponent <= cached_power.binary_exponent);
(void) max_exponent; // Mark variable as used.
- ASSERT(cached_power.binary_exponent <= max_exponent);
+ DOUBLE_CONVERSION_ASSERT(cached_power.binary_exponent <= max_exponent);
*decimal_exponent = cached_power.decimal_exponent;
*power = DiyFp(cached_power.significand, cached_power.binary_exponent);
}
-void PowersOfTenCache::GetCachedPowerForDecimalExponent(int requested_exponent,
- DiyFp* power,
- int* found_exponent) {
- ASSERT(kMinDecimalExponent <= requested_exponent);
- ASSERT(requested_exponent < kMaxDecimalExponent + kDecimalExponentDistance);
+void GetCachedPowerForDecimalExponent(int requested_exponent,
+ DiyFp* power,
+ int* found_exponent) {
+ DOUBLE_CONVERSION_ASSERT(kMinDecimalExponent <= requested_exponent);
+ DOUBLE_CONVERSION_ASSERT(requested_exponent < kMaxDecimalExponent + kDecimalExponentDistance);
int index =
(requested_exponent + kCachedPowersOffset) / kDecimalExponentDistance;
CachedPower cached_power = kCachedPowers[index];
*power = DiyFp(cached_power.significand, cached_power.binary_exponent);
*found_exponent = cached_power.decimal_exponent;
- ASSERT(*found_exponent <= requested_exponent);
- ASSERT(requested_exponent < *found_exponent + kDecimalExponentDistance);
+ DOUBLE_CONVERSION_ASSERT(*found_exponent <= requested_exponent);
+ DOUBLE_CONVERSION_ASSERT(requested_exponent < *found_exponent + kDecimalExponentDistance);
}
+} // namespace PowersOfTenCache
+
} // namespace double_conversion
// ICU PATCH: Close ICU namespace
diff --git a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-cached-powers.h b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-cached-powers.h
index 438746b1432..ade27baef8b 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-cached-powers.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-cached-powers.h
@@ -46,32 +46,32 @@ U_NAMESPACE_BEGIN
namespace double_conversion {
-class PowersOfTenCache {
- public:
+namespace PowersOfTenCache {
// Not all powers of ten are cached. The decimal exponent of two neighboring
// cached numbers will differ by kDecimalExponentDistance.
- static const int kDecimalExponentDistance;
+ static const int kDecimalExponentDistance = 8;
- static const int kMinDecimalExponent;
- static const int kMaxDecimalExponent;
+ static const int kMinDecimalExponent = -348;
+ static const int kMaxDecimalExponent = 340;
// Returns a cached power-of-ten with a binary exponent in the range
// [min_exponent; max_exponent] (boundaries included).
- static void GetCachedPowerForBinaryExponentRange(int min_exponent,
- int max_exponent,
- DiyFp* power,
- int* decimal_exponent);
+ void GetCachedPowerForBinaryExponentRange(int min_exponent,
+ int max_exponent,
+ DiyFp* power,
+ int* decimal_exponent);
// Returns a cached power of ten x ~= 10^k such that
// k <= decimal_exponent < k + kCachedPowersDecimalDistance.
// The given decimal_exponent must satisfy
// kMinDecimalExponent <= requested_exponent, and
// requested_exponent < kMaxDecimalExponent + kDecimalExponentDistance.
- static void GetCachedPowerForDecimalExponent(int requested_exponent,
- DiyFp* power,
- int* found_exponent);
-};
+ void GetCachedPowerForDecimalExponent(int requested_exponent,
+ DiyFp* power,
+ int* found_exponent);
+
+} // namespace PowersOfTenCache
} // namespace double_conversion
diff --git a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-diy-fp.cpp b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-diy-fp.cpp
deleted file mode 100644
index f38430c6c3c..00000000000
--- a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-diy-fp.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-// © 2018 and later: Unicode, Inc. and others.
-// License & terms of use: http://www.unicode.org/copyright.html
-//
-// From the double-conversion library. Original license:
-//
-// Copyright 2010 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following
-// disclaimer in the documentation and/or other materials provided
-// with the distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// ICU PATCH: ifdef around UCONFIG_NO_FORMATTING
-#include "unicode/utypes.h"
-#if !UCONFIG_NO_FORMATTING
-
-// ICU PATCH: Customize header file paths for ICU.
-
-#include "double-conversion-diy-fp.h"
-#include "double-conversion-utils.h"
-
-// ICU PATCH: Wrap in ICU namespace
-U_NAMESPACE_BEGIN
-
-namespace double_conversion {
-
-void DiyFp::Multiply(const DiyFp& other) {
- // Simply "emulates" a 128 bit multiplication.
- // However: the resulting number only contains 64 bits. The least
- // significant 64 bits are only used for rounding the most significant 64
- // bits.
- const uint64_t kM32 = 0xFFFFFFFFU;
- uint64_t a = f_ >> 32;
- uint64_t b = f_ & kM32;
- uint64_t c = other.f_ >> 32;
- uint64_t d = other.f_ & kM32;
- uint64_t ac = a * c;
- uint64_t bc = b * c;
- uint64_t ad = a * d;
- uint64_t bd = b * d;
- uint64_t tmp = (bd >> 32) + (ad & kM32) + (bc & kM32);
- // By adding 1U << 31 to tmp we round the final result.
- // Halfway cases will be round up.
- tmp += 1U << 31;
- uint64_t result_f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32);
- e_ += other.e_ + 64;
- f_ = result_f;
-}
-
-} // namespace double_conversion
-
-// ICU PATCH: Close ICU namespace
-U_NAMESPACE_END
-#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-diy-fp.h b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-diy-fp.h
index 21896851d22..5820abedf35 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-diy-fp.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-diy-fp.h
@@ -50,36 +50,55 @@ namespace double_conversion {
// with a uint64 significand and an int exponent. Normalized DiyFp numbers will
// have the most significant bit of the significand set.
// Multiplication and Subtraction do not normalize their results.
-// DiyFp are not designed to contain special doubles (NaN and Infinity).
+// DiyFp store only non-negative numbers and are not designed to contain special
+// doubles (NaN and Infinity).
class DiyFp {
public:
static const int kSignificandSize = 64;
DiyFp() : f_(0), e_(0) {}
- DiyFp(uint64_t significand, int exponent) : f_(significand), e_(exponent) {}
+ DiyFp(const uint64_t significand, const int32_t exponent) : f_(significand), e_(exponent) {}
- // this = this - other.
+ // this -= other.
// The exponents of both numbers must be the same and the significand of this
- // must be bigger than the significand of other.
+ // must be greater or equal than the significand of other.
// The result will not be normalized.
void Subtract(const DiyFp& other) {
- ASSERT(e_ == other.e_);
- ASSERT(f_ >= other.f_);
+ DOUBLE_CONVERSION_ASSERT(e_ == other.e_);
+ DOUBLE_CONVERSION_ASSERT(f_ >= other.f_);
f_ -= other.f_;
}
// Returns a - b.
- // The exponents of both numbers must be the same and this must be bigger
- // than other. The result will not be normalized.
+ // The exponents of both numbers must be the same and a must be greater
+ // or equal than b. The result will not be normalized.
static DiyFp Minus(const DiyFp& a, const DiyFp& b) {
DiyFp result = a;
result.Subtract(b);
return result;
}
-
- // this = this * other.
- void Multiply(const DiyFp& other);
+ // this *= other.
+ void Multiply(const DiyFp& other) {
+ // Simply "emulates" a 128 bit multiplication.
+ // However: the resulting number only contains 64 bits. The least
+ // significant 64 bits are only used for rounding the most significant 64
+ // bits.
+ const uint64_t kM32 = 0xFFFFFFFFU;
+ const uint64_t a = f_ >> 32;
+ const uint64_t b = f_ & kM32;
+ const uint64_t c = other.f_ >> 32;
+ const uint64_t d = other.f_ & kM32;
+ const uint64_t ac = a * c;
+ const uint64_t bc = b * c;
+ const uint64_t ad = a * d;
+ const uint64_t bd = b * d;
+ // By adding 1U << 31 to tmp we round the final result.
+ // Halfway cases will be rounded up.
+ const uint64_t tmp = (bd >> 32) + (ad & kM32) + (bc & kM32) + (1U << 31);
+ e_ += other.e_ + 64;
+ f_ = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32);
+ }
// returns a * b;
static DiyFp Times(const DiyFp& a, const DiyFp& b) {
@@ -89,13 +108,13 @@ class DiyFp {
}
void Normalize() {
- ASSERT(f_ != 0);
+ DOUBLE_CONVERSION_ASSERT(f_ != 0);
uint64_t significand = f_;
- int exponent = e_;
+ int32_t exponent = e_;
- // This method is mainly called for normalizing boundaries. In general
- // boundaries need to be shifted by 10 bits. We thus optimize for this case.
- const uint64_t k10MSBits = UINT64_2PART_C(0xFFC00000, 00000000);
+ // This method is mainly called for normalizing boundaries. In general,
+ // boundaries need to be shifted by 10 bits, and we optimize for this case.
+ const uint64_t k10MSBits = DOUBLE_CONVERSION_UINT64_2PART_C(0xFFC00000, 00000000);
while ((significand & k10MSBits) == 0) {
significand <<= 10;
exponent -= 10;
@@ -115,16 +134,16 @@ class DiyFp {
}
uint64_t f() const { return f_; }
- int e() const { return e_; }
+ int32_t e() const { return e_; }
void set_f(uint64_t new_value) { f_ = new_value; }
- void set_e(int new_value) { e_ = new_value; }
+ void set_e(int32_t new_value) { e_ = new_value; }
private:
- static const uint64_t kUint64MSB = UINT64_2PART_C(0x80000000, 00000000);
+ static const uint64_t kUint64MSB = DOUBLE_CONVERSION_UINT64_2PART_C(0x80000000, 00000000);
uint64_t f_;
- int e_;
+ int32_t e_;
};
} // namespace double_conversion
diff --git a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-double-to-string.cpp b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-double-to-string.cpp
new file mode 100644
index 00000000000..44c176f4f9c
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-double-to-string.cpp
@@ -0,0 +1,450 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+//
+// From the double-conversion library. Original license:
+//
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// ICU PATCH: ifdef around UCONFIG_NO_FORMATTING
+#include "unicode/utypes.h"
+#if !UCONFIG_NO_FORMATTING
+
+#include <algorithm>
+#include <climits>
+#include <cmath>
+
+// ICU PATCH: Customize header file paths for ICU.
+// The file fixed-dtoa.h is not needed.
+
+#include "double-conversion-double-to-string.h"
+
+#include "double-conversion-bignum-dtoa.h"
+#include "double-conversion-fast-dtoa.h"
+#include "double-conversion-ieee.h"
+#include "double-conversion-utils.h"
+
+// ICU PATCH: Wrap in ICU namespace
+U_NAMESPACE_BEGIN
+
+namespace double_conversion {
+
+#if 0 // not needed for ICU
+const DoubleToStringConverter& DoubleToStringConverter::EcmaScriptConverter() {
+ int flags = UNIQUE_ZERO | EMIT_POSITIVE_EXPONENT_SIGN;
+ static DoubleToStringConverter converter(flags,
+ "Infinity",
+ "NaN",
+ 'e',
+ -6, 21,
+ 6, 0);
+ return converter;
+}
+
+
+bool DoubleToStringConverter::HandleSpecialValues(
+ double value,
+ StringBuilder* result_builder) const {
+ Double double_inspect(value);
+ if (double_inspect.IsInfinite()) {
+ if (infinity_symbol_ == NULL) return false;
+ if (value < 0) {
+ result_builder->AddCharacter('-');
+ }
+ result_builder->AddString(infinity_symbol_);
+ return true;
+ }
+ if (double_inspect.IsNan()) {
+ if (nan_symbol_ == NULL) return false;
+ result_builder->AddString(nan_symbol_);
+ return true;
+ }
+ return false;
+}
+
+
+void DoubleToStringConverter::CreateExponentialRepresentation(
+ const char* decimal_digits,
+ int length,
+ int exponent,
+ StringBuilder* result_builder) const {
+ DOUBLE_CONVERSION_ASSERT(length != 0);
+ result_builder->AddCharacter(decimal_digits[0]);
+ if (length != 1) {
+ result_builder->AddCharacter('.');
+ result_builder->AddSubstring(&decimal_digits[1], length-1);
+ }
+ result_builder->AddCharacter(exponent_character_);
+ if (exponent < 0) {
+ result_builder->AddCharacter('-');
+ exponent = -exponent;
+ } else {
+ if ((flags_ & EMIT_POSITIVE_EXPONENT_SIGN) != 0) {
+ result_builder->AddCharacter('+');
+ }
+ }
+ if (exponent == 0) {
+ result_builder->AddCharacter('0');
+ return;
+ }
+ DOUBLE_CONVERSION_ASSERT(exponent < 1e4);
+ // Changing this constant requires updating the comment of DoubleToStringConverter constructor
+ const int kMaxExponentLength = 5;
+ char buffer[kMaxExponentLength + 1];
+ buffer[kMaxExponentLength] = '\0';
+ int first_char_pos = kMaxExponentLength;
+ while (exponent > 0) {
+ buffer[--first_char_pos] = '0' + (exponent % 10);
+ exponent /= 10;
+ }
+ // Add prefix '0' to make exponent width >= min(min_exponent_with_, kMaxExponentLength)
+ // For example: convert 1e+9 -> 1e+09, if min_exponent_with_ is set to 2
+ while(kMaxExponentLength - first_char_pos < std::min(min_exponent_width_, kMaxExponentLength)) {
+ buffer[--first_char_pos] = '0';
+ }
+ result_builder->AddSubstring(&buffer[first_char_pos],
+ kMaxExponentLength - first_char_pos);
+}
+
+
+void DoubleToStringConverter::CreateDecimalRepresentation(
+ const char* decimal_digits,
+ int length,
+ int decimal_point,
+ int digits_after_point,
+ StringBuilder* result_builder) const {
+ // Create a representation that is padded with zeros if needed.
+ if (decimal_point <= 0) {
+ // "0.00000decimal_rep" or "0.000decimal_rep00".
+ result_builder->AddCharacter('0');
+ if (digits_after_point > 0) {
+ result_builder->AddCharacter('.');
+ result_builder->AddPadding('0', -decimal_point);
+ DOUBLE_CONVERSION_ASSERT(length <= digits_after_point - (-decimal_point));
+ result_builder->AddSubstring(decimal_digits, length);
+ int remaining_digits = digits_after_point - (-decimal_point) - length;
+ result_builder->AddPadding('0', remaining_digits);
+ }
+ } else if (decimal_point >= length) {
+ // "decimal_rep0000.00000" or "decimal_rep.0000".
+ result_builder->AddSubstring(decimal_digits, length);
+ result_builder->AddPadding('0', decimal_point - length);
+ if (digits_after_point > 0) {
+ result_builder->AddCharacter('.');
+ result_builder->AddPadding('0', digits_after_point);
+ }
+ } else {
+ // "decima.l_rep000".
+ DOUBLE_CONVERSION_ASSERT(digits_after_point > 0);
+ result_builder->AddSubstring(decimal_digits, decimal_point);
+ result_builder->AddCharacter('.');
+ DOUBLE_CONVERSION_ASSERT(length - decimal_point <= digits_after_point);
+ result_builder->AddSubstring(&decimal_digits[decimal_point],
+ length - decimal_point);
+ int remaining_digits = digits_after_point - (length - decimal_point);
+ result_builder->AddPadding('0', remaining_digits);
+ }
+ if (digits_after_point == 0) {
+ if ((flags_ & EMIT_TRAILING_DECIMAL_POINT) != 0) {
+ result_builder->AddCharacter('.');
+ }
+ if ((flags_ & EMIT_TRAILING_ZERO_AFTER_POINT) != 0) {
+ result_builder->AddCharacter('0');
+ }
+ }
+}
+
+
+bool DoubleToStringConverter::ToShortestIeeeNumber(
+ double value,
+ StringBuilder* result_builder,
+ DoubleToStringConverter::DtoaMode mode) const {
+ DOUBLE_CONVERSION_ASSERT(mode == SHORTEST || mode == SHORTEST_SINGLE);
+ if (Double(value).IsSpecial()) {
+ return HandleSpecialValues(value, result_builder);
+ }
+
+ int decimal_point;
+ bool sign;
+ const int kDecimalRepCapacity = kBase10MaximalLength + 1;
+ char decimal_rep[kDecimalRepCapacity];
+ int decimal_rep_length;
+
+ DoubleToAscii(value, mode, 0, decimal_rep, kDecimalRepCapacity,
+ &sign, &decimal_rep_length, &decimal_point);
+
+ bool unique_zero = (flags_ & UNIQUE_ZERO) != 0;
+ if (sign && (value != 0.0 || !unique_zero)) {
+ result_builder->AddCharacter('-');
+ }
+
+ int exponent = decimal_point - 1;
+ if ((decimal_in_shortest_low_ <= exponent) &&
+ (exponent < decimal_in_shortest_high_)) {
+ CreateDecimalRepresentation(decimal_rep, decimal_rep_length,
+ decimal_point,
+ (std::max)(0, decimal_rep_length - decimal_point),
+ result_builder);
+ } else {
+ CreateExponentialRepresentation(decimal_rep, decimal_rep_length, exponent,
+ result_builder);
+ }
+ return true;
+}
+
+
+bool DoubleToStringConverter::ToFixed(double value,
+ int requested_digits,
+ StringBuilder* result_builder) const {
+ DOUBLE_CONVERSION_ASSERT(kMaxFixedDigitsBeforePoint == 60);
+ const double kFirstNonFixed = 1e60;
+
+ if (Double(value).IsSpecial()) {
+ return HandleSpecialValues(value, result_builder);
+ }
+
+ if (requested_digits > kMaxFixedDigitsAfterPoint) return false;
+ if (value >= kFirstNonFixed || value <= -kFirstNonFixed) return false;
+
+ // Find a sufficiently precise decimal representation of n.
+ int decimal_point;
+ bool sign;
+ // Add space for the '\0' byte.
+ const int kDecimalRepCapacity =
+ kMaxFixedDigitsBeforePoint + kMaxFixedDigitsAfterPoint + 1;
+ char decimal_rep[kDecimalRepCapacity];
+ int decimal_rep_length;
+ DoubleToAscii(value, FIXED, requested_digits,
+ decimal_rep, kDecimalRepCapacity,
+ &sign, &decimal_rep_length, &decimal_point);
+
+ bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0);
+ if (sign && (value != 0.0 || !unique_zero)) {
+ result_builder->AddCharacter('-');
+ }
+
+ CreateDecimalRepresentation(decimal_rep, decimal_rep_length, decimal_point,
+ requested_digits, result_builder);
+ return true;
+}
+
+
+bool DoubleToStringConverter::ToExponential(
+ double value,
+ int requested_digits,
+ StringBuilder* result_builder) const {
+ if (Double(value).IsSpecial()) {
+ return HandleSpecialValues(value, result_builder);
+ }
+
+ if (requested_digits < -1) return false;
+ if (requested_digits > kMaxExponentialDigits) return false;
+
+ int decimal_point;
+ bool sign;
+ // Add space for digit before the decimal point and the '\0' character.
+ const int kDecimalRepCapacity = kMaxExponentialDigits + 2;
+ DOUBLE_CONVERSION_ASSERT(kDecimalRepCapacity > kBase10MaximalLength);
+ char decimal_rep[kDecimalRepCapacity];
+#ifndef NDEBUG
+ // Problem: there is an assert in StringBuilder::AddSubstring() that
+ // will pass this buffer to strlen(), and this buffer is not generally
+ // null-terminated.
+ memset(decimal_rep, 0, sizeof(decimal_rep));
+#endif
+ int decimal_rep_length;
+
+ if (requested_digits == -1) {
+ DoubleToAscii(value, SHORTEST, 0,
+ decimal_rep, kDecimalRepCapacity,
+ &sign, &decimal_rep_length, &decimal_point);
+ } else {
+ DoubleToAscii(value, PRECISION, requested_digits + 1,
+ decimal_rep, kDecimalRepCapacity,
+ &sign, &decimal_rep_length, &decimal_point);
+ DOUBLE_CONVERSION_ASSERT(decimal_rep_length <= requested_digits + 1);
+
+ for (int i = decimal_rep_length; i < requested_digits + 1; ++i) {
+ decimal_rep[i] = '0';
+ }
+ decimal_rep_length = requested_digits + 1;
+ }
+
+ bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0);
+ if (sign && (value != 0.0 || !unique_zero)) {
+ result_builder->AddCharacter('-');
+ }
+
+ int exponent = decimal_point - 1;
+ CreateExponentialRepresentation(decimal_rep,
+ decimal_rep_length,
+ exponent,
+ result_builder);
+ return true;
+}
+
+
+bool DoubleToStringConverter::ToPrecision(double value,
+ int precision,
+ StringBuilder* result_builder) const {
+ if (Double(value).IsSpecial()) {
+ return HandleSpecialValues(value, result_builder);
+ }
+
+ if (precision < kMinPrecisionDigits || precision > kMaxPrecisionDigits) {
+ return false;
+ }
+
+ // Find a sufficiently precise decimal representation of n.
+ int decimal_point;
+ bool sign;
+ // Add one for the terminating null character.
+ const int kDecimalRepCapacity = kMaxPrecisionDigits + 1;
+ char decimal_rep[kDecimalRepCapacity];
+ int decimal_rep_length;
+
+ DoubleToAscii(value, PRECISION, precision,
+ decimal_rep, kDecimalRepCapacity,
+ &sign, &decimal_rep_length, &decimal_point);
+ DOUBLE_CONVERSION_ASSERT(decimal_rep_length <= precision);
+
+ bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0);
+ if (sign && (value != 0.0 || !unique_zero)) {
+ result_builder->AddCharacter('-');
+ }
+
+ // The exponent if we print the number as x.xxeyyy. That is with the
+ // decimal point after the first digit.
+ int exponent = decimal_point - 1;
+
+ int extra_zero = ((flags_ & EMIT_TRAILING_ZERO_AFTER_POINT) != 0) ? 1 : 0;
+ if ((-decimal_point + 1 > max_leading_padding_zeroes_in_precision_mode_) ||
+ (decimal_point - precision + extra_zero >
+ max_trailing_padding_zeroes_in_precision_mode_)) {
+ // Fill buffer to contain 'precision' digits.
+ // Usually the buffer is already at the correct length, but 'DoubleToAscii'
+ // is allowed to return less characters.
+ for (int i = decimal_rep_length; i < precision; ++i) {
+ decimal_rep[i] = '0';
+ }
+
+ CreateExponentialRepresentation(decimal_rep,
+ precision,
+ exponent,
+ result_builder);
+ } else {
+ CreateDecimalRepresentation(decimal_rep, decimal_rep_length, decimal_point,
+ (std::max)(0, precision - decimal_point),
+ result_builder);
+ }
+ return true;
+}
+#endif // not needed for ICU
+
+
+static BignumDtoaMode DtoaToBignumDtoaMode(
+ DoubleToStringConverter::DtoaMode dtoa_mode) {
+ switch (dtoa_mode) {
+ case DoubleToStringConverter::SHORTEST: return BIGNUM_DTOA_SHORTEST;
+ case DoubleToStringConverter::SHORTEST_SINGLE:
+ return BIGNUM_DTOA_SHORTEST_SINGLE;
+ case DoubleToStringConverter::FIXED: return BIGNUM_DTOA_FIXED;
+ case DoubleToStringConverter::PRECISION: return BIGNUM_DTOA_PRECISION;
+ default:
+ DOUBLE_CONVERSION_UNREACHABLE();
+ }
+}
+
+
+void DoubleToStringConverter::DoubleToAscii(double v,
+ DtoaMode mode,
+ int requested_digits,
+ char* buffer,
+ int buffer_length,
+ bool* sign,
+ int* length,
+ int* point) {
+ Vector<char> vector(buffer, buffer_length);
+ DOUBLE_CONVERSION_ASSERT(!Double(v).IsSpecial());
+ DOUBLE_CONVERSION_ASSERT(mode == SHORTEST || mode == SHORTEST_SINGLE || requested_digits >= 0);
+
+ if (Double(v).Sign() < 0) {
+ *sign = true;
+ v = -v;
+ } else {
+ *sign = false;
+ }
+
+ if (mode == PRECISION && requested_digits == 0) {
+ vector[0] = '\0';
+ *length = 0;
+ return;
+ }
+
+ if (v == 0) {
+ vector[0] = '0';
+ vector[1] = '\0';
+ *length = 1;
+ *point = 1;
+ return;
+ }
+
+ bool fast_worked;
+ switch (mode) {
+ case SHORTEST:
+ fast_worked = FastDtoa(v, FAST_DTOA_SHORTEST, 0, vector, length, point);
+ break;
+#if 0 // not needed for ICU
+ case SHORTEST_SINGLE:
+ fast_worked = FastDtoa(v, FAST_DTOA_SHORTEST_SINGLE, 0,
+ vector, length, point);
+ break;
+ case FIXED:
+ fast_worked = FastFixedDtoa(v, requested_digits, vector, length, point);
+ break;
+ case PRECISION:
+ fast_worked = FastDtoa(v, FAST_DTOA_PRECISION, requested_digits,
+ vector, length, point);
+ break;
+#endif // not needed for ICU
+ default:
+ fast_worked = false;
+ DOUBLE_CONVERSION_UNREACHABLE();
+ }
+ if (fast_worked) return;
+
+ // If the fast dtoa didn't succeed use the slower bignum version.
+ BignumDtoaMode bignum_mode = DtoaToBignumDtoaMode(mode);
+ BignumDtoa(v, bignum_mode, requested_digits, vector, length, point);
+ vector[*length] = '\0';
+}
+
+} // namespace double_conversion
+
+// ICU PATCH: Close ICU namespace
+U_NAMESPACE_END
+#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-double-to-string.h b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-double-to-string.h
new file mode 100644
index 00000000000..27bd8678489
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-double-to-string.h
@@ -0,0 +1,419 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+//
+// From the double-conversion library. Original license:
+//
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// ICU PATCH: ifdef around UCONFIG_NO_FORMATTING
+#include "unicode/utypes.h"
+#if !UCONFIG_NO_FORMATTING
+
+#ifndef DOUBLE_CONVERSION_DOUBLE_TO_STRING_H_
+#define DOUBLE_CONVERSION_DOUBLE_TO_STRING_H_
+
+// ICU PATCH: Customize header file paths for ICU.
+
+#include "double-conversion-utils.h"
+
+// ICU PATCH: Wrap in ICU namespace
+U_NAMESPACE_BEGIN
+
+namespace double_conversion {
+
+class DoubleToStringConverter {
+ public:
+#if 0 // not needed for ICU
+ // When calling ToFixed with a double > 10^kMaxFixedDigitsBeforePoint
+ // or a requested_digits parameter > kMaxFixedDigitsAfterPoint then the
+ // function returns false.
+ static const int kMaxFixedDigitsBeforePoint = 60;
+ static const int kMaxFixedDigitsAfterPoint = 60;
+
+ // When calling ToExponential with a requested_digits
+ // parameter > kMaxExponentialDigits then the function returns false.
+ static const int kMaxExponentialDigits = 120;
+
+ // When calling ToPrecision with a requested_digits
+ // parameter < kMinPrecisionDigits or requested_digits > kMaxPrecisionDigits
+ // then the function returns false.
+ static const int kMinPrecisionDigits = 1;
+ static const int kMaxPrecisionDigits = 120;
+
+ enum Flags {
+ NO_FLAGS = 0,
+ EMIT_POSITIVE_EXPONENT_SIGN = 1,
+ EMIT_TRAILING_DECIMAL_POINT = 2,
+ EMIT_TRAILING_ZERO_AFTER_POINT = 4,
+ UNIQUE_ZERO = 8
+ };
+
+ // Flags should be a bit-or combination of the possible Flags-enum.
+ // - NO_FLAGS: no special flags.
+ // - EMIT_POSITIVE_EXPONENT_SIGN: when the number is converted into exponent
+ // form, emits a '+' for positive exponents. Example: 1.2e+2.
+ // - EMIT_TRAILING_DECIMAL_POINT: when the input number is an integer and is
+ // converted into decimal format then a trailing decimal point is appended.
+ // Example: 2345.0 is converted to "2345.".
+ // - EMIT_TRAILING_ZERO_AFTER_POINT: in addition to a trailing decimal point
+ // emits a trailing '0'-character. This flag requires the
+ // EXMIT_TRAILING_DECIMAL_POINT flag.
+ // Example: 2345.0 is converted to "2345.0".
+ // - UNIQUE_ZERO: "-0.0" is converted to "0.0".
+ //
+ // Infinity symbol and nan_symbol provide the string representation for these
+ // special values. If the string is NULL and the special value is encountered
+ // then the conversion functions return false.
+ //
+ // The exponent_character is used in exponential representations. It is
+ // usually 'e' or 'E'.
+ //
+ // When converting to the shortest representation the converter will
+ // represent input numbers in decimal format if they are in the interval
+ // [10^decimal_in_shortest_low; 10^decimal_in_shortest_high[
+ // (lower boundary included, greater boundary excluded).
+ // Example: with decimal_in_shortest_low = -6 and
+ // decimal_in_shortest_high = 21:
+ // ToShortest(0.000001) -> "0.000001"
+ // ToShortest(0.0000001) -> "1e-7"
+ // ToShortest(111111111111111111111.0) -> "111111111111111110000"
+ // ToShortest(100000000000000000000.0) -> "100000000000000000000"
+ // ToShortest(1111111111111111111111.0) -> "1.1111111111111111e+21"
+ //
+ // When converting to precision mode the converter may add
+ // max_leading_padding_zeroes before returning the number in exponential
+ // format.
+ // Example with max_leading_padding_zeroes_in_precision_mode = 6.
+ // ToPrecision(0.0000012345, 2) -> "0.0000012"
+ // ToPrecision(0.00000012345, 2) -> "1.2e-7"
+ // Similarily the converter may add up to
+ // max_trailing_padding_zeroes_in_precision_mode in precision mode to avoid
+ // returning an exponential representation. A zero added by the
+ // EMIT_TRAILING_ZERO_AFTER_POINT flag is counted for this limit.
+ // Examples for max_trailing_padding_zeroes_in_precision_mode = 1:
+ // ToPrecision(230.0, 2) -> "230"
+ // ToPrecision(230.0, 2) -> "230." with EMIT_TRAILING_DECIMAL_POINT.
+ // ToPrecision(230.0, 2) -> "2.3e2" with EMIT_TRAILING_ZERO_AFTER_POINT.
+ //
+ // The min_exponent_width is used for exponential representations.
+ // The converter adds leading '0's to the exponent until the exponent
+ // is at least min_exponent_width digits long.
+ // The min_exponent_width is clamped to 5.
+ // As such, the exponent may never have more than 5 digits in total.
+ DoubleToStringConverter(int flags,
+ const char* infinity_symbol,
+ const char* nan_symbol,
+ char exponent_character,
+ int decimal_in_shortest_low,
+ int decimal_in_shortest_high,
+ int max_leading_padding_zeroes_in_precision_mode,
+ int max_trailing_padding_zeroes_in_precision_mode,
+ int min_exponent_width = 0)
+ : flags_(flags),
+ infinity_symbol_(infinity_symbol),
+ nan_symbol_(nan_symbol),
+ exponent_character_(exponent_character),
+ decimal_in_shortest_low_(decimal_in_shortest_low),
+ decimal_in_shortest_high_(decimal_in_shortest_high),
+ max_leading_padding_zeroes_in_precision_mode_(
+ max_leading_padding_zeroes_in_precision_mode),
+ max_trailing_padding_zeroes_in_precision_mode_(
+ max_trailing_padding_zeroes_in_precision_mode),
+ min_exponent_width_(min_exponent_width) {
+ // When 'trailing zero after the point' is set, then 'trailing point'
+ // must be set too.
+ DOUBLE_CONVERSION_ASSERT(((flags & EMIT_TRAILING_DECIMAL_POINT) != 0) ||
+ !((flags & EMIT_TRAILING_ZERO_AFTER_POINT) != 0));
+ }
+
+ // Returns a converter following the EcmaScript specification.
+ static const DoubleToStringConverter& EcmaScriptConverter();
+
+ // Computes the shortest string of digits that correctly represent the input
+ // number. Depending on decimal_in_shortest_low and decimal_in_shortest_high
+ // (see constructor) it then either returns a decimal representation, or an
+ // exponential representation.
+ // Example with decimal_in_shortest_low = -6,
+ // decimal_in_shortest_high = 21,
+ // EMIT_POSITIVE_EXPONENT_SIGN activated, and
+ // EMIT_TRAILING_DECIMAL_POINT deactived:
+ // ToShortest(0.000001) -> "0.000001"
+ // ToShortest(0.0000001) -> "1e-7"
+ // ToShortest(111111111111111111111.0) -> "111111111111111110000"
+ // ToShortest(100000000000000000000.0) -> "100000000000000000000"
+ // ToShortest(1111111111111111111111.0) -> "1.1111111111111111e+21"
+ //
+ // Note: the conversion may round the output if the returned string
+ // is accurate enough to uniquely identify the input-number.
+ // For example the most precise representation of the double 9e59 equals
+ // "899999999999999918767229449717619953810131273674690656206848", but
+ // the converter will return the shorter (but still correct) "9e59".
+ //
+ // Returns true if the conversion succeeds. The conversion always succeeds
+ // except when the input value is special and no infinity_symbol or
+ // nan_symbol has been given to the constructor.
+ bool ToShortest(double value, StringBuilder* result_builder) const {
+ return ToShortestIeeeNumber(value, result_builder, SHORTEST);
+ }
+
+ // Same as ToShortest, but for single-precision floats.
+ bool ToShortestSingle(float value, StringBuilder* result_builder) const {
+ return ToShortestIeeeNumber(value, result_builder, SHORTEST_SINGLE);
+ }
+
+
+ // Computes a decimal representation with a fixed number of digits after the
+ // decimal point. The last emitted digit is rounded.
+ //
+ // Examples:
+ // ToFixed(3.12, 1) -> "3.1"
+ // ToFixed(3.1415, 3) -> "3.142"
+ // ToFixed(1234.56789, 4) -> "1234.5679"
+ // ToFixed(1.23, 5) -> "1.23000"
+ // ToFixed(0.1, 4) -> "0.1000"
+ // ToFixed(1e30, 2) -> "1000000000000000019884624838656.00"
+ // ToFixed(0.1, 30) -> "0.100000000000000005551115123126"
+ // ToFixed(0.1, 17) -> "0.10000000000000001"
+ //
+ // If requested_digits equals 0, then the tail of the result depends on
+ // the EMIT_TRAILING_DECIMAL_POINT and EMIT_TRAILING_ZERO_AFTER_POINT.
+ // Examples, for requested_digits == 0,
+ // let EMIT_TRAILING_DECIMAL_POINT and EMIT_TRAILING_ZERO_AFTER_POINT be
+ // - false and false: then 123.45 -> 123
+ // 0.678 -> 1
+ // - true and false: then 123.45 -> 123.
+ // 0.678 -> 1.
+ // - true and true: then 123.45 -> 123.0
+ // 0.678 -> 1.0
+ //
+ // Returns true if the conversion succeeds. The conversion always succeeds
+ // except for the following cases:
+ // - the input value is special and no infinity_symbol or nan_symbol has
+ // been provided to the constructor,
+ // - 'value' > 10^kMaxFixedDigitsBeforePoint, or
+ // - 'requested_digits' > kMaxFixedDigitsAfterPoint.
+ // The last two conditions imply that the result will never contain more than
+ // 1 + kMaxFixedDigitsBeforePoint + 1 + kMaxFixedDigitsAfterPoint characters
+ // (one additional character for the sign, and one for the decimal point).
+ bool ToFixed(double value,
+ int requested_digits,
+ StringBuilder* result_builder) const;
+
+ // Computes a representation in exponential format with requested_digits
+ // after the decimal point. The last emitted digit is rounded.
+ // If requested_digits equals -1, then the shortest exponential representation
+ // is computed.
+ //
+ // Examples with EMIT_POSITIVE_EXPONENT_SIGN deactivated, and
+ // exponent_character set to 'e'.
+ // ToExponential(3.12, 1) -> "3.1e0"
+ // ToExponential(5.0, 3) -> "5.000e0"
+ // ToExponential(0.001, 2) -> "1.00e-3"
+ // ToExponential(3.1415, -1) -> "3.1415e0"
+ // ToExponential(3.1415, 4) -> "3.1415e0"
+ // ToExponential(3.1415, 3) -> "3.142e0"
+ // ToExponential(123456789000000, 3) -> "1.235e14"
+ // ToExponential(1000000000000000019884624838656.0, -1) -> "1e30"
+ // ToExponential(1000000000000000019884624838656.0, 32) ->
+ // "1.00000000000000001988462483865600e30"
+ // ToExponential(1234, 0) -> "1e3"
+ //
+ // Returns true if the conversion succeeds. The conversion always succeeds
+ // except for the following cases:
+ // - the input value is special and no infinity_symbol or nan_symbol has
+ // been provided to the constructor,
+ // - 'requested_digits' > kMaxExponentialDigits.
+ // The last condition implies that the result will never contain more than
+ // kMaxExponentialDigits + 8 characters (the sign, the digit before the
+ // decimal point, the decimal point, the exponent character, the
+ // exponent's sign, and at most 3 exponent digits).
+ bool ToExponential(double value,
+ int requested_digits,
+ StringBuilder* result_builder) const;
+
+ // Computes 'precision' leading digits of the given 'value' and returns them
+ // either in exponential or decimal format, depending on
+ // max_{leading|trailing}_padding_zeroes_in_precision_mode (given to the
+ // constructor).
+ // The last computed digit is rounded.
+ //
+ // Example with max_leading_padding_zeroes_in_precision_mode = 6.
+ // ToPrecision(0.0000012345, 2) -> "0.0000012"
+ // ToPrecision(0.00000012345, 2) -> "1.2e-7"
+ // Similarily the converter may add up to
+ // max_trailing_padding_zeroes_in_precision_mode in precision mode to avoid
+ // returning an exponential representation. A zero added by the
+ // EMIT_TRAILING_ZERO_AFTER_POINT flag is counted for this limit.
+ // Examples for max_trailing_padding_zeroes_in_precision_mode = 1:
+ // ToPrecision(230.0, 2) -> "230"
+ // ToPrecision(230.0, 2) -> "230." with EMIT_TRAILING_DECIMAL_POINT.
+ // ToPrecision(230.0, 2) -> "2.3e2" with EMIT_TRAILING_ZERO_AFTER_POINT.
+ // Examples for max_trailing_padding_zeroes_in_precision_mode = 3, and no
+ // EMIT_TRAILING_ZERO_AFTER_POINT:
+ // ToPrecision(123450.0, 6) -> "123450"
+ // ToPrecision(123450.0, 5) -> "123450"
+ // ToPrecision(123450.0, 4) -> "123500"
+ // ToPrecision(123450.0, 3) -> "123000"
+ // ToPrecision(123450.0, 2) -> "1.2e5"
+ //
+ // Returns true if the conversion succeeds. The conversion always succeeds
+ // except for the following cases:
+ // - the input value is special and no infinity_symbol or nan_symbol has
+ // been provided to the constructor,
+ // - precision < kMinPericisionDigits
+ // - precision > kMaxPrecisionDigits
+ // The last condition implies that the result will never contain more than
+ // kMaxPrecisionDigits + 7 characters (the sign, the decimal point, the
+ // exponent character, the exponent's sign, and at most 3 exponent digits).
+ bool ToPrecision(double value,
+ int precision,
+ StringBuilder* result_builder) const;
+#endif // not needed for ICU
+
+ enum DtoaMode {
+ // Produce the shortest correct representation.
+ // For example the output of 0.299999999999999988897 is (the less accurate
+ // but correct) 0.3.
+ SHORTEST,
+ // Same as SHORTEST, but for single-precision floats.
+ SHORTEST_SINGLE,
+ // Produce a fixed number of digits after the decimal point.
+ // For instance fixed(0.1, 4) becomes 0.1000
+ // If the input number is big, the output will be big.
+ FIXED,
+ // Fixed number of digits (independent of the decimal point).
+ PRECISION
+ };
+
+ // The maximal number of digits that are needed to emit a double in base 10.
+ // A higher precision can be achieved by using more digits, but the shortest
+ // accurate representation of any double will never use more digits than
+ // kBase10MaximalLength.
+ // Note that DoubleToAscii null-terminates its input. So the given buffer
+ // should be at least kBase10MaximalLength + 1 characters long.
+ static const int kBase10MaximalLength = 17;
+
+ // Converts the given double 'v' to digit characters. 'v' must not be NaN,
+ // +Infinity, or -Infinity. In SHORTEST_SINGLE-mode this restriction also
+ // applies to 'v' after it has been casted to a single-precision float. That
+ // is, in this mode static_cast<float>(v) must not be NaN, +Infinity or
+ // -Infinity.
+ //
+ // The result should be interpreted as buffer * 10^(point-length).
+ //
+ // The digits are written to the buffer in the platform's charset, which is
+ // often UTF-8 (with ASCII-range digits) but may be another charset, such
+ // as EBCDIC.
+ //
+ // The output depends on the given mode:
+ // - SHORTEST: produce the least amount of digits for which the internal
+ // identity requirement is still satisfied. If the digits are printed
+ // (together with the correct exponent) then reading this number will give
+ // 'v' again. The buffer will choose the representation that is closest to
+ // 'v'. If there are two at the same distance, than the one farther away
+ // from 0 is chosen (halfway cases - ending with 5 - are rounded up).
+ // In this mode the 'requested_digits' parameter is ignored.
+ // - SHORTEST_SINGLE: same as SHORTEST but with single-precision.
+ // - FIXED: produces digits necessary to print a given number with
+ // 'requested_digits' digits after the decimal point. The produced digits
+ // might be too short in which case the caller has to fill the remainder
+ // with '0's.
+ // Example: toFixed(0.001, 5) is allowed to return buffer="1", point=-2.
+ // Halfway cases are rounded towards +/-Infinity (away from 0). The call
+ // toFixed(0.15, 2) thus returns buffer="2", point=0.
+ // The returned buffer may contain digits that would be truncated from the
+ // shortest representation of the input.
+ // - PRECISION: produces 'requested_digits' where the first digit is not '0'.
+ // Even though the length of produced digits usually equals
+ // 'requested_digits', the function is allowed to return fewer digits, in
+ // which case the caller has to fill the missing digits with '0's.
+ // Halfway cases are again rounded away from 0.
+ // DoubleToAscii expects the given buffer to be big enough to hold all
+ // digits and a terminating null-character. In SHORTEST-mode it expects a
+ // buffer of at least kBase10MaximalLength + 1. In all other modes the
+ // requested_digits parameter and the padding-zeroes limit the size of the
+ // output. Don't forget the decimal point, the exponent character and the
+ // terminating null-character when computing the maximal output size.
+ // The given length is only used in debug mode to ensure the buffer is big
+ // enough.
+ // ICU PATCH: Export this as U_I18N_API for unit tests.
+ static void U_I18N_API DoubleToAscii(double v,
+ DtoaMode mode,
+ int requested_digits,
+ char* buffer,
+ int buffer_length,
+ bool* sign,
+ int* length,
+ int* point);
+
+#if 0 // not needed for ICU
+ private:
+ // Implementation for ToShortest and ToShortestSingle.
+ bool ToShortestIeeeNumber(double value,
+ StringBuilder* result_builder,
+ DtoaMode mode) const;
+
+ // If the value is a special value (NaN or Infinity) constructs the
+ // corresponding string using the configured infinity/nan-symbol.
+ // If either of them is NULL or the value is not special then the
+ // function returns false.
+ bool HandleSpecialValues(double value, StringBuilder* result_builder) const;
+ // Constructs an exponential representation (i.e. 1.234e56).
+ // The given exponent assumes a decimal point after the first decimal digit.
+ void CreateExponentialRepresentation(const char* decimal_digits,
+ int length,
+ int exponent,
+ StringBuilder* result_builder) const;
+ // Creates a decimal representation (i.e 1234.5678).
+ void CreateDecimalRepresentation(const char* decimal_digits,
+ int length,
+ int decimal_point,
+ int digits_after_point,
+ StringBuilder* result_builder) const;
+
+ const int flags_;
+ const char* const infinity_symbol_;
+ const char* const nan_symbol_;
+ const char exponent_character_;
+ const int decimal_in_shortest_low_;
+ const int decimal_in_shortest_high_;
+ const int max_leading_padding_zeroes_in_precision_mode_;
+ const int max_trailing_padding_zeroes_in_precision_mode_;
+ const int min_exponent_width_;
+#endif // not needed for ICU
+
+ DOUBLE_CONVERSION_DISALLOW_IMPLICIT_CONSTRUCTORS(DoubleToStringConverter);
+};
+
+} // namespace double_conversion
+
+// ICU PATCH: Close ICU namespace
+U_NAMESPACE_END
+
+#endif // DOUBLE_CONVERSION_DOUBLE_TO_STRING_H_
+#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-fast-dtoa.cpp b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-fast-dtoa.cpp
index 8d1499a79b4..87a3d536bf1 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-fast-dtoa.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-fast-dtoa.cpp
@@ -152,7 +152,7 @@ static bool RoundWeed(Vector<char> buffer,
// Conceptually rest ~= too_high - buffer
// We need to do the following tests in this order to avoid over- and
// underflows.
- ASSERT(rest <= unsafe_interval);
+ DOUBLE_CONVERSION_ASSERT(rest <= unsafe_interval);
while (rest < small_distance && // Negated condition 1
unsafe_interval - rest >= ten_kappa && // Negated condition 2
(rest + ten_kappa < small_distance || // buffer{-1} > w_high
@@ -198,7 +198,7 @@ static bool RoundWeedCounted(Vector<char> buffer,
uint64_t ten_kappa,
uint64_t unit,
int* kappa) {
- ASSERT(rest < ten_kappa);
+ DOUBLE_CONVERSION_ASSERT(rest < ten_kappa);
// The following tests are done in a specific order to avoid overflows. They
// will work correctly with any uint64 values of rest < ten_kappa and unit.
//
@@ -255,7 +255,7 @@ static void BiggestPowerTen(uint32_t number,
int number_bits,
uint32_t* power,
int* exponent_plus_one) {
- ASSERT(number < (1u << (number_bits + 1)));
+ DOUBLE_CONVERSION_ASSERT(number < (1u << (number_bits + 1)));
// 1233/4096 is approximately 1/lg(10).
int exponent_plus_one_guess = ((number_bits + 1) * 1233 >> 12);
// We increment to skip over the first entry in the kPowersOf10 table.
@@ -317,9 +317,9 @@ static bool DigitGen(DiyFp low,
Vector<char> buffer,
int* length,
int* kappa) {
- ASSERT(low.e() == w.e() && w.e() == high.e());
- ASSERT(low.f() + 1 <= high.f() - 1);
- ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent);
+ DOUBLE_CONVERSION_ASSERT(low.e() == w.e() && w.e() == high.e());
+ DOUBLE_CONVERSION_ASSERT(low.f() + 1 <= high.f() - 1);
+ DOUBLE_CONVERSION_ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent);
// low, w and high are imprecise, but by less than one ulp (unit in the last
// place).
// If we remove (resp. add) 1 ulp from low (resp. high) we are certain that
@@ -361,7 +361,7 @@ static bool DigitGen(DiyFp low,
// that is smaller than integrals.
while (*kappa > 0) {
int digit = integrals / divisor;
- ASSERT(digit <= 9);
+ DOUBLE_CONVERSION_ASSERT(digit <= 9);
buffer[*length] = static_cast<char>('0' + digit);
(*length)++;
integrals %= divisor;
@@ -388,16 +388,16 @@ static bool DigitGen(DiyFp low,
// data (like the interval or 'unit'), too.
// Note that the multiplication by 10 does not overflow, because w.e >= -60
// and thus one.e >= -60.
- ASSERT(one.e() >= -60);
- ASSERT(fractionals < one.f());
- ASSERT(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f());
+ DOUBLE_CONVERSION_ASSERT(one.e() >= -60);
+ DOUBLE_CONVERSION_ASSERT(fractionals < one.f());
+ DOUBLE_CONVERSION_ASSERT(DOUBLE_CONVERSION_UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f());
for (;;) {
fractionals *= 10;
unit *= 10;
unsafe_interval.set_f(unsafe_interval.f() * 10);
// Integer division by one.
int digit = static_cast<int>(fractionals >> -one.e());
- ASSERT(digit <= 9);
+ DOUBLE_CONVERSION_ASSERT(digit <= 9);
buffer[*length] = static_cast<char>('0' + digit);
(*length)++;
fractionals &= one.f() - 1; // Modulo by one.
@@ -444,9 +444,9 @@ static bool DigitGenCounted(DiyFp w,
Vector<char> buffer,
int* length,
int* kappa) {
- ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent);
- ASSERT(kMinimalTargetExponent >= -60);
- ASSERT(kMaximalTargetExponent <= -32);
+ DOUBLE_CONVERSION_ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent);
+ DOUBLE_CONVERSION_ASSERT(kMinimalTargetExponent >= -60);
+ DOUBLE_CONVERSION_ASSERT(kMaximalTargetExponent <= -32);
// w is assumed to have an error less than 1 unit. Whenever w is scaled we
// also scale its error.
uint64_t w_error = 1;
@@ -472,7 +472,7 @@ static bool DigitGenCounted(DiyFp w,
// that is smaller than 'integrals'.
while (*kappa > 0) {
int digit = integrals / divisor;
- ASSERT(digit <= 9);
+ DOUBLE_CONVERSION_ASSERT(digit <= 9);
buffer[*length] = static_cast<char>('0' + digit);
(*length)++;
requested_digits--;
@@ -498,15 +498,15 @@ static bool DigitGenCounted(DiyFp w,
// data (the 'unit'), too.
// Note that the multiplication by 10 does not overflow, because w.e >= -60
// and thus one.e >= -60.
- ASSERT(one.e() >= -60);
- ASSERT(fractionals < one.f());
- ASSERT(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f());
+ DOUBLE_CONVERSION_ASSERT(one.e() >= -60);
+ DOUBLE_CONVERSION_ASSERT(fractionals < one.f());
+ DOUBLE_CONVERSION_ASSERT(DOUBLE_CONVERSION_UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f());
while (requested_digits > 0 && fractionals > w_error) {
fractionals *= 10;
w_error *= 10;
// Integer division by one.
int digit = static_cast<int>(fractionals >> -one.e());
- ASSERT(digit <= 9);
+ DOUBLE_CONVERSION_ASSERT(digit <= 9);
buffer[*length] = static_cast<char>('0' + digit);
(*length)++;
requested_digits--;
@@ -544,11 +544,11 @@ static bool Grisu3(double v,
if (mode == FAST_DTOA_SHORTEST) {
Double(v).NormalizedBoundaries(&boundary_minus, &boundary_plus);
} else {
- ASSERT(mode == FAST_DTOA_SHORTEST_SINGLE);
+ DOUBLE_CONVERSION_ASSERT(mode == FAST_DTOA_SHORTEST_SINGLE);
float single_v = static_cast<float>(v);
Single(single_v).NormalizedBoundaries(&boundary_minus, &boundary_plus);
}
- ASSERT(boundary_plus.e() == w.e());
+ DOUBLE_CONVERSION_ASSERT(boundary_plus.e() == w.e());
DiyFp ten_mk; // Cached power of ten: 10^-k
int mk; // -k
int ten_mk_minimal_binary_exponent =
@@ -559,7 +559,7 @@ static bool Grisu3(double v,
ten_mk_minimal_binary_exponent,
ten_mk_maximal_binary_exponent,
&ten_mk, &mk);
- ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() +
+ DOUBLE_CONVERSION_ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() +
DiyFp::kSignificandSize) &&
(kMaximalTargetExponent >= w.e() + ten_mk.e() +
DiyFp::kSignificandSize));
@@ -573,7 +573,7 @@ static bool Grisu3(double v,
// In other words: let f = scaled_w.f() and e = scaled_w.e(), then
// (f-1) * 2^e < w*10^k < (f+1) * 2^e
DiyFp scaled_w = DiyFp::Times(w, ten_mk);
- ASSERT(scaled_w.e() ==
+ DOUBLE_CONVERSION_ASSERT(scaled_w.e() ==
boundary_plus.e() + ten_mk.e() + DiyFp::kSignificandSize);
// In theory it would be possible to avoid some recomputations by computing
// the difference between w and boundary_minus/plus (a power of 2) and to
@@ -618,7 +618,7 @@ static bool Grisu3Counted(double v,
ten_mk_minimal_binary_exponent,
ten_mk_maximal_binary_exponent,
&ten_mk, &mk);
- ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() +
+ DOUBLE_CONVERSION_ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() +
DiyFp::kSignificandSize) &&
(kMaximalTargetExponent >= w.e() + ten_mk.e() +
DiyFp::kSignificandSize));
@@ -652,8 +652,8 @@ bool FastDtoa(double v,
Vector<char> buffer,
int* length,
int* decimal_point) {
- ASSERT(v > 0);
- ASSERT(!Double(v).IsSpecial());
+ DOUBLE_CONVERSION_ASSERT(v > 0);
+ DOUBLE_CONVERSION_ASSERT(!Double(v).IsSpecial());
bool result = false;
int decimal_exponent = 0;
@@ -667,7 +667,7 @@ bool FastDtoa(double v,
buffer, length, &decimal_exponent);
break;
default:
- UNREACHABLE();
+ DOUBLE_CONVERSION_UNREACHABLE();
}
if (result) {
*decimal_point = *length + decimal_exponent;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-ieee.h b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-ieee.h
index 952bcea27f6..f4c62a9a9f8 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-ieee.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-ieee.h
@@ -55,12 +55,14 @@ static float uint32_to_float(uint32_t d32) { return BitCast<float>(d32); }
// Helper functions for doubles.
class Double {
public:
- static const uint64_t kSignMask = UINT64_2PART_C(0x80000000, 00000000);
- static const uint64_t kExponentMask = UINT64_2PART_C(0x7FF00000, 00000000);
- static const uint64_t kSignificandMask = UINT64_2PART_C(0x000FFFFF, FFFFFFFF);
- static const uint64_t kHiddenBit = UINT64_2PART_C(0x00100000, 00000000);
+ static const uint64_t kSignMask = DOUBLE_CONVERSION_UINT64_2PART_C(0x80000000, 00000000);
+ static const uint64_t kExponentMask = DOUBLE_CONVERSION_UINT64_2PART_C(0x7FF00000, 00000000);
+ static const uint64_t kSignificandMask = DOUBLE_CONVERSION_UINT64_2PART_C(0x000FFFFF, FFFFFFFF);
+ static const uint64_t kHiddenBit = DOUBLE_CONVERSION_UINT64_2PART_C(0x00100000, 00000000);
static const int kPhysicalSignificandSize = 52; // Excludes the hidden bit.
static const int kSignificandSize = 53;
+ static const int kExponentBias = 0x3FF + kPhysicalSignificandSize;
+ static const int kMaxExponent = 0x7FF - kExponentBias;
Double() : d64_(0) {}
explicit Double(double d) : d64_(double_to_uint64(d)) {}
@@ -71,14 +73,14 @@ class Double {
// The value encoded by this Double must be greater or equal to +0.0.
// It must not be special (infinity, or NaN).
DiyFp AsDiyFp() const {
- ASSERT(Sign() > 0);
- ASSERT(!IsSpecial());
+ DOUBLE_CONVERSION_ASSERT(Sign() > 0);
+ DOUBLE_CONVERSION_ASSERT(!IsSpecial());
return DiyFp(Significand(), Exponent());
}
// The value encoded by this Double must be strictly greater than 0.
DiyFp AsNormalizedDiyFp() const {
- ASSERT(value() > 0.0);
+ DOUBLE_CONVERSION_ASSERT(value() > 0.0);
uint64_t f = Significand();
int e = Exponent();
@@ -174,7 +176,7 @@ class Double {
// Precondition: the value encoded by this Double must be greater or equal
// than +0.0.
DiyFp UpperBoundary() const {
- ASSERT(Sign() > 0);
+ DOUBLE_CONVERSION_ASSERT(Sign() > 0);
return DiyFp(Significand() * 2 + 1, Exponent() - 1);
}
@@ -183,7 +185,7 @@ class Double {
// exponent as m_plus.
// Precondition: the value encoded by this Double must be greater than 0.
void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const {
- ASSERT(value() > 0.0);
+ DOUBLE_CONVERSION_ASSERT(value() > 0.0);
DiyFp v = this->AsDiyFp();
DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1));
DiyFp m_minus;
@@ -236,11 +238,9 @@ class Double {
}
private:
- static const int kExponentBias = 0x3FF + kPhysicalSignificandSize;
static const int kDenormalExponent = -kExponentBias + 1;
- static const int kMaxExponent = 0x7FF - kExponentBias;
- static const uint64_t kInfinity = UINT64_2PART_C(0x7FF00000, 00000000);
- static const uint64_t kNaN = UINT64_2PART_C(0x7FF80000, 00000000);
+ static const uint64_t kInfinity = DOUBLE_CONVERSION_UINT64_2PART_C(0x7FF00000, 00000000);
+ static const uint64_t kNaN = DOUBLE_CONVERSION_UINT64_2PART_C(0x7FF80000, 00000000);
const uint64_t d64_;
@@ -271,7 +271,7 @@ class Double {
(biased_exponent << kPhysicalSignificandSize);
}
- DISALLOW_COPY_AND_ASSIGN(Double);
+ DOUBLE_CONVERSION_DISALLOW_COPY_AND_ASSIGN(Double);
};
class Single {
@@ -290,8 +290,8 @@ class Single {
// The value encoded by this Single must be greater or equal to +0.0.
// It must not be special (infinity, or NaN).
DiyFp AsDiyFp() const {
- ASSERT(Sign() > 0);
- ASSERT(!IsSpecial());
+ DOUBLE_CONVERSION_ASSERT(Sign() > 0);
+ DOUBLE_CONVERSION_ASSERT(!IsSpecial());
return DiyFp(Significand(), Exponent());
}
@@ -354,7 +354,7 @@ class Single {
// exponent as m_plus.
// Precondition: the value encoded by this Single must be greater than 0.
void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const {
- ASSERT(value() > 0.0);
+ DOUBLE_CONVERSION_ASSERT(value() > 0.0);
DiyFp v = this->AsDiyFp();
DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1));
DiyFp m_minus;
@@ -372,7 +372,7 @@ class Single {
// Precondition: the value encoded by this Single must be greater or equal
// than +0.0.
DiyFp UpperBoundary() const {
- ASSERT(Sign() > 0);
+ DOUBLE_CONVERSION_ASSERT(Sign() > 0);
return DiyFp(Significand() * 2 + 1, Exponent() - 1);
}
@@ -408,7 +408,7 @@ class Single {
const uint32_t d32_;
- DISALLOW_COPY_AND_ASSIGN(Single);
+ DOUBLE_CONVERSION_DISALLOW_COPY_AND_ASSIGN(Single);
};
} // namespace double_conversion
diff --git a/Build/source/libs/icu/icu-src/source/i18n/double-conversion.cpp b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-string-to-double.cpp
index 570a05bc429..946b2b26e77 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/double-conversion.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-string-to-double.cpp
@@ -34,16 +34,16 @@
#include "unicode/utypes.h"
#if !UCONFIG_NO_FORMATTING
-#include <limits.h>
-#include <math.h>
+// ICU PATCH: Do not include std::locale.
+
+#include <climits>
+// #include <locale>
+#include <cmath>
// ICU PATCH: Customize header file paths for ICU.
-// The file fixed-dtoa.h is not needed.
-#include "double-conversion.h"
+#include "double-conversion-string-to-double.h"
-#include "double-conversion-bignum-dtoa.h"
-#include "double-conversion-fast-dtoa.h"
#include "double-conversion-ieee.h"
#include "double-conversion-strtod.h"
#include "double-conversion-utils.h"
@@ -53,400 +53,60 @@ U_NAMESPACE_BEGIN
namespace double_conversion {
-#if 0 // not needed for ICU
-const DoubleToStringConverter& DoubleToStringConverter::EcmaScriptConverter() {
- int flags = UNIQUE_ZERO | EMIT_POSITIVE_EXPONENT_SIGN;
- static DoubleToStringConverter converter(flags,
- "Infinity",
- "NaN",
- 'e',
- -6, 21,
- 6, 0);
- return converter;
-}
-
-
-bool DoubleToStringConverter::HandleSpecialValues(
- double value,
- StringBuilder* result_builder) const {
- Double double_inspect(value);
- if (double_inspect.IsInfinite()) {
- if (infinity_symbol_ == NULL) return false;
- if (value < 0) {
- result_builder->AddCharacter('-');
- }
- result_builder->AddString(infinity_symbol_);
- return true;
- }
- if (double_inspect.IsNan()) {
- if (nan_symbol_ == NULL) return false;
- result_builder->AddString(nan_symbol_);
- return true;
- }
- return false;
-}
-
-
-void DoubleToStringConverter::CreateExponentialRepresentation(
- const char* decimal_digits,
- int length,
- int exponent,
- StringBuilder* result_builder) const {
- ASSERT(length != 0);
- result_builder->AddCharacter(decimal_digits[0]);
- if (length != 1) {
- result_builder->AddCharacter('.');
- result_builder->AddSubstring(&decimal_digits[1], length-1);
- }
- result_builder->AddCharacter(exponent_character_);
- if (exponent < 0) {
- result_builder->AddCharacter('-');
- exponent = -exponent;
- } else {
- if ((flags_ & EMIT_POSITIVE_EXPONENT_SIGN) != 0) {
- result_builder->AddCharacter('+');
- }
- }
- if (exponent == 0) {
- result_builder->AddCharacter('0');
- return;
- }
- ASSERT(exponent < 1e4);
- const int kMaxExponentLength = 5;
- char buffer[kMaxExponentLength + 1];
- buffer[kMaxExponentLength] = '\0';
- int first_char_pos = kMaxExponentLength;
- while (exponent > 0) {
- buffer[--first_char_pos] = '0' + (exponent % 10);
- exponent /= 10;
- }
- result_builder->AddSubstring(&buffer[first_char_pos],
- kMaxExponentLength - first_char_pos);
-}
-
-
-void DoubleToStringConverter::CreateDecimalRepresentation(
- const char* decimal_digits,
- int length,
- int decimal_point,
- int digits_after_point,
- StringBuilder* result_builder) const {
- // Create a representation that is padded with zeros if needed.
- if (decimal_point <= 0) {
- // "0.00000decimal_rep" or "0.000decimal_rep00".
- result_builder->AddCharacter('0');
- if (digits_after_point > 0) {
- result_builder->AddCharacter('.');
- result_builder->AddPadding('0', -decimal_point);
- ASSERT(length <= digits_after_point - (-decimal_point));
- result_builder->AddSubstring(decimal_digits, length);
- int remaining_digits = digits_after_point - (-decimal_point) - length;
- result_builder->AddPadding('0', remaining_digits);
- }
- } else if (decimal_point >= length) {
- // "decimal_rep0000.00000" or "decimal_rep.0000".
- result_builder->AddSubstring(decimal_digits, length);
- result_builder->AddPadding('0', decimal_point - length);
- if (digits_after_point > 0) {
- result_builder->AddCharacter('.');
- result_builder->AddPadding('0', digits_after_point);
- }
- } else {
- // "decima.l_rep000".
- ASSERT(digits_after_point > 0);
- result_builder->AddSubstring(decimal_digits, decimal_point);
- result_builder->AddCharacter('.');
- ASSERT(length - decimal_point <= digits_after_point);
- result_builder->AddSubstring(&decimal_digits[decimal_point],
- length - decimal_point);
- int remaining_digits = digits_after_point - (length - decimal_point);
- result_builder->AddPadding('0', remaining_digits);
- }
- if (digits_after_point == 0) {
- if ((flags_ & EMIT_TRAILING_DECIMAL_POINT) != 0) {
- result_builder->AddCharacter('.');
- }
- if ((flags_ & EMIT_TRAILING_ZERO_AFTER_POINT) != 0) {
- result_builder->AddCharacter('0');
- }
- }
-}
-
-
-bool DoubleToStringConverter::ToShortestIeeeNumber(
- double value,
- StringBuilder* result_builder,
- DoubleToStringConverter::DtoaMode mode) const {
- ASSERT(mode == SHORTEST || mode == SHORTEST_SINGLE);
- if (Double(value).IsSpecial()) {
- return HandleSpecialValues(value, result_builder);
- }
-
- int decimal_point;
- bool sign;
- const int kDecimalRepCapacity = kBase10MaximalLength + 1;
- char decimal_rep[kDecimalRepCapacity];
- int decimal_rep_length;
-
- DoubleToAscii(value, mode, 0, decimal_rep, kDecimalRepCapacity,
- &sign, &decimal_rep_length, &decimal_point);
-
- bool unique_zero = (flags_ & UNIQUE_ZERO) != 0;
- if (sign && (value != 0.0 || !unique_zero)) {
- result_builder->AddCharacter('-');
- }
-
- int exponent = decimal_point - 1;
- if ((decimal_in_shortest_low_ <= exponent) &&
- (exponent < decimal_in_shortest_high_)) {
- CreateDecimalRepresentation(decimal_rep, decimal_rep_length,
- decimal_point,
- Max(0, decimal_rep_length - decimal_point),
- result_builder);
- } else {
- CreateExponentialRepresentation(decimal_rep, decimal_rep_length, exponent,
- result_builder);
- }
- return true;
-}
-
-
-bool DoubleToStringConverter::ToFixed(double value,
- int requested_digits,
- StringBuilder* result_builder) const {
- ASSERT(kMaxFixedDigitsBeforePoint == 60);
- const double kFirstNonFixed = 1e60;
+namespace {
- if (Double(value).IsSpecial()) {
- return HandleSpecialValues(value, result_builder);
- }
-
- if (requested_digits > kMaxFixedDigitsAfterPoint) return false;
- if (value >= kFirstNonFixed || value <= -kFirstNonFixed) return false;
-
- // Find a sufficiently precise decimal representation of n.
- int decimal_point;
- bool sign;
- // Add space for the '\0' byte.
- const int kDecimalRepCapacity =
- kMaxFixedDigitsBeforePoint + kMaxFixedDigitsAfterPoint + 1;
- char decimal_rep[kDecimalRepCapacity];
- int decimal_rep_length;
- DoubleToAscii(value, FIXED, requested_digits,
- decimal_rep, kDecimalRepCapacity,
- &sign, &decimal_rep_length, &decimal_point);
-
- bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0);
- if (sign && (value != 0.0 || !unique_zero)) {
- result_builder->AddCharacter('-');
- }
-
- CreateDecimalRepresentation(decimal_rep, decimal_rep_length, decimal_point,
- requested_digits, result_builder);
- return true;
+inline char ToLower(char ch) {
+#if 0 // do not include std::locale in ICU
+ static const std::ctype<char>& cType =
+ std::use_facet<std::ctype<char> >(std::locale::classic());
+ return cType.tolower(ch);
+#else
+ (void)ch;
+ DOUBLE_CONVERSION_UNREACHABLE();
+#endif
}
-
-bool DoubleToStringConverter::ToExponential(
- double value,
- int requested_digits,
- StringBuilder* result_builder) const {
- if (Double(value).IsSpecial()) {
- return HandleSpecialValues(value, result_builder);
- }
-
- if (requested_digits < -1) return false;
- if (requested_digits > kMaxExponentialDigits) return false;
-
- int decimal_point;
- bool sign;
- // Add space for digit before the decimal point and the '\0' character.
- const int kDecimalRepCapacity = kMaxExponentialDigits + 2;
- ASSERT(kDecimalRepCapacity > kBase10MaximalLength);
- char decimal_rep[kDecimalRepCapacity];
- int decimal_rep_length;
-
- if (requested_digits == -1) {
- DoubleToAscii(value, SHORTEST, 0,
- decimal_rep, kDecimalRepCapacity,
- &sign, &decimal_rep_length, &decimal_point);
- } else {
- DoubleToAscii(value, PRECISION, requested_digits + 1,
- decimal_rep, kDecimalRepCapacity,
- &sign, &decimal_rep_length, &decimal_point);
- ASSERT(decimal_rep_length <= requested_digits + 1);
-
- for (int i = decimal_rep_length; i < requested_digits + 1; ++i) {
- decimal_rep[i] = '0';
- }
- decimal_rep_length = requested_digits + 1;
- }
-
- bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0);
- if (sign && (value != 0.0 || !unique_zero)) {
- result_builder->AddCharacter('-');
- }
-
- int exponent = decimal_point - 1;
- CreateExponentialRepresentation(decimal_rep,
- decimal_rep_length,
- exponent,
- result_builder);
- return true;
+inline char Pass(char ch) {
+ return ch;
}
-
-bool DoubleToStringConverter::ToPrecision(double value,
- int precision,
- StringBuilder* result_builder) const {
- if (Double(value).IsSpecial()) {
- return HandleSpecialValues(value, result_builder);
- }
-
- if (precision < kMinPrecisionDigits || precision > kMaxPrecisionDigits) {
- return false;
- }
-
- // Find a sufficiently precise decimal representation of n.
- int decimal_point;
- bool sign;
- // Add one for the terminating null character.
- const int kDecimalRepCapacity = kMaxPrecisionDigits + 1;
- char decimal_rep[kDecimalRepCapacity];
- int decimal_rep_length;
-
- DoubleToAscii(value, PRECISION, precision,
- decimal_rep, kDecimalRepCapacity,
- &sign, &decimal_rep_length, &decimal_point);
- ASSERT(decimal_rep_length <= precision);
-
- bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0);
- if (sign && (value != 0.0 || !unique_zero)) {
- result_builder->AddCharacter('-');
- }
-
- // The exponent if we print the number as x.xxeyyy. That is with the
- // decimal point after the first digit.
- int exponent = decimal_point - 1;
-
- int extra_zero = ((flags_ & EMIT_TRAILING_ZERO_AFTER_POINT) != 0) ? 1 : 0;
- if ((-decimal_point + 1 > max_leading_padding_zeroes_in_precision_mode_) ||
- (decimal_point - precision + extra_zero >
- max_trailing_padding_zeroes_in_precision_mode_)) {
- // Fill buffer to contain 'precision' digits.
- // Usually the buffer is already at the correct length, but 'DoubleToAscii'
- // is allowed to return less characters.
- for (int i = decimal_rep_length; i < precision; ++i) {
- decimal_rep[i] = '0';
+template <class Iterator, class Converter>
+static inline bool ConsumeSubStringImpl(Iterator* current,
+ Iterator end,
+ const char* substring,
+ Converter converter) {
+ DOUBLE_CONVERSION_ASSERT(converter(**current) == *substring);
+ for (substring++; *substring != '\0'; substring++) {
+ ++*current;
+ if (*current == end || converter(**current) != *substring) {
+ return false;
}
-
- CreateExponentialRepresentation(decimal_rep,
- precision,
- exponent,
- result_builder);
- } else {
- CreateDecimalRepresentation(decimal_rep, decimal_rep_length, decimal_point,
- Max(0, precision - decimal_point),
- result_builder);
}
+ ++*current;
return true;
}
-#endif // not needed for ICU
-
-
-static BignumDtoaMode DtoaToBignumDtoaMode(
- DoubleToStringConverter::DtoaMode dtoa_mode) {
- switch (dtoa_mode) {
- case DoubleToStringConverter::SHORTEST: return BIGNUM_DTOA_SHORTEST;
- case DoubleToStringConverter::SHORTEST_SINGLE:
- return BIGNUM_DTOA_SHORTEST_SINGLE;
- case DoubleToStringConverter::FIXED: return BIGNUM_DTOA_FIXED;
- case DoubleToStringConverter::PRECISION: return BIGNUM_DTOA_PRECISION;
- default:
- UNREACHABLE();
- }
-}
-
-
-void DoubleToStringConverter::DoubleToAscii(double v,
- DtoaMode mode,
- int requested_digits,
- char* buffer,
- int buffer_length,
- bool* sign,
- int* length,
- int* point) {
- Vector<char> vector(buffer, buffer_length);
- ASSERT(!Double(v).IsSpecial());
- ASSERT(mode == SHORTEST || mode == SHORTEST_SINGLE || requested_digits >= 0);
-
- if (Double(v).Sign() < 0) {
- *sign = true;
- v = -v;
- } else {
- *sign = false;
- }
-
- if (mode == PRECISION && requested_digits == 0) {
- vector[0] = '\0';
- *length = 0;
- return;
- }
-
- if (v == 0) {
- vector[0] = '0';
- vector[1] = '\0';
- *length = 1;
- *point = 1;
- return;
- }
-
- bool fast_worked;
- switch (mode) {
- case SHORTEST:
- fast_worked = FastDtoa(v, FAST_DTOA_SHORTEST, 0, vector, length, point);
- break;
-#if 0 // not needed for ICU
- case SHORTEST_SINGLE:
- fast_worked = FastDtoa(v, FAST_DTOA_SHORTEST_SINGLE, 0,
- vector, length, point);
- break;
- case FIXED:
- fast_worked = FastFixedDtoa(v, requested_digits, vector, length, point);
- break;
- case PRECISION:
- fast_worked = FastDtoa(v, FAST_DTOA_PRECISION, requested_digits,
- vector, length, point);
- break;
-#endif // not needed for ICU
- default:
- fast_worked = false;
- UNREACHABLE();
- }
- if (fast_worked) return;
-
- // If the fast dtoa didn't succeed use the slower bignum version.
- BignumDtoaMode bignum_mode = DtoaToBignumDtoaMode(mode);
- BignumDtoa(v, bignum_mode, requested_digits, vector, length, point);
- vector[*length] = '\0';
-}
-
// Consumes the given substring from the iterator.
// Returns false, if the substring does not match.
template <class Iterator>
static bool ConsumeSubString(Iterator* current,
Iterator end,
- const char* substring) {
- ASSERT(**current == *substring);
- for (substring++; *substring != '\0'; substring++) {
- ++*current;
- if (*current == end || **current != *substring) return false;
+ const char* substring,
+ bool allow_case_insensitivity) {
+ if (allow_case_insensitivity) {
+ return ConsumeSubStringImpl(current, end, substring, ToLower);
+ } else {
+ return ConsumeSubStringImpl(current, end, substring, Pass);
}
- ++*current;
- return true;
}
+// Consumes first character of the str is equal to ch
+inline bool ConsumeFirstCharacter(char ch,
+ const char* str,
+ bool case_insensitivity) {
+ return case_insensitivity ? ToLower(ch) == str[0] : ch == str[0];
+}
+} // namespace
// Maximum number of significant digits in decimal representation.
// The longest possible double in decimal representation is
@@ -459,15 +119,14 @@ const int kMaxSignificantDigits = 772;
static const char kWhitespaceTable7[] = { 32, 13, 10, 9, 11, 12 };
-static const int kWhitespaceTable7Length = ARRAY_SIZE(kWhitespaceTable7);
+static const int kWhitespaceTable7Length = DOUBLE_CONVERSION_ARRAY_SIZE(kWhitespaceTable7);
static const uc16 kWhitespaceTable16[] = {
160, 8232, 8233, 5760, 6158, 8192, 8193, 8194, 8195,
8196, 8197, 8198, 8199, 8200, 8201, 8202, 8239, 8287, 12288, 65279
};
-static const int kWhitespaceTable16Length = ARRAY_SIZE(kWhitespaceTable16);
-
+static const int kWhitespaceTable16Length = DOUBLE_CONVERSION_ARRAY_SIZE(kWhitespaceTable16);
static bool isWhitespace(int x) {
@@ -513,7 +172,7 @@ static double SignedZero(bool sign) {
// because it constant-propagated the radix and concluded that the last
// condition was always true. By moving it into a separate function the
// compiler wouldn't warn anymore.
-#if _MSC_VER
+#ifdef _MSC_VER
#pragma optimize("",off)
static bool IsDecimalDigitForRadix(int c, int radix) {
return '0' <= c && c <= '9' && (c - '0') < radix;
@@ -521,7 +180,7 @@ static bool IsDecimalDigitForRadix(int c, int radix) {
#pragma optimize("",on)
#else
static bool inline IsDecimalDigitForRadix(int c, int radix) {
- return '0' <= c && c <= '9' && (c - '0') < radix;
+ return '0' <= c && c <= '9' && (c - '0') < radix;
}
#endif
// Returns true if 'c' is a character digit that is valid for the given radix.
@@ -535,17 +194,86 @@ static bool IsCharacterDigitForRadix(int c, int radix, char a_character) {
return radix > 10 && c >= a_character && c < a_character + radix - 10;
}
+// Returns true, when the iterator is equal to end.
+template<class Iterator>
+static bool Advance (Iterator* it, uc16 separator, int base, Iterator& end) {
+ if (separator == StringToDoubleConverter::kNoSeparator) {
+ ++(*it);
+ return *it == end;
+ }
+ if (!isDigit(**it, base)) {
+ ++(*it);
+ return *it == end;
+ }
+ ++(*it);
+ if (*it == end) return true;
+ if (*it + 1 == end) return false;
+ if (**it == separator && isDigit(*(*it + 1), base)) {
+ ++(*it);
+ }
+ return *it == end;
+}
+
+// Checks whether the string in the range start-end is a hex-float string.
+// This function assumes that the leading '0x'/'0X' is already consumed.
+//
+// Hex float strings are of one of the following forms:
+// - hex_digits+ 'p' ('+'|'-')? exponent_digits+
+// - hex_digits* '.' hex_digits+ 'p' ('+'|'-')? exponent_digits+
+// - hex_digits+ '.' 'p' ('+'|'-')? exponent_digits+
+template<class Iterator>
+static bool IsHexFloatString(Iterator start,
+ Iterator end,
+ uc16 separator,
+ bool allow_trailing_junk) {
+ DOUBLE_CONVERSION_ASSERT(start != end);
+
+ Iterator current = start;
+
+ bool saw_digit = false;
+ while (isDigit(*current, 16)) {
+ saw_digit = true;
+ if (Advance(&current, separator, 16, end)) return false;
+ }
+ if (*current == '.') {
+ if (Advance(&current, separator, 16, end)) return false;
+ while (isDigit(*current, 16)) {
+ saw_digit = true;
+ if (Advance(&current, separator, 16, end)) return false;
+ }
+ }
+ if (!saw_digit) return false;
+ if (*current != 'p' && *current != 'P') return false;
+ if (Advance(&current, separator, 16, end)) return false;
+ if (*current == '+' || *current == '-') {
+ if (Advance(&current, separator, 16, end)) return false;
+ }
+ if (!isDigit(*current, 10)) return false;
+ if (Advance(&current, separator, 16, end)) return true;
+ while (isDigit(*current, 10)) {
+ if (Advance(&current, separator, 16, end)) return true;
+ }
+ return allow_trailing_junk || !AdvanceToNonspace(&current, end);
+}
+
// Parsing integers with radix 2, 4, 8, 16, 32. Assumes current != end.
+//
+// If parse_as_hex_float is true, then the string must be a valid
+// hex-float.
template <int radix_log_2, class Iterator>
static double RadixStringToIeee(Iterator* current,
Iterator end,
bool sign,
+ uc16 separator,
+ bool parse_as_hex_float,
bool allow_trailing_junk,
double junk_string_value,
bool read_as_double,
bool* result_is_junk) {
- ASSERT(*current != end);
+ DOUBLE_CONVERSION_ASSERT(*current != end);
+ DOUBLE_CONVERSION_ASSERT(!parse_as_hex_float ||
+ IsHexFloatString(*current, end, separator, allow_trailing_junk));
const int kDoubleSize = Double::kSignificandSize;
const int kSingleSize = Single::kSignificandSize;
@@ -553,27 +281,39 @@ static double RadixStringToIeee(Iterator* current,
*result_is_junk = true;
+ int64_t number = 0;
+ int exponent = 0;
+ const int radix = (1 << radix_log_2);
+ // Whether we have encountered a '.' and are parsing the decimal digits.
+ // Only relevant if parse_as_hex_float is true.
+ bool post_decimal = false;
+
// Skip leading 0s.
while (**current == '0') {
- ++(*current);
- if (*current == end) {
+ if (Advance(current, separator, radix, end)) {
*result_is_junk = false;
return SignedZero(sign);
}
}
- int64_t number = 0;
- int exponent = 0;
- const int radix = (1 << radix_log_2);
-
- do {
+ while (true) {
int digit;
if (IsDecimalDigitForRadix(**current, radix)) {
digit = static_cast<char>(**current) - '0';
+ if (post_decimal) exponent -= radix_log_2;
} else if (IsCharacterDigitForRadix(**current, radix, 'a')) {
digit = static_cast<char>(**current) - 'a' + 10;
+ if (post_decimal) exponent -= radix_log_2;
} else if (IsCharacterDigitForRadix(**current, radix, 'A')) {
digit = static_cast<char>(**current) - 'A' + 10;
+ if (post_decimal) exponent -= radix_log_2;
+ } else if (parse_as_hex_float && **current == '.') {
+ post_decimal = true;
+ Advance(current, separator, radix, end);
+ DOUBLE_CONVERSION_ASSERT(*current != end);
+ continue;
+ } else if (parse_as_hex_float && (**current == 'p' || **current == 'P')) {
+ break;
} else {
if (allow_trailing_junk || !AdvanceToNonspace(current, end)) {
break;
@@ -596,17 +336,26 @@ static double RadixStringToIeee(Iterator* current,
int dropped_bits_mask = ((1 << overflow_bits_count) - 1);
int dropped_bits = static_cast<int>(number) & dropped_bits_mask;
number >>= overflow_bits_count;
- exponent = overflow_bits_count;
+ exponent += overflow_bits_count;
bool zero_tail = true;
for (;;) {
- ++(*current);
- if (*current == end || !isDigit(**current, radix)) break;
+ if (Advance(current, separator, radix, end)) break;
+ if (parse_as_hex_float && **current == '.') {
+ // Just run over the '.'. We are just trying to see whether there is
+ // a non-zero digit somewhere.
+ Advance(current, separator, radix, end);
+ DOUBLE_CONVERSION_ASSERT(*current != end);
+ post_decimal = true;
+ }
+ if (!isDigit(**current, radix)) break;
zero_tail = zero_tail && **current == '0';
- exponent += radix_log_2;
+ if (!post_decimal) exponent += radix_log_2;
}
- if (!allow_trailing_junk && AdvanceToNonspace(current, end)) {
+ if (!parse_as_hex_float &&
+ !allow_trailing_junk &&
+ AdvanceToNonspace(current, end)) {
return junk_string_value;
}
@@ -628,15 +377,41 @@ static double RadixStringToIeee(Iterator* current,
}
break;
}
- ++(*current);
- } while (*current != end);
+ if (Advance(current, separator, radix, end)) break;
+ }
- ASSERT(number < ((int64_t)1 << kSignificandSize));
- ASSERT(static_cast<int64_t>(static_cast<double>(number)) == number);
+ DOUBLE_CONVERSION_ASSERT(number < ((int64_t)1 << kSignificandSize));
+ DOUBLE_CONVERSION_ASSERT(static_cast<int64_t>(static_cast<double>(number)) == number);
*result_is_junk = false;
- if (exponent == 0) {
+ if (parse_as_hex_float) {
+ DOUBLE_CONVERSION_ASSERT(**current == 'p' || **current == 'P');
+ Advance(current, separator, radix, end);
+ DOUBLE_CONVERSION_ASSERT(*current != end);
+ bool is_negative = false;
+ if (**current == '+') {
+ Advance(current, separator, radix, end);
+ DOUBLE_CONVERSION_ASSERT(*current != end);
+ } else if (**current == '-') {
+ is_negative = true;
+ Advance(current, separator, radix, end);
+ DOUBLE_CONVERSION_ASSERT(*current != end);
+ }
+ int written_exponent = 0;
+ while (IsDecimalDigitForRadix(**current, 10)) {
+ // No need to read exponents if they are too big. That could potentially overflow
+ // the `written_exponent` variable.
+ if (abs(written_exponent) <= 100 * Double::kMaxExponent) {
+ written_exponent = 10 * written_exponent + **current - '0';
+ }
+ if (Advance(current, separator, radix, end)) break;
+ }
+ if (is_negative) written_exponent = -written_exponent;
+ exponent += written_exponent;
+ }
+
+ if (exponent == 0 || number == 0) {
if (sign) {
if (number == 0) return -0.0;
number = -number;
@@ -644,8 +419,9 @@ static double RadixStringToIeee(Iterator* current,
return static_cast<double>(number);
}
- ASSERT(number != 0);
- return Double(DiyFp(number, exponent)).value();
+ DOUBLE_CONVERSION_ASSERT(number != 0);
+ double result = Double(DiyFp(number, exponent)).value();
+ return sign ? -result : result;
}
template <class Iterator>
@@ -663,6 +439,7 @@ double StringToDoubleConverter::StringToIeee(
const bool allow_leading_spaces = (flags_ & ALLOW_LEADING_SPACES) != 0;
const bool allow_trailing_spaces = (flags_ & ALLOW_TRAILING_SPACES) != 0;
const bool allow_spaces_after_sign = (flags_ & ALLOW_SPACES_AFTER_SIGN) != 0;
+ const bool allow_case_insensitivity = (flags_ & ALLOW_CASE_INSENSITIVITY) != 0;
// To make sure that iterator dereferencing is valid the following
// convention is used:
@@ -712,8 +489,8 @@ double StringToDoubleConverter::StringToIeee(
}
if (infinity_symbol_ != NULL) {
- if (*current == infinity_symbol_[0]) {
- if (!ConsumeSubString(&current, end, infinity_symbol_)) {
+ if (ConsumeFirstCharacter(*current, infinity_symbol_, allow_case_insensitivity)) {
+ if (!ConsumeSubString(&current, end, infinity_symbol_, allow_case_insensitivity)) {
return junk_string_value_;
}
@@ -724,15 +501,15 @@ double StringToDoubleConverter::StringToIeee(
return junk_string_value_;
}
- ASSERT(buffer_pos == 0);
+ DOUBLE_CONVERSION_ASSERT(buffer_pos == 0);
*processed_characters_count = static_cast<int>(current - input);
return sign ? -Double::Infinity() : Double::Infinity();
}
}
if (nan_symbol_ != NULL) {
- if (*current == nan_symbol_[0]) {
- if (!ConsumeSubString(&current, end, nan_symbol_)) {
+ if (ConsumeFirstCharacter(*current, nan_symbol_, allow_case_insensitivity)) {
+ if (!ConsumeSubString(&current, end, nan_symbol_, allow_case_insensitivity)) {
return junk_string_value_;
}
@@ -743,7 +520,7 @@ double StringToDoubleConverter::StringToIeee(
return junk_string_value_;
}
- ASSERT(buffer_pos == 0);
+ DOUBLE_CONVERSION_ASSERT(buffer_pos == 0);
*processed_characters_count = static_cast<int>(current - input);
return sign ? -Double::NaN() : Double::NaN();
}
@@ -751,8 +528,7 @@ double StringToDoubleConverter::StringToIeee(
bool leading_zero = false;
if (*current == '0') {
- ++current;
- if (current == end) {
+ if (Advance(&current, separator_, 10, end)) {
*processed_characters_count = static_cast<int>(current - input);
return SignedZero(sign);
}
@@ -760,16 +536,25 @@ double StringToDoubleConverter::StringToIeee(
leading_zero = true;
// It could be hexadecimal value.
- if ((flags_ & ALLOW_HEX) && (*current == 'x' || *current == 'X')) {
+ if (((flags_ & ALLOW_HEX) || (flags_ & ALLOW_HEX_FLOATS)) &&
+ (*current == 'x' || *current == 'X')) {
++current;
- if (current == end || !isDigit(*current, 16)) {
- return junk_string_value_; // "0x".
+
+ if (current == end) return junk_string_value_; // "0x"
+
+ bool parse_as_hex_float = (flags_ & ALLOW_HEX_FLOATS) &&
+ IsHexFloatString(current, end, separator_, allow_trailing_junk);
+
+ if (!parse_as_hex_float && !isDigit(*current, 16)) {
+ return junk_string_value_;
}
bool result_is_junk;
double result = RadixStringToIeee<4>(&current,
end,
sign,
+ separator_,
+ parse_as_hex_float,
allow_trailing_junk,
junk_string_value_,
read_as_double,
@@ -783,8 +568,7 @@ double StringToDoubleConverter::StringToIeee(
// Ignore leading zeros in the integer part.
while (*current == '0') {
- ++current;
- if (current == end) {
+ if (Advance(&current, separator_, 10, end)) {
*processed_characters_count = static_cast<int>(current - input);
return SignedZero(sign);
}
@@ -796,7 +580,7 @@ double StringToDoubleConverter::StringToIeee(
// Copy significant digits of the integer part (if any) to the buffer.
while (*current >= '0' && *current <= '9') {
if (significant_digits < kMaxSignificantDigits) {
- ASSERT(buffer_pos < kBufferSize);
+ DOUBLE_CONVERSION_ASSERT(buffer_pos < kBufferSize);
buffer[buffer_pos++] = static_cast<char>(*current);
significant_digits++;
// Will later check if it's an octal in the buffer.
@@ -805,8 +589,7 @@ double StringToDoubleConverter::StringToIeee(
nonzero_digit_dropped = nonzero_digit_dropped || *current != '0';
}
octal = octal && *current < '8';
- ++current;
- if (current == end) goto parsing_done;
+ if (Advance(&current, separator_, 10, end)) goto parsing_done;
}
if (significant_digits == 0) {
@@ -817,8 +600,7 @@ double StringToDoubleConverter::StringToIeee(
if (octal && !allow_trailing_junk) return junk_string_value_;
if (octal) goto parsing_done;
- ++current;
- if (current == end) {
+ if (Advance(&current, separator_, 10, end)) {
if (significant_digits == 0 && !leading_zero) {
return junk_string_value_;
} else {
@@ -831,8 +613,7 @@ double StringToDoubleConverter::StringToIeee(
// Integer part consists of 0 or is absent. Significant digits start after
// leading zeros (if any).
while (*current == '0') {
- ++current;
- if (current == end) {
+ if (Advance(&current, separator_, 10, end)) {
*processed_characters_count = static_cast<int>(current - input);
return SignedZero(sign);
}
@@ -844,7 +625,7 @@ double StringToDoubleConverter::StringToIeee(
// We don't emit a '.', but adjust the exponent instead.
while (*current >= '0' && *current <= '9') {
if (significant_digits < kMaxSignificantDigits) {
- ASSERT(buffer_pos < kBufferSize);
+ DOUBLE_CONVERSION_ASSERT(buffer_pos < kBufferSize);
buffer[buffer_pos++] = static_cast<char>(*current);
significant_digits++;
exponent--;
@@ -852,8 +633,7 @@ double StringToDoubleConverter::StringToIeee(
// Ignore insignificant digits in the fractional part.
nonzero_digit_dropped = nonzero_digit_dropped || *current != '0';
}
- ++current;
- if (current == end) goto parsing_done;
+ if (Advance(&current, separator_, 10, end)) goto parsing_done;
}
}
@@ -869,9 +649,11 @@ double StringToDoubleConverter::StringToIeee(
if (*current == 'e' || *current == 'E') {
if (octal && !allow_trailing_junk) return junk_string_value_;
if (octal) goto parsing_done;
+ Iterator junk_begin = current;
++current;
if (current == end) {
if (allow_trailing_junk) {
+ current = junk_begin;
goto parsing_done;
} else {
return junk_string_value_;
@@ -883,6 +665,7 @@ double StringToDoubleConverter::StringToIeee(
++current;
if (current == end) {
if (allow_trailing_junk) {
+ current = junk_begin;
goto parsing_done;
} else {
return junk_string_value_;
@@ -892,6 +675,7 @@ double StringToDoubleConverter::StringToIeee(
if (current == end || *current < '0' || *current > '9') {
if (allow_trailing_junk) {
+ current = junk_begin;
goto parsing_done;
} else {
return junk_string_value_;
@@ -899,7 +683,7 @@ double StringToDoubleConverter::StringToIeee(
}
const int max_exponent = INT_MAX / 2;
- ASSERT(-max_exponent / 2 <= exponent && exponent <= max_exponent / 2);
+ DOUBLE_CONVERSION_ASSERT(-max_exponent / 2 <= exponent && exponent <= max_exponent / 2);
int num = 0;
do {
// Check overflow.
@@ -936,11 +720,13 @@ double StringToDoubleConverter::StringToIeee(
result = RadixStringToIeee<3>(&start,
buffer + buffer_pos,
sign,
+ separator_,
+ false, // Don't parse as hex_float.
allow_trailing_junk,
junk_string_value_,
read_as_double,
&result_is_junk);
- ASSERT(!result_is_junk);
+ DOUBLE_CONVERSION_ASSERT(!result_is_junk);
*processed_characters_count = static_cast<int>(current - input);
return result;
}
@@ -950,7 +736,7 @@ double StringToDoubleConverter::StringToIeee(
exponent--;
}
- ASSERT(buffer_pos < kBufferSize);
+ DOUBLE_CONVERSION_ASSERT(buffer_pos < kBufferSize);
buffer[buffer_pos] = '\0';
double converted;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-string-to-double.h b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-string-to-double.h
new file mode 100644
index 00000000000..2eb0c1f8979
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-string-to-double.h
@@ -0,0 +1,244 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+//
+// From the double-conversion library. Original license:
+//
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// ICU PATCH: ifdef around UCONFIG_NO_FORMATTING
+#include "unicode/utypes.h"
+#if !UCONFIG_NO_FORMATTING
+
+#ifndef DOUBLE_CONVERSION_STRING_TO_DOUBLE_H_
+#define DOUBLE_CONVERSION_STRING_TO_DOUBLE_H_
+
+// ICU PATCH: Customize header file paths for ICU.
+
+#include "double-conversion-utils.h"
+
+// ICU PATCH: Wrap in ICU namespace
+U_NAMESPACE_BEGIN
+
+namespace double_conversion {
+
+class StringToDoubleConverter {
+ public:
+ // Enumeration for allowing octals and ignoring junk when converting
+ // strings to numbers.
+ enum Flags {
+ NO_FLAGS = 0,
+ ALLOW_HEX = 1,
+ ALLOW_OCTALS = 2,
+ ALLOW_TRAILING_JUNK = 4,
+ ALLOW_LEADING_SPACES = 8,
+ ALLOW_TRAILING_SPACES = 16,
+ ALLOW_SPACES_AFTER_SIGN = 32,
+ ALLOW_CASE_INSENSITIVITY = 64,
+ ALLOW_CASE_INSENSIBILITY = 64, // Deprecated
+ ALLOW_HEX_FLOATS = 128,
+ };
+
+ static const uc16 kNoSeparator = '\0';
+
+ // Flags should be a bit-or combination of the possible Flags-enum.
+ // - NO_FLAGS: no special flags.
+ // - ALLOW_HEX: recognizes the prefix "0x". Hex numbers may only be integers.
+ // Ex: StringToDouble("0x1234") -> 4660.0
+ // In StringToDouble("0x1234.56") the characters ".56" are trailing
+ // junk. The result of the call is hence dependent on
+ // the ALLOW_TRAILING_JUNK flag and/or the junk value.
+ // With this flag "0x" is a junk-string. Even with ALLOW_TRAILING_JUNK,
+ // the string will not be parsed as "0" followed by junk.
+ //
+ // - ALLOW_OCTALS: recognizes the prefix "0" for octals:
+ // If a sequence of octal digits starts with '0', then the number is
+ // read as octal integer. Octal numbers may only be integers.
+ // Ex: StringToDouble("01234") -> 668.0
+ // StringToDouble("012349") -> 12349.0 // Not a sequence of octal
+ // // digits.
+ // In StringToDouble("01234.56") the characters ".56" are trailing
+ // junk. The result of the call is hence dependent on
+ // the ALLOW_TRAILING_JUNK flag and/or the junk value.
+ // In StringToDouble("01234e56") the characters "e56" are trailing
+ // junk, too.
+ // - ALLOW_TRAILING_JUNK: ignore trailing characters that are not part of
+ // a double literal.
+ // - ALLOW_LEADING_SPACES: skip over leading whitespace, including spaces,
+ // new-lines, and tabs.
+ // - ALLOW_TRAILING_SPACES: ignore trailing whitespace.
+ // - ALLOW_SPACES_AFTER_SIGN: ignore whitespace after the sign.
+ // Ex: StringToDouble("- 123.2") -> -123.2.
+ // StringToDouble("+ 123.2") -> 123.2
+ // - ALLOW_CASE_INSENSITIVITY: ignore case of characters for special values:
+ // infinity and nan.
+ // - ALLOW_HEX_FLOATS: allows hexadecimal float literals.
+ // This *must* start with "0x" and separate the exponent with "p".
+ // Examples: 0x1.2p3 == 9.0
+ // 0x10.1p0 == 16.0625
+ // ALLOW_HEX and ALLOW_HEX_FLOATS are indendent.
+ //
+ // empty_string_value is returned when an empty string is given as input.
+ // If ALLOW_LEADING_SPACES or ALLOW_TRAILING_SPACES are set, then a string
+ // containing only spaces is converted to the 'empty_string_value', too.
+ //
+ // junk_string_value is returned when
+ // a) ALLOW_TRAILING_JUNK is not set, and a junk character (a character not
+ // part of a double-literal) is found.
+ // b) ALLOW_TRAILING_JUNK is set, but the string does not start with a
+ // double literal.
+ //
+ // infinity_symbol and nan_symbol are strings that are used to detect
+ // inputs that represent infinity and NaN. They can be null, in which case
+ // they are ignored.
+ // The conversion routine first reads any possible signs. Then it compares the
+ // following character of the input-string with the first character of
+ // the infinity, and nan-symbol. If either matches, the function assumes, that
+ // a match has been found, and expects the following input characters to match
+ // the remaining characters of the special-value symbol.
+ // This means that the following restrictions apply to special-value symbols:
+ // - they must not start with signs ('+', or '-'),
+ // - they must not have the same first character.
+ // - they must not start with digits.
+ //
+ // If the separator character is not kNoSeparator, then that specific
+ // character is ignored when in between two valid digits of the significant.
+ // It is not allowed to appear in the exponent.
+ // It is not allowed to lead or trail the number.
+ // It is not allowed to appear twice next to each other.
+ //
+ // Examples:
+ // flags = ALLOW_HEX | ALLOW_TRAILING_JUNK,
+ // empty_string_value = 0.0,
+ // junk_string_value = NaN,
+ // infinity_symbol = "infinity",
+ // nan_symbol = "nan":
+ // StringToDouble("0x1234") -> 4660.0.
+ // StringToDouble("0x1234K") -> 4660.0.
+ // StringToDouble("") -> 0.0 // empty_string_value.
+ // StringToDouble(" ") -> NaN // junk_string_value.
+ // StringToDouble(" 1") -> NaN // junk_string_value.
+ // StringToDouble("0x") -> NaN // junk_string_value.
+ // StringToDouble("-123.45") -> -123.45.
+ // StringToDouble("--123.45") -> NaN // junk_string_value.
+ // StringToDouble("123e45") -> 123e45.
+ // StringToDouble("123E45") -> 123e45.
+ // StringToDouble("123e+45") -> 123e45.
+ // StringToDouble("123E-45") -> 123e-45.
+ // StringToDouble("123e") -> 123.0 // trailing junk ignored.
+ // StringToDouble("123e-") -> 123.0 // trailing junk ignored.
+ // StringToDouble("+NaN") -> NaN // NaN string literal.
+ // StringToDouble("-infinity") -> -inf. // infinity literal.
+ // StringToDouble("Infinity") -> NaN // junk_string_value.
+ //
+ // flags = ALLOW_OCTAL | ALLOW_LEADING_SPACES,
+ // empty_string_value = 0.0,
+ // junk_string_value = NaN,
+ // infinity_symbol = NULL,
+ // nan_symbol = NULL:
+ // StringToDouble("0x1234") -> NaN // junk_string_value.
+ // StringToDouble("01234") -> 668.0.
+ // StringToDouble("") -> 0.0 // empty_string_value.
+ // StringToDouble(" ") -> 0.0 // empty_string_value.
+ // StringToDouble(" 1") -> 1.0
+ // StringToDouble("0x") -> NaN // junk_string_value.
+ // StringToDouble("0123e45") -> NaN // junk_string_value.
+ // StringToDouble("01239E45") -> 1239e45.
+ // StringToDouble("-infinity") -> NaN // junk_string_value.
+ // StringToDouble("NaN") -> NaN // junk_string_value.
+ //
+ // flags = NO_FLAGS,
+ // separator = ' ':
+ // StringToDouble("1 2 3 4") -> 1234.0
+ // StringToDouble("1 2") -> NaN // junk_string_value
+ // StringToDouble("1 000 000.0") -> 1000000.0
+ // StringToDouble("1.000 000") -> 1.0
+ // StringToDouble("1.0e1 000") -> NaN // junk_string_value
+ StringToDoubleConverter(int flags,
+ double empty_string_value,
+ double junk_string_value,
+ const char* infinity_symbol,
+ const char* nan_symbol,
+ uc16 separator = kNoSeparator)
+ : flags_(flags),
+ empty_string_value_(empty_string_value),
+ junk_string_value_(junk_string_value),
+ infinity_symbol_(infinity_symbol),
+ nan_symbol_(nan_symbol),
+ separator_(separator) {
+ }
+
+ // Performs the conversion.
+ // The output parameter 'processed_characters_count' is set to the number
+ // of characters that have been processed to read the number.
+ // Spaces than are processed with ALLOW_{LEADING|TRAILING}_SPACES are included
+ // in the 'processed_characters_count'. Trailing junk is never included.
+ double StringToDouble(const char* buffer,
+ int length,
+ int* processed_characters_count) const;
+
+ // Same as StringToDouble above but for 16 bit characters.
+ double StringToDouble(const uc16* buffer,
+ int length,
+ int* processed_characters_count) const;
+
+ // Same as StringToDouble but reads a float.
+ // Note that this is not equivalent to static_cast<float>(StringToDouble(...))
+ // due to potential double-rounding.
+ float StringToFloat(const char* buffer,
+ int length,
+ int* processed_characters_count) const;
+
+ // Same as StringToFloat above but for 16 bit characters.
+ float StringToFloat(const uc16* buffer,
+ int length,
+ int* processed_characters_count) const;
+
+ private:
+ const int flags_;
+ const double empty_string_value_;
+ const double junk_string_value_;
+ const char* const infinity_symbol_;
+ const char* const nan_symbol_;
+ const uc16 separator_;
+
+ template <class Iterator>
+ double StringToIeee(Iterator start_pointer,
+ int length,
+ bool read_as_double,
+ int* processed_characters_count) const;
+
+ DOUBLE_CONVERSION_DISALLOW_IMPLICIT_CONSTRUCTORS(StringToDoubleConverter);
+};
+
+} // namespace double_conversion
+
+// ICU PATCH: Close ICU namespace
+U_NAMESPACE_END
+
+#endif // DOUBLE_CONVERSION_STRING_TO_DOUBLE_H_
+#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-strtod.cpp b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-strtod.cpp
index be9b0b3bce0..9cf48544267 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-strtod.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-strtod.cpp
@@ -34,16 +34,15 @@
#include "unicode/utypes.h"
#if !UCONFIG_NO_FORMATTING
-#include <stdarg.h>
-#include <limits.h>
+#include <climits>
+#include <cstdarg>
// ICU PATCH: Customize header file paths for ICU.
-// The file fixed-dtoa.h is not needed.
-#include "double-conversion-strtod.h"
#include "double-conversion-bignum.h"
#include "double-conversion-cached-powers.h"
#include "double-conversion-ieee.h"
+#include "double-conversion-strtod.h"
// ICU PATCH: Wrap in ICU namespace
U_NAMESPACE_BEGIN
@@ -67,7 +66,7 @@ static const int kMaxDecimalPower = 309;
static const int kMinDecimalPower = -324;
// 2^64 = 18446744073709551616
-static const uint64_t kMaxUint64 = UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF);
+static const uint64_t kMaxUint64 = DOUBLE_CONVERSION_UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF);
static const double exact_powers_of_ten[] = {
@@ -96,7 +95,7 @@ static const double exact_powers_of_ten[] = {
// 10^22 = 0x21e19e0c9bab2400000 = 0x878678326eac9 * 2^22
10000000000000000000000.0
};
-static const int kExactPowersOfTenSize = ARRAY_SIZE(exact_powers_of_ten);
+static const int kExactPowersOfTenSize = DOUBLE_CONVERSION_ARRAY_SIZE(exact_powers_of_ten);
// Maximum number of significant digits in the decimal representation.
// In fact the value is 772 (see conversions.cc), but to give us some margin
@@ -132,7 +131,7 @@ static void CutToMaxSignificantDigits(Vector<const char> buffer,
}
// The input buffer has been trimmed. Therefore the last digit must be
// different from '0'.
- ASSERT(buffer[buffer.length() - 1] != '0');
+ DOUBLE_CONVERSION_ASSERT(buffer[buffer.length() - 1] != '0');
// Set the last digit to be non-zero. This is sufficient to guarantee
// correct rounding.
significant_buffer[kMaxSignificantDecimalDigits - 1] = '1';
@@ -153,7 +152,7 @@ static void TrimAndCut(Vector<const char> buffer, int exponent,
exponent += left_trimmed.length() - right_trimmed.length();
if (right_trimmed.length() > kMaxSignificantDecimalDigits) {
(void) space_size; // Mark variable as used.
- ASSERT(space_size >= kMaxSignificantDecimalDigits);
+ DOUBLE_CONVERSION_ASSERT(space_size >= kMaxSignificantDecimalDigits);
CutToMaxSignificantDigits(right_trimmed, exponent,
buffer_copy_space, updated_exponent);
*trimmed = Vector<const char>(buffer_copy_space,
@@ -176,7 +175,7 @@ static uint64_t ReadUint64(Vector<const char> buffer,
int i = 0;
while (i < buffer.length() && result <= (kMaxUint64 / 10 - 1)) {
int digit = buffer[i++] - '0';
- ASSERT(0 <= digit && digit <= 9);
+ DOUBLE_CONVERSION_ASSERT(0 <= digit && digit <= 9);
result = 10 * result + digit;
}
*number_of_read_digits = i;
@@ -220,7 +219,7 @@ static bool DoubleStrtod(Vector<const char> trimmed,
// Note that the ARM simulator is compiled for 32bits. It therefore exhibits
// the same problem.
return false;
-#endif
+#else
if (trimmed.length() <= kMaxExactDoubleIntegerDecimalDigits) {
int read_digits;
// The trimmed input fits into a double.
@@ -232,14 +231,14 @@ static bool DoubleStrtod(Vector<const char> trimmed,
if (exponent < 0 && -exponent < kExactPowersOfTenSize) {
// 10^-exponent fits into a double.
*result = static_cast<double>(ReadUint64(trimmed, &read_digits));
- ASSERT(read_digits == trimmed.length());
+ DOUBLE_CONVERSION_ASSERT(read_digits == trimmed.length());
*result /= exact_powers_of_ten[-exponent];
return true;
}
if (0 <= exponent && exponent < kExactPowersOfTenSize) {
// 10^exponent fits into a double.
*result = static_cast<double>(ReadUint64(trimmed, &read_digits));
- ASSERT(read_digits == trimmed.length());
+ DOUBLE_CONVERSION_ASSERT(read_digits == trimmed.length());
*result *= exact_powers_of_ten[exponent];
return true;
}
@@ -251,34 +250,35 @@ static bool DoubleStrtod(Vector<const char> trimmed,
// 10^remaining_digits. As a result the remaining exponent now fits
// into a double too.
*result = static_cast<double>(ReadUint64(trimmed, &read_digits));
- ASSERT(read_digits == trimmed.length());
+ DOUBLE_CONVERSION_ASSERT(read_digits == trimmed.length());
*result *= exact_powers_of_ten[remaining_digits];
*result *= exact_powers_of_ten[exponent - remaining_digits];
return true;
}
}
return false;
+#endif
}
// Returns 10^exponent as an exact DiyFp.
// The given exponent must be in the range [1; kDecimalExponentDistance[.
static DiyFp AdjustmentPowerOfTen(int exponent) {
- ASSERT(0 < exponent);
- ASSERT(exponent < PowersOfTenCache::kDecimalExponentDistance);
+ DOUBLE_CONVERSION_ASSERT(0 < exponent);
+ DOUBLE_CONVERSION_ASSERT(exponent < PowersOfTenCache::kDecimalExponentDistance);
// Simply hardcode the remaining powers for the given decimal exponent
// distance.
- ASSERT(PowersOfTenCache::kDecimalExponentDistance == 8);
+ DOUBLE_CONVERSION_ASSERT(PowersOfTenCache::kDecimalExponentDistance == 8);
switch (exponent) {
- case 1: return DiyFp(UINT64_2PART_C(0xa0000000, 00000000), -60);
- case 2: return DiyFp(UINT64_2PART_C(0xc8000000, 00000000), -57);
- case 3: return DiyFp(UINT64_2PART_C(0xfa000000, 00000000), -54);
- case 4: return DiyFp(UINT64_2PART_C(0x9c400000, 00000000), -50);
- case 5: return DiyFp(UINT64_2PART_C(0xc3500000, 00000000), -47);
- case 6: return DiyFp(UINT64_2PART_C(0xf4240000, 00000000), -44);
- case 7: return DiyFp(UINT64_2PART_C(0x98968000, 00000000), -40);
+ case 1: return DiyFp(DOUBLE_CONVERSION_UINT64_2PART_C(0xa0000000, 00000000), -60);
+ case 2: return DiyFp(DOUBLE_CONVERSION_UINT64_2PART_C(0xc8000000, 00000000), -57);
+ case 3: return DiyFp(DOUBLE_CONVERSION_UINT64_2PART_C(0xfa000000, 00000000), -54);
+ case 4: return DiyFp(DOUBLE_CONVERSION_UINT64_2PART_C(0x9c400000, 00000000), -50);
+ case 5: return DiyFp(DOUBLE_CONVERSION_UINT64_2PART_C(0xc3500000, 00000000), -47);
+ case 6: return DiyFp(DOUBLE_CONVERSION_UINT64_2PART_C(0xf4240000, 00000000), -44);
+ case 7: return DiyFp(DOUBLE_CONVERSION_UINT64_2PART_C(0x98968000, 00000000), -40);
default:
- UNREACHABLE();
+ DOUBLE_CONVERSION_UNREACHABLE();
}
}
@@ -307,7 +307,7 @@ static bool DiyFpStrtod(Vector<const char> buffer,
input.Normalize();
error <<= old_e - input.e();
- ASSERT(exponent <= PowersOfTenCache::kMaxDecimalExponent);
+ DOUBLE_CONVERSION_ASSERT(exponent <= PowersOfTenCache::kMaxDecimalExponent);
if (exponent < PowersOfTenCache::kMinDecimalExponent) {
*result = 0.0;
return true;
@@ -325,7 +325,7 @@ static bool DiyFpStrtod(Vector<const char> buffer,
if (kMaxUint64DecimalDigits - buffer.length() >= adjustment_exponent) {
// The product of input with the adjustment power fits into a 64 bit
// integer.
- ASSERT(DiyFp::kSignificandSize == 64);
+ DOUBLE_CONVERSION_ASSERT(DiyFp::kSignificandSize == 64);
} else {
// The adjustment power is exact. There is hence only an error of 0.5.
error += kDenominator / 2;
@@ -367,8 +367,8 @@ static bool DiyFpStrtod(Vector<const char> buffer,
precision_digits_count -= shift_amount;
}
// We use uint64_ts now. This only works if the DiyFp uses uint64_ts too.
- ASSERT(DiyFp::kSignificandSize == 64);
- ASSERT(precision_digits_count < 64);
+ DOUBLE_CONVERSION_ASSERT(DiyFp::kSignificandSize == 64);
+ DOUBLE_CONVERSION_ASSERT(precision_digits_count < 64);
uint64_t one64 = 1;
uint64_t precision_bits_mask = (one64 << precision_digits_count) - 1;
uint64_t precision_bits = input.f() & precision_bits_mask;
@@ -407,14 +407,14 @@ static bool DiyFpStrtod(Vector<const char> buffer,
static int CompareBufferWithDiyFp(Vector<const char> buffer,
int exponent,
DiyFp diy_fp) {
- ASSERT(buffer.length() + exponent <= kMaxDecimalPower + 1);
- ASSERT(buffer.length() + exponent > kMinDecimalPower);
- ASSERT(buffer.length() <= kMaxSignificantDecimalDigits);
+ DOUBLE_CONVERSION_ASSERT(buffer.length() + exponent <= kMaxDecimalPower + 1);
+ DOUBLE_CONVERSION_ASSERT(buffer.length() + exponent > kMinDecimalPower);
+ DOUBLE_CONVERSION_ASSERT(buffer.length() <= kMaxSignificantDecimalDigits);
// Make sure that the Bignum will be able to hold all our numbers.
// Our Bignum implementation has a separate field for exponents. Shifts will
// consume at most one bigit (< 64 bits).
// ln(10) == 3.3219...
- ASSERT(((kMaxDecimalPower + 1) * 333 / 100) < Bignum::kMaxSignificantBits);
+ DOUBLE_CONVERSION_ASSERT(((kMaxDecimalPower + 1) * 333 / 100) < Bignum::kMaxSignificantBits);
Bignum buffer_bignum;
Bignum diy_fp_bignum;
buffer_bignum.AssignDecimalString(buffer);
@@ -460,18 +460,33 @@ static bool ComputeGuess(Vector<const char> trimmed, int exponent,
return false;
}
-double Strtod(Vector<const char> buffer, int exponent) {
- char copy_buffer[kMaxSignificantDecimalDigits];
- Vector<const char> trimmed;
- int updated_exponent;
- TrimAndCut(buffer, exponent, copy_buffer, kMaxSignificantDecimalDigits,
- &trimmed, &updated_exponent);
- exponent = updated_exponent;
+#if U_DEBUG // needed for ICU only in debug mode
+static bool IsDigit(const char d) {
+ return ('0' <= d) && (d <= '9');
+}
- double guess;
- bool is_correct = ComputeGuess(trimmed, exponent, &guess);
- if (is_correct) return guess;
+static bool IsNonZeroDigit(const char d) {
+ return ('1' <= d) && (d <= '9');
+}
+
+static bool AssertTrimmedDigits(const Vector<const char>& buffer) {
+ for(int i = 0; i < buffer.length(); ++i) {
+ if(!IsDigit(buffer[i])) {
+ return false;
+ }
+ }
+ return (buffer.length() == 0) || (IsNonZeroDigit(buffer[0]) && IsNonZeroDigit(buffer[buffer.length()-1]));
+}
+#endif // needed for ICU only in debug mode
+double StrtodTrimmed(Vector<const char> trimmed, int exponent) {
+ DOUBLE_CONVERSION_ASSERT(trimmed.length() <= kMaxSignificantDecimalDigits);
+ DOUBLE_CONVERSION_ASSERT(AssertTrimmedDigits(trimmed));
+ double guess;
+ const bool is_correct = ComputeGuess(trimmed, exponent, &guess);
+ if (is_correct) {
+ return guess;
+ }
DiyFp upper_boundary = Double(guess).UpperBoundary();
int comparison = CompareBufferWithDiyFp(trimmed, exponent, upper_boundary);
if (comparison < 0) {
@@ -486,6 +501,39 @@ double Strtod(Vector<const char> buffer, int exponent) {
}
}
+double Strtod(Vector<const char> buffer, int exponent) {
+ char copy_buffer[kMaxSignificantDecimalDigits];
+ Vector<const char> trimmed;
+ int updated_exponent;
+ TrimAndCut(buffer, exponent, copy_buffer, kMaxSignificantDecimalDigits,
+ &trimmed, &updated_exponent);
+ return StrtodTrimmed(trimmed, updated_exponent);
+}
+
+static float SanitizedDoubletof(double d) {
+ DOUBLE_CONVERSION_ASSERT(d >= 0.0);
+ // ASAN has a sanitize check that disallows casting doubles to floats if
+ // they are too big.
+ // https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html#available-checks
+ // The behavior should be covered by IEEE 754, but some projects use this
+ // flag, so work around it.
+ float max_finite = 3.4028234663852885981170418348451692544e+38;
+ // The half-way point between the max-finite and infinity value.
+ // Since infinity has an even significand everything equal or greater than
+ // this value should become infinity.
+ double half_max_finite_infinity =
+ 3.40282356779733661637539395458142568448e+38;
+ if (d >= max_finite) {
+ if (d >= half_max_finite_infinity) {
+ return Single::Infinity();
+ } else {
+ return max_finite;
+ }
+ } else {
+ return static_cast<float>(d);
+ }
+}
+
float Strtof(Vector<const char> buffer, int exponent) {
char copy_buffer[kMaxSignificantDecimalDigits];
Vector<const char> trimmed;
@@ -497,7 +545,7 @@ float Strtof(Vector<const char> buffer, int exponent) {
double double_guess;
bool is_correct = ComputeGuess(trimmed, exponent, &double_guess);
- float float_guess = static_cast<float>(double_guess);
+ float float_guess = SanitizedDoubletof(double_guess);
if (float_guess == double_guess) {
// This shortcut triggers for integer values.
return float_guess;
@@ -520,18 +568,18 @@ float Strtof(Vector<const char> buffer, int exponent) {
double double_next = Double(double_guess).NextDouble();
double double_previous = Double(double_guess).PreviousDouble();
- float f1 = static_cast<float>(double_previous);
+ float f1 = SanitizedDoubletof(double_previous);
float f2 = float_guess;
- float f3 = static_cast<float>(double_next);
+ float f3 = SanitizedDoubletof(double_next);
float f4;
if (is_correct) {
f4 = f3;
} else {
double double_next2 = Double(double_next).NextDouble();
- f4 = static_cast<float>(double_next2);
+ f4 = SanitizedDoubletof(double_next2);
}
(void) f2; // Mark variable as used.
- ASSERT(f1 <= f2 && f2 <= f3 && f3 <= f4);
+ DOUBLE_CONVERSION_ASSERT(f1 <= f2 && f2 <= f3 && f3 <= f4);
// If the guess doesn't lie near a single-precision boundary we can simply
// return its float-value.
@@ -539,11 +587,11 @@ float Strtof(Vector<const char> buffer, int exponent) {
return float_guess;
}
- ASSERT((f1 != f2 && f2 == f3 && f3 == f4) ||
+ DOUBLE_CONVERSION_ASSERT((f1 != f2 && f2 == f3 && f3 == f4) ||
(f1 == f2 && f2 != f3 && f3 == f4) ||
(f1 == f2 && f2 == f3 && f3 != f4));
- // guess and next are the two possible canditates (in the same way that
+ // guess and next are the two possible candidates (in the same way that
// double_guess was the lower candidate for a double-precision guess).
float guess = f1;
float next = f4;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-strtod.h b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-strtod.h
index e2d6d3c2fe5..50ef746401a 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-strtod.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-strtod.h
@@ -54,6 +54,11 @@ double Strtod(Vector<const char> buffer, int exponent);
// contain a dot or a sign. It must not start with '0', and must not be empty.
float Strtof(Vector<const char> buffer, int exponent);
+// For special use cases, the heart of the Strtod() function is also available
+// separately, it assumes that 'trimmed' is as produced by TrimAndCut(), i.e.
+// no leading or trailing zeros, also no lone zero, and not 'too many' digits.
+double StrtodTrimmed(Vector<const char> trimmed, int exponent);
+
} // namespace double_conversion
// ICU PATCH: Close ICU namespace
diff --git a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-utils.h b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-utils.h
index 57fc49b231a..099298460c6 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/double-conversion-utils.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/double-conversion-utils.h
@@ -37,15 +37,17 @@
#ifndef DOUBLE_CONVERSION_UTILS_H_
#define DOUBLE_CONVERSION_UTILS_H_
-#include <stdlib.h>
-#include <string.h>
+#include <cstdlib>
+#include <cstring>
// ICU PATCH: Use U_ASSERT instead of <assert.h>
#include "uassert.h"
-#define ASSERT U_ASSERT
-
-#ifndef UNIMPLEMENTED
-#define UNIMPLEMENTED() (abort())
+#ifndef DOUBLE_CONVERSION_ASSERT
+#define DOUBLE_CONVERSION_ASSERT(condition) \
+ U_ASSERT(condition);
+#endif
+#ifndef DOUBLE_CONVERSION_UNIMPLEMENTED
+#define DOUBLE_CONVERSION_UNIMPLEMENTED() (abort())
#endif
#ifndef DOUBLE_CONVERSION_NO_RETURN
#ifdef _MSC_VER
@@ -54,16 +56,23 @@
#define DOUBLE_CONVERSION_NO_RETURN __attribute__((noreturn))
#endif
#endif
-#ifndef UNREACHABLE
+#ifndef DOUBLE_CONVERSION_UNREACHABLE
#ifdef _MSC_VER
void DOUBLE_CONVERSION_NO_RETURN abort_noreturn();
inline void abort_noreturn() { abort(); }
-#define UNREACHABLE() (abort_noreturn())
+#define DOUBLE_CONVERSION_UNREACHABLE() (abort_noreturn())
#else
-#define UNREACHABLE() (abort())
+#define DOUBLE_CONVERSION_UNREACHABLE() (abort())
#endif
#endif
+#ifndef DOUBLE_CONVERSION_UNUSED
+#ifdef __GNUC__
+#define DOUBLE_CONVERSION_UNUSED __attribute__((unused))
+#else
+#define DOUBLE_CONVERSION_UNUSED
+#endif
+#endif
// Double operations detection based on target architecture.
// Linux uses a 80bit wide floating point stack on x86. This induces double
@@ -75,7 +84,22 @@ inline void abort_noreturn() { abort(); }
// the output of the division with the expected result. (Inlining must be
// disabled.)
// On Linux,x86 89255e-22 != Div_double(89255.0/1e22)
-// ICU PATCH: Enable ARM32 & ARM64 builds for Windows with 'defined(_M_ARM) || defined(_M_ARM64)'.
+//
+// For example:
+/*
+// -- in div.c
+double Div_double(double x, double y) { return x / y; }
+
+// -- in main.c
+double Div_double(double x, double y); // Forward declaration.
+
+int main(int argc, char** argv) {
+ return Div_double(89255.0, 1e22) == 89255e-22;
+}
+*/
+// Run as follows ./main || echo "correct"
+//
+// If it prints "correct" then the architecture should be here, in the "correct" section.
#if defined(_M_X64) || defined(__x86_64__) || \
defined(__ARMEL__) || defined(__avr32__) || defined(_M_ARM) || defined(_M_ARM64) || \
defined(__hppa__) || defined(__ia64__) || \
@@ -84,11 +108,14 @@ inline void abort_noreturn() { abort(); }
defined(_POWER) || defined(_ARCH_PPC) || defined(_ARCH_PPC64) || \
defined(__sparc__) || defined(__sparc) || defined(__s390__) || \
defined(__SH4__) || defined(__alpha__) || \
- defined(_MIPS_ARCH_MIPS32R2) || \
- defined(__AARCH64EL__) || defined(__aarch64__) || \
- defined(__riscv)
+ defined(_MIPS_ARCH_MIPS32R2) || defined(__ARMEB__) ||\
+ defined(__AARCH64EL__) || defined(__aarch64__) || defined(__AARCH64EB__) || \
+ defined(__riscv) || defined(__e2k__) || \
+ defined(__or1k__) || defined(__arc__) || \
+ defined(__EMSCRIPTEN__)
#define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1
-#elif defined(__mc68000__)
+#elif defined(__mc68000__) || \
+ defined(__pnacl__) || defined(__native_client__)
#undef DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS
#elif defined(_M_IX86) || defined(__i386__) || defined(__i386)
#if defined(_WIN32)
@@ -101,12 +128,6 @@ inline void abort_noreturn() { abort(); }
#error Target architecture was not detected as supported by Double-Conversion.
#endif
-#if defined(__GNUC__)
-#define DOUBLE_CONVERSION_UNUSED __attribute__((unused))
-#else
-#define DOUBLE_CONVERSION_UNUSED
-#endif
-
#if defined(_WIN32) && !defined(__MINGW32__)
typedef signed char int8_t;
@@ -129,24 +150,24 @@ typedef uint16_t uc16;
// The following macro works on both 32 and 64-bit platforms.
// Usage: instead of writing 0x1234567890123456
-// write UINT64_2PART_C(0x12345678,90123456);
-#define UINT64_2PART_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u))
+// write DOUBLE_CONVERSION_UINT64_2PART_C(0x12345678,90123456);
+#define DOUBLE_CONVERSION_UINT64_2PART_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u))
-// The expression ARRAY_SIZE(a) is a compile-time constant of type
+// The expression DOUBLE_CONVERSION_ARRAY_SIZE(a) is a compile-time constant of type
// size_t which represents the number of elements of the given
-// array. You should only use ARRAY_SIZE on statically allocated
+// array. You should only use DOUBLE_CONVERSION_ARRAY_SIZE on statically allocated
// arrays.
-#ifndef ARRAY_SIZE
-#define ARRAY_SIZE(a) \
+#ifndef DOUBLE_CONVERSION_ARRAY_SIZE
+#define DOUBLE_CONVERSION_ARRAY_SIZE(a) \
((sizeof(a) / sizeof(*(a))) / \
static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
#endif
// A macro to disallow the evil copy constructor and operator= functions
// This should be used in the private: declarations for a class
-#ifndef DISALLOW_COPY_AND_ASSIGN
-#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
+#ifndef DOUBLE_CONVERSION_DISALLOW_COPY_AND_ASSIGN
+#define DOUBLE_CONVERSION_DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
#endif
@@ -157,10 +178,10 @@ typedef uint16_t uc16;
// This should be used in the private: declarations for a class
// that wants to prevent anyone from instantiating it. This is
// especially useful for classes containing only static methods.
-#ifndef DISALLOW_IMPLICIT_CONSTRUCTORS
-#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
+#ifndef DOUBLE_CONVERSION_DISALLOW_IMPLICIT_CONSTRUCTORS
+#define DOUBLE_CONVERSION_DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
TypeName(); \
- DISALLOW_COPY_AND_ASSIGN(TypeName)
+ DOUBLE_CONVERSION_DISALLOW_COPY_AND_ASSIGN(TypeName)
#endif
// ICU PATCH: Wrap in ICU namespace
@@ -168,25 +189,9 @@ U_NAMESPACE_BEGIN
namespace double_conversion {
-static const int kCharSize = sizeof(char);
-
-// Returns the maximum of the two parameters.
-template <typename T>
-static T Max(T a, T b) {
- return a < b ? b : a;
-}
-
-
-// Returns the minimum of the two parameters.
-template <typename T>
-static T Min(T a, T b) {
- return a < b ? a : b;
-}
-
-
inline int StrLength(const char* string) {
size_t length = strlen(string);
- ASSERT(length == static_cast<size_t>(static_cast<int>(length)));
+ DOUBLE_CONVERSION_ASSERT(length == static_cast<size_t>(static_cast<int>(length)));
return static_cast<int>(length);
}
@@ -196,15 +201,15 @@ class Vector {
public:
Vector() : start_(NULL), length_(0) {}
Vector(T* data, int len) : start_(data), length_(len) {
- ASSERT(len == 0 || (len > 0 && data != NULL));
+ DOUBLE_CONVERSION_ASSERT(len == 0 || (len > 0 && data != NULL));
}
// Returns a vector using the same backing storage as this one,
// spanning from and including 'from', to but not including 'to'.
Vector<T> SubVector(int from, int to) {
- ASSERT(to <= length_);
- ASSERT(from < to);
- ASSERT(0 <= from);
+ DOUBLE_CONVERSION_ASSERT(to <= length_);
+ DOUBLE_CONVERSION_ASSERT(from < to);
+ DOUBLE_CONVERSION_ASSERT(0 <= from);
return Vector<T>(start() + from, to - from);
}
@@ -219,7 +224,7 @@ class Vector {
// Access individual vector elements - checks bounds in debug mode.
T& operator[](int index) const {
- ASSERT(0 <= index && index < length_);
+ DOUBLE_CONVERSION_ASSERT(0 <= index && index < length_);
return start_[index];
}
@@ -227,6 +232,11 @@ class Vector {
T& last() { return start_[length_ - 1]; }
+ void pop_back() {
+ DOUBLE_CONVERSION_ASSERT(!is_empty());
+ --length_;
+ }
+
private:
T* start_;
int length_;
@@ -247,7 +257,7 @@ class StringBuilder {
// Get the current position in the builder.
int position() const {
- ASSERT(!is_finalized());
+ DOUBLE_CONVERSION_ASSERT(!is_finalized());
return position_;
}
@@ -258,8 +268,8 @@ class StringBuilder {
// 0-characters; use the Finalize() method to terminate the string
// instead.
void AddCharacter(char c) {
- ASSERT(c != '\0');
- ASSERT(!is_finalized() && position_ < buffer_.length());
+ DOUBLE_CONVERSION_ASSERT(c != '\0');
+ DOUBLE_CONVERSION_ASSERT(!is_finalized() && position_ < buffer_.length());
buffer_[position_++] = c;
}
@@ -272,9 +282,9 @@ class StringBuilder {
// Add the first 'n' characters of the given string 's' to the
// builder. The input string must have enough characters.
void AddSubstring(const char* s, int n) {
- ASSERT(!is_finalized() && position_ + n < buffer_.length());
- ASSERT(static_cast<size_t>(n) <= strlen(s));
- memmove(&buffer_[position_], s, n * kCharSize);
+ DOUBLE_CONVERSION_ASSERT(!is_finalized() && position_ + n < buffer_.length());
+ DOUBLE_CONVERSION_ASSERT(static_cast<size_t>(n) <= strlen(s));
+ memmove(&buffer_[position_], s, n);
position_ += n;
}
@@ -289,13 +299,13 @@ class StringBuilder {
// Finalize the string by 0-terminating it and returning the buffer.
char* Finalize() {
- ASSERT(!is_finalized() && position_ < buffer_.length());
+ DOUBLE_CONVERSION_ASSERT(!is_finalized() && position_ < buffer_.length());
buffer_[position_] = '\0';
// Make sure nobody managed to add a 0-character to the
// buffer while building the string.
- ASSERT(strlen(buffer_.start()) == static_cast<size_t>(position_));
+ DOUBLE_CONVERSION_ASSERT(strlen(buffer_.start()) == static_cast<size_t>(position_));
position_ = -1;
- ASSERT(is_finalized());
+ DOUBLE_CONVERSION_ASSERT(is_finalized());
return buffer_.start();
}
@@ -305,7 +315,7 @@ class StringBuilder {
bool is_finalized() const { return position_ < 0; }
- DISALLOW_IMPLICIT_CONSTRUCTORS(StringBuilder);
+ DOUBLE_CONVERSION_DISALLOW_IMPLICIT_CONSTRUCTORS(StringBuilder);
};
// The type-based aliasing rule allows the compiler to assume that pointers of
@@ -333,11 +343,16 @@ class StringBuilder {
// enough that it can no longer see that you have cast one pointer type to
// another thus avoiding the warning.
template <class Dest, class Source>
-inline Dest BitCast(const Source& source) {
+Dest BitCast(const Source& source) {
// Compile time assertion: sizeof(Dest) == sizeof(Source)
// A compile error here means your Dest and Source have different sizes.
+#if __cplusplus >= 201103L
+ static_assert(sizeof(Dest) == sizeof(Source),
+ "source and destination size mismatch");
+#else
DOUBLE_CONVERSION_UNUSED
- typedef char VerifySizesAreEqual[sizeof(Dest) == sizeof(Source) ? 1 : -1];
+ typedef char VerifySizesAreEqual[sizeof(Dest) == sizeof(Source) ? 1 : -1];
+#endif
Dest dest;
memmove(&dest, &source, sizeof(dest));
@@ -345,7 +360,7 @@ inline Dest BitCast(const Source& source) {
}
template <class Dest, class Source>
-inline Dest BitCast(Source* source) {
+Dest BitCast(Source* source) {
return BitCast<Dest>(reinterpret_cast<uintptr_t>(source));
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/double-conversion.h b/Build/source/libs/icu/icu-src/source/i18n/double-conversion.h
index 200537a360a..eddc38763be 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/double-conversion.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/double-conversion.h
@@ -39,528 +39,8 @@
// ICU PATCH: Customize header file paths for ICU.
-#include "double-conversion-utils.h"
-
-// ICU PATCH: Wrap in ICU namespace
-U_NAMESPACE_BEGIN
-
-namespace double_conversion {
-
-class DoubleToStringConverter {
- public:
-#if 0 // not needed for ICU
- // When calling ToFixed with a double > 10^kMaxFixedDigitsBeforePoint
- // or a requested_digits parameter > kMaxFixedDigitsAfterPoint then the
- // function returns false.
- static const int kMaxFixedDigitsBeforePoint = 60;
- static const int kMaxFixedDigitsAfterPoint = 60;
-
- // When calling ToExponential with a requested_digits
- // parameter > kMaxExponentialDigits then the function returns false.
- static const int kMaxExponentialDigits = 120;
-
- // When calling ToPrecision with a requested_digits
- // parameter < kMinPrecisionDigits or requested_digits > kMaxPrecisionDigits
- // then the function returns false.
- static const int kMinPrecisionDigits = 1;
- static const int kMaxPrecisionDigits = 120;
-
- enum Flags {
- NO_FLAGS = 0,
- EMIT_POSITIVE_EXPONENT_SIGN = 1,
- EMIT_TRAILING_DECIMAL_POINT = 2,
- EMIT_TRAILING_ZERO_AFTER_POINT = 4,
- UNIQUE_ZERO = 8
- };
-
- // Flags should be a bit-or combination of the possible Flags-enum.
- // - NO_FLAGS: no special flags.
- // - EMIT_POSITIVE_EXPONENT_SIGN: when the number is converted into exponent
- // form, emits a '+' for positive exponents. Example: 1.2e+2.
- // - EMIT_TRAILING_DECIMAL_POINT: when the input number is an integer and is
- // converted into decimal format then a trailing decimal point is appended.
- // Example: 2345.0 is converted to "2345.".
- // - EMIT_TRAILING_ZERO_AFTER_POINT: in addition to a trailing decimal point
- // emits a trailing '0'-character. This flag requires the
- // EXMIT_TRAILING_DECIMAL_POINT flag.
- // Example: 2345.0 is converted to "2345.0".
- // - UNIQUE_ZERO: "-0.0" is converted to "0.0".
- //
- // Infinity symbol and nan_symbol provide the string representation for these
- // special values. If the string is NULL and the special value is encountered
- // then the conversion functions return false.
- //
- // The exponent_character is used in exponential representations. It is
- // usually 'e' or 'E'.
- //
- // When converting to the shortest representation the converter will
- // represent input numbers in decimal format if they are in the interval
- // [10^decimal_in_shortest_low; 10^decimal_in_shortest_high[
- // (lower boundary included, greater boundary excluded).
- // Example: with decimal_in_shortest_low = -6 and
- // decimal_in_shortest_high = 21:
- // ToShortest(0.000001) -> "0.000001"
- // ToShortest(0.0000001) -> "1e-7"
- // ToShortest(111111111111111111111.0) -> "111111111111111110000"
- // ToShortest(100000000000000000000.0) -> "100000000000000000000"
- // ToShortest(1111111111111111111111.0) -> "1.1111111111111111e+21"
- //
- // When converting to precision mode the converter may add
- // max_leading_padding_zeroes before returning the number in exponential
- // format.
- // Example with max_leading_padding_zeroes_in_precision_mode = 6.
- // ToPrecision(0.0000012345, 2) -> "0.0000012"
- // ToPrecision(0.00000012345, 2) -> "1.2e-7"
- // Similarily the converter may add up to
- // max_trailing_padding_zeroes_in_precision_mode in precision mode to avoid
- // returning an exponential representation. A zero added by the
- // EMIT_TRAILING_ZERO_AFTER_POINT flag is counted for this limit.
- // Examples for max_trailing_padding_zeroes_in_precision_mode = 1:
- // ToPrecision(230.0, 2) -> "230"
- // ToPrecision(230.0, 2) -> "230." with EMIT_TRAILING_DECIMAL_POINT.
- // ToPrecision(230.0, 2) -> "2.3e2" with EMIT_TRAILING_ZERO_AFTER_POINT.
- DoubleToStringConverter(int flags,
- const char* infinity_symbol,
- const char* nan_symbol,
- char exponent_character,
- int decimal_in_shortest_low,
- int decimal_in_shortest_high,
- int max_leading_padding_zeroes_in_precision_mode,
- int max_trailing_padding_zeroes_in_precision_mode)
- : flags_(flags),
- infinity_symbol_(infinity_symbol),
- nan_symbol_(nan_symbol),
- exponent_character_(exponent_character),
- decimal_in_shortest_low_(decimal_in_shortest_low),
- decimal_in_shortest_high_(decimal_in_shortest_high),
- max_leading_padding_zeroes_in_precision_mode_(
- max_leading_padding_zeroes_in_precision_mode),
- max_trailing_padding_zeroes_in_precision_mode_(
- max_trailing_padding_zeroes_in_precision_mode) {
- // When 'trailing zero after the point' is set, then 'trailing point'
- // must be set too.
- ASSERT(((flags & EMIT_TRAILING_DECIMAL_POINT) != 0) ||
- !((flags & EMIT_TRAILING_ZERO_AFTER_POINT) != 0));
- }
-
- // Returns a converter following the EcmaScript specification.
- static const DoubleToStringConverter& EcmaScriptConverter();
-
- // Computes the shortest string of digits that correctly represent the input
- // number. Depending on decimal_in_shortest_low and decimal_in_shortest_high
- // (see constructor) it then either returns a decimal representation, or an
- // exponential representation.
- // Example with decimal_in_shortest_low = -6,
- // decimal_in_shortest_high = 21,
- // EMIT_POSITIVE_EXPONENT_SIGN activated, and
- // EMIT_TRAILING_DECIMAL_POINT deactived:
- // ToShortest(0.000001) -> "0.000001"
- // ToShortest(0.0000001) -> "1e-7"
- // ToShortest(111111111111111111111.0) -> "111111111111111110000"
- // ToShortest(100000000000000000000.0) -> "100000000000000000000"
- // ToShortest(1111111111111111111111.0) -> "1.1111111111111111e+21"
- //
- // Note: the conversion may round the output if the returned string
- // is accurate enough to uniquely identify the input-number.
- // For example the most precise representation of the double 9e59 equals
- // "899999999999999918767229449717619953810131273674690656206848", but
- // the converter will return the shorter (but still correct) "9e59".
- //
- // Returns true if the conversion succeeds. The conversion always succeeds
- // except when the input value is special and no infinity_symbol or
- // nan_symbol has been given to the constructor.
- bool ToShortest(double value, StringBuilder* result_builder) const {
- return ToShortestIeeeNumber(value, result_builder, SHORTEST);
- }
-
- // Same as ToShortest, but for single-precision floats.
- bool ToShortestSingle(float value, StringBuilder* result_builder) const {
- return ToShortestIeeeNumber(value, result_builder, SHORTEST_SINGLE);
- }
-
-
- // Computes a decimal representation with a fixed number of digits after the
- // decimal point. The last emitted digit is rounded.
- //
- // Examples:
- // ToFixed(3.12, 1) -> "3.1"
- // ToFixed(3.1415, 3) -> "3.142"
- // ToFixed(1234.56789, 4) -> "1234.5679"
- // ToFixed(1.23, 5) -> "1.23000"
- // ToFixed(0.1, 4) -> "0.1000"
- // ToFixed(1e30, 2) -> "1000000000000000019884624838656.00"
- // ToFixed(0.1, 30) -> "0.100000000000000005551115123126"
- // ToFixed(0.1, 17) -> "0.10000000000000001"
- //
- // If requested_digits equals 0, then the tail of the result depends on
- // the EMIT_TRAILING_DECIMAL_POINT and EMIT_TRAILING_ZERO_AFTER_POINT.
- // Examples, for requested_digits == 0,
- // let EMIT_TRAILING_DECIMAL_POINT and EMIT_TRAILING_ZERO_AFTER_POINT be
- // - false and false: then 123.45 -> 123
- // 0.678 -> 1
- // - true and false: then 123.45 -> 123.
- // 0.678 -> 1.
- // - true and true: then 123.45 -> 123.0
- // 0.678 -> 1.0
- //
- // Returns true if the conversion succeeds. The conversion always succeeds
- // except for the following cases:
- // - the input value is special and no infinity_symbol or nan_symbol has
- // been provided to the constructor,
- // - 'value' > 10^kMaxFixedDigitsBeforePoint, or
- // - 'requested_digits' > kMaxFixedDigitsAfterPoint.
- // The last two conditions imply that the result will never contain more than
- // 1 + kMaxFixedDigitsBeforePoint + 1 + kMaxFixedDigitsAfterPoint characters
- // (one additional character for the sign, and one for the decimal point).
- bool ToFixed(double value,
- int requested_digits,
- StringBuilder* result_builder) const;
-
- // Computes a representation in exponential format with requested_digits
- // after the decimal point. The last emitted digit is rounded.
- // If requested_digits equals -1, then the shortest exponential representation
- // is computed.
- //
- // Examples with EMIT_POSITIVE_EXPONENT_SIGN deactivated, and
- // exponent_character set to 'e'.
- // ToExponential(3.12, 1) -> "3.1e0"
- // ToExponential(5.0, 3) -> "5.000e0"
- // ToExponential(0.001, 2) -> "1.00e-3"
- // ToExponential(3.1415, -1) -> "3.1415e0"
- // ToExponential(3.1415, 4) -> "3.1415e0"
- // ToExponential(3.1415, 3) -> "3.142e0"
- // ToExponential(123456789000000, 3) -> "1.235e14"
- // ToExponential(1000000000000000019884624838656.0, -1) -> "1e30"
- // ToExponential(1000000000000000019884624838656.0, 32) ->
- // "1.00000000000000001988462483865600e30"
- // ToExponential(1234, 0) -> "1e3"
- //
- // Returns true if the conversion succeeds. The conversion always succeeds
- // except for the following cases:
- // - the input value is special and no infinity_symbol or nan_symbol has
- // been provided to the constructor,
- // - 'requested_digits' > kMaxExponentialDigits.
- // The last condition implies that the result will never contain more than
- // kMaxExponentialDigits + 8 characters (the sign, the digit before the
- // decimal point, the decimal point, the exponent character, the
- // exponent's sign, and at most 3 exponent digits).
- bool ToExponential(double value,
- int requested_digits,
- StringBuilder* result_builder) const;
-
- // Computes 'precision' leading digits of the given 'value' and returns them
- // either in exponential or decimal format, depending on
- // max_{leading|trailing}_padding_zeroes_in_precision_mode (given to the
- // constructor).
- // The last computed digit is rounded.
- //
- // Example with max_leading_padding_zeroes_in_precision_mode = 6.
- // ToPrecision(0.0000012345, 2) -> "0.0000012"
- // ToPrecision(0.00000012345, 2) -> "1.2e-7"
- // Similarily the converter may add up to
- // max_trailing_padding_zeroes_in_precision_mode in precision mode to avoid
- // returning an exponential representation. A zero added by the
- // EMIT_TRAILING_ZERO_AFTER_POINT flag is counted for this limit.
- // Examples for max_trailing_padding_zeroes_in_precision_mode = 1:
- // ToPrecision(230.0, 2) -> "230"
- // ToPrecision(230.0, 2) -> "230." with EMIT_TRAILING_DECIMAL_POINT.
- // ToPrecision(230.0, 2) -> "2.3e2" with EMIT_TRAILING_ZERO_AFTER_POINT.
- // Examples for max_trailing_padding_zeroes_in_precision_mode = 3, and no
- // EMIT_TRAILING_ZERO_AFTER_POINT:
- // ToPrecision(123450.0, 6) -> "123450"
- // ToPrecision(123450.0, 5) -> "123450"
- // ToPrecision(123450.0, 4) -> "123500"
- // ToPrecision(123450.0, 3) -> "123000"
- // ToPrecision(123450.0, 2) -> "1.2e5"
- //
- // Returns true if the conversion succeeds. The conversion always succeeds
- // except for the following cases:
- // - the input value is special and no infinity_symbol or nan_symbol has
- // been provided to the constructor,
- // - precision < kMinPericisionDigits
- // - precision > kMaxPrecisionDigits
- // The last condition implies that the result will never contain more than
- // kMaxPrecisionDigits + 7 characters (the sign, the decimal point, the
- // exponent character, the exponent's sign, and at most 3 exponent digits).
- bool ToPrecision(double value,
- int precision,
- StringBuilder* result_builder) const;
-#endif // not needed for ICU
-
- enum DtoaMode {
- // Produce the shortest correct representation.
- // For example the output of 0.299999999999999988897 is (the less accurate
- // but correct) 0.3.
- SHORTEST,
- // Same as SHORTEST, but for single-precision floats.
- SHORTEST_SINGLE,
- // Produce a fixed number of digits after the decimal point.
- // For instance fixed(0.1, 4) becomes 0.1000
- // If the input number is big, the output will be big.
- FIXED,
- // Fixed number of digits (independent of the decimal point).
- PRECISION
- };
-
- // The maximal number of digits that are needed to emit a double in base 10.
- // A higher precision can be achieved by using more digits, but the shortest
- // accurate representation of any double will never use more digits than
- // kBase10MaximalLength.
- // Note that DoubleToAscii null-terminates its input. So the given buffer
- // should be at least kBase10MaximalLength + 1 characters long.
- static const int kBase10MaximalLength = 17;
-
- // Converts the given double 'v' to ascii. 'v' must not be NaN, +Infinity, or
- // -Infinity. In SHORTEST_SINGLE-mode this restriction also applies to 'v'
- // after it has been casted to a single-precision float. That is, in this
- // mode static_cast<float>(v) must not be NaN, +Infinity or -Infinity.
- //
- // The result should be interpreted as buffer * 10^(point-length).
- //
- // The output depends on the given mode:
- // - SHORTEST: produce the least amount of digits for which the internal
- // identity requirement is still satisfied. If the digits are printed
- // (together with the correct exponent) then reading this number will give
- // 'v' again. The buffer will choose the representation that is closest to
- // 'v'. If there are two at the same distance, than the one farther away
- // from 0 is chosen (halfway cases - ending with 5 - are rounded up).
- // In this mode the 'requested_digits' parameter is ignored.
- // - SHORTEST_SINGLE: same as SHORTEST but with single-precision.
- // - FIXED: produces digits necessary to print a given number with
- // 'requested_digits' digits after the decimal point. The produced digits
- // might be too short in which case the caller has to fill the remainder
- // with '0's.
- // Example: toFixed(0.001, 5) is allowed to return buffer="1", point=-2.
- // Halfway cases are rounded towards +/-Infinity (away from 0). The call
- // toFixed(0.15, 2) thus returns buffer="2", point=0.
- // The returned buffer may contain digits that would be truncated from the
- // shortest representation of the input.
- // - PRECISION: produces 'requested_digits' where the first digit is not '0'.
- // Even though the length of produced digits usually equals
- // 'requested_digits', the function is allowed to return fewer digits, in
- // which case the caller has to fill the missing digits with '0's.
- // Halfway cases are again rounded away from 0.
- // DoubleToAscii expects the given buffer to be big enough to hold all
- // digits and a terminating null-character. In SHORTEST-mode it expects a
- // buffer of at least kBase10MaximalLength + 1. In all other modes the
- // requested_digits parameter and the padding-zeroes limit the size of the
- // output. Don't forget the decimal point, the exponent character and the
- // terminating null-character when computing the maximal output size.
- // The given length is only used in debug mode to ensure the buffer is big
- // enough.
- // ICU PATCH: Export this as U_I18N_API for unit tests.
- static void U_I18N_API DoubleToAscii(double v,
- DtoaMode mode,
- int requested_digits,
- char* buffer,
- int buffer_length,
- bool* sign,
- int* length,
- int* point);
-
-#if 0 // not needed for ICU
- private:
- // Implementation for ToShortest and ToShortestSingle.
- bool ToShortestIeeeNumber(double value,
- StringBuilder* result_builder,
- DtoaMode mode) const;
-
- // If the value is a special value (NaN or Infinity) constructs the
- // corresponding string using the configured infinity/nan-symbol.
- // If either of them is NULL or the value is not special then the
- // function returns false.
- bool HandleSpecialValues(double value, StringBuilder* result_builder) const;
- // Constructs an exponential representation (i.e. 1.234e56).
- // The given exponent assumes a decimal point after the first decimal digit.
- void CreateExponentialRepresentation(const char* decimal_digits,
- int length,
- int exponent,
- StringBuilder* result_builder) const;
- // Creates a decimal representation (i.e 1234.5678).
- void CreateDecimalRepresentation(const char* decimal_digits,
- int length,
- int decimal_point,
- int digits_after_point,
- StringBuilder* result_builder) const;
-
- const int flags_;
- const char* const infinity_symbol_;
- const char* const nan_symbol_;
- const char exponent_character_;
- const int decimal_in_shortest_low_;
- const int decimal_in_shortest_high_;
- const int max_leading_padding_zeroes_in_precision_mode_;
- const int max_trailing_padding_zeroes_in_precision_mode_;
-#endif // not needed for ICU
-
- DISALLOW_IMPLICIT_CONSTRUCTORS(DoubleToStringConverter);
-};
-
-
-class StringToDoubleConverter {
- public:
- // Enumeration for allowing octals and ignoring junk when converting
- // strings to numbers.
- enum Flags {
- NO_FLAGS = 0,
- ALLOW_HEX = 1,
- ALLOW_OCTALS = 2,
- ALLOW_TRAILING_JUNK = 4,
- ALLOW_LEADING_SPACES = 8,
- ALLOW_TRAILING_SPACES = 16,
- ALLOW_SPACES_AFTER_SIGN = 32
- };
-
- // Flags should be a bit-or combination of the possible Flags-enum.
- // - NO_FLAGS: no special flags.
- // - ALLOW_HEX: recognizes the prefix "0x". Hex numbers may only be integers.
- // Ex: StringToDouble("0x1234") -> 4660.0
- // In StringToDouble("0x1234.56") the characters ".56" are trailing
- // junk. The result of the call is hence dependent on
- // the ALLOW_TRAILING_JUNK flag and/or the junk value.
- // With this flag "0x" is a junk-string. Even with ALLOW_TRAILING_JUNK,
- // the string will not be parsed as "0" followed by junk.
- //
- // - ALLOW_OCTALS: recognizes the prefix "0" for octals:
- // If a sequence of octal digits starts with '0', then the number is
- // read as octal integer. Octal numbers may only be integers.
- // Ex: StringToDouble("01234") -> 668.0
- // StringToDouble("012349") -> 12349.0 // Not a sequence of octal
- // // digits.
- // In StringToDouble("01234.56") the characters ".56" are trailing
- // junk. The result of the call is hence dependent on
- // the ALLOW_TRAILING_JUNK flag and/or the junk value.
- // In StringToDouble("01234e56") the characters "e56" are trailing
- // junk, too.
- // - ALLOW_TRAILING_JUNK: ignore trailing characters that are not part of
- // a double literal.
- // - ALLOW_LEADING_SPACES: skip over leading whitespace, including spaces,
- // new-lines, and tabs.
- // - ALLOW_TRAILING_SPACES: ignore trailing whitespace.
- // - ALLOW_SPACES_AFTER_SIGN: ignore whitespace after the sign.
- // Ex: StringToDouble("- 123.2") -> -123.2.
- // StringToDouble("+ 123.2") -> 123.2
- //
- // empty_string_value is returned when an empty string is given as input.
- // If ALLOW_LEADING_SPACES or ALLOW_TRAILING_SPACES are set, then a string
- // containing only spaces is converted to the 'empty_string_value', too.
- //
- // junk_string_value is returned when
- // a) ALLOW_TRAILING_JUNK is not set, and a junk character (a character not
- // part of a double-literal) is found.
- // b) ALLOW_TRAILING_JUNK is set, but the string does not start with a
- // double literal.
- //
- // infinity_symbol and nan_symbol are strings that are used to detect
- // inputs that represent infinity and NaN. They can be null, in which case
- // they are ignored.
- // The conversion routine first reads any possible signs. Then it compares the
- // following character of the input-string with the first character of
- // the infinity, and nan-symbol. If either matches, the function assumes, that
- // a match has been found, and expects the following input characters to match
- // the remaining characters of the special-value symbol.
- // This means that the following restrictions apply to special-value symbols:
- // - they must not start with signs ('+', or '-'),
- // - they must not have the same first character.
- // - they must not start with digits.
- //
- // Examples:
- // flags = ALLOW_HEX | ALLOW_TRAILING_JUNK,
- // empty_string_value = 0.0,
- // junk_string_value = NaN,
- // infinity_symbol = "infinity",
- // nan_symbol = "nan":
- // StringToDouble("0x1234") -> 4660.0.
- // StringToDouble("0x1234K") -> 4660.0.
- // StringToDouble("") -> 0.0 // empty_string_value.
- // StringToDouble(" ") -> NaN // junk_string_value.
- // StringToDouble(" 1") -> NaN // junk_string_value.
- // StringToDouble("0x") -> NaN // junk_string_value.
- // StringToDouble("-123.45") -> -123.45.
- // StringToDouble("--123.45") -> NaN // junk_string_value.
- // StringToDouble("123e45") -> 123e45.
- // StringToDouble("123E45") -> 123e45.
- // StringToDouble("123e+45") -> 123e45.
- // StringToDouble("123E-45") -> 123e-45.
- // StringToDouble("123e") -> 123.0 // trailing junk ignored.
- // StringToDouble("123e-") -> 123.0 // trailing junk ignored.
- // StringToDouble("+NaN") -> NaN // NaN string literal.
- // StringToDouble("-infinity") -> -inf. // infinity literal.
- // StringToDouble("Infinity") -> NaN // junk_string_value.
- //
- // flags = ALLOW_OCTAL | ALLOW_LEADING_SPACES,
- // empty_string_value = 0.0,
- // junk_string_value = NaN,
- // infinity_symbol = NULL,
- // nan_symbol = NULL:
- // StringToDouble("0x1234") -> NaN // junk_string_value.
- // StringToDouble("01234") -> 668.0.
- // StringToDouble("") -> 0.0 // empty_string_value.
- // StringToDouble(" ") -> 0.0 // empty_string_value.
- // StringToDouble(" 1") -> 1.0
- // StringToDouble("0x") -> NaN // junk_string_value.
- // StringToDouble("0123e45") -> NaN // junk_string_value.
- // StringToDouble("01239E45") -> 1239e45.
- // StringToDouble("-infinity") -> NaN // junk_string_value.
- // StringToDouble("NaN") -> NaN // junk_string_value.
- StringToDoubleConverter(int flags,
- double empty_string_value,
- double junk_string_value,
- const char* infinity_symbol,
- const char* nan_symbol)
- : flags_(flags),
- empty_string_value_(empty_string_value),
- junk_string_value_(junk_string_value),
- infinity_symbol_(infinity_symbol),
- nan_symbol_(nan_symbol) {
- }
-
- // Performs the conversion.
- // The output parameter 'processed_characters_count' is set to the number
- // of characters that have been processed to read the number.
- // Spaces than are processed with ALLOW_{LEADING|TRAILING}_SPACES are included
- // in the 'processed_characters_count'. Trailing junk is never included.
- double StringToDouble(const char* buffer,
- int length,
- int* processed_characters_count) const;
-
- // Same as StringToDouble above but for 16 bit characters.
- double StringToDouble(const uc16* buffer,
- int length,
- int* processed_characters_count) const;
-
- // Same as StringToDouble but reads a float.
- // Note that this is not equivalent to static_cast<float>(StringToDouble(...))
- // due to potential double-rounding.
- float StringToFloat(const char* buffer,
- int length,
- int* processed_characters_count) const;
-
- // Same as StringToFloat above but for 16 bit characters.
- float StringToFloat(const uc16* buffer,
- int length,
- int* processed_characters_count) const;
-
- private:
- const int flags_;
- const double empty_string_value_;
- const double junk_string_value_;
- const char* const infinity_symbol_;
- const char* const nan_symbol_;
-
- template <class Iterator>
- double StringToIeee(Iterator start_pointer,
- int length,
- bool read_as_double,
- int* processed_characters_count) const;
-
- DISALLOW_IMPLICIT_CONSTRUCTORS(StringToDoubleConverter);
-};
-
-} // namespace double_conversion
-
-// ICU PATCH: Close ICU namespace
-U_NAMESPACE_END
+#include "double-conversion-string-to-double.h"
+#include "double-conversion-double-to-string.h"
#endif // DOUBLE_CONVERSION_DOUBLE_CONVERSION_H_
#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/Build/source/libs/icu/icu-src/source/i18n/dtfmtsym.cpp b/Build/source/libs/icu/icu-src/source/i18n/dtfmtsym.cpp
index ab61cf42362..690f6a4cae6 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/dtfmtsym.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/dtfmtsym.cpp
@@ -21,6 +21,9 @@
* 10/12/05 emmons Added setters for eraNames, month/day by width/context
*******************************************************************************
*/
+
+#include <utility>
+
#include "unicode/utypes.h"
#if !UCONFIG_NO_FORMATTING
@@ -232,8 +235,6 @@ static const char gDayPeriodTag[]="dayPeriod";
static const char gContextTransformsTag[]="contextTransforms";
-static UMutex LOCK = U_MUTEX_INITIALIZER;
-
/**
* Jitterbug 2974: MSVC has a bug whereby new X[0] behaves badly.
* Work around this.
@@ -1245,6 +1246,7 @@ const UnicodeString**
DateFormatSymbols::getZoneStrings(int32_t& rowCount, int32_t& columnCount) const
{
const UnicodeString **result = NULL;
+ static UMutex LOCK;
umtx_lock(&LOCK);
if (fZoneStrings == NULL) {
@@ -1500,7 +1502,7 @@ struct CalendarDataSink : public ResourceSink {
* To avoid double deletion, 'maps' won't take ownership of the objects. Instead,
* 'mapRefs' will own them and will delete them when CalendarDataSink is deleted.
*/
- UVector mapRefs;
+ MemoryPool<Hashtable> mapRefs;
// Paths and the aliases they point to
UVector aliasPathPairs;
@@ -1518,7 +1520,7 @@ struct CalendarDataSink : public ResourceSink {
// Initializes CalendarDataSink with default values
CalendarDataSink(UErrorCode& status)
: arrays(FALSE, status), arraySizes(FALSE, status), maps(FALSE, status),
- mapRefs(deleteHashtable, NULL, 10, status),
+ mapRefs(),
aliasPathPairs(uprv_deleteUObject, uhash_compareUnicodeString, status),
currentCalendarType(), nextCalendarType(),
resourcesToVisit(NULL), aliasRelativePath() {
@@ -1663,7 +1665,7 @@ struct CalendarDataSink : public ResourceSink {
// Set the resources to visit on the next calendar
if (!resourcesToVisitNext.isNull()) {
- resourcesToVisit.moveFrom(resourcesToVisitNext);
+ resourcesToVisit = std::move(resourcesToVisitNext);
}
}
@@ -1688,14 +1690,14 @@ struct CalendarDataSink : public ResourceSink {
if (value.getType() == URES_STRING) {
// We are on a leaf, store the map elements into the stringMap
if (i == 0) {
- LocalPointer<Hashtable> stringMapPtr(new Hashtable(FALSE, errorCode), errorCode);
- stringMap = stringMapPtr.getAlias();
+ // mapRefs will keep ownership of 'stringMap':
+ stringMap = mapRefs.create(FALSE, errorCode);
+ if (stringMap == NULL) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
maps.put(path, stringMap, errorCode);
- // mapRefs will take ownership of 'stringMap':
- mapRefs.addElement(stringMap, errorCode);
if (U_FAILURE(errorCode)) { return; }
- // Only release ownership after mapRefs takes it (no error happened):
- stringMapPtr.orphan();
stringMap->setValueDeleter(uprv_deleteUObject);
}
U_ASSERT(stringMap != NULL);
@@ -1839,11 +1841,6 @@ struct CalendarDataSink : public ResourceSink {
static void U_CALLCONV deleteUnicodeStringArray(void *uArray) {
delete[] static_cast<UnicodeString *>(uArray);
}
-
- // Deleter function to be used by 'maps'
- static void U_CALLCONV deleteHashtable(void *table) {
- delete static_cast<Hashtable *>(table);
- }
};
// Virtual destructors have to be defined out of line
CalendarDataSink::~CalendarDataSink() {
@@ -2180,16 +2177,16 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError
// The ordering of the following statements is important.
if (fLeapMonthPatterns[kLeapMonthPatternFormatAbbrev].isEmpty()) {
fLeapMonthPatterns[kLeapMonthPatternFormatAbbrev].setTo(fLeapMonthPatterns[kLeapMonthPatternFormatWide]);
- };
+ }
if (fLeapMonthPatterns[kLeapMonthPatternFormatNarrow].isEmpty()) {
fLeapMonthPatterns[kLeapMonthPatternFormatNarrow].setTo(fLeapMonthPatterns[kLeapMonthPatternStandaloneNarrow]);
- };
+ }
if (fLeapMonthPatterns[kLeapMonthPatternStandaloneWide].isEmpty()) {
fLeapMonthPatterns[kLeapMonthPatternStandaloneWide].setTo(fLeapMonthPatterns[kLeapMonthPatternFormatWide]);
- };
+ }
if (fLeapMonthPatterns[kLeapMonthPatternStandaloneAbbrev].isEmpty()) {
fLeapMonthPatterns[kLeapMonthPatternStandaloneAbbrev].setTo(fLeapMonthPatterns[kLeapMonthPatternFormatAbbrev]);
- };
+ }
// end of hack
fLeapMonthPatternsCount = kMonthPatternsCount;
} else {
@@ -2341,11 +2338,21 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError
assignArray(fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, fShortMonths, fShortMonthsCount);
}
- // Load AM/PM markers
+ // Load AM/PM markers; if wide or narrow not available, use short
+ UErrorCode ampmStatus = U_ZERO_ERROR;
initField(&fAmPms, fAmPmsCount, calendarSink,
- buildResourcePath(path, gAmPmMarkersTag, status), status);
+ buildResourcePath(path, gAmPmMarkersTag, ampmStatus), ampmStatus);
+ if (U_FAILURE(ampmStatus)) {
+ initField(&fAmPms, fAmPmsCount, calendarSink,
+ buildResourcePath(path, gAmPmMarkersAbbrTag, status), status);
+ }
+ ampmStatus = U_ZERO_ERROR;
initField(&fNarrowAmPms, fNarrowAmPmsCount, calendarSink,
- buildResourcePath(path, gAmPmMarkersNarrowTag, status), status);
+ buildResourcePath(path, gAmPmMarkersNarrowTag, ampmStatus), ampmStatus);
+ if (U_FAILURE(ampmStatus)) {
+ initField(&fNarrowAmPms, fNarrowAmPmsCount, calendarSink,
+ buildResourcePath(path, gAmPmMarkersAbbrTag, status), status);
+ }
// Load quarters
initField(&fQuarters, fQuartersCount, calendarSink,
diff --git a/Build/source/libs/icu/icu-src/source/i18n/dtitv_impl.h b/Build/source/libs/icu/icu-src/source/i18n/dtitv_impl.h
index 36fa17328e0..c7addf37fb6 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/dtitv_impl.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/dtitv_impl.h
@@ -88,7 +88,7 @@
#define MAX_E_COUNT 5
#define MAX_M_COUNT 5
//#define MAX_INTERVAL_INDEX 4
-#define MAX_POSITIVE_INT 56632;
+#define MAX_POSITIVE_INT 56632
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/dtitvfmt.cpp b/Build/source/libs/icu/icu-src/source/i18n/dtitvfmt.cpp
index d952cbf509d..f47e7708ccc 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/dtitvfmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/dtitvfmt.cpp
@@ -28,6 +28,7 @@
#include "dtitv_impl.h"
#include "mutex.h"
#include "uresimp.h"
+#include "formattedval_impl.h"
#ifdef DTITVFMT_DEBUG
#include <iostream>
@@ -65,12 +66,23 @@ static const UChar gLaterFirstPrefix[] = {LOW_L, LOW_A, LOW_T, LOW_E, LOW_S,LOW_
static const UChar gEarlierFirstPrefix[] = {LOW_E, LOW_A, LOW_R, LOW_L, LOW_I, LOW_E, LOW_S, LOW_T, CAP_F, LOW_I, LOW_R, LOW_S, LOW_T, COLON};
+class FormattedDateIntervalData : public FormattedValueFieldPositionIteratorImpl {
+public:
+ FormattedDateIntervalData(UErrorCode& status) : FormattedValueFieldPositionIteratorImpl(5, status) {}
+ virtual ~FormattedDateIntervalData();
+};
+
+FormattedDateIntervalData::~FormattedDateIntervalData() = default;
+
+UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(FormattedDateInterval)
+
+
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DateIntervalFormat)
// Mutex, protects access to fDateFormat, fFromCalendar and fToCalendar.
// Needed because these data members are modified by const methods of DateIntervalFormat.
-static UMutex gFormatterMutex = U_MUTEX_INITIALIZER;
+static UMutex gFormatterMutex;
DateIntervalFormat* U_EXPORT2
DateIntervalFormat::createInstance(const UnicodeString& skeleton,
@@ -158,7 +170,7 @@ DateIntervalFormat::operator=(const DateIntervalFormat& itvfmt) {
{
Mutex lock(&gFormatterMutex);
if ( itvfmt.fDateFormat ) {
- fDateFormat = (SimpleDateFormat*)itvfmt.fDateFormat->clone();
+ fDateFormat = itvfmt.fDateFormat->clone();
} else {
fDateFormat = NULL;
}
@@ -184,9 +196,9 @@ DateIntervalFormat::operator=(const DateIntervalFormat& itvfmt) {
fIntervalPatterns[i] = itvfmt.fIntervalPatterns[i];
}
fLocale = itvfmt.fLocale;
- fDatePattern = (itvfmt.fDatePattern)? (UnicodeString*)itvfmt.fDatePattern->clone(): NULL;
- fTimePattern = (itvfmt.fTimePattern)? (UnicodeString*)itvfmt.fTimePattern->clone(): NULL;
- fDateTimeFormat = (itvfmt.fDateTimeFormat)? (UnicodeString*)itvfmt.fDateTimeFormat->clone(): NULL;
+ fDatePattern = (itvfmt.fDatePattern)? itvfmt.fDatePattern->clone(): NULL;
+ fTimePattern = (itvfmt.fTimePattern)? itvfmt.fTimePattern->clone(): NULL;
+ fDateTimeFormat = (itvfmt.fDateTimeFormat)? itvfmt.fDateTimeFormat->clone(): NULL;
}
return *this;
}
@@ -203,8 +215,8 @@ DateIntervalFormat::~DateIntervalFormat() {
}
-Format*
-DateIntervalFormat::clone(void) const {
+DateIntervalFormat*
+DateIntervalFormat::clone() const {
return new DateIntervalFormat(*this);
}
@@ -271,15 +283,51 @@ DateIntervalFormat::format(const DateInterval* dtInterval,
if ( U_FAILURE(status) ) {
return appendTo;
}
- if (fFromCalendar == NULL || fToCalendar == NULL || fDateFormat == NULL || fInfo == NULL) {
+ if (fDateFormat == NULL || fInfo == NULL) {
status = U_INVALID_STATE_ERROR;
return appendTo;
}
+ FieldPositionOnlyHandler handler(fieldPosition);
+ handler.setAcceptFirstOnly(TRUE);
+ int8_t ignore;
+
Mutex lock(&gFormatterMutex);
- fFromCalendar->setTime(dtInterval->getFromDate(), status);
- fToCalendar->setTime(dtInterval->getToDate(), status);
- return formatImpl(*fFromCalendar, *fToCalendar, appendTo,fieldPosition, status);
+ return formatIntervalImpl(*dtInterval, appendTo, ignore, handler, status);
+}
+
+
+FormattedDateInterval DateIntervalFormat::formatToValue(
+ const DateInterval& dtInterval,
+ UErrorCode& status) const {
+ LocalPointer<FormattedDateIntervalData> result(new FormattedDateIntervalData(status), status);
+ if (U_FAILURE(status)) {
+ return FormattedDateInterval(status);
+ }
+ UnicodeString string;
+ int8_t firstIndex;
+ auto handler = result->getHandler(status);
+ handler.setCategory(UFIELD_CATEGORY_DATE);
+ {
+ Mutex lock(&gFormatterMutex);
+ formatIntervalImpl(dtInterval, string, firstIndex, handler, status);
+ }
+ handler.getError(status);
+ result->appendString(string, status);
+ if (U_FAILURE(status)) {
+ return FormattedDateInterval(status);
+ }
+
+ // Compute the span fields and sort them into place:
+ if (firstIndex != -1) {
+ result->addOverlapSpans(UFIELD_CATEGORY_DATE_INTERVAL_SPAN, firstIndex, status);
+ if (U_FAILURE(status)) {
+ return FormattedDateInterval(status);
+ }
+ result->sort();
+ }
+
+ return FormattedDateInterval(result.orphan());
}
@@ -289,8 +337,63 @@ DateIntervalFormat::format(Calendar& fromCalendar,
UnicodeString& appendTo,
FieldPosition& pos,
UErrorCode& status) const {
+ FieldPositionOnlyHandler handler(pos);
+ handler.setAcceptFirstOnly(TRUE);
+ int8_t ignore;
+
Mutex lock(&gFormatterMutex);
- return formatImpl(fromCalendar, toCalendar, appendTo, pos, status);
+ return formatImpl(fromCalendar, toCalendar, appendTo, ignore, handler, status);
+}
+
+
+FormattedDateInterval DateIntervalFormat::formatToValue(
+ Calendar& fromCalendar,
+ Calendar& toCalendar,
+ UErrorCode& status) const {
+ LocalPointer<FormattedDateIntervalData> result(new FormattedDateIntervalData(status), status);
+ if (U_FAILURE(status)) {
+ return FormattedDateInterval(status);
+ }
+ UnicodeString string;
+ int8_t firstIndex;
+ auto handler = result->getHandler(status);
+ handler.setCategory(UFIELD_CATEGORY_DATE);
+ {
+ Mutex lock(&gFormatterMutex);
+ formatImpl(fromCalendar, toCalendar, string, firstIndex, handler, status);
+ }
+ handler.getError(status);
+ result->appendString(string, status);
+ if (U_FAILURE(status)) {
+ return FormattedDateInterval(status);
+ }
+
+ // Compute the span fields and sort them into place:
+ if (firstIndex != -1) {
+ result->addOverlapSpans(UFIELD_CATEGORY_DATE_INTERVAL_SPAN, firstIndex, status);
+ result->sort();
+ }
+
+ return FormattedDateInterval(result.orphan());
+}
+
+
+UnicodeString& DateIntervalFormat::formatIntervalImpl(
+ const DateInterval& dtInterval,
+ UnicodeString& appendTo,
+ int8_t& firstIndex,
+ FieldPositionHandler& fphandler,
+ UErrorCode& status) const {
+ if (U_FAILURE(status)) {
+ return appendTo;
+ }
+ if (fFromCalendar == nullptr || fToCalendar == nullptr) {
+ status = U_INVALID_STATE_ERROR;
+ return appendTo;
+ }
+ fFromCalendar->setTime(dtInterval.getFromDate(), status);
+ fToCalendar->setTime(dtInterval.getToDate(), status);
+ return formatImpl(*fFromCalendar, *fToCalendar, appendTo, firstIndex, fphandler, status);
}
@@ -298,12 +401,16 @@ UnicodeString&
DateIntervalFormat::formatImpl(Calendar& fromCalendar,
Calendar& toCalendar,
UnicodeString& appendTo,
- FieldPosition& pos,
+ int8_t& firstIndex,
+ FieldPositionHandler& fphandler,
UErrorCode& status) const {
if ( U_FAILURE(status) ) {
return appendTo;
}
+ // Initialize firstIndex to -1 (single date, no range)
+ firstIndex = -1;
+
// not support different calendar types and time zones
//if ( fromCalendar.getType() != toCalendar.getType() ) {
if ( !fromCalendar.isEquivalentTo(toCalendar) ) {
@@ -346,7 +453,7 @@ DateIntervalFormat::formatImpl(Calendar& fromCalendar,
/* ignore the millisecond etc. small fields' difference.
* use single date when all the above are the same.
*/
- return fDateFormat->format(fromCalendar, appendTo, pos);
+ return fDateFormat->_format(fromCalendar, appendTo, fphandler, status);
}
UBool fromToOnSameDay = (field==UCAL_AM_PM || field==UCAL_HOUR || field==UCAL_MINUTE || field==UCAL_SECOND);
@@ -363,9 +470,9 @@ DateIntervalFormat::formatImpl(Calendar& fromCalendar,
* the smallest calendar field in pattern,
* return single date format.
*/
- return fDateFormat->format(fromCalendar, appendTo, pos);
+ return fDateFormat->_format(fromCalendar, appendTo, fphandler, status);
}
- return fallbackFormat(fromCalendar, toCalendar, fromToOnSameDay, appendTo, pos, status);
+ return fallbackFormat(fromCalendar, toCalendar, fromToOnSameDay, appendTo, firstIndex, fphandler, status);
}
// If the first part in interval pattern is empty,
// the 2nd part of it saves the full-pattern used in fall-back.
@@ -375,7 +482,7 @@ DateIntervalFormat::formatImpl(Calendar& fromCalendar,
UnicodeString originalPattern;
fDateFormat->toPattern(originalPattern);
fDateFormat->applyPattern(intervalPattern.secondPart);
- appendTo = fallbackFormat(fromCalendar, toCalendar, fromToOnSameDay, appendTo, pos, status);
+ appendTo = fallbackFormat(fromCalendar, toCalendar, fromToOnSameDay, appendTo, firstIndex, fphandler, status);
fDateFormat->applyPattern(originalPattern);
return appendTo;
}
@@ -384,24 +491,22 @@ DateIntervalFormat::formatImpl(Calendar& fromCalendar,
if ( intervalPattern.laterDateFirst ) {
firstCal = &toCalendar;
secondCal = &fromCalendar;
+ firstIndex = 1;
} else {
firstCal = &fromCalendar;
secondCal = &toCalendar;
+ firstIndex = 0;
}
// break the interval pattern into 2 parts,
// first part should not be empty,
UnicodeString originalPattern;
fDateFormat->toPattern(originalPattern);
fDateFormat->applyPattern(intervalPattern.firstPart);
- fDateFormat->format(*firstCal, appendTo, pos);
+ fDateFormat->_format(*firstCal, appendTo, fphandler, status);
+
if ( !intervalPattern.secondPart.isEmpty() ) {
fDateFormat->applyPattern(intervalPattern.secondPart);
- FieldPosition otherPos;
- otherPos.setField(pos.getField());
- fDateFormat->format(*secondCal, appendTo, otherPos);
- if (pos.getEndIndex() == 0 && otherPos.getEndIndex() > 0) {
- pos = otherPos;
- }
+ fDateFormat->_format(*secondCal, appendTo, fphandler, status);
}
fDateFormat->applyPattern(originalPattern);
return appendTo;
@@ -1022,7 +1127,9 @@ DateIntervalFormat::setSeparateDateTimePtn(
}
setIntervalPattern(UCAL_YEAR, skeleton, bestSkeleton, differenceInfo,
&extendedSkeleton, &extendedBestSkeleton);
- } else {
+ setIntervalPattern(UCAL_ERA, skeleton, bestSkeleton, differenceInfo,
+ &extendedSkeleton, &extendedBestSkeleton);
+ } else {
setIntervalPattern(UCAL_MINUTE, skeleton, bestSkeleton, differenceInfo);
setIntervalPattern(UCAL_HOUR, skeleton, bestSkeleton, differenceInfo);
setIntervalPattern(UCAL_AM_PM, skeleton, bestSkeleton, differenceInfo);
@@ -1294,40 +1401,37 @@ DateIntervalFormat::splitPatternInto2Part(const UnicodeString& intervalPattern)
return (i - count);
}
-static const UChar bracketedZero[] = {0x7B,0x30,0x7D};
-static const UChar bracketedOne[] = {0x7B,0x31,0x7D};
-
-void
-DateIntervalFormat::adjustPosition(UnicodeString& combiningPattern, // has {0} and {1} in it
- UnicodeString& pat0, FieldPosition& pos0, // pattern and pos corresponding to {0}
- UnicodeString& pat1, FieldPosition& pos1, // pattern and pos corresponding to {1}
- FieldPosition& posResult) {
- int32_t index0 = combiningPattern.indexOf(bracketedZero, 3, 0);
- int32_t index1 = combiningPattern.indexOf(bracketedOne, 3, 0);
- if (index0 < 0 || index1 < 0) {
+void DateIntervalFormat::fallbackFormatRange(
+ Calendar& fromCalendar,
+ Calendar& toCalendar,
+ UnicodeString& appendTo,
+ int8_t& firstIndex,
+ FieldPositionHandler& fphandler,
+ UErrorCode& status) const {
+ UnicodeString fallbackPattern;
+ fInfo->getFallbackIntervalPattern(fallbackPattern);
+ SimpleFormatter sf(fallbackPattern, 2, 2, status);
+ if (U_FAILURE(status)) {
return;
}
- int32_t placeholderLen = 3; // length of "{0}" or "{1}"
- if (index0 < index1) {
- if (pos0.getEndIndex() > 0) {
- posResult.setBeginIndex(pos0.getBeginIndex() + index0);
- posResult.setEndIndex(pos0.getEndIndex() + index0);
- } else if (pos1.getEndIndex() > 0) {
- // here index1 >= 3
- index1 += pat0.length() - placeholderLen; // adjust for pat0 replacing {0}
- posResult.setBeginIndex(pos1.getBeginIndex() + index1);
- posResult.setEndIndex(pos1.getEndIndex() + index1);
- }
+ int32_t offsets[2];
+ UnicodeString patternBody = sf.getTextWithNoArguments(offsets, 2);
+
+ // TODO(ICU-20406): Use SimpleFormatter Iterator interface when available.
+ if (offsets[0] < offsets[1]) {
+ firstIndex = 0;
+ appendTo.append(patternBody.tempSubStringBetween(0, offsets[0]));
+ fDateFormat->_format(fromCalendar, appendTo, fphandler, status);
+ appendTo.append(patternBody.tempSubStringBetween(offsets[0], offsets[1]));
+ fDateFormat->_format(toCalendar, appendTo, fphandler, status);
+ appendTo.append(patternBody.tempSubStringBetween(offsets[1]));
} else {
- if (pos1.getEndIndex() > 0) {
- posResult.setBeginIndex(pos1.getBeginIndex() + index1);
- posResult.setEndIndex(pos1.getEndIndex() + index1);
- } else if (pos0.getEndIndex() > 0) {
- // here index0 >= 3
- index0 += pat1.length() - placeholderLen; // adjust for pat1 replacing {1}
- posResult.setBeginIndex(pos0.getBeginIndex() + index0);
- posResult.setEndIndex(pos0.getEndIndex() + index0);
- }
+ firstIndex = 1;
+ appendTo.append(patternBody.tempSubStringBetween(0, offsets[1]));
+ fDateFormat->_format(toCalendar, appendTo, fphandler, status);
+ appendTo.append(patternBody.tempSubStringBetween(offsets[1], offsets[0]));
+ fDateFormat->_format(fromCalendar, appendTo, fphandler, status);
+ appendTo.append(patternBody.tempSubStringBetween(offsets[0]));
}
}
@@ -1336,51 +1440,50 @@ DateIntervalFormat::fallbackFormat(Calendar& fromCalendar,
Calendar& toCalendar,
UBool fromToOnSameDay, // new
UnicodeString& appendTo,
- FieldPosition& pos,
+ int8_t& firstIndex,
+ FieldPositionHandler& fphandler,
UErrorCode& status) const {
if ( U_FAILURE(status) ) {
return appendTo;
}
- UnicodeString fullPattern; // for saving the pattern in fDateFormat
+
UBool formatDatePlusTimeRange = (fromToOnSameDay && fDatePattern && fTimePattern);
- // the fall back
if (formatDatePlusTimeRange) {
+ SimpleFormatter sf(*fDateTimeFormat, 2, 2, status);
+ if (U_FAILURE(status)) {
+ return appendTo;
+ }
+ int32_t offsets[2];
+ UnicodeString patternBody = sf.getTextWithNoArguments(offsets, 2);
+
+ UnicodeString fullPattern; // for saving the pattern in fDateFormat
fDateFormat->toPattern(fullPattern); // save current pattern, restore later
- fDateFormat->applyPattern(*fTimePattern);
- }
- FieldPosition otherPos;
- otherPos.setField(pos.getField());
- UnicodeString earlierDate;
- fDateFormat->format(fromCalendar, earlierDate, pos);
- UnicodeString laterDate;
- fDateFormat->format(toCalendar, laterDate, otherPos);
- UnicodeString fallbackPattern;
- fInfo->getFallbackIntervalPattern(fallbackPattern);
- adjustPosition(fallbackPattern, earlierDate, pos, laterDate, otherPos, pos);
- UnicodeString fallbackRange;
- SimpleFormatter(fallbackPattern, 2, 2, status).
- format(earlierDate, laterDate, fallbackRange, status);
- if ( U_SUCCESS(status) && formatDatePlusTimeRange ) {
- // fallbackRange has just the time range, need to format the date part and combine that
- fDateFormat->applyPattern(*fDatePattern);
- UnicodeString datePortion;
- otherPos.setBeginIndex(0);
- otherPos.setEndIndex(0);
- fDateFormat->format(fromCalendar, datePortion, otherPos);
- adjustPosition(*fDateTimeFormat, fallbackRange, pos, datePortion, otherPos, pos);
- const UnicodeString *values[2] = {
- &fallbackRange, // {0} is time range
- &datePortion, // {1} is single date portion
- };
- SimpleFormatter(*fDateTimeFormat, 2, 2, status).
- formatAndReplace(values, 2, fallbackRange, NULL, 0, status);
- }
- if ( U_SUCCESS(status) ) {
- appendTo.append(fallbackRange);
- }
- if (formatDatePlusTimeRange) {
+
+ // {0} is time range
+ // {1} is single date portion
+ // TODO(ICU-20406): Use SimpleFormatter Iterator interface when available.
+ if (offsets[0] < offsets[1]) {
+ appendTo.append(patternBody.tempSubStringBetween(0, offsets[0]));
+ fDateFormat->applyPattern(*fTimePattern);
+ fallbackFormatRange(fromCalendar, toCalendar, appendTo, firstIndex, fphandler, status);
+ appendTo.append(patternBody.tempSubStringBetween(offsets[0], offsets[1]));
+ fDateFormat->applyPattern(*fDatePattern);
+ fDateFormat->_format(fromCalendar, appendTo, fphandler, status);
+ appendTo.append(patternBody.tempSubStringBetween(offsets[1]));
+ } else {
+ appendTo.append(patternBody.tempSubStringBetween(0, offsets[1]));
+ fDateFormat->applyPattern(*fDatePattern);
+ fDateFormat->_format(fromCalendar, appendTo, fphandler, status);
+ appendTo.append(patternBody.tempSubStringBetween(offsets[1], offsets[0]));
+ fDateFormat->applyPattern(*fTimePattern);
+ fallbackFormatRange(fromCalendar, toCalendar, appendTo, firstIndex, fphandler, status);
+ appendTo.append(patternBody.tempSubStringBetween(offsets[0]));
+ }
+
// restore full pattern
fDateFormat->applyPattern(fullPattern);
+ } else {
+ fallbackFormatRange(fromCalendar, toCalendar, appendTo, firstIndex, fphandler, status);
}
return appendTo;
}
@@ -1552,6 +1655,7 @@ DateIntervalFormat::fgCalendarFieldToPatternLetter[] =
};
+
U_NAMESPACE_END
#endif
diff --git a/Build/source/libs/icu/icu-src/source/i18n/dtitvinf.cpp b/Build/source/libs/icu/icu-src/source/i18n/dtitvinf.cpp
index a289fc79c8d..35ee8c16261 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/dtitvinf.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/dtitvinf.cpp
@@ -42,7 +42,9 @@ U_NAMESPACE_BEGIN
#ifdef DTITVINF_DEBUG
-#define PRINTMESG(msg) { std::cout << "(" << __FILE__ << ":" << __LINE__ << ") " << msg << "\n"; }
+#define PRINTMESG(msg) UPRV_BLOCK_MACRO_BEGIN { \
+ std::cout << "(" << __FILE__ << ":" << __LINE__ << ") " << msg << "\n"; \
+} UPRV_BLOCK_MACRO_END
#endif
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DateIntervalInfo)
@@ -326,7 +328,9 @@ struct DateIntervalInfo::DateIntervalSink : public ResourceSink {
char c0;
if ((c0 = patternLetter[0]) != 0 && patternLetter[1] == 0) {
// Check that the pattern letter is accepted
- if (c0 == 'y') {
+ if (c0 == 'G') {
+ return UCAL_ERA;
+ } else if (c0 == 'y') {
return UCAL_YEAR;
} else if (c0 == 'M') {
return UCAL_MONTH;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/dtptngen.cpp b/Build/source/libs/icu/icu-src/source/i18n/dtptngen.cpp
index d7b60d34c45..c5f8618a6d6 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/dtptngen.cpp
+++ b/Build/source/libs/icu/icu-src/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"
@@ -471,9 +472,14 @@ enum AllowedHourFormat{
ALLOWED_HOUR_FORMAT_UNKNOWN = -1,
ALLOWED_HOUR_FORMAT_h,
ALLOWED_HOUR_FORMAT_H,
+ ALLOWED_HOUR_FORMAT_K, // Added ICU-20383, used by JP
+ ALLOWED_HOUR_FORMAT_k, // Added ICU-20383, not currently used
ALLOWED_HOUR_FORMAT_hb,
- ALLOWED_HOUR_FORMAT_Hb,
ALLOWED_HOUR_FORMAT_hB,
+ ALLOWED_HOUR_FORMAT_Kb, // Added ICU-20383, not currently used
+ ALLOWED_HOUR_FORMAT_KB, // Added ICU-20383, not currently used
+ // ICU-20383 The following are unlikely and not currently used
+ ALLOWED_HOUR_FORMAT_Hb,
ALLOWED_HOUR_FORMAT_HB
};
@@ -511,36 +517,55 @@ struct AllowedHourFormatsSink : public ResourceSink {
const char *regionOrLocale = key;
ResourceTable formatList = value.getTable(errorCode);
if (U_FAILURE(errorCode)) { return; }
+ // below we construct a list[] that has an entry for the "preferred" value at [0],
+ // followed by 1 or more entries for the "allowed" values, terminated with an
+ // entry for ALLOWED_HOUR_FORMAT_UNKNOWN (not included in length below)
+ LocalMemory<int32_t> list;
+ int32_t length = 0;
+ int32_t preferredFormat = ALLOWED_HOUR_FORMAT_UNKNOWN;
for (int32_t j = 0; formatList.getKeyAndValue(j, key, value); ++j) {
- if (uprv_strcmp(key, "allowed") == 0) { // Ignore "preferred" list.
- LocalMemory<int32_t> list;
- int32_t length;
+ if (uprv_strcmp(key, "allowed") == 0) {
if (value.getType() == URES_STRING) {
- if (list.allocateInsteadAndReset(2) == nullptr) {
+ length = 2; // 1 preferred to add later, 1 allowed to add now
+ if (list.allocateInsteadAndReset(length + 1) == nullptr) {
errorCode = U_MEMORY_ALLOCATION_ERROR;
return;
}
- list[0] = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode));
- length = 1;
+ list[1] = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode));
}
else {
ResourceArray allowedFormats = value.getArray(errorCode);
- length = allowedFormats.getSize();
+ length = allowedFormats.getSize() + 1; // 1 preferred, getSize allowed
if (list.allocateInsteadAndReset(length + 1) == nullptr) {
errorCode = U_MEMORY_ALLOCATION_ERROR;
return;
}
- for (int32_t k = 0; k < length; ++k) {
- allowedFormats.getValue(k, value);
+ for (int32_t k = 1; k < length; ++k) {
+ allowedFormats.getValue(k-1, value);
list[k] = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode));
}
}
- list[length] = ALLOWED_HOUR_FORMAT_UNKNOWN;
- uhash_put(localeToAllowedHourFormatsMap,
- const_cast<char *>(regionOrLocale), list.orphan(), &errorCode);
- if (U_FAILURE(errorCode)) { return; }
+ } else if (uprv_strcmp(key, "preferred") == 0) {
+ preferredFormat = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode));
}
}
+ if (length > 1) {
+ list[0] = (preferredFormat!=ALLOWED_HOUR_FORMAT_UNKNOWN)? preferredFormat: list[1];
+ } else {
+ // fallback handling for missing data
+ length = 2; // 1 preferred, 1 allowed
+ if (list.allocateInsteadAndReset(length + 1) == nullptr) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ list[0] = (preferredFormat!=ALLOWED_HOUR_FORMAT_UNKNOWN)? preferredFormat: ALLOWED_HOUR_FORMAT_H;
+ list[1] = list[0];
+ }
+ list[length] = ALLOWED_HOUR_FORMAT_UNKNOWN;
+ // At this point list[] will have at least two non-ALLOWED_HOUR_FORMAT_UNKNOWN entries,
+ // followed by ALLOWED_HOUR_FORMAT_UNKNOWN.
+ uhash_put(localeToAllowedHourFormatsMap, const_cast<char *>(regionOrLocale), list.orphan(), &errorCode);
+ if (U_FAILURE(errorCode)) { return; }
}
}
@@ -548,10 +573,14 @@ struct AllowedHourFormatsSink : public ResourceSink {
if (s.length() == 1) {
if (s[0] == LOW_H) { return ALLOWED_HOUR_FORMAT_h; }
if (s[0] == CAP_H) { return ALLOWED_HOUR_FORMAT_H; }
+ if (s[0] == CAP_K) { return ALLOWED_HOUR_FORMAT_K; }
+ if (s[0] == LOW_K) { return ALLOWED_HOUR_FORMAT_k; }
} else if (s.length() == 2) {
if (s[0] == LOW_H && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_hb; }
- if (s[0] == CAP_H && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_Hb; }
if (s[0] == LOW_H && s[1] == CAP_B) { return ALLOWED_HOUR_FORMAT_hB; }
+ if (s[0] == CAP_K && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_Kb; }
+ if (s[0] == CAP_K && s[1] == CAP_B) { return ALLOWED_HOUR_FORMAT_KB; }
+ if (s[0] == CAP_H && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_Hb; }
if (s[0] == CAP_H && s[1] == CAP_B) { return ALLOWED_HOUR_FORMAT_HB; }
}
@@ -585,42 +614,74 @@ 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; }
- const char *localeID = locale.getName();
- char maxLocaleID[ULOC_FULLNAME_CAPACITY];
- int32_t length = uloc_addLikelySubtags(localeID, maxLocaleID, ULOC_FULLNAME_CAPACITY, &status);
- if (U_FAILURE(status)) {
- return;
- } else if (length == ULOC_FULLNAME_CAPACITY) { // no room for NUL
- status = U_BUFFER_OVERFLOW_ERROR;
- return;
- }
- Locale maxLocale = Locale(maxLocaleID);
-
- 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<int32_t>(uprv_strlen(language)), status);
+ langCountry.append(language, status);
langCountry.append('_', status);
- langCountry.append(country, static_cast<int32_t>(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<char *>(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.
+ switch (allowedFormats[0]) {
+ case ALLOWED_HOUR_FORMAT_h: fDefaultHourFormatChar = LOW_H; break;
+ case ALLOWED_HOUR_FORMAT_H: fDefaultHourFormatChar = CAP_H; break;
+ case ALLOWED_HOUR_FORMAT_K: fDefaultHourFormatChar = CAP_K; break;
+ case ALLOWED_HOUR_FORMAT_k: fDefaultHourFormatChar = LOW_K; break;
+ default: fDefaultHourFormatChar = CAP_H; break;
+ }
for (int32_t i = 0; i < UPRV_LENGTHOF(fAllowedHourFormats); ++i) {
- fAllowedHourFormats[i] = allowedFormats[i];
- if (allowedFormats[i] == ALLOWED_HOUR_FORMAT_UNKNOWN) {
+ fAllowedHourFormats[i] = allowedFormats[i + 1];
+ if (fAllowedHourFormats[i] == ALLOWED_HOUR_FORMAT_UNKNOWN) {
break;
}
}
} else { // Lookup failed, twice
+ fDefaultHourFormatChar = CAP_H;
fAllowedHourFormats[0] = ALLOWED_HOUR_FORMAT_H;
fAllowedHourFormats[1] = ALLOWED_HOUR_FORMAT_UNKNOWN;
}
@@ -750,12 +811,11 @@ DateTimePatternGenerator::hackTimes(const UnicodeString& hackPattern, UErrorCode
#define ULOC_LOCALE_IDENTIFIER_CAPACITY (ULOC_FULLNAME_CAPACITY + 1 + ULOC_KEYWORD_AND_VALUES_CAPACITY)
-static const UChar hourFormatChars[] = { CAP_H, LOW_H, CAP_K, LOW_K, 0 }; // HhKk, the hour format characters
-
void
DateTimePatternGenerator::getCalendarTypeToUse(const Locale& locale, CharString& destination, UErrorCode& err) {
destination.clear().append(DT_DateTimeGregorianTag, -1, err); // initial default
if ( U_SUCCESS(err) ) {
+ UErrorCode localStatus = U_ZERO_ERROR;
char localeWithCalendarKey[ULOC_LOCALE_IDENTIFIER_CAPACITY];
// obtain a locale that always has the calendar key value that should be used
ures_getFunctionalEquivalent(
@@ -767,8 +827,7 @@ DateTimePatternGenerator::getCalendarTypeToUse(const Locale& locale, CharString&
locale.getName(),
nullptr,
FALSE,
- &err);
- if (U_FAILURE(err)) { return; }
+ &localStatus);
localeWithCalendarKey[ULOC_LOCALE_IDENTIFIER_CAPACITY-1] = 0; // ensure null termination
// now get the calendar key value from that locale
char calendarType[ULOC_KEYWORDS_CAPACITY];
@@ -777,13 +836,17 @@ DateTimePatternGenerator::getCalendarTypeToUse(const Locale& locale, CharString&
"calendar",
calendarType,
ULOC_KEYWORDS_CAPACITY,
- &err);
- if (U_FAILURE(err)) { return; }
+ &localStatus);
+ // If the input locale was invalid, don't fail with missing resource error, instead
+ // continue with default of Gregorian.
+ if (U_FAILURE(localStatus) && localStatus != U_MISSING_RESOURCE_ERROR) {
+ err = localStatus;
+ return;
+ }
if (calendarTypeLen < ULOC_KEYWORDS_CAPACITY) {
destination.clear().append(calendarType, -1, err);
if (U_FAILURE(err)) { return; }
}
- err = U_ZERO_ERROR;
}
}
@@ -791,18 +854,9 @@ void
DateTimePatternGenerator::consumeShortTimePattern(const UnicodeString& shortTimePattern,
UErrorCode& status) {
if (U_FAILURE(status)) { return; }
- // set fDefaultHourFormatChar to the hour format character from this pattern
- int32_t tfIdx, tfLen = shortTimePattern.length();
- UBool ignoreChars = FALSE;
- for (tfIdx = 0; tfIdx < tfLen; tfIdx++) {
- UChar tfChar = shortTimePattern.charAt(tfIdx);
- if ( tfChar == SINGLE_QUOTE ) {
- ignoreChars = !ignoreChars; // toggle (handle quoted literals & '' for single quote)
- } else if ( !ignoreChars && u_strchr(hourFormatChars, tfChar) != nullptr ) {
- fDefaultHourFormatChar = tfChar;
- break;
- }
- }
+ // ICU-20383 No longer set fDefaultHourFormatChar to the hour format character from
+ // this pattern; instead it is set from localeToAllowedHourFormatsMap which now
+ // includes entries for both preferred and allowed formats.
// HACK for hh:ss
hackTimes(shortTimePattern, status);
@@ -1140,20 +1194,24 @@ DateTimePatternGenerator::mapSkeletonMetacharacters(const UnicodeString& pattern
if (patChr == LOW_J) {
hourChar = fDefaultHourFormatChar;
} else {
- AllowedHourFormat preferred;
+ AllowedHourFormat bestAllowed;
if (fAllowedHourFormats[0] != ALLOWED_HOUR_FORMAT_UNKNOWN) {
- preferred = (AllowedHourFormat)fAllowedHourFormats[0];
+ bestAllowed = (AllowedHourFormat)fAllowedHourFormats[0];
} else {
status = U_INVALID_FORMAT_ERROR;
return UnicodeString();
}
- if (preferred == ALLOWED_HOUR_FORMAT_H || preferred == ALLOWED_HOUR_FORMAT_HB || preferred == ALLOWED_HOUR_FORMAT_Hb) {
+ if (bestAllowed == ALLOWED_HOUR_FORMAT_H || bestAllowed == ALLOWED_HOUR_FORMAT_HB || bestAllowed == ALLOWED_HOUR_FORMAT_Hb) {
hourChar = CAP_H;
+ } else if (bestAllowed == ALLOWED_HOUR_FORMAT_K || bestAllowed == ALLOWED_HOUR_FORMAT_KB || bestAllowed == ALLOWED_HOUR_FORMAT_Kb) {
+ hourChar = CAP_K;
+ } else if (bestAllowed == ALLOWED_HOUR_FORMAT_k) {
+ hourChar = LOW_K;
}
// in #13183 just add b/B to skeleton, no longer need to set special flags
- if (preferred == ALLOWED_HOUR_FORMAT_HB || preferred == ALLOWED_HOUR_FORMAT_hB) {
+ if (bestAllowed == ALLOWED_HOUR_FORMAT_HB || bestAllowed == ALLOWED_HOUR_FORMAT_hB || bestAllowed == ALLOWED_HOUR_FORMAT_KB) {
dayPeriodChar = CAP_B;
- } else if (preferred == ALLOWED_HOUR_FORMAT_Hb || preferred == ALLOWED_HOUR_FORMAT_hb) {
+ } else if (bestAllowed == ALLOWED_HOUR_FORMAT_Hb || bestAllowed == ALLOWED_HOUR_FORMAT_hb || bestAllowed == ALLOWED_HOUR_FORMAT_Kb) {
dayPeriodChar = LOW_B;
}
}
@@ -1804,7 +1862,7 @@ PatternMap::copyFrom(const PatternMap& other, UErrorCode& status) {
if (prevElem != nullptr) {
prevElem->next.adoptInstead(curElem);
} else {
- U_ASSERT(false);
+ UPRV_UNREACHABLE;
}
}
prevElem = curElem;
@@ -2517,7 +2575,8 @@ UChar SkeletonFields::getFirstChar() const {
}
-PtnSkeleton::PtnSkeleton() {
+PtnSkeleton::PtnSkeleton()
+ : addedDefaultDayPeriod(FALSE) {
}
PtnSkeleton::PtnSkeleton(const PtnSkeleton& other) {
@@ -2528,6 +2587,7 @@ void PtnSkeleton::copyFrom(const PtnSkeleton& other) {
uprv_memcpy(type, other.type, sizeof(type));
original.copyFrom(other.original);
baseOriginal.copyFrom(other.baseOriginal);
+ addedDefaultDayPeriod = other.addedDefaultDayPeriod;
}
void PtnSkeleton::clear() {
diff --git a/Build/source/libs/icu/icu-src/source/i18n/erarules.cpp b/Build/source/libs/icu/icu-src/source/i18n/erarules.cpp
index f6cbc259463..e375740bd6b 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/erarules.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/erarules.cpp
@@ -1,6 +1,8 @@
// © 2018 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
+#include <utility>
+
#include "unicode/utypes.h"
#if !UCONFIG_NO_FORMATTING
@@ -9,6 +11,7 @@
#include "unicode/ucal.h"
#include "unicode/ures.h"
#include "unicode/ustring.h"
+#include "unicode/timezone.h"
#include "cmemory.h"
#include "cstring.h"
#include "erarules.h"
@@ -101,7 +104,7 @@ static int32_t compareEncodedDateWithYMD(int encoded, int year, int month, int d
EraRules::EraRules(LocalMemory<int32_t>& eraStartDates, int32_t numEras)
: numEras(numEras) {
- startDates.moveFrom(eraStartDates);
+ startDates = std::move(eraStartDates);
initCurrentEra();
}
@@ -288,9 +291,22 @@ int32_t EraRules::getEraIndex(int32_t year, int32_t month, int32_t day, UErrorCo
}
void EraRules::initCurrentEra() {
- UDate now = ucal_getNow();
+ // Compute local wall time in millis using ICU's default time zone.
+ UErrorCode ec = U_ZERO_ERROR;
+ UDate localMillis = ucal_getNow();
+
+ int32_t rawOffset, dstOffset;
+ TimeZone* zone = TimeZone::createDefault();
+ // If we failed to create the default time zone, we are in a bad state and don't
+ // really have many options. Carry on using UTC millis as a fallback.
+ if (zone != nullptr) {
+ zone->getOffset(localMillis, FALSE, rawOffset, dstOffset, ec);
+ delete zone;
+ localMillis += (rawOffset + dstOffset);
+ }
+
int year, month0, dom, dow, doy, mid;
- Grego::timeToFields(now, year, month0, dom, dow, doy, mid);
+ Grego::timeToFields(localMillis, year, month0, dom, dow, doy, mid);
int currentEncodedDate = encodeDate(year, month0 + 1 /* changes to 1-base */, dom);
int eraIdx = numEras - 1;
while (eraIdx > 0) {
@@ -301,7 +317,8 @@ void EraRules::initCurrentEra() {
}
// Note: current era could be before the first era.
// In this case, this implementation returns the first era index (0).
- currentEra = eraIdx;}
+ currentEra = eraIdx;
+}
U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/erarules.h b/Build/source/libs/icu/icu-src/source/i18n/erarules.h
index 4ed86408325..74b7862da4c 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/erarules.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/erarules.h
@@ -18,10 +18,16 @@ U_NAMESPACE_BEGIN
// When building DLLs for Windows this is required even though no direct access leaks out of the i18n library.
// See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples.
#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
+#if defined(_MSC_VER)
// Ignore warning 4661 as LocalPointerBase does not use operator== or operator!=
-#pragma warning(suppress: 4661)
+#pragma warning(push)
+#pragma warning(disable: 4661)
+#endif
template class U_I18N_API LocalPointerBase<int32_t>;
template class U_I18N_API LocalMemory<int32_t>;
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif
#endif
class U_I18N_API EraRules : public UMemory {
@@ -69,7 +75,8 @@ public:
/**
* Gets the current era index. This is calculated only once for an instance of
- * EraRules.
+ * EraRules. The current era calculation is based on the default time zone at
+ * the time of instantiation.
*
* @return era index of current era (or 0, when current date is before the first era)
*/
diff --git a/Build/source/libs/icu/icu-src/source/i18n/esctrn.cpp b/Build/source/libs/icu/icu-src/source/i18n/esctrn.cpp
index 900bed7e457..ba0e4c2c7bb 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/esctrn.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/esctrn.cpp
@@ -122,7 +122,7 @@ EscapeTransliterator::~EscapeTransliterator() {
/**
* Transliterator API.
*/
-Transliterator* EscapeTransliterator::clone() const {
+EscapeTransliterator* EscapeTransliterator::clone() const {
return new EscapeTransliterator(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/esctrn.h b/Build/source/libs/icu/icu-src/source/i18n/esctrn.h
index 60ecc74b498..2a2c6dcfe9a 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/esctrn.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/esctrn.h
@@ -115,7 +115,7 @@ class EscapeTransliterator : public Transliterator {
/**
* Transliterator API.
*/
- virtual Transliterator* clone() const;
+ virtual EscapeTransliterator* clone() const;
/**
* ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/ethpccal.cpp b/Build/source/libs/icu/icu-src/source/i18n/ethpccal.cpp
index 995dd6a593d..7c7c0ba37b7 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/ethpccal.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/ethpccal.cpp
@@ -46,7 +46,7 @@ EthiopicCalendar::~EthiopicCalendar()
{
}
-Calendar*
+EthiopicCalendar*
EthiopicCalendar::clone() const
{
return new EthiopicCalendar(*this);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/ethpccal.h b/Build/source/libs/icu/icu-src/source/i18n/ethpccal.h
index acd7c3cf97e..d1e8f424b57 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/ethpccal.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/ethpccal.h
@@ -141,7 +141,7 @@ public:
* @return return a polymorphic copy of this calendar.
* @internal
*/
- virtual Calendar* clone() const;
+ virtual EthiopicCalendar* clone() const;
/**
* return the calendar type, "ethiopic"
diff --git a/Build/source/libs/icu/icu-src/source/i18n/fmtable.cpp b/Build/source/libs/icu/icu-src/source/i18n/fmtable.cpp
index 45c7024fc29..dbfd3c26bad 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/fmtable.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/fmtable.cpp
@@ -732,9 +732,14 @@ CharString *Formattable::internalGetCharString(UErrorCode &status) {
// Older ICUs called uprv_decNumberToString here, which is not exactly the same as
// DecimalQuantity::toScientificString(). The biggest difference is that uprv_decNumberToString does
// not print scientific notation for magnitudes greater than -5 and smaller than some amount (+5?).
- if (fDecimalQuantity->isZero()) {
+ if (fDecimalQuantity->isInfinite()) {
+ fDecimalStr->append("Infinity", status);
+ } else if (fDecimalQuantity->isNaN()) {
+ fDecimalStr->append("NaN", status);
+ } else if (fDecimalQuantity->isZeroish()) {
fDecimalStr->append("0", -1, status);
- } else if (std::abs(fDecimalQuantity->getMagnitude()) < 5) {
+ } else if (fType==kLong || fType==kInt64 || // use toPlainString for integer types
+ (fDecimalQuantity->getMagnitude() != INT32_MIN && std::abs(fDecimalQuantity->getMagnitude()) < 5)) {
fDecimalStr->appendInvariantChars(fDecimalQuantity->toPlainString(), status);
} else {
fDecimalStr->appendInvariantChars(fDecimalQuantity->toScientificString(), status);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_stringbuilder.cpp b/Build/source/libs/icu/icu-src/source/i18n/formatted_string_builder.cpp
index 74ba33fbbc1..3024bff6add 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_stringbuilder.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/formatted_string_builder.cpp
@@ -5,13 +5,10 @@
#if !UCONFIG_NO_FORMATTING
-#include "number_stringbuilder.h"
+#include "formatted_string_builder.h"
+#include "unicode/ustring.h"
#include "unicode/utf16.h"
-using namespace icu;
-using namespace icu::number;
-using namespace icu::number::impl;
-
namespace {
// A version of uprv_memcpy that checks for length 0.
@@ -32,20 +29,31 @@ inline void uprv_memmove2(void* dest, const void* src, size_t len) {
} // namespace
-NumberStringBuilder::NumberStringBuilder() = default;
-NumberStringBuilder::~NumberStringBuilder() {
+U_NAMESPACE_BEGIN
+
+FormattedStringBuilder::FormattedStringBuilder() {
+#if U_DEBUG
+ // Initializing the memory to non-zero helps catch some bugs that involve
+ // reading from an improperly terminated string.
+ for (int32_t i=0; i<getCapacity(); i++) {
+ getCharPtr()[i] = 1;
+ }
+#endif
+}
+
+FormattedStringBuilder::~FormattedStringBuilder() {
if (fUsingHeap) {
uprv_free(fChars.heap.ptr);
uprv_free(fFields.heap.ptr);
}
}
-NumberStringBuilder::NumberStringBuilder(const NumberStringBuilder &other) {
+FormattedStringBuilder::FormattedStringBuilder(const FormattedStringBuilder &other) {
*this = other;
}
-NumberStringBuilder &NumberStringBuilder::operator=(const NumberStringBuilder &other) {
+FormattedStringBuilder &FormattedStringBuilder::operator=(const FormattedStringBuilder &other) {
// Check for self-assignment
if (this == &other) {
return *this;
@@ -68,7 +76,7 @@ NumberStringBuilder &NumberStringBuilder::operator=(const NumberStringBuilder &o
// UErrorCode is not available; fail silently.
uprv_free(newChars);
uprv_free(newFields);
- *this = NumberStringBuilder(); // can't fail
+ *this = FormattedStringBuilder(); // can't fail
return *this;
}
@@ -87,15 +95,15 @@ NumberStringBuilder &NumberStringBuilder::operator=(const NumberStringBuilder &o
return *this;
}
-int32_t NumberStringBuilder::length() const {
+int32_t FormattedStringBuilder::length() const {
return fLength;
}
-int32_t NumberStringBuilder::codePointCount() const {
+int32_t FormattedStringBuilder::codePointCount() const {
return u_countChar32(getCharPtr() + fZero, fLength);
}
-UChar32 NumberStringBuilder::getFirstCodePoint() const {
+UChar32 FormattedStringBuilder::getFirstCodePoint() const {
if (fLength == 0) {
return -1;
}
@@ -104,7 +112,7 @@ UChar32 NumberStringBuilder::getFirstCodePoint() const {
return cp;
}
-UChar32 NumberStringBuilder::getLastCodePoint() const {
+UChar32 FormattedStringBuilder::getLastCodePoint() const {
if (fLength == 0) {
return -1;
}
@@ -115,13 +123,13 @@ UChar32 NumberStringBuilder::getLastCodePoint() const {
return cp;
}
-UChar32 NumberStringBuilder::codePointAt(int32_t index) const {
+UChar32 FormattedStringBuilder::codePointAt(int32_t index) const {
UChar32 cp;
U16_GET(getCharPtr() + fZero, 0, index, fLength, cp);
return cp;
}
-UChar32 NumberStringBuilder::codePointBefore(int32_t index) const {
+UChar32 FormattedStringBuilder::codePointBefore(int32_t index) const {
int32_t offset = index;
U16_BACK_1(getCharPtr() + fZero, 0, offset);
UChar32 cp;
@@ -129,19 +137,15 @@ UChar32 NumberStringBuilder::codePointBefore(int32_t index) const {
return cp;
}
-NumberStringBuilder &NumberStringBuilder::clear() {
+FormattedStringBuilder &FormattedStringBuilder::clear() {
// TODO: Reset the heap here?
fZero = getCapacity() / 2;
fLength = 0;
return *this;
}
-int32_t NumberStringBuilder::appendCodePoint(UChar32 codePoint, Field field, UErrorCode &status) {
- return insertCodePoint(fLength, codePoint, field, status);
-}
-
int32_t
-NumberStringBuilder::insertCodePoint(int32_t index, UChar32 codePoint, Field field, UErrorCode &status) {
+FormattedStringBuilder::insertCodePoint(int32_t index, UChar32 codePoint, Field field, UErrorCode &status) {
int32_t count = U16_LENGTH(codePoint);
int32_t position = prepareForInsert(index, count, status);
if (U_FAILURE(status)) {
@@ -158,11 +162,7 @@ NumberStringBuilder::insertCodePoint(int32_t index, UChar32 codePoint, Field fie
return count;
}
-int32_t NumberStringBuilder::append(const UnicodeString &unistr, Field field, UErrorCode &status) {
- return insert(fLength, unistr, field, status);
-}
-
-int32_t NumberStringBuilder::insert(int32_t index, const UnicodeString &unistr, Field field,
+int32_t FormattedStringBuilder::insert(int32_t index, const UnicodeString &unistr, Field field,
UErrorCode &status) {
if (unistr.length() == 0) {
// Nothing to insert.
@@ -176,7 +176,7 @@ int32_t NumberStringBuilder::insert(int32_t index, const UnicodeString &unistr,
}
int32_t
-NumberStringBuilder::insert(int32_t index, const UnicodeString &unistr, int32_t start, int32_t end,
+FormattedStringBuilder::insert(int32_t index, const UnicodeString &unistr, int32_t start, int32_t end,
Field field, UErrorCode &status) {
int32_t count = end - start;
int32_t position = prepareForInsert(index, count, status);
@@ -191,7 +191,7 @@ NumberStringBuilder::insert(int32_t index, const UnicodeString &unistr, int32_t
}
int32_t
-NumberStringBuilder::splice(int32_t startThis, int32_t endThis, const UnicodeString &unistr,
+FormattedStringBuilder::splice(int32_t startThis, int32_t endThis, const UnicodeString &unistr,
int32_t startOther, int32_t endOther, Field field, UErrorCode& status) {
int32_t thisLength = endThis - startThis;
int32_t otherLength = endOther - startOther;
@@ -214,12 +214,12 @@ NumberStringBuilder::splice(int32_t startThis, int32_t endThis, const UnicodeSt
return count;
}
-int32_t NumberStringBuilder::append(const NumberStringBuilder &other, UErrorCode &status) {
+int32_t FormattedStringBuilder::append(const FormattedStringBuilder &other, UErrorCode &status) {
return insert(fLength, other, status);
}
int32_t
-NumberStringBuilder::insert(int32_t index, const NumberStringBuilder &other, UErrorCode &status) {
+FormattedStringBuilder::insert(int32_t index, const FormattedStringBuilder &other, UErrorCode &status) {
if (this == &other) {
status = U_ILLEGAL_ARGUMENT_ERROR;
return 0;
@@ -240,7 +240,17 @@ NumberStringBuilder::insert(int32_t index, const NumberStringBuilder &other, UEr
return count;
}
-int32_t NumberStringBuilder::prepareForInsert(int32_t index, int32_t count, UErrorCode &status) {
+void FormattedStringBuilder::writeTerminator(UErrorCode& status) {
+ int32_t position = prepareForInsert(fLength, 1, status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+ getCharPtr()[position] = 0;
+ getFieldPtr()[position] = UNUM_FIELD_COUNT;
+ fLength--;
+}
+
+int32_t FormattedStringBuilder::prepareForInsert(int32_t index, int32_t count, UErrorCode &status) {
U_ASSERT(index >= 0);
U_ASSERT(index <= fLength);
U_ASSERT(count >= 0);
@@ -259,7 +269,7 @@ int32_t NumberStringBuilder::prepareForInsert(int32_t index, int32_t count, UErr
}
}
-int32_t NumberStringBuilder::prepareForInsertHelper(int32_t index, int32_t count, UErrorCode &status) {
+int32_t FormattedStringBuilder::prepareForInsertHelper(int32_t index, int32_t count, UErrorCode &status) {
int32_t oldCapacity = getCapacity();
int32_t oldZero = fZero;
char16_t *oldChars = getCharPtr();
@@ -322,7 +332,7 @@ int32_t NumberStringBuilder::prepareForInsertHelper(int32_t index, int32_t count
return fZero + index;
}
-int32_t NumberStringBuilder::remove(int32_t index, int32_t count) {
+int32_t FormattedStringBuilder::remove(int32_t index, int32_t count) {
// TODO: Reset the heap here? (If the string after removal can fit on stack?)
int32_t position = index + fZero;
uprv_memmove2(getCharPtr() + position,
@@ -335,18 +345,18 @@ int32_t NumberStringBuilder::remove(int32_t index, int32_t count) {
return position;
}
-UnicodeString NumberStringBuilder::toUnicodeString() const {
+UnicodeString FormattedStringBuilder::toUnicodeString() const {
return UnicodeString(getCharPtr() + fZero, fLength);
}
-const UnicodeString NumberStringBuilder::toTempUnicodeString() const {
+const UnicodeString FormattedStringBuilder::toTempUnicodeString() const {
// Readonly-alias constructor:
return UnicodeString(FALSE, getCharPtr() + fZero, fLength);
}
-UnicodeString NumberStringBuilder::toDebugString() const {
+UnicodeString FormattedStringBuilder::toDebugString() const {
UnicodeString sb;
- sb.append(u"<NumberStringBuilder [", -1);
+ sb.append(u"<FormattedStringBuilder [", -1);
sb.append(toUnicodeString());
sb.append(u"] [", -1);
for (int i = 0; i < fLength; i++) {
@@ -399,11 +409,11 @@ UnicodeString NumberStringBuilder::toDebugString() const {
return sb;
}
-const char16_t *NumberStringBuilder::chars() const {
+const char16_t *FormattedStringBuilder::chars() const {
return getCharPtr() + fZero;
}
-bool NumberStringBuilder::contentEquals(const NumberStringBuilder &other) const {
+bool FormattedStringBuilder::contentEquals(const FormattedStringBuilder &other) const {
if (fLength != other.fLength) {
return false;
}
@@ -415,80 +425,7 @@ bool NumberStringBuilder::contentEquals(const NumberStringBuilder &other) const
return true;
}
-bool NumberStringBuilder::nextFieldPosition(FieldPosition& fp, UErrorCode& status) const {
- int32_t rawField = fp.getField();
-
- if (rawField == FieldPosition::DONT_CARE) {
- return FALSE;
- }
-
- if (rawField < 0 || rawField >= UNUM_FIELD_COUNT) {
- status = U_ILLEGAL_ARGUMENT_ERROR;
- return FALSE;
- }
-
- auto field = static_cast<Field>(rawField);
-
- bool seenStart = false;
- int32_t fractionStart = -1;
- int32_t startIndex = fp.getEndIndex();
- for (int i = fZero + startIndex; i <= fZero + fLength; i++) {
- Field _field = UNUM_FIELD_COUNT;
- if (i < fZero + fLength) {
- _field = getFieldPtr()[i];
- }
- if (seenStart && field != _field) {
- // Special case: GROUPING_SEPARATOR counts as an INTEGER.
- if (field == UNUM_INTEGER_FIELD && _field == UNUM_GROUPING_SEPARATOR_FIELD) {
- continue;
- }
- fp.setEndIndex(i - fZero);
- break;
- } else if (!seenStart && field == _field) {
- fp.setBeginIndex(i - fZero);
- seenStart = true;
- }
- if (_field == UNUM_INTEGER_FIELD || _field == UNUM_DECIMAL_SEPARATOR_FIELD) {
- fractionStart = i - fZero + 1;
- }
- }
-
- // Backwards compatibility: FRACTION needs to start after INTEGER if empty.
- // Do not return that a field was found, though, since there is not actually a fraction part.
- if (field == UNUM_FRACTION_FIELD && !seenStart && fractionStart != -1) {
- fp.setBeginIndex(fractionStart);
- fp.setEndIndex(fractionStart);
- }
-
- return seenStart;
-}
-
-void NumberStringBuilder::getAllFieldPositions(FieldPositionIteratorHandler& fpih,
- UErrorCode& status) const {
- Field current = UNUM_FIELD_COUNT;
- int32_t currentStart = -1;
- for (int32_t i = 0; i < fLength; i++) {
- Field field = fieldAt(i);
- if (current == UNUM_INTEGER_FIELD && field == UNUM_GROUPING_SEPARATOR_FIELD) {
- // Special case: GROUPING_SEPARATOR counts as an INTEGER.
- fpih.addAttribute(UNUM_GROUPING_SEPARATOR_FIELD, i, i + 1);
- } else if (current != field) {
- if (current != UNUM_FIELD_COUNT) {
- fpih.addAttribute(current, currentStart, i);
- }
- current = field;
- currentStart = i;
- }
- if (U_FAILURE(status)) {
- return;
- }
- }
- if (current != UNUM_FIELD_COUNT) {
- fpih.addAttribute(current, currentStart, fLength);
- }
-}
-
-bool NumberStringBuilder::containsField(Field field) const {
+bool FormattedStringBuilder::containsField(Field field) const {
for (int32_t i = 0; i < fLength; i++) {
if (field == fieldAt(i)) {
return true;
@@ -497,4 +434,6 @@ bool NumberStringBuilder::containsField(Field field) const {
return false;
}
+U_NAMESPACE_END
+
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/formatted_string_builder.h b/Build/source/libs/icu/icu-src/source/i18n/formatted_string_builder.h
new file mode 100644
index 00000000000..2949ae73e0f
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/i18n/formatted_string_builder.h
@@ -0,0 +1,253 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+#ifndef __NUMBER_STRINGBUILDER_H__
+#define __NUMBER_STRINGBUILDER_H__
+
+
+#include <cstdint>
+#include "unicode/unum.h" // for UNUM_FIELD_COUNT
+#include "cstring.h"
+#include "uassert.h"
+#include "fphdlimp.h"
+
+U_NAMESPACE_BEGIN
+
+class FormattedValueStringBuilderImpl;
+
+/**
+ * A StringBuilder optimized for formatting. It implements the following key
+ * features beyond a UnicodeString:
+ *
+ * <ol>
+ * <li>Efficient prepend as well as append.
+ * <li>Keeps tracks of Fields in an efficient manner.
+ * </ol>
+ *
+ * See also FormattedValueStringBuilderImpl.
+ *
+ * @author sffc (Shane Carr)
+ */
+class U_I18N_API FormattedStringBuilder : public UMemory {
+ private:
+ static const int32_t DEFAULT_CAPACITY = 40;
+
+ template<typename T>
+ union ValueOrHeapArray {
+ T value[DEFAULT_CAPACITY];
+ struct {
+ T *ptr;
+ int32_t capacity;
+ } heap;
+ };
+
+ public:
+ FormattedStringBuilder();
+
+ ~FormattedStringBuilder();
+
+ FormattedStringBuilder(const FormattedStringBuilder &other);
+
+ // Convention: bottom 4 bits for field, top 4 bits for field category.
+ // Field category 0 implies the number category so that the number field
+ // literals can be directly passed as a Field type.
+ // See the helper functions in "StringBuilderFieldUtils" below.
+ typedef uint8_t Field;
+
+ FormattedStringBuilder &operator=(const FormattedStringBuilder &other);
+
+ int32_t length() const;
+
+ int32_t codePointCount() const;
+
+ inline char16_t charAt(int32_t index) const {
+ U_ASSERT(index >= 0);
+ U_ASSERT(index < fLength);
+ return getCharPtr()[fZero + index];
+ }
+
+ inline Field fieldAt(int32_t index) const {
+ U_ASSERT(index >= 0);
+ U_ASSERT(index < fLength);
+ return getFieldPtr()[fZero + index];
+ }
+
+ UChar32 getFirstCodePoint() const;
+
+ UChar32 getLastCodePoint() const;
+
+ UChar32 codePointAt(int32_t index) const;
+
+ UChar32 codePointBefore(int32_t index) const;
+
+ FormattedStringBuilder &clear();
+
+ /** Appends a UTF-16 code unit. */
+ inline int32_t appendChar16(char16_t codeUnit, Field field, UErrorCode& status) {
+ // appendCodePoint handles both code units and code points.
+ return insertCodePoint(fLength, codeUnit, field, status);
+ }
+
+ /** Inserts a UTF-16 code unit. Note: insert at index 0 is very efficient. */
+ inline int32_t insertChar16(int32_t index, char16_t codeUnit, Field field, UErrorCode& status) {
+ // insertCodePoint handles both code units and code points.
+ return insertCodePoint(index, codeUnit, field, status);
+ }
+
+ /** Appends a Unicode code point. */
+ inline int32_t appendCodePoint(UChar32 codePoint, Field field, UErrorCode &status) {
+ return insertCodePoint(fLength, codePoint, field, status);
+ }
+
+ /** Inserts a Unicode code point. Note: insert at index 0 is very efficient. */
+ int32_t insertCodePoint(int32_t index, UChar32 codePoint, Field field, UErrorCode &status);
+
+ /** Appends a string. */
+ inline int32_t append(const UnicodeString &unistr, Field field, UErrorCode &status) {
+ return insert(fLength, unistr, field, status);
+ }
+
+ /** Inserts a string. Note: insert at index 0 is very efficient. */
+ int32_t insert(int32_t index, const UnicodeString &unistr, Field field, UErrorCode &status);
+
+ /** Inserts a substring. Note: insert at index 0 is very efficient.
+ *
+ * @param start Start index of the substring of unistr to be inserted.
+ * @param end End index of the substring of unistr to be inserted (exclusive).
+ */
+ int32_t insert(int32_t index, const UnicodeString &unistr, int32_t start, int32_t end, Field field,
+ UErrorCode &status);
+
+ /** Deletes a substring and then inserts a string at that same position.
+ * Similar to JavaScript Array.prototype.splice().
+ *
+ * @param startThis Start of the span to delete.
+ * @param endThis End of the span to delete (exclusive).
+ * @param unistr The string to insert at the deletion position.
+ * @param startOther Start index of the substring of unistr to be inserted.
+ * @param endOther End index of the substring of unistr to be inserted (exclusive).
+ */
+ int32_t splice(int32_t startThis, int32_t endThis, const UnicodeString &unistr,
+ int32_t startOther, int32_t endOther, Field field, UErrorCode& status);
+
+ /** Appends a formatted string. */
+ int32_t append(const FormattedStringBuilder &other, UErrorCode &status);
+
+ /** Inserts a formatted string. Note: insert at index 0 is very efficient. */
+ int32_t insert(int32_t index, const FormattedStringBuilder &other, UErrorCode &status);
+
+ /**
+ * Ensures that the string buffer contains a NUL terminator. The NUL terminator does
+ * not count toward the string length. Any further changes to the string (insert or
+ * append) may invalidate the NUL terminator.
+ *
+ * You should call this method after the formatted string is completely built if you
+ * plan to return a pointer to the string from a C API.
+ */
+ void writeTerminator(UErrorCode& status);
+
+ /**
+ * Gets a "safe" UnicodeString that can be used even after the FormattedStringBuilder is destructed.
+ */
+ UnicodeString toUnicodeString() const;
+
+ /**
+ * Gets an "unsafe" UnicodeString that is valid only as long as the FormattedStringBuilder is alive and
+ * unchanged. Slightly faster than toUnicodeString().
+ */
+ const UnicodeString toTempUnicodeString() const;
+
+ UnicodeString toDebugString() const;
+
+ const char16_t *chars() const;
+
+ bool contentEquals(const FormattedStringBuilder &other) const;
+
+ bool containsField(Field field) const;
+
+ private:
+ bool fUsingHeap = false;
+ ValueOrHeapArray<char16_t> fChars;
+ ValueOrHeapArray<Field> fFields;
+ int32_t fZero = DEFAULT_CAPACITY / 2;
+ int32_t fLength = 0;
+
+ inline char16_t *getCharPtr() {
+ return fUsingHeap ? fChars.heap.ptr : fChars.value;
+ }
+
+ inline const char16_t *getCharPtr() const {
+ return fUsingHeap ? fChars.heap.ptr : fChars.value;
+ }
+
+ inline Field *getFieldPtr() {
+ return fUsingHeap ? fFields.heap.ptr : fFields.value;
+ }
+
+ inline const Field *getFieldPtr() const {
+ return fUsingHeap ? fFields.heap.ptr : fFields.value;
+ }
+
+ inline int32_t getCapacity() const {
+ return fUsingHeap ? fChars.heap.capacity : DEFAULT_CAPACITY;
+ }
+
+ int32_t prepareForInsert(int32_t index, int32_t count, UErrorCode &status);
+
+ int32_t prepareForInsertHelper(int32_t index, int32_t count, UErrorCode &status);
+
+ int32_t remove(int32_t index, int32_t count);
+
+ friend class FormattedValueStringBuilderImpl;
+};
+
+/**
+ * Helper functions for dealing with the Field typedef, which stores fields
+ * in a compressed format.
+ */
+class StringBuilderFieldUtils {
+public:
+ struct CategoryFieldPair {
+ int32_t category;
+ int32_t field;
+ };
+
+ /** Compile-time function to construct a Field from a category and a field */
+ template <int32_t category, int32_t field>
+ static constexpr FormattedStringBuilder::Field compress() {
+ static_assert(category != 0, "cannot use Undefined category in FieldUtils");
+ static_assert(category <= 0xf, "only 4 bits for category");
+ static_assert(field <= 0xf, "only 4 bits for field");
+ return static_cast<int8_t>((category << 4) | field);
+ }
+
+ /** Runtime inline function to unpack the category and field from the Field */
+ static inline CategoryFieldPair expand(FormattedStringBuilder::Field field) {
+ if (field == UNUM_FIELD_COUNT) {
+ return {UFIELD_CATEGORY_UNDEFINED, 0};
+ }
+ CategoryFieldPair ret = {
+ (field >> 4),
+ (field & 0xf)
+ };
+ if (ret.category == 0) {
+ ret.category = UFIELD_CATEGORY_NUMBER;
+ }
+ return ret;
+ }
+
+ static inline bool isNumericField(FormattedStringBuilder::Field field) {
+ int8_t category = field >> 4;
+ return category == 0 || category == UFIELD_CATEGORY_NUMBER;
+ }
+};
+
+U_NAMESPACE_END
+
+
+#endif //__NUMBER_STRINGBUILDER_H__
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/formattedval_impl.h b/Build/source/libs/icu/icu-src/source/i18n/formattedval_impl.h
new file mode 100644
index 00000000000..9aab36a52fe
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/i18n/formattedval_impl.h
@@ -0,0 +1,278 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#ifndef __FORMVAL_IMPL_H__
+#define __FORMVAL_IMPL_H__
+
+#include "unicode/utypes.h"
+#if !UCONFIG_NO_FORMATTING
+
+// This file contains compliant implementations of FormattedValue which can be
+// leveraged by ICU formatters.
+//
+// Each implementation is defined in its own cpp file in order to split
+// dependencies more modularly.
+
+#include "unicode/formattedvalue.h"
+#include "capi_helper.h"
+#include "fphdlimp.h"
+#include "util.h"
+#include "uvectr32.h"
+#include "formatted_string_builder.h"
+
+
+/**
+ * Represents the type of constraint for ConstrainedFieldPosition.
+ *
+ * Constraints are used to control the behavior of iteration in FormattedValue.
+ *
+ * @internal
+ */
+typedef enum UCFPosConstraintType {
+ /**
+ * Represents the lack of a constraint.
+ *
+ * This is the value of fConstraint if no "constrain" methods were called.
+ *
+ * @internal
+ */
+ UCFPOS_CONSTRAINT_NONE = 0,
+
+ /**
+ * Represents that the field category is constrained.
+ *
+ * This is the value of fConstraint if constraintCategory was called.
+ *
+ * FormattedValue implementations should not change the field category
+ * while this constraint is active.
+ *
+ * @internal
+ */
+ UCFPOS_CONSTRAINT_CATEGORY,
+
+ /**
+ * Represents that the field and field category are constrained.
+ *
+ * This is the value of fConstraint if constraintField was called.
+ *
+ * FormattedValue implementations should not change the field or field category
+ * while this constraint is active.
+ *
+ * @internal
+ */
+ UCFPOS_CONSTRAINT_FIELD
+} UCFPosConstraintType;
+
+
+U_NAMESPACE_BEGIN
+
+
+/**
+ * Implementation of FormattedValue using FieldPositionHandler to accept fields.
+ */
+class FormattedValueFieldPositionIteratorImpl : public UMemory, public FormattedValue {
+public:
+
+ /** @param initialFieldCapacity Initially allocate space for this many fields. */
+ FormattedValueFieldPositionIteratorImpl(int32_t initialFieldCapacity, UErrorCode& status);
+
+ virtual ~FormattedValueFieldPositionIteratorImpl();
+
+ // Implementation of FormattedValue (const):
+
+ UnicodeString toString(UErrorCode& status) const U_OVERRIDE;
+ UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE;
+ Appendable& appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE;
+ UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE;
+
+ // Additional methods used during construction phase only (non-const):
+
+ FieldPositionIteratorHandler getHandler(UErrorCode& status);
+ void appendString(UnicodeString string, UErrorCode& status);
+
+ /**
+ * Computes the spans for duplicated values.
+ * For example, if the string has fields:
+ *
+ * ...aa..[b.cc]..d.[bb.e.c]..a..
+ *
+ * then the spans will be the bracketed regions.
+ *
+ * Assumes that the currently known fields are sorted
+ * and all in the same category.
+ */
+ void addOverlapSpans(UFieldCategory spanCategory, int8_t firstIndex, UErrorCode& status);
+
+ /**
+ * Sorts the fields: start index first, length second.
+ */
+ void sort();
+
+private:
+ UnicodeString fString;
+ UVector32 fFields;
+};
+
+
+/**
+ * Implementation of FormattedValue based on FormattedStringBuilder.
+ *
+ * The implementation currently revolves around numbers and number fields.
+ * However, it can be generalized in the future when there is a need.
+ *
+ * @author sffc (Shane Carr)
+ */
+// Exported as U_I18N_API for tests
+class U_I18N_API FormattedValueStringBuilderImpl : public UMemory, public FormattedValue {
+public:
+
+ FormattedValueStringBuilderImpl(FormattedStringBuilder::Field numericField);
+
+ virtual ~FormattedValueStringBuilderImpl();
+
+ // Implementation of FormattedValue (const):
+
+ UnicodeString toString(UErrorCode& status) const U_OVERRIDE;
+ UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE;
+ Appendable& appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE;
+ UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE;
+
+ // Additional helper functions:
+ UBool nextFieldPosition(FieldPosition& fp, UErrorCode& status) const;
+ void getAllFieldPositions(FieldPositionIteratorHandler& fpih, UErrorCode& status) const;
+ inline FormattedStringBuilder& getStringRef() {
+ return fString;
+ }
+ inline const FormattedStringBuilder& getStringRef() const {
+ return fString;
+ }
+
+private:
+ FormattedStringBuilder fString;
+ FormattedStringBuilder::Field fNumericField;
+
+ bool nextPositionImpl(ConstrainedFieldPosition& cfpos, FormattedStringBuilder::Field numericField, UErrorCode& status) const;
+ static bool isIntOrGroup(FormattedStringBuilder::Field field);
+ static bool isNumericField(FormattedStringBuilder::Field field);
+ int32_t trimBack(int32_t limit) const;
+ int32_t trimFront(int32_t start) const;
+};
+
+
+// C API Helpers for FormattedValue
+// Magic number as ASCII == "UFV"
+struct UFormattedValueImpl;
+typedef IcuCApiHelper<UFormattedValue, UFormattedValueImpl, 0x55465600> UFormattedValueApiHelper;
+struct UFormattedValueImpl : public UMemory, public UFormattedValueApiHelper {
+ // This pointer should be set by the child class.
+ FormattedValue* fFormattedValue = nullptr;
+};
+
+
+/** Boilerplate to check for valid status before dereferencing the fData pointer. */
+#define UPRV_FORMATTED_VALUE_METHOD_GUARD(returnExpression) \
+ if (U_FAILURE(status)) { \
+ return returnExpression; \
+ } \
+ if (fData == nullptr) { \
+ status = fErrorCode; \
+ return returnExpression; \
+ } \
+
+
+/** Implementation of the methods from U_FORMATTED_VALUE_SUBCLASS_AUTO. */
+#define UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(Name) \
+ Name::Name(Name&& src) U_NOEXCEPT \
+ : fData(src.fData), fErrorCode(src.fErrorCode) { \
+ src.fData = nullptr; \
+ src.fErrorCode = U_INVALID_STATE_ERROR; \
+ } \
+ Name::~Name() { \
+ delete fData; \
+ fData = nullptr; \
+ } \
+ Name& Name::operator=(Name&& src) U_NOEXCEPT { \
+ delete fData; \
+ fData = src.fData; \
+ src.fData = nullptr; \
+ fErrorCode = src.fErrorCode; \
+ src.fErrorCode = U_INVALID_STATE_ERROR; \
+ return *this; \
+ } \
+ UnicodeString Name::toString(UErrorCode& status) const { \
+ UPRV_FORMATTED_VALUE_METHOD_GUARD(ICU_Utility::makeBogusString()) \
+ return fData->toString(status); \
+ } \
+ UnicodeString Name::toTempString(UErrorCode& status) const { \
+ UPRV_FORMATTED_VALUE_METHOD_GUARD(ICU_Utility::makeBogusString()) \
+ return fData->toTempString(status); \
+ } \
+ Appendable& Name::appendTo(Appendable& appendable, UErrorCode& status) const { \
+ UPRV_FORMATTED_VALUE_METHOD_GUARD(appendable) \
+ return fData->appendTo(appendable, status); \
+ } \
+ UBool Name::nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const { \
+ UPRV_FORMATTED_VALUE_METHOD_GUARD(FALSE) \
+ return fData->nextPosition(cfpos, status); \
+ }
+
+
+/** Like UPRV_FORMATTED_VALUE_CAPI_AUTO_IMPL but without impl type declarations. */
+#define UPRV_FORMATTED_VALUE_CAPI_NO_IMPLTYPE_AUTO_IMPL(CType, ImplType, HelperType, Prefix) \
+ U_CAPI CType* U_EXPORT2 \
+ Prefix ## _openResult (UErrorCode* ec) { \
+ if (U_FAILURE(*ec)) { \
+ return nullptr; \
+ } \
+ ImplType* impl = new ImplType(); \
+ if (impl == nullptr) { \
+ *ec = U_MEMORY_ALLOCATION_ERROR; \
+ return nullptr; \
+ } \
+ return static_cast<HelperType*>(impl)->exportForC(); \
+ } \
+ U_DRAFT const UFormattedValue* U_EXPORT2 \
+ Prefix ## _resultAsValue (const CType* uresult, UErrorCode* ec) { \
+ const ImplType* result = HelperType::validate(uresult, *ec); \
+ if (U_FAILURE(*ec)) { return nullptr; } \
+ return static_cast<const UFormattedValueApiHelper*>(result)->exportConstForC(); \
+ } \
+ U_CAPI void U_EXPORT2 \
+ Prefix ## _closeResult (CType* uresult) { \
+ UErrorCode localStatus = U_ZERO_ERROR; \
+ const ImplType* impl = HelperType::validate(uresult, localStatus); \
+ delete impl; \
+ }
+
+
+/**
+ * Implementation of the standard methods for a UFormattedValue "subclass" C API.
+ * @param CPPType The public C++ type, like FormattedList
+ * @param CType The public C type, like UFormattedList
+ * @param ImplType A name to use for the implementation class
+ * @param HelperType A name to use for the "mixin" typedef for C API conversion
+ * @param Prefix The C API prefix, like ulistfmt
+ * @param MagicNumber A unique 32-bit number to use to identify this type
+ */
+#define UPRV_FORMATTED_VALUE_CAPI_AUTO_IMPL(CPPType, CType, ImplType, HelperType, Prefix, MagicNumber) \
+ U_NAMESPACE_BEGIN \
+ class ImplType; \
+ typedef IcuCApiHelper<CType, ImplType, MagicNumber> HelperType; \
+ class ImplType : public UFormattedValueImpl, public HelperType { \
+ public: \
+ ImplType(); \
+ ~ImplType(); \
+ CPPType fImpl; \
+ }; \
+ ImplType::ImplType() { \
+ fFormattedValue = &fImpl; \
+ } \
+ ImplType::~ImplType() {} \
+ U_NAMESPACE_END \
+ UPRV_FORMATTED_VALUE_CAPI_NO_IMPLTYPE_AUTO_IMPL(CType, ImplType, HelperType, Prefix)
+
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif // __FORMVAL_IMPL_H__
diff --git a/Build/source/libs/icu/icu-src/source/i18n/formattedval_iterimpl.cpp b/Build/source/libs/icu/icu-src/source/i18n/formattedval_iterimpl.cpp
new file mode 100644
index 00000000000..75328fae883
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/i18n/formattedval_iterimpl.cpp
@@ -0,0 +1,176 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
+// This file contains one implementation of FormattedValue.
+// Other independent implementations should go into their own cpp file for
+// better dependency modularization.
+
+#include "formattedval_impl.h"
+#include "putilimp.h"
+
+U_NAMESPACE_BEGIN
+
+
+FormattedValueFieldPositionIteratorImpl::FormattedValueFieldPositionIteratorImpl(
+ int32_t initialFieldCapacity,
+ UErrorCode& status)
+ : fFields(initialFieldCapacity * 4, status) {
+}
+
+FormattedValueFieldPositionIteratorImpl::~FormattedValueFieldPositionIteratorImpl() = default;
+
+UnicodeString FormattedValueFieldPositionIteratorImpl::toString(
+ UErrorCode&) const {
+ return fString;
+}
+
+UnicodeString FormattedValueFieldPositionIteratorImpl::toTempString(
+ UErrorCode&) const {
+ // The alias must point to memory owned by this object;
+ // fastCopyFrom doesn't do this when using a stack buffer.
+ return UnicodeString(TRUE, fString.getBuffer(), fString.length());
+}
+
+Appendable& FormattedValueFieldPositionIteratorImpl::appendTo(
+ Appendable& appendable,
+ UErrorCode&) const {
+ appendable.appendString(fString.getBuffer(), fString.length());
+ return appendable;
+}
+
+UBool FormattedValueFieldPositionIteratorImpl::nextPosition(
+ ConstrainedFieldPosition& cfpos,
+ UErrorCode&) const {
+ U_ASSERT(fFields.size() % 4 == 0);
+ int32_t numFields = fFields.size() / 4;
+ int32_t i = static_cast<int32_t>(cfpos.getInt64IterationContext());
+ for (; i < numFields; i++) {
+ UFieldCategory category = static_cast<UFieldCategory>(fFields.elementAti(i * 4));
+ int32_t field = fFields.elementAti(i * 4 + 1);
+ if (cfpos.matchesField(category, field)) {
+ int32_t start = fFields.elementAti(i * 4 + 2);
+ int32_t limit = fFields.elementAti(i * 4 + 3);
+ cfpos.setState(category, field, start, limit);
+ break;
+ }
+ }
+ cfpos.setInt64IterationContext(i == numFields ? i : i + 1);
+ return i < numFields;
+}
+
+
+FieldPositionIteratorHandler FormattedValueFieldPositionIteratorImpl::getHandler(
+ UErrorCode& status) {
+ return FieldPositionIteratorHandler(&fFields, status);
+}
+
+void FormattedValueFieldPositionIteratorImpl::appendString(
+ UnicodeString string,
+ UErrorCode& status) {
+ if (U_FAILURE(status)) {
+ return;
+ }
+ fString.append(string);
+ // Make the string NUL-terminated
+ if (fString.getTerminatedBuffer() == nullptr) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+}
+
+
+void FormattedValueFieldPositionIteratorImpl::addOverlapSpans(
+ UFieldCategory spanCategory,
+ int8_t firstIndex,
+ UErrorCode& status) {
+ // In order to avoid fancy data structures, this is an O(N^2) algorithm,
+ // which should be fine for all real-life applications of this function.
+ int32_t s1a = INT32_MAX;
+ int32_t s1b = 0;
+ int32_t s2a = INT32_MAX;
+ int32_t s2b = 0;
+ int32_t numFields = fFields.size() / 4;
+ for (int32_t i = 0; i<numFields; i++) {
+ int32_t field1 = fFields.elementAti(i * 4 + 1);
+ for (int32_t j = i + 1; j<numFields; j++) {
+ int32_t field2 = fFields.elementAti(j * 4 + 1);
+ if (field1 != field2) {
+ continue;
+ }
+ // Found a duplicate
+ s1a = uprv_min(s1a, fFields.elementAti(i * 4 + 2));
+ s1b = uprv_max(s1b, fFields.elementAti(i * 4 + 3));
+ s2a = uprv_min(s2a, fFields.elementAti(j * 4 + 2));
+ s2b = uprv_max(s2b, fFields.elementAti(j * 4 + 3));
+ break;
+ }
+ }
+ if (s1a != INT32_MAX) {
+ // Success: add the two span fields
+ fFields.addElement(spanCategory, status);
+ fFields.addElement(firstIndex, status);
+ fFields.addElement(s1a, status);
+ fFields.addElement(s1b, status);
+ fFields.addElement(spanCategory, status);
+ fFields.addElement(1 - firstIndex, status);
+ fFields.addElement(s2a, status);
+ fFields.addElement(s2b, status);
+ }
+}
+
+
+void FormattedValueFieldPositionIteratorImpl::sort() {
+ // Use bubble sort, O(N^2) but easy and no fancy data structures.
+ int32_t numFields = fFields.size() / 4;
+ while (true) {
+ bool isSorted = true;
+ for (int32_t i=0; i<numFields-1; i++) {
+ int32_t categ1 = fFields.elementAti(i*4 + 0);
+ int32_t field1 = fFields.elementAti(i*4 + 1);
+ int32_t start1 = fFields.elementAti(i*4 + 2);
+ int32_t limit1 = fFields.elementAti(i*4 + 3);
+ int32_t categ2 = fFields.elementAti(i*4 + 4);
+ int32_t field2 = fFields.elementAti(i*4 + 5);
+ int32_t start2 = fFields.elementAti(i*4 + 6);
+ int32_t limit2 = fFields.elementAti(i*4 + 7);
+ int64_t comparison = 0;
+ if (start1 != start2) {
+ // Higher start index -> higher rank
+ comparison = start2 - start1;
+ } else if (limit1 != limit2) {
+ // Higher length (end index) -> lower rank
+ comparison = limit1 - limit2;
+ } else if (categ1 != categ2) {
+ // Higher field category -> lower rank
+ comparison = categ1 - categ2;
+ } else if (field1 != field2) {
+ // Higher field -> higher rank
+ comparison = field2 - field1;
+ }
+ if (comparison < 0) {
+ // Perform a swap
+ isSorted = false;
+ fFields.setElementAt(categ2, i*4 + 0);
+ fFields.setElementAt(field2, i*4 + 1);
+ fFields.setElementAt(start2, i*4 + 2);
+ fFields.setElementAt(limit2, i*4 + 3);
+ fFields.setElementAt(categ1, i*4 + 4);
+ fFields.setElementAt(field1, i*4 + 5);
+ fFields.setElementAt(start1, i*4 + 6);
+ fFields.setElementAt(limit1, i*4 + 7);
+ }
+ }
+ if (isSorted) {
+ break;
+ }
+ }
+}
+
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/formattedval_sbimpl.cpp b/Build/source/libs/icu/icu-src/source/i18n/formattedval_sbimpl.cpp
new file mode 100644
index 00000000000..ca28f222813
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/i18n/formattedval_sbimpl.cpp
@@ -0,0 +1,214 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
+// This file contains one implementation of FormattedValue.
+// Other independent implementations should go into their own cpp file for
+// better dependency modularization.
+
+#include "unicode/ustring.h"
+#include "formattedval_impl.h"
+#include "number_types.h"
+#include "formatted_string_builder.h"
+#include "number_utils.h"
+#include "static_unicode_sets.h"
+
+U_NAMESPACE_BEGIN
+
+
+typedef FormattedStringBuilder::Field Field;
+
+
+FormattedValueStringBuilderImpl::FormattedValueStringBuilderImpl(Field numericField)
+ : fNumericField(numericField) {
+}
+
+FormattedValueStringBuilderImpl::~FormattedValueStringBuilderImpl() {
+}
+
+
+UnicodeString FormattedValueStringBuilderImpl::toString(UErrorCode&) const {
+ return fString.toUnicodeString();
+}
+
+UnicodeString FormattedValueStringBuilderImpl::toTempString(UErrorCode&) const {
+ return fString.toTempUnicodeString();
+}
+
+Appendable& FormattedValueStringBuilderImpl::appendTo(Appendable& appendable, UErrorCode&) const {
+ appendable.appendString(fString.chars(), fString.length());
+ return appendable;
+}
+
+UBool FormattedValueStringBuilderImpl::nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const {
+ // NOTE: MSVC sometimes complains when implicitly converting between bool and UBool
+ return nextPositionImpl(cfpos, fNumericField, status) ? TRUE : FALSE;
+}
+
+UBool FormattedValueStringBuilderImpl::nextFieldPosition(FieldPosition& fp, UErrorCode& status) const {
+ int32_t rawField = fp.getField();
+
+ if (rawField == FieldPosition::DONT_CARE) {
+ return FALSE;
+ }
+
+ if (rawField < 0 || rawField >= UNUM_FIELD_COUNT) {
+ status = U_ILLEGAL_ARGUMENT_ERROR;
+ return FALSE;
+ }
+
+ ConstrainedFieldPosition cfpos;
+ cfpos.constrainField(UFIELD_CATEGORY_NUMBER, rawField);
+ cfpos.setState(UFIELD_CATEGORY_NUMBER, rawField, fp.getBeginIndex(), fp.getEndIndex());
+ if (nextPositionImpl(cfpos, 0, status)) {
+ fp.setBeginIndex(cfpos.getStart());
+ fp.setEndIndex(cfpos.getLimit());
+ return TRUE;
+ }
+
+ // Special case: fraction should start after integer if fraction is not present
+ if (rawField == UNUM_FRACTION_FIELD && fp.getEndIndex() == 0) {
+ bool inside = false;
+ int32_t i = fString.fZero;
+ for (; i < fString.fZero + fString.fLength; i++) {
+ if (isIntOrGroup(fString.getFieldPtr()[i]) || fString.getFieldPtr()[i] == UNUM_DECIMAL_SEPARATOR_FIELD) {
+ inside = true;
+ } else if (inside) {
+ break;
+ }
+ }
+ fp.setBeginIndex(i - fString.fZero);
+ fp.setEndIndex(i - fString.fZero);
+ }
+
+ return FALSE;
+}
+
+void FormattedValueStringBuilderImpl::getAllFieldPositions(FieldPositionIteratorHandler& fpih,
+ UErrorCode& status) const {
+ ConstrainedFieldPosition cfpos;
+ while (nextPositionImpl(cfpos, 0, status)) {
+ fpih.addAttribute(cfpos.getField(), cfpos.getStart(), cfpos.getLimit());
+ }
+}
+
+// Signal the end of the string using a field that doesn't exist and that is
+// different from UNUM_FIELD_COUNT, which is used for "null number field".
+static constexpr Field kEndField = 0xff;
+
+bool FormattedValueStringBuilderImpl::nextPositionImpl(ConstrainedFieldPosition& cfpos, Field numericField, UErrorCode& /*status*/) const {
+ auto numericCAF = StringBuilderFieldUtils::expand(numericField);
+ int32_t fieldStart = -1;
+ Field currField = UNUM_FIELD_COUNT;
+ for (int32_t i = fString.fZero + cfpos.getLimit(); i <= fString.fZero + fString.fLength; i++) {
+ Field _field = (i < fString.fZero + fString.fLength) ? fString.getFieldPtr()[i] : kEndField;
+ // Case 1: currently scanning a field.
+ if (currField != UNUM_FIELD_COUNT) {
+ if (currField != _field) {
+ int32_t end = i - fString.fZero;
+ // Grouping separators can be whitespace; don't throw them out!
+ if (currField != UNUM_GROUPING_SEPARATOR_FIELD) {
+ end = trimBack(i - fString.fZero);
+ }
+ if (end <= fieldStart) {
+ // Entire field position is ignorable; skip.
+ fieldStart = -1;
+ currField = UNUM_FIELD_COUNT;
+ i--; // look at this index again
+ continue;
+ }
+ int32_t start = fieldStart;
+ if (currField != UNUM_GROUPING_SEPARATOR_FIELD) {
+ start = trimFront(start);
+ }
+ auto caf = StringBuilderFieldUtils::expand(currField);
+ cfpos.setState(caf.category, caf.field, start, end);
+ return true;
+ }
+ continue;
+ }
+ // Special case: coalesce the INTEGER if we are pointing at the end of the INTEGER.
+ if (cfpos.matchesField(UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD)
+ && i > fString.fZero
+ // don't return the same field twice in a row:
+ && i - fString.fZero > cfpos.getLimit()
+ && isIntOrGroup(fString.getFieldPtr()[i - 1])
+ && !isIntOrGroup(_field)) {
+ int j = i - 1;
+ for (; j >= fString.fZero && isIntOrGroup(fString.getFieldPtr()[j]); j--) {}
+ cfpos.setState(
+ UFIELD_CATEGORY_NUMBER,
+ UNUM_INTEGER_FIELD,
+ j - fString.fZero + 1,
+ i - fString.fZero);
+ return true;
+ }
+ // Special case: coalesce NUMERIC if we are pointing at the end of the NUMERIC.
+ if (numericField != 0
+ && cfpos.matchesField(numericCAF.category, numericCAF.field)
+ && i > fString.fZero
+ // don't return the same field twice in a row:
+ && (i - fString.fZero > cfpos.getLimit()
+ || cfpos.getCategory() != numericCAF.category
+ || cfpos.getField() != numericCAF.field)
+ && isNumericField(fString.getFieldPtr()[i - 1])
+ && !isNumericField(_field)) {
+ int j = i - 1;
+ for (; j >= fString.fZero && isNumericField(fString.getFieldPtr()[j]); j--) {}
+ cfpos.setState(
+ numericCAF.category,
+ numericCAF.field,
+ j - fString.fZero + 1,
+ i - fString.fZero);
+ return true;
+ }
+ // Special case: skip over INTEGER; will be coalesced later.
+ if (_field == UNUM_INTEGER_FIELD) {
+ _field = UNUM_FIELD_COUNT;
+ }
+ // Case 2: no field starting at this position.
+ if (_field == UNUM_FIELD_COUNT || _field == kEndField) {
+ continue;
+ }
+ // Case 3: check for field starting at this position
+ auto caf = StringBuilderFieldUtils::expand(_field);
+ if (cfpos.matchesField(caf.category, caf.field)) {
+ fieldStart = i - fString.fZero;
+ currField = _field;
+ }
+ }
+
+ U_ASSERT(currField == UNUM_FIELD_COUNT);
+ return false;
+}
+
+bool FormattedValueStringBuilderImpl::isIntOrGroup(Field field) {
+ return field == UNUM_INTEGER_FIELD
+ || field == UNUM_GROUPING_SEPARATOR_FIELD;
+}
+
+bool FormattedValueStringBuilderImpl::isNumericField(Field field) {
+ return StringBuilderFieldUtils::isNumericField(field);
+}
+
+int32_t FormattedValueStringBuilderImpl::trimBack(int32_t limit) const {
+ return unisets::get(unisets::DEFAULT_IGNORABLES)->spanBack(
+ fString.getCharPtr() + fString.fZero,
+ limit,
+ USET_SPAN_CONTAINED);
+}
+
+int32_t FormattedValueStringBuilderImpl::trimFront(int32_t start) const {
+ return start + unisets::get(unisets::DEFAULT_IGNORABLES)->span(
+ fString.getCharPtr() + fString.fZero + start,
+ fString.fLength - start,
+ USET_SPAN_CONTAINED);
+}
+
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/formattedvalue.cpp b/Build/source/libs/icu/icu-src/source/i18n/formattedvalue.cpp
new file mode 100644
index 00000000000..e2c9c42fc88
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/i18n/formattedvalue.cpp
@@ -0,0 +1,232 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
+#include "unicode/formattedvalue.h"
+#include "formattedval_impl.h"
+#include "capi_helper.h"
+
+U_NAMESPACE_BEGIN
+
+
+ConstrainedFieldPosition::ConstrainedFieldPosition() {}
+
+ConstrainedFieldPosition::~ConstrainedFieldPosition() {}
+
+void ConstrainedFieldPosition::reset() {
+ fContext = 0LL;
+ fField = 0;
+ fStart = 0;
+ fLimit = 0;
+ fConstraint = UCFPOS_CONSTRAINT_NONE;
+ fCategory = UFIELD_CATEGORY_UNDEFINED;
+}
+
+void ConstrainedFieldPosition::constrainCategory(int32_t category) {
+ fConstraint = UCFPOS_CONSTRAINT_CATEGORY;
+ fCategory = category;
+}
+
+void ConstrainedFieldPosition::constrainField(int32_t category, int32_t field) {
+ fConstraint = UCFPOS_CONSTRAINT_FIELD;
+ fCategory = category;
+ fField = field;
+}
+
+void ConstrainedFieldPosition::setInt64IterationContext(int64_t context) {
+ fContext = context;
+}
+
+UBool ConstrainedFieldPosition::matchesField(int32_t category, int32_t field) const {
+ switch (fConstraint) {
+ case UCFPOS_CONSTRAINT_NONE:
+ return TRUE;
+ case UCFPOS_CONSTRAINT_CATEGORY:
+ return fCategory == category;
+ case UCFPOS_CONSTRAINT_FIELD:
+ return fCategory == category && fField == field;
+ default:
+ UPRV_UNREACHABLE;
+ }
+}
+
+void ConstrainedFieldPosition::setState(
+ int32_t category,
+ int32_t field,
+ int32_t start,
+ int32_t limit) {
+ fCategory = category;
+ fField = field;
+ fStart = start;
+ fLimit = limit;
+}
+
+
+FormattedValue::~FormattedValue() = default;
+
+
+///////////////////////
+/// C API FUNCTIONS ///
+///////////////////////
+
+struct UConstrainedFieldPositionImpl : public UMemory,
+ // Magic number as ASCII == "UCF"
+ public IcuCApiHelper<UConstrainedFieldPosition, UConstrainedFieldPositionImpl, 0x55434600> {
+ ConstrainedFieldPosition fImpl;
+};
+
+U_CAPI UConstrainedFieldPosition* U_EXPORT2
+ucfpos_open(UErrorCode* ec) {
+ auto* impl = new UConstrainedFieldPositionImpl();
+ if (impl == nullptr) {
+ *ec = U_MEMORY_ALLOCATION_ERROR;
+ return nullptr;
+ }
+ return impl->exportForC();
+}
+
+U_CAPI void U_EXPORT2
+ucfpos_reset(UConstrainedFieldPosition* ptr, UErrorCode* ec) {
+ auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
+ if (U_FAILURE(*ec)) {
+ return;
+ }
+ impl->fImpl.reset();
+}
+
+U_CAPI void U_EXPORT2
+ucfpos_constrainCategory(UConstrainedFieldPosition* ptr, int32_t category, UErrorCode* ec) {
+ auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
+ if (U_FAILURE(*ec)) {
+ return;
+ }
+ impl->fImpl.constrainCategory(category);
+}
+
+U_CAPI void U_EXPORT2
+ucfpos_constrainField(UConstrainedFieldPosition* ptr, int32_t category, int32_t field, UErrorCode* ec) {
+ auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
+ if (U_FAILURE(*ec)) {
+ return;
+ }
+ impl->fImpl.constrainField(category, field);
+}
+
+U_CAPI int32_t U_EXPORT2
+ucfpos_getCategory(const UConstrainedFieldPosition* ptr, UErrorCode* ec) {
+ const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
+ if (U_FAILURE(*ec)) {
+ return UFIELD_CATEGORY_UNDEFINED;
+ }
+ return impl->fImpl.getCategory();
+}
+
+U_CAPI int32_t U_EXPORT2
+ucfpos_getField(const UConstrainedFieldPosition* ptr, UErrorCode* ec) {
+ const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
+ if (U_FAILURE(*ec)) {
+ return 0;
+ }
+ return impl->fImpl.getField();
+}
+
+U_CAPI void U_EXPORT2
+ucfpos_getIndexes(const UConstrainedFieldPosition* ptr, int32_t* pStart, int32_t* pLimit, UErrorCode* ec) {
+ const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
+ if (U_FAILURE(*ec)) {
+ return;
+ }
+ *pStart = impl->fImpl.getStart();
+ *pLimit = impl->fImpl.getLimit();
+}
+
+U_CAPI int64_t U_EXPORT2
+ucfpos_getInt64IterationContext(const UConstrainedFieldPosition* ptr, UErrorCode* ec) {
+ const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
+ if (U_FAILURE(*ec)) {
+ return 0;
+ }
+ return impl->fImpl.getInt64IterationContext();
+}
+
+U_CAPI void U_EXPORT2
+ucfpos_setInt64IterationContext(UConstrainedFieldPosition* ptr, int64_t context, UErrorCode* ec) {
+ auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
+ if (U_FAILURE(*ec)) {
+ return;
+ }
+ impl->fImpl.setInt64IterationContext(context);
+}
+
+U_CAPI UBool U_EXPORT2
+ucfpos_matchesField(const UConstrainedFieldPosition* ptr, int32_t category, int32_t field, UErrorCode* ec) {
+ const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
+ if (U_FAILURE(*ec)) {
+ return 0;
+ }
+ return impl->fImpl.matchesField(category, field);
+}
+
+U_CAPI void U_EXPORT2
+ucfpos_setState(
+ UConstrainedFieldPosition* ptr,
+ int32_t category,
+ int32_t field,
+ int32_t start,
+ int32_t limit,
+ UErrorCode* ec) {
+ auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
+ if (U_FAILURE(*ec)) {
+ return;
+ }
+ impl->fImpl.setState(category, field, start, limit);
+}
+
+U_CAPI void U_EXPORT2
+ucfpos_close(UConstrainedFieldPosition* ptr) {
+ UErrorCode localStatus = U_ZERO_ERROR;
+ auto* impl = UConstrainedFieldPositionImpl::validate(ptr, localStatus);
+ delete impl;
+}
+
+
+U_DRAFT const UChar* U_EXPORT2
+ufmtval_getString(
+ const UFormattedValue* ufmtval,
+ int32_t* pLength,
+ UErrorCode* ec) {
+ const auto* impl = UFormattedValueApiHelper::validate(ufmtval, *ec);
+ if (U_FAILURE(*ec)) {
+ return nullptr;
+ }
+ UnicodeString readOnlyAlias = impl->fFormattedValue->toTempString(*ec);
+ if (U_FAILURE(*ec)) {
+ return nullptr;
+ }
+ if (pLength != nullptr) {
+ *pLength = readOnlyAlias.length();
+ }
+ return readOnlyAlias.getBuffer();
+}
+
+
+U_DRAFT UBool U_EXPORT2
+ufmtval_nextPosition(
+ const UFormattedValue* ufmtval,
+ UConstrainedFieldPosition* ucfpos,
+ UErrorCode* ec) {
+ const auto* fmtval = UFormattedValueApiHelper::validate(ufmtval, *ec);
+ auto* cfpos = UConstrainedFieldPositionImpl::validate(ucfpos, *ec);
+ if (U_FAILURE(*ec)) {
+ return FALSE;
+ }
+ return fmtval->fFormattedValue->nextPosition(cfpos->fImpl, *ec);
+}
+
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/fphdlimp.cpp b/Build/source/libs/icu/icu-src/source/i18n/fphdlimp.cpp
index c4015fae1bb..f51bf4bae78 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/fphdlimp.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/fphdlimp.cpp
@@ -38,7 +38,8 @@ FieldPositionOnlyHandler::~FieldPositionOnlyHandler() {
void
FieldPositionOnlyHandler::addAttribute(int32_t id, int32_t start, int32_t limit) {
- if (pos.getField() == id) {
+ if (pos.getField() == id && (!acceptFirstOnly || !seenFirst)) {
+ seenFirst = TRUE;
pos.setBeginIndex(start + fShift);
pos.setEndIndex(limit + fShift);
}
@@ -57,17 +58,27 @@ FieldPositionOnlyHandler::isRecording(void) const {
return pos.getField() != FieldPosition::DONT_CARE;
}
+void FieldPositionOnlyHandler::setAcceptFirstOnly(UBool acceptFirstOnly) {
+ this->acceptFirstOnly = acceptFirstOnly;
+}
+
// utility subclass FieldPositionIteratorHandler
FieldPositionIteratorHandler::FieldPositionIteratorHandler(FieldPositionIterator* posIter,
UErrorCode& _status)
- : iter(posIter), vec(NULL), status(_status) {
+ : iter(posIter), vec(NULL), status(_status), fCategory(UFIELD_CATEGORY_UNDEFINED) {
if (iter && U_SUCCESS(status)) {
vec = new UVector32(status);
}
}
+FieldPositionIteratorHandler::FieldPositionIteratorHandler(
+ UVector32* vec,
+ UErrorCode& status)
+ : iter(nullptr), vec(vec), status(status), fCategory(UFIELD_CATEGORY_UNDEFINED) {
+}
+
FieldPositionIteratorHandler::~FieldPositionIteratorHandler() {
// setData adopts the vec regardless of status, so it's safe to null it
if (iter) {
@@ -79,8 +90,9 @@ FieldPositionIteratorHandler::~FieldPositionIteratorHandler() {
void
FieldPositionIteratorHandler::addAttribute(int32_t id, int32_t start, int32_t limit) {
- if (iter && U_SUCCESS(status) && start < limit) {
+ if (vec && U_SUCCESS(status) && start < limit) {
int32_t size = vec->size();
+ vec->addElement(fCategory, status);
vec->addElement(id, status);
vec->addElement(start + fShift, status);
vec->addElement(limit + fShift, status);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/fphdlimp.h b/Build/source/libs/icu/icu-src/source/i18n/fphdlimp.h
index a6827e01e98..00937830fe7 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/fphdlimp.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/fphdlimp.h
@@ -16,6 +16,7 @@
#include "unicode/fieldpos.h"
#include "unicode/fpositer.h"
+#include "unicode/formattedvalue.h"
U_NAMESPACE_BEGIN
@@ -40,6 +41,8 @@ class U_I18N_API FieldPositionHandler: public UMemory {
class FieldPositionOnlyHandler : public FieldPositionHandler {
FieldPosition& pos;
+ UBool acceptFirstOnly = FALSE;
+ UBool seenFirst = FALSE;
public:
FieldPositionOnlyHandler(FieldPosition& pos);
@@ -48,6 +51,13 @@ class FieldPositionOnlyHandler : public FieldPositionHandler {
void addAttribute(int32_t id, int32_t start, int32_t limit) U_OVERRIDE;
void shiftLast(int32_t delta) U_OVERRIDE;
UBool isRecording(void) const U_OVERRIDE;
+
+ /**
+ * Enable this option to lock in the FieldPosition value after seeing the
+ * first occurrence of the field. The default behavior is to take the last
+ * occurrence.
+ */
+ void setAcceptFirstOnly(UBool acceptFirstOnly);
};
@@ -57,21 +67,38 @@ class FieldPositionIteratorHandler : public FieldPositionHandler {
FieldPositionIterator* iter; // can be NULL
UVector32* vec;
UErrorCode status;
+ UFieldCategory fCategory;
// Note, we keep a reference to status, so if status is on the stack, we have
// to be destroyed before status goes out of scope. Easiest thing is to
// allocate us on the stack in the same (or narrower) scope as status has.
// This attempts to encourage that by blocking heap allocation.
- void *operator new(size_t s);
- void *operator new[](size_t s);
+ static void* U_EXPORT2 operator new(size_t) U_NOEXCEPT = delete;
+ static void* U_EXPORT2 operator new[](size_t) U_NOEXCEPT = delete;
+#if U_HAVE_PLACEMENT_NEW
+ static void* U_EXPORT2 operator new(size_t, void*) U_NOEXCEPT = delete;
+#endif
public:
FieldPositionIteratorHandler(FieldPositionIterator* posIter, UErrorCode& status);
+ /** If using this constructor, you must call getError() when done formatting! */
+ FieldPositionIteratorHandler(UVector32* vec, UErrorCode& status);
~FieldPositionIteratorHandler();
void addAttribute(int32_t id, int32_t start, int32_t limit) U_OVERRIDE;
void shiftLast(int32_t delta) U_OVERRIDE;
UBool isRecording(void) const U_OVERRIDE;
+
+ /** Copies a failed error code into _status. */
+ inline void getError(UErrorCode& _status) {
+ if (U_SUCCESS(_status) && U_FAILURE(status)) {
+ _status = status;
+ }
+ }
+
+ inline void setCategory(UFieldCategory category) {
+ fCategory = category;
+ }
};
U_NAMESPACE_END
diff --git a/Build/source/libs/icu/icu-src/source/i18n/fpositer.cpp b/Build/source/libs/icu/icu-src/source/i18n/fpositer.cpp
index 47d4b3f9b14..75d529eb8c9 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/fpositer.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/fpositer.cpp
@@ -65,10 +65,10 @@ void FieldPositionIterator::setData(UVector32 *adopt, UErrorCode& status) {
if (adopt->size() == 0) {
delete adopt;
adopt = NULL;
- } else if ((adopt->size() % 3) != 0) {
+ } else if ((adopt->size() % 4) != 0) {
status = U_ILLEGAL_ARGUMENT_ERROR;
} else {
- for (int i = 1; i < adopt->size(); i += 3) {
+ for (int i = 2; i < adopt->size(); i += 4) {
if (adopt->elementAti(i) >= adopt->elementAti(i+1)) {
status = U_ILLEGAL_ARGUMENT_ERROR;
break;
@@ -95,6 +95,8 @@ UBool FieldPositionIterator::next(FieldPosition& fp) {
return FALSE;
}
+ // Ignore the first element of the tetrad: used for field category
+ pos++;
fp.setField(data->elementAti(pos++));
fp.setBeginIndex(data->elementAti(pos++));
fp.setEndIndex(data->elementAti(pos++));
diff --git a/Build/source/libs/icu/icu-src/source/i18n/funcrepl.cpp b/Build/source/libs/icu/icu-src/source/i18n/funcrepl.cpp
index 01c8754657b..7dd54ed8d2b 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/funcrepl.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/funcrepl.cpp
@@ -59,7 +59,7 @@ FunctionReplacer::~FunctionReplacer() {
/**
* Implement UnicodeFunctor
*/
-UnicodeFunctor* FunctionReplacer::clone() const {
+FunctionReplacer* FunctionReplacer::clone() const {
return new FunctionReplacer(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/funcrepl.h b/Build/source/libs/icu/icu-src/source/i18n/funcrepl.h
index a835d5be7c2..fe41f6caaa6 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/funcrepl.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/funcrepl.h
@@ -70,7 +70,7 @@ class FunctionReplacer : public UnicodeFunctor, public UnicodeReplacer {
/**
* Implement UnicodeFunctor
*/
- virtual UnicodeFunctor* clone() const;
+ virtual FunctionReplacer* clone() const;
/**
* UnicodeFunctor API. Cast 'this' to a UnicodeReplacer* pointer
diff --git a/Build/source/libs/icu/icu-src/source/i18n/gender.cpp b/Build/source/libs/icu/icu-src/source/i18n/gender.cpp
index 9a25dd88f96..32ddbf9a667 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/gender.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/gender.cpp
@@ -32,7 +32,7 @@
#include "uhash.h"
static UHashtable* gGenderInfoCache = NULL;
-static UMutex gGenderMetaLock = U_MUTEX_INITIALIZER;
+
static const char* gNeutralStr = "neutral";
static const char* gMailTaintsStr = "maleTaints";
static const char* gMixedNeutralStr = "mixedNeutral";
@@ -98,6 +98,7 @@ const GenderInfo* GenderInfo::getInstance(const Locale& locale, UErrorCode& stat
return NULL;
}
+ static UMutex gGenderMetaLock;
const GenderInfo* result = NULL;
const char* key = locale.getName();
{
diff --git a/Build/source/libs/icu/icu-src/source/i18n/gregocal.cpp b/Build/source/libs/icu/icu-src/source/i18n/gregocal.cpp
index 71faeb09501..6b15171c12b 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/gregocal.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/gregocal.cpp
@@ -286,7 +286,7 @@ fIsGregorian(source.fIsGregorian), fInvertGregorian(source.fInvertGregorian)
// -------------------------------------
-Calendar* GregorianCalendar::clone() const
+GregorianCalendar* GregorianCalendar::clone() const
{
return new GregorianCalendar(*this);
}
@@ -324,26 +324,26 @@ GregorianCalendar::setGregorianChange(UDate date, UErrorCode& status)
if (U_FAILURE(status))
return;
- fGregorianCutover = date;
-
// Precompute two internal variables which we use to do the actual
// cutover computations. These are the normalized cutover, which is the
// midnight at or before the cutover, and the cutover year. The
// normalized cutover is in pure date milliseconds; it contains no time
// of day or timezone component, and it used to compare against other
// pure date values.
- int32_t cutoverDay = (int32_t)ClockMath::floorDivide(fGregorianCutover, (double)kOneDay);
- fNormalizedGregorianCutover = cutoverDay * kOneDay;
-
- // Handle the rare case of numeric overflow. If the user specifies a
- // change of UDate(Long.MIN_VALUE), in order to get a pure Gregorian
- // calendar, then the epoch day is -106751991168, which when multiplied
- // by ONE_DAY gives 9223372036794351616 -- the negative value is too
- // large for 64 bits, and overflows into a positive value. We correct
- // this by using the next day, which for all intents is semantically
- // equivalent.
- if (cutoverDay < 0 && fNormalizedGregorianCutover > 0) {
- fNormalizedGregorianCutover = (cutoverDay + 1) * kOneDay;
+ double cutoverDay = ClockMath::floorDivide(date, (double)kOneDay);
+
+ // Handle the rare case of numeric overflow where the user specifies a time
+ // outside of INT32_MIN .. INT32_MAX number of days.
+
+ if (cutoverDay <= INT32_MIN) {
+ cutoverDay = INT32_MIN;
+ fGregorianCutover = fNormalizedGregorianCutover = cutoverDay * kOneDay;
+ } else if (cutoverDay >= INT32_MAX) {
+ cutoverDay = INT32_MAX;
+ fGregorianCutover = fNormalizedGregorianCutover = cutoverDay * kOneDay;
+ } else {
+ fNormalizedGregorianCutover = cutoverDay * kOneDay;
+ fGregorianCutover = date;
}
// Normalize the year so BC values are represented as 0 and negative
@@ -360,7 +360,7 @@ GregorianCalendar::setGregorianChange(UDate date, UErrorCode& status)
fGregorianCutoverYear = cal->get(UCAL_YEAR, status);
if (cal->get(UCAL_ERA, status) == BC)
fGregorianCutoverYear = 1 - fGregorianCutoverYear;
- fCutoverJulianDay = cutoverDay;
+ fCutoverJulianDay = (int32_t)cutoverDay;
delete cal;
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/hebrwcal.cpp b/Build/source/libs/icu/icu-src/source/i18n/hebrwcal.cpp
index c025be4b98f..c8fb8a16795 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/hebrwcal.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/hebrwcal.cpp
@@ -169,7 +169,7 @@ const char *HebrewCalendar::getType() const {
return "hebrew";
}
-Calendar* HebrewCalendar::clone() const {
+HebrewCalendar* HebrewCalendar::clone() const {
return new HebrewCalendar(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/hebrwcal.h b/Build/source/libs/icu/icu-src/source/i18n/hebrwcal.h
index bde646614fd..08136de32a9 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/hebrwcal.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/hebrwcal.h
@@ -192,7 +192,7 @@ public:
* @return return a polymorphic copy of this calendar.
* @internal
*/
- virtual Calendar* clone(void) const;
+ virtual HebrewCalendar* clone() const;
public:
/**
diff --git a/Build/source/libs/icu/icu-src/source/i18n/i18n.vcxproj b/Build/source/libs/icu/icu-src/source/i18n/i18n.vcxproj
index 0e222a54d7c..e939eb555ad 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/i18n.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/i18n/i18n.vcxproj
@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\allinone\Build.Windows.ProjectConfiguration.props" />
- <!-- The following import will include the library configuration options for VS projects. -->
- <Import Project="..\allinone\Build.Windows.Library.ProjectConfiguration.props" />
<PropertyGroup Label="Globals">
<ProjectGuid>{0178B127-6269-407D-B112-93877BB62776}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\allinone\Build.Windows.ProjectConfiguration.props" />
+ <!-- The following import will include the library configuration options for VS projects. -->
+ <Import Project="..\allinone\Build.Windows.Library.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -35,33 +35,37 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\..\..\lib\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\..\..\lib\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
<!-- Options that are common to *all* "i18n" project configurations -->
<ItemDefinitionGroup>
+ <Midl>
+ <TypeLibraryName>$(OutDir)\icuin.tlb</TypeLibraryName>
+ </Midl>
<ClCompile>
<PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;U_I18N_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<DisableLanguageExtensions>false</DisableLanguageExtensions>
<WarningLevel>Level3</WarningLevel>
<AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<CompileAs>Default</CompileAs>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <PrecompiledHeaderOutputFile>$(OutDir)/icuin.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)/icuin.pdb</ProgramDataBaseFileName>
</ClCompile>
<ResourceCompile>
<AdditionalIncludeDirectories>../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <BaseAddress>0x4a900000</BaseAddress>
+ <AdditionalLibraryDirectories>.\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<!-- Options that are common to all 'Debug' project configurations -->
@@ -72,6 +76,9 @@
</ClCompile>
<Link>
<AdditionalDependencies>icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>..\..\$(IcuBinOutputDir)\icuin65d.dll</OutputFile>
+ <ProgramDatabaseFile>.\..\..\$(IcuLibOutputDir)\icuind.pdb</ProgramDatabaseFile>
+ <ImportLibrary>..\..\$(IcuLibOutputDir)\icuind.lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
<!-- Options that are common to all 'Release' project configurations -->
@@ -82,83 +89,9 @@
</ClCompile>
<Link>
<AdditionalDependencies>icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Midl>
- <TypeLibraryName>.\..\..\lib\icuin.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <PrecompiledHeaderOutputFile>.\x86\Release/i18n.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
- </ClCompile>
- <Link>
- <OutputFile>..\..\bin\icuin63.dll</OutputFile>
- <AdditionalLibraryDirectories>.\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\..\..\lib\icuin.pdb</ProgramDatabaseFile>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
- <ImportLibrary>..\..\lib\icuin.lib</ImportLibrary>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Midl>
- <TypeLibraryName>.\..\..\lib\icuind.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <PrecompiledHeaderOutputFile>.\x86\Debug/i18n.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- </ClCompile>
- <Link>
- <OutputFile>..\..\bin\icuin63d.dll</OutputFile>
- <AdditionalLibraryDirectories>.\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\..\..\lib\icuind.pdb</ProgramDatabaseFile>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
- <ImportLibrary>..\..\lib\icuind.lib</ImportLibrary>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Midl>
- <TypeLibraryName>.\..\..\lib64\icuin.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <PrecompiledHeaderOutputFile>.\x64\Release/i18n.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- </ClCompile>
- <Link>
- <OutputFile>..\..\bin64\icuin63.dll</OutputFile>
- <AdditionalLibraryDirectories>.\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\..\..\lib64\icuin.pdb</ProgramDatabaseFile>
- <ImportLibrary>..\..\lib64\icuin.lib</ImportLibrary>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Midl>
- <TypeLibraryName>.\..\..\lib64\icuind.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <PrecompiledHeaderOutputFile>.\x64\Debug/i18n.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- </ClCompile>
- <Link>
- <OutputFile>..\..\bin64\icuin63d.dll</OutputFile>
- <AdditionalLibraryDirectories>.\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\..\..\lib64\icuind.pdb</ProgramDatabaseFile>
- <ImportLibrary>..\..\lib64\icuind.lib</ImportLibrary>
+ <OutputFile>..\..\$(IcuBinOutputDir)\icuin65.dll</OutputFile>
+ <ProgramDatabaseFile>.\..\..\$(IcuLibOutputDir)\icuin.pdb</ProgramDatabaseFile>
+ <ImportLibrary>..\..\$(IcuLibOutputDir)\icuin.lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
@@ -225,10 +158,10 @@
<ClCompile Include="double-conversion-bignum-dtoa.cpp" />
<ClCompile Include="double-conversion-bignum.cpp" />
<ClCompile Include="double-conversion-cached-powers.cpp" />
- <ClCompile Include="double-conversion-diy-fp.cpp" />
+ <ClCompile Include="double-conversion-double-to-string.cpp" />
<ClCompile Include="double-conversion-fast-dtoa.cpp" />
+ <ClCompile Include="double-conversion-string-to-double.cpp" />
<ClCompile Include="double-conversion-strtod.cpp" />
- <ClCompile Include="double-conversion.cpp" />
<ClCompile Include="dtfmtsym.cpp" />
<ClCompile Include="dtitvfmt.cpp" />
<ClCompile Include="dtitvinf.cpp" />
@@ -238,6 +171,9 @@
<ClCompile Include="fmtable.cpp" />
<ClCompile Include="fmtable_cnv.cpp" />
<ClCompile Include="format.cpp" />
+ <ClCompile Include="formattedval_iterimpl.cpp" />
+ <ClCompile Include="formattedval_sbimpl.cpp" />
+ <ClCompile Include="formattedvalue.cpp" />
<ClCompile Include="fphdlimp.cpp" />
<ClCompile Include="fpositer.cpp" />
<ClCompile Include="gender.cpp" />
@@ -269,19 +205,20 @@
<ClCompile Include="number_longnames.cpp" />
<ClCompile Include="number_modifiers.cpp" />
<ClCompile Include="number_notation.cpp" />
+ <ClCompile Include="number_output.cpp" />
<ClCompile Include="number_padding.cpp" />
<ClCompile Include="number_patternmodifier.cpp" />
<ClCompile Include="number_patternstring.cpp" />
<ClCompile Include="number_rounding.cpp" />
<ClCompile Include="number_scientific.cpp" />
- <ClCompile Include="number_stringbuilder.cpp" />
+ <ClCompile Include="formatted_string_builder.cpp" />
<ClCompile Include="number_utils.cpp" />
<ClCompile Include="number_mapper.cpp" />
<ClCompile Include="number_multiplier.cpp" />
<ClCompile Include="number_currencysymbols.cpp" />
<ClCompile Include="number_skeletons.cpp" />
<ClCompile Include="number_capi.cpp" />
- <ClCompile Include="numparse_stringsegment.cpp" />
+ <ClCompile Include="string_segment.cpp" />
<ClCompile Include="numparse_parsednumber.cpp" />
<ClCompile Include="numparse_impl.cpp" />
<ClCompile Include="numparse_symbols.cpp" />
@@ -438,8 +375,11 @@
<ClInclude Include="double-conversion-bignum.h" />
<ClInclude Include="double-conversion-cached-powers.h" />
<ClInclude Include="double-conversion-diy-fp.h" />
+ <ClInclude Include="double-conversion-double-to-string.h" />
<ClInclude Include="double-conversion-fast-dtoa.h" />
<ClInclude Include="double-conversion-ieee.h" />
+ <ClInclude Include="double-conversion-string-to-double.h" />
+ <ClInclude Include="double-conversion-strtod.h" />
<ClInclude Include="double-conversion-utils.h" />
<ClInclude Include="double-conversion.h" />
<ClInclude Include="dt_impl.h" />
@@ -537,7 +477,7 @@
<ClInclude Include="number_patternstring.h" />
<ClInclude Include="number_roundingutils.h" />
<ClInclude Include="number_scientific.h" />
- <ClInclude Include="number_stringbuilder.h" />
+ <ClInclude Include="formatted_string_builder.h" />
<ClInclude Include="number_types.h" />
<ClInclude Include="number_utypes.h" />
<ClInclude Include="number_utils.h" />
@@ -545,7 +485,7 @@
<ClInclude Include="number_multiplier.h" />
<ClInclude Include="number_currencysymbols.h" />
<ClInclude Include="number_skeletons.h" />
- <ClInclude Include="numparse_stringsegment.h" />
+ <ClInclude Include="string_segment.h" />
<ClInclude Include="numparse_impl.h" />
<ClInclude Include="numparse_symbols.h" />
<ClInclude Include="numparse_decimal.h" />
@@ -557,6 +497,7 @@
<ClInclude Include="numparse_types.h" />
<ClInclude Include="numparse_utils.h" />
<ClInclude Include="numrange_impl.h" />
+ <ClInclude Include="formattedval_impl.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="i18n.rc" />
diff --git a/Build/source/libs/icu/icu-src/source/i18n/i18n.vcxproj.filters b/Build/source/libs/icu/icu-src/source/i18n/i18n.vcxproj.filters
index c8f98451427..a1813fc0696 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/i18n.vcxproj.filters
+++ b/Build/source/libs/icu/icu-src/source/i18n/i18n.vcxproj.filters
@@ -117,16 +117,16 @@
<ClCompile Include="double-conversion-cached-powers.cpp">
<Filter>formatting</Filter>
</ClCompile>
- <ClCompile Include="double-conversion-diy-fp.cpp">
+ <ClCompile Include="double-conversion-double-to-string.cpp">
<Filter>formatting</Filter>
</ClCompile>
<ClCompile Include="double-conversion-fast-dtoa.cpp">
<Filter>formatting</Filter>
</ClCompile>
- <ClCompile Include="double-conversion-strtod.cpp">
+ <ClCompile Include="double-conversion-string-to-double.cpp">
<Filter>formatting</Filter>
</ClCompile>
- <ClCompile Include="double-conversion.cpp">
+ <ClCompile Include="double-conversion-strtod.cpp">
<Filter>formatting</Filter>
</ClCompile>
<ClCompile Include="dtfmtsym.cpp">
@@ -156,6 +156,15 @@
<ClCompile Include="format.cpp">
<Filter>formatting</Filter>
</ClCompile>
+ <ClCompile Include="formattedval_iterimpl.cpp">
+ <Filter>formatting</Filter>
+ </ClCompile>
+ <ClCompile Include="formattedval_sbimpl.cpp">
+ <Filter>formatting</Filter>
+ </ClCompile>
+ <ClCompile Include="formattedvalue.cpp">
+ <Filter>formatting</Filter>
+ </ClCompile>
<ClCompile Include="fphdlimp.cpp">
<Filter>formatting</Filter>
</ClCompile>
@@ -558,6 +567,9 @@
<ClCompile Include="number_notation.cpp">
<Filter>formatting</Filter>
</ClCompile>
+ <ClCompile Include="number_output.cpp">
+ <Filter>formatting</Filter>
+ </ClCompile>
<ClCompile Include="number_padding.cpp">
<Filter>formatting</Filter>
</ClCompile>
@@ -573,7 +585,7 @@
<ClCompile Include="number_scientific.cpp">
<Filter>formatting</Filter>
</ClCompile>
- <ClCompile Include="number_stringbuilder.cpp">
+ <ClCompile Include="formatted_string_builder.cpp">
<Filter>formatting</Filter>
</ClCompile>
<ClCompile Include="number_utils.cpp">
@@ -594,7 +606,7 @@
<ClCompile Include="number_capi.cpp">
<Filter>formatting</Filter>
</ClCompile>
- <ClCompile Include="numparse_stringsegment.cpp">
+ <ClCompile Include="string_segment.cpp">
<Filter>formatting</Filter>
</ClCompile>
<ClCompile Include="numparse_parsednumber.cpp">
@@ -764,6 +776,9 @@
<ClInclude Include="double-conversion-diy-fp.h">
<Filter>formatting</Filter>
</ClInclude>
+ <ClInclude Include="double-conversion-double-to-string.h">
+ <Filter>formatting</Filter>
+ </ClInclude>
<ClInclude Include="double-conversion-fast-dtoa.h">
<Filter>formatting</Filter>
</ClInclude>
@@ -773,6 +788,12 @@
<ClInclude Include="double-conversion-utils.h">
<Filter>formatting</Filter>
</ClInclude>
+ <ClInclude Include="double-conversion-string-to-double.h">
+ <Filter>formatting</Filter>
+ </ClInclude>
+ <ClInclude Include="double-conversion-strtod.h">
+ <Filter>formatting</Filter>
+ </ClInclude>
<ClInclude Include="double-conversion.h">
<Filter>formatting</Filter>
</ClInclude>
@@ -788,6 +809,9 @@
<ClInclude Include="ethpccal.h">
<Filter>formatting</Filter>
</ClInclude>
+ <ClInclude Include="formattedval_impl.h">
+ <Filter>formatting</Filter>
+ </ClInclude>
<ClInclude Include="fphdlimp.h">
<Filter>formatting</Filter>
</ClInclude>
@@ -863,7 +887,7 @@
<ClInclude Include="number_scientific.h">
<Filter>formatting</Filter>
</ClInclude>
- <ClInclude Include="number_stringbuilder.h">
+ <ClInclude Include="formatted_string_builder.h">
<Filter>formatting</Filter>
</ClInclude>
<ClInclude Include="number_types.h">
@@ -887,7 +911,7 @@
<ClInclude Include="number_skeletons.h">
<Filter>formatting</Filter>
</ClInclude>
- <ClInclude Include="numparse_stringsegment.h">
+ <ClInclude Include="string_segment.h">
<Filter>formatting</Filter>
</ClInclude>
<ClInclude Include="numparse_impl.h">
diff --git a/Build/source/libs/icu/icu-src/source/i18n/i18n_uwp.vcxproj b/Build/source/libs/icu/icu-src/source/i18n/i18n_uwp.vcxproj
index 49604f787e3..24ac8f30123 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/i18n_uwp.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/i18n/i18n_uwp.vcxproj
@@ -1,9 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS UWP projects. -->
- <Import Project="..\allinone\Build.Windows.UWP.ProjectConfiguration.props" />
- <!-- The following import will include the library configuration options for VS projects. -->
- <Import Project="..\allinone\Build.Windows.Library.ProjectConfiguration.props" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
@@ -17,6 +13,10 @@
<Configuration>Debug</Configuration>
<Platform>ARM</Platform>
</ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|ARM64">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -29,18 +29,26 @@
<Configuration>Release</Configuration>
<Platform>ARM</Platform>
</ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM64">
+ <Configuration>Release</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{6786C051-383B-47E0-9E82-B8B994E06A25}</ProjectGuid>
<Keyword>DynamicLibrary</Keyword>
<DefaultLanguage>en-US</DefaultLanguage>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <!-- The following import will include the UWP configuration options for VS projects. -->
+ <Import Project="..\allinone\Build.Windows.UWP.ProjectConfiguration.props" />
+ <!-- The following import will include the library configuration options for VS projects. -->
+ <Import Project="..\allinone\Build.Windows.Library.ProjectConfiguration.props" />
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -51,20 +59,14 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\ReleaseUWP\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\ReleaseUWP\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\DebugUWP\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\DebugUWP\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\ReleaseUWP\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\ReleaseUWP\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\DebugUWP\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\DebugUWP\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">.\arm\ReleaseUWP\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">.\arm\ReleaseUWP\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">.\arm\DebugUWP\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">.\arm\DebugUWP\</IntDir>
- <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)UWP\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)UWP\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)UWP\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)UWP\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
<LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup>
<Midl>
@@ -88,6 +90,7 @@
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<CompileAsWinRT>false</CompileAsWinRT>
<AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<ResourceCompile>
<Culture>0x0409</Culture>
@@ -127,7 +130,6 @@
<Optimization>Disabled</Optimization>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<BufferSecurityCheck>true</BufferSecurityCheck>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -166,6 +168,17 @@
<TargetMachine>MachineARM</TargetMachine>
</Link>
</ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Platform)'=='ARM64'">
+ <Midl>
+ <TargetEnvironment>ARM64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <PreprocessorDefinitions>ARM64;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <TargetMachine>MachineARM64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Midl>
<TypeLibraryName>.\..\..\lib32uwp\icuin.tlb</TypeLibraryName>
@@ -177,7 +190,7 @@
<ProgramDataBaseFileName>.\x86\ReleaseUWP/</ProgramDataBaseFileName>
</ClCompile>
<Link>
- <OutputFile>..\..\bin32uwp\icuin63.dll</OutputFile>
+ <OutputFile>..\..\bin32uwp\icuin65.dll</OutputFile>
<ProgramDatabaseFile>.\..\..\lib32uwp\icuin.pdb</ProgramDatabaseFile>
<ImportLibrary>..\..\lib32uwp\icuin.lib</ImportLibrary>
<AdditionalDependencies>..\..\lib32uwp\icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
@@ -194,7 +207,7 @@
<ProgramDataBaseFileName>.\x86\DebugUWP/</ProgramDataBaseFileName>
</ClCompile>
<Link>
- <OutputFile>..\..\bin32uwp\icuin63d.dll</OutputFile>
+ <OutputFile>..\..\bin32uwp\icuin65d.dll</OutputFile>
<ProgramDatabaseFile>.\..\..\lib32uwp\icuind.pdb</ProgramDatabaseFile>
<ImportLibrary>..\..\lib32uwp\icuind.lib</ImportLibrary>
<AdditionalDependencies>..\..\lib32uwp\icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
@@ -211,7 +224,7 @@
<ProgramDataBaseFileName>.\x64\ReleaseUWP/</ProgramDataBaseFileName>
</ClCompile>
<Link>
- <OutputFile>..\..\bin64uwp\icuin63.dll</OutputFile>
+ <OutputFile>..\..\bin64uwp\icuin65.dll</OutputFile>
<ProgramDatabaseFile>.\..\..\lib64uwp\icuin.pdb</ProgramDatabaseFile>
<ImportLibrary>..\..\lib64uwp\icuin.lib</ImportLibrary>
<AdditionalDependencies>..\..\lib64uwp\icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
@@ -228,7 +241,7 @@
<ProgramDataBaseFileName>.\x64\DebugUWP/</ProgramDataBaseFileName>
</ClCompile>
<Link>
- <OutputFile>..\..\bin64uwp\icuin63d.dll</OutputFile>
+ <OutputFile>..\..\bin64uwp\icuin65d.dll</OutputFile>
<ProgramDatabaseFile>.\..\..\lib64uwp\icuind.pdb</ProgramDatabaseFile>
<ImportLibrary>..\..\lib64uwp\icuind.lib</ImportLibrary>
<AdditionalDependencies>..\..\lib64uwp\icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
@@ -245,7 +258,7 @@
<ProgramDataBaseFileName>.\ARM\ReleaseUWP/</ProgramDataBaseFileName>
</ClCompile>
<Link>
- <OutputFile>..\..\binARMuwp\icuin63.dll</OutputFile>
+ <OutputFile>..\..\binARMuwp\icuin65.dll</OutputFile>
<ProgramDatabaseFile>.\..\..\libARMuwp\icuin.pdb</ProgramDatabaseFile>
<ImportLibrary>..\..\libARMuwp\icuin.lib</ImportLibrary>
<AdditionalDependencies>..\..\libARMuwp\icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
@@ -262,12 +275,46 @@
<ProgramDataBaseFileName>.\ARM\DebugUWP/</ProgramDataBaseFileName>
</ClCompile>
<Link>
- <OutputFile>..\..\binARMuwp\icuin63d.dll</OutputFile>
+ <OutputFile>..\..\binARMuwp\icuin65d.dll</OutputFile>
<ProgramDatabaseFile>.\..\..\libARMuwp\icuind.pdb</ProgramDatabaseFile>
<ImportLibrary>..\..\libARMuwp\icuind.lib</ImportLibrary>
<AdditionalDependencies>..\..\libARMuwp\icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <Midl>
+ <TypeLibraryName>.\..\..\libARM64uwp\icuin.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <PrecompiledHeaderOutputFile>.\ARM64\ReleaseUWP/i18n.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>.\ARM64\ReleaseUWP/</AssemblerListingLocation>
+ <ObjectFileName>.\ARM64\ReleaseUWP/</ObjectFileName>
+ <ProgramDataBaseFileName>.\ARM64\ReleaseUWP/</ProgramDataBaseFileName>
+ </ClCompile>
+ <Link>
+ <OutputFile>..\..\binARM64uwp\icuin65.dll</OutputFile>
+ <ProgramDatabaseFile>.\..\..\libARM64uwp\icuin.pdb</ProgramDatabaseFile>
+ <ImportLibrary>..\..\libARM64uwp\icuin.lib</ImportLibrary>
+ <AdditionalDependencies>..\..\libARM64uwp\icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <Midl>
+ <TypeLibraryName>.\..\..\libARM64uwp\icuind.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <PrecompiledHeaderOutputFile>.\ARM64\DebugUWP/i18n.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>.\ARM64\DebugUWP/</AssemblerListingLocation>
+ <ObjectFileName>.\ARM64\DebugUWP/</ObjectFileName>
+ <ProgramDataBaseFileName>.\ARM64\DebugUWP/</ProgramDataBaseFileName>
+ </ClCompile>
+ <Link>
+ <OutputFile>..\..\binARM64uwp\icuin65d.dll</OutputFile>
+ <ProgramDatabaseFile>.\..\..\libARM64uwp\icuind.pdb</ProgramDatabaseFile>
+ <ImportLibrary>..\..\libARM64uwp\icuind.lib</ImportLibrary>
+ <AdditionalDependencies>..\..\libARM64uwp\icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="erarules.cpp" />
<ClCompile Include="region.cpp" />
@@ -332,10 +379,10 @@
<ClCompile Include="double-conversion-bignum-dtoa.cpp" />
<ClCompile Include="double-conversion-bignum.cpp" />
<ClCompile Include="double-conversion-cached-powers.cpp" />
- <ClCompile Include="double-conversion-diy-fp.cpp" />
+ <ClCompile Include="double-conversion-double-to-string.cpp" />
<ClCompile Include="double-conversion-fast-dtoa.cpp" />
+ <ClCompile Include="double-conversion-string-to-double.cpp" />
<ClCompile Include="double-conversion-strtod.cpp" />
- <ClCompile Include="double-conversion.cpp" />
<ClCompile Include="dtfmtsym.cpp" />
<ClCompile Include="dtitvfmt.cpp" />
<ClCompile Include="dtitvinf.cpp" />
@@ -345,6 +392,9 @@
<ClCompile Include="fmtable.cpp" />
<ClCompile Include="fmtable_cnv.cpp" />
<ClCompile Include="format.cpp" />
+ <ClCompile Include="formattedval_iterimpl.cpp" />
+ <ClCompile Include="formattedval_sbimpl.cpp" />
+ <ClCompile Include="formattedvalue.cpp" />
<ClCompile Include="fphdlimp.cpp" />
<ClCompile Include="fpositer.cpp" />
<ClCompile Include="gender.cpp" />
@@ -376,19 +426,20 @@
<ClCompile Include="number_longnames.cpp" />
<ClCompile Include="number_modifiers.cpp" />
<ClCompile Include="number_notation.cpp" />
+ <ClCompile Include="number_output.cpp" />
<ClCompile Include="number_padding.cpp" />
<ClCompile Include="number_patternmodifier.cpp" />
<ClCompile Include="number_patternstring.cpp" />
<ClCompile Include="number_rounding.cpp" />
<ClCompile Include="number_scientific.cpp" />
- <ClCompile Include="number_stringbuilder.cpp" />
+ <ClCompile Include="formatted_string_builder.cpp" />
<ClCompile Include="number_utils.cpp" />
<ClCompile Include="number_mapper.cpp" />
<ClCompile Include="number_multiplier.cpp" />
<ClCompile Include="number_currencysymbols.cpp" />
<ClCompile Include="number_skeletons.cpp" />
<ClCompile Include="number_capi.cpp" />
- <ClCompile Include="numparse_stringsegment.cpp" />
+ <ClCompile Include="string_segment.cpp" />
<ClCompile Include="numparse_parsednumber.cpp" />
<ClCompile Include="numparse_impl.cpp" />
<ClCompile Include="numparse_symbols.cpp" />
@@ -543,8 +594,11 @@
<ClInclude Include="double-conversion-bignum.h" />
<ClInclude Include="double-conversion-cached-powers.h" />
<ClInclude Include="double-conversion-diy-fp.h" />
+ <ClInclude Include="double-conversion-double-to-string.h" />
<ClInclude Include="double-conversion-fast-dtoa.h" />
<ClInclude Include="double-conversion-ieee.h" />
+ <ClInclude Include="double-conversion-string-to-double.h" />
+ <ClInclude Include="double-conversion-strtod.h" />
<ClInclude Include="double-conversion-utils.h" />
<ClInclude Include="double-conversion.h" />
<ClInclude Include="dt_impl.h" />
@@ -642,7 +696,7 @@
<ClInclude Include="number_patternstring.h" />
<ClInclude Include="number_roundingutils.h" />
<ClInclude Include="number_scientific.h" />
- <ClInclude Include="number_stringbuilder.h" />
+ <ClInclude Include="formatted_string_builder.h" />
<ClInclude Include="number_types.h" />
<ClInclude Include="number_utypes.h" />
<ClInclude Include="number_utils.h" />
@@ -650,7 +704,7 @@
<ClInclude Include="number_multiplier.h" />
<ClInclude Include="number_currencysymbols.h" />
<ClInclude Include="number_skeletons.h" />
- <ClInclude Include="numparse_stringsegment.h" />
+ <ClInclude Include="string_segment.h" />
<ClInclude Include="numparse_impl.h" />
<ClInclude Include="numparse_symbols.h" />
<ClInclude Include="numparse_decimal.h" />
@@ -662,11 +716,15 @@
<ClInclude Include="numparse_types.h" />
<ClInclude Include="numparse_utils.h" />
<ClInclude Include="numrange_impl.h" />
+ <ClInclude Include="formattedval_impl.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="i18n.rc" />
</ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <Target Name="Build" Condition="'$(SkipUWP)'=='true'">
+ <Message Text="Skipping building the UWP project: $(MSBuildThisFile)" Importance="high" />
+ </Target>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" Condition="'$(SkipUWP)'!='true'" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project> \ No newline at end of file
diff --git a/Build/source/libs/icu/icu-src/source/i18n/indiancal.cpp b/Build/source/libs/icu/icu-src/source/i18n/indiancal.cpp
index ae1098f0558..f1ab853b948 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/indiancal.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/indiancal.cpp
@@ -35,7 +35,7 @@ U_NAMESPACE_BEGIN
//-------------------------------------------------------------------------
-Calendar* IndianCalendar::clone() const {
+IndianCalendar* IndianCalendar::clone() const {
return new IndianCalendar(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/indiancal.h b/Build/source/libs/icu/icu-src/source/i18n/indiancal.h
index e36d4eb5c0e..e259d9bc174 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/indiancal.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/indiancal.h
@@ -186,7 +186,7 @@ public:
// TODO: copy c'tor, etc
// clone
- virtual Calendar* clone() const;
+ virtual IndianCalendar* clone() const;
private:
/**
diff --git a/Build/source/libs/icu/icu-src/source/i18n/islamcal.cpp b/Build/source/libs/icu/icu-src/source/i18n/islamcal.cpp
index b84bedfa091..582b3365a64 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/islamcal.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/islamcal.cpp
@@ -54,7 +54,6 @@ static void debug_islamcal_msg(const char *pat, ...)
// --- The cache --
// cache of months
-static UMutex astroLock = U_MUTEX_INITIALIZER; // pod bay door lock
static icu::CalendarCache *gMonthCache = NULL;
static icu::CalendarAstronomer *gIslamicCalendarAstro = NULL;
@@ -223,14 +222,12 @@ const char *IslamicCalendar::getType() const {
sType = "islamic-umalqura";
break;
default:
- U_ASSERT(false); // out of range
- sType = "islamic"; // "islamic" is used as the generic type
- break;
+ UPRV_UNREACHABLE; // out of range
}
return sType;
}
-Calendar* IslamicCalendar::clone() const {
+IslamicCalendar* IslamicCalendar::clone() const {
return new IslamicCalendar(*this);
}
@@ -473,6 +470,7 @@ double IslamicCalendar::moonAge(UDate time, UErrorCode &status)
{
double age = 0;
+ static UMutex astroLock; // pod bay door lock
umtx_lock(&astroLock);
if(gIslamicCalendarAstro == NULL) {
gIslamicCalendarAstro = new CalendarAstronomer();
@@ -675,8 +673,7 @@ void IslamicCalendar::handleComputeFields(int32_t julianDay, UErrorCode &status)
month = m;
}
} else { // invalid 'civil'
- U_ASSERT(false); // should not get here, out of range
- year=month=0;
+ UPRV_UNREACHABLE; // should not get here, out of range
}
dayOfMonth = (days - monthStart(year, month)) + 1;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/islamcal.h b/Build/source/libs/icu/icu-src/source/i18n/islamcal.h
index 062733e41a5..fde58478c0a 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/islamcal.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/islamcal.h
@@ -230,7 +230,7 @@ class U_I18N_API IslamicCalendar : public Calendar {
// TODO: copy c'tor, etc
// clone
- virtual Calendar* clone() const;
+ virtual IslamicCalendar* clone() const;
private:
/**
diff --git a/Build/source/libs/icu/icu-src/source/i18n/japancal.cpp b/Build/source/libs/icu/icu-src/source/i18n/japancal.cpp
index 5159be337c2..75a248f406f 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/japancal.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/japancal.cpp
@@ -18,6 +18,16 @@
#if !UCONFIG_NO_FORMATTING
#if U_PLATFORM_HAS_WINUWP_API == 0
#include <stdlib.h> // getenv() is not available in UWP env
+#else
+#ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
+#endif
+# define VC_EXTRALEAN
+# define NOUSER
+# define NOSERVICE
+# define NOIME
+# define NOMCX
+#include <windows.h>
#endif
#include "cmemory.h"
#include "erarules.h"
@@ -51,8 +61,9 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(JapaneseCalendar)
static const int32_t kGregorianEpoch = 1970; // used as the default value of EXTENDED_YEAR
static const char* TENTATIVE_ERA_VAR_NAME = "ICU_ENABLE_TENTATIVE_ERA";
-// Initialize global Japanese era data
-static void U_CALLCONV initializeEras(UErrorCode &status) {
+
+// Export the following for use by test code.
+UBool JapaneseCalendar::enableTentativeEra() {
// Although start date of next Japanese era is planned ahead, a name of
// new era might not be available. This implementation allows tester to
// check a new era without era names by settings below (in priority order).
@@ -77,7 +88,13 @@ static void U_CALLCONV initializeEras(UErrorCode &status) {
includeTentativeEra = TRUE;
}
#endif
- gJapaneseEraRules = EraRules::createInstance("japanese", includeTentativeEra, status);
+ return includeTentativeEra;
+}
+
+
+// Initialize global Japanese era data
+static void U_CALLCONV initializeEras(UErrorCode &status) {
+ gJapaneseEraRules = EraRules::createInstance("japanese", JapaneseCalendar::enableTentativeEra(), status);
if (U_FAILURE(status)) {
return;
}
@@ -119,7 +136,7 @@ JapaneseCalendar& JapaneseCalendar::operator= ( const JapaneseCalendar& right)
return *this;
}
-Calendar* JapaneseCalendar::clone(void) const
+JapaneseCalendar* JapaneseCalendar::clone() const
{
return new JapaneseCalendar(*this);
}
@@ -233,7 +250,7 @@ int32_t JapaneseCalendar::handleGetLimit(UCalendarDateFields field, ELimitType l
if (limitType == UCAL_LIMIT_MINIMUM || limitType == UCAL_LIMIT_GREATEST_MINIMUM) {
return 0;
}
- return gCurrentEra;
+ return gJapaneseEraRules->getNumberOfEras() - 1; // max known era, not gCurrentEra
case UCAL_YEAR:
{
switch (limitType) {
@@ -265,7 +282,7 @@ int32_t JapaneseCalendar::getActualMaximum(UCalendarDateFields field, UErrorCode
if (U_FAILURE(status)) {
return 0; // error case... any value
}
- if (era == gCurrentEra) {
+ if (era == gJapaneseEraRules->getNumberOfEras() - 1) { // max known era, not gCurrentEra
// TODO: Investigate what value should be used here - revisit after 4.0.
return handleGetLimit(UCAL_YEAR, UCAL_LIMIT_MAXIMUM);
} else {
diff --git a/Build/source/libs/icu/icu-src/source/i18n/japancal.h b/Build/source/libs/icu/icu-src/source/i18n/japancal.h
index 7a6d13228b1..03e6361c9f9 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/japancal.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/japancal.h
@@ -67,7 +67,14 @@ class JapaneseCalendar : public GregorianCalendar {
public:
/**
- * Useful constants for JapaneseCalendar.
+ * Check environment variable.
+ * @internal
+ */
+ U_I18N_API static UBool U_EXPORT2 enableTentativeEra(void);
+
+ /**
+ * Useful constants for JapaneseCalendar.
+ * Exported for use by test code.
* @internal
*/
U_I18N_API static uint32_t U_EXPORT2 getCurrentEra(void); // the current era
@@ -109,7 +116,7 @@ public:
* @return return a polymorphic copy of this calendar.
* @internal
*/
- virtual Calendar* clone(void) const;
+ virtual JapaneseCalendar* clone() const;
/**
* Return the extended year defined by the current fields. In the
diff --git a/Build/source/libs/icu/icu-src/source/i18n/listformatter.cpp b/Build/source/libs/icu/icu-src/source/i18n/listformatter.cpp
index 3b49c05302f..2ee5e123749 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/listformatter.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/listformatter.cpp
@@ -31,6 +31,7 @@
#include "ucln_in.h"
#include "uresimp.h"
#include "resource.h"
+#include "formattedval_impl.h"
U_NAMESPACE_BEGIN
@@ -65,9 +66,20 @@ ListFormatInternal(const ListFormatInternal &other) :
};
+#if !UCONFIG_NO_FORMATTING
+class FormattedListData : public FormattedValueFieldPositionIteratorImpl {
+public:
+ FormattedListData(UErrorCode& status) : FormattedValueFieldPositionIteratorImpl(5, status) {}
+ virtual ~FormattedListData();
+};
+
+FormattedListData::~FormattedListData() = default;
+
+UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(FormattedList)
+#endif
+
static Hashtable* listPatternHash = nullptr;
-static UMutex listFormatterMutex = U_MUTEX_INITIALIZER;
static const char STANDARD_STYLE[] = "standard";
U_CDECL_BEGIN
@@ -132,6 +144,7 @@ const ListFormatInternal* ListFormatter::getListFormatInternal(
keyBuffer.append(':', errorCode).append(style, errorCode);
UnicodeString key(keyBuffer.data(), -1, US_INV);
ListFormatInternal* result = nullptr;
+ static UMutex listFormatterMutex;
{
Mutex m(&listFormatterMutex);
if (listPatternHash == nullptr) {
@@ -377,7 +390,7 @@ UnicodeString& ListFormatter::format(
int32_t offset;
FieldPositionIteratorHandler handler(posIter, errorCode);
return format_(items, nItems, appendTo, -1, offset, &handler, errorCode);
-};
+}
#endif
UnicodeString& ListFormatter::format(
@@ -390,6 +403,44 @@ UnicodeString& ListFormatter::format(
return format_(items, nItems, appendTo, index, offset, nullptr, errorCode);
}
+#if !UCONFIG_NO_FORMATTING
+FormattedList ListFormatter::formatStringsToValue(
+ const UnicodeString items[],
+ int32_t nItems,
+ UErrorCode& errorCode) const {
+ LocalPointer<FormattedListData> result(new FormattedListData(errorCode), errorCode);
+ if (U_FAILURE(errorCode)) {
+ return FormattedList(errorCode);
+ }
+ UnicodeString string;
+ int32_t offset;
+ auto handler = result->getHandler(errorCode);
+ handler.setCategory(UFIELD_CATEGORY_LIST);
+ format_(items, nItems, string, -1, offset, &handler, errorCode);
+ handler.getError(errorCode);
+ result->appendString(string, errorCode);
+ if (U_FAILURE(errorCode)) {
+ return FormattedList(errorCode);
+ }
+
+ // Add span fields and sort
+ ConstrainedFieldPosition cfpos;
+ cfpos.constrainField(UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD);
+ int32_t i = 0;
+ handler.setCategory(UFIELD_CATEGORY_LIST_SPAN);
+ while (result->nextPosition(cfpos, errorCode)) {
+ handler.addAttribute(i++, cfpos.getStart(), cfpos.getLimit());
+ }
+ handler.getError(errorCode);
+ if (U_FAILURE(errorCode)) {
+ return FormattedList(errorCode);
+ }
+ result->sort();
+
+ return FormattedList(result.orphan());
+}
+#endif
+
UnicodeString& ListFormatter::format_(
const UnicodeString items[],
int32_t nItems,
@@ -427,8 +478,8 @@ UnicodeString& ListFormatter::format_(
if (index == 0) {
offset = 0;
}
- int32_t offsetFirst;
- int32_t offsetSecond;
+ int32_t offsetFirst = 0;
+ int32_t offsetSecond = 0;
int32_t prefixLength = 0;
// for n items, there are 2 * (n + 1) boundary including 0 and the upper
// edge.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/measfmt.cpp b/Build/source/libs/icu/icu-src/source/i18n/measfmt.cpp
index 9830dc889e1..1949f17b137 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/measfmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/measfmt.cpp
@@ -36,6 +36,8 @@
#include "unicode/putil.h"
#include "unicode/smpdtfmt.h"
#include "uassert.h"
+#include "unicode/numberformatter.h"
+#include "number_longnames.h"
#include "sharednumberformat.h"
#include "sharedpluralrules.h"
@@ -45,9 +47,6 @@
U_NAMESPACE_BEGIN
-static constexpr int32_t PER_UNIT_INDEX = StandardPlural::COUNT;
-static constexpr int32_t PATTERN_COUNT = PER_UNIT_INDEX + 1;
-static constexpr int32_t MEAS_UNIT_COUNT = 142; // see assertion in MeasureFormatCacheData constructor
static constexpr int32_t WIDTH_INDEX_COUNT = UMEASFMT_WIDTH_NARROW + 1;
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(MeasureFormat)
@@ -56,28 +55,23 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(MeasureFormat)
class NumericDateFormatters : public UMemory {
public:
// Formats like H:mm
- SimpleDateFormat hourMinute;
+ UnicodeString hourMinute;
// formats like M:ss
- SimpleDateFormat minuteSecond;
+ UnicodeString minuteSecond;
// formats like H:mm:ss
- SimpleDateFormat hourMinuteSecond;
+ UnicodeString hourMinuteSecond;
// Constructor that takes the actual patterns for hour-minute,
// minute-second, and hour-minute-second respectively.
NumericDateFormatters(
const UnicodeString &hm,
const UnicodeString &ms,
- const UnicodeString &hms,
- UErrorCode &status) :
- hourMinute(hm, status),
- minuteSecond(ms, status),
- hourMinuteSecond(hms, status) {
- const TimeZone *gmt = TimeZone::getGMT();
- hourMinute.setTimeZone(*gmt);
- minuteSecond.setTimeZone(*gmt);
- hourMinuteSecond.setTimeZone(*gmt);
+ const UnicodeString &hms) :
+ hourMinute(hm),
+ minuteSecond(ms),
+ hourMinuteSecond(hms) {
}
private:
NumericDateFormatters(const NumericDateFormatters &other);
@@ -91,6 +85,19 @@ static UMeasureFormatWidth getRegularWidth(UMeasureFormatWidth width) {
return width;
}
+static UNumberUnitWidth getUnitWidth(UMeasureFormatWidth width) {
+ switch (width) {
+ case UMEASFMT_WIDTH_WIDE:
+ return UNUM_UNIT_WIDTH_FULL_NAME;
+ case UMEASFMT_WIDTH_NARROW:
+ case UMEASFMT_WIDTH_NUMERIC:
+ return UNUM_UNIT_WIDTH_NARROW;
+ case UMEASFMT_WIDTH_SHORT:
+ default:
+ return UNUM_UNIT_WIDTH_SHORT;
+ }
+}
+
/**
* Instances contain all MeasureFormat specific data for a particular locale.
* This data is cached. It is never copied, but is shared via shared pointers.
@@ -110,20 +117,10 @@ public:
* - UMEASFMT_WIDTH_WIDE/SHORT/NARROW: sideways alias for missing data
*/
UMeasureFormatWidth widthFallback[WIDTH_INDEX_COUNT];
- /** Measure unit -> format width -> array of patterns ("{0} meters") (plurals + PER_UNIT_INDEX) */
- SimpleFormatter* patterns[MEAS_UNIT_COUNT][WIDTH_INDEX_COUNT][PATTERN_COUNT];
- const UChar* dnams[MEAS_UNIT_COUNT][WIDTH_INDEX_COUNT];
- SimpleFormatter perFormatters[WIDTH_INDEX_COUNT];
MeasureFormatCacheData();
virtual ~MeasureFormatCacheData();
- UBool hasPerFormatter(int32_t width) const {
- // TODO: Create a more obvious way to test if the per-formatter has been set?
- // Use pointers, check for NULL? Or add an isValid() method?
- return perFormatters[width].getArgumentLimit() == 2;
- }
-
void adoptCurrencyFormat(int32_t widthIndex, NumberFormat *nfToAdopt) {
delete currencyFormats[widthIndex];
currencyFormats[widthIndex] = nfToAdopt;
@@ -157,14 +154,9 @@ private:
MeasureFormatCacheData::MeasureFormatCacheData()
: integerFormat(nullptr), numericDateFormatters(nullptr) {
- // Please update MEAS_UNIT_COUNT if it gets out of sync with the true count!
- U_ASSERT(MEAS_UNIT_COUNT == MeasureUnit::getIndexCount());
-
for (int32_t i = 0; i < WIDTH_INDEX_COUNT; ++i) {
widthFallback[i] = UMEASFMT_WIDTH_COUNT;
}
- memset(&patterns[0][0][0], 0, sizeof(patterns));
- memset(&dnams[0][0], 0, sizeof(dnams));
memset(currencyFormats, 0, sizeof(currencyFormats));
}
@@ -172,13 +164,6 @@ MeasureFormatCacheData::~MeasureFormatCacheData() {
for (int32_t i = 0; i < UPRV_LENGTHOF(currencyFormats); ++i) {
delete currencyFormats[i];
}
- for (int32_t i = 0; i < MEAS_UNIT_COUNT; ++i) {
- for (int32_t j = 0; j < WIDTH_INDEX_COUNT; ++j) {
- for (int32_t k = 0; k < PATTERN_COUNT; ++k) {
- delete patterns[i][j][k];
- }
- }
- }
// Note: the contents of 'dnams' are pointers into the resource bundle
delete integerFormat;
delete numericDateFormatters;
@@ -201,250 +186,6 @@ static UBool getString(
return TRUE;
}
-namespace {
-
-static const UChar g_LOCALE_units[] = {
- 0x2F, 0x4C, 0x4F, 0x43, 0x41, 0x4C, 0x45, 0x2F,
- 0x75, 0x6E, 0x69, 0x74, 0x73
-};
-static const UChar gShort[] = { 0x53, 0x68, 0x6F, 0x72, 0x74 };
-static const UChar gNarrow[] = { 0x4E, 0x61, 0x72, 0x72, 0x6F, 0x77 };
-
-/**
- * Sink for enumerating all of the measurement unit display names.
- * Contains inner sink classes, each one corresponding to a type of resource table.
- * The outer sink handles the top-level units, unitsNarrow, and unitsShort tables.
- *
- * More specific bundles (en_GB) are enumerated before their parents (en_001, en, root):
- * Only store a value if it is still missing, that is, it has not been overridden.
- *
- * C++: Each inner sink class has a reference to the main outer sink.
- * Java: Use non-static inner classes instead.
- */
-struct UnitDataSink : public ResourceSink {
-
- // Output data.
- MeasureFormatCacheData &cacheData;
-
- // Path to current data.
- UMeasureFormatWidth width;
- const char *type;
- int32_t unitIndex;
-
- UnitDataSink(MeasureFormatCacheData &outputData)
- : cacheData(outputData),
- width(UMEASFMT_WIDTH_COUNT), type(NULL), unitIndex(0) {}
- ~UnitDataSink();
-
- void setFormatterIfAbsent(int32_t index, const ResourceValue &value,
- int32_t minPlaceholders, UErrorCode &errorCode) {
- U_ASSERT(unitIndex < MEAS_UNIT_COUNT);
- U_ASSERT(width < WIDTH_INDEX_COUNT);
- U_ASSERT(index < PATTERN_COUNT);
- SimpleFormatter **patterns = &cacheData.patterns[unitIndex][width][0];
- if (U_SUCCESS(errorCode) && patterns[index] == NULL) {
- if (minPlaceholders >= 0) {
- patterns[index] = new SimpleFormatter(
- value.getUnicodeString(errorCode), minPlaceholders, 1, errorCode);
- }
- if (U_SUCCESS(errorCode) && patterns[index] == NULL) {
- errorCode = U_MEMORY_ALLOCATION_ERROR;
- }
- }
- }
-
- void setDnamIfAbsent(const ResourceValue &value, UErrorCode& errorCode) {
- U_ASSERT(unitIndex < MEAS_UNIT_COUNT);
- U_ASSERT(width < WIDTH_INDEX_COUNT);
- if (cacheData.dnams[unitIndex][width] == NULL) {
- int32_t length;
- cacheData.dnams[unitIndex][width] = value.getString(length, errorCode);
- }
- }
-
- /**
- * Consume a display pattern. For example,
- * unitsShort/duration/hour contains other{"{0} hrs"}.
- */
- void consumePattern(const char *key, const ResourceValue &value, UErrorCode &errorCode) {
- if (U_FAILURE(errorCode)) { return; }
- if (uprv_strcmp(key, "dnam") == 0) {
- // The display name for the unit in the current width.
- setDnamIfAbsent(value, errorCode);
- } else if (uprv_strcmp(key, "per") == 0) {
- // For example, "{0}/h".
- setFormatterIfAbsent(PER_UNIT_INDEX, value, 1, errorCode);
- } else {
- // The key must be one of the plural form strings. For example:
- // one{"{0} hr"}
- // other{"{0} hrs"}
- setFormatterIfAbsent(StandardPlural::indexFromString(key, errorCode), value, 0,
- errorCode);
- }
- }
-
- /**
- * Consume a table of per-unit tables. For example,
- * unitsShort/duration contains tables for duration-unit subtypes day & hour.
- */
- void consumeSubtypeTable(const char *key, ResourceValue &value, UErrorCode &errorCode) {
- if (U_FAILURE(errorCode)) { return; }
- unitIndex = MeasureUnit::internalGetIndexForTypeAndSubtype(type, key);
- if (unitIndex < 0) {
- // TODO: How to handle unexpected data?
- // See http://bugs.icu-project.org/trac/ticket/12597
- return;
- }
-
- // We no longer handle units like "coordinate" here (which do not have plural variants)
- if (value.getType() == URES_TABLE) {
- // Units that have plural variants
- ResourceTable patternTableTable = value.getTable(errorCode);
- if (U_FAILURE(errorCode)) { return; }
- for (int i = 0; patternTableTable.getKeyAndValue(i, key, value); ++i) {
- consumePattern(key, value, errorCode);
- }
- } else {
- // TODO: How to handle unexpected data?
- // See http://bugs.icu-project.org/trac/ticket/12597
- return;
- }
- }
-
- /**
- * Consume compound x-per-y display pattern. For example,
- * unitsShort/compound/per may be "{0}/{1}".
- */
- void consumeCompoundPattern(const char *key, const ResourceValue &value, UErrorCode &errorCode) {
- if (U_SUCCESS(errorCode) && uprv_strcmp(key, "per") == 0) {
- cacheData.perFormatters[width].
- applyPatternMinMaxArguments(value.getUnicodeString(errorCode), 2, 2, errorCode);
- }
- }
-
- /**
- * Consume a table of unit type tables. For example,
- * unitsShort contains tables for area & duration.
- * It also contains a table for the compound/per pattern.
- */
- void consumeUnitTypesTable(const char *key, ResourceValue &value, UErrorCode &errorCode) {
- if (U_FAILURE(errorCode)) { return; }
- if (uprv_strcmp(key, "currency") == 0) {
- // Skip.
- } else if (uprv_strcmp(key, "compound") == 0) {
- if (!cacheData.hasPerFormatter(width)) {
- ResourceTable compoundTable = value.getTable(errorCode);
- if (U_FAILURE(errorCode)) { return; }
- for (int i = 0; compoundTable.getKeyAndValue(i, key, value); ++i) {
- consumeCompoundPattern(key, value, errorCode);
- }
- }
- } else if (uprv_strcmp(key, "coordinate") == 0) {
- // special handling but we need to determine what that is
- } else {
- type = key;
- ResourceTable subtypeTable = value.getTable(errorCode);
- if (U_FAILURE(errorCode)) { return; }
- for (int i = 0; subtypeTable.getKeyAndValue(i, key, value); ++i) {
- consumeSubtypeTable(key, value, errorCode);
- }
- }
- }
-
- void consumeAlias(const char *key, const ResourceValue &value, UErrorCode &errorCode) {
- // Handle aliases like
- // units:alias{"/LOCALE/unitsShort"}
- // which should only occur in the root bundle.
- UMeasureFormatWidth sourceWidth = widthFromKey(key);
- if (sourceWidth == UMEASFMT_WIDTH_COUNT) {
- // Alias from something we don't care about.
- return;
- }
- UMeasureFormatWidth targetWidth = widthFromAlias(value, errorCode);
- if (targetWidth == UMEASFMT_WIDTH_COUNT) {
- // We do not recognize what to fall back to.
- errorCode = U_INVALID_FORMAT_ERROR;
- return;
- }
- // Check that we do not fall back to another fallback.
- if (cacheData.widthFallback[targetWidth] != UMEASFMT_WIDTH_COUNT) {
- errorCode = U_INVALID_FORMAT_ERROR;
- return;
- }
- cacheData.widthFallback[sourceWidth] = targetWidth;
- }
-
- void consumeTable(const char *key, ResourceValue &value, UErrorCode &errorCode) {
- if (U_SUCCESS(errorCode) && (width = widthFromKey(key)) != UMEASFMT_WIDTH_COUNT) {
- ResourceTable unitTypesTable = value.getTable(errorCode);
- if (U_FAILURE(errorCode)) { return; }
- for (int i = 0; unitTypesTable.getKeyAndValue(i, key, value); ++i) {
- consumeUnitTypesTable(key, value, errorCode);
- }
- }
- }
-
- static UMeasureFormatWidth widthFromKey(const char *key) {
- if (uprv_strncmp(key, "units", 5) == 0) {
- key += 5;
- if (*key == 0) {
- return UMEASFMT_WIDTH_WIDE;
- } else if (uprv_strcmp(key, "Short") == 0) {
- return UMEASFMT_WIDTH_SHORT;
- } else if (uprv_strcmp(key, "Narrow") == 0) {
- return UMEASFMT_WIDTH_NARROW;
- }
- }
- return UMEASFMT_WIDTH_COUNT;
- }
-
- static UMeasureFormatWidth widthFromAlias(const ResourceValue &value, UErrorCode &errorCode) {
- int32_t length;
- const UChar *s = value.getAliasString(length, errorCode);
- // For example: "/LOCALE/unitsShort"
- if (U_SUCCESS(errorCode) && length >= 13 && u_memcmp(s, g_LOCALE_units, 13) == 0) {
- s += 13;
- length -= 13;
- if (*s == 0) {
- return UMEASFMT_WIDTH_WIDE;
- } else if (u_strCompare(s, length, gShort, 5, FALSE) == 0) {
- return UMEASFMT_WIDTH_SHORT;
- } else if (u_strCompare(s, length, gNarrow, 6, FALSE) == 0) {
- return UMEASFMT_WIDTH_NARROW;
- }
- }
- return UMEASFMT_WIDTH_COUNT;
- }
-
- virtual void put(const char *key, ResourceValue &value, UBool /*noFallback*/,
- UErrorCode &errorCode) {
- // Main entry point to sink
- ResourceTable widthsTable = value.getTable(errorCode);
- if (U_FAILURE(errorCode)) { return; }
- for (int i = 0; widthsTable.getKeyAndValue(i, key, value); ++i) {
- if (value.getType() == URES_ALIAS) {
- consumeAlias(key, value, errorCode);
- } else {
- consumeTable(key, value, errorCode);
- }
- }
- }
-};
-
-// Virtual destructors must be defined out of line.
-UnitDataSink::~UnitDataSink() {}
-
-} // namespace
-
-static UBool loadMeasureUnitData(
- const UResourceBundle *resource,
- MeasureFormatCacheData &cacheData,
- UErrorCode &status) {
- UnitDataSink sink(cacheData);
- ures_getAllItemsWithFallback(resource, "", sink, status);
- return U_SUCCESS(status);
-}
-
static UnicodeString loadNumericDateFormatterPattern(
const UResourceBundle *resource,
const char *pattern,
@@ -487,8 +228,7 @@ static NumericDateFormatters *loadNumericDateFormatters(
NumericDateFormatters *result = new NumericDateFormatters(
loadNumericDateFormatterPattern(resource, "hm", status),
loadNumericDateFormatterPattern(resource, "ms", status),
- loadNumericDateFormatterPattern(resource, "hms", status),
- status);
+ loadNumericDateFormatterPattern(resource, "hms", status));
if (U_FAILURE(status)) {
delete result;
return NULL;
@@ -507,12 +247,6 @@ const MeasureFormatCacheData *LocaleCacheKey<MeasureFormatCacheData>::createObje
if (U_FAILURE(status)) {
return NULL;
}
- if (!loadMeasureUnitData(
- unitsBundle.getAlias(),
- *result,
- status)) {
- return NULL;
- }
result->adoptNumericDateFormatters(loadNumericDateFormatters(
unitsBundle.getAlias(), status));
if (U_FAILURE(status)) {
@@ -726,7 +460,7 @@ UBool MeasureFormat::operator==(const Format &other) const {
**numberFormat == **rhs.numberFormat);
}
-Format *MeasureFormat::clone() const {
+MeasureFormat *MeasureFormat::clone() const {
return new MeasureFormat(*this);
}
@@ -764,29 +498,21 @@ UnicodeString &MeasureFormat::formatMeasurePerUnit(
if (U_FAILURE(status)) {
return appendTo;
}
- bool isResolved = false;
- MeasureUnit resolvedUnit =
- MeasureUnit::resolveUnitPerUnit(measure.getUnit(), perUnit, &isResolved);
- if (isResolved) {
- Measure newMeasure(measure.getNumber(), new MeasureUnit(resolvedUnit), status);
- return formatMeasure(
- newMeasure, **numberFormat, appendTo, pos, status);
- }
- FieldPosition fpos(pos.getField());
- UnicodeString result;
- int32_t offset = withPerUnitAndAppend(
- formatMeasure(
- measure, **numberFormat, result, fpos, status),
- perUnit,
- appendTo,
- status);
- if (U_FAILURE(status)) {
+ auto* df = dynamic_cast<const DecimalFormat*>(&getNumberFormatInternal());
+ if (df == nullptr) {
+ // Don't know how to handle other types of NumberFormat
+ status = U_UNSUPPORTED_ERROR;
return appendTo;
}
- if (fpos.getBeginIndex() != 0 || fpos.getEndIndex() != 0) {
- pos.setBeginIndex(fpos.getBeginIndex() + offset);
- pos.setEndIndex(fpos.getEndIndex() + offset);
+ number::FormattedNumber result;
+ if (auto* lnf = df->toNumberFormatter(status)) {
+ result = lnf->unit(measure.getUnit())
+ .perUnit(perUnit)
+ .unitWidth(getUnitWidth(fWidth))
+ .formatDouble(measure.getNumber().getDouble(status), status);
}
+ DecimalFormat::fieldPositionHelper(result, pos, appendTo.length(), status);
+ appendTo.append(result.toTempString(status));
return appendTo;
}
@@ -838,22 +564,12 @@ UnicodeString &MeasureFormat::formatMeasures(
return appendTo;
}
-UnicodeString MeasureFormat::getUnitDisplayName(const MeasureUnit& unit, UErrorCode& /*status*/) const {
- UMeasureFormatWidth width = getRegularWidth(fWidth);
- const UChar* const* styleToDnam = cache->dnams[unit.getIndex()];
- const UChar* dnam = styleToDnam[width];
- if (dnam == NULL) {
- int32_t fallbackWidth = cache->widthFallback[width];
- dnam = styleToDnam[fallbackWidth];
- }
-
- UnicodeString result;
- if (dnam == NULL) {
- result.setToBogus();
- } else {
- result.setTo(dnam, -1);
- }
- return result;
+UnicodeString MeasureFormat::getUnitDisplayName(const MeasureUnit& unit, UErrorCode& status) const {
+ return number::impl::LongNameHandler::getUnitDisplayName(
+ getLocale(status),
+ unit,
+ getUnitWidth(fWidth),
+ status);
}
void MeasureFormat::initMeasureFormat(
@@ -882,6 +598,7 @@ void MeasureFormat::initMeasureFormat(
SharedObject::copyPtr(pr, pluralRules);
pr->removeRef();
if (nf.isNull()) {
+ // TODO: Clean this up
const SharedNumberFormat *shared = NumberFormat::createSharedInstance(
locale, UNUM_DECIMAL, status);
if (U_FAILURE(status)) {
@@ -926,10 +643,14 @@ UBool MeasureFormat::setMeasureFormatLocale(const Locale &locale, UErrorCode &st
return U_SUCCESS(status);
}
-const NumberFormat &MeasureFormat::getNumberFormat() const {
+const NumberFormat &MeasureFormat::getNumberFormatInternal() const {
return **numberFormat;
}
+const NumberFormat &MeasureFormat::getCurrencyFormatInternal() const {
+ return *cache->getCurrencyFormat(UMEASFMT_WIDTH_NARROW);
+}
+
const PluralRules &MeasureFormat::getPluralRules() const {
return **pluralRules;
}
@@ -962,245 +683,140 @@ UnicodeString &MeasureFormat::formatMeasure(
pos,
status);
}
- UnicodeString formattedNumber;
- StandardPlural::Form pluralForm = QuantityFormatter::selectPlural(
- amtNumber, nf, **pluralRules, formattedNumber, pos, status);
- const SimpleFormatter *formatter = getPluralFormatter(amtUnit, fWidth, pluralForm, status);
- return QuantityFormatter::format(*formatter, formattedNumber, appendTo, pos, status);
+ auto* df = dynamic_cast<const DecimalFormat*>(&nf);
+ if (df == nullptr) {
+ // Handle other types of NumberFormat using the ICU 63 code, modified to
+ // get the unitPattern from LongNameHandler and handle fallback to OTHER.
+ UnicodeString formattedNumber;
+ StandardPlural::Form pluralForm = QuantityFormatter::selectPlural(
+ amtNumber, nf, **pluralRules, formattedNumber, pos, status);
+ UnicodeString pattern = number::impl::LongNameHandler::getUnitPattern(getLocale(status),
+ amtUnit, getUnitWidth(fWidth), pluralForm, status);
+ // The above handles fallback from other widths to short, and from other plural forms to OTHER
+ if (U_FAILURE(status)) {
+ return appendTo;
+ }
+ SimpleFormatter formatter(pattern, 0, 1, status);
+ return QuantityFormatter::format(formatter, formattedNumber, appendTo, pos, status);
+ }
+ number::FormattedNumber result;
+ if (auto* lnf = df->toNumberFormatter(status)) {
+ result = lnf->unit(amtUnit)
+ .unitWidth(getUnitWidth(fWidth))
+ .formatDouble(amtNumber.getDouble(status), status);
+ }
+ DecimalFormat::fieldPositionHelper(result, pos, appendTo.length(), status);
+ appendTo.append(result.toTempString(status));
+ return appendTo;
}
-// Formats hours-minutes-seconds as 5:37:23 or similar.
+
+// Formats numeric time duration as 5:00:47 or 3:54.
UnicodeString &MeasureFormat::formatNumeric(
const Formattable *hms, // always length 3
- int32_t bitMap, // 1=hourset, 2=minuteset, 4=secondset
+ int32_t bitMap, // 1=hour set, 2=minute set, 4=second set
UnicodeString &appendTo,
UErrorCode &status) const {
if (U_FAILURE(status)) {
return appendTo;
}
- UDate millis =
- (UDate) (((uprv_trunc(hms[0].getDouble(status)) * 60.0
- + uprv_trunc(hms[1].getDouble(status))) * 60.0
- + uprv_trunc(hms[2].getDouble(status))) * 1000.0);
- switch (bitMap) {
- case 5: // hs
- case 7: // hms
- return formatNumeric(
- millis,
- cache->getNumericDateFormatters()->hourMinuteSecond,
- UDAT_SECOND_FIELD,
- hms[2],
- appendTo,
- status);
- break;
- case 6: // ms
- return formatNumeric(
- millis,
- cache->getNumericDateFormatters()->minuteSecond,
- UDAT_SECOND_FIELD,
- hms[2],
- appendTo,
- status);
- break;
- case 3: // hm
- return formatNumeric(
- millis,
- cache->getNumericDateFormatters()->hourMinute,
- UDAT_MINUTE_FIELD,
- hms[1],
- appendTo,
- status);
- break;
- default:
- status = U_INTERNAL_PROGRAM_ERROR;
- return appendTo;
- break;
- }
-}
-static void appendRange(
- const UnicodeString &src,
- int32_t start,
- int32_t end,
- UnicodeString &dest) {
- dest.append(src, start, end - start);
-}
-
-static void appendRange(
- const UnicodeString &src,
- int32_t end,
- UnicodeString &dest) {
- dest.append(src, end, src.length() - end);
-}
+ UnicodeString pattern;
-// Formats time like 5:37:23
-UnicodeString &MeasureFormat::formatNumeric(
- UDate date, // Time since epoch 1:30:00 would be 5400000
- const DateFormat &dateFmt, // h:mm, m:ss, or h:mm:ss
- UDateFormatField smallestField, // seconds in 5:37:23.5
- const Formattable &smallestAmount, // 23.5 for 5:37:23.5
- UnicodeString &appendTo,
- UErrorCode &status) const {
+ double hours = hms[0].getDouble(status);
+ double minutes = hms[1].getDouble(status);
+ double seconds = hms[2].getDouble(status);
if (U_FAILURE(status)) {
return appendTo;
}
- // Format the smallest amount with this object's NumberFormat
- UnicodeString smallestAmountFormatted;
-
- // We keep track of the integer part of smallest amount so that
- // we can replace it later so that we get '0:00:09.3' instead of
- // '0:00:9.3'
- FieldPosition intFieldPosition(UNUM_INTEGER_FIELD);
- (*numberFormat)->format(
- smallestAmount, smallestAmountFormatted, intFieldPosition, status);
- if (
- intFieldPosition.getBeginIndex() == 0 &&
- intFieldPosition.getEndIndex() == 0) {
+
+ // All possible combinations: "h", "m", "s", "hm", "hs", "ms", "hms"
+ if (bitMap == 5 || bitMap == 7) { // "hms" & "hs" (we add minutes if "hs")
+ pattern = cache->getNumericDateFormatters()->hourMinuteSecond;
+ hours = uprv_trunc(hours);
+ minutes = uprv_trunc(minutes);
+ } else if (bitMap == 3) { // "hm"
+ pattern = cache->getNumericDateFormatters()->hourMinute;
+ hours = uprv_trunc(hours);
+ } else if (bitMap == 6) { // "ms"
+ pattern = cache->getNumericDateFormatters()->minuteSecond;
+ minutes = uprv_trunc(minutes);
+ } else { // h m s, handled outside formatNumeric. No value is also an error.
status = U_INTERNAL_PROGRAM_ERROR;
return appendTo;
}
- // Format time. draft becomes something like '5:30:45'
- // #13606: DateFormat is not thread-safe, but MeasureFormat advertises itself as thread-safe.
- FieldPosition smallestFieldPosition(smallestField);
- UnicodeString draft;
- static UMutex dateFmtMutex = U_MUTEX_INITIALIZER;
- umtx_lock(&dateFmtMutex);
- dateFmt.format(date, draft, smallestFieldPosition, status);
- umtx_unlock(&dateFmtMutex);
-
- // If we find field for smallest amount replace it with the formatted
- // smallest amount from above taking care to replace the integer part
- // with what is in original time. For example, If smallest amount
- // is 9.35s and the formatted time is 0:00:09 then 9.35 becomes 09.35
- // and replacing yields 0:00:09.35
- if (smallestFieldPosition.getBeginIndex() != 0 ||
- smallestFieldPosition.getEndIndex() != 0) {
- appendRange(draft, 0, smallestFieldPosition.getBeginIndex(), appendTo);
- appendRange(
- smallestAmountFormatted,
- 0,
- intFieldPosition.getBeginIndex(),
- appendTo);
- appendRange(
- draft,
- smallestFieldPosition.getBeginIndex(),
- smallestFieldPosition.getEndIndex(),
- appendTo);
- appendRange(
- smallestAmountFormatted,
- intFieldPosition.getEndIndex(),
- appendTo);
- appendRange(
- draft,
- smallestFieldPosition.getEndIndex(),
- appendTo);
+ const DecimalFormat *numberFormatter = dynamic_cast<const DecimalFormat*>(numberFormat->get());
+ if (!numberFormatter) {
+ status = U_INTERNAL_PROGRAM_ERROR;
+ return appendTo;
+ }
+ number::LocalizedNumberFormatter numberFormatter2;
+ if (auto* lnf = numberFormatter->toNumberFormatter(status)) {
+ numberFormatter2 = lnf->integerWidth(number::IntegerWidth::zeroFillTo(2));
} else {
- appendTo.append(draft);
+ return appendTo;
}
- return appendTo;
-}
-const SimpleFormatter *MeasureFormat::getFormatterOrNull(
- const MeasureUnit &unit, UMeasureFormatWidth width, int32_t index) const {
- width = getRegularWidth(width);
- SimpleFormatter *const (*unitPatterns)[PATTERN_COUNT] = &cache->patterns[unit.getIndex()][0];
- if (unitPatterns[width][index] != NULL) {
- return unitPatterns[width][index];
- }
- int32_t fallbackWidth = cache->widthFallback[width];
- if (fallbackWidth != UMEASFMT_WIDTH_COUNT && unitPatterns[fallbackWidth][index] != NULL) {
- return unitPatterns[fallbackWidth][index];
- }
- return NULL;
-}
+ FormattedStringBuilder fsb;
-const SimpleFormatter *MeasureFormat::getFormatter(
- const MeasureUnit &unit, UMeasureFormatWidth width, int32_t index,
- UErrorCode &errorCode) const {
- if (U_FAILURE(errorCode)) {
- return NULL;
- }
- const SimpleFormatter *pattern = getFormatterOrNull(unit, width, index);
- if (pattern == NULL) {
- errorCode = U_MISSING_RESOURCE_ERROR;
- }
- return pattern;
-}
+ UBool protect = FALSE;
+ const int32_t patternLength = pattern.length();
+ for (int32_t i = 0; i < patternLength; i++) {
+ char16_t c = pattern[i];
-const SimpleFormatter *MeasureFormat::getPluralFormatter(
- const MeasureUnit &unit, UMeasureFormatWidth width, int32_t index,
- UErrorCode &errorCode) const {
- if (U_FAILURE(errorCode)) {
- return NULL;
- }
- if (index != StandardPlural::OTHER) {
- const SimpleFormatter *pattern = getFormatterOrNull(unit, width, index);
- if (pattern != NULL) {
- return pattern;
+ // Also set the proper field in this switch
+ // We don't use DateFormat.Field because this is not a date / time, is a duration.
+ double value = 0;
+ switch (c) {
+ case u'H': value = hours; break;
+ case u'm': value = minutes; break;
+ case u's': value = seconds; break;
}
- }
- return getFormatter(unit, width, StandardPlural::OTHER, errorCode);
-}
-const SimpleFormatter *MeasureFormat::getPerFormatter(
- UMeasureFormatWidth width,
- UErrorCode &status) const {
- if (U_FAILURE(status)) {
- return NULL;
- }
- width = getRegularWidth(width);
- const SimpleFormatter * perFormatters = cache->perFormatters;
- if (perFormatters[width].getArgumentLimit() == 2) {
- return &perFormatters[width];
- }
- int32_t fallbackWidth = cache->widthFallback[width];
- if (fallbackWidth != UMEASFMT_WIDTH_COUNT &&
- perFormatters[fallbackWidth].getArgumentLimit() == 2) {
- return &perFormatters[fallbackWidth];
+ // For undefined field we use UNUM_FIELD_COUNT, for historical reasons.
+ // See cleanup bug: https://unicode-org.atlassian.net/browse/ICU-20665
+ // But we give it a clear name, to keep "the ugly part" in one place.
+ constexpr UNumberFormatFields undefinedField = UNUM_FIELD_COUNT;
+
+ // There is not enough info to add Field(s) for the unit because all we have are plain
+ // text patterns. For example in "21:51" there is no text for something like "hour",
+ // while in something like "21h51" there is ("h"). But we can't really tell...
+ switch (c) {
+ case u'H':
+ case u'm':
+ case u's':
+ if (protect) {
+ fsb.appendChar16(c, undefinedField, status);
+ } else {
+ UnicodeString tmp;
+ if ((i + 1 < patternLength) && pattern[i + 1] == c) { // doubled
+ tmp = numberFormatter2.formatDouble(value, status).toString(status);
+ i++;
+ } else {
+ numberFormatter->format(value, tmp, status);
+ }
+ // TODO: Use proper Field
+ fsb.append(tmp, undefinedField, status);
+ }
+ break;
+ case u'\'':
+ // '' is escaped apostrophe
+ if ((i + 1 < patternLength) && pattern[i + 1] == c) {
+ fsb.appendChar16(c, undefinedField, status);
+ i++;
+ } else {
+ protect = !protect;
+ }
+ break;
+ default:
+ fsb.appendChar16(c, undefinedField, status);
+ }
}
- status = U_MISSING_RESOURCE_ERROR;
- return NULL;
-}
-int32_t MeasureFormat::withPerUnitAndAppend(
- const UnicodeString &formatted,
- const MeasureUnit &perUnit,
- UnicodeString &appendTo,
- UErrorCode &status) const {
- int32_t offset = -1;
- if (U_FAILURE(status)) {
- return offset;
- }
- const SimpleFormatter *perUnitFormatter = getFormatterOrNull(perUnit, fWidth, PER_UNIT_INDEX);
- if (perUnitFormatter != NULL) {
- const UnicodeString *params[] = {&formatted};
- perUnitFormatter->formatAndAppend(
- params,
- UPRV_LENGTHOF(params),
- appendTo,
- &offset,
- 1,
- status);
- return offset;
- }
- const SimpleFormatter *perFormatter = getPerFormatter(fWidth, status);
- const SimpleFormatter *pattern =
- getPluralFormatter(perUnit, fWidth, StandardPlural::ONE, status);
- if (U_FAILURE(status)) {
- return offset;
- }
- UnicodeString perUnitString = pattern->getTextWithNoArguments();
- perUnitString.trim();
- const UnicodeString *params[] = {&formatted, &perUnitString};
- perFormatter->formatAndAppend(
- params,
- UPRV_LENGTHOF(params),
- appendTo,
- &offset,
- 1,
- status);
- return offset;
+ appendTo.append(fsb.toTempUnicodeString());
+
+ return appendTo;
}
UnicodeString &MeasureFormat::formatMeasuresSlowTrack(
@@ -1214,7 +830,7 @@ UnicodeString &MeasureFormat::formatMeasuresSlowTrack(
}
FieldPosition dontCare(FieldPosition::DONT_CARE);
FieldPosition fpos(pos.getField());
- UnicodeString *results = new UnicodeString[measureCount];
+ LocalArray<UnicodeString> results(new UnicodeString[measureCount], status);
int32_t fieldPositionFoundIndex = -1;
for (int32_t i = 0; i < measureCount; ++i) {
const NumberFormat *nf = cache->getIntegerFormat();
@@ -1224,7 +840,6 @@ UnicodeString &MeasureFormat::formatMeasuresSlowTrack(
if (fieldPositionFoundIndex == -1) {
formatMeasure(measures[i], *nf, results[i], fpos, status);
if (U_FAILURE(status)) {
- delete [] results;
return appendTo;
}
if (fpos.getBeginIndex() != 0 || fpos.getEndIndex() != 0) {
@@ -1236,40 +851,35 @@ UnicodeString &MeasureFormat::formatMeasuresSlowTrack(
}
int32_t offset;
listFormatter->format(
- results,
+ results.getAlias(),
measureCount,
appendTo,
fieldPositionFoundIndex,
offset,
status);
if (U_FAILURE(status)) {
- delete [] results;
return appendTo;
}
+ // Fix up FieldPosition indexes if our field is found.
if (offset != -1) {
pos.setBeginIndex(fpos.getBeginIndex() + offset);
pos.setEndIndex(fpos.getEndIndex() + offset);
}
- delete [] results;
return appendTo;
}
MeasureFormat* U_EXPORT2 MeasureFormat::createCurrencyFormat(const Locale& locale,
UErrorCode& ec) {
- CurrencyFormat* fmt = NULL;
- if (U_SUCCESS(ec)) {
- fmt = new CurrencyFormat(locale, ec);
- if (U_FAILURE(ec)) {
- delete fmt;
- fmt = NULL;
- }
+ if (U_FAILURE(ec)) {
+ return nullptr;
}
- return fmt;
+ LocalPointer<CurrencyFormat> fmt(new CurrencyFormat(locale, ec), ec);
+ return fmt.orphan();
}
MeasureFormat* U_EXPORT2 MeasureFormat::createCurrencyFormat(UErrorCode& ec) {
if (U_FAILURE(ec)) {
- return NULL;
+ return nullptr;
}
return MeasureFormat::createCurrencyFormat(Locale::getDefault(), ec);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/measunit.cpp b/Build/source/libs/icu/icu-src/source/i18n/measunit.cpp
index d68d504b809..7a0a6060536 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/measunit.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/measunit.cpp
@@ -38,48 +38,54 @@ static const int32_t gOffsets[] = {
0,
2,
7,
- 16,
- 22,
- 26,
- 325,
- 336,
- 347,
- 351,
- 357,
- 361,
+ 17,
+ 25,
+ 29,
+ 328,
+ 339,
+ 355,
+ 359,
+ 368,
+ 370,
+ 374,
381,
- 382,
- 393,
- 396,
402,
- 408,
- 412,
- 416,
- 441
+ 404,
+ 418,
+ 421,
+ 427,
+ 437,
+ 441,
+ 445,
+ 447,
+ 474
};
static const int32_t gIndexes[] = {
0,
2,
7,
- 16,
- 22,
- 26,
- 26,
- 37,
- 48,
- 52,
- 58,
- 62,
+ 17,
+ 25,
+ 29,
+ 29,
+ 40,
+ 56,
+ 60,
+ 69,
+ 71,
+ 75,
82,
- 83,
- 94,
- 97,
103,
- 109,
- 113,
- 117,
- 142
+ 105,
+ 119,
+ 122,
+ 128,
+ 138,
+ 142,
+ 146,
+ 148,
+ 175
};
// Must be sorted alphabetically.
@@ -94,7 +100,9 @@ static const char * const gTypes[] = {
"duration",
"electric",
"energy",
+ "force",
"frequency",
+ "graphics",
"length",
"light",
"mass",
@@ -103,6 +111,7 @@ static const char * const gTypes[] = {
"pressure",
"speed",
"temperature",
+ "torque",
"volume"
};
@@ -116,6 +125,7 @@ static const char * const gSubTypes[] = {
"radian",
"revolution",
"acre",
+ "dunam",
"hectare",
"square-centimeter",
"square-foot",
@@ -127,9 +137,11 @@ static const char * const gSubTypes[] = {
"karat",
"milligram-per-deciliter",
"millimole-per-liter",
+ "mole",
"part-per-million",
"percent",
"permille",
+ "permyriad",
"liter-per-100kilometers",
"liter-per-kilometer",
"mile-per-gallon",
@@ -446,29 +458,46 @@ static const char * const gSubTypes[] = {
"terabyte",
"century",
"day",
+ "day-person",
+ "decade",
"hour",
"microsecond",
"millisecond",
"minute",
"month",
+ "month-person",
"nanosecond",
"second",
"week",
+ "week-person",
"year",
+ "year-person",
"ampere",
"milliampere",
"ohm",
"volt",
+ "british-thermal-unit",
"calorie",
+ "electronvolt",
"foodcalorie",
"joule",
"kilocalorie",
"kilojoule",
"kilowatt-hour",
+ "therm-us",
+ "newton",
+ "pound-force",
"gigahertz",
"hertz",
"kilohertz",
"megahertz",
+ "dot-per-centimeter",
+ "dot-per-inch",
+ "em",
+ "megapixel",
+ "pixel",
+ "pixel-per-centimeter",
+ "pixel-per-inch",
"astronomical-unit",
"centimeter",
"decimeter",
@@ -488,9 +517,13 @@ static const char * const gSubTypes[] = {
"parsec",
"picometer",
"point",
+ "solar-radius",
"yard",
"lux",
+ "solar-luminosity",
"carat",
+ "dalton",
+ "earth-mass",
"gram",
"kilogram",
"metric-ton",
@@ -499,6 +532,7 @@ static const char * const gSubTypes[] = {
"ounce",
"ounce-troy",
"pound",
+ "solar-mass",
"stone",
"ton",
"base",
@@ -511,10 +545,14 @@ static const char * const gSubTypes[] = {
"milliwatt",
"watt",
"atmosphere",
+ "bar",
"hectopascal",
"inch-hg",
+ "kilopascal",
+ "megapascal",
"millibar",
"millimeter-of-mercury",
+ "pascal",
"pound-per-square-inch",
"kilometer-per-hour",
"knot",
@@ -524,7 +562,10 @@ static const char * const gSubTypes[] = {
"fahrenheit",
"generic",
"kelvin",
+ "newton-meter",
+ "pound-foot",
"acre-foot",
+ "barrel",
"bushel",
"centiliter",
"cubic-centimeter",
@@ -538,6 +579,7 @@ static const char * const gSubTypes[] = {
"cup-metric",
"deciliter",
"fluid-ounce",
+ "fluid-ounce-imperial",
"gallon",
"gallon-imperial",
"hectoliter",
@@ -553,574 +595,1396 @@ static const char * const gSubTypes[] = {
// Must be sorted by first value and then second value.
static int32_t unitPerUnitToSingleUnit[][4] = {
- {368, 338, 17, 0},
- {370, 344, 17, 2},
- {372, 338, 17, 3},
- {372, 430, 4, 2},
- {372, 431, 4, 3},
- {387, 428, 3, 1},
- {390, 11, 16, 5},
- {433, 368, 4, 1}
+ {378, 382, 12, 5},
+ {378, 387, 12, 6},
+ {388, 343, 19, 0},
+ {390, 350, 19, 2},
+ {392, 343, 19, 3},
+ {392, 463, 4, 2},
+ {392, 464, 4, 3},
+ {411, 460, 3, 1},
+ {414, 12, 18, 9},
+ {466, 388, 4, 1}
};
// Shortcuts to the base unit in order to make the default constructor fast
-static const int32_t kBaseTypeIdx = 14;
+static const int32_t kBaseTypeIdx = 16;
static const int32_t kBaseSubTypeIdx = 0;
MeasureUnit *MeasureUnit::createGForce(UErrorCode &status) {
return MeasureUnit::create(0, 0, status);
}
+MeasureUnit MeasureUnit::getGForce() {
+ return MeasureUnit(0, 0);
+}
+
MeasureUnit *MeasureUnit::createMeterPerSecondSquared(UErrorCode &status) {
return MeasureUnit::create(0, 1, status);
}
+MeasureUnit MeasureUnit::getMeterPerSecondSquared() {
+ return MeasureUnit(0, 1);
+}
+
MeasureUnit *MeasureUnit::createArcMinute(UErrorCode &status) {
return MeasureUnit::create(1, 0, status);
}
+MeasureUnit MeasureUnit::getArcMinute() {
+ return MeasureUnit(1, 0);
+}
+
MeasureUnit *MeasureUnit::createArcSecond(UErrorCode &status) {
return MeasureUnit::create(1, 1, status);
}
+MeasureUnit MeasureUnit::getArcSecond() {
+ return MeasureUnit(1, 1);
+}
+
MeasureUnit *MeasureUnit::createDegree(UErrorCode &status) {
return MeasureUnit::create(1, 2, status);
}
+MeasureUnit MeasureUnit::getDegree() {
+ return MeasureUnit(1, 2);
+}
+
MeasureUnit *MeasureUnit::createRadian(UErrorCode &status) {
return MeasureUnit::create(1, 3, status);
}
+MeasureUnit MeasureUnit::getRadian() {
+ return MeasureUnit(1, 3);
+}
+
MeasureUnit *MeasureUnit::createRevolutionAngle(UErrorCode &status) {
return MeasureUnit::create(1, 4, status);
}
+MeasureUnit MeasureUnit::getRevolutionAngle() {
+ return MeasureUnit(1, 4);
+}
+
MeasureUnit *MeasureUnit::createAcre(UErrorCode &status) {
return MeasureUnit::create(2, 0, status);
}
-MeasureUnit *MeasureUnit::createHectare(UErrorCode &status) {
+MeasureUnit MeasureUnit::getAcre() {
+ return MeasureUnit(2, 0);
+}
+
+MeasureUnit *MeasureUnit::createDunam(UErrorCode &status) {
return MeasureUnit::create(2, 1, status);
}
-MeasureUnit *MeasureUnit::createSquareCentimeter(UErrorCode &status) {
+MeasureUnit MeasureUnit::getDunam() {
+ return MeasureUnit(2, 1);
+}
+
+MeasureUnit *MeasureUnit::createHectare(UErrorCode &status) {
return MeasureUnit::create(2, 2, status);
}
-MeasureUnit *MeasureUnit::createSquareFoot(UErrorCode &status) {
+MeasureUnit MeasureUnit::getHectare() {
+ return MeasureUnit(2, 2);
+}
+
+MeasureUnit *MeasureUnit::createSquareCentimeter(UErrorCode &status) {
return MeasureUnit::create(2, 3, status);
}
-MeasureUnit *MeasureUnit::createSquareInch(UErrorCode &status) {
+MeasureUnit MeasureUnit::getSquareCentimeter() {
+ return MeasureUnit(2, 3);
+}
+
+MeasureUnit *MeasureUnit::createSquareFoot(UErrorCode &status) {
return MeasureUnit::create(2, 4, status);
}
-MeasureUnit *MeasureUnit::createSquareKilometer(UErrorCode &status) {
+MeasureUnit MeasureUnit::getSquareFoot() {
+ return MeasureUnit(2, 4);
+}
+
+MeasureUnit *MeasureUnit::createSquareInch(UErrorCode &status) {
return MeasureUnit::create(2, 5, status);
}
-MeasureUnit *MeasureUnit::createSquareMeter(UErrorCode &status) {
+MeasureUnit MeasureUnit::getSquareInch() {
+ return MeasureUnit(2, 5);
+}
+
+MeasureUnit *MeasureUnit::createSquareKilometer(UErrorCode &status) {
return MeasureUnit::create(2, 6, status);
}
-MeasureUnit *MeasureUnit::createSquareMile(UErrorCode &status) {
+MeasureUnit MeasureUnit::getSquareKilometer() {
+ return MeasureUnit(2, 6);
+}
+
+MeasureUnit *MeasureUnit::createSquareMeter(UErrorCode &status) {
return MeasureUnit::create(2, 7, status);
}
-MeasureUnit *MeasureUnit::createSquareYard(UErrorCode &status) {
+MeasureUnit MeasureUnit::getSquareMeter() {
+ return MeasureUnit(2, 7);
+}
+
+MeasureUnit *MeasureUnit::createSquareMile(UErrorCode &status) {
return MeasureUnit::create(2, 8, status);
}
+MeasureUnit MeasureUnit::getSquareMile() {
+ return MeasureUnit(2, 8);
+}
+
+MeasureUnit *MeasureUnit::createSquareYard(UErrorCode &status) {
+ return MeasureUnit::create(2, 9, status);
+}
+
+MeasureUnit MeasureUnit::getSquareYard() {
+ return MeasureUnit(2, 9);
+}
+
MeasureUnit *MeasureUnit::createKarat(UErrorCode &status) {
return MeasureUnit::create(3, 0, status);
}
+MeasureUnit MeasureUnit::getKarat() {
+ return MeasureUnit(3, 0);
+}
+
MeasureUnit *MeasureUnit::createMilligramPerDeciliter(UErrorCode &status) {
return MeasureUnit::create(3, 1, status);
}
+MeasureUnit MeasureUnit::getMilligramPerDeciliter() {
+ return MeasureUnit(3, 1);
+}
+
MeasureUnit *MeasureUnit::createMillimolePerLiter(UErrorCode &status) {
return MeasureUnit::create(3, 2, status);
}
-MeasureUnit *MeasureUnit::createPartPerMillion(UErrorCode &status) {
+MeasureUnit MeasureUnit::getMillimolePerLiter() {
+ return MeasureUnit(3, 2);
+}
+
+MeasureUnit *MeasureUnit::createMole(UErrorCode &status) {
return MeasureUnit::create(3, 3, status);
}
-MeasureUnit *MeasureUnit::createPercent(UErrorCode &status) {
+MeasureUnit MeasureUnit::getMole() {
+ return MeasureUnit(3, 3);
+}
+
+MeasureUnit *MeasureUnit::createPartPerMillion(UErrorCode &status) {
return MeasureUnit::create(3, 4, status);
}
-MeasureUnit *MeasureUnit::createPermille(UErrorCode &status) {
+MeasureUnit MeasureUnit::getPartPerMillion() {
+ return MeasureUnit(3, 4);
+}
+
+MeasureUnit *MeasureUnit::createPercent(UErrorCode &status) {
return MeasureUnit::create(3, 5, status);
}
+MeasureUnit MeasureUnit::getPercent() {
+ return MeasureUnit(3, 5);
+}
+
+MeasureUnit *MeasureUnit::createPermille(UErrorCode &status) {
+ return MeasureUnit::create(3, 6, status);
+}
+
+MeasureUnit MeasureUnit::getPermille() {
+ return MeasureUnit(3, 6);
+}
+
+MeasureUnit *MeasureUnit::createPermyriad(UErrorCode &status) {
+ return MeasureUnit::create(3, 7, status);
+}
+
+MeasureUnit MeasureUnit::getPermyriad() {
+ return MeasureUnit(3, 7);
+}
+
MeasureUnit *MeasureUnit::createLiterPer100Kilometers(UErrorCode &status) {
return MeasureUnit::create(4, 0, status);
}
+MeasureUnit MeasureUnit::getLiterPer100Kilometers() {
+ return MeasureUnit(4, 0);
+}
+
MeasureUnit *MeasureUnit::createLiterPerKilometer(UErrorCode &status) {
return MeasureUnit::create(4, 1, status);
}
+MeasureUnit MeasureUnit::getLiterPerKilometer() {
+ return MeasureUnit(4, 1);
+}
+
MeasureUnit *MeasureUnit::createMilePerGallon(UErrorCode &status) {
return MeasureUnit::create(4, 2, status);
}
+MeasureUnit MeasureUnit::getMilePerGallon() {
+ return MeasureUnit(4, 2);
+}
+
MeasureUnit *MeasureUnit::createMilePerGallonImperial(UErrorCode &status) {
return MeasureUnit::create(4, 3, status);
}
+MeasureUnit MeasureUnit::getMilePerGallonImperial() {
+ return MeasureUnit(4, 3);
+}
+
MeasureUnit *MeasureUnit::createBit(UErrorCode &status) {
return MeasureUnit::create(6, 0, status);
}
+MeasureUnit MeasureUnit::getBit() {
+ return MeasureUnit(6, 0);
+}
+
MeasureUnit *MeasureUnit::createByte(UErrorCode &status) {
return MeasureUnit::create(6, 1, status);
}
+MeasureUnit MeasureUnit::getByte() {
+ return MeasureUnit(6, 1);
+}
+
MeasureUnit *MeasureUnit::createGigabit(UErrorCode &status) {
return MeasureUnit::create(6, 2, status);
}
+MeasureUnit MeasureUnit::getGigabit() {
+ return MeasureUnit(6, 2);
+}
+
MeasureUnit *MeasureUnit::createGigabyte(UErrorCode &status) {
return MeasureUnit::create(6, 3, status);
}
+MeasureUnit MeasureUnit::getGigabyte() {
+ return MeasureUnit(6, 3);
+}
+
MeasureUnit *MeasureUnit::createKilobit(UErrorCode &status) {
return MeasureUnit::create(6, 4, status);
}
+MeasureUnit MeasureUnit::getKilobit() {
+ return MeasureUnit(6, 4);
+}
+
MeasureUnit *MeasureUnit::createKilobyte(UErrorCode &status) {
return MeasureUnit::create(6, 5, status);
}
+MeasureUnit MeasureUnit::getKilobyte() {
+ return MeasureUnit(6, 5);
+}
+
MeasureUnit *MeasureUnit::createMegabit(UErrorCode &status) {
return MeasureUnit::create(6, 6, status);
}
+MeasureUnit MeasureUnit::getMegabit() {
+ return MeasureUnit(6, 6);
+}
+
MeasureUnit *MeasureUnit::createMegabyte(UErrorCode &status) {
return MeasureUnit::create(6, 7, status);
}
+MeasureUnit MeasureUnit::getMegabyte() {
+ return MeasureUnit(6, 7);
+}
+
MeasureUnit *MeasureUnit::createPetabyte(UErrorCode &status) {
return MeasureUnit::create(6, 8, status);
}
+MeasureUnit MeasureUnit::getPetabyte() {
+ return MeasureUnit(6, 8);
+}
+
MeasureUnit *MeasureUnit::createTerabit(UErrorCode &status) {
return MeasureUnit::create(6, 9, status);
}
+MeasureUnit MeasureUnit::getTerabit() {
+ return MeasureUnit(6, 9);
+}
+
MeasureUnit *MeasureUnit::createTerabyte(UErrorCode &status) {
return MeasureUnit::create(6, 10, status);
}
+MeasureUnit MeasureUnit::getTerabyte() {
+ return MeasureUnit(6, 10);
+}
+
MeasureUnit *MeasureUnit::createCentury(UErrorCode &status) {
return MeasureUnit::create(7, 0, status);
}
+MeasureUnit MeasureUnit::getCentury() {
+ return MeasureUnit(7, 0);
+}
+
MeasureUnit *MeasureUnit::createDay(UErrorCode &status) {
return MeasureUnit::create(7, 1, status);
}
-MeasureUnit *MeasureUnit::createHour(UErrorCode &status) {
+MeasureUnit MeasureUnit::getDay() {
+ return MeasureUnit(7, 1);
+}
+
+MeasureUnit *MeasureUnit::createDayPerson(UErrorCode &status) {
return MeasureUnit::create(7, 2, status);
}
-MeasureUnit *MeasureUnit::createMicrosecond(UErrorCode &status) {
+MeasureUnit MeasureUnit::getDayPerson() {
+ return MeasureUnit(7, 2);
+}
+
+MeasureUnit *MeasureUnit::createDecade(UErrorCode &status) {
return MeasureUnit::create(7, 3, status);
}
-MeasureUnit *MeasureUnit::createMillisecond(UErrorCode &status) {
+MeasureUnit MeasureUnit::getDecade() {
+ return MeasureUnit(7, 3);
+}
+
+MeasureUnit *MeasureUnit::createHour(UErrorCode &status) {
return MeasureUnit::create(7, 4, status);
}
-MeasureUnit *MeasureUnit::createMinute(UErrorCode &status) {
+MeasureUnit MeasureUnit::getHour() {
+ return MeasureUnit(7, 4);
+}
+
+MeasureUnit *MeasureUnit::createMicrosecond(UErrorCode &status) {
return MeasureUnit::create(7, 5, status);
}
-MeasureUnit *MeasureUnit::createMonth(UErrorCode &status) {
+MeasureUnit MeasureUnit::getMicrosecond() {
+ return MeasureUnit(7, 5);
+}
+
+MeasureUnit *MeasureUnit::createMillisecond(UErrorCode &status) {
return MeasureUnit::create(7, 6, status);
}
-MeasureUnit *MeasureUnit::createNanosecond(UErrorCode &status) {
+MeasureUnit MeasureUnit::getMillisecond() {
+ return MeasureUnit(7, 6);
+}
+
+MeasureUnit *MeasureUnit::createMinute(UErrorCode &status) {
return MeasureUnit::create(7, 7, status);
}
-MeasureUnit *MeasureUnit::createSecond(UErrorCode &status) {
+MeasureUnit MeasureUnit::getMinute() {
+ return MeasureUnit(7, 7);
+}
+
+MeasureUnit *MeasureUnit::createMonth(UErrorCode &status) {
return MeasureUnit::create(7, 8, status);
}
-MeasureUnit *MeasureUnit::createWeek(UErrorCode &status) {
+MeasureUnit MeasureUnit::getMonth() {
+ return MeasureUnit(7, 8);
+}
+
+MeasureUnit *MeasureUnit::createMonthPerson(UErrorCode &status) {
return MeasureUnit::create(7, 9, status);
}
-MeasureUnit *MeasureUnit::createYear(UErrorCode &status) {
+MeasureUnit MeasureUnit::getMonthPerson() {
+ return MeasureUnit(7, 9);
+}
+
+MeasureUnit *MeasureUnit::createNanosecond(UErrorCode &status) {
return MeasureUnit::create(7, 10, status);
}
+MeasureUnit MeasureUnit::getNanosecond() {
+ return MeasureUnit(7, 10);
+}
+
+MeasureUnit *MeasureUnit::createSecond(UErrorCode &status) {
+ return MeasureUnit::create(7, 11, status);
+}
+
+MeasureUnit MeasureUnit::getSecond() {
+ return MeasureUnit(7, 11);
+}
+
+MeasureUnit *MeasureUnit::createWeek(UErrorCode &status) {
+ return MeasureUnit::create(7, 12, status);
+}
+
+MeasureUnit MeasureUnit::getWeek() {
+ return MeasureUnit(7, 12);
+}
+
+MeasureUnit *MeasureUnit::createWeekPerson(UErrorCode &status) {
+ return MeasureUnit::create(7, 13, status);
+}
+
+MeasureUnit MeasureUnit::getWeekPerson() {
+ return MeasureUnit(7, 13);
+}
+
+MeasureUnit *MeasureUnit::createYear(UErrorCode &status) {
+ return MeasureUnit::create(7, 14, status);
+}
+
+MeasureUnit MeasureUnit::getYear() {
+ return MeasureUnit(7, 14);
+}
+
+MeasureUnit *MeasureUnit::createYearPerson(UErrorCode &status) {
+ return MeasureUnit::create(7, 15, status);
+}
+
+MeasureUnit MeasureUnit::getYearPerson() {
+ return MeasureUnit(7, 15);
+}
+
MeasureUnit *MeasureUnit::createAmpere(UErrorCode &status) {
return MeasureUnit::create(8, 0, status);
}
+MeasureUnit MeasureUnit::getAmpere() {
+ return MeasureUnit(8, 0);
+}
+
MeasureUnit *MeasureUnit::createMilliampere(UErrorCode &status) {
return MeasureUnit::create(8, 1, status);
}
+MeasureUnit MeasureUnit::getMilliampere() {
+ return MeasureUnit(8, 1);
+}
+
MeasureUnit *MeasureUnit::createOhm(UErrorCode &status) {
return MeasureUnit::create(8, 2, status);
}
+MeasureUnit MeasureUnit::getOhm() {
+ return MeasureUnit(8, 2);
+}
+
MeasureUnit *MeasureUnit::createVolt(UErrorCode &status) {
return MeasureUnit::create(8, 3, status);
}
-MeasureUnit *MeasureUnit::createCalorie(UErrorCode &status) {
+MeasureUnit MeasureUnit::getVolt() {
+ return MeasureUnit(8, 3);
+}
+
+MeasureUnit *MeasureUnit::createBritishThermalUnit(UErrorCode &status) {
return MeasureUnit::create(9, 0, status);
}
-MeasureUnit *MeasureUnit::createFoodcalorie(UErrorCode &status) {
+MeasureUnit MeasureUnit::getBritishThermalUnit() {
+ return MeasureUnit(9, 0);
+}
+
+MeasureUnit *MeasureUnit::createCalorie(UErrorCode &status) {
return MeasureUnit::create(9, 1, status);
}
-MeasureUnit *MeasureUnit::createJoule(UErrorCode &status) {
+MeasureUnit MeasureUnit::getCalorie() {
+ return MeasureUnit(9, 1);
+}
+
+MeasureUnit *MeasureUnit::createElectronvolt(UErrorCode &status) {
return MeasureUnit::create(9, 2, status);
}
-MeasureUnit *MeasureUnit::createKilocalorie(UErrorCode &status) {
+MeasureUnit MeasureUnit::getElectronvolt() {
+ return MeasureUnit(9, 2);
+}
+
+MeasureUnit *MeasureUnit::createFoodcalorie(UErrorCode &status) {
return MeasureUnit::create(9, 3, status);
}
-MeasureUnit *MeasureUnit::createKilojoule(UErrorCode &status) {
+MeasureUnit MeasureUnit::getFoodcalorie() {
+ return MeasureUnit(9, 3);
+}
+
+MeasureUnit *MeasureUnit::createJoule(UErrorCode &status) {
return MeasureUnit::create(9, 4, status);
}
-MeasureUnit *MeasureUnit::createKilowattHour(UErrorCode &status) {
+MeasureUnit MeasureUnit::getJoule() {
+ return MeasureUnit(9, 4);
+}
+
+MeasureUnit *MeasureUnit::createKilocalorie(UErrorCode &status) {
return MeasureUnit::create(9, 5, status);
}
-MeasureUnit *MeasureUnit::createGigahertz(UErrorCode &status) {
+MeasureUnit MeasureUnit::getKilocalorie() {
+ return MeasureUnit(9, 5);
+}
+
+MeasureUnit *MeasureUnit::createKilojoule(UErrorCode &status) {
+ return MeasureUnit::create(9, 6, status);
+}
+
+MeasureUnit MeasureUnit::getKilojoule() {
+ return MeasureUnit(9, 6);
+}
+
+MeasureUnit *MeasureUnit::createKilowattHour(UErrorCode &status) {
+ return MeasureUnit::create(9, 7, status);
+}
+
+MeasureUnit MeasureUnit::getKilowattHour() {
+ return MeasureUnit(9, 7);
+}
+
+MeasureUnit *MeasureUnit::createThermUs(UErrorCode &status) {
+ return MeasureUnit::create(9, 8, status);
+}
+
+MeasureUnit MeasureUnit::getThermUs() {
+ return MeasureUnit(9, 8);
+}
+
+MeasureUnit *MeasureUnit::createNewton(UErrorCode &status) {
return MeasureUnit::create(10, 0, status);
}
-MeasureUnit *MeasureUnit::createHertz(UErrorCode &status) {
+MeasureUnit MeasureUnit::getNewton() {
+ return MeasureUnit(10, 0);
+}
+
+MeasureUnit *MeasureUnit::createPoundForce(UErrorCode &status) {
return MeasureUnit::create(10, 1, status);
}
+MeasureUnit MeasureUnit::getPoundForce() {
+ return MeasureUnit(10, 1);
+}
+
+MeasureUnit *MeasureUnit::createGigahertz(UErrorCode &status) {
+ return MeasureUnit::create(11, 0, status);
+}
+
+MeasureUnit MeasureUnit::getGigahertz() {
+ return MeasureUnit(11, 0);
+}
+
+MeasureUnit *MeasureUnit::createHertz(UErrorCode &status) {
+ return MeasureUnit::create(11, 1, status);
+}
+
+MeasureUnit MeasureUnit::getHertz() {
+ return MeasureUnit(11, 1);
+}
+
MeasureUnit *MeasureUnit::createKilohertz(UErrorCode &status) {
- return MeasureUnit::create(10, 2, status);
+ return MeasureUnit::create(11, 2, status);
+}
+
+MeasureUnit MeasureUnit::getKilohertz() {
+ return MeasureUnit(11, 2);
}
MeasureUnit *MeasureUnit::createMegahertz(UErrorCode &status) {
- return MeasureUnit::create(10, 3, status);
+ return MeasureUnit::create(11, 3, status);
+}
+
+MeasureUnit MeasureUnit::getMegahertz() {
+ return MeasureUnit(11, 3);
+}
+
+MeasureUnit *MeasureUnit::createDotPerCentimeter(UErrorCode &status) {
+ return MeasureUnit::create(12, 0, status);
+}
+
+MeasureUnit MeasureUnit::getDotPerCentimeter() {
+ return MeasureUnit(12, 0);
+}
+
+MeasureUnit *MeasureUnit::createDotPerInch(UErrorCode &status) {
+ return MeasureUnit::create(12, 1, status);
+}
+
+MeasureUnit MeasureUnit::getDotPerInch() {
+ return MeasureUnit(12, 1);
+}
+
+MeasureUnit *MeasureUnit::createEm(UErrorCode &status) {
+ return MeasureUnit::create(12, 2, status);
+}
+
+MeasureUnit MeasureUnit::getEm() {
+ return MeasureUnit(12, 2);
+}
+
+MeasureUnit *MeasureUnit::createMegapixel(UErrorCode &status) {
+ return MeasureUnit::create(12, 3, status);
+}
+
+MeasureUnit MeasureUnit::getMegapixel() {
+ return MeasureUnit(12, 3);
+}
+
+MeasureUnit *MeasureUnit::createPixel(UErrorCode &status) {
+ return MeasureUnit::create(12, 4, status);
+}
+
+MeasureUnit MeasureUnit::getPixel() {
+ return MeasureUnit(12, 4);
+}
+
+MeasureUnit *MeasureUnit::createPixelPerCentimeter(UErrorCode &status) {
+ return MeasureUnit::create(12, 5, status);
+}
+
+MeasureUnit MeasureUnit::getPixelPerCentimeter() {
+ return MeasureUnit(12, 5);
+}
+
+MeasureUnit *MeasureUnit::createPixelPerInch(UErrorCode &status) {
+ return MeasureUnit::create(12, 6, status);
+}
+
+MeasureUnit MeasureUnit::getPixelPerInch() {
+ return MeasureUnit(12, 6);
}
MeasureUnit *MeasureUnit::createAstronomicalUnit(UErrorCode &status) {
- return MeasureUnit::create(11, 0, status);
+ return MeasureUnit::create(13, 0, status);
+}
+
+MeasureUnit MeasureUnit::getAstronomicalUnit() {
+ return MeasureUnit(13, 0);
}
MeasureUnit *MeasureUnit::createCentimeter(UErrorCode &status) {
- return MeasureUnit::create(11, 1, status);
+ return MeasureUnit::create(13, 1, status);
+}
+
+MeasureUnit MeasureUnit::getCentimeter() {
+ return MeasureUnit(13, 1);
}
MeasureUnit *MeasureUnit::createDecimeter(UErrorCode &status) {
- return MeasureUnit::create(11, 2, status);
+ return MeasureUnit::create(13, 2, status);
+}
+
+MeasureUnit MeasureUnit::getDecimeter() {
+ return MeasureUnit(13, 2);
}
MeasureUnit *MeasureUnit::createFathom(UErrorCode &status) {
- return MeasureUnit::create(11, 3, status);
+ return MeasureUnit::create(13, 3, status);
+}
+
+MeasureUnit MeasureUnit::getFathom() {
+ return MeasureUnit(13, 3);
}
MeasureUnit *MeasureUnit::createFoot(UErrorCode &status) {
- return MeasureUnit::create(11, 4, status);
+ return MeasureUnit::create(13, 4, status);
+}
+
+MeasureUnit MeasureUnit::getFoot() {
+ return MeasureUnit(13, 4);
}
MeasureUnit *MeasureUnit::createFurlong(UErrorCode &status) {
- return MeasureUnit::create(11, 5, status);
+ return MeasureUnit::create(13, 5, status);
+}
+
+MeasureUnit MeasureUnit::getFurlong() {
+ return MeasureUnit(13, 5);
}
MeasureUnit *MeasureUnit::createInch(UErrorCode &status) {
- return MeasureUnit::create(11, 6, status);
+ return MeasureUnit::create(13, 6, status);
+}
+
+MeasureUnit MeasureUnit::getInch() {
+ return MeasureUnit(13, 6);
}
MeasureUnit *MeasureUnit::createKilometer(UErrorCode &status) {
- return MeasureUnit::create(11, 7, status);
+ return MeasureUnit::create(13, 7, status);
+}
+
+MeasureUnit MeasureUnit::getKilometer() {
+ return MeasureUnit(13, 7);
}
MeasureUnit *MeasureUnit::createLightYear(UErrorCode &status) {
- return MeasureUnit::create(11, 8, status);
+ return MeasureUnit::create(13, 8, status);
+}
+
+MeasureUnit MeasureUnit::getLightYear() {
+ return MeasureUnit(13, 8);
}
MeasureUnit *MeasureUnit::createMeter(UErrorCode &status) {
- return MeasureUnit::create(11, 9, status);
+ return MeasureUnit::create(13, 9, status);
+}
+
+MeasureUnit MeasureUnit::getMeter() {
+ return MeasureUnit(13, 9);
}
MeasureUnit *MeasureUnit::createMicrometer(UErrorCode &status) {
- return MeasureUnit::create(11, 10, status);
+ return MeasureUnit::create(13, 10, status);
+}
+
+MeasureUnit MeasureUnit::getMicrometer() {
+ return MeasureUnit(13, 10);
}
MeasureUnit *MeasureUnit::createMile(UErrorCode &status) {
- return MeasureUnit::create(11, 11, status);
+ return MeasureUnit::create(13, 11, status);
+}
+
+MeasureUnit MeasureUnit::getMile() {
+ return MeasureUnit(13, 11);
}
MeasureUnit *MeasureUnit::createMileScandinavian(UErrorCode &status) {
- return MeasureUnit::create(11, 12, status);
+ return MeasureUnit::create(13, 12, status);
+}
+
+MeasureUnit MeasureUnit::getMileScandinavian() {
+ return MeasureUnit(13, 12);
}
MeasureUnit *MeasureUnit::createMillimeter(UErrorCode &status) {
- return MeasureUnit::create(11, 13, status);
+ return MeasureUnit::create(13, 13, status);
+}
+
+MeasureUnit MeasureUnit::getMillimeter() {
+ return MeasureUnit(13, 13);
}
MeasureUnit *MeasureUnit::createNanometer(UErrorCode &status) {
- return MeasureUnit::create(11, 14, status);
+ return MeasureUnit::create(13, 14, status);
+}
+
+MeasureUnit MeasureUnit::getNanometer() {
+ return MeasureUnit(13, 14);
}
MeasureUnit *MeasureUnit::createNauticalMile(UErrorCode &status) {
- return MeasureUnit::create(11, 15, status);
+ return MeasureUnit::create(13, 15, status);
+}
+
+MeasureUnit MeasureUnit::getNauticalMile() {
+ return MeasureUnit(13, 15);
}
MeasureUnit *MeasureUnit::createParsec(UErrorCode &status) {
- return MeasureUnit::create(11, 16, status);
+ return MeasureUnit::create(13, 16, status);
+}
+
+MeasureUnit MeasureUnit::getParsec() {
+ return MeasureUnit(13, 16);
}
MeasureUnit *MeasureUnit::createPicometer(UErrorCode &status) {
- return MeasureUnit::create(11, 17, status);
+ return MeasureUnit::create(13, 17, status);
+}
+
+MeasureUnit MeasureUnit::getPicometer() {
+ return MeasureUnit(13, 17);
}
MeasureUnit *MeasureUnit::createPoint(UErrorCode &status) {
- return MeasureUnit::create(11, 18, status);
+ return MeasureUnit::create(13, 18, status);
+}
+
+MeasureUnit MeasureUnit::getPoint() {
+ return MeasureUnit(13, 18);
+}
+
+MeasureUnit *MeasureUnit::createSolarRadius(UErrorCode &status) {
+ return MeasureUnit::create(13, 19, status);
+}
+
+MeasureUnit MeasureUnit::getSolarRadius() {
+ return MeasureUnit(13, 19);
}
MeasureUnit *MeasureUnit::createYard(UErrorCode &status) {
- return MeasureUnit::create(11, 19, status);
+ return MeasureUnit::create(13, 20, status);
+}
+
+MeasureUnit MeasureUnit::getYard() {
+ return MeasureUnit(13, 20);
}
MeasureUnit *MeasureUnit::createLux(UErrorCode &status) {
- return MeasureUnit::create(12, 0, status);
+ return MeasureUnit::create(14, 0, status);
+}
+
+MeasureUnit MeasureUnit::getLux() {
+ return MeasureUnit(14, 0);
+}
+
+MeasureUnit *MeasureUnit::createSolarLuminosity(UErrorCode &status) {
+ return MeasureUnit::create(14, 1, status);
+}
+
+MeasureUnit MeasureUnit::getSolarLuminosity() {
+ return MeasureUnit(14, 1);
}
MeasureUnit *MeasureUnit::createCarat(UErrorCode &status) {
- return MeasureUnit::create(13, 0, status);
+ return MeasureUnit::create(15, 0, status);
+}
+
+MeasureUnit MeasureUnit::getCarat() {
+ return MeasureUnit(15, 0);
+}
+
+MeasureUnit *MeasureUnit::createDalton(UErrorCode &status) {
+ return MeasureUnit::create(15, 1, status);
+}
+
+MeasureUnit MeasureUnit::getDalton() {
+ return MeasureUnit(15, 1);
+}
+
+MeasureUnit *MeasureUnit::createEarthMass(UErrorCode &status) {
+ return MeasureUnit::create(15, 2, status);
+}
+
+MeasureUnit MeasureUnit::getEarthMass() {
+ return MeasureUnit(15, 2);
}
MeasureUnit *MeasureUnit::createGram(UErrorCode &status) {
- return MeasureUnit::create(13, 1, status);
+ return MeasureUnit::create(15, 3, status);
+}
+
+MeasureUnit MeasureUnit::getGram() {
+ return MeasureUnit(15, 3);
}
MeasureUnit *MeasureUnit::createKilogram(UErrorCode &status) {
- return MeasureUnit::create(13, 2, status);
+ return MeasureUnit::create(15, 4, status);
+}
+
+MeasureUnit MeasureUnit::getKilogram() {
+ return MeasureUnit(15, 4);
}
MeasureUnit *MeasureUnit::createMetricTon(UErrorCode &status) {
- return MeasureUnit::create(13, 3, status);
+ return MeasureUnit::create(15, 5, status);
+}
+
+MeasureUnit MeasureUnit::getMetricTon() {
+ return MeasureUnit(15, 5);
}
MeasureUnit *MeasureUnit::createMicrogram(UErrorCode &status) {
- return MeasureUnit::create(13, 4, status);
+ return MeasureUnit::create(15, 6, status);
+}
+
+MeasureUnit MeasureUnit::getMicrogram() {
+ return MeasureUnit(15, 6);
}
MeasureUnit *MeasureUnit::createMilligram(UErrorCode &status) {
- return MeasureUnit::create(13, 5, status);
+ return MeasureUnit::create(15, 7, status);
+}
+
+MeasureUnit MeasureUnit::getMilligram() {
+ return MeasureUnit(15, 7);
}
MeasureUnit *MeasureUnit::createOunce(UErrorCode &status) {
- return MeasureUnit::create(13, 6, status);
+ return MeasureUnit::create(15, 8, status);
+}
+
+MeasureUnit MeasureUnit::getOunce() {
+ return MeasureUnit(15, 8);
}
MeasureUnit *MeasureUnit::createOunceTroy(UErrorCode &status) {
- return MeasureUnit::create(13, 7, status);
+ return MeasureUnit::create(15, 9, status);
+}
+
+MeasureUnit MeasureUnit::getOunceTroy() {
+ return MeasureUnit(15, 9);
}
MeasureUnit *MeasureUnit::createPound(UErrorCode &status) {
- return MeasureUnit::create(13, 8, status);
+ return MeasureUnit::create(15, 10, status);
+}
+
+MeasureUnit MeasureUnit::getPound() {
+ return MeasureUnit(15, 10);
+}
+
+MeasureUnit *MeasureUnit::createSolarMass(UErrorCode &status) {
+ return MeasureUnit::create(15, 11, status);
+}
+
+MeasureUnit MeasureUnit::getSolarMass() {
+ return MeasureUnit(15, 11);
}
MeasureUnit *MeasureUnit::createStone(UErrorCode &status) {
- return MeasureUnit::create(13, 9, status);
+ return MeasureUnit::create(15, 12, status);
+}
+
+MeasureUnit MeasureUnit::getStone() {
+ return MeasureUnit(15, 12);
}
MeasureUnit *MeasureUnit::createTon(UErrorCode &status) {
- return MeasureUnit::create(13, 10, status);
+ return MeasureUnit::create(15, 13, status);
+}
+
+MeasureUnit MeasureUnit::getTon() {
+ return MeasureUnit(15, 13);
}
MeasureUnit *MeasureUnit::createGigawatt(UErrorCode &status) {
- return MeasureUnit::create(15, 0, status);
+ return MeasureUnit::create(17, 0, status);
+}
+
+MeasureUnit MeasureUnit::getGigawatt() {
+ return MeasureUnit(17, 0);
}
MeasureUnit *MeasureUnit::createHorsepower(UErrorCode &status) {
- return MeasureUnit::create(15, 1, status);
+ return MeasureUnit::create(17, 1, status);
+}
+
+MeasureUnit MeasureUnit::getHorsepower() {
+ return MeasureUnit(17, 1);
}
MeasureUnit *MeasureUnit::createKilowatt(UErrorCode &status) {
- return MeasureUnit::create(15, 2, status);
+ return MeasureUnit::create(17, 2, status);
+}
+
+MeasureUnit MeasureUnit::getKilowatt() {
+ return MeasureUnit(17, 2);
}
MeasureUnit *MeasureUnit::createMegawatt(UErrorCode &status) {
- return MeasureUnit::create(15, 3, status);
+ return MeasureUnit::create(17, 3, status);
+}
+
+MeasureUnit MeasureUnit::getMegawatt() {
+ return MeasureUnit(17, 3);
}
MeasureUnit *MeasureUnit::createMilliwatt(UErrorCode &status) {
- return MeasureUnit::create(15, 4, status);
+ return MeasureUnit::create(17, 4, status);
+}
+
+MeasureUnit MeasureUnit::getMilliwatt() {
+ return MeasureUnit(17, 4);
}
MeasureUnit *MeasureUnit::createWatt(UErrorCode &status) {
- return MeasureUnit::create(15, 5, status);
+ return MeasureUnit::create(17, 5, status);
+}
+
+MeasureUnit MeasureUnit::getWatt() {
+ return MeasureUnit(17, 5);
}
MeasureUnit *MeasureUnit::createAtmosphere(UErrorCode &status) {
- return MeasureUnit::create(16, 0, status);
+ return MeasureUnit::create(18, 0, status);
+}
+
+MeasureUnit MeasureUnit::getAtmosphere() {
+ return MeasureUnit(18, 0);
+}
+
+MeasureUnit *MeasureUnit::createBar(UErrorCode &status) {
+ return MeasureUnit::create(18, 1, status);
+}
+
+MeasureUnit MeasureUnit::getBar() {
+ return MeasureUnit(18, 1);
}
MeasureUnit *MeasureUnit::createHectopascal(UErrorCode &status) {
- return MeasureUnit::create(16, 1, status);
+ return MeasureUnit::create(18, 2, status);
+}
+
+MeasureUnit MeasureUnit::getHectopascal() {
+ return MeasureUnit(18, 2);
}
MeasureUnit *MeasureUnit::createInchHg(UErrorCode &status) {
- return MeasureUnit::create(16, 2, status);
+ return MeasureUnit::create(18, 3, status);
+}
+
+MeasureUnit MeasureUnit::getInchHg() {
+ return MeasureUnit(18, 3);
+}
+
+MeasureUnit *MeasureUnit::createKilopascal(UErrorCode &status) {
+ return MeasureUnit::create(18, 4, status);
+}
+
+MeasureUnit MeasureUnit::getKilopascal() {
+ return MeasureUnit(18, 4);
+}
+
+MeasureUnit *MeasureUnit::createMegapascal(UErrorCode &status) {
+ return MeasureUnit::create(18, 5, status);
+}
+
+MeasureUnit MeasureUnit::getMegapascal() {
+ return MeasureUnit(18, 5);
}
MeasureUnit *MeasureUnit::createMillibar(UErrorCode &status) {
- return MeasureUnit::create(16, 3, status);
+ return MeasureUnit::create(18, 6, status);
+}
+
+MeasureUnit MeasureUnit::getMillibar() {
+ return MeasureUnit(18, 6);
}
MeasureUnit *MeasureUnit::createMillimeterOfMercury(UErrorCode &status) {
- return MeasureUnit::create(16, 4, status);
+ return MeasureUnit::create(18, 7, status);
+}
+
+MeasureUnit MeasureUnit::getMillimeterOfMercury() {
+ return MeasureUnit(18, 7);
+}
+
+MeasureUnit *MeasureUnit::createPascal(UErrorCode &status) {
+ return MeasureUnit::create(18, 8, status);
+}
+
+MeasureUnit MeasureUnit::getPascal() {
+ return MeasureUnit(18, 8);
}
MeasureUnit *MeasureUnit::createPoundPerSquareInch(UErrorCode &status) {
- return MeasureUnit::create(16, 5, status);
+ return MeasureUnit::create(18, 9, status);
+}
+
+MeasureUnit MeasureUnit::getPoundPerSquareInch() {
+ return MeasureUnit(18, 9);
}
MeasureUnit *MeasureUnit::createKilometerPerHour(UErrorCode &status) {
- return MeasureUnit::create(17, 0, status);
+ return MeasureUnit::create(19, 0, status);
+}
+
+MeasureUnit MeasureUnit::getKilometerPerHour() {
+ return MeasureUnit(19, 0);
}
MeasureUnit *MeasureUnit::createKnot(UErrorCode &status) {
- return MeasureUnit::create(17, 1, status);
+ return MeasureUnit::create(19, 1, status);
+}
+
+MeasureUnit MeasureUnit::getKnot() {
+ return MeasureUnit(19, 1);
}
MeasureUnit *MeasureUnit::createMeterPerSecond(UErrorCode &status) {
- return MeasureUnit::create(17, 2, status);
+ return MeasureUnit::create(19, 2, status);
+}
+
+MeasureUnit MeasureUnit::getMeterPerSecond() {
+ return MeasureUnit(19, 2);
}
MeasureUnit *MeasureUnit::createMilePerHour(UErrorCode &status) {
- return MeasureUnit::create(17, 3, status);
+ return MeasureUnit::create(19, 3, status);
+}
+
+MeasureUnit MeasureUnit::getMilePerHour() {
+ return MeasureUnit(19, 3);
}
MeasureUnit *MeasureUnit::createCelsius(UErrorCode &status) {
- return MeasureUnit::create(18, 0, status);
+ return MeasureUnit::create(20, 0, status);
+}
+
+MeasureUnit MeasureUnit::getCelsius() {
+ return MeasureUnit(20, 0);
}
MeasureUnit *MeasureUnit::createFahrenheit(UErrorCode &status) {
- return MeasureUnit::create(18, 1, status);
+ return MeasureUnit::create(20, 1, status);
+}
+
+MeasureUnit MeasureUnit::getFahrenheit() {
+ return MeasureUnit(20, 1);
}
MeasureUnit *MeasureUnit::createGenericTemperature(UErrorCode &status) {
- return MeasureUnit::create(18, 2, status);
+ return MeasureUnit::create(20, 2, status);
+}
+
+MeasureUnit MeasureUnit::getGenericTemperature() {
+ return MeasureUnit(20, 2);
}
MeasureUnit *MeasureUnit::createKelvin(UErrorCode &status) {
- return MeasureUnit::create(18, 3, status);
+ return MeasureUnit::create(20, 3, status);
+}
+
+MeasureUnit MeasureUnit::getKelvin() {
+ return MeasureUnit(20, 3);
+}
+
+MeasureUnit *MeasureUnit::createNewtonMeter(UErrorCode &status) {
+ return MeasureUnit::create(21, 0, status);
+}
+
+MeasureUnit MeasureUnit::getNewtonMeter() {
+ return MeasureUnit(21, 0);
+}
+
+MeasureUnit *MeasureUnit::createPoundFoot(UErrorCode &status) {
+ return MeasureUnit::create(21, 1, status);
+}
+
+MeasureUnit MeasureUnit::getPoundFoot() {
+ return MeasureUnit(21, 1);
}
MeasureUnit *MeasureUnit::createAcreFoot(UErrorCode &status) {
- return MeasureUnit::create(19, 0, status);
+ return MeasureUnit::create(22, 0, status);
+}
+
+MeasureUnit MeasureUnit::getAcreFoot() {
+ return MeasureUnit(22, 0);
+}
+
+MeasureUnit *MeasureUnit::createBarrel(UErrorCode &status) {
+ return MeasureUnit::create(22, 1, status);
+}
+
+MeasureUnit MeasureUnit::getBarrel() {
+ return MeasureUnit(22, 1);
}
MeasureUnit *MeasureUnit::createBushel(UErrorCode &status) {
- return MeasureUnit::create(19, 1, status);
+ return MeasureUnit::create(22, 2, status);
+}
+
+MeasureUnit MeasureUnit::getBushel() {
+ return MeasureUnit(22, 2);
}
MeasureUnit *MeasureUnit::createCentiliter(UErrorCode &status) {
- return MeasureUnit::create(19, 2, status);
+ return MeasureUnit::create(22, 3, status);
+}
+
+MeasureUnit MeasureUnit::getCentiliter() {
+ return MeasureUnit(22, 3);
}
MeasureUnit *MeasureUnit::createCubicCentimeter(UErrorCode &status) {
- return MeasureUnit::create(19, 3, status);
+ return MeasureUnit::create(22, 4, status);
+}
+
+MeasureUnit MeasureUnit::getCubicCentimeter() {
+ return MeasureUnit(22, 4);
}
MeasureUnit *MeasureUnit::createCubicFoot(UErrorCode &status) {
- return MeasureUnit::create(19, 4, status);
+ return MeasureUnit::create(22, 5, status);
+}
+
+MeasureUnit MeasureUnit::getCubicFoot() {
+ return MeasureUnit(22, 5);
}
MeasureUnit *MeasureUnit::createCubicInch(UErrorCode &status) {
- return MeasureUnit::create(19, 5, status);
+ return MeasureUnit::create(22, 6, status);
+}
+
+MeasureUnit MeasureUnit::getCubicInch() {
+ return MeasureUnit(22, 6);
}
MeasureUnit *MeasureUnit::createCubicKilometer(UErrorCode &status) {
- return MeasureUnit::create(19, 6, status);
+ return MeasureUnit::create(22, 7, status);
+}
+
+MeasureUnit MeasureUnit::getCubicKilometer() {
+ return MeasureUnit(22, 7);
}
MeasureUnit *MeasureUnit::createCubicMeter(UErrorCode &status) {
- return MeasureUnit::create(19, 7, status);
+ return MeasureUnit::create(22, 8, status);
+}
+
+MeasureUnit MeasureUnit::getCubicMeter() {
+ return MeasureUnit(22, 8);
}
MeasureUnit *MeasureUnit::createCubicMile(UErrorCode &status) {
- return MeasureUnit::create(19, 8, status);
+ return MeasureUnit::create(22, 9, status);
+}
+
+MeasureUnit MeasureUnit::getCubicMile() {
+ return MeasureUnit(22, 9);
}
MeasureUnit *MeasureUnit::createCubicYard(UErrorCode &status) {
- return MeasureUnit::create(19, 9, status);
+ return MeasureUnit::create(22, 10, status);
+}
+
+MeasureUnit MeasureUnit::getCubicYard() {
+ return MeasureUnit(22, 10);
}
MeasureUnit *MeasureUnit::createCup(UErrorCode &status) {
- return MeasureUnit::create(19, 10, status);
+ return MeasureUnit::create(22, 11, status);
+}
+
+MeasureUnit MeasureUnit::getCup() {
+ return MeasureUnit(22, 11);
}
MeasureUnit *MeasureUnit::createCupMetric(UErrorCode &status) {
- return MeasureUnit::create(19, 11, status);
+ return MeasureUnit::create(22, 12, status);
+}
+
+MeasureUnit MeasureUnit::getCupMetric() {
+ return MeasureUnit(22, 12);
}
MeasureUnit *MeasureUnit::createDeciliter(UErrorCode &status) {
- return MeasureUnit::create(19, 12, status);
+ return MeasureUnit::create(22, 13, status);
+}
+
+MeasureUnit MeasureUnit::getDeciliter() {
+ return MeasureUnit(22, 13);
}
MeasureUnit *MeasureUnit::createFluidOunce(UErrorCode &status) {
- return MeasureUnit::create(19, 13, status);
+ return MeasureUnit::create(22, 14, status);
+}
+
+MeasureUnit MeasureUnit::getFluidOunce() {
+ return MeasureUnit(22, 14);
+}
+
+MeasureUnit *MeasureUnit::createFluidOunceImperial(UErrorCode &status) {
+ return MeasureUnit::create(22, 15, status);
+}
+
+MeasureUnit MeasureUnit::getFluidOunceImperial() {
+ return MeasureUnit(22, 15);
}
MeasureUnit *MeasureUnit::createGallon(UErrorCode &status) {
- return MeasureUnit::create(19, 14, status);
+ return MeasureUnit::create(22, 16, status);
+}
+
+MeasureUnit MeasureUnit::getGallon() {
+ return MeasureUnit(22, 16);
}
MeasureUnit *MeasureUnit::createGallonImperial(UErrorCode &status) {
- return MeasureUnit::create(19, 15, status);
+ return MeasureUnit::create(22, 17, status);
+}
+
+MeasureUnit MeasureUnit::getGallonImperial() {
+ return MeasureUnit(22, 17);
}
MeasureUnit *MeasureUnit::createHectoliter(UErrorCode &status) {
- return MeasureUnit::create(19, 16, status);
+ return MeasureUnit::create(22, 18, status);
+}
+
+MeasureUnit MeasureUnit::getHectoliter() {
+ return MeasureUnit(22, 18);
}
MeasureUnit *MeasureUnit::createLiter(UErrorCode &status) {
- return MeasureUnit::create(19, 17, status);
+ return MeasureUnit::create(22, 19, status);
+}
+
+MeasureUnit MeasureUnit::getLiter() {
+ return MeasureUnit(22, 19);
}
MeasureUnit *MeasureUnit::createMegaliter(UErrorCode &status) {
- return MeasureUnit::create(19, 18, status);
+ return MeasureUnit::create(22, 20, status);
+}
+
+MeasureUnit MeasureUnit::getMegaliter() {
+ return MeasureUnit(22, 20);
}
MeasureUnit *MeasureUnit::createMilliliter(UErrorCode &status) {
- return MeasureUnit::create(19, 19, status);
+ return MeasureUnit::create(22, 21, status);
+}
+
+MeasureUnit MeasureUnit::getMilliliter() {
+ return MeasureUnit(22, 21);
}
MeasureUnit *MeasureUnit::createPint(UErrorCode &status) {
- return MeasureUnit::create(19, 20, status);
+ return MeasureUnit::create(22, 22, status);
+}
+
+MeasureUnit MeasureUnit::getPint() {
+ return MeasureUnit(22, 22);
}
MeasureUnit *MeasureUnit::createPintMetric(UErrorCode &status) {
- return MeasureUnit::create(19, 21, status);
+ return MeasureUnit::create(22, 23, status);
+}
+
+MeasureUnit MeasureUnit::getPintMetric() {
+ return MeasureUnit(22, 23);
}
MeasureUnit *MeasureUnit::createQuart(UErrorCode &status) {
- return MeasureUnit::create(19, 22, status);
+ return MeasureUnit::create(22, 24, status);
+}
+
+MeasureUnit MeasureUnit::getQuart() {
+ return MeasureUnit(22, 24);
}
MeasureUnit *MeasureUnit::createTablespoon(UErrorCode &status) {
- return MeasureUnit::create(19, 23, status);
+ return MeasureUnit::create(22, 25, status);
+}
+
+MeasureUnit MeasureUnit::getTablespoon() {
+ return MeasureUnit(22, 25);
}
MeasureUnit *MeasureUnit::createTeaspoon(UErrorCode &status) {
- return MeasureUnit::create(19, 24, status);
+ return MeasureUnit::create(22, 26, status);
+}
+
+MeasureUnit MeasureUnit::getTeaspoon() {
+ return MeasureUnit(22, 26);
}
// End generated code
@@ -1163,7 +2027,7 @@ MeasureUnit &MeasureUnit::operator=(const MeasureUnit &other) {
return *this;
}
-UObject *MeasureUnit::clone() const {
+MeasureUnit *MeasureUnit::clone() const {
return new MeasureUnit(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/measure.cpp b/Build/source/libs/icu/icu-src/source/i18n/measure.cpp
index d9084f87db2..bffa44215e3 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/measure.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/measure.cpp
@@ -43,12 +43,12 @@ Measure& Measure::operator=(const Measure& other) {
if (this != &other) {
delete unit;
number = other.number;
- unit = (MeasureUnit*) other.unit->clone();
+ unit = other.unit->clone();
}
return *this;
}
-UObject *Measure::clone() const {
+Measure *Measure::clone() const {
return new Measure(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/msgfmt.cpp b/Build/source/libs/icu/icu-src/source/i18n/msgfmt.cpp
index 8ff86a2cacf..3ca368ef954 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/msgfmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/msgfmt.cpp
@@ -436,7 +436,7 @@ MessageFormat::operator==(const Format& rhs) const
// -------------------------------------
// Creates a copy of this MessageFormat, the caller owns the copy.
-Format*
+MessageFormat*
MessageFormat::clone() const
{
return new MessageFormat(*this);
@@ -810,26 +810,31 @@ MessageFormat::getFormats(int32_t& cnt) const
// method on this object. We construct and resize an array
// on demand that contains aliases to the subformats[i].format
// pointers.
+
+ // Get total required capacity first (it's refreshed on each call).
+ int32_t totalCapacity = 0;
+ for (int32_t partIndex = 0; (partIndex = nextTopLevelArgStart(partIndex)) >= 0; ++totalCapacity) {}
+
MessageFormat* t = const_cast<MessageFormat*> (this);
cnt = 0;
- if (formatAliases == NULL) {
- t->formatAliasesCapacity = (argTypeCount<10) ? 10 : argTypeCount;
+ if (formatAliases == nullptr) {
+ t->formatAliasesCapacity = totalCapacity;
Format** a = (Format**)
uprv_malloc(sizeof(Format*) * formatAliasesCapacity);
- if (a == NULL) {
+ if (a == nullptr) {
t->formatAliasesCapacity = 0;
- return NULL;
+ return nullptr;
}
t->formatAliases = a;
- } else if (argTypeCount > formatAliasesCapacity) {
+ } else if (totalCapacity > formatAliasesCapacity) {
Format** a = (Format**)
- uprv_realloc(formatAliases, sizeof(Format*) * argTypeCount);
- if (a == NULL) {
+ uprv_realloc(formatAliases, sizeof(Format*) * totalCapacity);
+ if (a == nullptr) {
t->formatAliasesCapacity = 0;
- return NULL;
+ return nullptr;
}
t->formatAliases = a;
- t->formatAliasesCapacity = argTypeCount;
+ t->formatAliasesCapacity = totalCapacity;
}
for (int32_t partIndex = 0; (partIndex = nextTopLevelArgStart(partIndex)) >= 0;) {
@@ -1673,7 +1678,6 @@ void MessageFormat::cacheExplicitFormats(UErrorCode& status) {
}
}
-
Format* MessageFormat::createAppropriateFormat(UnicodeString& type, UnicodeString& style,
Formattable::Type& formattableType, UParseError& parseError,
UErrorCode& ec) {
@@ -1683,6 +1687,7 @@ Format* MessageFormat::createAppropriateFormat(UnicodeString& type, UnicodeStrin
Format* fmt = NULL;
int32_t typeID, styleID;
DateFormat::EStyle date_style;
+ int32_t firstNonSpace;
switch (typeID = findKeyword(type, TYPE_IDS)) {
case 0: // number
@@ -1702,11 +1707,10 @@ Format* MessageFormat::createAppropriateFormat(UnicodeString& type, UnicodeStrin
fmt = createIntegerFormat(fLocale, ec);
break;
default: // pattern or skeleton
- int32_t i = 0;
- for (; PatternProps::isWhiteSpace(style.charAt(i)); i++);
- if (style.compare(i, 2, u"::", 0, 2) == 0) {
+ firstNonSpace = PatternProps::skipWhiteSpace(style, 0);
+ if (style.compare(firstNonSpace, 2, u"::", 0, 2) == 0) {
// Skeleton
- UnicodeString skeleton = style.tempSubString(i + 2);
+ UnicodeString skeleton = style.tempSubString(firstNonSpace + 2);
fmt = number::NumberFormatter::forSkeleton(skeleton, ec).locale(fLocale).toFormat(ec);
} else {
// Pattern
@@ -1725,19 +1729,27 @@ Format* MessageFormat::createAppropriateFormat(UnicodeString& type, UnicodeStrin
case 1: // date
case 2: // time
formattableType = Formattable::kDate;
- styleID = findKeyword(style, DATE_STYLE_IDS);
- date_style = (styleID >= 0) ? DATE_STYLES[styleID] : DateFormat::kDefault;
-
- if (typeID == 1) {
- fmt = DateFormat::createDateInstance(date_style, fLocale);
+ firstNonSpace = PatternProps::skipWhiteSpace(style, 0);
+ if (style.compare(firstNonSpace, 2, u"::", 0, 2) == 0) {
+ // Skeleton
+ UnicodeString skeleton = style.tempSubString(firstNonSpace + 2);
+ fmt = DateFormat::createInstanceForSkeleton(skeleton, fLocale, ec);
} else {
- fmt = DateFormat::createTimeInstance(date_style, fLocale);
- }
+ // Pattern
+ styleID = findKeyword(style, DATE_STYLE_IDS);
+ date_style = (styleID >= 0) ? DATE_STYLES[styleID] : DateFormat::kDefault;
- if (styleID < 0 && fmt != NULL) {
- SimpleDateFormat* sdtfmt = dynamic_cast<SimpleDateFormat*>(fmt);
- if (sdtfmt != NULL) {
- sdtfmt->applyPattern(style);
+ if (typeID == 1) {
+ fmt = DateFormat::createDateInstance(date_style, fLocale);
+ } else {
+ fmt = DateFormat::createTimeInstance(date_style, fLocale);
+ }
+
+ if (styleID < 0 && fmt != NULL) {
+ SimpleDateFormat* sdtfmt = dynamic_cast<SimpleDateFormat*>(fmt);
+ if (sdtfmt != NULL) {
+ sdtfmt->applyPattern(style);
+ }
}
}
break;
@@ -1861,7 +1873,7 @@ UBool MessageFormat::DummyFormat::operator==(const Format&) const {
return TRUE;
}
-Format* MessageFormat::DummyFormat::clone() const {
+MessageFormat::DummyFormat* MessageFormat::DummyFormat::clone() const {
return new DummyFormat();
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/name2uni.cpp b/Build/source/libs/icu/icu-src/source/i18n/name2uni.cpp
index 69e92b8c17e..52bab80e3da 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/name2uni.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/name2uni.cpp
@@ -100,7 +100,7 @@ NameUnicodeTransliterator::NameUnicodeTransliterator(const NameUnicodeTransliter
/**
* Transliterator API.
*/
-Transliterator* NameUnicodeTransliterator::clone(void) const {
+NameUnicodeTransliterator* NameUnicodeTransliterator::clone() const {
return new NameUnicodeTransliterator(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/name2uni.h b/Build/source/libs/icu/icu-src/source/i18n/name2uni.h
index 4c743def32e..44ad85fb822 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/name2uni.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/name2uni.h
@@ -49,7 +49,7 @@ public:
* Transliterator API.
* @return A copy of the object.
*/
- virtual Transliterator* clone(void) const;
+ virtual NameUnicodeTransliterator* clone() const;
/**
* ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/nortrans.cpp b/Build/source/libs/icu/icu-src/source/i18n/nortrans.cpp
index 589c82482ec..6a8d2c74194 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/nortrans.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/nortrans.cpp
@@ -92,7 +92,7 @@ NormalizationTransliterator::NormalizationTransliterator(const NormalizationTran
/**
* Transliterator API.
*/
-Transliterator* NormalizationTransliterator::clone(void) const {
+NormalizationTransliterator* NormalizationTransliterator::clone() const {
return new NormalizationTransliterator(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/nortrans.h b/Build/source/libs/icu/icu-src/source/i18n/nortrans.h
index d309452f9a4..198ed29c95e 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/nortrans.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/nortrans.h
@@ -44,7 +44,7 @@ class NormalizationTransliterator : public Transliterator {
* Transliterator API.
* @return A copy of the object.
*/
- virtual Transliterator* clone(void) const;
+ virtual NormalizationTransliterator* clone() const;
/**
* ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/nounit.cpp b/Build/source/libs/icu/icu-src/source/i18n/nounit.cpp
index db07387c590..076f76f199c 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/nounit.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/nounit.cpp
@@ -29,7 +29,7 @@ NoUnit::NoUnit(const char* subtype) {
NoUnit::NoUnit(const NoUnit& other) : MeasureUnit(other) {
}
-UObject* NoUnit::clone() const {
+NoUnit* NoUnit::clone() const {
return new NoUnit(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/nultrans.cpp b/Build/source/libs/icu/icu-src/source/i18n/nultrans.cpp
index 62d1290ac75..439cc55d381 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/nultrans.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/nultrans.cpp
@@ -24,7 +24,7 @@ NullTransliterator::NullTransliterator() : Transliterator(UNICODE_STRING_SIMPLE(
NullTransliterator::~NullTransliterator() {}
-Transliterator* NullTransliterator::clone(void) const {
+NullTransliterator* NullTransliterator::clone() const {
return new NullTransliterator();
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/nultrans.h b/Build/source/libs/icu/icu-src/source/i18n/nultrans.h
index a01b04e9ba1..36c92fa7b18 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/nultrans.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/nultrans.h
@@ -45,7 +45,7 @@ public:
* Transliterator API.
* @internal Use transliterator factory methods instead since this class will be removed in that release.
*/
- virtual Transliterator* clone(void) const;
+ virtual NullTransliterator* clone() const;
/**
* Implements {@link Transliterator#handleTransliterate}.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_affixutils.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_affixutils.cpp
index 8da29a03d52..1039a84c656 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_affixutils.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_affixutils.cpp
@@ -64,7 +64,7 @@ int32_t AffixUtils::estimateLength(const UnicodeString &patternString, UErrorCod
}
break;
default:
- U_ASSERT(false);
+ UPRV_UNREACHABLE;
}
offset += U16_LENGTH(cp);
@@ -131,34 +131,33 @@ UnicodeString AffixUtils::escape(const UnicodeString &input) {
Field AffixUtils::getFieldForType(AffixPatternType type) {
switch (type) {
case TYPE_MINUS_SIGN:
- return Field::UNUM_SIGN_FIELD;
+ return UNUM_SIGN_FIELD;
case TYPE_PLUS_SIGN:
- return Field::UNUM_SIGN_FIELD;
+ return UNUM_SIGN_FIELD;
case TYPE_PERCENT:
- return Field::UNUM_PERCENT_FIELD;
+ return UNUM_PERCENT_FIELD;
case TYPE_PERMILLE:
- return Field::UNUM_PERMILL_FIELD;
+ return UNUM_PERMILL_FIELD;
case TYPE_CURRENCY_SINGLE:
- return Field::UNUM_CURRENCY_FIELD;
+ return UNUM_CURRENCY_FIELD;
case TYPE_CURRENCY_DOUBLE:
- return Field::UNUM_CURRENCY_FIELD;
+ return UNUM_CURRENCY_FIELD;
case TYPE_CURRENCY_TRIPLE:
- return Field::UNUM_CURRENCY_FIELD;
+ return UNUM_CURRENCY_FIELD;
case TYPE_CURRENCY_QUAD:
- return Field::UNUM_CURRENCY_FIELD;
+ return UNUM_CURRENCY_FIELD;
case TYPE_CURRENCY_QUINT:
- return Field::UNUM_CURRENCY_FIELD;
+ return UNUM_CURRENCY_FIELD;
case TYPE_CURRENCY_OVERFLOW:
- return Field::UNUM_CURRENCY_FIELD;
+ return UNUM_CURRENCY_FIELD;
default:
- U_ASSERT(false);
- return Field::UNUM_FIELD_COUNT; // suppress "control reaches end of non-void function"
+ UPRV_UNREACHABLE;
}
}
int32_t
-AffixUtils::unescape(const UnicodeString &affixPattern, NumberStringBuilder &output, int32_t position,
- const SymbolProvider &provider, UErrorCode &status) {
+AffixUtils::unescape(const UnicodeString &affixPattern, FormattedStringBuilder &output, int32_t position,
+ const SymbolProvider &provider, Field field, UErrorCode &status) {
int32_t length = 0;
AffixTag tag;
while (hasNext(tag, affixPattern)) {
@@ -171,7 +170,7 @@ AffixUtils::unescape(const UnicodeString &affixPattern, NumberStringBuilder &out
length += output.insert(
position + length, provider.getSymbol(tag.type), getFieldForType(tag.type), status);
} else {
- length += output.insertCodePoint(position + length, tag.codePoint, UNUM_FIELD_COUNT, status);
+ length += output.insertCodePoint(position + length, tag.codePoint, field, status);
}
}
return length;
@@ -231,7 +230,7 @@ UnicodeString AffixUtils::replaceType(const UnicodeString &affixPattern, AffixPa
UnicodeString output(affixPattern); // copy
if (affixPattern.length() == 0) {
return output;
- };
+ }
AffixTag tag;
while (hasNext(tag, affixPattern)) {
tag = nextToken(tag, affixPattern, status);
@@ -247,7 +246,7 @@ bool AffixUtils::containsOnlySymbolsAndIgnorables(const UnicodeString& affixPatt
const UnicodeSet& ignorables, UErrorCode& status) {
if (affixPattern.length() == 0) {
return true;
- };
+ }
AffixTag tag;
while (hasNext(tag, affixPattern)) {
tag = nextToken(tag, affixPattern, status);
@@ -263,7 +262,7 @@ void AffixUtils::iterateWithConsumer(const UnicodeString& affixPattern, TokenCon
UErrorCode& status) {
if (affixPattern.length() == 0) {
return;
- };
+ }
AffixTag tag;
while (hasNext(tag, affixPattern)) {
tag = nextToken(tag, affixPattern, status);
@@ -382,7 +381,7 @@ AffixTag AffixUtils::nextToken(AffixTag tag, const UnicodeString &patternString,
return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0);
}
default:
- U_ASSERT(false);
+ UPRV_UNREACHABLE;
}
}
// End of string
@@ -411,8 +410,7 @@ AffixTag AffixUtils::nextToken(AffixTag tag, const UnicodeString &patternString,
case STATE_OVERFLOW_CURR:
return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0);
default:
- U_ASSERT(false);
- return {-1}; // suppress "control reaches end of non-void function"
+ UPRV_UNREACHABLE;
}
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_affixutils.h b/Build/source/libs/icu/icu-src/source/i18n/number_affixutils.h
index 1d7e1a115e0..5cfde61ffd0 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_affixutils.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_affixutils.h
@@ -11,7 +11,7 @@
#include "number_types.h"
#include "unicode/stringpiece.h"
#include "unicode/unistr.h"
-#include "number_stringbuilder.h"
+#include "formatted_string_builder.h"
#include "unicode/uniset.h"
U_NAMESPACE_BEGIN namespace number {
@@ -134,17 +134,18 @@ class U_I18N_API AffixUtils {
/**
* Executes the unescape state machine. Replaces the unquoted characters "-", "+", "%", "‰", and
* "¤" with the corresponding symbols provided by the {@link SymbolProvider}, and inserts the
- * result into the NumberStringBuilder at the requested location.
+ * result into the FormattedStringBuilder at the requested location.
*
* <p>Example input: "'-'¤x"; example output: "-$x"
*
* @param affixPattern The original string to be unescaped.
- * @param output The NumberStringBuilder to mutate with the result.
- * @param position The index into the NumberStringBuilder to insert the string.
+ * @param output The FormattedStringBuilder to mutate with the result.
+ * @param position The index into the FormattedStringBuilder to insert the string.
* @param provider An object to generate locale symbols.
*/
- static int32_t unescape(const UnicodeString& affixPattern, NumberStringBuilder& output,
- int32_t position, const SymbolProvider& provider, UErrorCode& status);
+ static int32_t unescape(const UnicodeString& affixPattern, FormattedStringBuilder& output,
+ int32_t position, const SymbolProvider& provider, Field field,
+ UErrorCode& status);
/**
* Sames as {@link #unescape}, but only calculates the code point count. More efficient than {@link #unescape}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_asformat.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_asformat.cpp
index c6bb538932c..e876174fdce 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_asformat.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_asformat.cpp
@@ -43,7 +43,7 @@ UBool LocalizedNumberFormatterAsFormat::operator==(const Format& other) const {
return fFormatter.toSkeleton(localStatus) == _other->fFormatter.toSkeleton(localStatus);
}
-Format* LocalizedNumberFormatterAsFormat::clone() const {
+LocalizedNumberFormatterAsFormat* LocalizedNumberFormatterAsFormat::clone() const {
return new LocalizedNumberFormatterAsFormat(*this);
}
@@ -62,12 +62,12 @@ UnicodeString& LocalizedNumberFormatterAsFormat::format(const Formattable& obj,
// always return first occurrence:
pos.setBeginIndex(0);
pos.setEndIndex(0);
- bool found = data.string.nextFieldPosition(pos, status);
+ bool found = data.nextFieldPosition(pos, status);
if (found && appendTo.length() != 0) {
pos.setBeginIndex(pos.getBeginIndex() + appendTo.length());
pos.setEndIndex(pos.getEndIndex() + appendTo.length());
}
- appendTo.append(data.string.toTempUnicodeString());
+ appendTo.append(data.toTempString(status));
return appendTo;
}
@@ -84,10 +84,10 @@ UnicodeString& LocalizedNumberFormatterAsFormat::format(const Formattable& obj,
if (U_FAILURE(status)) {
return appendTo;
}
- appendTo.append(data.string.toTempUnicodeString());
+ appendTo.append(data.toTempString(status));
if (posIter != nullptr) {
FieldPositionIteratorHandler fpih(posIter, status);
- data.string.getAllFieldPositions(fpih, status);
+ data.getAllFieldPositions(fpih, status);
}
return appendTo;
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_asformat.h b/Build/source/libs/icu/icu-src/source/i18n/number_asformat.h
index bf82d72ae30..7b0a1dee6f4 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_asformat.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_asformat.h
@@ -45,7 +45,7 @@ class U_I18N_API LocalizedNumberFormatterAsFormat : public Format {
/**
* Creates a copy of this object.
*/
- Format* clone() const U_OVERRIDE;
+ LocalizedNumberFormatterAsFormat* clone() const U_OVERRIDE;
/**
* Formats a Number using the wrapped LocalizedNumberFormatter. The provided formattable must be a
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_capi.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_capi.cpp
index ca7918bc82e..f802e211049 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_capi.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_capi.cpp
@@ -12,6 +12,7 @@
#include "fphdlimp.h"
#include "number_utypes.h"
#include "numparse_types.h"
+#include "formattedval_impl.h"
#include "unicode/numberformatter.h"
#include "unicode/unumberformatter.h"
@@ -20,67 +21,63 @@ using namespace icu::number;
using namespace icu::number::impl;
-//////////////////////////////////
-/// C API CONVERSION FUNCTIONS ///
-//////////////////////////////////
+U_NAMESPACE_BEGIN
+namespace number {
+namespace impl {
-UNumberFormatterData* UNumberFormatterData::validate(UNumberFormatter* input, UErrorCode& status) {
- auto* constInput = static_cast<const UNumberFormatter*>(input);
- auto* validated = validate(constInput, status);
- return const_cast<UNumberFormatterData*>(validated);
-}
+/**
+ * Implementation class for UNumberFormatter. Wraps a LocalizedNumberFormatter.
+ */
+struct UNumberFormatterData : public UMemory,
+ // Magic number as ASCII == "NFR" (NumberFormatteR)
+ public IcuCApiHelper<UNumberFormatter, UNumberFormatterData, 0x4E465200> {
+ LocalizedNumberFormatter fFormatter;
+};
-const UNumberFormatterData*
-UNumberFormatterData::validate(const UNumberFormatter* input, UErrorCode& status) {
- if (U_FAILURE(status)) {
- return nullptr;
- }
- if (input == nullptr) {
- status = U_ILLEGAL_ARGUMENT_ERROR;
- return nullptr;
- }
- auto* impl = reinterpret_cast<const UNumberFormatterData*>(input);
- if (impl->fMagic != UNumberFormatterData::kMagic) {
- status = U_INVALID_FORMAT_ERROR;
- return nullptr;
- }
- return impl;
+struct UFormattedNumberImpl;
+
+// Magic number as ASCII == "FDN" (FormatteDNumber)
+typedef IcuCApiHelper<UFormattedNumber, UFormattedNumberImpl, 0x46444E00> UFormattedNumberApiHelper;
+
+struct UFormattedNumberImpl : public UFormattedValueImpl, public UFormattedNumberApiHelper {
+ UFormattedNumberImpl();
+ ~UFormattedNumberImpl();
+
+ FormattedNumber fImpl;
+ UFormattedNumberData fData;
+};
+
+UFormattedNumberImpl::UFormattedNumberImpl()
+ : fImpl(&fData) {
+ fFormattedValue = &fImpl;
}
-UNumberFormatter* UNumberFormatterData::exportForC() {
- return reinterpret_cast<UNumberFormatter*>(this);
+UFormattedNumberImpl::~UFormattedNumberImpl() {
+ // Disown the data from fImpl so it doesn't get deleted twice
+ fImpl.fData = nullptr;
}
-UFormattedNumberData* UFormattedNumberData::validate(UFormattedNumber* input, UErrorCode& status) {
- auto* constInput = static_cast<const UFormattedNumber*>(input);
- auto* validated = validate(constInput, status);
- return const_cast<UFormattedNumberData*>(validated);
}
+}
+U_NAMESPACE_END
+
+
+UPRV_FORMATTED_VALUE_CAPI_NO_IMPLTYPE_AUTO_IMPL(
+ UFormattedNumber,
+ UFormattedNumberImpl,
+ UFormattedNumberApiHelper,
+ unumf)
+
-const UFormattedNumberData*
-UFormattedNumberData::validate(const UFormattedNumber* input, UErrorCode& status) {
+const DecimalQuantity* icu::number::impl::validateUFormattedNumberToDecimalQuantity(
+ const UFormattedNumber* uresult, UErrorCode& status) {
+ auto* result = UFormattedNumberApiHelper::validate(uresult, status);
if (U_FAILURE(status)) {
return nullptr;
}
- if (input == nullptr) {
- status = U_ILLEGAL_ARGUMENT_ERROR;
- return nullptr;
- }
- auto* impl = reinterpret_cast<const UFormattedNumberData*>(input);
- if (impl->fMagic != UFormattedNumberData::kMagic) {
- status = U_INVALID_FORMAT_ERROR;
- return nullptr;
- }
- return impl;
+ return &result->fData.quantity;
}
-UFormattedNumber* UFormattedNumberData::exportForC() {
- return reinterpret_cast<UFormattedNumber*>(this);
-}
-
-/////////////////////////////////////
-/// END CAPI CONVERSION FUNCTIONS ///
-/////////////////////////////////////
U_CAPI UNumberFormatter* U_EXPORT2
@@ -97,13 +94,17 @@ unumf_openForSkeletonAndLocale(const UChar* skeleton, int32_t skeletonLen, const
return impl->exportForC();
}
-U_CAPI UFormattedNumber* U_EXPORT2
-unumf_openResult(UErrorCode* ec) {
- auto* impl = new UFormattedNumberData();
+U_CAPI UNumberFormatter* U_EXPORT2
+unumf_openForSkeletonAndLocaleWithError(const UChar* skeleton, int32_t skeletonLen, const char* locale,
+ UParseError* perror, UErrorCode* ec) {
+ auto* impl = new UNumberFormatterData();
if (impl == nullptr) {
*ec = U_MEMORY_ALLOCATION_ERROR;
return nullptr;
}
+ // Readonly-alias constructor (first argument is whether we are NUL-terminated)
+ UnicodeString skeletonString(skeletonLen == -1, skeleton, skeletonLen);
+ impl->fFormatter = NumberFormatter::forSkeleton(skeletonString, *perror, *ec).locale(locale);
return impl->exportForC();
}
@@ -111,43 +112,43 @@ U_CAPI void U_EXPORT2
unumf_formatInt(const UNumberFormatter* uformatter, int64_t value, UFormattedNumber* uresult,
UErrorCode* ec) {
const UNumberFormatterData* formatter = UNumberFormatterData::validate(uformatter, *ec);
- UFormattedNumberData* result = UFormattedNumberData::validate(uresult, *ec);
+ auto* result = UFormattedNumberApiHelper::validate(uresult, *ec);
if (U_FAILURE(*ec)) { return; }
- result->string.clear();
- result->quantity.setToLong(value);
- formatter->fFormatter.formatImpl(result, *ec);
+ result->fData.getStringRef().clear();
+ result->fData.quantity.setToLong(value);
+ formatter->fFormatter.formatImpl(&result->fData, *ec);
}
U_CAPI void U_EXPORT2
unumf_formatDouble(const UNumberFormatter* uformatter, double value, UFormattedNumber* uresult,
UErrorCode* ec) {
const UNumberFormatterData* formatter = UNumberFormatterData::validate(uformatter, *ec);
- UFormattedNumberData* result = UFormattedNumberData::validate(uresult, *ec);
+ auto* result = UFormattedNumberApiHelper::validate(uresult, *ec);
if (U_FAILURE(*ec)) { return; }
- result->string.clear();
- result->quantity.setToDouble(value);
- formatter->fFormatter.formatImpl(result, *ec);
+ result->fData.getStringRef().clear();
+ result->fData.quantity.setToDouble(value);
+ formatter->fFormatter.formatImpl(&result->fData, *ec);
}
U_CAPI void U_EXPORT2
unumf_formatDecimal(const UNumberFormatter* uformatter, const char* value, int32_t valueLen,
UFormattedNumber* uresult, UErrorCode* ec) {
const UNumberFormatterData* formatter = UNumberFormatterData::validate(uformatter, *ec);
- UFormattedNumberData* result = UFormattedNumberData::validate(uresult, *ec);
+ auto* result = UFormattedNumberApiHelper::validate(uresult, *ec);
if (U_FAILURE(*ec)) { return; }
- result->string.clear();
- result->quantity.setToDecNumber({value, valueLen}, *ec);
+ result->fData.getStringRef().clear();
+ result->fData.quantity.setToDecNumber({value, valueLen}, *ec);
if (U_FAILURE(*ec)) { return; }
- formatter->fFormatter.formatImpl(result, *ec);
+ formatter->fFormatter.formatImpl(&result->fData, *ec);
}
U_CAPI int32_t U_EXPORT2
unumf_resultToString(const UFormattedNumber* uresult, UChar* buffer, int32_t bufferCapacity,
UErrorCode* ec) {
- const UFormattedNumberData* result = UFormattedNumberData::validate(uresult, *ec);
+ const auto* result = UFormattedNumberApiHelper::validate(uresult, *ec);
if (U_FAILURE(*ec)) { return 0; }
if (buffer == nullptr ? bufferCapacity != 0 : bufferCapacity < 0) {
@@ -155,12 +156,12 @@ unumf_resultToString(const UFormattedNumber* uresult, UChar* buffer, int32_t buf
return 0;
}
- return result->string.toTempUnicodeString().extract(buffer, bufferCapacity, *ec);
+ return result->fImpl.toTempString(*ec).extract(buffer, bufferCapacity, *ec);
}
U_CAPI UBool U_EXPORT2
unumf_resultNextFieldPosition(const UFormattedNumber* uresult, UFieldPosition* ufpos, UErrorCode* ec) {
- const UFormattedNumberData* result = UFormattedNumberData::validate(uresult, *ec);
+ const auto* result = UFormattedNumberApiHelper::validate(uresult, *ec);
if (U_FAILURE(*ec)) { return FALSE; }
if (ufpos == nullptr) {
@@ -172,7 +173,7 @@ unumf_resultNextFieldPosition(const UFormattedNumber* uresult, UFieldPosition* u
fp.setField(ufpos->field);
fp.setBeginIndex(ufpos->beginIndex);
fp.setEndIndex(ufpos->endIndex);
- bool retval = result->string.nextFieldPosition(fp, *ec);
+ bool retval = result->fImpl.nextFieldPosition(fp, *ec);
ufpos->beginIndex = fp.getBeginIndex();
ufpos->endIndex = fp.getEndIndex();
// NOTE: MSVC sometimes complains when implicitly converting between bool and UBool
@@ -182,7 +183,7 @@ unumf_resultNextFieldPosition(const UFormattedNumber* uresult, UFieldPosition* u
U_CAPI void U_EXPORT2
unumf_resultGetAllFieldPositions(const UFormattedNumber* uresult, UFieldPositionIterator* ufpositer,
UErrorCode* ec) {
- const UFormattedNumberData* result = UFormattedNumberData::validate(uresult, *ec);
+ const auto* result = UFormattedNumberApiHelper::validate(uresult, *ec);
if (U_FAILURE(*ec)) { return; }
if (ufpositer == nullptr) {
@@ -191,15 +192,7 @@ unumf_resultGetAllFieldPositions(const UFormattedNumber* uresult, UFieldPosition
}
auto* fpi = reinterpret_cast<FieldPositionIterator*>(ufpositer);
- FieldPositionIteratorHandler fpih(fpi, *ec);
- result->string.getAllFieldPositions(fpih, *ec);
-}
-
-U_CAPI void U_EXPORT2
-unumf_closeResult(UFormattedNumber* uresult) {
- UErrorCode localStatus = U_ZERO_ERROR;
- const UFormattedNumberData* impl = UFormattedNumberData::validate(uresult, localStatus);
- delete impl;
+ result->fImpl.getAllFieldPositions(*fpi, *ec);
}
U_CAPI void U_EXPORT2
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_compact.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_compact.cpp
index 10942c35f53..3d259999d6c 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_compact.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_compact.cpp
@@ -260,7 +260,7 @@ void CompactHandler::precomputeAllModifiers(MutablePatternModifier &buildReferen
ParsedPatternInfo patternInfo;
PatternParser::parseToPatternInfo(UnicodeString(patternString), patternInfo, status);
if (U_FAILURE(status)) { return; }
- buildReference.setPatternInfo(&patternInfo);
+ buildReference.setPatternInfo(&patternInfo, UNUM_COMPACT_FIELD);
info.mod = buildReference.createImmutable(status);
if (U_FAILURE(status)) { return; }
info.patternString = patternString;
@@ -272,15 +272,15 @@ void CompactHandler::processQuantity(DecimalQuantity &quantity, MicroProps &micr
parent->processQuantity(quantity, micros, status);
if (U_FAILURE(status)) { return; }
- // Treat zero as if it had magnitude 0
+ // Treat zero, NaN, and infinity as if they had magnitude 0
int32_t magnitude;
- if (quantity.isZero()) {
+ if (quantity.isZeroish()) {
magnitude = 0;
micros.rounder.apply(quantity, status);
} else {
// TODO: Revisit chooseMultiplierAndApply
int32_t multiplier = micros.rounder.chooseMultiplierAndApply(quantity, data, status);
- magnitude = quantity.isZero() ? 0 : quantity.getMagnitude();
+ magnitude = quantity.isZeroish() ? 0 : quantity.getMagnitude();
magnitude -= multiplier;
}
@@ -297,7 +297,7 @@ void CompactHandler::processQuantity(DecimalQuantity &quantity, MicroProps &micr
for (; i < precomputedModsLength; i++) {
const CompactModInfo &info = precomputedMods[i];
if (u_strcmp(patternString, info.patternString) == 0) {
- info.mod->applyToMicros(micros, quantity);
+ info.mod->applyToMicros(micros, quantity, status);
break;
}
}
@@ -310,7 +310,7 @@ void CompactHandler::processQuantity(DecimalQuantity &quantity, MicroProps &micr
ParsedPatternInfo &patternInfo = const_cast<CompactHandler *>(this)->unsafePatternInfo;
PatternParser::parseToPatternInfo(UnicodeString(patternString), patternInfo, status);
static_cast<MutablePatternModifier*>(const_cast<Modifier*>(micros.modMiddle))
- ->setPatternInfo(&patternInfo);
+ ->setPatternInfo(&patternInfo, UNUM_COMPACT_FIELD);
}
// We already performed rounding. Do not perform it again.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_currencysymbols.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_currencysymbols.cpp
index 0b79d6596f1..4d6fb2cb1d8 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_currencysymbols.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_currencysymbols.cpp
@@ -53,13 +53,12 @@ UnicodeString CurrencySymbols::getCurrencySymbol(UErrorCode& status) const {
UnicodeString CurrencySymbols::loadSymbol(UCurrNameStyle selector, UErrorCode& status) const {
const char16_t* isoCode = fCurrency.getISOCurrency();
- UBool ignoredIsChoiceFormatFillIn = FALSE;
int32_t symbolLen = 0;
const char16_t* symbol = ucurr_getName(
isoCode,
fLocaleName.data(),
selector,
- &ignoredIsChoiceFormatFillIn,
+ nullptr /* isChoiceFormat */,
&symbolLen,
&status);
// If given an unknown currency, ucurr_getName returns the input string, which we can't alias safely!
@@ -82,12 +81,11 @@ UnicodeString CurrencySymbols::getIntlCurrencySymbol(UErrorCode&) const {
UnicodeString CurrencySymbols::getPluralName(StandardPlural::Form plural, UErrorCode& status) const {
const char16_t* isoCode = fCurrency.getISOCurrency();
- UBool isChoiceFormat = FALSE;
int32_t symbolLen = 0;
const char16_t* symbol = ucurr_getPluralName(
isoCode,
fLocaleName.data(),
- &isChoiceFormat,
+ nullptr /* isChoiceFormat */,
StandardPlural::getKeyword(plural),
&symbolLen,
&status);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.cpp
index 2c4182b1c6e..2c4c2ce7e99 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.cpp
@@ -112,10 +112,8 @@ DecimalQuantity& DecimalQuantity::operator=(DecimalQuantity&& src) U_NOEXCEPT {
void DecimalQuantity::copyFieldsFrom(const DecimalQuantity& other) {
bogus = other.bogus;
- lOptPos = other.lOptPos;
lReqPos = other.lReqPos;
rReqPos = other.rReqPos;
- rOptPos = other.rOptPos;
scale = other.scale;
precision = other.precision;
flags = other.flags;
@@ -125,18 +123,15 @@ void DecimalQuantity::copyFieldsFrom(const DecimalQuantity& other) {
}
void DecimalQuantity::clear() {
- lOptPos = INT32_MAX;
lReqPos = 0;
rReqPos = 0;
- rOptPos = INT32_MIN;
flags = 0;
setBcdToZero(); // sets scale, precision, hasDouble, origDouble, origDelta, and BCD data
}
-void DecimalQuantity::setIntegerLength(int32_t minInt, int32_t maxInt) {
+void DecimalQuantity::setMinInteger(int32_t minInt) {
// Validation should happen outside of DecimalQuantity, e.g., in the Precision class.
U_ASSERT(minInt >= 0);
- U_ASSERT(maxInt >= minInt);
// Special behavior: do not set minInt to be less than what is already set.
// This is so significant digits rounding can set the integer length.
@@ -145,53 +140,72 @@ void DecimalQuantity::setIntegerLength(int32_t minInt, int32_t maxInt) {
}
// Save values into internal state
- // Negation is safe for minFrac/maxFrac because -Integer.MAX_VALUE > Integer.MIN_VALUE
- lOptPos = maxInt;
lReqPos = minInt;
}
-void DecimalQuantity::setFractionLength(int32_t minFrac, int32_t maxFrac) {
+void DecimalQuantity::setMinFraction(int32_t minFrac) {
// Validation should happen outside of DecimalQuantity, e.g., in the Precision class.
U_ASSERT(minFrac >= 0);
- U_ASSERT(maxFrac >= minFrac);
// Save values into internal state
// Negation is safe for minFrac/maxFrac because -Integer.MAX_VALUE > Integer.MIN_VALUE
rReqPos = -minFrac;
- rOptPos = -maxFrac;
+}
+
+void DecimalQuantity::applyMaxInteger(int32_t maxInt) {
+ // Validation should happen outside of DecimalQuantity, e.g., in the Precision class.
+ U_ASSERT(maxInt >= 0);
+
+ if (precision == 0) {
+ return;
+ }
+
+ if (maxInt <= scale) {
+ setBcdToZero();
+ return;
+ }
+
+ int32_t magnitude = getMagnitude();
+ if (maxInt <= magnitude) {
+ popFromLeft(magnitude - maxInt + 1);
+ compact();
+ }
}
uint64_t DecimalQuantity::getPositionFingerprint() const {
uint64_t fingerprint = 0;
- fingerprint ^= lOptPos;
fingerprint ^= (lReqPos << 16);
fingerprint ^= (static_cast<uint64_t>(rReqPos) << 32);
- fingerprint ^= (static_cast<uint64_t>(rOptPos) << 48);
return fingerprint;
}
void DecimalQuantity::roundToIncrement(double roundingIncrement, RoundingMode roundingMode,
- int32_t maxFrac, UErrorCode& status) {
- // TODO(13701): This is innefficient. Improve?
- // TODO(13701): Should we convert to decNumber instead?
- roundToInfinity();
- double temp = toDouble();
- temp /= roundingIncrement;
- // Use another DecimalQuantity to perform the actual rounding...
- DecimalQuantity dq;
- dq.setToDouble(temp);
- dq.roundToMagnitude(0, roundingMode, status);
- temp = dq.toDouble();
- temp *= roundingIncrement;
- setToDouble(temp);
- // Since we reset the value to a double, we need to specify the rounding boundary
- // in order to get the DecimalQuantity out of approximation mode.
- // NOTE: In Java, we have minMaxFrac, but in C++, the two are differentiated.
- roundToMagnitude(-maxFrac, roundingMode, status);
+ UErrorCode& status) {
+ // Do not call this method with an increment having only a 1 or a 5 digit!
+ // Use a more efficient call to either roundToMagnitude() or roundToNickel().
+ // Check a few popular rounding increments; a more thorough check is in Java.
+ U_ASSERT(roundingIncrement != 0.01);
+ U_ASSERT(roundingIncrement != 0.05);
+ U_ASSERT(roundingIncrement != 0.1);
+ U_ASSERT(roundingIncrement != 0.5);
+ U_ASSERT(roundingIncrement != 1);
+ U_ASSERT(roundingIncrement != 5);
+
+ DecNum incrementDN;
+ incrementDN.setTo(roundingIncrement, status);
+ if (U_FAILURE(status)) { return; }
+
+ // Divide this DecimalQuantity by the increment, round, then multiply back.
+ divideBy(incrementDN, status);
+ if (U_FAILURE(status)) { return; }
+ roundToMagnitude(0, roundingMode, status);
+ if (U_FAILURE(status)) { return; }
+ multiplyBy(incrementDN, status);
+ if (U_FAILURE(status)) { return; }
}
void DecimalQuantity::multiplyBy(const DecNum& multiplicand, UErrorCode& status) {
- if (isInfinite() || isZero() || isNaN()) {
+ if (isZeroish()) {
return;
}
// Convert to DecNum, multiply, and convert back.
@@ -204,7 +218,7 @@ void DecimalQuantity::multiplyBy(const DecNum& multiplicand, UErrorCode& status)
}
void DecimalQuantity::divideBy(const DecNum& divisor, UErrorCode& status) {
- if (isInfinite() || isZero() || isNaN()) {
+ if (isZeroish()) {
return;
}
// Convert to DecNum, multiply, and convert back.
@@ -270,7 +284,7 @@ int32_t DecimalQuantity::getUpperDisplayMagnitude() const {
U_ASSERT(!isApproximate);
int32_t magnitude = scale + precision;
- int32_t result = (lReqPos > magnitude) ? lReqPos : (lOptPos < magnitude) ? lOptPos : magnitude;
+ int32_t result = (lReqPos > magnitude) ? lReqPos : magnitude;
return result - 1;
}
@@ -280,7 +294,7 @@ int32_t DecimalQuantity::getLowerDisplayMagnitude() const {
U_ASSERT(!isApproximate);
int32_t magnitude = scale;
- int32_t result = (rReqPos < magnitude) ? rReqPos : (rOptPos > magnitude) ? rOptPos : magnitude;
+ int32_t result = (rReqPos < magnitude) ? rReqPos : magnitude;
return result;
}
@@ -304,8 +318,14 @@ bool DecimalQuantity::isNegative() const {
return (flags & NEGATIVE_FLAG) != 0;
}
-int8_t DecimalQuantity::signum() const {
- return isNegative() ? -1 : isZero() ? 0 : 1;
+Signum DecimalQuantity::signum() const {
+ if (isNegative()) {
+ return SIGNUM_NEG;
+ } else if (isZeroish() && !isInfinite()) {
+ return SIGNUM_ZERO;
+ } else {
+ return SIGNUM_POS;
+ }
}
bool DecimalQuantity::isInfinite() const {
@@ -316,7 +336,7 @@ bool DecimalQuantity::isNaN() const {
return (flags & NAN_FLAG) != 0;
}
-bool DecimalQuantity::isZero() const {
+bool DecimalQuantity::isZeroish() const {
return precision == 0;
}
@@ -501,7 +521,7 @@ int64_t DecimalQuantity::toLong(bool truncateIfOverflow) const {
// if (dq.fitsInLong()) { /* use dq.toLong() */ } else { /* use some fallback */ }
// Fallback behavior upon truncateIfOverflow is to truncate at 17 digits.
uint64_t result = 0L;
- int32_t upperMagnitude = std::min(scale + precision, lOptPos) - 1;
+ int32_t upperMagnitude = scale + precision - 1;
if (truncateIfOverflow) {
upperMagnitude = std::min(upperMagnitude, 17);
}
@@ -517,7 +537,7 @@ int64_t DecimalQuantity::toLong(bool truncateIfOverflow) const {
uint64_t DecimalQuantity::toFractionLong(bool includeTrailingZeros) const {
uint64_t result = 0L;
int32_t magnitude = -1;
- int32_t lowerMagnitude = std::max(scale, rOptPos);
+ int32_t lowerMagnitude = scale;
if (includeTrailingZeros) {
lowerMagnitude = std::min(lowerMagnitude, rReqPos);
}
@@ -534,7 +554,10 @@ uint64_t DecimalQuantity::toFractionLong(bool includeTrailingZeros) const {
}
bool DecimalQuantity::fitsInLong(bool ignoreFraction) const {
- if (isZero()) {
+ if (isInfinite() || isNaN()) {
+ return false;
+ }
+ if (isZeroish()) {
return true;
}
if (scale < 0 && !ignoreFraction) {
@@ -606,36 +629,62 @@ void DecimalQuantity::truncate() {
}
}
+void DecimalQuantity::roundToNickel(int32_t magnitude, RoundingMode roundingMode, UErrorCode& status) {
+ roundToMagnitude(magnitude, roundingMode, true, status);
+}
+
void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingMode, UErrorCode& status) {
+ roundToMagnitude(magnitude, roundingMode, false, status);
+}
+
+void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingMode, bool nickel, UErrorCode& status) {
// The position in the BCD at which rounding will be performed; digits to the right of position
// will be rounded away.
- // TODO: Andy: There was a test failure because of integer overflow here. Should I do
- // "safe subtraction" everywhere in the code? What's the nicest way to do it?
int position = safeSubtract(magnitude, scale);
- if (position <= 0 && !isApproximate) {
+ // "trailing" = least significant digit to the left of rounding
+ int8_t trailingDigit = getDigitPos(position);
+
+ if (position <= 0 && !isApproximate && (!nickel || trailingDigit == 0 || trailingDigit == 5)) {
// All digits are to the left of the rounding magnitude.
} else if (precision == 0) {
// No rounding for zero.
} else {
// Perform rounding logic.
// "leading" = most significant digit to the right of rounding
- // "trailing" = least significant digit to the left of rounding
int8_t leadingDigit = getDigitPos(safeSubtract(position, 1));
- int8_t trailingDigit = getDigitPos(position);
// Compute which section of the number we are in.
// EDGE means we are at the bottom or top edge, like 1.000 or 1.999 (used by doubles)
// LOWER means we are between the bottom edge and the midpoint, like 1.391
// MIDPOINT means we are exactly in the middle, like 1.500
// UPPER means we are between the midpoint and the top edge, like 1.916
- roundingutils::Section section = roundingutils::SECTION_MIDPOINT;
+ roundingutils::Section section;
if (!isApproximate) {
- if (leadingDigit < 5) {
+ if (nickel && trailingDigit != 2 && trailingDigit != 7) {
+ // Nickel rounding, and not at .02x or .07x
+ if (trailingDigit < 2) {
+ // .00, .01 => down to .00
+ section = roundingutils::SECTION_LOWER;
+ } else if (trailingDigit < 5) {
+ // .03, .04 => up to .05
+ section = roundingutils::SECTION_UPPER;
+ } else if (trailingDigit < 7) {
+ // .05, .06 => down to .05
+ section = roundingutils::SECTION_LOWER;
+ } else {
+ // .08, .09 => up to .10
+ section = roundingutils::SECTION_UPPER;
+ }
+ } else if (leadingDigit < 5) {
+ // Includes nickel rounding .020-.024 and .070-.074
section = roundingutils::SECTION_LOWER;
} else if (leadingDigit > 5) {
+ // Includes nickel rounding .026-.029 and .076-.079
section = roundingutils::SECTION_UPPER;
} else {
+ // Includes nickel rounding .025 and .075
+ section = roundingutils::SECTION_MIDPOINT;
for (int p = safeSubtract(position, 2); p >= 0; p--) {
if (getDigitPos(p) != 0) {
section = roundingutils::SECTION_UPPER;
@@ -646,7 +695,7 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM
} else {
int32_t p = safeSubtract(position, 2);
int32_t minP = uprv_max(0, precision - 14);
- if (leadingDigit == 0) {
+ if (leadingDigit == 0 && (!nickel || trailingDigit == 0 || trailingDigit == 5)) {
section = roundingutils::SECTION_LOWER_EDGE;
for (; p >= minP; p--) {
if (getDigitPos(p) != 0) {
@@ -654,21 +703,23 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM
break;
}
}
- } else if (leadingDigit == 4) {
+ } else if (leadingDigit == 4 && (!nickel || trailingDigit == 2 || trailingDigit == 7)) {
+ section = roundingutils::SECTION_MIDPOINT;
for (; p >= minP; p--) {
if (getDigitPos(p) != 9) {
section = roundingutils::SECTION_LOWER;
break;
}
}
- } else if (leadingDigit == 5) {
+ } else if (leadingDigit == 5 && (!nickel || trailingDigit == 2 || trailingDigit == 7)) {
+ section = roundingutils::SECTION_MIDPOINT;
for (; p >= minP; p--) {
if (getDigitPos(p) != 0) {
section = roundingutils::SECTION_UPPER;
break;
}
}
- } else if (leadingDigit == 9) {
+ } else if (leadingDigit == 9 && (!nickel || trailingDigit == 4 || trailingDigit == 9)) {
section = roundingutils::SECTION_UPPER_EDGE;
for (; p >= minP; p--) {
if (getDigitPos(p) != 9) {
@@ -676,9 +727,26 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM
break;
}
}
+ } else if (nickel && trailingDigit != 2 && trailingDigit != 7) {
+ // Nickel rounding, and not at .02x or .07x
+ if (trailingDigit < 2) {
+ // .00, .01 => down to .00
+ section = roundingutils::SECTION_LOWER;
+ } else if (trailingDigit < 5) {
+ // .03, .04 => up to .05
+ section = roundingutils::SECTION_UPPER;
+ } else if (trailingDigit < 7) {
+ // .05, .06 => down to .05
+ section = roundingutils::SECTION_LOWER;
+ } else {
+ // .08, .09 => up to .10
+ section = roundingutils::SECTION_UPPER;
+ }
} else if (leadingDigit < 5) {
+ // Includes nickel rounding .020-.024 and .070-.074
section = roundingutils::SECTION_LOWER;
} else {
+ // Includes nickel rounding .026-.029 and .076-.079
section = roundingutils::SECTION_UPPER;
}
@@ -686,10 +754,10 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM
if (safeSubtract(position, 1) < precision - 14 ||
(roundsAtMidpoint && section == roundingutils::SECTION_MIDPOINT) ||
(!roundsAtMidpoint && section < 0 /* i.e. at upper or lower edge */)) {
- // Oops! This means that we have to get the exact representation of the double, because
- // the zone of uncertainty is along the rounding boundary.
+ // Oops! This means that we have to get the exact representation of the double,
+ // because the zone of uncertainty is along the rounding boundary.
convertToAccurateDouble();
- roundToMagnitude(magnitude, roundingMode, status); // start over
+ roundToMagnitude(magnitude, roundingMode, nickel, status); // start over
return;
}
@@ -698,7 +766,7 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM
origDouble = 0.0;
origDelta = 0;
- if (position <= 0) {
+ if (position <= 0 && (!nickel || trailingDigit == 0 || trailingDigit == 5)) {
// All digits are to the left of the rounding magnitude.
return;
}
@@ -708,7 +776,14 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM
if (section == -2) { section = roundingutils::SECTION_UPPER; }
}
- bool roundDown = roundingutils::getRoundingDirection((trailingDigit % 2) == 0,
+ // Nickel rounding "half even" goes to the nearest whole (away from the 5).
+ bool isEven = nickel
+ ? (trailingDigit < 2 || trailingDigit > 7
+ || (trailingDigit == 2 && section != roundingutils::SECTION_UPPER)
+ || (trailingDigit == 7 && section == roundingutils::SECTION_UPPER))
+ : (trailingDigit % 2) == 0;
+
+ bool roundDown = roundingutils::getRoundingDirection(isEven,
isNegative(),
section,
roundingMode,
@@ -725,12 +800,28 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM
shiftRight(position);
}
+ if (nickel) {
+ if (trailingDigit < 5 && roundDown) {
+ setDigitPos(0, 0);
+ compact();
+ return;
+ } else if (trailingDigit >= 5 && !roundDown) {
+ setDigitPos(0, 9);
+ trailingDigit = 9;
+ // do not return: use the bubbling logic below
+ } else {
+ setDigitPos(0, 5);
+ // compact not necessary: digit at position 0 is nonzero
+ return;
+ }
+ }
+
// Bubble the result to the higher digits
if (!roundDown) {
if (trailingDigit == 9) {
int bubblePos = 0;
- // Note: in the long implementation, the most digits BCD can have at this point is 15,
- // so bubblePos <= 15 and getDigitPos(bubblePos) is safe.
+ // Note: in the long implementation, the most digits BCD can have at this point is
+ // 15, so bubblePos <= 15 and getDigitPos(bubblePos) is safe.
for (; getDigitPos(bubblePos) == 9; bubblePos++) {}
shiftRight(bubblePos); // shift off the trailing 9s
}
@@ -806,10 +897,8 @@ UnicodeString DecimalQuantity::toScientificString() const {
result.append(u"0E+0", -1);
return result;
}
- // NOTE: It is not safe to add to lOptPos (aka maxInt) or subtract from
- // rOptPos (aka -maxFrac) due to overflow.
- int32_t upperPos = std::min(precision + scale, lOptPos) - scale - 1;
- int32_t lowerPos = std::max(scale, rOptPos) - scale;
+ int32_t upperPos = precision - 1;
+ int32_t lowerPos = 0;
int32_t p = upperPos;
result.append(u'0' + getDigitPos(p));
if ((--p) >= lowerPos) {
@@ -820,7 +909,10 @@ UnicodeString DecimalQuantity::toScientificString() const {
}
result.append(u'E');
int32_t _scale = upperPos + scale;
- if (_scale < 0) {
+ if (_scale == INT32_MIN) {
+ result.append({u"-2147483648", -1});
+ return result;
+ } else if (_scale < 0) {
_scale *= -1;
result.append(u'-');
} else {
@@ -904,6 +996,19 @@ void DecimalQuantity::shiftRight(int32_t numDigits) {
precision -= numDigits;
}
+void DecimalQuantity::popFromLeft(int32_t numDigits) {
+ U_ASSERT(numDigits <= precision);
+ if (usingBytes) {
+ int i = precision - 1;
+ for (; i >= precision - numDigits; i--) {
+ fBCD.bcdBytes.ptr[i] = 0;
+ }
+ } else {
+ fBCD.bcdLong &= (static_cast<uint64_t>(1) << ((precision - numDigits) * 4)) - 1;
+ }
+ precision -= numDigits;
+}
+
void DecimalQuantity::setBcdToZero() {
if (usingBytes) {
uprv_free(fBCD.bcdBytes.ptr);
@@ -1158,10 +1263,8 @@ bool DecimalQuantity::operator==(const DecimalQuantity& other) const {
scale == other.scale
&& precision == other.precision
&& flags == other.flags
- && lOptPos == other.lOptPos
&& lReqPos == other.lReqPos
&& rReqPos == other.rReqPos
- && rOptPos == other.rOptPos
&& isApproximate == other.isApproximate;
if (!basicEquals) {
return false;
@@ -1191,11 +1294,9 @@ UnicodeString DecimalQuantity::toString() const {
snprintf(
buffer8,
sizeof(buffer8),
- "<DecimalQuantity %d:%d:%d:%d %s %s%s%s%d>",
- (lOptPos > 999 ? 999 : lOptPos),
+ "<DecimalQuantity %d:%d %s %s%s%s%d>",
lReqPos,
rReqPos,
- (rOptPos < -999 ? -999 : rOptPos),
(usingBytes ? "bytes" : "long"),
(isNegative() ? "-" : ""),
(precision == 0 ? "0" : digits.getAlias()),
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.h b/Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.h
index 8e04dea7eb5..4ec6c5a5b2b 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.h
@@ -53,22 +53,28 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory {
DecimalQuantity &operator=(DecimalQuantity&& src) U_NOEXCEPT;
/**
- * Sets the minimum and maximum integer digits that this {@link DecimalQuantity} should generate.
+ * Sets the minimum integer digits that this {@link DecimalQuantity} should generate.
* This method does not perform rounding.
*
* @param minInt The minimum number of integer digits.
- * @param maxInt The maximum number of integer digits.
*/
- void setIntegerLength(int32_t minInt, int32_t maxInt);
+ void setMinInteger(int32_t minInt);
/**
- * Sets the minimum and maximum fraction digits that this {@link DecimalQuantity} should generate.
+ * Sets the minimum fraction digits that this {@link DecimalQuantity} should generate.
* This method does not perform rounding.
*
* @param minFrac The minimum number of fraction digits.
- * @param maxFrac The maximum number of fraction digits.
*/
- void setFractionLength(int32_t minFrac, int32_t maxFrac);
+ void setMinFraction(int32_t minFrac);
+
+ /**
+ * Truncates digits from the upper magnitude of the number in order to satisfy the
+ * specified maximum number of integer digits.
+ *
+ * @param maxInt The maximum number of integer digits.
+ */
+ void applyMaxInteger(int32_t maxInt);
/**
* Rounds the number to a specified interval, such as 0.05.
@@ -76,20 +82,29 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory {
* <p>If rounding to a power of ten, use the more efficient {@link #roundToMagnitude} instead.
*
* @param roundingIncrement The increment to which to round.
- * @param mathContext The {@link RoundingMode} to use if rounding is necessary.
+ * @param roundingMode The {@link RoundingMode} to use if rounding is necessary.
*/
void roundToIncrement(double roundingIncrement, RoundingMode roundingMode,
- int32_t maxFrac, UErrorCode& status);
+ UErrorCode& status);
/** Removes all fraction digits. */
void truncate();
/**
+ * Rounds the number to the nearest multiple of 5 at the specified magnitude.
+ * For example, when magnitude == -2, this performs rounding to the nearest 0.05.
+ *
+ * @param magnitude The magnitude at which the digit should become either 0 or 5.
+ * @param roundingMode Rounding strategy.
+ */
+ void roundToNickel(int32_t magnitude, RoundingMode roundingMode, UErrorCode& status);
+
+ /**
* Rounds the number to a specified magnitude (power of ten).
*
* @param roundingMagnitude The power of ten to which to round. For example, a value of -2 will
* round to 2 decimal places.
- * @param mathContext The {@link RoundingMode} to use if rounding is necessary.
+ * @param roundingMode The {@link RoundingMode} to use if rounding is necessary.
*/
void roundToMagnitude(int32_t magnitude, RoundingMode roundingMode, UErrorCode& status);
@@ -131,14 +146,17 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory {
*/
int32_t getMagnitude() const;
- /** @return Whether the value represented by this {@link DecimalQuantity} is zero. */
- bool isZero() const;
+ /**
+ * @return Whether the value represented by this {@link DecimalQuantity} is
+ * zero, infinity, or NaN.
+ */
+ bool isZeroish() const;
/** @return Whether the value represented by this {@link DecimalQuantity} is less than zero. */
bool isNegative() const;
- /** @return -1 if the value is negative; 1 if positive; or 0 if zero. */
- int8_t signum() const;
+ /** @return The appropriate value from the Signum enum. */
+ Signum signum() const;
/** @return Whether the value represented by this {@link DecimalQuantity} is infinite. */
bool isInfinite() const U_OVERRIDE;
@@ -260,7 +278,7 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory {
inline bool isUsingBytes() { return usingBytes; }
/** Visible for testing */
- inline bool isExplicitExactDouble() { return explicitExactDouble; };
+ inline bool isExplicitExactDouble() { return explicitExactDouble; }
bool operator==(const DecimalQuantity& other) const;
@@ -327,36 +345,11 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory {
*/
int32_t origDelta;
- // Four positions: left optional '(', left required '[', right required ']', right optional ')'.
- // These four positions determine which digits are displayed in the output string. They do NOT
- // affect rounding. These positions are internal-only and can be specified only by the public
- // endpoints like setFractionLength, setIntegerLength, and setSignificantDigits, among others.
- //
- // * Digits between lReqPos and rReqPos are in the "required zone" and are always displayed.
- // * Digits between lOptPos and rOptPos but outside the required zone are in the "optional zone"
- // and are displayed unless they are trailing off the left or right edge of the number and
- // have a numerical value of zero. In order to be "trailing", the digits need to be beyond
- // the decimal point in their respective directions.
- // * Digits outside of the "optional zone" are never displayed.
- //
- // See the table below for illustrative examples.
- //
- // +---------+---------+---------+---------+------------+------------------------+--------------+
- // | lOptPos | lReqPos | rReqPos | rOptPos | number | positions | en-US string |
- // +---------+---------+---------+---------+------------+------------------------+--------------+
- // | 5 | 2 | -1 | -5 | 1234.567 | ( 12[34.5]67 ) | 1,234.567 |
- // | 3 | 2 | -1 | -5 | 1234.567 | 1(2[34.5]67 ) | 234.567 |
- // | 3 | 2 | -1 | -2 | 1234.567 | 1(2[34.5]6)7 | 234.56 |
- // | 6 | 4 | 2 | -5 | 123456789. | 123(45[67]89. ) | 456,789. |
- // | 6 | 4 | 2 | 1 | 123456789. | 123(45[67]8)9. | 456,780. |
- // | -1 | -1 | -3 | -4 | 0.123456 | 0.1([23]4)56 | .0234 |
- // | 6 | 4 | -2 | -2 | 12.3 | ( [ 12.3 ]) | 0012.30 |
- // +---------+---------+---------+---------+------------+------------------------+--------------+
- //
- int32_t lOptPos = INT32_MAX;
+ // Positions to keep track of leading and trailing zeros.
+ // lReqPos is the magnitude of the first required leading zero.
+ // rReqPos is the magnitude of the last required trailing zero.
int32_t lReqPos = 0;
int32_t rReqPos = 0;
- int32_t rOptPos = INT32_MIN;
/**
* The BCD of the 16 digits of the number represented by this object. Every 4 bits of the long map
@@ -382,6 +375,8 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory {
*/
bool explicitExactDouble = false;
+ void roundToMagnitude(int32_t magnitude, RoundingMode roundingMode, bool nickel, UErrorCode& status);
+
/**
* Returns a single digit from the BCD list. No internal state is changed by calling this method.
*
@@ -410,9 +405,23 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory {
*/
void shiftLeft(int32_t numDigits);
+ /**
+ * Directly removes digits from the end of the BCD list.
+ * Updates the scale and precision.
+ *
+ * CAUTION: it is the caller's responsibility to call {@link #compact} after this method.
+ */
void shiftRight(int32_t numDigits);
/**
+ * Directly removes digits from the front of the BCD list.
+ * Updates precision.
+ *
+ * CAUTION: it is the caller's responsibility to call {@link #compact} after this method.
+ */
+ void popFromLeft(int32_t numDigits);
+
+ /**
* Sets the internal representation to zero. Clears any values stored in scale, precision,
* hasDouble, origDouble, origDelta, and BCD data.
*/
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_decimfmtprops.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_decimfmtprops.cpp
index 12fe7060e2d..30481ce5bf0 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_decimfmtprops.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_decimfmtprops.cpp
@@ -21,6 +21,7 @@ char kRawDefaultProperties[sizeof(DecimalFormatProperties)];
icu::UInitOnce gDefaultPropertiesInitOnce = U_INITONCE_INITIALIZER;
void U_CALLCONV initDefaultProperties(UErrorCode&) {
+ // can't fail, uses placement new into staticly allocated space.
new(kRawDefaultProperties) DecimalFormatProperties(); // set to the default instance
}
@@ -142,4 +143,10 @@ bool DecimalFormatProperties::equalsDefaultExceptFastFormat() const {
return _equals(*reinterpret_cast<DecimalFormatProperties*>(kRawDefaultProperties), true);
}
+const DecimalFormatProperties& DecimalFormatProperties::getDefault() {
+ UErrorCode localStatus = U_ZERO_ERROR;
+ umtx_initOnce(gDefaultPropertiesInitOnce, &initDefaultProperties, localStatus);
+ return *reinterpret_cast<const DecimalFormatProperties*>(kRawDefaultProperties);
+}
+
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_decimfmtprops.h b/Build/source/libs/icu/icu-src/source/i18n/number_decimfmtprops.h
index f288b6e0d97..1ce84d9dc38 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_decimfmtprops.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_decimfmtprops.h
@@ -21,10 +21,16 @@ U_NAMESPACE_BEGIN
// data member of CurrencyPluralInfoWrapper.
// (When building DLLs for Windows this is required.)
#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
+#if defined(_MSC_VER)
// Ignore warning 4661 as LocalPointerBase does not use operator== or operator!=
-#pragma warning(suppress: 4661)
+#pragma warning(push)
+#pragma warning(disable: 4661)
+#endif
template class U_I18N_API LocalPointerBase<CurrencyPluralInfo>;
template class U_I18N_API LocalPointer<CurrencyPluralInfo>;
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif
#endif
namespace number {
@@ -149,6 +155,11 @@ struct U_I18N_API DecimalFormatProperties : public UMemory {
*/
bool equalsDefaultExceptFastFormat() const;
+ /**
+ * Returns the default DecimalFormatProperties instance.
+ */
+ static const DecimalFormatProperties& getDefault();
+
private:
bool _equals(const DecimalFormatProperties& other, bool ignoreForFastFormat) const;
};
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_decnum.h b/Build/source/libs/icu/icu-src/source/i18n/number_decnum.h
index a7793470b55..0c7399dbddd 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_decnum.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_decnum.h
@@ -55,6 +55,8 @@ class U_I18N_API DecNum : public UMemory {
bool isZero() const;
+ void toString(ByteSink& output, UErrorCode& status) const;
+
inline const decNumber* getRawDecNumber() const {
return fData.getAlias();
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_fluent.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_fluent.cpp
index a66e3bd0f23..2dbd2fa6cd5 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_fluent.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_fluent.cpp
@@ -151,7 +151,7 @@ Derived NumberFormatterSettings<Derived>::roundingMode(UNumberFormatRoundingMode
}
template<typename Derived>
-Derived NumberFormatterSettings<Derived>::grouping(UGroupingStrategy strategy) const& {
+Derived NumberFormatterSettings<Derived>::grouping(UNumberGroupingStrategy strategy) const& {
Derived copy(*this);
// NOTE: This is slightly different than how the setting is stored in Java
// because we want to put it on the stack.
@@ -160,7 +160,7 @@ Derived NumberFormatterSettings<Derived>::grouping(UGroupingStrategy strategy) c
}
template<typename Derived>
-Derived NumberFormatterSettings<Derived>::grouping(UGroupingStrategy strategy)&& {
+Derived NumberFormatterSettings<Derived>::grouping(UNumberGroupingStrategy strategy)&& {
Derived move(std::move(*this));
move.fMacros.grouper = Grouper::forStrategy(strategy);
return move;
@@ -322,12 +322,25 @@ Derived NumberFormatterSettings<Derived>::macros(impl::MacroProps&& macros)&& {
template<typename Derived>
UnicodeString NumberFormatterSettings<Derived>::toSkeleton(UErrorCode& status) const {
+ if (U_FAILURE(status)) {
+ return ICU_Utility::makeBogusString();
+ }
if (fMacros.copyErrorTo(status)) {
return ICU_Utility::makeBogusString();
}
return skeleton::generate(fMacros, status);
}
+template<typename Derived>
+LocalPointer<Derived> NumberFormatterSettings<Derived>::clone() const & {
+ return LocalPointer<Derived>(new Derived(*this));
+}
+
+template<typename Derived>
+LocalPointer<Derived> NumberFormatterSettings<Derived>::clone() && {
+ return LocalPointer<Derived>(new Derived(std::move(*this)));
+}
+
// Declare all classes that implement NumberFormatterSettings
// See https://stackoverflow.com/a/495056/1407170
template
@@ -347,7 +360,12 @@ LocalizedNumberFormatter NumberFormatter::withLocale(const Locale& locale) {
UnlocalizedNumberFormatter
NumberFormatter::forSkeleton(const UnicodeString& skeleton, UErrorCode& status) {
- return skeleton::create(skeleton, status);
+ return skeleton::create(skeleton, nullptr, status);
+}
+
+UnlocalizedNumberFormatter
+NumberFormatter::forSkeleton(const UnicodeString& skeleton, UParseError& perror, UErrorCode& status) {
+ return skeleton::create(skeleton, &perror, status);
}
@@ -666,16 +684,20 @@ LocalizedNumberFormatter::formatDecimalQuantity(const DecimalQuantity& dq, UErro
void LocalizedNumberFormatter::formatImpl(impl::UFormattedNumberData* results, UErrorCode& status) const {
if (computeCompiled(status)) {
- fCompiled->format(results->quantity, results->string, status);
+ fCompiled->format(results->quantity, results->getStringRef(), status);
} else {
- NumberFormatterImpl::formatStatic(fMacros, results->quantity, results->string, status);
+ NumberFormatterImpl::formatStatic(fMacros, results->quantity, results->getStringRef(), status);
}
+ if (U_FAILURE(status)) {
+ return;
+ }
+ results->getStringRef().writeTerminator(status);
}
void LocalizedNumberFormatter::getAffixImpl(bool isPrefix, bool isNegative, UnicodeString& result,
UErrorCode& status) const {
- NumberStringBuilder string;
- auto signum = static_cast<int8_t>(isNegative ? -1 : 1);
+ FormattedStringBuilder string;
+ auto signum = static_cast<Signum>(isNegative ? SIGNUM_NEG : SIGNUM_POS);
// Always return affixes for plural form OTHER.
static const StandardPlural::Form plural = StandardPlural::OTHER;
int32_t prefixLength;
@@ -745,122 +767,13 @@ int32_t LocalizedNumberFormatter::getCallCount() const {
}
Format* LocalizedNumberFormatter::toFormat(UErrorCode& status) const {
+ if (U_FAILURE(status)) {
+ return nullptr;
+ }
LocalPointer<LocalizedNumberFormatterAsFormat> retval(
new LocalizedNumberFormatterAsFormat(*this, fMacros.locale), status);
return retval.orphan();
}
-FormattedNumber::FormattedNumber(FormattedNumber&& src) U_NOEXCEPT
- : fResults(src.fResults), fErrorCode(src.fErrorCode) {
- // Disown src.fResults to prevent double-deletion
- src.fResults = nullptr;
- src.fErrorCode = U_INVALID_STATE_ERROR;
-}
-
-FormattedNumber& FormattedNumber::operator=(FormattedNumber&& src) U_NOEXCEPT {
- delete fResults;
- fResults = src.fResults;
- fErrorCode = src.fErrorCode;
- // Disown src.fResults to prevent double-deletion
- src.fResults = nullptr;
- src.fErrorCode = U_INVALID_STATE_ERROR;
- return *this;
-}
-
-UnicodeString FormattedNumber::toString() const {
- UErrorCode localStatus = U_ZERO_ERROR;
- return toString(localStatus);
-}
-
-UnicodeString FormattedNumber::toString(UErrorCode& status) const {
- if (U_FAILURE(status)) {
- return ICU_Utility::makeBogusString();
- }
- if (fResults == nullptr) {
- status = fErrorCode;
- return ICU_Utility::makeBogusString();
- }
- return fResults->string.toUnicodeString();
-}
-
-Appendable& FormattedNumber::appendTo(Appendable& appendable) {
- UErrorCode localStatus = U_ZERO_ERROR;
- return appendTo(appendable, localStatus);
-}
-
-Appendable& FormattedNumber::appendTo(Appendable& appendable, UErrorCode& status) const {
- if (U_FAILURE(status)) {
- return appendable;
- }
- if (fResults == nullptr) {
- status = fErrorCode;
- return appendable;
- }
- appendable.appendString(fResults->string.chars(), fResults->string.length());
- return appendable;
-}
-
-void FormattedNumber::populateFieldPosition(FieldPosition& fieldPosition, UErrorCode& status) {
- if (U_FAILURE(status)) {
- return;
- }
- if (fResults == nullptr) {
- status = fErrorCode;
- return;
- }
- // in case any users were depending on the old behavior:
- fieldPosition.setBeginIndex(0);
- fieldPosition.setEndIndex(0);
- fResults->string.nextFieldPosition(fieldPosition, status);
-}
-
-UBool FormattedNumber::nextFieldPosition(FieldPosition& fieldPosition, UErrorCode& status) const {
- if (U_FAILURE(status)) {
- return FALSE;
- }
- if (fResults == nullptr) {
- status = fErrorCode;
- return FALSE;
- }
- // NOTE: MSVC sometimes complains when implicitly converting between bool and UBool
- return fResults->string.nextFieldPosition(fieldPosition, status) ? TRUE : FALSE;
-}
-
-void FormattedNumber::populateFieldPositionIterator(FieldPositionIterator& iterator, UErrorCode& status) {
- getAllFieldPositions(iterator, status);
-}
-
-void FormattedNumber::getAllFieldPositions(FieldPositionIterator& iterator, UErrorCode& status) const {
- FieldPositionIteratorHandler fpih(&iterator, status);
- getAllFieldPositionsImpl(fpih, status);
-}
-
-void FormattedNumber::getAllFieldPositionsImpl(FieldPositionIteratorHandler& fpih,
- UErrorCode& status) const {
- if (U_FAILURE(status)) {
- return;
- }
- if (fResults == nullptr) {
- status = fErrorCode;
- return;
- }
- fResults->string.getAllFieldPositions(fpih, status);
-}
-
-void FormattedNumber::getDecimalQuantity(DecimalQuantity& output, UErrorCode& status) const {
- if (U_FAILURE(status)) {
- return;
- }
- if (fResults == nullptr) {
- status = fErrorCode;
- return;
- }
- output = fResults->quantity;
-}
-
-FormattedNumber::~FormattedNumber() {
- delete fResults;
-}
-
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_formatimpl.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_formatimpl.cpp
index 60c18ee284e..2e2c4a9620c 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_formatimpl.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_formatimpl.cpp
@@ -72,7 +72,7 @@ NumberFormatterImpl::NumberFormatterImpl(const MacroProps& macros, UErrorCode& s
}
int32_t NumberFormatterImpl::formatStatic(const MacroProps& macros, DecimalQuantity& inValue,
- NumberStringBuilder& outString, UErrorCode& status) {
+ FormattedStringBuilder& outString, UErrorCode& status) {
NumberFormatterImpl impl(macros, false, status);
MicroProps& micros = impl.preProcessUnsafe(inValue, status);
if (U_FAILURE(status)) { return 0; }
@@ -81,9 +81,9 @@ int32_t NumberFormatterImpl::formatStatic(const MacroProps& macros, DecimalQuant
return length;
}
-int32_t NumberFormatterImpl::getPrefixSuffixStatic(const MacroProps& macros, int8_t signum,
+int32_t NumberFormatterImpl::getPrefixSuffixStatic(const MacroProps& macros, Signum signum,
StandardPlural::Form plural,
- NumberStringBuilder& outString, UErrorCode& status) {
+ FormattedStringBuilder& outString, UErrorCode& status) {
NumberFormatterImpl impl(macros, false, status);
return impl.getPrefixSuffixUnsafe(signum, plural, outString, status);
}
@@ -93,7 +93,7 @@ int32_t NumberFormatterImpl::getPrefixSuffixStatic(const MacroProps& macros, int
// The "unsafe" method simply re-uses fMicros, eliminating the extra copy operation.
// See MicroProps::processQuantity() for details.
-int32_t NumberFormatterImpl::format(DecimalQuantity& inValue, NumberStringBuilder& outString,
+int32_t NumberFormatterImpl::format(DecimalQuantity& inValue, FormattedStringBuilder& outString,
UErrorCode& status) const {
MicroProps micros;
preProcess(inValue, micros, status);
@@ -129,8 +129,8 @@ MicroProps& NumberFormatterImpl::preProcessUnsafe(DecimalQuantity& inValue, UErr
return fMicros;
}
-int32_t NumberFormatterImpl::getPrefixSuffix(int8_t signum, StandardPlural::Form plural,
- NumberStringBuilder& outString, UErrorCode& status) const {
+int32_t NumberFormatterImpl::getPrefixSuffix(Signum signum, StandardPlural::Form plural,
+ FormattedStringBuilder& outString, UErrorCode& status) const {
if (U_FAILURE(status)) { return 0; }
// #13453: DecimalFormat wants the affixes from the pattern only (modMiddle, aka pattern modifier).
// Safe path: use fImmutablePatternModifier.
@@ -140,8 +140,8 @@ int32_t NumberFormatterImpl::getPrefixSuffix(int8_t signum, StandardPlural::Form
return modifier->getPrefixLength();
}
-int32_t NumberFormatterImpl::getPrefixSuffixUnsafe(int8_t signum, StandardPlural::Form plural,
- NumberStringBuilder& outString, UErrorCode& status) {
+int32_t NumberFormatterImpl::getPrefixSuffixUnsafe(Signum signum, StandardPlural::Form plural,
+ FormattedStringBuilder& outString, UErrorCode& status) {
if (U_FAILURE(status)) { return 0; }
// #13453: DecimalFormat wants the affixes from the pattern only (modMiddle, aka pattern modifier).
// Unsafe path: use fPatternModifier.
@@ -172,13 +172,12 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe,
// Pre-compute a few values for efficiency.
bool isCurrency = utils::unitIsCurrency(macros.unit);
bool isNoUnit = utils::unitIsNoUnit(macros.unit);
- bool isPercent = isNoUnit && utils::unitIsPercent(macros.unit);
- bool isPermille = isNoUnit && utils::unitIsPermille(macros.unit);
- bool isCldrUnit = !isCurrency && !isNoUnit;
+ bool isPercent = utils::unitIsPercent(macros.unit);
+ bool isPermille = utils::unitIsPermille(macros.unit);
bool isAccounting =
macros.sign == UNUM_SIGN_ACCOUNTING || macros.sign == UNUM_SIGN_ACCOUNTING_ALWAYS ||
macros.sign == UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO;
- CurrencyUnit currency(nullptr, status);
+ CurrencyUnit currency(u"", status);
if (isCurrency) {
currency = CurrencyUnit(macros.unit, status); // Restore CurrencyUnit from MeasureUnit
}
@@ -194,6 +193,8 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe,
if (macros.unitWidth != UNUM_UNIT_WIDTH_COUNT) {
unitWidth = macros.unitWidth;
}
+ bool isCldrUnit = !isCurrency && !isNoUnit &&
+ (unitWidth == UNUM_UNIT_WIDTH_FULL_NAME || !(isPercent || isPermille));
// Select the numbering system.
LocalPointer<const NumberingSystem> nsLocal;
@@ -207,12 +208,19 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe,
nsLocal.adoptInstead(ns);
}
const char* nsName = U_SUCCESS(status) ? ns->getName() : "latn";
+ uprv_strncpy(fMicros.nsName, nsName, 8);
+ fMicros.nsName[8] = 0; // guarantee NUL-terminated
// Resolve the symbols. Do this here because currency may need to customize them.
if (macros.symbols.isDecimalFormatSymbols()) {
fMicros.symbols = macros.symbols.getDecimalFormatSymbols();
} else {
- fMicros.symbols = new DecimalFormatSymbols(macros.locale, *ns, status);
+ auto newSymbols = new DecimalFormatSymbols(macros.locale, *ns, status);
+ if (newSymbols == nullptr) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return nullptr;
+ }
+ fMicros.symbols = newSymbols;
// Give ownership to the NumberFormatterImpl.
fSymbols.adoptInstead(fMicros.symbols);
}
@@ -226,7 +234,11 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe,
if (info.exists) {
pattern = info.pattern;
// It's clunky to clone an object here, but this code is not frequently executed.
- auto* symbols = new DecimalFormatSymbols(*fMicros.symbols);
+ auto symbols = new DecimalFormatSymbols(*fMicros.symbols);
+ if (symbols == nullptr) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return nullptr;
+ }
fMicros.symbols = symbols;
fSymbols.adoptInstead(symbols);
symbols->setSymbol(
@@ -241,7 +253,9 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe,
}
if (pattern == nullptr) {
CldrPatternStyle patternStyle;
- if (isPercent || isPermille) {
+ if (isCldrUnit) {
+ patternStyle = CLDR_PATTERN_STYLE_DECIMAL;
+ } else if (isPercent || isPermille) {
patternStyle = CLDR_PATTERN_STYLE_PERCENT;
} else if (!isCurrency || unitWidth == UNUM_UNIT_WIDTH_FULL_NAME) {
patternStyle = CLDR_PATTERN_STYLE_DECIMAL;
@@ -255,6 +269,10 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe,
pattern = utils::getPatternForStyle(macros.locale, nsName, patternStyle, status);
}
auto patternInfo = new ParsedPatternInfo();
+ if (patternInfo == nullptr) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return nullptr;
+ }
fPatternInfo.adoptInstead(patternInfo);
PatternParser::parseToPatternInfo(UnicodeString(pattern), *patternInfo, status);
@@ -332,7 +350,12 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe,
// Inner modifier (scientific notation)
if (macros.notation.fType == Notation::NTN_SCIENTIFIC) {
- fScientificHandler.adoptInstead(new ScientificHandler(&macros.notation, fMicros.symbols, chain));
+ auto newScientificHandler = new ScientificHandler(&macros.notation, fMicros.symbols, chain);
+ if (newScientificHandler == nullptr) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return nullptr;
+ }
+ fScientificHandler.adoptInstead(newScientificHandler);
chain = fScientificHandler.getAlias();
} else {
// No inner modifier required
@@ -341,10 +364,15 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe,
// Middle modifier (patterns, positive/negative, currency symbols, percent)
auto patternModifier = new MutablePatternModifier(false);
+ if (patternModifier == nullptr) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return nullptr;
+ }
fPatternModifier.adoptInstead(patternModifier);
patternModifier->setPatternInfo(
macros.affixProvider != nullptr ? macros.affixProvider
- : static_cast<const AffixPatternProvider*>(fPatternInfo.getAlias()));
+ : static_cast<const AffixPatternProvider*>(fPatternInfo.getAlias()),
+ UNUM_FIELD_COUNT);
patternModifier->setPatternAttributes(fMicros.sign, isPermille);
if (patternModifier->needsPlurals()) {
patternModifier->setSymbols(
@@ -395,16 +423,20 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe,
if (macros.notation.fType == Notation::NTN_COMPACT) {
CompactType compactType = (isCurrency && unitWidth != UNUM_UNIT_WIDTH_FULL_NAME)
? CompactType::TYPE_CURRENCY : CompactType::TYPE_DECIMAL;
- fCompactHandler.adoptInstead(
- new CompactHandler(
- macros.notation.fUnion.compactStyle,
- macros.locale,
- nsName,
- compactType,
- resolvePluralRules(macros.rules, macros.locale, status),
- safe ? patternModifier : nullptr,
- chain,
- status));
+ auto newCompactHandler = new CompactHandler(
+ macros.notation.fUnion.compactStyle,
+ macros.locale,
+ nsName,
+ compactType,
+ resolvePluralRules(macros.rules, macros.locale, status),
+ safe ? patternModifier : nullptr,
+ chain,
+ status);
+ if (newCompactHandler == nullptr) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return nullptr;
+ }
+ fCompactHandler.adoptInstead(newCompactHandler);
chain = fCompactHandler.getAlias();
}
@@ -424,7 +456,7 @@ NumberFormatterImpl::resolvePluralRules(const PluralRules* rulesPtr, const Local
return fRules.getAlias();
}
-int32_t NumberFormatterImpl::writeAffixes(const MicroProps& micros, NumberStringBuilder& string,
+int32_t NumberFormatterImpl::writeAffixes(const MicroProps& micros, FormattedStringBuilder& string,
int32_t start, int32_t end, UErrorCode& status) {
// Always apply the inner modifier (which is "strong").
int32_t length = micros.modInner->apply(string, start, end, status);
@@ -439,7 +471,7 @@ int32_t NumberFormatterImpl::writeAffixes(const MicroProps& micros, NumberString
}
int32_t NumberFormatterImpl::writeNumber(const MicroProps& micros, DecimalQuantity& quantity,
- NumberStringBuilder& string, int32_t index,
+ FormattedStringBuilder& string, int32_t index,
UErrorCode& status) {
int32_t length = 0;
if (quantity.isInfinite()) {
@@ -481,7 +513,7 @@ int32_t NumberFormatterImpl::writeNumber(const MicroProps& micros, DecimalQuanti
}
int32_t NumberFormatterImpl::writeIntegerDigits(const MicroProps& micros, DecimalQuantity& quantity,
- NumberStringBuilder& string, int32_t index,
+ FormattedStringBuilder& string, int32_t index,
UErrorCode& status) {
int length = 0;
int integerCount = quantity.getUpperDisplayMagnitude() + 1;
@@ -507,7 +539,7 @@ int32_t NumberFormatterImpl::writeIntegerDigits(const MicroProps& micros, Decima
}
int32_t NumberFormatterImpl::writeFractionDigits(const MicroProps& micros, DecimalQuantity& quantity,
- NumberStringBuilder& string, int32_t index,
+ FormattedStringBuilder& string, int32_t index,
UErrorCode& status) {
int length = 0;
int fractionCount = -quantity.getLowerDisplayMagnitude();
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_formatimpl.h b/Build/source/libs/icu/icu-src/source/i18n/number_formatimpl.h
index fda38c92845..206c5f58c57 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_formatimpl.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_formatimpl.h
@@ -8,7 +8,7 @@
#define __NUMBER_FORMATIMPL_H__
#include "number_types.h"
-#include "number_stringbuilder.h"
+#include "formatted_string_builder.h"
#include "number_patternstring.h"
#include "number_utils.h"
#include "number_patternmodifier.h"
@@ -35,7 +35,7 @@ class NumberFormatterImpl : public UMemory {
* Builds and evaluates an "unsafe" MicroPropsGenerator, which is cheaper but can be used only once.
*/
static int32_t
- formatStatic(const MacroProps &macros, DecimalQuantity &inValue, NumberStringBuilder &outString,
+ formatStatic(const MacroProps &macros, DecimalQuantity &inValue, FormattedStringBuilder &outString,
UErrorCode &status);
/**
@@ -44,14 +44,14 @@ class NumberFormatterImpl : public UMemory {
* @return The index into the output at which the prefix ends and the suffix starts; in other words,
* the prefix length.
*/
- static int32_t getPrefixSuffixStatic(const MacroProps& macros, int8_t signum,
- StandardPlural::Form plural, NumberStringBuilder& outString,
+ static int32_t getPrefixSuffixStatic(const MacroProps& macros, Signum signum,
+ StandardPlural::Form plural, FormattedStringBuilder& outString,
UErrorCode& status);
/**
* Evaluates the "safe" MicroPropsGenerator created by "fromMacros".
*/
- int32_t format(DecimalQuantity& inValue, NumberStringBuilder& outString, UErrorCode& status) const;
+ int32_t format(DecimalQuantity& inValue, FormattedStringBuilder& outString, UErrorCode& status) const;
/**
* Like format(), but saves the result into an output MicroProps without additional processing.
@@ -61,20 +61,24 @@ class NumberFormatterImpl : public UMemory {
/**
* Like getPrefixSuffixStatic() but uses the safe compiled object.
*/
- int32_t getPrefixSuffix(int8_t signum, StandardPlural::Form plural, NumberStringBuilder& outString,
+ int32_t getPrefixSuffix(Signum signum, StandardPlural::Form plural, FormattedStringBuilder& outString,
UErrorCode& status) const;
+ const MicroProps& getRawMicroProps() const {
+ return fMicros;
+ }
+
/**
* Synthesizes the output string from a MicroProps and DecimalQuantity.
* This method formats only the main number, not affixes.
*/
static int32_t writeNumber(const MicroProps& micros, DecimalQuantity& quantity,
- NumberStringBuilder& string, int32_t index, UErrorCode& status);
+ FormattedStringBuilder& string, int32_t index, UErrorCode& status);
/**
* Adds the affixes. Intended to be called immediately after formatNumber.
*/
- static int32_t writeAffixes(const MicroProps& micros, NumberStringBuilder& string, int32_t start,
+ static int32_t writeAffixes(const MicroProps& micros, FormattedStringBuilder& string, int32_t start,
int32_t end, UErrorCode& status);
private:
@@ -105,8 +109,8 @@ class NumberFormatterImpl : public UMemory {
MicroProps& preProcessUnsafe(DecimalQuantity &inValue, UErrorCode &status);
- int32_t getPrefixSuffixUnsafe(int8_t signum, StandardPlural::Form plural,
- NumberStringBuilder& outString, UErrorCode& status);
+ int32_t getPrefixSuffixUnsafe(Signum signum, StandardPlural::Form plural,
+ FormattedStringBuilder& outString, UErrorCode& status);
/**
* If rulesPtr is non-null, return it. Otherwise, return a PluralRules owned by this object for the
@@ -132,11 +136,11 @@ class NumberFormatterImpl : public UMemory {
macrosToMicroGenerator(const MacroProps &macros, bool safe, UErrorCode &status);
static int32_t
- writeIntegerDigits(const MicroProps &micros, DecimalQuantity &quantity, NumberStringBuilder &string,
+ writeIntegerDigits(const MicroProps &micros, DecimalQuantity &quantity, FormattedStringBuilder &string,
int32_t index, UErrorCode &status);
static int32_t
- writeFractionDigits(const MicroProps &micros, DecimalQuantity &quantity, NumberStringBuilder &string,
+ writeFractionDigits(const MicroProps &micros, DecimalQuantity &quantity, FormattedStringBuilder &string,
int32_t index, UErrorCode &status);
};
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_grouping.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_grouping.cpp
index da32cca99a3..41f727a458f 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_grouping.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_grouping.cpp
@@ -34,7 +34,7 @@ int16_t getMinGroupingForLocale(const Locale& locale) {
}
-Grouper Grouper::forStrategy(UGroupingStrategy grouping) {
+Grouper Grouper::forStrategy(UNumberGroupingStrategy grouping) {
switch (grouping) {
case UNUM_GROUPING_OFF:
return {-1, -1, -2, grouping};
@@ -47,8 +47,7 @@ Grouper Grouper::forStrategy(UGroupingStrategy grouping) {
case UNUM_GROUPING_THOUSANDS:
return {3, 3, 1, grouping};
default:
- U_ASSERT(FALSE);
- return {}; // return a value: silence compiler warning
+ UPRV_UNREACHABLE;
}
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_integerwidth.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_integerwidth.cpp
index 6416b292982..d62aef444dc 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_integerwidth.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_integerwidth.cpp
@@ -43,14 +43,15 @@ void IntegerWidth::apply(impl::DecimalQuantity& quantity, UErrorCode& status) co
if (fHasError) {
status = U_ILLEGAL_ARGUMENT_ERROR;
} else if (fUnion.minMaxInt.fMaxInt == -1) {
- quantity.setIntegerLength(fUnion.minMaxInt.fMinInt, INT32_MAX);
+ quantity.setMinInteger(fUnion.minMaxInt.fMinInt);
} else {
// Enforce the backwards-compatibility feature "FormatFailIfMoreThanMaxDigits"
if (fUnion.minMaxInt.fFormatFailIfMoreThanMaxDigits &&
fUnion.minMaxInt.fMaxInt < quantity.getMagnitude()) {
status = U_ILLEGAL_ARGUMENT_ERROR;
}
- quantity.setIntegerLength(fUnion.minMaxInt.fMinInt, fUnion.minMaxInt.fMaxInt);
+ quantity.setMinInteger(fUnion.minMaxInt.fMinInt);
+ quantity.applyMaxInteger(fUnion.minMaxInt.fMaxInt);
}
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_longnames.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_longnames.cpp
index fd8e8d381a1..817aa0e0d9c 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_longnames.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_longnames.cpp
@@ -14,6 +14,7 @@
#include "number_microprops.h"
#include <algorithm>
#include "cstring.h"
+#include "util.h"
using namespace icu;
using namespace icu::number;
@@ -91,6 +92,17 @@ void getMeasureData(const Locale &locale, const MeasureUnit &unit, const UNumber
PluralTableSink sink(outArray);
LocalUResourceBundlePointer unitsBundle(ures_open(U_ICUDATA_UNIT, locale.getName(), &status));
if (U_FAILURE(status)) { return; }
+
+ // Map duration-year-person, duration-week-person, etc. to duration-year, duration-week, ...
+ // TODO(ICU-20400): Get duration-*-person data properly with aliases.
+ StringPiece subtypeForResource;
+ int32_t subtypeLen = static_cast<int32_t>(uprv_strlen(unit.getSubtype()));
+ if (subtypeLen > 7 && uprv_strcmp(unit.getSubtype() + subtypeLen - 7, "-person") == 0) {
+ subtypeForResource = {unit.getSubtype(), subtypeLen - 7};
+ } else {
+ subtypeForResource = unit.getSubtype();
+ }
+
CharString key;
key.append("units", status);
if (width == UNUM_UNIT_WIDTH_NARROW) {
@@ -101,7 +113,24 @@ void getMeasureData(const Locale &locale, const MeasureUnit &unit, const UNumber
key.append("/", status);
key.append(unit.getType(), status);
key.append("/", status);
- key.append(unit.getSubtype(), status);
+ key.append(subtypeForResource, status);
+
+ UErrorCode localStatus = U_ZERO_ERROR;
+ ures_getAllItemsWithFallback(unitsBundle.getAlias(), key.data(), sink, localStatus);
+ if (width == UNUM_UNIT_WIDTH_SHORT) {
+ if (U_FAILURE(localStatus)) {
+ status = localStatus;
+ }
+ return;
+ }
+
+ // TODO(ICU-13353): The fallback to short does not work in ICU4C.
+ // Manually fall back to short (this is done automatically in Java).
+ key.clear();
+ key.append("unitsShort/", status);
+ key.append(unit.getType(), status);
+ key.append("/", status);
+ key.append(subtypeForResource, status);
ures_getAllItemsWithFallback(unitsBundle.getAlias(), key.data(), sink, status);
}
@@ -119,12 +148,11 @@ void getCurrencyLongNameData(const Locale &locale, const CurrencyUnit &currency,
if (pattern.isBogus()) {
continue;
}
- UBool isChoiceFormat = FALSE;
int32_t longNameLen = 0;
const char16_t *longName = ucurr_getPluralName(
currency.getISOCurrency(),
locale.getName(),
- &isChoiceFormat,
+ nullptr /* isChoiceFormat */,
StandardPlural::getKeyword(static_cast<StandardPlural::Form>(i)),
&longNameLen,
&status);
@@ -181,8 +209,7 @@ LongNameHandler::forMeasureUnit(const Locale &loc, const MeasureUnit &unitRef, c
UnicodeString simpleFormats[ARRAY_LENGTH];
getMeasureData(loc, unit, width, simpleFormats, status);
if (U_FAILURE(status)) { return result; }
- // TODO: What field to use for units?
- result->simpleFormatsToModifiers(simpleFormats, UNUM_FIELD_COUNT, status);
+ result->simpleFormatsToModifiers(simpleFormats, UNUM_MEASURE_UNIT_FIELD, status);
return result;
}
@@ -220,11 +247,43 @@ LongNameHandler::forCompoundUnit(const Locale &loc, const MeasureUnit &unit, con
compiled.format(UnicodeString(u"{0}"), secondaryString, perUnitFormat, status);
if (U_FAILURE(status)) { return result; }
}
- // TODO: What field to use for units?
- result->multiSimpleFormatsToModifiers(primaryData, perUnitFormat, UNUM_FIELD_COUNT, status);
+ result->multiSimpleFormatsToModifiers(primaryData, perUnitFormat, UNUM_MEASURE_UNIT_FIELD, status);
return result;
}
+UnicodeString LongNameHandler::getUnitDisplayName(
+ const Locale& loc,
+ const MeasureUnit& unit,
+ UNumberUnitWidth width,
+ UErrorCode& status) {
+ if (U_FAILURE(status)) {
+ return ICU_Utility::makeBogusString();
+ }
+ UnicodeString simpleFormats[ARRAY_LENGTH];
+ getMeasureData(loc, unit, width, simpleFormats, status);
+ return simpleFormats[DNAM_INDEX];
+}
+
+UnicodeString LongNameHandler::getUnitPattern(
+ const Locale& loc,
+ const MeasureUnit& unit,
+ UNumberUnitWidth width,
+ StandardPlural::Form pluralForm,
+ UErrorCode& status) {
+ if (U_FAILURE(status)) {
+ return ICU_Utility::makeBogusString();
+ }
+ UnicodeString simpleFormats[ARRAY_LENGTH];
+ getMeasureData(loc, unit, width, simpleFormats, status);
+ // The above already handles fallback from other widths to short
+ if (U_FAILURE(status)) {
+ return ICU_Utility::makeBogusString();
+ }
+ // Now handle fallback from other plural forms to OTHER
+ return (!(simpleFormats[pluralForm]).isBogus())? simpleFormats[pluralForm]:
+ simpleFormats[StandardPlural::Form::OTHER];
+}
+
LongNameHandler* LongNameHandler::forCurrencyLongNames(const Locale &loc, const CurrencyUnit &currency,
const PluralRules *rules,
const MicroPropsGenerator *parent,
@@ -249,7 +308,7 @@ void LongNameHandler::simpleFormatsToModifiers(const UnicodeString *simpleFormat
if (U_FAILURE(status)) { return; }
SimpleFormatter compiledFormatter(simpleFormat, 0, 1, status);
if (U_FAILURE(status)) { return; }
- fModifiers[i] = SimpleModifier(compiledFormatter, field, false, {this, 0, plural});
+ fModifiers[i] = SimpleModifier(compiledFormatter, field, false, {this, SIGNUM_ZERO, plural});
}
}
@@ -266,20 +325,18 @@ void LongNameHandler::multiSimpleFormatsToModifiers(const UnicodeString *leadFor
if (U_FAILURE(status)) { return; }
SimpleFormatter compoundCompiled(compoundFormat, 0, 1, status);
if (U_FAILURE(status)) { return; }
- fModifiers[i] = SimpleModifier(compoundCompiled, field, false, {this, 0, plural});
+ fModifiers[i] = SimpleModifier(compoundCompiled, field, false, {this, SIGNUM_ZERO, plural});
}
}
void LongNameHandler::processQuantity(DecimalQuantity &quantity, MicroProps &micros,
UErrorCode &status) const {
parent->processQuantity(quantity, micros, status);
- // TODO: Avoid the copy here?
- DecimalQuantity copy(quantity);
- micros.rounder.apply(copy, status);
- micros.modOuter = &fModifiers[utils::getStandardPlural(rules, copy)];
+ StandardPlural::Form pluralForm = utils::getPluralSafe(micros.rounder, rules, quantity, status);
+ micros.modOuter = &fModifiers[pluralForm];
}
-const Modifier* LongNameHandler::getModifier(int8_t /*signum*/, StandardPlural::Form plural) const {
+const Modifier* LongNameHandler::getModifier(Signum /*signum*/, StandardPlural::Form plural) const {
return &fModifiers[plural];
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_longnames.h b/Build/source/libs/icu/icu-src/source/i18n/number_longnames.h
index a71d0caadf1..a19425aa268 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_longnames.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_longnames.h
@@ -16,6 +16,19 @@ namespace impl {
class LongNameHandler : public MicroPropsGenerator, public ModifierStore, public UMemory {
public:
+ static UnicodeString getUnitDisplayName(
+ const Locale& loc,
+ const MeasureUnit& unit,
+ UNumberUnitWidth width,
+ UErrorCode& status);
+
+ static UnicodeString getUnitPattern(
+ const Locale& loc,
+ const MeasureUnit& unit,
+ UNumberUnitWidth width,
+ StandardPlural::Form pluralForm,
+ UErrorCode& status);
+
static LongNameHandler*
forCurrencyLongNames(const Locale &loc, const CurrencyUnit &currency, const PluralRules *rules,
const MicroPropsGenerator *parent, UErrorCode &status);
@@ -28,7 +41,7 @@ class LongNameHandler : public MicroPropsGenerator, public ModifierStore, public
void
processQuantity(DecimalQuantity &quantity, MicroProps &micros, UErrorCode &status) const U_OVERRIDE;
- const Modifier* getModifier(int8_t signum, StandardPlural::Form plural) const U_OVERRIDE;
+ const Modifier* getModifier(Signum signum, StandardPlural::Form plural) const U_OVERRIDE;
private:
SimpleModifier fModifiers[StandardPlural::Form::COUNT];
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_mapper.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_mapper.cpp
index 2c9a8e5178f..40fd5284b86 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_mapper.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_mapper.cpp
@@ -80,8 +80,10 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert
///////////
bool useCurrency = (
- !properties.currency.isNull() || !properties.currencyPluralInfo.fPtr.isNull() ||
- !properties.currencyUsage.isNull() || affixProvider->hasCurrencySign());
+ !properties.currency.isNull() ||
+ !properties.currencyPluralInfo.fPtr.isNull() ||
+ !properties.currencyUsage.isNull() ||
+ affixProvider->hasCurrencySign());
CurrencyUnit currency = resolveCurrency(properties, locale, status);
UCurrencyUsage currencyUsage = properties.currencyUsage.getOrDefault(UCURR_USAGE_STANDARD);
if (useCurrency) {
@@ -141,7 +143,11 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert
if (!properties.currencyUsage.isNull()) {
precision = Precision::constructCurrency(currencyUsage).withCurrency(currency);
} else if (roundingIncrement != 0.0) {
- precision = Precision::constructIncrement(roundingIncrement, minFrac);
+ if (PatternStringUtils::ignoreRoundingIncrement(roundingIncrement, maxFrac)) {
+ precision = Precision::constructFraction(minFrac, maxFrac);
+ } else {
+ precision = Precision::constructIncrement(roundingIncrement, minFrac);
+ }
} else if (explicitMinMaxSig) {
minSig = minSig < 1 ? 1 : minSig > kMaxIntFracSig ? kMaxIntFracSig : minSig;
maxSig = maxSig < 0 ? kMaxIntFracSig : maxSig < minSig ? minSig : maxSig > kMaxIntFracSig
@@ -153,7 +159,7 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert
precision = Precision::constructCurrency(currencyUsage);
}
if (!precision.isBogus()) {
- precision = precision.withMode(roundingMode);
+ precision.fRoundingMode = roundingMode;
macros.precision = precision;
}
@@ -176,7 +182,7 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert
// PADDING //
/////////////
- if (properties.formatWidth != -1) {
+ if (properties.formatWidth > 0) {
macros.padder = Padder::forProperties(properties);
}
@@ -232,10 +238,10 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert
int maxFrac_ = properties.maximumFractionDigits;
if (minInt_ == 0 && maxFrac_ == 0) {
// Patterns like "#E0" and "##E0", which mean no rounding!
- macros.precision = Precision::unlimited().withMode(roundingMode);
+ macros.precision = Precision::unlimited();
} else if (minInt_ == 0 && minFrac_ == 0) {
// Patterns like "#.##E0" (no zeros in the mantissa), which mean round to maxFrac+1
- macros.precision = Precision::constructSignificant(1, maxFrac_ + 1).withMode(roundingMode);
+ macros.precision = Precision::constructSignificant(1, maxFrac_ + 1);
} else {
int maxSig_ = minInt_ + maxFrac_;
// Bug #20058: if maxInt_ > minInt_ > 1, then minInt_ should be 1.
@@ -245,8 +251,9 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert
int minSig_ = minInt_ + minFrac_;
// To avoid regression, maxSig is not reset when minInt_ set to 1.
// TODO: Reset maxSig_ = 1 + minFrac_ to follow the spec.
- macros.precision = Precision::constructSignificant(minSig_, maxSig_).withMode(roundingMode);
+ macros.precision = Precision::constructSignificant(minSig_, maxSig_);
}
+ macros.precision.fRoundingMode = roundingMode;
}
}
@@ -295,7 +302,9 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert
if (rounding_.fType == Precision::PrecisionType::RND_FRACTION) {
minFrac_ = rounding_.fUnion.fracSig.fMinFrac;
maxFrac_ = rounding_.fUnion.fracSig.fMaxFrac;
- } else if (rounding_.fType == Precision::PrecisionType::RND_INCREMENT) {
+ } else if (rounding_.fType == Precision::PrecisionType::RND_INCREMENT
+ || rounding_.fType == Precision::PrecisionType::RND_INCREMENT_ONE
+ || rounding_.fType == Precision::PrecisionType::RND_INCREMENT_FIVE) {
increment_ = rounding_.fUnion.increment.fIncrement;
minFrac_ = rounding_.fUnion.increment.fMinFrac;
maxFrac_ = rounding_.fUnion.increment.fMinFrac;
@@ -315,7 +324,7 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert
}
-void PropertiesAffixPatternProvider::setTo(const DecimalFormatProperties& properties, UErrorCode&) {
+void PropertiesAffixPatternProvider::setTo(const DecimalFormatProperties& properties, UErrorCode& status) {
fBogus = false;
// There are two ways to set affixes in DecimalFormat: via the pattern string (applyPattern), and via the
@@ -325,9 +334,7 @@ void PropertiesAffixPatternProvider::setTo(const DecimalFormatProperties& proper
// 2) Otherwise, follows UTS 35 rules based on the pattern string.
//
// Importantly, the explicit setters affect only the one field they override. If you set the positive
- // prefix, that should not affect the negative prefix. Since it is impossible for the user of this class
- // to know whether the origin for a string was the override or the pattern, we have to say that we always
- // have a negative subpattern and perform all resolution logic here.
+ // prefix, that should not affect the negative prefix.
// Convenience: Extract the properties into local variables.
// Variables are named with three chars: [p/n][p/s][o/p]
@@ -379,6 +386,14 @@ void PropertiesAffixPatternProvider::setTo(const DecimalFormatProperties& proper
// UTS 35: Default negative prefix is the positive prefix.
negSuffix = psp.isBogus() ? u"" : psp;
}
+
+ // For declaring if this is a currency pattern, we need to look at the
+ // original pattern, not at any user-specified overrides.
+ isCurrencyPattern = (
+ AffixUtils::hasCurrencySymbols(ppp, status) ||
+ AffixUtils::hasCurrencySymbols(psp, status) ||
+ AffixUtils::hasCurrencySymbols(npp, status) ||
+ AffixUtils::hasCurrencySymbols(nsp, status));
}
char16_t PropertiesAffixPatternProvider::charAt(int flags, int i) const {
@@ -415,8 +430,11 @@ bool PropertiesAffixPatternProvider::positiveHasPlusSign() const {
}
bool PropertiesAffixPatternProvider::hasNegativeSubpattern() const {
- // See comments in the constructor for more information on why this is always true.
- return true;
+ return (
+ (negSuffix != posSuffix) ||
+ negPrefix.tempSubString(1) != posPrefix ||
+ negPrefix.charAt(0) != u'-'
+ );
}
bool PropertiesAffixPatternProvider::negativeHasMinusSign() const {
@@ -426,11 +444,7 @@ bool PropertiesAffixPatternProvider::negativeHasMinusSign() const {
}
bool PropertiesAffixPatternProvider::hasCurrencySign() const {
- ErrorCode localStatus;
- return AffixUtils::hasCurrencySymbols(posPrefix, localStatus) ||
- AffixUtils::hasCurrencySymbols(posSuffix, localStatus) ||
- AffixUtils::hasCurrencySymbols(negPrefix, localStatus) ||
- AffixUtils::hasCurrencySymbols(negSuffix, localStatus);
+ return isCurrencyPattern;
}
bool PropertiesAffixPatternProvider::containsSymbolType(AffixPatternType type, UErrorCode& status) const {
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_mapper.h b/Build/source/libs/icu/icu-src/source/i18n/number_mapper.h
index 82c5711c8d0..de7d9c3865c 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_mapper.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_mapper.h
@@ -63,6 +63,7 @@ class PropertiesAffixPatternProvider : public AffixPatternProvider, public UMemo
UnicodeString posSuffix;
UnicodeString negPrefix;
UnicodeString negSuffix;
+ bool isCurrencyPattern;
const UnicodeString& getStringInternal(int32_t flags) const;
@@ -125,8 +126,14 @@ struct DecimalFormatWarehouse {
* TODO: Make some of these fields by value instead of by LocalPointer?
*/
struct DecimalFormatFields : public UMemory {
+
+ DecimalFormatFields() {}
+
+ DecimalFormatFields(const DecimalFormatProperties& propsToCopy)
+ : properties(propsToCopy) {}
+
/** The property bag corresponding to user-specified settings and settings from the pattern string. */
- LocalPointer<DecimalFormatProperties> properties;
+ DecimalFormatProperties properties;
/** The symbols for the current locale. */
LocalPointer<const DecimalFormatSymbols> symbols;
@@ -135,7 +142,7 @@ struct DecimalFormatFields : public UMemory {
* The pre-computed formatter object. Setters cause this to be re-computed atomically. The {@link
* #format} method uses the formatter directly without needing to synchronize.
*/
- LocalPointer<const LocalizedNumberFormatter> formatter;
+ LocalizedNumberFormatter formatter;
/** The lazy-computed parser for .parse() */
std::atomic<::icu::numparse::impl::NumberParserImpl*> atomicParser = {};
@@ -147,7 +154,7 @@ struct DecimalFormatFields : public UMemory {
DecimalFormatWarehouse warehouse;
/** The effective properties as exported from the formatter object. Used by some getters. */
- LocalPointer<DecimalFormatProperties> exportedProperties;
+ DecimalFormatProperties exportedProperties;
// Data for fastpath
bool canUseFastFormat = false;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_microprops.h b/Build/source/libs/icu/icu-src/source/i18n/number_microprops.h
index daa887bb0dd..d2393aea50c 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_microprops.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_microprops.h
@@ -32,6 +32,7 @@ struct MicroProps : public MicroPropsGenerator {
UNumberSignDisplay sign;
UNumberDecimalSeparatorDisplay decimal;
bool useCurrency;
+ char nsName[9];
// Note: This struct has no direct ownership of the following pointers.
const DecimalFormatSymbols* symbols;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_modifiers.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_modifiers.cpp
index d92ec63b08d..3a44f8f6f15 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_modifiers.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_modifiers.cpp
@@ -57,7 +57,7 @@ Modifier::Parameters::Parameters()
: obj(nullptr) {}
Modifier::Parameters::Parameters(
- const ModifierStore* _obj, int8_t _signum, StandardPlural::Form _plural)
+ const ModifierStore* _obj, Signum _signum, StandardPlural::Form _plural)
: obj(_obj), signum(_signum), plural(_plural) {}
ModifierStore::~ModifierStore() = default;
@@ -69,7 +69,7 @@ AdoptingModifierStore::~AdoptingModifierStore() {
}
-int32_t ConstantAffixModifier::apply(NumberStringBuilder &output, int leftIndex, int rightIndex,
+int32_t ConstantAffixModifier::apply(FormattedStringBuilder &output, int leftIndex, int rightIndex,
UErrorCode &status) const {
// Insert the suffix first since inserting the prefix will change the rightIndex
int length = output.insert(rightIndex, fSuffix, fField, status);
@@ -92,14 +92,13 @@ bool ConstantAffixModifier::isStrong() const {
bool ConstantAffixModifier::containsField(UNumberFormatFields field) const {
(void)field;
// This method is not currently used.
- U_ASSERT(false);
- return false;
+ UPRV_UNREACHABLE;
}
void ConstantAffixModifier::getParameters(Parameters& output) const {
(void)output;
// This method is not currently used.
- U_ASSERT(false);
+ UPRV_UNREACHABLE;
}
bool ConstantAffixModifier::semanticallyEquivalent(const Modifier& other) const {
@@ -155,9 +154,9 @@ SimpleModifier::SimpleModifier()
: fField(UNUM_FIELD_COUNT), fStrong(false), fPrefixLength(0), fSuffixLength(0) {
}
-int32_t SimpleModifier::apply(NumberStringBuilder &output, int leftIndex, int rightIndex,
+int32_t SimpleModifier::apply(FormattedStringBuilder &output, int leftIndex, int rightIndex,
UErrorCode &status) const {
- return formatAsPrefixSuffix(output, leftIndex, rightIndex, fField, status);
+ return formatAsPrefixSuffix(output, leftIndex, rightIndex, status);
}
int32_t SimpleModifier::getPrefixLength() const {
@@ -182,8 +181,7 @@ bool SimpleModifier::isStrong() const {
bool SimpleModifier::containsField(UNumberFormatFields field) const {
(void)field;
// This method is not currently used.
- U_ASSERT(false);
- return false;
+ UPRV_UNREACHABLE;
}
void SimpleModifier::getParameters(Parameters& output) const {
@@ -205,14 +203,14 @@ bool SimpleModifier::semanticallyEquivalent(const Modifier& other) const {
int32_t
-SimpleModifier::formatAsPrefixSuffix(NumberStringBuilder &result, int32_t startIndex, int32_t endIndex,
- Field field, UErrorCode &status) const {
+SimpleModifier::formatAsPrefixSuffix(FormattedStringBuilder &result, int32_t startIndex, int32_t endIndex,
+ UErrorCode &status) const {
if (fSuffixOffset == -1 && fPrefixLength + fSuffixLength > 0) {
// There is no argument for the inner number; overwrite the entire segment with our string.
- return result.splice(startIndex, endIndex, fCompiledPattern, 2, 2 + fPrefixLength, field, status);
+ return result.splice(startIndex, endIndex, fCompiledPattern, 2, 2 + fPrefixLength, fField, status);
} else {
if (fPrefixLength > 0) {
- result.insert(startIndex, fCompiledPattern, 2, 2 + fPrefixLength, field, status);
+ result.insert(startIndex, fCompiledPattern, 2, 2 + fPrefixLength, fField, status);
}
if (fSuffixLength > 0) {
result.insert(
@@ -220,7 +218,7 @@ SimpleModifier::formatAsPrefixSuffix(NumberStringBuilder &result, int32_t startI
fCompiledPattern,
1 + fSuffixOffset,
1 + fSuffixOffset + fSuffixLength,
- field,
+ fField,
status);
}
return fPrefixLength + fSuffixLength;
@@ -229,7 +227,7 @@ SimpleModifier::formatAsPrefixSuffix(NumberStringBuilder &result, int32_t startI
int32_t
-SimpleModifier::formatTwoArgPattern(const SimpleFormatter& compiled, NumberStringBuilder& result,
+SimpleModifier::formatTwoArgPattern(const SimpleFormatter& compiled, FormattedStringBuilder& result,
int32_t index, int32_t* outPrefixLength, int32_t* outSuffixLength,
Field field, UErrorCode& status) {
const UnicodeString& compiledPattern = compiled.compiledPattern;
@@ -286,7 +284,7 @@ SimpleModifier::formatTwoArgPattern(const SimpleFormatter& compiled, NumberStrin
}
-int32_t ConstantMultiFieldModifier::apply(NumberStringBuilder &output, int leftIndex, int rightIndex,
+int32_t ConstantMultiFieldModifier::apply(FormattedStringBuilder &output, int leftIndex, int rightIndex,
UErrorCode &status) const {
int32_t length = output.insert(leftIndex, fPrefix, status);
if (fOverwrite) {
@@ -335,8 +333,8 @@ bool ConstantMultiFieldModifier::semanticallyEquivalent(const Modifier& other) c
}
-CurrencySpacingEnabledModifier::CurrencySpacingEnabledModifier(const NumberStringBuilder &prefix,
- const NumberStringBuilder &suffix,
+CurrencySpacingEnabledModifier::CurrencySpacingEnabledModifier(const FormattedStringBuilder &prefix,
+ const FormattedStringBuilder &suffix,
bool overwrite,
bool strong,
const DecimalFormatSymbols &symbols,
@@ -376,7 +374,7 @@ CurrencySpacingEnabledModifier::CurrencySpacingEnabledModifier(const NumberStrin
}
}
-int32_t CurrencySpacingEnabledModifier::apply(NumberStringBuilder &output, int leftIndex, int rightIndex,
+int32_t CurrencySpacingEnabledModifier::apply(FormattedStringBuilder &output, int leftIndex, int rightIndex,
UErrorCode &status) const {
// Currency spacing logic
int length = 0;
@@ -397,7 +395,7 @@ int32_t CurrencySpacingEnabledModifier::apply(NumberStringBuilder &output, int l
}
int32_t
-CurrencySpacingEnabledModifier::applyCurrencySpacing(NumberStringBuilder &output, int32_t prefixStart,
+CurrencySpacingEnabledModifier::applyCurrencySpacing(FormattedStringBuilder &output, int32_t prefixStart,
int32_t prefixLen, int32_t suffixStart,
int32_t suffixLen,
const DecimalFormatSymbols &symbols,
@@ -416,7 +414,7 @@ CurrencySpacingEnabledModifier::applyCurrencySpacing(NumberStringBuilder &output
}
int32_t
-CurrencySpacingEnabledModifier::applyCurrencySpacingAffix(NumberStringBuilder &output, int32_t index,
+CurrencySpacingEnabledModifier::applyCurrencySpacingAffix(FormattedStringBuilder &output, int32_t index,
EAffix affix,
const DecimalFormatSymbols &symbols,
UErrorCode &status) {
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_modifiers.h b/Build/source/libs/icu/icu-src/source/i18n/number_modifiers.h
index 65ada937d03..c84c6aa273e 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_modifiers.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_modifiers.h
@@ -12,7 +12,7 @@
#include "unicode/uniset.h"
#include "unicode/simpleformatter.h"
#include "standardplural.h"
-#include "number_stringbuilder.h"
+#include "formatted_string_builder.h"
#include "number_types.h"
U_NAMESPACE_BEGIN namespace number {
@@ -28,7 +28,7 @@ class U_I18N_API ConstantAffixModifier : public Modifier, public UObject {
bool strong)
: fPrefix(prefix), fSuffix(suffix), fField(field), fStrong(strong) {}
- int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex,
+ int32_t apply(FormattedStringBuilder &output, int32_t leftIndex, int32_t rightIndex,
UErrorCode &status) const U_OVERRIDE;
int32_t getPrefixLength() const U_OVERRIDE;
@@ -64,7 +64,7 @@ class U_I18N_API SimpleModifier : public Modifier, public UMemory {
// Default constructor for LongNameHandler.h
SimpleModifier();
- int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex,
+ int32_t apply(FormattedStringBuilder &output, int32_t leftIndex, int32_t rightIndex,
UErrorCode &status) const U_OVERRIDE;
int32_t getPrefixLength() const U_OVERRIDE;
@@ -81,7 +81,7 @@ class U_I18N_API SimpleModifier : public Modifier, public UMemory {
/**
* TODO: This belongs in SimpleFormatterImpl. The only reason I haven't moved it there yet is because
- * NumberStringBuilder is an internal class and SimpleFormatterImpl feels like it should not depend on it.
+ * FormattedStringBuilder is an internal class and SimpleFormatterImpl feels like it should not depend on it.
*
* <p>
* Formats a value that is already stored inside the StringBuilder <code>result</code> between the indices
@@ -100,22 +100,22 @@ class U_I18N_API SimpleModifier : public Modifier, public UMemory {
* @return The number of characters (UTF-16 code points) that were added to the StringBuilder.
*/
int32_t
- formatAsPrefixSuffix(NumberStringBuilder& result, int32_t startIndex, int32_t endIndex, Field field,
+ formatAsPrefixSuffix(FormattedStringBuilder& result, int32_t startIndex, int32_t endIndex,
UErrorCode& status) const;
/**
* TODO: Like above, this belongs with the rest of the SimpleFormatterImpl code.
- * I put it here so that the SimpleFormatter uses in NumberStringBuilder are near each other.
+ * I put it here so that the SimpleFormatter uses in FormattedStringBuilder are near each other.
*
* <p>
- * Applies the compiled two-argument pattern to the NumberStringBuilder.
+ * Applies the compiled two-argument pattern to the FormattedStringBuilder.
*
* <p>
* This method is optimized for the case where the prefix and suffix are often empty, such as
* in the range pattern like "{0}-{1}".
*/
static int32_t
- formatTwoArgPattern(const SimpleFormatter& compiled, NumberStringBuilder& result,
+ formatTwoArgPattern(const SimpleFormatter& compiled, FormattedStringBuilder& result,
int32_t index, int32_t* outPrefixLength, int32_t* outSuffixLength,
Field field, UErrorCode& status);
@@ -131,13 +131,13 @@ class U_I18N_API SimpleModifier : public Modifier, public UMemory {
/**
* An implementation of {@link Modifier} that allows for multiple types of fields in the same modifier. Constructed
- * based on the contents of two {@link NumberStringBuilder} instances (one for the prefix, one for the suffix).
+ * based on the contents of two {@link FormattedStringBuilder} instances (one for the prefix, one for the suffix).
*/
class U_I18N_API ConstantMultiFieldModifier : public Modifier, public UMemory {
public:
ConstantMultiFieldModifier(
- const NumberStringBuilder &prefix,
- const NumberStringBuilder &suffix,
+ const FormattedStringBuilder &prefix,
+ const FormattedStringBuilder &suffix,
bool overwrite,
bool strong,
const Modifier::Parameters parameters)
@@ -148,8 +148,8 @@ class U_I18N_API ConstantMultiFieldModifier : public Modifier, public UMemory {
fParameters(parameters) {}
ConstantMultiFieldModifier(
- const NumberStringBuilder &prefix,
- const NumberStringBuilder &suffix,
+ const FormattedStringBuilder &prefix,
+ const FormattedStringBuilder &suffix,
bool overwrite,
bool strong)
: fPrefix(prefix),
@@ -157,7 +157,7 @@ class U_I18N_API ConstantMultiFieldModifier : public Modifier, public UMemory {
fOverwrite(overwrite),
fStrong(strong) {}
- int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex,
+ int32_t apply(FormattedStringBuilder &output, int32_t leftIndex, int32_t rightIndex,
UErrorCode &status) const U_OVERRIDE;
int32_t getPrefixLength() const U_OVERRIDE;
@@ -173,10 +173,10 @@ class U_I18N_API ConstantMultiFieldModifier : public Modifier, public UMemory {
bool semanticallyEquivalent(const Modifier& other) const U_OVERRIDE;
protected:
- // NOTE: In Java, these are stored as array pointers. In C++, the NumberStringBuilder is stored by
+ // NOTE: In Java, these are stored as array pointers. In C++, the FormattedStringBuilder is stored by
// value and is treated internally as immutable.
- NumberStringBuilder fPrefix;
- NumberStringBuilder fSuffix;
+ FormattedStringBuilder fPrefix;
+ FormattedStringBuilder fSuffix;
bool fOverwrite;
bool fStrong;
Modifier::Parameters fParameters;
@@ -187,19 +187,19 @@ class U_I18N_API CurrencySpacingEnabledModifier : public ConstantMultiFieldModif
public:
/** Safe code path */
CurrencySpacingEnabledModifier(
- const NumberStringBuilder &prefix,
- const NumberStringBuilder &suffix,
+ const FormattedStringBuilder &prefix,
+ const FormattedStringBuilder &suffix,
bool overwrite,
bool strong,
const DecimalFormatSymbols &symbols,
UErrorCode &status);
- int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex,
+ int32_t apply(FormattedStringBuilder &output, int32_t leftIndex, int32_t rightIndex,
UErrorCode &status) const U_OVERRIDE;
/** Unsafe code path */
static int32_t
- applyCurrencySpacing(NumberStringBuilder &output, int32_t prefixStart, int32_t prefixLen,
+ applyCurrencySpacing(FormattedStringBuilder &output, int32_t prefixStart, int32_t prefixLen,
int32_t suffixStart, int32_t suffixLen, const DecimalFormatSymbols &symbols,
UErrorCode &status);
@@ -218,7 +218,7 @@ class U_I18N_API CurrencySpacingEnabledModifier : public ConstantMultiFieldModif
};
/** Unsafe code path */
- static int32_t applyCurrencySpacingAffix(NumberStringBuilder &output, int32_t index, EAffix affix,
+ static int32_t applyCurrencySpacingAffix(FormattedStringBuilder &output, int32_t index, EAffix affix,
const DecimalFormatSymbols &symbols, UErrorCode &status);
static UnicodeSet
@@ -234,7 +234,7 @@ class U_I18N_API EmptyModifier : public Modifier, public UMemory {
public:
explicit EmptyModifier(bool isStrong) : fStrong(isStrong) {}
- int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex,
+ int32_t apply(FormattedStringBuilder &output, int32_t leftIndex, int32_t rightIndex,
UErrorCode &status) const U_OVERRIDE {
(void)output;
(void)leftIndex;
@@ -289,7 +289,7 @@ class U_I18N_API AdoptingModifierStore : public ModifierStore, public UMemory {
/**
* Sets the Modifier with the specified signum and plural form.
*/
- void adoptModifier(int8_t signum, StandardPlural::Form plural, const Modifier *mod) {
+ void adoptModifier(Signum signum, StandardPlural::Form plural, const Modifier *mod) {
U_ASSERT(mods[getModIndex(signum, plural)] == nullptr);
mods[getModIndex(signum, plural)] = mod;
}
@@ -298,13 +298,13 @@ class U_I18N_API AdoptingModifierStore : public ModifierStore, public UMemory {
* Sets the Modifier with the specified signum.
* The modifier will apply to all plural forms.
*/
- void adoptModifierWithoutPlural(int8_t signum, const Modifier *mod) {
+ void adoptModifierWithoutPlural(Signum signum, const Modifier *mod) {
U_ASSERT(mods[getModIndex(signum, DEFAULT_STANDARD_PLURAL)] == nullptr);
mods[getModIndex(signum, DEFAULT_STANDARD_PLURAL)] = mod;
}
/** Returns a reference to the modifier; no ownership change. */
- const Modifier *getModifier(int8_t signum, StandardPlural::Form plural) const U_OVERRIDE {
+ const Modifier *getModifier(Signum signum, StandardPlural::Form plural) const U_OVERRIDE {
const Modifier* modifier = mods[getModIndex(signum, plural)];
if (modifier == nullptr && plural != DEFAULT_STANDARD_PLURAL) {
modifier = mods[getModIndex(signum, DEFAULT_STANDARD_PLURAL)];
@@ -313,7 +313,7 @@ class U_I18N_API AdoptingModifierStore : public ModifierStore, public UMemory {
}
/** Returns a reference to the modifier; no ownership change. */
- const Modifier *getModifierWithoutPlural(int8_t signum) const {
+ const Modifier *getModifierWithoutPlural(Signum signum) const {
return mods[getModIndex(signum, DEFAULT_STANDARD_PLURAL)];
}
@@ -321,7 +321,7 @@ class U_I18N_API AdoptingModifierStore : public ModifierStore, public UMemory {
// NOTE: mods is zero-initialized (to nullptr)
const Modifier *mods[3 * StandardPlural::COUNT] = {};
- inline static int32_t getModIndex(int8_t signum, StandardPlural::Form plural) {
+ inline static int32_t getModIndex(Signum signum, StandardPlural::Form plural) {
U_ASSERT(signum >= -1 && signum <= 1);
U_ASSERT(plural >= 0 && plural < StandardPlural::COUNT);
return static_cast<int32_t>(plural) * 3 + (signum + 1);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_multiplier.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_multiplier.cpp
index ecb50dd9b82..8f07e548de1 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_multiplier.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_multiplier.cpp
@@ -65,6 +65,9 @@ Scale::Scale(Scale&& src) U_NOEXCEPT
Scale& Scale::operator=(Scale&& src) U_NOEXCEPT {
fMagnitude = src.fMagnitude;
+ if (fArbitrary != nullptr) {
+ delete fArbitrary;
+ }
fArbitrary = src.fArbitrary;
fError = src.fError;
// Take ownership away from src if necessary
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_output.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_output.cpp
new file mode 100644
index 00000000000..e2f069139a4
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_output.cpp
@@ -0,0 +1,57 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
+#include "unicode/numberformatter.h"
+#include "number_utypes.h"
+#include "util.h"
+#include "number_decimalquantity.h"
+#include "number_decnum.h"
+
+U_NAMESPACE_BEGIN
+namespace number {
+
+
+UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(FormattedNumber)
+
+#define UPRV_NOARG
+
+UBool FormattedNumber::nextFieldPosition(FieldPosition& fieldPosition, UErrorCode& status) const {
+ UPRV_FORMATTED_VALUE_METHOD_GUARD(FALSE)
+ return fData->nextFieldPosition(fieldPosition, status);
+}
+
+void FormattedNumber::getAllFieldPositions(FieldPositionIterator& iterator, UErrorCode& status) const {
+ FieldPositionIteratorHandler fpih(&iterator, status);
+ getAllFieldPositionsImpl(fpih, status);
+}
+
+void FormattedNumber::toDecimalNumber(ByteSink& sink, UErrorCode& status) const {
+ UPRV_FORMATTED_VALUE_METHOD_GUARD(UPRV_NOARG)
+ impl::DecNum decnum;
+ fData->quantity.toDecNum(decnum, status);
+ decnum.toString(sink, status);
+}
+
+void FormattedNumber::getAllFieldPositionsImpl(FieldPositionIteratorHandler& fpih,
+ UErrorCode& status) const {
+ UPRV_FORMATTED_VALUE_METHOD_GUARD(UPRV_NOARG)
+ fData->getAllFieldPositions(fpih, status);
+}
+
+void FormattedNumber::getDecimalQuantity(impl::DecimalQuantity& output, UErrorCode& status) const {
+ UPRV_FORMATTED_VALUE_METHOD_GUARD(UPRV_NOARG)
+ output = fData->quantity;
+}
+
+
+impl::UFormattedNumberData::~UFormattedNumberData() = default;
+
+
+} // namespace number
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_padding.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_padding.cpp
index 31684d7208b..c68a9875b20 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_padding.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_padding.cpp
@@ -7,7 +7,7 @@
#include "unicode/numberformatter.h"
#include "number_types.h"
-#include "number_stringbuilder.h"
+#include "formatted_string_builder.h"
#include "number_decimfmtprops.h"
using namespace icu;
@@ -17,7 +17,7 @@ using namespace icu::number::impl;
namespace {
int32_t
-addPaddingHelper(UChar32 paddingCp, int32_t requiredPadding, NumberStringBuilder &string, int32_t index,
+addPaddingHelper(UChar32 paddingCp, int32_t requiredPadding, FormattedStringBuilder &string, int32_t index,
UErrorCode &status) {
for (int32_t i = 0; i < requiredPadding; i++) {
// TODO: If appending to the end, this will cause actual insertion operations. Improve.
@@ -60,7 +60,7 @@ Padder Padder::forProperties(const DecimalFormatProperties& properties) {
}
int32_t Padder::padAndApply(const Modifier &mod1, const Modifier &mod2,
- NumberStringBuilder &string, int32_t leftIndex, int32_t rightIndex,
+ FormattedStringBuilder &string, int32_t leftIndex, int32_t rightIndex,
UErrorCode &status) const {
int32_t modLength = mod1.getCodePointCount() + mod2.getCodePointCount();
int32_t requiredPadding = fWidth - modLength - string.codePointCount();
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_patternmodifier.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_patternmodifier.cpp
index 4c61a0d35bc..724f5b9741c 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_patternmodifier.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_patternmodifier.cpp
@@ -23,13 +23,14 @@ AffixPatternProvider::~AffixPatternProvider() = default;
MutablePatternModifier::MutablePatternModifier(bool isStrong)
: fStrong(isStrong) {}
-void MutablePatternModifier::setPatternInfo(const AffixPatternProvider* patternInfo) {
+void MutablePatternModifier::setPatternInfo(const AffixPatternProvider* patternInfo, Field field) {
fPatternInfo = patternInfo;
+ fField = field;
}
void MutablePatternModifier::setPatternAttributes(UNumberSignDisplay signDisplay, bool perMille) {
fSignDisplay = signDisplay;
- this->perMilleReplacesPercent = perMille;
+ fPerMilleReplacesPercent = perMille;
}
void MutablePatternModifier::setSymbols(const DecimalFormatSymbols* symbols,
@@ -42,7 +43,7 @@ void MutablePatternModifier::setSymbols(const DecimalFormatSymbols* symbols,
fRules = rules;
}
-void MutablePatternModifier::setNumberProperties(int8_t signum, StandardPlural::Form plural) {
+void MutablePatternModifier::setNumberProperties(Signum signum, StandardPlural::Form plural) {
fSignum = signum;
fPlural = plural;
}
@@ -78,12 +79,12 @@ MutablePatternModifier::createImmutableAndChain(const MicroPropsGenerator* paren
if (needsPlurals()) {
// Slower path when we require the plural keyword.
for (StandardPlural::Form plural : STANDARD_PLURAL_VALUES) {
- setNumberProperties(1, plural);
- pm->adoptModifier(1, plural, createConstantModifier(status));
- setNumberProperties(0, plural);
- pm->adoptModifier(0, plural, createConstantModifier(status));
- setNumberProperties(-1, plural);
- pm->adoptModifier(-1, plural, createConstantModifier(status));
+ setNumberProperties(SIGNUM_POS, plural);
+ pm->adoptModifier(SIGNUM_POS, plural, createConstantModifier(status));
+ setNumberProperties(SIGNUM_ZERO, plural);
+ pm->adoptModifier(SIGNUM_ZERO, plural, createConstantModifier(status));
+ setNumberProperties(SIGNUM_NEG, plural);
+ pm->adoptModifier(SIGNUM_NEG, plural, createConstantModifier(status));
}
if (U_FAILURE(status)) {
delete pm;
@@ -92,12 +93,12 @@ MutablePatternModifier::createImmutableAndChain(const MicroPropsGenerator* paren
return new ImmutablePatternModifier(pm, fRules, parent); // adopts pm
} else {
// Faster path when plural keyword is not needed.
- setNumberProperties(1, StandardPlural::Form::COUNT);
- pm->adoptModifierWithoutPlural(1, createConstantModifier(status));
- setNumberProperties(0, StandardPlural::Form::COUNT);
- pm->adoptModifierWithoutPlural(0, createConstantModifier(status));
- setNumberProperties(-1, StandardPlural::Form::COUNT);
- pm->adoptModifierWithoutPlural(-1, createConstantModifier(status));
+ setNumberProperties(SIGNUM_POS, StandardPlural::Form::COUNT);
+ pm->adoptModifierWithoutPlural(SIGNUM_POS, createConstantModifier(status));
+ setNumberProperties(SIGNUM_ZERO, StandardPlural::Form::COUNT);
+ pm->adoptModifierWithoutPlural(SIGNUM_ZERO, createConstantModifier(status));
+ setNumberProperties(SIGNUM_NEG, StandardPlural::Form::COUNT);
+ pm->adoptModifierWithoutPlural(SIGNUM_NEG, createConstantModifier(status));
if (U_FAILURE(status)) {
delete pm;
return nullptr;
@@ -107,8 +108,8 @@ MutablePatternModifier::createImmutableAndChain(const MicroPropsGenerator* paren
}
ConstantMultiFieldModifier* MutablePatternModifier::createConstantModifier(UErrorCode& status) {
- NumberStringBuilder a;
- NumberStringBuilder b;
+ FormattedStringBuilder a;
+ FormattedStringBuilder b;
insertPrefix(a, 0, status);
insertSuffix(b, 0, status);
if (fPatternInfo->hasCurrencySign()) {
@@ -126,22 +127,20 @@ ImmutablePatternModifier::ImmutablePatternModifier(AdoptingModifierStore* pm, co
void ImmutablePatternModifier::processQuantity(DecimalQuantity& quantity, MicroProps& micros,
UErrorCode& status) const {
parent->processQuantity(quantity, micros, status);
- applyToMicros(micros, quantity);
+ applyToMicros(micros, quantity, status);
}
-void ImmutablePatternModifier::applyToMicros(MicroProps& micros, DecimalQuantity& quantity) const {
+void ImmutablePatternModifier::applyToMicros(
+ MicroProps& micros, const DecimalQuantity& quantity, UErrorCode& status) const {
if (rules == nullptr) {
micros.modMiddle = pm->getModifierWithoutPlural(quantity.signum());
} else {
- // TODO: Fix this. Avoid the copy.
- DecimalQuantity copy(quantity);
- copy.roundToInfinity();
- StandardPlural::Form plural = utils::getStandardPlural(rules, copy);
- micros.modMiddle = pm->getModifier(quantity.signum(), plural);
+ StandardPlural::Form pluralForm = utils::getPluralSafe(micros.rounder, rules, quantity, status);
+ micros.modMiddle = pm->getModifier(quantity.signum(), pluralForm);
}
}
-const Modifier* ImmutablePatternModifier::getModifier(int8_t signum, StandardPlural::Form plural) const {
+const Modifier* ImmutablePatternModifier::getModifier(Signum signum, StandardPlural::Form plural) const {
if (rules == nullptr) {
return pm->getModifierWithoutPlural(signum);
} else {
@@ -163,17 +162,15 @@ void MutablePatternModifier::processQuantity(DecimalQuantity& fq, MicroProps& mi
// This method needs to be const because it overrides a const method in the parent class.
auto nonConstThis = const_cast<MutablePatternModifier*>(this);
if (needsPlurals()) {
- // TODO: Fix this. Avoid the copy.
- DecimalQuantity copy(fq);
- micros.rounder.apply(copy, status);
- nonConstThis->setNumberProperties(fq.signum(), utils::getStandardPlural(fRules, copy));
+ StandardPlural::Form pluralForm = utils::getPluralSafe(micros.rounder, fRules, fq, status);
+ nonConstThis->setNumberProperties(fq.signum(), pluralForm);
} else {
nonConstThis->setNumberProperties(fq.signum(), StandardPlural::Form::COUNT);
}
micros.modMiddle = this;
}
-int32_t MutablePatternModifier::apply(NumberStringBuilder& output, int32_t leftIndex, int32_t rightIndex,
+int32_t MutablePatternModifier::apply(FormattedStringBuilder& output, int32_t leftIndex, int32_t rightIndex,
UErrorCode& status) const {
// The unsafe code path performs self-mutation, so we need a const_cast.
// This method needs to be const because it overrides a const method in the parent class.
@@ -236,39 +233,37 @@ bool MutablePatternModifier::isStrong() const {
bool MutablePatternModifier::containsField(UNumberFormatFields field) const {
(void)field;
// This method is not currently used.
- U_ASSERT(false);
- return false;
+ UPRV_UNREACHABLE;
}
void MutablePatternModifier::getParameters(Parameters& output) const {
(void)output;
// This method is not currently used.
- U_ASSERT(false);
+ UPRV_UNREACHABLE;
}
bool MutablePatternModifier::semanticallyEquivalent(const Modifier& other) const {
(void)other;
// This method is not currently used.
- U_ASSERT(false);
- return false;
+ UPRV_UNREACHABLE;
}
-int32_t MutablePatternModifier::insertPrefix(NumberStringBuilder& sb, int position, UErrorCode& status) {
+int32_t MutablePatternModifier::insertPrefix(FormattedStringBuilder& sb, int position, UErrorCode& status) {
prepareAffix(true);
- int length = AffixUtils::unescape(currentAffix, sb, position, *this, status);
+ int32_t length = AffixUtils::unescape(currentAffix, sb, position, *this, fField, status);
return length;
}
-int32_t MutablePatternModifier::insertSuffix(NumberStringBuilder& sb, int position, UErrorCode& status) {
+int32_t MutablePatternModifier::insertSuffix(FormattedStringBuilder& sb, int position, UErrorCode& status) {
prepareAffix(false);
- int length = AffixUtils::unescape(currentAffix, sb, position, *this, status);
+ int32_t length = AffixUtils::unescape(currentAffix, sb, position, *this, fField, status);
return length;
}
/** This method contains the heart of the logic for rendering LDML affix strings. */
void MutablePatternModifier::prepareAffix(bool isPrefix) {
PatternStringUtils::patternInfoToStringBuilder(
- *fPatternInfo, isPrefix, fSignum, fSignDisplay, fPlural, perMilleReplacesPercent, currentAffix);
+ *fPatternInfo, isPrefix, fSignum, fSignDisplay, fPlural, fPerMilleReplacesPercent, currentAffix);
}
UnicodeString MutablePatternModifier::getSymbol(AffixPatternType type) const {
@@ -307,15 +302,13 @@ UnicodeString MutablePatternModifier::getSymbol(AffixPatternType type) const {
case AffixPatternType::TYPE_CURRENCY_QUINT:
return UnicodeString(u"\uFFFD");
default:
- U_ASSERT(false);
- return UnicodeString();
+ UPRV_UNREACHABLE;
}
}
UnicodeString MutablePatternModifier::toUnicodeString() const {
// Never called by AffixUtils
- U_ASSERT(false);
- return UnicodeString();
+ UPRV_UNREACHABLE;
}
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_patternmodifier.h b/Build/source/libs/icu/icu-src/source/i18n/number_patternmodifier.h
index ea80d6305e7..b2c90e0af76 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_patternmodifier.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_patternmodifier.h
@@ -21,10 +21,16 @@ U_NAMESPACE_BEGIN
// data member of AdoptingModifierStore.
// (When building DLLs for Windows this is required.)
#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
+#if defined(_MSC_VER)
// Ignore warning 4661 as LocalPointerBase does not use operator== or operator!=
-#pragma warning(suppress: 4661)
+#pragma warning(push)
+#pragma warning(disable : 4661)
+#endif
template class U_I18N_API LocalPointerBase<number::impl::AdoptingModifierStore>;
template class U_I18N_API LocalPointer<number::impl::AdoptingModifierStore>;
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif
#endif
namespace number {
@@ -40,9 +46,9 @@ class U_I18N_API ImmutablePatternModifier : public MicroPropsGenerator, public U
void processQuantity(DecimalQuantity&, MicroProps& micros, UErrorCode& status) const U_OVERRIDE;
- void applyToMicros(MicroProps& micros, DecimalQuantity& quantity) const;
+ void applyToMicros(MicroProps& micros, const DecimalQuantity& quantity, UErrorCode& status) const;
- const Modifier* getModifier(int8_t signum, StandardPlural::Form plural) const;
+ const Modifier* getModifier(Signum signum, StandardPlural::Form plural) const;
private:
ImmutablePatternModifier(AdoptingModifierStore* pm, const PluralRules* rules,
@@ -95,8 +101,11 @@ class U_I18N_API MutablePatternModifier
* Sets a reference to the parsed decimal format pattern, usually obtained from
* {@link PatternStringParser#parseToPatternInfo(String)}, but any implementation of {@link AffixPatternProvider} is
* accepted.
+ *
+ * @param field
+ * Which field to use for literal characters in the pattern.
*/
- void setPatternInfo(const AffixPatternProvider *patternInfo);
+ void setPatternInfo(const AffixPatternProvider *patternInfo, Field field);
/**
* Sets attributes that imply changes to the literal interpretation of the pattern string affixes.
@@ -133,7 +142,7 @@ class U_I18N_API MutablePatternModifier
* The plural form of the number, required only if the pattern contains the triple
* currency sign, "¤¤¤" (and as indicated by {@link #needsPlurals()}).
*/
- void setNumberProperties(int8_t signum, StandardPlural::Form plural);
+ void setNumberProperties(Signum signum, StandardPlural::Form plural);
/**
* Returns true if the pattern represented by this MurkyModifier requires a plural keyword in order to localize.
@@ -175,7 +184,7 @@ class U_I18N_API MutablePatternModifier
void processQuantity(DecimalQuantity &, MicroProps &micros, UErrorCode &status) const U_OVERRIDE;
- int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex,
+ int32_t apply(FormattedStringBuilder &output, int32_t leftIndex, int32_t rightIndex,
UErrorCode &status) const U_OVERRIDE;
int32_t getPrefixLength() const U_OVERRIDE;
@@ -203,8 +212,9 @@ class U_I18N_API MutablePatternModifier
// Pattern details (initialized in setPatternInfo and setPatternAttributes)
const AffixPatternProvider *fPatternInfo;
+ Field fField;
UNumberSignDisplay fSignDisplay;
- bool perMilleReplacesPercent;
+ bool fPerMilleReplacesPercent;
// Symbol details (initialized in setSymbols)
const DecimalFormatSymbols *fSymbols;
@@ -213,7 +223,7 @@ class U_I18N_API MutablePatternModifier
const PluralRules *fRules;
// Number details (initialized in setNumberProperties)
- int8_t fSignum;
+ Signum fSignum;
StandardPlural::Form fPlural;
// QuantityChain details (initialized in addToChain)
@@ -230,17 +240,17 @@ class U_I18N_API MutablePatternModifier
* CREATES A NEW HEAP OBJECT; THE CALLER GETS OWNERSHIP.
*
* @param a
- * A working NumberStringBuilder object; passed from the outside to prevent the need to create many new
+ * A working FormattedStringBuilder object; passed from the outside to prevent the need to create many new
* instances if this method is called in a loop.
* @param b
- * Another working NumberStringBuilder object.
+ * Another working FormattedStringBuilder object.
* @return The constant modifier object.
*/
ConstantMultiFieldModifier *createConstantModifier(UErrorCode &status);
- int32_t insertPrefix(NumberStringBuilder &sb, int position, UErrorCode &status);
+ int32_t insertPrefix(FormattedStringBuilder &sb, int position, UErrorCode &status);
- int32_t insertSuffix(NumberStringBuilder &sb, int position, UErrorCode &status);
+ int32_t insertSuffix(FormattedStringBuilder &sb, int position, UErrorCode &status);
void prepareAffix(bool isPrefix);
};
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_patternstring.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_patternstring.cpp
index 63195eed989..c7212c1e5c2 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_patternstring.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_patternstring.cpp
@@ -15,6 +15,7 @@
#include "unicode/utf16.h"
#include "number_utils.h"
#include "number_roundingutils.h"
+#include "number_mapper.h"
using namespace icu;
using namespace icu::number;
@@ -49,7 +50,7 @@ PatternParser::parseToExistingProperties(const UnicodeString& pattern, DecimalFo
char16_t ParsedPatternInfo::charAt(int32_t flags, int32_t index) const {
const Endpoints& endpoints = getEndpoints(flags);
if (index < 0 || index >= endpoints.end - endpoints.start) {
- U_ASSERT(false);
+ UPRV_UNREACHABLE;
}
return pattern.charAt(endpoints.start + index);
}
@@ -351,7 +352,7 @@ void ParsedPatternInfo::consumeIntegerFormat(UErrorCode& status) {
result.groupingSizes += 1;
result.integerNumerals += 1;
result.integerTotal += 1;
- if (!result.rounding.isZero() || state.peek() != u'0') {
+ if (!result.rounding.isZeroish() || state.peek() != u'0') {
result.rounding.appendDigit(static_cast<int8_t>(state.peek() - u'0'), 0, true);
}
break;
@@ -531,7 +532,7 @@ PatternParser::patternInfoToProperties(DecimalFormatProperties& properties, Pars
properties.roundingIncrement = 0.0;
properties.minimumSignificantDigits = positive.integerAtSigns;
properties.maximumSignificantDigits = positive.integerAtSigns + positive.integerTrailingHashSigns;
- } else if (!positive.rounding.isZero()) {
+ } else if (!positive.rounding.isZeroish()) {
if (!ignoreRounding) {
properties.minimumFractionDigits = minFrac;
properties.maximumFractionDigits = positive.fractionTotal;
@@ -643,69 +644,67 @@ PatternParser::patternInfoToProperties(DecimalFormatProperties& properties, Pars
/// End PatternStringParser.java; begin PatternStringUtils.java ///
///////////////////////////////////////////////////////////////////
+// Determine whether a given roundingIncrement should be ignored for formatting
+// based on the current maxFrac value (maximum fraction digits). For example a
+// roundingIncrement of 0.01 should be ignored if maxFrac is 1, but not if maxFrac
+// is 2 or more. Note that roundingIncrements are rounded in significance, so
+// a roundingIncrement of 0.006 is treated like 0.01 for this determination, i.e.
+// it should not be ignored if maxFrac is 2 or more (but a roundingIncrement of
+// 0.005 is treated like 0.001 for significance). This is the reason for the
+// initial doubling below.
+// roundIncr must be non-zero.
+bool PatternStringUtils::ignoreRoundingIncrement(double roundIncr, int32_t maxFrac) {
+ if (maxFrac < 0) {
+ return false;
+ }
+ int32_t frac = 0;
+ roundIncr *= 2.0;
+ for (frac = 0; frac <= maxFrac && roundIncr <= 1.0; frac++, roundIncr *= 10.0);
+ return (frac > maxFrac);
+}
+
UnicodeString PatternStringUtils::propertiesToPatternString(const DecimalFormatProperties& properties,
UErrorCode& status) {
UnicodeString sb;
// Convenience references
// The uprv_min() calls prevent DoS
- int dosMax = 100;
- int groupingSize = uprv_min(properties.secondaryGroupingSize, dosMax);
- int firstGroupingSize = uprv_min(properties.groupingSize, dosMax);
- int paddingWidth = uprv_min(properties.formatWidth, dosMax);
+ int32_t dosMax = 100;
+ int32_t grouping1 = uprv_max(0, uprv_min(properties.groupingSize, dosMax));
+ int32_t grouping2 = uprv_max(0, uprv_min(properties.secondaryGroupingSize, dosMax));
+ bool useGrouping = properties.groupingUsed;
+ int32_t paddingWidth = uprv_min(properties.formatWidth, dosMax);
NullableValue<PadPosition> paddingLocation = properties.padPosition;
UnicodeString paddingString = properties.padString;
- int minInt = uprv_max(uprv_min(properties.minimumIntegerDigits, dosMax), 0);
- int maxInt = uprv_min(properties.maximumIntegerDigits, dosMax);
- int minFrac = uprv_max(uprv_min(properties.minimumFractionDigits, dosMax), 0);
- int maxFrac = uprv_min(properties.maximumFractionDigits, dosMax);
- int minSig = uprv_min(properties.minimumSignificantDigits, dosMax);
- int maxSig = uprv_min(properties.maximumSignificantDigits, dosMax);
+ int32_t minInt = uprv_max(0, uprv_min(properties.minimumIntegerDigits, dosMax));
+ int32_t maxInt = uprv_min(properties.maximumIntegerDigits, dosMax);
+ int32_t minFrac = uprv_max(0, uprv_min(properties.minimumFractionDigits, dosMax));
+ int32_t maxFrac = uprv_min(properties.maximumFractionDigits, dosMax);
+ int32_t minSig = uprv_min(properties.minimumSignificantDigits, dosMax);
+ int32_t maxSig = uprv_min(properties.maximumSignificantDigits, dosMax);
bool alwaysShowDecimal = properties.decimalSeparatorAlwaysShown;
- int exponentDigits = uprv_min(properties.minimumExponentDigits, dosMax);
+ int32_t exponentDigits = uprv_min(properties.minimumExponentDigits, dosMax);
bool exponentShowPlusSign = properties.exponentSignAlwaysShown;
- UnicodeString pp = properties.positivePrefix;
- UnicodeString ppp = properties.positivePrefixPattern;
- UnicodeString ps = properties.positiveSuffix;
- UnicodeString psp = properties.positiveSuffixPattern;
- UnicodeString np = properties.negativePrefix;
- UnicodeString npp = properties.negativePrefixPattern;
- UnicodeString ns = properties.negativeSuffix;
- UnicodeString nsp = properties.negativeSuffixPattern;
+
+ PropertiesAffixPatternProvider affixes(properties, status);
// Prefixes
- if (!ppp.isBogus()) {
- sb.append(ppp);
- }
- sb.append(AffixUtils::escape(pp));
- int afterPrefixPos = sb.length();
+ sb.append(affixes.getString(AffixPatternProvider::AFFIX_POS_PREFIX));
+ int32_t afterPrefixPos = sb.length();
// Figure out the grouping sizes.
- int grouping1, grouping2, grouping;
- if (groupingSize != uprv_min(dosMax, -1) && firstGroupingSize != uprv_min(dosMax, -1) &&
- groupingSize != firstGroupingSize) {
- grouping = groupingSize;
- grouping1 = groupingSize;
- grouping2 = firstGroupingSize;
- } else if (groupingSize != uprv_min(dosMax, -1)) {
- grouping = groupingSize;
- grouping1 = 0;
- grouping2 = groupingSize;
- } else if (firstGroupingSize != uprv_min(dosMax, -1)) {
- grouping = groupingSize;
- grouping1 = 0;
- grouping2 = firstGroupingSize;
- } else {
- grouping = 0;
+ if (!useGrouping) {
grouping1 = 0;
grouping2 = 0;
+ } else if (grouping1 == grouping2) {
+ grouping1 = 0;
}
- int groupingLength = grouping1 + grouping2 + 1;
+ int32_t groupingLength = grouping1 + grouping2 + 1;
// Figure out the digits we need to put in the pattern.
double roundingInterval = properties.roundingIncrement;
UnicodeString digitsString;
- int digitsStringScale = 0;
+ int32_t digitsStringScale = 0;
if (maxSig != uprv_min(dosMax, -1)) {
// Significant Digits.
while (digitsString.length() < minSig) {
@@ -714,9 +713,9 @@ UnicodeString PatternStringUtils::propertiesToPatternString(const DecimalFormatP
while (digitsString.length() < maxSig) {
digitsString.append(u'#');
}
- } else if (roundingInterval != 0.0) {
+ } else if (roundingInterval != 0.0 && !ignoreRoundingIncrement(roundingInterval,maxFrac)) {
// Rounding Interval.
- digitsStringScale = -roundingutils::doubleFractionLength(roundingInterval);
+ digitsStringScale = -roundingutils::doubleFractionLength(roundingInterval, nullptr);
// TODO: Check for DoS here?
DecimalQuantity incrementQuantity;
incrementQuantity.setToDouble(roundingInterval);
@@ -739,22 +738,30 @@ UnicodeString PatternStringUtils::propertiesToPatternString(const DecimalFormatP
}
// Write the digits to the string builder
- int m0 = uprv_max(groupingLength, digitsString.length() + digitsStringScale);
+ int32_t m0 = uprv_max(groupingLength, digitsString.length() + digitsStringScale);
m0 = (maxInt != dosMax) ? uprv_max(maxInt, m0) - 1 : m0 - 1;
- int mN = (maxFrac != dosMax) ? uprv_min(-maxFrac, digitsStringScale) : digitsStringScale;
- for (int magnitude = m0; magnitude >= mN; magnitude--) {
- int di = digitsString.length() + digitsStringScale - magnitude - 1;
+ int32_t mN = (maxFrac != dosMax) ? uprv_min(-maxFrac, digitsStringScale) : digitsStringScale;
+ for (int32_t magnitude = m0; magnitude >= mN; magnitude--) {
+ int32_t di = digitsString.length() + digitsStringScale - magnitude - 1;
if (di < 0 || di >= digitsString.length()) {
sb.append(u'#');
} else {
sb.append(digitsString.charAt(di));
}
- if (magnitude > grouping2 && grouping > 0 && (magnitude - grouping2) % grouping == 0) {
+ // Decimal separator
+ if (magnitude == 0 && (alwaysShowDecimal || mN < 0)) {
+ sb.append(u'.');
+ }
+ if (!useGrouping) {
+ continue;
+ }
+ // Least-significant grouping separator
+ if (magnitude > 0 && magnitude == grouping1) {
sb.append(u',');
- } else if (magnitude > 0 && magnitude == grouping2) {
+ }
+ // All other grouping separators
+ if (magnitude > grouping1 && grouping2 > 0 && (magnitude - grouping1) % grouping2 == 0) {
sb.append(u',');
- } else if (magnitude == 0 && (alwaysShowDecimal || mN < 0)) {
- sb.append(u'.');
}
}
@@ -764,25 +771,22 @@ UnicodeString PatternStringUtils::propertiesToPatternString(const DecimalFormatP
if (exponentShowPlusSign) {
sb.append(u'+');
}
- for (int i = 0; i < exponentDigits; i++) {
+ for (int32_t i = 0; i < exponentDigits; i++) {
sb.append(u'0');
}
}
// Suffixes
- int beforeSuffixPos = sb.length();
- if (!psp.isBogus()) {
- sb.append(psp);
- }
- sb.append(AffixUtils::escape(ps));
+ int32_t beforeSuffixPos = sb.length();
+ sb.append(affixes.getString(AffixPatternProvider::AFFIX_POS_SUFFIX));
// Resolve Padding
- if (paddingWidth != -1 && !paddingLocation.isNull()) {
+ if (paddingWidth > 0 && !paddingLocation.isNull()) {
while (paddingWidth - sb.length() > 0) {
sb.insert(afterPrefixPos, u'#');
beforeSuffixPos++;
}
- int addedLength;
+ int32_t addedLength;
switch (paddingLocation.get(status)) {
case PadPosition::UNUM_PAD_BEFORE_PREFIX:
addedLength = escapePaddingString(paddingString, sb, 0, status);
@@ -810,23 +814,16 @@ UnicodeString PatternStringUtils::propertiesToPatternString(const DecimalFormatP
// Negative affixes
// Ignore if the negative prefix pattern is "-" and the negative suffix is empty
- if (!np.isBogus() || !ns.isBogus() || (npp.isBogus() && !nsp.isBogus()) ||
- (!npp.isBogus() && (npp.length() != 1 || npp.charAt(0) != u'-' || nsp.length() != 0))) {
+ if (affixes.hasNegativeSubpattern()) {
sb.append(u';');
- if (!npp.isBogus()) {
- sb.append(npp);
- }
- sb.append(AffixUtils::escape(np));
+ sb.append(affixes.getString(AffixPatternProvider::AFFIX_NEG_PREFIX));
// Copy the positive digit format into the negative.
// This is optional; the pattern is the same as if '#' were appended here instead.
// NOTE: It is not safe to append the UnicodeString to itself, so we need to copy.
// See http://bugs.icu-project.org/trac/ticket/13707
UnicodeString copy(sb);
sb.append(copy, afterPrefixPos, beforeSuffixPos - afterPrefixPos);
- if (!nsp.isBogus()) {
- sb.append(nsp);
- }
- sb.append(AffixUtils::escape(ns));
+ sb.append(affixes.getString(AffixPatternProvider::AFFIX_NEG_SUFFIX));
}
return sb;
@@ -1003,7 +1000,7 @@ PatternStringUtils::convertLocalized(const UnicodeString& input, const DecimalFo
}
void PatternStringUtils::patternInfoToStringBuilder(const AffixPatternProvider& patternInfo, bool isPrefix,
- int8_t signum, UNumberSignDisplay signDisplay,
+ Signum signum, UNumberSignDisplay signDisplay,
StandardPlural::Form plural,
bool perMilleReplacesPercent, UnicodeString& output) {
@@ -1017,6 +1014,7 @@ void PatternStringUtils::patternInfoToStringBuilder(const AffixPatternProvider&
// Should we use the affix from the negative subpattern? (If not, we will use the positive
// subpattern.)
+ // TODO: Deal with signum
bool useNegativeAffixPattern = patternInfo.hasNegativeSubpattern() && (
signum == -1 || (patternInfo.negativeHasMinusSign() && plusReplacesMinusSign));
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_patternstring.h b/Build/source/libs/icu/icu-src/source/i18n/number_patternstring.h
index 91e120c16a1..1191d298287 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_patternstring.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_patternstring.h
@@ -98,7 +98,7 @@ struct U_I18N_API ParsedPatternInfo : public AffixPatternProvider, public UMemor
int32_t offset = 0;
explicit ParserState(const UnicodeString& _pattern)
- : pattern(_pattern) {};
+ : pattern(_pattern) {}
ParserState& operator=(ParserState&& src) U_NOEXCEPT {
// Leave pattern reference alone; it will continue to point to the same place in memory,
@@ -223,6 +223,28 @@ class U_I18N_API PatternParser {
class U_I18N_API PatternStringUtils {
public:
/**
+ * Determine whether a given roundingIncrement should be ignored for formatting
+ * based on the current maxFrac value (maximum fraction digits). For example a
+ * roundingIncrement of 0.01 should be ignored if maxFrac is 1, but not if maxFrac
+ * is 2 or more. Note that roundingIncrements are rounded up in significance, so
+ * a roundingIncrement of 0.006 is treated like 0.01 for this determination, i.e.
+ * it should not be ignored if maxFrac is 2 or more (but a roundingIncrement of
+ * 0.005 is treated like 0.001 for significance).
+ *
+ * This test is needed for both NumberPropertyMapper::oldToNew and
+ * PatternStringUtils::propertiesToPatternString. In Java it cannot be
+ * exported by NumberPropertyMapper (package provate) so it is in
+ * PatternStringUtils, do the same in C.
+ *
+ * @param roundIncr
+ * The roundingIncrement to be checked. Must be non-zero.
+ * @param maxFrac
+ * The current maximum fraction digits value.
+ * @return true if roundIncr should be ignored for formatting.
+ */
+ static bool ignoreRoundingIncrement(double roundIncr, int32_t maxFrac);
+
+ /**
* Creates a pattern string from a property bag.
*
* <p>
@@ -273,7 +295,7 @@ class U_I18N_API PatternStringUtils {
* substitution, and plural forms for CurrencyPluralInfo.
*/
static void patternInfoToStringBuilder(const AffixPatternProvider& patternInfo, bool isPrefix,
- int8_t signum, UNumberSignDisplay signDisplay,
+ Signum signum, UNumberSignDisplay signDisplay,
StandardPlural::Form plural, bool perMilleReplacesPercent,
UnicodeString& output);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_rounding.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_rounding.cpp
index ae4b8849fbe..813d4b680d4 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_rounding.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_rounding.cpp
@@ -33,7 +33,7 @@ int32_t getRoundingMagnitudeSignificant(const DecimalQuantity &value, int maxSig
if (maxSig == -1) {
return INT32_MIN;
}
- int magnitude = value.isZero() ? 0 : value.getMagnitude();
+ int magnitude = value.isZeroish() ? 0 : value.getMagnitude();
return magnitude - maxSig + 1;
}
@@ -45,7 +45,7 @@ int32_t getDisplayMagnitudeFraction(int minFrac) {
}
int32_t getDisplayMagnitudeSignificant(const DecimalQuantity &value, int minSig) {
- int magnitude = value.isZero() ? 0 : value.getMagnitude();
+ int magnitude = value.isZeroish() ? 0 : value.getMagnitude();
return magnitude - minSig + 1;
}
@@ -55,7 +55,7 @@ int32_t getDisplayMagnitudeSignificant(const DecimalQuantity &value, int minSig)
MultiplierProducer::~MultiplierProducer() = default;
-digits_t roundingutils::doubleFractionLength(double input) {
+digits_t roundingutils::doubleFractionLength(double input, int8_t* singleDigit) {
char buffer[DoubleToStringConverter::kBase10MaximalLength + 1];
bool sign; // unused; always positive
int32_t length;
@@ -71,6 +71,14 @@ digits_t roundingutils::doubleFractionLength(double input) {
&point
);
+ if (singleDigit == nullptr) {
+ // no-op
+ } else if (length == 1) {
+ *singleDigit = buffer[0] - '0';
+ } else {
+ *singleDigit = -1;
+ }
+
return static_cast<digits_t>(length - point);
}
@@ -161,13 +169,6 @@ CurrencyPrecision Precision::currency(UCurrencyUsage currencyUsage) {
return constructCurrency(currencyUsage);
}
-Precision Precision::withMode(RoundingMode roundingMode) const {
- if (fType == RND_ERROR) { return *this; } // no-op in error state
- Precision retval = *this;
- retval.fRoundingMode = roundingMode;
- return retval;
-}
-
Precision FractionPrecision::withMinDigits(int32_t minSignificantDigits) const {
if (fType == RND_ERROR) { return *this; } // no-op in error state
if (minSignificantDigits >= 1 && minSignificantDigits <= kMaxIntFracSig) {
@@ -254,14 +255,27 @@ Precision::constructFractionSignificant(const FractionPrecision &base, int32_t m
IncrementPrecision Precision::constructIncrement(double increment, int32_t minFrac) {
IncrementSettings settings;
+ // Note: For number formatting, fIncrement is used for RND_INCREMENT but not
+ // RND_INCREMENT_ONE or RND_INCREMENT_FIVE. However, fIncrement is used in all
+ // three when constructing a skeleton.
settings.fIncrement = increment;
settings.fMinFrac = static_cast<digits_t>(minFrac);
// One of the few pre-computed quantities:
// Note: it is possible for minFrac to be more than maxFrac... (misleading)
- settings.fMaxFrac = roundingutils::doubleFractionLength(increment);
+ int8_t singleDigit;
+ settings.fMaxFrac = roundingutils::doubleFractionLength(increment, &singleDigit);
PrecisionUnion union_;
union_.increment = settings;
- return {RND_INCREMENT, union_, kDefaultMode};
+ if (singleDigit == 1) {
+ // NOTE: In C++, we must return the correct value type with the correct union.
+ // It would be invalid to return a RND_FRACTION here because the methods on the
+ // IncrementPrecision type assume that the union is backed by increment data.
+ return {RND_INCREMENT_ONE, union_, kDefaultMode};
+ } else if (singleDigit == 5) {
+ return {RND_INCREMENT_FIVE, union_, kDefaultMode};
+ } else {
+ return {RND_INCREMENT, union_, kDefaultMode};
+ }
}
CurrencyPrecision Precision::constructCurrency(UCurrencyUsage usage) {
@@ -292,8 +306,8 @@ bool RoundingImpl::isSignificantDigits() const {
int32_t
RoundingImpl::chooseMultiplierAndApply(impl::DecimalQuantity &input, const impl::MultiplierProducer &producer,
UErrorCode &status) {
- // Do not call this method with zero.
- U_ASSERT(!input.isZero());
+ // Do not call this method with zero, NaN, or infinity.
+ U_ASSERT(!input.isZeroish());
// Perform the first attempt at rounding.
int magnitude = input.getMagnitude();
@@ -302,7 +316,7 @@ RoundingImpl::chooseMultiplierAndApply(impl::DecimalQuantity &input, const impl:
apply(input, status);
// If the number rounded to zero, exit.
- if (input.isZero() || U_FAILURE(status)) {
+ if (input.isZeroish() || U_FAILURE(status)) {
return multiplier;
}
@@ -348,9 +362,8 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const
getRoundingMagnitudeFraction(fPrecision.fUnion.fracSig.fMaxFrac),
fRoundingMode,
status);
- value.setFractionLength(
- uprv_max(0, -getDisplayMagnitudeFraction(fPrecision.fUnion.fracSig.fMinFrac)),
- INT32_MAX);
+ value.setMinFraction(
+ uprv_max(0, -getDisplayMagnitudeFraction(fPrecision.fUnion.fracSig.fMinFrac)));
break;
case Precision::RND_SIGNIFICANT:
@@ -358,12 +371,11 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const
getRoundingMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMaxSig),
fRoundingMode,
status);
- value.setFractionLength(
- uprv_max(0, -getDisplayMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMinSig)),
- INT32_MAX);
+ value.setMinFraction(
+ uprv_max(0, -getDisplayMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMinSig)));
// Make sure that digits are displayed on zero.
- if (value.isZero() && fPrecision.fUnion.fracSig.fMinSig > 0) {
- value.setIntegerLength(1, INT32_MAX);
+ if (value.isZeroish() && fPrecision.fUnion.fracSig.fMinSig > 0) {
+ value.setMinInteger(1);
}
break;
@@ -384,7 +396,7 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const
roundingMag = uprv_min(roundingMag, candidate);
}
value.roundToMagnitude(roundingMag, fRoundingMode, status);
- value.setFractionLength(uprv_max(0, -displayMag), INT32_MAX);
+ value.setMinFraction(uprv_max(0, -displayMag));
break;
}
@@ -392,23 +404,40 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const
value.roundToIncrement(
fPrecision.fUnion.increment.fIncrement,
fRoundingMode,
- fPrecision.fUnion.increment.fMaxFrac,
status);
- value.setFractionLength(fPrecision.fUnion.increment.fMinFrac, INT32_MAX);
+ value.setMinFraction(fPrecision.fUnion.increment.fMinFrac);
+ break;
+
+ case Precision::RND_INCREMENT_ONE:
+ value.roundToMagnitude(
+ -fPrecision.fUnion.increment.fMaxFrac,
+ fRoundingMode,
+ status);
+ value.setMinFraction(fPrecision.fUnion.increment.fMinFrac);
+ break;
+
+ case Precision::RND_INCREMENT_FIVE:
+ value.roundToNickel(
+ -fPrecision.fUnion.increment.fMaxFrac,
+ fRoundingMode,
+ status);
+ value.setMinFraction(fPrecision.fUnion.increment.fMinFrac);
break;
case Precision::RND_CURRENCY:
// Call .withCurrency() before .apply()!
- U_ASSERT(false);
- break;
+ UPRV_UNREACHABLE;
+
+ default:
+ UPRV_UNREACHABLE;
}
}
void RoundingImpl::apply(impl::DecimalQuantity &value, int32_t minInt, UErrorCode /*status*/) {
// This method is intended for the one specific purpose of helping print "00.000E0".
U_ASSERT(isSignificantDigits());
- U_ASSERT(value.isZero());
- value.setFractionLength(fPrecision.fUnion.fracSig.fMinSig - minInt, INT32_MAX);
+ U_ASSERT(value.isZeroish());
+ value.setMinFraction(fPrecision.fUnion.fracSig.fMinSig - minInt);
}
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_roundingutils.h b/Build/source/libs/icu/icu-src/source/i18n/number_roundingutils.h
index 66d58bb775b..9c2c47b6e41 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_roundingutils.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_roundingutils.h
@@ -134,8 +134,11 @@ inline bool roundsAtMidpoint(int roundingMode) {
/**
* Computes the number of fraction digits in a double. Used for computing maxFrac for an increment.
* Calls into the DoubleToStringConverter library to do so.
+ *
+ * @param singleDigit An output parameter; set to a number if that is the
+ * only digit in the double, or -1 if there is more than one digit.
*/
-digits_t doubleFractionLength(double input);
+digits_t doubleFractionLength(double input, int8_t* singleDigit);
} // namespace roundingutils
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_scientific.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_scientific.cpp
index 009e4dfa5b5..f3de7414125 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_scientific.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_scientific.cpp
@@ -8,7 +8,7 @@
#include <cstdlib>
#include "number_scientific.h"
#include "number_utils.h"
-#include "number_stringbuilder.h"
+#include "formatted_string_builder.h"
#include "unicode/unum.h"
#include "number_microprops.h"
@@ -36,7 +36,7 @@ void ScientificModifier::set(int32_t exponent, const ScientificHandler *handler)
fHandler = handler;
}
-int32_t ScientificModifier::apply(NumberStringBuilder &output, int32_t /*leftIndex*/, int32_t rightIndex,
+int32_t ScientificModifier::apply(FormattedStringBuilder &output, int32_t /*leftIndex*/, int32_t rightIndex,
UErrorCode &status) const {
// FIXME: Localized exponent separator location.
int i = rightIndex;
@@ -96,8 +96,7 @@ bool ScientificModifier::isStrong() const {
bool ScientificModifier::containsField(UNumberFormatFields field) const {
(void)field;
// This method is not used for inner modifiers.
- U_ASSERT(false);
- return false;
+ UPRV_UNREACHABLE;
}
void ScientificModifier::getParameters(Parameters& output) const {
@@ -124,9 +123,15 @@ void ScientificHandler::processQuantity(DecimalQuantity &quantity, MicroProps &m
fParent->processQuantity(quantity, micros, status);
if (U_FAILURE(status)) { return; }
+ // Do not apply scientific notation to special doubles
+ if (quantity.isInfinite() || quantity.isNaN()) {
+ micros.modInner = &micros.helpers.emptyStrongModifier;
+ return;
+ }
+
// Treat zero as if it had magnitude 0
int32_t exponent;
- if (quantity.isZero()) {
+ if (quantity.isZeroish()) {
if (fSettings.fRequireMinInt && micros.rounder.isSignificantDigits()) {
// Show "00.000E0" on pattern "00.000E0"
micros.rounder.apply(quantity, fSettings.fEngineeringInterval, status);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_scientific.h b/Build/source/libs/icu/icu-src/source/i18n/number_scientific.h
index e377bd941ef..1c9ce1efa80 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_scientific.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_scientific.h
@@ -21,7 +21,7 @@ class U_I18N_API ScientificModifier : public UMemory, public Modifier {
void set(int32_t exponent, const ScientificHandler *handler);
- int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex,
+ int32_t apply(FormattedStringBuilder &output, int32_t leftIndex, int32_t rightIndex,
UErrorCode &status) const U_OVERRIDE;
int32_t getPrefixLength() const U_OVERRIDE;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_skeletons.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_skeletons.cpp
index c7bb18b5f3d..4025539239b 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_skeletons.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_skeletons.cpp
@@ -20,6 +20,7 @@
#include "unicode/numberformatter.h"
#include "uinvchar.h"
#include "charstr.h"
+#include "string_segment.h"
using namespace icu;
using namespace icu::number;
@@ -119,17 +120,17 @@ inline void appendMultiple(UnicodeString& sb, UChar32 cp, int32_t count) {
#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
-{ \
+UPRV_BLOCK_MACRO_BEGIN { \
if ((seen).field) { \
(status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
return STATE_NULL; \
} \
(seen).field = true; \
-}
+} UPRV_BLOCK_MACRO_END
#define SKELETON_UCHAR_TO_CHAR(dest, src, start, end, status) (void)(dest); \
-{ \
+UPRV_BLOCK_MACRO_BEGIN { \
UErrorCode conversionStatus = U_ZERO_ERROR; \
(dest).appendInvariantChars({FALSE, (src).getBuffer() + (start), (end) - (start)}, conversionStatus); \
if (conversionStatus == U_INVARIANT_CONVERSION_ERROR) { \
@@ -140,7 +141,7 @@ inline void appendMultiple(UnicodeString& sb, UChar32 cp, int32_t count) {
(status) = conversionStatus; \
return; \
} \
-}
+} UPRV_BLOCK_MACRO_END
} // anonymous namespace
@@ -159,8 +160,7 @@ Notation stem_to_object::notation(skeleton::StemEnum stem) {
case STEM_NOTATION_SIMPLE:
return Notation::simple();
default:
- U_ASSERT(false);
- return Notation::simple(); // return a value: silence compiler warning
+ UPRV_UNREACHABLE;
}
}
@@ -176,8 +176,7 @@ MeasureUnit stem_to_object::unit(skeleton::StemEnum stem) {
// Slicing is okay
return NoUnit::permille(); // NOLINT
default:
- U_ASSERT(false);
- return {}; // return a value: silence compiler warning
+ UPRV_UNREACHABLE;
}
}
@@ -192,8 +191,7 @@ Precision stem_to_object::precision(skeleton::StemEnum stem) {
case STEM_PRECISION_CURRENCY_CASH:
return Precision::currency(UCURR_USAGE_CASH);
default:
- U_ASSERT(false);
- return Precision::integer(); // return a value: silence compiler warning
+ UPRV_UNREACHABLE;
}
}
@@ -216,12 +214,11 @@ UNumberFormatRoundingMode stem_to_object::roundingMode(skeleton::StemEnum stem)
case STEM_ROUNDING_MODE_UNNECESSARY:
return UNUM_ROUND_UNNECESSARY;
default:
- U_ASSERT(false);
- return UNUM_ROUND_UNNECESSARY;
+ UPRV_UNREACHABLE;
}
}
-UGroupingStrategy stem_to_object::groupingStrategy(skeleton::StemEnum stem) {
+UNumberGroupingStrategy stem_to_object::groupingStrategy(skeleton::StemEnum stem) {
switch (stem) {
case STEM_GROUP_OFF:
return UNUM_GROUPING_OFF;
@@ -315,11 +312,11 @@ void enum_to_stem_string::roundingMode(UNumberFormatRoundingMode value, UnicodeS
sb.append(u"rounding-mode-unnecessary", -1);
break;
default:
- U_ASSERT(false);
+ UPRV_UNREACHABLE;
}
}
-void enum_to_stem_string::groupingStrategy(UGroupingStrategy value, UnicodeString& sb) {
+void enum_to_stem_string::groupingStrategy(UNumberGroupingStrategy value, UnicodeString& sb) {
switch (value) {
case UNUM_GROUPING_OFF:
sb.append(u"group-off", -1);
@@ -337,7 +334,7 @@ void enum_to_stem_string::groupingStrategy(UGroupingStrategy value, UnicodeStrin
sb.append(u"group-thousands", -1);
break;
default:
- U_ASSERT(false);
+ UPRV_UNREACHABLE;
}
}
@@ -359,7 +356,7 @@ void enum_to_stem_string::unitWidth(UNumberUnitWidth value, UnicodeString& sb) {
sb.append(u"unit-width-hidden", -1);
break;
default:
- U_ASSERT(false);
+ UPRV_UNREACHABLE;
}
}
@@ -387,7 +384,7 @@ void enum_to_stem_string::signDisplay(UNumberSignDisplay value, UnicodeString& s
sb.append(u"sign-accounting-except-zero", -1);
break;
default:
- U_ASSERT(false);
+ UPRV_UNREACHABLE;
}
}
@@ -401,15 +398,46 @@ enum_to_stem_string::decimalSeparatorDisplay(UNumberDecimalSeparatorDisplay valu
sb.append(u"decimal-always", -1);
break;
default:
- U_ASSERT(false);
+ UPRV_UNREACHABLE;
}
}
-UnlocalizedNumberFormatter skeleton::create(const UnicodeString& skeletonString, UErrorCode& status) {
+UnlocalizedNumberFormatter skeleton::create(
+ const UnicodeString& skeletonString, UParseError* perror, UErrorCode& status) {
+
+ // Initialize perror
+ if (perror != nullptr) {
+ perror->line = 0;
+ perror->offset = -1;
+ perror->preContext[0] = 0;
+ perror->postContext[0] = 0;
+ }
+
umtx_initOnce(gNumberSkeletonsInitOnce, &initNumberSkeletons, status);
- MacroProps macros = parseSkeleton(skeletonString, status);
- return NumberFormatter::with().macros(macros);
+ if (U_FAILURE(status)) {
+ return {};
+ }
+
+ int32_t errOffset;
+ MacroProps macros = parseSkeleton(skeletonString, errOffset, status);
+ if (U_SUCCESS(status)) {
+ return NumberFormatter::with().macros(macros);
+ }
+
+ if (perror == nullptr) {
+ return {};
+ }
+
+ // Populate the UParseError with the error location
+ perror->offset = errOffset;
+ int32_t contextStart = uprv_max(0, errOffset - U_PARSE_CONTEXT_LEN + 1);
+ int32_t contextEnd = uprv_min(skeletonString.length(), errOffset + U_PARSE_CONTEXT_LEN - 1);
+ skeletonString.extract(contextStart, errOffset - contextStart, perror->preContext, 0);
+ perror->preContext[errOffset - contextStart] = 0;
+ skeletonString.extract(errOffset, contextEnd - errOffset, perror->postContext, 0);
+ perror->postContext[contextEnd - errOffset] = 0;
+ return {};
}
UnicodeString skeleton::generate(const MacroProps& macros, UErrorCode& status) {
@@ -419,8 +447,9 @@ UnicodeString skeleton::generate(const MacroProps& macros, UErrorCode& status) {
return sb;
}
-MacroProps skeleton::parseSkeleton(const UnicodeString& skeletonString, UErrorCode& status) {
- if (U_FAILURE(status)) { return MacroProps(); }
+MacroProps skeleton::parseSkeleton(
+ const UnicodeString& skeletonString, int32_t& errOffset, UErrorCode& status) {
+ U_ASSERT(U_SUCCESS(status));
// Add a trailing whitespace to the end of the skeleton string to make code cleaner.
UnicodeString tempSkeletonString(skeletonString);
@@ -464,7 +493,10 @@ MacroProps skeleton::parseSkeleton(const UnicodeString& skeletonString, UErrorCo
stem = parseOption(stem, segment, macros, status);
}
segment.resetLength();
- if (U_FAILURE(status)) { return macros; }
+ if (U_FAILURE(status)) {
+ errOffset = segment.getOffset();
+ return macros;
+ }
// Consume the segment:
segment.adjustOffset(offset);
@@ -475,6 +507,7 @@ MacroProps skeleton::parseSkeleton(const UnicodeString& skeletonString, UErrorCo
// segment.setLength(U16_LENGTH(cp)); // for error message
// throw new SkeletonSyntaxException("Unexpected separator character", segment);
status = U_NUMBER_SKELETON_SYNTAX_ERROR;
+ errOffset = segment.getOffset();
return macros;
} else {
@@ -486,6 +519,7 @@ MacroProps skeleton::parseSkeleton(const UnicodeString& skeletonString, UErrorCo
// segment.setLength(U16_LENGTH(cp)); // for error message
// throw new SkeletonSyntaxException("Unexpected option separator", segment);
status = U_NUMBER_SKELETON_SYNTAX_ERROR;
+ errOffset = segment.getOffset();
return macros;
}
@@ -502,6 +536,7 @@ MacroProps skeleton::parseSkeleton(const UnicodeString& skeletonString, UErrorCo
// segment.setLength(U16_LENGTH(cp)); // for error message
// throw new SkeletonSyntaxException("Stem requires an option", segment);
status = U_NUMBER_SKELETON_SYNTAX_ERROR;
+ errOffset = segment.getOffset();
return macros;
default:
break;
@@ -665,8 +700,7 @@ skeleton::parseStem(const StringSegment& segment, const UCharsTrie& stemTrie, Se
return STATE_SCALE;
default:
- U_ASSERT(false);
- return STATE_NULL; // return a value: silence compiler warning
+ UPRV_UNREACHABLE;
}
}
@@ -1184,7 +1218,7 @@ void blueprint_helpers::parseIntegerWidthOption(const StringSegment& segment, Ma
maxInt = 0;
}
for (; offset < segment.length(); offset++) {
- if (segment.charAt(offset) == u'#') {
+ if (maxInt != -1 && segment.charAt(offset) == u'#') {
maxInt++;
} else {
break;
@@ -1389,7 +1423,9 @@ bool GeneratorHelpers::precision(const MacroProps& macros, UnicodeString& sb, UE
} else {
blueprint_helpers::generateDigitsStem(impl.fMinSig, -1, sb, status);
}
- } else if (macros.precision.fType == Precision::RND_INCREMENT) {
+ } else if (macros.precision.fType == Precision::RND_INCREMENT
+ || macros.precision.fType == Precision::RND_INCREMENT_ONE
+ || macros.precision.fType == Precision::RND_INCREMENT_FIVE) {
const Precision::IncrementSettings& impl = macros.precision.fUnion.increment;
sb.append(u"precision-increment/", -1);
blueprint_helpers::generateIncrementOption(
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_skeletons.h b/Build/source/libs/icu/icu-src/source/i18n/number_skeletons.h
index 0161f5f0ba8..59af771928f 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_skeletons.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_skeletons.h
@@ -10,10 +10,10 @@
#include "number_types.h"
#include "numparse_types.h"
#include "unicode/ucharstrie.h"
+#include "string_segment.h"
-using icu::numparse::impl::StringSegment;
-
-U_NAMESPACE_BEGIN namespace number {
+U_NAMESPACE_BEGIN
+namespace number {
namespace impl {
// Forward-declaration
@@ -122,7 +122,8 @@ enum StemEnum {
* A number skeleton string, possibly not in its shortest form.
* @return An UnlocalizedNumberFormatter with behavior defined by the given skeleton string.
*/
-UnlocalizedNumberFormatter create(const UnicodeString& skeletonString, UErrorCode& status);
+UnlocalizedNumberFormatter create(
+ const UnicodeString& skeletonString, UParseError* perror, UErrorCode& status);
/**
* Create a skeleton string corresponding to the given NumberFormatter.
@@ -138,7 +139,7 @@ UnicodeString generate(const MacroProps& macros, UErrorCode& status);
*
* Internal: use the create() endpoint instead of this function.
*/
-MacroProps parseSkeleton(const UnicodeString& skeletonString, UErrorCode& status);
+MacroProps parseSkeleton(const UnicodeString& skeletonString, int32_t& errOffset, UErrorCode& status);
/**
* Given that the current segment represents a stem, parse it and save the result.
@@ -174,7 +175,7 @@ Precision precision(skeleton::StemEnum stem);
UNumberFormatRoundingMode roundingMode(skeleton::StemEnum stem);
-UGroupingStrategy groupingStrategy(skeleton::StemEnum stem);
+UNumberGroupingStrategy groupingStrategy(skeleton::StemEnum stem);
UNumberUnitWidth unitWidth(skeleton::StemEnum stem);
@@ -192,7 +193,7 @@ namespace enum_to_stem_string {
void roundingMode(UNumberFormatRoundingMode value, UnicodeString& sb);
-void groupingStrategy(UGroupingStrategy value, UnicodeString& sb);
+void groupingStrategy(UNumberGroupingStrategy value, UnicodeString& sb);
void unitWidth(UNumberUnitWidth value, UnicodeString& sb);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_stringbuilder.h b/Build/source/libs/icu/icu-src/source/i18n/number_stringbuilder.h
deleted file mode 100644
index b14ad9ede2f..00000000000
--- a/Build/source/libs/icu/icu-src/source/i18n/number_stringbuilder.h
+++ /dev/null
@@ -1,152 +0,0 @@
-// © 2017 and later: Unicode, Inc. and others.
-// License & terms of use: http://www.unicode.org/copyright.html
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_FORMATTING
-#ifndef __NUMBER_STRINGBUILDER_H__
-#define __NUMBER_STRINGBUILDER_H__
-
-
-#include <cstdint>
-#include "unicode/numfmt.h"
-#include "unicode/ustring.h"
-#include "cstring.h"
-#include "uassert.h"
-#include "number_types.h"
-#include "fphdlimp.h"
-
-U_NAMESPACE_BEGIN namespace number {
-namespace impl {
-
-class U_I18N_API NumberStringBuilder : public UMemory {
- private:
- static const int32_t DEFAULT_CAPACITY = 40;
-
- template<typename T>
- union ValueOrHeapArray {
- T value[DEFAULT_CAPACITY];
- struct {
- T *ptr;
- int32_t capacity;
- } heap;
- };
-
- public:
- NumberStringBuilder();
-
- ~NumberStringBuilder();
-
- NumberStringBuilder(const NumberStringBuilder &other);
-
- NumberStringBuilder &operator=(const NumberStringBuilder &other);
-
- int32_t length() const;
-
- int32_t codePointCount() const;
-
- inline char16_t charAt(int32_t index) const {
- U_ASSERT(index >= 0);
- U_ASSERT(index < fLength);
- return getCharPtr()[fZero + index];
- }
-
- inline Field fieldAt(int32_t index) const {
- U_ASSERT(index >= 0);
- U_ASSERT(index < fLength);
- return getFieldPtr()[fZero + index];
- }
-
- UChar32 getFirstCodePoint() const;
-
- UChar32 getLastCodePoint() const;
-
- UChar32 codePointAt(int32_t index) const;
-
- UChar32 codePointBefore(int32_t index) const;
-
- NumberStringBuilder &clear();
-
- int32_t appendCodePoint(UChar32 codePoint, Field field, UErrorCode &status);
-
- int32_t insertCodePoint(int32_t index, UChar32 codePoint, Field field, UErrorCode &status);
-
- int32_t append(const UnicodeString &unistr, Field field, UErrorCode &status);
-
- int32_t insert(int32_t index, const UnicodeString &unistr, Field field, UErrorCode &status);
-
- int32_t insert(int32_t index, const UnicodeString &unistr, int32_t start, int32_t end, Field field,
- UErrorCode &status);
-
- int32_t splice(int32_t startThis, int32_t endThis, const UnicodeString &unistr,
- int32_t startOther, int32_t endOther, Field field, UErrorCode& status);
-
- int32_t append(const NumberStringBuilder &other, UErrorCode &status);
-
- int32_t insert(int32_t index, const NumberStringBuilder &other, UErrorCode &status);
-
- /**
- * Gets a "safe" UnicodeString that can be used even after the NumberStringBuilder is destructed.
- * */
- UnicodeString toUnicodeString() const;
-
- /**
- * Gets an "unsafe" UnicodeString that is valid only as long as the NumberStringBuilder is alive and
- * unchanged. Slightly faster than toUnicodeString().
- */
- const UnicodeString toTempUnicodeString() const;
-
- UnicodeString toDebugString() const;
-
- const char16_t *chars() const;
-
- bool contentEquals(const NumberStringBuilder &other) const;
-
- bool nextFieldPosition(FieldPosition& fp, UErrorCode& status) const;
-
- void getAllFieldPositions(FieldPositionIteratorHandler& fpih, UErrorCode& status) const;
-
- bool containsField(Field field) const;
-
- private:
- bool fUsingHeap = false;
- ValueOrHeapArray<char16_t> fChars;
- ValueOrHeapArray<Field> fFields;
- int32_t fZero = DEFAULT_CAPACITY / 2;
- int32_t fLength = 0;
-
- inline char16_t *getCharPtr() {
- return fUsingHeap ? fChars.heap.ptr : fChars.value;
- }
-
- inline const char16_t *getCharPtr() const {
- return fUsingHeap ? fChars.heap.ptr : fChars.value;
- }
-
- inline Field *getFieldPtr() {
- return fUsingHeap ? fFields.heap.ptr : fFields.value;
- }
-
- inline const Field *getFieldPtr() const {
- return fUsingHeap ? fFields.heap.ptr : fFields.value;
- }
-
- inline int32_t getCapacity() const {
- return fUsingHeap ? fChars.heap.capacity : DEFAULT_CAPACITY;
- }
-
- int32_t prepareForInsert(int32_t index, int32_t count, UErrorCode &status);
-
- int32_t prepareForInsertHelper(int32_t index, int32_t count, UErrorCode &status);
-
- int32_t remove(int32_t index, int32_t count);
-};
-
-} // namespace impl
-} // namespace number
-U_NAMESPACE_END
-
-
-#endif //__NUMBER_STRINGBUILDER_H__
-
-#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_types.h b/Build/source/libs/icu/icu-src/source/i18n/number_types.h
index 00a6818869f..d62aa6a66b3 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_types.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_types.h
@@ -17,13 +17,16 @@
#include "unicode/platform.h"
#include "unicode/uniset.h"
#include "standardplural.h"
+#include "formatted_string_builder.h"
-U_NAMESPACE_BEGIN namespace number {
+U_NAMESPACE_BEGIN
+namespace number {
namespace impl {
-// Typedef several enums for brevity and for easier comparison to Java.
+// For convenience and historical reasons, import the Field typedef to the namespace.
+typedef FormattedStringBuilder::Field Field;
-typedef UNumberFormatFields Field;
+// Typedef several enums for brevity and for easier comparison to Java.
typedef UNumberFormatRoundingMode RoundingMode;
@@ -45,7 +48,6 @@ static constexpr char16_t kFallbackPaddingString[] = u" ";
class Modifier;
class MutablePatternModifier;
class DecimalQuantity;
-class NumberStringBuilder;
class ModifierStore;
struct MicroProps;
@@ -89,6 +91,12 @@ enum CompactType {
TYPE_DECIMAL, TYPE_CURRENCY
};
+enum Signum {
+ SIGNUM_NEG = -1,
+ SIGNUM_ZERO = 0,
+ SIGNUM_POS = 1
+};
+
class U_I18N_API AffixPatternProvider {
public:
@@ -156,7 +164,7 @@ class U_I18N_API Modifier {
* formatted.
* @return The number of characters (UTF-16 code units) that were added to the string builder.
*/
- virtual int32_t apply(NumberStringBuilder& output, int leftIndex, int rightIndex,
+ virtual int32_t apply(FormattedStringBuilder& output, int leftIndex, int rightIndex,
UErrorCode& status) const = 0;
/**
@@ -192,11 +200,11 @@ class U_I18N_API Modifier {
*/
struct U_I18N_API Parameters {
const ModifierStore* obj = nullptr;
- int8_t signum;
+ Signum signum;
StandardPlural::Form plural;
Parameters();
- Parameters(const ModifierStore* _obj, int8_t _signum, StandardPlural::Form _plural);
+ Parameters(const ModifierStore* _obj, Signum _signum, StandardPlural::Form _plural);
};
/**
@@ -227,7 +235,7 @@ class U_I18N_API ModifierStore {
/**
* Returns a Modifier with the given parameters (best-effort).
*/
- virtual const Modifier* getModifier(int8_t signum, StandardPlural::Form plural) const = 0;
+ virtual const Modifier* getModifier(Signum signum, StandardPlural::Form plural) const = 0;
};
@@ -346,6 +354,7 @@ class U_I18N_API NullableValue {
T fValue;
};
+
} // namespace impl
} // namespace number
U_NAMESPACE_END
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_utils.cpp b/Build/source/libs/icu/icu-src/source/i18n/number_utils.cpp
index c79d2de9fa3..91d7f335cd8 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_utils.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_utils.cpp
@@ -70,7 +70,7 @@ const char16_t* utils::getPatternForStyle(const Locale& locale, const char* nsNa
break;
default:
patternKey = "decimalFormat"; // silence compiler error
- U_ASSERT(false);
+ UPRV_UNREACHABLE;
}
LocalUResourceBundlePointer res(ures_open(nullptr, locale.getName(), &status));
if (U_FAILURE(status)) { return u""; }
@@ -237,7 +237,9 @@ void DecNum::multiplyBy(const DecNum& rhs, UErrorCode& status) {
void DecNum::divideBy(const DecNum& rhs, UErrorCode& status) {
uprv_decNumberDivide(fData, fData, rhs.fData, &fContext);
- if (fContext.status != 0) {
+ if ((fContext.status & DEC_Inexact) != 0) {
+ // Ignore.
+ } else if (fContext.status != 0) {
status = U_INTERNAL_PROGRAM_ERROR;
}
}
@@ -250,4 +252,15 @@ bool DecNum::isZero() const {
return decNumberIsZero(fData.getAlias());
}
+void DecNum::toString(ByteSink& output, UErrorCode& status) const {
+ if (U_FAILURE(status)) {
+ return;
+ }
+ // "string must be at least dn->digits+14 characters long"
+ int32_t minCapacity = fData.getAlias()->digits + 14;
+ MaybeStackArray<char, 30> buffer(minCapacity);
+ uprv_decNumberToString(fData, buffer.getAlias());
+ output.Append(buffer.getAlias(), static_cast<int32_t>(uprv_strlen(buffer.getAlias())));
+}
+
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_utils.h b/Build/source/libs/icu/icu-src/source/i18n/number_utils.h
index c367166009c..93195f080b2 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_utils.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_utils.h
@@ -17,6 +17,7 @@
#include "number_roundingutils.h"
#include "decNumber.h"
#include "charstr.h"
+#include "formatted_string_builder.h"
U_NAMESPACE_BEGIN
@@ -35,7 +36,7 @@ enum CldrPatternStyle {
// Namespace for naked functions
namespace utils {
-inline int32_t insertDigitFromSymbols(NumberStringBuilder& output, int32_t index, int8_t digit,
+inline int32_t insertDigitFromSymbols(FormattedStringBuilder& output, int32_t index, int8_t digit,
const DecimalFormatSymbols& symbols, Field field,
UErrorCode& status) {
if (symbols.getCodePointZero() != -1) {
@@ -82,6 +83,23 @@ inline StandardPlural::Form getStandardPlural(const PluralRules *rules,
}
}
+/**
+ * Computes the plural form after copying the number and applying rounding rules.
+ */
+inline StandardPlural::Form getPluralSafe(
+ const RoundingImpl& rounder,
+ const PluralRules* rules,
+ const DecimalQuantity& dq,
+ UErrorCode& status) {
+ // TODO(ICU-20500): Avoid the copy?
+ DecimalQuantity copy(dq);
+ rounder.apply(copy, status);
+ if (U_FAILURE(status)) {
+ return StandardPlural::Form::OTHER;
+ }
+ return getStandardPlural(rules, copy);
+}
+
} // namespace utils
} // namespace impl
diff --git a/Build/source/libs/icu/icu-src/source/i18n/number_utypes.h b/Build/source/libs/icu/icu-src/source/i18n/number_utypes.h
index 48bfce19697..6dbe5bee68f 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/number_utypes.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/number_utypes.h
@@ -10,64 +10,33 @@
#include "unicode/numberformatter.h"
#include "number_types.h"
#include "number_decimalquantity.h"
-#include "number_stringbuilder.h"
+#include "formatted_string_builder.h"
+#include "formattedval_impl.h"
U_NAMESPACE_BEGIN namespace number {
namespace impl {
-/**
- * Implementation class for UNumberFormatter with a magic number for safety.
- *
- * Wraps a LocalizedNumberFormatter by value.
- */
-struct UNumberFormatterData : public UMemory {
- // The magic number to identify incoming objects.
- // Reads in ASCII as "NFR" (NumberFormatteR with room at the end)
- static constexpr int32_t kMagic = 0x4E465200;
-
- // Data members:
- int32_t fMagic = kMagic;
- LocalizedNumberFormatter fFormatter;
-
- /** Convert from UNumberFormatter -> UNumberFormatterData. */
- static UNumberFormatterData* validate(UNumberFormatter* input, UErrorCode& status);
-
- /** Convert from UNumberFormatter -> UNumberFormatterData (const version). */
- static const UNumberFormatterData* validate(const UNumberFormatter* input, UErrorCode& status);
-
- /** Convert from UNumberFormatterData -> UNumberFormatter. */
- UNumberFormatter* exportForC();
-};
+/** Helper function used in upluralrules.cpp */
+const DecimalQuantity* validateUFormattedNumberToDecimalQuantity(
+ const UFormattedNumber* uresult, UErrorCode& status);
/**
- * Implementation class for UFormattedNumber with magic number for safety.
+ * Struct for data used by FormattedNumber.
*
- * This struct is also held internally by the C++ version FormattedNumber since the member types are not
+ * This struct is held internally by the C++ version FormattedNumber since the member types are not
* declared in the public header file.
*
* The DecimalQuantity is not currently being used by FormattedNumber, but at some point it could be used
* to add a toDecNumber() or similar method.
*/
-struct UFormattedNumberData : public UMemory {
- // The magic number to identify incoming objects.
- // Reads in ASCII as "FDN" (FormatteDNumber with room at the end)
- static constexpr int32_t kMagic = 0x46444E00;
+class UFormattedNumberData : public FormattedValueStringBuilderImpl {
+public:
+ UFormattedNumberData() : FormattedValueStringBuilderImpl(0) {}
+ virtual ~UFormattedNumberData();
- // Data members:
- int32_t fMagic = kMagic;
DecimalQuantity quantity;
- NumberStringBuilder string;
-
- /** Convert from UFormattedNumber -> UFormattedNumberData. */
- static UFormattedNumberData* validate(UFormattedNumber* input, UErrorCode& status);
-
- /** Convert from UFormattedNumber -> UFormattedNumberData (const version). */
- static const UFormattedNumberData* validate(const UFormattedNumber* input, UErrorCode& status);
-
- /** Convert from UFormattedNumberData -> UFormattedNumber. */
- UFormattedNumber* exportForC();
};
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numfmt.cpp b/Build/source/libs/icu/icu-src/source/i18n/numfmt.cpp
index 626a5d16fb2..7c3a0551c32 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numfmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/numfmt.cpp
@@ -156,7 +156,6 @@ static const icu::number::impl::CldrPatternStyle gFormatCldrStyles[UNUM_FORMAT_S
// Static hashtable cache of NumberingSystem objects used by NumberFormat
static UHashtable * NumberingSystem_cache = NULL;
-static UMutex nscacheMutex = U_MUTEX_INITIALIZER;
static icu::UInitOnce gNSCacheInitOnce = U_INITONCE_INITIALIZER;
#if !UCONFIG_NO_SERVICE
@@ -570,7 +569,7 @@ NumberFormat::format(const Formattable& obj,
if(arg.wasCurrency() && u_strcmp(iso, getCurrency())) {
// trying to format a different currency.
// Right now, we clone.
- LocalPointer<NumberFormat> cloneFmt((NumberFormat*)this->clone());
+ LocalPointer<NumberFormat> cloneFmt(this->clone());
cloneFmt->setCurrency(iso, status);
// next line should NOT recurse, because n is numeric whereas obj was a wrapper around currency amount.
return cloneFmt->format(*n, appendTo, pos, status);
@@ -625,7 +624,7 @@ NumberFormat::format(const Formattable& obj,
if(arg.wasCurrency() && u_strcmp(iso, getCurrency())) {
// trying to format a different currency.
// Right now, we clone.
- LocalPointer<NumberFormat> cloneFmt((NumberFormat*)this->clone());
+ LocalPointer<NumberFormat> cloneFmt(this->clone());
cloneFmt->setCurrency(iso, status);
// next line should NOT recurse, because n is numeric whereas obj was a wrapper around currency amount.
return cloneFmt->format(*n, appendTo, posIter, status);
@@ -987,15 +986,19 @@ static UBool haveService() {
URegistryKey U_EXPORT2
NumberFormat::registerFactory(NumberFormatFactory* toAdopt, UErrorCode& status)
{
- ICULocaleService *service = getNumberFormatService();
- if (service) {
- NFFactory *tempnnf = new NFFactory(toAdopt);
- if (tempnnf != NULL) {
- return service->registerFactory(tempnnf, status);
- }
- }
- status = U_MEMORY_ALLOCATION_ERROR;
- return NULL;
+ if (U_FAILURE(status)) {
+ delete toAdopt;
+ return nullptr;
+ }
+ ICULocaleService *service = getNumberFormatService();
+ if (service) {
+ NFFactory *tempnnf = new NFFactory(toAdopt);
+ if (tempnnf != NULL) {
+ return service->registerFactory(tempnnf, status);
+ }
+ }
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return NULL;
}
// -------------------------------------
@@ -1056,7 +1059,7 @@ NumberFormat::createInstance(const Locale& loc, UNumberFormatStyle kind, UErrorC
if (U_FAILURE(status)) {
return NULL;
}
- NumberFormat *result = static_cast<NumberFormat *>((*shared)->clone());
+ NumberFormat *result = (*shared)->clone();
shared->removeRef();
if (result == NULL) {
status = U_MEMORY_ALLOCATION_ERROR;
@@ -1363,6 +1366,7 @@ NumberFormat::makeInstance(const Locale& desiredLocale,
// TODO: Bad hash key usage, see ticket #8504.
int32_t hashKey = desiredLocale.hashCode();
+ static UMutex nscacheMutex;
Mutex lock(&nscacheMutex);
ns = (NumberingSystem *)uhash_iget(NumberingSystem_cache, hashKey);
if (ns == NULL) {
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numparse_affixes.cpp b/Build/source/libs/icu/icu-src/source/i18n/numparse_affixes.cpp
index bf1c13e24aa..cf8bab4d81f 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numparse_affixes.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/numparse_affixes.cpp
@@ -13,6 +13,7 @@
#include "numparse_affixes.h"
#include "numparse_utils.h"
#include "number_utils.h"
+#include "string_segment.h"
using namespace icu;
using namespace icu::numparse;
@@ -100,7 +101,7 @@ void AffixPatternMatcherBuilder::consumeToken(AffixPatternType type, UChar32 cp,
addMatcher(fWarehouse.currency(status));
break;
default:
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
}
} else if (fIgnorables != nullptr && fIgnorables->getSet()->contains(cp)) {
@@ -109,7 +110,12 @@ void AffixPatternMatcherBuilder::consumeToken(AffixPatternType type, UChar32 cp,
} else {
// Case 3: the token is a non-ignorable literal.
- addMatcher(fWarehouse.nextCodePointMatcher(cp));
+ if (auto* ptr = fWarehouse.nextCodePointMatcher(cp, status)) {
+ addMatcher(*ptr);
+ } else {
+ // OOM; unwind the stack
+ return;
+ }
}
fLastTypeOrCp = type != TYPE_CODEPOINT ? type : cp;
}
@@ -125,51 +131,6 @@ AffixPatternMatcher AffixPatternMatcherBuilder::build() {
return AffixPatternMatcher(fMatchers, fMatchersLen, fPattern);
}
-
-CodePointMatcherWarehouse::CodePointMatcherWarehouse()
- : codePointCount(0), codePointNumBatches(0) {}
-
-CodePointMatcherWarehouse::~CodePointMatcherWarehouse() {
- // Delete the variable number of batches of code point matchers
- for (int32_t i = 0; i < codePointNumBatches; i++) {
- delete[] codePointsOverflow[i];
- }
-}
-
-CodePointMatcherWarehouse::CodePointMatcherWarehouse(CodePointMatcherWarehouse&& src) U_NOEXCEPT
- : codePoints(std::move(src.codePoints)),
- codePointsOverflow(std::move(src.codePointsOverflow)),
- codePointCount(src.codePointCount),
- codePointNumBatches(src.codePointNumBatches) {}
-
-CodePointMatcherWarehouse&
-CodePointMatcherWarehouse::operator=(CodePointMatcherWarehouse&& src) U_NOEXCEPT {
- codePoints = std::move(src.codePoints);
- codePointsOverflow = std::move(src.codePointsOverflow);
- codePointCount = src.codePointCount;
- codePointNumBatches = src.codePointNumBatches;
- return *this;
-}
-
-NumberParseMatcher& CodePointMatcherWarehouse::nextCodePointMatcher(UChar32 cp) {
- if (codePointCount < CODE_POINT_STACK_CAPACITY) {
- return codePoints[codePointCount++] = {cp};
- }
- int32_t totalCapacity = CODE_POINT_STACK_CAPACITY + codePointNumBatches * CODE_POINT_BATCH_SIZE;
- if (codePointCount >= totalCapacity) {
- // Need a new batch
- auto* nextBatch = new CodePointMatcher[CODE_POINT_BATCH_SIZE];
- if (codePointNumBatches >= codePointsOverflow.getCapacity()) {
- // Need more room for storing pointers to batches
- codePointsOverflow.resize(codePointNumBatches * 2, codePointNumBatches);
- }
- codePointsOverflow[codePointNumBatches++] = nextBatch;
- }
- return codePointsOverflow[codePointNumBatches - 1][(codePointCount++ - CODE_POINT_STACK_CAPACITY) %
- CODE_POINT_BATCH_SIZE] = {cp};
-}
-
-
AffixTokenMatcherWarehouse::AffixTokenMatcherWarehouse(const AffixTokenMatcherSetupData* setupData)
: fSetupData(setupData) {}
@@ -197,8 +158,15 @@ IgnorablesMatcher& AffixTokenMatcherWarehouse::ignorables() {
return fSetupData->ignorables;
}
-NumberParseMatcher& AffixTokenMatcherWarehouse::nextCodePointMatcher(UChar32 cp) {
- return fCodePoints.nextCodePointMatcher(cp);
+NumberParseMatcher* AffixTokenMatcherWarehouse::nextCodePointMatcher(UChar32 cp, UErrorCode& status) {
+ if (U_FAILURE(status)) {
+ return nullptr;
+ }
+ auto* result = fCodePoints.create(cp);
+ if (result == nullptr) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ }
+ return result;
}
@@ -313,7 +281,9 @@ void AffixMatcherWarehouse::createAffixMatchers(const AffixPatternProvider& patt
AffixPatternMatcher* posSuffix = nullptr;
// Pre-process the affix strings to resolve LDML rules like sign display.
- for (int8_t signum = 1; signum >= -1; signum--) {
+ for (int8_t signumInt = 1; signumInt >= -1; signumInt--) {
+ auto signum = static_cast<Signum>(signumInt);
+
// Generate Prefix
bool hasPrefix = false;
PatternStringUtils::patternInfoToStringBuilder(
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numparse_affixes.h b/Build/source/libs/icu/icu-src/source/i18n/numparse_affixes.h
index be8c4fb5647..e02b17ba2d0 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numparse_affixes.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/numparse_affixes.h
@@ -7,14 +7,14 @@
#ifndef __NUMPARSE_AFFIXES_H__
#define __NUMPARSE_AFFIXES_H__
+#include "cmemory.h"
+
#include "numparse_types.h"
#include "numparse_symbols.h"
#include "numparse_currency.h"
#include "number_affixutils.h"
#include "number_currencysymbols.h"
-#include <array>
-
U_NAMESPACE_BEGIN
namespace numparse {
namespace impl {
@@ -47,50 +47,20 @@ class CodePointMatcher : public NumberParseMatcher, public UMemory {
} // namespace impl
} // namespace numparse
-// Export a explicit template instantiations of MaybeStackArray and CompactUnicodeString.
+// Export a explicit template instantiations of MaybeStackArray, MemoryPool and CompactUnicodeString.
// When building DLLs for Windows this is required even though no direct access leaks out of the i18n library.
// (See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples.)
-// Note: These need to be outside of the impl::numparse namespace, or Clang will generate a compile error.
+// Note: These need to be outside of the numparse::impl namespace, or Clang will generate a compile error.
#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
+template class U_I18N_API MaybeStackArray<numparse::impl::CodePointMatcher*, 8>;
template class U_I18N_API MaybeStackArray<UChar, 4>;
-template class U_I18N_API MaybeStackArray<numparse::impl::CodePointMatcher*, 3>;
+template class U_I18N_API MemoryPool<numparse::impl::CodePointMatcher, 8>;
template class U_I18N_API numparse::impl::CompactUnicodeString<4>;
#endif
namespace numparse {
namespace impl {
-/**
- * A warehouse to retain ownership of CodePointMatchers.
- */
-// Exported as U_I18N_API for tests
-class U_I18N_API CodePointMatcherWarehouse : public UMemory {
- private:
- static constexpr int32_t CODE_POINT_STACK_CAPACITY = 5; // Number of entries directly on the stack
- static constexpr int32_t CODE_POINT_BATCH_SIZE = 10; // Number of entries per heap allocation
-
- public:
- CodePointMatcherWarehouse();
-
- // A custom destructor is needed to free the memory from MaybeStackArray.
- // A custom move constructor and move assignment seem to be needed because of the custom destructor.
-
- ~CodePointMatcherWarehouse();
-
- CodePointMatcherWarehouse(CodePointMatcherWarehouse&& src) U_NOEXCEPT;
-
- CodePointMatcherWarehouse& operator=(CodePointMatcherWarehouse&& src) U_NOEXCEPT;
-
- NumberParseMatcher& nextCodePointMatcher(UChar32 cp);
-
- private:
- std::array<CodePointMatcher, CODE_POINT_STACK_CAPACITY> codePoints; // By value
- MaybeStackArray<CodePointMatcher*, 3> codePointsOverflow; // On heap in "batches"
- int32_t codePointCount; // Total for both the ones by value and on heap
- int32_t codePointNumBatches; // Number of batches in codePointsOverflow
-};
-
-
struct AffixTokenMatcherSetupData {
const CurrencySymbols& currencySymbols;
const DecimalFormatSymbols& dfs;
@@ -129,7 +99,7 @@ class U_I18N_API AffixTokenMatcherWarehouse : public UMemory {
IgnorablesMatcher& ignorables();
- NumberParseMatcher& nextCodePointMatcher(UChar32 cp);
+ NumberParseMatcher* nextCodePointMatcher(UChar32 cp, UErrorCode& status);
private:
// NOTE: The following field may be unsafe to access after construction is done!
@@ -143,7 +113,7 @@ class U_I18N_API AffixTokenMatcherWarehouse : public UMemory {
CombinedCurrencyMatcher fCurrency;
// Use a child class for code point matchers, since it requires non-default operators.
- CodePointMatcherWarehouse fCodePoints;
+ MemoryPool<CodePointMatcher> fCodePoints;
friend class AffixPatternMatcherBuilder;
friend class AffixPatternMatcher;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numparse_compositions.cpp b/Build/source/libs/icu/icu-src/source/i18n/numparse_compositions.cpp
index 19253da805f..2f7e1ab28d1 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numparse_compositions.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/numparse_compositions.cpp
@@ -11,6 +11,7 @@
#include "numparse_types.h"
#include "numparse_compositions.h"
+#include "string_segment.h"
#include "unicode/uniset.h"
using namespace icu;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numparse_currency.cpp b/Build/source/libs/icu/icu-src/source/i18n/numparse_currency.cpp
index 598ace56533..6b53a73edf3 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numparse_currency.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/numparse_currency.cpp
@@ -14,6 +14,7 @@
#include "ucurrimp.h"
#include "unicode/errorcode.h"
#include "numparse_utils.h"
+#include "string_segment.h"
using namespace icu;
using namespace icu::numparse;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numparse_decimal.cpp b/Build/source/libs/icu/icu-src/source/i18n/numparse_decimal.cpp
index b120c5c6ad2..cf1e8156726 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numparse_decimal.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/numparse_decimal.cpp
@@ -16,6 +16,7 @@
#include "unicode/uchar.h"
#include "putilimp.h"
#include "number_decimalquantity.h"
+#include "string_segment.h"
using namespace icu;
using namespace icu::numparse;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numparse_impl.cpp b/Build/source/libs/icu/icu-src/source/i18n/numparse_impl.cpp
index 3192a395938..bf5829061a1 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numparse_impl.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/numparse_impl.cpp
@@ -39,7 +39,7 @@ NumberParserImpl::createSimpleParser(const Locale& locale, const UnicodeString&
LocalPointer<NumberParserImpl> parser(new NumberParserImpl(parseFlags));
DecimalFormatSymbols symbols(locale, status);
- parser->fLocalMatchers.ignorables = {unisets::DEFAULT_IGNORABLES};
+ parser->fLocalMatchers.ignorables = {parseFlags};
IgnorablesMatcher& ignorables = parser->fLocalMatchers.ignorables;
DecimalFormatSymbols dfs(locale, status);
@@ -72,7 +72,7 @@ NumberParserImpl::createSimpleParser(const Locale& locale, const UnicodeString&
parser->addMatcher(parser->fLocalMatchers.padding = {u"@"});
parser->addMatcher(parser->fLocalMatchers.scientific = {symbols, grouper});
parser->addMatcher(parser->fLocalMatchers.currency = {currencySymbols, symbols, parseFlags, status});
-// parser.addMatcher(new RequireNumberMatcher());
+ parser->addMatcher(parser->fLocalValidators.number = {});
parser->freeze();
return parser.orphan();
@@ -114,6 +114,7 @@ NumberParserImpl::createParserFromProperties(const number::impl::DecimalFormatPr
parseFlags |= PARSE_FLAG_STRICT_SEPARATORS;
parseFlags |= PARSE_FLAG_USE_FULL_AFFIXES;
parseFlags |= PARSE_FLAG_EXACT_AFFIX;
+ parseFlags |= PARSE_FLAG_STRICT_IGNORABLES;
} else {
parseFlags |= PARSE_FLAG_INCLUDE_UNPAIRED_AFFIXES;
}
@@ -129,8 +130,7 @@ NumberParserImpl::createParserFromProperties(const number::impl::DecimalFormatPr
LocalPointer<NumberParserImpl> parser(new NumberParserImpl(parseFlags));
- parser->fLocalMatchers.ignorables = {
- isStrict ? unisets::STRICT_IGNORABLES : unisets::DEFAULT_IGNORABLES};
+ parser->fLocalMatchers.ignorables = {parseFlags};
IgnorablesMatcher& ignorables = parser->fLocalMatchers.ignorables;
//////////////////////
@@ -252,9 +252,13 @@ void NumberParserImpl::parse(const UnicodeString& input, int32_t start, bool gre
StringSegment segment(input, 0 != (fParseFlags & PARSE_FLAG_IGNORE_CASE));
segment.adjustOffset(start);
if (greedy) {
- parseGreedyRecursive(segment, result, status);
+ parseGreedy(segment, result, status);
+ } else if (0 != (fParseFlags & PARSE_FLAG_ALLOW_INFINITE_RECURSION)) {
+ // Start at 1 so that recursionLevels never gets to 0
+ parseLongestRecursive(segment, result, 1, status);
} else {
- parseLongestRecursive(segment, result, status);
+ // Arbitrary recursion safety limit: 100 levels.
+ parseLongestRecursive(segment, result, -100, status);
}
for (int32_t i = 0; i < fNumMatchers; i++) {
fMatchers[i]->postProcess(result);
@@ -262,44 +266,53 @@ void NumberParserImpl::parse(const UnicodeString& input, int32_t start, bool gre
result.postProcess();
}
-void NumberParserImpl::parseGreedyRecursive(StringSegment& segment, ParsedNumber& result,
+void NumberParserImpl::parseGreedy(StringSegment& segment, ParsedNumber& result,
UErrorCode& status) const {
- // Base Case
- if (segment.length() == 0) {
- return;
- }
-
- int initialOffset = segment.getOffset();
- for (int32_t i = 0; i < fNumMatchers; i++) {
+ // Note: this method is not recursive in order to avoid stack overflow.
+ for (int i = 0; i <fNumMatchers;) {
+ // Base Case
+ if (segment.length() == 0) {
+ return;
+ }
const NumberParseMatcher* matcher = fMatchers[i];
if (!matcher->smokeTest(segment)) {
+ // Matcher failed smoke test: try the next one
+ i++;
continue;
}
+ int32_t initialOffset = segment.getOffset();
matcher->match(segment, result, status);
if (U_FAILURE(status)) {
return;
}
if (segment.getOffset() != initialOffset) {
- // In a greedy parse, recurse on only the first match.
- parseGreedyRecursive(segment, result, status);
- // The following line resets the offset so that the StringSegment says the same across
- // the function
- // call boundary. Since we recurse only once, this line is not strictly necessary.
- segment.setOffset(initialOffset);
- return;
+ // Greedy heuristic: accept the match and loop back
+ i = 0;
+ continue;
+ } else {
+ // Matcher did not match: try the next one
+ i++;
+ continue;
}
+ UPRV_UNREACHABLE;
}
// NOTE: If we get here, the greedy parse completed without consuming the entire string.
}
void NumberParserImpl::parseLongestRecursive(StringSegment& segment, ParsedNumber& result,
+ int32_t recursionLevels,
UErrorCode& status) const {
// Base Case
if (segment.length() == 0) {
return;
}
+ // Safety against stack overflow
+ if (recursionLevels == 0) {
+ return;
+ }
+
// TODO: Give a nice way for the matcher to reset the ParsedNumber?
ParsedNumber initial(result);
ParsedNumber candidate;
@@ -326,7 +339,7 @@ void NumberParserImpl::parseLongestRecursive(StringSegment& segment, ParsedNumbe
// If the entire segment was consumed, recurse.
if (segment.getOffset() - initialOffset == charsToConsume) {
- parseLongestRecursive(segment, candidate, status);
+ parseLongestRecursive(segment, candidate, recursionLevels + 1, status);
if (U_FAILURE(status)) {
return;
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numparse_impl.h b/Build/source/libs/icu/icu-src/source/i18n/numparse_impl.h
index 992114c7ede..380d9aa4c64 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numparse_impl.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/numparse_impl.h
@@ -18,6 +18,7 @@
#include "unicode/localpointer.h"
#include "numparse_validators.h"
#include "number_multiplier.h"
+#include "string_segment.h"
U_NAMESPACE_BEGIN
@@ -95,9 +96,10 @@ class U_I18N_API NumberParserImpl : public MutableMatcherCollection, public UMem
explicit NumberParserImpl(parse_flags_t parseFlags);
- void parseGreedyRecursive(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const;
+ void parseGreedy(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const;
- void parseLongestRecursive(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const;
+ void parseLongestRecursive(
+ StringSegment& segment, ParsedNumber& result, int32_t recursionLevels, UErrorCode& status) const;
};
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numparse_parsednumber.cpp b/Build/source/libs/icu/icu-src/source/i18n/numparse_parsednumber.cpp
index 98da4e83192..4b373a3c312 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numparse_parsednumber.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/numparse_parsednumber.cpp
@@ -11,6 +11,7 @@
#include "numparse_types.h"
#include "number_decimalquantity.h"
+#include "string_segment.h"
#include "putilimp.h"
#include <cmath>
@@ -52,7 +53,7 @@ bool ParsedNumber::seenNumber() const {
return !quantity.bogus || 0 != (flags & FLAG_NAN) || 0 != (flags & FLAG_INFINITY);
}
-double ParsedNumber::getDouble() const {
+double ParsedNumber::getDouble(UErrorCode& status) const {
bool sawNaN = 0 != (flags & FLAG_NAN);
bool sawInfinity = 0 != (flags & FLAG_INFINITY);
@@ -69,8 +70,11 @@ double ParsedNumber::getDouble() const {
return INFINITY;
}
}
- U_ASSERT(!quantity.bogus);
- if (quantity.isZero() && quantity.isNegative()) {
+ if (quantity.bogus) {
+ status = U_INVALID_STATE_ERROR;
+ return 0.0;
+ }
+ if (quantity.isZeroish() && quantity.isNegative()) {
return -0.0;
}
@@ -103,7 +107,7 @@ void ParsedNumber::populateFormattable(Formattable& output, parse_flags_t parseF
}
}
U_ASSERT(!quantity.bogus);
- if (quantity.isZero() && quantity.isNegative() && !integerOnly) {
+ if (quantity.isZeroish() && quantity.isNegative() && !integerOnly) {
output.setDouble(-0.0);
return;
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numparse_scientific.cpp b/Build/source/libs/icu/icu-src/source/i18n/numparse_scientific.cpp
index de389574408..4b88cd998fe 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numparse_scientific.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/numparse_scientific.cpp
@@ -12,6 +12,7 @@
#include "numparse_types.h"
#include "numparse_scientific.h"
#include "static_unicode_sets.h"
+#include "string_segment.h"
using namespace icu;
using namespace icu::numparse;
@@ -33,7 +34,8 @@ inline const UnicodeSet& plusSignSet() {
ScientificMatcher::ScientificMatcher(const DecimalFormatSymbols& dfs, const Grouper& grouper)
: fExponentSeparatorString(dfs.getConstSymbol(DecimalFormatSymbols::kExponentialSymbol)),
- fExponentMatcher(dfs, grouper, PARSE_FLAG_INTEGER_ONLY | PARSE_FLAG_GROUPING_DISABLED) {
+ fExponentMatcher(dfs, grouper, PARSE_FLAG_INTEGER_ONLY | PARSE_FLAG_GROUPING_DISABLED),
+ fIgnorablesMatcher(PARSE_FLAG_STRICT_IGNORABLES) {
const UnicodeString& minusSign = dfs.getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol);
if (minusSignSet().contains(minusSign)) {
@@ -63,15 +65,25 @@ bool ScientificMatcher::match(StringSegment& segment, ParsedNumber& result, UErr
// First match the scientific separator, and then match another number after it.
// NOTE: This is guarded by the smoke test; no need to check fExponentSeparatorString length again.
- int overlap1 = segment.getCommonPrefixLength(fExponentSeparatorString);
- if (overlap1 == fExponentSeparatorString.length()) {
+ int32_t initialOffset = segment.getOffset();
+ int32_t overlap = segment.getCommonPrefixLength(fExponentSeparatorString);
+ if (overlap == fExponentSeparatorString.length()) {
// Full exponent separator match.
// First attempt to get a code point, returning true if we can't get one.
- if (segment.length() == overlap1) {
+ if (segment.length() == overlap) {
+ return true;
+ }
+ segment.adjustOffset(overlap);
+
+ // Allow ignorables before the sign.
+ // Note: call site is guarded by the segment.length() check above.
+ // Note: the ignorables matcher should not touch the result.
+ fIgnorablesMatcher.match(segment, result, status);
+ if (segment.length() == 0) {
+ segment.setOffset(initialOffset);
return true;
}
- segment.adjustOffset(overlap1);
// Allow a sign, and then try to match digits.
int8_t exponentSign = 1;
@@ -81,24 +93,37 @@ bool ScientificMatcher::match(StringSegment& segment, ParsedNumber& result, UErr
} else if (segment.startsWith(plusSignSet())) {
segment.adjustOffsetByCodePoint();
} else if (segment.startsWith(fCustomMinusSign)) {
- // Note: call site is guarded with startsWith, which returns false on empty string
- int32_t overlap2 = segment.getCommonPrefixLength(fCustomMinusSign);
- if (overlap2 != fCustomMinusSign.length()) {
- // Partial custom sign match; un-match the exponent separator.
- segment.adjustOffset(-overlap1);
+ overlap = segment.getCommonPrefixLength(fCustomMinusSign);
+ if (overlap != fCustomMinusSign.length()) {
+ // Partial custom sign match
+ segment.setOffset(initialOffset);
return true;
}
exponentSign = -1;
- segment.adjustOffset(overlap2);
+ segment.adjustOffset(overlap);
} else if (segment.startsWith(fCustomPlusSign)) {
- // Note: call site is guarded with startsWith, which returns false on empty string
- int32_t overlap2 = segment.getCommonPrefixLength(fCustomPlusSign);
- if (overlap2 != fCustomPlusSign.length()) {
- // Partial custom sign match; un-match the exponent separator.
- segment.adjustOffset(-overlap1);
+ overlap = segment.getCommonPrefixLength(fCustomPlusSign);
+ if (overlap != fCustomPlusSign.length()) {
+ // Partial custom sign match
+ segment.setOffset(initialOffset);
return true;
}
- segment.adjustOffset(overlap2);
+ segment.adjustOffset(overlap);
+ }
+
+ // Return true if the segment is empty.
+ if (segment.length() == 0) {
+ segment.setOffset(initialOffset);
+ return true;
+ }
+
+ // Allow ignorables after the sign.
+ // Note: call site is guarded by the segment.length() check above.
+ // Note: the ignorables matcher should not touch the result.
+ fIgnorablesMatcher.match(segment, result, status);
+ if (segment.length() == 0) {
+ segment.setOffset(initialOffset);
+ return true;
}
// We are supposed to accept E0 after NaN, so we need to make sure result.quantity is available.
@@ -112,12 +137,12 @@ bool ScientificMatcher::match(StringSegment& segment, ParsedNumber& result, UErr
// At least one exponent digit was matched.
result.flags |= FLAG_HAS_EXPONENT;
} else {
- // No exponent digits were matched; un-match the exponent separator.
- segment.adjustOffset(-overlap1);
+ // No exponent digits were matched
+ segment.setOffset(initialOffset);
}
return digitsReturnValue;
- } else if (overlap1 == segment.length()) {
+ } else if (overlap == segment.length()) {
// Partial exponent separator match
return true;
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numparse_scientific.h b/Build/source/libs/icu/icu-src/source/i18n/numparse_scientific.h
index ddecf858af3..5617c0c6a60 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numparse_scientific.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/numparse_scientific.h
@@ -9,6 +9,7 @@
#include "numparse_types.h"
#include "numparse_decimal.h"
+#include "numparse_symbols.h"
#include "unicode/numberformatter.h"
using icu::number::impl::Grouper;
@@ -32,6 +33,7 @@ class ScientificMatcher : public NumberParseMatcher, public UMemory {
private:
UnicodeString fExponentSeparatorString;
DecimalMatcher fExponentMatcher;
+ IgnorablesMatcher fIgnorablesMatcher;
UnicodeString fCustomMinusSign;
UnicodeString fCustomPlusSign;
};
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numparse_stringsegment.h b/Build/source/libs/icu/icu-src/source/i18n/numparse_stringsegment.h
deleted file mode 100644
index 7a84444d414..00000000000
--- a/Build/source/libs/icu/icu-src/source/i18n/numparse_stringsegment.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// © 2018 and later: Unicode, Inc. and others.
-// License & terms of use: http://www.unicode.org/copyright.html
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_FORMATTING
-#ifndef __NUMPARSE_STRINGSEGMENT_H__
-#define __NUMPARSE_STRINGSEGMENT_H__
-
-#include "numparse_types.h"
-#include "number_types.h"
-#include "unicode/unistr.h"
-
-U_NAMESPACE_BEGIN
-namespace numparse {
-namespace impl {
-
-
-} // namespace impl
-} // namespace numparse
-U_NAMESPACE_END
-
-#endif //__NUMPARSE_STRINGSEGMENT_H__
-#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numparse_symbols.cpp b/Build/source/libs/icu/icu-src/source/i18n/numparse_symbols.cpp
index 9ccceec8475..608f4f5c8b0 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numparse_symbols.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/numparse_symbols.cpp
@@ -12,6 +12,7 @@
#include "numparse_types.h"
#include "numparse_symbols.h"
#include "numparse_utils.h"
+#include "string_segment.h"
using namespace icu;
using namespace icu::numparse;
@@ -68,8 +69,12 @@ UnicodeString SymbolMatcher::toString() const {
}
-IgnorablesMatcher::IgnorablesMatcher(unisets::Key key)
- : SymbolMatcher({}, key) {
+IgnorablesMatcher::IgnorablesMatcher(parse_flags_t parseFlags) :
+ SymbolMatcher(
+ {},
+ (0 != (parseFlags & PARSE_FLAG_STRICT_IGNORABLES)) ?
+ unisets::STRICT_IGNORABLES :
+ unisets::DEFAULT_IGNORABLES) {
}
bool IgnorablesMatcher::isFlexible() const {
@@ -90,7 +95,7 @@ void IgnorablesMatcher::accept(StringSegment&, ParsedNumber&) const {
InfinityMatcher::InfinityMatcher(const DecimalFormatSymbols& dfs)
- : SymbolMatcher(dfs.getConstSymbol(DecimalFormatSymbols::kInfinitySymbol), unisets::INFINITY_KEY) {
+ : SymbolMatcher(dfs.getConstSymbol(DecimalFormatSymbols::kInfinitySymbol), unisets::INFINITY_SIGN) {
}
bool InfinityMatcher::isDisabled(const ParsedNumber& result) const {
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numparse_symbols.h b/Build/source/libs/icu/icu-src/source/i18n/numparse_symbols.h
index 8912ee95b0d..beb133f7d07 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numparse_symbols.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/numparse_symbols.h
@@ -50,7 +50,7 @@ class U_I18N_API IgnorablesMatcher : public SymbolMatcher {
public:
IgnorablesMatcher() = default; // WARNING: Leaves the object in an unusable state
- IgnorablesMatcher(unisets::Key key);
+ IgnorablesMatcher(parse_flags_t parseFlags);
bool isFlexible() const override;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numparse_types.h b/Build/source/libs/icu/icu-src/source/i18n/numparse_types.h
index ab591eaba83..b4007c2ff5b 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numparse_types.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/numparse_types.h
@@ -9,12 +9,13 @@
#include "unicode/uobject.h"
#include "number_decimalquantity.h"
+#include "string_segment.h"
-U_NAMESPACE_BEGIN namespace numparse {
+U_NAMESPACE_BEGIN
+namespace numparse {
namespace impl {
// Forward-declarations
-class StringSegment;
class ParsedNumber;
typedef int32_t result_flags_t;
@@ -49,6 +50,8 @@ enum ParseFlags {
// PARSE_FLAG_OPTIMIZE = 0x0800, // no longer used
// PARSE_FLAG_FORCE_BIG_DECIMAL = 0x1000, // not used in ICU4C
PARSE_FLAG_NO_FOREIGN_CURRENCY = 0x2000,
+ PARSE_FLAG_ALLOW_INFINITE_RECURSION = 0x4000,
+ PARSE_FLAG_STRICT_IGNORABLES = 0x8000,
};
@@ -63,7 +66,7 @@ class CompactUnicodeString {
CompactUnicodeString(const UnicodeString& text)
: fBuffer(text.length() + 1) {
- memcpy(fBuffer.getAlias(), text.getBuffer(), sizeof(UChar) * text.length());
+ uprv_memcpy(fBuffer.getAlias(), text.getBuffer(), sizeof(UChar) * text.length());
fBuffer[text.length()] = 0;
}
@@ -160,7 +163,7 @@ class U_I18N_API ParsedNumber {
bool seenNumber() const;
- double getDouble() const;
+ double getDouble(UErrorCode& status) const;
void populateFormattable(Formattable& output, parse_flags_t parseFlags) const;
@@ -169,115 +172,6 @@ class U_I18N_API ParsedNumber {
/**
- * A mutable class allowing for a String with a variable offset and length. The charAt, length, and
- * subSequence methods all operate relative to the fixed offset into the String.
- *
- * @author sffc
- */
-// Exported as U_I18N_API for tests
-class U_I18N_API StringSegment : public UMemory {
- public:
- StringSegment(const UnicodeString& str, bool ignoreCase);
-
- int32_t getOffset() const;
-
- void setOffset(int32_t start);
-
- /**
- * Equivalent to <code>setOffset(getOffset()+delta)</code>.
- *
- * <p>
- * This method is usually called by a Matcher to register that a char was consumed. If the char is
- * strong (it usually is, except for things like whitespace), follow this with a call to
- * {@link ParsedNumber#setCharsConsumed}. For more information on strong chars, see that method.
- */
- void adjustOffset(int32_t delta);
-
- /**
- * Adjusts the offset by the width of the current code point, either 1 or 2 chars.
- */
- void adjustOffsetByCodePoint();
-
- void setLength(int32_t length);
-
- void resetLength();
-
- int32_t length() const;
-
- char16_t charAt(int32_t index) const;
-
- UChar32 codePointAt(int32_t index) const;
-
- UnicodeString toUnicodeString() const;
-
- const UnicodeString toTempUnicodeString() const;
-
- /**
- * Returns the first code point in the string segment, or -1 if the string starts with an invalid
- * code point.
- *
- * <p>
- * <strong>Important:</strong> Most of the time, you should use {@link #matches}, which handles case
- * folding logic, instead of this method.
- */
- UChar32 getCodePoint() const;
-
- /**
- * Returns true if the first code point of this StringSegment equals the given code point.
- *
- * <p>
- * This method will perform case folding if case folding is enabled for the parser.
- */
- bool startsWith(UChar32 otherCp) const;
-
- /**
- * Returns true if the first code point of this StringSegment is in the given UnicodeSet.
- */
- bool startsWith(const UnicodeSet& uniset) const;
-
- /**
- * Returns true if there is at least one code point of overlap between this StringSegment and the
- * given UnicodeString.
- */
- bool startsWith(const UnicodeString& other) const;
-
- /**
- * Returns the length of the prefix shared by this StringSegment and the given CharSequence. For
- * example, if this string segment is "aab", and the char sequence is "aac", this method returns 2,
- * since the first 2 characters are the same.
- *
- * <p>
- * This method only returns offsets along code point boundaries.
- *
- * <p>
- * This method will perform case folding if case folding was enabled in the constructor.
- *
- * <p>
- * IMPORTANT: The given UnicodeString must not be empty! It is the caller's responsibility to check.
- */
- int32_t getCommonPrefixLength(const UnicodeString& other);
-
- /**
- * Like {@link #getCommonPrefixLength}, but never performs case folding, even if case folding is
- * enabled for the parser.
- */
- int32_t getCaseSensitivePrefixLength(const UnicodeString& other);
-
- bool operator==(const UnicodeString& other) const;
-
- private:
- const UnicodeString fStr;
- int32_t fStart;
- int32_t fEnd;
- bool fFoldCase;
-
- int32_t getPrefixLengthInternal(const UnicodeString& other, bool foldCase);
-
- static bool codePointsEqual(UChar32 cp1, UChar32 cp2, bool foldCase);
-};
-
-
-/**
* The core interface implemented by all matchers used for number parsing.
*
* Given a string, there should NOT be more than one way to consume the string with the same matcher
@@ -346,7 +240,7 @@ class U_I18N_API NumberParseMatcher {
*/
virtual void postProcess(ParsedNumber&) const {
// Default implementation: no-op
- };
+ }
// String for debugging
virtual UnicodeString toString() const = 0;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numrange_fluent.cpp b/Build/source/libs/icu/icu-src/source/i18n/numrange_fluent.cpp
index 12b006c8ad5..654cafaf00b 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numrange_fluent.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/numrange_fluent.cpp
@@ -162,6 +162,16 @@ Derived NumberRangeFormatterSettings<Derived>::identityFallback(UNumberRangeIden
return move;
}
+template<typename Derived>
+LocalPointer<Derived> NumberRangeFormatterSettings<Derived>::clone() const & {
+ return LocalPointer<Derived>(new Derived(*this));
+}
+
+template<typename Derived>
+LocalPointer<Derived> NumberRangeFormatterSettings<Derived>::clone() && {
+ return LocalPointer<Derived>(new Derived(std::move(*this)));
+}
+
// Declare all classes that implement NumberRangeFormatterSettings
// See https://stackoverflow.com/a/495056/1407170
template
@@ -318,6 +328,10 @@ void LocalizedNumberRangeFormatter::formatImpl(
return;
}
impl->format(results, equalBeforeRounding, status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+ results.getStringRef().writeTerminator(status);
}
const impl::NumberRangeFormatterImpl*
@@ -361,56 +375,14 @@ LocalizedNumberRangeFormatter::getFormatter(UErrorCode& status) const {
}
-FormattedNumberRange::FormattedNumberRange(FormattedNumberRange&& src) U_NOEXCEPT
- : fResults(src.fResults), fErrorCode(src.fErrorCode) {
- // Disown src.fResults to prevent double-deletion
- src.fResults = nullptr;
- src.fErrorCode = U_INVALID_STATE_ERROR;
-}
+UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(FormattedNumberRange)
-FormattedNumberRange& FormattedNumberRange::operator=(FormattedNumberRange&& src) U_NOEXCEPT {
- delete fResults;
- fResults = src.fResults;
- fErrorCode = src.fErrorCode;
- // Disown src.fResults to prevent double-deletion
- src.fResults = nullptr;
- src.fErrorCode = U_INVALID_STATE_ERROR;
- return *this;
-}
-
-UnicodeString FormattedNumberRange::toString(UErrorCode& status) const {
- if (U_FAILURE(status)) {
- return ICU_Utility::makeBogusString();
- }
- if (fResults == nullptr) {
- status = fErrorCode;
- return ICU_Utility::makeBogusString();
- }
- return fResults->string.toUnicodeString();
-}
-
-Appendable& FormattedNumberRange::appendTo(Appendable& appendable, UErrorCode& status) const {
- if (U_FAILURE(status)) {
- return appendable;
- }
- if (fResults == nullptr) {
- status = fErrorCode;
- return appendable;
- }
- appendable.appendString(fResults->string.chars(), fResults->string.length());
- return appendable;
-}
+#define UPRV_NOARG
UBool FormattedNumberRange::nextFieldPosition(FieldPosition& fieldPosition, UErrorCode& status) const {
- if (U_FAILURE(status)) {
- return FALSE;
- }
- if (fResults == nullptr) {
- status = fErrorCode;
- return FALSE;
- }
+ UPRV_FORMATTED_VALUE_METHOD_GUARD(FALSE)
// NOTE: MSVC sometimes complains when implicitly converting between bool and UBool
- return fResults->string.nextFieldPosition(fieldPosition, status) ? TRUE : FALSE;
+ return fData->nextFieldPosition(fieldPosition, status);
}
void FormattedNumberRange::getAllFieldPositions(FieldPositionIterator& iterator, UErrorCode& status) const {
@@ -420,52 +392,27 @@ void FormattedNumberRange::getAllFieldPositions(FieldPositionIterator& iterator,
void FormattedNumberRange::getAllFieldPositionsImpl(
FieldPositionIteratorHandler& fpih, UErrorCode& status) const {
- if (U_FAILURE(status)) {
- return;
- }
- if (fResults == nullptr) {
- status = fErrorCode;
- return;
- }
- fResults->string.getAllFieldPositions(fpih, status);
+ UPRV_FORMATTED_VALUE_METHOD_GUARD(UPRV_NOARG)
+ fData->getAllFieldPositions(fpih, status);
}
UnicodeString FormattedNumberRange::getFirstDecimal(UErrorCode& status) const {
- if (U_FAILURE(status)) {
- return ICU_Utility::makeBogusString();
- }
- if (fResults == nullptr) {
- status = fErrorCode;
- return ICU_Utility::makeBogusString();
- }
- return fResults->quantity1.toScientificString();
+ UPRV_FORMATTED_VALUE_METHOD_GUARD(ICU_Utility::makeBogusString())
+ return fData->quantity1.toScientificString();
}
UnicodeString FormattedNumberRange::getSecondDecimal(UErrorCode& status) const {
- if (U_FAILURE(status)) {
- return ICU_Utility::makeBogusString();
- }
- if (fResults == nullptr) {
- status = fErrorCode;
- return ICU_Utility::makeBogusString();
- }
- return fResults->quantity2.toScientificString();
+ UPRV_FORMATTED_VALUE_METHOD_GUARD(ICU_Utility::makeBogusString())
+ return fData->quantity2.toScientificString();
}
UNumberRangeIdentityResult FormattedNumberRange::getIdentityResult(UErrorCode& status) const {
- if (U_FAILURE(status)) {
- return UNUM_IDENTITY_RESULT_NOT_EQUAL;
- }
- if (fResults == nullptr) {
- status = fErrorCode;
- return UNUM_IDENTITY_RESULT_NOT_EQUAL;
- }
- return fResults->identityResult;
+ UPRV_FORMATTED_VALUE_METHOD_GUARD(UNUM_IDENTITY_RESULT_NOT_EQUAL)
+ return fData->identityResult;
}
-FormattedNumberRange::~FormattedNumberRange() {
- delete fResults;
-}
+
+UFormattedNumberRangeData::~UFormattedNumberRangeData() = default;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numrange_impl.cpp b/Build/source/libs/icu/icu-src/source/i18n/numrange_impl.cpp
index 21365bfc59b..7d732b31ec1 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numrange_impl.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/numrange_impl.cpp
@@ -41,12 +41,12 @@ class NumberRangeDataSink : public ResourceSink {
if (U_FAILURE(status)) { return; }
for (int i = 0; miscTable.getKeyAndValue(i, key, value); i++) {
if (uprv_strcmp(key, "range") == 0) {
- if (fData.rangePattern.getArgumentLimit() != 0) {
+ if (hasRangeData()) {
continue; // have already seen this pattern
}
fData.rangePattern = {value.getUnicodeString(status), status};
} else if (uprv_strcmp(key, "approximately") == 0) {
- if (fData.approximatelyPattern.getArgumentLimit() != 0) {
+ if (hasApproxData()) {
continue; // have already seen this pattern
}
fData.approximatelyPattern = {value.getUnicodeString(status), status};
@@ -54,6 +54,27 @@ class NumberRangeDataSink : public ResourceSink {
}
}
+ bool hasRangeData() {
+ return fData.rangePattern.getArgumentLimit() != 0;
+ }
+
+ bool hasApproxData() {
+ return fData.approximatelyPattern.getArgumentLimit() != 0;
+ }
+
+ bool isComplete() {
+ return hasRangeData() && hasApproxData();
+ }
+
+ void fillInDefaults(UErrorCode& status) {
+ if (!hasRangeData()) {
+ fData.rangePattern = {u"{0}–{1}", status};
+ }
+ if (!hasApproxData()) {
+ fData.approximatelyPattern = {u"~{0}", status};
+ }
+ }
+
private:
NumberRangeData& fData;
};
@@ -68,19 +89,21 @@ void getNumberRangeData(const char* localeName, const char* nsName, NumberRangeD
dataPath.append("NumberElements/", -1, status);
dataPath.append(nsName, -1, status);
dataPath.append("/miscPatterns", -1, status);
- ures_getAllItemsWithFallback(rb.getAlias(), dataPath.data(), sink, status);
if (U_FAILURE(status)) { return; }
- // TODO: Is it necessary to manually fall back to latn, or does the data sink take care of that?
-
- if (data.rangePattern.getArgumentLimit() == 0) {
- // No data!
- data.rangePattern = {u"{0}–{1}", status};
+ UErrorCode localStatus = U_ZERO_ERROR;
+ ures_getAllItemsWithFallback(rb.getAlias(), dataPath.data(), sink, localStatus);
+ if (U_FAILURE(localStatus) && localStatus != U_MISSING_RESOURCE_ERROR) {
+ status = localStatus;
+ return;
}
- if (data.approximatelyPattern.getArgumentLimit() == 0) {
- // No data!
- data.approximatelyPattern = {u"~{0}", status};
+
+ // Fall back to latn if necessary
+ if (!sink.isComplete()) {
+ ures_getAllItemsWithFallback(rb.getAlias(), "NumberElements/latn/miscPatterns", sink, status);
}
+
+ sink.fillInDefaults(status);
}
class PluralRangesDataSink : public ResourceSink {
@@ -177,15 +200,14 @@ NumberRangeFormatterImpl::NumberRangeFormatterImpl(const RangeMacroProps& macros
fCollapse(macros.collapse),
fIdentityFallback(macros.identityFallback) {
- // TODO: As of this writing (ICU 63), there is no locale that has different number miscPatterns
- // based on numbering system. Therefore, data is loaded only from latn. If this changes,
- // this part of the code should be updated to load from the local numbering system.
- // The numbering system could come from the one specified in the NumberFormatter passed to
- // numberFormatterBoth() or similar.
- // See ICU-20144
+ const char* nsName = formatterImpl1.getRawMicroProps().nsName;
+ if (uprv_strcmp(nsName, formatterImpl2.getRawMicroProps().nsName) != 0) {
+ status = U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
NumberRangeData data;
- getNumberRangeData(macros.locale.getName(), "latn", data, status);
+ getNumberRangeData(macros.locale.getName(), nsName, data, status);
if (U_FAILURE(status)) { return; }
fRangeFormatter = data.rangePattern;
fApproximatelyModifier = {data.approximatelyPattern, UNUM_FIELD_COUNT, false};
@@ -269,8 +291,7 @@ void NumberRangeFormatterImpl::format(UFormattedNumberRangeData& data, bool equa
break;
default:
- U_ASSERT(false);
- break;
+ UPRV_UNREACHABLE;
}
}
@@ -280,8 +301,8 @@ void NumberRangeFormatterImpl::formatSingleValue(UFormattedNumberRangeData& data
UErrorCode& status) const {
if (U_FAILURE(status)) { return; }
if (fSameFormatters) {
- int32_t length = NumberFormatterImpl::writeNumber(micros1, data.quantity1, data.string, 0, status);
- NumberFormatterImpl::writeAffixes(micros1, data.string, 0, length, status);
+ int32_t length = NumberFormatterImpl::writeNumber(micros1, data.quantity1, data.getStringRef(), 0, status);
+ NumberFormatterImpl::writeAffixes(micros1, data.getStringRef(), 0, length, status);
} else {
formatRange(data, micros1, micros2, status);
}
@@ -293,12 +314,12 @@ void NumberRangeFormatterImpl::formatApproximately (UFormattedNumberRangeData& d
UErrorCode& status) const {
if (U_FAILURE(status)) { return; }
if (fSameFormatters) {
- int32_t length = NumberFormatterImpl::writeNumber(micros1, data.quantity1, data.string, 0, status);
+ int32_t length = NumberFormatterImpl::writeNumber(micros1, data.quantity1, data.getStringRef(), 0, status);
// HEURISTIC: Desired modifier order: inner, middle, approximately, outer.
- length += micros1.modInner->apply(data.string, 0, length, status);
- length += micros1.modMiddle->apply(data.string, 0, length, status);
- length += fApproximatelyModifier.apply(data.string, 0, length, status);
- micros1.modOuter->apply(data.string, 0, length, status);
+ length += micros1.modInner->apply(data.getStringRef(), 0, length, status);
+ length += micros1.modMiddle->apply(data.getStringRef(), 0, length, status);
+ length += fApproximatelyModifier.apply(data.getStringRef(), 0, length, status);
+ micros1.modOuter->apply(data.getStringRef(), 0, length, status);
} else {
formatRange(data, micros1, micros2, status);
}
@@ -376,7 +397,7 @@ void NumberRangeFormatterImpl::formatRange(UFormattedNumberRangeData& data,
break;
}
- NumberStringBuilder& string = data.string;
+ FormattedStringBuilder& string = data.getStringRef();
int32_t lengthPrefix = 0;
int32_t length1 = 0;
int32_t lengthInfix = 0;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numrange_impl.h b/Build/source/libs/icu/icu-src/source/i18n/numrange_impl.h
index 787fc656860..f88e3009136 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numrange_impl.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/numrange_impl.h
@@ -13,7 +13,8 @@
#include "number_types.h"
#include "number_decimalquantity.h"
#include "number_formatimpl.h"
-#include "number_stringbuilder.h"
+#include "formatted_string_builder.h"
+#include "formattedval_impl.h"
U_NAMESPACE_BEGIN namespace number {
namespace impl {
@@ -24,20 +25,18 @@ namespace impl {
*
* Has incomplete magic number logic that will need to be finished
* if this is to be exposed as C API in the future.
+ *
+ * Possible magic number: 0x46445200
+ * Reads in ASCII as "FDR" (FormatteDnumberRange with room at the end)
*/
-struct UFormattedNumberRangeData : public UMemory {
- // The magic number to identify incoming objects.
- // Reads in ASCII as "FDR" (FormatteDnumberRange with room at the end)
- static constexpr int32_t kMagic = 0x46445200;
+class UFormattedNumberRangeData : public FormattedValueStringBuilderImpl {
+public:
+ UFormattedNumberRangeData() : FormattedValueStringBuilderImpl(0) {}
+ virtual ~UFormattedNumberRangeData();
- // Data members:
- int32_t fMagic = kMagic;
DecimalQuantity quantity1;
DecimalQuantity quantity2;
- NumberStringBuilder string;
UNumberRangeIdentityResult identityResult = UNUM_IDENTITY_RESULT_COUNT;
-
- // No C conversion methods (no C API yet)
};
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numsys.cpp b/Build/source/libs/icu/icu-src/source/i18n/numsys.cpp
index 162c50a5fe9..ee530e8d333 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numsys.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/numsys.cpp
@@ -26,6 +26,8 @@
#include "unicode/numsys.h"
#include "cstring.h"
#include "uassert.h"
+#include "ucln_in.h"
+#include "umutex.h"
#include "uresimp.h"
#include "numsys_impl.h"
@@ -35,7 +37,7 @@ U_NAMESPACE_BEGIN
// Useful constants
-#define DEFAULT_DIGITS UNICODE_STRING_SIMPLE("0123456789");
+#define DEFAULT_DIGITS UNICODE_STRING_SIMPLE("0123456789")
static const char gNumberingSystems[] = "numberingSystems";
static const char gNumberElements[] = "NumberElements";
static const char gDefault[] = "default";
@@ -258,83 +260,90 @@ void NumberingSystem::setName(const char *n) {
if ( n == nullptr ) {
name[0] = (char) 0;
} else {
- uprv_strncpy(name,n,NUMSYS_NAME_CAPACITY);
- name[NUMSYS_NAME_CAPACITY] = '\0'; // Make sure it is null terminated.
+ uprv_strncpy(name,n,kInternalNumSysNameCapacity);
+ name[kInternalNumSysNameCapacity] = '\0'; // Make sure it is null terminated.
}
}
UBool NumberingSystem::isAlgorithmic() const {
return ( algorithmic );
}
-StringEnumeration* NumberingSystem::getAvailableNames(UErrorCode &status) {
- // TODO(ticket #11908): Init-once static cache, with u_cleanup() callback.
- static StringEnumeration* availableNames = nullptr;
+namespace {
+
+UVector* gNumsysNames = nullptr;
+UInitOnce gNumSysInitOnce = U_INITONCE_INITIALIZER;
+
+U_CFUNC UBool U_CALLCONV numSysCleanup() {
+ delete gNumsysNames;
+ gNumsysNames = nullptr;
+ gNumSysInitOnce.reset();
+ return true;
+}
+U_CFUNC void initNumsysNames(UErrorCode &status) {
+ U_ASSERT(gNumsysNames == nullptr);
+ ucln_i18n_registerCleanup(UCLN_I18N_NUMSYS, numSysCleanup);
+
+ // TODO: Simple array of UnicodeString objects, based on length of table resource?
+ LocalPointer<UVector> numsysNames(new UVector(uprv_deleteUObject, nullptr, status), status);
if (U_FAILURE(status)) {
- return nullptr;
+ return;
}
- if ( availableNames == nullptr ) {
- // TODO: Simple array of UnicodeString objects, based on length of table resource?
- LocalPointer<UVector> numsysNames(new UVector(uprv_deleteUObject, nullptr, status), status);
- if (U_FAILURE(status)) {
- return nullptr;
- }
-
- UErrorCode rbstatus = U_ZERO_ERROR;
- UResourceBundle *numberingSystemsInfo = ures_openDirect(nullptr, "numberingSystems", &rbstatus);
- numberingSystemsInfo = ures_getByKey(numberingSystemsInfo, "numberingSystems", numberingSystemsInfo, &rbstatus);
- if (U_FAILURE(rbstatus)) {
- // Don't stomp on the catastrophic failure of OOM.
- if (rbstatus == U_MEMORY_ALLOCATION_ERROR) {
- status = rbstatus;
- } else {
- status = U_MISSING_RESOURCE_ERROR;
- }
- ures_close(numberingSystemsInfo);
- return nullptr;
+ UErrorCode rbstatus = U_ZERO_ERROR;
+ UResourceBundle *numberingSystemsInfo = ures_openDirect(nullptr, "numberingSystems", &rbstatus);
+ numberingSystemsInfo =
+ ures_getByKey(numberingSystemsInfo, "numberingSystems", numberingSystemsInfo, &rbstatus);
+ if (U_FAILURE(rbstatus)) {
+ // Don't stomp on the catastrophic failure of OOM.
+ if (rbstatus == U_MEMORY_ALLOCATION_ERROR) {
+ status = rbstatus;
+ } else {
+ status = U_MISSING_RESOURCE_ERROR;
}
+ ures_close(numberingSystemsInfo);
+ return;
+ }
- while ( ures_hasNext(numberingSystemsInfo) && U_SUCCESS(status) ) {
- LocalUResourceBundlePointer nsCurrent(ures_getNextResource(numberingSystemsInfo, nullptr, &rbstatus));
- if (rbstatus == U_MEMORY_ALLOCATION_ERROR) {
- status = rbstatus; // we want to report OOM failure back to the caller.
- break;
- }
- const char *nsName = ures_getKey(nsCurrent.getAlias());
- LocalPointer<UnicodeString> newElem(new UnicodeString(nsName, -1, US_INV), status);
+ while ( ures_hasNext(numberingSystemsInfo) && U_SUCCESS(status) ) {
+ LocalUResourceBundlePointer nsCurrent(ures_getNextResource(numberingSystemsInfo, nullptr, &rbstatus));
+ if (rbstatus == U_MEMORY_ALLOCATION_ERROR) {
+ status = rbstatus; // we want to report OOM failure back to the caller.
+ break;
+ }
+ const char *nsName = ures_getKey(nsCurrent.getAlias());
+ LocalPointer<UnicodeString> newElem(new UnicodeString(nsName, -1, US_INV), status);
+ if (U_SUCCESS(status)) {
+ numsysNames->addElement(newElem.getAlias(), status);
if (U_SUCCESS(status)) {
- numsysNames->addElement(newElem.getAlias(), status);
- if (U_SUCCESS(status)) {
- newElem.orphan(); // on success, the numsysNames vector owns newElem.
- }
+ newElem.orphan(); // on success, the numsysNames vector owns newElem.
}
}
+ }
- ures_close(numberingSystemsInfo);
- if (U_FAILURE(status)) {
- return nullptr;
- }
- availableNames = new NumsysNameEnumeration(numsysNames.getAlias(), status);
- if (availableNames == nullptr) {
- status = U_MEMORY_ALLOCATION_ERROR;
- return nullptr;
- }
- numsysNames.orphan(); // The names got adopted.
+ ures_close(numberingSystemsInfo);
+ if (U_SUCCESS(status)) {
+ gNumsysNames = numsysNames.orphan();
}
+ return;
+}
- return availableNames;
+} // end anonymous namespace
+
+StringEnumeration* NumberingSystem::getAvailableNames(UErrorCode &status) {
+ umtx_initOnce(gNumSysInitOnce, &initNumsysNames, status);
+ LocalPointer<StringEnumeration> result(new NumsysNameEnumeration(status), status);
+ return result.orphan();
}
-NumsysNameEnumeration::NumsysNameEnumeration(UVector *numsysNames, UErrorCode& /*status*/) {
- pos=0;
- fNumsysNames = numsysNames;
+NumsysNameEnumeration::NumsysNameEnumeration(UErrorCode& status) : pos(0) {
+ (void)status;
}
const UnicodeString*
NumsysNameEnumeration::snext(UErrorCode& status) {
- if (U_SUCCESS(status) && (fNumsysNames != nullptr) && (pos < fNumsysNames->size())) {
- return (const UnicodeString*)fNumsysNames->elementAt(pos++);
+ if (U_SUCCESS(status) && (gNumsysNames != nullptr) && (pos < gNumsysNames->size())) {
+ return (const UnicodeString*)gNumsysNames->elementAt(pos++);
}
return nullptr;
}
@@ -346,11 +355,10 @@ NumsysNameEnumeration::reset(UErrorCode& /*status*/) {
int32_t
NumsysNameEnumeration::count(UErrorCode& /*status*/) const {
- return (fNumsysNames==nullptr) ? 0 : fNumsysNames->size();
+ return (gNumsysNames==nullptr) ? 0 : gNumsysNames->size();
}
NumsysNameEnumeration::~NumsysNameEnumeration() {
- delete fNumsysNames;
}
U_NAMESPACE_END
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numsys_impl.h b/Build/source/libs/icu/icu-src/source/i18n/numsys_impl.h
index b798286bf1d..e76e634dd23 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numsys_impl.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/numsys_impl.h
@@ -26,18 +26,16 @@ U_NAMESPACE_BEGIN
class NumsysNameEnumeration : public StringEnumeration {
public:
- // NumsysNameEnumeration instance adopts numsysNames
- NumsysNameEnumeration(UVector *numsysNames, UErrorCode& status);
+ NumsysNameEnumeration(UErrorCode& status);
virtual ~NumsysNameEnumeration();
static UClassID U_EXPORT2 getStaticClassID(void);
- virtual UClassID getDynamicClassID(void) const;
- virtual const UnicodeString* snext(UErrorCode& status);
- virtual void reset(UErrorCode& status);
- virtual int32_t count(UErrorCode& status) const;
+ virtual UClassID getDynamicClassID(void) const override;
+ virtual const UnicodeString* snext(UErrorCode& status) override;
+ virtual void reset(UErrorCode& status) override;
+ virtual int32_t count(UErrorCode& status) const override;
private:
int32_t pos;
- UVector *fNumsysNames = nullptr;
};
U_NAMESPACE_END
diff --git a/Build/source/libs/icu/icu-src/source/i18n/olsontz.cpp b/Build/source/libs/icu/icu-src/source/i18n/olsontz.cpp
index 8c68d8b52cf..d21e6e99297 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/olsontz.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/olsontz.cpp
@@ -25,7 +25,7 @@
#include "uassert.h"
#include "uvector.h"
#include <float.h> // DBL_MAX
-#include "uresimp.h" // struct UResourceBundle
+#include "uresimp.h"
#include "zonemeta.h"
#include "umutex.h"
@@ -134,12 +134,11 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top,
// setID(ures_getKey((UResourceBundle*) res)); // cast away const
int32_t len;
- UResourceBundle r;
- ures_initStackObject(&r);
+ StackUResourceBundle r;
// Pre-32bit second transitions
- ures_getByKey(res, kTRANSPRE32, &r, &ec);
- transitionTimesPre32 = ures_getIntVector(&r, &len, &ec);
+ ures_getByKey(res, kTRANSPRE32, r.getAlias(), &ec);
+ transitionTimesPre32 = ures_getIntVector(r.getAlias(), &len, &ec);
transitionCountPre32 = static_cast<int16_t>(len >> 1);
if (ec == U_MISSING_RESOURCE_ERROR) {
// No pre-32bit transitions
@@ -151,8 +150,8 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top,
}
// 32bit second transitions
- ures_getByKey(res, kTRANS, &r, &ec);
- transitionTimes32 = ures_getIntVector(&r, &len, &ec);
+ ures_getByKey(res, kTRANS, r.getAlias(), &ec);
+ transitionTimes32 = ures_getIntVector(r.getAlias(), &len, &ec);
transitionCount32 = static_cast<int16_t>(len);
if (ec == U_MISSING_RESOURCE_ERROR) {
// No 32bit transitions
@@ -164,8 +163,8 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top,
}
// Post-32bit second transitions
- ures_getByKey(res, kTRANSPOST32, &r, &ec);
- transitionTimesPost32 = ures_getIntVector(&r, &len, &ec);
+ ures_getByKey(res, kTRANSPOST32, r.getAlias(), &ec);
+ transitionTimesPost32 = ures_getIntVector(r.getAlias(), &len, &ec);
transitionCountPost32 = static_cast<int16_t>(len >> 1);
if (ec == U_MISSING_RESOURCE_ERROR) {
// No pre-32bit transitions
@@ -177,8 +176,8 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top,
}
// Type offsets list must be of even size, with size >= 2
- ures_getByKey(res, kTYPEOFFSETS, &r, &ec);
- typeOffsets = ures_getIntVector(&r, &len, &ec);
+ ures_getByKey(res, kTYPEOFFSETS, r.getAlias(), &ec);
+ typeOffsets = ures_getIntVector(r.getAlias(), &len, &ec);
if (U_SUCCESS(ec) && (len < 2 || len > 0x7FFE || (len & 1) != 0)) {
ec = U_INVALID_FORMAT_ERROR;
}
@@ -187,8 +186,8 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top,
// Type map data must be of the same size as the transition count
typeMapData = NULL;
if (transitionCount() > 0) {
- ures_getByKey(res, kTYPEMAP, &r, &ec);
- typeMapData = ures_getBinary(&r, &len, &ec);
+ ures_getByKey(res, kTYPEMAP, r.getAlias(), &ec);
+ typeMapData = ures_getBinary(r.getAlias(), &len, &ec);
if (ec == U_MISSING_RESOURCE_ERROR) {
// no type mapping data
ec = U_INVALID_FORMAT_ERROR;
@@ -199,10 +198,10 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top,
// Process final rule and data, if any
const UChar *ruleIdUStr = ures_getStringByKey(res, kFINALRULE, &len, &ec);
- ures_getByKey(res, kFINALRAW, &r, &ec);
- int32_t ruleRaw = ures_getInt(&r, &ec);
- ures_getByKey(res, kFINALYEAR, &r, &ec);
- int32_t ruleYear = ures_getInt(&r, &ec);
+ ures_getByKey(res, kFINALRAW, r.getAlias(), &ec);
+ int32_t ruleRaw = ures_getInt(r.getAlias(), &ec);
+ ures_getByKey(res, kFINALYEAR, r.getAlias(), &ec);
+ int32_t ruleYear = ures_getInt(r.getAlias(), &ec);
if (U_SUCCESS(ec)) {
UnicodeString ruleID(TRUE, ruleIdUStr, len);
UResourceBundle *rule = TimeZone::loadRule(top, ruleID, NULL, ec);
@@ -251,7 +250,6 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top,
// No final zone
ec = U_ZERO_ERROR;
}
- ures_close(&r);
// initialize canonical ID
canonicalID = ZoneMeta::getCanonicalCLDRID(tzid, ec);
@@ -289,8 +287,7 @@ OlsonTimeZone& OlsonTimeZone::operator=(const OlsonTimeZone& other) {
typeMapData = other.typeMapData;
delete finalZone;
- finalZone = (other.finalZone != 0) ?
- (SimpleTimeZone*) other.finalZone->clone() : 0;
+ finalZone = (other.finalZone != 0) ? other.finalZone->clone() : 0;
finalStartYear = other.finalStartYear;
finalStartMillis = other.finalStartMillis;
@@ -321,7 +318,7 @@ UBool OlsonTimeZone::operator==(const TimeZone& other) const {
/**
* TimeZone API.
*/
-TimeZone* OlsonTimeZone::clone() const {
+OlsonTimeZone* OlsonTimeZone::clone() const {
return new OlsonTimeZone(*this);
}
@@ -818,7 +815,7 @@ OlsonTimeZone::initTransitionRules(UErrorCode& status) {
* For now, we do not set the valid start year when the construction time
* and create a clone and set the start year when extracting rules.
*/
- finalZoneWithStartYear = (SimpleTimeZone*)finalZone->clone();
+ finalZoneWithStartYear = finalZone->clone();
// Check to make sure finalZone was actually cloned.
if (finalZoneWithStartYear == NULL) {
status = U_MEMORY_ALLOCATION_ERROR;
@@ -839,7 +836,7 @@ OlsonTimeZone::initTransitionRules(UErrorCode& status) {
startTime = tzt.getTime();
} else {
// final rule with no transitions
- finalZoneWithStartYear = (SimpleTimeZone*)finalZone->clone();
+ finalZoneWithStartYear = finalZone->clone();
// Check to make sure finalZone was actually cloned.
if (finalZoneWithStartYear == NULL) {
status = U_MEMORY_ALLOCATION_ERROR;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/olsontz.h b/Build/source/libs/icu/icu-src/source/i18n/olsontz.h
index ccc0cf9f965..a3b7dcc8f3d 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/olsontz.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/olsontz.h
@@ -151,7 +151,7 @@ class U_I18N_API OlsonTimeZone: public BasicTimeZone {
/**
* TimeZone API.
*/
- virtual TimeZone* clone() const;
+ virtual OlsonTimeZone* clone() const;
/**
* TimeZone API.
@@ -398,7 +398,7 @@ private:
TimeArrayTimeZoneRule **historicRules;
int16_t historicRuleCount;
SimpleTimeZone *finalZoneWithStartYear; // hack
- UInitOnce transitionRulesInitOnce;
+ UInitOnce transitionRulesInitOnce = U_INITONCE_INITIALIZER;
};
inline int16_t
diff --git a/Build/source/libs/icu/icu-src/source/i18n/persncal.cpp b/Build/source/libs/icu/icu-src/source/i18n/persncal.cpp
index f38f779fea9..26fd294ceeb 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/persncal.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/persncal.cpp
@@ -74,7 +74,7 @@ const char *PersianCalendar::getType() const {
return "persian";
}
-Calendar* PersianCalendar::clone() const {
+PersianCalendar* PersianCalendar::clone() const {
return new PersianCalendar(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/persncal.h b/Build/source/libs/icu/icu-src/source/i18n/persncal.h
index bcfd68ad5fa..ce6d7397bf4 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/persncal.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/persncal.h
@@ -164,7 +164,7 @@ class PersianCalendar : public Calendar {
// TODO: copy c'tor, etc
// clone
- virtual Calendar* clone() const;
+ virtual PersianCalendar* clone() const;
private:
/**
diff --git a/Build/source/libs/icu/icu-src/source/i18n/plurfmt.cpp b/Build/source/libs/icu/icu-src/source/i18n/plurfmt.cpp
index 2775766d32d..b99437630e6 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/plurfmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/plurfmt.cpp
@@ -159,7 +159,7 @@ PluralFormat::copyObjects(const PluralFormat& other) {
if (other.numberFormat == NULL) {
numberFormat = NumberFormat::createInstance(locale, status);
} else {
- numberFormat = (NumberFormat*)other.numberFormat->clone();
+ numberFormat = other.numberFormat->clone();
}
if (other.pluralRulesWrapper.pluralRules == NULL) {
pluralRulesWrapper.pluralRules = PluralRules::forLocale(locale, status);
@@ -277,8 +277,15 @@ PluralFormat::format(const Formattable& numberObject, double number,
UnicodeString numberString;
auto *decFmt = dynamic_cast<DecimalFormat *>(numberFormat);
if(decFmt != nullptr) {
- decFmt->toNumberFormatter().formatImpl(&data, status); // mutates &data
- numberString = data.string.toUnicodeString();
+ const number::LocalizedNumberFormatter* lnf = decFmt->toNumberFormatter(status);
+ if (U_FAILURE(status)) {
+ return appendTo;
+ }
+ lnf->formatImpl(&data, status); // mutates &data
+ if (U_FAILURE(status)) {
+ return appendTo;
+ }
+ numberString = data.getStringRef().toUnicodeString();
} else {
if (offset == 0) {
numberFormat->format(numberObject, numberString, status);
@@ -346,7 +353,7 @@ PluralFormat::setNumberFormat(const NumberFormat* format, UErrorCode& status) {
if (U_FAILURE(status)) {
return;
}
- NumberFormat* nf = (NumberFormat*)format->clone();
+ NumberFormat* nf = format->clone();
if (nf != NULL) {
delete numberFormat;
numberFormat = nf;
@@ -355,7 +362,7 @@ PluralFormat::setNumberFormat(const NumberFormat* format, UErrorCode& status) {
}
}
-Format*
+PluralFormat*
PluralFormat::clone() const
{
return new PluralFormat(*this);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/plurrule.cpp b/Build/source/libs/icu/icu-src/source/i18n/plurrule.cpp
index ba5450c6379..fd193560708 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/plurrule.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/plurrule.cpp
@@ -35,6 +35,7 @@
#include "sharedpluralrules.h"
#include "unifiedcache.h"
#include "number_decimalquantity.h"
+#include "util.h"
#if !UCONFIG_NO_FORMATTING
@@ -265,6 +266,16 @@ PluralRules::select(double number) const {
}
UnicodeString
+PluralRules::select(const number::FormattedNumber& number, UErrorCode& status) const {
+ DecimalQuantity dq;
+ number.getDecimalQuantity(dq, status);
+ if (U_FAILURE(status)) {
+ return ICU_Utility::makeBogusString();
+ }
+ return select(dq);
+}
+
+UnicodeString
PluralRules::select(const IFixedDecimal &number) const {
if (mRules == nullptr) {
return UnicodeString(TRUE, PLURAL_DEFAULT_RULE, -1);
@@ -692,14 +703,14 @@ PluralRules::getRuleFromResource(const Locale& locale, UPluralType type, UErrorC
return emptyStr;
}
int32_t resLen=0;
- const char *curLocaleName=locale.getName();
+ const char *curLocaleName=locale.getBaseName();
const UChar* s = ures_getStringByKey(locRes.getAlias(), curLocaleName, &resLen, &errCode);
if (s == nullptr) {
// Check parent locales.
UErrorCode status = U_ZERO_ERROR;
char parentLocaleName[ULOC_FULLNAME_CAPACITY];
- const char *curLocaleName2=locale.getName();
+ const char *curLocaleName2=locale.getBaseName();
uprv_strcpy(parentLocaleName, curLocaleName2);
while (uloc_getParent(parentLocaleName, parentLocaleName,
@@ -1471,8 +1482,7 @@ PluralOperand tokenTypeToPluralOperand(tokenType tt) {
case tVariableT:
return PLURAL_OPERAND_T;
default:
- U_ASSERT(FALSE); // unexpected.
- return PLURAL_OPERAND_N;
+ UPRV_UNREACHABLE; // unexpected.
}
}
@@ -1684,8 +1694,7 @@ double FixedDecimal::getPluralOperand(PluralOperand operand) const {
case PLURAL_OPERAND_T: return static_cast<double>(decimalDigitsWithoutTrailingZeros);
case PLURAL_OPERAND_V: return visibleDecimalDigitCount;
default:
- U_ASSERT(FALSE); // unexpected.
- return source;
+ UPRV_UNREACHABLE; // unexpected.
}
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/quant.cpp b/Build/source/libs/icu/icu-src/source/i18n/quant.cpp
index acf579e168b..ed339333877 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/quant.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/quant.cpp
@@ -47,7 +47,7 @@ Quantifier::~Quantifier() {
/**
* Implement UnicodeFunctor
*/
-UnicodeFunctor* Quantifier::clone() const {
+Quantifier* Quantifier::clone() const {
return new Quantifier(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/quant.h b/Build/source/libs/icu/icu-src/source/i18n/quant.h
index 1abb0db61aa..d5aa8e5eeee 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/quant.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/quant.h
@@ -45,7 +45,7 @@ class Quantifier : public UnicodeFunctor, public UnicodeMatcher {
* Implement UnicodeFunctor
* @return a copy of the object.
*/
- virtual UnicodeFunctor* clone() const;
+ virtual Quantifier* clone() const;
/**
* Implement UnicodeMatcher
diff --git a/Build/source/libs/icu/icu-src/source/i18n/quantityformatter.cpp b/Build/source/libs/icu/icu-src/source/i18n/quantityformatter.cpp
index ba06ba06b97..e88b70fbd71 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/quantityformatter.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/quantityformatter.cpp
@@ -25,6 +25,8 @@
#include "standardplural.h"
#include "uassert.h"
#include "number_decimalquantity.h"
+#include "number_utypes.h"
+#include "formatted_string_builder.h"
U_NAMESPACE_BEGIN
@@ -174,6 +176,43 @@ StandardPlural::Form QuantityFormatter::selectPlural(
return StandardPlural::orOtherFromString(pluralKeyword);
}
+void QuantityFormatter::formatAndSelect(
+ double quantity,
+ const NumberFormat& fmt,
+ const PluralRules& rules,
+ FormattedStringBuilder& output,
+ StandardPlural::Form& pluralForm,
+ UErrorCode& status) {
+ UnicodeString pluralKeyword;
+ const DecimalFormat* df = dynamic_cast<const DecimalFormat*>(&fmt);
+ if (df != nullptr) {
+ number::impl::UFormattedNumberData fn;
+ fn.quantity.setToDouble(quantity);
+ const number::LocalizedNumberFormatter* lnf = df->toNumberFormatter(status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+ lnf->formatImpl(&fn, status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+ output = std::move(fn.getStringRef());
+ pluralKeyword = rules.select(fn.quantity);
+ } else {
+ UnicodeString result;
+ fmt.format(quantity, result, status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+ output.append(result, UNUM_FIELD_COUNT, status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+ pluralKeyword = rules.select(quantity);
+ }
+ pluralForm = StandardPlural::orOtherFromString(pluralKeyword);
+}
+
UnicodeString &QuantityFormatter::format(
const SimpleFormatter &pattern,
const UnicodeString &value,
diff --git a/Build/source/libs/icu/icu-src/source/i18n/quantityformatter.h b/Build/source/libs/icu/icu-src/source/i18n/quantityformatter.h
index ca3fb3d83b8..daaef4f060a 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/quantityformatter.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/quantityformatter.h
@@ -26,6 +26,7 @@ class PluralRules;
class NumberFormat;
class Formattable;
class FieldPosition;
+class FormattedStringBuilder;
/**
* A plural aware formatter that is good for expressing a single quantity and
@@ -111,6 +112,7 @@ public:
/**
* Selects the standard plural form for the number/formatter/rules.
+ * TODO(13591): Remove this method.
*/
static StandardPlural::Form selectPlural(
const Formattable &number,
@@ -121,7 +123,29 @@ public:
UErrorCode &status);
/**
+ * Formats a quantity and selects its plural form. The output is appended
+ * to a FormattedStringBuilder in order to retain field information.
+ *
+ * @param quantity The number to format.
+ * @param fmt The formatter to use to format the number.
+ * @param rules The rules to use to select the plural form of the
+ * formatted number.
+ * @param output Where to append the result of the format operation.
+ * @param pluralForm Output variable populated with the plural form of the
+ * formatted number.
+ * @param status Set if an error occurs.
+ */
+ static void formatAndSelect(
+ double quantity,
+ const NumberFormat& fmt,
+ const PluralRules& rules,
+ FormattedStringBuilder& output,
+ StandardPlural::Form& pluralForm,
+ UErrorCode& status);
+
+ /**
* Formats the pattern with the value and adjusts the FieldPosition.
+ * TODO: Remove?
*/
static UnicodeString &format(
const SimpleFormatter &pattern,
diff --git a/Build/source/libs/icu/icu-src/source/i18n/rbnf.cpp b/Build/source/libs/icu/icu-src/source/i18n/rbnf.cpp
index 27afc1faaa1..17319fb6d59 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/rbnf.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/rbnf.cpp
@@ -355,10 +355,16 @@ private:
};
#ifdef RBNF_DEBUG
-#define ERROR(msg) parseError(msg); return NULL;
+#define ERROR(msg) UPRV_BLOCK_MACRO_BEGIN { \
+ parseError(msg); \
+ return NULL; \
+} UPRV_BLOCK_MACRO_END
#define EXPLANATION_ARG explanationArg
#else
-#define ERROR(msg) parseError(NULL); return NULL;
+#define ERROR(msg) UPRV_BLOCK_MACRO_BEGIN { \
+ parseError(NULL); \
+ return NULL; \
+} UPRV_BLOCK_MACRO_END
#define EXPLANATION_ARG
#endif
@@ -924,8 +930,8 @@ RuleBasedNumberFormat::~RuleBasedNumberFormat()
dispose();
}
-Format*
-RuleBasedNumberFormat::clone(void) const
+RuleBasedNumberFormat*
+RuleBasedNumberFormat::clone() const
{
return new RuleBasedNumberFormat(*this);
}
@@ -1112,45 +1118,6 @@ RuleBasedNumberFormat::findRuleSet(const UnicodeString& name, UErrorCode& status
UnicodeString&
RuleBasedNumberFormat::format(const DecimalQuantity &number,
- UnicodeString &appendTo,
- FieldPositionIterator *posIter,
- UErrorCode &status) const {
- if (U_FAILURE(status)) {
- return appendTo;
- }
- DecimalQuantity copy(number);
- if (copy.fitsInLong()) {
- format(number.toLong(), appendTo, posIter, status);
- }
- else {
- copy.roundToMagnitude(0, number::impl::RoundingMode::UNUM_ROUND_HALFEVEN, status);
- if (copy.fitsInLong()) {
- format(number.toDouble(), appendTo, posIter, status);
- }
- else {
- // We're outside of our normal range that this framework can handle.
- // The DecimalFormat will provide more accurate results.
-
- // TODO this section should probably be optimized. The DecimalFormat is shared in ICU4J.
- LocalPointer<NumberFormat> decimalFormat(NumberFormat::createInstance(locale, UNUM_DECIMAL, status), status);
- if (decimalFormat.isNull()) {
- return appendTo;
- }
- Formattable f;
- LocalPointer<DecimalQuantity> decimalQuantity(new DecimalQuantity(number), status);
- if (decimalQuantity.isNull()) {
- return appendTo;
- }
- f.adoptDecimalQuantity(decimalQuantity.orphan()); // f now owns decimalQuantity.
- decimalFormat->format(f, appendTo, posIter, status);
- }
- }
- return appendTo;
-}
-
-
-UnicodeString&
-RuleBasedNumberFormat::format(const DecimalQuantity &number,
UnicodeString& appendTo,
FieldPosition& pos,
UErrorCode &status) const {
diff --git a/Build/source/libs/icu/icu-src/source/i18n/rbt.cpp b/Build/source/libs/icu/icu-src/source/i18n/rbt.cpp
index 9cb1b0e9a70..4cef242e582 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/rbt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/rbt.cpp
@@ -27,7 +27,6 @@ U_NAMESPACE_BEGIN
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RuleBasedTransliterator)
-static UMutex transliteratorDataMutex = U_MUTEX_INITIALIZER;
static Replaceable *gLockedText = NULL;
void RuleBasedTransliterator::_construct(const UnicodeString& rules,
@@ -192,8 +191,8 @@ RuleBasedTransliterator::~RuleBasedTransliterator() {
}
}
-Transliterator* // Covariant return NOT ALLOWED (for portability)
-RuleBasedTransliterator::clone(void) const {
+RuleBasedTransliterator*
+RuleBasedTransliterator::clone() const {
return new RuleBasedTransliterator(*this);
}
@@ -253,6 +252,8 @@ RuleBasedTransliterator::handleTransliterate(Replaceable& text, UTransPosition&
// Shared RBT data protected by transliteratorDataMutex.
//
// TODO(andy): Need a better scheme for handling this.
+
+ static UMutex transliteratorDataMutex;
UBool needToLock;
{
Mutex m;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/rbt.h b/Build/source/libs/icu/icu-src/source/i18n/rbt.h
index 671149f66ef..97ef01e140a 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/rbt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/rbt.h
@@ -144,7 +144,7 @@ public:
* Implement Transliterator API.
* @internal Use transliterator factory methods instead since this class will be removed in that release.
*/
- virtual Transliterator* clone(void) const;
+ virtual RuleBasedTransliterator* clone() const;
protected:
/**
diff --git a/Build/source/libs/icu/icu-src/source/i18n/rbt_pars.cpp b/Build/source/libs/icu/icu-src/source/i18n/rbt_pars.cpp
index 9932dbdc95e..1ae5b81f034 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/rbt_pars.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/rbt_pars.cpp
@@ -1111,7 +1111,7 @@ void TransliteratorParser::parseRules(const UnicodeString& rule,
int32_t p = UHASH_FIRST;
const UHashElement* he = variableNames.nextElement(p);
while (he != NULL) {
- UnicodeString* tempus = (UnicodeString*)(((UnicodeString*)(he->value.pointer))->clone());
+ UnicodeString* tempus = ((UnicodeString*)(he->value.pointer))->clone();
if (tempus == NULL) {
status = U_MEMORY_ALLOCATION_ERROR;
return;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/rbt_rule.cpp b/Build/source/libs/icu/icu-src/source/i18n/rbt_rule.cpp
index 3569e42fa4f..6cc5325c467 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/rbt_rule.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/rbt_rule.cpp
@@ -180,13 +180,13 @@ TransliterationRule::TransliterationRule(TransliterationRule& other) :
}
if (other.anteContext != NULL) {
- anteContext = (StringMatcher*) other.anteContext->clone();
+ anteContext = other.anteContext->clone();
}
if (other.key != NULL) {
- key = (StringMatcher*) other.key->clone();
+ key = other.key->clone();
}
if (other.postContext != NULL) {
- postContext = (StringMatcher*) other.postContext->clone();
+ postContext = other.postContext->clone();
}
output = other.output->clone();
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/rbtz.cpp b/Build/source/libs/icu/icu-src/source/i18n/rbtz.cpp
index d98613fe99a..3249a32a1cf 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/rbtz.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/rbtz.cpp
@@ -146,10 +146,10 @@ RuleBasedTimeZone::addTransitionRule(TimeZoneRule* rule, UErrorCode& status) {
fUpToDate = FALSE;
}
-static UMutex gLock = U_MUTEX_INITIALIZER;
void
RuleBasedTimeZone::completeConst(UErrorCode& status) const {
+ static UMutex gLock;
if (U_FAILURE(status)) {
return;
}
@@ -356,8 +356,8 @@ cleanup:
fUpToDate = FALSE;
}
-TimeZone*
-RuleBasedTimeZone::clone(void) const {
+RuleBasedTimeZone*
+RuleBasedTimeZone::clone() const {
return new RuleBasedTimeZone(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/regexcmp.cpp b/Build/source/libs/icu/icu-src/source/i18n/regexcmp.cpp
index a674d22c929..cacc069e962 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/regexcmp.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/regexcmp.cpp
@@ -561,7 +561,7 @@ UBool RegexCompile::doParseActions(int32_t action)
// sequence; don't change without making updates there too.
//
// Compiles to
- // 1 START_LA dataLoc Saves SP, Input Pos
+ // 1 LA_START dataLoc Saves SP, Input Pos, Active input region.
// 2. STATE_SAVE 4 on failure of lookahead, goto 4
// 3 JMP 6 continue ...
//
@@ -575,10 +575,14 @@ UBool RegexCompile::doParseActions(int32_t action)
// 8. code for parenthesized stuff.
// 9. LA_END
//
- // Two data slots are reserved, for saving the stack ptr and the input position.
+ // Four data slots are reserved, for saving state on entry to the look-around
+ // 0: stack pointer on entry.
+ // 1: input position on entry.
+ // 2: fActiveStart, the active bounds start on entry.
+ // 3: fActiveLimit, the active bounds limit on entry.
{
fixLiterals();
- int32_t dataLoc = allocateData(2);
+ int32_t dataLoc = allocateData(4);
appendOp(URX_LA_START, dataLoc);
appendOp(URX_STATE_SAVE, fRXPat->fCompiledPat->size()+ 2);
appendOp(URX_JMP, fRXPat->fCompiledPat->size()+ 3);
@@ -599,18 +603,23 @@ UBool RegexCompile::doParseActions(int32_t action)
case doOpenLookAheadNeg:
// Negated Lookahead. (?! stuff )
// Compiles to
- // 1. START_LA dataloc
+ // 1. LA_START dataloc
// 2. SAVE_STATE 7 // Fail within look-ahead block restores to this state,
// // which continues with the match.
// 3. NOP // Std. Open Paren sequence, for possible '|'
// 4. code for parenthesized stuff.
- // 5. END_LA // Cut back stack, remove saved state from step 2.
+ // 5. LA_END // Cut back stack, remove saved state from step 2.
// 6. BACKTRACK // code in block succeeded, so neg. lookahead fails.
// 7. END_LA // Restore match region, in case look-ahead was using
// an alternate (transparent) region.
+ // Four data slots are reserved, for saving state on entry to the look-around
+ // 0: stack pointer on entry.
+ // 1: input position on entry.
+ // 2: fActiveStart, the active bounds start on entry.
+ // 3: fActiveLimit, the active bounds limit on entry.
{
fixLiterals();
- int32_t dataLoc = allocateData(2);
+ int32_t dataLoc = allocateData(4);
appendOp(URX_LA_START, dataLoc);
appendOp(URX_STATE_SAVE, 0); // dest address will be patched later.
appendOp(URX_NOP, 0);
@@ -644,14 +653,16 @@ UBool RegexCompile::doParseActions(int32_t action)
// Allocate a block of matcher data, to contain (when running a match)
// 0: Stack ptr on entry
// 1: Input Index on entry
- // 2: Start index of match current match attempt.
- // 3: Original Input String len.
+ // 2: fActiveStart, the active bounds start on entry.
+ // 3: fActiveLimit, the active bounds limit on entry.
+ // 4: Start index of match current match attempt.
+ // The first four items must match the layout of data for LA_START / LA_END
// Generate match code for any pending literals.
fixLiterals();
// Allocate data space
- int32_t dataLoc = allocateData(4);
+ int32_t dataLoc = allocateData(5);
// Emit URX_LB_START
appendOp(URX_LB_START, dataLoc);
@@ -696,14 +707,16 @@ UBool RegexCompile::doParseActions(int32_t action)
// Allocate a block of matcher data, to contain (when running a match)
// 0: Stack ptr on entry
// 1: Input Index on entry
- // 2: Start index of match current match attempt.
- // 3: Original Input String len.
+ // 2: fActiveStart, the active bounds start on entry.
+ // 3: fActiveLimit, the active bounds limit on entry.
+ // 4: Start index of match current match attempt.
+ // The first four items must match the layout of data for LA_START / LA_END
// Generate match code for any pending literals.
fixLiterals();
// Allocate data space
- int32_t dataLoc = allocateData(4);
+ int32_t dataLoc = allocateData(5);
// Emit URX_LB_START
appendOp(URX_LB_START, dataLoc);
@@ -1465,7 +1478,7 @@ UBool RegexCompile::doParseActions(int32_t action)
case 0x78: /* 'x' */ bit = UREGEX_COMMENTS; break;
case 0x2d: /* '-' */ fSetModeFlag = FALSE; break;
default:
- U_ASSERT(FALSE); // Should never happen. Other chars are filtered out
+ UPRV_UNREACHABLE; // Should never happen. Other chars are filtered out
// by the scanner.
}
if (fSetModeFlag) {
@@ -1840,9 +1853,7 @@ UBool RegexCompile::doParseActions(int32_t action)
}
default:
- U_ASSERT(FALSE);
- error(U_REGEX_INTERNAL_ERROR);
- break;
+ UPRV_UNREACHABLE;
}
if (U_FAILURE(*fStatus)) {
@@ -1949,25 +1960,17 @@ int32_t RegexCompile::buildOp(int32_t type, int32_t val) {
return 0;
}
if (type < 0 || type > 255) {
- U_ASSERT(FALSE);
- error(U_REGEX_INTERNAL_ERROR);
- type = URX_RESERVED_OP;
+ UPRV_UNREACHABLE;
}
if (val > 0x00ffffff) {
- U_ASSERT(FALSE);
- error(U_REGEX_INTERNAL_ERROR);
- val = 0;
+ UPRV_UNREACHABLE;
}
if (val < 0) {
if (!(type == URX_RESERVED_OP_N || type == URX_RESERVED_OP)) {
- U_ASSERT(FALSE);
- error(U_REGEX_INTERNAL_ERROR);
- return -1;
+ UPRV_UNREACHABLE;
}
if (URX_TYPE(val) != 0xff) {
- U_ASSERT(FALSE);
- error(U_REGEX_INTERNAL_ERROR);
- return -1;
+ UPRV_UNREACHABLE;
}
type = URX_RESERVED_OP_N;
}
@@ -2295,6 +2298,13 @@ void RegexCompile::handleCloseParen() {
error(U_REGEX_LOOK_BEHIND_LIMIT);
break;
}
+ if (minML == INT32_MAX) {
+ // This condition happens when no match is possible, such as with a
+ // [set] expression containing no elements.
+ // In principle, the generated code to evaluate the expression could be deleted,
+ // but it's probably not worth the complication.
+ minML = 0;
+ }
U_ASSERT(minML <= maxML);
// Insert the min and max match len bounds into the URX_LB_CONT op that
@@ -2331,6 +2341,14 @@ void RegexCompile::handleCloseParen() {
error(U_REGEX_LOOK_BEHIND_LIMIT);
break;
}
+ if (minML == INT32_MAX) {
+ // This condition happens when no match is possible, such as with a
+ // [set] expression containing no elements.
+ // In principle, the generated code to evaluate the expression could be deleted,
+ // but it's probably not worth the complication.
+ minML = 0;
+ }
+
U_ASSERT(minML <= maxML);
// Insert the min and max match len bounds into the URX_LB_CONT op that
@@ -2348,7 +2366,7 @@ void RegexCompile::handleCloseParen() {
default:
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
}
// remember the next location in the compiled pattern.
@@ -2608,8 +2626,7 @@ void RegexCompile::findCaseInsensitiveStarters(UChar32 c, UnicodeSet *starterCh
if (c < UCHAR_MIN_VALUE || c > UCHAR_MAX_VALUE) {
// This function should never be called with an invalid input character.
- U_ASSERT(FALSE);
- starterChars->clear();
+ UPRV_UNREACHABLE;
} else if (u_hasBinaryProperty(c, UCHAR_CASE_SENSITIVE)) {
UChar32 caseFoldedC = u_foldCase(c, U_FOLD_CASE_DEFAULT);
starterChars->set(caseFoldedC, caseFoldedC);
@@ -3103,13 +3120,10 @@ void RegexCompile::matchStartType() {
case URX_LB_END:
case URX_LBN_CONT:
case URX_LBN_END:
- U_ASSERT(FALSE); // Shouldn't get here. These ops should be
+ UPRV_UNREACHABLE; // Shouldn't get here. These ops should be
// consumed by the scan in URX_LA_START and LB_START
-
- break;
-
default:
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
}
}
@@ -3380,7 +3394,7 @@ int32_t RegexCompile::minMatchLength(int32_t start, int32_t end) {
// it assumes that the look-ahead match might be zero-length.
// TODO: Positive lookahead could recursively do the block, then continue
// with the longer of the block or the value coming in. Ticket 6060
- int32_t depth = (opType == URX_LA_START? 2: 1);;
+ int32_t depth = (opType == URX_LA_START? 2: 1);
for (;;) {
loc++;
op = (int32_t)fRXPat->fCompiledPat->elementAti(loc);
@@ -3429,7 +3443,7 @@ int32_t RegexCompile::minMatchLength(int32_t start, int32_t end) {
break;
default:
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
}
}
@@ -3462,7 +3476,6 @@ int32_t RegexCompile::maxMatchLength(int32_t start, int32_t end) {
U_ASSERT(start <= end);
U_ASSERT(end < fRXPat->fCompiledPat->size());
-
int32_t loc;
int32_t op;
int32_t opType;
@@ -3671,10 +3684,9 @@ int32_t RegexCompile::maxMatchLength(int32_t start, int32_t end) {
case URX_CTR_LOOP:
case URX_CTR_LOOP_NG:
- // These opcodes will be skipped over by code for URX_CRT_INIT.
+ // These opcodes will be skipped over by code for URX_CTR_INIT.
// We shouldn't encounter them here.
- U_ASSERT(FALSE);
- break;
+ UPRV_UNREACHABLE;
case URX_LOOP_SR_I:
case URX_LOOP_DOT_I:
@@ -3694,33 +3706,26 @@ int32_t RegexCompile::maxMatchLength(int32_t start, int32_t end) {
// End of look-ahead ops should always be consumed by the processing at
// the URX_LA_START op.
- // U_ASSERT(FALSE);
- // break;
+ // UPRV_UNREACHABLE;
case URX_LB_START:
{
// Look-behind. Scan forward until the matching look-around end,
// without processing the look-behind block.
- int32_t depth = 0;
- for (;;) {
- loc++;
+ int32_t dataLoc = URX_VAL(op);
+ for (loc = loc + 1; loc < end; ++loc) {
op = (int32_t)fRXPat->fCompiledPat->elementAti(loc);
- if (URX_TYPE(op) == URX_LA_START || URX_TYPE(op) == URX_LB_START) {
- depth++;
- }
- if (URX_TYPE(op) == URX_LA_END || URX_TYPE(op)==URX_LBN_END) {
- if (depth == 0) {
- break;
- }
- depth--;
+ int32_t opType = URX_TYPE(op);
+ if ((opType == URX_LA_END || opType == URX_LBN_END) && (URX_VAL(op) == dataLoc)) {
+ break;
}
- U_ASSERT(loc < end);
}
+ U_ASSERT(loc < end);
}
break;
default:
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
}
@@ -3875,8 +3880,7 @@ void RegexCompile::stripNOPs() {
default:
// Some op is unaccounted for.
- U_ASSERT(FALSE);
- error(U_REGEX_INTERNAL_ERROR);
+ UPRV_UNREACHABLE;
}
}
@@ -4012,7 +4016,7 @@ UChar32 RegexCompile::peekCharLL() {
//
//------------------------------------------------------------------------------
void RegexCompile::nextChar(RegexPatternChar &c) {
-
+ tailRecursion:
fScanIndex = UTEXT_GETNATIVEINDEX(fRXPat->fPattern);
c.fChar = nextCharLL();
c.fQuoted = FALSE;
@@ -4023,7 +4027,9 @@ void RegexCompile::nextChar(RegexPatternChar &c) {
c.fChar == (UChar32)-1) {
fQuoteMode = FALSE; // Exit quote mode,
nextCharLL(); // discard the E
- nextChar(c); // recurse to get the real next char
+ // nextChar(c); // recurse to get the real next char
+ goto tailRecursion; // Note: fuzz testing produced testcases that
+ // resulted in stack overflow here.
}
}
else if (fInBackslashQuote) {
@@ -4141,8 +4147,10 @@ void RegexCompile::nextChar(RegexPatternChar &c) {
else if (peekCharLL() == chQ) {
// "\Q" enter quote mode, which will continue until "\E"
fQuoteMode = TRUE;
- nextCharLL(); // discard the 'Q'.
- nextChar(c); // recurse to get the real next char.
+ nextCharLL(); // discard the 'Q'.
+ // nextChar(c); // recurse to get the real next char.
+ goto tailRecursion; // Note: fuzz testing produced test cases that
+ // resulted in stack overflow here.
}
else
{
@@ -4622,8 +4630,7 @@ void RegexCompile::setEval(int32_t nextOp) {
delete rightOperand;
break;
default:
- U_ASSERT(FALSE);
- break;
+ UPRV_UNREACHABLE;
}
}
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/regeximp.h b/Build/source/libs/icu/icu-src/source/i18n/regeximp.h
index 51db8821678..590d2168952 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/regeximp.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/regeximp.h
@@ -123,7 +123,7 @@ enum {
// saved input position, FAIL rather than taking
// the JMP
URX_LA_START = 37, // Starting a LookAround expression.
- // Save InputPos and SP in static data.
+ // Save InputPos, SP and active region in static data.
// Operand: Static data offset for the save
URX_LA_END = 38, // Ending a Lookaround expression.
// Restore InputPos and Stack to saved values.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/region.cpp b/Build/source/libs/icu/icu-src/source/i18n/region.cpp
index 343ef78832a..76445aef328 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/region.cpp
+++ b/Build/source/libs/icu/icu-src/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<DecimalFormat> df(new DecimalFormat(status), status);
LocalPointer<UVector> continents(new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status), status);
LocalPointer<UVector> 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<UnicodeString> 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<DecimalFormat> 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/Build/source/libs/icu/icu-src/source/i18n/reldatefmt.cpp b/Build/source/libs/icu/icu-src/source/i18n/reldatefmt.cpp
index 1a4da0f0b95..f66092ba948 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/reldatefmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/reldatefmt.cpp
@@ -15,6 +15,7 @@
#if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_BREAK_ITERATION
#include <cmath>
+#include <functional>
#include "unicode/dtfmtsym.h"
#include "unicode/ucasemap.h"
#include "unicode/ureldatefmt.h"
@@ -41,11 +42,15 @@
#include "sharednumberformat.h"
#include "standardplural.h"
#include "unifiedcache.h"
+#include "util.h"
+#include "formatted_string_builder.h"
+#include "number_utypes.h"
+#include "number_modifiers.h"
+#include "formattedval_impl.h"
+#include "number_utils.h"
// Copied from uscript_props.cpp
-static UMutex gBrkIterMutex = U_MUTEX_INITIALIZER;
-
U_NAMESPACE_BEGIN
// RelativeDateTimeFormatter specific data for a single locale
@@ -162,13 +167,20 @@ const UnicodeString& RelativeDateTimeCacheData::getAbsoluteUnitString(
URelativeDateTimeUnit unit,
int32_t pastFutureIndex,
int32_t pluralUnit) const {
- int32_t style = fStyle;
- do {
- if (relativeUnitsFormatters[style][unit][pastFutureIndex][pluralUnit] != nullptr) {
- return relativeUnitsFormatters[style][unit][pastFutureIndex][pluralUnit];
+ while (true) {
+ int32_t style = fStyle;
+ do {
+ if (relativeUnitsFormatters[style][unit][pastFutureIndex][pluralUnit] != nullptr) {
+ return relativeUnitsFormatters[style][unit][pastFutureIndex][pluralUnit];
+ }
+ style = fallBackCache[style];
+ } while (style != -1);
+
+ if (pluralUnit == StandardPlural::OTHER) {
+ break;
}
- style = fallBackCache[style];
- } while (style != -1);
+ pluralUnit = StandardPlural::OTHER;
+ }
return nullptr; // No formatter found.
}
@@ -303,6 +315,10 @@ struct RelDateTimeFmtDataSink : public ResourceSink {
return UDAT_ABSOLUTE_FRIDAY;
case SATURDAY:
return UDAT_ABSOLUTE_SATURDAY;
+ case HOUR:
+ return UDAT_ABSOLUTE_HOUR;
+ case MINUTE:
+ return UDAT_ABSOLUTE_MINUTE;
default:
return -1;
}
@@ -710,6 +726,26 @@ const RelativeDateTimeCacheData *LocaleCacheKey<RelativeDateTimeCacheData>::crea
return result.orphan();
}
+
+
+static constexpr number::impl::Field kRDTNumericField
+ = StringBuilderFieldUtils::compress<UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_NUMERIC_FIELD>();
+
+static constexpr number::impl::Field kRDTLiteralField
+ = StringBuilderFieldUtils::compress<UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD>();
+
+class FormattedRelativeDateTimeData : public FormattedValueStringBuilderImpl {
+public:
+ FormattedRelativeDateTimeData() : FormattedValueStringBuilderImpl(kRDTNumericField) {}
+ virtual ~FormattedRelativeDateTimeData();
+};
+
+FormattedRelativeDateTimeData::~FormattedRelativeDateTimeData() = default;
+
+
+UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(FormattedRelativeDateTime)
+
+
RelativeDateTimeFormatter::RelativeDateTimeFormatter(UErrorCode& status) :
fCache(nullptr),
fNumberFormat(nullptr),
@@ -834,43 +870,142 @@ UDateRelativeDateTimeFormatterStyle RelativeDateTimeFormatter::getFormatStyle()
return fStyle;
}
-UnicodeString& RelativeDateTimeFormatter::format(
- double quantity, UDateDirection direction, UDateRelativeUnit unit,
- UnicodeString& appendTo, UErrorCode& status) const {
+
+// To reduce boilerplate code, we use a helper function that forwards variadic
+// arguments to the formatImpl function.
+
+template<typename F, typename... Args>
+UnicodeString& RelativeDateTimeFormatter::doFormat(
+ F callback,
+ UnicodeString& appendTo,
+ UErrorCode& status,
+ Args... args) const {
+ FormattedRelativeDateTimeData output;
+ (this->*callback)(std::forward<Args>(args)..., output, status);
if (U_FAILURE(status)) {
return appendTo;
}
+ UnicodeString result = output.getStringRef().toUnicodeString();
+ return appendTo.append(adjustForContext(result));
+}
+
+template<typename F, typename... Args>
+FormattedRelativeDateTime RelativeDateTimeFormatter::doFormatToValue(
+ F callback,
+ UErrorCode& status,
+ Args... args) const {
+ if (!checkNoAdjustForContext(status)) {
+ return FormattedRelativeDateTime(status);
+ }
+ LocalPointer<FormattedRelativeDateTimeData> output(
+ new FormattedRelativeDateTimeData(), status);
+ if (U_FAILURE(status)) {
+ return FormattedRelativeDateTime(status);
+ }
+ (this->*callback)(std::forward<Args>(args)..., *output, status);
+ output->getStringRef().writeTerminator(status);
+ return FormattedRelativeDateTime(output.orphan());
+}
+
+UnicodeString& RelativeDateTimeFormatter::format(
+ double quantity,
+ UDateDirection direction,
+ UDateRelativeUnit unit,
+ UnicodeString& appendTo,
+ UErrorCode& status) const {
+ return doFormat(
+ &RelativeDateTimeFormatter::formatImpl,
+ appendTo,
+ status,
+ quantity,
+ direction,
+ unit);
+}
+
+FormattedRelativeDateTime RelativeDateTimeFormatter::formatToValue(
+ double quantity,
+ UDateDirection direction,
+ UDateRelativeUnit unit,
+ UErrorCode& status) const {
+ return doFormatToValue(
+ &RelativeDateTimeFormatter::formatImpl,
+ status,
+ quantity,
+ direction,
+ unit);
+}
+
+void RelativeDateTimeFormatter::formatImpl(
+ double quantity,
+ UDateDirection direction,
+ UDateRelativeUnit unit,
+ FormattedRelativeDateTimeData& output,
+ UErrorCode& status) const {
+ if (U_FAILURE(status)) {
+ return;
+ }
if (direction != UDAT_DIRECTION_LAST && direction != UDAT_DIRECTION_NEXT) {
status = U_ILLEGAL_ARGUMENT_ERROR;
- return appendTo;
+ return;
}
int32_t bFuture = direction == UDAT_DIRECTION_NEXT ? 1 : 0;
- FieldPosition pos(FieldPosition::DONT_CARE);
-
- UnicodeString result;
- UnicodeString formattedNumber;
- StandardPlural::Form pluralIndex = QuantityFormatter::selectPlural(
- quantity, **fNumberFormat, **fPluralRules, formattedNumber, pos,
+ StandardPlural::Form pluralForm;
+ QuantityFormatter::formatAndSelect(
+ quantity,
+ **fNumberFormat,
+ **fPluralRules,
+ output.getStringRef(),
+ pluralForm,
status);
+ if (U_FAILURE(status)) {
+ return;
+ }
const SimpleFormatter* formatter =
- fCache->getRelativeUnitFormatter(fStyle, unit, bFuture, pluralIndex);
+ fCache->getRelativeUnitFormatter(fStyle, unit, bFuture, pluralForm);
if (formatter == nullptr) {
// TODO: WARN - look at quantity formatter's action with an error.
status = U_INVALID_FORMAT_ERROR;
- return appendTo;
+ return;
}
- formatter->format(formattedNumber, result, status);
- adjustForContext(result);
- return appendTo.append(result);
+
+ number::impl::SimpleModifier modifier(*formatter, kRDTLiteralField, false);
+ modifier.formatAsPrefixSuffix(
+ output.getStringRef(), 0, output.getStringRef().length(), status);
}
UnicodeString& RelativeDateTimeFormatter::formatNumeric(
- double offset, URelativeDateTimeUnit unit,
- UnicodeString& appendTo, UErrorCode& status) const {
+ double offset,
+ URelativeDateTimeUnit unit,
+ UnicodeString& appendTo,
+ UErrorCode& status) const {
+ return doFormat(
+ &RelativeDateTimeFormatter::formatNumericImpl,
+ appendTo,
+ status,
+ offset,
+ unit);
+}
+
+FormattedRelativeDateTime RelativeDateTimeFormatter::formatNumericToValue(
+ double offset,
+ URelativeDateTimeUnit unit,
+ UErrorCode& status) const {
+ return doFormatToValue(
+ &RelativeDateTimeFormatter::formatNumericImpl,
+ status,
+ offset,
+ unit);
+}
+
+void RelativeDateTimeFormatter::formatNumericImpl(
+ double offset,
+ URelativeDateTimeUnit unit,
+ FormattedRelativeDateTimeData& output,
+ UErrorCode& status) const {
if (U_FAILURE(status)) {
- return appendTo;
+ return;
}
UDateDirection direction = UDAT_DIRECTION_NEXT;
if (std::signbit(offset)) { // needed to handle -0.0
@@ -879,55 +1014,110 @@ UnicodeString& RelativeDateTimeFormatter::formatNumeric(
}
if (direction != UDAT_DIRECTION_LAST && direction != UDAT_DIRECTION_NEXT) {
status = U_ILLEGAL_ARGUMENT_ERROR;
- return appendTo;
+ return;
}
int32_t bFuture = direction == UDAT_DIRECTION_NEXT ? 1 : 0;
- FieldPosition pos(FieldPosition::DONT_CARE);
- UnicodeString result;
- UnicodeString formattedNumber;
-
- StandardPlural::Form pluralIndex = QuantityFormatter::selectPlural(
- offset, **fNumberFormat, **fPluralRules, formattedNumber, pos,
+ StandardPlural::Form pluralForm;
+ QuantityFormatter::formatAndSelect(
+ offset,
+ **fNumberFormat,
+ **fPluralRules,
+ output.getStringRef(),
+ pluralForm,
status);
+ if (U_FAILURE(status)) {
+ return;
+ }
const SimpleFormatter* formatter =
- fCache->getRelativeDateTimeUnitFormatter(fStyle, unit, bFuture, pluralIndex);
+ fCache->getRelativeDateTimeUnitFormatter(fStyle, unit, bFuture, pluralForm);
if (formatter == nullptr) {
// TODO: WARN - look at quantity formatter's action with an error.
status = U_INVALID_FORMAT_ERROR;
- return appendTo;
+ return;
}
- formatter->format(formattedNumber, result, status);
- adjustForContext(result);
- return appendTo.append(result);
+
+ number::impl::SimpleModifier modifier(*formatter, kRDTLiteralField, false);
+ modifier.formatAsPrefixSuffix(
+ output.getStringRef(), 0, output.getStringRef().length(), status);
}
UnicodeString& RelativeDateTimeFormatter::format(
- UDateDirection direction, UDateAbsoluteUnit unit,
- UnicodeString& appendTo, UErrorCode& status) const {
+ UDateDirection direction,
+ UDateAbsoluteUnit unit,
+ UnicodeString& appendTo,
+ UErrorCode& status) const {
+ return doFormat(
+ &RelativeDateTimeFormatter::formatAbsoluteImpl,
+ appendTo,
+ status,
+ direction,
+ unit);
+}
+
+FormattedRelativeDateTime RelativeDateTimeFormatter::formatToValue(
+ UDateDirection direction,
+ UDateAbsoluteUnit unit,
+ UErrorCode& status) const {
+ return doFormatToValue(
+ &RelativeDateTimeFormatter::formatAbsoluteImpl,
+ status,
+ direction,
+ unit);
+}
+
+void RelativeDateTimeFormatter::formatAbsoluteImpl(
+ UDateDirection direction,
+ UDateAbsoluteUnit unit,
+ FormattedRelativeDateTimeData& output,
+ UErrorCode& status) const {
if (U_FAILURE(status)) {
- return appendTo;
+ return;
}
if (unit == UDAT_ABSOLUTE_NOW && direction != UDAT_DIRECTION_PLAIN) {
status = U_ILLEGAL_ARGUMENT_ERROR;
- return appendTo;
+ return;
}
// Get string using fallback.
- UnicodeString result;
- result.fastCopyFrom(fCache->getAbsoluteUnitString(fStyle, unit, direction));
- if (fOptBreakIterator != nullptr) {
- adjustForContext(result);
- }
- return appendTo.append(result);
+ output.getStringRef().append(
+ fCache->getAbsoluteUnitString(fStyle, unit, direction),
+ kRDTLiteralField,
+ status);
}
UnicodeString& RelativeDateTimeFormatter::format(
- double offset, URelativeDateTimeUnit unit,
- UnicodeString& appendTo, UErrorCode& status) const {
+ double offset,
+ URelativeDateTimeUnit unit,
+ UnicodeString& appendTo,
+ UErrorCode& status) const {
+ return doFormat(
+ &RelativeDateTimeFormatter::formatRelativeImpl,
+ appendTo,
+ status,
+ offset,
+ unit);
+}
+
+FormattedRelativeDateTime RelativeDateTimeFormatter::formatToValue(
+ double offset,
+ URelativeDateTimeUnit unit,
+ UErrorCode& status) const {
+ return doFormatToValue(
+ &RelativeDateTimeFormatter::formatRelativeImpl,
+ status,
+ offset,
+ unit);
+}
+
+void RelativeDateTimeFormatter::formatRelativeImpl(
+ double offset,
+ URelativeDateTimeUnit unit,
+ FormattedRelativeDateTimeData& output,
+ UErrorCode& status) const {
if (U_FAILURE(status)) {
- return appendTo;
+ return;
}
// TODO:
// The full implementation of this depends on CLDR data that is not yet available,
@@ -971,23 +1161,18 @@ UnicodeString& RelativeDateTimeFormatter::format(
case UDAT_REL_UNIT_THURSDAY: absunit = UDAT_ABSOLUTE_THURSDAY; break;
case UDAT_REL_UNIT_FRIDAY: absunit = UDAT_ABSOLUTE_FRIDAY; break;
case UDAT_REL_UNIT_SATURDAY: absunit = UDAT_ABSOLUTE_SATURDAY; break;
+ case UDAT_REL_UNIT_HOUR: absunit = UDAT_ABSOLUTE_HOUR; break;
+ case UDAT_REL_UNIT_MINUTE: absunit = UDAT_ABSOLUTE_MINUTE; break;
default: break;
}
if (direction != UDAT_DIRECTION_COUNT && absunit != UDAT_ABSOLUTE_UNIT_COUNT) {
- const UnicodeString &unitFormatString =
- fCache->getAbsoluteUnitString(fStyle, absunit, direction);
- if (!unitFormatString.isEmpty()) {
- if (fOptBreakIterator != nullptr) {
- UnicodeString result(unitFormatString);
- adjustForContext(result);
- return appendTo.append(result);
- } else {
- return appendTo.append(unitFormatString);
- }
+ formatAbsoluteImpl(direction, absunit, output, status);
+ if (output.getStringRef().length() != 0) {
+ return;
}
}
// otherwise fallback to formatNumeric
- return formatNumeric(offset, unit, appendTo, status);
+ formatNumericImpl(offset, unit, output, status);
}
UnicodeString& RelativeDateTimeFormatter::combineDateAndTime(
@@ -997,19 +1182,31 @@ UnicodeString& RelativeDateTimeFormatter::combineDateAndTime(
timeString, relativeDateString, appendTo, status);
}
-void RelativeDateTimeFormatter::adjustForContext(UnicodeString &str) const {
+UnicodeString& RelativeDateTimeFormatter::adjustForContext(UnicodeString &str) const {
if (fOptBreakIterator == nullptr
|| str.length() == 0 || !u_islower(str.char32At(0))) {
- return;
+ return str;
}
// Must guarantee that one thread at a time accesses the shared break
// iterator.
+ static UMutex gBrkIterMutex;
Mutex lock(&gBrkIterMutex);
str.toTitle(
fOptBreakIterator->get(),
fLocale,
U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT);
+ return str;
+}
+
+UBool RelativeDateTimeFormatter::checkNoAdjustForContext(UErrorCode& status) const {
+ // This is unsupported because it's hard to keep fields in sync with title
+ // casing. The code could be written and tested if there is demand.
+ if (fOptBreakIterator != nullptr) {
+ status = U_UNSUPPORTED_ERROR;
+ return FALSE;
+ }
+ return TRUE;
}
void RelativeDateTimeFormatter::init(
@@ -1065,6 +1262,17 @@ U_NAMESPACE_END
U_NAMESPACE_USE
+
+// Magic number: "FRDT" (FormattedRelativeDateTime) in ASCII
+UPRV_FORMATTED_VALUE_CAPI_AUTO_IMPL(
+ FormattedRelativeDateTime,
+ UFormattedRelativeDateTime,
+ UFormattedRelativeDateTimeImpl,
+ UFormattedRelativeDateTimeApiHelper,
+ ureldatefmt,
+ 0x46524454)
+
+
U_CAPI URelativeDateTimeFormatter* U_EXPORT2
ureldatefmt_open( const char* locale,
UNumberFormat* nfToAdopt,
@@ -1118,6 +1326,21 @@ ureldatefmt_formatNumeric( const URelativeDateTimeFormatter* reldatefmt,
return res.extract(result, resultCapacity, *status);
}
+U_STABLE void U_EXPORT2
+ureldatefmt_formatNumericToResult(
+ const URelativeDateTimeFormatter* reldatefmt,
+ double offset,
+ URelativeDateTimeUnit unit,
+ UFormattedRelativeDateTime* result,
+ UErrorCode* status) {
+ if (U_FAILURE(*status)) {
+ return;
+ }
+ auto* fmt = reinterpret_cast<const RelativeDateTimeFormatter*>(reldatefmt);
+ auto* resultImpl = UFormattedRelativeDateTimeApiHelper::validate(result, *status);
+ resultImpl->fImpl = fmt->formatNumericToValue(offset, unit, *status);
+}
+
U_CAPI int32_t U_EXPORT2
ureldatefmt_format( const URelativeDateTimeFormatter* reldatefmt,
double offset,
@@ -1146,6 +1369,21 @@ ureldatefmt_format( const URelativeDateTimeFormatter* reldatefmt,
return res.extract(result, resultCapacity, *status);
}
+U_DRAFT void U_EXPORT2
+ureldatefmt_formatToResult(
+ const URelativeDateTimeFormatter* reldatefmt,
+ double offset,
+ URelativeDateTimeUnit unit,
+ UFormattedRelativeDateTime* result,
+ UErrorCode* status) {
+ if (U_FAILURE(*status)) {
+ return;
+ }
+ auto* fmt = reinterpret_cast<const RelativeDateTimeFormatter*>(reldatefmt);
+ auto* resultImpl = UFormattedRelativeDateTimeApiHelper::validate(result, *status);
+ resultImpl->fImpl = fmt->formatToValue(offset, unit, *status);
+}
+
U_CAPI int32_t U_EXPORT2
ureldatefmt_combineDateAndTime( const URelativeDateTimeFormatter* reldatefmt,
const UChar * relativeDateString,
diff --git a/Build/source/libs/icu/icu-src/source/i18n/reldtfmt.cpp b/Build/source/libs/icu/icu-src/source/i18n/reldtfmt.cpp
index 5e7ddddf74a..c8ffd046460 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/reldtfmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/reldtfmt.cpp
@@ -51,7 +51,7 @@ RelativeDateFormat::RelativeDateFormat(const RelativeDateFormat& other) :
fCapitalizationBrkIter(NULL)
{
if(other.fDateTimeFormatter != NULL) {
- fDateTimeFormatter = (SimpleDateFormat*)other.fDateTimeFormatter->clone();
+ fDateTimeFormatter = other.fDateTimeFormatter->clone();
}
if(other.fCombinedFormat != NULL) {
fCombinedFormat = new SimpleFormatter(*other.fCombinedFormat);
@@ -131,7 +131,7 @@ RelativeDateFormat::~RelativeDateFormat() {
}
-Format* RelativeDateFormat::clone(void) const {
+RelativeDateFormat* RelativeDateFormat::clone() const {
return new RelativeDateFormat(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/reldtfmt.h b/Build/source/libs/icu/icu-src/source/i18n/reldtfmt.h
index aa5f92346d0..ff48d3b5c48 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/reldtfmt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/reldtfmt.h
@@ -71,7 +71,7 @@ public:
* @return A copy of the object.
* @internal ICU 3.8
*/
- virtual Format* clone(void) const;
+ virtual RelativeDateFormat* clone() const;
/**
* Return true if the given Format objects are semantically equal. Objects
diff --git a/Build/source/libs/icu/icu-src/source/i18n/rematch.cpp b/Build/source/libs/icu/icu-src/source/i18n/rematch.cpp
index cfdc1fe4d99..6d6ea0fb5dd 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/rematch.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/rematch.cpp
@@ -717,7 +717,7 @@ UBool RegexMatcher::find(UErrorCode &status) {
if (findProgressInterrupt(startPos, status))
return FALSE;
}
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
case START_START:
// Matches are only possible at the start of the input string
@@ -765,7 +765,7 @@ UBool RegexMatcher::find(UErrorCode &status) {
return FALSE;
}
}
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
case START_STRING:
case START_CHAR:
@@ -797,7 +797,7 @@ UBool RegexMatcher::find(UErrorCode &status) {
return FALSE;
}
}
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
case START_LINE:
{
@@ -877,11 +877,10 @@ UBool RegexMatcher::find(UErrorCode &status) {
}
default:
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
}
- U_ASSERT(FALSE);
- return FALSE;
+ UPRV_UNREACHABLE;
}
@@ -992,7 +991,7 @@ UBool RegexMatcher::findUsingChunk(UErrorCode &status) {
if (findProgressInterrupt(startPos, status))
return FALSE;
}
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
case START_START:
// Matches are only possible at the start of the input string
@@ -1034,7 +1033,7 @@ UBool RegexMatcher::findUsingChunk(UErrorCode &status) {
return FALSE;
}
}
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
case START_STRING:
case START_CHAR:
@@ -1063,7 +1062,7 @@ UBool RegexMatcher::findUsingChunk(UErrorCode &status) {
return FALSE;
}
}
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
case START_LINE:
{
@@ -1134,11 +1133,10 @@ UBool RegexMatcher::findUsingChunk(UErrorCode &status) {
}
default:
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
}
- U_ASSERT(FALSE);
- return FALSE;
+ UPRV_UNREACHABLE;
}
@@ -2071,7 +2069,7 @@ int32_t RegexMatcher::split(UText *input,
//
if (U_FAILURE(status)) {
return 0;
- };
+ }
if (destCapacity < 1) {
status = U_ILLEGAL_ARGUMENT_ERROR;
@@ -3807,11 +3805,13 @@ GC_Done:
case URX_LA_START:
{
- // Entering a lookahead block.
+ // Entering a look around block.
// Save Stack Ptr, Input Pos.
- U_ASSERT(opValue>=0 && opValue+1<fPattern->fDataSize);
+ U_ASSERT(opValue>=0 && opValue+3<fPattern->fDataSize);
fData[opValue] = fStack->size();
fData[opValue+1] = fp->fInputIdx;
+ fData[opValue+2] = fActiveStart;
+ fData[opValue+3] = fActiveLimit;
fActiveStart = fLookStart; // Set the match region change for
fActiveLimit = fLookLimit; // transparent bounds.
}
@@ -3821,7 +3821,7 @@ GC_Done:
{
// Leaving a look-ahead block.
// restore Stack Ptr, Input Pos to positions they had on entry to block.
- U_ASSERT(opValue>=0 && opValue+1<fPattern->fDataSize);
+ U_ASSERT(opValue>=0 && opValue+3<fPattern->fDataSize);
int32_t stackSize = fStack->size();
int32_t newStackSize =(int32_t)fData[opValue];
U_ASSERT(stackSize >= newStackSize);
@@ -3841,8 +3841,10 @@ GC_Done:
// Restore the active region bounds in the input string; they may have
// been changed because of transparent bounds on a Region.
- fActiveStart = fRegionStart;
- fActiveLimit = fRegionLimit;
+ fActiveStart = fData[opValue+2];
+ fActiveLimit = fData[opValue+3];
+ U_ASSERT(fActiveStart >= 0);
+ U_ASSERT(fActiveLimit <= fInputLength);
}
break;
@@ -3918,17 +3920,19 @@ GC_Done:
case URX_LB_START:
{
// Entering a look-behind block.
- // Save Stack Ptr, Input Pos.
+ // Save Stack Ptr, Input Pos and active input region.
// TODO: implement transparent bounds. Ticket #6067
- U_ASSERT(opValue>=0 && opValue+1<fPattern->fDataSize);
+ U_ASSERT(opValue>=0 && opValue+4<fPattern->fDataSize);
fData[opValue] = fStack->size();
fData[opValue+1] = fp->fInputIdx;
- // Init the variable containing the start index for attempted matches.
- fData[opValue+2] = -1;
// Save input string length, then reset to pin any matches to end at
// the current position.
+ fData[opValue+2] = fActiveStart;
fData[opValue+3] = fActiveLimit;
+ fActiveStart = fRegionStart;
fActiveLimit = fp->fInputIdx;
+ // Init the variable containing the start index for attempted matches.
+ fData[opValue+4] = -1;
}
break;
@@ -3951,8 +3955,8 @@ GC_Done:
U_ASSERT(minML >= 0);
// Fetch (from data) the last input index where a match was attempted.
- U_ASSERT(opValue>=0 && opValue+1<fPattern->fDataSize);
- int64_t &lbStartIdx = fData[opValue+2];
+ U_ASSERT(opValue>=0 && opValue+4<fPattern->fDataSize);
+ int64_t &lbStartIdx = fData[opValue+4];
if (lbStartIdx < 0) {
// First time through loop.
lbStartIdx = fp->fInputIdx - minML;
@@ -3978,10 +3982,10 @@ GC_Done:
// getting a match. Backtrack out, and out of the
// Look Behind altogether.
fp = (REStackFrame *)fStack->popFrame(fFrameSize);
- int64_t restoreInputLen = fData[opValue+3];
- U_ASSERT(restoreInputLen >= fActiveLimit);
- U_ASSERT(restoreInputLen <= fInputLength);
- fActiveLimit = restoreInputLen;
+ fActiveStart = fData[opValue+2];
+ fActiveLimit = fData[opValue+3];
+ U_ASSERT(fActiveStart >= 0);
+ U_ASSERT(fActiveLimit <= fInputLength);
break;
}
@@ -3995,7 +3999,7 @@ GC_Done:
case URX_LB_END:
// End of a look-behind block, after a successful match.
{
- U_ASSERT(opValue>=0 && opValue+1<fPattern->fDataSize);
+ U_ASSERT(opValue>=0 && opValue+4<fPattern->fDataSize);
if (fp->fInputIdx != fActiveLimit) {
// The look-behind expression matched, but the match did not
// extend all the way to the point that we are looking behind from.
@@ -4006,13 +4010,13 @@ GC_Done:
break;
}
- // Look-behind match is good. Restore the orignal input string length,
+ // Look-behind match is good. Restore the orignal input string region,
// which had been truncated to pin the end of the lookbehind match to the
// position being looked-behind.
- int64_t originalInputLen = fData[opValue+3];
- U_ASSERT(originalInputLen >= fActiveLimit);
- U_ASSERT(originalInputLen <= fInputLength);
- fActiveLimit = originalInputLen;
+ fActiveStart = fData[opValue+2];
+ fActiveLimit = fData[opValue+3];
+ U_ASSERT(fActiveStart >= 0);
+ U_ASSERT(fActiveLimit <= fInputLength);
}
break;
@@ -4037,8 +4041,8 @@ GC_Done:
U_ASSERT(continueLoc > fp->fPatIdx);
// Fetch (from data) the last input index where a match was attempted.
- U_ASSERT(opValue>=0 && opValue+1<fPattern->fDataSize);
- int64_t &lbStartIdx = fData[opValue+2];
+ U_ASSERT(opValue>=0 && opValue+4<fPattern->fDataSize);
+ int64_t &lbStartIdx = fData[opValue+4];
if (lbStartIdx < 0) {
// First time through loop.
lbStartIdx = fp->fInputIdx - minML;
@@ -4063,10 +4067,10 @@ GC_Done:
// We have tried all potential match starting points without
// getting a match, which means that the negative lookbehind as
// a whole has succeeded. Jump forward to the continue location
- int64_t restoreInputLen = fData[opValue+3];
- U_ASSERT(restoreInputLen >= fActiveLimit);
- U_ASSERT(restoreInputLen <= fInputLength);
- fActiveLimit = restoreInputLen;
+ fActiveStart = fData[opValue+2];
+ fActiveLimit = fData[opValue+3];
+ U_ASSERT(fActiveStart >= 0);
+ U_ASSERT(fActiveLimit <= fInputLength);
fp->fPatIdx = continueLoc;
break;
}
@@ -4081,7 +4085,7 @@ GC_Done:
case URX_LBN_END:
// End of a negative look-behind block, after a successful match.
{
- U_ASSERT(opValue>=0 && opValue+1<fPattern->fDataSize);
+ U_ASSERT(opValue>=0 && opValue+4<fPattern->fDataSize);
if (fp->fInputIdx != fActiveLimit) {
// The look-behind expression matched, but the match did not
// extend all the way to the point that we are looking behind from.
@@ -4098,10 +4102,10 @@ GC_Done:
// Restore the orignal input string length, which had been truncated
// inorder to pin the end of the lookbehind match
// to the position being looked-behind.
- int64_t originalInputLen = fData[opValue+3];
- U_ASSERT(originalInputLen >= fActiveLimit);
- U_ASSERT(originalInputLen <= fInputLength);
- fActiveLimit = originalInputLen;
+ fActiveStart = fData[opValue+2];
+ fActiveLimit = fData[opValue+3];
+ U_ASSERT(fActiveStart >= 0);
+ U_ASSERT(fActiveLimit <= fInputLength);
// Restore original stack position, discarding any state saved
// by the successful pattern match.
@@ -4278,7 +4282,7 @@ GC_Done:
default:
// Trouble. The compiled pattern contains an entry with an
// unrecognized type tag.
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
}
if (U_FAILURE(status)) {
@@ -5338,11 +5342,13 @@ GC_Done:
case URX_LA_START:
{
- // Entering a lookahead block.
+ // Entering a look around block.
// Save Stack Ptr, Input Pos.
- U_ASSERT(opValue>=0 && opValue+1<fPattern->fDataSize);
+ U_ASSERT(opValue>=0 && opValue+3<fPattern->fDataSize);
fData[opValue] = fStack->size();
fData[opValue+1] = fp->fInputIdx;
+ fData[opValue+2] = fActiveStart;
+ fData[opValue+3] = fActiveLimit;
fActiveStart = fLookStart; // Set the match region change for
fActiveLimit = fLookLimit; // transparent bounds.
}
@@ -5350,9 +5356,9 @@ GC_Done:
case URX_LA_END:
{
- // Leaving a look-ahead block.
+ // Leaving a look around block.
// restore Stack Ptr, Input Pos to positions they had on entry to block.
- U_ASSERT(opValue>=0 && opValue+1<fPattern->fDataSize);
+ U_ASSERT(opValue>=0 && opValue+3<fPattern->fDataSize);
int32_t stackSize = fStack->size();
int32_t newStackSize = (int32_t)fData[opValue];
U_ASSERT(stackSize >= newStackSize);
@@ -5372,8 +5378,10 @@ GC_Done:
// Restore the active region bounds in the input string; they may have
// been changed because of transparent bounds on a Region.
- fActiveStart = fRegionStart;
- fActiveLimit = fRegionLimit;
+ fActiveStart = fData[opValue+2];
+ fActiveLimit = fData[opValue+3];
+ U_ASSERT(fActiveStart >= 0);
+ U_ASSERT(fActiveLimit <= fInputLength);
}
break;
@@ -5436,17 +5444,19 @@ GC_Done:
case URX_LB_START:
{
// Entering a look-behind block.
- // Save Stack Ptr, Input Pos.
+ // Save Stack Ptr, Input Pos and active input region.
// TODO: implement transparent bounds. Ticket #6067
- U_ASSERT(opValue>=0 && opValue+1<fPattern->fDataSize);
+ U_ASSERT(opValue>=0 && opValue+4<fPattern->fDataSize);
fData[opValue] = fStack->size();
fData[opValue+1] = fp->fInputIdx;
- // Init the variable containing the start index for attempted matches.
- fData[opValue+2] = -1;
// Save input string length, then reset to pin any matches to end at
// the current position.
+ fData[opValue+2] = fActiveStart;
fData[opValue+3] = fActiveLimit;
+ fActiveStart = fRegionStart;
fActiveLimit = fp->fInputIdx;
+ // Init the variable containing the start index for attempted matches.
+ fData[opValue+4] = -1;
}
break;
@@ -5464,8 +5474,8 @@ GC_Done:
U_ASSERT(minML >= 0);
// Fetch (from data) the last input index where a match was attempted.
- U_ASSERT(opValue>=0 && opValue+1<fPattern->fDataSize);
- int64_t &lbStartIdx = fData[opValue+2];
+ U_ASSERT(opValue>=0 && opValue+4<fPattern->fDataSize);
+ int64_t &lbStartIdx = fData[opValue+4];
if (lbStartIdx < 0) {
// First time through loop.
lbStartIdx = fp->fInputIdx - minML;
@@ -5487,10 +5497,10 @@ GC_Done:
// getting a match. Backtrack out, and out of the
// Look Behind altogether.
fp = (REStackFrame *)fStack->popFrame(fFrameSize);
- int64_t restoreInputLen = fData[opValue+3];
- U_ASSERT(restoreInputLen >= fActiveLimit);
- U_ASSERT(restoreInputLen <= fInputLength);
- fActiveLimit = restoreInputLen;
+ fActiveStart = fData[opValue+2];
+ fActiveLimit = fData[opValue+3];
+ U_ASSERT(fActiveStart >= 0);
+ U_ASSERT(fActiveLimit <= fInputLength);
break;
}
@@ -5504,7 +5514,7 @@ GC_Done:
case URX_LB_END:
// End of a look-behind block, after a successful match.
{
- U_ASSERT(opValue>=0 && opValue+1<fPattern->fDataSize);
+ U_ASSERT(opValue>=0 && opValue+4<fPattern->fDataSize);
if (fp->fInputIdx != fActiveLimit) {
// The look-behind expression matched, but the match did not
// extend all the way to the point that we are looking behind from.
@@ -5515,13 +5525,13 @@ GC_Done:
break;
}
- // Look-behind match is good. Restore the orignal input string length,
+ // Look-behind match is good. Restore the orignal input string region,
// which had been truncated to pin the end of the lookbehind match to the
// position being looked-behind.
- int64_t originalInputLen = fData[opValue+3];
- U_ASSERT(originalInputLen >= fActiveLimit);
- U_ASSERT(originalInputLen <= fInputLength);
- fActiveLimit = originalInputLen;
+ fActiveStart = fData[opValue+2];
+ fActiveLimit = fData[opValue+3];
+ U_ASSERT(fActiveStart >= 0);
+ U_ASSERT(fActiveLimit <= fInputLength);
}
break;
@@ -5541,8 +5551,8 @@ GC_Done:
U_ASSERT(continueLoc > fp->fPatIdx);
// Fetch (from data) the last input index where a match was attempted.
- U_ASSERT(opValue>=0 && opValue+1<fPattern->fDataSize);
- int64_t &lbStartIdx = fData[opValue+2];
+ U_ASSERT(opValue>=0 && opValue+4<fPattern->fDataSize);
+ int64_t &lbStartIdx = fData[opValue+4];
if (lbStartIdx < 0) {
// First time through loop.
lbStartIdx = fp->fInputIdx - minML;
@@ -5563,10 +5573,10 @@ GC_Done:
// We have tried all potential match starting points without
// getting a match, which means that the negative lookbehind as
// a whole has succeeded. Jump forward to the continue location
- int64_t restoreInputLen = fData[opValue+3];
- U_ASSERT(restoreInputLen >= fActiveLimit);
- U_ASSERT(restoreInputLen <= fInputLength);
- fActiveLimit = restoreInputLen;
+ fActiveStart = fData[opValue+2];
+ fActiveLimit = fData[opValue+3];
+ U_ASSERT(fActiveStart >= 0);
+ U_ASSERT(fActiveLimit <= fInputLength);
fp->fPatIdx = continueLoc;
break;
}
@@ -5581,7 +5591,7 @@ GC_Done:
case URX_LBN_END:
// End of a negative look-behind block, after a successful match.
{
- U_ASSERT(opValue>=0 && opValue+1<fPattern->fDataSize);
+ U_ASSERT(opValue>=0 && opValue+4<fPattern->fDataSize);
if (fp->fInputIdx != fActiveLimit) {
// The look-behind expression matched, but the match did not
// extend all the way to the point that we are looking behind from.
@@ -5598,10 +5608,10 @@ GC_Done:
// Restore the orignal input string length, which had been truncated
// inorder to pin the end of the lookbehind match
// to the position being looked-behind.
- int64_t originalInputLen = fData[opValue+3];
- U_ASSERT(originalInputLen >= fActiveLimit);
- U_ASSERT(originalInputLen <= fInputLength);
- fActiveLimit = originalInputLen;
+ fActiveStart = fData[opValue+2];
+ fActiveLimit = fData[opValue+3];
+ U_ASSERT(fActiveStart >= 0);
+ U_ASSERT(fActiveLimit <= fInputLength);
// Restore original stack position, discarding any state saved
// by the successful pattern match.
@@ -5778,7 +5788,7 @@ GC_Done:
default:
// Trouble. The compiled pattern contains an entry with an
// unrecognized type tag.
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
}
if (U_FAILURE(status)) {
diff --git a/Build/source/libs/icu/icu-src/source/i18n/remtrans.cpp b/Build/source/libs/icu/icu-src/source/i18n/remtrans.cpp
index 70a6ed3935b..03b878575ca 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/remtrans.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/remtrans.cpp
@@ -48,10 +48,10 @@ RemoveTransliterator::RemoveTransliterator() : Transliterator(UnicodeString(TRUE
RemoveTransliterator::~RemoveTransliterator() {}
-Transliterator* RemoveTransliterator::clone(void) const {
- Transliterator* result = new RemoveTransliterator();
+RemoveTransliterator* RemoveTransliterator::clone() const {
+ RemoveTransliterator* result = new RemoveTransliterator();
if (result != NULL && getFilter() != 0) {
- result->adoptFilter((UnicodeFilter*)(getFilter()->clone()));
+ result->adoptFilter(getFilter()->clone());
}
return result;
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/remtrans.h b/Build/source/libs/icu/icu-src/source/i18n/remtrans.h
index ed038d5f2fe..13de01594a3 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/remtrans.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/remtrans.h
@@ -47,7 +47,7 @@ public:
* Transliterator API.
* @return A copy of the object.
*/
- virtual Transliterator* clone(void) const;
+ virtual RemoveTransliterator* clone() const;
/**
* Implements {@link Transliterator#handleTransliterate}.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/repattrn.cpp b/Build/source/libs/icu/icu-src/source/i18n/repattrn.cpp
index b8aee1a028d..1386d186c4d 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/repattrn.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/repattrn.cpp
@@ -646,7 +646,7 @@ int32_t RegexPattern::split(const UnicodeString &input,
{
if (U_FAILURE(status)) {
return 0;
- };
+ }
RegexMatcher m(this);
int32_t r = 0;
@@ -667,7 +667,7 @@ int32_t RegexPattern::split(UText *input,
{
if (U_FAILURE(status)) {
return 0;
- };
+ }
RegexMatcher m(this);
int32_t r = 0;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/rulebasedcollator.cpp b/Build/source/libs/icu/icu-src/source/i18n/rulebasedcollator.cpp
index b057b6bbd5a..60acf17815a 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/rulebasedcollator.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/rulebasedcollator.cpp
@@ -220,7 +220,7 @@ RuleBasedCollator::adoptTailoring(CollationTailoring *t, UErrorCode &errorCode)
actualLocaleIsSameAsValid = FALSE;
}
-Collator *
+RuleBasedCollator *
RuleBasedCollator::clone() const {
return new RuleBasedCollator(*this);
}
@@ -1554,11 +1554,7 @@ RuleBasedCollator::internalGetShortDefinitionString(const char *locale,
"collation", locale,
NULL, &errorCode);
if(U_FAILURE(errorCode)) { return 0; }
- if(length == 0) {
- uprv_strcpy(resultLocale, "root");
- } else {
- resultLocale[length] = 0;
- }
+ resultLocale[length] = 0;
// Append items in alphabetic order of their short definition letters.
CharString result;
@@ -1585,7 +1581,11 @@ RuleBasedCollator::internalGetShortDefinitionString(const char *locale,
length = uloc_getKeywordValue(resultLocale, "collation", subtag, UPRV_LENGTHOF(subtag), &errorCode);
appendSubtag(result, 'K', subtag, length, errorCode);
length = uloc_getLanguage(resultLocale, subtag, UPRV_LENGTHOF(subtag), &errorCode);
- appendSubtag(result, 'L', subtag, length, errorCode);
+ if (length == 0) {
+ appendSubtag(result, 'L', "root", 4, errorCode);
+ } else {
+ appendSubtag(result, 'L', subtag, length, errorCode);
+ }
if(attributeHasBeenSetExplicitly(UCOL_NORMALIZATION_MODE)) {
appendAttribute(result, 'N', getAttribute(UCOL_NORMALIZATION_MODE, errorCode), errorCode);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/scientificnumberformatter.cpp b/Build/source/libs/icu/icu-src/source/i18n/scientificnumberformatter.cpp
index 03d98dd6e10..6c2cb3aeed2 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/scientificnumberformatter.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/scientificnumberformatter.cpp
@@ -121,7 +121,7 @@ ScientificNumberFormatter *ScientificNumberFormatter::createInstance(
return result;
}
-ScientificNumberFormatter::Style *ScientificNumberFormatter::SuperscriptStyle::clone() const {
+ScientificNumberFormatter::SuperscriptStyle *ScientificNumberFormatter::SuperscriptStyle::clone() const {
return new ScientificNumberFormatter::SuperscriptStyle(*this);
}
@@ -195,7 +195,7 @@ UnicodeString &ScientificNumberFormatter::SuperscriptStyle::format(
return appendTo;
}
-ScientificNumberFormatter::Style *ScientificNumberFormatter::MarkupStyle::clone() const {
+ScientificNumberFormatter::MarkupStyle *ScientificNumberFormatter::MarkupStyle::clone() const {
return new ScientificNumberFormatter::MarkupStyle(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/scriptset.h b/Build/source/libs/icu/icu-src/source/i18n/scriptset.h
index 385c3e3e534..99a71ec803f 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/scriptset.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/scriptset.h
@@ -40,7 +40,7 @@ class U_I18N_API ScriptSet: public UMemory {
~ScriptSet();
UBool operator == (const ScriptSet &other) const;
- UBool operator != (const ScriptSet &other) const {return !(*this == other);};
+ UBool operator != (const ScriptSet &other) const {return !(*this == other);}
ScriptSet & operator = (const ScriptSet &other);
UBool test(UScriptCode script, UErrorCode &status) const;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/selfmt.cpp b/Build/source/libs/icu/icu-src/source/i18n/selfmt.cpp
index 29aee364575..47e53d75dec 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/selfmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/selfmt.cpp
@@ -151,7 +151,7 @@ int32_t SelectFormat::findSubMessage(const MessagePattern& pattern, int32_t part
return msgStart;
}
-Format* SelectFormat::clone() const
+SelectFormat* SelectFormat::clone() const
{
return new SelectFormat(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/simpletz.cpp b/Build/source/libs/icu/icu-src/source/i18n/simpletz.cpp
index 57a7ba8ed75..7972e2bb040 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/simpletz.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/simpletz.cpp
@@ -33,6 +33,7 @@
#include "unicode/gregocal.h"
#include "unicode/smpdtfmt.h"
+#include "cmemory.h"
#include "gregoimp.h"
#include "umutex.h"
@@ -242,7 +243,7 @@ SimpleTimeZone::operator==(const TimeZone& that) const
// -------------------------------------
// Called by TimeZone::createDefault() inside a Mutex - be careful.
-TimeZone*
+SimpleTimeZone*
SimpleTimeZone::clone() const
{
return new SimpleTimeZone(*this);
@@ -1077,13 +1078,13 @@ SimpleTimeZone::deleteTransitionRules(void) {
* allocate it in the constructors. This would be a more intrusive change, but doable
* if performance turns out to be an issue.
*/
-static UMutex gLock = U_MUTEX_INITIALIZER;
void
SimpleTimeZone::checkTransitionRules(UErrorCode& status) const {
if (U_FAILURE(status)) {
return;
}
+ static UMutex gLock;
umtx_lock(&gLock);
if (!transitionRulesInitialized) {
SimpleTimeZone *ncThis = const_cast<SimpleTimeZone*>(this);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/smpdtfmt.cpp b/Build/source/libs/icu/icu-src/source/i18n/smpdtfmt.cpp
index 2bc8e49625f..5fcbb5875b2 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/smpdtfmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/smpdtfmt.cpp
@@ -230,7 +230,7 @@ static const int32_t gFieldRangeBias[] = {
static const int32_t HEBREW_CAL_CUR_MILLENIUM_START_YEAR = 5000;
static const int32_t HEBREW_CAL_CUR_MILLENIUM_END_YEAR = 6000;
-static UMutex LOCK = U_MUTEX_INITIALIZER;
+static UMutex LOCK;
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SimpleDateFormat)
@@ -620,7 +620,7 @@ SimpleDateFormat& SimpleDateFormat::operator=(const SimpleDateFormat& other)
//----------------------------------------------------------------------
-Format*
+SimpleDateFormat*
SimpleDateFormat::clone() const
{
return new SimpleDateFormat(*this);
@@ -856,6 +856,17 @@ SimpleDateFormat::initialize(const Locale& locale,
{
if (U_FAILURE(status)) return;
+ parsePattern(); // Need this before initNumberFormatters(), to set fHasHanYearChar
+
+ // Simple-minded hack to force Gannen year numbering for ja@calendar=japanese
+ // if format is non-numeric (includes 年) and fDateOverride is not already specified.
+ // Now this does get updated if applyPattern subsequently changes the pattern type.
+ if (fDateOverride.isBogus() && fHasHanYearChar &&
+ fCalendar != nullptr && uprv_strcmp(fCalendar->getType(),"japanese") == 0 &&
+ uprv_strcmp(fLocale.getLanguage(),"ja") == 0) {
+ fDateOverride.setTo(u"y=jpanyear", -1);
+ }
+
// We don't need to check that the row count is >= 1, since all 2d arrays have at
// least one row
fNumberFormat = NumberFormat::createInstance(locale, status);
@@ -872,8 +883,6 @@ SimpleDateFormat::initialize(const Locale& locale,
{
status = U_MISSING_RESOURCE_ERROR;
}
-
- parsePattern();
}
/* Initialize the fields we use to disambiguate ambiguous years. Separate
@@ -1211,10 +1220,14 @@ _appendSymbolWithMonthPattern(UnicodeString& dst, int32_t value, const UnicodeSt
//----------------------------------------------------------------------
static number::LocalizedNumberFormatter*
-createFastFormatter(const DecimalFormat* df, int32_t minInt, int32_t maxInt) {
- return new number::LocalizedNumberFormatter(
- df->toNumberFormatter()
- .integerWidth(number::IntegerWidth::zeroFillTo(minInt).truncateAt(maxInt)));
+createFastFormatter(const DecimalFormat* df, int32_t minInt, int32_t maxInt, UErrorCode& status) {
+ const number::LocalizedNumberFormatter* lnfBase = df->toNumberFormatter(status);
+ if (U_FAILURE(status)) {
+ return nullptr;
+ }
+ return lnfBase->integerWidth(
+ number::IntegerWidth::zeroFillTo(minInt).truncateAt(maxInt)
+ ).clone().orphan();
}
void SimpleDateFormat::initFastNumberFormatters(UErrorCode& status) {
@@ -1225,11 +1238,11 @@ void SimpleDateFormat::initFastNumberFormatters(UErrorCode& status) {
if (df == nullptr) {
return;
}
- fFastNumberFormatters[SMPDTFMT_NF_1x10] = createFastFormatter(df, 1, 10);
- fFastNumberFormatters[SMPDTFMT_NF_2x10] = createFastFormatter(df, 2, 10);
- fFastNumberFormatters[SMPDTFMT_NF_3x10] = createFastFormatter(df, 3, 10);
- fFastNumberFormatters[SMPDTFMT_NF_4x10] = createFastFormatter(df, 4, 10);
- fFastNumberFormatters[SMPDTFMT_NF_2x2] = createFastFormatter(df, 2, 2);
+ fFastNumberFormatters[SMPDTFMT_NF_1x10] = createFastFormatter(df, 1, 10, status);
+ fFastNumberFormatters[SMPDTFMT_NF_2x10] = createFastFormatter(df, 2, 10, status);
+ fFastNumberFormatters[SMPDTFMT_NF_3x10] = createFastFormatter(df, 3, 10, status);
+ fFastNumberFormatters[SMPDTFMT_NF_4x10] = createFastFormatter(df, 4, 10, status);
+ fFastNumberFormatters[SMPDTFMT_NF_2x2] = createFastFormatter(df, 2, 2, status);
}
void SimpleDateFormat::freeFastNumberFormatters() {
@@ -1778,7 +1791,7 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo,
}
}
else {
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
}
}
appendTo += zoneString;
@@ -1950,7 +1963,8 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo,
}
#if !UCONFIG_NO_BREAK_ITERATION
// if first field, check to see whether we need to and are able to titlecase it
- if (fieldNum == 0 && u_islower(appendTo.char32At(beginOffset)) && fCapitalizationBrkIter != NULL) {
+ if (fieldNum == 0 && fCapitalizationBrkIter != NULL && appendTo.length() > beginOffset &&
+ u_islower(appendTo.char32At(beginOffset))) {
UBool titlecase = FALSE;
switch (capitalizationContext) {
case UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE:
@@ -1967,9 +1981,11 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo,
break;
}
if (titlecase) {
+ BreakIterator* const mutableCapitalizationBrkIter = fCapitalizationBrkIter->clone();
UnicodeString firstField(appendTo, beginOffset);
- firstField.toTitle(fCapitalizationBrkIter, fLocale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT);
+ firstField.toTitle(mutableCapitalizationBrkIter, fLocale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT);
appendTo.replaceBetween(beginOffset, appendTo.length(), firstField);
+ delete mutableCapitalizationBrkIter;
}
}
#endif
@@ -2079,7 +2095,7 @@ SimpleDateFormat::zeroPaddingNumber(
if (U_FAILURE(localStatus)) {
return;
}
- appendTo.append(result.string.toTempUnicodeString());
+ appendTo.append(result.getStringRef().toTempUnicodeString());
return;
}
@@ -2094,7 +2110,7 @@ SimpleDateFormat::zeroPaddingNumber(
// Fall back to slow path (clone and mutate the NumberFormat)
if (currentNumberFormat != nullptr) {
FieldPosition pos(FieldPosition::DONT_CARE);
- LocalPointer<NumberFormat> nf(dynamic_cast<NumberFormat*>(currentNumberFormat->clone()));
+ LocalPointer<NumberFormat> nf(currentNumberFormat->clone());
nf->setMinimumIntegerDigits(minDigits);
nf->setMaximumIntegerDigits(maxDigits);
nf->format(value, appendTo, pos); // 3rd arg is there to speed up processing
@@ -3757,7 +3773,7 @@ void SimpleDateFormat::parseInt(const UnicodeString& text,
auto* fmtAsDF = dynamic_cast<const DecimalFormat*>(fmt);
LocalPointer<DecimalFormat> df;
if (!allowNegative && fmtAsDF != nullptr) {
- df.adoptInstead(dynamic_cast<DecimalFormat*>(fmtAsDF->clone()));
+ df.adoptInstead(fmtAsDF->clone());
if (df.isNull()) {
// Memory allocation error
return;
@@ -3872,6 +3888,42 @@ SimpleDateFormat::applyPattern(const UnicodeString& pattern)
{
fPattern = pattern;
parsePattern();
+
+ // Hack to update use of Gannen year numbering for ja@calendar=japanese -
+ // use only if format is non-numeric (includes 年) and no other fDateOverride.
+ if (fCalendar != nullptr && uprv_strcmp(fCalendar->getType(),"japanese") == 0 &&
+ uprv_strcmp(fLocale.getLanguage(),"ja") == 0) {
+ if (fDateOverride==UnicodeString(u"y=jpanyear") && !fHasHanYearChar) {
+ // Gannen numbering is set but new pattern should not use it, unset;
+ // use procedure from adoptNumberFormat to clear overrides
+ if (fSharedNumberFormatters) {
+ freeSharedNumberFormatters(fSharedNumberFormatters);
+ fSharedNumberFormatters = NULL;
+ }
+ fDateOverride.setToBogus(); // record status
+ } else if (fDateOverride.isBogus() && fHasHanYearChar) {
+ // No current override (=> no Gannen numbering) but new pattern needs it;
+ // use procedures from initNUmberFormatters / adoptNumberFormat
+ umtx_lock(&LOCK);
+ if (fSharedNumberFormatters == NULL) {
+ fSharedNumberFormatters = allocSharedNumberFormatters();
+ }
+ umtx_unlock(&LOCK);
+ if (fSharedNumberFormatters != NULL) {
+ Locale ovrLoc(fLocale.getLanguage(),fLocale.getCountry(),fLocale.getVariant(),"numbers=jpanyear");
+ UErrorCode status = U_ZERO_ERROR;
+ const SharedNumberFormat *snf = createSharedNumberFormat(ovrLoc, status);
+ if (U_SUCCESS(status)) {
+ // Now that we have an appropriate number formatter, fill in the
+ // appropriate slot in the number formatters table.
+ UDateFormatField patternCharIndex = DateFormatSymbols::getPatternCharIndex(u'y');
+ SharedObject::copyPtr(snf, fSharedNumberFormatters[patternCharIndex]);
+ snf->deleteIfZeroRefCount();
+ fDateOverride.setTo(u"y=jpanyear", -1); // record status
+ }
+ }
+ }
+ }
}
//----------------------------------------------------------------------
@@ -3949,6 +4001,7 @@ void SimpleDateFormat::adoptCalendar(Calendar* calendarToAdopt)
DateFormatSymbols *newSymbols =
DateFormatSymbols::createForLocale(calLocale, status);
if (U_FAILURE(status)) {
+ delete calendarToAdopt;
return;
}
DateFormat::adoptCalendar(calendarToAdopt);
@@ -4207,6 +4260,7 @@ SimpleDateFormat::tzFormat(UErrorCode &status) const {
void SimpleDateFormat::parsePattern() {
fHasMinute = FALSE;
fHasSecond = FALSE;
+ fHasHanYearChar = FALSE;
int len = fPattern.length();
UBool inQuote = FALSE;
@@ -4215,6 +4269,9 @@ void SimpleDateFormat::parsePattern() {
if (ch == QUOTE) {
inQuote = !inQuote;
}
+ if (ch == 0x5E74) { // don't care whether this is inside quotes
+ fHasHanYearChar = TRUE;
+ }
if (!inQuote) {
if (ch == 0x6D) { // 0x6D == 'm'
fHasMinute = TRUE;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/numparse_stringsegment.cpp b/Build/source/libs/icu/icu-src/source/i18n/string_segment.cpp
index 3db4fe618a6..5d19ac57f5e 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/numparse_stringsegment.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/string_segment.cpp
@@ -10,14 +10,12 @@
#define UNISTR_FROM_STRING_EXPLICIT
#include "numparse_types.h"
-#include "numparse_stringsegment.h"
+#include "string_segment.h"
#include "putilimp.h"
#include "unicode/utf16.h"
#include "unicode/uniset.h"
-using namespace icu;
-using namespace icu::numparse;
-using namespace icu::numparse::impl;
+U_NAMESPACE_BEGIN
StringSegment::StringSegment(const UnicodeString& str, bool ignoreCase)
@@ -143,4 +141,5 @@ bool StringSegment::operator==(const UnicodeString& other) const {
}
+U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/string_segment.h b/Build/source/libs/icu/icu-src/source/i18n/string_segment.h
new file mode 100644
index 00000000000..b581f7e5759
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/i18n/string_segment.h
@@ -0,0 +1,134 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+#ifndef __NUMPARSE_STRINGSEGMENT_H__
+#define __NUMPARSE_STRINGSEGMENT_H__
+
+#include "unicode/unistr.h"
+#include "unicode/uniset.h"
+
+U_NAMESPACE_BEGIN
+
+
+/**
+ * A mutable UnicodeString wrapper with a variable offset and length and
+ * support for case folding. The charAt, length, and subSequence methods all
+ * operate relative to the fixed offset into the UnicodeString.
+ *
+ * Intended to be useful for parsing.
+ *
+ * CAUTION: Since this class is mutable, it must not be used anywhere that an
+ * immutable object is required, like in a cache or as the key of a hash map.
+ *
+ * @author sffc (Shane Carr)
+ */
+// Exported as U_I18N_API for tests
+class U_I18N_API StringSegment : public UMemory {
+ public:
+ StringSegment(const UnicodeString& str, bool ignoreCase);
+
+ int32_t getOffset() const;
+
+ void setOffset(int32_t start);
+
+ /**
+ * Equivalent to <code>setOffset(getOffset()+delta)</code>.
+ *
+ * <p>
+ * This method is usually called by a Matcher to register that a char was consumed. If the char is
+ * strong (it usually is, except for things like whitespace), follow this with a call to
+ * {@link ParsedNumber#setCharsConsumed}. For more information on strong chars, see that method.
+ */
+ void adjustOffset(int32_t delta);
+
+ /**
+ * Adjusts the offset by the width of the current code point, either 1 or 2 chars.
+ */
+ void adjustOffsetByCodePoint();
+
+ void setLength(int32_t length);
+
+ void resetLength();
+
+ int32_t length() const;
+
+ char16_t charAt(int32_t index) const;
+
+ UChar32 codePointAt(int32_t index) const;
+
+ UnicodeString toUnicodeString() const;
+
+ const UnicodeString toTempUnicodeString() const;
+
+ /**
+ * Returns the first code point in the string segment, or -1 if the string starts with an invalid
+ * code point.
+ *
+ * <p>
+ * <strong>Important:</strong> Most of the time, you should use {@link #startsWith}, which handles case
+ * folding logic, instead of this method.
+ */
+ UChar32 getCodePoint() const;
+
+ /**
+ * Returns true if the first code point of this StringSegment equals the given code point.
+ *
+ * <p>
+ * This method will perform case folding if case folding is enabled for the parser.
+ */
+ bool startsWith(UChar32 otherCp) const;
+
+ /**
+ * Returns true if the first code point of this StringSegment is in the given UnicodeSet.
+ */
+ bool startsWith(const UnicodeSet& uniset) const;
+
+ /**
+ * Returns true if there is at least one code point of overlap between this StringSegment and the
+ * given UnicodeString.
+ */
+ bool startsWith(const UnicodeString& other) const;
+
+ /**
+ * Returns the length of the prefix shared by this StringSegment and the given UnicodeString. For
+ * example, if this string segment is "aab", and the char sequence is "aac", this method returns 2,
+ * since the first 2 characters are the same.
+ *
+ * <p>
+ * This method only returns offsets along code point boundaries.
+ *
+ * <p>
+ * This method will perform case folding if case folding was enabled in the constructor.
+ *
+ * <p>
+ * IMPORTANT: The given UnicodeString must not be empty! It is the caller's responsibility to check.
+ */
+ int32_t getCommonPrefixLength(const UnicodeString& other);
+
+ /**
+ * Like {@link #getCommonPrefixLength}, but never performs case folding, even if case folding is
+ * enabled for the parser.
+ */
+ int32_t getCaseSensitivePrefixLength(const UnicodeString& other);
+
+ bool operator==(const UnicodeString& other) const;
+
+ private:
+ const UnicodeString& fStr;
+ int32_t fStart;
+ int32_t fEnd;
+ bool fFoldCase;
+
+ int32_t getPrefixLengthInternal(const UnicodeString& other, bool foldCase);
+
+ static bool codePointsEqual(UChar32 cp1, UChar32 cp2, bool foldCase);
+};
+
+
+U_NAMESPACE_END
+
+#endif //__NUMPARSE_STRINGSEGMENT_H__
+#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/strmatch.cpp b/Build/source/libs/icu/icu-src/source/i18n/strmatch.cpp
index aa9e7ae9d1b..a20f7873fec 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/strmatch.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/strmatch.cpp
@@ -58,7 +58,7 @@ StringMatcher::~StringMatcher() {
/**
* Implement UnicodeFunctor
*/
-UnicodeFunctor* StringMatcher::clone() const {
+StringMatcher* StringMatcher::clone() const {
return new StringMatcher(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/strmatch.h b/Build/source/libs/icu/icu-src/source/i18n/strmatch.h
index 8ebdb309e60..71ae9849511 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/strmatch.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/strmatch.h
@@ -78,7 +78,7 @@ class StringMatcher : public UnicodeFunctor, public UnicodeMatcher, public Unico
* Implement UnicodeFunctor
* @return a copy of the object.
*/
- virtual UnicodeFunctor* clone() const;
+ virtual StringMatcher* clone() const;
/**
* UnicodeFunctor API. Cast 'this' to a UnicodeMatcher* pointer
diff --git a/Build/source/libs/icu/icu-src/source/i18n/strrepl.cpp b/Build/source/libs/icu/icu-src/source/i18n/strrepl.cpp
index 0eef3d47005..9fafeb2659c 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/strrepl.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/strrepl.cpp
@@ -87,7 +87,7 @@ StringReplacer::~StringReplacer() {
/**
* Implement UnicodeFunctor
*/
-UnicodeFunctor* StringReplacer::clone() const {
+StringReplacer* StringReplacer::clone() const {
return new StringReplacer(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/strrepl.h b/Build/source/libs/icu/icu-src/source/i18n/strrepl.h
index feec058152a..7f74d0d9450 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/strrepl.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/strrepl.h
@@ -111,7 +111,7 @@ class StringReplacer : public UnicodeFunctor, public UnicodeReplacer {
/**
* Implement UnicodeFunctor
*/
- virtual UnicodeFunctor* clone() const;
+ virtual StringReplacer* clone() const;
/**
* UnicodeFunctor API. Cast 'this' to a UnicodeReplacer* pointer
diff --git a/Build/source/libs/icu/icu-src/source/i18n/stsearch.cpp b/Build/source/libs/icu/icu-src/source/i18n/stsearch.cpp
index c5565677f95..3e6ed4648be 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/stsearch.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/stsearch.cpp
@@ -282,7 +282,7 @@ void StringSearch::reset()
usearch_reset(m_strsrch_);
}
-SearchIterator * StringSearch::safeClone(void) const
+StringSearch * StringSearch::safeClone() const
{
UErrorCode status = U_ZERO_ERROR;
StringSearch *result = new StringSearch(m_pattern_, m_text_,
diff --git a/Build/source/libs/icu/icu-src/source/i18n/taiwncal.cpp b/Build/source/libs/icu/icu-src/source/i18n/taiwncal.cpp
index dfd5f3cf929..27352aa10c3 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/taiwncal.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/taiwncal.cpp
@@ -53,7 +53,7 @@ TaiwanCalendar& TaiwanCalendar::operator= ( const TaiwanCalendar& right)
return *this;
}
-Calendar* TaiwanCalendar::clone(void) const
+TaiwanCalendar* TaiwanCalendar::clone() const
{
return new TaiwanCalendar(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/taiwncal.h b/Build/source/libs/icu/icu-src/source/i18n/taiwncal.h
index a1c25df6e23..01d4d31e80b 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/taiwncal.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/taiwncal.h
@@ -91,7 +91,7 @@ public:
* @return return a polymorphic copy of this calendar.
* @internal
*/
- virtual Calendar* clone(void) const;
+ virtual TaiwanCalendar* clone() const;
public:
/**
diff --git a/Build/source/libs/icu/icu-src/source/i18n/timezone.cpp b/Build/source/libs/icu/icu-src/source/i18n/timezone.cpp
index 234f52cc3dd..284334ebf7e 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/timezone.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/timezone.cpp
@@ -115,9 +115,14 @@ static const int32_t UNKNOWN_ZONE_ID_LENGTH = 11;
static icu::TimeZone* DEFAULT_ZONE = NULL;
static icu::UInitOnce gDefaultZoneInitOnce = U_INITONCE_INITIALIZER;
-static icu::TimeZone* _GMT = NULL;
-static icu::TimeZone* _UNKNOWN_ZONE = NULL;
+alignas(icu::SimpleTimeZone)
+static char gRawGMT[sizeof(icu::SimpleTimeZone)];
+
+alignas(icu::SimpleTimeZone)
+static char gRawUNKNOWN[sizeof(icu::SimpleTimeZone)];
+
static icu::UInitOnce gStaticZonesInitOnce = U_INITONCE_INITIALIZER;
+static UBool gStaticZonesInitialized = FALSE; // Whether the static zones are initialized and ready to use.
static char TZDATA_VERSION[16];
static icu::UInitOnce gTZDataVersionInitOnce = U_INITONCE_INITIALIZER;
@@ -142,11 +147,12 @@ static UBool U_CALLCONV timeZone_cleanup(void)
DEFAULT_ZONE = NULL;
gDefaultZoneInitOnce.reset();
- delete _GMT;
- _GMT = NULL;
- delete _UNKNOWN_ZONE;
- _UNKNOWN_ZONE = NULL;
- gStaticZonesInitOnce.reset();
+ if (gStaticZonesInitialized) {
+ reinterpret_cast<SimpleTimeZone*>(gRawGMT)->~SimpleTimeZone();
+ reinterpret_cast<SimpleTimeZone*>(gRawUNKNOWN)->~SimpleTimeZone();
+ gStaticZonesInitialized = FALSE;
+ gStaticZonesInitOnce.reset();
+ }
uprv_memset(TZDATA_VERSION, 0, sizeof(TZDATA_VERSION));
gTZDataVersionInitOnce.reset();
@@ -272,7 +278,7 @@ static UResourceBundle* openOlsonResource(const UnicodeString& id,
UResourceBundle& res,
UErrorCode& ec)
{
-#if U_DEBUG_TZ
+#ifdef U_DEBUG_TZ
char buf[128];
id.extract(0, sizeof(buf)-1, buf, sizeof(buf), "");
#endif
@@ -304,8 +310,12 @@ void U_CALLCONV initStaticTimeZones() {
// Initialize _GMT independently of other static data; it should
// be valid even if we can't load the time zone UDataMemory.
ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup);
- _UNKNOWN_ZONE = new SimpleTimeZone(0, UnicodeString(TRUE, UNKNOWN_ZONE_ID, UNKNOWN_ZONE_ID_LENGTH));
- _GMT = new SimpleTimeZone(0, UnicodeString(TRUE, GMT_ID, GMT_ID_LENGTH));
+
+ // new can't fail below, as we use placement new into staticly allocated space.
+ new(gRawGMT) SimpleTimeZone(0, UnicodeString(TRUE, GMT_ID, GMT_ID_LENGTH));
+ new(gRawUNKNOWN) SimpleTimeZone(0, UnicodeString(TRUE, UNKNOWN_ZONE_ID, UNKNOWN_ZONE_ID_LENGTH));
+
+ gStaticZonesInitialized = TRUE;
}
} // anonymous namespace
@@ -314,14 +324,14 @@ const TimeZone& U_EXPORT2
TimeZone::getUnknown()
{
umtx_initOnce(gStaticZonesInitOnce, &initStaticTimeZones);
- return *_UNKNOWN_ZONE;
+ return *reinterpret_cast<SimpleTimeZone*>(gRawUNKNOWN);
}
const TimeZone* U_EXPORT2
TimeZone::getGMT(void)
{
umtx_initOnce(gStaticZonesInitOnce, &initStaticTimeZones);
- return _GMT;
+ return reinterpret_cast<SimpleTimeZone*>(gRawGMT);
}
// *****************************************************************************
@@ -382,23 +392,22 @@ createSystemTimeZone(const UnicodeString& id, UErrorCode& ec) {
return NULL;
}
TimeZone* z = 0;
- UResourceBundle res;
- ures_initStackObject(&res);
+ StackUResourceBundle res;
U_DEBUG_TZ_MSG(("pre-err=%s\n", u_errorName(ec)));
- UResourceBundle *top = openOlsonResource(id, res, ec);
+ UResourceBundle *top = openOlsonResource(id, res.ref(), ec);
U_DEBUG_TZ_MSG(("post-err=%s\n", u_errorName(ec)));
if (U_SUCCESS(ec)) {
- z = new OlsonTimeZone(top, &res, id, ec);
+ z = new OlsonTimeZone(top, res.getAlias(), id, ec);
if (z == NULL) {
- U_DEBUG_TZ_MSG(("cstz: olson time zone failed to initialize - err %s\n", u_errorName(ec)));
+ ec = U_MEMORY_ALLOCATION_ERROR;
+ U_DEBUG_TZ_MSG(("cstz: olson time zone failed to initialize - err %s\n", u_errorName(ec)));
}
}
- ures_close(&res);
ures_close(top);
if (U_FAILURE(ec)) {
U_DEBUG_TZ_MSG(("cstz: failed to create, err %s\n", u_errorName(ec)));
delete z;
- z = 0;
+ z = NULL;
}
return z;
}
@@ -436,11 +445,8 @@ TimeZone::createTimeZone(const UnicodeString& ID)
if (result == NULL) {
U_DEBUG_TZ_MSG(("failed to load time zone with id - falling to Etc/Unknown(GMT)"));
const TimeZone& unknown = getUnknown();
- if (_UNKNOWN_ZONE == NULL) { // Cannot test (&unknown == NULL) because the
- U_DEBUG_TZ_MSG(("failed to getUnknown()")); // behavior of NULL references is undefined.
- } else {
- result = unknown.clone();
- }
+ // Unknown zone uses staticly allocated memory, so creation of it can never fail due to OOM.
+ result = unknown.clone();
}
return result;
}
@@ -450,10 +456,11 @@ TimeZone::createTimeZone(const UnicodeString& ID)
TimeZone* U_EXPORT2
TimeZone::detectHostTimeZone()
{
- // We access system timezone data through TPlatformUtilities,
- // including tzset(), timezone, and tzname[].
+ // We access system timezone data through uprv_tzset(), uprv_tzname(), and others,
+ // which have platform specific implementations in putil.cpp
int32_t rawOffset = 0;
const char *hostID;
+ UBool hostDetectionSucceeded = TRUE;
// First, try to create a system timezone, based
// on the string ID in tzname[0].
@@ -464,8 +471,7 @@ TimeZone::detectHostTimeZone()
// Get the timezone ID from the host. This function should do
// any required host-specific remapping; e.g., on Windows this
- // function maps the Date and Time control panel setting to an
- // ICU timezone ID.
+ // function maps the Windows Time Zone name to an ICU timezone ID.
hostID = uprv_tzname(0);
// Invert sign because UNIX semantics are backwards
@@ -473,10 +479,15 @@ TimeZone::detectHostTimeZone()
TimeZone* hostZone = NULL;
- /* Make sure that the string is NULL terminated to prevent BoundsChecker/Purify warnings. */
UnicodeString hostStrID(hostID, -1, US_INV);
- hostStrID.append((UChar)0);
- hostStrID.truncate(hostStrID.length()-1);
+
+ if (hostStrID.length() == 0) {
+ // The host time zone detection (or remapping) above has failed and
+ // we have no name at all. Fallback to using the Unknown zone.
+ hostStrID = UnicodeString(TRUE, UNKNOWN_ZONE_ID, UNKNOWN_ZONE_ID_LENGTH);
+ hostDetectionSucceeded = FALSE;
+ }
+
hostZone = createSystemTimeZone(hostStrID);
#if U_PLATFORM_USES_ONLY_WIN32_API
@@ -496,22 +507,19 @@ TimeZone::detectHostTimeZone()
// Construct a fixed standard zone with the host's ID
// and raw offset.
- if (hostZone == NULL) {
+ if (hostZone == NULL && hostDetectionSucceeded) {
hostZone = new SimpleTimeZone(rawOffset, hostStrID);
}
- // If we _still_ don't have a time zone, use GMT.
+ // If we _still_ don't have a time zone, use the Unknown zone.
//
// Note: This is extremely unlikely situation. If
// new SimpleTimeZone(...) above fails, the following
// code may also fail.
if (hostZone == NULL) {
- const TimeZone* temptz = TimeZone::getGMT();
- // If we can't use GMT, get out.
- if (temptz == NULL) {
- return NULL;
- }
- hostZone = temptz->clone();
+ // Unknown zone uses static allocated memory, so it must always exist.
+ // However, clone() allocates memory and can fail.
+ hostZone = TimeZone::getUnknown().clone();
}
return hostZone;
@@ -519,6 +527,8 @@ TimeZone::detectHostTimeZone()
// -------------------------------------
+static UMutex gDefaultZoneMutex;
+
/**
* Initialize DEFAULT_ZONE from the system default time zone.
* Upon return, DEFAULT_ZONE will not be NULL, unless operator new()
@@ -528,6 +538,7 @@ static void U_CALLCONV initDefault()
{
ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup);
+ Mutex lock(&gDefaultZoneMutex);
// If setDefault() has already been called we can skip getting the
// default zone information from the system.
if (DEFAULT_ZONE != NULL) {
@@ -549,9 +560,6 @@ static void U_CALLCONV initDefault()
TimeZone *default_zone = TimeZone::detectHostTimeZone();
- // The only way for DEFAULT_ZONE to be non-null at this point is if the user
- // made a thread-unsafe call to setDefault() or adoptDefault() in another
- // thread while this thread was doing something that required getting the default.
U_ASSERT(DEFAULT_ZONE == NULL);
DEFAULT_ZONE = default_zone;
@@ -563,7 +571,10 @@ TimeZone* U_EXPORT2
TimeZone::createDefault()
{
umtx_initOnce(gDefaultZoneInitOnce, initDefault);
- return (DEFAULT_ZONE != NULL) ? DEFAULT_ZONE->clone() : NULL;
+ {
+ Mutex lock(&gDefaultZoneMutex);
+ return (DEFAULT_ZONE != NULL) ? DEFAULT_ZONE->clone() : NULL;
+ }
}
// -------------------------------------
@@ -573,9 +584,12 @@ TimeZone::adoptDefault(TimeZone* zone)
{
if (zone != NULL)
{
- TimeZone *old = DEFAULT_ZONE;
- DEFAULT_ZONE = zone;
- delete old;
+ {
+ Mutex lock(&gDefaultZoneMutex);
+ TimeZone *old = DEFAULT_ZONE;
+ DEFAULT_ZONE = zone;
+ delete old;
+ }
ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup);
}
}
@@ -986,18 +1000,14 @@ int32_t U_EXPORT2
TimeZone::countEquivalentIDs(const UnicodeString& id) {
int32_t result = 0;
UErrorCode ec = U_ZERO_ERROR;
- UResourceBundle res;
- ures_initStackObject(&res);
+ StackUResourceBundle res;
U_DEBUG_TZ_MSG(("countEquivalentIDs..\n"));
- UResourceBundle *top = openOlsonResource(id, res, ec);
+ UResourceBundle *top = openOlsonResource(id, res.ref(), ec);
if (U_SUCCESS(ec)) {
- UResourceBundle r;
- ures_initStackObject(&r);
- ures_getByKey(&res, kLINKS, &r, &ec);
- ures_getIntVector(&r, &result, &ec);
- ures_close(&r);
+ StackUResourceBundle r;
+ ures_getByKey(res.getAlias(), kLINKS, r.getAlias(), &ec);
+ ures_getIntVector(r.getAlias(), &result, &ec);
}
- ures_close(&res);
ures_close(top);
return result;
}
@@ -1009,24 +1019,20 @@ TimeZone::getEquivalentID(const UnicodeString& id, int32_t index) {
U_DEBUG_TZ_MSG(("gEI(%d)\n", index));
UnicodeString result;
UErrorCode ec = U_ZERO_ERROR;
- UResourceBundle res;
- ures_initStackObject(&res);
- UResourceBundle *top = openOlsonResource(id, res, ec);
+ StackUResourceBundle res;
+ UResourceBundle *top = openOlsonResource(id, res.ref(), ec);
int32_t zone = -1;
if (U_SUCCESS(ec)) {
- UResourceBundle r;
- ures_initStackObject(&r);
+ StackUResourceBundle r;
int32_t size;
- ures_getByKey(&res, kLINKS, &r, &ec);
- const int32_t* v = ures_getIntVector(&r, &size, &ec);
+ ures_getByKey(res.getAlias(), kLINKS, r.getAlias(), &ec);
+ const int32_t *v = ures_getIntVector(r.getAlias(), &size, &ec);
if (U_SUCCESS(ec)) {
if (index >= 0 && index < size) {
zone = v[index];
}
}
- ures_close(&r);
}
- ures_close(&res);
if (zone >= 0) {
UResourceBundle *ares = ures_getByKey(top, kNAMES, NULL, &ec); // dereference Zones section
if (U_SUCCESS(ec)) {
@@ -1181,9 +1187,9 @@ TimeZone::getDisplayName(const Locale& locale, UnicodeString& result) const
}
UnicodeString&
-TimeZone::getDisplayName(UBool daylight, EDisplayType style, UnicodeString& result) const
+TimeZone::getDisplayName(UBool inDaylight, EDisplayType style, UnicodeString& result) const
{
- return getDisplayName(daylight,style, Locale::getDefault(), result);
+ return getDisplayName(inDaylight,style, Locale::getDefault(), result);
}
//--------------------------------------
int32_t
@@ -1195,7 +1201,7 @@ TimeZone::getDSTSavings()const {
}
//---------------------------------------
UnicodeString&
-TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& locale, UnicodeString& result) const
+TimeZone::getDisplayName(UBool inDaylight, EDisplayType style, const Locale& locale, UnicodeString& result) const
{
UErrorCode status = U_ZERO_ERROR;
UDate date = Calendar::getNow();
@@ -1220,13 +1226,13 @@ TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& local
tzfmt->format(UTZFMT_STYLE_GENERIC_SHORT, *this, date, result, &timeType);
break;
default:
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
}
// Generic format many use Localized GMT as the final fallback.
// When Localized GMT format is used, the result might not be
// appropriate for the requested daylight value.
- if ((daylight && timeType == UTZFMT_TIME_TYPE_STANDARD) || (!daylight && timeType == UTZFMT_TIME_TYPE_DAYLIGHT)) {
- offset = daylight ? getRawOffset() + getDSTSavings() : getRawOffset();
+ if ((inDaylight && timeType == UTZFMT_TIME_TYPE_STANDARD) || (!inDaylight && timeType == UTZFMT_TIME_TYPE_DAYLIGHT)) {
+ offset = inDaylight ? getRawOffset() + getDSTSavings() : getRawOffset();
if (style == SHORT_GENERIC) {
tzfmt->formatOffsetShortLocalizedGMT(offset, result, status);
} else {
@@ -1239,7 +1245,7 @@ TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& local
result.remove();
return result;
}
- offset = daylight && useDaylightTime() ? getRawOffset() + getDSTSavings() : getRawOffset();
+ offset = inDaylight && useDaylightTime() ? getRawOffset() + getDSTSavings() : getRawOffset();
switch (style) {
case LONG_GMT:
tzfmt->formatOffsetLocalizedGMT(offset, result, status);
@@ -1248,7 +1254,7 @@ TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& local
tzfmt->formatOffsetISO8601Basic(offset, FALSE, FALSE, FALSE, result, status);
break;
default:
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
}
} else {
@@ -1256,14 +1262,14 @@ TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& local
UTimeZoneNameType nameType = UTZNM_UNKNOWN;
switch (style) {
case LONG:
- nameType = daylight ? UTZNM_LONG_DAYLIGHT : UTZNM_LONG_STANDARD;
+ nameType = inDaylight ? UTZNM_LONG_DAYLIGHT : UTZNM_LONG_STANDARD;
break;
case SHORT:
case SHORT_COMMONLY_USED:
- nameType = daylight ? UTZNM_SHORT_DAYLIGHT : UTZNM_SHORT_STANDARD;
+ nameType = inDaylight ? UTZNM_SHORT_DAYLIGHT : UTZNM_SHORT_STANDARD;
break;
default:
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
}
LocalPointer<TimeZoneNames> tznames(TimeZoneNames::createInstance(locale, status));
if (U_FAILURE(status)) {
@@ -1275,7 +1281,7 @@ TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& local
if (result.isEmpty()) {
// Fallback to localized GMT
LocalPointer<TimeZoneFormat> tzfmt(TimeZoneFormat::createInstance(locale, status));
- offset = daylight && useDaylightTime() ? getRawOffset() + getDSTSavings() : getRawOffset();
+ offset = inDaylight && useDaylightTime() ? getRawOffset() + getDSTSavings() : getRawOffset();
if (style == LONG) {
tzfmt->formatOffsetLocalizedGMT(offset, result, status);
} else {
@@ -1496,8 +1502,9 @@ TimeZone::hasSameRules(const TimeZone& other) const
static void U_CALLCONV initTZDataVersion(UErrorCode &status) {
ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup);
int32_t len = 0;
- UResourceBundle *bundle = ures_openDirect(NULL, kZONEINFO, &status);
- const UChar *tzver = ures_getStringByKey(bundle, kTZVERSION, &len, &status);
+ StackUResourceBundle bundle;
+ ures_openDirectFillIn(bundle.getAlias(), NULL, kZONEINFO, &status);
+ const UChar *tzver = ures_getStringByKey(bundle.getAlias(), kTZVERSION, &len, &status);
if (U_SUCCESS(status)) {
if (len >= (int32_t)sizeof(TZDATA_VERSION)) {
@@ -1506,8 +1513,6 @@ static void U_CALLCONV initTZDataVersion(UErrorCode &status) {
}
u_UCharsToChars(tzver, TZDATA_VERSION, len);
}
- ures_close(bundle);
-
}
const char*
diff --git a/Build/source/libs/icu/icu-src/source/i18n/titletrn.cpp b/Build/source/libs/icu/icu-src/source/i18n/titletrn.cpp
index 9b37d7fc8a7..9c39b4676ad 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/titletrn.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/titletrn.cpp
@@ -60,7 +60,7 @@ TitlecaseTransliterator::TitlecaseTransliterator(const TitlecaseTransliterator&
/**
* Transliterator API.
*/
-Transliterator* TitlecaseTransliterator::clone(void) const {
+TitlecaseTransliterator* TitlecaseTransliterator::clone() const {
return new TitlecaseTransliterator(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/titletrn.h b/Build/source/libs/icu/icu-src/source/i18n/titletrn.h
index 166378fe9da..4e45ac6f81f 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/titletrn.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/titletrn.h
@@ -52,7 +52,7 @@ class TitlecaseTransliterator : public CaseMapTransliterator {
* Transliterator API.
* @return a copy of the object.
*/
- virtual Transliterator* clone(void) const;
+ virtual TitlecaseTransliterator* clone() const;
/**
* ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/tmunit.cpp b/Build/source/libs/icu/icu-src/source/i18n/tmunit.cpp
index bf078d9cd49..910489b1784 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/tmunit.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/tmunit.cpp
@@ -94,8 +94,7 @@ TimeUnit::TimeUnit(TimeUnit::UTimeUnitFields timeUnitField) {
initTime("second");
break;
default:
- U_ASSERT(false);
- break;
+ UPRV_UNREACHABLE;
}
}
@@ -103,7 +102,7 @@ TimeUnit::TimeUnit(const TimeUnit& other)
: MeasureUnit(other), fTimeUnitField(other.fTimeUnitField) {
}
-UObject*
+TimeUnit*
TimeUnit::clone() const {
return new TimeUnit(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/tmutamt.cpp b/Build/source/libs/icu/icu-src/source/i18n/tmutamt.cpp
index a69fe577527..25464693ea9 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/tmutamt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/tmutamt.cpp
@@ -50,7 +50,7 @@ TimeUnitAmount::operator==(const UObject& other) const {
return Measure::operator==(other);
}
-UObject*
+TimeUnitAmount*
TimeUnitAmount::clone() const {
return new TimeUnitAmount(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/tmutfmt.cpp b/Build/source/libs/icu/icu-src/source/i18n/tmutfmt.cpp
index 50dac8b7cef..231ea5799c3 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/tmutfmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/tmutfmt.cpp
@@ -136,8 +136,8 @@ TimeUnitFormat::~TimeUnitFormat() {
}
-Format*
-TimeUnitFormat::clone(void) const {
+TimeUnitFormat*
+TimeUnitFormat::clone() const {
return new TimeUnitFormat(*this);
}
@@ -224,7 +224,7 @@ TimeUnitFormat::parseObject(const UnicodeString& source,
if (temp.getType() == Formattable::kString) {
UnicodeString tmpString;
UErrorCode pStatus = U_ZERO_ERROR;
- getNumberFormat().parse(temp.getString(tmpString), tmpNumber, pStatus);
+ getNumberFormatInternal().parse(temp.getString(tmpString), tmpNumber, pStatus);
if (U_FAILURE(pStatus)) {
continue;
}
@@ -685,7 +685,7 @@ TimeUnitFormat::setNumberFormat(const NumberFormat& format, UErrorCode& status){
if (U_FAILURE(status)) {
return;
}
- adoptNumberFormat((NumberFormat *)format.clone(), status);
+ adoptNumberFormat(format.clone(), status);
}
@@ -721,8 +721,8 @@ TimeUnitFormat::copyHash(const Hashtable* source, Hashtable* target, UErrorCode&
const UHashTok valueTok = element->value;
const MessageFormat** value = (const MessageFormat**)valueTok.pointer;
MessageFormat** newVal = (MessageFormat**)uprv_malloc(UTMUTFMT_FORMAT_STYLE_COUNT*sizeof(MessageFormat*));
- newVal[0] = (MessageFormat*)value[0]->clone();
- newVal[1] = (MessageFormat*)value[1]->clone();
+ newVal[0] = value[0]->clone();
+ newVal[1] = value[1]->clone();
target->put(UnicodeString(*key), newVal, status);
if ( U_FAILURE(status) ) {
delete newVal[0];
diff --git a/Build/source/libs/icu/icu-src/source/i18n/tolowtrn.cpp b/Build/source/libs/icu/icu-src/source/i18n/tolowtrn.cpp
index 6dae6f109be..289327874e3 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/tolowtrn.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/tolowtrn.cpp
@@ -58,7 +58,7 @@ LowercaseTransliterator::LowercaseTransliterator(const LowercaseTransliterator&
/**
* Transliterator API.
*/
-Transliterator* LowercaseTransliterator::clone(void) const {
+LowercaseTransliterator* LowercaseTransliterator::clone() const {
return new LowercaseTransliterator(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/tolowtrn.h b/Build/source/libs/icu/icu-src/source/i18n/tolowtrn.h
index e311431224e..2fbfb90e1bf 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/tolowtrn.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/tolowtrn.h
@@ -50,7 +50,7 @@ class LowercaseTransliterator : public CaseMapTransliterator {
* Transliterator API.
* @return a copy of the object.
*/
- virtual Transliterator* clone(void) const;
+ virtual LowercaseTransliterator* clone() const;
/**
* ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/toupptrn.cpp b/Build/source/libs/icu/icu-src/source/i18n/toupptrn.cpp
index 098dba9a3ce..2a8b78b9a69 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/toupptrn.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/toupptrn.cpp
@@ -58,7 +58,7 @@ UppercaseTransliterator::UppercaseTransliterator(const UppercaseTransliterator&
/**
* Transliterator API.
*/
-Transliterator* UppercaseTransliterator::clone(void) const {
+UppercaseTransliterator* UppercaseTransliterator::clone() const {
return new UppercaseTransliterator(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/toupptrn.h b/Build/source/libs/icu/icu-src/source/i18n/toupptrn.h
index 677a04e5c77..e96ca8f0ba5 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/toupptrn.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/toupptrn.h
@@ -50,7 +50,7 @@ class UppercaseTransliterator : public CaseMapTransliterator {
* Transliterator API.
* @return a copy of the object.
*/
- virtual Transliterator* clone(void) const;
+ virtual UppercaseTransliterator* clone() const;
/**
* ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/translit.cpp b/Build/source/libs/icu/icu-src/source/i18n/translit.cpp
index 2bc20bd5cf4..dae87d06d79 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/translit.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/translit.cpp
@@ -91,7 +91,7 @@ static const char RB_RULE_BASED_IDS[] = "RuleBasedTransliteratorIDs";
/**
* The mutex controlling access to registry object.
*/
-static UMutex registryMutex = U_MUTEX_INITIALIZER;
+static icu::UMutex registryMutex;
/**
* System transliterator registry; non-null when initialized.
@@ -158,7 +158,7 @@ Transliterator::Transliterator(const Transliterator& other) :
if (other.filter != 0) {
// We own the filter, so we must have our own copy
- filter = (UnicodeFilter*) other.filter->clone();
+ filter = other.filter->clone();
}
}
@@ -175,7 +175,7 @@ Transliterator& Transliterator::operator=(const Transliterator& other) {
ID.getTerminatedBuffer();
maximumContextLength = other.maximumContextLength;
- adoptFilter((other.filter == 0) ? 0 : (UnicodeFilter*) other.filter->clone());
+ adoptFilter((other.filter == 0) ? 0 : other.filter->clone());
return *this;
}
@@ -923,13 +923,15 @@ Transliterator::createInstance(const UnicodeString& ID,
return NULL;
}
- UnicodeSet* globalFilter;
+ UnicodeSet* globalFilter = nullptr;
// TODO add code for parseError...currently unused, but
// later may be used by parsing code...
if (!TransliteratorIDParser::parseCompoundID(ID, dir, canonID, list, globalFilter)) {
status = U_INVALID_ID;
+ delete globalFilter;
return NULL;
}
+ LocalPointer<UnicodeSet> lpGlobalFilter(globalFilter);
TransliteratorIDParser::instantiateList(list, status);
if (U_FAILURE(status)) {
@@ -953,8 +955,8 @@ Transliterator::createInstance(const UnicodeString& ID,
// Check null pointer
if (t != NULL) {
t->setID(canonID);
- if (globalFilter != NULL) {
- t->adoptFilter(globalFilter);
+ if (lpGlobalFilter.isValid()) {
+ t->adoptFilter(lpGlobalFilter.orphan());
}
}
else if (U_SUCCESS(status)) {
@@ -1101,6 +1103,10 @@ Transliterator::createFromRules(const UnicodeString& ID,
UnicodeString* idBlock = (UnicodeString*)parser.idBlockVector.elementAt(i);
if (!idBlock->isEmpty()) {
Transliterator* temp = createInstance(*idBlock, UTRANS_FORWARD, parseError, status);
+ if (U_FAILURE(status)) {
+ delete temp;
+ return nullptr;
+ }
if (temp != NULL && typeid(*temp) != typeid(NullTransliterator))
transliterators.addElement(temp, status);
else
@@ -1114,8 +1120,10 @@ Transliterator::createFromRules(const UnicodeString& ID,
data, TRUE);
// Check if NULL before adding it to transliterators to avoid future usage of NULL pointer.
if (temprbt == NULL) {
- status = U_MEMORY_ALLOCATION_ERROR;
- return t;
+ if (U_SUCCESS(status)) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ }
+ return t;
}
transliterators.addElement(temprbt, status);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/transreg.cpp b/Build/source/libs/icu/icu-src/source/i18n/transreg.cpp
index 1a96ad367f2..c412a20079e 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/transreg.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/transreg.cpp
@@ -131,7 +131,7 @@ Transliterator* TransliteratorAlias::create(UParseError& pe,
return 0;
}
if (compoundFilter != 0)
- t->adoptFilter((UnicodeSet*)compoundFilter->clone());
+ t->adoptFilter(compoundFilter->clone());
break;
case COMPOUND:
{
@@ -173,8 +173,8 @@ Transliterator* TransliteratorAlias::create(UParseError& pe,
if (U_SUCCESS(ec)) {
t = new CompoundTransliterator(ID, transliterators,
- (compoundFilter ? (UnicodeSet*)(compoundFilter->clone()) : 0),
- anonymousRBTs, pe, ec);
+ (compoundFilter ? compoundFilter->clone() : nullptr),
+ anonymousRBTs, pe, ec);
if (t == 0) {
ec = U_MEMORY_ALLOCATION_ERROR;
return 0;
@@ -186,8 +186,7 @@ Transliterator* TransliteratorAlias::create(UParseError& pe,
}
break;
case RULES:
- U_ASSERT(FALSE); // don't call create() if isRuleBased() returns TRUE!
- break;
+ UPRV_UNREACHABLE; // don't call create() if isRuleBased() returns TRUE!
}
return t;
}
@@ -947,7 +946,7 @@ void TransliteratorRegistry::registerEntry(const UnicodeString& ID,
if (visible) {
registerSTV(source, target, variant);
if (!availableIDs.contains((void*) &ID)) {
- UnicodeString *newID = (UnicodeString *)ID.clone();
+ UnicodeString *newID = ID.clone();
// Check to make sure newID was created.
if (newID != NULL) {
// NUL-terminate the ID string
@@ -1396,8 +1395,7 @@ Transliterator* TransliteratorRegistry::instantiateEntry(const UnicodeString& ID
}
return 0;
default:
- U_ASSERT(FALSE); // can't get here
- return 0;
+ UPRV_UNREACHABLE; // can't get here
}
}
U_NAMESPACE_END
diff --git a/Build/source/libs/icu/icu-src/source/i18n/tridpars.cpp b/Build/source/libs/icu/icu-src/source/i18n/tridpars.cpp
index b27663649ad..65bfc880633 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/tridpars.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/tridpars.cpp
@@ -50,7 +50,7 @@ static UInitOnce gSpecialInversesInitOnce = U_INITONCE_INITIALIZER;
/**
* The mutex controlling access to SPECIAL_INVERSES
*/
-static UMutex LOCK = U_MUTEX_INITIALIZER;
+static UMutex LOCK;
TransliteratorIDParser::Specs::Specs(const UnicodeString& s, const UnicodeString& t,
const UnicodeString& v, UBool sawS,
@@ -294,6 +294,7 @@ UnicodeSet* TransliteratorIDParser::parseGlobalFilter(const UnicodeString& id, i
pos = ppos.getIndex();
if (withParens == 1 && !ICU_Utility::parseChar(id, pos, CLOSE_REV)) {
+ delete filter;
pos = start;
return NULL;
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/tzfmt.cpp b/Build/source/libs/icu/icu-src/source/i18n/tzfmt.cpp
index 769977a3e31..f87f0f67b13 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/tzfmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/tzfmt.cpp
@@ -19,12 +19,15 @@
#include "unicode/udat.h"
#include "unicode/ustring.h"
#include "unicode/utf16.h"
+#include "bytesinkutil.h"
+#include "charstr.h"
#include "tzgnames.h"
#include "cmemory.h"
#include "cstring.h"
#include "putilimp.h"
#include "uassert.h"
#include "ucln_in.h"
+#include "ulocimp.h"
#include "umutex.h"
#include "uresimp.h"
#include "ureslocs.h"
@@ -147,7 +150,7 @@ static icu::UInitOnce gZoneIdTrieInitOnce = U_INITONCE_INITIALIZER;
static TextTrieMap *gShortZoneIdTrie = NULL;
static icu::UInitOnce gShortZoneIdTrieInitOnce = U_INITONCE_INITIALIZER;
-static UMutex gLock = U_MUTEX_INITIALIZER;
+static UMutex gLock;
U_CDECL_BEGIN
/**
@@ -267,7 +270,7 @@ GMTOffsetField::isValid(FieldType type, int32_t width) {
case SECOND:
return (width == 2);
default:
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
}
return (width > 0);
}
@@ -324,10 +327,13 @@ TimeZoneFormat::TimeZoneFormat(const Locale& locale, UErrorCode& status)
const char* region = fLocale.getCountry();
int32_t regionLen = static_cast<int32_t>(uprv_strlen(region));
if (regionLen == 0) {
- char loc[ULOC_FULLNAME_CAPACITY];
- uloc_addLikelySubtags(fLocale.getName(), loc, sizeof(loc), &status);
+ CharString loc;
+ {
+ CharStringByteSink sink(&loc);
+ ulocimp_addLikelySubtags(fLocale.getName(), sink, &status);
+ }
- regionLen = uloc_getCountry(loc, fTargetRegion, sizeof(fTargetRegion), &status);
+ regionLen = uloc_getCountry(loc.data(), fTargetRegion, sizeof(fTargetRegion), &status);
if (U_SUCCESS(status)) {
fTargetRegion[regionLen] = 0;
} else {
@@ -499,7 +505,7 @@ TimeZoneFormat::operator==(const Format& other) const {
return isEqual;
}
-Format*
+TimeZoneFormat*
TimeZoneFormat::clone() const {
return new TimeZoneFormat(*this);
}
@@ -589,8 +595,7 @@ TimeZoneFormat::setGMTOffsetPattern(UTimeZoneFormatGMTOffsetPatternType type, co
required = FIELDS_HMS;
break;
default:
- U_ASSERT(FALSE);
- break;
+ UPRV_UNREACHABLE;
}
UVector* patternItems = parseOffsetPattern(pattern, required, status);
@@ -1028,7 +1033,7 @@ TimeZoneFormat::parse(UTimeZoneFormatStyle style, const UnicodeString& text, Par
break;
default:
- U_ASSERT(FALSE);
+ UPRV_UNREACHABLE;
}
int32_t len = 0;
@@ -1873,7 +1878,7 @@ TimeZoneFormat::parseOffsetFieldsWithPattern(const UnicodeString& text, int32_t
while (len > 0) {
UChar32 ch;
int32_t chLen;
- U16_GET(patStr, 0, 0, len, ch)
+ U16_GET(patStr, 0, 0, len, ch);
if (PatternProps::isWhiteSpace(ch)) {
chLen = U16_LENGTH(ch);
len -= chLen;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/tzgnames.cpp b/Build/source/libs/icu/icu-src/source/i18n/tzgnames.cpp
index 5f5b7db3022..e056461dc30 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/tzgnames.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/tzgnames.cpp
@@ -21,12 +21,15 @@
#include "unicode/strenum.h"
#include "unicode/vtzone.h"
+#include "bytesinkutil.h"
+#include "charstr.h"
#include "cmemory.h"
#include "cstring.h"
#include "mutex.h"
#include "uhash.h"
#include "uassert.h"
#include "umutex.h"
+#include "ulocimp.h"
#include "uresimp.h"
#include "ureslocs.h"
#include "zonemeta.h"
@@ -269,7 +272,7 @@ GNameSearchHandler::getMatches(int32_t& maxMatchLen) {
return results;
}
-static UMutex gLock = U_MUTEX_INITIALIZER;
+static UMutex gLock;
class TZGNCore : public UMemory {
public:
@@ -409,10 +412,13 @@ TZGNCore::initialize(const Locale& locale, UErrorCode& status) {
const char* region = fLocale.getCountry();
int32_t regionLen = static_cast<int32_t>(uprv_strlen(region));
if (regionLen == 0) {
- char loc[ULOC_FULLNAME_CAPACITY];
- uloc_addLikelySubtags(fLocale.getName(), loc, sizeof(loc), &status);
+ CharString loc;
+ {
+ CharStringByteSink sink(&loc);
+ ulocimp_addLikelySubtags(fLocale.getName(), sink, &status);
+ }
- regionLen = uloc_getCountry(loc, fTargetRegion, sizeof(fTargetRegion), &status);
+ regionLen = uloc_getCountry(loc.data(), fTargetRegion, sizeof(fTargetRegion), &status);
if (U_SUCCESS(status)) {
fTargetRegion[regionLen] = 0;
} else {
@@ -1112,7 +1118,7 @@ typedef struct TZGNCoreRef {
} TZGNCoreRef;
// TZGNCore object cache handling
-static UMutex gTZGNLock = U_MUTEX_INITIALIZER;
+static UMutex gTZGNLock;
static UHashtable *gTZGNCoreCache = NULL;
static UBool gTZGNCoreCacheInitialized = FALSE;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/tzgnames.h b/Build/source/libs/icu/icu-src/source/i18n/tzgnames.h
index 2bd76135d8a..71d9d84dc04 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/tzgnames.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/tzgnames.h
@@ -46,7 +46,7 @@ public:
static TimeZoneGenericNames* createInstance(const Locale& locale, UErrorCode& status);
virtual UBool operator==(const TimeZoneGenericNames& other) const;
- virtual UBool operator!=(const TimeZoneGenericNames& other) const {return !operator==(other);};
+ virtual UBool operator!=(const TimeZoneGenericNames& other) const {return !operator==(other);}
virtual TimeZoneGenericNames* clone() const;
UnicodeString& getDisplayName(const TimeZone& tz, UTimeZoneGenericNameType type,
diff --git a/Build/source/libs/icu/icu-src/source/i18n/tznames.cpp b/Build/source/libs/icu/icu-src/source/i18n/tznames.cpp
index 5a79c22aacf..d789c123630 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/tznames.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/tznames.cpp
@@ -29,7 +29,7 @@
U_NAMESPACE_BEGIN
// TimeZoneNames object cache handling
-static UMutex gTimeZoneNamesLock = U_MUTEX_INITIALIZER;
+static UMutex gTimeZoneNamesLock;
static UHashtable *gTimeZoneNamesCache = NULL;
static UBool gTimeZoneNamesCacheInitialized = FALSE;
@@ -105,8 +105,8 @@ public:
virtual ~TimeZoneNamesDelegate();
virtual UBool operator==(const TimeZoneNames& other) const;
- virtual UBool operator!=(const TimeZoneNames& other) const {return !operator==(other);};
- virtual TimeZoneNames* clone() const;
+ virtual UBool operator!=(const TimeZoneNames& other) const {return !operator==(other);}
+ virtual TimeZoneNamesDelegate* clone() const;
StringEnumeration* getAvailableMetaZoneIDs(UErrorCode& status) const;
StringEnumeration* getAvailableMetaZoneIDs(const UnicodeString& tzID, UErrorCode& status) const;
@@ -233,7 +233,7 @@ TimeZoneNamesDelegate::operator==(const TimeZoneNames& other) const {
return FALSE;
}
-TimeZoneNames*
+TimeZoneNamesDelegate*
TimeZoneNamesDelegate::clone() const {
TimeZoneNamesDelegate* other = new TimeZoneNamesDelegate();
if (other != NULL) {
diff --git a/Build/source/libs/icu/icu-src/source/i18n/tznames_impl.cpp b/Build/source/libs/icu/icu-src/source/i18n/tznames_impl.cpp
index 7bfbc04e180..186aaaf74d0 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/tznames_impl.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/tznames_impl.cpp
@@ -21,11 +21,14 @@
#include "unicode/utf16.h"
#include "tznames_impl.h"
+#include "bytesinkutil.h"
+#include "charstr.h"
#include "cmemory.h"
#include "cstring.h"
#include "uassert.h"
#include "mutex.h"
#include "resource.h"
+#include "ulocimp.h"
#include "uresimp.h"
#include "ureslocs.h"
#include "zonemeta.h"
@@ -49,8 +52,7 @@ static const UChar NO_NAME[] = { 0 }; // for empty no-fallback time
static const char* TZDBNAMES_KEYS[] = {"ss", "sd"};
static const int32_t TZDBNAMES_KEYS_SIZE = UPRV_LENGTHOF(TZDBNAMES_KEYS);
-static UMutex gTZDBNamesMapLock = U_MUTEX_INITIALIZER;
-static UMutex gDataMutex = U_MUTEX_INITIALIZER;
+static UMutex gDataMutex;
static UHashtable* gTZDBNamesMap = NULL;
static icu::UInitOnce gTZDBNamesMapInitOnce = U_INITONCE_INITIALIZER;
@@ -357,8 +359,6 @@ TextTrieMap::getChildNode(CharacterNode *parent, UChar c) const {
return NULL;
}
-// Mutex for protecting the lazy creation of the Trie node structure on the first call to search().
-static UMutex TextTrieMutex = U_MUTEX_INITIALIZER;
// buildTrie() - The Trie node structure is needed. Create it from the data that was
// saved at the time the ZoneStringFormatter was created. The Trie is only
@@ -386,6 +386,10 @@ TextTrieMap::search(const UnicodeString &text, int32_t start,
// the ICU atomic safe functions for assigning and testing.
// Don't test the pointer fLazyContents.
// Don't do unless it's really required.
+
+ // Mutex for protecting the lazy creation of the Trie node structure on the first call to search().
+ static UMutex TextTrieMutex;
+
Mutex lock(&TextTrieMutex);
if (fLazyContents != NULL) {
TextTrieMap *nonConstThis = const_cast<TextTrieMap *>(this);
@@ -1109,7 +1113,7 @@ TimeZoneNamesImpl::operator==(const TimeZoneNames& other) const {
return FALSE;
}
-TimeZoneNames*
+TimeZoneNamesImpl*
TimeZoneNamesImpl::clone() const {
UErrorCode status = U_ZERO_ERROR;
return new TimeZoneNamesImpl(fLocale, status);
@@ -2131,9 +2135,12 @@ TZDBTimeZoneNames::TZDBTimeZoneNames(const Locale& locale)
int32_t regionLen = static_cast<int32_t>(uprv_strlen(region));
if (regionLen == 0) {
UErrorCode status = U_ZERO_ERROR;
- char loc[ULOC_FULLNAME_CAPACITY];
- uloc_addLikelySubtags(fLocale.getName(), loc, sizeof(loc), &status);
- regionLen = uloc_getCountry(loc, fRegion, sizeof(fRegion), &status);
+ CharString loc;
+ {
+ CharStringByteSink sink(&loc);
+ ulocimp_addLikelySubtags(fLocale.getName(), sink, &status);
+ }
+ regionLen = uloc_getCountry(loc.data(), fRegion, sizeof(fRegion), &status);
if (U_SUCCESS(status) && regionLen < (int32_t)sizeof(fRegion)) {
useWorld = FALSE;
}
@@ -2158,7 +2165,7 @@ TZDBTimeZoneNames::operator==(const TimeZoneNames& other) const {
return FALSE;
}
-TimeZoneNames*
+TZDBTimeZoneNames*
TZDBTimeZoneNames::clone() const {
return new TZDBTimeZoneNames(fLocale);
}
@@ -2243,6 +2250,7 @@ TZDBTimeZoneNames::getMetaZoneNames(const UnicodeString& mzID, UErrorCode& statu
U_ASSERT(status == U_ZERO_ERROR); // already checked length above
mzIDKey[mzID.length()] = 0;
+ static UMutex gTZDBNamesMapLock;
umtx_lock(&gTZDBNamesMapLock);
{
void *cacheVal = uhash_get(gTZDBNamesMap, mzIDKey);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/tznames_impl.h b/Build/source/libs/icu/icu-src/source/i18n/tznames_impl.h
index 4db036e7475..1286eeb80dc 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/tznames_impl.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/tznames_impl.h
@@ -174,7 +174,7 @@ public:
virtual ~TimeZoneNamesImpl();
virtual UBool operator==(const TimeZoneNames& other) const;
- virtual TimeZoneNames* clone() const;
+ virtual TimeZoneNamesImpl* clone() const;
StringEnumeration* getAvailableMetaZoneIDs(UErrorCode& status) const;
StringEnumeration* getAvailableMetaZoneIDs(const UnicodeString& tzID, UErrorCode& status) const;
@@ -236,7 +236,7 @@ public:
virtual ~TZDBTimeZoneNames();
virtual UBool operator==(const TimeZoneNames& other) const;
- virtual TimeZoneNames* clone() const;
+ virtual TZDBTimeZoneNames* clone() const;
StringEnumeration* getAvailableMetaZoneIDs(UErrorCode& status) const;
StringEnumeration* getAvailableMetaZoneIDs(const UnicodeString& tzID, UErrorCode& status) const;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/tzrule.cpp b/Build/source/libs/icu/icu-src/source/i18n/tzrule.cpp
index f4ede7cefc7..759a2d4c673 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/tzrule.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/tzrule.cpp
@@ -108,7 +108,7 @@ InitialTimeZoneRule::~InitialTimeZoneRule() {
}
InitialTimeZoneRule*
-InitialTimeZoneRule::clone(void) const {
+InitialTimeZoneRule::clone() const {
return new InitialTimeZoneRule(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/ucal.cpp b/Build/source/libs/icu/icu-src/source/i18n/ucal.cpp
index 282d84cd6b0..927b2d36979 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/ucal.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/ucal.cpp
@@ -34,7 +34,7 @@ U_NAMESPACE_USE
static TimeZone*
_createTimeZone(const UChar* zoneID, int32_t len, UErrorCode* ec) {
TimeZone* zone = NULL;
- if (ec!=NULL && U_SUCCESS(*ec)) {
+ if (ec != NULL && U_SUCCESS(*ec)) {
// Note that if zoneID is invalid, we get back GMT. This odd
// behavior is by design and goes back to the JDK. The only
// failure we will see is a memory allocation failure.
@@ -69,7 +69,7 @@ ucal_openCountryTimeZones(const char* country, UErrorCode* ec) {
U_CAPI int32_t U_EXPORT2
ucal_getDefaultTimeZone(UChar* result, int32_t resultCapacity, UErrorCode* ec) {
int32_t len = 0;
- if (ec!=NULL && U_SUCCESS(*ec)) {
+ if (ec != NULL && U_SUCCESS(*ec)) {
TimeZone* zone = TimeZone::createDefault();
if (zone == NULL) {
*ec = U_MEMORY_ALLOCATION_ERROR;
@@ -91,6 +91,23 @@ ucal_setDefaultTimeZone(const UChar* zoneID, UErrorCode* ec) {
}
}
+U_DRAFT int32_t U_EXPORT2
+ucal_getHostTimeZone(UChar* result, int32_t resultCapacity, UErrorCode* ec) {
+ int32_t len = 0;
+ if (ec != NULL && U_SUCCESS(*ec)) {
+ TimeZone *zone = TimeZone::detectHostTimeZone();
+ if (zone == NULL) {
+ *ec = U_MEMORY_ALLOCATION_ERROR;
+ } else {
+ UnicodeString id;
+ zone->getID(id);
+ delete zone;
+ len = id.extract(result, resultCapacity, *ec);
+ }
+ }
+ return len;
+}
+
U_CAPI int32_t U_EXPORT2
ucal_getDSTSavings(const UChar* zoneID, UErrorCode* ec) {
int32_t result = 0;
@@ -140,8 +157,8 @@ ucal_open( const UChar* zoneID,
if(U_FAILURE(*status)) return 0;
- TimeZone* zone = (zoneID==NULL) ? TimeZone::createDefault()
- : _createTimeZone(zoneID, len, status);
+ LocalPointer<TimeZone> zone( (zoneID==NULL) ? TimeZone::createDefault()
+ : _createTimeZone(zoneID, len, status), *status);
if (U_FAILURE(*status)) {
return NULL;
@@ -157,9 +174,9 @@ ucal_open( const UChar* zoneID,
if (U_FAILURE(*status)) {
return NULL;
}
- return (UCalendar*)Calendar::createInstance(zone, Locale(localeBuf), *status);
+ return (UCalendar*)Calendar::createInstance(zone.orphan(), Locale(localeBuf), *status);
}
- return (UCalendar*)Calendar::createInstance(zone, Locale(locale), *status);
+ return (UCalendar*)Calendar::createInstance(zone.orphan(), Locale(locale), *status);
}
U_CAPI void U_EXPORT2
diff --git a/Build/source/libs/icu/icu-src/source/i18n/ucln_in.h b/Build/source/libs/icu/icu-src/source/i18n/ucln_in.h
index 4c13b9ffcb5..2f70a8500e1 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/ucln_in.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/ucln_in.h
@@ -60,6 +60,7 @@ typedef enum ECleanupI18NType {
UCLN_I18N_CDFINFO,
UCLN_I18N_REGION,
UCLN_I18N_LIST_FORMATTER,
+ UCLN_I18N_NUMSYS,
UCLN_I18N_COUNT /* This must be last */
} ECleanupI18NType;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/ucol_res.cpp b/Build/source/libs/icu/icu-src/source/i18n/ucol_res.cpp
index 56ed5b3c19c..aa4027eb872 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/ucol_res.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/ucol_res.cpp
@@ -348,7 +348,7 @@ CollationLoader::loadFromCollations(UErrorCode &errorCode) {
const char *actualLocale = ures_getLocaleByType(data, ULOC_ACTUAL_LOCALE, &errorCode);
if(U_FAILURE(errorCode)) { return NULL; }
const char *vLocale = validLocale.getBaseName();
- UBool actualAndValidLocalesAreDifferent = uprv_strcmp(actualLocale, vLocale) != 0;
+ UBool actualAndValidLocalesAreDifferent = Locale(actualLocale) != Locale(vLocale);
// Set the collation types on the informational locales,
// except when they match the default types (for brevity and backwards compatibility).
@@ -410,7 +410,7 @@ CollationLoader::loadFromData(UErrorCode &errorCode) {
const char *actualLocale = locale.getBaseName(); // without type
const char *vLocale = validLocale.getBaseName();
- UBool actualAndValidLocalesAreDifferent = uprv_strcmp(actualLocale, vLocale) != 0;
+ UBool actualAndValidLocalesAreDifferent = Locale(actualLocale) != Locale(vLocale);
// For the actual locale, suppress the default type *according to the actual locale*.
// For example, zh has default=pinyin and contains all of the Chinese tailorings.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/udat.cpp b/Build/source/libs/icu/icu-src/source/i18n/udat.cpp
index b47e3219885..ab91bcff412 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/udat.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/udat.cpp
@@ -167,9 +167,13 @@ udat_open(UDateFormatStyle timeStyle,
}
}
- if(fmt == 0) {
+ if(fmt == nullptr) {
*status = U_MEMORY_ALLOCATION_ERROR;
- return 0;
+ return nullptr;
+ }
+ if (U_FAILURE(*status)) {
+ delete fmt;
+ return nullptr;
}
if(tzID != 0) {
diff --git a/Build/source/libs/icu/icu-src/source/i18n/udateintervalformat.cpp b/Build/source/libs/icu/icu-src/source/i18n/udateintervalformat.cpp
index 44ba6b9fb1d..d9eaae4d3e2 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/udateintervalformat.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/udateintervalformat.cpp
@@ -18,10 +18,21 @@
#include "unicode/timezone.h"
#include "unicode/locid.h"
#include "unicode/unistr.h"
+#include "formattedval_impl.h"
U_NAMESPACE_USE
+// Magic number: FDIV in ASCII
+UPRV_FORMATTED_VALUE_CAPI_AUTO_IMPL(
+ FormattedDateInterval,
+ UFormattedDateInterval,
+ UFormattedDateIntervalImpl,
+ UFormattedDateIntervalApiHelper,
+ udtitvfmt,
+ 0x46444956)
+
+
U_CAPI UDateIntervalFormat* U_EXPORT2
udtitvfmt_open(const char* locale,
const UChar* skeleton,
@@ -105,4 +116,21 @@ udtitvfmt_format(const UDateIntervalFormat* formatter,
}
+U_DRAFT void U_EXPORT2
+udtitvfmt_formatToResult(
+ const UDateIntervalFormat* formatter,
+ UFormattedDateInterval* result,
+ UDate fromDate,
+ UDate toDate,
+ UErrorCode* status) {
+ if (U_FAILURE(*status)) {
+ return;
+ }
+ auto* resultImpl = UFormattedDateIntervalApiHelper::validate(result, *status);
+ DateInterval interval = DateInterval(fromDate,toDate);
+ resultImpl->fImpl = reinterpret_cast<const DateIntervalFormat*>(formatter)
+ ->formatToValue(interval, *status);
+}
+
+
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/ulistformatter.cpp b/Build/source/libs/icu/icu-src/source/i18n/ulistformatter.cpp
index c140c784b52..f7ad6751d33 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/ulistformatter.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/ulistformatter.cpp
@@ -15,6 +15,7 @@
#include "unicode/listformatter.h"
#include "unicode/localpointer.h"
#include "cmemory.h"
+#include "formattedval_impl.h"
U_NAMESPACE_USE
@@ -40,6 +41,49 @@ ulistfmt_close(UListFormatter *listfmt)
}
+// Magic number: FLST in ASCII
+UPRV_FORMATTED_VALUE_CAPI_AUTO_IMPL(
+ FormattedList,
+ UFormattedList,
+ UFormattedListImpl,
+ UFormattedListApiHelper,
+ ulistfmt,
+ 0x464C5354)
+
+
+static UnicodeString* getUnicodeStrings(
+ const UChar* const strings[],
+ const int32_t* stringLengths,
+ int32_t stringCount,
+ UnicodeString* length4StackBuffer,
+ LocalArray<UnicodeString>& maybeOwner,
+ UErrorCode& status) {
+ U_ASSERT(U_SUCCESS(status));
+ if (stringCount < 0 || (strings == NULL && stringCount > 0)) {
+ status = U_ILLEGAL_ARGUMENT_ERROR;
+ return nullptr;
+ }
+ UnicodeString* ustrings = length4StackBuffer;
+ if (stringCount > 4) {
+ maybeOwner.adoptInsteadAndCheckErrorCode(new UnicodeString[stringCount], status);
+ if (U_FAILURE(status)) {
+ return nullptr;
+ }
+ ustrings = maybeOwner.getAlias();
+ }
+ if (stringLengths == NULL) {
+ for (int32_t stringIndex = 0; stringIndex < stringCount; stringIndex++) {
+ ustrings[stringIndex].setTo(TRUE, strings[stringIndex], -1);
+ }
+ } else {
+ for (int32_t stringIndex = 0; stringIndex < stringCount; stringIndex++) {
+ ustrings[stringIndex].setTo(stringLengths[stringIndex] < 0, strings[stringIndex], stringLengths[stringIndex]);
+ }
+ }
+ return ustrings;
+}
+
+
U_CAPI int32_t U_EXPORT2
ulistfmt_format(const UListFormatter* listfmt,
const UChar* const strings[],
@@ -52,27 +96,16 @@ ulistfmt_format(const UListFormatter* listfmt,
if (U_FAILURE(*status)) {
return -1;
}
- if (stringCount < 0 || (strings == NULL && stringCount > 0) || ((result == NULL)? resultCapacity != 0 : resultCapacity < 0)) {
+ if ((result == NULL) ? resultCapacity != 0 : resultCapacity < 0) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
return -1;
}
- UnicodeString ustringsStackBuf[4];
- UnicodeString* ustrings = ustringsStackBuf;
- if (stringCount > UPRV_LENGTHOF(ustringsStackBuf)) {
- ustrings = new UnicodeString[stringCount];
- if (ustrings == NULL) {
- *status = U_MEMORY_ALLOCATION_ERROR;
- return -1;
- }
- }
- if (stringLengths == NULL) {
- for (int32_t stringIndex = 0; stringIndex < stringCount; stringIndex++) {
- ustrings[stringIndex].setTo(TRUE, strings[stringIndex], -1);
- }
- } else {
- for (int32_t stringIndex = 0; stringIndex < stringCount; stringIndex++) {
- ustrings[stringIndex].setTo(stringLengths[stringIndex] < 0, strings[stringIndex], stringLengths[stringIndex]);
- }
+ UnicodeString length4StackBuffer[4];
+ LocalArray<UnicodeString> maybeOwner;
+ UnicodeString* ustrings = getUnicodeStrings(
+ strings, stringLengths, stringCount, length4StackBuffer, maybeOwner, *status);
+ if (U_FAILURE(*status)) {
+ return -1;
}
UnicodeString res;
if (result != NULL) {
@@ -80,12 +113,33 @@ ulistfmt_format(const UListFormatter* listfmt,
// otherwise, alias the destination buffer (copied from udat_format)
res.setTo(result, 0, resultCapacity);
}
- ((const ListFormatter*)listfmt)->format( ustrings, stringCount, res, *status );
- if (ustrings != ustringsStackBuf) {
- delete[] ustrings;
- }
+ reinterpret_cast<const ListFormatter*>(listfmt)->format( ustrings, stringCount, res, *status );
return res.extract(result, resultCapacity, *status);
}
+U_CAPI void U_EXPORT2
+ulistfmt_formatStringsToResult(
+ const UListFormatter* listfmt,
+ const UChar* const strings[],
+ const int32_t * stringLengths,
+ int32_t stringCount,
+ UFormattedList* uresult,
+ UErrorCode* status) {
+ auto* result = UFormattedListApiHelper::validate(uresult, *status);
+ if (U_FAILURE(*status)) {
+ return;
+ }
+ UnicodeString length4StackBuffer[4];
+ LocalArray<UnicodeString> maybeOwner;
+ UnicodeString* ustrings = getUnicodeStrings(
+ strings, stringLengths, stringCount, length4StackBuffer, maybeOwner, *status);
+ if (U_FAILURE(*status)) {
+ return;
+ }
+ result->fImpl = reinterpret_cast<const ListFormatter*>(listfmt)
+ ->formatStringsToValue(ustrings, stringCount, *status);
+}
+
+
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/umsg.cpp b/Build/source/libs/icu/icu-src/source/i18n/umsg.cpp
index 31eeacbef1f..9a5344e0191 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/umsg.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/umsg.cpp
@@ -463,9 +463,7 @@ umsg_vformat( const UMessageFormat *fmt,
default:
// Unknown/unsupported argument type.
- U_ASSERT(FALSE);
- *status=U_ILLEGAL_ARGUMENT_ERROR;
- break;
+ UPRV_UNREACHABLE;
}
}
UnicodeString resultStr;
@@ -592,13 +590,11 @@ umsg_vparse(const UMessageFormat *fmt,
// support kObject. When MessageFormat is changed to
// understand MeasureFormats, modify this code to do the
// right thing. [alan]
- U_ASSERT(FALSE);
- break;
+ UPRV_UNREACHABLE;
// better not happen!
case Formattable::kArray:
- U_ASSERT(FALSE);
- break;
+ UPRV_UNREACHABLE;
}
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unesctrn.cpp b/Build/source/libs/icu/icu-src/source/i18n/unesctrn.cpp
index 86c55d138b0..0636fe1d149 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unesctrn.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/unesctrn.cpp
@@ -164,7 +164,7 @@ UnescapeTransliterator::~UnescapeTransliterator() {
/**
* Transliterator API.
*/
-Transliterator* UnescapeTransliterator::clone() const {
+UnescapeTransliterator* UnescapeTransliterator::clone() const {
return new UnescapeTransliterator(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unesctrn.h b/Build/source/libs/icu/icu-src/source/i18n/unesctrn.h
index e8e171f2bc4..57dd8d32cf5 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unesctrn.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unesctrn.h
@@ -77,7 +77,7 @@ class UnescapeTransliterator : public Transliterator {
/**
* Transliterator API.
*/
- virtual Transliterator* clone() const;
+ virtual UnescapeTransliterator* clone() const;
/**
* ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/uni2name.cpp b/Build/source/libs/icu/icu-src/source/i18n/uni2name.cpp
index a56f1a61817..41d5c931e40 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/uni2name.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/uni2name.cpp
@@ -60,7 +60,7 @@ UnicodeNameTransliterator::UnicodeNameTransliterator(const UnicodeNameTransliter
/**
* Transliterator API.
*/
-Transliterator* UnicodeNameTransliterator::clone(void) const {
+UnicodeNameTransliterator* UnicodeNameTransliterator::clone() const {
return new UnicodeNameTransliterator(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/uni2name.h b/Build/source/libs/icu/icu-src/source/i18n/uni2name.h
index 4d6eaa0a9a6..99309c8e0f8 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/uni2name.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/uni2name.h
@@ -48,7 +48,7 @@ class UnicodeNameTransliterator : public Transliterator {
/**
* Transliterator API.
*/
- virtual Transliterator* clone(void) const;
+ virtual UnicodeNameTransliterator* clone() const;
/**
* ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/alphaindex.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/alphaindex.h
index 1c50ba217fc..e3c68ea7cce 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/alphaindex.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/alphaindex.h
@@ -13,6 +13,9 @@
#define INDEXCHARS_H
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/uobject.h"
#include "unicode/locid.h"
#include "unicode/unistr.h"
@@ -651,7 +654,7 @@ private:
/**
* No assignment.
*/
- AlphabeticIndex &operator =(const AlphabeticIndex & /*other*/) { return *this;};
+ AlphabeticIndex &operator =(const AlphabeticIndex & /*other*/) { return *this;}
/**
* No Equality operators.
@@ -757,4 +760,7 @@ private:
U_NAMESPACE_END
#endif // !UCONFIG_NO_COLLATION
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/basictz.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/basictz.h
index 3541207268d..c4d08768987 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/basictz.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/basictz.h
@@ -16,6 +16,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_FORMATTING
#include "unicode/timezone.h"
@@ -42,6 +44,14 @@ public:
virtual ~BasicTimeZone();
/**
+ * Clones this object polymorphically.
+ * The caller owns the result and should delete it when done.
+ * @return clone, or nullptr if an error occurred
+ * @stable ICU 3.8
+ */
+ virtual BasicTimeZone* clone() const = 0;
+
+ /**
* Gets the first time zone transition after the base time.
* @param base The base time.
* @param inclusive Whether the base time is inclusive or not.
@@ -211,6 +221,8 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // BASICTZ_H
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/calendar.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/calendar.h
index 023cf053f25..2a8c2935ca8 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/calendar.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/calendar.h
@@ -29,6 +29,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Calendar object
@@ -184,7 +186,7 @@ class BasicTimeZone;
*/
class U_I18N_API Calendar : public UObject {
public:
-
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Field IDs for date and time. Used to specify date/time fields. ERA is calendar
* specific. Example ranges given are for illustration only; see specific Calendar
@@ -227,6 +229,7 @@ public:
FIELD_COUNT = UCAL_FIELD_COUNT // See ucal.h for other fields.
#endif /* U_HIDE_DEPRECATED_API */
};
+#endif // U_FORCE_HIDE_DEPRECATED_API
#ifndef U_HIDE_DEPRECATED_API
/**
@@ -287,7 +290,7 @@ public:
* @return a polymorphic copy of this calendar.
* @stable ICU 2.0
*/
- virtual Calendar* clone(void) const = 0;
+ virtual Calendar* clone() const = 0;
/**
* Creates a Calendar using the default timezone and locale. Clients are responsible
@@ -518,6 +521,7 @@ public:
*/
UBool after(const Calendar& when, UErrorCode& status) const;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* UDate Arithmetic function. Adds the specified (signed) amount of time to the given
* time field, based on the calendar's rules. For example, to subtract 5 days from
@@ -539,6 +543,7 @@ public:
* @deprecated ICU 2.6. use add(UCalendarDateFields field, int32_t amount, UErrorCode& status) instead.
*/
virtual void add(EDateFields field, int32_t amount, UErrorCode& status);
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* UDate Arithmetic function. Adds the specified (signed) amount of time to the given
@@ -632,6 +637,7 @@ public:
*/
inline void roll(UCalendarDateFields field, UBool up, UErrorCode& status);
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Time Field Rolling function. Rolls by the given amount on the given
* time field. For example, to roll the current date up by one day, call
@@ -664,6 +670,7 @@ public:
* @deprecated ICU 2.6. Use roll(UCalendarDateFields field, int32_t amount, UErrorCode& status) instead.
*/
virtual void roll(EDateFields field, int32_t amount, UErrorCode& status);
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Time Field Rolling function. Rolls by the given amount on the given
@@ -698,6 +705,7 @@ public:
*/
virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status);
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Return the difference between the given time and the time this
* calendar object is set to. If this calendar is set
@@ -754,6 +762,7 @@ public:
* @deprecated ICU 2.6. Use fieldDifference(UDate when, UCalendarDateFields field, UErrorCode& status).
*/
virtual int32_t fieldDifference(UDate when, EDateFields field, UErrorCode& status);
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Return the difference between the given time and the time this
@@ -1010,6 +1019,7 @@ public:
*/
uint8_t getMinimalDaysInFirstWeek(void) const;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Gets the minimum value for the given time field. e.g., for Gregorian
* DAY_OF_MONTH, 1.
@@ -1019,6 +1029,7 @@ public:
* @deprecated ICU 2.6. Use getMinimum(UCalendarDateFields field) instead.
*/
virtual int32_t getMinimum(EDateFields field) const;
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Gets the minimum value for the given time field. e.g., for Gregorian
@@ -1030,6 +1041,7 @@ public:
*/
virtual int32_t getMinimum(UCalendarDateFields field) const;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Gets the maximum value for the given time field. e.g. for Gregorian DAY_OF_MONTH,
* 31.
@@ -1039,6 +1051,7 @@ public:
* @deprecated ICU 2.6. Use getMaximum(UCalendarDateFields field) instead.
*/
virtual int32_t getMaximum(EDateFields field) const;
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Gets the maximum value for the given time field. e.g. for Gregorian DAY_OF_MONTH,
@@ -1050,6 +1063,7 @@ public:
*/
virtual int32_t getMaximum(UCalendarDateFields field) const;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Gets the highest minimum value for the given field if varies. Otherwise same as
* getMinimum(). For Gregorian, no difference.
@@ -1059,6 +1073,7 @@ public:
* @deprecated ICU 2.6. Use getGreatestMinimum(UCalendarDateFields field) instead.
*/
virtual int32_t getGreatestMinimum(EDateFields field) const;
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Gets the highest minimum value for the given field if varies. Otherwise same as
@@ -1070,6 +1085,7 @@ public:
*/
virtual int32_t getGreatestMinimum(UCalendarDateFields field) const;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Gets the lowest maximum value for the given field if varies. Otherwise same as
* getMaximum(). e.g., for Gregorian DAY_OF_MONTH, 28.
@@ -1079,6 +1095,7 @@ public:
* @deprecated ICU 2.6. Use getLeastMaximum(UCalendarDateFields field) instead.
*/
virtual int32_t getLeastMaximum(EDateFields field) const;
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Gets the lowest maximum value for the given field if varies. Otherwise same as
@@ -1895,11 +1912,13 @@ protected:
*/
int32_t fFields[UCAL_FIELD_COUNT];
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* The flags which tell if a specified time field for the calendar is set.
* @deprecated ICU 2.8 use (fStamp[n]!=kUnset)
*/
UBool fIsSet[UCAL_FIELD_COUNT];
+#endif // U_FORCE_HIDE_DEPRECATED_API
/** Special values of stamp[]
* @stable ICU 2.0
@@ -2281,7 +2300,6 @@ private:
* should only be called if this calendar is not lenient.
* @see #isLenient
* @see #validateField(int, int&)
- * @internal
*/
void validateFields(UErrorCode &status);
@@ -2291,7 +2309,6 @@ private:
* <code>U_ILLEGAL_ARGUMENT_ERROR</code> will be set. Subclasses may
* use this method in their implementation of {@link
* #validateField(int, int&)}.
- * @internal
*/
void validateField(UCalendarDateFields field, int32_t min, int32_t max, UErrorCode& status);
@@ -2529,4 +2546,6 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _CALENDAR
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/choicfmt.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/choicfmt.h
index c9f0f1114f8..3b2f48cb1f8 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/choicfmt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/choicfmt.h
@@ -26,13 +26,14 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Choice Format.
*/
#if !UCONFIG_NO_FORMATTING
-#ifndef U_HIDE_DEPRECATED_API
#include "unicode/fieldpos.h"
#include "unicode/format.h"
@@ -40,6 +41,8 @@
#include "unicode/numfmt.h"
#include "unicode/unistr.h"
+#ifndef U_HIDE_DEPRECATED_API
+
U_NAMESPACE_BEGIN
class MessageFormat;
@@ -248,7 +251,7 @@ public:
* @return a copy of this object
* @deprecated ICU 49 Use MessageFormat instead, with plural and select arguments.
*/
- virtual Format* clone(void) const;
+ virtual ChoiceFormat* clone() const;
/**
* Returns true if the given Format objects are semantically equal.
@@ -592,5 +595,7 @@ U_NAMESPACE_END
#endif // U_HIDE_DEPRECATED_API
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // CHOICFMT_H
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/coleitr.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/coleitr.h
index f2bd2ecc621..e3ec0e01a18 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/coleitr.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/coleitr.h
@@ -35,6 +35,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_COLLATION
#include "unicode/unistr.h"
@@ -404,4 +406,6 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_COLLATION */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/coll.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/coll.h
index 653434f54ca..f5564c73944 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/coll.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/coll.h
@@ -54,6 +54,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_COLLATION
#include "unicode/uobject.h"
@@ -204,6 +206,7 @@ public:
// Cannot use #ifndef U_HIDE_DEPRECATED_API for the following, it is
// used by virtual methods that cannot have that conditional.
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* LESS is returned if source string is compared to be less than target
* string in the compare() method.
@@ -220,6 +223,7 @@ public:
EQUAL = UCOL_EQUAL, // 0
GREATER = UCOL_GREATER // 1
};
+#endif // U_FORCE_HIDE_DEPRECATED_API
// Collator public destructor -----------------------------------------
@@ -265,7 +269,7 @@ public:
* @return a copy of this object, owned by the caller
* @stable ICU 2.0
*/
- virtual Collator* clone(void) const = 0;
+ virtual Collator* clone() const = 0;
/**
* Creates the Collator object for the current default locale.
@@ -323,6 +327,7 @@ public:
*/
static Collator* U_EXPORT2 createInstance(const Locale& loc, UErrorCode& err);
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* The comparison function compares the character data stored in two
* different strings. Returns information about whether a string is less
@@ -336,6 +341,7 @@ public:
*/
virtual EComparisonResult compare(const UnicodeString& source,
const UnicodeString& target) const;
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* The comparison function compares the character data stored in two
@@ -353,6 +359,7 @@ public:
const UnicodeString& target,
UErrorCode &status) const = 0;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Does the same thing as compare but limits the comparison to a specified
* length
@@ -368,6 +375,7 @@ public:
virtual EComparisonResult compare(const UnicodeString& source,
const UnicodeString& target,
int32_t length) const;
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Does the same thing as compare but limits the comparison to a specified
@@ -387,6 +395,7 @@ public:
int32_t length,
UErrorCode &status) const = 0;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* The comparison function compares the character data stored in two
* different string arrays. Returns information about whether a string array
@@ -423,6 +432,7 @@ public:
virtual EComparisonResult compare(const char16_t* source, int32_t sourceLength,
const char16_t* target, int32_t targetLength)
const;
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* The comparison function compares the character data stored in two
@@ -527,6 +537,7 @@ public:
*/
virtual int32_t hashCode(void) const = 0;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Gets the locale of the Collator
*
@@ -540,6 +551,7 @@ public:
* in ICU 3.0.
*/
virtual Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const = 0;
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Convenience method for comparing two strings based on the collation rules.
@@ -576,6 +588,7 @@ public:
*/
UBool equals(const UnicodeString& source, const UnicodeString& target) const;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Determines the minimum strength that will be used in comparison or
* transformation.
@@ -607,6 +620,7 @@ public:
* @deprecated ICU 2.6 Use setAttribute(UCOL_STRENGTH...) instead
*/
virtual void setStrength(ECollationStrength newStrength);
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Retrieves the reordering codes for this collator.
@@ -904,6 +918,7 @@ public:
*/
virtual UColReorderCode getMaxVariable() const;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Sets the variable top to the primary weight of the specified string.
*
@@ -951,6 +966,7 @@ public:
* @deprecated ICU 53 Call setMaxVariable() instead.
*/
virtual void setVariableTop(uint32_t varTop, UErrorCode &status) = 0;
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Gets the variable top value of a Collator.
@@ -972,6 +988,7 @@ public:
*/
virtual UnicodeSet *getTailoredSet(UErrorCode &status) const;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Same as clone().
* The base class implementation simply calls clone().
@@ -979,7 +996,8 @@ public:
* @see clone()
* @deprecated ICU 50 no need to have two methods for cloning
*/
- virtual Collator* safeClone(void) const;
+ virtual Collator* safeClone() const;
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Get the sort key as an array of bytes from a UnicodeString.
@@ -1271,4 +1289,6 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_COLLATION */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/compactdecimalformat.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/compactdecimalformat.h
index 9c1e9183f46..9c1e2009969 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/compactdecimalformat.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/compactdecimalformat.h
@@ -14,6 +14,9 @@
#define __COMPACT_DECIMAL_FORMAT_H__
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Compatibility APIs for compact decimal number formatting.
@@ -102,7 +105,7 @@ public:
* @return a polymorphic copy of this CompactDecimalFormat.
* @stable ICU 51
*/
- Format* clone() const U_OVERRIDE;
+ CompactDecimalFormat* clone() const U_OVERRIDE;
using DecimalFormat::format;
@@ -187,5 +190,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __COMPACT_DECIMAL_FORMAT_H__
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/curramt.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/curramt.h
index e321df861d2..5cfe1cf75e6 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/curramt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/curramt.h
@@ -15,6 +15,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_FORMATTING
#include "unicode/measure.h"
@@ -79,7 +81,7 @@ class U_I18N_API CurrencyAmount: public Measure {
* have the same class as returned by getDynamicClassID().
* @stable ICU 3.0
*/
- virtual UObject* clone() const;
+ virtual CurrencyAmount* clone() const;
/**
* Destructor
@@ -129,4 +131,7 @@ inline const char16_t* CurrencyAmount::getISOCurrency() const {
U_NAMESPACE_END
#endif // !UCONFIG_NO_FORMATTING
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __CURRENCYAMOUNT_H__
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/currpinf.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/currpinf.h
index 7741c608b07..fb0b2a7dbc0 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/currpinf.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/currpinf.h
@@ -11,6 +11,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Currency Plural Information used by Decimal Format
@@ -266,5 +268,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _CURRPINFO
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/currunit.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/currunit.h
index ac3bfedd7b3..d536e2fc031 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/currunit.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/currunit.h
@@ -15,6 +15,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_FORMATTING
#include "unicode/measunit.h"
@@ -44,6 +46,7 @@ class U_I18N_API CurrencyUnit: public MeasureUnit {
/**
* Construct an object with the given ISO currency code.
+ *
* @param isoCode the 3-letter ISO 4217 currency code; must have
* length 3 and need not be NUL-terminated. If NULL, the currency
* is initialized to the unknown currency XXX.
@@ -53,6 +56,19 @@ class U_I18N_API CurrencyUnit: public MeasureUnit {
*/
CurrencyUnit(ConstChar16Ptr isoCode, UErrorCode &ec);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Construct an object with the given ISO currency code.
+ *
+ * @param isoCode the 3-letter ISO 4217 currency code; must have
+ * length 3. If invalid, the currency is initialized to XXX.
+ * @param ec input-output error code. If the isoCode is invalid,
+ * then this will be set to a failing value.
+ * @draft ICU 64
+ */
+ CurrencyUnit(StringPiece isoCode, UErrorCode &ec);
+#endif /* U_HIDE_DRAFT_API */
+
/**
* Copy constructor
* @stable ICU 3.0
@@ -80,7 +96,7 @@ class U_I18N_API CurrencyUnit: public MeasureUnit {
* have the same class as returned by getDynamicClassID().
* @stable ICU 3.0
*/
- virtual UObject* clone() const;
+ virtual CurrencyUnit* clone() const;
/**
* Destructor
@@ -126,4 +142,7 @@ inline const char16_t* CurrencyUnit::getISOCurrency() const {
U_NAMESPACE_END
#endif // !UCONFIG_NO_FORMATTING
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __CURRENCYUNIT_H__
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/datefmt.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/datefmt.h
index 81eb8f9b525..f106e821a76 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/datefmt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/datefmt.h
@@ -23,6 +23,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_FORMATTING
#include "unicode/udat.h"
@@ -222,6 +224,14 @@ public:
virtual ~DateFormat();
/**
+ * Clones this object polymorphically.
+ * The caller owns the result and should delete it when done.
+ * @return clone, or nullptr if an error occurred
+ * @stable ICU 2.0
+ */
+ virtual DateFormat* clone() const = 0;
+
+ /**
* Equality operator. Returns true if the two formats have the same behavior.
* @stable ICU 2.0
*/
@@ -953,5 +963,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _DATEFMT
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/dcfmtsym.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/dcfmtsym.h
index 55e3d8a6b3b..e1e0ab6b08c 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/dcfmtsym.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/dcfmtsym.h
@@ -28,10 +28,12 @@
#define DCFMTSYM_H
#include "unicode/utypes.h"
-#include "unicode/uchar.h"
+
+#if U_SHOW_CPLUSPLUS_API
#if !UCONFIG_NO_FORMATTING
+#include "unicode/uchar.h"
#include "unicode/uobject.h"
#include "unicode/locid.h"
#include "unicode/numsys.h"
@@ -455,13 +457,11 @@ private:
* to non-resource bundle strings,
* then regular UnicodeString copies must be used instead of fastCopyFrom().
*
- * @internal
*/
UnicodeString fSymbols[kFormatSymbolCount];
/**
* Non-symbol variable for getConstSymbol(). Always empty.
- * @internal
*/
UnicodeString fNoSymbol;
@@ -582,5 +582,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _DCFMTSYM
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/decimfmt.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/decimfmt.h
index b3a5cc0495f..c33ec80cacc 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/decimfmt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/decimfmt.h
@@ -28,6 +28,9 @@
#define DECIMFMT_H
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Compatibility APIs for decimal formatting.
@@ -64,18 +67,6 @@ class NumberParserImpl;
}
/**
- * \cond
- * explicit template instantiation. see digitlst.h
- * (When building DLLs for Windows this is required.)
- */
-#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN && !defined(U_IN_DOXYGEN)
-template class U_I18N_API EnumSet<UNumberFormatAttribute,
- UNUM_MAX_NONBOOLEAN_ATTRIBUTE+1,
- UNUM_LIMIT_BOOLEAN_ATTRIBUTE>;
-#endif
-/** \endcond */
-
-/**
* **IMPORTANT:** New users are strongly encouraged to see if
* numberformatter.h fits their use case. Although not deprecated, this header
* is provided for backwards compatibility only.
@@ -288,7 +279,7 @@ template class U_I18N_API EnumSet<UNumberFormatAttribute,
* <td>Pad escape, precedes pad character
* </table>
*
- * <p>A DecimalFormat pattern contains a postive and negative
+ * <p>A DecimalFormat pattern contains a positive and negative
* subpattern, for example, "#,##0.00;(#,##0.00)". Each subpattern has a
* prefix, a numeric part, and a suffix. If there is no explicit negative
* subpattern, the negative subpattern is the localized minus sign prefixed to the
@@ -423,7 +414,7 @@ template class U_I18N_API EnumSet<UNumberFormatAttribute,
*
* <li>If the number of actual fraction digits is less than the
* <em>minimum fraction digits</em>, then trailing zeros are added.
- * For example, 0.125 is formatted as "0.1250" if the mimimum fraction
+ * For example, 0.125 is formatted as "0.1250" if the minimum fraction
* digits is set to 4.
*
* <li>Trailing fractional zeros are not displayed if they occur
@@ -588,9 +579,9 @@ template class U_I18N_API EnumSet<UNumberFormatAttribute,
* count of <code>getMaximumSignificantDigits() - 1</code>. For example, the
* pattern <code>"@@###E0"</code> is equivalent to <code>"0.0###E0"</code>.
*
- * <li>If signficant digits are in use, then the integer and fraction
+ * <li>If significant digits are in use, then the integer and fraction
* digit counts, as set via the API, are ignored. If significant
- * digits are not in use, then the signficant digit counts, as set via
+ * digits are not in use, then the significant digit counts, as set via
* the API, are ignored.
*
* </ul>
@@ -644,7 +635,7 @@ template class U_I18N_API EnumSet<UNumberFormatAttribute,
* increment in the pattern itself. "#,#50" specifies a rounding increment of
* 50. "#,##0.05" specifies a rounding increment of 0.05.
*
- * <p>In the absense of an explicit rounding increment numbers are
+ * <p>In the absence of an explicit rounding increment numbers are
* rounded to their formatted width.
*
* <ul>
@@ -849,7 +840,7 @@ class U_I18N_API DecimalFormat : public NumberFormat {
* @param pattern a non-localized pattern string
* @param symbolsToAdopt the set of symbols to be used. The caller should not
* delete this object after making this call.
- * @param parseError Output param to receive errors occured during parsing
+ * @param parseError Output param to receive errors occurred during parsing
* @param status Output param set to success/failure code. If the
* pattern is invalid this will be set to a failure code.
* @stable ICU 2.0
@@ -908,7 +899,7 @@ class U_I18N_API DecimalFormat : public NumberFormat {
* @return a polymorphic copy of this DecimalFormat.
* @stable ICU 2.0
*/
- Format* clone(void) const U_OVERRIDE;
+ DecimalFormat* clone() const U_OVERRIDE;
/**
* Return true if the given Format objects are semantically equal.
@@ -1127,7 +1118,7 @@ class U_I18N_API DecimalFormat : public NumberFormat {
* does string comparisons to try to find an optimal match.
* If no object can be parsed, index is unchanged, and NULL is
* returned. The result is returned as the most parsimonious
- * type of Formattable that will accomodate all of the
+ * type of Formattable that will accommodate all of the
* necessary precision. For example, if the result is exactly 12,
* it will be returned as a long. However, if it is 1.5, it will
* be returned as a double.
@@ -1292,20 +1283,27 @@ class U_I18N_API DecimalFormat : public NumberFormat {
*/
virtual void setNegativeSuffix(const UnicodeString& newValue);
-#ifndef U_HIDE_INTERNAL_API
+#ifndef U_HIDE_DRAFT_API
/**
* Whether to show the plus sign on positive (non-negative) numbers; for example, "+12"
- * @internal Technical Preview
+ *
+ * For more control over sign display, use NumberFormatter.
+ *
+ * @return Whether the sign is shown on positive numbers and zero.
+ * @draft ICU 64
*/
UBool isSignAlwaysShown() const;
-#endif /* U_HIDE_INTERNAL_API */
/**
- * Set whether to show the plus sign on positive (non-negative) numbers; for example, "+12"
- * @param value The new setting for whether to show plus sign on positive numbers
- * @internal Technical Preview
+ * Set whether to show the plus sign on positive (non-negative) numbers; for example, "+12".
+ *
+ * For more control over sign display, use NumberFormatter.
+ *
+ * @param value true to always show a sign; false to hide the sign on positive numbers and zero.
+ * @draft ICU 64
*/
- virtual void setSignAlwaysShown(UBool value);
+ void setSignAlwaysShown(UBool value);
+#endif /* U_HIDE_DRAFT_API */
/**
* Get the multiplier for use in percent, permill, etc.
@@ -1336,7 +1334,6 @@ class U_I18N_API DecimalFormat : public NumberFormat {
*/
virtual void setMultiplier(int32_t newValue);
-#ifndef U_HIDE_DRAFT_API
/**
* Gets the power of ten by which number should be multiplied before formatting, which
* can be combined with setMultiplier() to multiply by any arbitrary decimal value.
@@ -1347,10 +1344,9 @@ class U_I18N_API DecimalFormat : public NumberFormat {
* This method is analogous to UNUM_SCALE in getAttribute.
*
* @return the current value of the power-of-ten multiplier.
- * @draft ICU 62
+ * @stable ICU 62
*/
int32_t getMultiplierScale(void) const;
-#endif /* U_HIDE_DRAFT_API */
/**
* Sets a power of ten by which number should be multiplied before formatting, which
@@ -1369,9 +1365,9 @@ class U_I18N_API DecimalFormat : public NumberFormat {
* This method is analogous to UNUM_SCALE in setAttribute.
*
* @param newValue the new value of the power-of-ten multiplier.
- * @draft ICU 62
+ * @stable ICU 62
*/
- virtual void setMultiplierScale(int32_t newValue);
+ void setMultiplierScale(int32_t newValue);
/**
* Get the rounding increment.
@@ -1464,8 +1460,8 @@ class U_I18N_API DecimalFormat : public NumberFormat {
* Set the character used to pad to the format width. If padding
* is not enabled, then this will take effect if padding is later
* enabled.
- * @param padChar a string containing the pad charcter. If the string
- * has length 0, then the pad characer is set to ' '. Otherwise
+ * @param padChar a string containing the pad character. If the string
+ * has length 0, then the pad character is set to ' '. Otherwise
* padChar.char32At(0) will be used as the pad character.
* @see #setFormatWidth
* @see #getFormatWidth
@@ -1654,8 +1650,7 @@ class U_I18N_API DecimalFormat : public NumberFormat {
*/
virtual void setSecondaryGroupingSize(int32_t newValue);
-#ifndef U_HIDE_INTERNAL_API
-
+#ifndef U_HIDE_DRAFT_API
/**
* Returns the minimum number of grouping digits.
* Grouping separators are output if there are at least this many
@@ -1666,31 +1661,33 @@ class U_I18N_API DecimalFormat : public NumberFormat {
* For example, if this value is 2, and the grouping size is 3, then
* 9999 -> "9999" and 10000 -> "10,000"
*
- * This is a technology preview. This API may change behavior or may be removed.
- *
* The default value for this attribute is 0.
* A value of 1, 0, or lower, means that the use of grouping separators
* only depends on the grouping size (and on isGroupingUsed()).
- * Currently, the corresponding CLDR data is not used; this is likely to change.
+ *
+ * NOTE: The CLDR data is used in NumberFormatter but not in DecimalFormat.
+ * This is for backwards compatibility reasons.
+ *
+ * For more control over grouping strategies, use NumberFormatter.
*
* @see setMinimumGroupingDigits
* @see getGroupingSize
- * @internal technology preview
+ * @draft ICU 64
*/
int32_t getMinimumGroupingDigits() const;
-#endif /* U_HIDE_INTERNAL_API */
-
- /* Cannot use #ifndef U_HIDE_INTERNAL_API for the following draft method since it is virtual. */
/**
* Sets the minimum grouping digits. Setting to a value less than or
* equal to 1 turns off minimum grouping digits.
*
+ * For more control over grouping strategies, use NumberFormatter.
+ *
* @param newValue the new value of minimum grouping digits.
* @see getMinimumGroupingDigits
- * @internal technology preview
+ * @draft ICU 64
*/
- virtual void setMinimumGroupingDigits(int32_t newValue);
+ void setMinimumGroupingDigits(int32_t newValue);
+#endif /* U_HIDE_DRAFT_API */
/**
@@ -1732,13 +1729,15 @@ class U_I18N_API DecimalFormat : public NumberFormat {
*/
virtual void setDecimalPatternMatchRequired(UBool newValue);
+#ifndef U_HIDE_DRAFT_API
/**
* Returns whether to ignore exponents when parsing.
*
+ * @return Whether to ignore exponents when parsing.
* @see #setParseNoExponent
- * @internal This API is a technical preview. It may change in an upcoming release.
+ * @draft ICU 64
*/
- virtual UBool isParseNoExponent() const;
+ UBool isParseNoExponent() const;
/**
* Specifies whether to stop parsing when an exponent separator is encountered. For
@@ -1746,17 +1745,18 @@ class U_I18N_API DecimalFormat : public NumberFormat {
* 5).
*
* @param value true to prevent exponents from being parsed; false to allow them to be parsed.
- * @internal This API is a technical preview. It may change in an upcoming release.
+ * @draft ICU 64
*/
- virtual void setParseNoExponent(UBool value);
+ void setParseNoExponent(UBool value);
/**
* Returns whether parsing is sensitive to case (lowercase/uppercase).
*
+ * @return Whether parsing is case-sensitive.
* @see #setParseCaseSensitive
- * @internal This API is a technical preview. It may change in an upcoming release.
+ * @draft ICU 64
*/
- virtual UBool isParseCaseSensitive() const;
+ UBool isParseCaseSensitive() const;
/**
* Whether to pay attention to case when parsing; default is to ignore case (perform
@@ -1765,26 +1765,31 @@ class U_I18N_API DecimalFormat : public NumberFormat {
* Currency symbols are never case-folded. For example, "us$1.00" will not parse in case-insensitive
* mode, even though "US$1.00" parses.
*
- * @internal This API is a technical preview. It may change in an upcoming release.
+ * @param value true to enable case-sensitive parsing (the default); false to force
+ * case-sensitive parsing behavior.
+ * @draft ICU 64
*/
- virtual void setParseCaseSensitive(UBool value);
+ void setParseCaseSensitive(UBool value);
/**
* Returns whether truncation of high-order integer digits should result in an error.
* By default, setMaximumIntegerDigits truncates high-order digits silently.
*
+ * @return Whether an error code is set if high-order digits are truncated.
* @see setFormatFailIfMoreThanMaxDigits
- * @internal This API is a technical preview. It may change in an upcoming release.
+ * @draft ICU 64
*/
- virtual UBool isFormatFailIfMoreThanMaxDigits() const;
+ UBool isFormatFailIfMoreThanMaxDigits() const;
/**
* Sets whether truncation of high-order integer digits should result in an error.
* By default, setMaximumIntegerDigits truncates high-order digits silently.
*
- * @internal This API is a technical preview. It may change in an upcoming release.
+ * @param value Whether to set an error code if high-order digits are truncated.
+ * @draft ICU 64
*/
- virtual void setFormatFailIfMoreThanMaxDigits(UBool value);
+ void setFormatFailIfMoreThanMaxDigits(UBool value);
+#endif /* U_HIDE_DRAFT_API */
/**
@@ -2016,12 +2021,14 @@ class U_I18N_API DecimalFormat : public NumberFormat {
*/
void setCurrency(const char16_t* theCurrency, UErrorCode& ec) U_OVERRIDE;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Sets the currency used to display currency amounts. See
* setCurrency(const char16_t*, UErrorCode&).
* @deprecated ICU 3.0. Use setCurrency(const char16_t*, UErrorCode&).
*/
virtual void setCurrency(const char16_t* theCurrency);
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Sets the `Currency Usage` object used to display currency.
@@ -2062,28 +2069,51 @@ class U_I18N_API DecimalFormat : public NumberFormat {
#ifndef U_HIDE_DRAFT_API
/**
- * Converts this DecimalFormat to a NumberFormatter. Starting in ICU 60,
- * NumberFormatter is the recommended way to format numbers.
+ * Converts this DecimalFormat to a (Localized)NumberFormatter. Starting
+ * in ICU 60, NumberFormatter is the recommended way to format numbers.
+ * You can use the returned LocalizedNumberFormatter to format numbers and
+ * get a FormattedNumber, which contains a string as well as additional
+ * annotations about the formatted value.
+ *
+ * If a memory allocation failure occurs, the return value of this method
+ * might be null. If you are concerned about correct recovery from
+ * out-of-memory situations, use this pattern:
*
- * NOTE: The returned LocalizedNumberFormatter is owned by this DecimalFormat.
- * If a non-const method is called on the DecimalFormat, or if the DecimalFormat
- * is deleted, the object becomes invalid. If you plan to keep the return value
- * beyond the lifetime of the DecimalFormat, copy it to a local variable:
+ * <pre>
+ * FormattedNumber result;
+ * if (auto* ptr = df->toNumberFormatter(status)) {
+ * result = ptr->formatDouble(123, status);
+ * }
+ * </pre>
+ *
+ * If you are not concerned about out-of-memory situations, or if your
+ * environment throws exceptions when memory allocation failure occurs,
+ * you can chain the methods, like this:
*
* <pre>
- * LocalizedNumberFormatter f = df->toNumberFormatter();
+ * FormattedNumber result = df
+ * ->toNumberFormatter(status)
+ * ->formatDouble(123, status);
* </pre>
*
- * It is, however, safe to use the return value for chaining:
+ * NOTE: The returned LocalizedNumberFormatter is owned by this DecimalFormat.
+ * If a non-const method is called on the DecimalFormat, or if the DecimalFormat
+ * is deleted, the object becomes invalid. If you plan to keep the return value
+ * beyond the lifetime of the DecimalFormat, copy it to a local variable:
*
* <pre>
- * FormattedNumber result = df->toNumberFormatter().formatDouble(123, status);
+ * LocalizedNumberFormatter lnf;
+ * if (auto* ptr = df->toNumberFormatter(status)) {
+ * lnf = *ptr;
+ * }
* </pre>
*
- * @return The output variable, for chaining.
- * @draft ICU 62
+ * @param status Set on failure, like U_MEMORY_ALLOCATION_ERROR.
+ * @return A pointer to an internal object, or nullptr on failure.
+ * Do not delete the return value!
+ * @draft ICU 64
*/
- const number::LocalizedNumberFormatter& toNumberFormatter() const;
+ const number::LocalizedNumberFormatter* toNumberFormatter(UErrorCode& status) const;
#endif /* U_HIDE_DRAFT_API */
/**
@@ -2117,7 +2147,7 @@ class U_I18N_API DecimalFormat : public NumberFormat {
/** Rebuilds the formatter object from the property bag. */
void touch(UErrorCode& status);
- /** Rebuilds the formatter object, hiding the error code. */
+ /** Rebuilds the formatter object, ignoring any error code. */
void touchNoError();
/**
@@ -2156,17 +2186,24 @@ class U_I18N_API DecimalFormat : public NumberFormat {
// INSTANCE FIELDS //
//=====================================================================================//
- // Only one instance field: keep all fields inside of an implementation class defined in number_mapper.h
- number::impl::DecimalFormatFields* fields;
+
+ // One instance field for the implementation, keep all fields inside of an implementation
+ // class defined in number_mapper.h
+ number::impl::DecimalFormatFields* fields = nullptr;
// Allow child class CompactDecimalFormat to access fProperties:
friend class CompactDecimalFormat;
+ // Allow MeasureFormat to use fieldPositionHelper:
+ friend class MeasureFormat;
+
};
U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _DECIMFMT
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/dtfmtsym.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/dtfmtsym.h
index fe914b461e6..c6d76fe98eb 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/dtfmtsym.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/dtfmtsym.h
@@ -22,6 +22,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_FORMATTING
#include "unicode/calendar.h"
@@ -1011,5 +1013,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _DTFMTSYM
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/dtitvfmt.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/dtitvfmt.h
index 5eaa559d0ea..23fc02e2a7b 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/dtitvfmt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/dtitvfmt.h
@@ -16,6 +16,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Format and parse date interval in a language-independent manner.
@@ -28,10 +30,87 @@
#include "unicode/dtintrv.h"
#include "unicode/dtitvinf.h"
#include "unicode/dtptngen.h"
+#include "unicode/formattedvalue.h"
U_NAMESPACE_BEGIN
+class FormattedDateIntervalData;
+class DateIntervalFormat;
+
+#ifndef U_HIDE_DRAFT_API
+/**
+ * An immutable class containing the result of a date interval formatting operation.
+ *
+ * Instances of this class are immutable and thread-safe.
+ *
+ * When calling nextPosition():
+ * The fields are returned from left to right. The special field category
+ * UFIELD_CATEGORY_DATE_INTERVAL_SPAN is used to indicate which datetime
+ * primitives came from which arguments: 0 means fromCalendar, and 1 means
+ * toCalendar. The span category will always occur before the
+ * corresponding fields in UFIELD_CATEGORY_DATE
+ * in the nextPosition() iterator.
+ *
+ * Not intended for public subclassing.
+ *
+ * @draft ICU 64
+ */
+class U_I18N_API FormattedDateInterval : public UMemory, public FormattedValue {
+ public:
+ /**
+ * Default constructor; makes an empty FormattedDateInterval.
+ * @draft ICU 64
+ */
+ FormattedDateInterval() : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
+
+ /**
+ * Move constructor: Leaves the source FormattedDateInterval in an undefined state.
+ * @draft ICU 64
+ */
+ FormattedDateInterval(FormattedDateInterval&& src) U_NOEXCEPT;
+
+ /**
+ * Destruct an instance of FormattedDateInterval.
+ * @draft ICU 64
+ */
+ virtual ~FormattedDateInterval() U_OVERRIDE;
+
+ /** Copying not supported; use move constructor instead. */
+ FormattedDateInterval(const FormattedDateInterval&) = delete;
+
+ /** Copying not supported; use move assignment instead. */
+ FormattedDateInterval& operator=(const FormattedDateInterval&) = delete;
+
+ /**
+ * Move assignment: Leaves the source FormattedDateInterval in an undefined state.
+ * @draft ICU 64
+ */
+ FormattedDateInterval& operator=(FormattedDateInterval&& src) U_NOEXCEPT;
+
+ /** @copydoc FormattedValue::toString() */
+ UnicodeString toString(UErrorCode& status) const U_OVERRIDE;
+
+ /** @copydoc FormattedValue::toTempString() */
+ UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE;
+
+ /** @copydoc FormattedValue::appendTo() */
+ Appendable &appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE;
+
+ /** @copydoc FormattedValue::nextPosition() */
+ UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE;
+
+ private:
+ FormattedDateIntervalData *fData;
+ UErrorCode fErrorCode;
+ explicit FormattedDateInterval(FormattedDateIntervalData *results)
+ : fData(results), fErrorCode(U_ZERO_ERROR) {}
+ explicit FormattedDateInterval(UErrorCode errorCode)
+ : fData(nullptr), fErrorCode(errorCode) {}
+ friend class DateIntervalFormat;
+};
+#endif /* U_HIDE_DRAFT_API */
+
/**
* DateIntervalFormat is a class for formatting and parsing date
@@ -218,7 +297,6 @@ U_NAMESPACE_BEGIN
* \endcode
* </pre>
*/
-
class U_I18N_API DateIntervalFormat : public Format {
public:
@@ -356,7 +434,7 @@ public:
* @return A copy of the object.
* @stable ICU 4.0
*/
- virtual Format* clone(void) const;
+ virtual DateIntervalFormat* clone() const;
/**
* Return true if the given Format objects are semantically equal. Objects
@@ -425,6 +503,21 @@ public:
FieldPosition& fieldPosition,
UErrorCode& status) const ;
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Format a DateInterval to produce a FormattedDateInterval.
+ *
+ * The FormattedDateInterval exposes field information about the formatted string.
+ *
+ * @param dtInterval DateInterval to be formatted.
+ * @param status Set if an error occurs.
+ * @return A FormattedDateInterval containing the format result.
+ * @draft ICU 64
+ */
+ FormattedDateInterval formatToValue(
+ const DateInterval& dtInterval,
+ UErrorCode& status) const;
+#endif /* U_HIDE_DRAFT_API */
/**
* Format 2 Calendars to produce a string.
@@ -455,6 +548,29 @@ public:
FieldPosition& fieldPosition,
UErrorCode& status) const ;
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Format 2 Calendars to produce a FormattedDateInterval.
+ *
+ * The FormattedDateInterval exposes field information about the formatted string.
+ *
+ * Note: "fromCalendar" and "toCalendar" are not const,
+ * since calendar is not const in SimpleDateFormat::format(Calendar&),
+ *
+ * @param fromCalendar calendar set to the from date in date interval
+ * to be formatted into date interval string
+ * @param toCalendar calendar set to the to date in date interval
+ * to be formatted into date interval string
+ * @param status Set if an error occurs.
+ * @return A FormattedDateInterval containing the format result.
+ * @draft ICU 64
+ */
+ FormattedDateInterval formatToValue(
+ Calendar& fromCalendar,
+ Calendar& toCalendar,
+ UErrorCode& status) const;
+#endif /* U_HIDE_DRAFT_API */
+
/**
* Date interval parsing is not supported. Please do not use.
* <P>
@@ -664,28 +780,14 @@ private:
* Below are for generating interval patterns local to the formatter
*/
- /**
- * Provide an updated FieldPosition posResult based on two formats,
- * the FieldPosition values for each of them, and the pattern used
- * to combine them. The idea is for posResult to indicate the first
- * instance (if any) of the specified field in the combined result,
- * with correct offsets.
- *
- * @param combiningPattern Pattern used to combine pat0 and pat1
- * @param pat0 Formatted date/time value to replace {0}
- * @param pos0 FieldPosition within pat0
- * @param pat1 Formatted date/time value to replace {1}
- * @param pos1 FieldPosition within pat1
- * @param posResult FieldPosition to be set to the correct
- * position of the first field instance when
- * pat0 and pat1 are combined using combiningPattern
- */
- static void
- adjustPosition(UnicodeString& combiningPattern, // has {0} and {1} in it
- UnicodeString& pat0, FieldPosition& pos0, // pattern and pos corresponding to {0}
- UnicodeString& pat1, FieldPosition& pos1, // pattern and pos corresponding to {1}
- FieldPosition& posResult);
-
+ /** Like fallbackFormat, but only formats the range part of the fallback. */
+ void fallbackFormatRange(
+ Calendar& fromCalendar,
+ Calendar& toCalendar,
+ UnicodeString& appendTo,
+ int8_t& firstIndex,
+ FieldPositionHandler& fphandler,
+ UErrorCode& status) const;
/**
* Format 2 Calendars using fall-back interval pattern
@@ -703,8 +805,8 @@ private:
* (any difference is in ampm/hours or below)
* @param appendTo Output parameter to receive result.
* Result is appended to existing contents.
- * @param pos On input: an alignment field, if desired.
- * On output: the offsets of the alignment field.
+ * @param firstIndex See formatImpl for more information.
+ * @param fphandler See formatImpl for more information.
* @param status output param set to success/failure code on exit
* @return Reference to 'appendTo' parameter.
* @internal (private)
@@ -713,7 +815,8 @@ private:
Calendar& toCalendar,
UBool fromToOnSameDay,
UnicodeString& appendTo,
- FieldPosition& pos,
+ int8_t& firstIndex,
+ FieldPositionHandler& fphandler,
UErrorCode& status) const;
@@ -977,11 +1080,11 @@ private:
* to be formatted into date interval string
* @param appendTo Output parameter to receive result.
* Result is appended to existing contents.
- * @param fieldPosition On input: an alignment field, if desired.
- * On output: the offsets of the alignment field.
- * There may be multiple instances of a given field type
- * in an interval format; in this case the fieldPosition
- * offsets refer to the first instance.
+ * @param firstIndex 0 if the first output date is fromCalendar;
+ * 1 if it corresponds to toCalendar;
+ * -1 if there is only one date printed.
+ * @param fphandler Handler for field position information.
+ * The fields will be from the UDateFormatField enum.
* @param status Output param filled with success/failure status.
* Caller needs to make sure it is SUCCESS
* at the function entrance
@@ -991,9 +1094,17 @@ private:
UnicodeString& formatImpl(Calendar& fromCalendar,
Calendar& toCalendar,
UnicodeString& appendTo,
- FieldPosition& fieldPosition,
+ int8_t& firstIndex,
+ FieldPositionHandler& fphandler,
UErrorCode& status) const ;
+ /** Version of formatImpl for DateInterval. */
+ UnicodeString& formatIntervalImpl(const DateInterval& dtInterval,
+ UnicodeString& appendTo,
+ int8_t& firstIndex,
+ FieldPositionHandler& fphandler,
+ UErrorCode& status) const;
+
// from calendar field to pattern letter
static const char16_t fgCalendarFieldToPatternLetter[];
@@ -1042,5 +1153,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _DTITVFMT_H__
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/dtitvinf.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/dtitvinf.h
index 10c0f4e205e..fa73ca211d3 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/dtitvinf.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/dtitvinf.h
@@ -16,6 +16,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Date/Time interval patterns for formatting date/time interval
@@ -149,7 +151,6 @@ U_NAMESPACE_BEGIN
* calendar; non-Gregorian calendars are supported from ICU 4.4.1.
* @stable ICU 4.0
**/
-
class U_I18N_API DateIntervalInfo U_FINAL : public UObject {
public:
/**
@@ -196,7 +197,7 @@ public:
* @return a copy of the object
* @stable ICU 4.0
*/
- virtual DateIntervalInfo* clone(void) const;
+ virtual DateIntervalInfo* clone() const;
/**
* Destructor.
@@ -517,5 +518,7 @@ U_NAMESPACE_END
#endif
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/dtptngen.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/dtptngen.h
index 26ccc64060f..a71938b31cf 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/dtptngen.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/dtptngen.h
@@ -14,6 +14,10 @@
#ifndef __DTPTNGEN_H__
#define __DTPTNGEN_H__
+#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/datefmt.h"
#include "unicode/locid.h"
#include "unicode/udat.h"
@@ -273,18 +277,16 @@ public:
*/
const UnicodeString& getAppendItemName(UDateTimePatternField field) const;
-#ifndef U_HIDE_DRAFT_API
/**
* The general interface to get a display name for a particular date/time field,
* in one of several possible display widths.
*
* @param field The desired UDateTimePatternField, such as UDATPG_ERA_FIELD.
* @param width The desired UDateTimePGDisplayWidth, such as UDATPG_ABBREVIATED.
- * @return. The display name for field
- * @draft ICU 61
+ * @return The display name for field
+ * @stable ICU 61
*/
UnicodeString getFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width) const;
-#endif // U_HIDE_DRAFT_API
/**
* The DateTimeFormat is a message format pattern used to compose date and
@@ -563,11 +565,10 @@ private:
void setDateTimeFromCalendar(const Locale& locale, UErrorCode& status);
void setDecimalSymbols(const Locale& locale, UErrorCode& status);
UDateTimePatternField getAppendFormatNumber(const char* field) const;
-#ifndef U_HIDE_DRAFT_API
+ // Note for the next 3: UDateTimePGDisplayWidth is now stable ICU 61
UDateTimePatternField getFieldAndWidthIndices(const char* key, UDateTimePGDisplayWidth* widthP) const;
void setFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width, const UnicodeString& value);
UnicodeString& getMutableFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width);
-#endif // U_HIDE_DRAFT_API
void getAppendName(UDateTimePatternField field, UnicodeString& value);
UnicodeString mapSkeletonMetacharacters(const UnicodeString& patternForm, int32_t* flags, UErrorCode& status);
const UnicodeString* getBestRaw(DateTimeMatcher& source, int32_t includeMask, DistanceInfo* missingFields, UErrorCode& status, const PtnSkeleton** specifiedSkeletonPtr = 0);
@@ -588,4 +589,6 @@ private:
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/dtrule.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/dtrule.h
index 07672491a67..adab8967f63 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/dtrule.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/dtrule.h
@@ -11,6 +11,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Rule for specifying date and time in an year
@@ -126,7 +128,7 @@ public:
* @return A copy of the object.
* @stable ICU 3.8
*/
- DateTimeRule* clone(void) const;
+ DateTimeRule* clone() const;
/**
* Assignment operator.
@@ -248,5 +250,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // DTRULE_H
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/fieldpos.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/fieldpos.h
index 0bcc8daa0f7..23ee38624b7 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/fieldpos.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/fieldpos.h
@@ -26,6 +26,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: FieldPosition identifies the fields in a formatted output.
@@ -290,5 +292,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _FIELDPOS
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/fmtable.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/fmtable.h
index a06c23dc3bd..7bec4f6906e 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/fmtable.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/fmtable.h
@@ -19,6 +19,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Formattable is a thin wrapper for primitive types used for formatting and parsing
@@ -751,5 +753,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif //_FMTABLE
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/format.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/format.h
index b05318dae7b..96883a81a2e 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/format.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/format.h
@@ -26,6 +26,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Base class for all formats.
@@ -303,5 +305,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _FORMAT
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/formattedvalue.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/formattedvalue.h
new file mode 100644
index 00000000000..5c47264136b
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/formattedvalue.h
@@ -0,0 +1,332 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#ifndef __FORMATTEDVALUE_H__
+#define __FORMATTEDVALUE_H__
+
+#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
+#if !UCONFIG_NO_FORMATTING
+
+#include "unicode/appendable.h"
+#include "unicode/fpositer.h"
+#include "unicode/unistr.h"
+#include "unicode/uformattedvalue.h"
+
+U_NAMESPACE_BEGIN
+
+/**
+ * \file
+ * \brief C++ API: Abstract operations for localized strings.
+ *
+ * This file contains declarations for classes that deal with formatted strings. A number
+ * of APIs throughout ICU use these classes for expressing their localized output.
+ */
+
+
+// The following cannot have #ifndef U_HIDE_DRAFT_API because
+// class FormattedValue depends on it, and FormattedValue cannot be
+// hidden becauseclass FormattedNumber (stable ICU 60) depends on it.
+#ifndef U_FORCE_HIDE_DRAFT_API
+/**
+ * Represents a span of a string containing a given field.
+ *
+ * This class differs from FieldPosition in the following ways:
+ *
+ * 1. It has information on the field category.
+ * 2. It allows you to set constraints to use when iterating over field positions.
+ * 3. It is used for the newer FormattedValue APIs.
+ *
+ * This class is not intended for public subclassing.
+ *
+ * @draft ICU 64
+ */
+class U_I18N_API ConstrainedFieldPosition : public UMemory {
+ public:
+
+ /**
+ * Initializes a ConstrainedFieldPosition.
+ *
+ * By default, the ConstrainedFieldPosition has no iteration constraints.
+ *
+ * @draft ICU 64
+ */
+ ConstrainedFieldPosition();
+
+ /** @draft ICU 64 */
+ ~ConstrainedFieldPosition();
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Resets this ConstrainedFieldPosition to its initial state, as if it were newly created:
+ *
+ * - Removes any constraints that may have been set on the instance.
+ * - Resets the iteration position.
+ *
+ * @draft ICU 64
+ */
+ void reset();
+
+ /**
+ * Sets a constraint on the field category.
+ *
+ * When this instance of ConstrainedFieldPosition is passed to FormattedValue#nextPosition,
+ * positions are skipped unless they have the given category.
+ *
+ * Any previously set constraints are cleared.
+ *
+ * For example, to loop over only the number-related fields:
+ *
+ * ConstrainedFieldPosition cfpos;
+ * cfpos.constrainCategory(UFIELDCATEGORY_NUMBER_FORMAT);
+ * while (fmtval.nextPosition(cfpos, status)) {
+ * // handle the number-related field position
+ * }
+ *
+ * Changing the constraint while in the middle of iterating over a FormattedValue
+ * does not generally have well-defined behavior.
+ *
+ * @param category The field category to fix when iterating.
+ * @draft ICU 64
+ */
+ void constrainCategory(int32_t category);
+
+ /**
+ * Sets a constraint on the category and field.
+ *
+ * When this instance of ConstrainedFieldPosition is passed to FormattedValue#nextPosition,
+ * positions are skipped unless they have the given category and field.
+ *
+ * Any previously set constraints are cleared.
+ *
+ * For example, to loop over all grouping separators:
+ *
+ * ConstrainedFieldPosition cfpos;
+ * cfpos.constrainField(UFIELDCATEGORY_NUMBER_FORMAT, UNUM_GROUPING_SEPARATOR_FIELD);
+ * while (fmtval.nextPosition(cfpos, status)) {
+ * // handle the grouping separator position
+ * }
+ *
+ * Changing the constraint while in the middle of iterating over a FormattedValue
+ * does not generally have well-defined behavior.
+ *
+ * @param category The field category to fix when iterating.
+ * @param field The field to fix when iterating.
+ * @draft ICU 64
+ */
+ void constrainField(int32_t category, int32_t field);
+
+ /**
+ * Gets the field category for the current position.
+ *
+ * The return value is well-defined only after
+ * FormattedValue#nextPosition returns TRUE.
+ *
+ * @return The field category saved in the instance.
+ * @draft ICU 64
+ */
+ inline int32_t getCategory() const {
+ return fCategory;
+ }
+
+ /**
+ * Gets the field for the current position.
+ *
+ * The return value is well-defined only after
+ * FormattedValue#nextPosition returns TRUE.
+ *
+ * @return The field saved in the instance.
+ * @draft ICU 64
+ */
+ inline int32_t getField() const {
+ return fField;
+ }
+
+ /**
+ * Gets the INCLUSIVE start index for the current position.
+ *
+ * The return value is well-defined only after FormattedValue#nextPosition returns TRUE.
+ *
+ * @return The start index saved in the instance.
+ * @draft ICU 64
+ */
+ inline int32_t getStart() const {
+ return fStart;
+ }
+
+ /**
+ * Gets the EXCLUSIVE end index stored for the current position.
+ *
+ * The return value is well-defined only after FormattedValue#nextPosition returns TRUE.
+ *
+ * @return The end index saved in the instance.
+ * @draft ICU 64
+ */
+ inline int32_t getLimit() const {
+ return fLimit;
+ }
+
+ ////////////////////////////////////////////////////////////////////
+ //// The following methods are for FormattedValue implementers; ////
+ //// most users can ignore them. ////
+ ////////////////////////////////////////////////////////////////////
+
+ /**
+ * Gets an int64 that FormattedValue implementations may use for storage.
+ *
+ * The initial value is zero.
+ *
+ * Users of FormattedValue should not need to call this method.
+ *
+ * @return The current iteration context from {@link #setInt64IterationContext}.
+ * @draft ICU 64
+ */
+ inline int64_t getInt64IterationContext() const {
+ return fContext;
+ }
+
+ /**
+ * Sets an int64 that FormattedValue implementations may use for storage.
+ *
+ * Intended to be used by FormattedValue implementations.
+ *
+ * @param context The new iteration context.
+ * @draft ICU 64
+ */
+ void setInt64IterationContext(int64_t context);
+
+ /**
+ * Determines whether a given field should be included given the
+ * constraints.
+ *
+ * Intended to be used by FormattedValue implementations.
+ *
+ * @param category The category to test.
+ * @param field The field to test.
+ * @draft ICU 64
+ */
+ UBool matchesField(int32_t category, int32_t field) const;
+
+ /**
+ * Sets new values for the primary public getters.
+ *
+ * Intended to be used by FormattedValue implementations.
+ *
+ * It is up to the implementation to ensure that the user-requested
+ * constraints are satisfied. This method does not check!
+ *
+ * @param category The new field category.
+ * @param field The new field.
+ * @param start The new inclusive start index.
+ * @param limit The new exclusive end index.
+ * @draft ICU 64
+ */
+ void setState(
+ int32_t category,
+ int32_t field,
+ int32_t start,
+ int32_t limit);
+#endif /* U_HIDE_DRAFT_API */
+
+ private:
+ int64_t fContext = 0LL;
+ int32_t fField = 0;
+ int32_t fStart = 0;
+ int32_t fLimit = 0;
+#ifndef U_HIDE_DRAFT_API
+ int32_t fCategory = UFIELD_CATEGORY_UNDEFINED;
+#else /* U_HIDE_DRAFT_API */
+ int32_t fCategory = 0;
+#endif /* U_HIDE_DRAFT_API */
+ int8_t fConstraint = 0;
+};
+
+// The following cannot have #ifndef U_HIDE_DRAFT_API because
+// class FormattedNumber (stable ICU 60) depends on it.
+/**
+ * An abstract formatted value: a string with associated field attributes.
+ * Many formatters format to classes implementing FormattedValue.
+ *
+ * @draft ICU 64
+ */
+class U_I18N_API FormattedValue /* not : public UObject because this is an interface/mixin class */ {
+ public:
+ /** @draft ICU 64 */
+ virtual ~FormattedValue();
+
+ /**
+ * Returns the formatted string as a self-contained UnicodeString.
+ *
+ * If you need the string within the current scope only, consider #toTempString.
+ *
+ * @param status Set if an error occurs.
+ * @return a UnicodeString containing the formatted string.
+ *
+ * @draft ICU 64
+ */
+ virtual UnicodeString toString(UErrorCode& status) const = 0;
+
+ /**
+ * Returns the formatted string as a read-only alias to memory owned by the FormattedValue.
+ *
+ * The return value is valid only as long as this FormattedValue is present and unchanged in
+ * memory. If you need the string outside the current scope, consider #toString.
+ *
+ * The buffer returned by calling UnicodeString#getBuffer() on the return value is
+ * guaranteed to be NUL-terminated.
+ *
+ * @param status Set if an error occurs.
+ * @return a temporary UnicodeString containing the formatted string.
+ *
+ * @draft ICU 64
+ */
+ virtual UnicodeString toTempString(UErrorCode& status) const = 0;
+
+ /**
+ * Appends the formatted string to an Appendable.
+ *
+ * @param appendable
+ * The Appendable to which to append the string output.
+ * @param status Set if an error occurs.
+ * @return The same Appendable, for chaining.
+ *
+ * @draft ICU 64
+ * @see Appendable
+ */
+ virtual Appendable& appendTo(Appendable& appendable, UErrorCode& status) const = 0;
+
+ /**
+ * Iterates over field positions in the FormattedValue. This lets you determine the position
+ * of specific types of substrings, like a month or a decimal separator.
+ *
+ * To loop over all field positions:
+ *
+ * ConstrainedFieldPosition cfpos;
+ * while (fmtval.nextPosition(cfpos, status)) {
+ * // handle the field position; get information from cfpos
+ * }
+ *
+ * @param cfpos
+ * The object used for iteration state. This can provide constraints to iterate over
+ * only one specific category or field;
+ * see ConstrainedFieldPosition#constrainCategory
+ * and ConstrainedFieldPosition#constrainField.
+ * @param status Set if an error occurs.
+ * @return TRUE if a new occurrence of the field was found;
+ * FALSE otherwise or if an error was set.
+ *
+ * @draft ICU 64
+ */
+ virtual UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const = 0;
+};
+#endif // U_FORCE_HIDE_DRAFT_API
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
+#endif // __FORMATTEDVALUE_H__
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/fpositer.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/fpositer.h
index d9c8eff511b..3e8a0108f16 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/fpositer.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/fpositer.h
@@ -19,6 +19,9 @@
#define FPOSITER_H
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/uobject.h"
/**
@@ -116,4 +119,6 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // FPOSITER_H
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/gender.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/gender.h
index d2773ebd051..cf7fee963e1 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/gender.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/gender.h
@@ -25,6 +25,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_FORMATTING
#include "unicode/locid.h"
@@ -114,5 +116,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _GENDER
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/gregocal.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/gregocal.h
index 2b4fe1d879c..4ce40daf3a4 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/gregocal.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/gregocal.h
@@ -28,6 +28,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_FORMATTING
#include "unicode/calendar.h"
@@ -301,7 +303,7 @@ public:
* @return return a polymorphic copy of this calendar.
* @stable ICU 2.0
*/
- virtual Calendar* clone(void) const;
+ virtual GregorianCalendar* clone() const;
/**
* Sets the GregorianCalendar change date. This is the point when the switch from
@@ -350,6 +352,7 @@ public:
*/
virtual UBool isEquivalentTo(const Calendar& other) const;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* (Overrides Calendar) Rolls up or down by the given amount in the specified field.
* For more information, see the documentation for Calendar::roll().
@@ -362,6 +365,7 @@ public:
* @deprecated ICU 2.6. Use roll(UCalendarDateFields field, int32_t amount, UErrorCode& status) instead.
*/
virtual void roll(EDateFields field, int32_t amount, UErrorCode& status);
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* (Overrides Calendar) Rolls up or down by the given amount in the specified field.
@@ -774,6 +778,8 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _GREGOCAL
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/listformatter.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/listformatter.h
index 5e36cf71cc5..88fc46cf37b 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/listformatter.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/listformatter.h
@@ -21,13 +21,18 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/unistr.h"
#include "unicode/locid.h"
+#include "unicode/formattedvalue.h"
U_NAMESPACE_BEGIN
class FieldPositionIterator;
class FieldPositionHandler;
+class FormattedListData;
+class ListFormatter;
/** @internal */
class Hashtable;
@@ -58,6 +63,81 @@ struct ListFormatData : public UMemory {
*/
+#if !UCONFIG_NO_FORMATTING
+#ifndef U_HIDE_DRAFT_API
+/**
+ * An immutable class containing the result of a list formatting operation.
+ *
+ * Instances of this class are immutable and thread-safe.
+ *
+ * When calling nextPosition():
+ * The fields are returned from start to end. The special field category
+ * UFIELD_CATEGORY_LIST_SPAN is used to indicate which argument
+ * was inserted at the given position. The span category will
+ * always occur before the corresponding instance of UFIELD_CATEGORY_LIST
+ * in the nextPosition() iterator.
+ *
+ * Not intended for public subclassing.
+ *
+ * @draft ICU 64
+ */
+class U_I18N_API FormattedList : public UMemory, public FormattedValue {
+ public:
+ /**
+ * Default constructor; makes an empty FormattedList.
+ * @draft ICU 64
+ */
+ FormattedList() : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
+
+ /**
+ * Move constructor: Leaves the source FormattedList in an undefined state.
+ * @draft ICU 64
+ */
+ FormattedList(FormattedList&& src) U_NOEXCEPT;
+
+ /**
+ * Destruct an instance of FormattedList.
+ * @draft ICU 64
+ */
+ virtual ~FormattedList() U_OVERRIDE;
+
+ /** Copying not supported; use move constructor instead. */
+ FormattedList(const FormattedList&) = delete;
+
+ /** Copying not supported; use move assignment instead. */
+ FormattedList& operator=(const FormattedList&) = delete;
+
+ /**
+ * Move assignment: Leaves the source FormattedList in an undefined state.
+ * @draft ICU 64
+ */
+ FormattedList& operator=(FormattedList&& src) U_NOEXCEPT;
+
+ /** @copydoc FormattedValue::toString() */
+ UnicodeString toString(UErrorCode& status) const U_OVERRIDE;
+
+ /** @copydoc FormattedValue::toTempString() */
+ UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE;
+
+ /** @copydoc FormattedValue::appendTo() */
+ Appendable &appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE;
+
+ /** @copydoc FormattedValue::nextPosition() */
+ UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE;
+
+ private:
+ FormattedListData *fData;
+ UErrorCode fErrorCode;
+ explicit FormattedList(FormattedListData *results)
+ : fData(results), fErrorCode(U_ZERO_ERROR) {}
+ explicit FormattedList(UErrorCode errorCode)
+ : fData(nullptr), fErrorCode(errorCode) {}
+ friend class ListFormatter;
+};
+#endif /* U_HIDE_DRAFT_API */
+#endif // !UCONFIG_NO_FORMATTING
+
+
/**
* An immutable class for formatting a list, using data from CLDR (or supplied
* separately).
@@ -110,7 +190,7 @@ class U_I18N_API ListFormatter : public UObject{
* Creates a ListFormatter appropriate for a locale and style.
*
* @param locale The locale.
- * @param style the style, either "standard", "duration", or "duration-short"
+ * @param style the style, either "standard", "or", "unit", "unit-narrow", or "unit-short"
* @param errorCode ICU error code, set if no data available for the given locale.
* @return A ListFormatter object created from internal data derived from
* CLDR data.
@@ -159,7 +239,27 @@ class U_I18N_API ListFormatter : public UObject{
UnicodeString& format(const UnicodeString items[], int32_t n_items,
UnicodeString & appendTo, FieldPositionIterator* posIter,
UErrorCode& errorCode) const;
+#endif // U_HIDE_DRAFT_API
+
+#if !UCONFIG_NO_FORMATTING
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Formats a list of strings to a FormattedList, which exposes field
+ * position information. The FormattedList contains more information than
+ * a FieldPositionIterator.
+ *
+ * @param items An array of strings to be combined and formatted.
+ * @param n_items Length of the array items.
+ * @param errorCode ICU error code returned here.
+ * @return A FormattedList containing field information.
+ * @draft ICU 64
+ */
+ FormattedList formatStringsToValue(
+ const UnicodeString items[],
+ int32_t n_items,
+ UErrorCode& errorCode) const;
#endif /* U_HIDE_DRAFT_API */
+#endif // !UCONFIG_NO_FORMATTING
#ifndef U_HIDE_INTERNAL_API
/**
@@ -200,4 +300,6 @@ class U_I18N_API ListFormatter : public UObject{
U_NAMESPACE_END
-#endif
+#endif /* U_SHOW_CPLUSPLUS_API */
+
+#endif // __LISTFORMATTER_H__
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/measfmt.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/measfmt.h
index 3167a76c33a..b4f90486294 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/measfmt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/measfmt.h
@@ -15,6 +15,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_FORMATTING
#include "unicode/format.h"
@@ -151,7 +153,7 @@ class U_I18N_API MeasureFormat : public Format {
* Clones this object polymorphically.
* @stable ICU 53
*/
- virtual Format *clone() const;
+ virtual MeasureFormat *clone() const;
/**
* Formats object to produce a string.
@@ -163,6 +165,7 @@ class U_I18N_API MeasureFormat : public Format {
FieldPosition &pos,
UErrorCode &status) const;
+#ifndef U_FORCE_HIDE_DRAFT_API
/**
* Parse a string to produce an object. This implementation sets
* status to U_UNSUPPORTED_ERROR.
@@ -173,6 +176,7 @@ class U_I18N_API MeasureFormat : public Format {
const UnicodeString &source,
Formattable &reslt,
ParsePosition &pos) const;
+#endif // U_FORCE_HIDE_DRAFT_API
/**
* Formats measure objects to produce a string. An example of such a
@@ -322,7 +326,14 @@ class U_I18N_API MeasureFormat : public Format {
* ICU use only.
* @internal.
*/
- const NumberFormat &getNumberFormat() const;
+ const NumberFormat &getNumberFormatInternal() const;
+
+ /**
+ * ICU use only.
+ * Always returns the short form currency formatter.
+ * @internal.
+ */
+ const NumberFormat& getCurrencyFormatInternal() const;
/**
* ICU use only.
@@ -355,27 +366,6 @@ class U_I18N_API MeasureFormat : public Format {
// shared across instances.
ListFormatter *listFormatter;
- const SimpleFormatter *getFormatterOrNull(
- const MeasureUnit &unit, UMeasureFormatWidth width, int32_t index) const;
-
- const SimpleFormatter *getFormatter(
- const MeasureUnit &unit, UMeasureFormatWidth width, int32_t index,
- UErrorCode &errorCode) const;
-
- const SimpleFormatter *getPluralFormatter(
- const MeasureUnit &unit, UMeasureFormatWidth width, int32_t index,
- UErrorCode &errorCode) const;
-
- const SimpleFormatter *getPerFormatter(
- UMeasureFormatWidth width,
- UErrorCode &status) const;
-
- int32_t withPerUnitAndAppend(
- const UnicodeString &formatted,
- const MeasureUnit &perUnit,
- UnicodeString &appendTo,
- UErrorCode &status) const;
-
UnicodeString &formatMeasure(
const Measure &measure,
const NumberFormat &nf,
@@ -396,17 +386,12 @@ class U_I18N_API MeasureFormat : public Format {
int32_t bitMap, // 1=hour set, 2=minute set, 4=second set
UnicodeString &appendTo,
UErrorCode &status) const;
-
- UnicodeString &formatNumeric(
- UDate date,
- const DateFormat &dateFmt,
- UDateFormatField smallestField,
- const Formattable &smallestAmount,
- UnicodeString &appendTo,
- UErrorCode &status) const;
};
U_NAMESPACE_END
#endif // #if !UCONFIG_NO_FORMATTING
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // #ifndef MEASUREFORMAT_H
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/measunit.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/measunit.h
index fac18f7b8e5..dbcad62f229 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/measunit.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/measunit.h
@@ -15,6 +15,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_FORMATTING
#include "unicode/unistr.h"
@@ -62,7 +64,7 @@ class U_I18N_API MeasureUnit: public UObject {
* have the same class as returned by getDynamicClassID().
* @stable ICU 3.0
*/
- virtual UObject* clone() const;
+ virtual MeasureUnit* clone() const;
/**
* Destructor
@@ -209,160 +211,387 @@ class U_I18N_API MeasureUnit: public UObject {
// Start generated createXXX methods
/**
- * Returns unit of acceleration: g-force.
+ * Returns by pointer, unit of acceleration: g-force.
* Caller owns returned value and must free it.
+ * Also see {@link #getGForce()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createGForce(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of acceleration: meter-per-second-squared.
+ * Returns by value, unit of acceleration: g-force.
+ * Also see {@link #createGForce()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getGForce();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of acceleration: meter-per-second-squared.
* Caller owns returned value and must free it.
+ * Also see {@link #getMeterPerSecondSquared()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createMeterPerSecondSquared(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of acceleration: meter-per-second-squared.
+ * Also see {@link #createMeterPerSecondSquared()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMeterPerSecondSquared();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of angle: arc-minute.
+ * Returns by pointer, unit of angle: arc-minute.
* Caller owns returned value and must free it.
+ * Also see {@link #getArcMinute()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createArcMinute(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of angle: arc-second.
+ * Returns by value, unit of angle: arc-minute.
+ * Also see {@link #createArcMinute()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getArcMinute();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of angle: arc-second.
* Caller owns returned value and must free it.
+ * Also see {@link #getArcSecond()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createArcSecond(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of angle: arc-second.
+ * Also see {@link #createArcSecond()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getArcSecond();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of angle: degree.
+ * Returns by pointer, unit of angle: degree.
* Caller owns returned value and must free it.
+ * Also see {@link #getDegree()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createDegree(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of angle: degree.
+ * Also see {@link #createDegree()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getDegree();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of angle: radian.
+ * Returns by pointer, unit of angle: radian.
* Caller owns returned value and must free it.
+ * Also see {@link #getRadian()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createRadian(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of angle: radian.
+ * Also see {@link #createRadian()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getRadian();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of angle: revolution.
+ * Returns by pointer, unit of angle: revolution.
* Caller owns returned value and must free it.
+ * Also see {@link #getRevolutionAngle()}.
* @param status ICU error code.
* @stable ICU 56
*/
static MeasureUnit *createRevolutionAngle(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of angle: revolution.
+ * Also see {@link #createRevolutionAngle()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getRevolutionAngle();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of area: acre.
+ * Returns by pointer, unit of area: acre.
* Caller owns returned value and must free it.
+ * Also see {@link #getAcre()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createAcre(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of area: acre.
+ * Also see {@link #createAcre()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getAcre();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of area: dunam.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getDunam()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createDunam(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of area: dunam.
+ * Also see {@link #createDunam()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getDunam();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of area: hectare.
+ * Returns by pointer, unit of area: hectare.
* Caller owns returned value and must free it.
+ * Also see {@link #getHectare()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createHectare(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of area: square-centimeter.
+ * Returns by value, unit of area: hectare.
+ * Also see {@link #createHectare()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getHectare();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of area: square-centimeter.
* Caller owns returned value and must free it.
+ * Also see {@link #getSquareCentimeter()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createSquareCentimeter(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of area: square-centimeter.
+ * Also see {@link #createSquareCentimeter()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getSquareCentimeter();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of area: square-foot.
+ * Returns by pointer, unit of area: square-foot.
* Caller owns returned value and must free it.
+ * Also see {@link #getSquareFoot()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createSquareFoot(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of area: square-inch.
+ * Returns by value, unit of area: square-foot.
+ * Also see {@link #createSquareFoot()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getSquareFoot();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of area: square-inch.
* Caller owns returned value and must free it.
+ * Also see {@link #getSquareInch()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createSquareInch(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of area: square-kilometer.
+ * Returns by value, unit of area: square-inch.
+ * Also see {@link #createSquareInch()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getSquareInch();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of area: square-kilometer.
* Caller owns returned value and must free it.
+ * Also see {@link #getSquareKilometer()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createSquareKilometer(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of area: square-kilometer.
+ * Also see {@link #createSquareKilometer()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getSquareKilometer();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of area: square-meter.
+ * Returns by pointer, unit of area: square-meter.
* Caller owns returned value and must free it.
+ * Also see {@link #getSquareMeter()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createSquareMeter(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of area: square-meter.
+ * Also see {@link #createSquareMeter()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getSquareMeter();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of area: square-mile.
+ * Returns by pointer, unit of area: square-mile.
* Caller owns returned value and must free it.
+ * Also see {@link #getSquareMile()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createSquareMile(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of area: square-mile.
+ * Also see {@link #createSquareMile()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getSquareMile();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of area: square-yard.
+ * Returns by pointer, unit of area: square-yard.
* Caller owns returned value and must free it.
+ * Also see {@link #getSquareYard()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createSquareYard(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of concentr: karat.
+ * Returns by value, unit of area: square-yard.
+ * Also see {@link #createSquareYard()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getSquareYard();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of concentr: karat.
* Caller owns returned value and must free it.
+ * Also see {@link #getKarat()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createKarat(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of concentr: karat.
+ * Also see {@link #createKarat()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getKarat();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of concentr: milligram-per-deciliter.
+ * Returns by pointer, unit of concentr: milligram-per-deciliter.
* Caller owns returned value and must free it.
+ * Also see {@link #getMilligramPerDeciliter()}.
* @param status ICU error code.
* @stable ICU 57
*/
static MeasureUnit *createMilligramPerDeciliter(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of concentr: millimole-per-liter.
+ * Returns by value, unit of concentr: milligram-per-deciliter.
+ * Also see {@link #createMilligramPerDeciliter()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMilligramPerDeciliter();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of concentr: millimole-per-liter.
* Caller owns returned value and must free it.
+ * Also see {@link #getMillimolePerLiter()}.
* @param status ICU error code.
* @stable ICU 57
*/
static MeasureUnit *createMillimolePerLiter(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of concentr: part-per-million.
+ * Returns by value, unit of concentr: millimole-per-liter.
+ * Also see {@link #createMillimolePerLiter()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMillimolePerLiter();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of concentr: mole.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getMole()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createMole(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of concentr: mole.
+ * Also see {@link #createMole()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMole();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of concentr: part-per-million.
* Caller owns returned value and must free it.
+ * Also see {@link #getPartPerMillion()}.
* @param status ICU error code.
* @stable ICU 57
*/
@@ -370,115 +599,269 @@ class U_I18N_API MeasureUnit: public UObject {
#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of concentr: percent.
+ * Returns by value, unit of concentr: part-per-million.
+ * Also see {@link #createPartPerMillion()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getPartPerMillion();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of concentr: percent.
* Caller owns returned value and must free it.
+ * Also see {@link #getPercent()}.
* @param status ICU error code.
- * @draft ICU 63
+ * @stable ICU 63
*/
static MeasureUnit *createPercent(UErrorCode &status);
-#endif /* U_HIDE_DRAFT_API */
#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of concentr: permille.
+ * Returns by value, unit of concentr: percent.
+ * Also see {@link #createPercent()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getPercent();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of concentr: permille.
* Caller owns returned value and must free it.
+ * Also see {@link #getPermille()}.
* @param status ICU error code.
- * @draft ICU 63
+ * @stable ICU 63
*/
static MeasureUnit *createPermille(UErrorCode &status);
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of concentr: permille.
+ * Also see {@link #createPermille()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getPermille();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of concentr: permyriad.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getPermyriad()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createPermyriad(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of concentr: permyriad.
+ * Also see {@link #createPermyriad()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getPermyriad();
#endif /* U_HIDE_DRAFT_API */
/**
- * Returns unit of consumption: liter-per-100kilometers.
+ * Returns by pointer, unit of consumption: liter-per-100kilometers.
* Caller owns returned value and must free it.
+ * Also see {@link #getLiterPer100Kilometers()}.
* @param status ICU error code.
* @stable ICU 56
*/
static MeasureUnit *createLiterPer100Kilometers(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of consumption: liter-per-kilometer.
+ * Returns by value, unit of consumption: liter-per-100kilometers.
+ * Also see {@link #createLiterPer100Kilometers()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getLiterPer100Kilometers();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of consumption: liter-per-kilometer.
* Caller owns returned value and must free it.
+ * Also see {@link #getLiterPerKilometer()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createLiterPerKilometer(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of consumption: liter-per-kilometer.
+ * Also see {@link #createLiterPerKilometer()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getLiterPerKilometer();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of consumption: mile-per-gallon.
+ * Returns by pointer, unit of consumption: mile-per-gallon.
* Caller owns returned value and must free it.
+ * Also see {@link #getMilePerGallon()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createMilePerGallon(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of consumption: mile-per-gallon-imperial.
+ * Returns by value, unit of consumption: mile-per-gallon.
+ * Also see {@link #createMilePerGallon()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMilePerGallon();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of consumption: mile-per-gallon-imperial.
* Caller owns returned value and must free it.
+ * Also see {@link #getMilePerGallonImperial()}.
* @param status ICU error code.
* @stable ICU 57
*/
static MeasureUnit *createMilePerGallonImperial(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of consumption: mile-per-gallon-imperial.
+ * Also see {@link #createMilePerGallonImperial()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMilePerGallonImperial();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of digital: bit.
+ * Returns by pointer, unit of digital: bit.
* Caller owns returned value and must free it.
+ * Also see {@link #getBit()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createBit(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of digital: bit.
+ * Also see {@link #createBit()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getBit();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of digital: byte.
+ * Returns by pointer, unit of digital: byte.
* Caller owns returned value and must free it.
+ * Also see {@link #getByte()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createByte(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of digital: byte.
+ * Also see {@link #createByte()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getByte();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of digital: gigabit.
+ * Returns by pointer, unit of digital: gigabit.
* Caller owns returned value and must free it.
+ * Also see {@link #getGigabit()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createGigabit(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of digital: gigabit.
+ * Also see {@link #createGigabit()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getGigabit();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of digital: gigabyte.
+ * Returns by pointer, unit of digital: gigabyte.
* Caller owns returned value and must free it.
+ * Also see {@link #getGigabyte()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createGigabyte(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of digital: kilobit.
+ * Returns by value, unit of digital: gigabyte.
+ * Also see {@link #createGigabyte()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getGigabyte();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of digital: kilobit.
* Caller owns returned value and must free it.
+ * Also see {@link #getKilobit()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createKilobit(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of digital: kilobit.
+ * Also see {@link #createKilobit()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getKilobit();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of digital: kilobyte.
+ * Returns by pointer, unit of digital: kilobyte.
* Caller owns returned value and must free it.
+ * Also see {@link #getKilobyte()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createKilobyte(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of digital: megabit.
+ * Returns by value, unit of digital: kilobyte.
+ * Also see {@link #createKilobyte()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getKilobyte();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of digital: megabit.
* Caller owns returned value and must free it.
+ * Also see {@link #getMegabit()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createMegabit(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of digital: megabit.
+ * Also see {@link #createMegabit()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMegabit();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of digital: megabyte.
+ * Returns by pointer, unit of digital: megabyte.
* Caller owns returned value and must free it.
+ * Also see {@link #getMegabyte()}.
* @param status ICU error code.
* @stable ICU 54
*/
@@ -486,529 +869,1583 @@ class U_I18N_API MeasureUnit: public UObject {
#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of digital: petabyte.
+ * Returns by value, unit of digital: megabyte.
+ * Also see {@link #createMegabyte()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMegabyte();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of digital: petabyte.
* Caller owns returned value and must free it.
+ * Also see {@link #getPetabyte()}.
* @param status ICU error code.
- * @draft ICU 63
+ * @stable ICU 63
*/
static MeasureUnit *createPetabyte(UErrorCode &status);
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of digital: petabyte.
+ * Also see {@link #createPetabyte()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getPetabyte();
#endif /* U_HIDE_DRAFT_API */
/**
- * Returns unit of digital: terabit.
+ * Returns by pointer, unit of digital: terabit.
* Caller owns returned value and must free it.
+ * Also see {@link #getTerabit()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createTerabit(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of digital: terabit.
+ * Also see {@link #createTerabit()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getTerabit();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of digital: terabyte.
+ * Returns by pointer, unit of digital: terabyte.
* Caller owns returned value and must free it.
+ * Also see {@link #getTerabyte()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createTerabyte(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of digital: terabyte.
+ * Also see {@link #createTerabyte()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getTerabyte();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of duration: century.
+ * Returns by pointer, unit of duration: century.
* Caller owns returned value and must free it.
+ * Also see {@link #getCentury()}.
* @param status ICU error code.
* @stable ICU 56
*/
static MeasureUnit *createCentury(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of duration: century.
+ * Also see {@link #createCentury()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getCentury();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of duration: day.
+ * Returns by pointer, unit of duration: day.
* Caller owns returned value and must free it.
+ * Also see {@link #getDay()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createDay(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of duration: hour.
+ * Returns by value, unit of duration: day.
+ * Also see {@link #createDay()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getDay();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of duration: day-person.
* Caller owns returned value and must free it.
+ * Also see {@link #getDayPerson()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createDayPerson(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of duration: day-person.
+ * Also see {@link #createDayPerson()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getDayPerson();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of duration: decade.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getDecade()}.
+ * @param status ICU error code.
+ * @draft ICU 65
+ */
+ static MeasureUnit *createDecade(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of duration: decade.
+ * Also see {@link #createDecade()}.
+ * @draft ICU 65
+ */
+ static MeasureUnit getDecade();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of duration: hour.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getHour()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createHour(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of duration: microsecond.
+ * Returns by value, unit of duration: hour.
+ * Also see {@link #createHour()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getHour();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of duration: microsecond.
* Caller owns returned value and must free it.
+ * Also see {@link #getMicrosecond()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createMicrosecond(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of duration: millisecond.
+ * Returns by value, unit of duration: microsecond.
+ * Also see {@link #createMicrosecond()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMicrosecond();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of duration: millisecond.
* Caller owns returned value and must free it.
+ * Also see {@link #getMillisecond()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createMillisecond(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of duration: minute.
+ * Returns by value, unit of duration: millisecond.
+ * Also see {@link #createMillisecond()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMillisecond();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of duration: minute.
* Caller owns returned value and must free it.
+ * Also see {@link #getMinute()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createMinute(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of duration: minute.
+ * Also see {@link #createMinute()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMinute();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of duration: month.
+ * Returns by pointer, unit of duration: month.
* Caller owns returned value and must free it.
+ * Also see {@link #getMonth()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createMonth(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of duration: month.
+ * Also see {@link #createMonth()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMonth();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of duration: month-person.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getMonthPerson()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createMonthPerson(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of duration: month-person.
+ * Also see {@link #createMonthPerson()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMonthPerson();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of duration: nanosecond.
+ * Returns by pointer, unit of duration: nanosecond.
* Caller owns returned value and must free it.
+ * Also see {@link #getNanosecond()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createNanosecond(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of duration: nanosecond.
+ * Also see {@link #createNanosecond()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getNanosecond();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of duration: second.
+ * Returns by pointer, unit of duration: second.
* Caller owns returned value and must free it.
+ * Also see {@link #getSecond()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createSecond(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of duration: second.
+ * Also see {@link #createSecond()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getSecond();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of duration: week.
+ * Returns by pointer, unit of duration: week.
* Caller owns returned value and must free it.
+ * Also see {@link #getWeek()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createWeek(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of duration: week.
+ * Also see {@link #createWeek()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getWeek();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of duration: week-person.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getWeekPerson()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createWeekPerson(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of duration: week-person.
+ * Also see {@link #createWeekPerson()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getWeekPerson();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of duration: year.
+ * Returns by pointer, unit of duration: year.
* Caller owns returned value and must free it.
+ * Also see {@link #getYear()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createYear(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of duration: year.
+ * Also see {@link #createYear()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getYear();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of duration: year-person.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getYearPerson()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createYearPerson(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of duration: year-person.
+ * Also see {@link #createYearPerson()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getYearPerson();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of electric: ampere.
+ * Returns by pointer, unit of electric: ampere.
* Caller owns returned value and must free it.
+ * Also see {@link #getAmpere()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createAmpere(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of electric: milliampere.
+ * Returns by value, unit of electric: ampere.
+ * Also see {@link #createAmpere()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getAmpere();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of electric: milliampere.
* Caller owns returned value and must free it.
+ * Also see {@link #getMilliampere()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createMilliampere(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of electric: ohm.
+ * Returns by value, unit of electric: milliampere.
+ * Also see {@link #createMilliampere()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMilliampere();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of electric: ohm.
* Caller owns returned value and must free it.
+ * Also see {@link #getOhm()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createOhm(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of electric: volt.
+ * Returns by value, unit of electric: ohm.
+ * Also see {@link #createOhm()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getOhm();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of electric: volt.
* Caller owns returned value and must free it.
+ * Also see {@link #getVolt()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createVolt(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of electric: volt.
+ * Also see {@link #createVolt()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getVolt();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of energy: british-thermal-unit.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getBritishThermalUnit()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createBritishThermalUnit(UErrorCode &status);
+
/**
- * Returns unit of energy: calorie.
+ * Returns by value, unit of energy: british-thermal-unit.
+ * Also see {@link #createBritishThermalUnit()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getBritishThermalUnit();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of energy: calorie.
* Caller owns returned value and must free it.
+ * Also see {@link #getCalorie()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createCalorie(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of energy: calorie.
+ * Also see {@link #createCalorie()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getCalorie();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of energy: foodcalorie.
+ * Returns by pointer, unit of energy: electronvolt.
* Caller owns returned value and must free it.
+ * Also see {@link #getElectronvolt()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createElectronvolt(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of energy: electronvolt.
+ * Also see {@link #createElectronvolt()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getElectronvolt();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of energy: foodcalorie.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getFoodcalorie()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createFoodcalorie(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of energy: foodcalorie.
+ * Also see {@link #createFoodcalorie()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getFoodcalorie();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of energy: joule.
+ * Returns by pointer, unit of energy: joule.
* Caller owns returned value and must free it.
+ * Also see {@link #getJoule()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createJoule(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of energy: joule.
+ * Also see {@link #createJoule()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getJoule();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of energy: kilocalorie.
+ * Returns by pointer, unit of energy: kilocalorie.
* Caller owns returned value and must free it.
+ * Also see {@link #getKilocalorie()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createKilocalorie(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of energy: kilocalorie.
+ * Also see {@link #createKilocalorie()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getKilocalorie();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of energy: kilojoule.
+ * Returns by pointer, unit of energy: kilojoule.
* Caller owns returned value and must free it.
+ * Also see {@link #getKilojoule()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createKilojoule(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of energy: kilowatt-hour.
+ * Returns by value, unit of energy: kilojoule.
+ * Also see {@link #createKilojoule()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getKilojoule();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of energy: kilowatt-hour.
* Caller owns returned value and must free it.
+ * Also see {@link #getKilowattHour()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createKilowattHour(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of energy: kilowatt-hour.
+ * Also see {@link #createKilowattHour()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getKilowattHour();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of energy: therm-us.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getThermUs()}.
+ * @param status ICU error code.
+ * @draft ICU 65
+ */
+ static MeasureUnit *createThermUs(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of energy: therm-us.
+ * Also see {@link #createThermUs()}.
+ * @draft ICU 65
+ */
+ static MeasureUnit getThermUs();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of force: newton.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getNewton()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createNewton(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of force: newton.
+ * Also see {@link #createNewton()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getNewton();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of force: pound-force.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getPoundForce()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createPoundForce(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of force: pound-force.
+ * Also see {@link #createPoundForce()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getPoundForce();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of frequency: gigahertz.
+ * Returns by pointer, unit of frequency: gigahertz.
* Caller owns returned value and must free it.
+ * Also see {@link #getGigahertz()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createGigahertz(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of frequency: hertz.
+ * Returns by value, unit of frequency: gigahertz.
+ * Also see {@link #createGigahertz()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getGigahertz();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of frequency: hertz.
* Caller owns returned value and must free it.
+ * Also see {@link #getHertz()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createHertz(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of frequency: hertz.
+ * Also see {@link #createHertz()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getHertz();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of frequency: kilohertz.
+ * Returns by pointer, unit of frequency: kilohertz.
* Caller owns returned value and must free it.
+ * Also see {@link #getKilohertz()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createKilohertz(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of frequency: megahertz.
+ * Returns by value, unit of frequency: kilohertz.
+ * Also see {@link #createKilohertz()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getKilohertz();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of frequency: megahertz.
* Caller owns returned value and must free it.
+ * Also see {@link #getMegahertz()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createMegahertz(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of frequency: megahertz.
+ * Also see {@link #createMegahertz()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMegahertz();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of graphics: dot-per-centimeter.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getDotPerCentimeter()}.
+ * @param status ICU error code.
+ * @draft ICU 65
+ */
+ static MeasureUnit *createDotPerCentimeter(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of graphics: dot-per-centimeter.
+ * Also see {@link #createDotPerCentimeter()}.
+ * @draft ICU 65
+ */
+ static MeasureUnit getDotPerCentimeter();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of length: astronomical-unit.
+ * Returns by pointer, unit of graphics: dot-per-inch.
* Caller owns returned value and must free it.
+ * Also see {@link #getDotPerInch()}.
+ * @param status ICU error code.
+ * @draft ICU 65
+ */
+ static MeasureUnit *createDotPerInch(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of graphics: dot-per-inch.
+ * Also see {@link #createDotPerInch()}.
+ * @draft ICU 65
+ */
+ static MeasureUnit getDotPerInch();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of graphics: em.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getEm()}.
+ * @param status ICU error code.
+ * @draft ICU 65
+ */
+ static MeasureUnit *createEm(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of graphics: em.
+ * Also see {@link #createEm()}.
+ * @draft ICU 65
+ */
+ static MeasureUnit getEm();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of graphics: megapixel.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getMegapixel()}.
+ * @param status ICU error code.
+ * @draft ICU 65
+ */
+ static MeasureUnit *createMegapixel(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of graphics: megapixel.
+ * Also see {@link #createMegapixel()}.
+ * @draft ICU 65
+ */
+ static MeasureUnit getMegapixel();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of graphics: pixel.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getPixel()}.
+ * @param status ICU error code.
+ * @draft ICU 65
+ */
+ static MeasureUnit *createPixel(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of graphics: pixel.
+ * Also see {@link #createPixel()}.
+ * @draft ICU 65
+ */
+ static MeasureUnit getPixel();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of graphics: pixel-per-centimeter.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getPixelPerCentimeter()}.
+ * @param status ICU error code.
+ * @draft ICU 65
+ */
+ static MeasureUnit *createPixelPerCentimeter(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of graphics: pixel-per-centimeter.
+ * Also see {@link #createPixelPerCentimeter()}.
+ * @draft ICU 65
+ */
+ static MeasureUnit getPixelPerCentimeter();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of graphics: pixel-per-inch.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getPixelPerInch()}.
+ * @param status ICU error code.
+ * @draft ICU 65
+ */
+ static MeasureUnit *createPixelPerInch(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of graphics: pixel-per-inch.
+ * Also see {@link #createPixelPerInch()}.
+ * @draft ICU 65
+ */
+ static MeasureUnit getPixelPerInch();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of length: astronomical-unit.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getAstronomicalUnit()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createAstronomicalUnit(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of length: astronomical-unit.
+ * Also see {@link #createAstronomicalUnit()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getAstronomicalUnit();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of length: centimeter.
+ * Returns by pointer, unit of length: centimeter.
* Caller owns returned value and must free it.
+ * Also see {@link #getCentimeter()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createCentimeter(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of length: decimeter.
+ * Returns by value, unit of length: centimeter.
+ * Also see {@link #createCentimeter()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getCentimeter();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of length: decimeter.
* Caller owns returned value and must free it.
+ * Also see {@link #getDecimeter()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createDecimeter(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of length: decimeter.
+ * Also see {@link #createDecimeter()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getDecimeter();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of length: fathom.
+ * Returns by pointer, unit of length: fathom.
* Caller owns returned value and must free it.
+ * Also see {@link #getFathom()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createFathom(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of length: foot.
+ * Returns by value, unit of length: fathom.
+ * Also see {@link #createFathom()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getFathom();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of length: foot.
* Caller owns returned value and must free it.
+ * Also see {@link #getFoot()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createFoot(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of length: foot.
+ * Also see {@link #createFoot()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getFoot();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of length: furlong.
+ * Returns by pointer, unit of length: furlong.
* Caller owns returned value and must free it.
+ * Also see {@link #getFurlong()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createFurlong(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of length: furlong.
+ * Also see {@link #createFurlong()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getFurlong();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of length: inch.
+ * Returns by pointer, unit of length: inch.
* Caller owns returned value and must free it.
+ * Also see {@link #getInch()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createInch(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of length: inch.
+ * Also see {@link #createInch()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getInch();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of length: kilometer.
+ * Returns by pointer, unit of length: kilometer.
* Caller owns returned value and must free it.
+ * Also see {@link #getKilometer()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createKilometer(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of length: kilometer.
+ * Also see {@link #createKilometer()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getKilometer();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of length: light-year.
+ * Returns by pointer, unit of length: light-year.
* Caller owns returned value and must free it.
+ * Also see {@link #getLightYear()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createLightYear(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of length: meter.
+ * Returns by value, unit of length: light-year.
+ * Also see {@link #createLightYear()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getLightYear();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of length: meter.
* Caller owns returned value and must free it.
+ * Also see {@link #getMeter()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createMeter(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of length: meter.
+ * Also see {@link #createMeter()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMeter();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of length: micrometer.
+ * Returns by pointer, unit of length: micrometer.
* Caller owns returned value and must free it.
+ * Also see {@link #getMicrometer()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createMicrometer(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of length: mile.
+ * Returns by value, unit of length: micrometer.
+ * Also see {@link #createMicrometer()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMicrometer();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of length: mile.
* Caller owns returned value and must free it.
+ * Also see {@link #getMile()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createMile(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of length: mile.
+ * Also see {@link #createMile()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMile();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of length: mile-scandinavian.
+ * Returns by pointer, unit of length: mile-scandinavian.
* Caller owns returned value and must free it.
+ * Also see {@link #getMileScandinavian()}.
* @param status ICU error code.
* @stable ICU 56
*/
static MeasureUnit *createMileScandinavian(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of length: mile-scandinavian.
+ * Also see {@link #createMileScandinavian()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMileScandinavian();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of length: millimeter.
+ * Returns by pointer, unit of length: millimeter.
* Caller owns returned value and must free it.
+ * Also see {@link #getMillimeter()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createMillimeter(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of length: millimeter.
+ * Also see {@link #createMillimeter()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMillimeter();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of length: nanometer.
+ * Returns by pointer, unit of length: nanometer.
* Caller owns returned value and must free it.
+ * Also see {@link #getNanometer()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createNanometer(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of length: nanometer.
+ * Also see {@link #createNanometer()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getNanometer();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of length: nautical-mile.
+ * Returns by pointer, unit of length: nautical-mile.
* Caller owns returned value and must free it.
+ * Also see {@link #getNauticalMile()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createNauticalMile(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of length: parsec.
+ * Returns by value, unit of length: nautical-mile.
+ * Also see {@link #createNauticalMile()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getNauticalMile();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of length: parsec.
* Caller owns returned value and must free it.
+ * Also see {@link #getParsec()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createParsec(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of length: parsec.
+ * Also see {@link #createParsec()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getParsec();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of length: picometer.
+ * Returns by pointer, unit of length: picometer.
* Caller owns returned value and must free it.
+ * Also see {@link #getPicometer()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createPicometer(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of length: point.
+ * Returns by value, unit of length: picometer.
+ * Also see {@link #createPicometer()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getPicometer();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of length: point.
* Caller owns returned value and must free it.
+ * Also see {@link #getPoint()}.
* @param status ICU error code.
* @stable ICU 59
*/
static MeasureUnit *createPoint(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of length: point.
+ * Also see {@link #createPoint()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getPoint();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of length: yard.
+ * Returns by pointer, unit of length: solar-radius.
* Caller owns returned value and must free it.
+ * Also see {@link #getSolarRadius()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createSolarRadius(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of length: solar-radius.
+ * Also see {@link #createSolarRadius()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getSolarRadius();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of length: yard.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getYard()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createYard(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of length: yard.
+ * Also see {@link #createYard()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getYard();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of light: lux.
+ * Returns by pointer, unit of light: lux.
* Caller owns returned value and must free it.
+ * Also see {@link #getLux()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createLux(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of mass: carat.
+ * Returns by value, unit of light: lux.
+ * Also see {@link #createLux()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getLux();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of light: solar-luminosity.
* Caller owns returned value and must free it.
+ * Also see {@link #getSolarLuminosity()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createSolarLuminosity(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of light: solar-luminosity.
+ * Also see {@link #createSolarLuminosity()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getSolarLuminosity();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of mass: carat.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getCarat()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createCarat(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of mass: carat.
+ * Also see {@link #createCarat()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getCarat();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of mass: dalton.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getDalton()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createDalton(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of mass: dalton.
+ * Also see {@link #createDalton()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getDalton();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of mass: earth-mass.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getEarthMass()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createEarthMass(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of mass: earth-mass.
+ * Also see {@link #createEarthMass()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getEarthMass();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of mass: gram.
+ * Returns by pointer, unit of mass: gram.
* Caller owns returned value and must free it.
+ * Also see {@link #getGram()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createGram(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of mass: gram.
+ * Also see {@link #createGram()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getGram();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of mass: kilogram.
+ * Returns by pointer, unit of mass: kilogram.
* Caller owns returned value and must free it.
+ * Also see {@link #getKilogram()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createKilogram(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of mass: kilogram.
+ * Also see {@link #createKilogram()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getKilogram();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of mass: metric-ton.
+ * Returns by pointer, unit of mass: metric-ton.
* Caller owns returned value and must free it.
+ * Also see {@link #getMetricTon()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createMetricTon(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of mass: microgram.
+ * Returns by value, unit of mass: metric-ton.
+ * Also see {@link #createMetricTon()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMetricTon();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of mass: microgram.
* Caller owns returned value and must free it.
+ * Also see {@link #getMicrogram()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createMicrogram(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of mass: microgram.
+ * Also see {@link #createMicrogram()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMicrogram();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of mass: milligram.
+ * Returns by pointer, unit of mass: milligram.
* Caller owns returned value and must free it.
+ * Also see {@link #getMilligram()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createMilligram(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of mass: ounce.
+ * Returns by value, unit of mass: milligram.
+ * Also see {@link #createMilligram()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMilligram();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of mass: ounce.
* Caller owns returned value and must free it.
+ * Also see {@link #getOunce()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createOunce(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of mass: ounce.
+ * Also see {@link #createOunce()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getOunce();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of mass: ounce-troy.
+ * Returns by pointer, unit of mass: ounce-troy.
* Caller owns returned value and must free it.
+ * Also see {@link #getOunceTroy()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createOunceTroy(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of mass: ounce-troy.
+ * Also see {@link #createOunceTroy()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getOunceTroy();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of mass: pound.
+ * Returns by pointer, unit of mass: pound.
* Caller owns returned value and must free it.
+ * Also see {@link #getPound()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createPound(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of mass: stone.
+ * Returns by value, unit of mass: pound.
+ * Also see {@link #createPound()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getPound();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of mass: solar-mass.
* Caller owns returned value and must free it.
+ * Also see {@link #getSolarMass()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createSolarMass(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of mass: solar-mass.
+ * Also see {@link #createSolarMass()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getSolarMass();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of mass: stone.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getStone()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createStone(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of mass: stone.
+ * Also see {@link #createStone()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getStone();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of mass: ton.
+ * Returns by pointer, unit of mass: ton.
* Caller owns returned value and must free it.
+ * Also see {@link #getTon()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createTon(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of mass: ton.
+ * Also see {@link #createTon()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getTon();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of power: gigawatt.
+ * Returns by pointer, unit of power: gigawatt.
* Caller owns returned value and must free it.
+ * Also see {@link #getGigawatt()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createGigawatt(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of power: horsepower.
+ * Returns by value, unit of power: gigawatt.
+ * Also see {@link #createGigawatt()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getGigawatt();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of power: horsepower.
* Caller owns returned value and must free it.
+ * Also see {@link #getHorsepower()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createHorsepower(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of power: horsepower.
+ * Also see {@link #createHorsepower()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getHorsepower();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of power: kilowatt.
+ * Returns by pointer, unit of power: kilowatt.
* Caller owns returned value and must free it.
+ * Also see {@link #getKilowatt()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createKilowatt(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of power: megawatt.
+ * Returns by value, unit of power: kilowatt.
+ * Also see {@link #createKilowatt()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getKilowatt();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of power: megawatt.
* Caller owns returned value and must free it.
+ * Also see {@link #getMegawatt()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createMegawatt(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of power: milliwatt.
+ * Returns by value, unit of power: megawatt.
+ * Also see {@link #createMegawatt()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMegawatt();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of power: milliwatt.
* Caller owns returned value and must free it.
+ * Also see {@link #getMilliwatt()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createMilliwatt(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of power: milliwatt.
+ * Also see {@link #createMilliwatt()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMilliwatt();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of power: watt.
+ * Returns by pointer, unit of power: watt.
* Caller owns returned value and must free it.
+ * Also see {@link #getWatt()}.
* @param status ICU error code.
* @stable ICU 53
*/
@@ -1016,318 +2453,859 @@ class U_I18N_API MeasureUnit: public UObject {
#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of pressure: atmosphere.
+ * Returns by value, unit of power: watt.
+ * Also see {@link #createWatt()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getWatt();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of pressure: atmosphere.
* Caller owns returned value and must free it.
+ * Also see {@link #getAtmosphere()}.
* @param status ICU error code.
- * @draft ICU 63
+ * @stable ICU 63
*/
static MeasureUnit *createAtmosphere(UErrorCode &status);
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of pressure: atmosphere.
+ * Also see {@link #createAtmosphere()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getAtmosphere();
#endif /* U_HIDE_DRAFT_API */
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of pressure: hectopascal.
+ * Returns by pointer, unit of pressure: bar.
* Caller owns returned value and must free it.
+ * Also see {@link #getBar()}.
+ * @param status ICU error code.
+ * @draft ICU 65
+ */
+ static MeasureUnit *createBar(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of pressure: bar.
+ * Also see {@link #createBar()}.
+ * @draft ICU 65
+ */
+ static MeasureUnit getBar();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of pressure: hectopascal.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getHectopascal()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createHectopascal(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of pressure: inch-hg.
+ * Returns by value, unit of pressure: hectopascal.
+ * Also see {@link #createHectopascal()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getHectopascal();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of pressure: inch-hg.
* Caller owns returned value and must free it.
+ * Also see {@link #getInchHg()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createInchHg(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of pressure: inch-hg.
+ * Also see {@link #createInchHg()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getInchHg();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of pressure: kilopascal.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getKilopascal()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createKilopascal(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of pressure: kilopascal.
+ * Also see {@link #createKilopascal()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getKilopascal();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of pressure: megapascal.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getMegapascal()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createMegapascal(UErrorCode &status);
+
/**
- * Returns unit of pressure: millibar.
+ * Returns by value, unit of pressure: megapascal.
+ * Also see {@link #createMegapascal()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMegapascal();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of pressure: millibar.
* Caller owns returned value and must free it.
+ * Also see {@link #getMillibar()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createMillibar(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of pressure: millibar.
+ * Also see {@link #createMillibar()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMillibar();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of pressure: millimeter-of-mercury.
+ * Returns by pointer, unit of pressure: millimeter-of-mercury.
* Caller owns returned value and must free it.
+ * Also see {@link #getMillimeterOfMercury()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createMillimeterOfMercury(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of pressure: millimeter-of-mercury.
+ * Also see {@link #createMillimeterOfMercury()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMillimeterOfMercury();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of pressure: pascal.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getPascal()}.
+ * @param status ICU error code.
+ * @draft ICU 65
+ */
+ static MeasureUnit *createPascal(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of pressure: pascal.
+ * Also see {@link #createPascal()}.
+ * @draft ICU 65
+ */
+ static MeasureUnit getPascal();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of pressure: pound-per-square-inch.
+ * Returns by pointer, unit of pressure: pound-per-square-inch.
* Caller owns returned value and must free it.
+ * Also see {@link #getPoundPerSquareInch()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createPoundPerSquareInch(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of speed: kilometer-per-hour.
+ * Returns by value, unit of pressure: pound-per-square-inch.
+ * Also see {@link #createPoundPerSquareInch()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getPoundPerSquareInch();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of speed: kilometer-per-hour.
* Caller owns returned value and must free it.
+ * Also see {@link #getKilometerPerHour()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createKilometerPerHour(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of speed: kilometer-per-hour.
+ * Also see {@link #createKilometerPerHour()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getKilometerPerHour();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of speed: knot.
+ * Returns by pointer, unit of speed: knot.
* Caller owns returned value and must free it.
+ * Also see {@link #getKnot()}.
* @param status ICU error code.
* @stable ICU 56
*/
static MeasureUnit *createKnot(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of speed: meter-per-second.
+ * Returns by value, unit of speed: knot.
+ * Also see {@link #createKnot()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getKnot();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of speed: meter-per-second.
* Caller owns returned value and must free it.
+ * Also see {@link #getMeterPerSecond()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createMeterPerSecond(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of speed: mile-per-hour.
+ * Returns by value, unit of speed: meter-per-second.
+ * Also see {@link #createMeterPerSecond()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMeterPerSecond();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of speed: mile-per-hour.
* Caller owns returned value and must free it.
+ * Also see {@link #getMilePerHour()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createMilePerHour(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of speed: mile-per-hour.
+ * Also see {@link #createMilePerHour()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMilePerHour();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of temperature: celsius.
+ * Returns by pointer, unit of temperature: celsius.
* Caller owns returned value and must free it.
+ * Also see {@link #getCelsius()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createCelsius(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of temperature: celsius.
+ * Also see {@link #createCelsius()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getCelsius();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of temperature: fahrenheit.
+ * Returns by pointer, unit of temperature: fahrenheit.
* Caller owns returned value and must free it.
+ * Also see {@link #getFahrenheit()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createFahrenheit(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of temperature: fahrenheit.
+ * Also see {@link #createFahrenheit()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getFahrenheit();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of temperature: generic.
+ * Returns by pointer, unit of temperature: generic.
* Caller owns returned value and must free it.
+ * Also see {@link #getGenericTemperature()}.
* @param status ICU error code.
* @stable ICU 56
*/
static MeasureUnit *createGenericTemperature(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of temperature: kelvin.
+ * Returns by value, unit of temperature: generic.
+ * Also see {@link #createGenericTemperature()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getGenericTemperature();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of temperature: kelvin.
* Caller owns returned value and must free it.
+ * Also see {@link #getKelvin()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createKelvin(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of temperature: kelvin.
+ * Also see {@link #createKelvin()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getKelvin();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of volume: acre-foot.
+ * Returns by pointer, unit of torque: newton-meter.
* Caller owns returned value and must free it.
+ * Also see {@link #getNewtonMeter()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createNewtonMeter(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of torque: newton-meter.
+ * Also see {@link #createNewtonMeter()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getNewtonMeter();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of torque: pound-foot.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getPoundFoot()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createPoundFoot(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of torque: pound-foot.
+ * Also see {@link #createPoundFoot()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getPoundFoot();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of volume: acre-foot.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getAcreFoot()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createAcreFoot(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of volume: bushel.
+ * Returns by value, unit of volume: acre-foot.
+ * Also see {@link #createAcreFoot()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getAcreFoot();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of volume: barrel.
* Caller owns returned value and must free it.
+ * Also see {@link #getBarrel()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createBarrel(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of volume: barrel.
+ * Also see {@link #createBarrel()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getBarrel();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of volume: bushel.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getBushel()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createBushel(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of volume: centiliter.
+ * Returns by value, unit of volume: bushel.
+ * Also see {@link #createBushel()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getBushel();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of volume: centiliter.
* Caller owns returned value and must free it.
+ * Also see {@link #getCentiliter()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createCentiliter(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of volume: centiliter.
+ * Also see {@link #createCentiliter()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getCentiliter();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of volume: cubic-centimeter.
+ * Returns by pointer, unit of volume: cubic-centimeter.
* Caller owns returned value and must free it.
+ * Also see {@link #getCubicCentimeter()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createCubicCentimeter(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of volume: cubic-centimeter.
+ * Also see {@link #createCubicCentimeter()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getCubicCentimeter();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of volume: cubic-foot.
+ * Returns by pointer, unit of volume: cubic-foot.
* Caller owns returned value and must free it.
+ * Also see {@link #getCubicFoot()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createCubicFoot(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of volume: cubic-foot.
+ * Also see {@link #createCubicFoot()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getCubicFoot();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of volume: cubic-inch.
+ * Returns by pointer, unit of volume: cubic-inch.
* Caller owns returned value and must free it.
+ * Also see {@link #getCubicInch()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createCubicInch(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of volume: cubic-inch.
+ * Also see {@link #createCubicInch()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getCubicInch();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of volume: cubic-kilometer.
+ * Returns by pointer, unit of volume: cubic-kilometer.
* Caller owns returned value and must free it.
+ * Also see {@link #getCubicKilometer()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createCubicKilometer(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of volume: cubic-meter.
+ * Returns by value, unit of volume: cubic-kilometer.
+ * Also see {@link #createCubicKilometer()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getCubicKilometer();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of volume: cubic-meter.
* Caller owns returned value and must free it.
+ * Also see {@link #getCubicMeter()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createCubicMeter(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of volume: cubic-mile.
+ * Returns by value, unit of volume: cubic-meter.
+ * Also see {@link #createCubicMeter()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getCubicMeter();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of volume: cubic-mile.
* Caller owns returned value and must free it.
+ * Also see {@link #getCubicMile()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createCubicMile(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of volume: cubic-yard.
+ * Returns by value, unit of volume: cubic-mile.
+ * Also see {@link #createCubicMile()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getCubicMile();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of volume: cubic-yard.
* Caller owns returned value and must free it.
+ * Also see {@link #getCubicYard()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createCubicYard(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of volume: cubic-yard.
+ * Also see {@link #createCubicYard()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getCubicYard();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of volume: cup.
+ * Returns by pointer, unit of volume: cup.
* Caller owns returned value and must free it.
+ * Also see {@link #getCup()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createCup(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of volume: cup.
+ * Also see {@link #createCup()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getCup();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of volume: cup-metric.
+ * Returns by pointer, unit of volume: cup-metric.
* Caller owns returned value and must free it.
+ * Also see {@link #getCupMetric()}.
* @param status ICU error code.
* @stable ICU 56
*/
static MeasureUnit *createCupMetric(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of volume: cup-metric.
+ * Also see {@link #createCupMetric()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getCupMetric();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of volume: deciliter.
+ * Returns by pointer, unit of volume: deciliter.
* Caller owns returned value and must free it.
+ * Also see {@link #getDeciliter()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createDeciliter(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of volume: fluid-ounce.
+ * Returns by value, unit of volume: deciliter.
+ * Also see {@link #createDeciliter()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getDeciliter();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of volume: fluid-ounce.
* Caller owns returned value and must free it.
+ * Also see {@link #getFluidOunce()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createFluidOunce(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of volume: fluid-ounce.
+ * Also see {@link #createFluidOunce()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getFluidOunce();
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of volume: fluid-ounce-imperial.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getFluidOunceImperial()}.
+ * @param status ICU error code.
+ * @draft ICU 64
+ */
+ static MeasureUnit *createFluidOunceImperial(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of volume: fluid-ounce-imperial.
+ * Also see {@link #createFluidOunceImperial()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getFluidOunceImperial();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of volume: gallon.
+ * Returns by pointer, unit of volume: gallon.
* Caller owns returned value and must free it.
+ * Also see {@link #getGallon()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createGallon(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of volume: gallon-imperial.
+ * Returns by value, unit of volume: gallon.
+ * Also see {@link #createGallon()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getGallon();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of volume: gallon-imperial.
* Caller owns returned value and must free it.
+ * Also see {@link #getGallonImperial()}.
* @param status ICU error code.
* @stable ICU 57
*/
static MeasureUnit *createGallonImperial(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of volume: gallon-imperial.
+ * Also see {@link #createGallonImperial()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getGallonImperial();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of volume: hectoliter.
+ * Returns by pointer, unit of volume: hectoliter.
* Caller owns returned value and must free it.
+ * Also see {@link #getHectoliter()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createHectoliter(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of volume: hectoliter.
+ * Also see {@link #createHectoliter()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getHectoliter();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of volume: liter.
+ * Returns by pointer, unit of volume: liter.
* Caller owns returned value and must free it.
+ * Also see {@link #getLiter()}.
* @param status ICU error code.
* @stable ICU 53
*/
static MeasureUnit *createLiter(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of volume: liter.
+ * Also see {@link #createLiter()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getLiter();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of volume: megaliter.
+ * Returns by pointer, unit of volume: megaliter.
* Caller owns returned value and must free it.
+ * Also see {@link #getMegaliter()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createMegaliter(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of volume: milliliter.
+ * Returns by value, unit of volume: megaliter.
+ * Also see {@link #createMegaliter()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMegaliter();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of volume: milliliter.
* Caller owns returned value and must free it.
+ * Also see {@link #getMilliliter()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createMilliliter(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of volume: pint.
+ * Returns by value, unit of volume: milliliter.
+ * Also see {@link #createMilliliter()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getMilliliter();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of volume: pint.
* Caller owns returned value and must free it.
+ * Also see {@link #getPint()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createPint(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of volume: pint.
+ * Also see {@link #createPint()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getPint();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of volume: pint-metric.
+ * Returns by pointer, unit of volume: pint-metric.
* Caller owns returned value and must free it.
+ * Also see {@link #getPintMetric()}.
* @param status ICU error code.
* @stable ICU 56
*/
static MeasureUnit *createPintMetric(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of volume: quart.
+ * Returns by value, unit of volume: pint-metric.
+ * Also see {@link #createPintMetric()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getPintMetric();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of volume: quart.
* Caller owns returned value and must free it.
+ * Also see {@link #getQuart()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createQuart(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
/**
- * Returns unit of volume: tablespoon.
+ * Returns by value, unit of volume: quart.
+ * Also see {@link #createQuart()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getQuart();
+#endif /* U_HIDE_DRAFT_API */
+
+ /**
+ * Returns by pointer, unit of volume: tablespoon.
* Caller owns returned value and must free it.
+ * Also see {@link #getTablespoon()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createTablespoon(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of volume: tablespoon.
+ * Also see {@link #createTablespoon()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getTablespoon();
+#endif /* U_HIDE_DRAFT_API */
+
/**
- * Returns unit of volume: teaspoon.
+ * Returns by pointer, unit of volume: teaspoon.
* Caller owns returned value and must free it.
+ * Also see {@link #getTeaspoon()}.
* @param status ICU error code.
* @stable ICU 54
*/
static MeasureUnit *createTeaspoon(UErrorCode &status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by value, unit of volume: teaspoon.
+ * Also see {@link #createTeaspoon()}.
+ * @draft ICU 64
+ */
+ static MeasureUnit getTeaspoon();
+#endif /* U_HIDE_DRAFT_API */
+
// End generated createXXX methods
@@ -1370,4 +3348,7 @@ private:
U_NAMESPACE_END
#endif // !UNCONFIG_NO_FORMATTING
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __MEASUREUNIT_H__
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/measure.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/measure.h
index 99b7d7a1439..fa9c29351e3 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/measure.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/measure.h
@@ -15,6 +15,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: MeasureUnit object.
@@ -72,7 +74,7 @@ class U_I18N_API Measure: public UObject {
* have the same class as returned by getDynamicClassID().
* @stable ICU 3.0
*/
- virtual UObject* clone() const;
+ virtual Measure* clone() const;
/**
* Destructor
@@ -158,4 +160,7 @@ inline const MeasureUnit& Measure::getUnit() const {
U_NAMESPACE_END
#endif // !UCONFIG_NO_FORMATTING
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __MEASURE_H__
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/msgfmt.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/msgfmt.h
index 074d9335400..99b0eaeec1d 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/msgfmt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/msgfmt.h
@@ -21,6 +21,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Formats messages in a language-neutral way.
@@ -69,9 +71,8 @@ class NumberFormat;
* if the pattern has named arguments (see {@link #usesNamedArguments()}).
*
* <p>An argument might not specify any format type. In this case,
- * a Number value is formatted with a default (for the locale) NumberFormat,
- * a Date value is formatted with a default (for the locale) DateFormat,
- * and for any other value its toString() value is used.
+ * a numeric value is formatted with a default (for the locale) NumberFormat,
+ * and a date/time value is formatted with a default (for the locale) DateFormat.
*
* <p>An argument might specify a "simple" type for which the specified
* Format object is created, cached and used.
@@ -185,7 +186,7 @@ class NumberFormat;
* <td><i>argSkeletonText</i>
* <td><code>NumberFormatter::forSkeleton(argSkeletonText, status).locale(getLocale()).toFormat(status)</code>
* <tr>
- * <td rowspan=6><code>date</code>
+ * <td rowspan=7><code>date</code>
* <td><i>(none)</i>
* <td><code>DateFormat.createDateInstance(kDefault, getLocale(), status)</code>
* <tr>
@@ -204,6 +205,9 @@ class NumberFormat;
* <td><i>argStyleText</i>
* <td><code>new SimpleDateFormat(argStyleText, getLocale(), status)</code>
* <tr>
+ * <td><i>argSkeletonText</i>
+ * <td><code>DateFormat::createInstanceForSkeleton(argSkeletonText, getLocale(), status)</code>
+ * <tr>
* <td rowspan=6><code>time</code>
* <td><i>(none)</i>
* <td><code>DateFormat.createTimeInstance(kDefault, getLocale(), status)</code>
@@ -240,6 +244,19 @@ class NumberFormat;
* </table>
* <p>
*
+ * <h4>Argument formatting</h4>
+ *
+ * <p>Arguments are formatted according to their type, using the default
+ * ICU formatters for those types, unless otherwise specified.</p>
+ *
+ * <p>There are also several ways to control the formatting.</p>
+ *
+ * <p>We recommend you use default styles, predefined style values, skeletons,
+ * or preformatted values, but not pattern strings or custom format objects.</p>
+ *
+ * <p>For more details, see the
+ * <a href="http://userguide.icu-project.org/formatparse/messages">ICU User Guide</a>.</p>
+ *
* <h4>Usage Information</h4>
*
* <p>Here are some examples of usage:
@@ -257,11 +274,11 @@ class NumberFormat;
*
* UnicodeString result;
* MessageFormat::format(
- * "At {1,time} on {1,date}, there was {2} on planet {0,number}.",
+ * "At {1,time,::jmm} on {1,date,::dMMMM}, there was {2} on planet {0,number}.",
* arguments, 3, result, success );
*
* cout << "result: " << result << endl;
- * //<output>: At 4:34:20 PM on 23-Mar-98, there was a disturbance
+ * //<output>: At 4:34 PM on March 23, there was a disturbance
* // in the Force on planet 7.
* \endcode
* </pre>
@@ -403,7 +420,7 @@ public:
* result and should delete it when done.
* @stable ICU 2.0
*/
- virtual Format* clone(void) const;
+ virtual MessageFormat* clone() const;
/**
* Returns true if the given Format objects are semantically equal.
@@ -994,6 +1011,8 @@ private:
void cacheExplicitFormats(UErrorCode& status);
+ int32_t skipLeadingSpaces(UnicodeString& style);
+
Format* createAppropriateFormat(UnicodeString& type,
UnicodeString& style,
Formattable::Type& formattableType,
@@ -1070,7 +1089,7 @@ private:
class U_I18N_API DummyFormat : public Format {
public:
virtual UBool operator==(const Format&) const;
- virtual Format* clone() const;
+ virtual DummyFormat* clone() const;
virtual UnicodeString& format(const Formattable& obj,
UnicodeString& appendTo,
UErrorCode& status) const;
@@ -1094,5 +1113,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _MSGFMT
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/nounit.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/nounit.h
index 288f268d66d..61b5c16ee39 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/nounit.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/nounit.h
@@ -12,10 +12,14 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_FORMATTING
#include "unicode/measunit.h"
+#ifndef U_HIDE_DRAFT_API
+
/**
* \file
* \brief C++ API: units for percent and permille
@@ -23,7 +27,6 @@
U_NAMESPACE_BEGIN
-#ifndef U_HIDE_DRAFT_API
/**
* Dimensionless unit for percent and permille.
* @see NumberFormatter
@@ -72,7 +75,7 @@ public:
* have the same class as returned by getDynamicClassID().
* @draft ICU 60
*/
- virtual UObject* clone() const;
+ virtual NoUnit* clone() const;
/**
* Returns a unique class ID for this object POLYMORPHICALLY.
@@ -100,12 +103,14 @@ private:
NoUnit(const char* subtype);
};
-#endif /* U_HIDE_DRAFT_API */
U_NAMESPACE_END
+#endif /* U_HIDE_DRAFT_API */
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __NOUNIT_H__
//eof
//
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/numberformatter.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/numberformatter.h
index 469949a2878..6d48f18ab55 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/numberformatter.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/numberformatter.h
@@ -1,27 +1,31 @@
// © 2017 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
+#ifndef __NUMBERFORMATTER_H__
+#define __NUMBERFORMATTER_H__
+
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_FORMATTING
-#ifndef __NUMBERFORMATTER_H__
-#define __NUMBERFORMATTER_H__
#include "unicode/appendable.h"
-#include "unicode/dcfmtsym.h"
+#include "unicode/bytestream.h"
#include "unicode/currunit.h"
+#include "unicode/dcfmtsym.h"
#include "unicode/fieldpos.h"
+#include "unicode/formattedvalue.h"
#include "unicode/fpositer.h"
#include "unicode/measunit.h"
#include "unicode/nounit.h"
+#include "unicode/parseerr.h"
#include "unicode/plurrule.h"
#include "unicode/ucurr.h"
#include "unicode/unum.h"
#include "unicode/unumberformatter.h"
#include "unicode/uobject.h"
-#ifndef U_HIDE_DRAFT_API
-
/**
* \file
* \brief C++ API: Library for localized number formatting introduced in ICU 60.
@@ -42,25 +46,27 @@
* .format(1234)
* .toString(); // €1.2K in en-US
*
- * // Create a formatter in a singleton for use later:
+ * // Create a formatter in a singleton by value for use later:
* static const LocalizedNumberFormatter formatter = NumberFormatter::withLocale(...)
* .unit(NoUnit::percent())
* .precision(Precision::fixedFraction(3));
* formatter.format(5.9831).toString(); // 5.983% in en-US
*
- * // Create a "template" in a singleton but without setting a locale until the call site:
- * static const UnlocalizedNumberFormatter template = NumberFormatter::with()
+ * // Create a "template" in a singleton unique_ptr but without setting a locale until the call site:
+ * std::unique_ptr<UnlocalizedNumberFormatter> template = NumberFormatter::with()
* .sign(UNumberSignDisplay::UNUM_SIGN_ALWAYS)
- * .adoptUnit(MeasureUnit::createMeter(status))
- * .unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME);
- * template.locale(...).format(1234).toString(); // +1,234 meters in en-US
+ * .unit(MeasureUnit::getMeter())
+ * .unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME)
+ * .clone();
+ * template->locale(...).format(1234).toString(); // +1,234 meters in en-US
* </pre>
*
* <p>
* This API offers more features than DecimalFormat and is geared toward new users of ICU.
*
* <p>
- * NumberFormatter instances are immutable and thread safe. This means that invoking a configuration method has no
+ * NumberFormatter instances (i.e., LocalizedNumberFormatter and UnlocalizedNumberFormatter)
+ * are immutable and thread safe. This means that invoking a configuration method has no
* effect on the receiving instance; you must store and use the new number formatter instance it returns instead.
*
* <pre>
@@ -81,6 +87,7 @@ U_NAMESPACE_BEGIN
// Forward declarations:
class IFixedDecimal;
class FieldPositionIteratorHandler;
+class FormattedStringBuilder;
namespace numparse {
namespace impl {
@@ -108,6 +115,7 @@ class IntegerWidth;
namespace impl {
+// can't be #ifndef U_HIDE_INTERNAL_API; referenced throughout this file in public classes
/**
* Datatype for minimum/maximum fraction digits. Must be able to hold kMaxIntFracSig.
*
@@ -115,20 +123,21 @@ namespace impl {
*/
typedef int16_t digits_t;
+// can't be #ifndef U_HIDE_INTERNAL_API; needed for struct initialization
/**
* Use a default threshold of 3. This means that the third time .format() is called, the data structures get built
* using the "safe" code path. The first two calls to .format() will trigger the unsafe code path.
*
* @internal
*/
-static constexpr int32_t DEFAULT_THRESHOLD = 3;
+static constexpr int32_t kInternalDefaultThreshold = 3;
// Forward declarations:
class Padder;
struct MacroProps;
struct MicroProps;
class DecimalQuantity;
-struct UFormattedNumberData;
+class UFormattedNumberData;
class NumberFormatterImpl;
struct ParsedPatternInfo;
class ScientificModifier;
@@ -136,7 +145,6 @@ class MultiplierProducer;
class RoundingImpl;
class ScientificHandler;
class Modifier;
-class NumberStringBuilder;
class AffixPatternProvider;
class NumberPropertyMapper;
struct DecimalFormatProperties;
@@ -146,6 +154,7 @@ class GeneratorHelpers;
class DecNum;
class NumberRangeFormatterImpl;
struct RangeMacroProps;
+struct UFormattedNumberImpl;
/**
* Used for NumberRangeFormatter and implemented in numrange_fluent.cpp.
@@ -160,21 +169,21 @@ void touchRangeLocales(impl::RangeMacroProps& macros);
/**
* Extra name reserved in case it is needed in the future.
*
- * @draft ICU 63
+ * @stable ICU 63
*/
typedef Notation CompactNotation;
/**
* Extra name reserved in case it is needed in the future.
*
- * @draft ICU 63
+ * @stable ICU 63
*/
typedef Notation SimpleNotation;
/**
* A class that defines the notation style to be used when formatting numbers in NumberFormatter.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
class U_I18N_API Notation : public UMemory {
public:
@@ -200,7 +209,7 @@ class U_I18N_API Notation : public UMemory {
* </pre>
*
* @return A ScientificNotation for chaining or passing to the NumberFormatter notation() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
static ScientificNotation scientific();
@@ -224,7 +233,7 @@ class U_I18N_API Notation : public UMemory {
* </pre>
*
* @return A ScientificNotation for chaining or passing to the NumberFormatter notation() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
static ScientificNotation engineering();
@@ -267,7 +276,7 @@ class U_I18N_API Notation : public UMemory {
* </pre>
*
* @return A CompactNotation for passing to the NumberFormatter notation() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
static CompactNotation compactShort();
@@ -291,7 +300,7 @@ class U_I18N_API Notation : public UMemory {
* </pre>
*
* @return A CompactNotation for passing to the NumberFormatter notation() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
static CompactNotation compactLong();
@@ -317,7 +326,7 @@ class U_I18N_API Notation : public UMemory {
* </pre>
*
* @return A SimpleNotation for passing to the NumberFormatter notation() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
static SimpleNotation simple();
@@ -384,7 +393,7 @@ class U_I18N_API Notation : public UMemory {
* <p>
* To create a ScientificNotation, use one of the factory methods in {@link Notation}.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
class U_I18N_API ScientificNotation : public Notation {
public:
@@ -399,7 +408,7 @@ class U_I18N_API ScientificNotation : public Notation {
* @param minExponentDigits
* The minimum number of digits to show in the exponent.
* @return A ScientificNotation, for chaining.
- * @draft ICU 60
+ * @stable ICU 60
*/
ScientificNotation withMinExponentDigits(int32_t minExponentDigits) const;
@@ -414,7 +423,7 @@ class U_I18N_API ScientificNotation : public Notation {
* @param exponentSignDisplay
* The strategy for displaying the sign in the exponent.
* @return A ScientificNotation, for chaining.
- * @draft ICU 60
+ * @stable ICU 60
*/
ScientificNotation withExponentSignDisplay(UNumberSignDisplay exponentSignDisplay) const;
@@ -435,45 +444,17 @@ class U_I18N_API ScientificNotation : public Notation {
/**
* Extra name reserved in case it is needed in the future.
*
- * @draft ICU 63
+ * @stable ICU 63
*/
typedef Precision SignificantDigitsPrecision;
-// Typedefs for ICU 60/61 compatibility.
-// These will be removed in ICU 64.
-// See http://bugs.icu-project.org/trac/ticket/13746
-
-/**
- * This will be removed in ICU 64. See ICU-13746.
- * @deprecated ICU 63
- */
-typedef Precision Rounder;
-
-/**
- * This will be removed in ICU 64. See ICU-13746.
- * @deprecated ICU 63
- */
-typedef FractionPrecision FractionRounder;
-
-/**
- * This will be removed in ICU 64. See ICU-13746.
- * @deprecated ICU 63
- */
-typedef IncrementPrecision IncrementRounder;
-
-/**
- * This will be removed in ICU 64. See ICU-13746.
- * @deprecated ICU 63
- */
-typedef CurrencyPrecision CurrencyRounder;
-
/**
* A class that defines the rounding precision to be used when formatting numbers in NumberFormatter.
*
* <p>
* To create a Precision, use one of the factory methods.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
class U_I18N_API Precision : public UMemory {
@@ -483,16 +464,17 @@ class U_I18N_API Precision : public UMemory {
*
* <p>
* <strong>NOTE:</strong> When formatting a <em>double</em>, this method, along with {@link #minFraction} and
- * {@link #minDigits}, will trigger complex algorithm similar to <em>Dragon4</em> to determine the low-order digits
- * and the number of digits to display based on the value of the double. If the number of fraction places or
- * significant digits can be bounded, consider using {@link #maxFraction} or {@link #maxDigits} instead to maximize
- * performance. For more information, read the following blog post.
+ * {@link #minSignificantDigits}, will trigger complex algorithm similar to <em>Dragon4</em> to determine the
+ * low-order digits and the number of digits to display based on the value of the double.
+ * If the number of fraction places or significant digits can be bounded, consider using {@link #maxFraction}
+ * or {@link #maxSignificantDigits} instead to maximize performance.
+ * For more information, read the following blog post.
*
* <p>
* http://www.serpentine.com/blog/2011/06/29/here-be-dragons-advances-in-problems-you-didnt-even-know-you-had/
*
* @return A Precision for chaining or passing to the NumberFormatter precision() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
static Precision unlimited();
@@ -500,7 +482,7 @@ class U_I18N_API Precision : public UMemory {
* Show numbers rounded if necessary to the nearest integer.
*
* @return A FractionPrecision for chaining or passing to the NumberFormatter precision() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
static FractionPrecision integer();
@@ -529,7 +511,7 @@ class U_I18N_API Precision : public UMemory {
* The minimum and maximum number of numerals to display after the decimal separator (rounding if too
* long or padding with zeros if too short).
* @return A FractionPrecision for chaining or passing to the NumberFormatter precision() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
static FractionPrecision fixedFraction(int32_t minMaxFractionPlaces);
@@ -544,7 +526,7 @@ class U_I18N_API Precision : public UMemory {
* The minimum number of numerals to display after the decimal separator (padding with zeros if
* necessary).
* @return A FractionPrecision for chaining or passing to the NumberFormatter precision() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
static FractionPrecision minFraction(int32_t minFractionPlaces);
@@ -556,7 +538,7 @@ class U_I18N_API Precision : public UMemory {
* @param maxFractionPlaces
* The maximum number of numerals to display after the decimal mark (rounding if necessary).
* @return A FractionPrecision for chaining or passing to the NumberFormatter precision() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
static FractionPrecision maxFraction(int32_t maxFractionPlaces);
@@ -571,7 +553,7 @@ class U_I18N_API Precision : public UMemory {
* @param maxFractionPlaces
* The maximum number of numerals to display after the decimal separator (rounding if necessary).
* @return A FractionPrecision for chaining or passing to the NumberFormatter precision() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
static FractionPrecision minMaxFraction(int32_t minFractionPlaces, int32_t maxFractionPlaces);
@@ -580,13 +562,13 @@ class U_I18N_API Precision : public UMemory {
* pad with zeros to ensure that this number of significant digits/figures are always shown.
*
* <p>
- * This method is equivalent to {@link #minMaxDigits} with both arguments equal.
+ * This method is equivalent to {@link #minMaxSignificantDigits} with both arguments equal.
*
* @param minMaxSignificantDigits
* The minimum and maximum number of significant digits to display (rounding if too long or padding with
* zeros if too short).
* @return A precision for chaining or passing to the NumberFormatter precision() setter.
- * @draft ICU 62
+ * @stable ICU 62
*/
static SignificantDigitsPrecision fixedSignificantDigits(int32_t minMaxSignificantDigits);
@@ -600,7 +582,7 @@ class U_I18N_API Precision : public UMemory {
* @param minSignificantDigits
* The minimum number of significant digits to display (padding with zeros if too short).
* @return A precision for chaining or passing to the NumberFormatter precision() setter.
- * @draft ICU 62
+ * @stable ICU 62
*/
static SignificantDigitsPrecision minSignificantDigits(int32_t minSignificantDigits);
@@ -610,7 +592,7 @@ class U_I18N_API Precision : public UMemory {
* @param maxSignificantDigits
* The maximum number of significant digits to display (rounding if too long).
* @return A precision for chaining or passing to the NumberFormatter precision() setter.
- * @draft ICU 62
+ * @stable ICU 62
*/
static SignificantDigitsPrecision maxSignificantDigits(int32_t maxSignificantDigits);
@@ -623,36 +605,11 @@ class U_I18N_API Precision : public UMemory {
* @param maxSignificantDigits
* The maximum number of significant digits to display (rounding if necessary).
* @return A precision for chaining or passing to the NumberFormatter precision() setter.
- * @draft ICU 62
+ * @stable ICU 62
*/
static SignificantDigitsPrecision minMaxSignificantDigits(int32_t minSignificantDigits,
int32_t maxSignificantDigits);
-#ifndef U_HIDE_DEPRECATED_API
- // Compatiblity methods that will be removed in ICU 64.
- // See http://bugs.icu-project.org/trac/ticket/13746
-
- /** @deprecated ICU 62 */
- static inline SignificantDigitsPrecision fixedDigits(int32_t a) {
- return fixedSignificantDigits(a);
- }
-
- /** @deprecated ICU 62 */
- static inline SignificantDigitsPrecision minDigits(int32_t a) {
- return minSignificantDigits(a);
- }
-
- /** @deprecated ICU 62 */
- static inline SignificantDigitsPrecision maxDigits(int32_t a) {
- return maxSignificantDigits(a);
- }
-
- /** @deprecated ICU 62 */
- static inline SignificantDigitsPrecision minMaxDigits(int32_t a, int32_t b) {
- return minMaxSignificantDigits(a, b);
- }
-#endif /* U_HIDE_DEPRECATED_API */
-
/**
* Show numbers rounded if necessary to the closest multiple of a certain rounding increment. For example, if the
* rounding increment is 0.5, then round 1.2 to 1 and round 1.3 to 1.5.
@@ -670,7 +627,7 @@ class U_I18N_API Precision : public UMemory {
* @param roundingIncrement
* The increment to which to round numbers.
* @return A precision for chaining or passing to the NumberFormatter precision() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
static IncrementPrecision increment(double roundingIncrement);
@@ -689,25 +646,10 @@ class U_I18N_API Precision : public UMemory {
* Either STANDARD (for digital transactions) or CASH (for transactions where the rounding increment may
* be limited by the available denominations of cash or coins).
* @return A CurrencyPrecision for chaining or passing to the NumberFormatter precision() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
static CurrencyPrecision currency(UCurrencyUsage currencyUsage);
-#ifndef U_HIDE_DEPRECATED_API
- /**
- * Sets the rounding mode to use when picking the direction to round (up or down). Common values
- * include HALF_EVEN, HALF_UP, and FLOOR. The default is HALF_EVEN.
- *
- * @param roundingMode
- * The RoundingMode to use.
- * @return A Precision for passing to the NumberFormatter precision() setter.
- * @deprecated ICU 62 Use the top-level roundingMode() setting instead.
- * This method will be removed in ICU 64.
- * See http://bugs.icu-project.org/trac/ticket/13746
- */
- Precision withMode(UNumberFormatRoundingMode roundingMode) const;
-#endif /* U_HIDE_DEPRECATED_API */
-
private:
enum PrecisionType {
RND_BOGUS,
@@ -715,7 +657,18 @@ class U_I18N_API Precision : public UMemory {
RND_FRACTION,
RND_SIGNIFICANT,
RND_FRACTION_SIGNIFICANT,
+
+ // Used for strange increments like 3.14.
RND_INCREMENT,
+
+ // Used for increments with 1 as the only digit. This is different than fraction
+ // rounding because it supports having additional trailing zeros. For example, this
+ // class is used to round with the increment 0.010.
+ RND_INCREMENT_ONE,
+
+ // Used for increments with 5 as the only digit (nickel rounding).
+ RND_INCREMENT_FIVE,
+
RND_CURRENCY,
RND_ERROR
} fType;
@@ -735,13 +688,14 @@ class U_I18N_API Precision : public UMemory {
} fracSig;
/** @internal */
struct IncrementSettings {
+ // For RND_INCREMENT, RND_INCREMENT_ONE, and RND_INCREMENT_FIVE
/** @internal */
double fIncrement;
/** @internal */
impl::digits_t fMinFrac;
/** @internal */
impl::digits_t fMaxFrac;
- } increment; // For RND_INCREMENT
+ } increment;
UCurrencyUsage currencyUsage; // For RND_CURRENCY
UErrorCode errorCode; // For RND_ERROR
} fUnion;
@@ -819,7 +773,7 @@ class U_I18N_API Precision : public UMemory {
* <p>
* To create a FractionPrecision, use one of the factory methods on Precision.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
class U_I18N_API FractionPrecision : public Precision {
public:
@@ -837,7 +791,7 @@ class U_I18N_API FractionPrecision : public Precision {
* @param minSignificantDigits
* The number of significant figures to guarantee.
* @return A precision for chaining or passing to the NumberFormatter precision() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
Precision withMinDigits(int32_t minSignificantDigits) const;
@@ -856,7 +810,7 @@ class U_I18N_API FractionPrecision : public Precision {
* @param maxSignificantDigits
* Round the number to no more than this number of significant figures.
* @return A precision for chaining or passing to the NumberFormatter precision() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
Precision withMaxDigits(int32_t maxSignificantDigits) const;
@@ -875,7 +829,7 @@ class U_I18N_API FractionPrecision : public Precision {
* <p>
* To create a CurrencyPrecision, use one of the factory methods on Precision.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
class U_I18N_API CurrencyPrecision : public Precision {
public:
@@ -894,7 +848,7 @@ class U_I18N_API CurrencyPrecision : public Precision {
* @param currency
* The currency to associate with this rounding precision.
* @return A precision for chaining or passing to the NumberFormatter precision() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
Precision withCurrency(const CurrencyUnit &currency) const;
@@ -913,7 +867,7 @@ class U_I18N_API CurrencyPrecision : public Precision {
* <p>
* To create an IncrementPrecision, use one of the factory methods on Precision.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
class U_I18N_API IncrementPrecision : public Precision {
public:
@@ -930,7 +884,7 @@ class U_I18N_API IncrementPrecision : public Precision {
*
* @param minFrac The minimum number of digits after the decimal separator.
* @return A precision for chaining or passing to the NumberFormatter precision() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
Precision withMinFraction(int32_t minFrac) const;
@@ -948,7 +902,7 @@ class U_I18N_API IncrementPrecision : public Precision {
* <p>
* To create an IntegerWidth, use one of the factory methods.
*
- * @draft ICU 60
+ * @stable ICU 60
* @see NumberFormatter
*/
class U_I18N_API IntegerWidth : public UMemory {
@@ -962,7 +916,7 @@ class U_I18N_API IntegerWidth : public UMemory {
* @param minInt
* The minimum number of places before the decimal separator.
* @return An IntegerWidth for chaining or passing to the NumberFormatter integerWidth() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
static IntegerWidth zeroFillTo(int32_t minInt);
@@ -975,7 +929,7 @@ class U_I18N_API IntegerWidth : public UMemory {
* The maximum number of places before the decimal separator. maxInt == -1 means no
* truncation.
* @return An IntegerWidth for passing to the NumberFormatter integerWidth() setter.
- * @draft ICU 60
+ * @stable ICU 60
*/
IntegerWidth truncateAt(int32_t maxInt);
@@ -1042,7 +996,7 @@ class U_I18N_API IntegerWidth : public UMemory {
* <p>
* To create a Scale, use one of the factory methods.
*
- * @draft ICU 62
+ * @stable ICU 62
*/
class U_I18N_API Scale : public UMemory {
public:
@@ -1050,7 +1004,7 @@ class U_I18N_API Scale : public UMemory {
* Do not change the value of numbers when formatting or parsing.
*
* @return A Scale to prevent any multiplication.
- * @draft ICU 62
+ * @stable ICU 62
*/
static Scale none();
@@ -1062,7 +1016,7 @@ class U_I18N_API Scale : public UMemory {
* </pre>
*
* @return A Scale for passing to the setter in NumberFormatter.
- * @draft ICU 62
+ * @stable ICU 62
*/
static Scale powerOfTen(int32_t power);
@@ -1076,7 +1030,7 @@ class U_I18N_API Scale : public UMemory {
* Also see the version of this method that takes a double.
*
* @return A Scale for passing to the setter in NumberFormatter.
- * @draft ICU 62
+ * @stable ICU 62
*/
static Scale byDecimal(StringPiece multiplicand);
@@ -1086,7 +1040,7 @@ class U_I18N_API Scale : public UMemory {
* This method takes a double; also see the version of this method that takes an exact decimal.
*
* @return A Scale for passing to the setter in NumberFormatter.
- * @draft ICU 62
+ * @stable ICU 62
*/
static Scale byDouble(double multiplicand);
@@ -1094,26 +1048,26 @@ class U_I18N_API Scale : public UMemory {
* Multiply a number by both a power of ten and by an arbitrary double value.
*
* @return A Scale for passing to the setter in NumberFormatter.
- * @draft ICU 62
+ * @stable ICU 62
*/
static Scale byDoubleAndPowerOfTen(double multiplicand, int32_t power);
// We need a custom destructor for the DecNum, which means we need to declare
// the copy/move constructor/assignment quartet.
- /** @draft ICU 62 */
+ /** @stable ICU 62 */
Scale(const Scale& other);
- /** @draft ICU 62 */
+ /** @stable ICU 62 */
Scale& operator=(const Scale& other);
- /** @draft ICU 62 */
+ /** @stable ICU 62 */
Scale(Scale&& src) U_NOEXCEPT;
- /** @draft ICU 62 */
+ /** @stable ICU 62 */
Scale& operator=(Scale&& src) U_NOEXCEPT;
- /** @draft ICU 62 */
+ /** @stable ICU 62 */
~Scale();
#ifndef U_HIDE_INTERNAL_API
@@ -1314,7 +1268,7 @@ class U_I18N_API Grouper : public UMemory {
*/
UNumberGroupingStrategy fStrategy;
- Grouper() : fGrouping1(-3) {};
+ Grouper() : fGrouping1(-3) {}
bool isBogus() const {
return fGrouping1 == -3;
@@ -1391,7 +1345,7 @@ class U_I18N_API Padder : public UMemory {
}
int32_t padAndApply(const impl::Modifier &mod1, const impl::Modifier &mod2,
- impl::NumberStringBuilder &string, int32_t leftIndex, int32_t rightIndex,
+ FormattedStringBuilder &string, int32_t leftIndex, int32_t rightIndex,
UErrorCode &status) const;
// To allow MacroProps/MicroProps to initialize empty instances:
@@ -1459,7 +1413,7 @@ struct U_I18N_API MacroProps : public UMemory {
const CurrencySymbols* currencySymbols = nullptr; // no ownership
/** @internal */
- int32_t threshold = DEFAULT_THRESHOLD;
+ int32_t threshold = kInternalDefaultThreshold;
/** @internal */
Locale locale;
@@ -1513,7 +1467,7 @@ class U_I18N_API NumberFormatterSettings {
* The notation strategy to use.
* @return The fluent chain.
* @see Notation
- * @draft ICU 60
+ * @stable ICU 60
*/
Derived notation(const Notation &notation) const &;
@@ -1524,7 +1478,7 @@ class U_I18N_API NumberFormatterSettings {
* The notation strategy to use.
* @return The fluent chain.
* @see #notation
- * @draft ICU 62
+ * @stable ICU 62
*/
Derived notation(const Notation &notation) &&;
@@ -1540,11 +1494,10 @@ class U_I18N_API NumberFormatterSettings {
* All units will be properly localized with locale data, and all units are compatible with notation styles,
* rounding precisions, and other number formatter settings.
*
- * Pass this method any instance of {@link MeasureUnit}. For units of measure (which often involve the
- * factory methods that return a pointer):
+ * Pass this method any instance of {@link MeasureUnit}. For units of measure:
*
* <pre>
- * NumberFormatter::with().adoptUnit(MeasureUnit::createMeter(status))
+ * NumberFormatter::with().unit(MeasureUnit::getMeter())
* </pre>
*
* Currency:
@@ -1570,7 +1523,7 @@ class U_I18N_API NumberFormatterSettings {
* @see Currency
* @see NoUnit
* @see #perUnit
- * @draft ICU 60
+ * @stable ICU 60
*/
Derived unit(const icu::MeasureUnit &unit) const &;
@@ -1581,24 +1534,22 @@ class U_I18N_API NumberFormatterSettings {
* The unit to render.
* @return The fluent chain.
* @see #unit
- * @draft ICU 62
+ * @stable ICU 62
*/
Derived unit(const icu::MeasureUnit &unit) &&;
/**
* Like unit(), but takes ownership of a pointer. Convenient for use with the MeasureFormat factory
- * methods, which return pointers that need ownership. Example:
+ * methods that return pointers that need ownership.
*
- * <pre>
- * NumberFormatter::with().adoptUnit(MeasureUnit::createMeter(status))
- * </pre>
+ * Note: consider using the MeasureFormat factory methods that return by value.
*
* @param unit
* The unit to render.
* @return The fluent chain.
* @see #unit
* @see MeasureUnit
- * @draft ICU 60
+ * @stable ICU 60
*/
Derived adoptUnit(icu::MeasureUnit *unit) const &;
@@ -1609,7 +1560,7 @@ class U_I18N_API NumberFormatterSettings {
* The unit to render.
* @return The fluent chain.
* @see #adoptUnit
- * @draft ICU 62
+ * @stable ICU 62
*/
Derived adoptUnit(icu::MeasureUnit *unit) &&;
@@ -1617,8 +1568,13 @@ class U_I18N_API NumberFormatterSettings {
* Sets a unit to be used in the denominator. For example, to format "3 m/s", pass METER to the unit and SECOND to
* the perUnit.
*
- * Pass this method any instance of {@link MeasureUnit}. Since MeasureUnit factory methods return pointers, the
- * {@link #adoptPerUnit} version of this method is often more useful.
+ * Pass this method any instance of {@link MeasureUnit}. Example:
+ *
+ * <pre>
+ * NumberFormatter::with()
+ * .unit(MeasureUnit::getMeter())
+ * .perUnit(MeasureUnit::getSecond())
+ * </pre>
*
* The default is not to display any unit in the denominator.
*
@@ -1628,7 +1584,7 @@ class U_I18N_API NumberFormatterSettings {
* The unit to render in the denominator.
* @return The fluent chain
* @see #unit
- * @draft ICU 61
+ * @stable ICU 61
*/
Derived perUnit(const icu::MeasureUnit &perUnit) const &;
@@ -1639,26 +1595,22 @@ class U_I18N_API NumberFormatterSettings {
* The unit to render in the denominator.
* @return The fluent chain.
* @see #perUnit
- * @draft ICU 62
+ * @stable ICU 62
*/
Derived perUnit(const icu::MeasureUnit &perUnit) &&;
/**
* Like perUnit(), but takes ownership of a pointer. Convenient for use with the MeasureFormat factory
- * methods, which return pointers that need ownership. Example:
+ * methods that return pointers that need ownership.
*
- * <pre>
- * NumberFormatter::with()
- * .adoptUnit(MeasureUnit::createMeter(status))
- * .adoptPerUnit(MeasureUnit::createSecond(status))
- * </pre>
+ * Note: consider using the MeasureFormat factory methods that return by value.
*
* @param perUnit
* The unit to render in the denominator.
* @return The fluent chain.
* @see #perUnit
* @see MeasureUnit
- * @draft ICU 61
+ * @stable ICU 61
*/
Derived adoptPerUnit(icu::MeasureUnit *perUnit) const &;
@@ -1669,7 +1621,7 @@ class U_I18N_API NumberFormatterSettings {
* The unit to render in the denominator.
* @return The fluent chain.
* @see #adoptPerUnit
- * @draft ICU 62
+ * @stable ICU 62
*/
Derived adoptPerUnit(icu::MeasureUnit *perUnit) &&;
@@ -1701,7 +1653,7 @@ class U_I18N_API NumberFormatterSettings {
* The rounding precision to use.
* @return The fluent chain.
* @see Precision
- * @draft ICU 62
+ * @stable ICU 62
*/
Derived precision(const Precision& precision) const &;
@@ -1712,20 +1664,10 @@ class U_I18N_API NumberFormatterSettings {
* The rounding precision to use.
* @return The fluent chain.
* @see #precision
- * @draft ICU 62
+ * @stable ICU 62
*/
Derived precision(const Precision& precision) &&;
-#ifndef U_HIDE_DEPRECATED_API
- // Compatibility method that will be removed in ICU 64.
- // Use precision() instead.
- // See http://bugs.icu-project.org/trac/ticket/13746
- /** @deprecated ICU 62 */
- Derived rounding(const Rounder& rounder) const & {
- return precision(rounder);
- }
-#endif /* U_HIDE_DEPRECATED_API */
-
/**
* Specifies how to determine the direction to round a number when it has more digits than fit in the
* desired precision. When formatting 1.235:
@@ -1742,7 +1684,7 @@ class U_I18N_API NumberFormatterSettings {
*
* @param roundingMode The rounding mode to use.
* @return The fluent chain.
- * @draft ICU 62
+ * @stable ICU 62
*/
Derived roundingMode(UNumberFormatRoundingMode roundingMode) const &;
@@ -1752,7 +1694,7 @@ class U_I18N_API NumberFormatterSettings {
* @param roundingMode The rounding mode to use.
* @return The fluent chain.
* @see #roundingMode
- * @draft ICU 62
+ * @stable ICU 62
*/
Derived roundingMode(UNumberFormatRoundingMode roundingMode) &&;
@@ -1781,7 +1723,7 @@ class U_I18N_API NumberFormatterSettings {
* @param strategy
* The grouping strategy to use.
* @return The fluent chain.
- * @draft ICU 61
+ * @stable ICU 61
*/
Derived grouping(UNumberGroupingStrategy strategy) const &;
@@ -1792,7 +1734,7 @@ class U_I18N_API NumberFormatterSettings {
* The grouping strategy to use.
* @return The fluent chain.
* @see #grouping
- * @draft ICU 62
+ * @stable ICU 62
*/
Derived grouping(UNumberGroupingStrategy strategy) &&;
@@ -1818,7 +1760,7 @@ class U_I18N_API NumberFormatterSettings {
* The integer width to use.
* @return The fluent chain.
* @see IntegerWidth
- * @draft ICU 60
+ * @stable ICU 60
*/
Derived integerWidth(const IntegerWidth &style) const &;
@@ -1829,7 +1771,7 @@ class U_I18N_API NumberFormatterSettings {
* The integer width to use.
* @return The fluent chain.
* @see #integerWidth
- * @draft ICU 62
+ * @stable ICU 62
*/
Derived integerWidth(const IntegerWidth &style) &&;
@@ -1871,7 +1813,7 @@ class U_I18N_API NumberFormatterSettings {
* The DecimalFormatSymbols to use.
* @return The fluent chain.
* @see DecimalFormatSymbols
- * @draft ICU 60
+ * @stable ICU 60
*/
Derived symbols(const DecimalFormatSymbols &symbols) const &;
@@ -1882,7 +1824,7 @@ class U_I18N_API NumberFormatterSettings {
* The DecimalFormatSymbols to use.
* @return The fluent chain.
* @see #symbols
- * @draft ICU 62
+ * @stable ICU 62
*/
Derived symbols(const DecimalFormatSymbols &symbols) &&;
@@ -1917,7 +1859,7 @@ class U_I18N_API NumberFormatterSettings {
* The NumberingSystem to use.
* @return The fluent chain.
* @see NumberingSystem
- * @draft ICU 60
+ * @stable ICU 60
*/
Derived adoptSymbols(NumberingSystem *symbols) const &;
@@ -1928,7 +1870,7 @@ class U_I18N_API NumberFormatterSettings {
* The NumberingSystem to use.
* @return The fluent chain.
* @see #adoptSymbols
- * @draft ICU 62
+ * @stable ICU 62
*/
Derived adoptSymbols(NumberingSystem *symbols) &&;
@@ -1955,7 +1897,7 @@ class U_I18N_API NumberFormatterSettings {
* The width to use when rendering numbers.
* @return The fluent chain
* @see UNumberUnitWidth
- * @draft ICU 60
+ * @stable ICU 60
*/
Derived unitWidth(UNumberUnitWidth width) const &;
@@ -1966,7 +1908,7 @@ class U_I18N_API NumberFormatterSettings {
* The width to use when rendering numbers.
* @return The fluent chain.
* @see #unitWidth
- * @draft ICU 62
+ * @stable ICU 62
*/
Derived unitWidth(UNumberUnitWidth width) &&;
@@ -1993,7 +1935,7 @@ class U_I18N_API NumberFormatterSettings {
* The sign display strategy to use when rendering numbers.
* @return The fluent chain
* @see UNumberSignDisplay
- * @draft ICU 60
+ * @stable ICU 60
*/
Derived sign(UNumberSignDisplay style) const &;
@@ -2004,7 +1946,7 @@ class U_I18N_API NumberFormatterSettings {
* The sign display strategy to use when rendering numbers.
* @return The fluent chain.
* @see #sign
- * @draft ICU 62
+ * @stable ICU 62
*/
Derived sign(UNumberSignDisplay style) &&;
@@ -2031,7 +1973,7 @@ class U_I18N_API NumberFormatterSettings {
* The decimal separator display strategy to use when rendering numbers.
* @return The fluent chain
* @see UNumberDecimalSeparatorDisplay
- * @draft ICU 60
+ * @stable ICU 60
*/
Derived decimal(UNumberDecimalSeparatorDisplay style) const &;
@@ -2042,7 +1984,7 @@ class U_I18N_API NumberFormatterSettings {
* The decimal separator display strategy to use when rendering numbers.
* @return The fluent chain.
* @see #decimal
- * @draft ICU 62
+ * @stable ICU 62
*/
Derived decimal(UNumberDecimalSeparatorDisplay style) &&;
@@ -2068,7 +2010,7 @@ class U_I18N_API NumberFormatterSettings {
* @param scale
* The scale to apply when rendering numbers.
* @return The fluent chain
- * @draft ICU 62
+ * @stable ICU 62
*/
Derived scale(const Scale &scale) const &;
@@ -2079,7 +2021,7 @@ class U_I18N_API NumberFormatterSettings {
* The scale to apply when rendering numbers.
* @return The fluent chain.
* @see #scale
- * @draft ICU 62
+ * @stable ICU 62
*/
Derived scale(const Scale &scale) &&;
@@ -2136,15 +2078,39 @@ class U_I18N_API NumberFormatterSettings {
* behavior should produce the same skeleton.
*
* @return A number skeleton string with behavior corresponding to this number formatter.
- * @draft ICU 62
+ * @stable ICU 62
*/
UnicodeString toSkeleton(UErrorCode& status) const;
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns the current (Un)LocalizedNumberFormatter as a LocalPointer
+ * wrapping a heap-allocated copy of the current object.
+ *
+ * This is equivalent to new-ing the move constructor with a value object
+ * as the argument.
+ *
+ * @return A wrapped (Un)LocalizedNumberFormatter pointer, or a wrapped
+ * nullptr on failure.
+ * @draft ICU 64
+ */
+ LocalPointer<Derived> clone() const &;
+
+ /**
+ * Overload of clone for use on an rvalue reference.
+ *
+ * @return A wrapped (Un)LocalizedNumberFormatter pointer, or a wrapped
+ * nullptr on failure.
+ * @draft ICU 64
+ */
+ LocalPointer<Derived> clone() &&;
+#endif /* U_HIDE_DRAFT_API */
+
/**
* Sets the UErrorCode if an error occurred in the fluent chain.
* Preserves older error codes in the outErrorCode.
* @return TRUE if U_FAILURE(outErrorCode)
- * @draft ICU 60
+ * @stable ICU 60
*/
UBool copyErrorTo(UErrorCode &outErrorCode) const {
if (U_FAILURE(outErrorCode)) {
@@ -2153,7 +2119,7 @@ class U_I18N_API NumberFormatterSettings {
}
fMacros.copyErrorTo(outErrorCode);
return U_FAILURE(outErrorCode);
- };
+ }
// NOTE: Uses default copy and move constructors.
@@ -2174,8 +2140,10 @@ class U_I18N_API NumberFormatterSettings {
/**
* A NumberFormatter that does not yet have a locale. In order to format numbers, a locale must be specified.
*
+ * Instances of this class are immutable and thread-safe.
+ *
* @see NumberFormatter
- * @draft ICU 60
+ * @stable ICU 60
*/
class U_I18N_API UnlocalizedNumberFormatter
: public NumberFormatterSettings<UnlocalizedNumberFormatter>, public UMemory {
@@ -2188,7 +2156,7 @@ class U_I18N_API UnlocalizedNumberFormatter
* @param locale
* The locale to use when loading data for number formatting.
* @return The fluent chain.
- * @draft ICU 60
+ * @stable ICU 60
*/
LocalizedNumberFormatter locale(const icu::Locale &locale) const &;
@@ -2199,40 +2167,40 @@ class U_I18N_API UnlocalizedNumberFormatter
* The locale to use when loading data for number formatting.
* @return The fluent chain.
* @see #locale
- * @draft ICU 62
+ * @stable ICU 62
*/
LocalizedNumberFormatter locale(const icu::Locale &locale) &&;
/**
* Default constructor: puts the formatter into a valid but undefined state.
*
- * @draft ICU 62
+ * @stable ICU 62
*/
UnlocalizedNumberFormatter() = default;
/**
* Returns a copy of this UnlocalizedNumberFormatter.
- * @draft ICU 60
+ * @stable ICU 60
*/
UnlocalizedNumberFormatter(const UnlocalizedNumberFormatter &other);
/**
* Move constructor:
* The source UnlocalizedNumberFormatter will be left in a valid but undefined state.
- * @draft ICU 62
+ * @stable ICU 62
*/
UnlocalizedNumberFormatter(UnlocalizedNumberFormatter&& src) U_NOEXCEPT;
/**
* Copy assignment operator.
- * @draft ICU 62
+ * @stable ICU 62
*/
UnlocalizedNumberFormatter& operator=(const UnlocalizedNumberFormatter& other);
/**
* Move assignment operator:
* The source UnlocalizedNumberFormatter will be left in a valid but undefined state.
- * @draft ICU 62
+ * @stable ICU 62
*/
UnlocalizedNumberFormatter& operator=(UnlocalizedNumberFormatter&& src) U_NOEXCEPT;
@@ -2252,8 +2220,10 @@ class U_I18N_API UnlocalizedNumberFormatter
/**
* A NumberFormatter that has a locale associated with it; this means .format() methods are available.
*
+ * Instances of this class are immutable and thread-safe.
+ *
* @see NumberFormatter
- * @draft ICU 60
+ * @stable ICU 60
*/
class U_I18N_API LocalizedNumberFormatter
: public NumberFormatterSettings<LocalizedNumberFormatter>, public UMemory {
@@ -2267,7 +2237,7 @@ class U_I18N_API LocalizedNumberFormatter
* @param status
* Set to an ErrorCode if one occurred in the setter chain or during formatting.
* @return A FormattedNumber object; call .toString() to get the string.
- * @draft ICU 60
+ * @stable ICU 60
*/
FormattedNumber formatInt(int64_t value, UErrorCode &status) const;
@@ -2280,7 +2250,7 @@ class U_I18N_API LocalizedNumberFormatter
* @param status
* Set to an ErrorCode if one occurred in the setter chain or during formatting.
* @return A FormattedNumber object; call .toString() to get the string.
- * @draft ICU 60
+ * @stable ICU 60
*/
FormattedNumber formatDouble(double value, UErrorCode &status) const;
@@ -2296,7 +2266,7 @@ class U_I18N_API LocalizedNumberFormatter
* @param status
* Set to an ErrorCode if one occurred in the setter chain or during formatting.
* @return A FormattedNumber object; call .toString() to get the string.
- * @draft ICU 60
+ * @stable ICU 60
*/
FormattedNumber formatDecimal(StringPiece value, UErrorCode& status) const;
@@ -2337,40 +2307,40 @@ class U_I18N_API LocalizedNumberFormatter
* The caller owns the returned object and must delete it when finished.
*
* @return A Format wrapping this LocalizedNumberFormatter.
- * @draft ICU 62
+ * @stable ICU 62
*/
Format* toFormat(UErrorCode& status) const;
/**
* Default constructor: puts the formatter into a valid but undefined state.
*
- * @draft ICU 62
+ * @stable ICU 62
*/
LocalizedNumberFormatter() = default;
/**
* Returns a copy of this LocalizedNumberFormatter.
- * @draft ICU 60
+ * @stable ICU 60
*/
LocalizedNumberFormatter(const LocalizedNumberFormatter &other);
/**
* Move constructor:
* The source LocalizedNumberFormatter will be left in a valid but undefined state.
- * @draft ICU 62
+ * @stable ICU 62
*/
LocalizedNumberFormatter(LocalizedNumberFormatter&& src) U_NOEXCEPT;
/**
* Copy assignment operator.
- * @draft ICU 62
+ * @stable ICU 62
*/
LocalizedNumberFormatter& operator=(const LocalizedNumberFormatter& other);
/**
* Move assignment operator:
* The source LocalizedNumberFormatter will be left in a valid but undefined state.
- * @draft ICU 62
+ * @stable ICU 62
*/
LocalizedNumberFormatter& operator=(LocalizedNumberFormatter&& src) U_NOEXCEPT;
@@ -2394,7 +2364,7 @@ class U_I18N_API LocalizedNumberFormatter
/**
* Destruct this LocalizedNumberFormatter, cleaning up any memory it might own.
- * @draft ICU 60
+ * @stable ICU 60
*/
~LocalizedNumberFormatter();
@@ -2433,89 +2403,83 @@ class U_I18N_API LocalizedNumberFormatter
* The result of a number formatting operation. This class allows the result to be exported in several data types,
* including a UnicodeString and a FieldPositionIterator.
*
- * @draft ICU 60
+ * Instances of this class are immutable and thread-safe.
+ *
+ * @stable ICU 60
*/
-class U_I18N_API FormattedNumber : public UMemory {
+class U_I18N_API FormattedNumber : public UMemory, public FormattedValue {
public:
-#ifndef U_HIDE_DEPRECATED_API
+
+ // Default constructor cannot have #ifndef U_HIDE_DRAFT_API
+#ifndef U_FORCE_HIDE_DRAFT_API
/**
- * Returns a UnicodeString representation of the formatted number.
- *
- * @return a UnicodeString containing the localized number.
- * @deprecated ICU 62 Use the version of this method with an error code instead.
- * This method was never @stable and will be removed in a future release.
- * See http://bugs.icu-project.org/trac/ticket/13746
+ * Default constructor; makes an empty FormattedNumber.
+ * @draft ICU 64
*/
- UnicodeString toString() const;
-#endif /* U_HIDE_DEPRECATED_API */
+ FormattedNumber()
+ : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
+#endif // U_FORCE_HIDE_DRAFT_API
/**
- * Returns a UnicodeString representation of the formatted number.
- *
- * @param status
- * Set if an error occurs while formatting the number to the UnicodeString.
- * @return a UnicodeString containing the localized number.
- * @draft ICU 62
+ * Move constructor: Leaves the source FormattedNumber in an undefined state.
+ * @stable ICU 62
*/
- UnicodeString toString(UErrorCode& status) const;
+ FormattedNumber(FormattedNumber&& src) U_NOEXCEPT;
-#ifndef U_HIDE_DEPRECATED_API
/**
- * Appends the formatted number to an Appendable.
- *
- * @param appendable
- * The Appendable to which to append the formatted number string.
- * @return The same Appendable, for chaining.
- * @deprecated ICU 62 Use the version of this method with an error code instead.
- * This method was never @stable and will be removed in a future release.
- * See http://bugs.icu-project.org/trac/ticket/13746
- * @see Appendable
+ * Destruct an instance of FormattedNumber.
+ * @stable ICU 60
*/
- Appendable &appendTo(Appendable &appendable);
-#endif /* U_HIDE_DEPRECATED_API */
+ virtual ~FormattedNumber() U_OVERRIDE;
+
+ /** Copying not supported; use move constructor instead. */
+ FormattedNumber(const FormattedNumber&) = delete;
+
+ /** Copying not supported; use move assignment instead. */
+ FormattedNumber& operator=(const FormattedNumber&) = delete;
/**
- * Appends the formatted number to an Appendable.
- *
- * @param appendable
- * The Appendable to which to append the formatted number string.
- * @param status
- * Set if an error occurs while formatting the number to the Appendable.
- * @return The same Appendable, for chaining.
- * @draft ICU 62
- * @see Appendable
+ * Move assignment: Leaves the source FormattedNumber in an undefined state.
+ * @stable ICU 62
*/
- Appendable &appendTo(Appendable &appendable, UErrorCode& status) const;
+ FormattedNumber& operator=(FormattedNumber&& src) U_NOEXCEPT;
-#ifndef U_HIDE_DEPRECATED_API
+ // Copybrief: this method is older than the parent method
/**
- * Determine the start and end indices of the first occurrence of the given <em>field</em> in the output string.
- * This allows you to determine the locations of the integer part, fraction part, and sign.
+ * @copybrief FormattedValue::toString()
*
- * <p>
- * If multiple different field attributes are needed, this method can be called repeatedly, or if <em>all</em> field
- * attributes are needed, consider using populateFieldPositionIterator().
+ * For more information, see FormattedValue::toString()
*
- * <p>
- * If a field occurs multiple times in an output string, such as a grouping separator, this method will only ever
- * return the first occurrence. Use populateFieldPositionIterator() to access all occurrences of an attribute.
+ * @stable ICU 62
+ */
+ UnicodeString toString(UErrorCode& status) const U_OVERRIDE;
+
+ // Copydoc: this method is new in ICU 64
+ /** @copydoc FormattedValue::toTempString() */
+ UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE;
+
+ // Copybrief: this method is older than the parent method
+ /**
+ * @copybrief FormattedValue::appendTo()
*
- * @param fieldPosition
- * The FieldPosition to populate with the start and end indices of the desired field.
- * @param status
- * Set if an error occurs while populating the FieldPosition.
- * @deprecated ICU 62 Use {@link #nextFieldPosition} instead. This method will be removed in a future
- * release. See http://bugs.icu-project.org/trac/ticket/13746
- * @see UNumberFormatFields
+ * For more information, see FormattedValue::appendTo()
+ *
+ * @stable ICU 62
*/
- void populateFieldPosition(FieldPosition &fieldPosition, UErrorCode &status);
-#endif /* U_HIDE_DEPRECATED_API */
+ Appendable &appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE;
+
+ // Copydoc: this method is new in ICU 64
+ /** @copydoc FormattedValue::nextPosition() */
+ UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE;
+#ifndef U_HIDE_DRAFT_API
/**
* Determines the start (inclusive) and end (exclusive) indices of the next occurrence of the given
* <em>field</em> in the output string. This allows you to determine the locations of, for example,
* the integer part, fraction part, or symbols.
*
+ * This is a simpler but less powerful alternative to {@link #nextPosition}.
+ *
* If a field occurs just once, calling this method will find that occurrence and return it. If a
* field occurs multiple times, this method may be called repeatedly with the following pattern:
*
@@ -2527,7 +2491,7 @@ class U_I18N_API FormattedNumber : public UMemory {
* </pre>
*
* This method is useful if you know which field to query. If you want all available field position
- * information, use #getAllFieldPositions().
+ * information, use {@link #nextPosition} or {@link #getAllFieldPositions}.
*
* @param fieldPosition
* Input+output variable. On input, the "field" property determines which field to look
@@ -2544,39 +2508,46 @@ class U_I18N_API FormattedNumber : public UMemory {
*/
UBool nextFieldPosition(FieldPosition& fieldPosition, UErrorCode& status) const;
-#ifndef U_HIDE_DEPRECATED_API
/**
* Export the formatted number to a FieldPositionIterator. This allows you to determine which characters in
* the output string correspond to which <em>fields</em>, such as the integer part, fraction part, and sign.
*
- * <p>
- * If information on only one field is needed, consider using populateFieldPosition() instead.
+ * This is an alternative to the more powerful #nextPosition() API.
+ *
+ * If information on only one field is needed, use #nextPosition() or #nextFieldPosition() instead.
*
* @param iterator
* The FieldPositionIterator to populate with all of the fields present in the formatted number.
* @param status
* Set if an error occurs while populating the FieldPositionIterator.
- * @deprecated ICU 62 Use {@link #getAllFieldPositions} instead. This method will be removed in a
- * future release. See http://bugs.icu-project.org/trac/ticket/13746
+ * @draft ICU 62
* @see UNumberFormatFields
*/
- void populateFieldPositionIterator(FieldPositionIterator &iterator, UErrorCode &status);
-#endif /* U_HIDE_DEPRECATED_API */
+ void getAllFieldPositions(FieldPositionIterator &iterator, UErrorCode &status) const;
+#endif /* U_HIDE_DRAFT_API */
+#ifndef U_HIDE_DRAFT_API
/**
- * Export the formatted number to a FieldPositionIterator. This allows you to determine which characters in
- * the output string correspond to which <em>fields</em>, such as the integer part, fraction part, and sign.
+ * Export the formatted number as a "numeric string" conforming to the
+ * syntax defined in the Decimal Arithmetic Specification, available at
+ * http://speleotrove.com/decimal
*
- * If information on only one field is needed, use #nextFieldPosition() instead.
+ * This endpoint is useful for obtaining the exact number being printed
+ * after scaling and rounding have been applied by the number formatter.
*
- * @param iterator
- * The FieldPositionIterator to populate with all of the fields present in the formatted number.
- * @param status
- * Set if an error occurs while populating the FieldPositionIterator.
- * @draft ICU 62
- * @see UNumberFormatFields
+ * Example call site:
+ *
+ * auto decimalNumber = fn.toDecimalNumber<std::string>(status);
+ *
+ * @tparam StringClass A string class compatible with StringByteSink;
+ * for example, std::string.
+ * @param status Set if an error occurs.
+ * @return A StringClass containing the numeric string.
+ * @draft ICU 65
*/
- void getAllFieldPositions(FieldPositionIterator &iterator, UErrorCode &status) const;
+ template<typename StringClass>
+ inline StringClass toDecimalNumber(UErrorCode& status) const;
+#endif // U_HIDE_DRAFT_API
#ifndef U_HIDE_INTERNAL_API
@@ -2594,39 +2565,9 @@ class U_I18N_API FormattedNumber : public UMemory {
#endif /* U_HIDE_INTERNAL_API */
- /**
- * Copying not supported; use move constructor instead.
- */
- FormattedNumber(const FormattedNumber&) = delete;
-
- /**
- * Copying not supported; use move assignment instead.
- */
- FormattedNumber& operator=(const FormattedNumber&) = delete;
-
- /**
- * Move constructor:
- * Leaves the source FormattedNumber in an undefined state.
- * @draft ICU 62
- */
- FormattedNumber(FormattedNumber&& src) U_NOEXCEPT;
-
- /**
- * Move assignment:
- * Leaves the source FormattedNumber in an undefined state.
- * @draft ICU 62
- */
- FormattedNumber& operator=(FormattedNumber&& src) U_NOEXCEPT;
-
- /**
- * Destruct an instance of FormattedNumber, cleaning up any memory it might own.
- * @draft ICU 60
- */
- ~FormattedNumber();
-
private:
// Can't use LocalPointer because UFormattedNumberData is forward-declared
- const impl::UFormattedNumberData *fResults;
+ const impl::UFormattedNumberData *fData;
// Error code for the terminal methods
UErrorCode fErrorCode;
@@ -2636,19 +2577,36 @@ class U_I18N_API FormattedNumber : public UMemory {
* @internal
*/
explicit FormattedNumber(impl::UFormattedNumberData *results)
- : fResults(results), fErrorCode(U_ZERO_ERROR) {};
+ : fData(results), fErrorCode(U_ZERO_ERROR) {}
explicit FormattedNumber(UErrorCode errorCode)
- : fResults(nullptr), fErrorCode(errorCode) {};
+ : fData(nullptr), fErrorCode(errorCode) {}
+
+ // TODO(ICU-20775): Propose this as API.
+ void toDecimalNumber(ByteSink& sink, UErrorCode& status) const;
// To give LocalizedNumberFormatter format methods access to this class's constructor:
friend class LocalizedNumberFormatter;
+
+ // To give C API access to internals
+ friend struct impl::UFormattedNumberImpl;
+};
+
+#ifndef U_HIDE_DRAFT_API
+// Note: This is draft ICU 65
+template<typename StringClass>
+StringClass FormattedNumber::toDecimalNumber(UErrorCode& status) const {
+ StringClass result;
+ StringByteSink<StringClass> sink(&result);
+ toDecimalNumber(sink, status);
+ return result;
};
+#endif // U_HIDE_DRAFT_API
/**
* See the main description in numberformatter.h for documentation and examples.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
class U_I18N_API NumberFormatter final {
public:
@@ -2657,7 +2615,7 @@ class U_I18N_API NumberFormatter final {
* the call site.
*
* @return An {@link UnlocalizedNumberFormatter}, to be used for chaining.
- * @draft ICU 60
+ * @stable ICU 60
*/
static UnlocalizedNumberFormatter with();
@@ -2668,7 +2626,7 @@ class U_I18N_API NumberFormatter final {
* @param locale
* The locale from which to load formats and symbols for number formatting.
* @return A {@link LocalizedNumberFormatter}, to be used for chaining.
- * @draft ICU 60
+ * @stable ICU 60
*/
static LocalizedNumberFormatter withLocale(const Locale &locale);
@@ -2676,15 +2634,40 @@ class U_I18N_API NumberFormatter final {
* Call this method at the beginning of a NumberFormatter fluent chain to create an instance based
* on a given number skeleton string.
*
+ * It is possible for an error to occur while parsing. See the overload of this method if you are
+ * interested in the location of a possible parse error.
+ *
* @param skeleton
* The skeleton string off of which to base this NumberFormatter.
* @param status
* Set to U_NUMBER_SKELETON_SYNTAX_ERROR if the skeleton was invalid.
* @return An UnlocalizedNumberFormatter, to be used for chaining.
- * @draft ICU 62
+ * @stable ICU 62
*/
static UnlocalizedNumberFormatter forSkeleton(const UnicodeString& skeleton, UErrorCode& status);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Call this method at the beginning of a NumberFormatter fluent chain to create an instance based
+ * on a given number skeleton string.
+ *
+ * If an error occurs while parsing the skeleton string, the offset into the skeleton string at
+ * which the error occurred will be saved into the UParseError, if provided.
+ *
+ * @param skeleton
+ * The skeleton string off of which to base this NumberFormatter.
+ * @param perror
+ * A parse error struct populated if an error occurs when parsing.
+ * If no error occurs, perror.offset will be set to -1.
+ * @param status
+ * Set to U_NUMBER_SKELETON_SYNTAX_ERROR if the skeleton was invalid.
+ * @return An UnlocalizedNumberFormatter, to be used for chaining.
+ * @draft ICU 64
+ */
+ static UnlocalizedNumberFormatter forSkeleton(const UnicodeString& skeleton,
+ UParseError& perror, UErrorCode& status);
+#endif
+
/**
* Use factory methods instead of the constructor to create a NumberFormatter.
*/
@@ -2694,8 +2677,9 @@ class U_I18N_API NumberFormatter final {
} // namespace number
U_NAMESPACE_END
-#endif // U_HIDE_DRAFT_API
+#endif /* #if !UCONFIG_NO_FORMATTING */
+
+#endif /* U_SHOW_CPLUSPLUS_API */
#endif // __NUMBERFORMATTER_H__
-#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/numberrangeformatter.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/numberrangeformatter.h
index 64f6c6ab1c3..0f0d2af5f5b 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/numberrangeformatter.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/numberrangeformatter.h
@@ -1,18 +1,22 @@
// © 2018 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
-#if !UCONFIG_NO_FORMATTING
#ifndef __NUMBERRANGEFORMATTER_H__
#define __NUMBERRANGEFORMATTER_H__
+#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
+#if !UCONFIG_NO_FORMATTING
+
#include <atomic>
#include "unicode/appendable.h"
#include "unicode/fieldpos.h"
+#include "unicode/formattedvalue.h"
#include "unicode/fpositer.h"
#include "unicode/numberformatter.h"
-#ifndef U_HIDE_DRAFT_API
-
/**
* \file
* \brief C++ API: Library for localized formatting of number, currency, and unit ranges.
@@ -32,7 +36,8 @@
* // => "750 m - 1.2 km"
* </pre>
* <p>
- * Like NumberFormatter, NumberRangeFormatter instances are immutable and thread-safe. This API is based on the
+ * Like NumberFormatter, NumberRangeFormatter instances (i.e., LocalizedNumberRangeFormatter
+ * and UnlocalizedNumberRangeFormatter) are immutable and thread-safe. This API is based on the
* <em>fluent</em> design pattern popularized by libraries such as Google's Guava.
*
* @author Shane Carr
@@ -42,7 +47,7 @@
/**
* Defines how to merge fields that are identical across the range sign.
*
- * @draft ICU 63
+ * @stable ICU 63
*/
typedef enum UNumberRangeCollapse {
/**
@@ -51,14 +56,14 @@ typedef enum UNumberRangeCollapse {
*
* The heuristics used for this option are subject to change over time.
*
- * @draft ICU 63
+ * @stable ICU 63
*/
UNUM_RANGE_COLLAPSE_AUTO,
/**
* Do not collapse any part of the number. Example: "3.2 thousand kilograms – 5.3 thousand kilograms"
*
- * @draft ICU 63
+ * @stable ICU 63
*/
UNUM_RANGE_COLLAPSE_NONE,
@@ -66,7 +71,7 @@ typedef enum UNumberRangeCollapse {
* Collapse the unit part of the number, but not the notation, if present. Example: "3.2 thousand – 5.3 thousand
* kilograms"
*
- * @draft ICU 63
+ * @stable ICU 63
*/
UNUM_RANGE_COLLAPSE_UNIT,
@@ -74,7 +79,7 @@ typedef enum UNumberRangeCollapse {
* Collapse any field that is equal across the range sign. May introduce ambiguity on the magnitude of the
* number. Example: "3.2 – 5.3 thousand kilograms"
*
- * @draft ICU 63
+ * @stable ICU 63
*/
UNUM_RANGE_COLLAPSE_ALL
} UNumberRangeCollapse;
@@ -83,14 +88,14 @@ typedef enum UNumberRangeCollapse {
* Defines the behavior when the two numbers in the range are identical after rounding. To programmatically detect
* when the identity fallback is used, compare the lower and upper BigDecimals via FormattedNumber.
*
- * @draft ICU 63
+ * @stable ICU 63
* @see NumberRangeFormatter
*/
typedef enum UNumberRangeIdentityFallback {
/**
* Show the number as a single value rather than a range. Example: "$5"
*
- * @draft ICU 63
+ * @stable ICU 63
*/
UNUM_IDENTITY_FALLBACK_SINGLE_VALUE,
@@ -98,7 +103,7 @@ typedef enum UNumberRangeIdentityFallback {
* Show the number using a locale-sensitive approximation pattern. If the numbers were the same before rounding,
* show the single value. Example: "~$5" or "$5"
*
- * @draft ICU 63
+ * @stable ICU 63
*/
UNUM_IDENTITY_FALLBACK_APPROXIMATELY_OR_SINGLE_VALUE,
@@ -106,7 +111,7 @@ typedef enum UNumberRangeIdentityFallback {
* Show the number using a locale-sensitive approximation pattern. Use the range pattern always, even if the
* inputs are the same. Example: "~$5"
*
- * @draft ICU 63
+ * @stable ICU 63
*/
UNUM_IDENTITY_FALLBACK_APPROXIMATELY,
@@ -114,7 +119,7 @@ typedef enum UNumberRangeIdentityFallback {
* Show the number as the range of two equal values. Use the range pattern always, even if the inputs are the
* same. Example (with RangeCollapse.NONE): "$5 – $5"
*
- * @draft ICU 63
+ * @stable ICU 63
*/
UNUM_IDENTITY_FALLBACK_RANGE
} UNumberRangeIdentityFallback;
@@ -123,14 +128,14 @@ typedef enum UNumberRangeIdentityFallback {
* Used in the result class FormattedNumberRange to indicate to the user whether the numbers formatted in the range
* were equal or not, and whether or not the identity fallback was applied.
*
- * @draft ICU 63
+ * @stable ICU 63
* @see NumberRangeFormatter
*/
typedef enum UNumberRangeIdentityResult {
/**
* Used to indicate that the two numbers in the range were equal, even before any rounding rules were applied.
*
- * @draft ICU 63
+ * @stable ICU 63
* @see NumberRangeFormatter
*/
UNUM_IDENTITY_RESULT_EQUAL_BEFORE_ROUNDING,
@@ -138,7 +143,7 @@ typedef enum UNumberRangeIdentityResult {
/**
* Used to indicate that the two numbers in the range were equal, but only after rounding rules were applied.
*
- * @draft ICU 63
+ * @stable ICU 63
* @see NumberRangeFormatter
*/
UNUM_IDENTITY_RESULT_EQUAL_AFTER_ROUNDING,
@@ -146,7 +151,7 @@ typedef enum UNumberRangeIdentityResult {
/**
* Used to indicate that the two numbers in the range were not equal, even after rounding rules were applied.
*
- * @draft ICU 63
+ * @stable ICU 63
* @see NumberRangeFormatter
*/
UNUM_IDENTITY_RESULT_NOT_EQUAL,
@@ -175,7 +180,7 @@ namespace impl {
// Forward declarations:
struct RangeMacroProps;
class DecimalQuantity;
-struct UFormattedNumberRangeData;
+class UFormattedNumberRangeData;
class NumberRangeFormatterImpl;
} // namespace impl
@@ -185,8 +190,14 @@ class NumberRangeFormatterImpl;
* Export an explicit template instantiation. See datefmt.h
* (When building DLLs for Windows this is required.)
*/
-#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM < U_PF_MINGW && !defined(U_IN_DOXYGEN) && defined(X)
-template struct U_I18N_API std::atomic<impl::NumberRangeFormatterImpl*>;
+#if U_PLATFORM == U_PF_WINDOWS && !defined(U_IN_DOXYGEN)
+} // namespace icu::number
+U_NAMESPACE_END
+
+template struct U_I18N_API std::atomic< U_NAMESPACE_QUALIFIER number::impl::NumberRangeFormatterImpl*>;
+
+U_NAMESPACE_BEGIN
+namespace number { // icu::number
#endif
/** \endcond */
@@ -246,7 +257,7 @@ class U_I18N_API NumberRangeFormatterSettings {
* @param formatter
* The formatter to use for both numbers in the range.
* @return The fluent chain.
- * @draft ICU 63
+ * @stable ICU 63
*/
Derived numberFormatterBoth(const UnlocalizedNumberFormatter &formatter) const &;
@@ -257,7 +268,7 @@ class U_I18N_API NumberRangeFormatterSettings {
* The formatter to use for both numbers in the range.
* @return The fluent chain.
* @see #numberFormatterBoth
- * @draft ICU 63
+ * @stable ICU 63
*/
Derived numberFormatterBoth(const UnlocalizedNumberFormatter &formatter) &&;
@@ -268,7 +279,7 @@ class U_I18N_API NumberRangeFormatterSettings {
* The formatter to use for both numbers in the range.
* @return The fluent chain.
* @see #numberFormatterBoth
- * @draft ICU 63
+ * @stable ICU 63
*/
Derived numberFormatterBoth(UnlocalizedNumberFormatter &&formatter) const &;
@@ -279,7 +290,7 @@ class U_I18N_API NumberRangeFormatterSettings {
* The formatter to use for both numbers in the range.
* @return The fluent chain.
* @see #numberFormatterBoth
- * @draft ICU 63
+ * @stable ICU 63
*/
Derived numberFormatterBoth(UnlocalizedNumberFormatter &&formatter) &&;
@@ -292,7 +303,7 @@ class U_I18N_API NumberRangeFormatterSettings {
* @param formatterFirst
* The formatter to use for the first number in the range.
* @return The fluent chain.
- * @draft ICU 63
+ * @stable ICU 63
*/
Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) const &;
@@ -303,7 +314,7 @@ class U_I18N_API NumberRangeFormatterSettings {
* The formatter to use for the first number in the range.
* @return The fluent chain.
* @see #numberFormatterFirst
- * @draft ICU 63
+ * @stable ICU 63
*/
Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) &&;
@@ -314,7 +325,7 @@ class U_I18N_API NumberRangeFormatterSettings {
* The formatter to use for the first number in the range.
* @return The fluent chain.
* @see #numberFormatterFirst
- * @draft ICU 63
+ * @stable ICU 63
*/
Derived numberFormatterFirst(UnlocalizedNumberFormatter &&formatterFirst) const &;
@@ -325,7 +336,7 @@ class U_I18N_API NumberRangeFormatterSettings {
* The formatter to use for the first number in the range.
* @return The fluent chain.
* @see #numberFormatterFirst
- * @draft ICU 63
+ * @stable ICU 63
*/
Derived numberFormatterFirst(UnlocalizedNumberFormatter &&formatterFirst) &&;
@@ -338,7 +349,7 @@ class U_I18N_API NumberRangeFormatterSettings {
* @param formatterSecond
* The formatter to use for the second number in the range.
* @return The fluent chain.
- * @draft ICU 63
+ * @stable ICU 63
*/
Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) const &;
@@ -349,7 +360,7 @@ class U_I18N_API NumberRangeFormatterSettings {
* The formatter to use for the second number in the range.
* @return The fluent chain.
* @see #numberFormatterSecond
- * @draft ICU 63
+ * @stable ICU 63
*/
Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) &&;
@@ -360,7 +371,7 @@ class U_I18N_API NumberRangeFormatterSettings {
* The formatter to use for the second number in the range.
* @return The fluent chain.
* @see #numberFormatterSecond
- * @draft ICU 63
+ * @stable ICU 63
*/
Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) const &;
@@ -371,7 +382,7 @@ class U_I18N_API NumberRangeFormatterSettings {
* The formatter to use for the second number in the range.
* @return The fluent chain.
* @see #numberFormatterSecond
- * @draft ICU 63
+ * @stable ICU 63
*/
Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) &&;
@@ -390,7 +401,7 @@ class U_I18N_API NumberRangeFormatterSettings {
* @param collapse
* The collapsing strategy to use for this range.
* @return The fluent chain.
- * @draft ICU 63
+ * @stable ICU 63
*/
Derived collapse(UNumberRangeCollapse collapse) const &;
@@ -401,7 +412,7 @@ class U_I18N_API NumberRangeFormatterSettings {
* The collapsing strategy to use for this range.
* @return The fluent chain.
* @see #collapse
- * @draft ICU 63
+ * @stable ICU 63
*/
Derived collapse(UNumberRangeCollapse collapse) &&;
@@ -423,7 +434,7 @@ class U_I18N_API NumberRangeFormatterSettings {
* @param identityFallback
* The strategy to use when formatting two numbers that end up being the same.
* @return The fluent chain.
- * @draft ICU 63
+ * @stable ICU 63
*/
Derived identityFallback(UNumberRangeIdentityFallback identityFallback) const &;
@@ -434,15 +445,39 @@ class U_I18N_API NumberRangeFormatterSettings {
* The strategy to use when formatting two numbers that end up being the same.
* @return The fluent chain.
* @see #identityFallback
- * @draft ICU 63
+ * @stable ICU 63
*/
Derived identityFallback(UNumberRangeIdentityFallback identityFallback) &&;
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns the current (Un)LocalizedNumberRangeFormatter as a LocalPointer
+ * wrapping a heap-allocated copy of the current object.
+ *
+ * This is equivalent to new-ing the move constructor with a value object
+ * as the argument.
+ *
+ * @return A wrapped (Un)LocalizedNumberRangeFormatter pointer, or a wrapped
+ * nullptr on failure.
+ * @draft ICU 64
+ */
+ LocalPointer<Derived> clone() const &;
+
+ /**
+ * Overload of clone for use on an rvalue reference.
+ *
+ * @return A wrapped (Un)LocalizedNumberRangeFormatter pointer, or a wrapped
+ * nullptr on failure.
+ * @draft ICU 64
+ */
+ LocalPointer<Derived> clone() &&;
+#endif /* U_HIDE_DRAFT_API */
+
/**
* Sets the UErrorCode if an error occurred in the fluent chain.
* Preserves older error codes in the outErrorCode.
* @return TRUE if U_FAILURE(outErrorCode)
- * @draft ICU 63
+ * @stable ICU 63
*/
UBool copyErrorTo(UErrorCode &outErrorCode) const {
if (U_FAILURE(outErrorCode)) {
@@ -451,7 +486,7 @@ class U_I18N_API NumberRangeFormatterSettings {
}
fMacros.copyErrorTo(outErrorCode);
return U_FAILURE(outErrorCode);
- };
+ }
// NOTE: Uses default copy and move constructors.
@@ -468,8 +503,10 @@ class U_I18N_API NumberRangeFormatterSettings {
/**
* A NumberRangeFormatter that does not yet have a locale. In order to format, a locale must be specified.
*
+ * Instances of this class are immutable and thread-safe.
+ *
* @see NumberRangeFormatter
- * @draft ICU 63
+ * @stable ICU 63
*/
class U_I18N_API UnlocalizedNumberRangeFormatter
: public NumberRangeFormatterSettings<UnlocalizedNumberRangeFormatter>, public UMemory {
@@ -482,7 +519,7 @@ class U_I18N_API UnlocalizedNumberRangeFormatter
* @param locale
* The locale to use when loading data for number formatting.
* @return The fluent chain.
- * @draft ICU 63
+ * @stable ICU 63
*/
LocalizedNumberRangeFormatter locale(const icu::Locale &locale) const &;
@@ -493,40 +530,40 @@ class U_I18N_API UnlocalizedNumberRangeFormatter
* The locale to use when loading data for number formatting.
* @return The fluent chain.
* @see #locale
- * @draft ICU 63
+ * @stable ICU 63
*/
LocalizedNumberRangeFormatter locale(const icu::Locale &locale) &&;
/**
* Default constructor: puts the formatter into a valid but undefined state.
*
- * @draft ICU 63
+ * @stable ICU 63
*/
UnlocalizedNumberRangeFormatter() = default;
/**
* Returns a copy of this UnlocalizedNumberRangeFormatter.
- * @draft ICU 63
+ * @stable ICU 63
*/
UnlocalizedNumberRangeFormatter(const UnlocalizedNumberRangeFormatter &other);
/**
* Move constructor:
* The source UnlocalizedNumberRangeFormatter will be left in a valid but undefined state.
- * @draft ICU 63
+ * @stable ICU 63
*/
UnlocalizedNumberRangeFormatter(UnlocalizedNumberRangeFormatter&& src) U_NOEXCEPT;
/**
* Copy assignment operator.
- * @draft ICU 63
+ * @stable ICU 63
*/
UnlocalizedNumberRangeFormatter& operator=(const UnlocalizedNumberRangeFormatter& other);
/**
* Move assignment operator:
* The source UnlocalizedNumberRangeFormatter will be left in a valid but undefined state.
- * @draft ICU 63
+ * @stable ICU 63
*/
UnlocalizedNumberRangeFormatter& operator=(UnlocalizedNumberRangeFormatter&& src) U_NOEXCEPT;
@@ -547,8 +584,10 @@ class U_I18N_API UnlocalizedNumberRangeFormatter
/**
* A NumberRangeFormatter that has a locale associated with it; this means .formatRange() methods are available.
*
+ * Instances of this class are immutable and thread-safe.
+ *
* @see NumberFormatter
- * @draft ICU 63
+ * @stable ICU 63
*/
class U_I18N_API LocalizedNumberRangeFormatter
: public NumberRangeFormatterSettings<LocalizedNumberRangeFormatter>, public UMemory {
@@ -564,7 +603,7 @@ class U_I18N_API LocalizedNumberRangeFormatter
* @param status
* Set if an error occurs while formatting.
* @return A FormattedNumberRange object; call .toString() to get the string.
- * @draft ICU 63
+ * @stable ICU 63
*/
FormattedNumberRange formatFormattableRange(
const Formattable& first, const Formattable& second, UErrorCode& status) const;
@@ -572,33 +611,33 @@ class U_I18N_API LocalizedNumberRangeFormatter
/**
* Default constructor: puts the formatter into a valid but undefined state.
*
- * @draft ICU 63
+ * @stable ICU 63
*/
LocalizedNumberRangeFormatter() = default;
/**
* Returns a copy of this LocalizedNumberRangeFormatter.
- * @draft ICU 63
+ * @stable ICU 63
*/
LocalizedNumberRangeFormatter(const LocalizedNumberRangeFormatter &other);
/**
* Move constructor:
* The source LocalizedNumberRangeFormatter will be left in a valid but undefined state.
- * @draft ICU 63
+ * @stable ICU 63
*/
LocalizedNumberRangeFormatter(LocalizedNumberRangeFormatter&& src) U_NOEXCEPT;
/**
* Copy assignment operator.
- * @draft ICU 63
+ * @stable ICU 63
*/
LocalizedNumberRangeFormatter& operator=(const LocalizedNumberRangeFormatter& other);
/**
* Move assignment operator:
* The source LocalizedNumberRangeFormatter will be left in a valid but undefined state.
- * @draft ICU 63
+ * @stable ICU 63
*/
LocalizedNumberRangeFormatter& operator=(LocalizedNumberRangeFormatter&& src) U_NOEXCEPT;
@@ -617,11 +656,11 @@ class U_I18N_API LocalizedNumberRangeFormatter
void formatImpl(impl::UFormattedNumberRangeData& results, bool equalBeforeRounding,
UErrorCode& status) const;
-#endif
+#endif /* U_HIDE_INTERNAL_API */
/**
* Destruct this LocalizedNumberRangeFormatter, cleaning up any memory it might own.
- * @draft ICU 63
+ * @stable ICU 63
*/
~LocalizedNumberRangeFormatter();
@@ -654,33 +693,41 @@ class U_I18N_API LocalizedNumberRangeFormatter
* The result of a number range formatting operation. This class allows the result to be exported in several data types,
* including a UnicodeString and a FieldPositionIterator.
*
- * @draft ICU 63
+ * Instances of this class are immutable and thread-safe.
+ *
+ * @stable ICU 63
*/
-class U_I18N_API FormattedNumberRange : public UMemory {
+class U_I18N_API FormattedNumberRange : public UMemory, public FormattedValue {
public:
+ // Copybrief: this method is older than the parent method
/**
- * Returns a UnicodeString representation of the formatted number range.
+ * @copybrief FormattedValue::toString()
*
- * @param status
- * Set if an error occurs while formatting the number to the UnicodeString.
- * @return a UnicodeString containing the localized number range.
- * @draft ICU 63
+ * For more information, see FormattedValue::toString()
+ *
+ * @stable ICU 63
*/
- UnicodeString toString(UErrorCode& status) const;
+ UnicodeString toString(UErrorCode& status) const U_OVERRIDE;
+ // Copydoc: this method is new in ICU 64
+ /** @copydoc FormattedValue::toTempString() */
+ UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE;
+
+ // Copybrief: this method is older than the parent method
/**
- * Appends the formatted number range to an Appendable.
+ * @copybrief FormattedValue::appendTo()
*
- * @param appendable
- * The Appendable to which to append the formatted number range string.
- * @param status
- * Set if an error occurs while formatting the number range to the Appendable.
- * @return The same Appendable, for chaining.
- * @draft ICU 63
- * @see Appendable
+ * For more information, see FormattedValue::appendTo()
+ *
+ * @stable ICU 63
*/
- Appendable &appendTo(Appendable &appendable, UErrorCode& status) const;
+ Appendable &appendTo(Appendable &appendable, UErrorCode& status) const U_OVERRIDE;
+
+ // Copydoc: this method is new in ICU 64
+ /** @copydoc FormattedValue::nextPosition() */
+ UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE;
+#ifndef U_HIDE_DRAFT_API
/**
* Determines the start (inclusive) and end (exclusive) indices of the next occurrence of the given
* <em>field</em> in the output string. This allows you to determine the locations of, for example,
@@ -758,6 +805,7 @@ class U_I18N_API FormattedNumberRange : public UMemory {
* @see #getFirstDecimal
*/
UnicodeString getSecondDecimal(UErrorCode& status) const;
+#endif // U_HIDE_DRAFT_API
/**
* Returns whether the pair of numbers was successfully formatted as a range or whether an identity fallback was
@@ -765,7 +813,7 @@ class U_I18N_API FormattedNumberRange : public UMemory {
* identity fallback was used.
*
* @return An indication the resulting identity situation in the formatted number range.
- * @draft ICU 63
+ * @stable ICU 63
* @see UNumberRangeIdentityFallback
*/
UNumberRangeIdentityResult getIdentityResult(UErrorCode& status) const;
@@ -783,39 +831,38 @@ class U_I18N_API FormattedNumberRange : public UMemory {
/**
* Move constructor:
* Leaves the source FormattedNumberRange in an undefined state.
- * @draft ICU 63
+ * @stable ICU 63
*/
FormattedNumberRange(FormattedNumberRange&& src) U_NOEXCEPT;
/**
* Move assignment:
* Leaves the source FormattedNumberRange in an undefined state.
- * @draft ICU 63
+ * @stable ICU 63
*/
FormattedNumberRange& operator=(FormattedNumberRange&& src) U_NOEXCEPT;
/**
* Destruct an instance of FormattedNumberRange, cleaning up any memory it might own.
- * @draft ICU 63
+ * @stable ICU 63
*/
~FormattedNumberRange();
private:
// Can't use LocalPointer because UFormattedNumberRangeData is forward-declared
- const impl::UFormattedNumberRangeData *fResults;
+ const impl::UFormattedNumberRangeData *fData;
// Error code for the terminal methods
UErrorCode fErrorCode;
/**
* Internal constructor from data type. Adopts the data pointer.
- * @internal
*/
explicit FormattedNumberRange(impl::UFormattedNumberRangeData *results)
- : fResults(results), fErrorCode(U_ZERO_ERROR) {};
+ : fData(results), fErrorCode(U_ZERO_ERROR) {}
explicit FormattedNumberRange(UErrorCode errorCode)
- : fResults(nullptr), fErrorCode(errorCode) {};
+ : fData(nullptr), fErrorCode(errorCode) {}
void getAllFieldPositionsImpl(FieldPositionIteratorHandler& fpih, UErrorCode& status) const;
@@ -826,7 +873,7 @@ class U_I18N_API FormattedNumberRange : public UMemory {
/**
* See the main description in numberrangeformatter.h for documentation and examples.
*
- * @draft ICU 63
+ * @stable ICU 63
*/
class U_I18N_API NumberRangeFormatter final {
public:
@@ -835,7 +882,7 @@ class U_I18N_API NumberRangeFormatter final {
* known at the call site.
*
* @return An {@link UnlocalizedNumberRangeFormatter}, to be used for chaining.
- * @draft ICU 63
+ * @stable ICU 63
*/
static UnlocalizedNumberRangeFormatter with();
@@ -846,7 +893,7 @@ class U_I18N_API NumberRangeFormatter final {
* @param locale
* The locale from which to load formats and symbols for number range formatting.
* @return A {@link LocalizedNumberRangeFormatter}, to be used for chaining.
- * @draft ICU 63
+ * @stable ICU 63
*/
static LocalizedNumberRangeFormatter withLocale(const Locale &locale);
@@ -859,8 +906,9 @@ class U_I18N_API NumberRangeFormatter final {
} // namespace number
U_NAMESPACE_END
-#endif // U_HIDE_DRAFT_API
+#endif /* #if !UCONFIG_NO_FORMATTING */
+
+#endif /* U_SHOW_CPLUSPLUS_API */
#endif // __NUMBERRANGEFORMATTER_H__
-#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/numfmt.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/numfmt.h
index 1e554918ec3..722e6b7e74c 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/numfmt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/numfmt.h
@@ -26,6 +26,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Compatibility APIs for number formatting.
@@ -237,6 +239,12 @@ public:
kPermillField = UNUM_PERMILL_FIELD,
/** @stable ICU 2.0 */
kSignField = UNUM_SIGN_FIELD,
+#ifndef U_HIDE_DRAFT_API
+ /** @draft ICU 64 */
+ kMeasureUnitField = UNUM_MEASURE_UNIT_FIELD,
+ /** @draft ICU 64 */
+ kCompactField = UNUM_COMPACT_FIELD,
+#endif // U_HIDE_DRAFT_API
/**
* These constants are provided for backwards compatibility only.
@@ -255,6 +263,14 @@ public:
virtual ~NumberFormat();
/**
+ * Clones this object polymorphically.
+ * The caller owns the result and should delete it when done.
+ * @return clone, or nullptr if an error occurred
+ * @stable ICU 2.0
+ */
+ virtual NumberFormat* clone() const = 0;
+
+ /**
* Return true if the given Format objects are semantically equal.
* Objects of different subclasses are considered unequal.
* @return true if the given Format objects are semantically equal.
@@ -633,7 +649,9 @@ public:
* @param result Formattable to be set to the parse result.
* If parse fails, return contents are undefined.
* @param status Output parameter set to a failure error code
- * when a failure occurs.
+ * when a failure occurs. The error code when the
+ * string fails to parse is U_INVALID_FORMAT_ERROR,
+ * unless overridden by a subclass.
* @see NumberFormat::isParseIntegerOnly
* @stable ICU 2.0
*/
@@ -1249,5 +1267,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _NUMFMT
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/numsys.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/numsys.h
index 9ec3f13fd10..b2b16fa0d0e 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/numsys.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/numsys.h
@@ -20,13 +20,7 @@
#include "unicode/utypes.h"
-/**
- * \def NUMSYS_NAME_CAPACITY
- * Size of a numbering system name.
- * @internal
- */
-#define NUMSYS_NAME_CAPACITY 8
-
+#if U_SHOW_CPLUSPLUS_API
/**
* \file
@@ -35,12 +29,18 @@
#if !UCONFIG_NO_FORMATTING
-
#include "unicode/format.h"
#include "unicode/uobject.h"
U_NAMESPACE_BEGIN
+// can't be #ifndef U_HIDE_INTERNAL_API; needed for char[] field size
+/**
+ * Size of a numbering system name.
+ * @internal
+ */
+constexpr const size_t kInternalNumSysNameCapacity = 8;
+
/**
* Defines numbering systems. A numbering system describes the scheme by which
* numbers are to be presented to the end user. In its simplest form, a numbering
@@ -106,9 +106,13 @@ public:
/**
* Return a StringEnumeration over all the names of numbering systems known to ICU.
+ * The numbering system names will be in alphabetical (invariant) order.
+ *
+ * The returned StringEnumeration is owned by the caller, who must delete it when
+ * finished with it.
+ *
* @stable ICU 4.2
*/
-
static StringEnumeration * U_EXPORT2 getAvailableNames(UErrorCode& status);
/**
@@ -119,8 +123,10 @@ public:
* default, native, traditional, finance - do not identify specific numbering systems,
* but rather key values that may only be used as part of a locale, which in turn
* defines how they are mapped to a specific numbering system such as "latn" or "hant".
+ *
* @param name The name of the numbering system.
- * @param status ICU status
+ * @param status ICU status; set to U_UNSUPPORTED_ERROR if numbering system not found.
+ * @return The NumberingSystem instance, or nullptr if not found.
* @stable ICU 4.2
*/
static NumberingSystem* U_EXPORT2 createInstanceByName(const char* name, UErrorCode& status);
@@ -187,7 +193,7 @@ private:
UnicodeString desc;
int32_t radix;
UBool algorithmic;
- char name[NUMSYS_NAME_CAPACITY+1];
+ char name[kInternalNumSysNameCapacity+1];
void setRadix(int32_t radix);
@@ -206,5 +212,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _NUMSYS
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/plurfmt.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/plurfmt.h
index cb901b0c7b5..2c2116586f6 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/plurfmt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/plurfmt.h
@@ -16,6 +16,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: PluralFormat object
@@ -448,7 +450,7 @@ public:
* result and should delete it when done.
* @stable ICU 4.0
*/
- virtual Format* clone(void) const;
+ virtual PluralFormat* clone() const;
/**
* Formats a plural message for a number taken from a Formattable object.
@@ -522,7 +524,7 @@ public:
private:
/**
- * @internal
+ * @internal (private)
*/
class U_I18N_API PluralSelector : public UMemory {
public:
@@ -534,14 +536,11 @@ private:
* @param number The number to be plural-formatted.
* @param ec Error code.
* @return The selected PluralFormat keyword.
- * @internal
+ * @internal (private)
*/
virtual UnicodeString select(void *context, double number, UErrorCode& ec) const = 0;
};
- /**
- * @internal
- */
class U_I18N_API PluralSelectorAdapter : public PluralSelector {
public:
PluralSelectorAdapter() : pluralRules(NULL) {
@@ -549,7 +548,7 @@ private:
virtual ~PluralSelectorAdapter();
- virtual UnicodeString select(void *context, double number, UErrorCode& /*ec*/) const; /**< @internal */
+ virtual UnicodeString select(void *context, double number, UErrorCode& /*ec*/) const;
void reset();
@@ -573,7 +572,7 @@ private:
UnicodeString& format(const Formattable& numberObject, double number,
UnicodeString& appendTo,
FieldPosition& pos,
- UErrorCode& status) const; /**< @internal */
+ UErrorCode& status) const;
/**
* Finds the PluralFormat sub-message for the given number, or the "other" sub-message.
@@ -601,5 +600,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _PLURFMT
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/plurrule.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/plurrule.h
index daeed52bee6..a1553567caf 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/plurrule.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/plurrule.h
@@ -20,6 +20,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: PluralRules object
@@ -50,6 +52,10 @@ class PluralKeywordEnumeration;
class AndConstraint;
class SharedPluralRules;
+namespace number {
+class FormattedNumber;
+}
+
/**
* Defines rules for mapping non-negative numeric values onto a small set of
* keywords. Rules are constructed from a text description, consisting
@@ -323,9 +329,9 @@ public:
#endif /* U_HIDE_INTERNAL_API */
/**
- * Given a number, returns the keyword of the first rule that applies to
- * the number. This function can be used with isKeyword* functions to
- * determine the keyword for default plural rules.
+ * Given an integer, returns the keyword of the first rule
+ * that applies to the number. This function can be used with
+ * isKeyword* functions to determine the keyword for default plural rules.
*
* @param number The number for which the rule has to be determined.
* @return The keyword of the selected rule.
@@ -334,9 +340,9 @@ public:
UnicodeString select(int32_t number) const;
/**
- * Given a number, returns the keyword of the first rule that applies to
- * the number. This function can be used with isKeyword* functions to
- * determine the keyword for default plural rules.
+ * Given a floating-point number, returns the keyword of the first rule
+ * that applies to the number. This function can be used with
+ * isKeyword* functions to determine the keyword for default plural rules.
*
* @param number The number for which the rule has to be determined.
* @return The keyword of the selected rule.
@@ -344,6 +350,25 @@ public:
*/
UnicodeString select(double number) const;
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Given a formatted number, returns the keyword of the first rule
+ * that applies to the number. This function can be used with
+ * isKeyword* functions to determine the keyword for default plural rules.
+ *
+ * A FormattedNumber allows you to specify an exponent or trailing zeros,
+ * which can affect the plural category. To get a FormattedNumber, see
+ * NumberFormatter.
+ *
+ * @param number The number for which the rule has to be determined.
+ * @param status Set if an error occurs while selecting plural keyword.
+ * This could happen if the FormattedNumber is invalid.
+ * @return The keyword of the selected rule.
+ * @draft ICU 64
+ */
+ UnicodeString select(const number::FormattedNumber& number, UErrorCode& status) const;
+#endif /* U_HIDE_DRAFT_API */
+
#ifndef U_HIDE_INTERNAL_API
/**
* @internal
@@ -510,5 +535,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _PLURRULE
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/rbnf.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/rbnf.h
index d6ba523b780..62b02324b14 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/rbnf.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/rbnf.h
@@ -12,6 +12,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Rule Based Number Format
@@ -696,7 +698,7 @@ public:
* @return A copy of the object.
* @stable ICU 2.6
*/
- virtual Format* clone(void) const;
+ virtual RuleBasedNumberFormat* clone() const;
/**
* Return true if the given Format objects are semantically equal.
@@ -877,28 +879,6 @@ protected:
* @param number The number, a DigitList format Decimal Floating Point.
* @param appendTo Output parameter to receive result.
* Result is appended to existing contents.
- * @param posIter On return, can be used to iterate over positions
- * of fields generated by this format call.
- * @param status Output param filled with success/failure status.
- * @return Reference to 'appendTo' parameter.
- * @internal
- */
- virtual UnicodeString& format(const number::impl::DecimalQuantity &number,
- UnicodeString& appendTo,
- FieldPositionIterator* posIter,
- UErrorCode& status) const;
-
- /**
- * Format a decimal number.
- * The number is a DigitList wrapper onto a floating point decimal number.
- * The default implementation in NumberFormat converts the decimal number
- * to a double and formats that. Subclasses of NumberFormat that want
- * to specifically handle big decimal numbers must override this method.
- * class DecimalFormat does so.
- *
- * @param number The number, a DigitList format Decimal Floating Point.
- * @param appendTo Output parameter to receive result.
- * Result is appended to existing contents.
* @param pos On input: an alignment field, if desired.
* On output: the offsets of the alignment field.
* @param status Output param filled with success/failure status.
@@ -1135,5 +1115,7 @@ U_NAMESPACE_END
/* U_HAVE_RBNF */
#endif
+#endif /* U_SHOW_CPLUSPLUS_API */
+
/* RBNF_H */
#endif
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/rbtz.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/rbtz.h
index 6d652f692b2..d66e1f08ec8 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/rbtz.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/rbtz.h
@@ -11,6 +11,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Rule based customizable time zone
@@ -121,7 +123,7 @@ public:
* @return A new copy of this TimeZone object.
* @stable ICU 3.8
*/
- virtual TimeZone* clone(void) const;
+ virtual RuleBasedTimeZone* clone() const;
/**
* Returns the TimeZone's adjusted GMT offset (i.e., the number of milliseconds to add
@@ -224,6 +226,7 @@ public:
*/
virtual UBool useDaylightTime(void) const;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Queries if the given date is in daylight savings time in
* this time zone.
@@ -238,6 +241,7 @@ public:
* @deprecated ICU 2.4. Use Calendar::inDaylightTime() instead.
*/
virtual UBool inDaylightTime(UDate date, UErrorCode& status) const;
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Returns true if this zone has the same rule and offset as another zone.
@@ -359,6 +363,8 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // RBTZ_H
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/regex.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/regex.h
index 6829f7ba472..69fb7ecd093 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/regex.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/regex.h
@@ -24,28 +24,28 @@
* \file
* \brief C++ API: Regular Expressions
*
- * <h2>Regular Expression API</h2>
- *
- * <p>The ICU API for processing regular expressions consists of two classes,
- * <code>RegexPattern</code> and <code>RegexMatcher</code>.
- * <code>RegexPattern</code> objects represent a pre-processed, or compiled
+ * The ICU API for processing regular expressions consists of two classes,
+ * `RegexPattern` and `RegexMatcher`.
+ * `RegexPattern` objects represent a pre-processed, or compiled
* regular expression. They are created from a regular expression pattern string,
- * and can be used to create <code>RegexMatcher</code> objects for the pattern.</p>
+ * and can be used to create `RegexMatcher` objects for the pattern.
*
- * <p>Class <code>RegexMatcher</code> bundles together a regular expression
+ * Class `RegexMatcher` bundles together a regular expression
* pattern and a target string to which the search pattern will be applied.
- * <code>RegexMatcher</code> includes API for doing plain find or search
+ * `RegexMatcher` includes API for doing plain find or search
* operations, for search and replace operations, and for obtaining detailed
- * information about bounds of a match. </p>
+ * information about bounds of a match.
*
- * <p>Note that by constructing <code>RegexMatcher</code> objects directly from regular
+ * Note that by constructing `RegexMatcher` objects directly from regular
* expression pattern strings application code can be simplified and the explicit
- * need for <code>RegexPattern</code> objects can usually be eliminated.
- * </p>
+ * need for `RegexPattern` objects can usually be eliminated.
+ *
*/
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_REGULAR_EXPRESSIONS
#include "unicode/uobject.h"
@@ -74,13 +74,13 @@ class UVector64;
/**
- * Class <code>RegexPattern</code> represents a compiled regular expression. It includes
+ * Class `RegexPattern` represents a compiled regular expression. It includes
* factory methods for creating a RegexPattern object from the source (string) form
* of a regular expression, methods for creating RegexMatchers that allow the pattern
* to be applied to input text, and a few convenience methods for simple common
* uses of regular expressions.
*
- * <p>Class RegexPattern is not intended to be subclassed.</p>
+ * Class RegexPattern is not intended to be subclassed.
*
* @stable ICU 2.4
*/
@@ -90,7 +90,7 @@ public:
/**
* default constructor. Create a RegexPattern object that refers to no actual
* pattern. Not normally needed; RegexPattern objects are usually
- * created using the factory method <code>compile()</code>.
+ * created using the factory method `compile()`.
*
* @stable ICU 2.4
*/
@@ -113,7 +113,7 @@ public:
/**
* Comparison operator. Two RegexPattern objects are considered equal if they
- * were constructed from identical source patterns using the same match flag
+ * were constructed from identical source patterns using the same #URegexpFlag
* settings.
* @param that a RegexPattern object to compare with "this".
* @return TRUE if the objects are equivalent.
@@ -123,7 +123,7 @@ public:
/**
* Comparison operator. Two RegexPattern objects are considered equal if they
- * were constructed from identical source patterns using the same match flag
+ * were constructed from identical source patterns using the same #URegexpFlag
* settings.
* @param that a RegexPattern object to compare with "this".
* @return TRUE if the objects are different.
@@ -153,16 +153,16 @@ public:
* object. These compile methods, rather than the constructors, are the usual
* way that RegexPattern objects are created.
*
- * <p>Note that RegexPattern objects must not be deleted while RegexMatcher
+ * Note that RegexPattern objects must not be deleted while RegexMatcher
* objects created from the pattern are active. RegexMatchers keep a pointer
* back to their pattern, so premature deletion of the pattern is a
- * catastrophic error.</p>
+ * catastrophic error.
*
- * <p>All pattern match mode flags are set to their default values.</p>
+ * All #URegexpFlag pattern match mode flags are set to their default values.
*
- * <p>Note that it is often more convenient to construct a RegexMatcher directly
+ * Note that it is often more convenient to construct a RegexMatcher directly
* from a pattern string rather than separately compiling the pattern and
- * then creating a RegexMatcher object from the pattern.</p>
+ * then creating a RegexMatcher object from the pattern.
*
* @param regex The regular expression to be compiled.
* @param pe Receives the position (line and column nubers) of any error
@@ -181,16 +181,16 @@ public:
* object. These compile methods, rather than the constructors, are the usual
* way that RegexPattern objects are created.
*
- * <p>Note that RegexPattern objects must not be deleted while RegexMatcher
+ * Note that RegexPattern objects must not be deleted while RegexMatcher
* objects created from the pattern are active. RegexMatchers keep a pointer
* back to their pattern, so premature deletion of the pattern is a
- * catastrophic error.</p>
+ * catastrophic error.
*
- * <p>All pattern match mode flags are set to their default values.</p>
+ * All #URegexpFlag pattern match mode flags are set to their default values.
*
- * <p>Note that it is often more convenient to construct a RegexMatcher directly
+ * Note that it is often more convenient to construct a RegexMatcher directly
* from a pattern string rather than separately compiling the pattern and
- * then creating a RegexMatcher object from the pattern.</p>
+ * then creating a RegexMatcher object from the pattern.
*
* @param regex The regular expression to be compiled. Note, the text referred
* to by this UText must not be deleted during the lifetime of the
@@ -208,21 +208,21 @@ public:
/**
* Compiles the regular expression in string form into a RegexPattern
- * object using the specified match mode flags. These compile methods,
+ * object using the specified #URegexpFlag match mode flags. These compile methods,
* rather than the constructors, are the usual way that RegexPattern objects
* are created.
*
- * <p>Note that RegexPattern objects must not be deleted while RegexMatcher
+ * Note that RegexPattern objects must not be deleted while RegexMatcher
* objects created from the pattern are active. RegexMatchers keep a pointer
* back to their pattern, so premature deletion of the pattern is a
- * catastrophic error.</p>
+ * catastrophic error.
*
- * <p>Note that it is often more convenient to construct a RegexMatcher directly
+ * Note that it is often more convenient to construct a RegexMatcher directly
* from a pattern string instead of than separately compiling the pattern and
- * then creating a RegexMatcher object from the pattern.</p>
+ * then creating a RegexMatcher object from the pattern.
*
* @param regex The regular expression to be compiled.
- * @param flags The match mode flags to be used.
+ * @param flags The #URegexpFlag match mode flags to be used, e.g. #UREGEX_CASE_INSENSITIVE.
* @param pe Receives the position (line and column numbers) of any error
* within the regular expression.)
* @param status A reference to a UErrorCode to receive any errors.
@@ -237,23 +237,23 @@ public:
/**
* Compiles the regular expression in string form into a RegexPattern
- * object using the specified match mode flags. These compile methods,
+ * object using the specified #URegexpFlag match mode flags. These compile methods,
* rather than the constructors, are the usual way that RegexPattern objects
* are created.
*
- * <p>Note that RegexPattern objects must not be deleted while RegexMatcher
+ * Note that RegexPattern objects must not be deleted while RegexMatcher
* objects created from the pattern are active. RegexMatchers keep a pointer
* back to their pattern, so premature deletion of the pattern is a
- * catastrophic error.</p>
+ * catastrophic error.
*
- * <p>Note that it is often more convenient to construct a RegexMatcher directly
+ * Note that it is often more convenient to construct a RegexMatcher directly
* from a pattern string instead of than separately compiling the pattern and
- * then creating a RegexMatcher object from the pattern.</p>
+ * then creating a RegexMatcher object from the pattern.
*
* @param regex The regular expression to be compiled. Note, the text referred
* to by this UText must not be deleted during the lifetime of the
* RegexPattern object or any RegexMatcher object created from it.
- * @param flags The match mode flags to be used.
+ * @param flags The #URegexpFlag match mode flags to be used, e.g. #UREGEX_CASE_INSENSITIVE.
* @param pe Receives the position (line and column numbers) of any error
* within the regular expression.)
* @param status A reference to a UErrorCode to receive any errors.
@@ -268,21 +268,21 @@ public:
/**
* Compiles the regular expression in string form into a RegexPattern
- * object using the specified match mode flags. These compile methods,
+ * object using the specified #URegexpFlag match mode flags. These compile methods,
* rather than the constructors, are the usual way that RegexPattern objects
* are created.
*
- * <p>Note that RegexPattern objects must not be deleted while RegexMatcher
+ * Note that RegexPattern objects must not be deleted while RegexMatcher
* objects created from the pattern are active. RegexMatchers keep a pointer
* back to their pattern, so premature deletion of the pattern is a
- * catastrophic error.</p>
+ * catastrophic error.
*
- * <p>Note that it is often more convenient to construct a RegexMatcher directly
+ * Note that it is often more convenient to construct a RegexMatcher directly
* from a pattern string instead of than separately compiling the pattern and
- * then creating a RegexMatcher object from the pattern.</p>
+ * then creating a RegexMatcher object from the pattern.
*
* @param regex The regular expression to be compiled.
- * @param flags The match mode flags to be used.
+ * @param flags The #URegexpFlag match mode flags to be used, e.g. #UREGEX_CASE_INSENSITIVE.
* @param status A reference to a UErrorCode to receive any errors.
* @return A regexPattern object for the compiled pattern.
*
@@ -294,23 +294,23 @@ public:
/**
* Compiles the regular expression in string form into a RegexPattern
- * object using the specified match mode flags. These compile methods,
+ * object using the specified #URegexpFlag match mode flags. These compile methods,
* rather than the constructors, are the usual way that RegexPattern objects
* are created.
*
- * <p>Note that RegexPattern objects must not be deleted while RegexMatcher
+ * Note that RegexPattern objects must not be deleted while RegexMatcher
* objects created from the pattern are active. RegexMatchers keep a pointer
* back to their pattern, so premature deletion of the pattern is a
- * catastrophic error.</p>
+ * catastrophic error.
*
- * <p>Note that it is often more convenient to construct a RegexMatcher directly
+ * Note that it is often more convenient to construct a RegexMatcher directly
* from a pattern string instead of than separately compiling the pattern and
- * then creating a RegexMatcher object from the pattern.</p>
+ * then creating a RegexMatcher object from the pattern.
*
* @param regex The regular expression to be compiled. Note, the text referred
* to by this UText must not be deleted during the lifetime of the
* RegexPattern object or any RegexMatcher object created from it.
- * @param flags The match mode flags to be used.
+ * @param flags The #URegexpFlag match mode flags to be used, e.g. #UREGEX_CASE_INSENSITIVE.
* @param status A reference to a UErrorCode to receive any errors.
* @return A regexPattern object for the compiled pattern.
*
@@ -321,8 +321,8 @@ public:
UErrorCode &status);
/**
- * Get the match mode flags that were used when compiling this pattern.
- * @return the match mode flags
+ * Get the #URegexpFlag match mode flags that were used when compiling this pattern.
+ * @return the #URegexpFlag match mode flags
* @stable ICU 2.4
*/
virtual uint32_t flags() const;
@@ -332,7 +332,7 @@ public:
* RegexMatcher can then be used to perform match, find or replace operations
* on the input. Note that a RegexPattern object must not be deleted while
* RegexMatchers created from it still exist and might possibly be used again.
- * <p>
+ *
* The matcher will retain a reference to the supplied input string, and all regexp
* pattern matching operations happen directly on this original string. It is
* critical that the string not be altered or deleted before use by the regular
@@ -352,12 +352,12 @@ private:
* Cause a compilation error if an application accidentally attempts to
* create a matcher with a (char16_t *) string as input rather than
* a UnicodeString. Avoids a dangling reference to a temporary string.
- * <p>
+ *
* To efficiently work with char16_t *strings, wrap the data in a UnicodeString
* using one of the aliasing constructors, such as
- * <code>UnicodeString(UBool isTerminated, const char16_t *text, int32_t textLength);</code>
+ * `UnicodeString(UBool isTerminated, const char16_t *text, int32_t textLength);`
* or in a UText, using
- * <code>utext_openUChars(UText *ut, const char16_t *text, int64_t textLength, UErrorCode *status);</code>
+ * `utext_openUChars(UText *ut, const char16_t *text, int64_t textLength, UErrorCode *status);`
*
*/
RegexMatcher *matcher(const char16_t *input,
@@ -521,7 +521,7 @@ public:
/**
- * Split a string into fields. Somewhat like split() from Perl or Java.
+ * Split a string into fields. Somewhat like %split() from Perl or Java.
* Pattern matches identify delimiters that separate the input
* into fields. The input data between the delimiters becomes the
* fields themselves.
@@ -540,7 +540,7 @@ public:
* This behavior differs from Java, which ignores capture groups.
*
* For the best performance on split() operations,
- * <code>RegexMatcher::split</code> is preferable to this function
+ * `RegexMatcher::split()` is preferable to this function
*
* @param input The string to be split into fields. The field delimiters
* match the pattern (in the "this" object)
@@ -673,8 +673,7 @@ public:
* its matcher() method to create the RegexMatcher objects.
*
* @param regexp The Regular Expression to be compiled.
- * @param flags Regular expression options, such as case insensitive matching.
- * @see UREGEX_CASE_INSENSITIVE
+ * @param flags #URegexpFlag options, such as #UREGEX_CASE_INSENSITIVE.
* @param status Any errors are reported by setting this UErrorCode variable.
* @stable ICU 2.6
*/
@@ -689,8 +688,7 @@ public:
* its matcher() method to create the RegexMatcher objects.
*
* @param regexp The regular expression to be compiled.
- * @param flags Regular expression options, such as case insensitive matching.
- * @see UREGEX_CASE_INSENSITIVE
+ * @param flags #URegexpFlag options, such as #UREGEX_CASE_INSENSITIVE.
* @param status Any errors are reported by setting this UErrorCode variable.
*
* @stable ICU 4.6
@@ -704,7 +702,7 @@ public:
* created for the same expression, it will be more efficient to
* separately create and cache a RegexPattern object, and use
* its matcher() method to create the RegexMatcher objects.
- * <p>
+ *
* The matcher will retain a reference to the supplied input string, and all regexp
* pattern matching operations happen directly on the original string. It is
* critical that the string not be altered or deleted before use by the regular
@@ -713,8 +711,7 @@ public:
* @param regexp The Regular Expression to be compiled.
* @param input The string to match. The matcher retains a reference to the
* caller's string; mo copy is made.
- * @param flags Regular expression options, such as case insensitive matching.
- * @see UREGEX_CASE_INSENSITIVE
+ * @param flags #URegexpFlag options, such as #UREGEX_CASE_INSENSITIVE.
* @param status Any errors are reported by setting this UErrorCode variable.
* @stable ICU 2.6
*/
@@ -728,7 +725,7 @@ public:
* created for the same expression, it will be more efficient to
* separately create and cache a RegexPattern object, and use
* its matcher() method to create the RegexMatcher objects.
- * <p>
+ *
* The matcher will make a shallow clone of the supplied input text, and all regexp
* pattern matching operations happen on this clone. While read-only operations on
* the supplied text are permitted, it is critical that the underlying string not be
@@ -736,8 +733,7 @@ public:
*
* @param regexp The Regular Expression to be compiled.
* @param input The string to match. The matcher retains a shallow clone of the text.
- * @param flags Regular expression options, such as case insensitive matching.
- * @see UREGEX_CASE_INSENSITIVE
+ * @param flags #URegexpFlag options, such as #UREGEX_CASE_INSENSITIVE.
* @param status Any errors are reported by setting this UErrorCode variable.
*
* @stable ICU 4.6
@@ -750,13 +746,12 @@ private:
* Cause a compilation error if an application accidentally attempts to
* create a matcher with a (char16_t *) string as input rather than
* a UnicodeString. Avoids a dangling reference to a temporary string.
- * <p>
+ *
* To efficiently work with char16_t *strings, wrap the data in a UnicodeString
* using one of the aliasing constructors, such as
- * <code>UnicodeString(UBool isTerminated, const char16_t *text, int32_t textLength);</code>
+ * `UnicodeString(UBool isTerminated, const char16_t *text, int32_t textLength);`
* or in a UText, using
- * <code>utext_openUChars(UText *ut, const char16_t *text, int64_t textLength, UErrorCode *status);</code>
- *
+ * `utext_openUChars(UText *ut, const char16_t *text, int64_t textLength, UErrorCode *status);`
*/
RegexMatcher(const UnicodeString &regexp, const char16_t *input,
uint32_t flags, UErrorCode &status);
@@ -799,8 +794,8 @@ public:
* always starts at the beginning of the input region;
* unlike that function, it does not require that the entire region be matched.
*
- * <p>If the match succeeds then more information can be obtained via the <code>start()</code>,
- * <code>end()</code>, and <code>group()</code> functions.</p>
+ * If the match succeeds then more information can be obtained via the start(),
+ * end(), and group() functions.
*
* @param status A reference to a UErrorCode to receive any errors.
* @return TRUE if there is a match at the start of the input string.
@@ -814,8 +809,8 @@ public:
* The match may be of any length, and is not required to extend to the end
* of the input string. Contrast with match().
*
- * <p>If the match succeeds then more information can be obtained via the <code>start()</code>,
- * <code>end()</code>, and <code>group()</code> functions.</p>
+ * If the match succeeds then more information can be obtained via the start(),
+ * end(), and group() functions.
*
* @param startIndex The input string (native) index at which to begin matching.
* @param status A reference to a UErrorCode to receive any errors.
@@ -829,11 +824,11 @@ public:
* Find the next pattern match in the input string.
* The find begins searching the input at the location following the end of
* the previous match, or at the start of the string if there is no previous match.
- * If a match is found, <code>start(), end()</code> and <code>group()</code>
+ * If a match is found, `start()`, `end()` and `group()`
* will provide more information regarding the match.
- * <p>Note that if the input string is changed by the application,
+ * Note that if the input string is changed by the application,
* use find(startPos, status) instead of find(), because the saved starting
- * position may not be valid with the altered input string.</p>
+ * position may not be valid with the altered input string.
* @return TRUE if a match is found.
* @stable ICU 2.4
*/
@@ -844,11 +839,12 @@ public:
* Find the next pattern match in the input string.
* The find begins searching the input at the location following the end of
* the previous match, or at the start of the string if there is no previous match.
- * If a match is found, <code>start(), end()</code> and <code>group()</code>
+ * If a match is found, `start()`, `end()` and `group()`
* will provide more information regarding the match.
- * <p>Note that if the input string is changed by the application,
- * use find(startPos, status) instead of find(), because the saved starting
- * position may not be valid with the altered input string.</p>
+ *
+ * Note that if the input string is changed by the application,
+ * use find(startPos, status) instead of find(), because the saved starting
+ * position may not be valid with the altered input string.
* @param status A reference to a UErrorCode to receive any errors.
* @return TRUE if a match is found.
* @stable ICU 55
@@ -1078,10 +1074,10 @@ public:
* The effect is to remove any memory of previous matches,
* and to cause subsequent find() operations to begin at
* the specified (native) position in the input string.
- * <p>
+ *
* The matcher's region is reset to its default, which is the entire
* input string.
- * <p>
+ *
* An alternative to this function is to set a match region
* beginning at the desired index.
*
@@ -1158,12 +1154,12 @@ private:
* Cause a compilation error if an application accidentally attempts to
* reset a matcher with a (char16_t *) string as input rather than
* a UnicodeString. Avoids a dangling reference to a temporary string.
- * <p>
+ *
* To efficiently work with char16_t *strings, wrap the data in a UnicodeString
* using one of the aliasing constructors, such as
- * <code>UnicodeString(UBool isTerminated, const char16_t *text, int32_t textLength);</code>
+ * `UnicodeString(UBool isTerminated, const char16_t *text, int32_t textLength);`
* or in a UText, using
- * <code>utext_openUChars(UText *ut, const char16_t *text, int64_t textLength, UErrorCode *status);</code>
+ * `utext_openUChars(UText *ut, const char16_t *text, int64_t textLength, UErrorCode *status);`
*
*/
RegexMatcher &reset(const char16_t *input);
@@ -1412,15 +1408,15 @@ public:
* the pattern with the replacement string. This is a convenience
* function that provides a complete find-and-replace operation.
*
- * <p>This function first resets this RegexMatcher. It then scans the input string
+ * This function first resets this RegexMatcher. It then scans the input string
* looking for a match of the pattern. Input that is not part
* of the match is appended directly to the result string; the match is replaced
* in the result by the replacement string. The replacement string may contain
- * references to captured groups.</p>
+ * references to captured groups.
*
- * <p>The state of the matcher (the position at which a subsequent find()
+ * The state of the matcher (the position at which a subsequent find()
* would begin) after completing a replaceFirst() is not specified. The
- * RegexMatcher should be reset before doing additional find() operations.</p>
+ * RegexMatcher should be reset before doing additional find() operations.
*
* @param replacement a string containing the replacement text.
* @param status a reference to a UErrorCode to receive any errors.
@@ -1435,15 +1431,15 @@ public:
* the pattern with the replacement string. This is a convenience
* function that provides a complete find-and-replace operation.
*
- * <p>This function first resets this RegexMatcher. It then scans the input string
+ * This function first resets this RegexMatcher. It then scans the input string
* looking for a match of the pattern. Input that is not part
* of the match is appended directly to the result string; the match is replaced
* in the result by the replacement string. The replacement string may contain
- * references to captured groups.</p>
+ * references to captured groups.
*
- * <p>The state of the matcher (the position at which a subsequent find()
+ * The state of the matcher (the position at which a subsequent find()
* would begin) after completing a replaceFirst() is not specified. The
- * RegexMatcher should be reset before doing additional find() operations.</p>
+ * RegexMatcher should be reset before doing additional find() operations.
*
* @param replacement a string containing the replacement text.
* @param dest a mutable UText in which the results are placed.
@@ -1461,13 +1457,13 @@ public:
* Implements a replace operation intended to be used as part of an
* incremental find-and-replace.
*
- * <p>The input string, starting from the end of the previous replacement and ending at
+ * The input string, starting from the end of the previous replacement and ending at
* the start of the current match, is appended to the destination string. Then the
* replacement string is appended to the output string,
- * including handling any substitutions of captured text.</p>
+ * including handling any substitutions of captured text.
*
- * <p>For simple, prepackaged, non-incremental find-and-replace
- * operations, see replaceFirst() or replaceAll().</p>
+ * For simple, prepackaged, non-incremental find-and-replace
+ * operations, see replaceFirst() or replaceAll().
*
* @param dest A UnicodeString to which the results of the find-and-replace are appended.
* @param replacement A UnicodeString that provides the text to be substituted for
@@ -1492,13 +1488,13 @@ public:
* Implements a replace operation intended to be used as part of an
* incremental find-and-replace.
*
- * <p>The input string, starting from the end of the previous replacement and ending at
+ * The input string, starting from the end of the previous replacement and ending at
* the start of the current match, is appended to the destination string. Then the
* replacement string is appended to the output string,
- * including handling any substitutions of captured text.</p>
+ * including handling any substitutions of captured text.
*
- * <p>For simple, prepackaged, non-incremental find-and-replace
- * operations, see replaceFirst() or replaceAll().</p>
+ * For simple, prepackaged, non-incremental find-and-replace
+ * operations, see replaceFirst() or replaceAll().
*
* @param dest A mutable UText to which the results of the find-and-replace are appended.
* Must not be NULL.
@@ -1522,8 +1518,8 @@ public:
/**
* As the final step in a find-and-replace operation, append the remainder
* of the input string, starting at the position following the last appendReplacement(),
- * to the destination string. <code>appendTail()</code> is intended to be invoked after one
- * or more invocations of the <code>RegexMatcher::appendReplacement()</code>.
+ * to the destination string. `appendTail()` is intended to be invoked after one
+ * or more invocations of the `RegexMatcher::appendReplacement()`.
*
* @param dest A UnicodeString to which the results of the find-and-replace are appended.
* @return the destination string.
@@ -1535,8 +1531,8 @@ public:
/**
* As the final step in a find-and-replace operation, append the remainder
* of the input string, starting at the position following the last appendReplacement(),
- * to the destination string. <code>appendTail()</code> is intended to be invoked after one
- * or more invocations of the <code>RegexMatcher::appendReplacement()</code>.
+ * to the destination string. `appendTail()` is intended to be invoked after one
+ * or more invocations of the `RegexMatcher::appendReplacement()`.
*
* @param dest A mutable UText to which the results of the find-and-replace are appended.
* Must not be NULL.
@@ -1549,7 +1545,7 @@ public:
/**
- * Split a string into fields. Somewhat like split() from Perl.
+ * Split a string into fields. Somewhat like %split() from Perl.
* The pattern matches identify delimiters that separate the input
* into fields. The input data between the matches becomes the
* fields themselves.
@@ -1578,7 +1574,7 @@ public:
/**
- * Split a string into fields. Somewhat like split() from Perl.
+ * Split a string into fields. Somewhat like %split() from Perl.
* The pattern matches identify delimiters that separate the input
* into fields. The input data between the matches becomes the
* fields themselves.
@@ -1613,14 +1609,14 @@ public:
* infinite loop.
* When a limit is set a match operation will fail with an error if the
* limit is exceeded.
- * <p>
+ *
* The units of the limit are steps of the match engine.
* Correspondence with actual processor time will depend on the speed
* of the processor and the details of the specific pattern, but will
* typically be on the order of milliseconds.
- * <p>
+ *
* By default, the matching time is not limited.
- * <p>
+ *
*
* @param limit The limit value, or 0 for no limit.
* @param status A reference to a UErrorCode to receive any errors.
@@ -1639,16 +1635,16 @@ public:
/**
* Set the amount of heap storage available for use by the match backtracking stack.
* The matcher is also reset, discarding any results from previous matches.
- * <p>
+ *
* ICU uses a backtracking regular expression engine, with the backtrack stack
* maintained on the heap. This function sets the limit to the amount of memory
- * that can be used for this purpose. A backtracking stack overflow will
+ * that can be used for this purpose. A backtracking stack overflow will
* result in an error from the match operation that caused it.
- * <p>
+ *
* A limit is desirable because a malicious or poorly designed pattern can use
* excessive memory, potentially crashing the process. A limit is enabled
* by default.
- * <p>
+ *
* @param limit The maximum size, in bytes, of the matching backtrack stack.
* A value of zero means no limit.
* The limit must be greater or equal to zero.
@@ -1882,4 +1878,7 @@ private:
U_NAMESPACE_END
#endif // UCONFIG_NO_REGULAR_EXPRESSIONS
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/region.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/region.h
index 4014025f6f2..9ec8dd45156 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/region.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/region.h
@@ -16,10 +16,12 @@
*/
#include "unicode/utypes.h"
-#include "unicode/uregion.h"
+
+#if U_SHOW_CPLUSPLUS_API
#if !UCONFIG_NO_FORMATTING
+#include "unicode/uregion.h"
#include "unicode/uobject.h"
#include "unicode/uniset.h"
#include "unicode/unistr.h"
@@ -219,6 +221,9 @@ private:
U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // REGION_H
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/reldatefmt.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/reldatefmt.h
index be06b1013d5..044465b10f6 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/reldatefmt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/reldatefmt.h
@@ -15,10 +15,14 @@
#define __RELDATEFMT_H
#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/uobject.h"
#include "unicode/udisplaycontext.h"
#include "unicode/ureldatefmt.h"
#include "unicode/locid.h"
+#include "unicode/formattedvalue.h"
/**
* \file
@@ -165,12 +169,24 @@ typedef enum UDateAbsoluteUnit {
*/
UDAT_ABSOLUTE_NOW,
-#ifndef U_HIDE_DRAFT_API
/**
* Quarter
- * @draft ICU 63
+ * @stable ICU 63
*/
UDAT_ABSOLUTE_QUARTER,
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Hour
+ * @draft ICU 65
+ */
+ UDAT_ABSOLUTE_HOUR,
+
+ /**
+ * Minute
+ * @draft ICU 65
+ */
+ UDAT_ABSOLUTE_MINUTE,
#endif // U_HIDE_DRAFT_API
#ifndef U_HIDE_DEPRECATED_API
@@ -178,7 +194,7 @@ typedef enum UDateAbsoluteUnit {
* One more than the highest normal UDateAbsoluteUnit value.
* @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
*/
- UDAT_ABSOLUTE_UNIT_COUNT = UDAT_ABSOLUTE_NOW + 2
+ UDAT_ABSOLUTE_UNIT_COUNT = UDAT_ABSOLUTE_NOW + 4
#endif // U_HIDE_DEPRECATED_API
} UDateAbsoluteUnit;
@@ -245,6 +261,73 @@ class SharedPluralRules;
class SharedBreakIterator;
class NumberFormat;
class UnicodeString;
+class FormattedRelativeDateTime;
+class FormattedRelativeDateTimeData;
+
+#ifndef U_HIDE_DRAFT_API
+/**
+ * An immutable class containing the result of a relative datetime formatting operation.
+ *
+ * Instances of this class are immutable and thread-safe.
+ *
+ * Not intended for public subclassing.
+ *
+ * @draft ICU 64
+ */
+class U_I18N_API FormattedRelativeDateTime : public UMemory, public FormattedValue {
+ public:
+ /**
+ * Default constructor; makes an empty FormattedRelativeDateTime.
+ * @draft ICU 64
+ */
+ FormattedRelativeDateTime() : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
+
+ /**
+ * Move constructor: Leaves the source FormattedRelativeDateTime in an undefined state.
+ * @draft ICU 64
+ */
+ FormattedRelativeDateTime(FormattedRelativeDateTime&& src) U_NOEXCEPT;
+
+ /**
+ * Destruct an instance of FormattedRelativeDateTime.
+ * @draft ICU 64
+ */
+ virtual ~FormattedRelativeDateTime() U_OVERRIDE;
+
+ /** Copying not supported; use move constructor instead. */
+ FormattedRelativeDateTime(const FormattedRelativeDateTime&) = delete;
+
+ /** Copying not supported; use move assignment instead. */
+ FormattedRelativeDateTime& operator=(const FormattedRelativeDateTime&) = delete;
+
+ /**
+ * Move assignment: Leaves the source FormattedRelativeDateTime in an undefined state.
+ * @draft ICU 64
+ */
+ FormattedRelativeDateTime& operator=(FormattedRelativeDateTime&& src) U_NOEXCEPT;
+
+ /** @copydoc FormattedValue::toString() */
+ UnicodeString toString(UErrorCode& status) const U_OVERRIDE;
+
+ /** @copydoc FormattedValue::toTempString() */
+ UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE;
+
+ /** @copydoc FormattedValue::appendTo() */
+ Appendable &appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE;
+
+ /** @copydoc FormattedValue::nextPosition() */
+ UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE;
+
+ private:
+ FormattedRelativeDateTimeData *fData;
+ UErrorCode fErrorCode;
+ explicit FormattedRelativeDateTime(FormattedRelativeDateTimeData *results)
+ : fData(results), fErrorCode(U_ZERO_ERROR) {}
+ explicit FormattedRelativeDateTime(UErrorCode errorCode)
+ : fData(nullptr), fErrorCode(errorCode) {}
+ friend class RelativeDateTimeFormatter;
+};
+#endif /* U_HIDE_DRAFT_API */
/**
* Formats simple relative dates. There are two types of relative dates that
@@ -386,6 +469,10 @@ public:
/**
* Formats a relative date with a quantity such as "in 5 days" or
* "3 months ago"
+ *
+ * This method returns a String. To get more information about the
+ * formatting result, use formatToValue().
+ *
* @param quantity The numerical amount e.g 5. This value is formatted
* according to this object's NumberFormat object.
* @param direction NEXT means a future relative date; LAST means a past
@@ -405,8 +492,37 @@ public:
UnicodeString& appendTo,
UErrorCode& status) const;
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Formats a relative date with a quantity such as "in 5 days" or
+ * "3 months ago"
+ *
+ * This method returns a FormattedRelativeDateTime, which exposes more
+ * information than the String returned by format().
+ *
+ * @param quantity The numerical amount e.g 5. This value is formatted
+ * according to this object's NumberFormat object.
+ * @param direction NEXT means a future relative date; LAST means a past
+ * relative date. If direction is anything else, this method sets
+ * status to U_ILLEGAL_ARGUMENT_ERROR.
+ * @param unit the unit e.g day? month? year?
+ * @param status ICU error code returned here.
+ * @return The formatted relative datetime
+ * @draft ICU 64
+ */
+ FormattedRelativeDateTime formatToValue(
+ double quantity,
+ UDateDirection direction,
+ UDateRelativeUnit unit,
+ UErrorCode& status) const;
+#endif /* U_HIDE_DRAFT_API */
+
/**
* Formats a relative date without a quantity.
+ *
+ * This method returns a String. To get more information about the
+ * formatting result, use formatToValue().
+ *
* @param direction NEXT, LAST, THIS, etc.
* @param unit e.g SATURDAY, DAY, MONTH
* @param appendTo The string to which the formatted result will be
@@ -423,10 +539,35 @@ public:
UnicodeString& appendTo,
UErrorCode& status) const;
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Formats a relative date without a quantity.
+ *
+ * This method returns a FormattedRelativeDateTime, which exposes more
+ * information than the String returned by format().
+ *
+ * If the string is not available in the requested locale, the return
+ * value will be empty (calling toString will give an empty string).
+ *
+ * @param direction NEXT, LAST, THIS, etc.
+ * @param unit e.g SATURDAY, DAY, MONTH
+ * @param status ICU error code returned here.
+ * @return The formatted relative datetime
+ * @draft ICU 64
+ */
+ FormattedRelativeDateTime formatToValue(
+ UDateDirection direction,
+ UDateAbsoluteUnit unit,
+ UErrorCode& status) const;
+#endif /* U_HIDE_DRAFT_API */
+
/**
* Format a combination of URelativeDateTimeUnit and numeric offset
* using a numeric style, e.g. "1 week ago", "in 1 week",
* "5 weeks ago", "in 5 weeks".
+ *
+ * This method returns a String. To get more information about the
+ * formatting result, use formatNumericToValue().
*
* @param offset The signed offset for the specified unit. This
* will be formatted according to this object's
@@ -446,6 +587,31 @@ public:
UnicodeString& appendTo,
UErrorCode& status) const;
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Format a combination of URelativeDateTimeUnit and numeric offset
+ * using a numeric style, e.g. "1 week ago", "in 1 week",
+ * "5 weeks ago", "in 5 weeks".
+ *
+ * This method returns a FormattedRelativeDateTime, which exposes more
+ * information than the String returned by formatNumeric().
+ *
+ * @param offset The signed offset for the specified unit. This
+ * will be formatted according to this object's
+ * NumberFormat object.
+ * @param unit The unit to use when formatting the relative
+ * date, e.g. UDAT_REL_UNIT_WEEK,
+ * UDAT_REL_UNIT_FRIDAY.
+ * @param status ICU error code returned here.
+ * @return The formatted relative datetime
+ * @draft ICU 64
+ */
+ FormattedRelativeDateTime formatNumericToValue(
+ double offset,
+ URelativeDateTimeUnit unit,
+ UErrorCode& status) const;
+#endif /* U_HIDE_DRAFT_API */
+
/**
* Format a combination of URelativeDateTimeUnit and numeric offset
* using a text style if possible, e.g. "last week", "this week",
@@ -453,6 +619,9 @@ public:
* style if no appropriate text term is available for the specified
* offset in the object's locale.
*
+ * This method returns a String. To get more information about the
+ * formatting result, use formatToValue().
+ *
* @param offset The signed offset for the specified unit.
* @param unit The unit to use when formatting the relative
* date, e.g. UDAT_REL_UNIT_WEEK,
@@ -469,6 +638,31 @@ public:
UnicodeString& appendTo,
UErrorCode& status) const;
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Format a combination of URelativeDateTimeUnit and numeric offset
+ * using a text style if possible, e.g. "last week", "this week",
+ * "next week", "yesterday", "tomorrow". Falls back to numeric
+ * style if no appropriate text term is available for the specified
+ * offset in the object's locale.
+ *
+ * This method returns a FormattedRelativeDateTime, which exposes more
+ * information than the String returned by format().
+ *
+ * @param offset The signed offset for the specified unit.
+ * @param unit The unit to use when formatting the relative
+ * date, e.g. UDAT_REL_UNIT_WEEK,
+ * UDAT_REL_UNIT_FRIDAY.
+ * @param status ICU error code returned here.
+ * @return The formatted relative datetime
+ * @draft ICU 64
+ */
+ FormattedRelativeDateTime formatToValue(
+ double offset,
+ URelativeDateTimeUnit unit,
+ UErrorCode& status) const;
+#endif /* U_HIDE_DRAFT_API */
+
/**
* Combines a relative date string and a time string in this object's
* locale. This is done with the same date-time separator used for the
@@ -520,11 +714,52 @@ private:
NumberFormat *nfToAdopt,
BreakIterator *brkIter,
UErrorCode &status);
- void adjustForContext(UnicodeString &) const;
+ UnicodeString& adjustForContext(UnicodeString &) const;
+ UBool checkNoAdjustForContext(UErrorCode& status) const;
+
+ template<typename F, typename... Args>
+ UnicodeString& doFormat(
+ F callback,
+ UnicodeString& appendTo,
+ UErrorCode& status,
+ Args... args) const;
+
+#ifndef U_HIDE_DRAFT_API // for FormattedRelativeDateTime
+ template<typename F, typename... Args>
+ FormattedRelativeDateTime doFormatToValue(
+ F callback,
+ UErrorCode& status,
+ Args... args) const;
+#endif // U_HIDE_DRAFT_API
+
+ void formatImpl(
+ double quantity,
+ UDateDirection direction,
+ UDateRelativeUnit unit,
+ FormattedRelativeDateTimeData& output,
+ UErrorCode& status) const;
+ void formatAbsoluteImpl(
+ UDateDirection direction,
+ UDateAbsoluteUnit unit,
+ FormattedRelativeDateTimeData& output,
+ UErrorCode& status) const;
+ void formatNumericImpl(
+ double offset,
+ URelativeDateTimeUnit unit,
+ FormattedRelativeDateTimeData& output,
+ UErrorCode& status) const;
+ void formatRelativeImpl(
+ double offset,
+ URelativeDateTimeUnit unit,
+ FormattedRelativeDateTimeData& output,
+ UErrorCode& status) const;
};
U_NAMESPACE_END
#endif /* !UCONFIG_NO_BREAK_ITERATION */
#endif /* !UCONFIG_NO_FORMATTING */
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif /* __RELDATEFMT_H */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/scientificnumberformatter.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/scientificnumberformatter.h
index 6c34d2ce29a..7f860d4f592 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/scientificnumberformatter.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/scientificnumberformatter.h
@@ -11,6 +11,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_FORMATTING
@@ -157,7 +159,7 @@ public:
class U_I18N_API SuperscriptStyle : public Style {
public:
- virtual Style *clone() const;
+ virtual SuperscriptStyle *clone() const;
protected:
virtual UnicodeString &format(
const UnicodeString &original,
@@ -175,7 +177,7 @@ public:
: Style(),
fBeginMarkup(beginMarkup),
fEndMarkup(endMarkup) { }
- virtual Style *clone() const;
+ virtual MarkupStyle *clone() const;
protected:
virtual UnicodeString &format(
const UnicodeString &original,
@@ -214,4 +216,7 @@ U_NAMESPACE_END
#endif /* !UCONFIG_NO_FORMATTING */
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/search.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/search.h
index 65f7f10bcc1..2865366a33f 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/search.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/search.h
@@ -14,6 +14,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: SearchIterator object.
@@ -70,8 +72,7 @@ U_NAMESPACE_BEGIN
* UErrorCode error = U_ZERO_ERROR;
* for (int pos = iter->first(error); pos != USEARCH_DONE;
* pos = iter->next(error)) {
- * printf("Found match at %d pos, length is %d\n", pos,
- * iter.getMatchLength());
+ * printf("Found match at %d pos, length is %d\n", pos, iter.getMatchedLength());
* }
* </code></pre>
*
@@ -573,5 +574,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_COLLATION */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/selfmt.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/selfmt.h
index 08e9d444ee9..9b98f6db7ad 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/selfmt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/selfmt.h
@@ -18,9 +18,12 @@
#ifndef SELFMT
#define SELFMT
+#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/messagepattern.h"
#include "unicode/numfmt.h"
-#include "unicode/utypes.h"
/**
* \file
@@ -272,7 +275,7 @@ public:
* result and should delete it when done.
* @stable ICU 4.4
*/
- virtual Format* clone(void) const;
+ virtual SelectFormat* clone() const;
/**
* Format an object to produce a string.
@@ -365,5 +368,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _SELFMT
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/simpletz.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/simpletz.h
index 3ae08077e3b..980a1b8c62e 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/simpletz.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/simpletz.h
@@ -28,6 +28,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: SimpleTimeZone is a concrete subclass of TimeZone.
@@ -672,6 +674,7 @@ public:
*/
virtual UBool useDaylightTime(void) const;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Returns true if the given date is within the period when daylight savings time
* is in effect; false otherwise. If the TimeZone doesn't observe daylight savings
@@ -687,6 +690,7 @@ public:
* @deprecated ICU 2.4. Use Calendar::inDaylightTime() instead.
*/
virtual UBool inDaylightTime(UDate date, UErrorCode& status) const;
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Return true if this zone has the same rules and offset as another zone.
@@ -703,7 +707,7 @@ public:
* @return A new copy of this TimeZone object.
* @stable ICU 2.0
*/
- virtual TimeZone* clone(void) const;
+ virtual SimpleTimeZone* clone() const;
/**
* Gets the first time zone transition after the base time.
@@ -929,4 +933,6 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _SIMPLETZ
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/smpdtfmt.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/smpdtfmt.h
index 929c1b4675b..79fa817d5af 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/smpdtfmt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/smpdtfmt.h
@@ -28,6 +28,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Format and parse dates in a language-independent manner.
@@ -49,6 +51,7 @@ class FieldPositionHandler;
class TimeZoneFormat;
class SharedNumberFormat;
class SimpleDateFormatMutableNFs;
+class DateIntervalFormat;
namespace number {
class LocalizedNumberFormatter;
@@ -864,7 +867,7 @@ public:
* @return A copy of the object.
* @stable ICU 2.0
*/
- virtual Format* clone(void) const;
+ virtual SimpleDateFormat* clone() const;
/**
* Return true if the given Format objects are semantically equal. Objects
@@ -1217,6 +1220,7 @@ public:
private:
friend class DateFormat;
+ friend class DateIntervalFormat;
void initializeDefaultCentury(void);
@@ -1597,6 +1601,7 @@ private:
UBool fHasMinute;
UBool fHasSecond;
+ UBool fHasHanYearChar; // pattern contains the Han year character \u5E74
/**
* Sets fHasMinutes and fHasSeconds.
@@ -1640,7 +1645,7 @@ private:
UBool fHaveDefaultCentury;
- BreakIterator* fCapitalizationBrkIter;
+ const BreakIterator* fCapitalizationBrkIter;
};
inline UDate
@@ -1653,5 +1658,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _SMPDTFMT
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/sortkey.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/sortkey.h
index 1f4246018f0..34ed7ee6921 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/sortkey.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/sortkey.h
@@ -25,6 +25,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Keys for comparing strings multiple times.
@@ -337,4 +339,6 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_COLLATION */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/stsearch.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/stsearch.h
index 57b5b321e90..fcb5dbf2009 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/stsearch.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/stsearch.h
@@ -14,6 +14,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Service for searching text based on RuleBasedCollator.
@@ -119,8 +121,7 @@ U_NAMESPACE_BEGIN
* pos != USEARCH_DONE;
* pos = iter.next(error))
* {
- * printf("Found match at %d pos, length is %d\n", pos,
- * iter.getMatchLength());
+ * printf("Found match at %d pos, length is %d\n", pos, iter.getMatchedLength());
* }
* </code></pre>
* <p>
@@ -412,7 +413,7 @@ public:
* @return cloned object
* @stable ICU 2.0
*/
- virtual SearchIterator * safeClone(void) const;
+ virtual StringSearch * safeClone() const;
/**
* ICU "poor man's RTTI", returns a UClassID for the actual class.
@@ -502,5 +503,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_COLLATION */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/tblcoll.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/tblcoll.h
index 24ba213b41e..f5dc135bc49 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/tblcoll.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/tblcoll.h
@@ -64,6 +64,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_COLLATION
#include "unicode/coll.h"
@@ -228,7 +230,7 @@ public:
* @return a copy of this object, owned by the caller
* @stable ICU 2.0
*/
- virtual Collator* clone(void) const;
+ virtual RuleBasedCollator* clone() const;
/**
* Creates a collation element iterator for the source string. The caller of
@@ -389,6 +391,7 @@ public:
*/
virtual int32_t hashCode() const;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Gets the locale of the Collator
* @param type can be either requested, valid or actual locale. For more
@@ -400,6 +403,7 @@ public:
* @deprecated ICU 2.8 likely to change in ICU 3.0, based on feedback
*/
virtual Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Gets the tailoring rules for this collator.
@@ -545,6 +549,7 @@ public:
*/
virtual UColReorderCode getMaxVariable() const;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Sets the variable top to the primary weight of the specified string.
*
@@ -592,6 +597,7 @@ public:
* @deprecated ICU 53 Call setMaxVariable() instead.
*/
virtual void setVariableTop(uint32_t varTop, UErrorCode &status);
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Gets the variable top value of a Collator.
@@ -874,4 +880,7 @@ private:
U_NAMESPACE_END
#endif // !UCONFIG_NO_COLLATION
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // TBLCOLL_H
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/timezone.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/timezone.h
index 064703e1587..433e3b5c466 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/timezone.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/timezone.h
@@ -31,6 +31,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: TimeZone object
@@ -277,17 +279,25 @@ public:
/**
* Creates an instance of TimeZone detected from the current host
- * system configuration. Note that ICU4C does not change the default
- * time zone unless TimeZone::adoptDefault(TimeZone*) or
- * TimeZone::setDefault(const TimeZone&) is explicitly called by a
+ * system configuration. If the host system detection routines fail,
+ * or if they specify a TimeZone or TimeZone offset which is not
+ * recognized, then the special TimeZone "Etc/Unknown" is returned.
+ *
+ * Note that ICU4C does not change the default time zone unless
+ * `TimeZone::adoptDefault(TimeZone*)` or
+ * `TimeZone::setDefault(const TimeZone&)` is explicitly called by a
* user. This method does not update the current ICU's default,
* and may return a different TimeZone from the one returned by
- * TimeZone::createDefault().
+ * `TimeZone::createDefault()`.
*
* <p>This function is not thread safe.</p>
*
* @return A new instance of TimeZone detected from the current host system
* configuration.
+ * @see adoptDefault
+ * @see setDefault
+ * @see createDefault
+ * @see getUnknown
* @stable ICU 55
*/
static TimeZone* U_EXPORT2 detectHostTimeZone();
@@ -295,13 +305,14 @@ public:
/**
* Creates a new copy of the default TimeZone for this host. Unless the default time
* zone has already been set using adoptDefault() or setDefault(), the default is
- * determined by querying the system using methods in TPlatformUtilities. If the
- * system routines fail, or if they specify a TimeZone or TimeZone offset which is not
- * recognized, the TimeZone indicated by the ID kLastResortID is instantiated
- * and made the default.
+ * determined by querying the host system configuration. If the host system detection
+ * routines fail, or if they specify a TimeZone or TimeZone offset which is not
+ * recognized, then the special TimeZone "Etc/Unknown" is instantiated and made the
+ * default.
*
* @return A default TimeZone. Clients are responsible for deleting the time zone
* object returned.
+ * @see getUnknown
* @stable ICU 2.0
*/
static TimeZone* U_EXPORT2 createDefault(void);
@@ -312,10 +323,6 @@ public:
* zone is set to the default host time zone. This call adopts the TimeZone object
* passed in; the client is no longer responsible for deleting it.
*
- * <p>This function is not thread safe. It is an error for multiple threads
- * to concurrently attempt to set the default time zone, or for any thread
- * to attempt to reference the default zone while another thread is setting it.
- *
* @param zone A pointer to the new TimeZone object to use as the default.
* @stable ICU 2.0
*/
@@ -326,8 +333,6 @@ public:
* Same as adoptDefault(), except that the TimeZone object passed in is NOT adopted;
* the caller remains responsible for deleting it.
*
- * <p>See the thread safety note under adoptDefault().
- *
* @param zone The given timezone.
* @system
* @stable ICU 2.0
@@ -657,13 +662,13 @@ public:
* If the display name is not available for the locale,
* then this method returns a string in the localized GMT offset format
* such as <code>GMT[+-]HH:mm</code>.
- * @param daylight if true, return the daylight savings name.
+ * @param inDaylight if true, return the daylight savings name.
* @param style
* @param result the human-readable name of this time zone in the default locale.
* @return A reference to 'result'.
* @stable ICU 2.0
*/
- UnicodeString& getDisplayName(UBool daylight, EDisplayType style, UnicodeString& result) const;
+ UnicodeString& getDisplayName(UBool inDaylight, EDisplayType style, UnicodeString& result) const;
/**
* Returns a name of this time zone suitable for presentation to the user
@@ -671,15 +676,15 @@ public:
* If the display name is not available for the locale,
* then this method returns a string in the localized GMT offset format
* such as <code>GMT[+-]HH:mm</code>.
- * @param daylight if true, return the daylight savings name.
+ * @param inDaylight if true, return the daylight savings name.
* @param style
* @param locale the locale in which to supply the display name.
* @param result the human-readable name of this time zone in the given locale
* or in the default locale if the given locale is not recognized.
- * @return A refence to 'result'.
+ * @return A reference to 'result'.
* @stable ICU 2.0
*/
- UnicodeString& getDisplayName(UBool daylight, EDisplayType style, const Locale& locale, UnicodeString& result) const;
+ UnicodeString& getDisplayName(UBool inDaylight, EDisplayType style, const Locale& locale, UnicodeString& result) const;
/**
* Queries if this time zone uses daylight savings time.
@@ -717,6 +722,7 @@ public:
*/
virtual UBool useDaylightTime(void) const = 0;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Queries if the given date is in daylight savings time in
* this time zone.
@@ -731,6 +737,7 @@ public:
* @deprecated ICU 2.4. Use Calendar::inDaylightTime() instead.
*/
virtual UBool inDaylightTime(UDate date, UErrorCode& status) const = 0;
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Returns true if this zone has the same rule and offset as another zone.
@@ -749,7 +756,7 @@ public:
* @return A new copy of this TimeZone object.
* @stable ICU 2.0
*/
- virtual TimeZone* clone(void) const = 0;
+ virtual TimeZone* clone() const = 0;
/**
* Return the class ID for this class. This is useful only for
@@ -926,7 +933,7 @@ private:
UErrorCode& status);
/**
- * Returns the normalized custome time zone ID for the given offset fields.
+ * Returns the normalized custom time zone ID for the given offset fields.
* @param hour offset hours
* @param min offset minutes
* @param sec offset seconds
@@ -963,5 +970,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif //_TIMEZONE
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/tmunit.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/tmunit.h
index fa59f104734..2e949ddfbd5 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/tmunit.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/tmunit.h
@@ -16,6 +16,9 @@
* \brief C++ API: time unit object
*/
+#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
#include "unicode/measunit.h"
@@ -70,7 +73,7 @@ public:
* Override clone.
* @stable ICU 4.2
*/
- virtual UObject* clone() const;
+ virtual TimeUnit* clone() const;
/**
* Copy operator.
@@ -132,6 +135,8 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __TMUNIT_H__
//eof
//
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/tmutamt.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/tmutamt.h
index 274bfa6f23f..8bcc684d3a9 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/tmutamt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/tmutamt.h
@@ -16,11 +16,15 @@
* \brief C++ API: time unit amount object.
*/
-#include "unicode/measure.h"
-#include "unicode/tmunit.h"
+#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
#if !UCONFIG_NO_FORMATTING
+#include "unicode/measure.h"
+#include "unicode/tmunit.h"
+
U_NAMESPACE_BEGIN
@@ -83,7 +87,7 @@ public:
* @return a polymorphic clone of this object. The result will have the same class as returned by getDynamicClassID().
* @stable ICU 4.2
*/
- virtual UObject* clone() const;
+ virtual TimeUnitAmount* clone() const;
/**
@@ -165,6 +169,8 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __TMUTAMT_H__
//eof
//
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/tmutfmt.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/tmutfmt.h
index 8f245859a62..ad871f7c09f 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/tmutfmt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/tmutfmt.h
@@ -18,8 +18,9 @@
*/
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_FORMATTING
-#ifndef U_HIDE_DEPRECATED_API
#include "unicode/unistr.h"
#include "unicode/tmunit.h"
@@ -28,6 +29,7 @@
#include "unicode/numfmt.h"
#include "unicode/plurrule.h"
+#ifndef U_HIDE_DEPRECATED_API
/**
* Constants for various styles.
@@ -124,7 +126,7 @@ public:
* @return A copy of the object.
* @deprecated ICU 53
*/
- virtual Format* clone(void) const;
+ virtual TimeUnitFormat* clone() const;
/**
* Assignment operator
@@ -244,5 +246,7 @@ U_NAMESPACE_END
#endif /* U_HIDE_DEPRECATED_API */
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // __TMUTFMT_H__
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/translit.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/translit.h
index 6b4888145f1..fe2568d50aa 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/translit.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/translit.h
@@ -14,6 +14,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Tranforms text from one format to another.
@@ -1588,4 +1590,6 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_TRANSLITERATION */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/tzfmt.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/tzfmt.h
index d2aa768b8c8..6d3863b1e5a 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/tzfmt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/tzfmt.h
@@ -16,6 +16,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_FORMATTING
#include "unicode/format.h"
@@ -305,7 +307,7 @@ public:
* @return A copy of the object
* @stable ICU 50
*/
- virtual Format* clone() const;
+ virtual TimeZoneFormat* clone() const;
/**
* Creates an instance of <code>TimeZoneFormat</code> for the given locale.
@@ -1094,4 +1096,7 @@ private:
U_NAMESPACE_END
#endif /* !UCONFIG_NO_FORMATTING */
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/tznames.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/tznames.h
index 399265d85ae..860494221df 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/tznames.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/tznames.h
@@ -15,6 +15,8 @@
*/
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_FORMATTING
#include "unicode/uloc.h"
@@ -411,4 +413,7 @@ public:
U_NAMESPACE_END
#endif
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/tzrule.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/tzrule.h
index 1647fda703e..795806d90fb 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/tzrule.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/tzrule.h
@@ -16,6 +16,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_FORMATTING
#include "unicode/uobject.h"
@@ -45,7 +47,7 @@ public:
* @return A copy of the object.
* @stable ICU 3.8
*/
- virtual TimeZoneRule* clone(void) const = 0;
+ virtual TimeZoneRule* clone() const = 0;
/**
* Return true if the given <code>TimeZoneRule</code> objects are semantically equal. Objects
@@ -229,7 +231,7 @@ public:
* @return A copy of the object.
* @stable ICU 3.8
*/
- virtual InitialTimeZoneRule* clone(void) const;
+ virtual InitialTimeZoneRule* clone() const;
/**
* Assignment operator.
@@ -440,7 +442,7 @@ public:
* @return A copy of the object.
* @stable ICU 3.8
*/
- virtual AnnualTimeZoneRule* clone(void) const;
+ virtual AnnualTimeZoneRule* clone() const;
/**
* Assignment operator.
@@ -656,7 +658,7 @@ public:
* @return A copy of the object.
* @stable ICU 3.8
*/
- virtual TimeArrayTimeZoneRule* clone(void) const;
+ virtual TimeArrayTimeZoneRule* clone() const;
/**
* Assignment operator.
@@ -825,6 +827,8 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // TZRULE_H
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/tztrans.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/tztrans.h
index a476c68c8f7..217d711eec3 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/tztrans.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/tztrans.h
@@ -16,6 +16,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
#if !UCONFIG_NO_FORMATTING
#include "unicode/uobject.h"
@@ -68,7 +70,7 @@ public:
* @return A copy of the object.
* @stable ICU 3.8
*/
- TimeZoneTransition* clone(void) const;
+ TimeZoneTransition* clone() const;
/**
* Assignment operator.
@@ -192,6 +194,8 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // TZTRANS_H
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/ucal.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/ucal.h
index fb7c387c2d7..c198450ba2f 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/ucal.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/ucal.h
@@ -105,7 +105,7 @@
* <p>
* <strong>Note:</strong> for some non-Gregorian calendars, different
* fields may be necessary for complete disambiguation. For example, a full
- * specification of the historial Arabic astronomical calendar requires year,
+ * specification of the historical Arabic astronomical calendar requires year,
* month, day-of-month <em>and</em> day-of-week in some cases.
*
* <p>
@@ -157,6 +157,7 @@
/**
* The time zone ID reserved for unknown time zone.
+ * It behaves like the GMT/UTC time zone but has the special ID "Etc/Unknown".
* @stable ICU 4.8
*/
#define UCAL_UNKNOWN_ZONE_ID "Etc/Unknown"
@@ -440,11 +441,13 @@ enum UCalendarDateFields {
/* Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API,
* it is needed for layout of Calendar, DateFormat, and other objects */
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* One more than the highest normal UCalendarDateFields value.
* @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
*/
- UCAL_FIELD_COUNT,
+ UCAL_FIELD_COUNT,
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Field number indicating the
@@ -620,8 +623,13 @@ ucal_openCountryTimeZones(const char* country, UErrorCode* ec);
/**
* Return the default time zone. The default is determined initially
- * by querying the host operating system. It may be changed with
- * ucal_setDefaultTimeZone() or with the C++ TimeZone API.
+ * by querying the host operating system. If the host system detection
+ * routines fail, or if they specify a TimeZone or TimeZone offset
+ * which is not recognized, then the special TimeZone "Etc/Unknown"
+ * is returned.
+ *
+ * The default may be changed with `ucal_setDefaultTimeZone()` or with
+ * the C++ TimeZone API, `TimeZone::adoptDefault(TimeZone*)`.
*
* @param result A buffer to receive the result, or NULL
*
@@ -631,7 +639,9 @@ ucal_openCountryTimeZones(const char* country, UErrorCode* ec);
*
* @return The result string length, not including the terminating
* null
- *
+ *
+ * @see #UCAL_UNKNOWN_ZONE_ID
+ *
* @stable ICU 2.6
*/
U_STABLE int32_t U_EXPORT2
@@ -649,6 +659,42 @@ ucal_getDefaultTimeZone(UChar* result, int32_t resultCapacity, UErrorCode* ec);
U_STABLE void U_EXPORT2
ucal_setDefaultTimeZone(const UChar* zoneID, UErrorCode* ec);
+#ifndef U_HIDE_DRAFT_API
+
+/**
+ * Return the current host time zone. The host time zone is detected from
+ * the current host system configuration by querying the host operating
+ * system. If the host system detection routines fail, or if they specify
+ * a TimeZone or TimeZone offset which is not recognized, then the special
+ * TimeZone "Etc/Unknown" is returned.
+ *
+ * Note that host time zone and the ICU default time zone can be different.
+ *
+ * The ICU default time zone does not change once initialized unless modified
+ * by calling `ucal_setDefaultTimeZone()` or with the C++ TimeZone API,
+ * `TimeZone::adoptDefault(TimeZone*)`.
+ *
+ * If the host operating system configuration has changed since ICU has
+ * initialized then the returned value can be different than the ICU default
+ * time zone, even if the default has not changed.
+ *
+ * <p>This function is not thread safe.</p>
+ *
+ * @param result A buffer to receive the result, or NULL
+ * @param resultCapacity The capacity of the result buffer
+ * @param ec input/output error code
+ * @return The result string length, not including the terminating
+ * null
+ *
+ * @see #UCAL_UNKNOWN_ZONE_ID
+ *
+ * @draft ICU 65
+ */
+U_DRAFT int32_t U_EXPORT2
+ucal_getHostTimeZone(UChar *result, int32_t resultCapacity, UErrorCode *ec);
+
+#endif // U_HIDE_DRAFT_API
+
/**
* Return the amount of time in milliseconds that the clock is
* advanced during daylight savings time for the given time zone, or
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/ucol.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/ucol.h
index dbac48e3e49..673af1c55a7 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/ucol.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/ucol.h
@@ -344,11 +344,13 @@ typedef enum {
/* Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API,
* it is needed for layout of RuleBasedCollator object. */
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* One more than the highest normal UColAttribute value.
* @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
*/
UCOL_ATTRIBUTE_COUNT
+#endif // U_FORCE_HIDE_DEPRECATED_API
} UColAttribute;
/** Options for retrieving the rule string
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/udat.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/udat.h
index 90aff20df2a..bdbd080c005 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/udat.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/udat.h
@@ -482,6 +482,27 @@ typedef enum UDateFormatStyle {
#define UDAT_HOUR_TZ "jz"
#endif /* U_HIDE_DEPRECATED_API */
+#ifndef U_HIDE_INTERNAL_API
+/**
+ * Constant for Unicode string name of new (in 2019) Japanese calendar era,
+ * root/English abbreviated version (ASCII-range characters).
+ * @internal
+ */
+#define JP_ERA_2019_ROOT "Reiwa"
+/**
+ * Constant for Unicode string name of new (in 2019) Japanese calendar era,
+ * Japanese abbreviated version (Han, or fullwidth Latin for testing).
+ * @internal
+ */
+#define JP_ERA_2019_JA "\\u4EE4\\u548C"
+/**
+ * Constant for Unicode string name of new (in 2019) Japanese calendar era,
+ * root and Japanese narrow version (ASCII-range characters).
+ * @internal
+ */
+#define JP_ERA_2019_NARROW "R"
+#endif // U_HIDE_INTERNAL_API
+
/**
* FieldPosition and UFieldPosition selectors for format fields
* defined by DateFormat and UDateFormat.
@@ -902,11 +923,13 @@ typedef enum UDateFormatBooleanAttribute {
/* Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API,
* it is needed for layout of DateFormat object. */
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* One more than the highest normal UDateFormatBooleanAttribute value.
* @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
*/
UDAT_BOOLEAN_ATTRIBUTE_COUNT = 4
+#endif // U_FORCE_HIDE_DEPRECATED_API
} UDateFormatBooleanAttribute;
/**
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/udateintervalformat.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/udateintervalformat.h
index 9300ddcf82b..b42223a5db3 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/udateintervalformat.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/udateintervalformat.h
@@ -16,6 +16,7 @@
#include "unicode/umisc.h"
#include "unicode/localpointer.h"
+#include "unicode/uformattedvalue.h"
/**
* \file
@@ -81,6 +82,15 @@
struct UDateIntervalFormat;
typedef struct UDateIntervalFormat UDateIntervalFormat; /**< C typedef for struct UDateIntervalFormat. @stable ICU 4.8 */
+#ifndef U_HIDE_DRAFT_API
+struct UFormattedDateInterval;
+/**
+ * Opaque struct to contain the results of a UDateIntervalFormat operation.
+ * @draft ICU 64
+ */
+typedef struct UFormattedDateInterval UFormattedDateInterval;
+#endif /* U_HIDE_DRAFT_API */
+
/**
* Open a new UDateIntervalFormat object using the predefined rules for a
* given locale plus a specified skeleton.
@@ -123,6 +133,55 @@ U_STABLE void U_EXPORT2
udtitvfmt_close(UDateIntervalFormat *formatter);
+#ifndef U_HIDE_DRAFT_API
+/**
+ * Creates an object to hold the result of a UDateIntervalFormat
+ * operation. The object can be used repeatedly; it is cleared whenever
+ * passed to a format function.
+ *
+ * @param ec Set if an error occurs.
+ * @return A pointer needing ownership.
+ * @draft ICU 64
+ */
+U_CAPI UFormattedDateInterval* U_EXPORT2
+udtitvfmt_openResult(UErrorCode* ec);
+
+/**
+ * Returns a representation of a UFormattedDateInterval as a UFormattedValue,
+ * which can be subsequently passed to any API requiring that type.
+ *
+ * The returned object is owned by the UFormattedDateInterval and is valid
+ * only as long as the UFormattedDateInterval is present and unchanged in memory.
+ *
+ * You can think of this method as a cast between types.
+ *
+ * When calling ufmtval_nextPosition():
+ * The fields are returned from left to right. The special field category
+ * UFIELD_CATEGORY_DATE_INTERVAL_SPAN is used to indicate which datetime
+ * primitives came from which arguments: 0 means fromCalendar, and 1 means
+ * toCalendar. The span category will always occur before the
+ * corresponding fields in UFIELD_CATEGORY_DATE
+ * in the ufmtval_nextPosition() iterator.
+ *
+ * @param uresult The object containing the formatted string.
+ * @param ec Set if an error occurs.
+ * @return A UFormattedValue owned by the input object.
+ * @draft ICU 64
+ */
+U_CAPI const UFormattedValue* U_EXPORT2
+udtitvfmt_resultAsValue(const UFormattedDateInterval* uresult, UErrorCode* ec);
+
+/**
+ * Releases the UFormattedDateInterval created by udtitvfmt_openResult().
+ *
+ * @param uresult The object to release.
+ * @draft ICU 64
+ */
+U_CAPI void U_EXPORT2
+udtitvfmt_closeResult(UFormattedDateInterval* uresult);
+#endif /* U_HIDE_DRAFT_API */
+
+
#if U_SHOW_CPLUSPLUS_API
U_NAMESPACE_BEGIN
@@ -138,6 +197,19 @@ U_NAMESPACE_BEGIN
*/
U_DEFINE_LOCAL_OPEN_POINTER(LocalUDateIntervalFormatPointer, UDateIntervalFormat, udtitvfmt_close);
+#ifndef U_HIDE_DRAFT_API
+/**
+ * \class LocalUFormattedDateIntervalPointer
+ * "Smart pointer" class, closes a UFormattedDateInterval via udtitvfmt_close().
+ * For most methods see the LocalPointerBase base class.
+ *
+ * @see LocalPointerBase
+ * @see LocalPointer
+ * @draft ICU 64
+ */
+U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattedDateIntervalPointer, UFormattedDateInterval, udtitvfmt_closeResult);
+#endif /* U_HIDE_DRAFT_API */
+
U_NAMESPACE_END
#endif
@@ -181,6 +253,34 @@ udtitvfmt_format(const UDateIntervalFormat* formatter,
UFieldPosition* position,
UErrorCode* status);
+
+#ifndef U_HIDE_DRAFT_API
+/**
+ * Formats a date/time range using the conventions established for the
+ * UDateIntervalFormat object.
+ * @param formatter
+ * The UDateIntervalFormat object specifying the format conventions.
+ * @param result
+ * The UFormattedDateInterval to contain the result of the
+ * formatting operation.
+ * @param fromDate
+ * The starting point of the range.
+ * @param toDate
+ * The ending point of the range.
+ * @param status
+ * A pointer to a UErrorCode to receive any errors.
+ * @draft ICU 64
+ */
+U_DRAFT void U_EXPORT2
+udtitvfmt_formatToResult(
+ const UDateIntervalFormat* formatter,
+ UFormattedDateInterval* result,
+ UDate fromDate,
+ UDate toDate,
+ UErrorCode* status);
+#endif /* U_HIDE_DRAFT_API */
+
+
#endif /* #if !UCONFIG_NO_FORMATTING */
#endif
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/udatpg.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/udatpg.h
index beae756d87d..7f28b5a3197 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/udatpg.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/udatpg.h
@@ -88,27 +88,27 @@ typedef enum UDateTimePatternField {
/* Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API,
* it is needed for layout of DateTimePatternGenerator object. */
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* One more than the highest normal UDateTimePatternField value.
* @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
*/
UDATPG_FIELD_COUNT
+#endif // U_FORCE_HIDE_DEPRECATED_API
} UDateTimePatternField;
-#ifndef U_HIDE_DRAFT_API
/**
* Field display name width constants for udatpg_getFieldDisplayName().
- * @draft ICU 61
+ * @stable ICU 61
*/
typedef enum UDateTimePGDisplayWidth {
- /** @draft ICU 61 */
+ /** @stable ICU 61 */
UDATPG_WIDE,
- /** @draft ICU 61 */
+ /** @stable ICU 61 */
UDATPG_ABBREVIATED,
- /** @draft ICU 61 */
+ /** @stable ICU 61 */
UDATPG_NARROW
} UDateTimePGDisplayWidth;
-#endif // U_HIDE_DRAFT_API
/**
* Masks to control forcing the length of specified fields in the returned
@@ -440,7 +440,6 @@ udatpg_getAppendItemName(const UDateTimePatternGenerator *dtpg,
UDateTimePatternField field,
int32_t *pLength);
-#ifndef U_HIDE_DRAFT_API
/**
* The general interface to get a display name for a particular date/time field,
* in one of several possible display widths.
@@ -464,15 +463,14 @@ udatpg_getAppendItemName(const UDateTimePatternGenerator *dtpg,
* @return
* The full length of the name; if greater than capacity, fieldName contains a
* truncated result.
- * @draft ICU 61
+ * @stable ICU 61
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
udatpg_getFieldDisplayName(const UDateTimePatternGenerator *dtpg,
UDateTimePatternField field,
UDateTimePGDisplayWidth width,
UChar *fieldName, int32_t capacity,
UErrorCode *pErrorCode);
-#endif // U_HIDE_DRAFT_API
/**
* The DateTimeFormat is a message format pattern used to compose date and
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/uformattedvalue.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/uformattedvalue.h
new file mode 100644
index 00000000000..0b289e3b455
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/uformattedvalue.h
@@ -0,0 +1,441 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#ifndef __UFORMATTEDVALUE_H__
+#define __UFORMATTEDVALUE_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
+#include "unicode/ufieldpositer.h"
+
+#ifndef U_HIDE_DRAFT_API
+
+/**
+ * \file
+ * \brief C API: Abstract operations for localized strings.
+ *
+ * This file contains declarations for classes that deal with formatted strings. A number
+ * of APIs throughout ICU use these classes for expressing their localized output.
+ */
+
+
+/**
+ * All possible field categories in ICU. Every entry in this enum corresponds
+ * to another enum that exists in ICU.
+ *
+ * In the APIs that take a UFieldCategory, an int32_t type is used. Field
+ * categories having any of the top four bits turned on are reserved as
+ * private-use for external APIs implementing FormattedValue. This means that
+ * categories 2^28 and higher or below zero (with the highest bit turned on)
+ * are private-use and will not be used by ICU in the future.
+ *
+ * @draft ICU 64
+ */
+typedef enum UFieldCategory {
+ /**
+ * For an undefined field category.
+ *
+ * @draft ICU 64
+ */
+ UFIELD_CATEGORY_UNDEFINED = 0,
+
+ /**
+ * For fields in UDateFormatField (udat.h), from ICU 3.0.
+ *
+ * @draft ICU 64
+ */
+ UFIELD_CATEGORY_DATE,
+
+ /**
+ * For fields in UNumberFormatFields (unum.h), from ICU 49.
+ *
+ * @draft ICU 64
+ */
+ UFIELD_CATEGORY_NUMBER,
+
+ /**
+ * For fields in UListFormatterField (ulistformatter.h), from ICU 63.
+ *
+ * @draft ICU 64
+ */
+ UFIELD_CATEGORY_LIST,
+
+ /**
+ * For fields in URelativeDateTimeFormatterField (ureldatefmt.h), from ICU 64.
+ *
+ * @draft ICU 64
+ */
+ UFIELD_CATEGORY_RELATIVE_DATETIME,
+
+ /**
+ * Reserved for possible future fields in UDateIntervalFormatField.
+ *
+ * @internal
+ */
+ UFIELD_CATEGORY_DATE_INTERVAL,
+
+#ifndef U_HIDE_INTERNAL_API
+ /** @internal */
+ UFIELD_CATEGORY_COUNT,
+#endif /* U_HIDE_INTERNAL_API */
+
+ /**
+ * Category for spans in a list.
+ *
+ * @draft ICU 64
+ */
+ UFIELD_CATEGORY_LIST_SPAN = 0x1000 + UFIELD_CATEGORY_LIST,
+
+ /**
+ * Category for spans in a date interval.
+ *
+ * @draft ICU 64
+ */
+ UFIELD_CATEGORY_DATE_INTERVAL_SPAN = 0x1000 + UFIELD_CATEGORY_DATE_INTERVAL,
+
+} UFieldCategory;
+
+
+struct UConstrainedFieldPosition;
+/**
+ * Represents a span of a string containing a given field.
+ *
+ * This struct differs from UFieldPosition in the following ways:
+ *
+ * 1. It has information on the field category.
+ * 2. It allows you to set constraints to use when iterating over field positions.
+ * 3. It is used for the newer FormattedValue APIs.
+ *
+ * @draft ICU 64
+ */
+typedef struct UConstrainedFieldPosition UConstrainedFieldPosition;
+
+
+/**
+ * Creates a new UConstrainedFieldPosition.
+ *
+ * By default, the UConstrainedFieldPosition has no iteration constraints.
+ *
+ * @param ec Set if an error occurs.
+ * @return The new object, or NULL if an error occurs.
+ * @draft ICU 64
+ */
+U_DRAFT UConstrainedFieldPosition* U_EXPORT2
+ucfpos_open(UErrorCode* ec);
+
+
+/**
+ * Resets a UConstrainedFieldPosition to its initial state, as if it were newly created.
+ *
+ * Removes any constraints that may have been set on the instance.
+ *
+ * @param ucfpos The instance of UConstrainedFieldPosition.
+ * @param ec Set if an error occurs.
+ * @draft ICU 64
+ */
+U_DRAFT void U_EXPORT2
+ucfpos_reset(
+ UConstrainedFieldPosition* ucfpos,
+ UErrorCode* ec);
+
+
+/**
+ * Destroys a UConstrainedFieldPosition and releases its memory.
+ *
+ * @param ucfpos The instance of UConstrainedFieldPosition.
+ * @draft ICU 64
+ */
+U_DRAFT void U_EXPORT2
+ucfpos_close(UConstrainedFieldPosition* ucfpos);
+
+
+/**
+ * Sets a constraint on the field category.
+ *
+ * When this instance of UConstrainedFieldPosition is passed to ufmtval_nextPosition,
+ * positions are skipped unless they have the given category.
+ *
+ * Any previously set constraints are cleared.
+ *
+ * For example, to loop over only the number-related fields:
+ *
+ * UConstrainedFieldPosition* ucfpos = ucfpos_open(ec);
+ * ucfpos_constrainCategory(ucfpos, UFIELDCATEGORY_NUMBER_FORMAT, ec);
+ * while (ufmtval_nextPosition(ufmtval, ucfpos, ec)) {
+ * // handle the number-related field position
+ * }
+ * ucfpos_close(ucfpos);
+ *
+ * Changing the constraint while in the middle of iterating over a FormattedValue
+ * does not generally have well-defined behavior.
+ *
+ * @param ucfpos The instance of UConstrainedFieldPosition.
+ * @param category The field category to fix when iterating.
+ * @param ec Set if an error occurs.
+ * @draft ICU 64
+ */
+U_DRAFT void U_EXPORT2
+ucfpos_constrainCategory(
+ UConstrainedFieldPosition* ucfpos,
+ int32_t category,
+ UErrorCode* ec);
+
+
+/**
+ * Sets a constraint on the category and field.
+ *
+ * When this instance of UConstrainedFieldPosition is passed to ufmtval_nextPosition,
+ * positions are skipped unless they have the given category and field.
+ *
+ * Any previously set constraints are cleared.
+ *
+ * For example, to loop over all grouping separators:
+ *
+ * UConstrainedFieldPosition* ucfpos = ucfpos_open(ec);
+ * ucfpos_constrainField(ucfpos, UFIELDCATEGORY_NUMBER_FORMAT, UNUM_GROUPING_SEPARATOR_FIELD, ec);
+ * while (ufmtval_nextPosition(ufmtval, ucfpos, ec)) {
+ * // handle the grouping separator position
+ * }
+ * ucfpos_close(ucfpos);
+ *
+ * Changing the constraint while in the middle of iterating over a FormattedValue
+ * does not generally have well-defined behavior.
+ *
+ * @param ucfpos The instance of UConstrainedFieldPosition.
+ * @param category The field category to fix when iterating.
+ * @param field The field to fix when iterating.
+ * @param ec Set if an error occurs.
+ * @draft ICU 64
+ */
+U_DRAFT void U_EXPORT2
+ucfpos_constrainField(
+ UConstrainedFieldPosition* ucfpos,
+ int32_t category,
+ int32_t field,
+ UErrorCode* ec);
+
+
+/**
+ * Gets the field category for the current position.
+ *
+ * If a category or field constraint was set, this function returns the constrained
+ * category. Otherwise, the return value is well-defined only after
+ * ufmtval_nextPosition returns TRUE.
+ *
+ * @param ucfpos The instance of UConstrainedFieldPosition.
+ * @param ec Set if an error occurs.
+ * @return The field category saved in the instance.
+ * @draft ICU 64
+ */
+U_DRAFT int32_t U_EXPORT2
+ucfpos_getCategory(
+ const UConstrainedFieldPosition* ucfpos,
+ UErrorCode* ec);
+
+
+/**
+ * Gets the field for the current position.
+ *
+ * If a field constraint was set, this function returns the constrained
+ * field. Otherwise, the return value is well-defined only after
+ * ufmtval_nextPosition returns TRUE.
+ *
+ * @param ucfpos The instance of UConstrainedFieldPosition.
+ * @param ec Set if an error occurs.
+ * @return The field saved in the instance.
+ * @draft ICU 64
+ */
+U_DRAFT int32_t U_EXPORT2
+ucfpos_getField(
+ const UConstrainedFieldPosition* ucfpos,
+ UErrorCode* ec);
+
+
+/**
+ * Gets the INCLUSIVE start and EXCLUSIVE end index stored for the current position.
+ *
+ * The output values are well-defined only after ufmtval_nextPosition returns TRUE.
+ *
+ * @param ucfpos The instance of UConstrainedFieldPosition.
+ * @param pStart Set to the start index saved in the instance. Ignored if nullptr.
+ * @param pLimit Set to the end index saved in the instance. Ignored if nullptr.
+ * @param ec Set if an error occurs.
+ * @draft ICU 64
+ */
+U_DRAFT void U_EXPORT2
+ucfpos_getIndexes(
+ const UConstrainedFieldPosition* ucfpos,
+ int32_t* pStart,
+ int32_t* pLimit,
+ UErrorCode* ec);
+
+
+/**
+ * Gets an int64 that FormattedValue implementations may use for storage.
+ *
+ * The initial value is zero.
+ *
+ * Users of FormattedValue should not need to call this method.
+ *
+ * @param ucfpos The instance of UConstrainedFieldPosition.
+ * @param ec Set if an error occurs.
+ * @return The current iteration context from ucfpos_setInt64IterationContext.
+ * @draft ICU 64
+ */
+U_DRAFT int64_t U_EXPORT2
+ucfpos_getInt64IterationContext(
+ const UConstrainedFieldPosition* ucfpos,
+ UErrorCode* ec);
+
+
+/**
+ * Sets an int64 that FormattedValue implementations may use for storage.
+ *
+ * Intended to be used by FormattedValue implementations.
+ *
+ * @param ucfpos The instance of UConstrainedFieldPosition.
+ * @param context The new iteration context.
+ * @param ec Set if an error occurs.
+ * @draft ICU 64
+ */
+U_DRAFT void U_EXPORT2
+ucfpos_setInt64IterationContext(
+ UConstrainedFieldPosition* ucfpos,
+ int64_t context,
+ UErrorCode* ec);
+
+
+/**
+ * Determines whether a given field should be included given the
+ * constraints.
+ *
+ * Intended to be used by FormattedValue implementations.
+ *
+ * @param ucfpos The instance of UConstrainedFieldPosition.
+ * @param category The category to test.
+ * @param field The field to test.
+ * @param ec Set if an error occurs.
+ * @draft ICU 64
+ */
+U_DRAFT UBool U_EXPORT2
+ucfpos_matchesField(
+ const UConstrainedFieldPosition* ucfpos,
+ int32_t category,
+ int32_t field,
+ UErrorCode* ec);
+
+
+/**
+ * Sets new values for the primary public getters.
+ *
+ * Intended to be used by FormattedValue implementations.
+ *
+ * It is up to the implementation to ensure that the user-requested
+ * constraints are satisfied. This method does not check!
+ *
+ * @param ucfpos The instance of UConstrainedFieldPosition.
+ * @param category The new field category.
+ * @param field The new field.
+ * @param start The new inclusive start index.
+ * @param limit The new exclusive end index.
+ * @param ec Set if an error occurs.
+ * @draft ICU 64
+ */
+U_DRAFT void U_EXPORT2
+ucfpos_setState(
+ UConstrainedFieldPosition* ucfpos,
+ int32_t category,
+ int32_t field,
+ int32_t start,
+ int32_t limit,
+ UErrorCode* ec);
+
+
+struct UFormattedValue;
+/**
+ * An abstract formatted value: a string with associated field attributes.
+ * Many formatters format to types compatible with UFormattedValue.
+ *
+ * @draft ICU 64
+ */
+typedef struct UFormattedValue UFormattedValue;
+
+
+/**
+ * Returns a pointer to the formatted string. The pointer is owned by the UFormattedValue. The
+ * return value is valid only as long as the UFormattedValue is present and unchanged in memory.
+ *
+ * The return value is NUL-terminated but could contain internal NULs.
+ *
+ * @param ufmtval
+ * The object containing the formatted string and attributes.
+ * @param pLength Output variable for the length of the string. Ignored if NULL.
+ * @param ec Set if an error occurs.
+ * @return A NUL-terminated char16 string owned by the UFormattedValue.
+ * @draft ICU 64
+ */
+U_DRAFT const UChar* U_EXPORT2
+ufmtval_getString(
+ const UFormattedValue* ufmtval,
+ int32_t* pLength,
+ UErrorCode* ec);
+
+
+/**
+ * Iterates over field positions in the UFormattedValue. This lets you determine the position
+ * of specific types of substrings, like a month or a decimal separator.
+ *
+ * To loop over all field positions:
+ *
+ * UConstrainedFieldPosition* ucfpos = ucfpos_open(ec);
+ * while (ufmtval_nextPosition(ufmtval, ucfpos, ec)) {
+ * // handle the field position; get information from ucfpos
+ * }
+ * ucfpos_close(ucfpos);
+ *
+ * @param ufmtval
+ * The object containing the formatted string and attributes.
+ * @param ucfpos
+ * The object used for iteration state; can provide constraints to iterate over only
+ * one specific category or field;
+ * see ucfpos_constrainCategory
+ * and ucfpos_constrainField.
+ * @param ec Set if an error occurs.
+ * @return TRUE if another position was found; FALSE otherwise.
+ * @draft ICU 64
+ */
+U_DRAFT UBool U_EXPORT2
+ufmtval_nextPosition(
+ const UFormattedValue* ufmtval,
+ UConstrainedFieldPosition* ucfpos,
+ UErrorCode* ec);
+
+
+#if U_SHOW_CPLUSPLUS_API
+U_NAMESPACE_BEGIN
+
+/**
+ * \class LocalUConstrainedFieldPositionPointer
+ * "Smart pointer" class; closes a UConstrainedFieldPosition via ucfpos_close().
+ * For most methods see the LocalPointerBase base class.
+ *
+ * Usage:
+ *
+ * LocalUConstrainedFieldPositionPointer ucfpos(ucfpos_open(ec));
+ * // no need to explicitly call ucfpos_close()
+ *
+ * @draft ICU 64
+ */
+U_DEFINE_LOCAL_OPEN_POINTER(LocalUConstrainedFieldPositionPointer,
+ UConstrainedFieldPosition,
+ ucfpos_close);
+
+U_NAMESPACE_END
+#endif // U_SHOW_CPLUSPLUS_API
+
+
+#endif /* U_HIDE_DRAFT_API */
+#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif // __UFORMATTEDVALUE_H__
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/ulistformatter.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/ulistformatter.h
index d794a894047..1a390088898 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/ulistformatter.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/ulistformatter.h
@@ -15,6 +15,7 @@
#if !UCONFIG_NO_FORMATTING
#include "unicode/localpointer.h"
+#include "unicode/uformattedvalue.h"
/**
* \file
@@ -34,6 +35,15 @@ struct UListFormatter;
typedef struct UListFormatter UListFormatter; /**< C typedef for struct UListFormatter. @stable ICU 55 */
#ifndef U_HIDE_DRAFT_API
+struct UFormattedList;
+/**
+ * Opaque struct to contain the results of a UListFormatter operation.
+ * @draft ICU 64
+ */
+typedef struct UFormattedList UFormattedList;
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_DRAFT_API
/**
* FieldPosition and UFieldPosition selectors for format fields
* defined by ListFormatter.
@@ -51,7 +61,7 @@ typedef enum UListFormatterField {
*/
ULISTFMT_ELEMENT_FIELD
} UListFormatterField;
-#endif // U_HIDE_DRAFT_API
+#endif /* U_HIDE_DRAFT_API */
/**
* Open a new UListFormatter object using the rules for a given locale.
@@ -82,6 +92,53 @@ ulistfmt_open(const char* locale,
U_CAPI void U_EXPORT2
ulistfmt_close(UListFormatter *listfmt);
+#ifndef U_HIDE_DRAFT_API
+/**
+ * Creates an object to hold the result of a UListFormatter
+ * operation. The object can be used repeatedly; it is cleared whenever
+ * passed to a format function.
+ *
+ * @param ec Set if an error occurs.
+ * @return A pointer needing ownership.
+ * @draft ICU 64
+ */
+U_CAPI UFormattedList* U_EXPORT2
+ulistfmt_openResult(UErrorCode* ec);
+
+/**
+ * Returns a representation of a UFormattedList as a UFormattedValue,
+ * which can be subsequently passed to any API requiring that type.
+ *
+ * The returned object is owned by the UFormattedList and is valid
+ * only as long as the UFormattedList is present and unchanged in memory.
+ *
+ * You can think of this method as a cast between types.
+ *
+ * When calling ufmtval_nextPosition():
+ * The fields are returned from start to end. The special field category
+ * UFIELD_CATEGORY_LIST_SPAN is used to indicate which argument
+ * was inserted at the given position. The span category will
+ * always occur before the corresponding instance of UFIELD_CATEGORY_LIST
+ * in the ufmtval_nextPosition() iterator.
+ *
+ * @param uresult The object containing the formatted string.
+ * @param ec Set if an error occurs.
+ * @return A UFormattedValue owned by the input object.
+ * @draft ICU 64
+ */
+U_CAPI const UFormattedValue* U_EXPORT2
+ulistfmt_resultAsValue(const UFormattedList* uresult, UErrorCode* ec);
+
+/**
+ * Releases the UFormattedList created by ulistfmt_openResult().
+ *
+ * @param uresult The object to release.
+ * @draft ICU 64
+ */
+U_CAPI void U_EXPORT2
+ulistfmt_closeResult(UFormattedList* uresult);
+#endif /* U_HIDE_DRAFT_API */
+
#if U_SHOW_CPLUSPLUS_API
@@ -98,6 +155,19 @@ U_NAMESPACE_BEGIN
*/
U_DEFINE_LOCAL_OPEN_POINTER(LocalUListFormatterPointer, UListFormatter, ulistfmt_close);
+#ifndef U_HIDE_DRAFT_API
+/**
+ * \class LocalUFormattedListPointer
+ * "Smart pointer" class, closes a UFormattedList via ulistfmt_closeResult().
+ * For most methods see the LocalPointerBase base class.
+ *
+ * @see LocalPointerBase
+ * @see LocalPointer
+ * @draft ICU 64
+ */
+U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattedListPointer, UFormattedList, ulistfmt_closeResult);
+#endif /* U_HIDE_DRAFT_API */
+
U_NAMESPACE_END
#endif
@@ -145,6 +215,43 @@ ulistfmt_format(const UListFormatter* listfmt,
int32_t resultCapacity,
UErrorCode* status);
+#ifndef U_HIDE_DRAFT_API
+/**
+ * Formats a list of strings to a UFormattedList, which exposes more
+ * information than the string exported by ulistfmt_format().
+ *
+ * @param listfmt
+ * The UListFormatter object specifying the list conventions.
+ * @param strings
+ * An array of pointers to UChar strings; the array length is
+ * specified by stringCount. Must be non-NULL if stringCount > 0.
+ * @param stringLengths
+ * An array of string lengths corresponding to the strings[]
+ * parameter; any individual length value may be negative to indicate
+ * that the corresponding strings[] entry is 0-terminated, or
+ * stringLengths itself may be NULL if all of the strings are
+ * 0-terminated. If non-NULL, the stringLengths array must have
+ * stringCount entries.
+ * @param stringCount
+ * the number of entries in strings[], and the number of entries
+ * in the stringLengths array if it is not NULL. Must be >= 0.
+ * @param uresult
+ * The object in which to store the result of the list formatting
+ * operation. See ulistfmt_openResult().
+ * @param status
+ * Error code set if an error occurred during formatting.
+ * @draft ICU 64
+ */
+U_CAPI void U_EXPORT2
+ulistfmt_formatStringsToResult(
+ const UListFormatter* listfmt,
+ const UChar* const strings[],
+ const int32_t * stringLengths,
+ int32_t stringCount,
+ UFormattedList* uresult,
+ UErrorCode* status);
+#endif /* U_HIDE_DRAFT_API */
+
#endif /* #if !UCONFIG_NO_FORMATTING */
#endif
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/unirepl.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/unirepl.h
index ddcb0ad0e8e..1ec627abcb9 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/unirepl.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/unirepl.h
@@ -14,6 +14,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: UnicodeReplacer
@@ -96,4 +98,6 @@ class U_I18N_API UnicodeReplacer /* not : public UObject because this is an inte
U_NAMESPACE_END
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/unum.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/unum.h
index 1808c8d36b9..4304538f059 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/unum.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/unum.h
@@ -338,11 +338,13 @@ enum UCurrencySpacing {
/* Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API,
* it is needed for layout of DecimalFormatSymbols object. */
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* One more than the highest normal UCurrencySpacing value.
* @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
*/
UNUM_CURRENCY_SPACING_COUNT
+#endif // U_FORCE_HIDE_DEPRECATED_API
};
typedef enum UCurrencySpacing UCurrencySpacing; /**< @stable ICU 4.8 */
@@ -375,12 +377,19 @@ typedef enum UNumberFormatFields {
UNUM_PERMILL_FIELD,
/** @stable ICU 49 */
UNUM_SIGN_FIELD,
+#ifndef U_HIDE_DRAFT_API
+ /** @draft ICU 64 */
+ UNUM_MEASURE_UNIT_FIELD,
+ /** @draft ICU 64 */
+ UNUM_COMPACT_FIELD,
+#endif /* U_HIDE_DRAFT_API */
+
#ifndef U_HIDE_DEPRECATED_API
/**
* One more than the highest normal UNumberFormatFields value.
* @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
*/
- UNUM_FIELD_COUNT
+ UNUM_FIELD_COUNT = UNUM_SIGN_FIELD + 3
#endif /* U_HIDE_DEPRECATED_API */
} UNumberFormatFields;
@@ -402,7 +411,7 @@ typedef enum UNumberFormatFields {
* respectively.
*
* <p><strong>NOTE::</strong> New users with are strongly encouraged to
- * use unumf_openWithSkeletonAndLocale instead of unum_open.
+ * use unumf_openForSkeletonAndLocale instead of unum_open.
*
* @param pattern A pattern specifying the format to use.
* This parameter is ignored unless the style is
@@ -1022,16 +1031,18 @@ typedef enum UNumberFormatAttribute {
*
* @stable ICU 51 */
UNUM_SCALE = 21,
-#ifndef U_HIDE_INTERNAL_API
+
+#ifndef U_HIDE_DRAFT_API
/**
- * Minimum grouping digits, technology preview.
+ * Minimum grouping digits; most commonly set to 2 to print "1000" instead of "1,000".
* See DecimalFormat::getMinimumGroupingDigits().
*
- * @internal technology preview
+ * For better control over grouping strategies, use UNumberFormatter.
+ *
+ * @draft ICU 64
*/
UNUM_MINIMUM_GROUPING_DIGITS = 22,
- /* TODO: test C API when it becomes @draft */
-#endif /* U_HIDE_INTERNAL_API */
+#endif /* U_HIDE_DRAFT_API */
/**
* if this attribute is set to 0, it is set to UNUM_CURRENCY_STANDARD purpose,
@@ -1041,11 +1052,12 @@ typedef enum UNumberFormatAttribute {
*/
UNUM_CURRENCY_USAGE = 23,
- /* The following cannot be #ifndef U_HIDE_INTERNAL_API, needed in .h file variable declararions */
+#ifndef U_HIDE_INTERNAL_API
/** One below the first bitfield-boolean item.
* All items after this one are stored in boolean form.
* @internal */
UNUM_MAX_NONBOOLEAN_ATTRIBUTE = 0x0FFF,
+#endif /* U_HIDE_INTERNAL_API */
/** If 1, specifies that if setting the "max integer digits" attribute would truncate a value, set an error status rather than silently truncating.
* For example, formatting the value 1234 with 4 max int digits would succeed, but formatting 12345 would fail. There is no effect on parsing.
@@ -1071,24 +1083,33 @@ typedef enum UNumberFormatAttribute {
*/
UNUM_PARSE_DECIMAL_MARK_REQUIRED = 0x1002,
- /* The following cannot be #ifndef U_HIDE_INTERNAL_API, needed in .h file variable declararions */
- /** Limit of boolean attributes.
- * @internal */
- UNUM_LIMIT_BOOLEAN_ATTRIBUTE = 0x1003,
+#ifndef U_HIDE_DRAFT_API
/**
- * Whether parsing is sensitive to case (lowercase/uppercase).
- * TODO: Add to the test suite.
- * @internal This API is a technical preview. It may change in an upcoming release.
+ * Parsing: if set to 1, parsing is sensitive to case (lowercase/uppercase).
+ *
+ * @draft ICU 64
*/
- UNUM_PARSE_CASE_SENSITIVE = 0x1004,
+ UNUM_PARSE_CASE_SENSITIVE = 0x1003,
/**
- * Formatting: whether to show the plus sign on non-negative numbers.
- * TODO: Add to the test suite.
- * @internal This API is a technical preview. It may change in an upcoming release.
+ * Formatting: if set to 1, whether to show the plus sign on non-negative numbers.
+ *
+ * For better control over sign display, use UNumberFormatter.
+ *
+ * @draft ICU 64
*/
- UNUM_SIGN_ALWAYS_SHOWN = 0x1005,
+ UNUM_SIGN_ALWAYS_SHOWN = 0x1004,
+
+#endif /* U_HIDE_DRAFT_API */
+
+#ifndef U_HIDE_INTERNAL_API
+ /** Limit of boolean attributes. (value should
+ * not depend on U_HIDE conditionals)
+ * @internal */
+ UNUM_LIMIT_BOOLEAN_ATTRIBUTE = 0x1005,
+#endif /* U_HIDE_INTERNAL_API */
+
} UNumberFormatAttribute;
/**
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/unumberformatter.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/unumberformatter.h
index 5926e0e3a9b..b27507f7a8f 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/unumberformatter.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/unumberformatter.h
@@ -7,8 +7,10 @@
#ifndef __UNUMBERFORMATTER_H__
#define __UNUMBERFORMATTER_H__
+#include "unicode/parseerr.h"
#include "unicode/ufieldpositer.h"
#include "unicode/umisc.h"
+#include "unicode/uformattedvalue.h"
/**
@@ -75,8 +77,6 @@
* </pre>
*/
-
-#ifndef U_HIDE_DRAFT_API
/**
* An enum declaring how to render units, including currencies. Example outputs when formatting 123 USD and 123
* meters in <em>en-CA</em>:
@@ -93,7 +93,7 @@
* <p>
* This enum is similar to {@link UMeasureFormatWidth}.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
typedef enum UNumberUnitWidth {
/**
@@ -105,7 +105,7 @@ typedef enum UNumberUnitWidth {
* In CLDR, this option corresponds to the "Narrow" format for measure units and the "¤¤¤¤¤" placeholder for
* currencies.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
UNUM_UNIT_WIDTH_NARROW,
@@ -121,7 +121,7 @@ typedef enum UNumberUnitWidth {
* In CLDR, this option corresponds to the "Short" format for measure units and the "¤" placeholder for
* currencies.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
UNUM_UNIT_WIDTH_SHORT,
@@ -132,7 +132,7 @@ typedef enum UNumberUnitWidth {
* In CLDR, this option corresponds to the default format for measure units and the "¤¤¤" placeholder for
* currencies.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
UNUM_UNIT_WIDTH_FULL_NAME,
@@ -143,7 +143,7 @@ typedef enum UNumberUnitWidth {
* <p>
* In CLDR, this option corresponds to the "¤¤" placeholder for currencies.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
UNUM_UNIT_WIDTH_ISO_CODE,
@@ -152,7 +152,7 @@ typedef enum UNumberUnitWidth {
* monetary symbols and formats as with SHORT, but omit the currency symbol. For measure units, the behavior is
* equivalent to not specifying the unit at all.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
UNUM_UNIT_WIDTH_HIDDEN,
@@ -163,9 +163,7 @@ typedef enum UNumberUnitWidth {
*/
UNUM_UNIT_WIDTH_COUNT
} UNumberUnitWidth;
-#endif /* U_HIDE_DRAFT_API */
-#ifndef U_HIDE_DRAFT_API
/**
* An enum declaring the strategy for when and how to display grouping separators (i.e., the
* separator, often a comma or period, after every 2-3 powers of ten). The choices are several
@@ -190,13 +188,13 @@ typedef enum UNumberUnitWidth {
* Note: This enum specifies the strategy for grouping sizes. To set which character to use as the
* grouping separator, use the "symbols" setter.
*
- * @draft ICU 63
+ * @stable ICU 63
*/
typedef enum UNumberGroupingStrategy {
/**
* Do not display grouping separators in any locale.
*
- * @draft ICU 61
+ * @stable ICU 61
*/
UNUM_GROUPING_OFF,
@@ -212,7 +210,7 @@ typedef enum UNumberGroupingStrategy {
* Locale data is used to determine whether to separate larger numbers into groups of 2
* (customary in South Asia) or groups of 3 (customary in Europe and the Americas).
*
- * @draft ICU 61
+ * @stable ICU 61
*/
UNUM_GROUPING_MIN2,
@@ -227,7 +225,7 @@ typedef enum UNumberGroupingStrategy {
* Locale data is used to determine whether to separate larger numbers into groups of 2
* (customary in South Asia) or groups of 3 (customary in Europe and the Americas).
*
- * @draft ICU 61
+ * @stable ICU 61
*/
UNUM_GROUPING_AUTO,
@@ -243,7 +241,7 @@ typedef enum UNumberGroupingStrategy {
* Locale data is used to determine whether to separate larger numbers into groups of 2
* (customary in South Asia) or groups of 3 (customary in Europe and the Americas).
*
- * @draft ICU 61
+ * @stable ICU 61
*/
UNUM_GROUPING_ON_ALIGNED,
@@ -251,7 +249,7 @@ typedef enum UNumberGroupingStrategy {
* Use the Western defaults: groups of 3 and enabled for all numbers 1000 or greater. Do not use
* locale data for determining the grouping strategy.
*
- * @draft ICU 61
+ * @stable ICU 61
*/
UNUM_GROUPING_THOUSANDS
@@ -267,17 +265,6 @@ typedef enum UNumberGroupingStrategy {
} UNumberGroupingStrategy;
-#ifndef U_HIDE_DEPRECATED_API
-/**
- * Old name for compatibility: will be removed in ICU 64.
- * @deprecated ICU 63
- */
-typedef UNumberGroupingStrategy UGroupingStrategy;
-#endif /* U_HIDE_DEPRECATED_API */
-
-#endif /* U_HIDE_DRAFT_API */
-
-#ifndef U_HIDE_DRAFT_API
/**
* An enum declaring how to denote positive and negative numbers. Example outputs when formatting
* 123, 0, and -123 in <em>en-US</em>:
@@ -295,14 +282,14 @@ typedef UNumberGroupingStrategy UGroupingStrategy;
* <p>
* The exact format, including the position and the code point of the sign, differ by locale.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
typedef enum UNumberSignDisplay {
/**
* Show the minus sign on negative numbers, and do not show the sign on positive numbers. This is the default
* behavior.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
UNUM_SIGN_AUTO,
@@ -310,14 +297,14 @@ typedef enum UNumberSignDisplay {
* Show the minus sign on negative numbers and the plus sign on positive numbers, including zero.
* To hide the sign on zero, see {@link UNUM_SIGN_EXCEPT_ZERO}.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
UNUM_SIGN_ALWAYS,
/**
* Do not show the sign on positive or negative numbers.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
UNUM_SIGN_NEVER,
@@ -333,7 +320,7 @@ typedef enum UNumberSignDisplay {
* AUTO sign display strategy when formatting without a currency unit. This limitation may be lifted in the
* future.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
UNUM_SIGN_ACCOUNTING,
@@ -343,24 +330,25 @@ typedef enum UNumberSignDisplay {
* ACCOUNTING sign display strategy. To hide the sign on zero, see
* {@link UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO}.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
UNUM_SIGN_ACCOUNTING_ALWAYS,
/**
* Show the minus sign on negative numbers and the plus sign on positive numbers. Do not show a
- * sign on zero.
+ * sign on zero or NaN, unless the sign bit is set (-0.0 gets a sign).
*
- * @draft ICU 61
+ * @stable ICU 61
*/
UNUM_SIGN_EXCEPT_ZERO,
/**
* Use the locale-dependent accounting format on negative numbers, and show the plus sign on
- * positive numbers. Do not show a sign on zero. For more information on the accounting format,
- * see the ACCOUNTING sign display strategy.
+ * positive numbers. Do not show a sign on zero or NaN, unless the sign bit is set (-0.0 gets a
+ * sign). For more information on the accounting format, see the ACCOUNTING sign display
+ * strategy.
*
- * @draft ICU 61
+ * @stable ICU 61
*/
UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO,
@@ -371,9 +359,7 @@ typedef enum UNumberSignDisplay {
*/
UNUM_SIGN_COUNT
} UNumberSignDisplay;
-#endif /* U_HIDE_DRAFT_API */
-#ifndef U_HIDE_DRAFT_API
/**
* An enum declaring how to render the decimal separator.
*
@@ -382,20 +368,22 @@ typedef enum UNumberSignDisplay {
* <li>UNUM_DECIMAL_SEPARATOR_AUTO: "1", "1.1"
* <li>UNUM_DECIMAL_SEPARATOR_ALWAYS: "1.", "1.1"
* </ul>
+ *
+ * @stable ICU 60
*/
typedef enum UNumberDecimalSeparatorDisplay {
/**
* Show the decimal separator when there are one or more digits to display after the separator, and do not show
* it otherwise. This is the default behavior.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
UNUM_DECIMAL_SEPARATOR_AUTO,
/**
* Always show the decimal separator, even if there are no digits to display after the separator.
*
- * @draft ICU 60
+ * @stable ICU 60
*/
UNUM_DECIMAL_SEPARATOR_ALWAYS,
@@ -406,9 +394,6 @@ typedef enum UNumberDecimalSeparatorDisplay {
*/
UNUM_DECIMAL_SEPARATOR_COUNT
} UNumberDecimalSeparatorDisplay;
-#endif /* U_HIDE_DRAFT_API */
-
-#ifndef U_HIDE_DRAFT_API
struct UNumberFormatter;
/**
@@ -416,7 +401,7 @@ struct UNumberFormatter;
*
* NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead.
*
- * @draft ICU 62
+ * @stable ICU 62
*/
typedef struct UNumberFormatter UNumberFormatter;
@@ -426,7 +411,7 @@ struct UFormattedNumber;
*
* NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead.
*
- * @draft ICU 62
+ * @stable ICU 62
*/
typedef struct UFormattedNumber UFormattedNumber;
@@ -446,24 +431,41 @@ typedef struct UFormattedNumber UFormattedNumber;
* @param skeletonLen The number of UChars in the skeleton string, or -1 it it is NUL-terminated.
* @param locale The NUL-terminated locale ID.
* @param ec Set if an error occurs.
- * @draft ICU 62
+ * @stable ICU 62
*/
-U_DRAFT UNumberFormatter* U_EXPORT2
+U_STABLE UNumberFormatter* U_EXPORT2
unumf_openForSkeletonAndLocale(const UChar* skeleton, int32_t skeletonLen, const char* locale,
UErrorCode* ec);
+#ifndef U_HIDE_DRAFT_API
/**
- * Creates a new UFormattedNumber for holding the result of a number formatting operation.
- *
- * Objects of type UFormattedNumber are not guaranteed to be threadsafe.
+ * Like unumf_openForSkeletonAndLocale, but accepts a UParseError, which will be populated with the
+ * location of a skeleton syntax error if such a syntax error exists.
*
- * NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead.
+ * @param skeleton The skeleton string, like u"percent precision-integer"
+ * @param skeletonLen The number of UChars in the skeleton string, or -1 it it is NUL-terminated.
+ * @param locale The NUL-terminated locale ID.
+ * @param perror A parse error struct populated if an error occurs when parsing. Can be NULL.
+ * If no error occurs, perror->offset will be set to -1.
+ * @param ec Set if an error occurs.
+ * @draft ICU 64
+ */
+U_DRAFT UNumberFormatter* U_EXPORT2
+unumf_openForSkeletonAndLocaleWithError(
+ const UChar* skeleton, int32_t skeletonLen, const char* locale, UParseError* perror, UErrorCode* ec);
+#endif // U_HIDE_DRAFT_API
+
+
+/**
+ * Creates an object to hold the result of a UNumberFormatter
+ * operation. The object can be used repeatedly; it is cleared whenever
+ * passed to a format function.
*
* @param ec Set if an error occurs.
- * @draft ICU 62
+ * @stable ICU 62
*/
-U_DRAFT UFormattedNumber* U_EXPORT2
+U_STABLE UFormattedNumber* U_EXPORT2
unumf_openResult(UErrorCode* ec);
@@ -480,9 +482,9 @@ unumf_openResult(UErrorCode* ec);
* @param value The number to be formatted.
* @param uresult The object that will be mutated to store the result; see unumf_openResult.
* @param ec Set if an error occurs.
- * @draft ICU 62
+ * @stable ICU 62
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
unumf_formatInt(const UNumberFormatter* uformatter, int64_t value, UFormattedNumber* uresult,
UErrorCode* ec);
@@ -500,9 +502,9 @@ unumf_formatInt(const UNumberFormatter* uformatter, int64_t value, UFormattedNum
* @param value The number to be formatted.
* @param uresult The object that will be mutated to store the result; see unumf_openResult.
* @param ec Set if an error occurs.
- * @draft ICU 62
+ * @stable ICU 62
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
unumf_formatDouble(const UNumberFormatter* uformatter, double value, UFormattedNumber* uresult,
UErrorCode* ec);
@@ -524,18 +526,42 @@ unumf_formatDouble(const UNumberFormatter* uformatter, double value, UFormattedN
* @param valueLen The length of the numeric string, or -1 if it is NUL-terminated.
* @param uresult The object that will be mutated to store the result; see unumf_openResult.
* @param ec Set if an error occurs.
- * @draft ICU 62
+ * @stable ICU 62
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
unumf_formatDecimal(const UNumberFormatter* uformatter, const char* value, int32_t valueLen,
UFormattedNumber* uresult, UErrorCode* ec);
+#ifndef U_HIDE_DRAFT_API
+/**
+ * Returns a representation of a UFormattedNumber as a UFormattedValue,
+ * which can be subsequently passed to any API requiring that type.
+ *
+ * The returned object is owned by the UFormattedNumber and is valid
+ * only as long as the UFormattedNumber is present and unchanged in memory.
+ *
+ * You can think of this method as a cast between types.
+ *
+ * @param uresult The object containing the formatted string.
+ * @param ec Set if an error occurs.
+ * @return A UFormattedValue owned by the input object.
+ * @draft ICU 64
+ */
+U_DRAFT const UFormattedValue* U_EXPORT2
+unumf_resultAsValue(const UFormattedNumber* uresult, UErrorCode* ec);
+#endif /* U_HIDE_DRAFT_API */
+
/**
* Extracts the result number string out of a UFormattedNumber to a UChar buffer if possible.
* If bufferCapacity is greater than the required length, a terminating NUL is written.
* If bufferCapacity is less than the required length, an error code is set.
*
+ * Also see ufmtval_getString, which returns a NUL-terminated string:
+ *
+ * int32_t len;
+ * const UChar* str = ufmtval_getString(unumf_resultAsValue(uresult, &ec), &len, &ec);
+ *
* NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead.
*
* @param uresult The object containing the formatted number.
@@ -543,9 +569,9 @@ unumf_formatDecimal(const UNumberFormatter* uformatter, const char* value, int32
* @param bufferCapacity The number of UChars available in the buffer.
* @param ec Set if an error occurs.
* @return The required length.
- * @draft ICU 62
+ * @stable ICU 62
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
unumf_resultToString(const UFormattedNumber* uresult, UChar* buffer, int32_t bufferCapacity,
UErrorCode* ec);
@@ -555,6 +581,8 @@ unumf_resultToString(const UFormattedNumber* uresult, UChar* buffer, int32_t buf
* output string. This allows you to determine the locations of, for example, the integer part,
* fraction part, or symbols.
*
+ * This is a simpler but less powerful alternative to {@link ufmtval_nextPosition}.
+ *
* If a field occurs just once, calling this method will find that occurrence and return it. If a
* field occurs multiple times, this method may be called repeatedly with the following pattern:
*
@@ -579,9 +607,9 @@ unumf_resultToString(const UFormattedNumber* uresult, UChar* buffer, int32_t buf
* (exclusive index). If a field position is not found, the FieldPosition is not changed and
* the method returns FALSE.
* @param ec Set if an error occurs.
- * @draft ICU 62
+ * @stable ICU 62
*/
-U_DRAFT UBool U_EXPORT2
+U_STABLE UBool U_EXPORT2
unumf_resultNextFieldPosition(const UFormattedNumber* uresult, UFieldPosition* ufpos, UErrorCode* ec);
@@ -589,7 +617,10 @@ unumf_resultNextFieldPosition(const UFormattedNumber* uresult, UFieldPosition* u
* Populates the given iterator with all fields in the formatted output string. This allows you to
* determine the locations of the integer part, fraction part, and sign.
*
- * If you need information on only one field, use unumf_resultNextFieldPosition().
+ * This is an alternative to the more powerful {@link ufmtval_nextPosition} API.
+ *
+ * If you need information on only one field, use {@link ufmtval_nextPosition} or
+ * {@link unumf_resultNextFieldPosition}.
*
* @param uresult The object containing the formatted number.
* @param ufpositer
@@ -601,34 +632,37 @@ unumf_resultNextFieldPosition(const UFormattedNumber* uresult, UFieldPosition* u
* overlap, but they may nest. For example, 1234 could format as "1,234" which might consist of a
* grouping separator field for ',' and an integer field encompassing the entire string.
* @param ec Set if an error occurs.
- * @draft ICU 62
+ * @stable ICU 62
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
unumf_resultGetAllFieldPositions(const UFormattedNumber* uresult, UFieldPositionIterator* ufpositer,
UErrorCode* ec);
+// TODO(ICU-20775): Propose this as API.
+// NOTE: This is not currently implemented.
+// U_DRAFT int32_t U_EXPORT2
+// unumf_resultToDecimalNumber(const UFormattedNumber* uresult, char* buffer, int32_t bufferCapacity,
+// UErrorCode* ec);
+
+
/**
* Releases the UNumberFormatter created by unumf_openForSkeletonAndLocale().
*
- * NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead.
- *
* @param uformatter An object created by unumf_openForSkeletonAndLocale().
- * @draft ICU 62
+ * @stable ICU 62
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
unumf_close(UNumberFormatter* uformatter);
/**
* Releases the UFormattedNumber created by unumf_openResult().
*
- * NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead.
- *
* @param uresult An object created by unumf_openResult().
- * @draft ICU 62
+ * @stable ICU 62
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
unumf_closeResult(UFormattedNumber* uresult);
@@ -648,12 +682,12 @@ U_NAMESPACE_BEGIN
*
* @see LocalPointerBase
* @see LocalPointer
- * @draft ICU 62
+ * @stable ICU 62
*/
U_DEFINE_LOCAL_OPEN_POINTER(LocalUNumberFormatterPointer, UNumberFormatter, unumf_close);
/**
- * \class LocalUNumberFormatterPointer
+ * \class LocalUFormattedNumberPointer
* "Smart pointer" class; closes a UFormattedNumber via unumf_closeResult().
* For most methods see the LocalPointerBase base class.
*
@@ -665,65 +699,12 @@ U_DEFINE_LOCAL_OPEN_POINTER(LocalUNumberFormatterPointer, UNumberFormatter, unum
*
* @see LocalPointerBase
* @see LocalPointer
- * @draft ICU 62
+ * @stable ICU 62
*/
U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattedNumberPointer, UFormattedNumber, unumf_closeResult);
U_NAMESPACE_END
#endif // U_SHOW_CPLUSPLUS_API
-#endif /* U_HIDE_DRAFT_API */
-
#endif //__UNUMBERFORMATTER_H__
#endif /* #if !UCONFIG_NO_FORMATTING */
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/unumsys.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/unumsys.h
index 795ec60255f..1631c234fd2 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/unumsys.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/unumsys.h
@@ -105,6 +105,7 @@ U_NAMESPACE_END
/**
* Returns an enumeration over the names of all of the predefined numbering systems known
* to ICU.
+ * The numbering system names will be in alphabetical (invariant) order.
* @param status A pointer to a UErrorCode to receive any errors.
* @return A pointer to a UEnumeration that must be closed with uenum_close(),
* or NULL if an error occurred.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/upluralrules.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/upluralrules.h
index 690846bc89c..fc1b2fb5717 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/upluralrules.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/upluralrules.h
@@ -20,6 +20,9 @@
#include "unicode/unum.h"
#endif /* U_HIDE_INTERNAL_API */
+// Forward-declaration
+struct UFormattedNumber;
+
/**
* \file
* \brief C API: Plural rules, select plural keywords for numeric values.
@@ -132,14 +135,15 @@ U_NAMESPACE_END
/**
- * Given a number, returns the keyword of the first rule that
+ * Given a floating-point number, returns the keyword of the first rule that
* applies to the number, according to the supplied UPluralRules object.
* @param uplrules The UPluralRules object specifying the rules.
* @param number The number for which the rule has to be determined.
- * @param keyword The keyword of the rule that applies to number.
- * @param capacity The capacity of keyword.
+ * @param keyword An output buffer to write the keyword of the rule that
+ * applies to number.
+ * @param capacity The capacity of the keyword buffer.
* @param status A pointer to a UErrorCode to receive any errors.
- * @return The length of keyword.
+ * @return The length of the keyword.
* @stable ICU 4.8
*/
U_CAPI int32_t U_EXPORT2
@@ -148,6 +152,31 @@ uplrules_select(const UPluralRules *uplrules,
UChar *keyword, int32_t capacity,
UErrorCode *status);
+#ifndef U_HIDE_DRAFT_API
+/**
+ * Given a formatted number, returns the keyword of the first rule
+ * that applies to the number, according to the supplied UPluralRules object.
+ *
+ * A UFormattedNumber allows you to specify an exponent or trailing zeros,
+ * which can affect the plural category. To get a UFormattedNumber, see
+ * {@link UNumberFormatter}.
+ *
+ * @param uplrules The UPluralRules object specifying the rules.
+ * @param number The formatted number for which the rule has to be determined.
+ * @param keyword The destination buffer for the keyword of the rule that
+ * applies to number.
+ * @param capacity The capacity of the keyword buffer.
+ * @param status A pointer to a UErrorCode to receive any errors.
+ * @return The length of the keyword.
+ * @draft ICU 64
+ */
+U_CAPI int32_t U_EXPORT2
+uplrules_selectFormatted(const UPluralRules *uplrules,
+ const struct UFormattedNumber* number,
+ UChar *keyword, int32_t capacity,
+ UErrorCode *status);
+#endif /* U_HIDE_DRAFT_API */
+
#ifndef U_HIDE_INTERNAL_API
/**
* Given a number, returns the keyword of the first rule that applies to the
@@ -160,7 +189,8 @@ uplrules_select(const UPluralRules *uplrules,
* @param fmt The UNumberFormat specifying how the number will be formatted
* (this can affect the plural form, e.g. "1 dollar" vs "1.0 dollars").
* If this is NULL, the function behaves like uplrules_select.
- * @param keyword The keyword of the rule that applies to number.
+ * @param keyword An output buffer to write the keyword of the rule that
+ * applies to number.
* @param capacity The capacity of the keyword buffer.
* @param status A pointer to a UErrorCode to receive any errors.
* @return The length of keyword.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/uregex.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/uregex.h
index f3e82149444..131c492a55a 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/uregex.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/uregex.h
@@ -167,6 +167,7 @@ uregex_openUText(UText *pattern,
UParseError *pe,
UErrorCode *status);
+#if !UCONFIG_NO_CONVERSION
/**
* Open (compile) an ICU regular expression. The resulting regular expression
* handle can then be used to perform various matching operations.
@@ -190,7 +191,6 @@ uregex_openUText(UText *pattern,
*
* @stable ICU 3.0
*/
-#if !UCONFIG_NO_CONVERSION
U_STABLE URegularExpression * U_EXPORT2
uregex_openC( const char *pattern,
uint32_t flags,
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/ureldatefmt.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/ureldatefmt.h
index 0fde188d0f4..0724d385594 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/ureldatefmt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/ureldatefmt.h
@@ -17,6 +17,7 @@
#include "unicode/unum.h"
#include "unicode/udisplaycontext.h"
#include "unicode/localpointer.h"
+#include "unicode/uformattedvalue.h"
/**
* \file
@@ -174,6 +175,27 @@ typedef enum URelativeDateTimeUnit {
#endif /* U_HIDE_DEPRECATED_API */
} URelativeDateTimeUnit;
+#ifndef U_HIDE_DRAFT_API
+/**
+ * FieldPosition and UFieldPosition selectors for format fields
+ * defined by RelativeDateTimeFormatter.
+ * @draft ICU 64
+ */
+typedef enum URelativeDateTimeFormatterField {
+ /**
+ * Represents a literal text string, like "tomorrow" or "days ago".
+ * @draft ICU 64
+ */
+ UDAT_REL_LITERAL_FIELD,
+ /**
+ * Represents a number quantity, like "3" in "3 days ago".
+ * @draft ICU 64
+ */
+ UDAT_REL_NUMERIC_FIELD,
+} URelativeDateTimeFormatterField;
+#endif // U_HIDE_DRAFT_API
+
+
/**
* Opaque URelativeDateTimeFormatter object for use in C programs.
* @stable ICU 57
@@ -230,6 +252,54 @@ ureldatefmt_open( const char* locale,
U_STABLE void U_EXPORT2
ureldatefmt_close(URelativeDateTimeFormatter *reldatefmt);
+#ifndef U_HIDE_DRAFT_API
+struct UFormattedRelativeDateTime;
+/**
+ * Opaque struct to contain the results of a URelativeDateTimeFormatter operation.
+ * @draft ICU 64
+ */
+typedef struct UFormattedRelativeDateTime UFormattedRelativeDateTime;
+
+/**
+ * Creates an object to hold the result of a URelativeDateTimeFormatter
+ * operation. The object can be used repeatedly; it is cleared whenever
+ * passed to a format function.
+ *
+ * @param ec Set if an error occurs.
+ * @return A pointer needing ownership.
+ * @draft ICU 64
+ */
+U_DRAFT UFormattedRelativeDateTime* U_EXPORT2
+ureldatefmt_openResult(UErrorCode* ec);
+
+/**
+ * Returns a representation of a UFormattedRelativeDateTime as a UFormattedValue,
+ * which can be subsequently passed to any API requiring that type.
+ *
+ * The returned object is owned by the UFormattedRelativeDateTime and is valid
+ * only as long as the UFormattedRelativeDateTime is present and unchanged in memory.
+ *
+ * You can think of this method as a cast between types.
+ *
+ * @param ufrdt The object containing the formatted string.
+ * @param ec Set if an error occurs.
+ * @return A UFormattedValue owned by the input object.
+ * @draft ICU 64
+ */
+U_DRAFT const UFormattedValue* U_EXPORT2
+ureldatefmt_resultAsValue(const UFormattedRelativeDateTime* ufrdt, UErrorCode* ec);
+
+/**
+ * Releases the UFormattedRelativeDateTime created by ureldatefmt_openResult.
+ *
+ * @param ufrdt The object to release.
+ * @draft ICU 64
+ */
+U_DRAFT void U_EXPORT2
+ureldatefmt_closeResult(UFormattedRelativeDateTime* ufrdt);
+#endif /* U_HIDE_DRAFT_API */
+
+
#if U_SHOW_CPLUSPLUS_API
U_NAMESPACE_BEGIN
@@ -245,6 +315,19 @@ U_NAMESPACE_BEGIN
*/
U_DEFINE_LOCAL_OPEN_POINTER(LocalURelativeDateTimeFormatterPointer, URelativeDateTimeFormatter, ureldatefmt_close);
+#ifndef U_HIDE_DRAFT_API
+/**
+ * \class LocalUFormattedRelativeDateTimePointer
+ * "Smart pointer" class, closes a UFormattedRelativeDateTime via ureldatefmt_closeResult().
+ * For most methods see the LocalPointerBase base class.
+ *
+ * @see LocalPointerBase
+ * @see LocalPointer
+ * @draft ICU 64
+ */
+U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattedRelativeDateTimePointer, UFormattedRelativeDateTime, ureldatefmt_closeResult);
+#endif /* U_HIDE_DRAFT_API */
+
U_NAMESPACE_END
#endif
@@ -285,6 +368,39 @@ ureldatefmt_formatNumeric( const URelativeDateTimeFormatter* reldatefmt,
int32_t resultCapacity,
UErrorCode* status);
+#ifndef U_HIDE_DRAFT_API
+/**
+ * Format a combination of URelativeDateTimeUnit and numeric
+ * offset using a numeric style, e.g. "1 week ago", "in 1 week",
+ * "5 weeks ago", "in 5 weeks".
+ *
+ * @param reldatefmt
+ * The URelativeDateTimeFormatter object specifying the
+ * format conventions.
+ * @param offset
+ * The signed offset for the specified unit. This will
+ * be formatted according to this object's UNumberFormat
+ * object.
+ * @param unit
+ * The unit to use when formatting the relative
+ * date, e.g. UDAT_REL_UNIT_WEEK, UDAT_REL_UNIT_FRIDAY.
+ * @param result
+ * A pointer to a UFormattedRelativeDateTime to populate.
+ * @param status
+ * A pointer to a UErrorCode to receive any errors. In
+ * case of error status, the contents of result are
+ * undefined.
+ * @draft ICU 64
+ */
+U_DRAFT void U_EXPORT2
+ureldatefmt_formatNumericToResult(
+ const URelativeDateTimeFormatter* reldatefmt,
+ double offset,
+ URelativeDateTimeUnit unit,
+ UFormattedRelativeDateTime* result,
+ UErrorCode* status);
+#endif /* U_HIDE_DRAFT_API */
+
/**
* Format a combination of URelativeDateTimeUnit and numeric offset
* using a text style if possible, e.g. "last week", "this week",
@@ -321,6 +437,42 @@ ureldatefmt_format( const URelativeDateTimeFormatter* reldatefmt,
int32_t resultCapacity,
UErrorCode* status);
+#ifndef U_HIDE_DRAFT_API
+/**
+ * Format a combination of URelativeDateTimeUnit and numeric offset
+ * using a text style if possible, e.g. "last week", "this week",
+ * "next week", "yesterday", "tomorrow". Falls back to numeric
+ * style if no appropriate text term is available for the specified
+ * offset in the object's locale.
+ *
+ * This method populates a UFormattedRelativeDateTime, which exposes more
+ * information than the string populated by format().
+ *
+ * @param reldatefmt
+ * The URelativeDateTimeFormatter object specifying the
+ * format conventions.
+ * @param offset
+ * The signed offset for the specified unit.
+ * @param unit
+ * The unit to use when formatting the relative
+ * date, e.g. UDAT_REL_UNIT_WEEK, UDAT_REL_UNIT_FRIDAY.
+ * @param result
+ * A pointer to a UFormattedRelativeDateTime to populate.
+ * @param status
+ * A pointer to a UErrorCode to receive any errors. In
+ * case of error status, the contents of result are
+ * undefined.
+ * @draft ICU 64
+ */
+U_DRAFT void U_EXPORT2
+ureldatefmt_formatToResult(
+ const URelativeDateTimeFormatter* reldatefmt,
+ double offset,
+ URelativeDateTimeUnit unit,
+ UFormattedRelativeDateTime* result,
+ UErrorCode* status);
+#endif /* U_HIDE_DRAFT_API */
+
/**
* Combines a relative date string and a time string in this object's
* locale. This is done with the same date-time separator used for the
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/usearch.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/usearch.h
index 3a7c311ce95..080528e3474 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/usearch.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/usearch.h
@@ -24,7 +24,7 @@
* \file
* \brief C API: StringSearch
*
- * C Apis for an engine that provides language-sensitive text searching based
+ * C APIs for an engine that provides language-sensitive text searching based
* on the comparison rules defined in a <tt>UCollator</tt> data struct,
* see <tt>ucol.h</tt>. This ensures that language eccentricity can be
* handled, e.g. for the German collator, characters &szlig; and SS will be matched
@@ -55,7 +55,7 @@
* <p>
* This search has APIs similar to that of other text iteration mechanisms
* such as the break iterators in <tt>ubrk.h</tt>. Using these
- * APIs, it is easy to scan through text looking for all occurances of
+ * APIs, it is easy to scan through text looking for all occurrences of
* a given pattern. This search iterator allows changing of direction by
* calling a <tt>reset</tt> followed by a <tt>next</tt> or <tt>previous</tt>.
* Though a direction change can occur without calling <tt>reset</tt> first,
@@ -130,7 +130,7 @@
* pos = usearch_next(search, &status))
* {
* printf("Found match at %d pos, length is %d\n", pos,
- * usearch_getMatchLength(search));
+ * usearch_getMatchedLength(search));
* }
* }
*
@@ -479,7 +479,7 @@ U_STABLE int32_t U_EXPORT2 usearch_getMatchedLength(
* possible. If the buffer fits the matched text exactly, a null-termination
* is not possible, then a U_STRING_NOT_TERMINATED_ERROR set in status.
* Pre-flighting can be either done with length = 0 or the API
-* <tt>usearch_getMatchLength</tt>.
+* <tt>usearch_getMatchedLength</tt>.
* @param strsrch search iterator data struct
* @param result UChar buffer to store the matched string
* @param resultCapacity length of the result buffer
@@ -766,7 +766,7 @@ U_STABLE void U_EXPORT2 usearch_reset(UStringSearch *strsrch);
#ifndef U_HIDE_INTERNAL_API
/**
* Simple forward search for the pattern, starting at a specified index,
- * and using using a default set search options.
+ * and using a default set search options.
*
* This is an experimental function, and is not an official part of the
* ICU API.
@@ -783,7 +783,7 @@ U_STABLE void U_EXPORT2 usearch_reset(UStringSearch *strsrch);
* are part of a combining sequence, as described below.
*
* A match will not include a partial combining sequence. Combining
- * character sequences are considered to be inseperable units,
+ * character sequences are considered to be inseparable units,
* and either match the pattern completely, or are considered to not match
* at all. Thus, for example, an A followed a combining accent mark will
* not be found when searching for a plain (unaccented) A. (unless
@@ -792,7 +792,7 @@ U_STABLE void U_EXPORT2 usearch_reset(UStringSearch *strsrch);
* When beginning a search, the initial starting position, startIdx,
* is assumed to be an acceptable match boundary with respect to
* combining characters. A combining sequence that spans across the
- * starting point will not supress a match beginning at startIdx.
+ * starting point will not suppress a match beginning at startIdx.
*
* Characters that expand to multiple collation elements
* (German sharp-S becoming 'ss', or the composed forms of accented
@@ -843,7 +843,7 @@ U_INTERNAL UBool U_EXPORT2 usearch_search(UStringSearch *strsrch,
* are part of a combining sequence, as described below.
*
* A match will not include a partial combining sequence. Combining
- * character sequences are considered to be inseperable units,
+ * character sequences are considered to be inseparable units,
* and either match the pattern completely, or are considered to not match
* at all. Thus, for example, an A followed a combining accent mark will
* not be found when searching for a plain (unaccented) A. (unless
@@ -852,7 +852,7 @@ U_INTERNAL UBool U_EXPORT2 usearch_search(UStringSearch *strsrch,
* When beginning a search, the initial starting position, startIdx,
* is assumed to be an acceptable match boundary with respect to
* combining characters. A combining sequence that spans across the
- * starting point will not supress a match beginning at startIdx.
+ * starting point will not suppress a match beginning at startIdx.
*
* Characters that expand to multiple collation elements
* (German sharp-S becoming 'ss', or the composed forms of accented
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/uspoof.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/uspoof.h
index d15ba4b2423..63a13387b06 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/uspoof.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/uspoof.h
@@ -353,6 +353,8 @@
* @stable ICU 4.6
*/
+U_CDECL_BEGIN
+
struct USpoofChecker;
/**
* @stable ICU 4.2
@@ -471,7 +473,6 @@ typedef enum USpoofChecks {
*/
USPOOF_MIXED_NUMBERS = 128,
-#ifndef U_HIDE_DRAFT_API
/**
* Check that an identifier does not have a combining character following a character in which that
* combining character would be hidden; for example 'i' followed by a U+0307 combining dot.
@@ -489,10 +490,9 @@ typedef enum USpoofChecks {
*
* This list and the number of combing characters considered by this check may grow over time.
*
- * @draft ICU 62
+ * @stable ICU 62
*/
USPOOF_HIDDEN_OVERLAY = 256,
-#endif /* U_HIDE_DRAFT_API */
/**
* Enable all spoof checks.
@@ -674,25 +674,6 @@ uspoof_openFromSource(const char *confusables, int32_t confusablesLen,
U_STABLE void U_EXPORT2
uspoof_close(USpoofChecker *sc);
-#if U_SHOW_CPLUSPLUS_API
-
-U_NAMESPACE_BEGIN
-
-/**
- * \class LocalUSpoofCheckerPointer
- * "Smart pointer" class, closes a USpoofChecker via uspoof_close().
- * For most methods see the LocalPointerBase base class.
- *
- * @see LocalPointerBase
- * @see LocalPointer
- * @stable ICU 4.4
- */
-U_DEFINE_LOCAL_OPEN_POINTER(LocalUSpoofCheckerPointer, USpoofChecker, uspoof_close);
-
-U_NAMESPACE_END
-
-#endif
-
/**
* Clone a Spoof Checker. The clone will be set to perform the same checks
* as the original source.
@@ -901,54 +882,6 @@ U_STABLE const USet * U_EXPORT2
uspoof_getAllowedChars(const USpoofChecker *sc, UErrorCode *status);
-#if U_SHOW_CPLUSPLUS_API
-/**
- * Limit the acceptable characters to those specified by a Unicode Set.
- * Any previously specified character limit is
- * is replaced by the new settings. This includes limits on
- * characters that were set with the uspoof_setAllowedLocales() function.
- *
- * The USPOOF_CHAR_LIMIT test is automatically enabled for this
- * USoofChecker by this function.
- *
- * @param sc The USpoofChecker
- * @param chars A Unicode Set containing the list of
- * characters that are permitted. Ownership of the set
- * remains with the caller. The incoming set is cloned by
- * this function, so there are no restrictions on modifying
- * or deleting the UnicodeSet after calling this function.
- * @param status The error code, set if this function encounters a problem.
- * @stable ICU 4.2
- */
-U_STABLE void U_EXPORT2
-uspoof_setAllowedUnicodeSet(USpoofChecker *sc, const icu::UnicodeSet *chars, UErrorCode *status);
-
-
-/**
- * Get a UnicodeSet for the characters permitted in an identifier.
- * This corresponds to the limits imposed by the Set Allowed Characters /
- * UnicodeSet functions. Limitations imposed by other checks will not be
- * reflected in the set returned by this function.
- *
- * The returned set will be frozen, meaning that it cannot be modified
- * by the caller.
- *
- * Ownership of the returned set remains with the Spoof Detector. The
- * returned set will become invalid if the spoof detector is closed,
- * or if a new set of allowed characters is specified.
- *
- *
- * @param sc The USpoofChecker
- * @param status The error code, set if this function encounters a problem.
- * @return A UnicodeSet containing the characters that are permitted by
- * the USPOOF_CHAR_LIMIT test.
- * @stable ICU 4.2
- */
-U_STABLE const icu::UnicodeSet * U_EXPORT2
-uspoof_getAllowedUnicodeSet(const USpoofChecker *sc, UErrorCode *status);
-#endif
-
-
/**
* Check the specified string for possible security issues.
* The text to be checked will typically be an identifier of some sort.
@@ -1027,43 +960,6 @@ uspoof_checkUTF8(const USpoofChecker *sc,
UErrorCode *status);
-#if U_SHOW_CPLUSPLUS_API
-/**
- * Check the specified string for possible security issues.
- * The text to be checked will typically be an identifier of some sort.
- * The set of checks to be performed is specified with uspoof_setChecks().
- *
- * \note
- * Consider using the newer API, {@link uspoof_check2UnicodeString}, instead.
- * The newer API exposes additional information from the check procedure
- * and is otherwise identical to this method.
- *
- * @param sc The USpoofChecker
- * @param id A identifier to be checked for possible security issues.
- * @param position Deprecated in ICU 51. Always returns zero.
- * Originally, an out parameter for the index of the first
- * string position that failed a check.
- * This parameter may be NULL.
- * @param status The error code, set if an error occurred while attempting to
- * perform the check.
- * Spoofing or security issues detected with the input string are
- * not reported here, but through the function's return value.
- * @return An integer value with bits set for any potential security
- * or spoofing issues detected. The bits are defined by
- * enum USpoofChecks. (returned_value & USPOOF_ALL_CHECKS)
- * will be zero if the input string passes all of the
- * enabled checks.
- * @see uspoof_check2UnicodeString
- * @stable ICU 4.2
- */
-U_STABLE int32_t U_EXPORT2
-uspoof_checkUnicodeString(const USpoofChecker *sc,
- const icu::UnicodeString &id,
- int32_t *position,
- UErrorCode *status);
-#endif
-
-
/**
* Check the specified string for possible security issues.
* The text to be checked will typically be an identifier of some sort.
@@ -1135,39 +1031,6 @@ uspoof_check2UTF8(const USpoofChecker *sc,
USpoofCheckResult* checkResult,
UErrorCode *status);
-#if U_SHOW_CPLUSPLUS_API
-/**
- * Check the specified string for possible security issues.
- * The text to be checked will typically be an identifier of some sort.
- * The set of checks to be performed is specified with uspoof_setChecks().
- *
- * @param sc The USpoofChecker
- * @param id A identifier to be checked for possible security issues.
- * @param checkResult An instance of USpoofCheckResult to be filled with
- * details about the identifier. Can be NULL.
- * @param status The error code, set if an error occurred while attempting to
- * perform the check.
- * Spoofing or security issues detected with the input string are
- * not reported here, but through the function's return value.
- * @return An integer value with bits set for any potential security
- * or spoofing issues detected. The bits are defined by
- * enum USpoofChecks. (returned_value & USPOOF_ALL_CHECKS)
- * will be zero if the input string passes all of the
- * enabled checks. Any information in this bitmask will be
- * consistent with the information saved in the optional
- * checkResult parameter.
- * @see uspoof_openCheckResult
- * @see uspoof_check2
- * @see uspoof_check2UTF8
- * @stable ICU 58
- */
-U_STABLE int32_t U_EXPORT2
-uspoof_check2UnicodeString(const USpoofChecker *sc,
- const icu::UnicodeString &id,
- USpoofCheckResult* checkResult,
- UErrorCode *status);
-#endif
-
/**
* Create a USpoofCheckResult, used by the {@link uspoof_check2} class of functions to return
* information about the identifier. Information includes:
@@ -1199,32 +1062,6 @@ uspoof_openCheckResult(UErrorCode *status);
U_STABLE void U_EXPORT2
uspoof_closeCheckResult(USpoofCheckResult *checkResult);
-#if U_SHOW_CPLUSPLUS_API
-
-U_NAMESPACE_BEGIN
-
-/**
- * \class LocalUSpoofCheckResultPointer
- * "Smart pointer" class, closes a USpoofCheckResult via `uspoof_closeCheckResult()`.
- * For most methods see the LocalPointerBase base class.
- *
- * @see LocalPointerBase
- * @see LocalPointer
- * @stable ICU 58
- */
-
-/**
- * \cond
- * Note: Doxygen is giving a bogus warning on this U_DEFINE_LOCAL_OPEN_POINTER.
- * For now, suppress with a Doxygen cond
- */
-U_DEFINE_LOCAL_OPEN_POINTER(LocalUSpoofCheckResultPointer, USpoofCheckResult, uspoof_closeCheckResult);
-/** \endcond */
-
-U_NAMESPACE_END
-
-#endif
-
/**
* Indicates which of the spoof check(s) have failed. The value is a bitwise OR of the constants for the tests
* in question: USPOOF_RESTRICTION_LEVEL, USPOOF_CHAR_LIMIT, and so on.
@@ -1355,36 +1192,6 @@ uspoof_areConfusableUTF8(const USpoofChecker *sc,
-#if U_SHOW_CPLUSPLUS_API
-/**
- * A version of {@link uspoof_areConfusable} accepting UnicodeStrings.
- *
- * @param sc The USpoofChecker
- * @param s1 The first of the two identifiers to be compared for
- * confusability. The strings are in UTF-8 format.
- * @param s2 The second of the two identifiers to be compared for
- * confusability. The strings are in UTF-8 format.
- * @param status The error code, set if an error occurred while attempting to
- * perform the check.
- * Confusability of the identifiers is not reported here,
- * but through this function's return value.
- * @return An integer value with bit(s) set corresponding to
- * the type of confusability found, as defined by
- * enum USpoofChecks. Zero is returned if the identifiers
- * are not confusable.
- *
- * @stable ICU 4.2
- *
- * @see uspoof_areConfusable
- */
-U_STABLE int32_t U_EXPORT2
-uspoof_areConfusableUnicodeString(const USpoofChecker *sc,
- const icu::UnicodeString &s1,
- const icu::UnicodeString &s2,
- UErrorCode *status);
-#endif
-
-
/**
* Get the "skeleton" for an identifier.
* Skeletons are a transformation of the input identifier;
@@ -1463,38 +1270,6 @@ uspoof_getSkeletonUTF8(const USpoofChecker *sc,
char *dest, int32_t destCapacity,
UErrorCode *status);
-#if U_SHOW_CPLUSPLUS_API
-/**
- * Get the "skeleton" for an identifier.
- * Skeletons are a transformation of the input identifier;
- * Two identifiers are confusable if their skeletons are identical.
- * See Unicode UAX #39 for additional information.
- *
- * Using skeletons directly makes it possible to quickly check
- * whether an identifier is confusable with any of some large
- * set of existing identifiers, by creating an efficiently
- * searchable collection of the skeletons.
- *
- * @param sc The USpoofChecker.
- * @param type Deprecated in ICU 58. You may pass any number.
- * Originally, controlled which of the Unicode confusable data
- * tables to use.
- * @param id The input identifier whose skeleton will be computed.
- * @param dest The output identifier, to receive the skeleton string.
- * @param status The error code, set if an error occurred while attempting to
- * perform the check.
- * @return A reference to the destination (skeleton) string.
- *
- * @stable ICU 4.2
- */
-U_I18N_API icu::UnicodeString & U_EXPORT2
-uspoof_getSkeletonUnicodeString(const USpoofChecker *sc,
- uint32_t type,
- const icu::UnicodeString &id,
- icu::UnicodeString &dest,
- UErrorCode *status);
-#endif /* U_SHOW_CPLUSPLUS_API */
-
/**
* Get the set of Candidate Characters for Inclusion in Identifiers, as defined
* in http://unicode.org/Public/security/latest/xidmodifications.txt
@@ -1525,8 +1300,243 @@ uspoof_getInclusionSet(UErrorCode *status);
U_STABLE const USet * U_EXPORT2
uspoof_getRecommendedSet(UErrorCode *status);
+/**
+ * Serialize the data for a spoof detector into a chunk of memory.
+ * The flattened spoof detection tables can later be used to efficiently
+ * instantiate a new Spoof Detector.
+ *
+ * The serialized spoof checker includes only the data compiled from the
+ * Unicode data tables by uspoof_openFromSource(); it does not include
+ * include any other state or configuration that may have been set.
+ *
+ * @param sc the Spoof Detector whose data is to be serialized.
+ * @param data a pointer to 32-bit-aligned memory to be filled with the data,
+ * can be NULL if capacity==0
+ * @param capacity the number of bytes available at data,
+ * or 0 for preflighting
+ * @param status an in/out ICU UErrorCode; possible errors include:
+ * - U_BUFFER_OVERFLOW_ERROR if the data storage block is too small for serialization
+ * - U_ILLEGAL_ARGUMENT_ERROR the data or capacity parameters are bad
+ * @return the number of bytes written or needed for the spoof data
+ *
+ * @see utrie2_openFromSerialized()
+ * @stable ICU 4.2
+ */
+U_STABLE int32_t U_EXPORT2
+uspoof_serialize(USpoofChecker *sc,
+ void *data, int32_t capacity,
+ UErrorCode *status);
+
+U_CDECL_END
+
#if U_SHOW_CPLUSPLUS_API
+U_NAMESPACE_BEGIN
+
+/**
+ * \class LocalUSpoofCheckerPointer
+ * "Smart pointer" class, closes a USpoofChecker via uspoof_close().
+ * For most methods see the LocalPointerBase base class.
+ *
+ * @see LocalPointerBase
+ * @see LocalPointer
+ * @stable ICU 4.4
+ */
+/**
+ * \cond
+ * Note: Doxygen is giving a bogus warning on this U_DEFINE_LOCAL_OPEN_POINTER.
+ * For now, suppress with a Doxygen cond
+ */
+U_DEFINE_LOCAL_OPEN_POINTER(LocalUSpoofCheckerPointer, USpoofChecker, uspoof_close);
+/** \endcond */
+
+/**
+ * \class LocalUSpoofCheckResultPointer
+ * "Smart pointer" class, closes a USpoofCheckResult via `uspoof_closeCheckResult()`.
+ * For most methods see the LocalPointerBase base class.
+ *
+ * @see LocalPointerBase
+ * @see LocalPointer
+ * @stable ICU 58
+ */
+
+/**
+ * \cond
+ * Note: Doxygen is giving a bogus warning on this U_DEFINE_LOCAL_OPEN_POINTER.
+ * For now, suppress with a Doxygen cond
+ */
+U_DEFINE_LOCAL_OPEN_POINTER(LocalUSpoofCheckResultPointer, USpoofCheckResult, uspoof_closeCheckResult);
+/** \endcond */
+
+U_NAMESPACE_END
+
+/**
+ * Limit the acceptable characters to those specified by a Unicode Set.
+ * Any previously specified character limit is
+ * is replaced by the new settings. This includes limits on
+ * characters that were set with the uspoof_setAllowedLocales() function.
+ *
+ * The USPOOF_CHAR_LIMIT test is automatically enabled for this
+ * USoofChecker by this function.
+ *
+ * @param sc The USpoofChecker
+ * @param chars A Unicode Set containing the list of
+ * characters that are permitted. Ownership of the set
+ * remains with the caller. The incoming set is cloned by
+ * this function, so there are no restrictions on modifying
+ * or deleting the UnicodeSet after calling this function.
+ * @param status The error code, set if this function encounters a problem.
+ * @stable ICU 4.2
+ */
+U_STABLE void U_EXPORT2
+uspoof_setAllowedUnicodeSet(USpoofChecker *sc, const icu::UnicodeSet *chars, UErrorCode *status);
+
+
+/**
+ * Get a UnicodeSet for the characters permitted in an identifier.
+ * This corresponds to the limits imposed by the Set Allowed Characters /
+ * UnicodeSet functions. Limitations imposed by other checks will not be
+ * reflected in the set returned by this function.
+ *
+ * The returned set will be frozen, meaning that it cannot be modified
+ * by the caller.
+ *
+ * Ownership of the returned set remains with the Spoof Detector. The
+ * returned set will become invalid if the spoof detector is closed,
+ * or if a new set of allowed characters is specified.
+ *
+ *
+ * @param sc The USpoofChecker
+ * @param status The error code, set if this function encounters a problem.
+ * @return A UnicodeSet containing the characters that are permitted by
+ * the USPOOF_CHAR_LIMIT test.
+ * @stable ICU 4.2
+ */
+U_STABLE const icu::UnicodeSet * U_EXPORT2
+uspoof_getAllowedUnicodeSet(const USpoofChecker *sc, UErrorCode *status);
+
+/**
+ * Check the specified string for possible security issues.
+ * The text to be checked will typically be an identifier of some sort.
+ * The set of checks to be performed is specified with uspoof_setChecks().
+ *
+ * \note
+ * Consider using the newer API, {@link uspoof_check2UnicodeString}, instead.
+ * The newer API exposes additional information from the check procedure
+ * and is otherwise identical to this method.
+ *
+ * @param sc The USpoofChecker
+ * @param id A identifier to be checked for possible security issues.
+ * @param position Deprecated in ICU 51. Always returns zero.
+ * Originally, an out parameter for the index of the first
+ * string position that failed a check.
+ * This parameter may be NULL.
+ * @param status The error code, set if an error occurred while attempting to
+ * perform the check.
+ * Spoofing or security issues detected with the input string are
+ * not reported here, but through the function's return value.
+ * @return An integer value with bits set for any potential security
+ * or spoofing issues detected. The bits are defined by
+ * enum USpoofChecks. (returned_value & USPOOF_ALL_CHECKS)
+ * will be zero if the input string passes all of the
+ * enabled checks.
+ * @see uspoof_check2UnicodeString
+ * @stable ICU 4.2
+ */
+U_STABLE int32_t U_EXPORT2
+uspoof_checkUnicodeString(const USpoofChecker *sc,
+ const icu::UnicodeString &id,
+ int32_t *position,
+ UErrorCode *status);
+
+/**
+ * Check the specified string for possible security issues.
+ * The text to be checked will typically be an identifier of some sort.
+ * The set of checks to be performed is specified with uspoof_setChecks().
+ *
+ * @param sc The USpoofChecker
+ * @param id A identifier to be checked for possible security issues.
+ * @param checkResult An instance of USpoofCheckResult to be filled with
+ * details about the identifier. Can be NULL.
+ * @param status The error code, set if an error occurred while attempting to
+ * perform the check.
+ * Spoofing or security issues detected with the input string are
+ * not reported here, but through the function's return value.
+ * @return An integer value with bits set for any potential security
+ * or spoofing issues detected. The bits are defined by
+ * enum USpoofChecks. (returned_value & USPOOF_ALL_CHECKS)
+ * will be zero if the input string passes all of the
+ * enabled checks. Any information in this bitmask will be
+ * consistent with the information saved in the optional
+ * checkResult parameter.
+ * @see uspoof_openCheckResult
+ * @see uspoof_check2
+ * @see uspoof_check2UTF8
+ * @stable ICU 58
+ */
+U_STABLE int32_t U_EXPORT2
+uspoof_check2UnicodeString(const USpoofChecker *sc,
+ const icu::UnicodeString &id,
+ USpoofCheckResult* checkResult,
+ UErrorCode *status);
+
+/**
+ * A version of {@link uspoof_areConfusable} accepting UnicodeStrings.
+ *
+ * @param sc The USpoofChecker
+ * @param s1 The first of the two identifiers to be compared for
+ * confusability. The strings are in UTF-8 format.
+ * @param s2 The second of the two identifiers to be compared for
+ * confusability. The strings are in UTF-8 format.
+ * @param status The error code, set if an error occurred while attempting to
+ * perform the check.
+ * Confusability of the identifiers is not reported here,
+ * but through this function's return value.
+ * @return An integer value with bit(s) set corresponding to
+ * the type of confusability found, as defined by
+ * enum USpoofChecks. Zero is returned if the identifiers
+ * are not confusable.
+ *
+ * @stable ICU 4.2
+ *
+ * @see uspoof_areConfusable
+ */
+U_STABLE int32_t U_EXPORT2
+uspoof_areConfusableUnicodeString(const USpoofChecker *sc,
+ const icu::UnicodeString &s1,
+ const icu::UnicodeString &s2,
+ UErrorCode *status);
+
+/**
+ * Get the "skeleton" for an identifier.
+ * Skeletons are a transformation of the input identifier;
+ * Two identifiers are confusable if their skeletons are identical.
+ * See Unicode UAX #39 for additional information.
+ *
+ * Using skeletons directly makes it possible to quickly check
+ * whether an identifier is confusable with any of some large
+ * set of existing identifiers, by creating an efficiently
+ * searchable collection of the skeletons.
+ *
+ * @param sc The USpoofChecker.
+ * @param type Deprecated in ICU 58. You may pass any number.
+ * Originally, controlled which of the Unicode confusable data
+ * tables to use.
+ * @param id The input identifier whose skeleton will be computed.
+ * @param dest The output identifier, to receive the skeleton string.
+ * @param status The error code, set if an error occurred while attempting to
+ * perform the check.
+ * @return A reference to the destination (skeleton) string.
+ *
+ * @stable ICU 4.2
+ */
+U_I18N_API icu::UnicodeString & U_EXPORT2
+uspoof_getSkeletonUnicodeString(const USpoofChecker *sc,
+ uint32_t type,
+ const icu::UnicodeString &id,
+ icu::UnicodeString &dest,
+ UErrorCode *status);
+
/**
* Get the set of Candidate Characters for Inclusion in Identifiers, as defined
* in http://unicode.org/Public/security/latest/xidmodifications.txt
@@ -1559,34 +1569,6 @@ uspoof_getRecommendedUnicodeSet(UErrorCode *status);
#endif /* U_SHOW_CPLUSPLUS_API */
-/**
- * Serialize the data for a spoof detector into a chunk of memory.
- * The flattened spoof detection tables can later be used to efficiently
- * instantiate a new Spoof Detector.
- *
- * The serialized spoof checker includes only the data compiled from the
- * Unicode data tables by uspoof_openFromSource(); it does not include
- * include any other state or configuration that may have been set.
- *
- * @param sc the Spoof Detector whose data is to be serialized.
- * @param data a pointer to 32-bit-aligned memory to be filled with the data,
- * can be NULL if capacity==0
- * @param capacity the number of bytes available at data,
- * or 0 for preflighting
- * @param status an in/out ICU UErrorCode; possible errors include:
- * - U_BUFFER_OVERFLOW_ERROR if the data storage block is too small for serialization
- * - U_ILLEGAL_ARGUMENT_ERROR the data or capacity parameters are bad
- * @return the number of bytes written or needed for the spoof data
- *
- * @see utrie2_openFromSerialized()
- * @stable ICU 4.2
- */
-U_STABLE int32_t U_EXPORT2
-uspoof_serialize(USpoofChecker *sc,
- void *data, int32_t capacity,
- UErrorCode *status);
-
-
-#endif
+#endif /* UCONFIG_NO_NORMALIZATION */
#endif /* USPOOF_H */
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/utrans.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/utrans.h
index 697681aef85..021af498a83 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/utrans.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/utrans.h
@@ -142,7 +142,7 @@ typedef struct UTransPosition {
int32_t contextLimit;
/**
- * Beginning index, inclusive, of the text to be transliteratd.
+ * Beginning index, inclusive, of the text to be transliterated.
* INPUT/OUTPUT parameter: This parameter is advanced past
* characters that have already been transliterated by a
* transliteration operation.
@@ -151,7 +151,7 @@ typedef struct UTransPosition {
int32_t start;
/**
- * Ending index, exclusive, of the text to be transliteratd.
+ * Ending index, exclusive, of the text to be transliterated.
* INPUT/OUTPUT parameter: This parameter is updated to reflect
* changes in the length of the text, but points to the same
* logical position in the text.
@@ -389,7 +389,7 @@ utrans_trans(const UTransliterator* trans,
/**
* Transliterate the portion of the UReplaceable text buffer that can
- * be transliterated unambiguosly. This method is typically called
+ * be transliterated unambiguously. This method is typically called
* after new text has been inserted, e.g. as a result of a keyboard
* event. The transliterator will try to transliterate characters of
* <code>rep</code> between <code>index.cursor</code> and
@@ -454,8 +454,7 @@ utrans_transIncremental(const UTransliterator* trans,
* zero-terminated. Upon return, the new length is stored in
* *textLength. If textLength is NULL then the string is assumed to
* be zero-terminated.
- * @param textCapacity a pointer to the length of the text buffer.
- * Upon return,
+ * @param textCapacity the length of the text buffer
* @param start the beginning index, inclusive; <code>0 <= start <=
* limit</code>.
* @param limit pointer to the ending index, exclusive; <code>start <=
@@ -479,7 +478,7 @@ utrans_transUChars(const UTransliterator* trans,
/**
* Transliterate the portion of the UChar* text buffer that can be
- * transliterated unambiguosly. See utrans_transIncremental(). The
+ * transliterated unambiguously. See utrans_transIncremental(). The
* string is passed in in a UChar* buffer. The string is modified in
* place. If the result is longer than textCapacity, it is truncated.
* The actual length of the result is returned in *textLength, if
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unicode/vtzone.h b/Build/source/libs/icu/icu-src/source/i18n/unicode/vtzone.h
index 18265d34150..2743b6c474f 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unicode/vtzone.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/unicode/vtzone.h
@@ -11,6 +11,8 @@
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: RFC2445 VTIMEZONE support
@@ -185,7 +187,7 @@ public:
* @return A new copy of this TimeZone object.
* @stable ICU 3.8
*/
- virtual TimeZone* clone(void) const;
+ virtual VTimeZone* clone() const;
/**
* Returns the TimeZone's adjusted GMT offset (i.e., the number of milliseconds to add
@@ -288,6 +290,7 @@ public:
*/
virtual UBool useDaylightTime(void) const;
+#ifndef U_FORCE_HIDE_DEPRECATED_API
/**
* Queries if the given date is in daylight savings time in
* this time zone.
@@ -302,6 +305,7 @@ public:
* @deprecated ICU 2.4. Use Calendar::inDaylightTime() instead.
*/
virtual UBool inDaylightTime(UDate date, UErrorCode& status) const;
+#endif // U_FORCE_HIDE_DEPRECATED_API
/**
* Returns true if this zone has the same rule and offset as another zone.
@@ -453,5 +457,7 @@ U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // VTZONE_H
//eof
diff --git a/Build/source/libs/icu/icu-src/source/i18n/unum.cpp b/Build/source/libs/icu/icu-src/source/i18n/unum.cpp
index c0bb9cbf401..cce3db7d0bc 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/unum.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/unum.cpp
@@ -135,6 +135,11 @@ unum_open( UNumberFormatStyle style,
*status = U_MEMORY_ALLOCATION_ERROR;
}
+ if (U_FAILURE(*status) && retVal != NULL) {
+ delete retVal;
+ retVal = NULL;
+ }
+
return reinterpret_cast<UNumberFormat *>(retVal);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/upluralrules.cpp b/Build/source/libs/icu/icu-src/source/i18n/upluralrules.cpp
index bba6dfe3101..5119257fd80 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/upluralrules.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/upluralrules.cpp
@@ -17,7 +17,9 @@
#include "unicode/unistr.h"
#include "unicode/unum.h"
#include "unicode/numfmt.h"
+#include "unicode/unumberformatter.h"
#include "number_decimalquantity.h"
+#include "number_utypes.h"
U_NAMESPACE_USE
@@ -92,6 +94,28 @@ uplrules_select(const UPluralRules *uplrules,
}
U_CAPI int32_t U_EXPORT2
+uplrules_selectFormatted(const UPluralRules *uplrules,
+ const UFormattedNumber* number,
+ UChar *keyword, int32_t capacity,
+ UErrorCode *status)
+{
+ if (U_FAILURE(*status)) {
+ return 0;
+ }
+ if (keyword == NULL ? capacity != 0 : capacity < 0) {
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
+ return 0;
+ }
+ const number::impl::DecimalQuantity* dq =
+ number::impl::validateUFormattedNumberToDecimalQuantity(number, *status);
+ if (U_FAILURE(*status)) {
+ return 0;
+ }
+ UnicodeString result = ((PluralRules*)uplrules)->select(*dq);
+ return result.extract(keyword, capacity, *status);
+}
+
+U_CAPI int32_t U_EXPORT2
uplrules_selectWithFormat(const UPluralRules *uplrules,
double number,
const UNumberFormat *fmt,
diff --git a/Build/source/libs/icu/icu-src/source/i18n/uregex.cpp b/Build/source/libs/icu/icu-src/source/i18n/uregex.cpp
index 9a189a32871..57c2febe9d0 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/uregex.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/uregex.cpp
@@ -767,7 +767,7 @@ uregex_start64(URegularExpression *regexp2,
if (validateRE(regexp, TRUE, status) == FALSE) {
return 0;
}
- int32_t result = regexp->fMatcher->start(groupNum, *status);
+ int64_t result = regexp->fMatcher->start64(groupNum, *status);
return result;
}
@@ -791,7 +791,7 @@ uregex_end64(URegularExpression *regexp2,
if (validateRE(regexp, TRUE, status) == FALSE) {
return 0;
}
- int32_t result = regexp->fMatcher->end(groupNum, *status);
+ int64_t result = regexp->fMatcher->end64(groupNum, *status);
return result;
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/usearch.cpp b/Build/source/libs/icu/icu-src/source/i18n/usearch.cpp
index 4f758bac515..8866de70337 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/usearch.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/usearch.cpp
@@ -317,7 +317,7 @@ inline uint16_t initializePatternCETable(UStringSearch *strsrch,
uprv_free(pattern->ces);
}
- uint16_t offset = 0;
+ uint32_t offset = 0;
uint16_t result = 0;
int32_t ce;
@@ -388,7 +388,7 @@ inline uint16_t initializePatternPCETable(UStringSearch *strsrch,
uprv_free(pattern->pces);
}
- uint16_t offset = 0;
+ uint32_t offset = 0;
uint16_t result = 0;
int64_t pce;
@@ -1351,7 +1351,7 @@ inline int getUnblockedAccentIndex(UChar *accents, int32_t *accentsindex)
* @param destinationlength target array size, returning the appended length
* @param source1 null-terminated first array
* @param source2 second array
-* @param source2length length of seond array
+* @param source2length length of second array
* @param source3 null-terminated third array
* @param status error status if any
* @return new destination array, destination if there was no new allocation
@@ -1560,7 +1560,7 @@ inline void cleanUpSafeText(const UStringSearch *strsrch, UChar *safetext,
/**
* Take the rearranged end accents and tries matching. If match failed at
-* a seperate preceding set of accents (seperated from the rearranged on by
+* a separate preceding set of accents (separated from the rearranged on by
* at least a base character) then we rearrange the preceding accents and
* tries matching again.
* We allow skipping of the ends of the accent set if the ces do not match.
@@ -2220,7 +2220,7 @@ int32_t doPreviousCanonicalSuffixMatch(UStringSearch *strsrch,
/**
* Take the rearranged start accents and tries matching. If match failed at
-* a seperate following set of accents (seperated from the rearranged on by
+* a separate following set of accents (separated from the rearranged on by
* at least a base character) then we rearrange the preceding accents and
* tries matching again.
* We allow skipping of the ends of the accent set if the ces do not match.
@@ -3545,7 +3545,10 @@ const CEI *CEIBuffer::get(int32_t index) {
// that is allowed.
if (index != limitIx) {
U_ASSERT(FALSE);
-
+ // TODO: In ICU 64 the above assert was changed to use UPRV_UNREACHABLE instead
+ // which unconditionally calls abort(). However, there were cases where this was
+ // being hit. This change is reverted for now, restoring the existing behavior.
+ // ICU-20792 tracks the follow-up work/further investigation on this.
return NULL;
}
@@ -3584,7 +3587,10 @@ const CEI *CEIBuffer::getPrevious(int32_t index) {
// that is allowed.
if (index != limitIx) {
U_ASSERT(FALSE);
-
+ // TODO: In ICU 64 the above assert was changed to use UPRV_UNREACHABLE instead
+ // which unconditionally calls abort(). However, there were cases where this was
+ // being hit. This change is reverted for now, restoring the existing behavior.
+ // ICU-20792 tracks the follow-up work/further investigation on this.
return NULL;
}
@@ -3856,7 +3862,7 @@ U_CAPI UBool U_EXPORT2 usearch_search(UStringSearch *strsrch,
#endif
// Input parameter sanity check.
- // TODO: should input indicies clip to the text length
+ // TODO: should input indices clip to the text length
// in the same way that UText does.
if(strsrch->pattern.cesLength == 0 ||
startIdx < 0 ||
@@ -4018,7 +4024,7 @@ U_CAPI UBool U_EXPORT2 usearch_search(UStringSearch *strsrch,
// Check for the start of the match being within an Collation Element Expansion,
// meaning that the first char of the match is only partially matched.
- // With exapnsions, the first CE will report the index of the source
+ // With expansions, the first CE will report the index of the source
// character, and all subsequent (expansions) CEs will report the source index of the
// _following_ character.
int32_t secondIx = firstCEI->highIndex;
diff --git a/Build/source/libs/icu/icu-src/source/i18n/uspoof.cpp b/Build/source/libs/icu/icu-src/source/i18n/uspoof.cpp
index 8e3d69ede2b..5b7b326f1fd 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/uspoof.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/uspoof.cpp
@@ -43,7 +43,9 @@ static UnicodeSet *gRecommendedSet = NULL;
static const Normalizer2 *gNfdNormalizer = NULL;
static UInitOnce gSpoofInitStaticsOnce = U_INITONCE_INITIALIZER;
-static UBool U_CALLCONV
+namespace {
+
+UBool U_CALLCONV
uspoof_cleanup(void) {
delete gInclusionSet;
gInclusionSet = NULL;
@@ -54,7 +56,7 @@ uspoof_cleanup(void) {
return TRUE;
}
-static void U_CALLCONV initializeStatics(UErrorCode &status) {
+void U_CALLCONV initializeStatics(UErrorCode &status) {
static const char16_t *inclusionPat =
u"['\\-.\\:\\u00B7\\u0375\\u058A\\u05F3\\u05F4\\u06FD\\u06FE\\u0F0B\\u200C"
u"\\u200D\\u2010\\u2019\\u2027\\u30A0\\u30FB]";
@@ -69,7 +71,6 @@ static void U_CALLCONV initializeStatics(UErrorCode &status) {
// There is tooling to generate this constant in the unicodetools project:
// org.unicode.text.tools.RecommendedSetGenerator
// It will print the Java and C++ code to the console for easy copy-paste into this file.
- // Note: concatenated string constants do not work with UNICODE_STRING_SIMPLE on all platforms.
static const char16_t *recommendedPat =
u"[0-9A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u0131\\u0134-\\u013E"
u"\\u0141-\\u0148\\u014A-\\u017E\\u018F\\u01A0\\u01A1\\u01AF\\u01B0\\u01CD-"
@@ -107,37 +108,36 @@ static void U_CALLCONV initializeStatics(UErrorCode &status) {
u"\\u0D8E\\u0D91-\\u0D96\\u0D9A-\\u0DA5\\u0DA7-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD"
u"\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDE\\u0DF2\\u0E01-"
u"\\u0E32\\u0E34-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84"
- u"\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3"
- u"\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB2\\u0EB4-\\u0EB9\\u0EBB-\\u0EBD"
- u"\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDE\\u0EDF\\u0F00"
- u"\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F3E-\\u0F42\\u0F44-\\u0F47\\u0F49-\\u0F4C"
- u"\\u0F4E-\\u0F51\\u0F53-\\u0F56\\u0F58-\\u0F5B\\u0F5D-\\u0F68\\u0F6A-\\u0F6C"
- u"\\u0F71\\u0F72\\u0F74\\u0F7A-\\u0F80\\u0F82-\\u0F84\\u0F86-\\u0F92\\u0F94-"
- u"\\u0F97\\u0F99-\\u0F9C\\u0F9E-\\u0FA1\\u0FA3-\\u0FA6\\u0FA8-\\u0FAB\\u0FAD-"
- u"\\u0FB8\\u0FBA-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10C7\\u10CD"
- u"\\u10D0-\\u10F0\\u10F7-\\u10FA\\u10FD-\\u10FF\\u1200-\\u1248\\u124A-\\u124D"
- u"\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-"
- u"\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6"
- u"\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F"
- u"\\u1780-\\u17A2\\u17A5-\\u17A7\\u17A9-\\u17B3\\u17B6-\\u17CA\\u17D2\\u17D7"
- u"\\u17DC\\u17E0-\\u17E9\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1E00-"
- u"\\u1E99\\u1E9E\\u1EA0-\\u1EF9\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45"
- u"\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F70\\u1F72"
- u"\\u1F74\\u1F76\\u1F78\\u1F7A\\u1F7C\\u1F80-\\u1FB4\\u1FB6-\\u1FBA\\u1FBC"
- u"\\u1FC2-\\u1FC4\\u1FC6-\\u1FC8\\u1FCA\\u1FCC\\u1FD0-\\u1FD2\\u1FD6-\\u1FDA"
- u"\\u1FE0-\\u1FE2\\u1FE4-\\u1FEA\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FF8\\u1FFA"
- u"\\u1FFC\\u2D27\\u2D2D\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-"
- u"\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-"
- u"\\u2DDE\\u3005-\\u3007\\u3041-\\u3096\\u3099\\u309A\\u309D\\u309E\\u30A1-"
- u"\\u30FA\\u30FC-\\u30FE\\u3105-\\u312F\\u31A0-\\u31BA\\u3400-\\u4DB5\\u4E00-"
- u"\\u9FEF\\uA660\\uA661\\uA674-\\uA67B\\uA67F\\uA69F\\uA717-\\uA71F\\uA788"
- u"\\uA78D\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7AE\\uA7AF\\uA7B8\\uA7B9"
- u"\\uA7FA\\uA9E7-\\uA9FE\\uAA60-\\uAA76\\uAA7A-\\uAA7F\\uAB01-\\uAB06\\uAB09-"
- u"\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAC00-\\uD7A3\\uFA0E"
- u"\\uFA0F\\uFA11\\uFA13\\uFA14\\uFA1F\\uFA21\\uFA23\\uFA24\\uFA27-\\uFA29"
- u"\\U0001133B\\U0001B002-\\U0001B11E\\U00020000-\\U0002A6D6\\U0002A700-"
- u"\\U0002B734\\U0002B740-\\U0002B81D\\U0002B820-\\U0002CEA1\\U0002CEB0-"
- u"\\U0002EBE0]";
+ u"\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB2\\u0EB4-\\u0EBD\\u0EC0-"
+ u"\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDE\\u0EDF\\u0F00\\u0F20-"
+ u"\\u0F29\\u0F35\\u0F37\\u0F3E-\\u0F42\\u0F44-\\u0F47\\u0F49-\\u0F4C\\u0F4E-"
+ u"\\u0F51\\u0F53-\\u0F56\\u0F58-\\u0F5B\\u0F5D-\\u0F68\\u0F6A-\\u0F6C\\u0F71"
+ u"\\u0F72\\u0F74\\u0F7A-\\u0F80\\u0F82-\\u0F84\\u0F86-\\u0F92\\u0F94-\\u0F97"
+ u"\\u0F99-\\u0F9C\\u0F9E-\\u0FA1\\u0FA3-\\u0FA6\\u0FA8-\\u0FAB\\u0FAD-\\u0FB8"
+ u"\\u0FBA-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10C7\\u10CD\\u10D0-"
+ u"\\u10F0\\u10F7-\\u10FA\\u10FD-\\u10FF\\u1200-\\u1248\\u124A-\\u124D\\u1250-"
+ u"\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0"
+ u"\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-"
+ u"\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u1780-"
+ u"\\u17A2\\u17A5-\\u17A7\\u17A9-\\u17B3\\u17B6-\\u17CA\\u17D2\\u17D7\\u17DC"
+ u"\\u17E0-\\u17E9\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1E00-\\u1E99"
+ u"\\u1E9E\\u1EA0-\\u1EF9\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-"
+ u"\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F70\\u1F72\\u1F74"
+ u"\\u1F76\\u1F78\\u1F7A\\u1F7C\\u1F80-\\u1FB4\\u1FB6-\\u1FBA\\u1FBC\\u1FC2-"
+ u"\\u1FC4\\u1FC6-\\u1FC8\\u1FCA\\u1FCC\\u1FD0-\\u1FD2\\u1FD6-\\u1FDA\\u1FE0-"
+ u"\\u1FE2\\u1FE4-\\u1FEA\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FF8\\u1FFA\\u1FFC"
+ u"\\u2D27\\u2D2D\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6"
+ u"\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE"
+ u"\\u3005-\\u3007\\u3041-\\u3096\\u3099\\u309A\\u309D\\u309E\\u30A1-\\u30FA"
+ u"\\u30FC-\\u30FE\\u3105-\\u312F\\u31A0-\\u31BA\\u3400-\\u4DB5\\u4E00-\\u9FEF"
+ u"\\uA660\\uA661\\uA674-\\uA67B\\uA67F\\uA69F\\uA717-\\uA71F\\uA788\\uA78D"
+ u"\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7AE\\uA7AF\\uA7B8-\\uA7BF\\uA7C2-"
+ u"\\uA7C6\\uA7FA\\uA9E7-\\uA9FE\\uAA60-\\uAA76\\uAA7A-\\uAA7F\\uAB01-\\uAB06"
+ u"\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB66\\uAB67"
+ u"\\uAC00-\\uD7A3\\uFA0E\\uFA0F\\uFA11\\uFA13\\uFA14\\uFA1F\\uFA21\\uFA23"
+ u"\\uFA24\\uFA27-\\uFA29\\U0001133B\\U0001B150-\\U0001B152\\U0001B164-"
+ u"\\U0001B167\\U00020000-\\U0002A6D6\\U0002A700-\\U0002B734\\U0002B740-"
+ u"\\U0002B81D\\U0002B820-\\U0002CEA1\\U0002CEB0-\\U0002EBE0]";
gRecommendedSet = new UnicodeSet(UnicodeString(recommendedPat), status);
if (gRecommendedSet == NULL) {
@@ -150,6 +150,8 @@ static void U_CALLCONV initializeStatics(UErrorCode &status) {
ucln_i18n_registerCleanup(UCLN_I18N_SPOOF, uspoof_cleanup);
}
+} // namespace
+
U_CFUNC void uspoof_internalInitStatics(UErrorCode *status) {
umtx_initOnce(gSpoofInitStaticsOnce, &initializeStatics, *status);
}
@@ -347,7 +349,7 @@ uspoof_setAllowedUnicodeSet(USpoofChecker *sc, const UnicodeSet *chars, UErrorCo
*status = U_ILLEGAL_ARGUMENT_ERROR;
return;
}
- UnicodeSet *clonedSet = static_cast<UnicodeSet *>(chars->clone());
+ UnicodeSet *clonedSet = chars->clone();
if (clonedSet == NULL || clonedSet->isBogus()) {
*status = U_MEMORY_ALLOCATION_ERROR;
return;
@@ -547,6 +549,8 @@ uspoof_checkUnicodeString(const USpoofChecker *sc,
return uspoof_check2UnicodeString(sc, id, NULL, status);
}
+namespace {
+
int32_t checkImpl(const SpoofImpl* This, const UnicodeString& id, CheckResult* checkResult, UErrorCode* status) {
U_ASSERT(This != NULL);
U_ASSERT(checkResult != NULL);
@@ -639,6 +643,8 @@ int32_t checkImpl(const SpoofImpl* This, const UnicodeString& id, CheckResult* c
return checkResult->toCombinedBitmask(This->fChecks);
}
+} // namespace
+
U_CAPI int32_t U_EXPORT2
uspoof_check2UnicodeString(const USpoofChecker *sc,
const icu::UnicodeString &id,
diff --git a/Build/source/libs/icu/icu-src/source/i18n/uspoof_impl.cpp b/Build/source/libs/icu/icu-src/source/i18n/uspoof_impl.cpp
index 2c1f088b12d..88245b7f8f9 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/uspoof_impl.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/uspoof_impl.cpp
@@ -52,7 +52,6 @@ SpoofImpl::SpoofImpl() {
}
void SpoofImpl::construct(UErrorCode& status) {
- fMagic = USPOOF_MAGIC;
fChecks = USPOOF_ALL_CHECKS;
fSpoofData = NULL;
fAllowedCharsSet = NULL;
@@ -74,17 +73,16 @@ void SpoofImpl::construct(UErrorCode& status) {
// Copy Constructor, used by the user level clone() function.
SpoofImpl::SpoofImpl(const SpoofImpl &src, UErrorCode &status) :
- fMagic(0), fChecks(USPOOF_ALL_CHECKS), fSpoofData(NULL), fAllowedCharsSet(NULL) ,
+ fChecks(USPOOF_ALL_CHECKS), fSpoofData(NULL), fAllowedCharsSet(NULL) ,
fAllowedLocales(NULL) {
if (U_FAILURE(status)) {
return;
}
- fMagic = src.fMagic;
fChecks = src.fChecks;
if (src.fSpoofData != NULL) {
fSpoofData = src.fSpoofData->addReference();
}
- fAllowedCharsSet = static_cast<const UnicodeSet *>(src.fAllowedCharsSet->clone());
+ fAllowedCharsSet = src.fAllowedCharsSet->clone();
fAllowedLocales = uprv_strdup(src.fAllowedLocales);
if (fAllowedCharsSet == NULL || fAllowedLocales == NULL) {
status = U_MEMORY_ALLOCATION_ERROR;
@@ -93,8 +91,6 @@ SpoofImpl::SpoofImpl(const SpoofImpl &src, UErrorCode &status) :
}
SpoofImpl::~SpoofImpl() {
- fMagic = 0; // head off application errors by preventing use of
- // of deleted objects.
if (fSpoofData != NULL) {
fSpoofData->removeReference(); // Will delete if refCount goes to zero.
}
@@ -104,7 +100,7 @@ SpoofImpl::~SpoofImpl() {
// Cast this instance as a USpoofChecker for the C API.
USpoofChecker *SpoofImpl::asUSpoofChecker() {
- return reinterpret_cast<USpoofChecker*>(this);
+ return exportForC();
}
//
@@ -112,18 +108,10 @@ USpoofChecker *SpoofImpl::asUSpoofChecker() {
// received from the C API.
//
const SpoofImpl *SpoofImpl::validateThis(const USpoofChecker *sc, UErrorCode &status) {
+ auto* This = validate(sc, status);
if (U_FAILURE(status)) {
return NULL;
}
- if (sc == NULL) {
- status = U_ILLEGAL_ARGUMENT_ERROR;
- return NULL;
- }
- SpoofImpl *This = (SpoofImpl *)sc;
- if (This->fMagic != USPOOF_MAGIC) {
- status = U_INVALID_FORMAT_ERROR;
- return NULL;
- }
if (This->fSpoofData != NULL && !This->fSpoofData->validateDataVersion(status)) {
return NULL;
}
@@ -205,7 +193,7 @@ void SpoofImpl::setAllowedLocales(const char *localesList, UErrorCode &status) {
}
// Store the updated spoof checker state.
- tmpSet = static_cast<UnicodeSet *>(allowedChars.clone());
+ tmpSet = allowedChars.clone();
const char *tmpLocalesList = uprv_strdup(localesList);
if (tmpSet == NULL || tmpLocalesList == NULL) {
status = U_MEMORY_ALLOCATION_ERROR;
@@ -454,12 +442,12 @@ UChar32 SpoofImpl::ScanHex(const UChar *s, int32_t start, int32_t limit, UErrorC
//
//-----------------------------------------
-CheckResult::CheckResult() : fMagic(USPOOF_CHECK_MAGIC) {
+CheckResult::CheckResult() {
clear();
}
USpoofCheckResult* CheckResult::asUSpoofCheckResult() {
- return reinterpret_cast<USpoofCheckResult*>(this);
+ return exportForC();
}
//
@@ -467,22 +455,11 @@ USpoofCheckResult* CheckResult::asUSpoofCheckResult() {
// received from the C API.
//
const CheckResult* CheckResult::validateThis(const USpoofCheckResult *ptr, UErrorCode &status) {
- if (U_FAILURE(status)) { return NULL; }
- if (ptr == NULL) {
- status = U_ILLEGAL_ARGUMENT_ERROR;
- return NULL;
- }
- CheckResult *This = (CheckResult*) ptr;
- if (This->fMagic != USPOOF_CHECK_MAGIC) {
- status = U_INVALID_FORMAT_ERROR;
- return NULL;
- }
- return This;
+ return validate(ptr, status);
}
CheckResult* CheckResult::validateThis(USpoofCheckResult *ptr, UErrorCode &status) {
- return const_cast<CheckResult *>
- (CheckResult::validateThis(const_cast<const USpoofCheckResult*>(ptr), status));
+ return validate(ptr, status);
}
void CheckResult::clear() {
@@ -752,9 +729,7 @@ void *SpoofData::reserveSpace(int32_t numBytes, UErrorCode &status) {
return NULL;
}
if (!fDataOwned) {
- U_ASSERT(FALSE);
- status = U_INTERNAL_PROGRAM_ERROR;
- return NULL;
+ UPRV_UNREACHABLE;
}
numBytes = (numBytes + 15) & ~15; // Round up to a multiple of 16
diff --git a/Build/source/libs/icu/icu-src/source/i18n/uspoof_impl.h b/Build/source/libs/icu/icu-src/source/i18n/uspoof_impl.h
index 0eee0e58a8a..b111d4b16a9 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/uspoof_impl.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/uspoof_impl.h
@@ -27,6 +27,8 @@
#ifdef __cplusplus
+#include "capi_helper.h"
+
U_NAMESPACE_BEGIN
// The maximium length (in UTF-16 UChars) of the skeleton replacement string resulting from
@@ -52,7 +54,8 @@ class ConfusableDataUtils;
* Class SpoofImpl corresponds directly to the plain C API opaque type
* USpoofChecker. One can be cast to the other.
*/
-class SpoofImpl : public UObject {
+class SpoofImpl : public UObject,
+ public IcuCApiHelper<USpoofChecker, SpoofImpl, USPOOF_MAGIC> {
public:
SpoofImpl(SpoofData *data, UErrorCode& status);
SpoofImpl(UErrorCode& status);
@@ -96,7 +99,6 @@ public:
// Data Members
//
- int32_t fMagic; // Internal sanity check.
int32_t fChecks; // Bit vector of checks to perform.
SpoofData *fSpoofData;
@@ -112,7 +114,8 @@ public:
* Class CheckResult corresponds directly to the plain C API opaque type
* USpoofCheckResult. One can be cast to the other.
*/
-class CheckResult : public UObject {
+class CheckResult : public UObject,
+ public IcuCApiHelper<USpoofCheckResult, CheckResult, USPOOF_CHECK_MAGIC> {
public:
CheckResult();
virtual ~CheckResult();
@@ -127,7 +130,6 @@ public:
int32_t toCombinedBitmask(int32_t expectedChecks);
// Data Members
- int32_t fMagic; // Internal sanity check.
int32_t fChecks; // Bit vector of checks that were failed.
UnicodeSet fNumerics; // Set of numerics found in the string.
URestrictionLevel fRestrictionLevel; // The restriction level of the string.
diff --git a/Build/source/libs/icu/icu-src/source/i18n/vtzone.cpp b/Build/source/libs/icu/icu-src/source/i18n/vtzone.cpp
index cb84c6260f6..fa8c3390b81 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/vtzone.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/vtzone.cpp
@@ -965,7 +965,7 @@ VTimeZone::VTimeZone(const VTimeZone& source)
tzurl(source.tzurl), lastmod(source.lastmod),
olsonzid(source.olsonzid), icutzver(source.icutzver) {
if (source.tz != NULL) {
- tz = (BasicTimeZone*)source.tz->clone();
+ tz = source.tz->clone();
}
if (source.vtzlines != NULL) {
UErrorCode status = U_ZERO_ERROR;
@@ -1007,7 +1007,7 @@ VTimeZone::operator=(const VTimeZone& right) {
tz = NULL;
}
if (right.tz != NULL) {
- tz = (BasicTimeZone*)right.tz->clone();
+ tz = right.tz->clone();
}
if (vtzlines != NULL) {
delete vtzlines;
@@ -1092,7 +1092,7 @@ VTimeZone::createVTimeZoneFromBasicTimeZone(const BasicTimeZone& basic_time_zone
status = U_MEMORY_ALLOCATION_ERROR;
return NULL;
}
- vtz->tz = (BasicTimeZone *)basic_time_zone.clone();
+ vtz->tz = basic_time_zone.clone();
if (vtz->tz == NULL) {
status = U_MEMORY_ALLOCATION_ERROR;
delete vtz;
@@ -1177,8 +1177,8 @@ VTimeZone::writeSimple(UDate time, UnicodeString& result, UErrorCode& status) co
writeSimple(time, writer, status);
}
-TimeZone*
-VTimeZone::clone(void) const {
+VTimeZone*
+VTimeZone::clone() const {
return new VTimeZone(*this);
}
@@ -1957,7 +1957,7 @@ VTimeZone::writeZone(VTZWriter& w, BasicTimeZone& basictz,
&& (atzrule = dynamic_cast<const AnnualTimeZoneRule *>(tzt.getTo())) != NULL
&& atzrule->getEndYear() == AnnualTimeZoneRule::MAX_YEAR
) {
- finalDstRule = (AnnualTimeZoneRule*)tzt.getTo()->clone();
+ finalDstRule = atzrule->clone();
}
if (dstCount > 0) {
if (year == dstStartYear + dstCount
@@ -2008,7 +2008,7 @@ VTimeZone::writeZone(VTZWriter& w, BasicTimeZone& basictz,
&& (atzrule = dynamic_cast<const AnnualTimeZoneRule *>(tzt.getTo())) != NULL
&& atzrule->getEndYear() == AnnualTimeZoneRule::MAX_YEAR
) {
- finalStdRule = (AnnualTimeZoneRule*)tzt.getTo()->clone();
+ finalStdRule = atzrule->clone();
}
if (stdCount > 0) {
if (year == stdStartYear + stdCount
diff --git a/Build/source/libs/icu/icu-src/source/i18n/windtfmt.cpp b/Build/source/libs/icu/icu-src/source/i18n/windtfmt.cpp
index 6a3779a29e8..bcf272bc612 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/windtfmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/windtfmt.cpp
@@ -213,7 +213,7 @@ Win32DateFormat &Win32DateFormat::operator=(const Win32DateFormat &other)
return *this;
}
-Format *Win32DateFormat::clone(void) const
+Win32DateFormat *Win32DateFormat::clone() const
{
return new Win32DateFormat(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/windtfmt.h b/Build/source/libs/icu/icu-src/source/i18n/windtfmt.h
index 33069058fb2..7fe7f68f450 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/windtfmt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/windtfmt.h
@@ -48,7 +48,7 @@ public:
virtual ~Win32DateFormat();
- virtual Format *clone(void) const;
+ virtual Win32DateFormat *clone() const;
Win32DateFormat &operator=(const Win32DateFormat &other);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/winnmfmt.cpp b/Build/source/libs/icu/icu-src/source/i18n/winnmfmt.cpp
index 5637a0f4a13..72da1be28b8 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/winnmfmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/winnmfmt.cpp
@@ -294,7 +294,7 @@ Win32NumberFormat &Win32NumberFormat::operator=(const Win32NumberFormat &other)
return *this;
}
-Format *Win32NumberFormat::clone(void) const
+Win32NumberFormat *Win32NumberFormat::clone() const
{
return new Win32NumberFormat(*this);
}
diff --git a/Build/source/libs/icu/icu-src/source/i18n/winnmfmt.h b/Build/source/libs/icu/icu-src/source/i18n/winnmfmt.h
index 6139c1ff68a..99571d20138 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/winnmfmt.h
+++ b/Build/source/libs/icu/icu-src/source/i18n/winnmfmt.h
@@ -44,7 +44,7 @@ public:
virtual ~Win32NumberFormat();
- virtual Format *clone(void) const;
+ virtual Win32NumberFormat *clone() const;
Win32NumberFormat &operator=(const Win32NumberFormat &other);
diff --git a/Build/source/libs/icu/icu-src/source/i18n/zonemeta.cpp b/Build/source/libs/icu/icu-src/source/i18n/zonemeta.cpp
index b7139a807b3..72c590f4247 100644
--- a/Build/source/libs/icu/icu-src/source/i18n/zonemeta.cpp
+++ b/Build/source/libs/icu/icu-src/source/i18n/zonemeta.cpp
@@ -30,7 +30,7 @@
#include "olsontz.h"
#include "uinvchar.h"
-static UMutex gZoneMetaLock = U_MUTEX_INITIALIZER;
+static icu::UMutex gZoneMetaLock;
// CLDR Canonical ID mapping table
static UHashtable *gCanonicalIDCache = NULL;
@@ -784,14 +784,13 @@ static void U_CALLCONV initAvailableMetaZoneIDs () {
UResourceBundle *rb = ures_openDirect(NULL, gMetaZones, &status);
UResourceBundle *bundle = ures_getByKey(rb, gMapTimezonesTag, NULL, &status);
- UResourceBundle res;
- ures_initStackObject(&res);
+ StackUResourceBundle res;
while (U_SUCCESS(status) && ures_hasNext(bundle)) {
- ures_getNextResource(bundle, &res, &status);
+ ures_getNextResource(bundle, res.getAlias(), &status);
if (U_FAILURE(status)) {
break;
}
- const char *mzID = ures_getKey(&res);
+ const char *mzID = ures_getKey(res.getAlias());
int32_t len = static_cast<int32_t>(uprv_strlen(mzID));
UChar *uMzID = (UChar*)uprv_malloc(sizeof(UChar) * (len + 1));
if (uMzID == NULL) {
@@ -809,7 +808,6 @@ static void U_CALLCONV initAvailableMetaZoneIDs () {
delete usMzID;
}
}
- ures_close(&res);
ures_close(bundle);
ures_close(rb);
diff --git a/Build/source/libs/icu/icu-src/source/icudefs.mk.in b/Build/source/libs/icu/icu-src/source/icudefs.mk.in
index 06a26031489..f41dac515c9 100644
--- a/Build/source/libs/icu/icu-src/source/icudefs.mk.in
+++ b/Build/source/libs/icu/icu-src/source/icudefs.mk.in
@@ -17,6 +17,9 @@
SHELL = @SHELL@
+# Instruct Python to never write any byte code to the ICU source tree.
+export PYTHONDONTWRITEBYTECODE = 1
+
# Standard directories
prefix = @prefix@
diff --git a/Build/source/libs/icu/icu-src/source/io/io.vcxproj b/Build/source/libs/icu/icu-src/source/io/io.vcxproj
index 7e7b5cd9b8a..3fca55fb0fd 100644
--- a/Build/source/libs/icu/icu-src/source/io/io.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/io/io.vcxproj
@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\allinone\Build.Windows.ProjectConfiguration.props" />
- <!-- The following import will include the library configuration options for VS projects. -->
- <Import Project="..\allinone\Build.Windows.Library.ProjectConfiguration.props" />
<PropertyGroup Label="Globals">
<ProjectGuid>{C2B04507-2521-4801-BF0D-5FD79D6D518C}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\allinone\Build.Windows.ProjectConfiguration.props" />
+ <!-- The following import will include the library configuration options for VS projects. -->
+ <Import Project="..\allinone\Build.Windows.Library.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -35,126 +35,64 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\..\..\lib\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\..\..\lib\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
<!-- Options that are common to *all* project configurations -->
<ItemDefinitionGroup>
+ <Midl>
+ <TypeLibraryName>$(OutDir)\icuio.tlb</TypeLibraryName>
+ </Midl>
<ClCompile>
<AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>U_IO_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<DisableLanguageExtensions>false</DisableLanguageExtensions>
<WarningLevel>Level3</WarningLevel>
+ <CompileAs>Default</CompileAs>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <PrecompiledHeaderOutputFile>$(OutDir)/icuio.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)/icuio.pdb</ProgramDataBaseFileName>
</ClCompile>
<ResourceCompile>
<AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <BaseAddress>0x4ab00000</BaseAddress>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Midl>
- <TypeLibraryName>.\..\..\lib\icuio.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>.\x86\Release/icuio.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
- <CompileAs>Default</CompileAs>
- </ClCompile>
- <Link>
- <OutputFile>..\..\bin\icuio63.dll</OutputFile>
- <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\..\..\lib\icuio.pdb</ProgramDatabaseFile>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
- <ImportLibrary>..\..\lib\icuio.lib</ImportLibrary>
+ <AdditionalLibraryDirectories>..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Midl>
- <TypeLibraryName>.\..\..\lib\icuio.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x86\Debug/icuio.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
<BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
<Link>
- <OutputFile>..\..\bin\icuio63d.dll</OutputFile>
- <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\..\..\lib\icuiod.pdb</ProgramDatabaseFile>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
- <ImportLibrary>..\..\lib\icuiod.lib</ImportLibrary>
+ <OutputFile>..\..\$(IcuBinOutputDir)\icuio65d.dll</OutputFile>
+ <ProgramDatabaseFile>..\..\$(IcuLibOutputDir)\icuiod.pdb</ProgramDatabaseFile>
+ <ImportLibrary>..\..\$(IcuLibOutputDir)\icuiod.lib</ImportLibrary>
+ <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Midl>
- <TypeLibraryName>.\..\..\lib64\icuio.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>.\x64\Release/icuio.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- <CompileAs>Default</CompileAs>
</ClCompile>
<Link>
- <OutputFile>..\..\bin64\icuio63.dll</OutputFile>
+ <OutputFile>..\..\$(IcuBinOutputDir)\icuio65.dll</OutputFile>
+ <ProgramDatabaseFile>..\..\$(IcuLibOutputDir)\icuio.pdb</ProgramDatabaseFile>
+ <ImportLibrary>..\..\$(IcuLibOutputDir)\icuio.lib</ImportLibrary>
<AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\..\..\lib64\icuio.pdb</ProgramDatabaseFile>
- <ImportLibrary>..\..\lib64\icuio.lib</ImportLibrary>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Midl>
- <TypeLibraryName>.\..\..\lib64\icuio.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x64\Debug/icuio.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- </ClCompile>
- <Link>
- <OutputFile>..\..\bin64\icuio63d.dll</OutputFile>
- <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\..\..\lib64\icuiod.pdb</ProgramDatabaseFile>
- <ImportLibrary>..\..\lib64\icuiod.lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/io/locbund.cpp b/Build/source/libs/icu/icu-src/source/io/locbund.cpp
index 8e880b17cf2..46c97bc043e 100644
--- a/Build/source/libs/icu/icu-src/source/io/locbund.cpp
+++ b/Build/source/libs/icu/icu-src/source/io/locbund.cpp
@@ -45,9 +45,9 @@ static UBool U_CALLCONV locbund_cleanup(void) {
}
U_CDECL_END
-static UMutex gLock = U_MUTEX_INITIALIZER;
static inline UNumberFormat * copyInvariantFormatter(ULocaleBundle *result, UNumberFormatStyle style) {
U_NAMESPACE_USE
+ static UMutex gLock;
Mutex lock(&gLock);
if (result->fNumberFormat[style-1] == NULL) {
if (gPosixNumberFormat[style-1] == NULL) {
diff --git a/Build/source/libs/icu/icu-src/source/io/ucln_io.cpp b/Build/source/libs/icu/icu-src/source/io/ucln_io.cpp
index 7a7216b7543..5cd367cfadb 100644
--- a/Build/source/libs/icu/icu-src/source/io/ucln_io.cpp
+++ b/Build/source/libs/icu/icu-src/source/io/ucln_io.cpp
@@ -16,6 +16,7 @@
* created by: George Rhoten
*/
+#include "unicode/utypes.h"
#include "mutex.h"
#include "ucln.h"
#include "ucln_io.h"
diff --git a/Build/source/libs/icu/icu-src/source/io/unicode/ustream.h b/Build/source/libs/icu/icu-src/source/io/unicode/ustream.h
index c10ce6a2de5..927342cb031 100644
--- a/Build/source/libs/icu/icu-src/source/io/unicode/ustream.h
+++ b/Build/source/libs/icu/icu-src/source/io/unicode/ustream.h
@@ -17,6 +17,10 @@
#ifndef USTREAM_H
#define USTREAM_H
+#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
#include "unicode/unistr.h"
#if !UCONFIG_NO_CONVERSION // not available without conversion
@@ -60,4 +64,6 @@ U_NAMESPACE_END
/* No operator for UChar because it can conflict with wchar_t */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/io/uscanf_p.cpp b/Build/source/libs/icu/icu-src/source/io/uscanf_p.cpp
index 4deac3544ec..6dc1c09dee7 100644
--- a/Build/source/libs/icu/icu-src/source/io/uscanf_p.cpp
+++ b/Build/source/libs/icu/icu-src/source/io/uscanf_p.cpp
@@ -323,7 +323,7 @@ u_scanf_skip_leading_ws(UFILE *input,
UBool isNotEOF;
/* skip all leading ws in the input */
- while( (isNotEOF = ufile_getch(input, &c)) && (c == pad || u_isWhitespace(c)) )
+ while( ((isNotEOF = ufile_getch(input, &c)) == TRUE) && (c == pad || u_isWhitespace(c)) )
{
count++;
}
@@ -357,7 +357,7 @@ u_scanf_skip_leading_positive_sign(UFILE *input,
if (U_SUCCESS(localStatus)) {
/* skip all leading ws in the input */
- while( (isNotEOF = ufile_getch(input, &c)) && (count < symbolLen && c == plusSymbol[count]) )
+ while( ((isNotEOF = ufile_getch(input, &c)) == TRUE) && (count < symbolLen && c == plusSymbol[count]) )
{
count++;
}
@@ -855,7 +855,7 @@ u_scanf_string_handler(UFILE *input,
return -1;
while( (info->fWidth == -1 || count < info->fWidth)
- && (isNotEOF = ufile_getch(input, &c))
+ && ((isNotEOF = ufile_getch(input, &c)) == TRUE)
&& (!info->fIsString || (c != info->fPadChar && !u_isWhitespace(c))))
{
@@ -946,7 +946,7 @@ u_scanf_ustring_handler(UFILE *input,
count = 0;
while( (info->fWidth == -1 || count < info->fWidth)
- && (isNotEOF = ufile_getch(input, &c))
+ && ((isNotEOF = ufile_getch(input, &c)) == TRUE)
&& (!info->fIsString || (c != info->fPadChar && !u_isWhitespace(c))))
{
@@ -1249,7 +1249,7 @@ u_scanf_scanset_handler(UFILE *input,
/* grab characters one at a time and make sure they are in the scanset */
while(chLeft > 0) {
- if ((isNotEOF = ufile_getch32(input, &c)) && uset_contains(scanset, c)) {
+ if ( ((isNotEOF = ufile_getch32(input, &c)) == TRUE) && uset_contains(scanset, c) ) {
readCharacter = TRUE;
if (!info->fSkipArg) {
int32_t idx = 0;
diff --git a/Build/source/libs/icu/icu-src/source/layoutex/layoutex.vcxproj b/Build/source/libs/icu/icu-src/source/layoutex/layoutex.vcxproj
index 2bc31e5e272..efa1a33d6f5 100644
--- a/Build/source/libs/icu/icu-src/source/layoutex/layoutex.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/layoutex/layoutex.vcxproj
@@ -1,18 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{37FC2C7F-1904-4811-8955-2F478830EAD1}</ProjectGuid>
<RootNamespace>layoutex</RootNamespace>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -55,9 +54,6 @@
<PreprocessorDefinitions>U_LAYOUTEX_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level3</WarningLevel>
</ClCompile>
- <Link>
- <BaseAddress>0x4ac80000</BaseAddress>
- </Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Midl>
@@ -74,11 +70,10 @@
<CompileAs>Default</CompileAs>
</ClCompile>
<Link>
- <OutputFile>..\..\bin\iculx63.dll</OutputFile>
+ <OutputFile>..\..\bin\iculx65.dll</OutputFile>
<AdditionalDependencies>icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>.\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\..\..\lib\iculx.pdb</ProgramDatabaseFile>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<ImportLibrary>..\..\lib\iculx.lib</ImportLibrary>
@@ -100,12 +95,11 @@
<CompileAs>Default</CompileAs>
</ClCompile>
<Link>
- <OutputFile>..\..\bin\iculx63d.dll</OutputFile>
+ <OutputFile>..\..\bin\iculx65d.dll</OutputFile>
<AdditionalDependencies>icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>.\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\..\..\lib\iculxd.pdb</ProgramDatabaseFile>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<ImportLibrary>..\..\lib\iculxd.lib</ImportLibrary>
@@ -126,7 +120,7 @@
<CompileAs>Default</CompileAs>
</ClCompile>
<Link>
- <OutputFile>..\..\bin64\iculx63.dll</OutputFile>
+ <OutputFile>..\..\bin64\iculx65.dll</OutputFile>
<AdditionalDependencies>icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>.\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\..\..\lib64\iculx.pdb</ProgramDatabaseFile>
@@ -149,7 +143,7 @@
<CompileAs>Default</CompileAs>
</ClCompile>
<Link>
- <OutputFile>..\..\bin64\iculx63d.dll</OutputFile>
+ <OutputFile>..\..\bin64\iculx65d.dll</OutputFile>
<AdditionalDependencies>icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>.\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
diff --git a/Build/source/libs/icu/icu-src/source/python/icutools/__init__.py b/Build/source/libs/icu/icu-src/source/python/icutools/__init__.py
new file mode 100644
index 00000000000..514ea279273
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/python/icutools/__init__.py
@@ -0,0 +1,4 @@
+# Copyright (C) 2018 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+# This is the root ICU namespace for build tools.
diff --git a/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/__init__.py b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/__init__.py
new file mode 100644
index 00000000000..be936166e7e
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/__init__.py
@@ -0,0 +1,16 @@
+# Copyright (C) 2018 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+from collections import namedtuple
+
+LocalFile = namedtuple("LocalFile", ["dirname", "filename"])
+SrcFile = namedtuple("SrcFile", ["filename"])
+InFile = namedtuple("InFile", ["filename"])
+TmpFile = namedtuple("TmpFile", ["filename"])
+OutFile = namedtuple("OutFile", ["filename"])
+PkgFile = namedtuple("PkgFile", ["filename"])
+
+IcuTool = namedtuple("IcuTool", ["name"])
+SystemTool = namedtuple("SystemTool", ["name"])
+
+DepTarget = namedtuple("DepTarget", ["name"])
diff --git a/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/__main__.py b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/__main__.py
new file mode 100644
index 00000000000..5d843d9c081
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/__main__.py
@@ -0,0 +1,347 @@
+# Copyright (C) 2018 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+# Python 2/3 Compatibility (ICU-20299)
+# TODO(ICU-20301): Remove this.
+from __future__ import print_function
+
+import argparse
+import glob as pyglob
+import json
+import os
+import sys
+
+from . import *
+from .comment_stripper import CommentStripper
+from .request_types import CopyRequest
+from .renderers import makefile, common_exec
+from . import filtration, utils
+
+flag_parser = argparse.ArgumentParser(
+ description = """Generates rules for building ICU binary data files from text
+and other input files in source control.
+
+Use the --mode option to declare how to execute those rules, either exporting
+the rules to a Makefile or spawning child processes to run them immediately:
+
+ --mode=gnumake prints a Makefile to standard out.
+ --mode=unix-exec spawns child processes in a Unix-like environment.
+ --mode=windows-exec spawns child processes in a Windows-like environment.
+
+Tips for --mode=unix-exec
+=========================
+
+Create two empty directories for out_dir and tmp_dir. They will get filled
+with a lot of intermediate files.
+
+Set LD_LIBRARY_PATH to include the lib directory. e.g., from icu4c/source:
+
+ $ LD_LIBRARY_PATH=lib PYTHONPATH=python python3 -m icutools.databuilder ...
+
+Once icutools.databuilder finishes, you have compiled the data, but you have
+not packaged it into a .dat or .so file. This is done by the separate pkgdata
+tool in bin. Read the docs of pkgdata:
+
+ $ LD_LIBRARY_PATH=lib ./bin/pkgdata --help
+
+Example command line to call pkgdata:
+
+ $ LD_LIBRARY_PATH=lib ./bin/pkgdata -m common -p icudt63l -c \\
+ -O data/icupkg.inc -s $OUTDIR -d $TMPDIR $TMPDIR/icudata.lst
+
+where $OUTDIR and $TMPDIR are your out and tmp directories, respectively.
+The above command will create icudt63l.dat in the tmpdir.
+
+Command-Line Arguments
+======================
+""",
+ formatter_class = argparse.RawDescriptionHelpFormatter
+)
+
+arg_group_required = flag_parser.add_argument_group("required arguments")
+arg_group_required.add_argument(
+ "--mode",
+ help = "What to do with the generated rules.",
+ choices = ["gnumake", "unix-exec", "windows-exec", "bazel-exec"],
+ required = True
+)
+
+flag_parser.add_argument(
+ "--src_dir",
+ help = "Path to data source folder (icu4c/source/data).",
+ default = "."
+)
+flag_parser.add_argument(
+ "--filter_file",
+ metavar = "PATH",
+ help = "Path to an ICU data filter JSON file.",
+ default = None
+)
+flag_parser.add_argument(
+ "--include_uni_core_data",
+ help = "Include the full Unicode core data in the dat file.",
+ default = False,
+ action = "store_true"
+)
+flag_parser.add_argument(
+ "--seqmode",
+ help = "Whether to optimize rules to be run sequentially (fewer threads) or in parallel (many threads). Defaults to 'sequential', which is better for unix-exec and windows-exec modes. 'parallel' is often better for massively parallel build systems.",
+ choices = ["sequential", "parallel"],
+ default = "sequential"
+)
+flag_parser.add_argument(
+ "--verbose",
+ help = "Print more verbose output (default false).",
+ default = False,
+ action = "store_true"
+)
+
+arg_group_exec = flag_parser.add_argument_group("arguments for unix-exec and windows-exec modes")
+arg_group_exec.add_argument(
+ "--out_dir",
+ help = "Path to where to save output data files.",
+ default = "icudata"
+)
+arg_group_exec.add_argument(
+ "--tmp_dir",
+ help = "Path to where to save temporary files.",
+ default = "icutmp"
+)
+arg_group_exec.add_argument(
+ "--tool_dir",
+ help = "Path to where to find binary tools (genrb, etc).",
+ default = "../bin"
+)
+arg_group_exec.add_argument(
+ "--tool_cfg",
+ help = "The build configuration of the tools. Used in 'windows-exec' mode only.",
+ default = "x86/Debug"
+)
+
+
+class Config(object):
+
+ def __init__(self, args):
+ # Process arguments
+ self.max_parallel = (args.seqmode == "parallel")
+
+ # Boolean: Whether to include core Unicode data files in the .dat file
+ self.include_uni_core_data = args.include_uni_core_data
+
+ # Default fields before processing filter file
+ self.filters_json_data = {}
+ self.filter_dir = "ERROR_NO_FILTER_FILE"
+
+ # Process filter file
+ if args.filter_file:
+ try:
+ with open(args.filter_file, "r") as f:
+ print("Note: Applying filters from %s." % args.filter_file, file=sys.stderr)
+ self._parse_filter_file(f)
+ except IOError:
+ print("Error: Could not read filter file %s." % args.filter_file, file=sys.stderr)
+ exit(1)
+ self.filter_dir = os.path.abspath(os.path.dirname(args.filter_file))
+
+ # Either "unihan" or "implicithan"
+ self.coll_han_type = "unihan"
+ if "collationUCAData" in self.filters_json_data:
+ self.coll_han_type = self.filters_json_data["collationUCAData"]
+
+ # Either "additive" or "subtractive"
+ self.strategy = "subtractive"
+ if "strategy" in self.filters_json_data:
+ self.strategy = self.filters_json_data["strategy"]
+
+ # True or False (could be extended later to support enum/list)
+ self.use_pool_bundle = True
+ if "usePoolBundle" in self.filters_json_data:
+ self.use_pool_bundle = self.filters_json_data["usePoolBundle"]
+
+ def _parse_filter_file(self, f):
+ # Use the Hjson parser if it is available; otherwise, use vanilla JSON.
+ try:
+ import hjson
+ self.filters_json_data = hjson.load(f)
+ except ImportError:
+ self.filters_json_data = json.load(CommentStripper(f))
+
+ # Optionally pre-validate the JSON schema before further processing.
+ # Some schema errors will be caught later, but this step ensures
+ # maximal validity.
+ try:
+ import jsonschema
+ schema_path = os.path.join(os.path.dirname(__file__), "filtration_schema.json")
+ with open(schema_path) as schema_f:
+ schema = json.load(CommentStripper(schema_f))
+ validator = jsonschema.Draft4Validator(schema)
+ for error in validator.iter_errors(self.filters_json_data, schema):
+ print("WARNING: ICU data filter JSON file:", error.message,
+ "at", "".join(
+ "[%d]" % part if isinstance(part, int) else ".%s" % part
+ for part in error.absolute_path
+ ),
+ file=sys.stderr)
+ except ImportError:
+ print("Tip: to validate your filter file, install the Pip package 'jsonschema'", file=sys.stderr)
+ pass
+
+
+def add_copy_input_requests(requests, config, common_vars):
+ files_to_copy = set()
+ for request in requests:
+ request_files = request.all_input_files()
+ # Also add known dependency txt files as possible inputs.
+ # This is required for translit rule files.
+ if hasattr(request, "dep_targets"):
+ request_files += [
+ f for f in request.dep_targets if isinstance(f, InFile)
+ ]
+ for f in request_files:
+ if isinstance(f, InFile):
+ files_to_copy.add(f)
+
+ result = []
+ id = 0
+
+ json_data = config.filters_json_data["fileReplacements"]
+ dirname = json_data["directory"]
+ for directive in json_data["replacements"]:
+ if type(directive) == str:
+ input_file = LocalFile(dirname, directive)
+ output_file = InFile(directive)
+ else:
+ input_file = LocalFile(dirname, directive["src"])
+ output_file = InFile(directive["dest"])
+ result += [
+ CopyRequest(
+ name = "input_copy_%d" % id,
+ input_file = input_file,
+ output_file = output_file
+ )
+ ]
+ files_to_copy.remove(output_file)
+ id += 1
+
+ for f in files_to_copy:
+ result += [
+ CopyRequest(
+ name = "input_copy_%d" % id,
+ input_file = SrcFile(f.filename),
+ output_file = f
+ )
+ ]
+ id += 1
+
+ result += requests
+ return result
+
+
+def main(argv):
+ args = flag_parser.parse_args(argv)
+ config = Config(args)
+
+ if args.mode == "gnumake":
+ makefile_vars = {
+ "SRC_DIR": "$(srcdir)",
+ "IN_DIR": "$(srcdir)",
+ "INDEX_NAME": "res_index"
+ }
+ makefile_env = ["ICUDATA_CHAR", "OUT_DIR", "TMP_DIR"]
+ common = {
+ key: "$(%s)" % key
+ for key in list(makefile_vars.keys()) + makefile_env
+ }
+ common["GLOB_DIR"] = args.src_dir
+ common["FILTERS_DIR"] = config.filter_dir
+ common["CWD_DIR"] = os.getcwd()
+ else:
+ makefile_vars = None
+ common = {
+ # GLOB_DIR is used now, whereas IN_DIR is used during execution phase.
+ # There is no useful distinction in unix-exec or windows-exec mode.
+ "GLOB_DIR": args.src_dir,
+ "SRC_DIR": args.src_dir,
+ "IN_DIR": args.src_dir,
+ "OUT_DIR": args.out_dir,
+ "TMP_DIR": args.tmp_dir,
+ "FILTERS_DIR": config.filter_dir,
+ "CWD_DIR": os.getcwd(),
+ "INDEX_NAME": "res_index",
+ # TODO: Pull this from configure script:
+ "ICUDATA_CHAR": "l"
+ }
+
+ def glob(pattern):
+ result_paths = pyglob.glob("{GLOB_DIR}/{PATTERN}".format(
+ GLOB_DIR = args.src_dir,
+ PATTERN = pattern
+ ))
+ # For the purposes of icutools.databuilder, force Unix-style directory separators.
+ return [v.replace("\\", "/")[len(args.src_dir)+1:] for v in sorted(result_paths)]
+
+ # Automatically load BUILDRULES from the src_dir
+ sys.path.append(args.src_dir)
+ try:
+ import BUILDRULES
+ except ImportError:
+ print("Cannot find BUILDRULES! Did you set your --src_dir?", file=sys.stderr)
+ sys.exit(1)
+
+ requests = BUILDRULES.generate(config, glob, common)
+
+ if "fileReplacements" in config.filters_json_data:
+ tmp_in_dir = "{TMP_DIR}/in".format(**common)
+ if makefile_vars:
+ makefile_vars["IN_DIR"] = tmp_in_dir
+ else:
+ common["IN_DIR"] = tmp_in_dir
+ requests = add_copy_input_requests(requests, config, common)
+
+ requests = filtration.apply_filters(requests, config)
+ requests = utils.flatten_requests(requests, config, common)
+
+ build_dirs = utils.compute_directories(requests)
+
+ if args.mode == "gnumake":
+ print(makefile.get_gnumake_rules(
+ build_dirs,
+ requests,
+ makefile_vars,
+ common_vars = common
+ ))
+ elif args.mode == "windows-exec":
+ return common_exec.run(
+ platform = "windows",
+ build_dirs = build_dirs,
+ requests = requests,
+ common_vars = common,
+ tool_dir = args.tool_dir,
+ tool_cfg = args.tool_cfg,
+ verbose = args.verbose,
+ )
+ elif args.mode == "unix-exec":
+ return common_exec.run(
+ platform = "unix",
+ build_dirs = build_dirs,
+ requests = requests,
+ common_vars = common,
+ tool_dir = args.tool_dir,
+ verbose = args.verbose,
+ )
+ elif args.mode == "bazel-exec":
+ return common_exec.run(
+ platform = "bazel",
+ build_dirs = build_dirs,
+ requests = requests,
+ common_vars = common,
+ tool_dir = args.tool_dir,
+ verbose = args.verbose,
+ )
+ else:
+ print("Mode not supported: %s" % args.mode)
+ return 1
+ return 0
+
+if __name__ == "__main__":
+ exit(main(sys.argv[1:]))
diff --git a/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/comment_stripper.py b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/comment_stripper.py
new file mode 100644
index 00000000000..4001f2f675e
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/comment_stripper.py
@@ -0,0 +1,51 @@
+# Copyright (C) 2018 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+import io
+
+class CommentStripper(object):
+ """Removes lines starting with "//" from a file stream."""
+
+ def __init__(self, f):
+ self.f = f
+ self.state = 0
+
+ def read(self, size=-1):
+ bytes = self.f.read(size)
+ # TODO: Do we need to read more bytes if comments were stripped
+ # in order to obey the size request?
+ return "".join(self._strip_comments(bytes))
+
+ def _strip_comments(self, bytes):
+ for byte in bytes:
+ if self.state == 0:
+ # state 0: start of a line
+ if byte == "/":
+ self.state = 1
+ elif byte == "\n":
+ self.state = 0
+ yield byte
+ else:
+ self.state = 2
+ yield byte
+ elif self.state == 1:
+ # state 1: read a single '/'
+ if byte == "/":
+ self.state = 3
+ elif byte == "\n":
+ self.state = 0
+ yield "/" # the one that was skipped
+ yield "\n"
+ else:
+ self.state = 2
+ yield "/" # the one that was skipped
+ yield byte
+ elif self.state == 2:
+ # state 2: middle of a line, no comment
+ if byte == "\n":
+ self.state = 0
+ yield byte
+ elif self.state == 3:
+ # state 3: inside a comment
+ if byte == "\n":
+ self.state = 0
diff --git a/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/filtration.py b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/filtration.py
new file mode 100644
index 00000000000..0eff5b9c57c
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/filtration.py
@@ -0,0 +1,401 @@
+# Copyright (C) 2018 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+# Python 2/3 Compatibility (ICU-20299)
+# TODO(ICU-20301): Remove this.
+from __future__ import print_function
+
+from abc import abstractmethod
+from collections import defaultdict
+import re
+import sys
+
+from . import *
+from . import utils
+from .locale_dependencies import data as DEPENDENCY_DATA
+from .request_types import *
+
+
+# Note: for this to be a proper abstract class, it should extend abc.ABC.
+# There is no nice way to do this that works in both Python 2 and 3.
+# TODO(ICU-20301): Make this inherit from abc.ABC.
+class Filter(object):
+ @staticmethod
+ def create_from_json(json_data):
+ if "filterType" in json_data:
+ filter_type = json_data["filterType"]
+ else:
+ filter_type = "file-stem"
+
+ if filter_type == "file-stem":
+ return FileStemFilter(json_data)
+ elif filter_type == "language":
+ return LanguageFilter(json_data)
+ elif filter_type == "regex":
+ return RegexFilter(json_data)
+ elif filter_type == "exclude":
+ return ExclusionFilter()
+ elif filter_type == "union":
+ return UnionFilter(json_data)
+ elif filter_type == "locale":
+ return LocaleFilter(json_data)
+ else:
+ print("Error: Unknown filterType option: %s" % filter_type, file=sys.stderr)
+ return None
+
+ def filter(self, request):
+ if not request.apply_file_filter(self):
+ return []
+ for file in request.all_input_files():
+ assert self.match(file)
+ return [request]
+
+ @classmethod
+ def _file_to_file_stem(cls, file):
+ start = file.filename.rfind("/")
+ limit = file.filename.rfind(".")
+ return file.filename[start+1:limit]
+
+ @abstractmethod
+ def match(self, file):
+ pass
+
+
+class InclusionFilter(Filter):
+ def match(self, file):
+ return True
+
+
+class ExclusionFilter(Filter):
+ def match(self, file):
+ return False
+
+
+class WhitelistBlacklistFilter(Filter):
+ def __init__(self, json_data):
+ if "whitelist" in json_data:
+ self.is_whitelist = True
+ self.whitelist = json_data["whitelist"]
+ else:
+ assert "blacklist" in json_data, "Need either whitelist or blacklist: %s" % str(json_data)
+ self.is_whitelist = False
+ self.blacklist = json_data["blacklist"]
+
+ def match(self, file):
+ file_stem = self._file_to_file_stem(file)
+ return self._should_include(file_stem)
+
+ @abstractmethod
+ def _should_include(self, file_stem):
+ pass
+
+
+class FileStemFilter(WhitelistBlacklistFilter):
+ def _should_include(self, file_stem):
+ if self.is_whitelist:
+ return file_stem in self.whitelist
+ else:
+ return file_stem not in self.blacklist
+
+
+class LanguageFilter(WhitelistBlacklistFilter):
+ def _should_include(self, file_stem):
+ language = file_stem.split("_")[0]
+ if language == "root":
+ # Always include root.txt
+ return True
+ if self.is_whitelist:
+ return language in self.whitelist
+ else:
+ return language not in self.blacklist
+
+
+class RegexFilter(WhitelistBlacklistFilter):
+ def __init__(self, *args):
+ # TODO(ICU-20301): Change this to: super().__init__(*args)
+ super(RegexFilter, self).__init__(*args)
+ if self.is_whitelist:
+ self.whitelist = [re.compile(pat) for pat in self.whitelist]
+ else:
+ self.blacklist = [re.compile(pat) for pat in self.blacklist]
+
+ def _should_include(self, file_stem):
+ if self.is_whitelist:
+ for pattern in self.whitelist:
+ if pattern.match(file_stem):
+ return True
+ return False
+ else:
+ for pattern in self.blacklist:
+ if pattern.match(file_stem):
+ return False
+ return True
+
+
+class UnionFilter(Filter):
+ def __init__(self, json_data):
+ # Collect the sub-filters.
+ self.sub_filters = []
+ for filter_json in json_data["unionOf"]:
+ self.sub_filters.append(Filter.create_from_json(filter_json))
+
+ def match(self, file):
+ """Match iff any of the sub-filters match."""
+ for filter in self.sub_filters:
+ if filter.match(file):
+ return True
+ return False
+
+
+LANGUAGE_SCRIPT_REGEX = re.compile(r"^([a-z]{2,3})_[A-Z][a-z]{3}$")
+LANGUAGE_ONLY_REGEX = re.compile(r"^[a-z]{2,3}$")
+
+class LocaleFilter(Filter):
+ def __init__(self, json_data):
+ self.locales_requested = set()
+ self.locales_required = set()
+ self.include_children = json_data.get("includeChildren", True)
+ self.include_scripts = json_data.get("includeScripts", False)
+
+ # Compute the requested and required locales.
+ for locale in json_data["whitelist"]:
+ self._add_locale_and_parents(locale)
+
+ def _add_locale_and_parents(self, locale):
+ # Store the locale as *requested*
+ self.locales_requested.add(locale)
+ # Store the locale and its dependencies as *required*
+ while locale is not None:
+ self.locales_required.add(locale)
+ locale = self._get_parent_locale(locale)
+
+ def match(self, file):
+ locale = self._file_to_file_stem(file)
+
+ # A locale is *required* if it is *requested* or an ancestor of a
+ # *requested* locale.
+ if locale in self.locales_required:
+ return True
+
+ # Resolve include_scripts and include_children.
+ return self._match_recursive(locale)
+
+ def _match_recursive(self, locale):
+ # Base case: return True if we reached a *requested* locale,
+ # or False if we ascend out of the locale tree.
+ if locale is None:
+ return False
+ if locale in self.locales_requested:
+ return True
+
+ # Check for alternative scripts.
+ # This causes sr_Latn to check sr instead of going directly to root.
+ if self.include_scripts:
+ match = LANGUAGE_SCRIPT_REGEX.match(locale)
+ if match and self._match_recursive(match.group(1)):
+ return True
+
+ # Check if we are a descendant of a *requested* locale.
+ if self.include_children:
+ parent = self._get_parent_locale(locale)
+ if self._match_recursive(parent):
+ return True
+
+ # No matches.
+ return False
+
+ @classmethod
+ def _get_parent_locale(cls, locale):
+ if locale in DEPENDENCY_DATA["parents"]:
+ return DEPENDENCY_DATA["parents"][locale]
+ if locale in DEPENDENCY_DATA["aliases"]:
+ return DEPENDENCY_DATA["aliases"][locale]
+ if LANGUAGE_ONLY_REGEX.match(locale):
+ return "root"
+ i = locale.rfind("_")
+ if i < 0:
+ return None
+ return locale[:i]
+
+
+def apply_filters(requests, config):
+ """Runs the filters and returns a new list of requests."""
+ requests = _apply_file_filters(requests, config)
+ requests = _apply_resource_filters(requests, config)
+ return requests
+
+
+def _apply_file_filters(old_requests, config):
+ """Filters out entire files."""
+ filters = _preprocess_file_filters(old_requests, config)
+ new_requests = []
+ for request in old_requests:
+ category = request.category
+ if category in filters:
+ new_requests += filters[category].filter(request)
+ else:
+ new_requests.append(request)
+ return new_requests
+
+
+def _preprocess_file_filters(requests, config):
+ all_categories = set(
+ request.category
+ for request in requests
+ )
+ all_categories.remove(None)
+ all_categories = list(sorted(all_categories))
+ json_data = config.filters_json_data
+ filters = {}
+ default_filter_json = "exclude" if config.strategy == "additive" else "include"
+ for category in all_categories:
+ filter_json = default_filter_json
+ # Figure out the correct filter to create
+ if "featureFilters" in json_data and category in json_data["featureFilters"]:
+ filter_json = json_data["featureFilters"][category]
+ if filter_json == "include" and "localeFilter" in json_data and category.endswith("_tree"):
+ filter_json = json_data["localeFilter"]
+ # Resolve the filter JSON into a filter object
+ if filter_json == "exclude":
+ filters[category] = ExclusionFilter()
+ elif filter_json == "include":
+ pass # no-op
+ else:
+ filters[category] = Filter.create_from_json(filter_json)
+ if "featureFilters" in json_data:
+ for category in json_data["featureFilters"]:
+ if category not in all_categories:
+ print("Warning: category %s is not known" % category, file=sys.stderr)
+ return filters
+
+
+class ResourceFilterInfo(object):
+ def __init__(self, category, strategy):
+ self.category = category
+ self.strategy = strategy
+ self.filter_tmp_dir = "filters/%s" % category
+ self.input_files = None
+ self.filter_files = None
+ self.rules_by_file = None
+
+ def apply_to_requests(self, all_requests):
+ # Call this method only once per list of requests.
+ assert self.input_files is None
+ for request in all_requests:
+ if request.category != self.category:
+ continue
+ if not isinstance(request, AbstractExecutionRequest):
+ continue
+ if request.tool != IcuTool("genrb"):
+ continue
+ if not request.input_files:
+ continue
+ self._set_files(request.input_files)
+ request.dep_targets += [self.filter_files[:]]
+ arg_str = "--filterDir {TMP_DIR}/%s" % self.filter_tmp_dir
+ request.args = "%s %s" % (arg_str, request.args)
+
+ # Make sure we found the target request
+ if self.input_files is None:
+ print("WARNING: Category not found: %s" % self.category, file=sys.stderr)
+ self.input_files = []
+ self.filter_files = []
+ self.rules_by_file = []
+
+ def _set_files(self, files):
+ # Note: The input files to genrb for a certain category should always
+ # be the same. For example, there are often two genrb calls: one for
+ # --writePoolBundle, and the other for --usePoolBundle. They are both
+ # expected to have the same list of input files.
+ if self.input_files is not None:
+ assert self.input_files == files
+ return
+ self.input_files = list(files)
+ self.filter_files = [
+ TmpFile("%s/%s" % (self.filter_tmp_dir, basename))
+ for basename in (
+ file.filename[file.filename.rfind("/")+1:]
+ for file in files
+ )
+ ]
+ if self.strategy == "additive":
+ self.rules_by_file = [
+ [r"-/", r"+/%%ALIAS", r"+/%%Parent"]
+ for _ in range(len(files))
+ ]
+ else:
+ self.rules_by_file = [
+ [r"+/"]
+ for _ in range(len(files))
+ ]
+
+ def add_rules(self, file_filter, rules):
+ for file, rule_list in zip(self.input_files, self.rules_by_file):
+ if file_filter.match(file):
+ rule_list += rules
+
+ def make_requests(self):
+ # Map from rule list to filter files with that rule list
+ unique_rules = defaultdict(list)
+ for filter_file, rules in zip(self.filter_files, self.rules_by_file):
+ unique_rules[tuple(rules)].append(filter_file)
+
+ new_requests = []
+ i = 0
+ for rules, filter_files in unique_rules.items():
+ base_filter_file = filter_files[0]
+ new_requests += [
+ PrintFileRequest(
+ name = "%s_print_%d" % (self.category, i),
+ output_file = base_filter_file,
+ content = self._generate_resource_filter_txt(rules)
+ )
+ ]
+ i += 1
+ for filter_file in filter_files[1:]:
+ new_requests += [
+ CopyRequest(
+ name = "%s_copy_%d" % (self.category, i),
+ input_file = base_filter_file,
+ output_file = filter_file
+ )
+ ]
+ i += 1
+ return new_requests
+
+ @classmethod
+ def _generate_resource_filter_txt(cls, rules):
+ result = "# Caution: This file is automatically generated\n\n"
+ result += "\n".join(rules)
+ return result
+
+
+def _apply_resource_filters(all_requests, config):
+ """Creates filters for looking within resource bundle files."""
+ json_data = config.filters_json_data
+ if "resourceFilters" not in json_data:
+ return all_requests
+
+ collected = {}
+ for entry in json_data["resourceFilters"]:
+ if "files" in entry:
+ file_filter = Filter.create_from_json(entry["files"])
+ else:
+ file_filter = InclusionFilter()
+ for category in entry["categories"]:
+ # not defaultdict because we need to pass arguments to the constructor
+ if category not in collected:
+ filter_info = ResourceFilterInfo(category, config.strategy)
+ filter_info.apply_to_requests(all_requests)
+ collected[category] = filter_info
+ else:
+ filter_info = collected[category]
+ filter_info.add_rules(file_filter, entry["rules"])
+
+ # Add the filter generation requests to the beginning so that by default
+ # they are made before genrb gets run (order is required by windirect)
+ new_requests = []
+ for filter_info in collected.values():
+ new_requests += filter_info.make_requests()
+ new_requests += all_requests
+ return new_requests
diff --git a/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/filtration_schema.json b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/filtration_schema.json
new file mode 100644
index 00000000000..2b7ff998999
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/filtration_schema.json
@@ -0,0 +1,169 @@
+// Copyright (C) 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+{
+ "$id": "http://unicode.org/icu-filter-schema",
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "description": "JSON Schema for an ICU data filter file",
+ "type": "object",
+ "properties": {
+ "strategy": {
+ "type": "string",
+ "enum": ["additive", "subtractive"]
+ },
+ "localeFilter": { "$ref": "#/definitions/filter" },
+ "featureFilters": {
+ "type": "object",
+ "additionalProperties": {
+ "oneOf": [
+ { "$ref": "#/definitions/filter" },
+ {
+ "type": "string",
+ "enum": ["include", "exclude"]
+ }
+ ]
+ }
+ },
+ "resourceFilters": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "categories": {
+ "type": "array",
+ "items": { "type": "string" }
+ },
+ "files": { "$ref": "#/definitions/filter" },
+ "rules": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "pattern": "^[+-]/[\\S]*$"
+ }
+ }
+ },
+ "required": ["categories", "rules"],
+ "additionalProperties": false
+ }
+ },
+ "fileReplacements": {
+ "type": "object",
+ "properties": {
+ "directory": {
+ "type": "string",
+ "pattern": "^(\\$SRC|\\$FILTERS|\\$CWD|/$|/[^/]+)(/[^/]+)*$"
+ },
+ "replacements": {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ { "type": "string" },
+ {
+ "type": "object",
+ "properties": {
+ "src": { "type": "string" },
+ "dest": { "type": "string" }
+ },
+ "additionalProperties": false,
+ "required": ["src", "dest"]
+ }
+ ]
+ }
+ }
+ },
+ "additionalProperties": false,
+ "required": ["directory", "replacements"]
+ },
+ "collationUCAData": {
+ "type": "string",
+ "enum": ["unihan", "implicithan"]
+ },
+ "usePoolBundle": {
+ "type": "boolean"
+ }
+ },
+ "additionalProperties": false,
+ "definitions": {
+ "filter": {
+ "type": "object",
+ "oneOf": [
+ {
+ "properties": {
+ "filterType": {
+ "$ref": "#/definitions/blacklistWhitelistFilterTypes"
+ },
+ "whitelist": { "$ref": "#/definitions/stringList" }
+ },
+ "required": ["whitelist"],
+ "additionalProperties": false
+ },
+ {
+ "properties": {
+ "filterType": {
+ "$ref": "#/definitions/blacklistWhitelistFilterTypes"
+ },
+ "blacklist": { "$ref": "#/definitions/stringList" }
+ },
+ "required": ["blacklist"],
+ "additionalProperties": false
+ },
+ {
+ "properties": {
+ "filterType": {
+ "type": "string",
+ "enum": ["exclude"]
+ }
+ },
+ "required": ["filterType"],
+ "additionalProperties": false
+ },
+ {
+ "properties": {
+ "filterType": {
+ "type": "string",
+ "enum": ["locale"]
+ },
+ "includeChildren": {
+ "type": "boolean"
+ },
+ "includeScripts": {
+ "type": "boolean"
+ },
+ "whitelist": { "$ref": "#/definitions/stringList" }
+ },
+ "required": ["filterType", "whitelist"],
+ "additionalProperties": false
+ },
+ {
+ "properties": {
+ "filterType": {
+ "type": "string",
+ "enum": ["union"]
+ },
+ "unionOf": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/filter" }
+ }
+ },
+ "required": ["filterType", "unionOf"],
+ "additionalProperties": false
+ }
+ ]
+ },
+ "blacklistWhitelistFilterTypes": {
+ "type": "string",
+ "enum": [
+ "language",
+ "regex"
+ ]
+ },
+ "stringList": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1,
+ "uniqueItems": true
+ }
+ }
+}
diff --git a/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/locale_dependencies.py b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/locale_dependencies.py
new file mode 100644
index 00000000000..1f8670d6bea
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/locale_dependencies.py
@@ -0,0 +1,224 @@
+# -*- coding: utf-8 -*-
+# © 2019 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html#License
+
+data = {
+ "cldrVersion": "36",
+ "aliases": {
+ "ars": "ar_SA",
+ "az_AZ": "az_Latn_AZ",
+ "bs_BA": "bs_Latn_BA",
+ "en_NH": "en_VU",
+ "en_RH": "en_ZW",
+ "ff_CM": "ff_Latn_CM",
+ "ff_GN": "ff_Latn_GN",
+ "ff_MR": "ff_Latn_MR",
+ "ff_SN": "ff_Latn_SN",
+ "in": "id",
+ "in_ID": "id_ID",
+ "iw": "he",
+ "iw_IL": "he_IL",
+ "mo": "ro",
+ "no_NO": "nb_NO",
+ "no_NO_NY": "nn_NO",
+ "no": "nb",
+ "pa_IN": "pa_Guru_IN",
+ "pa_PK": "pa_Arab_PK",
+ "sh": "sr_Latn",
+ "sh_BA": "sr_Latn_BA",
+ "sh_CS": "sr_Latn_RS",
+ "sh_YU": "sr_Latn_RS",
+ "shi_MA": "shi_Tfng_MA",
+ "sr_BA": "sr_Cyrl_BA",
+ "sr_CS": "sr_Cyrl_RS",
+ "sr_ME": "sr_Latn_ME",
+ "sr_RS": "sr_Cyrl_RS",
+ "sr_XK": "sr_Cyrl_XK",
+ "sr_YU": "sr_Cyrl_RS",
+ "sr_Cyrl_YU": "sr_Cyrl_RS",
+ "sr_Cyrl_CS": "sr_Cyrl_RS",
+ "sr_Latn_YU": "sr_Latn_RS",
+ "sr_Latn_CS": "sr_Latn_RS",
+ "tl": "fil",
+ "tl_PH": "fil_PH",
+ "uz_AF": "uz_Arab_AF",
+ "uz_UZ": "uz_Latn_UZ",
+ "vai_LR": "vai_Vaii_LR",
+ "yue_CN": "yue_Hans_CN",
+ "yue_HK": "yue_Hant_HK",
+ "zh_CN": "zh_Hans_CN",
+ "zh_HK": "zh_Hant_HK",
+ "zh_MO": "zh_Hant_MO",
+ "zh_SG": "zh_Hans_SG",
+ "zh_TW": "zh_Hant_TW"
+ },
+ "parents": {
+ "ff_Adlm": "root",
+ "en_CM": "en_001",
+ "so_Arab": "root",
+ "en_KY": "en_001",
+ "en_TC": "en_001",
+ "yue_Hans": "root",
+ "en_CX": "en_001",
+ "es_EC": "es_419",
+ "es_US": "es_419",
+ "byn_Latn": "root",
+ "en_CY": "en_001",
+ "en_LC": "en_001",
+ "en_TK": "en_001",
+ "tg_Arab": "root",
+ "es_UY": "es_419",
+ "ky_Latn": "root",
+ "en_TO": "en_001",
+ "en_TT": "en_001",
+ "en_DE": "en_150",
+ "es_MX": "es_419",
+ "en_TV": "en_001",
+ "en_DG": "en_001",
+ "pt_ST": "pt_PT",
+ "en_DM": "en_001",
+ "en_LR": "en_001",
+ "en_TZ": "en_001",
+ "en_LS": "en_001",
+ "en_DK": "en_150",
+ "blt_Latn": "root",
+ "es_VE": "es_419",
+ "es_NI": "es_419",
+ "sd_Khoj": "root",
+ "pt_AO": "pt_PT",
+ "en_UG": "en_001",
+ "yo_Arab": "root",
+ "dje_Arab": "root",
+ "en_MG": "en_001",
+ "en_MO": "en_001",
+ "en_MU": "en_001",
+ "en_MS": "en_001",
+ "en_MT": "en_001",
+ "shi_Latn": "root",
+ "es_BR": "es_419",
+ "en_AU": "en_001",
+ "en_ZM": "en_001",
+ "en_AT": "en_150",
+ "es_BZ": "es_419",
+ "uz_Arab": "root",
+ "az_Cyrl": "root",
+ "es_SV": "es_419",
+ "en_ZW": "en_001",
+ "en_JE": "en_001",
+ "en_BB": "en_001",
+ "sd_Deva": "root",
+ "pa_Arab": "root",
+ "en_RW": "en_001",
+ "es_CO": "es_419",
+ "en_JM": "en_001",
+ "en_BE": "en_150",
+ "dyo_Arab": "root",
+ "es_CL": "es_419",
+ "en_BM": "en_001",
+ "en_SC": "en_001",
+ "es_CR": "es_419",
+ "en_150": "en_001",
+ "en_BS": "en_001",
+ "en_SD": "en_001",
+ "pt_GQ": "pt_PT",
+ "en_SB": "en_001",
+ "es_CU": "es_419",
+ "en_SG": "en_001",
+ "uz_Cyrl": "root",
+ "en_BW": "en_001",
+ "en_SH": "en_001",
+ "en_SE": "en_150",
+ "pt_GW": "pt_PT",
+ "ky_Arab": "root",
+ "en_BZ": "en_001",
+ "en_SL": "en_001",
+ "en_SI": "en_150",
+ "ff_Arab": "root",
+ "en_KE": "en_001",
+ "bm_Nkoo": "root",
+ "en_CC": "en_001",
+ "en_SS": "en_001",
+ "iu_Latn": "root",
+ "en_CA": "en_001",
+ "en_KI": "en_001",
+ "es_DO": "es_419",
+ "en_SX": "en_001",
+ "en_CH": "en_150",
+ "en_KN": "en_001",
+ "en_CK": "en_001",
+ "ml_Arab": "root",
+ "en_SZ": "en_001",
+ "pt_FR": "pt_PT",
+ "ug_Cyrl": "root",
+ "en_GY": "en_001",
+ "en_PH": "en_001",
+ "en_PG": "en_001",
+ "en_PK": "en_001",
+ "cu_Glag": "root",
+ "en_PN": "en_001",
+ "kk_Arab": "root",
+ "en_HK": "en_001",
+ "zh_Hant": "root",
+ "en_PW": "en_001",
+ "es_AR": "es_419",
+ "pt_MZ": "pt_PT",
+ "sd_Sind": "root",
+ "en_Shaw": "root",
+ "en_IE": "en_001",
+ "ms_Arab": "root",
+ "en_IM": "en_001",
+ "en_IN": "en_001",
+ "es_BO": "es_419",
+ "en_IL": "en_001",
+ "en_AI": "en_001",
+ "az_Arab": "root",
+ "en_AG": "en_001",
+ "en_IO": "en_001",
+ "en_ZA": "en_001",
+ "en_MY": "en_001",
+ "en_ER": "en_001",
+ "en_VC": "en_001",
+ "mn_Mong": "root",
+ "vai_Latn": "root",
+ "en_MW": "en_001",
+ "pt_LU": "pt_PT",
+ "bs_Cyrl": "root",
+ "en_VG": "en_001",
+ "en_NA": "en_001",
+ "en_NF": "en_001",
+ "en_NG": "en_001",
+ "ha_Arab": "root",
+ "en_NL": "en_150",
+ "zh_Hant_MO": "zh_Hant_HK",
+ "en_VU": "en_001",
+ "en_FJ": "en_001",
+ "en_NR": "en_001",
+ "en_FK": "en_001",
+ "es_GT": "es_419",
+ "en_FI": "en_150",
+ "ku_Arab": "root",
+ "pt_MO": "pt_PT",
+ "en_FM": "en_001",
+ "en_NU": "en_001",
+ "en_NZ": "en_001",
+ "pt_CH": "pt_PT",
+ "en_Dsrt": "root",
+ "es_PE": "es_419",
+ "es_PA": "es_419",
+ "pt_CV": "pt_PT",
+ "wo_Arab": "root",
+ "en_WS": "en_001",
+ "en_GD": "en_001",
+ "en_GB": "en_001",
+ "es_HN": "es_419",
+ "pt_TL": "pt_PT",
+ "en_GG": "en_001",
+ "en_GH": "en_001",
+ "es_PR": "es_419",
+ "sw_Arab": "root",
+ "en_GI": "en_001",
+ "sr_Latn": "root",
+ "en_GM": "en_001",
+ "es_PY": "es_419"
+ }
+}
diff --git a/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/renderers/__init__.py b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/renderers/__init__.py
new file mode 100644
index 00000000000..7c402c2b78b
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/renderers/__init__.py
@@ -0,0 +1,10 @@
+# Copyright (C) 2018 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+from collections import namedtuple
+
+MakeRule = namedtuple("MakeRule", ["name", "dep_literals", "dep_files", "output_file", "cmds"])
+
+MakeFilesVar = namedtuple("MakeFilesVar", ["name", "files"])
+
+MakeStringVar = namedtuple("MakeStringVar", ["name", "content"])
diff --git a/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/renderers/common_exec.py b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/renderers/common_exec.py
new file mode 100644
index 00000000000..838b121afe5
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/renderers/common_exec.py
@@ -0,0 +1,146 @@
+# Copyright (C) 2018 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+from . import *
+from .. import *
+from .. import utils
+from ..request_types import *
+
+import os
+import shutil
+import subprocess
+import sys
+
+def run(build_dirs, requests, common_vars, verbose=True, **kwargs):
+ for bd in build_dirs:
+ makedirs(bd.format(**common_vars))
+ for request in requests:
+ status = run_helper(request, common_vars, verbose=verbose, **kwargs)
+ if status != 0:
+ print("!!! ERROR executing above command line: exit code %d" % status)
+ return 1
+ if verbose:
+ print("All data build commands executed")
+ return 0
+
+def makedirs(dirs):
+ """makedirs compatible between Python 2 and 3"""
+ try:
+ # Python 3 version
+ os.makedirs(dirs, exist_ok=True)
+ except TypeError as e:
+ # Python 2 version
+ try:
+ os.makedirs(dirs)
+ except OSError as e:
+ if e.errno != errno.EEXIST:
+ raise e
+
+def run_helper(request, common_vars, platform, tool_dir, verbose, tool_cfg=None, **kwargs):
+ if isinstance(request, PrintFileRequest):
+ output_path = "{DIRNAME}/{FILENAME}".format(
+ DIRNAME = utils.dir_for(request.output_file).format(**common_vars),
+ FILENAME = request.output_file.filename,
+ )
+ if verbose:
+ print("Printing to file: %s" % output_path)
+ with open(output_path, "w") as f:
+ f.write(request.content)
+ return 0
+ if isinstance(request, CopyRequest):
+ input_path = "{DIRNAME}/{FILENAME}".format(
+ DIRNAME = utils.dir_for(request.input_file).format(**common_vars),
+ FILENAME = request.input_file.filename,
+ )
+ output_path = "{DIRNAME}/{FILENAME}".format(
+ DIRNAME = utils.dir_for(request.output_file).format(**common_vars),
+ FILENAME = request.output_file.filename,
+ )
+ if verbose:
+ print("Copying file to: %s" % output_path)
+ shutil.copyfile(input_path, output_path)
+ return 0
+ if isinstance(request, VariableRequest):
+ # No-op
+ return 0
+
+ assert isinstance(request.tool, IcuTool)
+ if platform == "windows":
+ cmd_template = "{TOOL_DIR}/{TOOL}/{TOOL_CFG}/{TOOL}.exe {{ARGS}}".format(
+ TOOL_DIR = tool_dir,
+ TOOL_CFG = tool_cfg,
+ TOOL = request.tool.name,
+ **common_vars
+ )
+ elif platform == "unix":
+ cmd_template = "{TOOL_DIR}/{TOOL} {{ARGS}}".format(
+ TOOL_DIR = tool_dir,
+ TOOL = request.tool.name,
+ **common_vars
+ )
+ elif platform == "bazel":
+ cmd_template = "{TOOL_DIR}/{TOOL}/{TOOL} {{ARGS}}".format(
+ TOOL_DIR = tool_dir,
+ TOOL = request.tool.name,
+ **common_vars
+ )
+ else:
+ raise ValueError("Unknown platform: %s" % platform)
+
+ if isinstance(request, RepeatedExecutionRequest):
+ for loop_vars in utils.repeated_execution_request_looper(request):
+ command_line = utils.format_repeated_request_command(
+ request,
+ cmd_template,
+ loop_vars,
+ common_vars
+ )
+ if platform == "windows":
+ # Note: this / to \ substitution may be too aggressive?
+ command_line = command_line.replace("/", "\\")
+ returncode = run_shell_command(command_line, platform, verbose)
+ if returncode != 0:
+ return returncode
+ return 0
+ if isinstance(request, SingleExecutionRequest):
+ command_line = utils.format_single_request_command(
+ request,
+ cmd_template,
+ common_vars
+ )
+ if platform == "windows":
+ # Note: this / to \ substitution may be too aggressive?
+ command_line = command_line.replace("/", "\\")
+ returncode = run_shell_command(command_line, platform, verbose)
+ return returncode
+ assert False
+
+def run_shell_command(command_line, platform, verbose):
+ changed_windows_comspec = False
+ # If the command line length on Windows exceeds the absolute maximum that CMD supports (8191), then
+ # we temporarily switch over to use PowerShell for the command, and then switch back to CMD.
+ # We don't want to use PowerShell for everything though, as it tends to be slower.
+ if (platform == "windows") and (len(command_line) > 8190):
+ if verbose:
+ print("Command length exceeds the max length for CMD on Windows, using PowerShell instead.")
+ previous_comspec = os.environ["COMSPEC"]
+ os.environ["COMSPEC"] = 'powershell'
+ changed_windows_comspec = True
+ if verbose:
+ print("Running: %s" % command_line)
+ returncode = subprocess.call(
+ command_line,
+ shell = True
+ )
+ else:
+ # Pipe output to /dev/null in quiet mode
+ with open(os.devnull, "w") as devnull:
+ returncode = subprocess.call(
+ command_line,
+ shell = True,
+ stdout = devnull,
+ stderr = devnull
+ )
+ if changed_windows_comspec:
+ os.environ["COMSPEC"] = previous_comspec
+ return returncode
diff --git a/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/renderers/makefile.py b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/renderers/makefile.py
new file mode 100644
index 00000000000..9b2005b07d9
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/renderers/makefile.py
@@ -0,0 +1,245 @@
+# Copyright (C) 2018 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+# Python 2/3 Compatibility (ICU-20299)
+# TODO(ICU-20301): Remove this.
+from __future__ import print_function
+
+from . import *
+from .. import *
+from .. import utils
+from ..request_types import *
+
+def get_gnumake_rules(build_dirs, requests, makefile_vars, **kwargs):
+ makefile_string = ""
+
+ # Common Variables
+ common_vars = kwargs["common_vars"]
+ for key, value in sorted(makefile_vars.items()):
+ makefile_string += "{KEY} = {VALUE}\n".format(
+ KEY = key,
+ VALUE = value
+ )
+ makefile_string += "\n"
+
+ # Directories
+ dirs_timestamp_file = "{TMP_DIR}/dirs.timestamp".format(**common_vars)
+ makefile_string += "DIRS = {TIMESTAMP_FILE}\n\n".format(
+ TIMESTAMP_FILE = dirs_timestamp_file
+ )
+ makefile_string += "{TIMESTAMP_FILE}:\n\t$(MKINSTALLDIRS) {ALL_DIRS}\n\techo timestamp > {TIMESTAMP_FILE}\n\n".format(
+ TIMESTAMP_FILE = dirs_timestamp_file,
+ ALL_DIRS = " ".join(build_dirs).format(**common_vars)
+ )
+
+ # Generate Rules
+ make_rules = []
+ for request in requests:
+ make_rules += get_gnumake_rules_helper(request, **kwargs)
+
+ # Main Commands
+ for rule in make_rules:
+ if isinstance(rule, MakeFilesVar):
+ makefile_string += "{NAME} = {FILE_LIST}\n\n".format(
+ NAME = rule.name,
+ FILE_LIST = files_to_makefile(rule.files, wrap = True, **kwargs),
+ )
+ continue
+
+ if isinstance(rule, MakeStringVar):
+ makefile_string += "define {NAME}\n{CONTENT}\nendef\nexport {NAME}\n\n".format(
+ NAME = rule.name,
+ CONTENT = rule.content
+ )
+ continue
+
+ assert isinstance(rule, MakeRule)
+ header_line = "{OUT_FILE}: {DEP_FILES} {DEP_LITERALS} | $(DIRS)".format(
+ OUT_FILE = files_to_makefile([rule.output_file], **kwargs),
+ DEP_FILES = files_to_makefile(rule.dep_files, wrap = True, **kwargs),
+ DEP_LITERALS = " ".join(rule.dep_literals)
+ )
+
+ if len(rule.cmds) == 0:
+ makefile_string += "%s\n\n" % header_line
+ continue
+
+ makefile_string += "{HEADER_LINE}\n{RULE_LINES}\n\n".format(
+ HEADER_LINE = header_line,
+ RULE_LINES = "\n".join("\t%s" % cmd for cmd in rule.cmds)
+ )
+
+ return makefile_string
+
+def files_to_makefile(files, common_vars, wrap = False, **kwargs):
+ if len(files) == 0:
+ return ""
+ dirnames = [utils.dir_for(file).format(**common_vars) for file in files]
+ join_str = " \\\n\t\t" if wrap and len(files) > 2 else " "
+ if len(files) == 1:
+ return "%s/%s" % (dirnames[0], files[0].filename)
+ elif len(set(dirnames)) == 1:
+ return "$(addprefix %s/,%s)" % (dirnames[0], join_str.join(file.filename for file in files))
+ else:
+ return join_str.join("%s/%s" % (d, f.filename) for d,f in zip(dirnames, files))
+
+def get_gnumake_rules_helper(request, common_vars, **kwargs):
+
+ if isinstance(request, PrintFileRequest):
+ var_name = "%s_CONTENT" % request.name.upper()
+ return [
+ MakeStringVar(
+ name = var_name,
+ content = request.content
+ ),
+ MakeRule(
+ name = request.name,
+ dep_literals = [],
+ dep_files = [],
+ output_file = request.output_file,
+ cmds = [
+ "echo \"$${VAR_NAME}\" > {MAKEFILENAME}".format(
+ VAR_NAME = var_name,
+ MAKEFILENAME = files_to_makefile([request.output_file], common_vars),
+ **common_vars
+ )
+ ]
+ )
+ ]
+
+
+ if isinstance(request, CopyRequest):
+ return [
+ MakeRule(
+ name = request.name,
+ dep_literals = [],
+ dep_files = [request.input_file],
+ output_file = request.output_file,
+ cmds = ["cp %s %s" % (
+ files_to_makefile([request.input_file], common_vars),
+ files_to_makefile([request.output_file], common_vars))
+ ]
+ )
+ ]
+
+ if isinstance(request, VariableRequest):
+ return [
+ MakeFilesVar(
+ name = request.name.upper(),
+ files = request.input_files
+ )
+ ]
+
+ if request.tool.name == "make":
+ cmd_template = "$(MAKE) {ARGS}"
+ elif request.tool.name == "gentest":
+ cmd_template = "$(INVOKE) $(GENTEST) {ARGS}"
+ else:
+ assert isinstance(request.tool, IcuTool)
+ cmd_template = "$(INVOKE) $(TOOLBINDIR)/{TOOL} {{ARGS}}".format(
+ TOOL = request.tool.name
+ )
+
+ if isinstance(request, SingleExecutionRequest):
+ cmd = utils.format_single_request_command(request, cmd_template, common_vars)
+ dep_files = request.all_input_files()
+
+ if len(request.output_files) > 1:
+ # Special case for multiple output files: Makefile rules should have only one
+ # output file apiece. More information:
+ # https://www.gnu.org/software/automake/manual/html_node/Multiple-Outputs.html
+ timestamp_var_name = "%s_ALL" % request.name.upper()
+ timestamp_file = TmpFile("%s.timestamp" % request.name)
+ rules = [
+ MakeFilesVar(
+ name = timestamp_var_name,
+ files = [timestamp_file]
+ ),
+ MakeRule(
+ name = "%s_all" % request.name,
+ dep_literals = [],
+ dep_files = dep_files,
+ output_file = timestamp_file,
+ cmds = [
+ cmd,
+ "echo timestamp > {MAKEFILENAME}".format(
+ MAKEFILENAME = files_to_makefile([timestamp_file], common_vars)
+ )
+ ]
+ )
+ ]
+ for i, file in enumerate(request.output_files):
+ rules += [
+ MakeRule(
+ name = "%s_%d" % (request.name, i),
+ dep_literals = ["$(%s)" % timestamp_var_name],
+ dep_files = [],
+ output_file = file,
+ cmds = []
+ )
+ ]
+ return rules
+
+ elif len(dep_files) > 5:
+ # For nicer printing, for long input lists, use a helper variable.
+ dep_var_name = "%s_DEPS" % request.name.upper()
+ return [
+ MakeFilesVar(
+ name = dep_var_name,
+ files = dep_files
+ ),
+ MakeRule(
+ name = request.name,
+ dep_literals = ["$(%s)" % dep_var_name],
+ dep_files = [],
+ output_file = request.output_files[0],
+ cmds = [cmd]
+ )
+ ]
+
+ else:
+ return [
+ MakeRule(
+ name = request.name,
+ dep_literals = [],
+ dep_files = dep_files,
+ output_file = request.output_files[0],
+ cmds = [cmd]
+ )
+ ]
+
+ if isinstance(request, RepeatedExecutionRequest):
+ rules = []
+ dep_literals = []
+ # To keep from repeating the same dep files many times, make a variable.
+ if len(request.common_dep_files) > 0:
+ dep_var_name = "%s_DEPS" % request.name.upper()
+ dep_literals = ["$(%s)" % dep_var_name]
+ rules += [
+ MakeFilesVar(
+ name = dep_var_name,
+ files = request.common_dep_files
+ )
+ ]
+ # Add a rule for each individual file.
+ for loop_vars in utils.repeated_execution_request_looper(request):
+ (_, specific_dep_files, input_file, output_file) = loop_vars
+ name_suffix = input_file[input_file.filename.rfind("/")+1:input_file.filename.rfind(".")]
+ cmd = utils.format_repeated_request_command(
+ request,
+ cmd_template,
+ loop_vars,
+ common_vars
+ )
+ rules += [
+ MakeRule(
+ name = "%s_%s" % (request.name, name_suffix),
+ dep_literals = dep_literals,
+ dep_files = specific_dep_files + [input_file],
+ output_file = output_file,
+ cmds = [cmd]
+ )
+ ]
+ return rules
+
+ assert False
diff --git a/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/request_types.py b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/request_types.py
new file mode 100644
index 00000000000..aa70f8d9185
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/request_types.py
@@ -0,0 +1,364 @@
+# Copyright (C) 2018 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+# Python 2/3 Compatibility (ICU-20299)
+# TODO(ICU-20301): Remove this.
+from __future__ import print_function
+
+from abc import abstractmethod
+import copy
+import sys
+
+from . import *
+from . import utils
+
+
+# TODO(ICU-20301): Remove arguments from all instances of super() in this file
+
+# Note: for this to be a proper abstract class, it should extend abc.ABC.
+# There is no nice way to do this that works in both Python 2 and 3.
+# TODO(ICU-20301): Make this inherit from abc.ABC.
+class AbstractRequest(object):
+ def __init__(self, **kwargs):
+
+ # Used for identification purposes
+ self.name = None
+
+ # The filter category that applies to this request
+ self.category = None
+
+ self._set_fields(kwargs)
+
+ def _set_fields(self, kwargs):
+ for key, value in list(kwargs.items()):
+ if hasattr(self, key):
+ if isinstance(value, list):
+ value = copy.copy(value)
+ elif isinstance(value, dict):
+ value = copy.deepcopy(value)
+ setattr(self, key, value)
+ else:
+ raise ValueError("Unknown argument: %s" % key)
+
+ def apply_file_filter(self, filter):
+ """
+ Returns True if this request still has input files after filtering,
+ or False if the request is "empty" after filtering.
+ """
+ return True
+
+ def flatten(self, config, all_requests, common_vars):
+ return [self]
+
+ def all_input_files(self):
+ return []
+
+ def all_output_files(self):
+ return []
+
+
+class AbstractExecutionRequest(AbstractRequest):
+ def __init__(self, **kwargs):
+
+ # Names of targets (requests) or files that this request depends on.
+ # The entries of dep_targets may be any of the following types:
+ #
+ # 1. DepTarget, for the output of an execution request.
+ # 2. InFile, TmpFile, etc., for a specific file.
+ # 3. A list of InFile, TmpFile, etc., where the list is the same
+ # length as self.input_files and self.output_files.
+ #
+ # In cases 1 and 2, the dependency is added to all rules that the
+ # request generates. In case 3, the dependency is added only to the
+ # rule that generates the output file at the same array index.
+ self.dep_targets = []
+
+ # Computed during self.flatten(); don't edit directly.
+ self.common_dep_files = []
+
+ # Primary input files
+ self.input_files = []
+
+ # Output files; for some subclasses, this must be the same length
+ # as input_files
+ self.output_files = []
+
+ # What tool to execute
+ self.tool = None
+
+ # Argument string to pass to the tool with optional placeholders
+ self.args = ""
+
+ # Placeholders to substitute into the argument string; if any of these
+ # have a list type, the list must be equal in length to input_files
+ self.format_with = {}
+
+ super(AbstractExecutionRequest, self).__init__(**kwargs)
+
+ def apply_file_filter(self, filter):
+ i = 0
+ while i < len(self.input_files):
+ if filter.match(self.input_files[i]):
+ i += 1
+ else:
+ self._del_at(i)
+ return i > 0
+
+ def _del_at(self, i):
+ del self.input_files[i]
+ for _, v in self.format_with.items():
+ if isinstance(v, list):
+ assert len(v) == len(self.input_files) + 1
+ del v[i]
+ for v in self.dep_targets:
+ if isinstance(v, list):
+ assert len(v) == len(self.input_files) + 1
+ del v[i]
+
+ def flatten(self, config, all_requests, common_vars):
+ self._dep_targets_to_files(all_requests)
+ return super(AbstractExecutionRequest, self).flatten(config, all_requests, common_vars)
+
+ def _dep_targets_to_files(self, all_requests):
+ if not self.dep_targets:
+ return
+ for dep_target in self.dep_targets:
+ if isinstance(dep_target, list):
+ if hasattr(self, "specific_dep_files"):
+ assert len(dep_target) == len(self.specific_dep_files)
+ for file, out_list in zip(dep_target, self.specific_dep_files):
+ assert hasattr(file, "filename")
+ out_list.append(file)
+ else:
+ self.common_dep_files += dep_target
+ continue
+ if not isinstance(dep_target, DepTarget):
+ # Copy file entries directly to dep_files.
+ assert hasattr(dep_target, "filename")
+ self.common_dep_files.append(dep_target)
+ continue
+ # For DepTarget entries, search for the target.
+ for request in all_requests:
+ if request.name == dep_target.name:
+ self.common_dep_files += request.all_output_files()
+ break
+ else:
+ print("Warning: Unable to find target %s, a dependency of %s" % (
+ dep_target.name,
+ self.name
+ ), file=sys.stderr)
+ self.dep_targets = []
+
+ def all_input_files(self):
+ return self.common_dep_files + self.input_files
+
+ def all_output_files(self):
+ return self.output_files
+
+
+class SingleExecutionRequest(AbstractExecutionRequest):
+ def __init__(self, **kwargs):
+ super(SingleExecutionRequest, self).__init__(**kwargs)
+
+
+class RepeatedExecutionRequest(AbstractExecutionRequest):
+ def __init__(self, **kwargs):
+
+ # Placeholders to substitute into the argument string unique to each
+ # iteration; all values must be lists equal in length to input_files
+ self.repeat_with = {}
+
+ # Lists for dep files that are specific to individual resource bundle files
+ self.specific_dep_files = [[] for _ in range(len(kwargs["input_files"]))]
+
+ super(RepeatedExecutionRequest, self).__init__(**kwargs)
+
+ def _del_at(self, i):
+ super(RepeatedExecutionRequest, self)._del_at(i)
+ del self.output_files[i]
+ del self.specific_dep_files[i]
+ for _, v in self.repeat_with.items():
+ if isinstance(v, list):
+ del v[i]
+
+ def all_input_files(self):
+ files = super(RepeatedExecutionRequest, self).all_input_files()
+ for specific_file_list in self.specific_dep_files:
+ files += specific_file_list
+ return files
+
+
+class RepeatedOrSingleExecutionRequest(AbstractExecutionRequest):
+ def __init__(self, **kwargs):
+ self.repeat_with = {}
+ super(RepeatedOrSingleExecutionRequest, self).__init__(**kwargs)
+
+ def flatten(self, config, all_requests, common_vars):
+ if config.max_parallel:
+ new_request = RepeatedExecutionRequest(
+ name = self.name,
+ category = self.category,
+ dep_targets = self.dep_targets,
+ input_files = self.input_files,
+ output_files = self.output_files,
+ tool = self.tool,
+ args = self.args,
+ format_with = self.format_with,
+ repeat_with = self.repeat_with
+ )
+ else:
+ new_request = SingleExecutionRequest(
+ name = self.name,
+ category = self.category,
+ dep_targets = self.dep_targets,
+ input_files = self.input_files,
+ output_files = self.output_files,
+ tool = self.tool,
+ args = self.args,
+ format_with = utils.concat_dicts(self.format_with, self.repeat_with)
+ )
+ return new_request.flatten(config, all_requests, common_vars)
+
+ def _del_at(self, i):
+ super(RepeatedOrSingleExecutionRequest, self)._del_at(i)
+ del self.output_files[i]
+ for _, v in self.repeat_with.items():
+ if isinstance(v, list):
+ del v[i]
+
+
+class PrintFileRequest(AbstractRequest):
+ def __init__(self, **kwargs):
+ self.output_file = None
+ self.content = None
+ super(PrintFileRequest, self).__init__(**kwargs)
+
+ def all_output_files(self):
+ return [self.output_file]
+
+
+class CopyRequest(AbstractRequest):
+ def __init__(self, **kwargs):
+ self.input_file = None
+ self.output_file = None
+ super(CopyRequest, self).__init__(**kwargs)
+
+ def all_input_files(self):
+ return [self.input_file]
+
+ def all_output_files(self):
+ return [self.output_file]
+
+
+class VariableRequest(AbstractRequest):
+ def __init__(self, **kwargs):
+ self.input_files = []
+ super(VariableRequest, self).__init__(**kwargs)
+
+ def all_input_files(self):
+ return self.input_files
+
+
+class ListRequest(AbstractRequest):
+ def __init__(self, **kwargs):
+ self.variable_name = None
+ self.output_file = None
+ self.include_tmp = None
+ super(ListRequest, self).__init__(**kwargs)
+
+ def flatten(self, config, all_requests, common_vars):
+ list_files = list(sorted(utils.get_all_output_files(all_requests)))
+ if self.include_tmp:
+ variable_files = list(sorted(utils.get_all_output_files(all_requests, include_tmp=True)))
+ else:
+ # Always include the list file itself
+ variable_files = list_files + [self.output_file]
+ return PrintFileRequest(
+ name = self.name,
+ output_file = self.output_file,
+ content = "\n".join(file.filename for file in list_files)
+ ).flatten(config, all_requests, common_vars) + VariableRequest(
+ name = self.variable_name,
+ input_files = variable_files
+ ).flatten(config, all_requests, common_vars)
+
+ def all_output_files(self):
+ return [self.output_file]
+
+
+class IndexRequest(AbstractRequest):
+ def __init__(self, **kwargs):
+ self.installed_files = []
+ self.alias_files = []
+ self.txt_file = None
+ self.output_file = None
+ self.cldr_version = ""
+ self.args = ""
+ self.format_with = {}
+ super(IndexRequest, self).__init__(**kwargs)
+
+ def apply_file_filter(self, filter):
+ i = 0
+ while i < len(self.installed_files):
+ if filter.match(self.installed_files[i]):
+ i += 1
+ else:
+ del self.installed_files[i]
+ j = 0
+ while j < len(self.alias_files):
+ if filter.match(self.alias_files[j]):
+ j += 1
+ else:
+ del self.alias_files[j]
+ return i + j > 0
+
+ def flatten(self, config, all_requests, common_vars):
+ return (
+ PrintFileRequest(
+ name = self.name,
+ output_file = self.txt_file,
+ content = self._generate_index_file(common_vars)
+ ).flatten(config, all_requests, common_vars) +
+ SingleExecutionRequest(
+ name = "%s_res" % self.name,
+ category = self.category,
+ input_files = [self.txt_file],
+ output_files = [self.output_file],
+ tool = IcuTool("genrb"),
+ args = self.args,
+ format_with = self.format_with
+ ).flatten(config, all_requests, common_vars)
+ )
+
+ def _generate_index_file(self, common_vars):
+ installed_locales = [IndexRequest.locale_file_stem(f) for f in self.installed_files]
+ alias_locales = [IndexRequest.locale_file_stem(f) for f in self.alias_files]
+ formatted_version = " CLDRVersion { \"%s\" }\n" % self.cldr_version if self.cldr_version else ""
+ formatted_installed_locales = "\n".join([" %s {\"\"}" % v for v in installed_locales])
+ formatted_alias_locales = "\n".join([" %s {\"\"}" % v for v in alias_locales])
+ # TODO: CLDRVersion is required only in the base file
+ return ("// Warning this file is automatically generated\n"
+ "{INDEX_NAME}:table(nofallback) {{\n"
+ "{FORMATTED_VERSION}"
+ " InstalledLocales:table {{\n"
+ "{FORMATTED_INSTALLED_LOCALES}\n"
+ " }}\n"
+ " AliasLocales:table {{\n"
+ "{FORMATTED_ALIAS_LOCALES}\n"
+ " }}\n"
+ "}}").format(
+ FORMATTED_VERSION = formatted_version,
+ FORMATTED_INSTALLED_LOCALES = formatted_installed_locales,
+ FORMATTED_ALIAS_LOCALES = formatted_alias_locales,
+ **common_vars
+ )
+
+ def all_input_files(self):
+ return self.installed_files + self.alias_files
+
+ def all_output_files(self):
+ return [self.output_file]
+
+ @staticmethod
+ def locale_file_stem(f):
+ return f.filename[f.filename.rfind("/")+1:-4]
diff --git a/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/test/__init__.py b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/test/__init__.py
new file mode 100644
index 00000000000..dd12bfa16ec
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/test/__init__.py
@@ -0,0 +1,2 @@
+# Copyright (C) 2018 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
diff --git a/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/test/__main__.py b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/test/__main__.py
new file mode 100644
index 00000000000..6ae2c0f7c96
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/test/__main__.py
@@ -0,0 +1,14 @@
+# Copyright (C) 2018 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+import unittest
+
+from . import filtration_test
+
+def load_tests(loader, tests, pattern):
+ suite = unittest.TestSuite()
+ suite.addTest(filtration_test.suite)
+ return suite
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/test/filtration_test.py b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/test/filtration_test.py
new file mode 100644
index 00000000000..5687006c42d
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/test/filtration_test.py
@@ -0,0 +1,353 @@
+# Copyright (C) 2018 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+import unittest
+
+from .. import InFile
+from ..filtration import Filter
+
+EXAMPLE_FILE_STEMS = [
+ "af_NA",
+ "af_ZA",
+ "af",
+ "ar",
+ "ar_SA",
+ "ars",
+ "bs_BA",
+ "bs_Cyrl_BA",
+ "bs_Cyrl",
+ "bs_Latn_BA",
+ "bs_Latn",
+ "bs",
+ "en_001",
+ "en_150",
+ "en_DE",
+ "en_GB",
+ "en_US",
+ "root",
+ "sr_BA",
+ "sr_CS",
+ "sr_Cyrl_BA",
+ "sr_Cyrl_CS",
+ "sr_Cyrl_ME",
+ "sr_Cyrl",
+ "sr_Latn_BA",
+ "sr_Latn_CS",
+ "sr_Latn_ME",
+ "sr_Latn",
+ "sr_ME",
+ "sr",
+ "vai_Latn_LR",
+ "vai_Latn",
+ "vai_LR",
+ "vai_Vaii_LR",
+ "vai_Vaii",
+ "vai",
+ "zh_CN",
+ "zh_Hans_CN",
+ "zh_Hans_HK",
+ "zh_Hans_MO",
+ "zh_Hans_SG",
+ "zh_Hans",
+ "zh_Hant_HK",
+ "zh_Hant_MO",
+ "zh_Hant_TW",
+ "zh_Hant",
+ "zh_HK",
+ "zh_MO",
+ "zh_SG",
+ "zh_TW",
+ "zh"
+]
+
+class FiltrationTest(unittest.TestCase):
+
+ def test_exclude(self):
+ self._check_filter(Filter.create_from_json({
+ "filterType": "exclude"
+ }), [
+ ])
+
+ def test_default_whitelist(self):
+ self._check_filter(Filter.create_from_json({
+ "whitelist": [
+ "ars",
+ "zh_Hans"
+ ]
+ }), [
+ "ars",
+ "zh_Hans"
+ ])
+
+ def test_default_blacklist(self):
+ expected_matches = set(EXAMPLE_FILE_STEMS)
+ expected_matches.remove("ars")
+ expected_matches.remove("zh_Hans")
+ self._check_filter(Filter.create_from_json({
+ "blacklist": [
+ "ars",
+ "zh_Hans"
+ ]
+ }), expected_matches)
+
+ def test_language_whitelist(self):
+ self._check_filter(Filter.create_from_json({
+ "filterType": "language",
+ "whitelist": [
+ "af",
+ "bs"
+ ]
+ }), [
+ "root",
+ "af_NA",
+ "af_ZA",
+ "af",
+ "bs_BA",
+ "bs_Cyrl_BA",
+ "bs_Cyrl",
+ "bs_Latn_BA",
+ "bs_Latn",
+ "bs"
+ ])
+
+ def test_language_blacklist(self):
+ expected_matches = set(EXAMPLE_FILE_STEMS)
+ expected_matches.remove("af_NA")
+ expected_matches.remove("af_ZA")
+ expected_matches.remove("af")
+ self._check_filter(Filter.create_from_json({
+ "filterType": "language",
+ "blacklist": [
+ "af"
+ ]
+ }), expected_matches)
+
+ def test_regex_whitelist(self):
+ self._check_filter(Filter.create_from_json({
+ "filterType": "regex",
+ "whitelist": [
+ r"^ar.*$",
+ r"^zh$"
+ ]
+ }), [
+ "ar",
+ "ar_SA",
+ "ars",
+ "zh"
+ ])
+
+ def test_regex_blacklist(self):
+ expected_matches = set(EXAMPLE_FILE_STEMS)
+ expected_matches.remove("ar")
+ expected_matches.remove("ar_SA")
+ expected_matches.remove("ars")
+ expected_matches.remove("zh")
+ self._check_filter(Filter.create_from_json({
+ "filterType": "regex",
+ "blacklist": [
+ r"^ar.*$",
+ r"^zh$"
+ ]
+ }), expected_matches)
+
+ def test_locale_basic(self):
+ self._check_filter(Filter.create_from_json({
+ "filterType": "locale",
+ "whitelist": [
+ # Default scripts:
+ # sr => Cyrl
+ # vai => Vaii
+ # zh => Hans
+ "bs_BA", # is an alias to bs_Latn_BA
+ "en_DE",
+ "sr", # Language with no script
+ "vai_Latn", # Language with non-default script
+ "zh_Hans" # Language with default script
+ ]
+ }), [
+ "root",
+ # bs: should include the full dependency tree of bs_BA
+ "bs_BA",
+ "bs_Latn_BA",
+ "bs_Latn",
+ "bs",
+ # en: should include the full dependency tree of en_DE
+ "en",
+ "en_DE",
+ "en_150",
+ "en_001",
+ # sr: include Cyrl, the default, but not Latn.
+ "sr",
+ "sr_BA",
+ "sr_CS",
+ "sr_Cyrl",
+ "sr_Cyrl_BA",
+ "sr_Cyrl_CS",
+ "sr_Cyrl_ME",
+ # vai: include Latn but NOT Vaii.
+ "vai_Latn",
+ "vai_Latn_LR",
+ # zh: include Hans but NOT Hant.
+ "zh",
+ "zh_CN",
+ "zh_SG",
+ "zh_Hans",
+ "zh_Hans_CN",
+ "zh_Hans_HK",
+ "zh_Hans_MO",
+ "zh_Hans_SG"
+ ])
+
+ def test_locale_no_children(self):
+ self._check_filter(Filter.create_from_json({
+ "filterType": "locale",
+ "includeChildren": False,
+ "whitelist": [
+ # See comments in test_locale_basic.
+ "bs_BA",
+ "en_DE",
+ "sr",
+ "vai_Latn",
+ "zh_Hans"
+ ]
+ }), [
+ "root",
+ "bs_BA",
+ "bs_Latn_BA",
+ "bs_Latn",
+ "bs",
+ "en",
+ "en_DE",
+ "en_150",
+ "en_001",
+ "sr",
+ "vai_Latn",
+ "zh",
+ "zh_Hans",
+ ])
+
+ def test_locale_include_scripts(self):
+ self._check_filter(Filter.create_from_json({
+ "filterType": "locale",
+ "includeScripts": True,
+ "whitelist": [
+ # See comments in test_locale_basic.
+ "bs_BA",
+ "en_DE",
+ "sr",
+ "vai_Latn",
+ "zh_Hans"
+ ]
+ }), [
+ "root",
+ # bs: includeScripts only works for language-only (without region)
+ "bs_BA",
+ "bs_Latn_BA",
+ "bs_Latn",
+ "bs",
+ # en: should include the full dependency tree of en_DE
+ "en",
+ "en_DE",
+ "en_150",
+ "en_001",
+ # sr: include Latn, since no particular script was requested.
+ "sr_BA",
+ "sr_CS",
+ "sr_Cyrl_BA",
+ "sr_Cyrl_CS",
+ "sr_Cyrl_ME",
+ "sr_Cyrl",
+ "sr_Latn_BA",
+ "sr_Latn_CS",
+ "sr_Latn_ME",
+ "sr_Latn",
+ "sr_ME",
+ "sr",
+ # vai: do NOT include Vaii; the script was explicitly requested.
+ "vai_Latn_LR",
+ "vai_Latn",
+ # zh: do NOT include Hant; the script was explicitly requested.
+ "zh_CN",
+ "zh_SG",
+ "zh_Hans_CN",
+ "zh_Hans_HK",
+ "zh_Hans_MO",
+ "zh_Hans_SG",
+ "zh_Hans",
+ "zh"
+ ])
+
+ def test_locale_no_children_include_scripts(self):
+ self._check_filter(Filter.create_from_json({
+ "filterType": "locale",
+ "includeChildren": False,
+ "includeScripts": True,
+ "whitelist": [
+ # See comments in test_locale_basic.
+ "bs_BA",
+ "en_DE",
+ "sr",
+ "vai_Latn",
+ "zh_Hans"
+ ]
+ }), [
+ "root",
+ # bs: includeScripts only works for language-only (without region)
+ "bs_BA",
+ "bs_Latn_BA",
+ "bs_Latn",
+ "bs",
+ # en: should include the full dependency tree of en_DE
+ "en",
+ "en_DE",
+ "en_150",
+ "en_001",
+ # sr: include Cyrl and Latn but no other children
+ "sr",
+ "sr_Cyrl",
+ "sr_Latn",
+ # vai: include only the requested script
+ "vai_Latn",
+ # zh: include only the requested script
+ "zh",
+ "zh_Hans",
+ ])
+
+ def test_union(self):
+ self._check_filter(Filter.create_from_json({
+ "filterType": "union",
+ "unionOf": [
+ {
+ "whitelist": [
+ "ars",
+ "zh_Hans"
+ ]
+ },
+ {
+ "filterType": "regex",
+ "whitelist": [
+ r"^bs.*$",
+ r"^zh$"
+ ]
+ }
+ ]
+ }), [
+ "ars",
+ "zh_Hans",
+ "bs_BA",
+ "bs_Cyrl_BA",
+ "bs_Cyrl",
+ "bs_Latn_BA",
+ "bs_Latn",
+ "bs",
+ "zh"
+ ])
+
+ def _check_filter(self, filter, expected_matches):
+ for file_stem in EXAMPLE_FILE_STEMS:
+ is_match = filter.match(InFile("locales/%s.txt" % file_stem))
+ expected_match = file_stem in expected_matches
+ self.assertEqual(is_match, expected_match, file_stem)
+
+# Export the test for the runner
+suite = unittest.makeSuite(FiltrationTest)
diff --git a/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/utils.py b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/utils.py
new file mode 100644
index 00000000000..c5965906c6b
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/python/icutools/databuilder/utils.py
@@ -0,0 +1,130 @@
+# Copyright (C) 2018 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+# Python 2/3 Compatibility (ICU-20299)
+# TODO(ICU-20301): Remove this.
+from __future__ import print_function
+
+import sys
+
+from . import *
+
+
+def dir_for(file):
+ if isinstance(file, LocalFile):
+ return get_local_dirname(file.dirname)
+ if isinstance(file, SrcFile):
+ return "{SRC_DIR}"
+ if isinstance(file, InFile):
+ return "{IN_DIR}"
+ if isinstance(file, TmpFile):
+ return "{TMP_DIR}"
+ if isinstance(file, OutFile):
+ return "{OUT_DIR}"
+ if isinstance(file, PkgFile):
+ return "{PKG_DIR}"
+ assert False
+
+
+LOCAL_DIRNAME_SUBSTITUTIONS = {
+ "SRC": "{SRC_DIR}",
+ "FILTERS": "{FILTERS_DIR}",
+ "CWD": "{CWD_DIR}"
+}
+
+
+def get_local_dirname(dirname):
+ if dirname.startswith("/"):
+ return dirname
+ elif dirname.startswith("$"):
+ # Note: directory separator substitution happens later
+ sep_idx = dirname.find("/")
+ if sep_idx == -1:
+ sep_idx = len(dirname)
+ variable = dirname[1:sep_idx]
+ if variable in LOCAL_DIRNAME_SUBSTITUTIONS:
+ return LOCAL_DIRNAME_SUBSTITUTIONS[variable] + dirname[sep_idx:]
+ print(
+ "Error: Local directory must be absolute, or relative to one of: " +
+ (", ".join("$%s" % v for v in LOCAL_DIRNAME_SUBSTITUTIONS.keys())),
+ file=sys.stderr
+ )
+ exit(1)
+
+
+def concat_dicts(*dicts):
+ # There is not a super great way to do this in Python:
+ new_dict = {}
+ for dict in dicts:
+ new_dict.update(dict)
+ return new_dict
+
+
+def repeated_execution_request_looper(request):
+ # dictionary of lists to list of dictionaries:
+ ld = [
+ dict(zip(request.repeat_with, t))
+ for t in zip(*request.repeat_with.values())
+ ]
+ if not ld:
+ # No special options given in repeat_with
+ ld = [{} for _ in range(len(request.input_files))]
+ return zip(ld, request.specific_dep_files, request.input_files, request.output_files)
+
+
+def format_single_request_command(request, cmd_template, common_vars):
+ return cmd_template.format(
+ ARGS = request.args.format(
+ INPUT_FILES = [file.filename for file in request.input_files],
+ OUTPUT_FILES = [file.filename for file in request.output_files],
+ **concat_dicts(common_vars, request.format_with)
+ )
+ )
+
+
+def format_repeated_request_command(request, cmd_template, loop_vars, common_vars):
+ (iter_vars, _, input_file, output_file) = loop_vars
+ return cmd_template.format(
+ ARGS = request.args.format(
+ INPUT_FILE = input_file.filename,
+ OUTPUT_FILE = output_file.filename,
+ **concat_dicts(common_vars, request.format_with, iter_vars)
+ )
+ )
+
+
+def flatten_requests(requests, config, common_vars):
+ result = []
+ for request in requests:
+ result += request.flatten(config, requests, common_vars)
+ return result
+
+
+def get_all_output_files(requests, include_tmp=False):
+ files = []
+ for request in requests:
+ files += request.all_output_files()
+
+ # Filter out all files but those in OUT_DIR if necessary.
+ # It is also easy to filter for uniqueness; do it right now and return.
+ if not include_tmp:
+ files = (file for file in files if isinstance(file, OutFile))
+ return list(set(files))
+
+ # Filter for unique values. NOTE: Cannot use set() because we need to accept same filename as
+ # OutFile and TmpFile as different, and by default they evaluate as equal.
+ return [f for _, f in set((type(f), f) for f in files)]
+
+
+def compute_directories(requests):
+ dirs = set()
+ for file in get_all_output_files(requests, include_tmp=True):
+ path = "%s/%s" % (dir_for(file), file.filename)
+ dirs.add(path[:path.rfind("/")])
+ return list(sorted(dirs))
+
+
+class SpaceSeparatedList(list):
+ """A list that joins itself with spaces when converted to a string."""
+ def __str__(self):
+ return " ".join(self)
diff --git a/Build/source/libs/icu/icu-src/source/samples/break/break.vcxproj b/Build/source/libs/icu/icu-src/source/samples/break/break.vcxproj
index 1737d9328b7..5cf80d76184 100644
--- a/Build/source/libs/icu/icu-src/source/samples/break/break.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/break/break.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{DEEADF02-9C14-4854-A395-E505D2904D65}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -76,7 +75,6 @@
<AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/break.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -103,7 +101,6 @@
<AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/break.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -131,7 +128,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/break.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -159,7 +155,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/break.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/cal/cal.c b/Build/source/libs/icu/icu-src/source/samples/cal/cal.c
index eb606a94d2c..bb096bf16d9 100644
--- a/Build/source/libs/icu/icu-src/source/samples/cal/cal.c
+++ b/Build/source/libs/icu/icu-src/source/samples/cal/cal.c
@@ -697,7 +697,7 @@ print_year(UCalendar *c,
if(left_current == 0) {
break;
}
- };
+ }
/* If the current day isn't 0, indent to make up for missing
days at the end of the month */
@@ -745,7 +745,7 @@ print_year(UCalendar *c,
break;
}
- };
+ }
/* Output a newline */
putc('\n', stdout);
diff --git a/Build/source/libs/icu/icu-src/source/samples/cal/cal.vcxproj b/Build/source/libs/icu/icu-src/source/samples/cal/cal.vcxproj
index a5aad702677..00c8ef65292 100644
--- a/Build/source/libs/icu/icu-src/source/samples/cal/cal.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/cal/cal.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
- <PropertyGroup Label="Globals">
- <ProjectGuid>{F7659D77-09CF-4FE9-ACEE-927287AA9509}</ProjectGuid>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{F7659D77-09CF-4FE9-ACEE-927287AA9509}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -77,7 +76,6 @@
<AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/cal.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -104,7 +102,6 @@
<AdditionalLibraryDirectories>../../../lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/cal.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -133,7 +130,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/cal.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -161,7 +157,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/cal.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/case/case.vcxproj b/Build/source/libs/icu/icu-src/source/samples/case/case.vcxproj
index 222ebedaef3..7620fa5affc 100644
--- a/Build/source/libs/icu/icu-src/source/samples/case/case.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/case/case.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -60,7 +59,7 @@
<TypeLibraryName>.\x86\Debug/case.tlb</TypeLibraryName>
</Midl>
<ClCompile>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<PrecompiledHeaderOutputFile>.\x86\Debug/case.pch</PrecompiledHeaderOutputFile>
@@ -76,7 +75,6 @@
<AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Debug/case.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -86,7 +84,7 @@
<TypeLibraryName>.\x64\Debug/case.tlb</TypeLibraryName>
</Midl>
<ClCompile>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<PrecompiledHeaderOutputFile>.\x64\Debug/case.pch</PrecompiledHeaderOutputFile>
@@ -104,7 +102,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/case.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -115,7 +112,7 @@
</Midl>
<ClCompile>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<PrecompiledHeader>
</PrecompiledHeader>
@@ -131,7 +128,6 @@
<AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/case.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -142,7 +138,7 @@
</Midl>
<ClCompile>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<PrecompiledHeader>
</PrecompiledHeader>
@@ -158,7 +154,6 @@
<AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/case.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/citer/citer.cpp b/Build/source/libs/icu/icu-src/source/samples/citer/citer.cpp
index 43e5a00a054..4d5a3bbe837 100644
--- a/Build/source/libs/icu/icu-src/source/samples/citer/citer.cpp
+++ b/Build/source/libs/icu/icu-src/source/samples/citer/citer.cpp
@@ -59,7 +59,7 @@ void Test::TestUChariter() {
const UChar *testText = testString.getTerminatedBuffer();
UCharCharacterIterator iter(testText, u_strlen(testText));
- UCharCharacterIterator* test2 = (UCharCharacterIterator*)iter.clone();
+ UCharCharacterIterator* test2 = iter.clone();
u_fprintf(out, "testText = %s", testChars);
@@ -126,7 +126,7 @@ void Test::TestStringiter() {
const UChar *testText = testString.getTerminatedBuffer();
StringCharacterIterator iter(testText, u_strlen(testText));
- StringCharacterIterator* test2 = (StringCharacterIterator*)iter.clone();
+ StringCharacterIterator* test2 = iter.clone();
if (iter != *test2 ) {
u_fprintf(out, "clone() or equals() failed: Two clones tested unequal\n");
diff --git a/Build/source/libs/icu/icu-src/source/samples/citer/citer.vcxproj b/Build/source/libs/icu/icu-src/source/samples/citer/citer.vcxproj
index 9e7250d74c6..c6bf105cd85 100644
--- a/Build/source/libs/icu/icu-src/source/samples/citer/citer.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/citer/citer.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{247E2681-6C84-408B-B40C-5DB50BC5E18F}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -64,7 +63,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>$(OutDir)citer.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -86,7 +84,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>$(OutDir)citer.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -107,7 +104,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Console</SubSystem>
<OptimizeReferences>true</OptimizeReferences>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -128,7 +124,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Console</SubSystem>
<OptimizeReferences>true</OptimizeReferences>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/coll/coll.vcxproj b/Build/source/libs/icu/icu-src/source/samples/coll/coll.vcxproj
index 453bcd4bc8e..a486491899a 100644
--- a/Build/source/libs/icu/icu-src/source/samples/coll/coll.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/coll/coll.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{7664D0D2-0263-4BFB-AE19-9A1CAD231440}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -71,7 +70,6 @@
<AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/coll.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -100,7 +98,6 @@
<AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/coll.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -131,7 +128,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/coll.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -162,7 +158,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/coll.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/csdet/csdet.vcxproj b/Build/source/libs/icu/icu-src/source/samples/csdet/csdet.vcxproj
index fc4cb592f39..803a514f202 100644
--- a/Build/source/libs/icu/icu-src/source/samples/csdet/csdet.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/csdet/csdet.vcxproj
@@ -1,18 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{683745AD-3BC2-4B89-898B-93490D7F2757}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -66,7 +65,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>$(OutDir)csdet.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -93,7 +91,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>$(OutDir)csdet.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -114,7 +111,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Console</SubSystem>
<OptimizeReferences>true</OptimizeReferences>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -135,7 +131,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Console</SubSystem>
<OptimizeReferences>true</OptimizeReferences>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/date/date.vcxproj b/Build/source/libs/icu/icu-src/source/samples/date/date.vcxproj
index 83ab770be46..d0308a301b4 100644
--- a/Build/source/libs/icu/icu-src/source/samples/date/date.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/date/date.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{38B5751A-C6F9-4409-950C-F4F9DA17275F}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -71,7 +70,6 @@
<AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/date.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -99,7 +97,6 @@
<AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/date.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -129,7 +126,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/date.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -157,7 +153,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/date.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/datefmt/datefmt.vcxproj b/Build/source/libs/icu/icu-src/source/samples/datefmt/datefmt.vcxproj
index ca610f5f129..e22dde62538 100644
--- a/Build/source/libs/icu/icu-src/source/samples/datefmt/datefmt.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/datefmt/datefmt.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -71,7 +70,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/datefmt.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -100,7 +98,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/datefmt.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -129,7 +126,6 @@
<AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/datefmt.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -158,7 +154,6 @@
<AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/datefmt.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/datefmt/main.cpp b/Build/source/libs/icu/icu-src/source/samples/datefmt/main.cpp
index dd1796a9896..9fb22e50530 100644
--- a/Build/source/libs/icu/icu-src/source/samples/datefmt/main.cpp
+++ b/Build/source/libs/icu/icu-src/source/samples/datefmt/main.cpp
@@ -48,13 +48,13 @@ int main(int argc, char **argv) {
UDate date;
// The languages in which we will display the date
- static char* LANGUAGE[] = {
+ static const char* LANGUAGE[] = {
"en", "de", "fr"
};
static const int32_t N_LANGUAGE = sizeof(LANGUAGE)/sizeof(LANGUAGE[0]);
// The time zones in which we will display the time
- static char* TIMEZONE[] = {
+ static const char* TIMEZONE[] = {
"America/Los_Angeles",
"America/New_York",
"Europe/Paris",
diff --git a/Build/source/libs/icu/icu-src/source/samples/dtitvfmtsample/dtitvfmtsample.vcxproj b/Build/source/libs/icu/icu-src/source/samples/dtitvfmtsample/dtitvfmtsample.vcxproj
index db22407c399..aea18b217f3 100644
--- a/Build/source/libs/icu/icu-src/source/samples/dtitvfmtsample/dtitvfmtsample.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/dtitvfmtsample/dtitvfmtsample.vcxproj
@@ -1,13 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{8945255B-473B-4C47-9425-E92384338CAA}</ProjectGuid>
<RootNamespace>samples</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
diff --git a/Build/source/libs/icu/icu-src/source/samples/dtptngsample/dtptngsample.vcxproj b/Build/source/libs/icu/icu-src/source/samples/dtptngsample/dtptngsample.vcxproj
index d2e94665bd2..542b3439f03 100644
--- a/Build/source/libs/icu/icu-src/source/samples/dtptngsample/dtptngsample.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/dtptngsample/dtptngsample.vcxproj
@@ -1,13 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{115886F0-7DFB-4B8B-BE79-83162EE8713B}</ProjectGuid>
<RootNamespace>samples</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
diff --git a/Build/source/libs/icu/icu-src/source/samples/layout/layout.vcxproj b/Build/source/libs/icu/icu-src/source/samples/layout/layout.vcxproj
index b49dca6ac30..f6114bb57fa 100644
--- a/Build/source/libs/icu/icu-src/source/samples/layout/layout.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/layout/layout.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{497500ED-DE1D-4B20-B529-F41B5A0FBEEB}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -79,7 +78,6 @@
<SuppressStartupBanner>true</SuppressStartupBanner>
<ProgramDatabaseFile>.\x86\Release/layout.pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -117,7 +115,6 @@
<SuppressStartupBanner>true</SuppressStartupBanner>
<ProgramDatabaseFile>.\x64\Release/layout.pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
@@ -156,7 +153,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/layout.pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -195,7 +191,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/layout.pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
diff --git a/Build/source/libs/icu/icu-src/source/samples/legacy/legacy.vcxproj b/Build/source/libs/icu/icu-src/source/samples/legacy/legacy.vcxproj
index 24369830e65..e96fa911396 100644
--- a/Build/source/libs/icu/icu-src/source/samples/legacy/legacy.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/legacy/legacy.vcxproj
@@ -115,7 +115,6 @@
<AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/legacy.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -154,7 +153,6 @@
<AdditionalLibraryDirectories>../../../lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/legacy.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
@@ -194,7 +192,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/legacy.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -234,7 +231,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/legacy.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
diff --git a/Build/source/libs/icu/icu-src/source/samples/msgfmt/msgfmt.vcxproj b/Build/source/libs/icu/icu-src/source/samples/msgfmt/msgfmt.vcxproj
index fd90eac9736..8b7a9518e10 100644
--- a/Build/source/libs/icu/icu-src/source/samples/msgfmt/msgfmt.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/msgfmt/msgfmt.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -72,7 +71,6 @@
<AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/msgfmt.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -101,7 +99,6 @@
<AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/msgfmt.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -131,7 +128,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/msgfmt.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -161,7 +157,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/msgfmt.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/numfmt/numfmt.vcxproj b/Build/source/libs/icu/icu-src/source/samples/numfmt/numfmt.vcxproj
index 0cd1e173977..e345627f8b5 100644
--- a/Build/source/libs/icu/icu-src/source/samples/numfmt/numfmt.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/numfmt/numfmt.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{721FBD47-E458-4C35-90DA-FF192907D5E2}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -71,7 +70,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/numfmt.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -104,7 +102,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/numfmt.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -133,7 +130,6 @@
<AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/numfmt.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -162,7 +158,6 @@
<AdditionalLibraryDirectories>../../../lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/numfmt.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/numfmt/util.cpp b/Build/source/libs/icu/icu-src/source/samples/numfmt/util.cpp
index ad6f008b7ee..f6e405bdd73 100644
--- a/Build/source/libs/icu/icu-src/source/samples/numfmt/util.cpp
+++ b/Build/source/libs/icu/icu-src/source/samples/numfmt/util.cpp
@@ -8,6 +8,9 @@
* others. All Rights Reserved.
*************************************************************************/
+#define __STDC_FORMAT_MACROS 1
+#include <inttypes.h>
+
#include "unicode/unistr.h"
#include "unicode/fmtable.h"
#include <stdio.h>
@@ -95,10 +98,15 @@ UnicodeString formattableToString(const Formattable& f) {
return UnicodeString(buf, "");
}
case Formattable::kLong:
+ {
+ char buf[256];
+ sprintf(buf, "%" PRId32 "L", f.getLong());
+ return UnicodeString(buf, "");
+ }
case Formattable::kInt64:
{
char buf[256];
- sprintf(buf, "%ldL", f.getLong());
+ sprintf(buf, "%" PRId64 "L", f.getInt64());
return UnicodeString(buf, "");
}
case Formattable::kString:
diff --git a/Build/source/libs/icu/icu-src/source/samples/plurfmtsample/plurfmtsample.vcxproj b/Build/source/libs/icu/icu-src/source/samples/plurfmtsample/plurfmtsample.vcxproj
index 859213ec331..c0d3246ae82 100644
--- a/Build/source/libs/icu/icu-src/source/samples/plurfmtsample/plurfmtsample.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/plurfmtsample/plurfmtsample.vcxproj
@@ -1,12 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{B500B731-ED1A-4761-94ED-B22DFE25FF2B}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
diff --git a/Build/source/libs/icu/icu-src/source/samples/props/props.cpp b/Build/source/libs/icu/icu-src/source/samples/props/props.cpp
index da9408dee50..f1a148651cd 100644
--- a/Build/source/libs/icu/icu-src/source/samples/props/props.cpp
+++ b/Build/source/libs/icu/icu-src/source/samples/props/props.cpp
@@ -23,6 +23,9 @@
* for Unicode character properties.
*/
+#define __STDC_FORMAT_MACROS 1
+#include <inttypes.h>
+
#include <stdio.h>
#include "unicode/utypes.h"
#include "unicode/uchar.h"
@@ -38,13 +41,13 @@ printProps(UChar32 codePoint) {
u_charName(codePoint, U_UNICODE_CHAR_NAME, buffer, sizeof(buffer), &errorCode);
/* print the code point and the character name */
- printf("U+%04lx\t%s\n", codePoint, buffer);
+ printf("U+%04" PRId32 "\t%s\n", codePoint, buffer);
/* print some properties */
printf(" general category (numeric enum value): %u\n", u_charType(codePoint));
/* note: these APIs do not provide the data from SpecialCasing.txt */
- printf(" is lowercase: %d uppercase: U+%04lx\n", u_islower(codePoint), u_toupper(codePoint));
+ printf(" is lowercase: %d uppercase: U+%04" PRId32 "\n", u_islower(codePoint), u_toupper(codePoint));
printf(" is digit: %d decimal digit value: %d\n", u_isdigit(codePoint), u_charDigitValue(codePoint));
diff --git a/Build/source/libs/icu/icu-src/source/samples/props/props.vcxproj b/Build/source/libs/icu/icu-src/source/samples/props/props.vcxproj
index 839cec9690c..5225c4aa7a5 100644
--- a/Build/source/libs/icu/icu-src/source/samples/props/props.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/props/props.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -75,7 +74,6 @@
<AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/props.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -109,7 +107,6 @@
<AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/props.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
@@ -144,7 +141,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/props.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -179,7 +175,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/props.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
diff --git a/Build/source/libs/icu/icu-src/source/samples/strsrch/strsrch.vcxproj b/Build/source/libs/icu/icu-src/source/samples/strsrch/strsrch.vcxproj
index 35ea8ae3d3b..021bf2267a3 100644
--- a/Build/source/libs/icu/icu-src/source/samples/strsrch/strsrch.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/strsrch/strsrch.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -74,7 +73,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/strsrch.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -104,7 +102,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/strsrch.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -134,7 +131,6 @@
<AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/strsrch.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -165,7 +161,6 @@
<AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/strsrch.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/translit/translit.vcxproj b/Build/source/libs/icu/icu-src/source/samples/translit/translit.vcxproj
index 6925f3093f1..fe91ee7f6e0 100644
--- a/Build/source/libs/icu/icu-src/source/samples/translit/translit.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/translit/translit.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{D1BEC124-303A-4F44-BA70-55769B8FE96A}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -76,7 +75,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/translit.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -103,7 +101,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/translit.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -130,7 +127,6 @@
<AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/translit.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -157,7 +153,6 @@
<AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/translit.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/uciter8/uciter8.vcxproj b/Build/source/libs/icu/icu-src/source/samples/uciter8/uciter8.vcxproj
index 0318e7039b3..b417be32aaf 100644
--- a/Build/source/libs/icu/icu-src/source/samples/uciter8/uciter8.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/uciter8/uciter8.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -76,7 +75,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/uciter8.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -103,7 +101,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/uciter8.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -130,7 +127,6 @@
<AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/uciter8.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -157,7 +153,6 @@
<AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/uciter8.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/ucnv/ucnv.vcxproj b/Build/source/libs/icu/icu-src/source/samples/ucnv/ucnv.vcxproj
index 50dec385734..65d4dbe0099 100644
--- a/Build/source/libs/icu/icu-src/source/samples/ucnv/ucnv.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/ucnv/ucnv.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{8C95060E-61F5-464E-BB42-95B788C0D7E4}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -76,7 +75,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/ucnv.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -103,7 +101,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/ucnv.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -130,7 +127,6 @@
<AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/ucnv.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -157,7 +153,6 @@
<AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/ucnv.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/udata/reader.vcxproj b/Build/source/libs/icu/icu-src/source/samples/udata/reader.vcxproj
index 671ba15f27c..32c11f90533 100644
--- a/Build/source/libs/icu/icu-src/source/samples/udata/reader.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/udata/reader.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -77,7 +76,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\reader_Win32_Debug/reader.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -106,7 +104,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\reader_x64_Debug/reader.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -135,7 +132,6 @@
<AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\reader_Win32_Release/reader.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -165,7 +161,6 @@
<AdditionalLibraryDirectories>../../../lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\reader_x64_Release/reader.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/udata/writer.c b/Build/source/libs/icu/icu-src/source/samples/udata/writer.c
index 47348222238..ba81e462957 100644
--- a/Build/source/libs/icu/icu-src/source/samples/udata/writer.c
+++ b/Build/source/libs/icu/icu-src/source/samples/udata/writer.c
@@ -70,7 +70,7 @@ main(int argc, const char *argv[]) {
uint16_t intValue=2000;
long dataLength;
- uint32_t size;
+ size_t size;
#ifdef WIN32
char *currdir = _getcwd(NULL, 0);
#else
@@ -107,19 +107,8 @@ main(int argc, const char *argv[]) {
if(dataLength!=(long)size) {
- fprintf(stderr, "Error: data length %ld != calculated size %lu\n", dataLength, size);
+ fprintf(stderr, "Error: data length %ld != calculated size %zu\n", dataLength, size);
exit(U_INTERNAL_PROGRAM_ERROR);
}
return 0;
}
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Build/source/libs/icu/icu-src/source/samples/udata/writer.vcxproj b/Build/source/libs/icu/icu-src/source/samples/udata/writer.vcxproj
index f6236b9c60a..0bb83204d81 100644
--- a/Build/source/libs/icu/icu-src/source/samples/udata/writer.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/udata/writer.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{40A90302-F173-4629-A003-F571D2D93D16}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -77,7 +76,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/writer.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -108,7 +106,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/writer.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -137,7 +134,6 @@
<AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/writer.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -166,7 +162,6 @@
<AdditionalLibraryDirectories>../../../lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release\writer.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/ufortune/ufortune.vcxproj b/Build/source/libs/icu/icu-src/source/samples/ufortune/ufortune.vcxproj
index 7eb88ca8f2a..8e049351cb7 100644
--- a/Build/source/libs/icu/icu-src/source/samples/ufortune/ufortune.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/ufortune/ufortune.vcxproj
@@ -70,7 +70,6 @@
<AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -101,7 +100,6 @@
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/ugrep/ugrep.vcxproj b/Build/source/libs/icu/icu-src/source/samples/ugrep/ugrep.vcxproj
index 799f821f51c..39ab564bc93 100644
--- a/Build/source/libs/icu/icu-src/source/samples/ugrep/ugrep.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/ugrep/ugrep.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{63166CEB-02CC-472C-B3B7-E6C559939BDA}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -75,7 +74,6 @@
<AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/ugrep.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -110,7 +108,6 @@
<AdditionalLibraryDirectories>../../../lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/ugrep.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -144,7 +141,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/ugrep.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -176,7 +172,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/ugrep.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/uresb/resources.vcxproj b/Build/source/libs/icu/icu-src/source/samples/uresb/resources.vcxproj
index 55e61b45989..44755ac1f62 100644
--- a/Build/source/libs/icu/icu-src/source/samples/uresb/resources.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/uresb/resources.vcxproj
@@ -1,16 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{69437707-2FEF-4E2C-8C3F-6E6B3D241366}</ProjectGuid>
<Keyword>MakeFileProj</Keyword>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Makefile</ConfigurationType>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
diff --git a/Build/source/libs/icu/icu-src/source/samples/uresb/uresb.vcxproj b/Build/source/libs/icu/icu-src/source/samples/uresb/uresb.vcxproj
index 6fdd4d88cd8..6e6e96b18f8 100644
--- a/Build/source/libs/icu/icu-src/source/samples/uresb/uresb.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/uresb/uresb.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{92580BF4-F4DA-4024-B3F8-444F982BC72F}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -79,7 +78,6 @@
<AdditionalLibraryDirectories>../../../lib/;../../tools/toolutil/;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/uresb.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -110,7 +108,6 @@
<AdditionalLibraryDirectories>../../../lib64/;../../tools/toolutil/;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/uresb.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
@@ -141,7 +138,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/uresb.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -171,7 +167,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/uresb.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/samples/ustring/ustring.cpp b/Build/source/libs/icu/icu-src/source/samples/ustring/ustring.cpp
index 4f0101d5edb..a123c832a54 100644
--- a/Build/source/libs/icu/icu-src/source/samples/ustring/ustring.cpp
+++ b/Build/source/libs/icu/icu-src/source/samples/ustring/ustring.cpp
@@ -23,6 +23,9 @@
* with ICU.
*/
+#define __STDC_FORMAT_MACROS 1
+#include <inttypes.h>
+
#include <stdio.h>
#include "unicode/utypes.h"
#include "unicode/uchar.h"
@@ -299,7 +302,7 @@ static void demoCaseMapInC() {
if(U_SUCCESS(errorCode)) {
printUString("full-lowercased/en: ", buffer, length);
} else {
- printf("error in u_strToLower(en)=%ld error=%s\n", length, u_errorName(errorCode));
+ printf("error in u_strToLower(en)=%" PRId32 " error=%s\n", length, u_errorName(errorCode));
}
/* lowercase/Turkish */
errorCode=U_ZERO_ERROR;
@@ -307,7 +310,7 @@ static void demoCaseMapInC() {
if(U_SUCCESS(errorCode)) {
printUString("full-lowercased/tr: ", buffer, length);
} else {
- printf("error in u_strToLower(tr)=%ld error=%s\n", length, u_errorName(errorCode));
+ printf("error in u_strToLower(tr)=%" PRId32 " error=%s\n", length, u_errorName(errorCode));
}
/* uppercase/English */
errorCode=U_ZERO_ERROR;
@@ -315,7 +318,7 @@ static void demoCaseMapInC() {
if(U_SUCCESS(errorCode)) {
printUString("full-uppercased/en: ", buffer, length);
} else {
- printf("error in u_strToUpper(en)=%ld error=%s\n", length, u_errorName(errorCode));
+ printf("error in u_strToUpper(en)=%" PRId32 " error=%s\n", length, u_errorName(errorCode));
}
/* uppercase/Turkish */
errorCode=U_ZERO_ERROR;
@@ -323,7 +326,7 @@ static void demoCaseMapInC() {
if(U_SUCCESS(errorCode)) {
printUString("full-uppercased/tr: ", buffer, length);
} else {
- printf("error in u_strToUpper(tr)=%ld error=%s\n", length, u_errorName(errorCode));
+ printf("error in u_strToUpper(tr)=%" PRId32 " error=%s\n", length, u_errorName(errorCode));
}
/* titlecase/English */
errorCode=U_ZERO_ERROR;
@@ -331,7 +334,7 @@ static void demoCaseMapInC() {
if(U_SUCCESS(errorCode)) {
printUString("full-titlecased/en: ", buffer, length);
} else {
- printf("error in u_strToTitle(en)=%ld error=%s\n", length, u_errorName(errorCode));
+ printf("error in u_strToTitle(en)=%" PRId32 " error=%s\n", length, u_errorName(errorCode));
}
/* titlecase/Turkish */
errorCode=U_ZERO_ERROR;
@@ -339,7 +342,7 @@ static void demoCaseMapInC() {
if(U_SUCCESS(errorCode)) {
printUString("full-titlecased/tr: ", buffer, length);
} else {
- printf("error in u_strToTitle(tr)=%ld error=%s\n", length, u_errorName(errorCode));
+ printf("error in u_strToTitle(tr)=%" PRId32 " error=%s\n", length, u_errorName(errorCode));
}
/* case-fold/default */
errorCode=U_ZERO_ERROR;
@@ -347,7 +350,7 @@ static void demoCaseMapInC() {
if(U_SUCCESS(errorCode)) {
printUString("full-case-folded/default: ", buffer, length);
} else {
- printf("error in u_strFoldCase(default)=%ld error=%s\n", length, u_errorName(errorCode));
+ printf("error in u_strFoldCase(default)=%" PRId32 " error=%s\n", length, u_errorName(errorCode));
}
/* case-fold/Turkic */
errorCode=U_ZERO_ERROR;
@@ -355,7 +358,7 @@ static void demoCaseMapInC() {
if(U_SUCCESS(errorCode)) {
printUString("full-case-folded/Turkic: ", buffer, length);
} else {
- printf("error in u_strFoldCase(Turkic)=%ld error=%s\n", length, u_errorName(errorCode));
+ printf("error in u_strFoldCase(Turkic)=%" PRId32 " error=%s\n", length, u_errorName(errorCode));
}
}
@@ -461,7 +464,7 @@ demoUnicodeStringStorage() {
printUnicodeString("readonly-aliasing string after modification: ", three);
// the aliased array is not modified
for(i=0; i<three.length(); ++i) {
- printf("readonly buffer[%d] after modifying its string: 0x%lx\n",
+ printf("readonly buffer[%d] after modifying its string: 0x%" PRId32 "\n",
i, readonly[i]);
}
// setTo() readonly alias
@@ -483,7 +486,7 @@ demoUnicodeStringStorage() {
// a modification writes through to the buffer
four.setCharAt(1, 0x39);
for(i=0; i<four.length(); ++i) {
- printf("writeable-alias backing buffer[%d]=0x%lx "
+ printf("writeable-alias backing buffer[%d]=0x%" PRId32 " "
"after modification\n", i, writeable[i]);
}
// a copy will not alias any more;
@@ -491,7 +494,7 @@ demoUnicodeStringStorage() {
two=four;
two.setCharAt(1, 0x21);
for(i=0; i<two.length(); ++i) {
- printf("writeable-alias backing buffer[%d]=0x%lx after "
+ printf("writeable-alias backing buffer[%d]=0x%" PRId32 " after "
"modification of string copy\n", i, writeable[i]);
}
// setTo() writeable alias, capacity==length
@@ -503,8 +506,8 @@ demoUnicodeStringStorage() {
one.truncate(one.length()-1);
// we still operate on the copy
one.setCharAt(1, 0x25);
- printf("string after growing too much and then shrinking[1]=0x%lx\n"
- " backing store for this[1]=0x%lx\n",
+ printf("string after growing too much and then shrinking[1]=0x%" PRId32 "\n"
+ " backing store for this[1]=0x%" PRId32 "\n",
one.charAt(1), writeable[1]);
// if we need it in the original buffer, then extract() to it
// extract() does not do anything if the string aliases that same buffer
@@ -516,7 +519,7 @@ demoUnicodeStringStorage() {
}
one.extract(0, i, writeable);
for(i=0; i<UPRV_LENGTHOF(writeable); ++i) {
- printf("writeable-alias backing buffer[%d]=0x%lx after re-extract\n",
+ printf("writeable-alias backing buffer[%d]=0x%" PRId32 " after re-extract\n",
i, writeable[i]);
}
}
diff --git a/Build/source/libs/icu/icu-src/source/samples/ustring/ustring.vcxproj b/Build/source/libs/icu/icu-src/source/samples/ustring/ustring.vcxproj
index 10316fcab84..7e2882d65f3 100644
--- a/Build/source/libs/icu/icu-src/source/samples/ustring/ustring.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/samples/ustring/ustring.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -76,7 +75,6 @@
<AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/ustring.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -104,7 +102,6 @@
<AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/ustring.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -131,7 +128,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/ustring.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -158,7 +154,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/ustring.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/stubdata/stubdata.vcxproj b/Build/source/libs/icu/icu-src/source/stubdata/stubdata.vcxproj
index 9af0c4c8182..751bba0ed68 100644
--- a/Build/source/libs/icu/icu-src/source/stubdata/stubdata.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/stubdata/stubdata.vcxproj
@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\allinone\Build.Windows.ProjectConfiguration.props" />
- <!-- The following import will include the library configuration options for VS projects. -->
- <Import Project="..\allinone\Build.Windows.Library.ProjectConfiguration.props" />
<PropertyGroup Label="Globals">
<ProjectGuid>{203EC78A-0531-43F0-A636-285439BDE025}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\allinone\Build.Windows.ProjectConfiguration.props" />
+ <!-- The following import will include the library configuration options for VS projects. -->
+ <Import Project="..\allinone\Build.Windows.Library.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -35,29 +35,31 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <GenerateManifest>false</GenerateManifest>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
<!-- Options that are common to *all* project configurations -->
<ItemDefinitionGroup>
+ <Midl>
+ <TypeLibraryName>$(OutDir)\icudt.tlb</TypeLibraryName>
+ </Midl>
<ClCompile>
<AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>STUBDATA_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<DisableLanguageExtensions>true</DisableLanguageExtensions>
<WarningLevel>Level3</WarningLevel>
<CompileAs>Default</CompileAs>
+ <PrecompiledHeaderOutputFile>$(OutDir)/icudt.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)/icudt.pdb</ProgramDataBaseFileName>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>STUBDATA_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -66,11 +68,13 @@
<Command>echo "File with stubdata build time, used as a dependency to trigger fresh data build, since stubdata dll will overwrite the real one." &gt; "$(ProjectDir)stubdatabuilt.txt"</Command>
</PreLinkEvent>
<Link>
- <BaseAddress>0x4ad00000</BaseAddress>
<NoEntryPoint>true</NoEntryPoint>
<SetChecksum>true</SetChecksum>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<TurnOffAssemblyGeneration>true</TurnOffAssemblyGeneration>
+ <!-- Note: stubdata is somewhat odd in that it doesn't suffix the Debug output DLL/LIB with a "d" like common/i18n/etc. -->
+ <OutputFile>..\..\$(IcuBinOutputDir)\icudt65.dll</OutputFile>
+ <ProgramDatabaseFile>.\..\..\$(IcuLibOutputDir)\icudt.pdb</ProgramDatabaseFile>
+ <ImportLibrary>..\..\$(IcuLibOutputDir)\icudt.lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
<!-- Options that are common to all 'Debug' project configurations -->
@@ -85,80 +89,6 @@
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
</ClCompile>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Midl>
- <TypeLibraryName>.\x86\Release\icudt.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <ExceptionHandling>
- </ExceptionHandling>
- <PrecompiledHeaderOutputFile>.\x86\Release\stubdata.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
- </ClCompile>
- <Link>
- <OutputFile>..\..\bin\icudt63.dll</OutputFile>
- <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
- <ProgramDatabaseFile>.\x86\Release\icudt.pdb</ProgramDatabaseFile>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
- <ImportLibrary>..\..\lib\icudt.lib</ImportLibrary>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Midl>
- <TypeLibraryName>.\x86\Debug/icudt.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <PrecompiledHeaderOutputFile>.\x86\Debug/stubdata.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
- </ClCompile>
- <Link>
- <OutputFile>..\..\bin\icudt63.dll</OutputFile>
- <ProgramDatabaseFile>.\x86\Debug/icudt.pdb</ProgramDatabaseFile>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
- <ImportLibrary>..\..\lib\icudt.lib</ImportLibrary>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Midl>
- <TypeLibraryName>.\x64\Release\icudt.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <ExceptionHandling>
- </ExceptionHandling>
- <PrecompiledHeaderOutputFile>.\x64\Release\stubdata.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- </ClCompile>
- <Link>
- <OutputFile>..\..\bin64\icudt63.dll</OutputFile>
- <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
- <ProgramDatabaseFile>.\x64\Release\icudt.pdb</ProgramDatabaseFile>
- <ImportLibrary>..\..\lib64\icudt.lib</ImportLibrary>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Midl>
- <TypeLibraryName>.\x64\Debug/icudt.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <PrecompiledHeaderOutputFile>.\x64\Debug/stubdata.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
- </ClCompile>
- <Link>
- <OutputFile>..\..\bin64\icudt63.dll</OutputFile>
- <ProgramDatabaseFile>.\x64\Debug/icudt.pdb</ProgramDatabaseFile>
- <ImportLibrary>..\..\lib64\icudt.lib</ImportLibrary>
- </Link>
- </ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="stubdata.cpp" />
</ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/test/Makefile.in b/Build/source/libs/icu/icu-src/source/test/Makefile.in
index 7bb5b222829..5affa11703a 100644
--- a/Build/source/libs/icu/icu-src/source/test/Makefile.in
+++ b/Build/source/libs/icu/icu-src/source/test/Makefile.in
@@ -15,6 +15,8 @@ include $(top_builddir)/icudefs.mk
## Build directory information
subdir = test
+@FUZZER_TRUE@FUZZER=fuzzer
+
@ICUIO_TRUE@IOTEST = iotest
# the letest directory depends on layoutex.
@@ -32,7 +34,7 @@ STATUS_FULL = $(shell pwd)/$(STATUS_TMP)
## Files to remove for 'make clean'
CLEANFILES = *~ $(STATUS_TMP)
-SUBDIRS = $(TESTDATA) intltest $(IOTEST) cintltst $(LETEST)
+SUBDIRS = $(TESTDATA) intltest $(IOTEST) cintltst $(LETEST) $(FUZZER)
## List of phony targets
.PHONY : everything all all-local all-recursive install install-local \
@@ -140,6 +142,8 @@ pcheck: $(STATUS_FILES)
@goods=; \
bads=; \
echo "----------------------------------------"; \
+ echo $SUBDIRS \
+ echo "----------------------------------------"; \
for subdir in $(SUBDIRS); do \
if [ -s "$(MYSTATUS_R).$$subdir" ]; then \
echo "-------------" ; \
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/Makefile.in b/Build/source/libs/icu/icu-src/source/test/cintltst/Makefile.in
index 208fb787321..a8038378409 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/Makefile.in
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/Makefile.in
@@ -55,7 +55,7 @@ hpmufn.o tracetst.o reapits.o uregiontest.o ulistfmttest.o\
utexttst.o ucsdetst.o spooftest.o \
cbiditransformtst.o \
cgendtst.o \
-unumberformattertst.o
+unumberformattertst.o uformattedvaluetst.o
DEPS = $(OBJECTS:.o=.d)
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/bocu1tst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/bocu1tst.c
index a8edc18014d..edfe65002a6 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/bocu1tst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/bocu1tst.c
@@ -212,14 +212,14 @@ bocu1TrailToByte[BOCU1_TRAIL_CONTROLS_COUNT]={
* @param d Divisor.
* @param m Output variable for the rest (modulo result).
*/
-#define NEGDIVMOD(n, d, m) { \
+#define NEGDIVMOD(n, d, m) UPRV_BLOCK_MACRO_BEGIN { \
(m)=(n)%(d); \
(n)/=(d); \
if((m)<0) { \
--(n); \
(m)+=(d); \
} \
-}
+} UPRV_BLOCK_MACRO_END
/* State for BOCU-1 decoder function. */
struct Bocu1Rx {
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/callcoll.c b/Build/source/libs/icu/icu-src/source/test/cintltst/callcoll.c
index 1c307d3e855..c7c9067b7ec 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/callcoll.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/callcoll.c
@@ -219,7 +219,7 @@ UBool hasCollationElements(const char *locName) {
UErrorCode status = U_ZERO_ERROR;
- UResourceBundle *loc = ures_open(U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "coll", locName, &status);;
+ UResourceBundle *loc = ures_open(U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "coll", locName, &status);
if(U_SUCCESS(status)) {
status = U_ZERO_ERROR;
@@ -1197,14 +1197,14 @@ TestInvalidRules(){
UParseError parseError;
UErrorCode status = U_ZERO_ERROR;
UCollator* coll=0;
- u_charsToUChars(rulesArr[i],rules,uprv_strlen(rulesArr[i])+1);
- u_charsToUChars(preContextArr[i],preContextExp,uprv_strlen(preContextArr[i])+1);
- u_charsToUChars(postContextArr[i],postContextExp,uprv_strlen(postContextArr[i])+1);
+ u_charsToUChars(rulesArr[i], rules, (int32_t)uprv_strlen(rulesArr[i]) + 1);
+ u_charsToUChars(preContextArr[i], preContextExp, (int32_t)uprv_strlen(preContextArr[i]) + 1);
+ u_charsToUChars(postContextArr[i], postContextExp, (int32_t)uprv_strlen(postContextArr[i]) + 1);
/* clean up stuff in parseError */
- u_memset(parseError.preContext,0x0000,U_PARSE_CONTEXT_LEN);
- u_memset(parseError.postContext,0x0000,U_PARSE_CONTEXT_LEN);
+ u_memset(parseError.preContext, 0x0000, U_PARSE_CONTEXT_LEN);
+ u_memset(parseError.postContext, 0x0000, U_PARSE_CONTEXT_LEN);
/* open the rules and test */
- coll = ucol_openRules(rules,u_strlen(rules),UCOL_OFF,UCOL_DEFAULT_STRENGTH,&parseError,&status);
+ coll = ucol_openRules(rules, u_strlen(rules), UCOL_OFF, UCOL_DEFAULT_STRENGTH, &parseError, &status);
(void)coll; /* Suppress set but not used warning. */
if(u_strcmp(parseError.preContext,preContextExp)!=0){
log_err_status(status, "preContext in UParseError for ucol_openRules does not match: \"%s\"\n",
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/calltest.c b/Build/source/libs/icu/icu-src/source/test/cintltst/calltest.c
index 96ea400a4ec..6c5af0614c1 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/calltest.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/calltest.c
@@ -45,7 +45,6 @@ void addUSpoofTest(TestNode** root);
#if !UCONFIG_NO_FORMATTING
void addGendInfoForTest(TestNode** root);
#endif
-void addUNumberFormatterTest(TestNode** root);
void addAllTests(TestNode** root)
{
@@ -89,6 +88,5 @@ void addAllTests(TestNode** root)
addPUtilTest(root);
#if !UCONFIG_NO_FORMATTING
addGendInfoForTest(root);
- addUNumberFormatterTest(root);
#endif
}
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/capitst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/capitst.c
index d976eeb2ae8..f328b8afd66 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/capitst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/capitst.c
@@ -42,6 +42,7 @@ static void TestBengaliSortKey(void);
static char* U_EXPORT2 ucol_sortKeyToString(const UCollator *coll, const uint8_t *sortkey, char *buffer, uint32_t len) {
+ (void)coll; // suppress compiler warnings about unused variable
uint32_t position = 0;
uint8_t b;
@@ -530,8 +531,8 @@ void TestRuleBasedColl()
}
while (TRUE) {
/* testing with en since thai has its own tailoring */
- uint32_t ce = ucol_next(iter1, &status);
- uint32_t ce2 = ucol_next(iter2, &status);
+ int32_t ce = ucol_next(iter1, &status);
+ int32_t ce2 = ucol_next(iter2, &status);
if(U_FAILURE(status)) {
log_err("ERROR: CollationElement iterator creation failed.: %s\n", myErrorName(status));
return;
@@ -848,7 +849,7 @@ void TestCloneBinary(){
ucol_getSortKey(col, t, -1, k2, l2);
if (strcmp((char *)k1,(char *)k2) != 0){
log_err("ucol_openBinary - new collator should equal to old one\n");
- };
+ }
free(k1);
free(k2);
}
@@ -1544,64 +1545,64 @@ void TestBounds() {
};
struct teststruct tests[] = {
- {"\\u010CAKI MIHALJ" } ,
- {"\\u010CAKI MIHALJ" } ,
- {"\\u010CAKI PIRO\\u0160KA" },
- {"\\u010CABAI ANDRIJA" } ,
- {"\\u010CABAI LAJO\\u0160" } ,
- {"\\u010CABAI MARIJA" } ,
- {"\\u010CABAI STEVAN" } ,
- {"\\u010CABAI STEVAN" } ,
- {"\\u010CABARKAPA BRANKO" } ,
- {"\\u010CABARKAPA MILENKO" } ,
- {"\\u010CABARKAPA MIROSLAV" } ,
- {"\\u010CABARKAPA SIMO" } ,
- {"\\u010CABARKAPA STANKO" } ,
- {"\\u010CABARKAPA TAMARA" } ,
- {"\\u010CABARKAPA TOMA\\u0160" } ,
- {"\\u010CABDARI\\u0106 NIKOLA" } ,
- {"\\u010CABDARI\\u0106 ZORICA" } ,
- {"\\u010CABI NANDOR" } ,
- {"\\u010CABOVI\\u0106 MILAN" } ,
- {"\\u010CABRADI AGNEZIJA" } ,
- {"\\u010CABRADI IVAN" } ,
- {"\\u010CABRADI JELENA" } ,
- {"\\u010CABRADI LJUBICA" } ,
- {"\\u010CABRADI STEVAN" } ,
- {"\\u010CABRDA MARTIN" } ,
- {"\\u010CABRILO BOGDAN" } ,
- {"\\u010CABRILO BRANISLAV" } ,
- {"\\u010CABRILO LAZAR" } ,
- {"\\u010CABRILO LJUBICA" } ,
- {"\\u010CABRILO SPASOJA" } ,
- {"\\u010CADE\\u0160 ZDENKA" } ,
- {"\\u010CADESKI BLAGOJE" } ,
- {"\\u010CADOVSKI VLADIMIR" } ,
- {"\\u010CAGLJEVI\\u0106 TOMA" } ,
- {"\\u010CAGOROVI\\u0106 VLADIMIR" } ,
- {"\\u010CAJA VANKA" } ,
- {"\\u010CAJI\\u0106 BOGOLJUB" } ,
- {"\\u010CAJI\\u0106 BORISLAV" } ,
- {"\\u010CAJI\\u0106 RADOSLAV" } ,
- {"\\u010CAK\\u0160IRAN MILADIN" } ,
- {"\\u010CAKAN EUGEN" } ,
- {"\\u010CAKAN EVGENIJE" } ,
- {"\\u010CAKAN IVAN" } ,
- {"\\u010CAKAN JULIJAN" } ,
- {"\\u010CAKAN MIHAJLO" } ,
- {"\\u010CAKAN STEVAN" } ,
- {"\\u010CAKAN VLADIMIR" } ,
- {"\\u010CAKAN VLADIMIR" } ,
- {"\\u010CAKAN VLADIMIR" } ,
- {"\\u010CAKARA ANA" } ,
- {"\\u010CAKAREVI\\u0106 MOMIR" } ,
- {"\\u010CAKAREVI\\u0106 NEDELJKO" } ,
- {"\\u010CAKI \\u0160ANDOR" } ,
- {"\\u010CAKI AMALIJA" } ,
- {"\\u010CAKI ANDRA\\u0160" } ,
- {"\\u010CAKI LADISLAV" } ,
- {"\\u010CAKI LAJO\\u0160" } ,
- {"\\u010CAKI LASLO" } ,
+ {"\\u010CAKI MIHALJ", {0}},
+ {"\\u010CAKI MIHALJ", {0}},
+ {"\\u010CAKI PIRO\\u0160KA", {0}},
+ {"\\u010CABAI ANDRIJA", {0}},
+ {"\\u010CABAI LAJO\\u0160", {0}},
+ {"\\u010CABAI MARIJA", {0}},
+ {"\\u010CABAI STEVAN", {0}},
+ {"\\u010CABAI STEVAN", {0}},
+ {"\\u010CABARKAPA BRANKO", {0}},
+ {"\\u010CABARKAPA MILENKO", {0}},
+ {"\\u010CABARKAPA MIROSLAV", {0}},
+ {"\\u010CABARKAPA SIMO", {0}},
+ {"\\u010CABARKAPA STANKO", {0}},
+ {"\\u010CABARKAPA TAMARA", {0}},
+ {"\\u010CABARKAPA TOMA\\u0160", {0}},
+ {"\\u010CABDARI\\u0106 NIKOLA", {0}},
+ {"\\u010CABDARI\\u0106 ZORICA", {0}},
+ {"\\u010CABI NANDOR", {0}},
+ {"\\u010CABOVI\\u0106 MILAN", {0}},
+ {"\\u010CABRADI AGNEZIJA", {0}},
+ {"\\u010CABRADI IVAN", {0}},
+ {"\\u010CABRADI JELENA", {0}},
+ {"\\u010CABRADI LJUBICA", {0}},
+ {"\\u010CABRADI STEVAN", {0}},
+ {"\\u010CABRDA MARTIN", {0}},
+ {"\\u010CABRILO BOGDAN", {0}},
+ {"\\u010CABRILO BRANISLAV", {0}},
+ {"\\u010CABRILO LAZAR", {0}},
+ {"\\u010CABRILO LJUBICA", {0}},
+ {"\\u010CABRILO SPASOJA", {0}},
+ {"\\u010CADE\\u0160 ZDENKA", {0}},
+ {"\\u010CADESKI BLAGOJE", {0}},
+ {"\\u010CADOVSKI VLADIMIR", {0}},
+ {"\\u010CAGLJEVI\\u0106 TOMA", {0}},
+ {"\\u010CAGOROVI\\u0106 VLADIMIR", {0}},
+ {"\\u010CAJA VANKA", {0}},
+ {"\\u010CAJI\\u0106 BOGOLJUB", {0}},
+ {"\\u010CAJI\\u0106 BORISLAV", {0}},
+ {"\\u010CAJI\\u0106 RADOSLAV", {0}},
+ {"\\u010CAK\\u0160IRAN MILADIN", {0}},
+ {"\\u010CAKAN EUGEN", {0}},
+ {"\\u010CAKAN EVGENIJE", {0}},
+ {"\\u010CAKAN IVAN", {0}},
+ {"\\u010CAKAN JULIJAN", {0}},
+ {"\\u010CAKAN MIHAJLO", {0}},
+ {"\\u010CAKAN STEVAN", {0}},
+ {"\\u010CAKAN VLADIMIR", {0}},
+ {"\\u010CAKAN VLADIMIR", {0}},
+ {"\\u010CAKAN VLADIMIR", {0}},
+ {"\\u010CAKARA ANA", {0}},
+ {"\\u010CAKAREVI\\u0106 MOMIR", {0}},
+ {"\\u010CAKAREVI\\u0106 NEDELJKO", {0}},
+ {"\\u010CAKI \\u0160ANDOR", {0}},
+ {"\\u010CAKI AMALIJA", {0}},
+ {"\\u010CAKI ANDRA\\u0160", {0}},
+ {"\\u010CAKI LADISLAV", {0}},
+ {"\\u010CAKI LAJO\\u0160", {0}},
+ {"\\u010CAKI LASLO", {0}},
};
@@ -2047,7 +2048,11 @@ static void TestShortString(void)
{"LDE_RDE_KPHONEBOOK_T0024_ZLATN","KPHONEBOOK_LDE", "de@collation=phonebook", U_USING_FALLBACK_WARNING, 0, 0 },
{"LEN_RUS_NO_AS_S4","AS_LROOT_NO_S4", NULL, U_USING_DEFAULT_WARNING, 0, 0 },
- {"LDE_VPHONEBOOK_EO_SI","EO_KPHONEBOOK_LDE_SI", "de@collation=phonebook", U_ZERO_ERROR, 0, 0 },
+ // uloc_canonicalize("de__PHONEBOOK") used to return "de@collation=phonebook"
+ // and we got U_ZERO_ERROR.
+ // Since ICU-20187 "drop support for long-obsolete locale ID variants..."
+ // we actually load the "de__PHONEBOOK" bundle and fall back to "de".
+ {"LDE_VPHONEBOOK_EO_SI","EO_KPHONEBOOK_LDE_SI", "de@collation=phonebook", U_USING_FALLBACK_WARNING, 0, 0 },
{"LDE_Kphonebook","KPHONEBOOK_LDE", "de@collation=phonebook", U_ZERO_ERROR, 0, 0 },
{"Xqde_DE@collation=phonebookq_S3_EX","KPHONEBOOK_LDE", "de@collation=phonebook", U_USING_FALLBACK_WARNING, 0, 0 },
{"LFR_FO", "FO_LROOT", NULL, U_USING_DEFAULT_WARNING, 0, 0 },
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cbiapts.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cbiapts.c
index 92e6c1af4fd..c72de75bcd3 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cbiapts.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cbiapts.c
@@ -35,11 +35,17 @@
#include "cbiapts.h"
#include "cmemory.h"
-#define TEST_ASSERT_SUCCESS(status) {if (U_FAILURE(status)) { \
-log_data_err("Failure at file %s, line %d, error = %s (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status));}}
-
-#define TEST_ASSERT(expr) {if ((expr)==FALSE) { \
-log_data_err("Test Failure at file %s, line %d (Are you missing data?)\n", __FILE__, __LINE__);}}
+#define TEST_ASSERT_SUCCESS(status) UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(status)) { \
+ log_data_err("Failure at file %s, line %d, error = %s (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status)); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define TEST_ASSERT(expr) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expr)==FALSE) { \
+ log_data_err("Test Failure at file %s, line %d (Are you missing data?)\n", __FILE__, __LINE__); \
+ } \
+} UPRV_BLOCK_MACRO_END
#if !UCONFIG_NO_FILE_IO
static void TestBreakIteratorSafeClone(void);
@@ -99,7 +105,7 @@ static UChar* toUChar(const char *src, void **freeHook) {
UErrorCode status = U_ZERO_ERROR;
if (src == NULL) {
return NULL;
- };
+ }
cnv = ucnv_open(NULL, &status);
if(U_FAILURE(status) || cnv == NULL) {
@@ -532,7 +538,7 @@ static UBreakIterator * testOpenRules(char *rules) {
if (U_FAILURE(status)) {
log_data_err("FAIL: ubrk_openRules: ICU Error \"%s\" (Are you missing data?)\n", u_errorName(status));
bi = 0;
- };
+ }
freeToUCharStrings(&strCleanUp);
return bi;
@@ -566,7 +572,7 @@ static void TestBreakIteratorRules() {
ubrk_setText(bi, uData, -1, &status);
pos = ubrk_first(bi);
- for (i=0; i<sizeof(breaks); i++) {
+ for (i=0; i<(int)sizeof(breaks); i++) {
if (pos == i && breaks[i] != '*') {
log_err("FAIL: unexpected break at position %d found\n", pos);
break;
@@ -730,12 +736,15 @@ static void TestBreakIteratorUText(void) {
bi = ubrk_open(UBRK_WORD, "en_US", NULL, 0, &status);
if (U_FAILURE(status)) {
log_err_status(status, "Failure at file %s, line %d, error = %s\n", __FILE__, __LINE__, u_errorName(status));
+ utext_close(ut);
return;
}
ubrk_setUText(bi, ut, &status);
if (U_FAILURE(status)) {
log_err("Failure at file %s, line %d, error = %s\n", __FILE__, __LINE__, u_errorName(status));
+ ubrk_close(bi);
+ utext_close(ut);
return;
}
@@ -1031,7 +1040,7 @@ static const TestBISuppressionsItem testBISuppressionsItems[] = {
{ "de", testSentenceSuppressionsDe, testSentFwdOffsetsDe, testSentRevOffsetsDe },
{ "es@ss=standard", testSentenceSuppressionsEs, testSentSuppFwdOffsetsEs, testSentSuppRevOffsetsEs },
{ "es", testSentenceSuppressionsEs, testSentFwdOffsetsEs, testSentRevOffsetsEs },
- { NULL, NULL, NULL }
+ { NULL, NULL, NULL, NULL }
};
static void TestBreakIteratorSuppressions(void) {
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cbiditst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cbiditst.c
index 2dce7fd226f..e183b913000 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cbiditst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cbiditst.c
@@ -90,7 +90,7 @@ static void testContext(void);
static void doTailTest(void);
static void testBracketOverflow(void);
-static void TestExplicitLevel0();
+static void TestExplicitLevel0(void);
/* new BIDI API */
static void testReorderingMode(void);
@@ -139,7 +139,7 @@ addComplexTest(TestNode** root) {
addTest(root, testGetBaseDirection, "complex/bidi/testGetBaseDirection");
addTest(root, testContext, "complex/bidi/testContext");
addTest(root, testBracketOverflow, "complex/bidi/TestBracketOverflow");
- addTest(root, &TestExplicitLevel0, "complex/bidi/TestExplicitLevel0");
+ addTest(root, TestExplicitLevel0, "complex/bidi/TestExplicitLevel0");
addTest(root, doArabicShapingTest, "complex/arabic-shaping/ArabicShapingTest");
addTest(root, doLamAlefSpecialVLTRArabicShapingTest, "complex/arabic-shaping/lamalef");
@@ -398,9 +398,9 @@ static int u16ToPseudo(const int length, const UChar * input, char * output)
static char * formatLevels(UBiDi *bidi, char *buffer) {
UErrorCode ec = U_ZERO_ERROR;
const UBiDiLevel* gotLevels = ubidi_getLevels(bidi, &ec);
- int len = ubidi_getLength(bidi);
+ int32_t len = ubidi_getLength(bidi);
char c;
- int i, k;
+ int32_t i, k;
if(U_FAILURE(ec)) {
strcpy(buffer, "BAD LEVELS");
@@ -408,7 +408,7 @@ static char * formatLevels(UBiDi *bidi, char *buffer) {
}
for (i=0; i<len; i++) {
k = gotLevels[i];
- if (k >= sizeof(columns))
+ if (k >= (int32_t)sizeof(columns))
c = '+';
else
c = columns[k];
@@ -514,7 +514,7 @@ static UBool matchingPair(UBiDi *bidi, int32_t i, char c1, char c2)
if ((level & 1) == 0) {
return FALSE;
}
- len = strlen(mates1Chars);
+ len = (int)strlen(mates1Chars);
for (k = 0; k < len; k++) {
if ((c1 == mates1Chars[k]) && (c2 == mates2Chars[k])) {
return TRUE;
@@ -1287,11 +1287,12 @@ _testReordering(UBiDi *pBiDi, int testNumber) {
}
}
-#define RETURN_IF_BAD_ERRCODE(x) \
+#define RETURN_IF_BAD_ERRCODE(x) UPRV_BLOCK_MACRO_BEGIN { \
if (U_FAILURE(errorCode)) { \
log_err("\nbad errorCode %d at %s\n", errorCode, (x)); \
return; \
} \
+} UPRV_BLOCK_MACRO_END
#define STRING_TEST_CASE(s) { (s), UPRV_LENGTHOF(s) }
@@ -4126,7 +4127,7 @@ checkResultLength(UBiDi *pBiDi, const char *srcChars, const char *destChars,
const char* option, UBiDiLevel level) {
int32_t actualLen;
if (strcmp(mode, "UBIDI_REORDER_INVERSE_NUMBERS_AS_L") == 0)
- actualLen = strlen(destChars);
+ actualLen = (int32_t)strlen(destChars);
else
actualLen = ubidi_getResultLength(pBiDi);
if (actualLen != destLen) {
@@ -4206,7 +4207,7 @@ testReorderRunsOnly(void) {
ubidi_setReorderingOptions(pBiDi, option==0 ? UBIDI_OPTION_REMOVE_CONTROLS
: UBIDI_OPTION_INSERT_MARKS);
for (i = 0, nCases = UPRV_LENGTHOF(testCases); i < nCases; i++) {
- srcLen = strlen(testCases[i].textIn);
+ srcLen = (int32_t)strlen(testCases[i].textIn);
pseudoToU16(srcLen, testCases[i].textIn, src);
for(j = 0; j < 2; j++) {
log_verbose("Now doing test for option %d, case %d, level %d\n",
@@ -4292,7 +4293,7 @@ testReorderingMode(void) {
for (tc = 0; tc < TC_COUNT; tc++) {
const char *srcChars = textIn[tc];
- srcLen = strlen(srcChars);
+ srcLen = (int32_t)strlen(srcChars);
pseudoToU16(srcLen, srcChars, src);
for (mode = 0; mode < MODES_COUNT; mode++) {
@@ -4630,7 +4631,7 @@ static char * formatMap(const int32_t * map, int len, char * buffer)
k = map[i];
if (k < 0)
c = '-';
- else if (k >= sizeof(columns))
+ else if (k >= (int32_t)sizeof(columns))
c = '+';
else
c = columns[k];
@@ -4864,9 +4865,9 @@ testContext(void) {
for (tc = 0; tc < CONTEXT_COUNT; tc++) {
cc = contextData[tc];
- proLength = strlen(cc.prologue);
+ proLength = (int32_t)strlen(cc.prologue);
pseudoToU16(proLength, cc.prologue, prologue);
- epiLength = strlen(cc.epilogue);
+ epiLength = (int32_t)strlen(cc.epilogue);
pseudoToU16(epiLength, cc.epilogue, epilogue);
/* in the call below, prologue and epilogue are swapped to show
that the next call will override this call */
@@ -4875,7 +4876,7 @@ testContext(void) {
testOK &= assertSuccessful("swapped ubidi_setContext", &rc);
ubidi_setContext(pBiDi, prologue, -1, epilogue, -1, &rc);
testOK &= assertSuccessful("regular ubidi_setContext", &rc);
- srcLen = strlen(cc.source);
+ srcLen = (int32_t)strlen(cc.source);
pseudoToU16(srcLen, cc.source, src);
ubidi_setPara(pBiDi, src, srcLen, cc.paraLevel, NULL, &rc);
testOK &= assertSuccessful("ubidi_setPara", &rc);
@@ -4917,7 +4918,7 @@ testBracketOverflow(void) {
int32_t len;
bidi = ubidi_open();
- len = uprv_strlen(TEXT);
+ len = (int32_t)uprv_strlen(TEXT);
pseudoToU16(len, TEXT, src);
ubidi_setPara(bidi, src, len, UBIDI_DEFAULT_LTR , NULL, &status);
if (U_FAILURE(status)) {
@@ -4927,7 +4928,7 @@ testBracketOverflow(void) {
ubidi_close(bidi);
}
-static void TestExplicitLevel0() {
+static void TestExplicitLevel0(void) {
// The following used to fail with an error, see ICU ticket #12922.
static const UChar text[2] = { 0x202d, 0x05d0 };
static UBiDiLevel embeddings[2] = { 0, 0 };
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/ccaltst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/ccaltst.c
index c71c4da1433..44cf712e0fe 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/ccaltst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/ccaltst.c
@@ -40,6 +40,7 @@ void TestGetTZTransition(void);
void TestGetWindowsTimeZoneID(void);
void TestGetTimeZoneIDByWindowsID(void);
+void TestJpnCalAddSetNextEra(void);
void addCalTest(TestNode** root);
@@ -62,6 +63,7 @@ void addCalTest(TestNode** root)
addTest(root, &TestGetTZTransition, "tsformat/ccaltst/TestGetTZTransition");
addTest(root, &TestGetWindowsTimeZoneID, "tsformat/ccaltst/TestGetWindowsTimeZoneID");
addTest(root, &TestGetTimeZoneIDByWindowsID, "tsformat/ccaltst/TestGetTimeZoneIDByWindowsID");
+ addTest(root, &TestJpnCalAddSetNextEra, "tsformat/ccaltst/TestJpnCalAddSetNextEra");
}
/* "GMT" */
@@ -112,7 +114,8 @@ static void TestCalendar()
UChar *result = 0;
int32_t resultlength, resultlengthneeded;
char tempMsgBuf[1024]; // u_austrcpy() of some formatted dates & times.
- UChar zone1[32], zone2[32];
+ char tempMsgBuf2[256]; // u_austrcpy() of some formatted dates & times.
+ UChar zone1[64], zone2[64];
const char *tzver = 0;
UChar canonicalID[64];
UBool isSystemID = FALSE;
@@ -226,10 +229,10 @@ static void TestCalendar()
log_err("FAIL: ucal_getDSTSavings(PST) => %d, expect %d\n", i, 1*60*60*1000);
}
- /*Test ucal_set/getDefaultTimeZone*/
+ /*Test ucal_set/getDefaultTimeZone and ucal_getHostTimeZone */
status = U_ZERO_ERROR;
i = ucal_getDefaultTimeZone(zone1, UPRV_LENGTHOF(zone1), &status);
- if (U_FAILURE(status)) {
+ if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING) {
log_err("FAIL: ucal_getDefaultTimeZone() => %s\n",
u_errorName(status));
} else {
@@ -245,6 +248,17 @@ static void TestCalendar()
} else {
if (u_strcmp(zone2, EUROPE_PARIS) != 0) {
log_data_err("FAIL: ucal_getDefaultTimeZone() did not return Europe/Paris (Are you missing data?)\n");
+ } else {
+ // Redetect the host timezone, it should be the same as zone1 even though ICU's default timezone has been changed.
+ i = ucal_getHostTimeZone(zone2, UPRV_LENGTHOF(zone2), &status);
+ if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING) {
+ log_err("FAIL: ucal_getHostTimeZone() => %s\n", u_errorName(status));
+ } else {
+ if (u_strcmp(zone1, zone2) != 0) {
+ log_err("FAIL: ucal_getHostTimeZone() should give the same host timezone even if the default changed. (Got '%s', Expected '%s').\n",
+ u_austrcpy(tempMsgBuf, zone2), u_austrcpy(tempMsgBuf2, zone1));
+ }
+ }
}
}
}
@@ -344,6 +358,11 @@ static void TestCalendar()
datdef=udat_open(UDAT_FULL,UDAT_FULL ,NULL, NULL, 0,NULL,0,&status);
if(U_FAILURE(status)){
log_data_err("FAIL: error in creating the dateformat : %s (Are you missing data?)\n", u_errorName(status));
+ ucal_close(caldef2);
+ ucal_close(calfr);
+ ucal_close(calit);
+ ucal_close(calfrclone);
+ ucal_close(caldef);
return;
}
log_verbose("PASS: The current date and time fetched is %s\n", u_austrcpy(tempMsgBuf, myDateFormat(datdef, now)) );
@@ -523,6 +542,10 @@ static void TestGetSetDateAPI()
if(U_FAILURE(status))
{
log_data_err("error in creating the dateformat : %s (Are you missing data?)\n", u_errorName(status));
+ ucal_close(caldef);
+ ucal_close(caldef2);
+ ucal_close(caldef3);
+ udat_close(datdef);
return;
}
@@ -933,7 +956,7 @@ static void TestAddRollExtensive()
u_uastrcpy(tzID, "PST");
/*open the calendar used */
- cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_GREGORIAN, &status);;
+ cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_GREGORIAN, &status);
if (U_FAILURE(status)) {
log_data_err("ucal_open() failed : %s - (Are you missing data?)\n", u_errorName(status));
return;
@@ -1121,7 +1144,7 @@ static void TestGetLimits()
u_uastrcpy(tzID, "PST");
/*open the calendar used */
- cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_GREGORIAN, &status);;
+ cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_GREGORIAN, &status);
if (U_FAILURE(status)) {
log_data_err("ucal_open() for gregorian calendar failed in TestGetLimits: %s - (Are you missing data?)\n", u_errorName(status));
return;
@@ -1219,7 +1242,7 @@ static void TestDOWProgression()
char tempMsgBuf[256];
u_strcpy(tzID, fgGMTID);
/*open the calendar used */
- cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_TRADITIONAL, &status);;
+ cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_TRADITIONAL, &status);
if (U_FAILURE(status)) {
log_data_err("ucal_open failed: %s - (Are you missing data?)\n", u_errorName(status));
return;
@@ -1236,30 +1259,33 @@ static void TestDOWProgression()
log_verbose("\nTesting the DOW progression\n");
initialDOW = ucal_get(cal, UCAL_DAY_OF_WEEK, &status);
- if (U_FAILURE(status)) { log_data_err("ucal_get() failed: %s (Are you missing data?)\n", u_errorName(status) ); return; }
- newDOW = initialDOW;
- do {
- DOW = newDOW;
- log_verbose("DOW = %d...\n", DOW);
- date1=ucal_getMillis(cal, &status);
- if(U_FAILURE(status)){ log_err("ucal_getMiilis() failed: %s\n", u_errorName(status)); return;}
- log_verbose("%s\n", u_austrcpy(tempMsgBuf, myDateFormat(datfor, date1)));
-
- ucal_add(cal,UCAL_DAY_OF_WEEK, delta, &status);
- if (U_FAILURE(status)) { log_err("ucal_add() failed: %s\n", u_errorName(status)); return; }
-
- newDOW = ucal_get(cal, UCAL_DAY_OF_WEEK, &status);
- if (U_FAILURE(status)) { log_err("ucal_get() failed: %s\n", u_errorName(status)); return; }
- expectedDOW = 1 + (DOW + delta - 1) % 7;
- date1=ucal_getMillis(cal, &status);
- if(U_FAILURE(status)){ log_err("ucal_getMiilis() failed: %s\n", u_errorName(status)); return;}
- if (newDOW != expectedDOW) {
- log_err("Day of week should be %d instead of %d on %s", expectedDOW, newDOW,
- u_austrcpy(tempMsgBuf, myDateFormat(datfor, date1)) );
- return;
+ if (U_FAILURE(status)) {
+ log_data_err("ucal_get() failed: %s (Are you missing data?)\n", u_errorName(status) );
+ } else {
+ newDOW = initialDOW;
+ do {
+ DOW = newDOW;
+ log_verbose("DOW = %d...\n", DOW);
+ date1=ucal_getMillis(cal, &status);
+ if(U_FAILURE(status)){ log_err("ucal_getMiilis() failed: %s\n", u_errorName(status)); break;}
+ log_verbose("%s\n", u_austrcpy(tempMsgBuf, myDateFormat(datfor, date1)));
+
+ ucal_add(cal,UCAL_DAY_OF_WEEK, delta, &status);
+ if (U_FAILURE(status)) { log_err("ucal_add() failed: %s\n", u_errorName(status)); break; }
+
+ newDOW = ucal_get(cal, UCAL_DAY_OF_WEEK, &status);
+ if (U_FAILURE(status)) { log_err("ucal_get() failed: %s\n", u_errorName(status)); break; }
+ expectedDOW = 1 + (DOW + delta - 1) % 7;
+ date1=ucal_getMillis(cal, &status);
+ if(U_FAILURE(status)){ log_err("ucal_getMiilis() failed: %s\n", u_errorName(status)); break;}
+ if (newDOW != expectedDOW) {
+ log_err("Day of week should be %d instead of %d on %s", expectedDOW, newDOW,
+ u_austrcpy(tempMsgBuf, myDateFormat(datfor, date1)) );
+ break;
+ }
}
+ while (newDOW != initialDOW);
}
- while (newDOW != initialDOW);
ucal_close(cal);
udat_close(datfor);
@@ -1292,16 +1318,16 @@ static void testZones(int32_t yr, int32_t mo, int32_t dt, int32_t hr, int32_t mn
char tempMsgBuf[256];
u_strcpy(tzID, fgGMTID);
- gmtcal=ucal_open(tzID, 3, "en_US", UCAL_TRADITIONAL, &status);;
+ gmtcal=ucal_open(tzID, 3, "en_US", UCAL_TRADITIONAL, &status);
if (U_FAILURE(status)) {
log_data_err("ucal_open failed: %s - (Are you missing data?)\n", u_errorName(status));
- return;
+ goto cleanup;
}
u_uastrcpy(tzID, "PST");
cal = ucal_open(tzID, 3, "en_US", UCAL_TRADITIONAL, &status);
if (U_FAILURE(status)) {
log_err("ucal_open failed: %s\n", u_errorName(status));
- return;
+ goto cleanup;
}
datfor=udat_open(UDAT_MEDIUM,UDAT_MEDIUM ,NULL, fgGMTID,-1,NULL, 0, &status);
@@ -1312,13 +1338,13 @@ static void testZones(int32_t yr, int32_t mo, int32_t dt, int32_t hr, int32_t mn
ucal_setDateTime(gmtcal, yr, mo - 1, dt, hr, mn, sc, &status);
if (U_FAILURE(status)) {
log_data_err("ucal_setDateTime failed: %s (Are you missing data?)\n", u_errorName(status));
- return;
+ goto cleanup;
}
ucal_set(gmtcal, UCAL_MILLISECOND, 0);
date1 = ucal_getMillis(gmtcal, &status);
if (U_FAILURE(status)) {
log_err("ucal_getMillis failed: %s\n", u_errorName(status));
- return;
+ goto cleanup;
}
log_verbose("date = %s\n", u_austrcpy(tempMsgBuf, myDateFormat(datfor, date1)) );
@@ -1326,7 +1352,7 @@ static void testZones(int32_t yr, int32_t mo, int32_t dt, int32_t hr, int32_t mn
ucal_setMillis(cal, date1, &status);
if (U_FAILURE(status)) {
log_err("ucal_setMillis() failed: %s\n", u_errorName(status));
- return;
+ goto cleanup;
}
offset = ucal_get(cal, UCAL_ZONE_OFFSET, &status);
@@ -1334,7 +1360,7 @@ static void testZones(int32_t yr, int32_t mo, int32_t dt, int32_t hr, int32_t mn
if (U_FAILURE(status)) {
log_err("ucal_get() failed: %s\n", u_errorName(status));
- return;
+ goto cleanup;
}
temp=(double)((double)offset / 1000.0 / 60.0 / 60.0);
/*printf("offset for %s %f hr\n", austrdup(myDateFormat(datfor, date1)), temp);*/
@@ -1345,7 +1371,7 @@ static void testZones(int32_t yr, int32_t mo, int32_t dt, int32_t hr, int32_t mn
ucal_get(cal, UCAL_MILLISECOND, &status) - offset;
if (U_FAILURE(status)) {
log_err("ucal_get() failed: %s\n", u_errorName(status));
- return;
+ goto cleanup;
}
expected = ((hr * 60 + mn) * 60 + sc) * 1000;
@@ -1355,6 +1381,8 @@ static void testZones(int32_t yr, int32_t mo, int32_t dt, int32_t hr, int32_t mn
}
else
log_verbose("PASS: the offset between local and GMT is correct\n");
+
+cleanup:
ucal_close(gmtcal);
ucal_close(cal);
udat_close(datfor);
@@ -1629,7 +1657,7 @@ static void TestGetKeywordValuesForLocale() {
ALLList = ulist_getListFromEnum(ALL);
for (j = 0; j < size; j++) {
if ((value = uenum_next(all, &valueLength, &status)) != NULL && U_SUCCESS(status)) {
- if (!ulist_containsString(ALLList, value, uprv_strlen(value))) {
+ if (!ulist_containsString(ALLList, value, (int32_t)uprv_strlen(value))) {
log_err("Locale %s have %s not in ALL\n", loc, value);
matchAll = FALSE;
break;
@@ -2377,6 +2405,11 @@ static const UChar tzTronto[] = /* America/Toronto */
static const UChar sBogus[] = /* Bogus */
{0x42,0x6F,0x67,0x75,0x73,0x00};
+#ifndef U_DEBUG
+static const UChar sBogusWithVariantCharacters[] = /* Bogus with Variant characters: Hèℓℓô Wôřℓδ */
+ {0x48,0xE8,0x2113,0x2113,0xF4,0x20,0x57,0xF4,0x159,0x2113,0x3B4,0x00};
+#endif
+
void TestGetWindowsTimeZoneID() {
UErrorCode status;
UChar winID[64];
@@ -2443,7 +2476,6 @@ void TestGetTimeZoneIDByWindowsID() {
log_err("FAIL: TZ ID for Eastern Standard Time - CA\n");
}
}
-
{
status = U_ZERO_ERROR;
len = ucal_getTimeZoneIDForWindowsID(sBogus, -1, NULL, tzID, UPRV_LENGTHOF(tzID), &status);
@@ -2453,7 +2485,62 @@ void TestGetTimeZoneIDByWindowsID() {
log_err("FAIL: TZ ID for Bogus\n");
}
}
+#ifndef U_DEBUG
+ // This test is only for release mode because it will cause an assertion failure in debug builds.
+ // We don't check the API result for errors as the only purpose of this test is to ensure that
+ // input variant characters don't cause abort() to be called and/or that ICU doesn't crash.
+ {
+ status = U_ZERO_ERROR;
+ len = ucal_getTimeZoneIDForWindowsID(sBogusWithVariantCharacters, -1, NULL, tzID, UPRV_LENGTHOF(tzID), &status);
+ }
+#endif
}
+// The following currently assumes that Reiwa is the last known/valid era.
+// Filed ICU-20551 to generalize this when we have more time...
+void TestJpnCalAddSetNextEra() {
+ UErrorCode status = U_ZERO_ERROR;
+ UCalendar *jCal = ucal_open(NULL, 0, "ja_JP@calendar=japanese", UCAL_DEFAULT, &status);
+ if ( U_FAILURE(status) ) {
+ log_data_err("FAIL: ucal_open for ja_JP@calendar=japanese, status %s\n", u_errorName(status));
+ } else {
+ ucal_clear(jCal); // This sets to 1970, in Showa
+ int32_t sEra = ucal_get(jCal, UCAL_ERA, &status); // Don't assume era number for Showa
+ if ( U_FAILURE(status) ) {
+ log_data_err("FAIL: ucal_get ERA for Showa, status %s\n", u_errorName(status));
+ } else {
+ int32_t iEra, eYear;
+ int32_t startYears[4] = { 1926, 1989, 2019, 0 }; // start years for Showa, Heisei, Reiwa; 0 marks invalid era
+ for (iEra = 1; iEra < 3; iEra++) {
+ status = U_ZERO_ERROR;
+ ucal_clear(jCal);
+ ucal_set(jCal, UCAL_ERA, sEra+iEra);
+ eYear = ucal_get(jCal, UCAL_EXTENDED_YEAR, &status);
+ if ( U_FAILURE(status) ) {
+ log_err("FAIL: set %d, ucal_get EXTENDED_YEAR, status %s\n", iEra, u_errorName(status));
+ } else if (eYear != startYears[iEra]) {
+ log_err("ERROR: set %d, expected start year %d but get %d\n", iEra, startYears[iEra], eYear);
+ } else {
+ ucal_add(jCal, UCAL_ERA, 1, &status);
+ if ( U_FAILURE(status) ) {
+ log_err("FAIL: set %d, ucal_add ERA 1, status %s\n", iEra, u_errorName(status));
+ } else {
+ eYear = ucal_get(jCal, UCAL_EXTENDED_YEAR, &status);
+ if ( U_FAILURE(status) ) {
+ log_err("FAIL: set %d then add ERA 1, ucal_get EXTENDED_YEAR, status %s\n", iEra, u_errorName(status));
+ } else {
+ // If this is the last valid era, we expect adding an era to pin to the current era
+ int32_t nextEraStart = (startYears[iEra+1] == 0)? startYears[iEra]: startYears[iEra+1];
+ if (eYear != nextEraStart) {
+ log_err("ERROR: set %d then add ERA 1, expected start year %d but get %d\n", iEra, nextEraStart, eYear);
+ }
+ }
+ }
+ }
+ }
+ }
+ ucal_close(jCal);
+ }
+}
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/ccapitst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/ccapitst.c
index b5eb5f32e68..73663f12459 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/ccapitst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/ccapitst.c
@@ -35,6 +35,9 @@
#define MAX_FILE_LEN 1024*20
#define UCS_FILE_NAME_SIZE 512
+/* Similar to C++ alignof(type) */
+#define ALIGNOF(type) offsetof (struct { char c; type member; }, member)
+
/*returns an action other than the one provided*/
#if !UCONFIG_NO_LEGACY_CONVERSION
static UConverterFromUCallback otherUnicodeAction(UConverterFromUCallback MIA);
@@ -852,7 +855,7 @@ static void TestConvert()
/*Reads in the file*/
- while(!feof(ucs_file_in)&&(i+=fread(ucs_file_buffer+i, sizeof(UChar), 1, ucs_file_in)))
+ while(!feof(ucs_file_in)&&(i+=(int32_t)fread(ucs_file_buffer+i, sizeof(UChar), 1, ucs_file_in)))
{
myUChar = ucs_file_buffer[i-1];
@@ -895,7 +898,7 @@ static void TestConvert()
NULL,
targetcapacity2,
output_cp_buffer,
- strlen(output_cp_buffer),
+ (int32_t)strlen(output_cp_buffer),
&err);
/*if there is an buffer overflow then trap the values and pass them and make the actual call*/
@@ -907,7 +910,7 @@ static void TestConvert()
uchar2,
targetsize+1,
output_cp_buffer,
- strlen(output_cp_buffer),
+ (int32_t)strlen(output_cp_buffer),
&err);
if(U_FAILURE(err))
@@ -947,12 +950,12 @@ static void TestConvert()
log_err("\nFAILURE: ucnv_fromUChars with targetLength 0 is expected to fail and throw U_BUFFER_OVERFLOW_ERROR\n");
}
/*toUChars with error conditions*/
- targetsize = ucnv_toUChars(myConverter, uchar2, targetsize, output_cp_buffer, strlen(output_cp_buffer), &err);
+ targetsize = ucnv_toUChars(myConverter, uchar2, targetsize, output_cp_buffer, (int32_t)strlen(output_cp_buffer), &err);
if(targetsize != 0){
log_err("\nFAILURE: ucnv_toUChars with err != U_ZERO_ERROR is expected to fail and return 0\n");
}
err=U_ZERO_ERROR;
- targetsize = ucnv_toUChars(myConverter, uchar2, -1, output_cp_buffer, strlen(output_cp_buffer), &err);
+ targetsize = ucnv_toUChars(myConverter, uchar2, -1, output_cp_buffer, (int32_t)strlen(output_cp_buffer), &err);
if(targetsize != 0 || err != U_ILLEGAL_ARGUMENT_ERROR){
log_err("\nFAILURE: ucnv_toUChars with targetsize < 0 is expected to throw U_ILLEGAL_ARGUMENT_ERROR and return 0\n");
}
@@ -962,7 +965,7 @@ static void TestConvert()
log_err("\nFAILURE: ucnv_toUChars with sourceLength 0 is expected to return 0\n");
}
targetcapacity2=0;
- targetsize = ucnv_toUChars(myConverter, NULL, targetcapacity2, output_cp_buffer, strlen(output_cp_buffer), &err);
+ targetsize = ucnv_toUChars(myConverter, NULL, targetcapacity2, output_cp_buffer, (int32_t)strlen(output_cp_buffer), &err);
if (err != U_STRING_NOT_TERMINATED_WARNING) {
log_err("\nFAILURE: ucnv_toUChars(targetLength)->%s instead of U_STRING_NOT_TERMINATED_WARNING\n",
u_errorName(err));
@@ -1367,6 +1370,11 @@ static void TSCC_fromU(const void *context,
UConverterCallbackReason reason,
UErrorCode * err)
{
+ // suppress compiler warnings about unused variables
+ (void)codeUnits;
+ (void)length;
+ (void)codePoint;
+
TSCCContext *ctx = (TSCCContext*)context;
UConverterFromUCallback junkFrom;
@@ -1413,6 +1421,10 @@ static void TSCC_toU(const void *context,
UConverterCallbackReason reason,
UErrorCode * err)
{
+ // suppress compiler warnings about unused variables
+ (void)codeUnits;
+ (void)length;
+
TSCCContext *ctx = (TSCCContext*)context;
UConverterToUCallback junkFrom;
@@ -1821,7 +1833,7 @@ static void TestConvertSafeClone()
/* close the original immediately to make sure that the clone works by itself */
ucnv_close(cnv);
- if( actualSizes[idx] <= (bufferSizes[j] - (int32_t)sizeof(UAlignedMemory)) &&
+ if( actualSizes[idx] <= (bufferSizes[j] - (int32_t)ALIGNOF(UConverter)) &&
err == U_SAFECLONE_ALLOCATED_WARNING
) {
log_err("ucnv_safeClone(%s) did a heap clone although the buffer was large enough\n", names[idx]);
@@ -2194,10 +2206,10 @@ convertExStreaming(UConverter *srcCnv, UConverter *targetCnv,
if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
/* continue converting another chunk */
errorCode=U_ZERO_ERROR;
- if(targetLength+chunkSize<=sizeof(targetBuffer)) {
+ if(targetLength+chunkSize<=(int32_t)sizeof(targetBuffer)) {
targetLimit=target+chunkSize;
} else {
- targetLimit=targetBuffer+sizeof(targetBuffer);
+ targetLimit=targetBuffer+(int32_t)sizeof(targetBuffer);
}
} else if(U_FAILURE(errorCode)) {
/* failure */
@@ -2519,6 +2531,12 @@ static void testFromTruncatedUTF8(UConverter *utf8Cnv, UConverter *cnv, const ch
char charUTF8[4], int32_t charUTF8Length,
char char0[8], int32_t char0Length,
char char1[8], int32_t char1Length) {
+ // suppress compiler warnings about unused variables
+ (void)char0;
+ (void)char0Length;
+ (void)char1;
+ (void)char1Length;
+
char utf8[16];
int32_t utf8Length;
@@ -2545,7 +2563,7 @@ static void testFromTruncatedUTF8(UConverter *utf8Cnv, UConverter *cnv, const ch
for(i=0; i<UPRV_LENGTHOF(badUTF8); ++i) {
/* truncated sequence? */
- int32_t length=strlen(badUTF8[i]);
+ int32_t length = (int32_t)strlen(badUTF8[i]);
if(!isOneTruncatedUTF8(badUTF8[i], length)) {
continue;
}
@@ -2608,7 +2626,7 @@ static void testFromBadUTF8(UConverter *utf8Cnv, UConverter *cnv, const char *co
expectLength=char0Length;
for(i=0; i<UPRV_LENGTHOF(badUTF8); ++i) {
- int32_t length=strlen(badUTF8[i]);
+ int32_t length = (int32_t)strlen(badUTF8[i]);
memcpy(utf8+utf8Length, badUTF8[i], length);
utf8Length+=length;
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cdateintervalformattest.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cdateintervalformattest.c
index 3c3326c7704..d8a8066824a 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cdateintervalformattest.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cdateintervalformattest.c
@@ -16,9 +16,11 @@
#include "unicode/ustring.h"
#include "cintltst.h"
#include "cmemory.h"
+#include "cformtst.h"
static void TestDateIntervalFormat(void);
static void TestFPos_SkelWithSeconds(void);
+static void TestFormatToResult(void);
void addDateIntervalFormatTest(TestNode** root);
@@ -28,6 +30,7 @@ void addDateIntervalFormatTest(TestNode** root)
{
TESTCASE(TestDateIntervalFormat);
TESTCASE(TestFPos_SkelWithSeconds);
+ TESTCASE(TestFormatToResult);
}
static const char tzUSPacific[] = "US/Pacific";
@@ -316,4 +319,65 @@ static void TestFPos_SkelWithSeconds()
}
}
+static void TestFormatToResult() {
+ UErrorCode ec = U_ZERO_ERROR;
+ UDateIntervalFormat* fmt = udtitvfmt_open("de", u"dMMMMyHHmm", -1, zoneGMT, -1, &ec);
+ UFormattedDateInterval* fdi = udtitvfmt_openResult(&ec);
+ assertSuccess("Opening", &ec);
+
+ {
+ const char* message = "Field position test 1";
+ const UChar* expectedString = u"27. September 2010, 15:00 – 2. März 2011, 18:30";
+ udtitvfmt_formatToResult(fmt, fdi, Date201009270800, Date201103021030, &ec);
+ assertSuccess("Formatting", &ec);
+ static const UFieldPositionWithCategory expectedFieldPositions[] = {
+ // category, field, begin index, end index
+ {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 0, 0, 25},
+ {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 0, 2},
+ {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 4, 13},
+ {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 14, 18},
+ {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 20, 22},
+ {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 23, 25},
+ {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 1, 28, 47},
+ {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 28, 29},
+ {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 31, 35},
+ {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 36, 40},
+ {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 42, 44},
+ {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 45, 47}};
+ checkMixedFormattedValue(
+ message,
+ udtitvfmt_resultAsValue(fdi, &ec),
+ expectedString,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+ {
+ const char* message = "Field position test 1";
+ const UChar* expectedString = u"27. September 2010, 15:00–22:00 Uhr";
+ udtitvfmt_formatToResult(fmt, fdi, Date201009270800, Date201009270800 + 7*_HOUR, &ec);
+ assertSuccess("Formatting", &ec);
+ static const UFieldPositionWithCategory expectedFieldPositions[] = {
+ // category, field, begin index, end index
+ {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 0, 2},
+ {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 4, 13},
+ {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 14, 18},
+ {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 0, 20, 25},
+ {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 20, 22},
+ {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 23, 25},
+ {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 1, 26, 31},
+ {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 26, 28},
+ {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 29, 31},
+ {UFIELD_CATEGORY_DATE, UDAT_AM_PM_FIELD, 32, 35}};
+ checkMixedFormattedValue(
+ message,
+ udtitvfmt_resultAsValue(fdi, &ec),
+ expectedString,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ udtitvfmt_close(fmt);
+ udtitvfmt_closeResult(fdi);
+}
+
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cdattst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cdattst.c
index acdfa6c1f18..d5e3ba2ccd9 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cdattst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cdattst.c
@@ -42,6 +42,7 @@ static void TestContext(void);
static void TestCalendarDateParse(void);
static void TestParseErrorReturnValue(void);
static void TestFormatForFields(void);
+static void TestForceGannenNumbering(void);
void addDateForTest(TestNode** root);
@@ -61,6 +62,7 @@ void addDateForTest(TestNode** root)
TESTCASE(TestOverrideNumberFormat);
TESTCASE(TestParseErrorReturnValue);
TESTCASE(TestFormatForFields);
+ TESTCASE(TestForceGannenNumbering);
}
/* Testing the DateFormat API */
static void TestDateFormat()
@@ -551,7 +553,7 @@ static void TestRelativeDateFormat()
strPtr = u_strstr(strDateTime, minutesStr);
if ( strPtr != NULL ) {
- int32_t beginIndex = strPtr - strDateTime;
+ int32_t beginIndex = (int32_t)(strPtr - strDateTime);
if ( fp.beginIndex != beginIndex ) {
log_err("UFieldPosition beginIndex %d, expected %d, in udat_format timeStyle SHORT dateStyle (%d | UDAT_RELATIVE)\n", fp.beginIndex, beginIndex, *stylePtr );
}
@@ -1058,7 +1060,7 @@ static void VerifygetSymbols(UDateFormat* datfor, UDateFormatSymbolType type, in
UErrorCode status = U_ZERO_ERROR;
UChar *result=NULL;
int32_t resultlength, resultlengthout;
- int32_t patternSize = strlen(expected) + 1;
+ int32_t patternSize = (int32_t)strlen(expected) + 1;
pattern=(UChar*)malloc(sizeof(UChar) * patternSize);
u_unescape(expected, pattern, patternSize);
@@ -1093,7 +1095,7 @@ static void VerifysetSymbols(UDateFormat* datfor, UDateFormatSymbolType type, in
UChar *value=NULL;
int32_t resultlength, resultlengthout;
UErrorCode status = U_ZERO_ERROR;
- int32_t valueLen, valueSize = strlen(expected) + 1;
+ int32_t valueLen, valueSize = (int32_t)strlen(expected) + 1;
value=(UChar*)malloc(sizeof(UChar) * valueSize);
valueLen = u_unescape(expected, value, valueSize);
@@ -1634,6 +1636,7 @@ static void TestOverrideNumberFormat(void) {
// loop 5 times to check getter/setter
for (i = 0; i < 5; i++){
+ status = U_ZERO_ERROR;
UNumberFormat* overrideFmt;
overrideFmt = unum_open(UNUM_DEFAULT, NULL, 0, localeString, NULL, &status);
assertSuccess("unum_open()", &status);
@@ -1647,15 +1650,19 @@ static void TestOverrideNumberFormat(void) {
}
}
{
+ status = U_ZERO_ERROR;
UNumberFormat* overrideFmt;
overrideFmt = unum_open(UNUM_DEFAULT, NULL, 0, localeString, NULL, &status);
assertSuccess("unum_open()", &status);
- udat_setNumberFormat(fmt, overrideFmt); // test the same override NF will not crash
+ if (U_SUCCESS(status)) {
+ udat_setNumberFormat(fmt, overrideFmt); // test the same override NF will not crash
+ }
unum_close(overrideFmt);
}
udat_close(fmt);
for (i=0; i<UPRV_LENGTHOF(overrideNumberFormat); i++){
+ status = U_ZERO_ERROR;
UChar ubuf[kUbufMax];
UDateFormat* fmt2;
UNumberFormat* overrideFmt2;
@@ -1666,6 +1673,10 @@ static void TestOverrideNumberFormat(void) {
overrideFmt2 = unum_open(UNUM_DEFAULT, NULL, 0, localeString, NULL, &status);
assertSuccess("unum_open() in loop", &status);
+ if (U_FAILURE(status)) {
+ continue;
+ }
+
u_uastrcpy(fields, overrideNumberFormat[i][0]);
u_unescape(overrideNumberFormat[i][1], expected, UPRV_LENGTHOF(expected));
@@ -1858,4 +1869,40 @@ static void TestFormatForFields(void) {
}
}
+static void TestForceGannenNumbering(void) {
+ UErrorCode status;
+ const char* locID = "ja_JP@calendar=japanese";
+ UDate refDate = 600336000000.0; // 1989 Jan 9 Monday = Heisei 1
+ const UChar* testSkeleton = u"yMMMd";
+
+ // Test Gannen year forcing
+ status = U_ZERO_ERROR;
+ UDateTimePatternGenerator* dtpgen = udatpg_open(locID, &status);
+ if (U_FAILURE(status)) {
+ log_data_err("Fail in udatpg_open locale %s: %s", locID, u_errorName(status));
+ } else {
+ UChar pattern[kUbufMax];
+ int32_t patlen = udatpg_getBestPattern(dtpgen, testSkeleton, -1, pattern, kUbufMax, &status);
+ if (U_FAILURE(status)) {
+ log_data_err("Fail in udatpg_getBestPattern locale %s: %s", locID, u_errorName(status));
+ } else {
+ UDateFormat *testFmt = udat_open(UDAT_PATTERN, UDAT_PATTERN, locID, NULL, 0, pattern, patlen, &status);
+ if (U_FAILURE(status)) {
+ log_data_err("Fail in udat_open locale %s: %s", locID, u_errorName(status));
+ } else {
+ UChar testString[kUbufMax];
+ int32_t testStrLen = udat_format(testFmt, refDate, testString, kUbufMax, NULL, &status);
+ if (U_FAILURE(status)) {
+ log_err("Fail in udat_format locale %s: %s", locID, u_errorName(status));
+ } else if (testStrLen < 3 || testString[2] != 0x5143) {
+ char bbuf[kBbufMax];
+ u_austrncpy(bbuf, testString, testStrLen);
+ log_err("Formatting year 1 as Gannen, got%s but expected 3rd char to be 0x5143", bbuf);
+ }
+ udat_close(testFmt);
+ }
+ }
+ udatpg_close(dtpgen);
+ }
+}
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cdtdptst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cdtdptst.c
index 447bd89d75e..d7126eca616 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cdtdptst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cdtdptst.c
@@ -207,6 +207,7 @@ void TestRunTogetherPattern985()
format = udat_open(UDAT_PATTERN, UDAT_PATTERN, NULL, NULL, 0,pattern, u_strlen(pattern), &status);
if(U_FAILURE(status)){
log_data_err("FAIL: Error in date format construction with pattern: %s - (Are you missing data?)\n", myErrorName(status));
+ free(pattern);
return;
}
date1 = ucal_getNow();
@@ -304,10 +305,12 @@ void TestCzechMonths459()
*/
void TestQuotePattern161()
{
- UDateFormat *format;
- UCalendar *cal;
+ UDateFormat *format = NULL;
+ UCalendar *cal = NULL;
UDate currentTime_1;
- UChar *pattern, *tzID, *exp;
+ UChar *pattern = NULL;
+ UChar *tzID = NULL;
+ UChar *exp = NULL;
UChar *dateString;
UErrorCode status = U_ZERO_ERROR;
const char* expStr = "04/13/1999 at 10:42:28 AM ";
@@ -323,27 +326,27 @@ void TestQuotePattern161()
format= udat_open(UDAT_PATTERN, UDAT_PATTERN,"en_US", NULL, 0,pattern, u_strlen(pattern), &status);
if(U_FAILURE(status)){
log_data_err("error in udat_open: %s - (Are you missing data?)\n", myErrorName(status));
- return;
- }
- tzID=(UChar*)malloc(sizeof(UChar) * 4);
- u_uastrcpy(tzID, "PST");
- /* this is supposed to open default date format, but later on it treats it like it is "en_US"
- - very bad if you try to run the tests on machine where default locale is NOT "en_US" */
- /* cal=ucal_open(tzID, u_strlen(tzID), NULL, UCAL_TRADITIONAL, &status); */
- cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_TRADITIONAL, &status);
- if(U_FAILURE(status)){ log_err("error in ucal_open cal : %s\n", myErrorName(status)); }
-
- ucal_setDateTime(cal, 1999, UCAL_APRIL, 13, 10, 42, 28, &status);
- currentTime_1 = ucal_getMillis(cal, &status);
-
- dateString = myDateFormat(format, currentTime_1);
- exp=(UChar*)malloc(sizeof(UChar) * (strlen(expStr) + 1) );
- u_uastrcpy(exp, expStr);
-
- log_verbose("%s\n", austrdup(dateString) );
- if(u_strncmp(dateString, exp, (int32_t)strlen(expStr)) !=0)
- log_err("Error in formatting a pattern with single quotes\n");
+ } else {
+ tzID=(UChar*)malloc(sizeof(UChar) * 4);
+ u_uastrcpy(tzID, "PST");
+ /* this is supposed to open default date format, but later on it treats it like it is "en_US"
+ - very bad if you try to run the tests on machine where default locale is NOT "en_US" */
+ /* cal=ucal_open(tzID, u_strlen(tzID), NULL, UCAL_TRADITIONAL, &status); */
+ cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_TRADITIONAL, &status);
+ if(U_FAILURE(status)){ log_err("error in ucal_open cal : %s\n", myErrorName(status)); }
+
+ ucal_setDateTime(cal, 1999, UCAL_APRIL, 13, 10, 42, 28, &status);
+ currentTime_1 = ucal_getMillis(cal, &status);
+ dateString = myDateFormat(format, currentTime_1);
+ exp=(UChar*)malloc(sizeof(UChar) * (strlen(expStr) + 1) );
+ u_uastrcpy(exp, expStr);
+
+ log_verbose("%s\n", austrdup(dateString) );
+ if(u_strncmp(dateString, exp, (int32_t)strlen(expStr)) !=0) {
+ log_err("Error in formatting a pattern with single quotes\n");
+ }
+ }
udat_close(format);
ucal_close(cal);
free(exp);
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cdtrgtst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cdtrgtst.c
index 66ca85b3984..e88327d138e 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cdtrgtst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cdtrgtst.c
@@ -166,6 +166,7 @@ void Test4056591()
if(U_FAILURE(status))
{
log_data_err("FAIL: error in creating the dateformat using u_openPattern(): %s - (Are you missing data?)\n", myErrorName(status));
+ ucal_close(cal);
return;
}
start = 1800;
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cformtst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cformtst.c
index 6ed740c1c7e..f4e62b73906 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cformtst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cformtst.c
@@ -39,6 +39,8 @@ void addCurrencyTest(TestNode**);
void addPluralRulesTest(TestNode**);
void addURegionTest(TestNode** root);
void addUListFmtTest(TestNode** root);
+void addUNumberFormatterTest(TestNode** root);
+void addUFormattedValueTest(TestNode** root);
void addFormatTest(TestNode** root);
@@ -61,6 +63,8 @@ void addFormatTest(TestNode** root)
addPluralRulesTest(root);
addURegionTest(root);
addUListFmtTest(root);
+ addUNumberFormatterTest(root);
+ addUFormattedValueTest(root);
}
/*Internal functions used*/
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cformtst.h b/Build/source/libs/icu/icu-src/source/test/cintltst/cformtst.h
index a5b6bbe2224..bcee4c42f28 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cformtst.h
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cformtst.h
@@ -25,11 +25,37 @@
#include "cintltst.h"
#include "unicode/udat.h"
+#include "unicode/uformattedvalue.h"
/* Internal fucntion used by all the test format files */
UChar* myDateFormat(UDateFormat *dat, UDate d);
+
+typedef struct UFieldPositionWithCategory {
+ UFieldCategory category;
+ int32_t field;
+ int32_t beginIndex;
+ int32_t endIndex;
+} UFieldPositionWithCategory;
+
+// The following are implemented in uformattedvaluetest.c
+void checkFormattedValue(
+ const char* message,
+ const UFormattedValue* fv,
+ const UChar* expectedString,
+ UFieldCategory expectedCategory,
+ const UFieldPosition* expectedFieldPositions,
+ int32_t expectedFieldPositionsLength);
+
+void checkMixedFormattedValue(
+ const char* message,
+ const UFormattedValue* fv,
+ const UChar* expectedString,
+ const UFieldPositionWithCategory* expectedFieldPositions,
+ int32_t length);
+
+
#endif /* #if !UCONFIG_NO_FORMATTING */
#endif
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.c
index aaa187f6bdb..498361392e1 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.c
@@ -743,4 +743,18 @@ U_CFUNC UBool assertIntEquals(const char* message, int64_t expected, int64_t act
return TRUE;
}
+U_CFUNC UBool assertPtrEquals(const char* message, const void* expected, const void* actual) {
+ if (expected != actual) {
+ log_err("FAIL: %s; got 0x%llx; expected 0x%llx\n",
+ message, actual, expected);
+ return FALSE;
+ }
+#ifdef VERBOSE_ASSERTIONS
+ else {
+ log_verbose("Ok: %s; got 0x%llx\n", message, actual);
+ }
+#endif
+ return TRUE;
+}
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.h b/Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.h
index edb60eb58e8..f66e4c6c07e 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.h
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.h
@@ -147,6 +147,12 @@ U_CFUNC UBool assertUEquals(const char* msg, const UChar* expectedString,
*/
U_CFUNC UBool assertIntEquals(const char* msg, int64_t expected, int64_t actual);
+/**
+ * Assert that the addresses of the two pointers are the same, returning
+ * TRUE if they are equal.
+ */
+U_CFUNC UBool assertPtrEquals(const char* msg, const void* expected, const void* actual);
+
/*
* note - isICUVersionBefore and isICUVersionAtLeast have been removed.
* use log_knownIssue() instead.
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.vcxproj b/Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.vcxproj
index 6388eb84785..9444d3a634d 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{3D1246AE-1B32-479B-BECA-AEFA97BE2321}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -34,124 +33,55 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
- <!-- Options that are common to *all* project configurations -->
+ <!-- Options that are common to *all* configurations -->
<ItemDefinitionGroup>
- <ClCompile>
- <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\ctestfw;..\..\common;..\..\i18n;..\..\tools\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
- <WarningLevel>Level3</WarningLevel>
- </ClCompile>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Midl>
- <TypeLibraryName>.\x86\Debug/cintltst.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x86\Debug/cintltst.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- </ClCompile>
- <Link>
- <OutputFile>.\x86\Debug/cintltst.exe</OutputFile>
- <AdditionalDependencies>icuucd.lib;icuind.lib;icutestd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x86\Debug/cintltst.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <FixedBaseAddress>false</FixedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Midl>
- <TypeLibraryName>.\x86\Release/cintltst.tlb</TypeLibraryName>
+ <TypeLibraryName>$(OutDir)\cintltst.tlb</TypeLibraryName>
</Midl>
<ClCompile>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>.\x86\Release/cintltst.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
<CompileAs>Default</CompileAs>
+ <DisableLanguageExtensions>false</DisableLanguageExtensions>
+ <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\ctestfw;..\..\common;..\..\i18n;..\..\tools\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PrecompiledHeaderOutputFile>$(OutDir)\cintltst.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)\cintltst.pdb</ProgramDataBaseFileName>
</ClCompile>
<Link>
- <OutputFile>.\x86\Release/cintltst.exe</OutputFile>
- <AdditionalDependencies>icuuc.lib;icuin.lib;icutest.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x86\Release/cintltst.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <OutputFile>$(OutDir)\cintltst.exe</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Midl>
- <TypeLibraryName>.\x64\Debug/cintltst.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x64\Debug/cintltst.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
<BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
<Link>
- <OutputFile>.\x64\Debug/cintltst.exe</OutputFile>
<AdditionalDependencies>icuucd.lib;icuind.lib;icutestd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x64\Debug/cintltst.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <FixedBaseAddress>false</FixedBaseAddress>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Midl>
- <TypeLibraryName>.\x64\Release/cintltst.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>.\x64\Release/cintltst.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- <CompileAs>Default</CompileAs>
</ClCompile>
<Link>
- <OutputFile>.\x64\Release/cintltst.exe</OutputFile>
<AdditionalDependencies>icuuc.lib;icuin.lib;icutest.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x64\Release/cintltst.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
@@ -244,6 +174,7 @@
<ClCompile Include="uregiontest.c" />
<ClCompile Include="ulistfmttest.c" />
<ClCompile Include="unumberformattertst.c" />
+ <ClCompile Include="uformattedvaluetst.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="cbiditst.h" />
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.vcxproj.filters b/Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.vcxproj.filters
index ff185c66e6a..b541163663e 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.vcxproj.filters
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cintltst.vcxproj.filters
@@ -222,6 +222,9 @@
<ClInclude Include="unumberformattertst.c">
<Filter>formatting</Filter>
</ClInclude>
+ <ClInclude Include="uformattedvaluetst.c">
+ <Filter>formatting</Filter>
+ </ClInclude>
<ClCompile Include="cldrtest.c">
<Filter>locales &amp; resources</Filter>
</ClCompile>
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/citertst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/citertst.c
index c93c19c3685..5ffc714cfb3 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/citertst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/citertst.c
@@ -1076,7 +1076,7 @@ static void TestDiscontiguos() {
log_verbose("count %d\n", count);
for (;;) {
- uint32_t ce;
+ int32_t ce;
UChar *e = u_strchr(s, 0x20);
if (e == 0) {
e = u_strchr(s, 0);
@@ -1088,7 +1088,7 @@ static void TestDiscontiguos() {
return;
}
while (ce != UCOL_NULLORDER) {
- if (ce != (uint32_t)ucol_next(iter, &status) ||
+ if (ce != ucol_next(iter, &status) ||
U_FAILURE(status)) {
log_err("Discontiguos contraction test mismatch\n");
return;
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cldrtest.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cldrtest.c
index a544de96958..87ae093c29c 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cldrtest.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cldrtest.c
@@ -454,6 +454,7 @@ static void
testLCID(UResourceBundle *currentBundle,
const char *localeName)
{
+ (void)currentBundle; // suppress compiler warnings about unused variables
UErrorCode status = U_ZERO_ERROR;
uint32_t expectedLCID;
char lcidStringC[64] = {0};
@@ -706,7 +707,7 @@ TestConsistentCountryInfo(void) {
}
fromVariantLen = uloc_getVariant(fromLocale, fromVariant, ULOC_FULLNAME_CAPACITY, &errorCode);
if (fromVariantLen > 0) {
- /* Most variants are ignorable like PREEURO, or collation variants. */
+ /* Most variants are ignorable like collation variants. */
continue;
}
/* Start comparing only after the current index.
@@ -728,7 +729,7 @@ TestConsistentCountryInfo(void) {
}
toVariantLen = uloc_getVariant(toLocale, toVariant, ULOC_FULLNAME_CAPACITY, &errorCode);
if (toVariantLen > 0) {
- /* Most variants are ignorable like PREEURO, or collation variants. */
+ /* Most variants are ignorable like collation variants. */
/* They're a variant for a reason. */
continue;
}
@@ -1432,22 +1433,22 @@ static void TestAvailableIsoCodes(void){
UChar* isoCode = (UChar*)malloc(sizeof(UChar) * (uprv_strlen(usdCode) + 1));
/* testing available codes with no time ranges */
- u_charsToUChars(eurCode, isoCode, uprv_strlen(usdCode) + 1);
+ u_charsToUChars(eurCode, isoCode, (int32_t)uprv_strlen(usdCode) + 1);
if (ucurr_isAvailable(isoCode, U_DATE_MIN, U_DATE_MAX, &errorCode) == FALSE) {
log_data_err("FAIL: ISO code (%s) is not found.\n", eurCode);
}
- u_charsToUChars(usdCode, isoCode, uprv_strlen(zzzCode) + 1);
+ u_charsToUChars(usdCode, isoCode, (int32_t)uprv_strlen(zzzCode) + 1);
if (ucurr_isAvailable(isoCode, U_DATE_MIN, U_DATE_MAX, &errorCode) == FALSE) {
log_data_err("FAIL: ISO code (%s) is not found.\n", usdCode);
}
- u_charsToUChars(zzzCode, isoCode, uprv_strlen(zzzCode) + 1);
+ u_charsToUChars(zzzCode, isoCode, (int32_t)uprv_strlen(zzzCode) + 1);
if (ucurr_isAvailable(isoCode, U_DATE_MIN, U_DATE_MAX, &errorCode) == TRUE) {
log_err("FAIL: ISO code (%s) is reported as available, but it doesn't exist.\n", zzzCode);
}
- u_charsToUChars(lastCode, isoCode, uprv_strlen(zzzCode) + 1);
+ u_charsToUChars(lastCode, isoCode, (int32_t)uprv_strlen(zzzCode) + 1);
if (ucurr_isAvailable(isoCode, U_DATE_MIN, U_DATE_MAX, &errorCode) == FALSE) {
log_data_err("FAIL: ISO code (%s) is not found.\n", lastCode);
}
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cloctst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cloctst.c
index 63e7269aa48..0a1a0ae9f0c 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cloctst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cloctst.c
@@ -23,6 +23,7 @@
#include "cstring.h"
#include "uparse.h"
#include "uresimp.h"
+#include "uassert.h"
#include "unicode/putil.h"
#include "unicode/ubrk.h"
@@ -51,6 +52,8 @@ static void TestUnicodeDefines(void);
static void TestIsRightToLeft(void);
static void TestBadLocaleIDs(void);
+static void TestBug20370(void);
+static void TestBug20321UnicodeLocaleKey(void);
void PrintDataTable();
@@ -215,6 +218,7 @@ void addLocaleTest(TestNode** root)
TESTCASE(TestSimpleResourceInfo);
TESTCASE(TestDisplayNames);
TESTCASE(TestGetAvailableLocales);
+ TESTCASE(TestGetAvailableLocalesByType);
TESTCASE(TestDataDirectory);
#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
TESTCASE(TestISOFunctions);
@@ -251,8 +255,9 @@ void addLocaleTest(TestNode** root)
TESTCASE(TestOrientation);
TESTCASE(TestLikelySubtags);
TESTCASE(TestToLanguageTag);
+ TESTCASE(TestBug20132);
+ TESTCASE(TestBug20149);
TESTCASE(TestForLanguageTag);
- TESTCASE(TestInvalidLanguageTag);
TESTCASE(TestLangAndRegionCanonicalize);
TESTCASE(TestTrailingNull);
TESTCASE(TestUnicodeDefines);
@@ -264,6 +269,8 @@ void addLocaleTest(TestNode** root)
TESTCASE(TestToUnicodeLocaleType);
TESTCASE(TestToLegacyType);
TESTCASE(TestBadLocaleIDs);
+ TESTCASE(TestBug20370);
+ TESTCASE(TestBug20321UnicodeLocaleKey);
}
@@ -417,10 +424,7 @@ static void TestPrefixes() {
{"i-hakka", "", "CN", "", "i-hakka_CN", "i-hakka_CN", NULL},
{"i-hakka", "", "MX", "", "I-hakka_MX", "i-hakka_MX", NULL},
{"x-klingon", "", "US", "SANJOSE", "X-KLINGON_us_SANJOSE", "x-klingon_US_SANJOSE", NULL},
-
- {"zh", "Hans", "", "PINYIN", "zh-Hans-pinyin", "zh_Hans__PINYIN", "zh_Hans@collation=pinyin"},
- {"hy", "", "", "AREVMDA", "hy_AREVMDA", "hy__AREVMDA", NULL},
-
+ {"hy", "", "", "AREVMDA", "hy_AREVMDA", "hy__AREVMDA", "hyw"},
{"de", "", "", "1901", "de-1901", "de__1901", NULL},
{"mr", "", "", "", "mr.utf8", "mr.utf8", "mr"},
{"de", "", "TV", "", "de-tv.koi8r", "de_TV.koi8r", "de_TV"},
@@ -433,11 +437,16 @@ static void TestPrefixes() {
{"no", "", "", "", "no@ny", "no@ny", "no__NY"},
{"el", "Latn", "", "", "el-latn", "el_Latn", NULL},
{"en", "Cyrl", "RU", "", "en-cyrl-ru", "en_Cyrl_RU", NULL},
- {"zh", "Hant", "TW", "STROKE", "zh-hant_TW_STROKE", "zh_Hant_TW_STROKE", "zh_Hant_TW@collation=stroke"},
{"qq", "Qqqq", "QQ", "QQ", "qq_Qqqq_QQ_QQ", "qq_Qqqq_QQ_QQ", NULL},
{"qq", "Qqqq", "", "QQ", "qq_Qqqq__QQ", "qq_Qqqq__QQ", NULL},
{"ab", "Cdef", "GH", "IJ", "ab_cdef_gh_ij", "ab_Cdef_GH_IJ", NULL}, /* total garbage */
-
+
+ // Before ICU 64, ICU locale canonicalization had some additional mappings.
+ // They were removed for ICU-20187 "drop support for long-obsolete locale ID variants".
+ // The following now use standard canonicalization.
+ {"zh", "Hans", "", "PINYIN", "zh-Hans-pinyin", "zh_Hans__PINYIN", "zh_Hans__PINYIN"},
+ {"zh", "Hant", "TW", "STROKE", "zh-hant_TW_STROKE", "zh_Hant_TW_STROKE", "zh_Hant_TW_STROKE"},
+
{NULL,NULL,NULL,NULL,NULL,NULL,NULL}
};
@@ -826,6 +835,77 @@ static void TestGetAvailableLocales()
}
}
+static void TestGetAvailableLocalesByType() {
+ UErrorCode status = U_ZERO_ERROR;
+
+ UEnumeration* uenum = uloc_openAvailableByType(ULOC_AVAILABLE_DEFAULT, &status);
+ assertSuccess("Constructing the UEnumeration", &status);
+
+ assertIntEquals("countAvailable() should be same in old and new methods",
+ uloc_countAvailable(),
+ uenum_count(uenum, &status));
+
+ for (int32_t i = 0; i < uloc_countAvailable(); i++) {
+ const char* old = uloc_getAvailable(i);
+ int32_t len = 0;
+ const char* new = uenum_next(uenum, &len, &status);
+ assertEquals("Old and new strings should equal", old, new);
+ assertIntEquals("String length should be correct", uprv_strlen(old), len);
+ }
+ assertPtrEquals("Should get nullptr on the last string",
+ NULL, uenum_next(uenum, NULL, &status));
+
+ uenum_close(uenum);
+
+ uenum = uloc_openAvailableByType(ULOC_AVAILABLE_ONLY_LEGACY_ALIASES, &status);
+ UBool found_he = FALSE;
+ UBool found_iw = FALSE;
+ const char* loc;
+ while ((loc = uenum_next(uenum, NULL, &status))) {
+ if (uprv_strcmp("he", loc) == 0) {
+ found_he = TRUE;
+ }
+ if (uprv_strcmp("iw", loc) == 0) {
+ found_iw = TRUE;
+ }
+ }
+ assertTrue("Should NOT have found he amongst the legacy/alias locales", !found_he);
+ assertTrue("Should have found iw amongst the legacy/alias locales", found_iw);
+ uenum_close(uenum);
+
+ uenum = uloc_openAvailableByType(ULOC_AVAILABLE_WITH_LEGACY_ALIASES, &status);
+ found_he = FALSE;
+ found_iw = FALSE;
+ const UChar* uloc; // test the UChar conversion
+ int32_t count = 0;
+ while ((uloc = uenum_unext(uenum, NULL, &status))) {
+ if (u_strcmp(u"iw", uloc) == 0) {
+ found_iw = TRUE;
+ }
+ if (u_strcmp(u"he", uloc) == 0) {
+ found_he = TRUE;
+ }
+ count++;
+ }
+ assertTrue("Should have found he amongst all locales", found_he);
+ assertTrue("Should have found iw amongst all locales", found_iw);
+ assertIntEquals("Should return as many strings as claimed",
+ count, uenum_count(uenum, &status));
+
+ // Reset the enumeration and it should still work
+ uenum_reset(uenum, &status);
+ count = 0;
+ while ((loc = uenum_next(uenum, NULL, &status))) {
+ count++;
+ }
+ assertIntEquals("After reset, should return as many strings as claimed",
+ count, uenum_count(uenum, &status));
+
+ uenum_close(uenum);
+
+ assertSuccess("No errors should have occurred", &status);
+}
+
/* test for u_getDataDirectory, u_setDataDirectory, uloc_getISO3Language */
static void TestDataDirectory()
{
@@ -1704,7 +1784,7 @@ static void TestKeywordVariants(void)
"de_DE@euro",
"de_DE@euro",
"de_DE@euro", /* we probably should strip off the POSIX style variant @euro see #11690 */
- "de_DE@currency=EUR",
+ "de_DE_EURO",
{"","","","","","",""},
0,
U_INVALID_FORMAT_ERROR /* must have '=' after '@' */
@@ -1775,6 +1855,8 @@ static void TestKeywordVariants(void)
status = U_ZERO_ERROR;
resultLen = uloc_getName(testCases[i].localeID, buffer, 256, &status);
+ (void)resultLen;
+ U_ASSERT(resultLen < 256);
if (U_SUCCESS(status)) {
if (testCases[i].expectedLocaleID == 0) {
log_err("Expected uloc_getName(\"%s\") to fail; got \"%s\"\n",
@@ -1792,6 +1874,7 @@ static void TestKeywordVariants(void)
status = U_ZERO_ERROR;
resultLen = uloc_getBaseName(testCases[i].localeID, buffer, 256, &status);
+ U_ASSERT(resultLen < 256);
if (U_SUCCESS(status)) {
if (testCases[i].expectedLocaleIDNoKeywords == 0) {
log_err("Expected uloc_getBaseName(\"%s\") to fail; got \"%s\"\n",
@@ -1809,6 +1892,7 @@ static void TestKeywordVariants(void)
status = U_ZERO_ERROR;
resultLen = uloc_canonicalize(testCases[i].localeID, buffer, 256, &status);
+ U_ASSERT(resultLen < 256);
if (U_SUCCESS(status)) {
if (testCases[i].expectedCanonicalID == 0) {
log_err("Expected uloc_canonicalize(\"%s\") to fail; got \"%s\"\n",
@@ -1992,7 +2076,7 @@ static void TestKeywordSet(void)
resultLen = uloc_getKeywordValue(kwSetTestCases[i].x, kwSetTestCases[i].k, buffer, 1023, &status);
if(U_FAILURE(status)) {
log_err("Err on test case %d for getKeywordValue: got error %s\n", i, u_errorName(status));
- } else if (resultLen != uprv_strlen(kwSetTestCases[i].v) || uprv_strcmp(buffer, kwSetTestCases[i].v) != 0) {
+ } else if (resultLen != (int32_t)uprv_strlen(kwSetTestCases[i].v) || uprv_strcmp(buffer, kwSetTestCases[i].v) != 0) {
log_err("FAIL: #%d getKeywordValue: got %s (%d) expected %s (%d)\n", i, buffer, resultLen,
kwSetTestCases[i].v, uprv_strlen(kwSetTestCases[i].v));
}
@@ -2120,57 +2204,21 @@ static void TestCanonicalization(void)
const char *getNameID; /* expected getName() result */
const char *canonicalID; /* expected canonicalize() result */
} testCases[] = {
- { "ca_ES_PREEURO-with-extra-stuff-that really doesn't make any sense-unless-you're trying to increase code coverage",
- "ca_ES_PREEURO_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE",
- "ca_ES_PREEURO_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE"},
- { "ca_ES_PREEURO", "ca_ES_PREEURO", "ca_ES@currency=ESP" },
- { "de_AT_PREEURO", "de_AT_PREEURO", "de_AT@currency=ATS" },
- { "de_DE_PREEURO", "de_DE_PREEURO", "de_DE@currency=DEM" },
- { "de_LU_PREEURO", "de_LU_PREEURO", "de_LU@currency=LUF" },
- { "el_GR_PREEURO", "el_GR_PREEURO", "el_GR@currency=GRD" },
- { "en_BE_PREEURO", "en_BE_PREEURO", "en_BE@currency=BEF" },
- { "en_IE_PREEURO", "en_IE_PREEURO", "en_IE@currency=IEP" },
- { "es_ES_PREEURO", "es_ES_PREEURO", "es_ES@currency=ESP" },
- { "eu_ES_PREEURO", "eu_ES_PREEURO", "eu_ES@currency=ESP" },
- { "fi_FI_PREEURO", "fi_FI_PREEURO", "fi_FI@currency=FIM" },
- { "fr_BE_PREEURO", "fr_BE_PREEURO", "fr_BE@currency=BEF" },
- { "fr_FR_PREEURO", "fr_FR_PREEURO", "fr_FR@currency=FRF" },
- { "fr_LU_PREEURO", "fr_LU_PREEURO", "fr_LU@currency=LUF" },
- { "ga_IE_PREEURO", "ga_IE_PREEURO", "ga_IE@currency=IEP" },
- { "gl_ES_PREEURO", "gl_ES_PREEURO", "gl_ES@currency=ESP" },
- { "it_IT_PREEURO", "it_IT_PREEURO", "it_IT@currency=ITL" },
- { "nl_BE_PREEURO", "nl_BE_PREEURO", "nl_BE@currency=BEF" },
- { "nl_NL_PREEURO", "nl_NL_PREEURO", "nl_NL@currency=NLG" },
- { "pt_PT_PREEURO", "pt_PT_PREEURO", "pt_PT@currency=PTE" },
- { "de__PHONEBOOK", "de__PHONEBOOK", "de@collation=phonebook" },
- { "en_GB_EURO", "en_GB_EURO", "en_GB@currency=EUR" },
- { "en_GB@EURO", "en_GB@EURO", "en_GB@currency=EUR" }, /* POSIX ID */
- { "es__TRADITIONAL", "es__TRADITIONAL", "es@collation=traditional" },
- { "hi__DIRECT", "hi__DIRECT", "hi@collation=direct" },
- { "ja_JP_TRADITIONAL", "ja_JP_TRADITIONAL", "ja_JP@calendar=japanese" },
- { "th_TH_TRADITIONAL", "th_TH_TRADITIONAL", "th_TH@calendar=buddhist" },
- { "zh_TW_STROKE", "zh_TW_STROKE", "zh_TW@collation=stroke" },
- { "zh__PINYIN", "zh__PINYIN", "zh@collation=pinyin" },
+ { "ca_ES-with-extra-stuff-that really doesn't make any sense-unless-you're trying to increase code coverage",
+ "ca_ES_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE",
+ "ca_ES_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE"},
{ "zh@collation=pinyin", "zh@collation=pinyin", "zh@collation=pinyin" },
{ "zh_CN@collation=pinyin", "zh_CN@collation=pinyin", "zh_CN@collation=pinyin" },
- { "zh_CN_STROKE", "zh_CN_STROKE", "zh_CN@collation=stroke" },
{ "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin" },
{ "en_US_POSIX", "en_US_POSIX", "en_US_POSIX" },
{ "hy_AM_REVISED", "hy_AM_REVISED", "hy_AM_REVISED" },
{ "no_NO_NY", "no_NO_NY", "no_NO_NY" /* not: "nn_NO" [alan ICU3.0] */ },
{ "no@ny", "no@ny", "no__NY" /* not: "nn" [alan ICU3.0] */ }, /* POSIX ID */
{ "no-no.utf32@B", "no_NO.utf32@B", "no_NO_B" /* not: "nb_NO_B" [alan ICU3.0] */ }, /* POSIX ID */
- { "qz-qz@Euro", "qz_QZ@Euro", "qz_QZ@currency=EUR" }, /* qz-qz uses private use iso codes */
+ { "qz-qz@Euro", "qz_QZ@Euro", "qz_QZ_EURO" }, /* qz-qz uses private use iso codes */
{ "en-BOONT", "en__BOONT", "en__BOONT" }, /* registered name */
{ "de-1901", "de__1901", "de__1901" }, /* registered name */
{ "de-1906", "de__1906", "de__1906" }, /* registered name */
- { "sr-SP-Cyrl", "sr_SP_CYRL", "sr_Cyrl_RS" }, /* .NET name */
- { "sr-SP-Latn", "sr_SP_LATN", "sr_Latn_RS" }, /* .NET name */
- { "sr_YU_CYRILLIC", "sr_YU_CYRILLIC", "sr_Cyrl_RS" }, /* Linux name */
- { "uz-UZ-Cyrl", "uz_UZ_CYRL", "uz_Cyrl_UZ" }, /* .NET name */
- { "uz-UZ-Latn", "uz_UZ_LATN", "uz_Latn_UZ" }, /* .NET name */
- { "zh-CHS", "zh_CHS", "zh_Hans" }, /* .NET name */
- { "zh-CHT", "zh_CHT", "zh_Hant" }, /* .NET name This may change back to zh_Hant */
/* posix behavior that used to be performed by getName */
{ "mr.utf8", "mr.utf8", "mr" },
@@ -2185,12 +2233,6 @@ static void TestCanonicalization(void)
{ "en_Hant_IL_VALLEY_GIRL@ currency = EUR; calendar = Japanese ;", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR" },
/* already-canonical ids are not changed */
{ "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR" },
- /* PRE_EURO and EURO conversions don't affect other keywords */
- { "es_ES_PREEURO@CALendar=Japanese", "es_ES_PREEURO@calendar=Japanese", "es_ES@calendar=Japanese;currency=ESP" },
- { "es_ES_EURO@SHOUT=zipeedeedoodah", "es_ES_EURO@shout=zipeedeedoodah", "es_ES@currency=EUR;shout=zipeedeedoodah" },
- /* currency keyword overrides PRE_EURO and EURO currency */
- { "es_ES_PREEURO@currency=EUR", "es_ES_PREEURO@currency=EUR", "es_ES@currency=EUR" },
- { "es_ES_EURO@currency=ESP", "es_ES_EURO@currency=ESP", "es_ES@currency=ESP" },
/* norwegian is just too weird, if we handle things in their full generality */
{ "no-Hant-GB_NY@currency=$$$", "no_Hant_GB_NY@currency=$$$", "no_Hant_GB_NY@currency=$$$" /* not: "nn_Hant_GB@currency=$$$" [alan ICU3.0] */ },
@@ -2201,9 +2243,55 @@ static void TestCanonicalization(void)
{ "ja_JP", "ja_JP", "ja_JP" },
/* test case for "i-default" */
- { "i-default", "en@x=i-default", "en@x=i-default" }
+ { "i-default", "en@x=i-default", "en@x=i-default" },
+
+ // Before ICU 64, ICU locale canonicalization had some additional mappings.
+ // They were removed for ICU-20187 "drop support for long-obsolete locale ID variants".
+ // The following now use standard canonicalization.
+ { "ca_ES_PREEURO", "ca_ES_PREEURO", "ca_ES_PREEURO" },
+ { "de_AT_PREEURO", "de_AT_PREEURO", "de_AT_PREEURO" },
+ { "de_DE_PREEURO", "de_DE_PREEURO", "de_DE_PREEURO" },
+ { "de_LU_PREEURO", "de_LU_PREEURO", "de_LU_PREEURO" },
+ { "el_GR_PREEURO", "el_GR_PREEURO", "el_GR_PREEURO" },
+ { "en_BE_PREEURO", "en_BE_PREEURO", "en_BE_PREEURO" },
+ { "en_IE_PREEURO", "en_IE_PREEURO", "en_IE_PREEURO" },
+ { "es_ES_PREEURO", "es_ES_PREEURO", "es_ES_PREEURO" },
+ { "eu_ES_PREEURO", "eu_ES_PREEURO", "eu_ES_PREEURO" },
+ { "fi_FI_PREEURO", "fi_FI_PREEURO", "fi_FI_PREEURO" },
+ { "fr_BE_PREEURO", "fr_BE_PREEURO", "fr_BE_PREEURO" },
+ { "fr_FR_PREEURO", "fr_FR_PREEURO", "fr_FR_PREEURO" },
+ { "fr_LU_PREEURO", "fr_LU_PREEURO", "fr_LU_PREEURO" },
+ { "ga_IE_PREEURO", "ga_IE_PREEURO", "ga_IE_PREEURO" },
+ { "gl_ES_PREEURO", "gl_ES_PREEURO", "gl_ES_PREEURO" },
+ { "it_IT_PREEURO", "it_IT_PREEURO", "it_IT_PREEURO" },
+ { "nl_BE_PREEURO", "nl_BE_PREEURO", "nl_BE_PREEURO" },
+ { "nl_NL_PREEURO", "nl_NL_PREEURO", "nl_NL_PREEURO" },
+ { "pt_PT_PREEURO", "pt_PT_PREEURO", "pt_PT_PREEURO" },
+ { "de__PHONEBOOK", "de__PHONEBOOK", "de__PHONEBOOK" },
+ { "en_GB_EURO", "en_GB_EURO", "en_GB_EURO" },
+ { "en_GB@EURO", "en_GB@EURO", "en_GB_EURO" }, /* POSIX ID */
+ { "es__TRADITIONAL", "es__TRADITIONAL", "es__TRADITIONAL" },
+ { "hi__DIRECT", "hi__DIRECT", "hi__DIRECT" },
+ { "ja_JP_TRADITIONAL", "ja_JP_TRADITIONAL", "ja_JP_TRADITIONAL" },
+ { "th_TH_TRADITIONAL", "th_TH_TRADITIONAL", "th_TH_TRADITIONAL" },
+ { "zh_TW_STROKE", "zh_TW_STROKE", "zh_TW_STROKE" },
+ { "zh__PINYIN", "zh__PINYIN", "zh__PINYIN" },
+ { "zh_CN_STROKE", "zh_CN_STROKE", "zh_CN_STROKE" },
+ { "sr-SP-Cyrl", "sr_SP_CYRL", "sr_SP_CYRL" }, /* .NET name */
+ { "sr-SP-Latn", "sr_SP_LATN", "sr_SP_LATN" }, /* .NET name */
+ { "sr_YU_CYRILLIC", "sr_YU_CYRILLIC", "sr_YU_CYRILLIC" }, /* Linux name */
+ { "uz-UZ-Cyrl", "uz_UZ_CYRL", "uz_UZ_CYRL" }, /* .NET name */
+ { "uz-UZ-Latn", "uz_UZ_LATN", "uz_UZ_LATN" }, /* .NET name */
+ { "zh-CHS", "zh_CHS", "zh_CHS" }, /* .NET name */
+ { "zh-CHT", "zh_CHT", "zh_CHT" }, /* .NET name This may change back to zh_Hant */
+ /* PRE_EURO and EURO conversions don't affect other keywords */
+ { "es_ES_PREEURO@CALendar=Japanese", "es_ES_PREEURO@calendar=Japanese", "es_ES_PREEURO@calendar=Japanese" },
+ { "es_ES_EURO@SHOUT=zipeedeedoodah", "es_ES_EURO@shout=zipeedeedoodah", "es_ES_EURO@shout=zipeedeedoodah" },
+ /* currency keyword overrides PRE_EURO and EURO currency */
+ { "es_ES_PREEURO@currency=EUR", "es_ES_PREEURO@currency=EUR", "es_ES_PREEURO@currency=EUR" },
+ { "es_ES_EURO@currency=ESP", "es_ES_EURO@currency=ESP", "es_ES_EURO@currency=ESP" },
};
-
+
static const char* label[] = { "getName", "canonicalize" };
UErrorCode status = U_ZERO_ERROR;
@@ -2266,9 +2354,9 @@ static void TestCanonicalizationBuffer(void)
"-foo-bar-baz-foo-bar-baz-foo-bar-baz-foo-bar-baz"
"-foo-barz"
;
- static const size_t len = sizeof name - 1; // Without NUL terminator.
+ static const size_t len = sizeof(name) - 1; // Without NUL terminator.
- int32_t reslen = uloc_canonicalize(name, buffer, len, &status);
+ int32_t reslen = uloc_canonicalize(name, buffer, (int32_t)len, &status);
if (U_FAILURE(status)) {
log_err("FAIL: uloc_canonicalize(%s) => %s, expected !U_FAILURE()\n",
@@ -2332,6 +2420,7 @@ static void TestDisplayKeywords(void)
displayKeywordLen = uloc_getDisplayKeyword(keyword, testCases[i].displayLocale, displayKeyword, displayKeywordLen, &status);
if(U_FAILURE(status)){
log_err("uloc_getDisplayKeyword filed for keyword : %s in locale id: %s for display locale: %s \n", testCases[i].localeID, keyword, testCases[i].displayLocale, u_errorName(status));
+ free(displayKeyword);
break;
}
if(u_strncmp(displayKeyword, testCases[i].displayKeyword, displayKeywordLen)!=0){
@@ -2340,6 +2429,7 @@ static void TestDisplayKeywords(void)
} else {
log_err("uloc_getDisplayKeyword did not get the expected value for keyword : %s in locale id: %s for display locale: %s \n", testCases[i].localeID, keyword, testCases[i].displayLocale);
}
+ free(displayKeyword);
break;
}
}else{
@@ -2415,6 +2505,7 @@ static void TestDisplayKeywordValues(void){
displayKeywordValueLen = uloc_getDisplayKeywordValue(testCases[i].localeID, keyword, testCases[i].displayLocale, displayKeywordValue, displayKeywordValueLen, &status);
if(U_FAILURE(status)){
log_err("uloc_getDisplayKeywordValue failed for keyword : %s in locale id: %s for display locale: %s with error : %s \n", testCases[i].localeID, keyword, testCases[i].displayLocale, u_errorName(status));
+ free(displayKeywordValue);
break;
}
if(u_strncmp(displayKeywordValue, testCases[i].displayKeywordValue, displayKeywordValueLen)!=0){
@@ -2423,6 +2514,7 @@ static void TestDisplayKeywordValues(void){
} else {
log_err("uloc_getDisplayKeywordValue did not return the expected value keyword : %s in locale id: %s for display locale: %s with error : %s \n", testCases[i].localeID, keyword, testCases[i].displayLocale, u_errorName(status));
}
+ free(displayKeywordValue);
break;
}
}else{
@@ -2468,6 +2560,7 @@ static void TestDisplayKeywordValues(void){
displayKeywordValueLen = uloc_getDisplayKeywordValue(localeID, keyword, displayLocale, displayKeywordValue, displayKeywordValueLen, &status);
if(U_FAILURE(status)){
log_err("uloc_getDisplayKeywordValue failed for keyword : %s in locale id: %s for display locale: %s with error : %s \n", localeID, keyword, displayLocale, u_errorName(status));
+ free(displayKeywordValue);
break;
}
if(u_strncmp(displayKeywordValue, expected[keywordCount], displayKeywordValueLen)!=0){
@@ -2476,6 +2569,7 @@ static void TestDisplayKeywordValues(void){
} else {
log_err("uloc_getDisplayKeywordValue did not return the expected value keyword : %s in locale id: %s for display locale: %s \n", localeID, keyword, displayLocale);
}
+ free(displayKeywordValue);
break;
}
}else{
@@ -3381,7 +3475,7 @@ static void TestGetLocaleForLCID() {
continue;
}
- if (length != uprv_strlen(temp2)) {
+ if (length != (int32_t)uprv_strlen(temp2)) {
log_err(" returned length %d not correct for uloc_getLocaleForLCID(%#04x), expected %d\n", length, lcid, uprv_strlen(temp2));
}
@@ -3548,7 +3642,7 @@ const char* const basic_minimize_data[][2] = {
"de_Latn_DE_POSIX_1901",
"de__POSIX_1901"
}, {
- "und",
+ "",
""
}, {
"en_Latn_US@calendar=gregorian",
@@ -5083,8 +5177,8 @@ const char* const full_data[][3] = {
"zh_HK"
}, {
"und_AQ",
- "und_Latn_AQ",
- "und_AQ"
+ "_Latn_AQ",
+ "_AQ"
}, {
"und_Zzzz",
"en_Latn_US",
@@ -5107,8 +5201,8 @@ const char* const full_data[][3] = {
"zh_HK"
}, {
"und_Zzzz_AQ",
- "und_Latn_AQ",
- "und_AQ"
+ "_Latn_AQ",
+ "_AQ"
}, {
"und_Latn",
"en_Latn_US",
@@ -5131,8 +5225,8 @@ const char* const full_data[][3] = {
"zh_Latn_HK"
}, {
"und_Latn_AQ",
- "und_Latn_AQ",
- "und_AQ"
+ "_Latn_AQ",
+ "_AQ"
}, {
"und_Hans",
"zh_Hans_CN",
@@ -5203,8 +5297,8 @@ const char* const full_data[][3] = {
"zh_Moon_HK"
}, {
"und_Moon_AQ",
- "und_Moon_AQ",
- "und_Moon_AQ"
+ "_Moon_AQ",
+ "_Moon_AQ"
}, {
"es",
"es_Latn_ES",
@@ -5704,7 +5798,7 @@ static int32_t getExpectedReturnValue(const errorData* data)
if (data->uerror == U_BUFFER_OVERFLOW_ERROR ||
data->uerror == U_STRING_NOT_TERMINATED_WARNING)
{
- return strlen(data->expected);
+ return (int32_t)strlen(data->expected);
}
else
{
@@ -5720,7 +5814,7 @@ static int32_t getBufferSize(const errorData* data, int32_t actualSize)
}
else if (data->bufferSize < 0)
{
- return strlen(data->expected) + 1;
+ return (int32_t)strlen(data->expected) + 1;
}
else
{
@@ -5932,7 +6026,6 @@ const char* const locale_to_langtag[][3] = {
{"th_TH_TH", "th-TH-x-lvariant-th", NULL},
{"bogus", "bogus", "bogus"},
{"foooobarrr", "und", NULL},
- {"az_AZ_CYRL", "az-Cyrl-AZ", "az-Cyrl-AZ"},
{"aa_BB_CYRL", "aa-BB-x-lvariant-cyrl", NULL},
{"en_US_1234", "en-US-1234", "en-US-1234"},
{"en_US_VARIANTA_VARIANTB", "en-US-varianta-variantb", "en-US-varianta-variantb"},
@@ -5959,6 +6052,13 @@ const char* const locale_to_langtag[][3] = {
{"en@attribute=baz;calendar=islamic-civil", "en-u-baz-ca-islamic-civil", "en-u-baz-ca-islamic-civil"},
{"en@a=bar;calendar=islamic-civil;x=u-foo", "en-a-bar-u-ca-islamic-civil-x-u-foo", "en-a-bar-u-ca-islamic-civil-x-u-foo"},
{"en@a=bar;attribute=baz;calendar=islamic-civil;x=u-foo", "en-a-bar-u-baz-ca-islamic-civil-x-u-foo", "en-a-bar-u-baz-ca-islamic-civil-x-u-foo"},
+ {"en@9=efg;a=baz", "en-9-efg-a-baz", "en-9-efg-a-baz"},
+
+ // Before ICU 64, ICU locale canonicalization had some additional mappings.
+ // They were removed for ICU-20187 "drop support for long-obsolete locale ID variants".
+ // The following now uses standard canonicalization.
+ {"az_AZ_CYRL", "az-AZ-x-lvariant-cyrl", NULL},
+
{NULL, NULL, NULL}
};
@@ -6018,6 +6118,47 @@ static void TestToLanguageTag(void) {
}
}
+static void TestBug20132(void) {
+ char langtag[256];
+ UErrorCode status;
+ int32_t len;
+
+ static const char inloc[] = "en-C";
+ static const char expected[] = "en-x-lvariant-c";
+ const int32_t expected_len = (int32_t)uprv_strlen(expected);
+
+ /* Before ICU-20132 was fixed, calling uloc_toLanguageTag() with a too small
+ * buffer would not immediately return the buffer size actually needed, but
+ * instead require several iterations before getting the correct size. */
+
+ status = U_ZERO_ERROR;
+ len = uloc_toLanguageTag(inloc, langtag, 1, FALSE, &status);
+
+ if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR) {
+ log_data_err("Error returned by uloc_toLanguageTag for locale id [%s] - error: %s Are you missing data?\n",
+ inloc, u_errorName(status));
+ }
+
+ if (len != expected_len) {
+ log_err("Bad length returned by uloc_toLanguageTag for locale id [%s]: %i != %i\n", inloc, len, expected_len);
+ }
+
+ status = U_ZERO_ERROR;
+ len = uloc_toLanguageTag(inloc, langtag, expected_len, FALSE, &status);
+
+ if (U_FAILURE(status)) {
+ log_data_err("Error returned by uloc_toLanguageTag for locale id [%s] - error: %s Are you missing data?\n",
+ inloc, u_errorName(status));
+ }
+
+ if (len != expected_len) {
+ log_err("Bad length returned by uloc_toLanguageTag for locale id [%s]: %i != %i\n", inloc, len, expected_len);
+ } else if (uprv_strncmp(langtag, expected, expected_len) != 0) {
+ log_data_err("uloc_toLanguageTag returned language tag [%.*s] for input locale [%s] - expected: [%s]. Are you missing data?\n",
+ len, langtag, inloc, expected);
+ }
+}
+
#define FULL_LENGTH -1
static const struct {
const char *bcpID;
@@ -6098,12 +6239,13 @@ static const struct {
/* #9562 IANA language tag data update */
{"en-gb-oed", "en_GB_OXENDICT", FULL_LENGTH},
{"i-navajo", "nv", FULL_LENGTH},
- {"i-navajo-a-foo", "", 0},
- {"i-navajo-latn-us", "", 0},
+ {"i-navajo-a-foo", "nv@a=foo", FULL_LENGTH},
+ {"i-navajo-latn-us", "nv_Latn_US", FULL_LENGTH},
{"sgn-br", "bzs", FULL_LENGTH},
{"sgn-br-u-co-phonebk", "bzs@collation=phonebook", FULL_LENGTH},
{"ja-latn-hepburn-heploc", "ja_Latn__ALALC97", FULL_LENGTH},
{"ja-latn-hepburn-heploc-u-ca-japanese", "ja_Latn__ALALC97@calendar=japanese", FULL_LENGTH},
+ {"en-a-bcde-0-fgh", "en@0=fgh;a=bcde", FULL_LENGTH},
};
static void TestForLanguageTag(void) {
@@ -6118,7 +6260,7 @@ static void TestForLanguageTag(void) {
locale[0] = 0;
expParsedLen = langtag_to_locale[i].len;
if (expParsedLen == FULL_LENGTH) {
- expParsedLen = uprv_strlen(langtag_to_locale[i].bcpID);
+ expParsedLen = (int32_t)uprv_strlen(langtag_to_locale[i].bcpID);
}
uloc_forLanguageTag(langtag_to_locale[i].bcpID, locale, sizeof(locale), &parsedLen, &status);
if (U_FAILURE(status)) {
@@ -6137,35 +6279,6 @@ static void TestForLanguageTag(void) {
}
}
-/* See https://unicode-org.atlassian.net/browse/ICU-20149 .
- * Depending on the resolution of that bug, this test may have
- * to be revised.
- */
-static void TestInvalidLanguageTag(void) {
- static const char* invalid_lang_tags[] = {
- "zh-u-foo-foo-co-pinyin", /* duplicate attribute in U extension */
- "zh-cmn-hans-u-foo-foo-co-pinyin", /* duplicate attribute in U extension */
-#if 0
- /*
- * These do not lead to an error. Instead, parsing stops at the 1st
- * invalid subtag.
- */
- "de-DE-1901-1901", /* duplicate variant */
- "en-a-bbb-a-ccc", /* duplicate extension */
-#endif
- NULL
- };
- char locale[256];
- for (const char** tag = invalid_lang_tags; *tag != NULL; tag++) {
- UErrorCode status = U_ZERO_ERROR;
- uloc_forLanguageTag(*tag, locale, sizeof(locale), NULL, &status);
- if (status != U_ILLEGAL_ARGUMENT_ERROR) {
- log_err("Error returned by uloc_forLanguageTag for input language tag [%s] : %s - expected error: %s\n",
- *tag, u_errorName(status), u_errorName(U_ILLEGAL_ARGUMENT_ERROR));
- }
- }
-}
-
static const struct {
const char *input;
const char *canonical;
@@ -6239,6 +6352,39 @@ static void TestToUnicodeLocaleKey(void)
}
}
+static void TestBug20321UnicodeLocaleKey(void)
+{
+ // key = alphanum alpha ;
+ static const char* invalid[] = {
+ "a0",
+ "00",
+ "a@",
+ "0@",
+ "@a",
+ "@a",
+ "abc",
+ "0bc",
+ };
+ for (int i = 0; i < UPRV_LENGTHOF(invalid); i++) {
+ const char* bcpKey = NULL;
+ bcpKey = uloc_toUnicodeLocaleKey(invalid[i]);
+ if (bcpKey != NULL) {
+ log_err("toUnicodeLocaleKey: keyword=%s => %s, expected=NULL\n", invalid[i], bcpKey);
+ }
+ }
+ static const char* valid[] = {
+ "aa",
+ "0a",
+ };
+ for (int i = 0; i < UPRV_LENGTHOF(valid); i++) {
+ const char* bcpKey = NULL;
+ bcpKey = uloc_toUnicodeLocaleKey(valid[i]);
+ if (bcpKey == NULL) {
+ log_err("toUnicodeLocaleKey: keyword=%s => NULL, expected!=NULL\n", valid[i]);
+ }
+ }
+}
+
static void TestToLegacyKey(void)
{
/* $IN specifies the result should be the input pointer itself */
@@ -6424,7 +6570,7 @@ typedef struct {
} BadLocaleItem;
static const BadLocaleItem badLocaleItems[] = {
- { "-9223372036854775808", "en", "9223372036854775808", U_USING_DEFAULT_WARNING },
+ { "-9223372036854775808", "en", "Unknown language (9223372036854775808)", U_USING_DEFAULT_WARNING },
/* add more in the future */
{ NULL, NULL, NULL, U_ZERO_ERROR } /* terminator */
};
@@ -6452,3 +6598,28 @@ static void TestBadLocaleIDs() {
}
}
}
+
+// Test case for ICU-20370.
+// The issue shows as an Addresss Sanitizer failure.
+static void TestBug20370() {
+ const char *localeID = "x-privatebutreallylongtagfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobar";
+ uint32_t lcid = uloc_getLCID(localeID);
+ if (lcid != 0) {
+ log_err("FAIL: Expected LCID value of 0 for invalid localeID input.");
+ }
+}
+
+// Test case for ICU-20149
+// Handle the duplicate U extension attribute
+static void TestBug20149() {
+ const char *localeID = "zh-u-foo-foo-co-pinyin";
+ char locale[256];
+ UErrorCode status = U_ZERO_ERROR;
+ int32_t parsedLen;
+ locale[0] = '\0';
+ uloc_forLanguageTag(localeID, locale, sizeof(locale), &parsedLen, &status);
+ if (U_FAILURE(status) ||
+ 0 !=strcmp("zh@attribute=foo;collation=pinyin", locale)) {
+ log_err("ERROR: in uloc_forLanguageTag %s return %s\n", myErrorName(status), locale);
+ }
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cloctst.h b/Build/source/libs/icu/icu-src/source/test/cintltst/cloctst.h
index 411ff5c9fe5..be61de10ba8 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cloctst.h
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cloctst.h
@@ -36,7 +36,8 @@ static void TestDisplayNames(void);
/**
* Test getAvailableLocales
**/
- static void TestGetAvailableLocales(void);
+static void TestGetAvailableLocales(void);
+static void TestGetAvailableLocalesByType(void);
/**
* Test functions to set and access a custom data directory
**/
@@ -121,17 +122,18 @@ static void TestOrientation(void);
static void TestLikelySubtags(void);
/**
- * lanuage tag
+ * language tag
*/
static void TestForLanguageTag(void);
-static void TestInvalidLanguageTag(void);
static void TestToLanguageTag(void);
+static void TestBug20132(void);
static void TestLangAndRegionCanonicalize(void);
static void TestToUnicodeLocaleKey(void);
static void TestToLegacyKey(void);
static void TestToUnicodeLocaleType(void);
static void TestToLegacyType(void);
+static void TestBug20149(void);
/**
* locale data
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cmsccoll.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cmsccoll.c
index 8f2a962388c..bc7a7664c49 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cmsccoll.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cmsccoll.c
@@ -588,11 +588,13 @@ static void TestComposeDecompose(void) {
coll = ucol_open("", &status);
if (U_FAILURE(status)) {
log_data_err("Error opening collator -> %s (Are you missing data?)\n", u_errorName(status));
+ uset_close(charsToTest);
return;
}
charsToTestSize = uset_size(charsToTest);
if (charsToTestSize <= 0) {
log_err("Set was zero. Missing data?\n");
+ uset_close(charsToTest);
return;
}
t = (tester **)malloc(charsToTestSize * sizeof(tester *));
@@ -1454,14 +1456,14 @@ static void TestContraction(void) {
UCollationElements *iter2 = ucol_openElements(coll,
&(testdata[i][j]),
1, &status);
- uint32_t ce;
+ int32_t ce;
if (U_FAILURE(status)) {
log_err("Collation iterator creation failed\n");
return;
}
ce = ucol_next(iter2, &status);
while (ce != UCOL_NULLORDER) {
- if ((uint32_t)ucol_next(iter1, &status) != ce) {
+ if (ucol_next(iter1, &status) != ce) {
log_err("Collation elements in contraction split does not match\n");
return;
}
@@ -1819,7 +1821,7 @@ static void TestVariableTopSetting(void) {
}
}
-static void TestMaxVariable() {
+static void TestMaxVariable(void) {
UErrorCode status = U_ZERO_ERROR;
UColReorderCode oldMax, max;
UCollator *coll;
@@ -4102,11 +4104,11 @@ static void TestCroatianSortKey(void) {
return;
}
- uiter_setString(&iter, text, length);
+ uiter_setString(&iter, text, (int32_t)length);
actualSortKeyLen = ucol_nextSortKeyPart(
ucol, &iter, (uint32_t*)uStateInfo,
- textSortKey, lenSortKey, &status
+ textSortKey, (int32_t)lenSortKey, &status
);
if (actualSortKeyLen == lenSortKey) {
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cmsgtst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cmsgtst.c
index 34b05661fde..06952d83469 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cmsgtst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cmsgtst.c
@@ -189,6 +189,7 @@ static void MessageFormatTest( void )
if(U_FAILURE(ec)){
log_data_err("umsg_open() failed for testCasePattens[0]. -> %s (Are you missing data?)\n", u_errorName(ec));
+ umsg_close(formatter);
return;
}
for(i = 0;i<cnt_testCases; i++){
@@ -205,6 +206,7 @@ static void MessageFormatTest( void )
umsg_applyPattern(formatter,testCasePatterns[i],patternLength,&parseError,&ec);
if(U_FAILURE(ec)){
log_err("umsg_applyPattern() failed for testCasePattens[%d].\n",i);
+ umsg_close(formatter);
return;
}
/* pre-flight */
@@ -216,6 +218,7 @@ static void MessageFormatTest( void )
if(U_FAILURE(ec)){
log_err("ERROR: failure in message format on testcase %d: %s\n", i, u_errorName(status) );
free(result);
+ umsg_close(formatter);
return;
}
@@ -404,6 +407,7 @@ static void TestNewFormatAndParseAPI(void)
d1=ucal_getMillis(cal, &status);
if(U_FAILURE(status)){
log_err("Error: failure in get millis: %s\n", myErrorName(status) );
+ goto cleanup;
}
log_verbose("\nTesting with pattern test#4");
@@ -536,14 +540,17 @@ static void TestSampleFormatAndParseWithError(void)
/*try to parse this and check*/
log_verbose("\nTesting the parse Message test#5\n");
- u_parseMessageWithError("en_US", pattern, u_strlen(pattern), result, u_strlen(result), &parseError,&status, &d, ret, &value);
- if(U_FAILURE(status)){
- log_data_err("ERROR: error in parsing: test#5: %s (Are you missing data?)\n", myErrorName(status));
+ if (U_SUCCESS(status)) {
+ u_parseMessageWithError("en_US", pattern, u_strlen(pattern), result, u_strlen(result),
+ &parseError,&status, &d, ret, &value);
+ if(U_FAILURE(status)){
+ log_data_err("ERROR: error in parsing: test#5: %s (Are you missing data?)\n", myErrorName(status));
+ }
+ else if(value!=7 && u_strcmp(str,ret)!=0)
+ log_err("FAIL: Error in parseMessage on test#5 \n");
+ else
+ log_verbose("PASS: parseMessage successful on test#5\n");
}
- else if(value!=7 && u_strcmp(str,ret)!=0)
- log_err("FAIL: Error in parseMessage on test#5 \n");
- else
- log_verbose("PASS: parseMessage successful on test#5\n");
def1 = udat_open(UDAT_DEFAULT,UDAT_DEFAULT ,NULL, NULL, 0, NULL,0,&status);
if(U_FAILURE(status))
@@ -632,14 +639,16 @@ static void TestSampleFormatAndParse(void)
/*try to parse this and check*/
log_verbose("\nTesting the parse Message test#5\n");
- u_parseMessage("en_US", pattern, u_strlen(pattern), result, u_strlen(result), &status, &d, ret, &value);
- if(U_FAILURE(status)){
- log_data_err("ERROR: error in parsing: test#5: %s (Are you missing data?)\n", myErrorName(status));
+ if (U_SUCCESS(status)) {
+ u_parseMessage("en_US", pattern, u_strlen(pattern), result, u_strlen(result), &status, &d, ret, &value);
+ if(U_FAILURE(status)){
+ log_data_err("ERROR: error in parsing: test#5: %s (Are you missing data?)\n", myErrorName(status));
+ }
+ else if(value!=7 && u_strcmp(str,ret)!=0)
+ log_err("FAIL: Error in parseMessage on test#5 \n");
+ else
+ log_verbose("PASS: parseMessage successful on test#5\n");
}
- else if(value!=7 && u_strcmp(str,ret)!=0)
- log_err("FAIL: Error in parseMessage on test#5 \n");
- else
- log_verbose("PASS: parseMessage successful on test#5\n");
def1 = udat_open(UDAT_DEFAULT,UDAT_DEFAULT ,NULL, NULL, 0, NULL,0,&status);
if(U_FAILURE(status))
@@ -1123,7 +1132,7 @@ static void MessageLength(void)
}
}
-static void TestMessageWithUnusedArgNumber() {
+static void TestMessageWithUnusedArgNumber(void) {
UErrorCode errorCode = U_ZERO_ERROR;
U_STRING_DECL(pattern, "abc {1} def", 11);
UChar x[2] = { 0x78, 0 }; // "x"
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cnmdptst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cnmdptst.c
index 85ffd6302ca..a40db7c49db 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cnmdptst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cnmdptst.c
@@ -37,7 +37,6 @@
#define CHECK(status,str) if (U_FAILURE(status)) { log_err("FAIL: %s\n", str); return; }
void addNumFrDepTest(TestNode** root);
-static void TestCurrencyPreEuro(void);
static void TestCurrencyObject(void);
void addNumFrDepTest(TestNode** root)
@@ -47,7 +46,6 @@ void addNumFrDepTest(TestNode** root)
addTest(root, &TestExponential, "tsformat/cnmdptst/TestExponential");
addTest(root, &TestCurrencySign, "tsformat/cnmdptst/TestCurrencySign");
addTest(root, &TestCurrency, "tsformat/cnmdptst/TestCurrency");
- addTest(root, &TestCurrencyPreEuro, "tsformat/cnmdptst/TestCurrencyPreEuro");
addTest(root, &TestCurrencyObject, "tsformat/cnmdptst/TestCurrencyObject");
addTest(root, &TestRounding487, "tsformat/cnmdptst/TestRounding487");
addTest(root, &TestDoubleAttribute, "tsformat/cnmdptst/TestDoubleAttribute");
@@ -258,6 +256,8 @@ static void TestExponential(void)
fmt=unum_open(UNUM_IGNORE,upat, u_strlen(upat), "en_US",NULL, &status);
if (U_FAILURE(status)) {
log_err_status(status, "FAIL: Bad status returned by Number format construction with pattern %s -> %s\n", pat[p], u_errorName(status));
+ free(upat);
+ upat = NULL;
continue;
}
lneed= u_strlen(upat) + 1;
@@ -418,7 +418,7 @@ static void TestCurrency(void)
UFieldPosition pos;
UChar res[100];
UErrorCode status = U_ZERO_ERROR;
- const char* locale[]={"fr_CA", "de_DE_PREEURO", "fr_FR_PREEURO"};
+ const char* locale[]={"fr_CA", "de_DE@currency=DEM", "fr_FR@currency=FRF"};
const char* result[]={"1,50\\u00a0$", "1,50\\u00a0DM", "1,50\\u00a0F"};
log_verbose("\nTesting the number format with different currency patterns\n");
for(i=0; i < 3; i++)
@@ -454,73 +454,6 @@ static void TestCurrency(void)
free(str);
}
}
-/**
- * Test localized currency patterns for PREEURO variants.
- */
-static void TestCurrencyPreEuro(void)
-{
- UNumberFormat *currencyFmt;
- UChar *str=NULL, *res=NULL;
- int32_t lneed, i;
- UFieldPosition pos;
- UErrorCode status = U_ZERO_ERROR;
-
- const char* locale[]={
- "ca_ES_PREEURO", "de_LU_PREEURO", "en_IE_PREEURO", "fi_FI_PREEURO", "fr_LU_PREEURO", "it_IT_PREEURO",
- "pt_PT_PREEURO", "de_AT_PREEURO", "el_GR_PREEURO", "es_ES_PREEURO", "fr_BE_PREEURO", "ga_IE_PREEURO",
- "nl_BE_PREEURO", "de_DE_PREEURO", "en_BE_PREEURO", "eu_ES_PREEURO", "fr_FR_PREEURO", "gl_ES_PREEURO",
- "nl_NL_PREEURO",
- };
-
- const char* result[]={
- "\\u20A7\\u00A02", "2\\u00A0F", "IEP\\u00A01.50", "1,50\\u00A0mk", "2\\u00A0F", "ITL\\u00A02",
- "1$50\\u00A0\\u200B", "\\u00F6S\\u00A01,50", "1,50\\u00A0\\u0394\\u03C1\\u03C7", "2\\u00A0\\u20A7", "1,50\\u00A0FB", "IEP\\u00A01.50",
- "BEF\\u00A01,50", "1,50\\u00A0DM", "1,50\\u00A0BEF", "\\u20A7\\u00A02", "1,50\\u00A0F", "2\\u00A0\\u20A7",
- "NLG\\u00A01,50"
- };
-
- log_verbose("\nTesting the number format with different currency patterns\n");
- for(i=0; i < 19; i++)
- {
- char curID[256] = {0};
- uloc_canonicalize(locale[i], curID, 256, &status);
- if(U_FAILURE(status)){
- log_data_err("Could not canonicalize %s. Error: %s (Are you missing data?)\n", locale[i], u_errorName(status));
- continue;
- }
- currencyFmt = unum_open(UNUM_CURRENCY, NULL,0,curID,NULL, &status);
-
- if(U_FAILURE(status)){
- log_data_err("Error in the construction of number format with style currency: %s (Are you missing data?)\n",
- myErrorName(status));
- } else {
- lneed=0;
- lneed= unum_formatDouble(currencyFmt, 1.50, NULL, lneed, NULL, &status);
-
- if(status==U_BUFFER_OVERFLOW_ERROR){
- status=U_ZERO_ERROR;
- str=(UChar*)malloc(sizeof(UChar) * (lneed+1) );
- pos.field = 0;
- unum_formatDouble(currencyFmt, 1.50, str, lneed+1, &pos, &status);
- }
-
- if(U_FAILURE(status)) {
- log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status) );
- } else {
- res=(UChar*)malloc(sizeof(UChar) * (strlen(result[i])+1) );
- u_unescape(result[i],res,(int32_t)(strlen(result[i])+1));
-
- if (u_strcmp(str, res) != 0){
- log_err("FAIL: Expected %s Got: %s for locale: %s\n", result[i],aescstrdup(str, -1),locale[i]);
- }
- }
- }
-
- unum_close(currencyFmt);
- free(str);
- free(res);
- }
-}
/**
* Test currency "object" (we use this name to match the other C++
@@ -966,7 +899,7 @@ static void TestGetKeywordValuesForLocale(void) {
ALLList = ulist_getListFromEnum(ALL);
for (j = 0; j < size; j++) {
if ((value = uenum_next(all, &valueLength, &status)) != NULL && U_SUCCESS(status)) {
- if (!ulist_containsString(ALLList, value, uprv_strlen(value))) {
+ if (!ulist_containsString(ALLList, value, (int32_t)uprv_strlen(value))) {
log_err("Locale %s have %s not in ALL\n", loc, value);
matchAll = FALSE;
break;
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cnormtst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cnormtst.c
index fe7237abc81..a71a3f3a0e9 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cnormtst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cnormtst.c
@@ -484,6 +484,7 @@ static void TestQuickCheckStringResult()
UNORM_YES)
{
log_data_err("ERROR in NFD quick check for string at count %d - (Are you missing data?)\n", count);
+ free(d); free(c);
return;
}
@@ -491,6 +492,7 @@ static void TestQuickCheckStringResult()
UNORM_NO)
{
log_err("ERROR in NFC quick check for string at count %d\n", count);
+ free(d); free(c);
return;
}
@@ -506,6 +508,7 @@ static void TestQuickCheckStringResult()
UNORM_YES)
{
log_data_err("ERROR in NFKD quick check for string at count %d\n", count);
+ free(d); free(c);
return;
}
@@ -513,6 +516,7 @@ static void TestQuickCheckStringResult()
UNORM_YES)
{
log_err("ERROR in NFKC quick check for string at count %d\n", count);
+ free(d); free(c);
return;
}
@@ -661,7 +665,7 @@ void TestCheckFCD()
for (count = 0; count < 50; count ++)
{
int size = 0;
- UBool testresult = UNORM_YES;
+ UNormalizationCheckResult testresult = UNORM_YES;
UChar data[20];
UChar norm[100];
UChar nfd[100];
@@ -1413,6 +1417,7 @@ TestQuickCheckPerCP() {
log_data_err("%s:%d errorCode=%s\n", __FILE__, __LINE__, u_errorName(errorCode));
break;
}
+
/* length-length == 0 is used to get around a compiler warning. */
U16_GET(nfd, 0, length-length, length, lead);
U16_GET(nfd, 0, length-1, length, trail);
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cnumtst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cnumtst.c
index 7090f67dca6..dbbac083b93 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cnumtst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cnumtst.c
@@ -37,6 +37,7 @@
#include "cmemory.h"
#include "cstring.h"
#include "putilimp.h"
+#include "uassert.h"
#include <stdio.h>
#include <stdlib.h>
@@ -55,6 +56,9 @@ static void TestInt64Parse(void);
static void TestParseCurrency(void);
static void TestMaxInt(void);
static void TestNoExponent(void);
+static void TestSignAlwaysShown(void);
+static void TestMinimumGroupingDigits(void);
+static void TestParseCaseSensitive(void);
static void TestUFormattable(void);
static void TestUNumberingSystem(void);
static void TestCurrencyIsoPluralFormat(void);
@@ -66,6 +70,10 @@ static void TestParseCurrPatternWithDecStyle(void);
static void TestFormatForFields(void);
static void TestRBNFRounding(void);
static void Test12052_NullPointer(void);
+static void TestParseCases(void);
+static void TestSetMaxFracAndRoundIncr(void);
+static void TestIgnorePadding(void);
+static void TestSciNotationMaxFracCap(void);
#define TESTCASE(x) addTest(root, &x, "tsformat/cnumtst/" #x)
@@ -89,6 +97,9 @@ void addNumForTest(TestNode** root)
TESTCASE(TestCloneWithRBNF);
TESTCASE(TestMaxInt);
TESTCASE(TestNoExponent);
+ TESTCASE(TestSignAlwaysShown);
+ TESTCASE(TestMinimumGroupingDigits);
+ TESTCASE(TestParseCaseSensitive);
TESTCASE(TestUFormattable);
TESTCASE(TestUNumberingSystem);
TESTCASE(TestCurrencyIsoPluralFormat);
@@ -99,6 +110,10 @@ void addNumForTest(TestNode** root)
TESTCASE(TestParseCurrPatternWithDecStyle);
TESTCASE(TestFormatForFields);
TESTCASE(Test12052_NullPointer);
+ TESTCASE(TestParseCases);
+ TESTCASE(TestSetMaxFracAndRoundIncr);
+ TESTCASE(TestIgnorePadding);
+ TESTCASE(TestSciNotationMaxFracCap);
}
/* test Parse int 64 */
@@ -485,7 +500,7 @@ free(result);
pattern=unum_open(UNUM_IGNORE,temp1, u_strlen(temp1), NULL, NULL,&status);
if(U_FAILURE(status))
{
- log_err("error in unum_openPattern(): %s\n", myErrorName(status) );;
+ log_err("error in unum_openPattern(): %s\n", myErrorName(status) );
}
else
log_verbose("Pass: unum_openPattern() works fine\n");
@@ -868,9 +883,9 @@ free(result);
log_err("File %s, Line %d, (expected, acutal) = (\"%s\", \"%s\")\n",
__FILE__, __LINE__, numFormatted, desta);
}
- if (strlen(numFormatted) != resultSize) {
+ if ((int32_t)strlen(numFormatted) != resultSize) {
log_err("File %s, Line %d, (expected, actual) = (%d, %d)\n",
- __FILE__, __LINE__, strlen(numFormatted), resultSize);
+ __FILE__, __LINE__, (int32_t)strlen(numFormatted), resultSize);
}
/* Format with a FieldPosition parameter */
@@ -909,9 +924,9 @@ free(result);
log_verbose("File %s, Line %d, got expected = \"%s\"\n",
__FILE__, __LINE__, desta);
}
- if (strlen(parseExpected) != resultSize) {
+ if ((int32_t)strlen(parseExpected) != resultSize) {
log_err("File %s, Line %d, (expected, actual) = (%d, %d)\n",
- __FILE__, __LINE__, strlen(parseExpected), resultSize);
+ __FILE__, __LINE__, (int32_t)strlen(parseExpected), resultSize);
}
/* Parse with a parsePos parameter */
@@ -931,9 +946,9 @@ free(result);
log_verbose("File %s, Line %d, got expected = \"%s\"\n",
__FILE__, __LINE__, desta);
}
- if (strlen(numFormatted) != parsePos) {
+ if ((int32_t)strlen(numFormatted) != parsePos) {
log_err("File %s, Line %d, parsePos (expected, actual) = (\"%d\", \"%d\")\n",
- __FILE__, __LINE__, strlen(parseExpected), parsePos);
+ __FILE__, __LINE__, (int32_t)strlen(parseExpected), parsePos);
}
unum_close(fmt);
@@ -1057,7 +1072,7 @@ static const ParseCurrencyItem parseCurrencyItems[] = {
{ "fr_FR", "euros8", euros8Sym, NULL, U_PARSE_ERROR, 2, 0.0, U_PARSE_ERROR, 2, 0.0, "" },
{ "fr_FR", "dollars2", dollars2Sym, NULL, U_PARSE_ERROR, 0, 0.0, U_PARSE_ERROR, 0, 0.0, "" },
{ "fr_FR", "dollars4", dollars4Sym, NULL, U_PARSE_ERROR, 0, 0.0, U_PARSE_ERROR, 0, 0.0, "" },
-
+
{ NULL, NULL, NULL, NULL, 0, 0, 0.0, 0, 0, 0.0, NULL }
};
@@ -1310,7 +1325,7 @@ static void TestNumberFormatPadding()
pattern=unum_open(UNUM_IGNORE,temp1, u_strlen(temp1), "en_US",NULL, &status);
if(U_FAILURE(status))
{
- log_err_status(status, "error in padding unum_openPattern(%s): %s\n", temp1, myErrorName(status) );;
+ log_err_status(status, "error in padding unum_openPattern(%s): %s\n", temp1, myErrorName(status) );
}
else {
log_verbose("Pass: padding unum_openPattern() works fine\n");
@@ -1612,7 +1627,7 @@ static void test_fmt(UNumberFormat* fmt, UBool isDecimal) {
/* set the default ruleset to the first one found, and retry */
if (len > 0) {
- for (i = 0; i < len && temp[i] != ';'; ++i){};
+ for (i = 0; i < len && temp[i] != ';'; ++i){}
if (i < len) {
buffer[i] = 0;
unum_setTextAttribute(fmt, UNUM_DEFAULT_RULESET, buffer, -1, &status);
@@ -1822,6 +1837,8 @@ static void TestRBNFRounding() {
return;
}
len = unum_formatDouble(fmt, 10.123456789, fmtbuf, FORMAT_BUF_CAPACITY, NULL, &status);
+ U_ASSERT(len < FORMAT_BUF_CAPACITY);
+ (void)len;
if (U_FAILURE(status)) {
log_err_status(status, "unum_formatDouble 10.123456789 failed with %s\n", u_errorName(status));
}
@@ -1841,6 +1858,7 @@ static void TestRBNFRounding() {
log_err("UNUM_ROUNDING_MODE was not set -> %d\n", unum_getAttribute(fmt, UNUM_ROUNDING_MODE));
}
len = unum_formatDouble(fmt, 10.123456789, fmtbuf, FORMAT_BUF_CAPACITY, NULL, &status);
+ U_ASSERT(len < FORMAT_BUF_CAPACITY);
if (U_FAILURE(status)) {
log_err_status(status, "unum_formatDouble 10.123456789 failed with %s\n", u_errorName(status));
}
@@ -2028,7 +2046,7 @@ static void TestNBSPInPattern(void) {
}
-static void TestCloneWithRBNF(void) {
+static void TestCloneWithRBNF(void) {
UChar pattern[1024];
UChar pat2[512];
UErrorCode status = U_ZERO_ERROR;
@@ -2259,6 +2277,67 @@ static void TestMaxInt(void) {
unum_close(fmt);
}
+static void TestSignAlwaysShown(void) {
+ UErrorCode status = U_ZERO_ERROR;
+ UNumberFormat *fmt = unum_open(
+ UNUM_DECIMAL, /* style */
+ NULL, /* pattern */
+ 0, /* patternLength */
+ "en-US",
+ NULL, /* parseErr */
+ &status);
+ assertSuccess("Creating UNumberFormat", &status);
+ unum_setAttribute(fmt, UNUM_SIGN_ALWAYS_SHOWN, 1);
+ UChar result[100];
+ unum_formatDouble(fmt, 42, result, 100, NULL, &status);
+ assertSuccess("Formatting with UNumberFormat", &status);
+ assertUEquals("Result with sign always shown", u"+42", result);
+ unum_close(fmt);
+}
+
+static void TestMinimumGroupingDigits(void) {
+ UErrorCode status = U_ZERO_ERROR;
+ UNumberFormat *fmt = unum_open(
+ UNUM_DECIMAL, /* style */
+ NULL, /* pattern */
+ 0, /* patternLength */
+ "en-US",
+ NULL, /* parseErr */
+ &status);
+ assertSuccess("Creating UNumberFormat", &status);
+ unum_setAttribute(fmt, UNUM_MINIMUM_GROUPING_DIGITS, 2);
+ UChar result[100];
+ unum_formatDouble(fmt, 1234, result, 100, NULL, &status);
+ assertSuccess("Formatting with UNumberFormat A", &status);
+ assertUEquals("Result with minimum grouping digits A", u"1234", result);
+ unum_formatDouble(fmt, 12345, result, 100, NULL, &status);
+ assertSuccess("Formatting with UNumberFormat B", &status);
+ assertUEquals("Result with minimum grouping digits B", u"12,345", result);
+ unum_close(fmt);
+}
+
+static void TestParseCaseSensitive(void) {
+ UErrorCode status = U_ZERO_ERROR;
+ UNumberFormat *fmt = unum_open(
+ UNUM_DECIMAL, /* style */
+ NULL, /* pattern */
+ 0, /* patternLength */
+ "en-US",
+ NULL, /* parseErr */
+ &status);
+ assertSuccess("Creating UNumberFormat", &status);
+ double result = unum_parseDouble(fmt, u"1e2", -1, NULL, &status);
+ assertSuccess("Parsing with UNumberFormat, case insensitive", &status);
+ assertIntEquals("Result with case sensitive", 100, (int64_t)result);
+ unum_setAttribute(fmt, UNUM_PARSE_CASE_SENSITIVE, 1);
+ int32_t ppos = 0;
+ result = unum_parseDouble(fmt, u"1e2", -1, &ppos, &status);
+ assertSuccess("Parsing with UNumberFormat, case sensitive", &status);
+ assertIntEquals("Position with case sensitive", 1, ppos);
+ assertIntEquals("Result with case sensitive", 1, (int64_t)result);
+ unum_close(fmt);
+}
+
static void TestUFormattable(void) {
UChar out2k[2048];
// simple test for API docs
@@ -2402,7 +2481,7 @@ static void TestUNumberingSystem(void) {
UEnumeration * uenum;
const char * numsys;
UErrorCode status;
-
+
for (itemPtr = numSysTestItems; itemPtr->locale != NULL; itemPtr++) {
status = U_ZERO_ERROR;
unumsys = unumsys_open(itemPtr->locale, &status);
@@ -2425,34 +2504,38 @@ static void TestUNumberingSystem(void) {
log_data_err("unumsys_open for locale %s fails with status %s\n", itemPtr->locale, myErrorName(status));
}
}
-
- status = U_ZERO_ERROR;
- uenum = unumsys_openAvailableNames(&status);
- if ( U_SUCCESS(status) ) {
- int32_t numsysCount = 0;
- // sanity check for a couple of number systems that must be in the enumeration
- UBool foundLatn = FALSE;
- UBool foundArab = FALSE;
- while ( (numsys = uenum_next(uenum, NULL, &status)) != NULL && U_SUCCESS(status) ) {
- status = U_ZERO_ERROR;
- unumsys = unumsys_openByName(numsys, &status);
- if ( U_SUCCESS(status) ) {
- numsysCount++;
- if ( uprv_strcmp(numsys, "latn") ) foundLatn = TRUE;
- if ( uprv_strcmp(numsys, "arab") ) foundArab = TRUE;
- unumsys_close(unumsys);
- } else {
- log_err("unumsys_openAvailableNames includes %s but unumsys_openByName on it fails with status %s\n",
- numsys, myErrorName(status));
+
+ for (int i=0; i<3; ++i) {
+ // Run the test of unumsys_openAvailableNames() multiple times.
+ // Helps verify the management of the internal cache of the names.
+ status = U_ZERO_ERROR;
+ uenum = unumsys_openAvailableNames(&status);
+ if ( U_SUCCESS(status) ) {
+ int32_t numsysCount = 0;
+ // sanity check for a couple of number systems that must be in the enumeration
+ UBool foundLatn = FALSE;
+ UBool foundArab = FALSE;
+ while ( (numsys = uenum_next(uenum, NULL, &status)) != NULL && U_SUCCESS(status) ) {
+ status = U_ZERO_ERROR;
+ unumsys = unumsys_openByName(numsys, &status);
+ if ( U_SUCCESS(status) ) {
+ numsysCount++;
+ if ( uprv_strcmp(numsys, "latn") ) foundLatn = TRUE;
+ if ( uprv_strcmp(numsys, "arab") ) foundArab = TRUE;
+ unumsys_close(unumsys);
+ } else {
+ log_err("unumsys_openAvailableNames includes %s but unumsys_openByName on it fails with status %s\n",
+ numsys, myErrorName(status));
+ }
}
+ uenum_close(uenum);
+ if ( numsysCount < 40 || !foundLatn || !foundArab ) {
+ log_err("unumsys_openAvailableNames results incomplete: numsysCount %d, foundLatn %d, foundArab %d\n",
+ numsysCount, foundLatn, foundArab);
+ }
+ } else {
+ log_data_err("unumsys_openAvailableNames fails with status %s\n", myErrorName(status));
}
- uenum_close(uenum);
- if ( numsysCount < 40 || !foundLatn || !foundArab ) {
- log_err("unumsys_openAvailableNames results incomplete: numsysCount %d, foundLatn %d, foundArab %d\n",
- numsysCount, foundLatn, foundArab);
- }
- } else {
- log_data_err("unumsys_openAvailableNames fails with status %s\n", myErrorName(status));
}
}
@@ -2484,8 +2567,8 @@ static void TestCurrencyIsoPluralFormat(void) {
{"zh_CN", "1234.56", "USD", "US$1,234.56", "US$1,234.56", "US$1,234.56", "USD\\u00A01,234.56", "1,234.56\\u00A0\\u7F8E\\u5143"},
// {"zh_CN", "1", "CHY", "CHY1.00", "CHY1.00", "CHY1.00", "CHY1.00", "1.00 CHY"}, // wrong ISO code
// {"zh_CN", "1234.56", "CHY", "CHY1,234.56", "CHY1,234.56", "CHY1,234.56", "CHY1,234.56", "1,234.56 CHY"}, // wrong ISO code
- {"zh_CN", "1", "CNY", "\\uFFE51.00", "\\uFFE51.00", "\\uFFE51.00", "CNY\\u00A01.00", "1.00\\u00A0\\u4EBA\\u6C11\\u5E01"},
- {"zh_CN", "1234.56", "CNY", "\\uFFE51,234.56", "\\uFFE51,234.56", "\\uFFE51,234.56", "CNY\\u00A01,234.56", "1,234.56\\u00A0\\u4EBA\\u6C11\\u5E01"},
+ {"zh_CN", "1", "CNY", "\\u00A51.00", "\\u00A51.00", "\\u00A51.00", "CNY\\u00A01.00", "1.00\\u00A0\\u4EBA\\u6C11\\u5E01"},
+ {"zh_CN", "1234.56", "CNY", "\\u00A51,234.56", "\\u00A51,234.56", "\\u00A51,234.56", "CNY\\u00A01,234.56", "1,234.56\\u00A0\\u4EBA\\u6C11\\u5E01"},
{"ru_RU", "1", "RUB", "1,00\\u00A0\\u20BD", "1,00\\u00A0\\u20BD", "1,00\\u00A0\\u20BD", "1,00\\u00A0RUB", "1,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E "
"\\u0440\\u0443\\u0431\\u043B\\u044F"},
{"ru_RU", "2", "RUB", "2,00\\u00A0\\u20BD", "2,00\\u00A0\\u20BD", "2,00\\u00A0\\u20BD", "2,00\\u00A0RUB", "2,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E "
@@ -2507,8 +2590,8 @@ static void TestCurrencyIsoPluralFormat(void) {
};
int32_t i, sIndex;
-
- for (i=0; i<UPRV_LENGTHOF(DATA); ++i) {
+
+ for (i=0; i<UPRV_LENGTHOF(DATA); ++i) {
const char* localeString = DATA[i][0];
double numberToBeFormat = atof(DATA[i][1]);
const char* currencyISOCode = DATA[i][2];
@@ -2519,7 +2602,7 @@ static void TestCurrencyIsoPluralFormat(void) {
UChar ubufResult[kUBufMax];
UChar ubufExpected[kUBufMax];
int32_t ulenRes;
-
+
UNumberFormat* unumFmt = unum_open(style, NULL, 0, localeString, NULL, &status);
if (U_FAILURE(status)) {
log_data_err("FAIL: unum_open, locale %s, style %d - %s\n", localeString, (int)style, myErrorName(status));
@@ -2542,7 +2625,7 @@ static void TestCurrencyIsoPluralFormat(void) {
}
unum_close(unumFmt);
}
- }
+ }
}
typedef struct {
@@ -2568,7 +2651,7 @@ static const TestContextItem tcItems[] = { /* results for 123.45 */
static void TestContext(void) {
UErrorCode status = U_ZERO_ERROR;
const TestContextItem* itemPtr;
-
+
UNumberFormat *unum = unum_open(UNUM_SPELLOUT, NULL, 0, "en", NULL, &status);
if ( U_SUCCESS(status) ) {
UDisplayContext context = unum_getContext(unum, UDISPCTX_TYPE_CAPITALIZATION, &status);
@@ -2589,7 +2672,7 @@ static void TestContext(void) {
for (itemPtr = tcItems; itemPtr->locale != NULL; itemPtr++) {
UChar ubufResult[kUBufMax];
int32_t ulenRes;
-
+
status = U_ZERO_ERROR;
unum = unum_open(itemPtr->style, NULL, 0, itemPtr->locale, NULL, &status);
if (U_FAILURE(status)) {
@@ -2607,7 +2690,7 @@ static void TestContext(void) {
int32_t ulenExp = u_unescape(itemPtr->expectedResult, ubufExpected, kUBufMax);
if (ulenRes != ulenExp || u_strncmp(ubufResult, ubufExpected, ulenExp) != 0) {
char bbuf[kUBufMax*2];
- u_austrncpy(bbuf, ubufResult, sizeof(bbuf));
+ u_austrncpy(bbuf, ubufResult, sizeof(bbuf));
log_err("FAIL: unum_formatDouble, locale %s, style %d, context %d, expected %d:\"%s\", got %d:\"%s\"\n",
itemPtr->locale, (int)itemPtr->style, (int)itemPtr->context, ulenExp,
itemPtr->expectedResult, ulenRes, bbuf);
@@ -2666,7 +2749,7 @@ static void TestCurrencyUsage(void) {
log_err("FAIL: currency usage attribute is not UNUM_CURRENCY_CASH\n");
}
- for (j=0; j<UPRV_LENGTHOF(DATA); ++j) {
+ for (j=0; j<UPRV_LENGTHOF(DATA); ++j) {
UChar expect[64];
int32_t expectLen;
UChar currencyCode[4];
@@ -2690,7 +2773,7 @@ static void TestCurrencyUsage(void) {
}
}
-
+
unum_close(unumFmt);
}
}
@@ -2891,7 +2974,7 @@ static const LocStyleAttributeTest lsaTests[] = {
{ "en", UNUM_DECIMAL_COMPACT_SHORT, UNUM_MIN_SIGNIFICANT_DIGITS, 3, enShortMin3 },
{ "ja", UNUM_DECIMAL_COMPACT_SHORT, UNUM_MAX_SIGNIFICANT_DIGITS, 2, jaShortMax2 },
{ "sr", UNUM_DECIMAL_COMPACT_LONG, UNUM_MAX_SIGNIFICANT_DIGITS, 2, srLongMax2 },
- { NULL, (UNumberFormatStyle)0, -1, 0, NULL }
+ { NULL, (UNumberFormatStyle)0, -1, 0, NULL }
};
static void TestVariousStylesAndAttributes(void) {
@@ -2914,7 +2997,7 @@ static void TestVariousStylesAndAttributes(void) {
UChar uexp[kUBufSize];
UChar uget[kUBufSize];
int32_t uexplen, ugetlen;
-
+
status = U_ZERO_ERROR;
uexplen = u_unescape(veItemPtr->expected, uexp, kUBufSize);
ugetlen = unum_formatDouble(unum, veItemPtr->value, uget, kUBufSize, NULL, &status);
@@ -3079,4 +3162,317 @@ static void Test12052_NullPointer() {
unum_close(theFormatter);
}
+typedef struct {
+ const char* locale;
+ const UChar* text; // text to parse
+ UBool lenient; // leniency to use
+ UBool intOnly; // whether to set PARSE_INT_ONLY
+ UErrorCode intStatus; // expected status from parse
+ int32_t intPos; // expected final pos from parse
+ int32_t intValue; // expected value from parse
+ UErrorCode doubStatus; // expected status from parseDouble
+ int32_t doubPos; // expected final pos from parseDouble
+ double doubValue; // expected value from parseDouble
+ UErrorCode decStatus; // expected status from parseDecimal
+ int32_t decPos; // expected final pos from parseDecimal
+ const char* decString; // expected output string from parseDecimal
+
+} ParseCaseItem;
+
+static const ParseCaseItem parseCaseItems[] = {
+ { "en", u"0,000", FALSE, FALSE, U_ZERO_ERROR, 5, 0, U_ZERO_ERROR, 5, 0.0, U_ZERO_ERROR, 5, "0" },
+ { "en", u"0,000", TRUE, FALSE, U_ZERO_ERROR, 5, 0, U_ZERO_ERROR, 5, 0.0, U_ZERO_ERROR, 5, "0" },
+ { "en", u"1000,000", FALSE, FALSE, U_PARSE_ERROR, 0, 0, U_PARSE_ERROR, 0, 0.0, U_PARSE_ERROR, 0, "" },
+ { "en", u"1000,000", TRUE, FALSE, U_ZERO_ERROR, 8, 1000000, U_ZERO_ERROR, 8, 1000000.0, U_ZERO_ERROR, 8, "1000000" },
+ { "en", u"", FALSE, FALSE, U_PARSE_ERROR, 0, 0, U_PARSE_ERROR, 0, 0.0, U_PARSE_ERROR, 0, "" },
+ { "en", u"", TRUE, FALSE, U_PARSE_ERROR, 0, 0, U_PARSE_ERROR, 0, 0.0, U_PARSE_ERROR, 0, "" },
+ { "en", u"9999990000503021", FALSE, FALSE, U_INVALID_FORMAT_ERROR, 16, 2147483647, U_ZERO_ERROR, 16, 9999990000503020.0, U_ZERO_ERROR, 16, "9999990000503021" },
+ { "en", u"9999990000503021", FALSE, TRUE, U_INVALID_FORMAT_ERROR, 16, 2147483647, U_ZERO_ERROR, 16, 9999990000503020.0, U_ZERO_ERROR, 16, "9999990000503021" },
+ { "en", u"1000000.5", FALSE, FALSE, U_ZERO_ERROR, 9, 1000000, U_ZERO_ERROR, 9, 1000000.5, U_ZERO_ERROR, 9, "1.0000005E+6"},
+ { "en", u"1000000.5", FALSE, TRUE, U_ZERO_ERROR, 7, 1000000, U_ZERO_ERROR, 7, 1000000.0, U_ZERO_ERROR, 7, "1000000" },
+ { "en", u"123.5", FALSE, FALSE, U_ZERO_ERROR, 5, 123, U_ZERO_ERROR, 5, 123.5, U_ZERO_ERROR, 5, "123.5" },
+ { "en", u"123.5", FALSE, TRUE, U_ZERO_ERROR, 3, 123, U_ZERO_ERROR, 3, 123.0, U_ZERO_ERROR, 3, "123" },
+ { NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0.0, 0, 0, NULL }
+};
+
+static void TestParseCases(void) {
+ const ParseCaseItem* itemPtr;
+ for (itemPtr = parseCaseItems; itemPtr->locale != NULL; itemPtr++) {
+ UErrorCode status = U_ZERO_ERROR;
+ UNumberFormat* unumDec = unum_open(UNUM_DECIMAL, NULL, 0, itemPtr->locale, NULL, &status);
+ if (U_FAILURE(status)) {
+ log_data_err("unum_open UNUM_DECIMAL fails for locale %s: %s\n", itemPtr->locale, u_errorName(status));
+ continue;
+ }
+ int32_t intValue, parsePos, dclen;
+ double doubValue;
+ char decstr[32];
+ unum_setAttribute(unumDec, UNUM_LENIENT_PARSE, itemPtr->lenient);
+ unum_setAttribute(unumDec, UNUM_PARSE_INT_ONLY, itemPtr->intOnly);
+
+ parsePos = 0;
+ status = U_ZERO_ERROR;
+ intValue = unum_parse(unumDec, itemPtr->text, -1, &parsePos, &status);
+ if (status != itemPtr->intStatus || parsePos != itemPtr->intPos || intValue != itemPtr->intValue) {
+ char btext[32];
+ u_austrcpy(btext, itemPtr->text);
+ log_err("locale %s, text \"%s\", lenient %d, intOnly %d;\n parse expected status %s, pos %d, value %d;\n got %s, %d, %d\n",
+ itemPtr->locale, btext, itemPtr->lenient, itemPtr->intOnly,
+ u_errorName(itemPtr->intStatus), itemPtr->intPos, itemPtr->intValue,
+ u_errorName(status), parsePos, intValue);
+ }
+
+ parsePos = 0;
+ status = U_ZERO_ERROR;
+ doubValue = unum_parseDouble(unumDec, itemPtr->text, -1, &parsePos, &status);
+ if (status != itemPtr->doubStatus || parsePos != itemPtr->doubPos || doubValue != itemPtr->doubValue) {
+ char btext[32];
+ u_austrcpy(btext, itemPtr->text);
+ log_err("locale %s, text \"%s\", lenient %d, intOnly %d;\n parseDouble expected status %s, pos %d, value %.1f;\n got %s, %d, %.1f\n",
+ itemPtr->locale, btext, itemPtr->lenient, itemPtr->intOnly,
+ u_errorName(itemPtr->doubStatus), itemPtr->doubPos, itemPtr->doubValue,
+ u_errorName(status), parsePos, doubValue);
+ }
+
+ parsePos = 0;
+ status = U_ZERO_ERROR;
+ decstr[0] = 0;
+ dclen = unum_parseDecimal(unumDec, itemPtr->text, -1, &parsePos, decstr, 32, &status);
+ (void)dclen;
+ if (status != itemPtr->decStatus || parsePos != itemPtr->decPos || uprv_strcmp(decstr,itemPtr->decString) != 0) {
+ char btext[32];
+ u_austrcpy(btext, itemPtr->text);
+ log_err("locale %s, text \"%s\", lenient %d, intOnly %d;\n parseDecimal expected status %s, pos %d, str \"%s\";\n got %s, %d, \"%s\"\n",
+ itemPtr->locale, btext, itemPtr->lenient, itemPtr->intOnly,
+ u_errorName(itemPtr->decStatus), itemPtr->decPos, itemPtr->decString,
+ u_errorName(status), parsePos, decstr);
+ }
+
+ unum_close(unumDec);
+ }
+}
+
+typedef struct {
+ const char* descrip;
+ const char* locale;
+ UNumberFormatStyle style;
+ int32_t minInt;
+ int32_t minFrac;
+ int32_t maxFrac;
+ double roundIncr;
+ const UChar* expPattern;
+ double valueToFmt;
+ const UChar* expFormat;
+} SetMaxFracAndRoundIncrItem;
+
+static const SetMaxFracAndRoundIncrItem maxFracAndRoundIncrItems[] = {
+ // descrip locale style mnI mnF mxF rdInc expPat value expFmt
+ { "01 en_US DEC 1/0/3/0.0", "en_US", UNUM_DECIMAL, 1, 0, 3, 0.0, u"#,##0.###", 0.128, u"0.128" },
+ { "02 en_US DEC 1/0/1/0.0", "en_US", UNUM_DECIMAL, 1, 0, 1, 0.0, u"#,##0.#", 0.128, u"0.1" },
+ { "03 en_US DEC 1/0/1/0.01", "en_US", UNUM_DECIMAL, 1, 0, 1, 0.01, u"#,##0.#", 0.128, u"0.1" },
+ { "04 en_US DEC 1/1/1/0.01", "en_US", UNUM_DECIMAL, 1, 1, 1, 0.01, u"#,##0.0", 0.128, u"0.1" },
+ { "05 en_US DEC 1/0/1/0.1", "en_US", UNUM_DECIMAL, 1, 0, 1, 0.1, u"#,##0.1", 0.128, u"0.1" }, // use incr
+ { "06 en_US DEC 1/1/1/0.1", "en_US", UNUM_DECIMAL, 1, 1, 1, 0.1, u"#,##0.1", 0.128, u"0.1" }, // use incr
+
+ { "10 en_US DEC 1/0/1/0.02", "en_US", UNUM_DECIMAL, 1, 0, 1, 0.02, u"#,##0.#", 0.128, u"0.1" },
+ { "11 en_US DEC 1/0/2/0.02", "en_US", UNUM_DECIMAL, 1, 0, 2, 0.02, u"#,##0.02", 0.128, u"0.12" }, // use incr
+ { "12 en_US DEC 1/0/3/0.02", "en_US", UNUM_DECIMAL, 1, 0, 3, 0.02, u"#,##0.02#", 0.128, u"0.12" }, // use incr
+ { "13 en_US DEC 1/1/1/0.02", "en_US", UNUM_DECIMAL, 1, 1, 1, 0.02, u"#,##0.0", 0.128, u"0.1" },
+ { "14 en_US DEC 1/1/2/0.02", "en_US", UNUM_DECIMAL, 1, 1, 2, 0.02, u"#,##0.02", 0.128, u"0.12" }, // use incr
+ { "15 en_US DEC 1/1/3/0.02", "en_US", UNUM_DECIMAL, 1, 1, 3, 0.02, u"#,##0.02#", 0.128, u"0.12" }, // use incr
+ { "16 en_US DEC 1/2/2/0.02", "en_US", UNUM_DECIMAL, 1, 2, 2, 0.02, u"#,##0.02", 0.128, u"0.12" }, // use incr
+ { "17 en_US DEC 1/2/3/0.02", "en_US", UNUM_DECIMAL, 1, 2, 3, 0.02, u"#,##0.02#", 0.128, u"0.12" }, // use incr
+ { "18 en_US DEC 1/3/3/0.02", "en_US", UNUM_DECIMAL, 1, 3, 3, 0.02, u"#,##0.020", 0.128, u"0.120" }, // use incr
+
+ { "20 en_US DEC 1/1/1/0.0075", "en_US", UNUM_DECIMAL, 1, 1, 1, 0.0075, u"#,##0.0", 0.019, u"0.0" },
+ { "21 en_US DEC 1/1/2/0.0075", "en_US", UNUM_DECIMAL, 1, 1, 2, 0.0075, u"#,##0.0075", 0.004, u"0.0075" }, // use incr
+ { "22 en_US DEC 1/1/2/0.0075", "en_US", UNUM_DECIMAL, 1, 1, 2, 0.0075, u"#,##0.0075", 0.019, u"0.0225" }, // use incr
+ { "23 en_US DEC 1/1/3/0.0075", "en_US", UNUM_DECIMAL, 1, 1, 3, 0.0075, u"#,##0.0075", 0.004, u"0.0075" }, // use incr
+ { "24 en_US DEC 1/1/3/0.0075", "en_US", UNUM_DECIMAL, 1, 1, 3, 0.0075, u"#,##0.0075", 0.019, u"0.0225" }, // use incr
+ { "25 en_US DEC 1/2/2/0.0075", "en_US", UNUM_DECIMAL, 1, 2, 2, 0.0075, u"#,##0.0075", 0.004, u"0.0075" }, // use incr
+ { "26 en_US DEC 1/2/2/0.0075", "en_US", UNUM_DECIMAL, 1, 2, 2, 0.0075, u"#,##0.0075", 0.019, u"0.0225" }, // use incr
+ { "27 en_US DEC 1/2/3/0.0075", "en_US", UNUM_DECIMAL, 1, 2, 3, 0.0075, u"#,##0.0075", 0.004, u"0.0075" }, // use incr
+ { "28 en_US DEC 1/2/3/0.0075", "en_US", UNUM_DECIMAL, 1, 2, 3, 0.0075, u"#,##0.0075", 0.019, u"0.0225" }, // use incr
+ { "29 en_US DEC 1/3/3/0.0075", "en_US", UNUM_DECIMAL, 1, 3, 3, 0.0075, u"#,##0.0075", 0.004, u"0.0075" }, // use incr
+ { "2A en_US DEC 1/3/3/0.0075", "en_US", UNUM_DECIMAL, 1, 3, 3, 0.0075, u"#,##0.0075", 0.019, u"0.0225" }, // use incr
+
+ { NULL, NULL, UNUM_IGNORE, 0, 0, 0, 0.0, NULL, 0.0, NULL }
+};
+
+// The following is copied from C++ number_patternstring.cpp for this C test.
+//
+// Determine whether a given roundingIncrement should be ignored for formatting
+// based on the current maxFrac value (maximum fraction digits). For example a
+// roundingIncrement of 0.01 should be ignored if maxFrac is 1, but not if maxFrac
+// is 2 or more. Note that roundingIncrements are rounded in significance, so
+// a roundingIncrement of 0.006 is treated like 0.01 for this determination, i.e.
+// it should not be ignored if maxFrac is 2 or more (but a roundingIncrement of
+// 0.005 is treated like 0.001 for significance). This is the reason for the
+// initial doubling below.
+// roundIncr must be non-zero
+static UBool ignoreRoundingIncrement(double roundIncr, int32_t maxFrac) {
+ if (maxFrac < 0) {
+ return FALSE;
+ }
+ int32_t frac = 0;
+ roundIncr *= 2.0;
+ for (frac = 0; frac <= maxFrac && roundIncr <= 1.0; frac++, roundIncr *= 10.0);
+ return (frac > maxFrac);
+}
+
+enum { kBBufMax = 128 };
+static void TestSetMaxFracAndRoundIncr(void) {
+ const SetMaxFracAndRoundIncrItem* itemPtr;
+ for (itemPtr = maxFracAndRoundIncrItems; itemPtr->descrip != NULL; itemPtr++) {
+ UChar ubuf[kUBufMax];
+ char bbufe[kBBufMax];
+ char bbufg[kBBufMax];
+ int32_t ulen;
+ UErrorCode status = U_ZERO_ERROR;
+ UNumberFormat* unf = unum_open(itemPtr->style, NULL, 0, itemPtr->locale, NULL, &status);
+ if (U_FAILURE(status)) {
+ log_data_err("locale %s: unum_open style %d fails with %s\n", itemPtr->locale, itemPtr->style, u_errorName(status));
+ continue;
+ }
+
+ unum_setAttribute(unf, UNUM_MIN_INTEGER_DIGITS, itemPtr->minInt);
+ unum_setAttribute(unf, UNUM_MIN_FRACTION_DIGITS, itemPtr->minFrac);
+ unum_setAttribute(unf, UNUM_MAX_FRACTION_DIGITS, itemPtr->maxFrac);
+ unum_setDoubleAttribute(unf, UNUM_ROUNDING_INCREMENT, itemPtr->roundIncr);
+
+ UBool roundIncrUsed = (itemPtr->roundIncr != 0.0 && !ignoreRoundingIncrement(itemPtr->roundIncr, itemPtr->maxFrac));
+
+ int32_t minInt = unum_getAttribute(unf, UNUM_MIN_INTEGER_DIGITS);
+ if (minInt != itemPtr->minInt) {
+ log_err("test %s: unum_getAttribute UNUM_MIN_INTEGER_DIGITS, expected %d, got %d\n",
+ itemPtr->descrip, itemPtr->minInt, minInt);
+ }
+ int32_t minFrac = unum_getAttribute(unf, UNUM_MIN_FRACTION_DIGITS);
+ if (minFrac != itemPtr->minFrac) {
+ log_err("test %s: unum_getAttribute UNUM_MIN_FRACTION_DIGITS, expected %d, got %d\n",
+ itemPtr->descrip, itemPtr->minFrac, minFrac);
+ }
+ // If incrementRounding is used, maxFrac is set equal to minFrac
+ int32_t maxFrac = unum_getAttribute(unf, UNUM_MAX_FRACTION_DIGITS);
+ // If incrementRounding is used, maxFrac is set equal to minFrac
+ int32_t expMaxFrac = (roundIncrUsed)? itemPtr->minFrac: itemPtr->maxFrac;
+ if (maxFrac != expMaxFrac) {
+ log_err("test %s: unum_getAttribute UNUM_MAX_FRACTION_DIGITS, expected %d, got %d\n",
+ itemPtr->descrip, expMaxFrac, maxFrac);
+ }
+ double roundIncr = unum_getDoubleAttribute(unf, UNUM_ROUNDING_INCREMENT);
+ // If incrementRounding is not used, roundIncr is set to 0.0
+ double expRoundIncr = (roundIncrUsed)? itemPtr->roundIncr: 0.0;
+ if (roundIncr != expRoundIncr) {
+ log_err("test %s: unum_getDoubleAttribute UNUM_ROUNDING_INCREMENT, expected %f, got %f\n",
+ itemPtr->descrip, expRoundIncr, roundIncr);
+ }
+
+ status = U_ZERO_ERROR;
+ ulen = unum_toPattern(unf, FALSE, ubuf, kUBufMax, &status);
+ (void)ulen;
+ if ( U_FAILURE(status) ) {
+ log_err("test %s: unum_toPattern fails with %s\n", itemPtr->descrip, u_errorName(status));
+ } else if (u_strcmp(ubuf,itemPtr->expPattern)!=0) {
+ u_austrcpy(bbufe, itemPtr->expPattern);
+ u_austrcpy(bbufg, ubuf);
+ log_err("test %s: unum_toPattern expect \"%s\", get \"%s\"\n", itemPtr->descrip, bbufe, bbufg);
+ }
+
+ status = U_ZERO_ERROR;
+ ulen = unum_formatDouble(unf, itemPtr->valueToFmt, ubuf, kUBufMax, NULL, &status);
+ if ( U_FAILURE(status) ) {
+ log_err("test %s: unum_formatDouble fails with %s\n", itemPtr->descrip, u_errorName(status));
+ } else if (u_strcmp(ubuf,itemPtr->expFormat)!=0) {
+ u_austrcpy(bbufe, itemPtr->expFormat);
+ u_austrcpy(bbufg, ubuf);
+ log_err("test %s: unum_formatDouble expect \"%s\", get \"%s\"\n", itemPtr->descrip, bbufe, bbufg);
+ }
+
+ unum_close(unf);
+ }
+}
+
+static void TestIgnorePadding(void) {
+ UErrorCode status = U_ZERO_ERROR;
+ UNumberFormat* unum = unum_open(UNUM_PATTERN_DECIMAL, NULL, 0, "en_US", NULL, &status);
+ if (U_FAILURE(status)) {
+ log_data_err("unum_open UNUM_PATTERN_DECIMAL for en_US and NULL pattern fails:%s\n", u_errorName(status));
+ } else {
+ unum_setAttribute(unum, UNUM_GROUPING_USED, 0);
+ unum_setAttribute(unum, UNUM_FORMAT_WIDTH, 0);
+ unum_setTextAttribute(unum, UNUM_PADDING_CHARACTER, u"*", 1, &status);
+ if (U_FAILURE(status)) {
+ log_err("unum_setTextAttribute UNUM_PADDING_CHARACTER to '*' fails: %s\n", u_errorName(status));
+ } else {
+ unum_setAttribute(unum, UNUM_PADDING_POSITION, 0);
+ unum_setAttribute(unum, UNUM_MIN_INTEGER_DIGITS, 0);
+ unum_setAttribute(unum, UNUM_MAX_INTEGER_DIGITS, 8);
+ unum_setAttribute(unum, UNUM_MIN_FRACTION_DIGITS, 0);
+ unum_setAttribute(unum, UNUM_MAX_FRACTION_DIGITS, 0);
+
+ UChar ubuf[kUBufMax];
+ int32_t ulen = unum_toPattern(unum, FALSE, ubuf, kUBufMax, &status);
+ if (U_FAILURE(status)) {
+ log_err("unum_toPattern fails: %s\n", u_errorName(status));
+ } else {
+ char bbuf[kBBufMax];
+ if (ulen > 0 && ubuf[0]==u'*') {
+ ubuf[kUBufMax-1] = 0; // ensure zero termination
+ u_austrncpy(bbuf, ubuf, kBBufMax);
+ log_err("unum_toPattern result should ignore padding but get %s\n", bbuf);
+ }
+ unum_applyPattern(unum, FALSE, ubuf, ulen, NULL, &status);
+ if (U_FAILURE(status)) {
+ log_err("unum_applyPattern fails: %s\n", u_errorName(status));
+ } else {
+ ulen = unum_formatDecimal(unum, "24", -1, ubuf, kUBufMax, NULL, &status);
+ if (U_FAILURE(status)) {
+ log_err("unum_formatDecimal fails: %s\n", u_errorName(status));
+ } else if (u_strcmp(ubuf, u"24") != 0) {
+ ubuf[kUBufMax-1] = 0; // ensure zero termination
+ u_austrncpy(bbuf, ubuf, kBBufMax);
+ log_err("unum_formatDecimal result expect 24 but get %s\n", bbuf);
+ }
+ }
+ }
+ }
+ unum_close(unum);
+ }
+}
+
+static void TestSciNotationMaxFracCap(void) {
+ static const UChar* pat1 = u"#.##E+00;-#.##E+00";
+ UErrorCode status = U_ZERO_ERROR;
+ UNumberFormat* unum = unum_open(UNUM_PATTERN_DECIMAL, pat1, -1, "en_US", NULL, &status);
+ if ( U_FAILURE(status) ) {
+ log_data_err("unum_open UNUM_PATTERN_DECIMAL with scientific pattern for \"en_US\" fails with %s\n", u_errorName(status));
+ } else {
+ double value;
+ UChar ubuf[kUBufMax];
+ char bbuf[kBBufMax];
+ int32_t ulen;
+
+ unum_setAttribute(unum, UNUM_MIN_FRACTION_DIGITS, 0);
+ unum_setAttribute(unum, UNUM_MAX_FRACTION_DIGITS, 2147483647);
+ ulen = unum_toPattern(unum, FALSE, ubuf, kUBufMax, &status);
+ if ( U_SUCCESS(status) ) {
+ u_austrncpy(bbuf, ubuf, kUBufMax);
+ log_info("unum_toPattern (%d): %s\n", ulen, bbuf);
+ }
+
+ for (value = 10.0; value < 1000000000.0; value *= 10.0) {
+ status = U_ZERO_ERROR;
+ ulen = unum_formatDouble(unum, value, ubuf, kUBufMax, NULL, &status);
+ if ( U_FAILURE(status) ) {
+ log_err("unum_formatDouble value %.1f status %s\n", value, u_errorName(status));
+ } else if (u_strncmp(ubuf,u"1E+0",4) != 0) {
+ u_austrncpy(bbuf, ubuf, kUBufMax);
+ log_err("unum_formatDouble value %.1f expected result to begin with 1E+0, got %s\n", value, bbuf);
+ }
+ }
+ unum_close(unum);
+ }
+}
+
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cpluralrulestest.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cpluralrulestest.c
index 24b65433f69..8db9d1fb889 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cpluralrulestest.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cpluralrulestest.c
@@ -13,6 +13,7 @@
#include "unicode/upluralrules.h"
#include "unicode/ustring.h"
#include "unicode/uenum.h"
+#include "unicode/unumberformatter.h"
#include "cintltst.h"
#include "cmemory.h"
#include "cstring.h"
@@ -20,6 +21,7 @@
static void TestPluralRules(void);
static void TestOrdinalRules(void);
static void TestGetKeywords(void);
+static void TestFormatted(void);
void addPluralRulesTest(TestNode** root);
@@ -30,6 +32,7 @@ void addPluralRulesTest(TestNode** root)
TESTCASE(TestPluralRules);
TESTCASE(TestOrdinalRules);
TESTCASE(TestGetKeywords);
+ TESTCASE(TestFormatted);
}
typedef struct {
@@ -252,4 +255,44 @@ static void TestGetKeywords() {
}
}
+static void TestFormatted() {
+ UErrorCode ec = U_ZERO_ERROR;
+ UNumberFormatter* unumf = NULL;
+ UFormattedNumber* uresult = NULL;
+ UPluralRules* uplrules = NULL;
+
+ uplrules = uplrules_open("hr", &ec);
+ if (!assertSuccess("open plural rules", &ec)) {
+ goto cleanup;
+ }
+
+ unumf = unumf_openForSkeletonAndLocale(u".00", -1, "hr", &ec);
+ if (!assertSuccess("open unumf", &ec)) {
+ goto cleanup;
+ }
+
+ uresult = unumf_openResult(&ec);
+ if (!assertSuccess("open result", &ec)) {
+ goto cleanup;
+ }
+
+ unumf_formatDouble(unumf, 100.2, uresult, &ec);
+ if (!assertSuccess("format", &ec)) {
+ goto cleanup;
+ }
+
+ UChar buffer[40];
+ uplrules_selectFormatted(uplrules, uresult, buffer, 40, &ec);
+ if (!assertSuccess("select", &ec)) {
+ goto cleanup;
+ }
+
+ assertUEquals("0.20 is plural category 'other' in hr", u"other", buffer);
+
+cleanup:
+ uplrules_close(uplrules);
+ unumf_close(unumf);
+ unumf_closeResult(uresult);
+}
+
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/crelativedateformattest.c b/Build/source/libs/icu/icu-src/source/test/cintltst/crelativedateformattest.c
index 42a34144216..8b5c90f6b47 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/crelativedateformattest.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/crelativedateformattest.c
@@ -16,9 +16,12 @@
#include "unicode/ustring.h"
#include "cintltst.h"
#include "cmemory.h"
+#include "cformtst.h"
static void TestRelDateFmt(void);
+static void TestNumericField(void);
static void TestCombineDateTime(void);
+static void TestFields(void);
void addRelativeDateFormatTest(TestNode** root);
@@ -27,12 +30,20 @@ void addRelativeDateFormatTest(TestNode** root);
void addRelativeDateFormatTest(TestNode** root)
{
TESTCASE(TestRelDateFmt);
+ TESTCASE(TestNumericField);
TESTCASE(TestCombineDateTime);
+ TESTCASE(TestFields);
}
static const double offsets[] = { -5.0, -2.2, -2.0, -1.0, -0.7, -0.0, 0.0, 0.7, 1.0, 2.0, 5.0 };
enum { kNumOffsets = UPRV_LENGTHOF(offsets) };
+typedef struct {
+ int32_t field;
+ int32_t beginPos;
+ int32_t endPos;
+} FieldsDat;
+
static const char* en_decDef_long_midSent_sec[kNumOffsets*2] = {
/* text numeric */
"5 seconds ago", "5 seconds ago", /* -5 */
@@ -48,6 +59,21 @@ static const char* en_decDef_long_midSent_sec[kNumOffsets*2] = {
"in 5 seconds", "in 5 seconds" /* 5 */
};
+static const FieldsDat en_attrDef_long_midSent_sec[kNumOffsets*2] = {
+/* text numeric text numeric */
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "5 seconds ago", "5 seconds ago", -5 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 3}, {UDAT_REL_NUMERIC_FIELD, 0, 3}, /* "2.2 seconds ago", "2.2 seconds ago", -2.2 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "2 seconds ago", "2 seconds ago", -2 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "1 second ago", "1 second ago", -1 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 3}, {UDAT_REL_NUMERIC_FIELD, 0, 3}, /* "0.7 seconds ago", "0.7 seconds ago", -0.7 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "now", "0 seconds ago", -0 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "now", "in 0 seconds", 0 */
+ {UDAT_REL_NUMERIC_FIELD, 3, 6}, {UDAT_REL_NUMERIC_FIELD, 3, 6}, /* "in 0.7 seconds", "in 0.7 seconds", 0.7 */
+ {UDAT_REL_NUMERIC_FIELD, 3, 4}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "in 1 second", "in 1 second", 1 */
+ {UDAT_REL_NUMERIC_FIELD, 3, 4}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "in 2 seconds", "in 2 seconds", 2 */
+ {UDAT_REL_NUMERIC_FIELD, 3, 4}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "in 5 seconds", "in 5 seconds" 5 */
+};
+
static const char* en_decDef_long_midSent_week[kNumOffsets*2] = {
/* text numeric */
"5 weeks ago", "5 weeks ago", /* -5 */
@@ -63,6 +89,21 @@ static const char* en_decDef_long_midSent_week[kNumOffsets*2] = {
"in 5 weeks", "in 5 weeks" /* 5 */
};
+static const FieldsDat en_attrDef_long_midSent_week[kNumOffsets*2] = {
+/* text numeric text numeric */
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "5 weeks ago", "5 weeks ago", -5 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 3}, {UDAT_REL_NUMERIC_FIELD, 0, 3}, /* "2.2 weeks ago", "2.2 weeks ago", -2.2 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "2 weeks ago", "2 weeks ago", -2 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "last week", "1 week ago", -1 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 3}, {UDAT_REL_NUMERIC_FIELD, 0, 3}, /* "0.7 weeks ago", "0.7 weeks ago", -0.7 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "this week", "0 weeks ago", -0 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "this week", "in 0 weeks", 0 */
+ {UDAT_REL_NUMERIC_FIELD, 3, 6}, {UDAT_REL_NUMERIC_FIELD, 3, 6}, /* "in 0.7 weeks", "in 0.7 weeks", 0.7 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "next week", "in 1 week", 1 */
+ {UDAT_REL_NUMERIC_FIELD, 3, 4}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "in 2 weeks", "in 2 weeks", 2 */
+ {UDAT_REL_NUMERIC_FIELD, 3, 4}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "in 5 weeks", "in 5 weeks" 5 */
+};
+
static const char* en_dec0_long_midSent_week[kNumOffsets*2] = {
/* text numeric */
"5 weeks ago", "5 weeks ago", /* -5 */
@@ -78,6 +119,21 @@ static const char* en_dec0_long_midSent_week[kNumOffsets*2] = {
"in 5 weeks", "in 5 weeks" /* 5 */
};
+static const FieldsDat en_attr0_long_midSent_week[kNumOffsets*2] = {
+/* text numeric text numeric */
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "5 weeks ago", "5 weeks ago", -5 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "2 weeks ago", "2 weeks ago", -2.2 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "2 weeks ago", "2 weeks ago", -2 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "last week", "1 week ago", -1 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "0 weeks ago", "0 weeks ago", -0.7 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "this week", "0 weeks ago", -0 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "this week", "in 0 weeks", 0 */
+ {UDAT_REL_NUMERIC_FIELD, 3, 4}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "in 0 weeks", "in 0 weeks", 0.7 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "next week", "in 1 week", 1 */
+ {UDAT_REL_NUMERIC_FIELD, 3, 4}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "in 2 weeks", "in 2 weeks", 2 */
+ {UDAT_REL_NUMERIC_FIELD, 3, 4}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "in 5 weeks", "in 5 weeks" 5 */
+};
+
static const char* en_decDef_short_midSent_week[kNumOffsets*2] = {
/* text numeric */
"5 wk. ago", "5 wk. ago", /* -5 */
@@ -93,6 +149,21 @@ static const char* en_decDef_short_midSent_week[kNumOffsets*2] = {
"in 5 wk.", "in 5 wk." /* 5 */
};
+static const FieldsDat en_attrDef_short_midSent_week[kNumOffsets*2] = {
+/* text numeric text numeric */
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "5 wk. ago", "5 wk. ago", -5 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 3}, {UDAT_REL_NUMERIC_FIELD, 0, 3}, /* "2.2 wk. ago", "2.2 wk. ago", -2.2 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "2 wk. ago", "2 wk. ago", -2 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "last wk.", "1 wk. ago", -1 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 3}, {UDAT_REL_NUMERIC_FIELD, 0, 3}, /* "0.7 wk. ago", "0.7 wk. ago", -0.7 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "this wk.", "0 wk. ago", -0 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "this wk.", "in 0 wk.", 0 */
+ {UDAT_REL_NUMERIC_FIELD, 3, 6}, {UDAT_REL_NUMERIC_FIELD, 3, 6}, /* "in 0.7 wk.", "in 0.7 wk.", 0.7 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "next wk.", "in 1 wk.", 1 */
+ {UDAT_REL_NUMERIC_FIELD, 3, 4}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "in 2 wk.", "in 2 wk.", 2 */
+ {UDAT_REL_NUMERIC_FIELD, 3, 4}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "in 5 wk.", "in 5 wk." 5 */
+};
+
static const char* en_decDef_long_midSent_min[kNumOffsets*2] = {
/* text numeric */
"5 minutes ago", "5 minutes ago", /* -5 */
@@ -100,14 +171,29 @@ static const char* en_decDef_long_midSent_min[kNumOffsets*2] = {
"2 minutes ago", "2 minutes ago", /* -2 */
"1 minute ago", "1 minute ago", /* -1 */
"0.7 minutes ago", "0.7 minutes ago", /* -0.7 */
- "0 minutes ago", "0 minutes ago", /* -0 */
- "in 0 minutes", "in 0 minutes", /* 0 */
+ "this minute", "0 minutes ago", /* -0 */
+ "this minute", "in 0 minutes", /* 0 */
"in 0.7 minutes", "in 0.7 minutes", /* 0.7 */
"in 1 minute", "in 1 minute", /* 1 */
"in 2 minutes", "in 2 minutes", /* 2 */
"in 5 minutes", "in 5 minutes" /* 5 */
};
+static const FieldsDat en_attrDef_long_midSent_min[kNumOffsets*2] = {
+/* text numeric text numeric */
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "5 minutes ago", "5 minutes ago", -5 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 3}, {UDAT_REL_NUMERIC_FIELD, 0, 3}, /* "2.2 minutes ago", "2.2 minutes ago", -2.2 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "2 minutes ago", "2 minutes ago", -2 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "1 minute ago", "1 minute ago", -1 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 3}, {UDAT_REL_NUMERIC_FIELD, 0, 3}, /* "0.7 minutes ago", "0.7 minutes ago", -0.7 */
+ {-1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "this minute", "0 minutes ago", -0 */
+ {-1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "this minute", "in 0 minutes", 0 */
+ {UDAT_REL_NUMERIC_FIELD, 3, 6}, {UDAT_REL_NUMERIC_FIELD, 3, 6}, /* "in 0.7 minutes", "in 0.7 minutes", 0.7 */
+ {UDAT_REL_NUMERIC_FIELD, 3, 4}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "in 1 minute", "in 1 minute", 1 */
+ {UDAT_REL_NUMERIC_FIELD, 3, 4}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "in 2 minutes", "in 2 minutes", 2 */
+ {UDAT_REL_NUMERIC_FIELD, 3, 4}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "in 5 minutes", "in 5 minutes" 5 */
+};
+
static const char* en_dec0_long_midSent_tues[kNumOffsets*2] = {
/* text numeric */
"5 Tuesdays ago", "5 Tuesdays ago", /* -5 */
@@ -123,6 +209,21 @@ static const char* en_dec0_long_midSent_tues[kNumOffsets*2] = {
"in 5 Tuesdays", "in 5 Tuesdays", /* 5 */
};
+static const FieldsDat en_attr0_long_midSent_tues[kNumOffsets*2] = {
+/* text numeric text numeric */
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "5 Tuesdays ago", "5 Tuesdays ago", -5 */
+ { -1, -1, -1}, { -1, -1, -1}, /* "" , "" , -2.2 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "2 Tuesdays ago", "2 Tuesdays ago", -2 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "last Tuesday", "1 Tuesday ago", -1 */
+ { -1, -1, -1}, { -1, -1, -1}, /* "" , "" , -0.7 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "this Tuesday", "0 Tuesdays ago", -0 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "this Tuesday", "in 0 Tuesdays", 0 */
+ { -1, -1, -1}, { -1, -1, -1}, /* "" , "" , 0.7 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "next Tuesday", "in 1 Tuesday", 1 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "in 2 Tuesdays", "in 2 Tuesdays", 2 */
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "in 5 Tuesdays", "in 5 Tuesdays", 5 */
+};
+
static const char* fr_decDef_long_midSent_day[kNumOffsets*2] = {
/* text numeric */
"il y a 5 jours", "il y a 5 jours", /* -5 */
@@ -138,6 +239,78 @@ static const char* fr_decDef_long_midSent_day[kNumOffsets*2] = {
"dans 5 jours", "dans 5 jours" /* 5 */
};
+static const FieldsDat fr_attrDef_long_midSent_day[kNumOffsets*2] = {
+/* text numeric text numeric */
+ {UDAT_REL_NUMERIC_FIELD, 7, 8}, {UDAT_REL_NUMERIC_FIELD, 7, 8}, /* "il y a 5 jours", "il y a 5 jours", -5 */
+ {UDAT_REL_NUMERIC_FIELD, 7, 10}, {UDAT_REL_NUMERIC_FIELD, 7, 10}, /* "il y a 2,2 jours", "il y a 2,2 jours", -2.2 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 7, 8}, /* "avant-hier", "il y a 2 jours", -2 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 7, 8}, /* "hier", "il y a 1 jour", -1 */
+ {UDAT_REL_NUMERIC_FIELD, 7, 10}, {UDAT_REL_NUMERIC_FIELD, 7, 10}, /* "il y a 0,7 jour", "il y a 0,7 jour", -0.7 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 7, 8}, /* "aujourd\\u2019hui", "il y a 0 jour", -0 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 5, 6}, /* "aujourd\\u2019hui", "dans 0 jour", 0 */
+ {UDAT_REL_NUMERIC_FIELD, 5, 8}, {UDAT_REL_NUMERIC_FIELD, 5, 8}, /* "dans 0,7 jour", "dans 0,7 jour", 0.7 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 5, 6}, /* "demain", "dans 1 jour", 1 */
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 5, 6}, /* "apr\\u00E8s-demain", "dans 2 jours", 2 */
+ {UDAT_REL_NUMERIC_FIELD, 5, 6}, {UDAT_REL_NUMERIC_FIELD, 5, 6}, /* "dans 5 jours", "dans 5 jours" 5 */
+};
+
+static const char* ak_decDef_long_stdAlon_sec[kNumOffsets*2] = { // falls back to root
+/* text numeric */
+ "-5 s", "-5 s", /* -5 */
+ "-2.2 s", "-2.2 s", /* -2.2 */
+ "-2 s", "-2 s", /* -2 */
+ "-1 s", "-1 s", /* -1 */
+ "-0.7 s", "-0.7 s", /* -0.7 */
+ "now", "-0 s", /* -0 */
+ "now", "+0 s", /* 0 */
+ "+0.7 s", "+0.7 s", /* 0.7 */
+ "+1 s", "+1 s", /* 1 */
+ "+2 s", "+2 s", /* 2 */
+ "+5 s", "+5 s", /* 5 */
+};
+
+static const FieldsDat ak_attrDef_long_stdAlon_sec[kNumOffsets*2] = {
+ {UDAT_REL_NUMERIC_FIELD, 1, 2}, {UDAT_REL_NUMERIC_FIELD, 1, 2},
+ {UDAT_REL_NUMERIC_FIELD, 1, 4}, {UDAT_REL_NUMERIC_FIELD, 1, 4},
+ {UDAT_REL_NUMERIC_FIELD, 1, 2}, {UDAT_REL_NUMERIC_FIELD, 1, 2},
+ {UDAT_REL_NUMERIC_FIELD, 1, 2}, {UDAT_REL_NUMERIC_FIELD, 1, 2},
+ {UDAT_REL_NUMERIC_FIELD, 1, 4}, {UDAT_REL_NUMERIC_FIELD, 1, 4},
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 1, 2},
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 1, 2},
+ {UDAT_REL_NUMERIC_FIELD, 1, 4}, {UDAT_REL_NUMERIC_FIELD, 1, 4},
+ {UDAT_REL_NUMERIC_FIELD, 1, 2}, {UDAT_REL_NUMERIC_FIELD, 1, 2},
+ {UDAT_REL_NUMERIC_FIELD, 1, 2}, {UDAT_REL_NUMERIC_FIELD, 1, 2},
+ {UDAT_REL_NUMERIC_FIELD, 1, 2}, {UDAT_REL_NUMERIC_FIELD, 1, 2},
+};
+
+static const char* enIN_decDef_short_midSent_weds[kNumOffsets*2] = {
+/* text numeric */
+ "5 Wed. ago", "5 Wed. ago", /* -5 */
+ "2.2 Wed. ago", "2.2 Wed. ago", /* -2.2 */
+ "2 Wed. ago", "2 Wed. ago", /* -2 */
+ "last Wed", "1 Wed. ago", /* -1 */
+ "0.7 Wed. ago", "0.7 Wed. ago", /* -0.7 */
+ "this Wed", "0 Wed. ago", /* -0 */
+ "this Wed", "in 0 Wed.", /* 0 */
+ "in 0.7 Wed.", "in 0.7 Wed.", /* 0.7 */
+ "next Wed", "in 1 Wed", /* 1 */ // in 1 Wed. missing in logical group
+ "in 2 Wed.", "in 2 Wed.", /* 2 */
+ "in 5 Wed.", "in 5 Wed." /* 5 */
+};
+
+static const FieldsDat enIN_attrDef_short_midSent_weds[kNumOffsets*2] = {
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1},
+ {UDAT_REL_NUMERIC_FIELD, 0, 3}, {UDAT_REL_NUMERIC_FIELD, 0, 3},
+ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1},
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 0, 1},
+ {UDAT_REL_NUMERIC_FIELD, 0, 3}, {UDAT_REL_NUMERIC_FIELD, 0, 3},
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 0, 1},
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 3, 4},
+ {UDAT_REL_NUMERIC_FIELD, 3, 6}, {UDAT_REL_NUMERIC_FIELD, 3, 6},
+ { -1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 3, 4},
+ {UDAT_REL_NUMERIC_FIELD, 3, 4}, {UDAT_REL_NUMERIC_FIELD, 3, 4},
+ {UDAT_REL_NUMERIC_FIELD, 3, 4}, {UDAT_REL_NUMERIC_FIELD, 3, 4},
+};
typedef struct {
const char* locale;
@@ -146,17 +319,29 @@ typedef struct {
UDisplayContext capContext;
URelativeDateTimeUnit unit;
const char ** expectedResults; /* for the various offsets */
+ const FieldsDat* expectedAttributes;
} RelDateTimeFormatTestItem;
static const RelDateTimeFormatTestItem fmtTestItems[] = {
- { "en", -1, UDAT_STYLE_LONG, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, UDAT_REL_UNIT_SECOND, en_decDef_long_midSent_sec },
- { "en", -1, UDAT_STYLE_LONG, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, UDAT_REL_UNIT_WEEK, en_decDef_long_midSent_week },
- { "en", 0, UDAT_STYLE_LONG, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, UDAT_REL_UNIT_WEEK, en_dec0_long_midSent_week },
- { "en", -1, UDAT_STYLE_SHORT, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, UDAT_REL_UNIT_WEEK, en_decDef_short_midSent_week },
- { "en", -1, UDAT_STYLE_LONG, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, UDAT_REL_UNIT_MINUTE, en_decDef_long_midSent_min },
- { "en", -1, UDAT_STYLE_LONG, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, UDAT_REL_UNIT_TUESDAY, en_dec0_long_midSent_tues },
- { "fr", -1, UDAT_STYLE_LONG, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, UDAT_REL_UNIT_DAY, fr_decDef_long_midSent_day },
- { NULL, 0, (UDateRelativeDateTimeFormatterStyle)0, (UDisplayContext)0, (URelativeDateTimeUnit)0, NULL } /* terminator */
+ { "en", -1, UDAT_STYLE_LONG, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, UDAT_REL_UNIT_SECOND,
+ en_decDef_long_midSent_sec, en_attrDef_long_midSent_sec },
+ { "en", -1, UDAT_STYLE_LONG, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, UDAT_REL_UNIT_WEEK,
+ en_decDef_long_midSent_week, en_attrDef_long_midSent_week},
+ { "en", 0, UDAT_STYLE_LONG, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, UDAT_REL_UNIT_WEEK,
+ en_dec0_long_midSent_week, en_attr0_long_midSent_week},
+ { "en", -1, UDAT_STYLE_SHORT, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, UDAT_REL_UNIT_WEEK,
+ en_decDef_short_midSent_week, en_attrDef_short_midSent_week},
+ { "en", -1, UDAT_STYLE_LONG, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, UDAT_REL_UNIT_MINUTE,
+ en_decDef_long_midSent_min, en_attrDef_long_midSent_min},
+ { "en", -1, UDAT_STYLE_LONG, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, UDAT_REL_UNIT_TUESDAY,
+ en_dec0_long_midSent_tues, en_attr0_long_midSent_tues},
+ { "fr", -1, UDAT_STYLE_LONG, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, UDAT_REL_UNIT_DAY,
+ fr_decDef_long_midSent_day, fr_attrDef_long_midSent_day},
+ { "ak", -1, UDAT_STYLE_LONG, UDISPCTX_CAPITALIZATION_FOR_STANDALONE, UDAT_REL_UNIT_SECOND,
+ ak_decDef_long_stdAlon_sec, ak_attrDef_long_stdAlon_sec},
+ { "en_IN", -1, UDAT_STYLE_SHORT, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, UDAT_REL_UNIT_WEDNESDAY,
+ enIN_decDef_short_midSent_weds, enIN_attrDef_short_midSent_weds},
+ { NULL, 0, (UDateRelativeDateTimeFormatterStyle)0, (UDisplayContext)0, (URelativeDateTimeUnit)0, NULL, NULL } /* terminator */
};
enum { kUBufMax = 64, kBBufMax = 256 };
@@ -242,6 +427,154 @@ static void TestRelDateFmt()
}
}
+static void TestNumericField()
+{
+ const RelDateTimeFormatTestItem *itemPtr;
+ log_verbose("\nTesting ureldatefmt_open(), ureldatefmt_formatForFields(), ureldatefmt_formatNumericForFields() with various parameters\n");
+ for (itemPtr = fmtTestItems; itemPtr->locale != NULL; itemPtr++) {
+ URelativeDateTimeFormatter *reldatefmt = NULL;
+ UNumberFormat* nfToAdopt = NULL;
+ UErrorCode status = U_ZERO_ERROR;
+ int32_t iOffset;
+
+ if (itemPtr->decPlaces >= 0) {
+ nfToAdopt = unum_open(UNUM_DECIMAL, NULL, 0, itemPtr->locale, NULL, &status);
+ if ( U_FAILURE(status) ) {
+ log_data_err("FAIL: unum_open(UNUM_DECIMAL, ...) for locale %s: %s\n", itemPtr->locale, myErrorName(status));
+ continue;
+ }
+ unum_setAttribute(nfToAdopt, UNUM_MIN_FRACTION_DIGITS, itemPtr->decPlaces);
+ unum_setAttribute(nfToAdopt, UNUM_MAX_FRACTION_DIGITS, itemPtr->decPlaces);
+ unum_setAttribute(nfToAdopt, UNUM_ROUNDING_MODE, UNUM_ROUND_DOWN);
+ }
+ reldatefmt = ureldatefmt_open(itemPtr->locale, nfToAdopt, itemPtr->width, itemPtr->capContext, &status);
+ if ( U_FAILURE(status) ) {
+ log_data_err("FAIL: ureldatefmt_open() for locale %s, decPlaces %d, width %d, capContext %d: %s\n",
+ itemPtr->locale, itemPtr->decPlaces, (int)itemPtr->width, (int)itemPtr->capContext,
+ myErrorName(status) );
+ continue;
+ }
+
+ for (iOffset = 0; iOffset < kNumOffsets; iOffset++) {
+ if (itemPtr->unit >= UDAT_REL_UNIT_SUNDAY && offsets[iOffset] != -1.0 && offsets[iOffset] != 0.0 && offsets[iOffset] != 1.0) {
+ continue; /* we do not currently have data for this */
+ }
+
+ /* Depend on the next one to verify the data */
+ status = U_ZERO_ERROR;
+ UFormattedRelativeDateTime* fv = ureldatefmt_openResult(&status);
+ if ( U_FAILURE(status) ) {
+ log_err("ureldatefmt_openResult fails, status %s\n", u_errorName(status));
+ continue;
+ }
+ ureldatefmt_formatToResult(reldatefmt, offsets[iOffset], itemPtr->unit, fv, &status);
+ if ( U_FAILURE(status) ) {
+ log_err("FAIL: ureldatefmt_formatForFields() for locale %s, decPlaces %d, width %d, capContext %d, offset %.2f, unit %d: %s\n",
+ itemPtr->locale, itemPtr->decPlaces, (int)itemPtr->width, (int)itemPtr->capContext,
+ offsets[iOffset], (int)itemPtr->unit, myErrorName(status) );
+ } else {
+ UChar ubufexp[kUBufMax];
+ int32_t ulenexp = u_unescape(itemPtr->expectedResults[iOffset*2], ubufexp, kUBufMax);
+ int32_t ulenget;
+ const UChar* ubufget = ufmtval_getString(ureldatefmt_resultAsValue(fv, &status), &ulenget, &status);
+ assertUEquals("String content", ubufexp, ubufget);
+ assertIntEquals("String length", ulenexp, ulenget);
+
+ FieldsDat expectedAttr = itemPtr->expectedAttributes[iOffset*2];
+ UConstrainedFieldPosition* cfpos = ucfpos_open(&status);
+ UBool foundNumeric = FALSE;
+ while (TRUE) {
+ foundNumeric = ufmtval_nextPosition(ureldatefmt_resultAsValue(fv, &status), cfpos, &status);
+ if (!foundNumeric) {
+ break;
+ }
+ if (ucfpos_getCategory(cfpos, &status) == UFIELD_CATEGORY_RELATIVE_DATETIME
+ && ucfpos_getField(cfpos, &status) == UDAT_REL_NUMERIC_FIELD) {
+ break;
+ }
+ }
+ assertSuccess("Looking for numeric", &status);
+ int32_t beginPos, endPos;
+ ucfpos_getIndexes(cfpos, &beginPos, &endPos, &status);
+ if (expectedAttr.field == -1) {
+ if (foundNumeric) {
+ log_err("ureldatefmt_formatForFields as \"%s\"; expect no field, but got %d\n",
+ itemPtr->expectedResults[iOffset*2],
+ ucfpos_getField(cfpos, &status));
+ }
+ } else {
+ if (!foundNumeric ||
+ beginPos != expectedAttr.beginPos ||
+ endPos != expectedAttr.endPos) {
+ log_err("ureldatefmt_formatForFields as \"%s\"; expect field %d range %d-%d, get range %d-%d\n",
+ itemPtr->expectedResults[iOffset*2],
+ expectedAttr.field, expectedAttr.beginPos, expectedAttr.endPos,
+ beginPos, endPos);
+ }
+ }
+ ucfpos_close(cfpos);
+ }
+
+ if (itemPtr->unit >= UDAT_REL_UNIT_SUNDAY) {
+ ureldatefmt_closeResult(fv);
+ continue; /* we do not currently have numeric-style data for this */
+ }
+
+ /* Depend on the next one to verify the data */
+ status = U_ZERO_ERROR;
+ ureldatefmt_formatNumericToResult(reldatefmt, offsets[iOffset], itemPtr->unit, fv, &status);
+ if ( U_FAILURE(status) ) {
+ log_err("FAIL: ureldatefmt_formatNumericForFields() for locale %s, decPlaces %d, width %d, capContext %d, offset %.2f, unit %d: %s\n",
+ itemPtr->locale, itemPtr->decPlaces, (int)itemPtr->width, (int)itemPtr->capContext,
+ offsets[iOffset], (int)itemPtr->unit, myErrorName(status) );
+ } else {
+ UChar ubufexp[kUBufMax];
+ int32_t ulenexp = u_unescape(itemPtr->expectedResults[iOffset*2 + 1], ubufexp, kUBufMax);
+ int32_t ulenget;
+ const UChar* ubufget = ufmtval_getString(ureldatefmt_resultAsValue(fv, &status), &ulenget, &status);
+ assertUEquals("String content", ubufexp, ubufget);
+ assertIntEquals("String length", ulenexp, ulenget);
+
+ FieldsDat expectedAttr = itemPtr->expectedAttributes[iOffset*2 + 1];
+ UConstrainedFieldPosition* cfpos = ucfpos_open(&status);
+ UBool foundNumeric = FALSE;
+ while (TRUE) {
+ foundNumeric = ufmtval_nextPosition(ureldatefmt_resultAsValue(fv, &status), cfpos, &status);
+ if (!foundNumeric) {
+ break;
+ }
+ if (ucfpos_getCategory(cfpos, &status) == UFIELD_CATEGORY_RELATIVE_DATETIME
+ && ucfpos_getField(cfpos, &status) == UDAT_REL_NUMERIC_FIELD) {
+ break;
+ }
+ }
+ assertSuccess("Looking for numeric", &status);
+ int32_t beginPos, endPos;
+ ucfpos_getIndexes(cfpos, &beginPos, &endPos, &status);
+ if (expectedAttr.field == -1) {
+ if (foundNumeric) {
+ log_err("ureldatefmt_formatForFields as \"%s\"; expect no field, but got %d rang %d-%d\n",
+ itemPtr->expectedResults[iOffset*2],
+ ucfpos_getField(cfpos, &status), beginPos, endPos);
+ }
+ } else {
+ if (!foundNumeric ||
+ (beginPos != expectedAttr.beginPos || endPos != expectedAttr.endPos)) {
+ log_err("ureldatefmt_formatForFields as \"%s\"; expect field %d range %d-%d, get field %d range %d-%d\n",
+ itemPtr->expectedResults[iOffset*2 + 1],
+ expectedAttr.field, expectedAttr.beginPos, expectedAttr.endPos,
+ ucfpos_getField(cfpos, &status), beginPos, endPos);
+ }
+ }
+ ucfpos_close(cfpos);
+ }
+ ureldatefmt_closeResult(fv);
+ }
+
+ ureldatefmt_close(reldatefmt);
+ }
+}
+
typedef struct {
const char* locale;
UDateRelativeDateTimeFormatterStyle width;
@@ -310,4 +643,54 @@ static void TestCombineDateTime()
}
}
+static void TestFields() {
+ UErrorCode ec = U_ZERO_ERROR;
+ URelativeDateTimeFormatter* fmt = ureldatefmt_open(
+ "en-us",
+ NULL,
+ UDAT_STYLE_SHORT,
+ UDISPCTX_CAPITALIZATION_NONE,
+ &ec);
+ assertSuccess("Creating RelDTFmt", &ec);
+ UFormattedRelativeDateTime* frdt = ureldatefmt_openResult(&ec);
+ assertSuccess("Creating FmtVal", &ec);
+
+ ureldatefmt_formatNumericToResult(fmt, -50, UDAT_REL_UNIT_SATURDAY, frdt, &ec);
+ assertSuccess("formatNumeric", &ec);
+ {
+ const UFormattedValue* fv = ureldatefmt_resultAsValue(frdt, &ec);
+ assertSuccess("Should convert without error", &ec);
+ static const UFieldPositionWithCategory expectedFieldPositions[] = {
+ // category, field, begin index, end index
+ {UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD, 0, 2},
+ {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_NUMERIC_FIELD, 0, 2},
+ {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 3, 11}};
+ checkMixedFormattedValue(
+ "FormattedRelativeDateTime as FormattedValue (numeric)",
+ fv,
+ u"50 Sat. ago",
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ ureldatefmt_formatToResult(fmt, -1, UDAT_REL_UNIT_WEEK, frdt, &ec);
+ assertSuccess("format", &ec);
+ {
+ const UFormattedValue* fv = ureldatefmt_resultAsValue(frdt, &ec);
+ assertSuccess("Should convert without error", &ec);
+ static const UFieldPositionWithCategory expectedFieldPositions[] = {
+ // category, field, begin index, end index
+ {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 0, 8}};
+ checkMixedFormattedValue(
+ "FormattedRelativeDateTime as FormattedValue (relative)",
+ fv,
+ u"last wk.",
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ ureldatefmt_closeResult(frdt);
+ ureldatefmt_close(fmt);
+}
+
#endif /* #if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_BREAK_ITERATION */
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/crestst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/crestst.c
index 9d832fcf379..b7af6eacd7f 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/crestst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/crestst.c
@@ -31,8 +31,10 @@
#include "unicode/ures.h"
#include "crestst.h"
#include "unicode/ctest.h"
+#include "uresimp.h"
static void TestOpenDirect(void);
+static void TestOpenDirectFillIn(void);
static void TestFallback(void);
static void TestTable32(void);
static void TestFileStream(void);
@@ -53,9 +55,23 @@ enum E_Where
typedef enum E_Where E_Where;
/*****************************************************************************/
-#define CONFIRM_EQ(actual,expected) if (u_strcmp(expected,actual)==0){ record_pass(); } else { record_fail(); log_err("%s returned %s instead of %s\n", action, austrdup(actual), austrdup(expected)); }
-
-#define CONFIRM_ErrorCode(actual,expected) if ((expected)==(actual)) { record_pass(); } else { record_fail(); log_err("%s returned %s instead of %s\n", action, myErrorName(actual), myErrorName(expected)); }
+#define CONFIRM_EQ(actual,expected) UPRV_BLOCK_MACRO_BEGIN { \
+ if (u_strcmp(expected,actual)==0) { \
+ record_pass(); \
+ } else { \
+ record_fail(); \
+ log_err("%s returned %s instead of %s\n", action, austrdup(actual), austrdup(expected)); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define CONFIRM_ErrorCode(actual,expected) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expected)==(actual)) { \
+ record_pass(); \
+ } else { \
+ record_fail(); \
+ log_err("%s returned %s instead of %s\n", action, myErrorName(actual), myErrorName(expected)); \
+ } \
+} UPRV_BLOCK_MACRO_END
/* Array of our test objects */
@@ -96,6 +112,7 @@ void addResourceBundleTest(TestNode** root)
#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
addTest(root, &TestConstruction1, "tsutil/crestst/TestConstruction1");
addTest(root, &TestOpenDirect, "tsutil/crestst/TestOpenDirect");
+ addTest(root, &TestOpenDirectFillIn, "tsutil/crestst/TestOpenDirectFillIn");
addTest(root, &TestResourceBundles, "tsutil/crestst/TestResourceBundles");
addTest(root, &TestTable32, "tsutil/crestst/TestTable32");
addTest(root, &TestFileStream, "tsutil/crestst/TestFileStream");
@@ -531,7 +548,7 @@ TestOpenDirect(void) {
}
ures_close(idna_rules);
- errorCode = U_USING_FALLBACK_WARNING;;
+ errorCode = U_USING_FALLBACK_WARNING;
idna_rules=ures_openDirect("testdata", "idna_rules", &errorCode);
if(U_FAILURE(errorCode)) {
log_data_err("ures_openDirect(\"idna_rules\") failed when U_USING_FALLBACK_WARNING was set prior to call: %s\n", u_errorName(errorCode));
@@ -614,6 +631,47 @@ TestOpenDirect(void) {
ures_close(te_IN);
}
+static void
+TestOpenDirectFillIn(void) {
+ // Test that ures_openDirectFillIn() opens a stack allocated resource bundle, similar to ures_open().
+ // Since ures_openDirectFillIn is just a wrapper function, this is just a very basic test copied from
+ // the TestOpenDirect test above.
+ UErrorCode errorCode = U_ZERO_ERROR;
+ UResourceBundle *item;
+ UResourceBundle idna_rules;
+ ures_initStackObject(&idna_rules);
+
+ ures_openDirectFillIn(&idna_rules, loadTestData(&errorCode), "idna_rules", &errorCode);
+ if(U_FAILURE(errorCode)) {
+ log_data_err("ures_openDirectFillIn(\"idna_rules\") failed: %s\n", u_errorName(errorCode));
+ return;
+ }
+
+ if(0!=uprv_strcmp("idna_rules", ures_getLocale(&idna_rules, &errorCode))) {
+ log_err("ures_openDirectFillIn(\"idna_rules\").getLocale()!=idna_rules\n");
+ }
+ errorCode=U_ZERO_ERROR;
+
+ /* try an item in idna_rules, must work */
+ item=ures_getByKey(&idna_rules, "UnassignedSet", NULL, &errorCode);
+ if(U_FAILURE(errorCode)) {
+ log_err("translit_index.getByKey(local key) failed: %s\n", u_errorName(errorCode));
+ errorCode=U_ZERO_ERROR;
+ } else {
+ ures_close(item);
+ }
+
+ /* try an item in root, must fail */
+ item=ures_getByKey(&idna_rules, "ShortLanguage", NULL, &errorCode);
+ if(U_FAILURE(errorCode)) {
+ errorCode=U_ZERO_ERROR;
+ } else {
+ log_err("idna_rules.getByKey(root key) succeeded!\n");
+ ures_close(item);
+ }
+ ures_close(&idna_rules);
+}
+
static int32_t
parseTable32Key(const char *key) {
int32_t number;
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/creststn.c b/Build/source/libs/icu/icu-src/source/test/cintltst/creststn.c
index 098cd46e472..4f25a69d929 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/creststn.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/creststn.c
@@ -62,7 +62,7 @@ randul()
}
/* Assume rand has at least 12 bits of precision */
- for (i=0; i<sizeof(l); ++i)
+ for (i=0; i<(int32_t)sizeof(l); ++i)
((char*)&l)[i] = (char)((rand() & 0x0FF0) >> 4);
return l;
}
@@ -132,10 +132,38 @@ enum E_Where
typedef enum E_Where E_Where;
/*****************************************************************************/
-#define CONFIRM_EQ(actual,expected) if (u_strcmp(expected,actual)==0){ record_pass(); } else { record_fail(); log_err("%s returned %s instead of %s\n", action, austrdup(actual), austrdup(expected)); }
-#define CONFIRM_INT_EQ(actual,expected) if ((expected)==(actual)) { record_pass(); } else { record_fail(); log_err("%s returned %d instead of %d\n", action, actual, expected); }
-#define CONFIRM_INT_GE(actual,expected) if ((actual)>=(expected)) { record_pass(); } else { record_fail(); log_err("%s returned %d instead of x >= %d\n", action, actual, expected); }
-#define CONFIRM_INT_NE(actual,expected) if ((expected)!=(actual)) { record_pass(); } else { record_fail(); log_err("%s returned %d instead of x != %d\n", action, actual, expected); }
+#define CONFIRM_EQ(actual,expected) UPRV_BLOCK_MACRO_BEGIN { \
+ if (u_strcmp(expected,actual)==0) { \
+ record_pass(); \
+ } else { \
+ record_fail(); \
+ log_err("%s returned %s instead of %s\n", action, austrdup(actual), austrdup(expected)); \
+ } \
+} UPRV_BLOCK_MACRO_END
+#define CONFIRM_INT_EQ(actual,expected) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expected)==(actual)) { \
+ record_pass(); \
+ } else { \
+ record_fail(); \
+ log_err("%s returned %d instead of %d\n", action, actual, expected); \
+ } \
+} UPRV_BLOCK_MACRO_END
+#define CONFIRM_INT_GE(actual,expected) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((actual)>=(expected)) { \
+ record_pass(); \
+ } else { \
+ record_fail(); \
+ log_err("%s returned %d instead of x >= %d\n", action, actual, expected); \
+ } \
+} UPRV_BLOCK_MACRO_END
+#define CONFIRM_INT_NE(actual,expected) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expected)!=(actual)) { \
+ record_pass(); \
+ } else { \
+ record_fail(); \
+ log_err("%s returned %d instead of x != %d\n", action, actual, expected); \
+ } \
+} UPRV_BLOCK_MACRO_END
/*#define CONFIRM_ErrorCode(actual,expected) if ((expected)==(actual)) { record_pass(); } else { record_fail(); log_err("%s returned %s instead of %s\n", action, myErrorName(actual), myErrorName(expected)); } */
static void
CONFIRM_ErrorCode(UErrorCode actual,UErrorCode expected)
@@ -1178,7 +1206,7 @@ static void TestErrorConditions(){
log_err("ERROR: ures_openU() is supposed to fail path =%s with status != U_ZERO_ERROR\n", austrdup(utestdatapath));
ures_close(teRes);
}
- /*Test ures_openFillIn with UResourceBundle = NULL*/
+ /*Test ures_openFillIn fails when input UResourceBundle parameter is NULL*/
log_verbose("Testing ures_openFillIn with UResourceBundle = NULL.....\n");
status=U_ZERO_ERROR;
ures_openFillIn(NULL, testdatapath, "te", &status);
@@ -1186,6 +1214,14 @@ static void TestErrorConditions(){
log_err("ERROR: ures_openFillIn with UResourceBundle= NULL should fail. Expected U_ILLEGAL_ARGUMENT_ERROR, Got: %s\n",
myErrorName(status));
}
+ /*Test ures_openDirectFillIn fails when input UResourceBundle parameter is NULL*/
+ log_verbose("Testing ures_openDirectFillIn with UResourceBundle = NULL.....\n");
+ status=U_ZERO_ERROR;
+ ures_openDirectFillIn(NULL, testdatapath, "te", &status);
+ if(status != U_ILLEGAL_ARGUMENT_ERROR){
+ log_err("ERROR: ures_openDirectFillIn with UResourceBundle= NULL should fail. Expected U_ILLEGAL_ARGUMENT_ERROR, Got: %s\n",
+ myErrorName(status));
+ }
/*Test ures_getLocale() with status != U_ZERO_ERROR*/
status=U_ZERO_ERROR;
teRes=ures_openU(utestdatapath, "te", &status);
@@ -2129,7 +2165,7 @@ static void TestFallback()
UResourceBundle* tResB;
UResourceBundle* zoneResource;
const UChar* version = NULL;
- static const UChar versionStr[] = { 0x0032, 0x002E, 0x0031, 0x002E, 0x0033, 0x0038, 0x002E, 0x0036, 0x0039, 0x0000}; // 2.1.38.69 in nn_NO
+ static const UChar versionStr[] = u"36"; // 36 in nn_NO
if(err != U_ZERO_ERROR){
log_data_err("Expected U_ZERO_ERROR when trying to test no_NO_NY aliased to nn_NO for Version err=%s\n",u_errorName(err));
@@ -2624,29 +2660,30 @@ static void TestGetFunctionalEquivalent(void) {
#if !UCONFIG_NO_COLLATION
static const char * const collCases[] = {
/* avail locale equiv */
+ /* note: in ICU 64, empty locales are shown as available for collation */
"f", "sv_US_CALIFORNIA", "sv",
"f", "zh_TW@collation=stroke", "zh@collation=stroke", /* alias of zh_Hant_TW */
- "f", "zh_Hant_TW@collation=stroke", "zh@collation=stroke",
+ "t", "zh_Hant_TW@collation=stroke", "zh@collation=stroke",
"f", "sv_CN@collation=pinyin", "sv",
"t", "zh@collation=pinyin", "zh",
"f", "zh_CN@collation=pinyin", "zh", /* alias of zh_Hans_CN */
- "f", "zh_Hans_CN@collation=pinyin", "zh",
+ "t", "zh_Hans_CN@collation=pinyin", "zh",
"f", "zh_HK@collation=pinyin", "zh", /* alias of zh_Hant_HK */
- "f", "zh_Hant_HK@collation=pinyin", "zh",
+ "t", "zh_Hant_HK@collation=pinyin", "zh",
"f", "zh_HK@collation=stroke", "zh@collation=stroke", /* alias of zh_Hant_HK */
- "f", "zh_Hant_HK@collation=stroke", "zh@collation=stroke",
+ "t", "zh_Hant_HK@collation=stroke", "zh@collation=stroke",
"f", "zh_HK", "zh@collation=stroke", /* alias of zh_Hant_HK */
- "f", "zh_Hant_HK", "zh@collation=stroke",
+ "t", "zh_Hant_HK", "zh@collation=stroke",
"f", "zh_MO", "zh@collation=stroke", /* alias of zh_Hant_MO */
- "f", "zh_Hant_MO", "zh@collation=stroke",
+ "t", "zh_Hant_MO", "zh@collation=stroke",
"f", "zh_TW_STROKE", "zh@collation=stroke",
"f", "zh_TW_STROKE@collation=pinyin", "zh",
"f", "sv_CN@calendar=japanese", "sv",
"t", "sv@calendar=japanese", "sv",
"f", "zh_TW@collation=pinyin", "zh", /* alias of zh_Hant_TW */
- "f", "zh_Hant_TW@collation=pinyin", "zh",
+ "t", "zh_Hant_TW@collation=pinyin", "zh",
"f", "zh_CN@collation=stroke", "zh@collation=stroke", /* alias of zh_Hans_CN */
- "f", "zh_Hans_CN@collation=stroke", "zh@collation=stroke",
+ "t", "zh_Hans_CN@collation=stroke", "zh@collation=stroke",
"t", "de@collation=phonebook", "de@collation=phonebook",
"t", "hi@collation=standard", "hi",
"f", "hi_AU@collation=standard;currency=CHF;calendar=buddhist", "hi",
@@ -2794,7 +2831,7 @@ static void TestCLDRStyleAliases(void) {
/* instead of sprintf(resource, "a%i", i); */
a = ures_getByKeyWithFallback(alias, resource, a, &status);
result = tres_getString(a, -1, NULL, &len, &status);
- u_charsToUChars(expects[i], expected, strlen(expects[i])+1);
+ u_charsToUChars(expects[i], expected, (int32_t)strlen(expects[i])+1);
if(U_FAILURE(status) || !result || u_strcmp(result, expected)) {
log_err("CLDR style aliases failed resource with name \"%s\" resource, exp %s, got %S (%s)\n", resource, expects[i], result, myErrorName(status));
status = U_ZERO_ERROR;
@@ -2937,7 +2974,7 @@ tres_getString(const UResourceBundle *resB,
}
/* verify NUL-termination */
- if((p8 != buffer8 || length8 < sizeof(buffer8)) && s8[length8] != 0) {
+ if((p8 != buffer8 || length8 < (int32_t)sizeof(buffer8)) && s8[length8] != 0) {
log_err("ures_getUTF8String(%p, %ld, '%s') did not NUL-terminate\n",
resB, (long)idx, key);
}
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cstrcase.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cstrcase.c
index 6fb2cfccffe..0a9ec2ca41b 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cstrcase.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cstrcase.c
@@ -442,7 +442,7 @@ TestCaseFolding(void) {
/* test simple case folding */
p=simple;
- for(i=0; i<sizeof(simple)/12; p+=3, ++i) {
+ for(i=0; i<(int32_t)sizeof(simple)/12; p+=3, ++i) {
if(u_foldCase(p[0], U_FOLD_CASE_DEFAULT)!=p[1]) {
log_err("error: u_foldCase(0x%04lx, default)=0x%04lx instead of 0x%04lx\n",
p[0], u_foldCase(p[0], U_FOLD_CASE_DEFAULT), p[1]);
@@ -748,9 +748,12 @@ TestUCaseMap(void) {
/* overly long locale IDs may get truncated to their language code to avoid unnecessary allocation */
ucasemap_setLocale(csm, "I-kLInGOn-the-quick-brown-fox-jumps-over-the-lazy-dog", &errorCode);
locale=ucasemap_getLocale(csm);
- if(0!=strncmp(locale, "i-klingon", 9)) {
+ // "I-kLInGOn-the-quick-brown-fox-jumps-over-the-lazy-dog" is canonicalized
+ // into "tlh-the-quick-brown-fox-jumps-over-the-lazy-dog"
+ // and "the" will be treated as an extlang which replaces "tlh".
+ if(0!=strncmp(locale, "the", 3)) {
log_err("ucasemap_getLocale(ucasemap_setLocale(\"I-kLInGOn-the-quick-br...\"))==%s\n"
- " does not start with \"i-klingon\"\n", locale);
+ " does not start with \"the\"\n", locale);
}
errorCode=U_ZERO_ERROR;
@@ -913,6 +916,7 @@ TestUCaseMapToTitle(void) {
ucasemap_setOptions(csm, U_TITLECASE_NO_BREAK_ADJUSTMENT, &errorCode);
if(U_FAILURE(errorCode)) {
log_err_status(errorCode, "error: ucasemap_setOptions(U_TITLECASE_NO_BREAK_ADJUSTMENT) failed - %s\n", u_errorName(errorCode));
+ ucasemap_close(csm);
return;
}
@@ -948,6 +952,7 @@ TestUCaseMapToTitle(void) {
ucasemap_setOptions(csm, U_TITLECASE_NO_LOWERCASE, &errorCode);
if(U_FAILURE(errorCode)) {
log_err("error: ucasemap_setOptions(U_TITLECASE_NO_LOWERCASE) failed - %s\n", u_errorName(errorCode));
+ ucasemap_close(csm);
return;
}
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cstrtest.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cstrtest.c
index 0cf3c6f7372..cfc3a3df123 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cstrtest.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cstrtest.c
@@ -27,11 +27,17 @@ void addCStringTest(TestNode** root);
static void TestInvariant(void);
static void TestCompareInvEbcdicAsAscii(void);
+static void TestLocaleAtSign(void);
+static void TestNoInvariantAtSign(void);
+static void TestInvCharToAscii(void);
void addCStringTest(TestNode** root) {
- addTest(root, &TestAPI, "tsutil/cstrtest/TestAPI");
- addTest(root, &TestInvariant, "tsutil/cstrtest/TestInvariant");
+ addTest(root, &TestAPI, "tsutil/cstrtest/TestAPI");
+ addTest(root, &TestInvariant, "tsutil/cstrtest/TestInvariant");
addTest(root, &TestCompareInvEbcdicAsAscii, "tsutil/cstrtest/TestCompareInvEbcdicAsAscii");
+ addTest(root, &TestLocaleAtSign, "tsutil/cstrtest/TestLocaleAtSign");
+ addTest(root, &TestNoInvariantAtSign, "tsutil/cstrtest/TestNoInvariantAtSign");
+ addTest(root, &TestInvCharToAscii, "tsutil/cstrtest/TestInvCharToAscii");
}
static void TestAPI(void)
@@ -117,10 +123,10 @@ static void TestAPI(void)
log_err("FAIL: uprv_stricmp() where the second string is null failed. Expected: 1, returned %d\n", intValue);
}
if((intValue=uprv_stricmp(NULL, NULL)) != 0){
- log_err("FAIL: uprv_stricmp(NULL, NULL) failed. Expected: 0, returned %d\n", intValue);;
+ log_err("FAIL: uprv_stricmp(NULL, NULL) failed. Expected: 0, returned %d\n", intValue);
}
if((intValue=uprv_stricmp("", "")) != 0){
- log_err("FAIL: uprv_stricmp(\"\", \"\") failed. Expected: 0, returned %d\n", intValue);;
+ log_err("FAIL: uprv_stricmp(\"\", \"\") failed. Expected: 0, returned %d\n", intValue);
}
if((intValue=uprv_stricmp("", "abc")) != -1){
log_err("FAIL: uprv_stricmp(\"\", \"abc\") failed. Expected: -1, returned %d\n", intValue);
@@ -146,10 +152,10 @@ static void TestAPI(void)
log_err("FAIL: uprv_strnicmp() where the second string is null failed. Expected: 1, returned %d\n", intValue);
}
if((intValue=uprv_strnicmp(NULL, NULL, 10)) != 0){
- log_err("FAIL: uprv_strnicmp(NULL, NULL, 10) failed. Expected: 0, returned %d\n", intValue);;
+ log_err("FAIL: uprv_strnicmp(NULL, NULL, 10) failed. Expected: 0, returned %d\n", intValue);
}
if((intValue=uprv_strnicmp("", "", 10)) != 0){
- log_err("FAIL: uprv_strnicmp(\"\", \"\") failed. Expected: 0, returned %d\n", intValue);;
+ log_err("FAIL: uprv_strnicmp(\"\", \"\") failed. Expected: 0, returned %d\n", intValue);
}
if((intValue=uprv_strnicmp("", "abc", 10)) != -1){
log_err("FAIL: uprv_stricmp(\"\", \"abc\", 10) failed. Expected: -1, returned %d\n", intValue);
@@ -215,7 +221,7 @@ TestInvariant() {
log_err("u_charsToUChars(variantChars) failed\n");
}
-#ifdef NDEBUG
+#ifndef U_DEBUG
/*
* Test u_UCharsToChars(variantUChars) only in release mode because it will
* cause an assertion failure in debug builds.
@@ -271,7 +277,7 @@ TestInvariant() {
log_err("uprv_isInvariantString(\"\\0\") failed\n");
}
- for(i=0; i<(sizeof(variantChars)-1); ++i) {
+ for(i=0; i<(int32_t)(sizeof(variantChars)-1); ++i) {
if(uprv_isInvariantString(variantChars+i, 1)) {
log_err("uprv_isInvariantString(variantChars[%d]) failed\n", i);
}
@@ -339,3 +345,53 @@ TestCompareInvEbcdicAsAscii() {
}
}
}
+
+// See U_CHARSET_FAMILY in unicode/platform.h.
+static const char *nativeInvChars =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789 \"%&'()*+,-./:;<=>?_";
+static const UChar *asciiInvChars =
+ u"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ u"abcdefghijklmnopqrstuvwxyz"
+ u"0123456789 \"%&'()*+,-./:;<=>?_";
+
+static void
+TestLocaleAtSign() {
+ static const char *invLocale = "de-Latn_DE@PHONEBOOK";
+ for (int32_t i = 0;; ++i) {
+ char ic = invLocale[i];
+ if (ic == 0) { break; }
+ UBool expected = i == 10;
+ UBool actual = uprv_isAtSign(ic);
+ if (actual != expected) {
+ log_err("uprv_isAtSign('%c')=%d is wrong\n", ic, (int)actual);
+ }
+ }
+}
+
+// The at sign is not an invariant character.
+static void
+TestNoInvariantAtSign() {
+ for (int32_t i = 0;; ++i) {
+ char ic = nativeInvChars[i];
+ UBool actual = uprv_isAtSign(ic);
+ if (actual) {
+ log_err("uprv_isAtSign(invariant '%c')=TRUE is wrong\n", ic);
+ }
+ if (ic == 0) { break; }
+ }
+}
+
+static void
+TestInvCharToAscii() {
+ for (int32_t i = 0;; ++i) {
+ char ic = nativeInvChars[i];
+ uint8_t ac = asciiInvChars[i];
+ uint8_t actual = uprv_invCharToAscii(ic);
+ if (actual != ac) {
+ log_err("uprv_invCharToAscii('%c') did not convert to ASCII 0x%02x\n", ic, (int)ac);
+ }
+ if (ic == 0) { break; }
+ }
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cucdapi.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cucdapi.c
index 3cf759a6afe..9b359c7a922 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cucdapi.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cucdapi.c
@@ -417,6 +417,8 @@ void TestUScriptCodeAPI(){
// new in ICU 61
"Dogra", "Gunjala_Gondi", "Makasar", "Medefaidrin",
"Hanifi_Rohingya", "Sogdian", "Old_Sogdian",
+ // new in ICU 64
+ "Elymaic", "Nyiakeng_Puachue_Hmong", "Nandinagari", "Wancho",
};
static const char* expectedShort[] = {
"Bali", "Batk", "Blis", "Brah", "Cham", "Cirt", "Cyrs", "Egyd", "Egyh", "Egyp",
@@ -449,6 +451,8 @@ void TestUScriptCodeAPI(){
"Gonm", "Soyo", "Zanb",
// new in ICU 61
"Dogr", "Gong", "Maka", "Medf", "Rohg", "Sogd", "Sogo",
+ // new in ICU 64
+ "Elym", "Hmnp", "Nand", "Wcho",
};
int32_t j = 0;
if(UPRV_LENGTHOF(expectedLong)!=(USCRIPT_CODE_LIMIT-USCRIPT_BALINESE)) {
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/cucdtst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/cucdtst.c
index 059bd72adad..cd097320d9e 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/cucdtst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/cucdtst.c
@@ -963,6 +963,7 @@ unicodeDataLineFn(void *context,
char *fields[][2], int32_t fieldCount,
UErrorCode *pErrorCode)
{
+ (void)fieldCount; // suppress compiler warnings about unused variable
char buffer[100];
const char *d;
char *end;
@@ -1022,7 +1023,7 @@ unicodeDataLineFn(void *context,
/* get BiDi category, field 4 */
*fields[4][1]=0;
i=MakeDir(fields[4][0]);
- if(i!=u_charDirection(c) || i!=u_getIntPropertyValue(c, UCHAR_BIDI_CLASS)) {
+ if(i!=(int32_t)u_charDirection(c) || i!=u_getIntPropertyValue(c, UCHAR_BIDI_CLASS)) {
log_err("error: u_charDirection(U+%04lx)==%u instead of %u (%s)\n", c, u_charDirection(c), MakeDir(fields[4][0]), fields[4][0]);
}
@@ -1217,6 +1218,8 @@ enumTypeRange(const void *context, UChar32 start, UChar32 limit, UCharCategory t
static UBool U_CALLCONV
enumDefaultsRange(const void *context, UChar32 start, UChar32 limit, UCharCategory type) {
+ (void)context; // suppress compiler warnings about unused variable
+
/* default Bidi classes for unassigned code points, from the DerivedBidiClass.txt header */
static const int32_t defaultBidi[][2]={ /* { limit, class } */
{ 0x0590, U_LEFT_TO_RIGHT },
@@ -1244,6 +1247,8 @@ enumDefaultsRange(const void *context, UChar32 start, UChar32 limit, UCharCatego
{ 0x1E800, U_LEFT_TO_RIGHT }, /* new default-R range in Unicode 5.2: U+1E800 - U+1EFFF */
{ 0x1EC70, U_RIGHT_TO_LEFT }, // Unicode 11 changes U+1EC70..U+1ECBF from R to AL.
{ 0x1ECC0, U_RIGHT_TO_LEFT_ARABIC },
+ { 0x1ED00, U_RIGHT_TO_LEFT }, // Unicode 12 changes U+1ED00..U+1ED4F from R to AL.
+ { 0x1ED50, U_RIGHT_TO_LEFT_ARABIC },
{ 0x1EE00, U_RIGHT_TO_LEFT },
{ 0x1EF00, U_RIGHT_TO_LEFT_ARABIC }, /* Unicode 6.1 changes U+1EE00..U+1EEFF from R to AL */
{ 0x1F000, U_RIGHT_TO_LEFT },
@@ -1290,7 +1295,7 @@ enumDefaultsRange(const void *context, UChar32 start, UChar32 limit, UCharCatego
}
if( u_charDirection(c)!=shouldBeDir ||
- u_getIntPropertyValue(c, UCHAR_BIDI_CLASS)!=shouldBeDir
+ (UCharDirection)u_getIntPropertyValue(c, UCHAR_BIDI_CLASS)!=shouldBeDir
) {
log_err("error: u_charDirection(unassigned/PUA U+%04lx)=%s should be %s\n",
c, dirStrings[u_charDirection(c)], dirStrings[shouldBeDir]);
@@ -1649,28 +1654,28 @@ static const struct {
uint32_t code;
const char *name, *oldName, *extName, *alias;
} names[]={
- {0x0061, "LATIN SMALL LETTER A", "", "LATIN SMALL LETTER A"},
+ {0x0061, "LATIN SMALL LETTER A", "", "LATIN SMALL LETTER A", NULL},
{0x01a2, "LATIN CAPITAL LETTER OI", "",
"LATIN CAPITAL LETTER OI",
"LATIN CAPITAL LETTER GHA"},
{0x0284, "LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK", "",
- "LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK" },
+ "LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK", NULL},
{0x0fd0, "TIBETAN MARK BSKA- SHOG GI MGO RGYAN", "",
"TIBETAN MARK BSKA- SHOG GI MGO RGYAN",
"TIBETAN MARK BKA- SHOG GI MGO RGYAN"},
- {0x3401, "CJK UNIFIED IDEOGRAPH-3401", "", "CJK UNIFIED IDEOGRAPH-3401" },
- {0x7fed, "CJK UNIFIED IDEOGRAPH-7FED", "", "CJK UNIFIED IDEOGRAPH-7FED" },
- {0xac00, "HANGUL SYLLABLE GA", "", "HANGUL SYLLABLE GA" },
- {0xd7a3, "HANGUL SYLLABLE HIH", "", "HANGUL SYLLABLE HIH" },
- {0xd800, "", "", "<lead surrogate-D800>" },
- {0xdc00, "", "", "<trail surrogate-DC00>" },
- {0xff08, "FULLWIDTH LEFT PARENTHESIS", "", "FULLWIDTH LEFT PARENTHESIS" },
- {0xffe5, "FULLWIDTH YEN SIGN", "", "FULLWIDTH YEN SIGN" },
- {0xffff, "", "", "<noncharacter-FFFF>" },
+ {0x3401, "CJK UNIFIED IDEOGRAPH-3401", "", "CJK UNIFIED IDEOGRAPH-3401", NULL},
+ {0x7fed, "CJK UNIFIED IDEOGRAPH-7FED", "", "CJK UNIFIED IDEOGRAPH-7FED", NULL},
+ {0xac00, "HANGUL SYLLABLE GA", "", "HANGUL SYLLABLE GA", NULL},
+ {0xd7a3, "HANGUL SYLLABLE HIH", "", "HANGUL SYLLABLE HIH", NULL},
+ {0xd800, "", "", "<lead surrogate-D800>", NULL},
+ {0xdc00, "", "", "<trail surrogate-DC00>", NULL},
+ {0xff08, "FULLWIDTH LEFT PARENTHESIS", "", "FULLWIDTH LEFT PARENTHESIS", NULL},
+ {0xffe5, "FULLWIDTH YEN SIGN", "", "FULLWIDTH YEN SIGN", NULL},
+ {0xffff, "", "", "<noncharacter-FFFF>", NULL},
{0x1d0c5, "BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS", "",
"BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS",
"BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA VASIS"},
- {0x23456, "CJK UNIFIED IDEOGRAPH-23456", "", "CJK UNIFIED IDEOGRAPH-23456" }
+ {0x23456, "CJK UNIFIED IDEOGRAPH-23456", "", "CJK UNIFIED IDEOGRAPH-23456", NULL}
};
static UBool
@@ -1906,7 +1911,8 @@ TestCharNames() {
uset_add,
uset_addRange,
uset_addString,
- NULL /* don't need remove() */
+ NULL, /* don't need remove() */
+ NULL /* don't need removeRange() */
};
sa.set=set;
uprv_getCharNameCharacters(&sa);
@@ -2003,29 +2009,62 @@ TestCharNames() {
static void
TestUCharFromNameUnderflow() {
// Ticket #10889: Underflow crash when there is no dash.
+ const char *name="<NO BREAK SPACE>";
UErrorCode errorCode=U_ZERO_ERROR;
- UChar32 c=u_charFromName(U_EXTENDED_CHAR_NAME, "<NO BREAK SPACE>", &errorCode);
+ UChar32 c=u_charFromName(U_EXTENDED_CHAR_NAME, name, &errorCode);
if(U_SUCCESS(errorCode)) {
- log_err("u_charFromName(<NO BREAK SPACE>) = U+%04x but should fail - %s\n", c, u_errorName(errorCode));
+ log_err("u_charFromName(%s) = U+%04x but should fail - %s\n",
+ name, c, u_errorName(errorCode));
}
// Test related edge cases.
+ name="<-00a0>";
+ errorCode=U_ZERO_ERROR;
+ c=u_charFromName(U_EXTENDED_CHAR_NAME, name, &errorCode);
+ if(U_SUCCESS(errorCode)) {
+ log_err("u_charFromName(%s) = U+%04x but should fail - %s\n",
+ name, c, u_errorName(errorCode));
+ }
+
+ errorCode=U_ZERO_ERROR;
+ name="<control->";
+ c=u_charFromName(U_EXTENDED_CHAR_NAME, name, &errorCode);
+ if(U_SUCCESS(errorCode)) {
+ log_err("u_charFromName(%s) = U+%04x but should fail - %s\n",
+ name, c, u_errorName(errorCode));
+ }
+
errorCode=U_ZERO_ERROR;
- c=u_charFromName(U_EXTENDED_CHAR_NAME, "<-00a0>", &errorCode);
+ name="<control-111111>";
+ c=u_charFromName(U_EXTENDED_CHAR_NAME, name, &errorCode);
if(U_SUCCESS(errorCode)) {
- log_err("u_charFromName(<-00a0>) = U+%04x but should fail - %s\n", c, u_errorName(errorCode));
+ log_err("u_charFromName(%s) = U+%04x but should fail - %s\n",
+ name, c, u_errorName(errorCode));
}
+ // ICU-20292: integer overflow
errorCode=U_ZERO_ERROR;
- c=u_charFromName(U_EXTENDED_CHAR_NAME, "<control->", &errorCode);
+ name="<noncharacter-10010FFFF>";
+ c=u_charFromName(U_EXTENDED_CHAR_NAME, name, &errorCode);
if(U_SUCCESS(errorCode)) {
- log_err("u_charFromName(<control->) = U+%04x but should fail - %s\n", c, u_errorName(errorCode));
+ log_err("u_charFromName(%s) = U+%04x but should fail - %s\n",
+ name, c, u_errorName(errorCode));
}
errorCode=U_ZERO_ERROR;
- c=u_charFromName(U_EXTENDED_CHAR_NAME, "<control-111111>", &errorCode);
+ name="<noncharacter-00010FFFF>"; // too many digits even if only leading 0s
+ c=u_charFromName(U_EXTENDED_CHAR_NAME, name, &errorCode);
if(U_SUCCESS(errorCode)) {
- log_err("u_charFromName(<control-111111>) = U+%04x but should fail - %s\n", c, u_errorName(errorCode));
+ log_err("u_charFromName(%s) = U+%04x but should fail - %s\n",
+ name, c, u_errorName(errorCode));
+ }
+
+ errorCode=U_ZERO_ERROR;
+ name="<noncharacter-fFFf>>";
+ c=u_charFromName(U_EXTENDED_CHAR_NAME, name, &errorCode);
+ if(U_SUCCESS(errorCode)) {
+ log_err("u_charFromName(%s) = U+%04x but should fail - %s\n",
+ name, c, u_errorName(errorCode));
}
}
@@ -3383,6 +3422,8 @@ static void U_CALLCONV
caseFoldingLineFn(void *context,
char *fields[][2], int32_t fieldCount,
UErrorCode *pErrorCode) {
+ (void)fieldCount; // suppress compiler warnings about unused variable
+
CaseFoldingData *pData=(CaseFoldingData *)context;
char *end;
UChar full[32];
@@ -3490,7 +3531,7 @@ caseFoldingLineFn(void *context,
static void
TestCaseFolding() {
- CaseFoldingData data={ NULL };
+ CaseFoldingData data={ NULL, 0, 0, {0}, 0, 0 };
char *fields[3][2];
UErrorCode errorCode;
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/currtest.c b/Build/source/libs/icu/icu-src/source/test/cintltst/currtest.c
index dca9635bc5b..514278ad588 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/currtest.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/currtest.c
@@ -122,7 +122,7 @@ static int32_t checkItemCount(uint32_t currencyType) {
originalCount = uenum_count(en, &status);
for (count=0;;count++) {
const char *str = uenum_next(en, &len, &status);
- if (str == NULL || len != expectedLen || strlen(str) != expectedLen) {
+ if (str == NULL || len != expectedLen || (int32_t)strlen(str) != expectedLen) {
break;
}
}
@@ -171,21 +171,21 @@ static void TestFractionDigitOverride(void) {
}
/* Make sure that you can format normal fraction digits. */
unum_formatDouble(fmt, 123.456, buffer, UPRV_LENGTHOF(buffer), NULL, &status);
- u_unescape(expectedFirst, expectedBuf, strlen(expectedFirst)+1);
+ u_unescape(expectedFirst, expectedBuf, (int32_t)strlen(expectedFirst)+1);
if (u_strcmp(buffer, expectedBuf) != 0) {
log_err("Error: unum_formatDouble didn't return %s\n", expectedFirst);
}
/* Make sure that you can format 2 fraction digits. */
unum_setAttribute(fmt, UNUM_FRACTION_DIGITS, 2);
unum_formatDouble(fmt, 123.456, buffer, UPRV_LENGTHOF(buffer), NULL, &status);
- u_unescape(expectedSecond, expectedBuf, strlen(expectedSecond)+1);
+ u_unescape(expectedSecond, expectedBuf, (int32_t)strlen(expectedSecond)+1);
if (u_strcmp(buffer, expectedBuf) != 0) {
log_err("Error: unum_formatDouble didn't return %s\n", expectedSecond);
}
/* Make sure that you can format more fraction digits. */
unum_setAttribute(fmt, UNUM_FRACTION_DIGITS, 3);
unum_formatDouble(fmt, 123.456, buffer, UPRV_LENGTHOF(buffer), NULL, &status);
- u_unescape(expectedThird, expectedBuf, strlen(expectedThird)+1);
+ u_unescape(expectedThird, expectedBuf, (int32_t)strlen(expectedThird)+1);
if (u_strcmp(buffer, expectedBuf) != 0) {
log_err("Error: unum_formatDouble didn't return %s\n", expectedThird);
}
@@ -252,7 +252,7 @@ static void TestNumericCode(void) {
int32_t numCode;
for (i = 0; NUMCODE_TESTDATA[i].alphaCode; i++) {
- int32_t length = uprv_strlen(NUMCODE_TESTDATA[i].alphaCode);
+ int32_t length = (int32_t)uprv_strlen(NUMCODE_TESTDATA[i].alphaCode);
u_charsToUChars(NUMCODE_TESTDATA[i].alphaCode, code, length + 1); // +1 includes the NUL
numCode = ucurr_getNumericCode(code);
if (numCode != NUMCODE_TESTDATA[i].numericCode) {
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/custrtrn.c b/Build/source/libs/icu/icu-src/source/test/cintltst/custrtrn.c
index 087da834ce8..895022e6029 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/custrtrn.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/custrtrn.c
@@ -702,7 +702,7 @@ static void Test_UChar_UTF8_API(void){
out16[0]=0x55aa;
uDestLen=0;
u_strFromUTF8WithSub(out16, UPRV_LENGTHOF(out16), &uDestLen,
- (const char *)withTrail8, uprv_strlen((const char *)withTrail8),
+ (const char *)withTrail8, (int32_t)uprv_strlen((const char *)withTrail8),
0x50005, &numSubstitutions,
&err);
if(U_FAILURE(err) || uDestLen!=u_strlen(withTrail16Sub50005) ||
@@ -748,7 +748,7 @@ static void Test_UChar_UTF8_API(void){
withTrail16, u_strlen(withTrail16),
0xfffd, &numSubstitutions,
&err);
- if(U_FAILURE(err) || u8DestLen!=uprv_strlen((const char *)withTrail8SubFFFD) ||
+ if(U_FAILURE(err) || u8DestLen!=(int32_t)uprv_strlen((const char *)withTrail8SubFFFD) ||
0!=uprv_memcmp((const char *)withTrail8SubFFFD, out8, u8DestLen+1) ||
numSubstitutions!=1) {
log_err("error: u_strToUTF8WithSub(length) failed\n");
@@ -763,7 +763,7 @@ static void Test_UChar_UTF8_API(void){
withTrail16, -1,
0x1a, &numSubstitutions,
&err);
- if(U_FAILURE(err) || u8DestLen!=uprv_strlen((const char *)withTrail8Sub1A) ||
+ if(U_FAILURE(err) || u8DestLen!=(int32_t)uprv_strlen((const char *)withTrail8Sub1A) ||
0!=uprv_memcmp((const char *)withTrail8Sub1A, out8, u8DestLen+1) ||
numSubstitutions!=1) {
log_err("error: u_strToUTF8WithSub(NUL termination) failed\n");
@@ -778,7 +778,7 @@ static void Test_UChar_UTF8_API(void){
withTrail16, -1,
0xfffd, &numSubstitutions,
&err);
- if(err!=U_BUFFER_OVERFLOW_ERROR || u8DestLen!=uprv_strlen((const char *)withTrail8SubFFFD) ||
+ if(err!=U_BUFFER_OVERFLOW_ERROR || u8DestLen!=(int32_t)uprv_strlen((const char *)withTrail8SubFFFD) ||
numSubstitutions!=1) {
log_err("error: u_strToUTF8WithSub(preflight/NUL termination) failed\n");
}
@@ -1023,7 +1023,7 @@ Test_FromUTF8Lenient(void) {
*pb!=(char)0xff;
pb+=srcLength+1, pu+=destLength0+1, ++number
) {
- srcLength=uprv_strlen(pb);
+ srcLength=(int32_t)uprv_strlen(pb);
destLength0=u_strlen(pu);
/* preflighting with NUL-termination */
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/hpmufn.c b/Build/source/libs/icu/icu-src/source/test/cintltst/hpmufn.c
index 4cdf377e46d..15ee5b4120c 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/hpmufn.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/hpmufn.c
@@ -42,17 +42,20 @@ addHeapMutexTest(TestNode** root)
static int32_t gMutexFailures = 0;
-#define TEST_STATUS(status, expected) \
-if (status != expected) { \
-log_err_status(status, "FAIL at %s:%d. Actual status = \"%s\"; Expected status = \"%s\"\n", \
- __FILE__, __LINE__, u_errorName(status), u_errorName(expected)); gMutexFailures++; }
+#define TEST_STATUS(status, expected) UPRV_BLOCK_MACRO_BEGIN { \
+ if (status != expected) { \
+ log_err_status(status, "FAIL at %s:%d. Actual status = \"%s\"; Expected status = \"%s\"\n", \
+ __FILE__, __LINE__, u_errorName(status), u_errorName(expected)); gMutexFailures++; \
+ } \
+} UPRV_BLOCK_MACRO_END
-#define TEST_ASSERT(expr) \
-if (!(expr)) { \
- log_err("FAILED Assertion \"" #expr "\" at %s:%d.\n", __FILE__, __LINE__); \
- gMutexFailures++; \
-}
+#define TEST_ASSERT(expr) UPRV_BLOCK_MACRO_BEGIN { \
+ if (!(expr)) { \
+ log_err("FAILED Assertion \"" #expr "\" at %s:%d.\n", __FILE__, __LINE__); \
+ gMutexFailures++; \
+ } \
+} UPRV_BLOCK_MACRO_END
/* These tests do cleanup and reinitialize ICU in the course of their operation.
@@ -83,6 +86,7 @@ int gBlockCount = 0;
const void *gContext;
static void * U_CALLCONV myMemAlloc(const void *context, size_t size) {
+ (void)context; // suppress compiler warnings about unused variable
char *retPtr = (char *)malloc(size+sizeof(ctest_AlignedMemory));
if (retPtr != NULL) {
retPtr += sizeof(ctest_AlignedMemory);
@@ -92,6 +96,7 @@ static void * U_CALLCONV myMemAlloc(const void *context, size_t size) {
}
static void U_CALLCONV myMemFree(const void *context, void *mem) {
+ (void)context; // suppress compiler warnings about unused variable
char *freePtr = (char *)mem;
if (freePtr != NULL) {
freePtr -= sizeof(ctest_AlignedMemory);
@@ -102,6 +107,7 @@ static void U_CALLCONV myMemFree(const void *context, void *mem) {
static void * U_CALLCONV myMemRealloc(const void *context, void *mem, size_t size) {
+ (void)context; // suppress compiler warnings about unused variable
char *p = (char *)mem;
char *retPtr;
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/idnatest.c b/Build/source/libs/icu/icu-src/source/test/cintltst/idnatest.c
index b164c9ce792..e42aedea0c1 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/idnatest.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/idnatest.c
@@ -825,7 +825,7 @@ static void TestLength(){
static void TestJB5273(){
static const char INVALID_DOMAIN_NAME[] = "xn--m\\u00FCller.de";
UChar invalid_idn[25] = {'\0'};
- int32_t len = u_unescape(INVALID_DOMAIN_NAME, invalid_idn, strlen(INVALID_DOMAIN_NAME));
+ int32_t len = u_unescape(INVALID_DOMAIN_NAME, invalid_idn, (int32_t)strlen(INVALID_DOMAIN_NAME));
UChar output[50] = {'\0'};
UErrorCode status = U_ZERO_ERROR;
UParseError prsError;
@@ -923,7 +923,7 @@ static void TestUTS46() {
log_err("uidna_labelToASCII_UTF8() failed: %s\n", u_errorName(errorCode));
}
errorCode = U_ZERO_ERROR;
- length = uidna_labelToUnicodeUTF8(uts46, fA_sharps8, strlen(fA_sharps8),
+ length = uidna_labelToUnicodeUTF8(uts46, fA_sharps8, (int32_t)strlen(fA_sharps8),
dest8, UPRV_LENGTHOF(dest8), &info, &errorCode);
if( U_FAILURE(errorCode) || length != 4 || 0 != memcmp(dest8, fa_sharps8, 5) ||
!info.isTransitionalDifferent || info.errors != 0
@@ -931,7 +931,7 @@ static void TestUTS46() {
log_err("uidna_labelToUnicodeUTF8() failed: %s\n", u_errorName(errorCode));
}
errorCode = U_ZERO_ERROR;
- length = uidna_nameToASCII_UTF8(uts46, fA_sharps8, strlen(fA_sharps8),
+ length = uidna_nameToASCII_UTF8(uts46, fA_sharps8, (int32_t)strlen(fA_sharps8),
dest8, 4, &info, &errorCode);
if( errorCode != U_STRING_NOT_TERMINATED_WARNING ||
length != 4 || 0 != memcmp(dest8, fass8, 4) ||
@@ -1001,13 +1001,13 @@ static void TestUTS46() {
log_err("uidna_labelToASCII_UTF8(dest=NULL) failed: %s\n", u_errorName(errorCode));
}
errorCode = U_ZERO_ERROR;
- length = uidna_labelToUnicodeUTF8(uts46, fA_sharps8, strlen(fA_sharps8),
+ length = uidna_labelToUnicodeUTF8(uts46, fA_sharps8, (int32_t)strlen(fA_sharps8),
dest8, -1, &info, &errorCode);
if(errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
log_err("uidna_labelToUnicodeUTF8(capacity<0) failed: %s\n", u_errorName(errorCode));
}
errorCode = U_ZERO_ERROR;
- length = uidna_nameToASCII_UTF8(uts46, dest8, strlen(fA_sharps8),
+ length = uidna_nameToASCII_UTF8(uts46, dest8, (int32_t)strlen(fA_sharps8),
dest8, 4, &info, &errorCode);
if(errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
log_err("uidna_nameToASCII_UTF8(src==dest!=NULL) failed: %s\n", u_errorName(errorCode));
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/nccbtst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/nccbtst.c
index 55780d56622..66551a7382e 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/nccbtst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/nccbtst.c
@@ -914,7 +914,7 @@ static void TestSkip(int32_t inputsize, int32_t outputsize)
if(!testConvertToUnicode(sampleText1, UPRV_LENGTHOF(sampleText1),
expected1, UPRV_LENGTHOF(expected1),"utf8",
UCNV_TO_U_CALLBACK_SKIP, offsets1, NULL, 0 ))
- log_err("utf8->u with skip did not match.\n");;
+ log_err("utf8->u with skip did not match.\n");
}
log_verbose("Testing toUnicode for SCSU with UCNV_TO_U_CALLBACK_SKIP \n");
@@ -1330,7 +1330,7 @@ static void TestStop(int32_t inputsize, int32_t outputsize)
if(!testConvertToUnicode(sampleText1, UPRV_LENGTHOF(sampleText1),
expected1, UPRV_LENGTHOF(expected1),"utf8",
UCNV_TO_U_CALLBACK_STOP, offsets1, NULL, 0 ))
- log_err("utf8->u with stop did not match.\n");;
+ log_err("utf8->u with stop did not match.\n");
}
log_verbose("Testing toUnicode for SCSU with UCNV_TO_U_CALLBACK_STOP \n");
{
@@ -1341,7 +1341,7 @@ static void TestStop(int32_t inputsize, int32_t outputsize)
if(!testConvertToUnicode(sampleText1, UPRV_LENGTHOF(sampleText1),
expected1, UPRV_LENGTHOF(expected1),"SCSU",
UCNV_TO_U_CALLBACK_STOP, offsets1, NULL, 0 ))
- log_err("scsu->u with stop did not match.\n");;
+ log_err("scsu->u with stop did not match.\n");
}
}
@@ -1620,7 +1620,7 @@ static void TestSub(int32_t inputsize, int32_t outputsize)
if(!testConvertToUnicode(sampleText1, UPRV_LENGTHOF(sampleText1),
expected1, UPRV_LENGTHOF(expected1),"utf8",
UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets1, NULL, 0 ))
- log_err("utf8->u with substitute did not match.\n");;
+ log_err("utf8->u with substitute did not match.\n");
}
log_verbose("Testing toUnicode for SCSU with UCNV_TO_U_CALLBACK_SUBSTITUTE \n");
{
@@ -1631,7 +1631,7 @@ static void TestSub(int32_t inputsize, int32_t outputsize)
if(!testConvertToUnicode(sampleText1, UPRV_LENGTHOF(sampleText1),
expected1, UPRV_LENGTHOF(expected1),"SCSU",
UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets1, NULL, 0 ))
- log_err("scsu->u with stop did not match.\n");;
+ log_err("scsu->u with stop did not match.\n");
}
#if !UCONFIG_NO_LEGACY_CONVERSION
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/ncnvtst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/ncnvtst.c
index 255020a2e9c..77f7fbc9669 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/ncnvtst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/ncnvtst.c
@@ -699,7 +699,7 @@ static void TestRegressionUTF8(){
offset16 = 0;
offset8 = 0;
while(currCh <= UNICODE_LIMIT
- && offset16 < (MAX_LENGTH/sizeof(UChar) - MAX_UTF16_LEN)
+ && offset16 < ((int32_t)(MAX_LENGTH/sizeof(UChar) - MAX_UTF16_LEN))
&& offset8 < (MAX_LENGTH - MAX_UTF8_LEN))
{
if (currCh == SURROGATE_HIGH_START) {
@@ -770,8 +770,8 @@ static void TestRegressionUTF32(){
offset16 = 0;
offset32 = 0;
while(currCh <= UNICODE_LIMIT
- && offset16 < (MAX_LENGTH/sizeof(UChar) - MAX_UTF16_LEN)
- && offset32 < (MAX_LENGTH/sizeof(UChar32) - MAX_UTF32_LEN))
+ && offset16 < ((int32_t)(MAX_LENGTH/sizeof(UChar) - MAX_UTF16_LEN))
+ && offset32 < ((int32_t)(MAX_LENGTH/sizeof(UChar32) - MAX_UTF32_LEN)))
{
if (currCh == SURROGATE_HIGH_START) {
currCh = SURROGATE_LOW_END + 1; /* Skip surrogate range */
@@ -968,7 +968,7 @@ static void TestWithBufferSize(int32_t insize, int32_t outsize){
if(!testConvertToU(sampleText1, sizeof(sampleText1),
expected1, UPRV_LENGTHOF(expected1),"utf8", UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets1,FALSE))
- log_err("utf8->u with substitute did not match.\n");;
+ log_err("utf8->u with substitute did not match.\n");
}
#if !UCONFIG_NO_LEGACY_CONVERSION
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/nucnvtst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/nucnvtst.c
index 7aa7a1beaf7..e85c4d07b5b 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/nucnvtst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/nucnvtst.c
@@ -3095,17 +3095,18 @@ TestHZ() {
UChar *uTarget;
char *cTarget;
const char *cTargetLimit;
- char *cBuf;
- UChar *uBuf,*test;
+ char *cBuf = NULL;
+ UChar *uBuf = NULL;
+ UChar *test;
int32_t uBufSize = 120;
UErrorCode errorCode=U_ZERO_ERROR;
- UConverter *cnv;
+ UConverter *cnv = NULL;
int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5);
int32_t* myOff= offsets;
cnv=ucnv_open("HZ", &errorCode);
if(U_FAILURE(errorCode)) {
log_data_err("Unable to open HZ converter: %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)*5);
@@ -3119,7 +3120,7 @@ TestHZ() {
ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode);
if(U_FAILURE(errorCode)){
log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
cSource = cBuf;
cSourceLimit =cTarget;
@@ -3128,7 +3129,7 @@ TestHZ() {
ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode);
if(U_FAILURE(errorCode)){
log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
uSource = (const UChar*)in;
while(uSource<uSourceLimit){
@@ -3144,6 +3145,8 @@ TestHZ() {
TestSmallSourceBuffer(in,(const UChar*)in + UPRV_LENGTHOF(in),cnv);
TestToAndFromUChars(in,(const UChar*)in + UPRV_LENGTHOF(in),cnv);
TestJitterbug930("csISO2022JP");
+
+cleanup:
ucnv_close(cnv);
free(offsets);
free(uBuf);
@@ -3314,17 +3317,18 @@ TestISO_2022_JP() {
UChar *uTarget;
char *cTarget;
const char *cTargetLimit;
- char *cBuf;
- UChar *uBuf,*test;
+ char *cBuf = NULL;
+ UChar *uBuf = NULL;
+ UChar *test;
int32_t uBufSize = 120;
UErrorCode errorCode=U_ZERO_ERROR;
- UConverter *cnv;
+ UConverter *cnv = NULL;
int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5);
int32_t* myOff= offsets;
cnv=ucnv_open("ISO_2022_JP_1", &errorCode);
if(U_FAILURE(errorCode)) {
log_data_err("Unable to open an ISO_2022_JP_1 converter: %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)*5);
@@ -3338,7 +3342,7 @@ TestISO_2022_JP() {
ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode);
if(U_FAILURE(errorCode)){
log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
cSource = cBuf;
cSourceLimit =cTarget;
@@ -3347,7 +3351,7 @@ TestISO_2022_JP() {
ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode);
if(U_FAILURE(errorCode)){
log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
uSource = (const UChar*)in;
@@ -3365,6 +3369,8 @@ TestISO_2022_JP() {
TestGetNextUChar2022(cnv, cBuf, cTarget, in, "ISO-2022-JP encoding");
TestToAndFromUChars(in,(const UChar*)in + UPRV_LENGTHOF(in),cnv);
TestJitterbug930("csISO2022JP");
+
+cleanup:
ucnv_close(cnv);
free(uBuf);
free(cBuf);
@@ -3946,17 +3952,18 @@ TestISO_2022_JP_2() {
UChar *uTarget;
char *cTarget;
const char *cTargetLimit;
- char *cBuf;
- UChar *uBuf,*test;
+ char *cBuf = NULL;
+ UChar *uBuf = NULL;
+ UChar *test;
int32_t uBufSize = 120;
UErrorCode errorCode=U_ZERO_ERROR;
- UConverter *cnv;
+ UConverter *cnv = NULL;
int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5);
int32_t* myOff= offsets;
cnv=ucnv_open("ISO_2022_JP_2", &errorCode);
if(U_FAILURE(errorCode)) {
log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)*5);
@@ -3970,7 +3977,7 @@ TestISO_2022_JP_2() {
ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode);
if(U_FAILURE(errorCode)){
log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
cSource = cBuf;
cSourceLimit =cTarget;
@@ -3979,7 +3986,7 @@ TestISO_2022_JP_2() {
ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode);
if(U_FAILURE(errorCode)){
log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
uSource = (const UChar*)in;
while(uSource<uSourceLimit){
@@ -3999,6 +4006,8 @@ TestISO_2022_JP_2() {
static const uint8_t source2[]={0x0e,0x24,0x053};
TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character [ISO-2022-JP-2]");
}
+
+cleanup:
ucnv_close(cnv);
free(uBuf);
free(cBuf);
@@ -4023,17 +4032,18 @@ TestISO_2022_KR() {
UChar *uTarget;
char *cTarget;
const char *cTargetLimit;
- char *cBuf;
- UChar *uBuf,*test;
+ char *cBuf = NULL;
+ UChar *uBuf = NULL;
+ UChar *test;
int32_t uBufSize = 120;
UErrorCode errorCode=U_ZERO_ERROR;
- UConverter *cnv;
+ UConverter *cnv = NULL;
int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5);
int32_t* myOff= offsets;
cnv=ucnv_open("ISO_2022,locale=kr", &errorCode);
if(U_FAILURE(errorCode)) {
log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)*5);
@@ -4047,7 +4057,7 @@ TestISO_2022_KR() {
ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode);
if(U_FAILURE(errorCode)){
log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
cSource = cBuf;
cSourceLimit =cTarget;
@@ -4056,7 +4066,7 @@ TestISO_2022_KR() {
ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode);
if(U_FAILURE(errorCode)){
log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
uSource = (const UChar*)in;
while(uSource<uSourceLimit){
@@ -4078,6 +4088,8 @@ TestISO_2022_KR() {
ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode);
TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ILLEGAL_ESCAPE_SEQUENCE, "an invalid character [ISO-2022-KR]");
}
+
+cleanup:
ucnv_close(cnv);
free(uBuf);
free(cBuf);
@@ -4102,17 +4114,18 @@ TestISO_2022_KR_1() {
UChar *uTarget;
char *cTarget;
const char *cTargetLimit;
- char *cBuf;
- UChar *uBuf,*test;
+ char *cBuf = NULL;
+ UChar *uBuf = NULL;
+ UChar *test;
int32_t uBufSize = 120;
UErrorCode errorCode=U_ZERO_ERROR;
- UConverter *cnv;
+ UConverter *cnv = NULL;
int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5);
int32_t* myOff= offsets;
cnv=ucnv_open("ibm-25546", &errorCode);
if(U_FAILURE(errorCode)) {
log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)*5);
@@ -4126,7 +4139,7 @@ TestISO_2022_KR_1() {
ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode);
if(U_FAILURE(errorCode)){
log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
cSource = cBuf;
cSourceLimit =cTarget;
@@ -4135,7 +4148,7 @@ TestISO_2022_KR_1() {
ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode);
if(U_FAILURE(errorCode)){
log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
uSource = (const UChar*)in;
while(uSource<uSourceLimit){
@@ -4158,6 +4171,8 @@ TestISO_2022_KR_1() {
ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode);
TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ILLEGAL_ESCAPE_SEQUENCE, "an invalid character [ISO-2022-KR]");
}
+
+cleanup:
ucnv_close(cnv);
free(uBuf);
free(cBuf);
@@ -4408,17 +4423,18 @@ TestISO_2022_CN_EXT() {
UChar *uTarget;
char *cTarget;
const char *cTargetLimit;
- char *cBuf;
- UChar *uBuf,*test;
+ char *cBuf = NULL;
+ UChar *uBuf = NULL;
+ UChar *test;
int32_t uBufSize = 180;
UErrorCode errorCode=U_ZERO_ERROR;
- UConverter *cnv;
+ UConverter *cnv = NULL;
int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5);
int32_t* myOff= offsets;
cnv=ucnv_open("ISO_2022,locale=cn,version=1", &errorCode);
if(U_FAILURE(errorCode)) {
log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)*5);
@@ -4432,7 +4448,7 @@ TestISO_2022_CN_EXT() {
ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode);
if(U_FAILURE(errorCode)){
log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
cSource = cBuf;
cSourceLimit =cTarget;
@@ -4441,7 +4457,7 @@ TestISO_2022_CN_EXT() {
ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode);
if(U_FAILURE(errorCode)){
log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
uSource = (const UChar*)in;
while(uSource<uSourceLimit){
@@ -4462,6 +4478,8 @@ TestISO_2022_CN_EXT() {
static const uint8_t source2[]={0x0e,0x24,0x053};
TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character [ISO-2022-CN-EXT]");
}
+
+cleanup:
ucnv_close(cnv);
free(uBuf);
free(cBuf);
@@ -4507,17 +4525,18 @@ TestISO_2022_CN() {
UChar *uTarget;
char *cTarget;
const char *cTargetLimit;
- char *cBuf;
- UChar *uBuf,*test;
+ char *cBuf = NULL;
+ UChar *uBuf = NULL;
+ UChar *test;
int32_t uBufSize = 180;
UErrorCode errorCode=U_ZERO_ERROR;
- UConverter *cnv;
+ UConverter *cnv = NULL;
int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5);
int32_t* myOff= offsets;
cnv=ucnv_open("ISO_2022,locale=cn,version=0", &errorCode);
if(U_FAILURE(errorCode)) {
log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)*5);
@@ -4531,7 +4550,7 @@ TestISO_2022_CN() {
ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode);
if(U_FAILURE(errorCode)){
log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
cSource = cBuf;
cSourceLimit =cTarget;
@@ -4540,7 +4559,7 @@ TestISO_2022_CN() {
ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode);
if(U_FAILURE(errorCode)){
log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
- return;
+ goto cleanup;
}
uSource = (const UChar*)in;
while(uSource<uSourceLimit){
@@ -4565,6 +4584,7 @@ TestISO_2022_CN() {
TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character [ISO-2022-CN]");
}
+cleanup:
ucnv_close(cnv);
free(uBuf);
free(cBuf);
@@ -4581,6 +4601,10 @@ typedef struct {
/* Callback for TestJitterbug6175, should only get called for empty segment errors */
static void UCNV_TO_U_CALLBACK_EMPTYSEGMENT( const void *context, UConverterToUnicodeArgs *toArgs, const char* codeUnits,
int32_t length, UConverterCallbackReason reason, UErrorCode * err ) {
+ // suppress compiler warnings about unused variables
+ (void)context;
+ (void)codeUnits;
+ (void)length;
if (reason > UCNV_IRREGULAR) {
return;
}
@@ -5507,7 +5531,7 @@ static void TestJB5275_1(){
}
targetLimit = target;
target = dest;
- printUSeq(target, targetLimit-target);
+ printUSeq(target, (int)(targetLimit-target));
while(target<targetLimit){
if(*exp!=*target){
log_err("did not get the expected output. \\u%04X != \\u%04X (got)\n", *exp, *target);
@@ -5554,7 +5578,7 @@ static void TestJB5275(){
targetLimit = target;
target = dest;
- printUSeq(target, targetLimit-target);
+ printUSeq(target, (int)(targetLimit-target));
while(target<targetLimit){
if(*exp!=*target){
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/putiltst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/putiltst.c
index 1c3e0730410..e455dd59441 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/putiltst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/putiltst.c
@@ -26,6 +26,9 @@
#include "toolutil.h"
#include "uinvchar.h"
#include <stdio.h>
+#if U_PLATFORM_USES_ONLY_WIN32_API
+#include "wintz.h"
+#endif
/* See the comments on U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC. */
static void TestSignedRightShiftIsArithmetic(void) {
@@ -33,7 +36,7 @@ static void TestSignedRightShiftIsArithmetic(void) {
int32_t m=-1;
int32_t x4=x>>4;
int32_t m1=m>>1;
- UBool signedRightShiftIsArithmetic= x4==0xffff5fff && m1==-1;
+ UBool signedRightShiftIsArithmetic= (x4==(int32_t)0xffff5fff && m1==-1);
if(signedRightShiftIsArithmetic==U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC) {
log_info("signed right shift is Arithmetic Shift Right: %d\n",
signedRightShiftIsArithmetic);
@@ -214,8 +217,19 @@ static void TestPUtilAPI(void){
log_info("Note: t_timezone offset of %ld (for %s : %s) is not a multiple of 30min.", tzoffset, uprv_tzname(0), uprv_tzname(1));
}
/*tzoffset=uprv_getUTCtime();*/
+ }
+#if U_PLATFORM_USES_ONLY_WIN32_API
+ log_verbose("Testing uprv_detectWindowsTimeZone() ....\n");
+ {
+ const char* timezone = uprv_detectWindowsTimeZone();
+ if (timezone == NULL) {
+ log_err("ERROR: uprv_detectWindowsTimeZone failed (returned NULL).\n");
+ } else {
+ log_verbose("Detected TimeZone = %s\n", timezone);
+ }
}
+#endif
}
static void TestVersion(void)
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/reapits.c b/Build/source/libs/icu/icu-src/source/test/cintltst/reapits.c
index 6b1ba782c6f..73bc59a00f8 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/reapits.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/reapits.c
@@ -33,11 +33,17 @@
#include "cintltst.h"
#include "cmemory.h"
-#define TEST_ASSERT_SUCCESS(status) {if (U_FAILURE(status)) { \
-log_data_err("Failure at file %s:%d - error = %s (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status));}}
-
-#define TEST_ASSERT(expr) {if ((expr)==FALSE) { \
-log_err("Test Failure at file %s:%d - ASSERT(%s) failed.\n", __FILE__, __LINE__, #expr);}}
+#define TEST_ASSERT_SUCCESS(status) UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(status)) { \
+ log_data_err("Failure at file %s:%d - error = %s (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status)); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define TEST_ASSERT(expr) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expr)==FALSE) { \
+ log_err("Test Failure at file %s:%d - ASSERT(%s) failed.\n", __FILE__, __LINE__, #expr); \
+ } \
+} UPRV_BLOCK_MACRO_END
/*
* TEST_SETUP and TEST_TEARDOWN
@@ -50,23 +56,25 @@ log_err("Test Failure at file %s:%d - ASSERT(%s) failed.\n", __FILE__, __LINE__,
* Put arbitrary test code between SETUP and TEARDOWN.
* 're" is the compiled, ready-to-go regular expression.
*/
-#define TEST_SETUP(pattern, testString, flags) { \
+#define TEST_SETUP(pattern, testString, flags) UPRV_BLOCK_MACRO_BEGIN { \
UChar *srcString = NULL; \
status = U_ZERO_ERROR; \
re = uregex_openC(pattern, flags, NULL, &status); \
TEST_ASSERT_SUCCESS(status); \
- srcString = (UChar *)malloc((strlen(testString)+2)*sizeof(UChar)); \
- u_uastrncpy(srcString, testString, strlen(testString)+1); \
+ int32_t testStringLen = (int32_t)strlen(testString); \
+ srcString = (UChar *)malloc( (testStringLen + 2) * sizeof(UChar) ); \
+ u_uastrncpy(srcString, testString, testStringLen + 1); \
uregex_setText(re, srcString, -1, &status); \
TEST_ASSERT_SUCCESS(status); \
- if (U_SUCCESS(status)) {
-
+ if (U_SUCCESS(status)) { \
+ UPRV_BLOCK_MACRO_BEGIN {} UPRV_BLOCK_MACRO_END
+
#define TEST_TEARDOWN \
} \
TEST_ASSERT_SUCCESS(status); \
uregex_close(re); \
free(srcString); \
- }
+} UPRV_BLOCK_MACRO_END
/**
@@ -690,7 +698,7 @@ static void TestRegexCAPI(void) {
/* SetRegion(), getRegion() do something */
- TEST_SETUP(".*", "0123456789ABCDEF", 0)
+ TEST_SETUP(".*", "0123456789ABCDEF", 0);
UChar resultString[40];
TEST_ASSERT(uregex_regionStart(re, &status) == 0);
TEST_ASSERT(uregex_regionEnd(re, &status) == 16);
@@ -698,7 +706,7 @@ static void TestRegexCAPI(void) {
TEST_ASSERT(uregex_regionStart(re, &status) == 3);
TEST_ASSERT(uregex_regionEnd(re, &status) == 6);
TEST_ASSERT(uregex_findNext(re, &status));
- TEST_ASSERT(uregex_group(re, 0, resultString, UPRV_LENGTHOF(resultString), &status) == 3)
+ TEST_ASSERT(uregex_group(re, 0, resultString, UPRV_LENGTHOF(resultString), &status) == 3);
TEST_ASSERT_STRING("345", resultString, TRUE);
TEST_TEARDOWN;
@@ -849,7 +857,7 @@ static void TestRegexCAPI(void) {
status = U_ZERO_ERROR;
uregex_setText(re, text1, -1, &status);
memset(buf, -1, sizeof(buf));
- resultSz = uregex_replaceFirst(re, replText, -1, buf, strlen("Replace <aa> x1x x...x."), &status);
+ resultSz = uregex_replaceFirst(re, replText, -1, buf, (int32_t)strlen("Replace <aa> x1x x...x."), &status);
TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING);
TEST_ASSERT_STRING("Replace <aa> x1x x...x.", buf, FALSE);
TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x."));
@@ -860,7 +868,7 @@ static void TestRegexCAPI(void) {
*/
status = U_ZERO_ERROR;
memset(buf, -1, sizeof(buf));
- resultSz = uregex_replaceFirst(re, replText, -1, buf, strlen("Replace <aa> x1x x...x."), &status);
+ resultSz = uregex_replaceFirst(re, replText, -1, buf, (int32_t)strlen("Replace <aa> x1x x...x."), &status);
TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING);
TEST_ASSERT_STRING("Replace <aa> x1x x...x.", buf, FALSE);
TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x."));
@@ -875,7 +883,7 @@ static void TestRegexCAPI(void) {
/* Buffer too small by one */
status = U_ZERO_ERROR;
memset(buf, -1, sizeof(buf));
- resultSz = uregex_replaceFirst(re, replText, -1, buf, strlen("Replace <aa> x1x x...x.")-1, &status);
+ resultSz = uregex_replaceFirst(re, replText, -1, buf, (int32_t)strlen("Replace <aa> x1x x...x.")-1, &status);
TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
TEST_ASSERT_STRING("Replace <aa> x1x x...x", buf, FALSE);
TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x."));
@@ -906,8 +914,8 @@ static void TestRegexCAPI(void) {
u_uastrncpy(text2, "No match here.", UPRV_LENGTHOF(text2));
u_uastrncpy(replText, "<$1>", UPRV_LENGTHOF(replText));
u_uastrncpy(replText2, "<<$1>>", UPRV_LENGTHOF(replText2));
- expectedResultSize = strlen(expectedResult);
- expectedResultSize2 = strlen(expectedResult2);
+ expectedResultSize = (int32_t)strlen(expectedResult);
+ expectedResultSize2 = (int32_t)strlen(expectedResult2);
status = U_ZERO_ERROR;
re = uregex_openC(pattern, 0, NULL, &status);
@@ -943,7 +951,7 @@ static void TestRegexCAPI(void) {
*/
status = U_ZERO_ERROR;
memset(buf, -1, sizeof(buf));
- resultSize = uregex_replaceAll(re, replText, -1, buf, strlen("Replace xaax x1x x...x."), &status);
+ resultSize = uregex_replaceAll(re, replText, -1, buf, (int32_t)strlen("Replace xaax x1x x...x."), &status);
TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING);
TEST_ASSERT_STRING("Replace <aa> <1> <...>.", buf, FALSE);
TEST_ASSERT(resultSize == (int32_t)strlen("Replace <aa> <1> <...>."));
@@ -1190,7 +1198,7 @@ static void TestRegexCAPI(void) {
TEST_ASSERT_STRING("tag-b", fields[3], TRUE);
TEST_ASSERT_STRING(" third", fields[4], TRUE);
TEST_ASSERT(fields[5] == NULL);
- spaceNeeded = strlen("first .tag-a. second.tag-b. third."); /* "." at NUL positions */
+ spaceNeeded = (int32_t)strlen("first .tag-a. second.tag-b. third."); /* "." at NUL positions */
TEST_ASSERT(spaceNeeded == requiredCapacity);
}
}
@@ -1209,7 +1217,7 @@ static void TestRegexCAPI(void) {
TEST_ASSERT_STRING(" second<tag-b> third", fields[1], TRUE);
TEST_ASSERT(!memcmp(&fields[2],&minus1,sizeof(UChar*)));
- spaceNeeded = strlen("first . second<tag-b> third."); /* "." at NUL positions */
+ spaceNeeded = (int32_t)strlen("first . second<tag-b> third."); /* "." at NUL positions */
TEST_ASSERT(spaceNeeded == requiredCapacity);
}
@@ -1228,7 +1236,7 @@ static void TestRegexCAPI(void) {
TEST_ASSERT_STRING(" second<tag-b> third", fields[2], TRUE);
TEST_ASSERT(!memcmp(&fields[3],&minus1,sizeof(UChar*)));
- spaceNeeded = strlen("first .tag-a. second<tag-b> third."); /* "." at NUL positions */
+ spaceNeeded = (int32_t)strlen("first .tag-a. second<tag-b> third."); /* "." at NUL positions */
TEST_ASSERT(spaceNeeded == requiredCapacity);
}
@@ -1249,13 +1257,13 @@ static void TestRegexCAPI(void) {
TEST_ASSERT_STRING(" third", fields[4], TRUE);
TEST_ASSERT(!memcmp(&fields[5],&minus1,sizeof(UChar*)));
- spaceNeeded = strlen("first .tag-a. second.tag-b. third."); /* "." at NUL positions */
+ spaceNeeded = (int32_t)strlen("first .tag-a. second.tag-b. third."); /* "." at NUL positions */
TEST_ASSERT(spaceNeeded == requiredCapacity);
}
/* Split, end of text is a field delimiter. */
status = U_ZERO_ERROR;
- sz = strlen("first <tag-a> second<tag-b>");
+ sz = (int32_t)strlen("first <tag-a> second<tag-b>");
uregex_setText(re, textToSplit, sz, &status);
TEST_ASSERT_SUCCESS(status);
@@ -1277,7 +1285,7 @@ static void TestRegexCAPI(void) {
TEST_ASSERT(fields[5] == NULL);
TEST_ASSERT(fields[8] == NULL);
TEST_ASSERT(!memcmp(&fields[9],&minus1,sizeof(UChar*)));
- spaceNeeded = strlen("first .tag-a. second.tag-b.."); /* "." at NUL positions */
+ spaceNeeded = (int32_t)strlen("first .tag-a. second.tag-b.."); /* "." at NUL positions */
TEST_ASSERT(spaceNeeded == requiredCapacity);
}
}
@@ -1321,7 +1329,7 @@ static void TestRegexCAPI(void) {
* to be invoked. The nested '+' operators give exponential time
* behavior with increasing string length.
*/
- TEST_SETUP("((.)+\\2)+x", "aaaaaaaaaaaaaaaaaaab", 0)
+ TEST_SETUP("((.)+\\2)+x", "aaaaaaaaaaaaaaaaaaab", 0);
callBackContext cbInfo = {4, 0, 0};
const void *pContext = &cbInfo;
URegexMatchCallback *returnedFn = &TestCallbackFn;
@@ -2142,7 +2150,7 @@ static void TestUTextAPI(void) {
/* Split, end of text is a field delimiter. */
status = U_ZERO_ERROR;
- uregex_setText(re, textToSplit, strlen("first <tag-a> second<tag-b>"), &status);
+ uregex_setText(re, textToSplit, (int32_t)strlen("first <tag-a> second<tag-b>"), &status);
TEST_ASSERT_SUCCESS(status);
/* The TEST_ASSERT_SUCCESS call above should change too... */
@@ -2252,10 +2260,16 @@ static void TestBug8421(void) {
}
static UBool U_CALLCONV FindCallback(const void* context , int64_t matchIndex) {
+ // suppress compiler warnings about unused variables
+ (void)context;
+ (void)matchIndex;
return FALSE;
}
static UBool U_CALLCONV MatchCallback(const void *context, int32_t steps) {
+ // suppress compiler warnings about unused variables
+ (void)context;
+ (void)steps;
return FALSE;
}
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/sorttest.c b/Build/source/libs/icu/icu-src/source/test/cintltst/sorttest.c
index 3822ba1d593..d4d8136e528 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/sorttest.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/sorttest.c
@@ -28,7 +28,7 @@
#include "uarrsort.h"
static void
-SortTest() {
+SortTest(void) {
uint16_t small[]={ 8, 1, 2, 5, 4, 3, 7, 6 };
int32_t medium[]={ 10, 8, 1, 2, 5, 5, -1, 6, 4, 3, 9, 7, 5 };
uint32_t large[]={ 21, 10, 20, 19, 11, 12, 13, 10, 10, 10, 10,
@@ -109,6 +109,7 @@ typedef struct Line {
static void
printLines(const Line *lines) {
+ (void)lines; // suppress compiler warnings about unused variable
#if 0
int32_t i, j;
for(i=0; i<NUM_LINES; ++i) {
@@ -131,7 +132,7 @@ linesComparator(const void *context, const void *left, const void *right) {
return ucol_strcoll(coll, leftLine->s, STR_LEN, rightLine->s, STR_LEN);
}
-static void StableSortTest() {
+static void StableSortTest(void) {
UErrorCode errorCode=U_ZERO_ERROR;
UCollator *coll;
Line *lines, *p;
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/spooftest.c b/Build/source/libs/icu/icu-src/source/test/cintltst/spooftest.c
index 6921356dbfc..c6ddbe09542 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/spooftest.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/spooftest.c
@@ -31,19 +31,31 @@
#include "cintltst.h"
#include "cmemory.h"
-#define TEST_ASSERT_SUCCESS(status) {if (U_FAILURE(status)) { \
- log_err_status(status, "Failure at file %s, line %d, error = %s\n", __FILE__, __LINE__, u_errorName(status));}}
-
-#define TEST_ASSERT(expr) {if ((expr)==FALSE) { \
-log_err("Test Failure at file %s, line %d: \"%s\" is false.\n", __FILE__, __LINE__, #expr);};}
-
-#define TEST_ASSERT_EQ(a, b) { if ((a) != (b)) { \
- log_err("Test Failure at file %s, line %d: \"%s\" (%d) != \"%s\" (%d) \n", \
- __FILE__, __LINE__, #a, (a), #b, (b)); }}
-
-#define TEST_ASSERT_NE(a, b) { if ((a) == (b)) { \
- log_err("Test Failure at file %s, line %d: \"%s\" (%d) == \"%s\" (%d) \n", \
- __FILE__, __LINE__, #a, (a), #b, (b)); }}
+#define TEST_ASSERT_SUCCESS(status) UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(status)) { \
+ log_err_status(status, "Failure at file %s, line %d, error = %s\n", __FILE__, __LINE__, u_errorName(status)); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define TEST_ASSERT(expr) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expr)==FALSE) { \
+ log_err("Test Failure at file %s, line %d: \"%s\" is false.\n", __FILE__, __LINE__, #expr); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define TEST_ASSERT_EQ(a, b) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((a) != (b)) { \
+ log_err("Test Failure at file %s, line %d: \"%s\" (%d) != \"%s\" (%d) \n", \
+ __FILE__, __LINE__, #a, (a), #b, (b)); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define TEST_ASSERT_NE(a, b) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((a) == (b)) { \
+ log_err("Test Failure at file %s, line %d: \"%s\" (%d) == \"%s\" (%d) \n", \
+ __FILE__, __LINE__, #a, (a), #b, (b)); \
+ } \
+} UPRV_BLOCK_MACRO_END
/*
@@ -52,7 +64,7 @@ log_err("Test Failure at file %s, line %d: \"%s\" is false.\n", __FILE__, __LINE
* Put arbitrary test code between SETUP and TEARDOWN.
* "sc" is the ready-to-go SpoofChecker for use in the tests.
*/
-#define TEST_SETUP { \
+#define TEST_SETUP UPRV_BLOCK_MACRO_BEGIN { \
UErrorCode status = U_ZERO_ERROR; \
USpoofChecker *sc; \
sc = uspoof_open(&status); \
@@ -63,7 +75,7 @@ log_err("Test Failure at file %s, line %d: \"%s\" is false.\n", __FILE__, __LINE
} \
TEST_ASSERT_SUCCESS(status); \
uspoof_close(sc); \
-}
+} UPRV_BLOCK_MACRO_END
static void TestOpenFromSource(void);
static void TestUSpoofCAPI(void);
@@ -132,7 +144,7 @@ static void TestOpenFromSource() {
TEST_ASSERT_NE(f, NULL);
confusables = malloc(3000000);
if (f != NULL) {
- confusablesLength = fread(confusables, 1, 3000000, f);
+ confusablesLength = (int)fread(confusables, 1, 3000000, f);
fclose(f);
}
@@ -142,7 +154,7 @@ static void TestOpenFromSource() {
TEST_ASSERT_NE(f, NULL);
confusablesWholeScript = malloc(1000000);
if (f != NULL) {
- confusablesWholeScriptLength = fread(confusablesWholeScript, 1, 1000000, f);
+ confusablesWholeScriptLength = (int)fread(confusablesWholeScript, 1, 1000000, f);
fclose(f);
}
@@ -319,7 +331,7 @@ static void TestUSpoofCAPI(void) {
result = uspoof_check(sc, scMixed, -1, NULL, &status);
TEST_ASSERT_SUCCESS(status);
TEST_ASSERT_EQ(USPOOF_SINGLE_SCRIPT, result);
- TEST_TEARDOWN
+ TEST_TEARDOWN;
/*
@@ -358,7 +370,7 @@ static void TestUSpoofCAPI(void) {
/* Default allowed locales list should be empty */
allowedLocales = uspoof_getAllowedLocales(sc, &status);
TEST_ASSERT_SUCCESS(status);
- TEST_ASSERT(strcmp("", allowedLocales) == 0)
+ TEST_ASSERT(strcmp("", allowedLocales) == 0);
/* Allow en and ru, which should enable Latin and Cyrillic only to pass */
uspoof_setAllowedLocales(sc, "en, ru_RU", &status);
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/spreptst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/spreptst.c
index 2d8e34c74a7..bd0c93ebc07 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/spreptst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/spreptst.c
@@ -295,6 +295,7 @@ static int32_t
unescapeData(const char* src, int32_t srcLen,
char* dest, int32_t destCapacity,
UErrorCode* status){
+ (void)srcLen; // suppress compiler warnings about unused variable
UChar b1Stack[MAX_BUFFER_SIZE];
int32_t b1Capacity = MAX_BUFFER_SIZE,
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/sprpdata.c b/Build/source/libs/icu/icu-src/source/test/cintltst/sprpdata.c
index b3ac72d79c1..af249a0aa6b 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/sprpdata.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/sprpdata.c
@@ -49,6 +49,7 @@ static void U_CALLCONV
strprepProfileLineFn(void *context,
char *fields[][2], int32_t fieldCount,
UErrorCode *pErrorCode) {
+ (void)fieldCount; // suppress compiler warnings about unused variable
uint32_t mapping[40];
char *end, *map;
uint32_t code;
@@ -273,7 +274,7 @@ compareFlagsForRange(UStringPrepProfile* data,
void
doStringPrepTest(const char* binFileName, const char* txtFileName, int32_t options, UErrorCode* errorCode){
-
+ (void)options; // suppress compiler warnings about unused variable
const char *testdatapath = loadTestData(errorCode);
const char *srcdatapath = NULL;
const char *relativepath = NULL;
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/tracetst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/tracetst.c
index 94d10046aeb..4ea7f0e2d68 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/tracetst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/tracetst.c
@@ -49,10 +49,11 @@ addUTraceTest(TestNode** root)
/*
* Macro for assert style tests.
*/
-#define TEST_ASSERT(expr) \
-if (!(expr)) { \
- log_err("FAILED Assertion \"" #expr "\" at %s:%d.\n", __FILE__, __LINE__); \
-}
+#define TEST_ASSERT(expr) UPRV_BLOCK_MACRO_BEGIN { \
+ if (!(expr)) { \
+ log_err("FAILED Assertion \"" #expr "\" at %s:%d.\n", __FILE__, __LINE__); \
+ } \
+} UPRV_BLOCK_MACRO_END
/*
@@ -77,7 +78,7 @@ static void test_format(const char *format, int32_t bufCap, int32_t indent,
char expectedResult[300];
/* check that local buffers are big enough for the test case */
- if (sizeof(buf) <= bufCap) {
+ if ((int32_t)sizeof(buf) <= bufCap) {
log_err("At file:line %s:%d, requested bufCap too large.\n");
return;
}
@@ -115,6 +116,7 @@ static UBool gFnNameError = FALSE;
static UBool gFnFormatError = FALSE;
static void U_CALLCONV testTraceEntry(const void *context, int32_t fnNumber) {
+ (void)context; // suppress compiler warnings about unused variable
const char *fnName;
const char *bogusFnName;
@@ -132,6 +134,7 @@ static void U_CALLCONV testTraceEntry(const void *context, int32_t fnNumber) {
static void U_CALLCONV testTraceExit(const void *context, int32_t fnNumber,
const char *fmt, va_list args) {
+ (void)context; // suppress compiler warnings about unused variable
char buf[1000];
const char *fnName;
const char *bogusFnName;
@@ -158,6 +161,9 @@ static void U_CALLCONV testTraceExit(const void *context, int32_t fnNumber,
static void U_CALLCONV testTraceData(const void *context, int32_t fnNumber, int32_t level,
const char *fmt, va_list args) {
+ // suppress compiler warnings about unused variables
+ (void)context;
+ (void)level;
char buf[1000];
const char *fnName;
const char *bogusFnName;
@@ -181,7 +187,8 @@ static void U_CALLCONV testTraceData(const void *context, int32_t fnNumber, int3
/* printf(" %s() %s\n", fnName, buf); */
}
-static UConverter * psuedo_ucnv_open(const char *name, UErrorCode * err)
+#if !ENABLE_TRACING_ORIG_VAL
+static UConverter * pseudo_ucnv_open(const char *name, UErrorCode * err)
{
UTRACE_ENTRY_OC(UTRACE_UCNV_LOAD);
@@ -190,13 +197,13 @@ static UConverter * psuedo_ucnv_open(const char *name, UErrorCode * err)
UTRACE_EXIT_PTR_STATUS(NULL, *err);
return NULL;
}
-static void psuedo_ucnv_close(UConverter * cnv)
+static void pseudo_ucnv_close(UConverter * cnv)
{
UTRACE_ENTRY_OC(UTRACE_UCNV_UNLOAD);
UTRACE_DATA1(UTRACE_OPEN_CLOSE, "unload converter %p", cnv);
UTRACE_EXIT_VALUE((int32_t)TRUE);
}
-
+#endif
/*
* TestTraceAPI
@@ -276,9 +283,9 @@ static void TestTraceAPI() {
TEST_ASSERT(U_SUCCESS(status));
ucnv_close(cnv);
#else
- cnv = psuedo_ucnv_open(NULL, &status);
+ cnv = pseudo_ucnv_open(NULL, &status);
TEST_ASSERT(U_SUCCESS(status));
- psuedo_ucnv_close(cnv);
+ pseudo_ucnv_close(cnv);
#endif
TEST_ASSERT(gTraceEntryCount > 0);
TEST_ASSERT(gTraceExitCount > 0);
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/trie2test.c b/Build/source/libs/icu/icu-src/source/test/cintltst/trie2test.c
index aa7e7c64671..845e3fe30c2 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/trie2test.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/trie2test.c
@@ -75,6 +75,7 @@ getSpecialValues(const CheckRange checkRanges[], int32_t countCheckRanges,
/* utrie2_enum() callback, modifies a value */
static uint32_t U_CALLCONV
testEnumValue(const void *context, uint32_t value) {
+ (void)context; // suppress compiler warnings about unused variable
return value^0x5555;
}
@@ -98,6 +99,7 @@ static void
testTrieEnum(const char *testName,
const UTrie2 *trie,
const CheckRange checkRanges[], int32_t countCheckRanges) {
+ (void)testName; // suppress compiler warnings about unused variable
/* skip over special values */
while(countCheckRanges>0 && checkRanges[0].limit<=0) {
++checkRanges;
@@ -430,7 +432,7 @@ testTrieUTF8(const char *testName,
values[countValues++]=value;
}
/* write an illegal byte sequence */
- if(i8<sizeof(illegal)) {
+ if(i8<(int32_t)sizeof(illegal)) {
U8_FWD_1(illegal, i8, sizeof(illegal));
while(prev8<i8) {
s[length++]=illegal[prev8++];
@@ -439,7 +441,7 @@ testTrieUTF8(const char *testName,
}
}
/* write the remaining illegal byte sequences */
- while(i8<sizeof(illegal)) {
+ while(i8<(int32_t)sizeof(illegal)) {
U8_FWD_1(illegal, i8, sizeof(illegal));
while(prev8<i8) {
s[length++]=illegal[prev8++];
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/trietest.c b/Build/source/libs/icu/icu-src/source/test/cintltst/trietest.c
index bf770a10fa4..b70bf539d50 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/trietest.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/trietest.c
@@ -120,6 +120,7 @@ _testFoldingOffset16(uint32_t data) {
static uint32_t U_CALLCONV
_testEnumValue(const void *context, uint32_t value) {
+ (void)context; // suppress compiler warnings about unused variable
return value^0x5555;
}
@@ -815,6 +816,7 @@ TrieTest(void) {
static int32_t U_CALLCONV
dummyGetFoldingOffset(uint32_t data) {
+ (void)data; // suppress compiler warnings about unused variable
return -1; /* never get non-initialValue data for supplementary code points */
}
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/ucnvseltst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/ucnvseltst.c
index deb0a2b9f8e..7e5138a93b8 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/ucnvseltst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/ucnvseltst.c
@@ -165,8 +165,8 @@ static FILE *fopenOrError(const char *filename) {
int32_t needLen;
FILE *f;
char fnbuf[FILENAME_BUFFER];
- const char* directory= ctest_dataSrcDir();
- needLen = uprv_strlen(directory)+uprv_strlen(TDSRCPATH)+uprv_strlen(filename)+1;
+ const char* directory = ctest_dataSrcDir();
+ needLen = (int32_t)(uprv_strlen(directory) + uprv_strlen(TDSRCPATH) + uprv_strlen(filename) + 1);
if(needLen > FILENAME_BUFFER) {
log_err("FAIL: Could not load %s. Filename buffer overflow, needed %d but buffer is %d\n",
filename, needLen, FILENAME_BUFFER);
@@ -240,7 +240,7 @@ text_open(TestText *tt) {
fclose(f);
return FALSE;
}
- if (length != fread(tt->text, 1, length, f)) {
+ if (length != (int32_t)fread(tt->text, 1, length, f)) {
log_err("error reading %ld bytes from test text file\n", (long)length);
length = 0;
uprv_free(tt->text);
@@ -386,7 +386,7 @@ static void TestSelector()
return;
}
if (!text_open(&text)) {
- releaseAvailableNames();;
+ releaseAvailableNames();
}
excluded_sets[0] = uset_openEmpty();
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/ucptrietest.c b/Build/source/libs/icu/icu-src/source/test/cintltst/ucptrietest.c
index 299ef900b83..9d2e489f97f 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/ucptrietest.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/ucptrietest.c
@@ -67,6 +67,7 @@ getSpecialValues(const CheckRange checkRanges[], int32_t countCheckRanges,
/* ucptrie_enum() callback, modifies a value */
static uint32_t U_CALLCONV
testFilter(const void *context, uint32_t value) {
+ (void)context; // suppress compiler warnings about unused variable
return value ^ 0x5555;
}
@@ -568,7 +569,7 @@ testTrieUTF8(const char *testName,
values[countValues++]=value;
}
/* write an illegal byte sequence */
- if(i8<sizeof(illegal)) {
+ if(i8<(int32_t)sizeof(illegal)) {
U8_FWD_1(illegal, i8, sizeof(illegal));
while(prev8<i8) {
s[length++]=illegal[prev8++];
@@ -577,7 +578,7 @@ testTrieUTF8(const char *testName,
}
}
/* write the remaining illegal byte sequences */
- while(i8<sizeof(illegal)) {
+ while(i8<(int32_t)sizeof(illegal)) {
U8_FWD_1(illegal, i8, sizeof(illegal));
while(prev8<i8) {
s[length++]=illegal[prev8++];
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/udatatst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/udatatst.c
index d8d6ebd3534..5c57d5aa437 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/udatatst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/udatatst.c
@@ -558,6 +558,7 @@ static UBool U_CALLCONV
isAcceptable1(void *context,
const char *type, const char *name,
const UDataInfo *pInfo) {
+ (void)context; // suppress compiler warnings about unused variable
if( pInfo->size>=20 &&
pInfo->isBigEndian==U_IS_BIG_ENDIAN &&
@@ -590,6 +591,7 @@ static UBool U_CALLCONV
isAcceptable2(void *context,
const char *type, const char *name,
const UDataInfo *pInfo){
+ (void)context; // suppress compiler warnings about unused variable
UVersionInfo unicodeVersion;
u_getUnicodeVersion(unicodeVersion);
@@ -618,6 +620,7 @@ static UBool U_CALLCONV
isAcceptable3(void *context,
const char *type, const char *name,
const UDataInfo *pInfo){
+ (void)context; // suppress compiler warnings about unused variable
if( pInfo->size>=20 &&
pInfo->isBigEndian==U_IS_BIG_ENDIAN &&
@@ -1233,7 +1236,8 @@ static const struct {
{0x31, 0x31, 0x31, 0x31}, /* dataFormat="1111" */
{0, 0, 0, 0}, /* formatVersion */
- {0, 0, 0, 0}} /* dataVersion */
+ {0, 0, 0, 0}}, /* dataVersion */
+ 0
};
#endif
@@ -1395,6 +1399,7 @@ static const struct {
static void U_CALLCONV
printError(void *context, const char *fmt, va_list args) {
+ (void)context; // suppress compiler warnings about unused variable
vlog_info("[swap] ", fmt, args);
log_err("\n"); /* Register error */
}
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/uenumtst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/uenumtst.c
index 6148470a33f..8ce05e9b9cb 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/uenumtst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/uenumtst.c
@@ -59,11 +59,13 @@ chArrayClose(UEnumeration *en) {
static int32_t U_CALLCONV
chArrayCount(UEnumeration *en, UErrorCode *status) {
+ (void)status; // suppress compiler warnings about unused variable
return cont->maxIndex;
}
static const UChar* U_CALLCONV
chArrayUNext(UEnumeration *en, int32_t *resultLength, UErrorCode *status) {
+ (void)status; // suppress compiler warnings about unused variable
if(cont->currIndex >= cont->maxIndex) {
return NULL;
}
@@ -81,6 +83,7 @@ chArrayUNext(UEnumeration *en, int32_t *resultLength, UErrorCode *status) {
static const char* U_CALLCONV
chArrayNext(UEnumeration *en, int32_t *resultLength, UErrorCode *status) {
+ (void)status; // suppress compiler warnings about unused variable
if(cont->currIndex >= cont->maxIndex) {
return NULL;
}
@@ -93,6 +96,7 @@ chArrayNext(UEnumeration *en, int32_t *resultLength, UErrorCode *status) {
static void U_CALLCONV
chArrayReset(UEnumeration *en, UErrorCode *status) {
+ (void)status; // suppress compiler warnings about unused variable
cont->currIndex = 0;
}
@@ -160,11 +164,13 @@ uchArrayClose(UEnumeration *en) {
static int32_t U_CALLCONV
uchArrayCount(UEnumeration *en, UErrorCode *status) {
+ (void)status; // suppress compiler warnings about unused variable
return ucont->maxIndex;
}
static const UChar* U_CALLCONV
uchArrayUNext(UEnumeration *en, int32_t *resultLength, UErrorCode *status) {
+ (void)status; // suppress compiler warnings about unused variable
if(ucont->currIndex >= ucont->maxIndex) {
return NULL;
}
@@ -177,6 +183,7 @@ uchArrayUNext(UEnumeration *en, int32_t *resultLength, UErrorCode *status) {
static void U_CALLCONV
uchArrayReset(UEnumeration *en, UErrorCode *status) {
+ (void)status; // suppress compiler warnings about unused variable
ucont->currIndex = 0;
}
@@ -343,7 +350,7 @@ static void verifyEnumeration(int line, UEnumeration *u, const char * const * co
log_verbose("%s:%d: OK: string #%d got '%s'\n", __FILE__, line, i, c);
}
- if(len!=strlen(compareToChar[i])) {
+ if(len!=(int32_t)strlen(compareToChar[i])) {
log_err("%s:%d: FAIL: string #%d expected len %d got %d\n", __FILE__, line, i, strlen(compareToChar[i]), len);
} else {
log_verbose("%s:%d: OK: string #%d got len %d\n", __FILE__, line, i, len);
@@ -369,7 +376,7 @@ static void verifyEnumeration(int line, UEnumeration *u, const char * const * co
return;
}
if(compareToChar!=NULL) {
- u_charsToUChars(compareToChar[i], buf, strlen(compareToChar[i])+1);
+ u_charsToUChars(compareToChar[i], buf, (int32_t)strlen(compareToChar[i])+1);
if(u_strncmp(ustr,buf,len)) {
int j;
log_err("%s:%d: FAIL: ustring #%d expected '%s' got '%s'\n", __FILE__, line, i, compareToChar[i], austrdup(ustr));
@@ -380,7 +387,7 @@ static void verifyEnumeration(int line, UEnumeration *u, const char * const * co
log_verbose("%s:%d: OK: ustring #%d got '%s'\n", __FILE__, line, i, compareToChar[i]);
}
- if(len!=strlen(compareToChar[i])) {
+ if(len!=(int32_t)strlen(compareToChar[i])) {
log_err("%s:%d: FAIL: ustring #%d expected len %d got %d\n", __FILE__, line, i, strlen(compareToChar[i]), len);
} else {
log_verbose("%s:%d: OK: ustring #%d got len %d\n", __FILE__, line, i, len);
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/uformattedvaluetst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/uformattedvaluetst.c
new file mode 100644
index 00000000000..392d76e3404
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/uformattedvaluetst.c
@@ -0,0 +1,275 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
+#include "unicode/uformattedvalue.h"
+#include "unicode/unum.h"
+#include "unicode/ustring.h"
+#include "cformtst.h"
+#include "cintltst.h"
+#include "cmemory.h"
+#include "cstring.h"
+#include "uassert.h"
+
+static void TestBasic(void);
+static void TestSetters(void);
+
+static void AssertAllPartsEqual(
+ const char* messagePrefix,
+ const UConstrainedFieldPosition* ucfpos,
+ int32_t matching,
+ UFieldCategory category,
+ int32_t field,
+ int32_t start,
+ int32_t limit,
+ int64_t context);
+
+void addUFormattedValueTest(TestNode** root);
+
+#define TESTCASE(x) addTest(root, &x, "tsformat/uformattedvalue/" #x)
+
+void addUFormattedValueTest(TestNode** root) {
+ TESTCASE(TestBasic);
+ TESTCASE(TestSetters);
+}
+
+
+static void TestBasic() {
+ UErrorCode status = U_ZERO_ERROR;
+ UConstrainedFieldPosition* ucfpos = ucfpos_open(&status);
+ assertSuccess("opening ucfpos", &status);
+ assertTrue("ucfpos should not be null", ucfpos != NULL);
+
+ AssertAllPartsEqual(
+ "basic",
+ ucfpos,
+ 7,
+ UFIELD_CATEGORY_UNDEFINED,
+ 0,
+ 0,
+ 0,
+ 0LL);
+
+ ucfpos_close(ucfpos);
+}
+
+void TestSetters() {
+ UErrorCode status = U_ZERO_ERROR;
+ UConstrainedFieldPosition* ucfpos = ucfpos_open(&status);
+ assertSuccess("opening ucfpos", &status);
+ assertTrue("ucfpos should not be null", ucfpos != NULL);
+
+ ucfpos_constrainCategory(ucfpos, UFIELD_CATEGORY_DATE, &status);
+ assertSuccess("setters 0", &status);
+ AssertAllPartsEqual(
+ "setters 0",
+ ucfpos,
+ 4,
+ UFIELD_CATEGORY_DATE,
+ 0,
+ 0,
+ 0,
+ 0LL);
+
+ ucfpos_constrainField(ucfpos, UFIELD_CATEGORY_NUMBER, UNUM_COMPACT_FIELD, &status);
+ assertSuccess("setters 1", &status);
+ AssertAllPartsEqual(
+ "setters 1",
+ ucfpos,
+ 2,
+ UFIELD_CATEGORY_NUMBER,
+ UNUM_COMPACT_FIELD,
+ 0,
+ 0,
+ 0LL);
+
+ ucfpos_setInt64IterationContext(ucfpos, 42424242424242LL, &status);
+ assertSuccess("setters 2", &status);
+ AssertAllPartsEqual(
+ "setters 2",
+ ucfpos,
+ 2,
+ UFIELD_CATEGORY_NUMBER,
+ UNUM_COMPACT_FIELD,
+ 0,
+ 0,
+ 42424242424242LL);
+
+ ucfpos_setState(ucfpos, UFIELD_CATEGORY_NUMBER, UNUM_COMPACT_FIELD, 5, 10, &status);
+ assertSuccess("setters 3", &status);
+ AssertAllPartsEqual(
+ "setters 3",
+ ucfpos,
+ 2,
+ UFIELD_CATEGORY_NUMBER,
+ UNUM_COMPACT_FIELD,
+ 5,
+ 10,
+ 42424242424242LL);
+
+ ucfpos_reset(ucfpos, &status);
+ assertSuccess("setters 4", &status);
+ AssertAllPartsEqual(
+ "setters 4",
+ ucfpos,
+ 7,
+ UFIELD_CATEGORY_UNDEFINED,
+ 0,
+ 0,
+ 0,
+ 0LL);
+
+ ucfpos_close(ucfpos);
+}
+
+/** For matching, turn on these bits:
+ *
+ * 1 = UNUM_INTEGER_FIELD
+ * 2 = UNUM_COMPACT_FIELD
+ * 4 = UDAT_AM_PM_FIELD
+ */
+static void AssertAllPartsEqual(
+ const char* messagePrefix,
+ const UConstrainedFieldPosition* ucfpos,
+ int32_t matching,
+ UFieldCategory category,
+ int32_t field,
+ int32_t start,
+ int32_t limit,
+ int64_t context) {
+
+ UErrorCode status = U_ZERO_ERROR;
+
+ char message[256];
+ uprv_strncpy(message, messagePrefix, 256);
+ int32_t prefixEnd = (int32_t)uprv_strlen(messagePrefix);
+ message[prefixEnd++] = ':';
+ message[prefixEnd++] = ' ';
+ U_ASSERT(prefixEnd < 256);
+
+#define AAPE_MSG(suffix) (uprv_strncpy(message+prefixEnd, suffix, 256-prefixEnd)-prefixEnd)
+
+ UFieldCategory _category = ucfpos_getCategory(ucfpos, &status);
+ assertSuccess(AAPE_MSG("_"), &status);
+ assertIntEquals(AAPE_MSG("category"), category, _category);
+
+ int32_t _field = ucfpos_getField(ucfpos, &status);
+ assertSuccess(AAPE_MSG("field"), &status);
+ assertIntEquals(AAPE_MSG("field"), field, _field);
+
+ int32_t _start, _limit;
+ ucfpos_getIndexes(ucfpos, &_start, &_limit, &status);
+ assertSuccess(AAPE_MSG("indexes"), &status);
+ assertIntEquals(AAPE_MSG("start"), start, _start);
+ assertIntEquals(AAPE_MSG("limit"), limit, _limit);
+
+ int64_t _context = ucfpos_getInt64IterationContext(ucfpos, &status);
+ assertSuccess(AAPE_MSG("context"), &status);
+ assertIntEquals(AAPE_MSG("context"), context, _context);
+
+ UBool _matchesInteger = ucfpos_matchesField(ucfpos, UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD, &status);
+ assertSuccess(AAPE_MSG("integer field"), &status);
+ assertTrue(AAPE_MSG("integer field"),
+ ((matching & 1) != 0) ? _matchesInteger : !_matchesInteger);
+
+ UBool _matchesCompact = ucfpos_matchesField(ucfpos, UFIELD_CATEGORY_NUMBER, UNUM_COMPACT_FIELD, &status);
+ assertSuccess(AAPE_MSG("compact field"), &status);
+ assertTrue(AAPE_MSG("compact field"),
+ ((matching & 2) != 0) ? _matchesCompact : !_matchesCompact);
+
+ UBool _matchesDate = ucfpos_matchesField(ucfpos, UFIELD_CATEGORY_DATE, UDAT_AM_PM_FIELD, &status);
+ assertSuccess(AAPE_MSG("date field"), &status);
+ assertTrue(AAPE_MSG("date field"),
+ ((matching & 4) != 0) ? _matchesDate : !_matchesDate);
+}
+
+
+static void checkFormattedValueString(
+ const char* message,
+ const UFormattedValue* fv,
+ const UChar* expectedString,
+ UErrorCode* ec) {
+ int32_t length;
+ const UChar* actualString = ufmtval_getString(fv, &length, ec);
+ if (U_FAILURE(*ec)) {
+ assertIntEquals(message, 0, length);
+ return;
+ }
+ assertSuccess(message, ec);
+ // The string is guaranteed to be NUL-terminated.
+ int32_t actualLength = u_strlen(actualString);
+ assertIntEquals(message, actualLength, length);
+ assertUEquals(message, expectedString, actualString);
+}
+
+// Declared in cformtst.h
+void checkFormattedValue(
+ const char* message,
+ const UFormattedValue* fv,
+ const UChar* expectedString,
+ UFieldCategory expectedCategory,
+ const UFieldPosition* expectedFieldPositions,
+ int32_t expectedFieldPositionsLength) {
+ (void)expectedFieldPositionsLength; // suppress compiler warnings about unused variable
+ UErrorCode ec = U_ZERO_ERROR;
+ checkFormattedValueString(message, fv, expectedString, &ec);
+ if (U_FAILURE(ec)) { return; }
+
+ // Basic loop over the fields (more rigorous testing in C++)
+ UConstrainedFieldPosition* ucfpos = ucfpos_open(&ec);
+ int32_t i = 0;
+ while (ufmtval_nextPosition(fv, ucfpos, &ec)) {
+ assertIntEquals("category",
+ expectedCategory, ucfpos_getCategory(ucfpos, &ec));
+ assertIntEquals("field",
+ expectedFieldPositions[i].field, ucfpos_getField(ucfpos, &ec));
+ int32_t start, limit;
+ ucfpos_getIndexes(ucfpos, &start, &limit, &ec);
+ assertIntEquals("start",
+ expectedFieldPositions[i].beginIndex, start);
+ assertIntEquals("limit",
+ expectedFieldPositions[i].endIndex, limit);
+ i++;
+ }
+ assertTrue("After loop", !ufmtval_nextPosition(fv, ucfpos, &ec));
+ assertSuccess("After loop", &ec);
+ ucfpos_close(ucfpos);
+}
+
+void checkMixedFormattedValue(
+ const char* message,
+ const UFormattedValue* fv,
+ const UChar* expectedString,
+ const UFieldPositionWithCategory* expectedFieldPositions,
+ int32_t length) {
+ (void)length; // suppress compiler warnings about unused variable
+ UErrorCode ec = U_ZERO_ERROR;
+ checkFormattedValueString(message, fv, expectedString, &ec);
+ if (U_FAILURE(ec)) { return; }
+
+ // Basic loop over the fields (more rigorous testing in C++)
+ UConstrainedFieldPosition* ucfpos = ucfpos_open(&ec);
+ int32_t i = 0;
+ while (ufmtval_nextPosition(fv, ucfpos, &ec)) {
+ assertIntEquals("category",
+ expectedFieldPositions[i].category, ucfpos_getCategory(ucfpos, &ec));
+ assertIntEquals("field",
+ expectedFieldPositions[i].field, ucfpos_getField(ucfpos, &ec));
+ int32_t start, limit;
+ ucfpos_getIndexes(ucfpos, &start, &limit, &ec);
+ assertIntEquals("start",
+ expectedFieldPositions[i].beginIndex, start);
+ assertIntEquals("limit",
+ expectedFieldPositions[i].endIndex, limit);
+ i++;
+ }
+ assertTrue("After loop", !ufmtval_nextPosition(fv, ucfpos, &ec));
+ assertSuccess("After loop", &ec);
+ ucfpos_close(ucfpos);
+}
+
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/ulistfmttest.c b/Build/source/libs/icu/icu-src/source/test/cintltst/ulistfmttest.c
index 165bff431d2..5eb5a1eaa4b 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/ulistfmttest.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/ulistfmttest.c
@@ -15,8 +15,10 @@
#include "cintltst.h"
#include "cmemory.h"
#include "cstring.h"
+#include "cformtst.h"
static void TestUListFmt(void);
+static void TestUListFmtToValue(void);
void addUListFmtTest(TestNode** root);
@@ -25,6 +27,7 @@ void addUListFmtTest(TestNode** root);
void addUListFmtTest(TestNode** root)
{
TESTCASE(TestUListFmt);
+ TESTCASE(TestUListFmtToValue);
}
static const UChar str0[] = { 0x41,0 }; /* "A" */
@@ -126,5 +129,86 @@ static void TestUListFmt() {
}
}
+static void TestUListFmtToValue() {
+ UErrorCode ec = U_ZERO_ERROR;
+ UListFormatter* fmt = ulistfmt_open("en", &ec);
+ UFormattedList* fl = ulistfmt_openResult(&ec);
+ assertSuccess("Opening", &ec);
+
+ {
+ const char* message = "Field position test 1";
+ const UChar* expectedString = u"hello, wonderful, and world";
+ const UChar* inputs[] = {
+ u"hello",
+ u"wonderful",
+ u"world"
+ };
+ ulistfmt_formatStringsToResult(fmt, inputs, NULL, UPRV_LENGTHOF(inputs), fl, &ec);
+ assertSuccess("Formatting", &ec);
+ static const UFieldPositionWithCategory expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UFIELD_CATEGORY_LIST_SPAN, 0, 0, 5},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 0, 5},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD, 5, 7},
+ {UFIELD_CATEGORY_LIST_SPAN, 1, 7, 16},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 7, 16},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD, 16, 22},
+ {UFIELD_CATEGORY_LIST_SPAN, 2, 22, 27},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 22, 27}};
+ checkMixedFormattedValue(
+ message,
+ ulistfmt_resultAsValue(fl, &ec),
+ expectedString,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+ {
+ const char* message = "Field position test 1";
+ const UChar* expectedString = u"A, B, C, D, E, F, and G";
+ const UChar* inputs[] = {
+ u"A",
+ u"B",
+ u"C",
+ u"D",
+ u"E",
+ u"F",
+ u"G"
+ };
+ ulistfmt_formatStringsToResult(fmt, inputs, NULL, UPRV_LENGTHOF(inputs), fl, &ec);
+ assertSuccess("Formatting", &ec);
+ static const UFieldPositionWithCategory expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UFIELD_CATEGORY_LIST_SPAN, 0, 0, 1},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 0, 1},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD, 1, 3},
+ {UFIELD_CATEGORY_LIST_SPAN, 1, 3, 4},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 3, 4},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD, 4, 6},
+ {UFIELD_CATEGORY_LIST_SPAN, 2, 6, 7},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 6, 7},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD, 7, 9},
+ {UFIELD_CATEGORY_LIST_SPAN, 3, 9, 10},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 9, 10},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD, 10, 12},
+ {UFIELD_CATEGORY_LIST_SPAN, 4, 12, 13},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 12, 13},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD, 13, 15},
+ {UFIELD_CATEGORY_LIST_SPAN, 5, 15, 16},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 15, 16},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD, 16, 22},
+ {UFIELD_CATEGORY_LIST_SPAN, 6, 22, 23},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 22, 23}};
+ checkMixedFormattedValue(
+ message,
+ ulistfmt_resultAsValue(fl, &ec),
+ expectedString,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ ulistfmt_close(fmt);
+ ulistfmt_closeResult(fl);
+}
+
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/unumberformattertst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/unumberformattertst.c
index 0d3f7f134d0..2e296f033f9 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/unumberformattertst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/unumberformattertst.c
@@ -12,6 +12,7 @@
#include "unicode/unumberformatter.h"
#include "unicode/umisc.h"
#include "unicode/unum.h"
+#include "cformtst.h"
#include "cintltst.h"
#include "cmemory.h"
@@ -21,12 +22,20 @@ static void TestSkeletonFormatToFields(void);
static void TestExampleCode(void);
+static void TestFormattedValue(void);
+
+static void TestSkeletonParseError(void);
+
void addUNumberFormatterTest(TestNode** root);
+#define TESTCASE(x) addTest(root, &x, "tsformat/unumberformatter/" #x)
+
void addUNumberFormatterTest(TestNode** root) {
- addTest(root, &TestSkeletonFormatToString, "unumberformatter/TestSkeletonFormatToString");
- addTest(root, &TestSkeletonFormatToFields, "unumberformatter/TestSkeletonFormatToFields");
- addTest(root, &TestExampleCode, "unumberformatter/TestExampleCode");
+ TESTCASE(TestSkeletonFormatToString);
+ TESTCASE(TestSkeletonFormatToFields);
+ TESTCASE(TestExampleCode);
+ TESTCASE(TestFormattedValue);
+ TESTCASE(TestSkeletonParseError);
}
@@ -87,7 +96,7 @@ static void TestSkeletonFormatToFields() {
if (assertSuccessCheck("unumf_formatInt() failed", &ec, TRUE)) {
// field position test:
- UFieldPosition ufpos = {UNUM_DECIMAL_SEPARATOR_FIELD};
+ UFieldPosition ufpos = {UNUM_DECIMAL_SEPARATOR_FIELD, 0, 0};
unumf_resultNextFieldPosition(uresult, &ufpos, &ec);
assertIntEquals("Field position should be correct", 14, ufpos.beginIndex);
assertIntEquals("Field position should be correct", 15, ufpos.endIndex);
@@ -105,10 +114,11 @@ static void TestSkeletonFormatToFields() {
{UNUM_GROUPING_SEPARATOR_FIELD, 10, 11},
{UNUM_INTEGER_FIELD, 1, 14},
{UNUM_DECIMAL_SEPARATOR_FIELD, 14, 15},
- {UNUM_FRACTION_FIELD, 15, 17}
+ {UNUM_FRACTION_FIELD, 15, 17},
+ {UNUM_MEASURE_UNIT_FIELD, 18, 19}
};
UFieldPosition actual;
- for (int32_t i = 0; i < sizeof(expectedFields) / sizeof(*expectedFields); i++) {
+ for (int32_t i = 0; i < (int32_t)(sizeof(expectedFields) / sizeof(*expectedFields)); i++) {
// Iterate using the UFieldPosition to hold state...
UFieldPosition expected = expectedFields[i];
actual.field = ufieldpositer_next(ufpositer, &actual.beginIndex, &actual.endIndex);
@@ -187,4 +197,62 @@ static void TestExampleCode() {
}
+static void TestFormattedValue() {
+ UErrorCode ec = U_ZERO_ERROR;
+ UNumberFormatter* uformatter = unumf_openForSkeletonAndLocale(
+ u".00 compact-short", -1, "en", &ec);
+ assertSuccessCheck("Should create without error", &ec, TRUE);
+ UFormattedNumber* uresult = unumf_openResult(&ec);
+ assertSuccess("Should create result without error", &ec);
+
+ unumf_formatInt(uformatter, 55000, uresult, &ec); // "55.00 K"
+ if (assertSuccessCheck("Should format without error", &ec, TRUE)) {
+ const UFormattedValue* fv = unumf_resultAsValue(uresult, &ec);
+ assertSuccess("Should convert without error", &ec);
+ static const UFieldPosition expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UNUM_INTEGER_FIELD, 0, 2},
+ {UNUM_DECIMAL_SEPARATOR_FIELD, 2, 3},
+ {UNUM_FRACTION_FIELD, 3, 5},
+ {UNUM_COMPACT_FIELD, 5, 6}};
+ checkFormattedValue(
+ "FormattedNumber as FormattedValue",
+ fv,
+ u"55.00K",
+ UFIELD_CATEGORY_NUMBER,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ // cleanup:
+ unumf_closeResult(uresult);
+ unumf_close(uformatter);
+}
+
+
+static void TestSkeletonParseError() {
+ UErrorCode ec = U_ZERO_ERROR;
+ UNumberFormatter* uformatter;
+ UParseError perror;
+
+ // The UParseError can be null. The following should not segfault.
+ uformatter = unumf_openForSkeletonAndLocaleWithError(
+ u".00 measure-unit/typo", -1, "en", NULL, &ec);
+ unumf_close(uformatter);
+
+ // Now test the behavior.
+ ec = U_ZERO_ERROR;
+ uformatter = unumf_openForSkeletonAndLocaleWithError(
+ u".00 measure-unit/typo", -1, "en", &perror, &ec);
+
+ assertIntEquals("Should have set error code", U_NUMBER_SKELETON_SYNTAX_ERROR, ec);
+ assertIntEquals("Should have correct skeleton error offset", 17, perror.offset);
+ assertUEquals("Should have correct pre context", u"0 measure-unit/", perror.preContext);
+ assertUEquals("Should have correct post context", u"typo", perror.postContext);
+
+ // cleanup:
+ unumf_close(uformatter);
+}
+
+
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/usrchtst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/usrchtst.c
index d9c306646d1..7a683a063d0 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/usrchtst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/usrchtst.c
@@ -362,7 +362,7 @@ static UBool assertEqualWithUStringSearch( UStringSearch *strsrch,
matchlength = search.size[count];
usearch_next(strsrch, &status);
if (matchindex != usearch_getMatchedStart(strsrch) ||
- matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
+ matchlength != usearch_getMatchedLength(strsrch)) {
char *str = toCharString(usearch_getText(strsrch, &textlength));
log_err("Text: %s\n", str);
str = toCharString(usearch_getPattern(strsrch, &textlength));
@@ -375,7 +375,7 @@ static UBool assertEqualWithUStringSearch( UStringSearch *strsrch,
count ++;
if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
- (int32_t) matchlength || U_FAILURE(status) ||
+ matchlength || U_FAILURE(status) ||
memcmp(matchtext,
usearch_getText(strsrch, &textlength) + matchindex,
matchlength * sizeof(UChar)) != 0) {
@@ -404,7 +404,7 @@ static UBool assertEqualWithUStringSearch( UStringSearch *strsrch,
matchlength = search.size[count];
usearch_previous(strsrch, &status);
if (matchindex != usearch_getMatchedStart(strsrch) ||
- matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
+ matchlength != usearch_getMatchedLength(strsrch)) {
char *str = toCharString(usearch_getText(strsrch, &textlength));
log_err("Text: %s\n", str);
str = toCharString(usearch_getPattern(strsrch, &textlength));
@@ -416,7 +416,7 @@ static UBool assertEqualWithUStringSearch( UStringSearch *strsrch,
}
if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
- (int32_t) matchlength || U_FAILURE(status) ||
+ matchlength || U_FAILURE(status) ||
memcmp(matchtext,
usearch_getText(strsrch, &textlength) + matchindex,
matchlength * sizeof(UChar)) != 0) {
@@ -1255,10 +1255,10 @@ static void TestGetSetOffset(void)
ucol_setStrength(usearch_getCollator(strsrch), search.strength);
usearch_reset(strsrch);
while (U_SUCCESS(status) && matchindex >= 0) {
- uint32_t matchlength = search.size[count];
+ int32_t matchlength = search.size[count];
usearch_next(strsrch, &status);
if (matchindex != usearch_getMatchedStart(strsrch) ||
- matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
+ matchlength != usearch_getMatchedLength(strsrch)) {
char *str = toCharString(usearch_getText(strsrch,
&textlength));
log_err("Text: %s\n", str);
@@ -1272,7 +1272,7 @@ static void TestGetSetOffset(void)
usearch_setOffset(strsrch, matchindex + matchlength, &status);
usearch_previous(strsrch, &status);
if (matchindex != usearch_getMatchedStart(strsrch) ||
- matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
+ matchlength != usearch_getMatchedLength(strsrch)) {
char *str = toCharString(usearch_getText(strsrch,
&textlength));
log_err("Text: %s\n", str);
@@ -1459,23 +1459,23 @@ static void TestGetMatch(void)
}
status = U_ZERO_ERROR;
if (usearch_getMatchedText(strsrch, NULL, 0, &status) !=
- (int32_t)matchlength || U_SUCCESS(status)){
+ matchlength || U_SUCCESS(status)){
log_err("Error pre-flighting match length\n");
}
status = U_ZERO_ERROR;
if (usearch_getMatchedText(strsrch, matchtext, 0, &status) !=
- (int32_t)matchlength || U_SUCCESS(status)){
+ matchlength || U_SUCCESS(status)){
log_err("Error getting match text with buffer size 0\n");
}
status = U_ZERO_ERROR;
if (usearch_getMatchedText(strsrch, matchtext, matchlength, &status)
- != (int32_t)matchlength || matchtext[matchlength - 1] == 0 ||
+ != matchlength || matchtext[matchlength - 1] == 0 ||
U_FAILURE(status)){
log_err("Error getting match text with exact size\n");
}
status = U_ZERO_ERROR;
if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
- (int32_t) matchlength || U_FAILURE(status) ||
+ matchlength || U_FAILURE(status) ||
memcmp(matchtext,
usearch_getText(strsrch, &textlength) + matchindex,
matchlength * sizeof(UChar)) != 0 ||
@@ -2313,10 +2313,10 @@ static void TestGetSetOffsetCanonical(void)
usearch_setText(strsrch, text, -1, &status);
usearch_setPattern(strsrch, pattern, -1, &status);
while (U_SUCCESS(status) && matchindex >= 0) {
- uint32_t matchlength = search.size[count];
+ int32_t matchlength = search.size[count];
usearch_next(strsrch, &status);
if (matchindex != usearch_getMatchedStart(strsrch) ||
- matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
+ matchlength != usearch_getMatchedLength(strsrch)) {
char *str = toCharString(usearch_getText(strsrch,
&textlength));
log_err("Text: %s\n", str);
@@ -2506,9 +2506,11 @@ exitTestForwardBackward :
}
}
-#define TEST_ASSERT(x) \
- {if (U_FAILURE(x)) {log_err_status(x, "%s:%d: FAIL: test assertion failure \n", __FILE__, __LINE__);\
- }}
+#define TEST_ASSERT(x) UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(x)) { \
+ log_err_status(x, "%s:%d: FAIL: test assertion failure \n", __FILE__, __LINE__); \
+ } \
+} UPRV_BLOCK_MACRO_END
static void TestSearchForNull(void) {
UCollator *coll;
@@ -2892,6 +2894,43 @@ exit:
return;
}
+static void TestUInt16Overflow(void) {
+ const int32_t uint16_overflow = UINT16_MAX + 1;
+ UChar* pattern = (UChar*)uprv_malloc(uint16_overflow * sizeof(UChar));
+ if (pattern == NULL)
+ {
+ log_err("Err: uprv_malloc returned NULL\n");
+ return;
+ }
+ u_memset(pattern, 'A', uint16_overflow);
+ UChar text[] = { 'B' };
+
+ UErrorCode errorCode = U_ZERO_ERROR;
+ UStringSearch* usearch = usearch_open(pattern, uint16_overflow, text, 1, "en-US", NULL, &errorCode);
+
+ if (U_SUCCESS(errorCode))
+ {
+ int32_t match = usearch_first(usearch, &errorCode);
+
+ if (U_SUCCESS(errorCode))
+ {
+ if (match != USEARCH_DONE)
+ {
+ log_err("Err: match was not expected, got %d\n", match);
+ }
+ }
+ else
+ {
+ log_err("usearch_first error %s\n", u_errorName(errorCode));
+ }
+ usearch_close(usearch);
+ }
+ else
+ {
+ log_err("usearch_open error %s\n", u_errorName(errorCode));
+ }
+ uprv_free(pattern);
+}
static void TestPCEBuffer_100df(void) {
UChar search[] =
@@ -3068,6 +3107,7 @@ void addSearchTest(TestNode** root)
addTest(root, &TestPCEBuffer_2surr, "tscoll/usrchtst/TestPCEBuffer/2_dfff");
addTest(root, &TestMatchFollowedByIgnorables, "tscoll/usrchtst/TestMatchFollowedByIgnorables");
addTest(root, &TestIndicPrefixMatch, "tscoll/usrchtst/TestIndicPrefixMatch");
+ addTest(root, &TestUInt16Overflow, "tscoll/usrchtst/TestUInt16Overflow");
}
#endif /* #if !UCONFIG_NO_COLLATION */
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/utexttst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/utexttst.c
index 5707cc1d44a..8c70f0e803d 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/utexttst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/utexttst.c
@@ -34,17 +34,21 @@ addUTextTest(TestNode** root)
}
-#define TEST_ASSERT(x) \
- {if ((x)==FALSE) {log_err("Test failure in file %s at line %d\n", __FILE__, __LINE__);\
- gFailed = TRUE;\
- }}
-
-
-#define TEST_SUCCESS(status) \
- {if (U_FAILURE(status)) {log_err("Test failure in file %s at line %d. Error = \"%s\"\n", \
- __FILE__, __LINE__, u_errorName(status)); \
- gFailed = TRUE;\
- }}
+#define TEST_ASSERT(x) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((x)==FALSE) { \
+ log_err("Test failure in file %s at line %d\n", __FILE__, __LINE__); \
+ gFailed = TRUE; \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+
+#define TEST_SUCCESS(status) UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(status)) { \
+ log_err("Test failure in file %s at line %d. Error = \"%s\"\n", \
+ __FILE__, __LINE__, u_errorName(status)); \
+ gFailed = TRUE; \
+ } \
+} UPRV_BLOCK_MACRO_END
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/utf8tst.c b/Build/source/libs/icu/icu-src/source/test/cintltst/utf8tst.c
index 9f4109c2078..4884be44c3a 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/utf8tst.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/utf8tst.c
@@ -35,7 +35,7 @@
* the macros below do not attempt to assemble such pairs.
*/
-#define L8_NEXT(s, i, length, c) { \
+#define L8_NEXT(s, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(uint8_t)(s)[(i)++]; \
if((c)>=0x80) { \
if(U8_IS_LEAD(c)) { \
@@ -44,9 +44,9 @@
(c)=U_SENTINEL; \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
-#define L8_PREV(s, start, i, c) { \
+#define L8_PREV(s, start, i, c) UPRV_BLOCK_MACRO_BEGIN { \
(c)=(uint8_t)(s)[--(i)]; \
if((c)>=0x80) { \
if((c)<=0xbf) { \
@@ -55,7 +55,7 @@
(c)=U_SENTINEL; \
} \
} \
-}
+} UPRV_BLOCK_MACRO_END
/* -------------------------------------------------------------------------- */
@@ -884,13 +884,13 @@ static void TestSetChar() {
}
#if !U_HIDE_OBSOLETE_UTF_OLD_H
setOffset=offset;
- UTF8_SET_CHAR_LIMIT_SAFE(input,0, setOffset, sizeof(input));
+ UTF8_SET_CHAR_LIMIT_SAFE(input,0, setOffset, (int32_t)sizeof(input));
if(setOffset != limit_safe[i]){
log_err("ERROR: UTF8_SET_CHAR_LIMIT_SAFE failed for offset=%ld. Expected:%ld Got:%ld\n", offset, limit_safe[i], setOffset);
}
#endif
setOffset=offset;
- U8_SET_CP_LIMIT(input,0, setOffset, sizeof(input));
+ U8_SET_CP_LIMIT(input,0, setOffset, (int32_t)sizeof(input));
if(setOffset != limit_safe[i]){
log_err("ERROR: U8_SET_CP_LIMIT failed for offset=%ld. Expected:%ld Got:%ld\n", offset, limit_safe[i], setOffset);
}
diff --git a/Build/source/libs/icu/icu-src/source/test/cintltst/utmstest.c b/Build/source/libs/icu/icu-src/source/test/cintltst/utmstest.c
index 122ba30034c..c25b79aad91 100644
--- a/Build/source/libs/icu/icu-src/source/test/cintltst/utmstest.c
+++ b/Build/source/libs/icu/icu-src/source/test/cintltst/utmstest.c
@@ -52,7 +52,7 @@ static uint64_t randomInt64(void)
}
/* Assume rand has at least 12 bits of precision */
- for (i = 0; i < sizeof(ran); i += 1) {
+ for (i = 0; i < (int32_t)sizeof(ran); i += 1) {
((char*)&ran)[i] = (char)((rand() & 0x0FF0) >> 4);
}
diff --git a/Build/source/libs/icu/icu-src/source/test/depstest/dependencies.py b/Build/source/libs/icu/icu-src/source/test/depstest/dependencies.py
index f4e7a7d4751..2ef225ce382 100644
--- a/Build/source/libs/icu/icu-src/source/test/depstest/dependencies.py
+++ b/Build/source/libs/icu/icu-src/source/test/depstest/dependencies.py
@@ -71,7 +71,7 @@ def _RemoveComment(line):
def _ReadLine(f):
while True:
- line = _RemoveComment(f.next())
+ line = _RemoveComment(next(f))
if line: return line
def _ReadFiles(deps_file, item, library_name):
@@ -147,7 +147,7 @@ def Load():
line = None
current_type = None
while True:
- while not line: line = _RemoveComment(deps_file.next())
+ while not line: line = _RemoveComment(next(deps_file))
if line.startswith("library: "):
current_type = "library"
diff --git a/Build/source/libs/icu/icu-src/source/test/depstest/dependencies.txt b/Build/source/libs/icu/icu-src/source/test/depstest/dependencies.txt
index 1d05d398437..1d726b6ea32 100644
--- a/Build/source/libs/icu/icu-src/source/test/depstest/dependencies.txt
+++ b/Build/source/libs/icu/icu-src/source/test/depstest/dependencies.txt
@@ -20,10 +20,11 @@ system_symbols:
c_strings c_string_formatting
int_functions floating_point trigonometry
stdlib_qsort
- pthread system_locale
+ system_locale
stdio_input stdio_output file_io readlink_function dir_io mmap_functions dlfcn
# C++
cplusplus iostream
+ std_mutex
group: PIC
# Position-Independent Code (-fPIC) requires a Global Offset Table.
@@ -38,6 +39,15 @@ group: system_debug
group: malloc_functions
free malloc realloc
+group: std_mutex
+ std::condition_variable::notify_one()
+ std::condition_variable::wait(std::unique_lock<std::mutex>&)
+ std::condition_variable::notify_all()
+ std::condition_variable::condition_variable()
+ std::condition_variable::~condition_variable()
+ std::condition_variable_any::condition_variable_any()
+ std::condition_variable_any::~condition_variable_any()
+
group: ubsan
# UBSan=UndefinedBehaviorSanitizer, clang -fsanitize=bounds
__ubsan_handle_out_of_bounds
@@ -47,7 +57,7 @@ group: c_strings
__ctype_b_loc # for <ctype.h>
# We must not use tolower and toupper because they are system-locale-sensitive (Turkish i).
strlen strchr strrchr strstr strcmp strncmp strcpy strncpy strcat strncat
- memcmp memcpy memmove memset
+ memchr memcmp memcpy memmove memset
# Additional symbols in an optimized build.
__strcpy_chk __strncpy_chk __strcat_chk __strncat_chk
__rawmemchr __memcpy_chk __memmove_chk __memset_chk
@@ -72,10 +82,6 @@ group: trigonometry
group: stdlib_qsort
qsort
-group: pthread
- pthread_mutex_init pthread_mutex_destroy pthread_mutex_lock pthread_mutex_unlock
- pthread_cond_wait pthread_cond_broadcast pthread_cond_signal
-
group: system_locale
getenv
nl_langinfo setlocale newlocale freelocale
@@ -84,7 +90,7 @@ group: system_locale
group: stdio_input
fopen fclose fgets fread fseek ftell rewind feof fileno
# Additional symbols in an optimized build.
- __fgets_chk __fread_chk
+ __fgets_chk __fread_chk fread_unlocked
group: stdio_output
fflush fwrite
@@ -178,6 +184,7 @@ library: common
uinit utypes errorcode
icuplug
platform
+ localebuilder localematcher
group: pluralmap
# TODO: Move to i18n library, ticket #11926.
@@ -624,7 +631,7 @@ group: resourcebundle
# We can probably only disentangle basic locale ID handling from resource bundle code
# by hardcoding all of the locale ID data.
locid.o locmap.o wintz.o
- # Do we need class LocaleBased? http://bugs.icu-project.org/trac/ticket/8608
+ # Do we need class LocaleBased? https://unicode-org.atlassian.net/browse/ICU-8608
locbased.o
loclikely.o
deps
@@ -632,13 +639,45 @@ group: resourcebundle
sort stringenumeration uhash uvector
uscript_props propname
bytesinkutil
+ errorcode
+
+group: localebuilder
+ localebuilder.o
+ deps
+ resourcebundle
+
+group: localematcher
+ localematcher.o
+ deps
+ localebuilder localeprioritylist loclikelysubtags locdistance lsr
+
+group: localeprioritylist
+ localeprioritylist.o
+ deps
+ resourcebundle
+
+group: locdistance
+ locdistance.o
+ deps
+ loclikelysubtags
+
+group: loclikelysubtags
+ loclikelysubtags.o
+ deps
+ lsr resourcebundle
+
+group: lsr
+ lsr.o
+ deps
+ platform
group: udata
- udata.o ucmndata.o udatamem.o
+ udata.o ucmndata.o udatamem.o restrace.o
umapfile.o
deps
uhash platform stubdata
file_io mmap_functions
+ icu_utility
group: unifiedcache
unifiedcache.o
@@ -815,10 +854,11 @@ group: platform
# The "platform" group has no ICU dependencies.
PIC system_misc system_debug malloc_functions ubsan
c_strings c_string_formatting
- floating_point pthread system_locale
+ floating_point system_locale
stdio_input readlink_function dir_io
dlfcn # Move related code into icuplug.c?
cplusplus
+ std_mutex
# ICU i18n library ----------------------------------------------------------- #
@@ -829,14 +869,14 @@ library: i18n
dayperiodrules
listformatter
formatting formattable_cnv regex regex_cnv translit
- double_conversion number_representation numberformatter numberparser
+ double_conversion number_representation number_output numberformatter numberparser
universal_time_scale
uclean_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
@@ -905,23 +945,39 @@ group: dayperiodrules
group: listformatter
listformatter.o ulistformatter.o
deps
- resourcebundle simpleformatter format uclean_i18n
+ resourcebundle simpleformatter format uclean_i18n formatted_value_iterimpl
group: double_conversion
- double-conversion.o double-conversion-bignum.o double-conversion-bignum-dtoa.o
- double-conversion-cached-powers.o double-conversion-diy-fp.o
- double-conversion-fast-dtoa.o double-conversion-strtod.o
+ double-conversion-bignum.o double-conversion-double-to-string.o
+ double-conversion-bignum-dtoa.o double-conversion-cached-powers.o
+ double-conversion-string-to-double.o double-conversion-fast-dtoa.o
+ double-conversion-strtod.o
deps
platform
group: number_representation
- number_decimalquantity.o number_stringbuilder.o numparse_stringsegment.o number_utils.o
+ number_decimalquantity.o string_segment.o number_utils.o
+ # TODO(ICU-20429) Move formatted_string_builder to its own unit.
+ formatted_string_builder.o
deps
decnumber double_conversion
+ # for trimming whitespace around fields
+ static_unicode_sets
# for data loading; that could be split off
resourcebundle
int_functions
ucase uniset_core
+ formatted_value
+
+group: number_output
+ # PluralRules and FormattedNumber
+ number_output.o
+ standardplural.o plurrule.o
+ deps
+ # FormattedNumber internals:
+ number_representation format formatted_value_sbimpl
+ # PluralRules internals:
+ unifiedcache
group: numberformatter
# ICU 60+ NumberFormatter API
@@ -936,11 +992,9 @@ group: numberformatter
number_scientific.o number_skeletons.o
currpinf.o dcfmtsym.o numsys.o
numrange_fluent.o numrange_impl.o
- # pluralrules
- standardplural.o plurrule.o
deps
- decnumber double_conversion formattable format units
- number_representation
+ decnumber double_conversion formattable units
+ number_representation number_output
uclean_i18n common
group: numberparser
@@ -983,7 +1037,7 @@ group: formatting
# messageformat
choicfmt.o msgfmt.o plurfmt.o selfmt.o umsg.o
deps
- decnumber formattable format units numberformatter numberparser
+ decnumber formattable format units numberformatter numberparser formatted_value_sbimpl
listformatter
dayperiodrules
collation collation_builder # for rbnf
@@ -992,6 +1046,7 @@ group: formatting
trigonometry # for astro.o
sharedbreakiterator # for reldatefmt.o
uclean_i18n
+ region
group: sharedbreakiterator
sharedbreakiterator.o
@@ -1019,6 +1074,21 @@ group: formattable_cnv
deps
formattable unistr_cnv conversion
+group: formatted_value
+ formattedvalue.o
+ deps
+ platform
+
+group: formatted_value_iterimpl
+ formattedval_iterimpl.o
+ deps
+ formatted_value format uvector32
+
+group: formatted_value_sbimpl
+ formattedval_sbimpl.o
+ deps
+ number_representation
+
group: format
format.o fphdlimp.o fpositer.o ufieldpositer.o
deps
diff --git a/Build/source/libs/icu/icu-src/source/test/depstest/depstest.py b/Build/source/libs/icu/icu-src/source/test/depstest/depstest.py
index 231c6819c6e..83dbfc063ca 100644
--- a/Build/source/libs/icu/icu-src/source/test/depstest/depstest.py
+++ b/Build/source/libs/icu/icu-src/source/test/depstest/depstest.py
@@ -16,10 +16,15 @@ This probably works only on Linux.
The exit code is 0 if everything is fine, 1 for errors, 2 for only warnings.
-Sample invocation:
- ~/svn.icu/trunk/src/source/test/depstest$ ./depstest.py ~/svn.icu/trunk/dbg
+Sample invocation with an in-source build:
+ ~/icu/icu4c/source/test/depstest$ ./depstest.py ../../
+
+Sample invocation with an out-of-source build:
+ ~/icu/icu4c/source/test/depstest$ ./depstest.py ~/build/
"""
+from __future__ import print_function
+
__author__ = "Markus W. Scherer"
import glob
@@ -40,12 +45,21 @@ _virtual_classes = set()
# nm shows a symbol class of "W" rather than "T".
_weak_destructors = set()
+def iteritems(items):
+ """Python 2/3-compatible iteritems"""
+ try:
+ for v in items.iteritems():
+ yield v
+ except AttributeError:
+ for v in items.items():
+ yield v
+
def _ReadObjFile(root_path, library_name, obj_name):
global _ignored_symbols, _obj_files, _symbols_to_files
global _virtual_classes, _weak_destructors
lib_obj_name = library_name + "/" + obj_name
if lib_obj_name in _obj_files:
- print "Warning: duplicate .o file " + lib_obj_name
+ print("Warning: duplicate .o file " + lib_obj_name)
_return_value = 2
return
@@ -56,7 +70,7 @@ def _ReadObjFile(root_path, library_name, obj_name):
obj_imports = set()
obj_exports = set()
for line in nm_result.splitlines():
- fields = line.split("|")
+ fields = line.decode().split("|")
if len(fields) == 1: continue
name = fields[0].strip()
# Ignore symbols like '__cxa_pure_virtual',
@@ -87,6 +101,19 @@ def _ReadLibrary(root_path, library_name):
for path in obj_paths:
_ReadObjFile(root_path, library_name, os.path.basename(path))
+# Dependencies that would otherwise be errors, but that are to be allowed
+# in a limited (not transitive) context. List of (file_name, symbol)
+# TODO: Move this data to dependencies.txt?
+allowed_errors = (
+ ("common/umutex.o", "std::__throw_system_error(int)"),
+ ("common/umutex.o", "std::uncaught_exception()"),
+ ("common/umutex.o", "std::__once_callable"),
+ ("common/umutex.o", "std::__once_call"),
+ ("common/umutex.o", "__once_proxy"),
+ ("common/umutex.o", "__tls_get_addr"),
+ ("common/unifiedcache.o", "std::__throw_system_error(int)"),
+)
+
def _Resolve(name, parents):
global _ignored_symbols, _obj_files, _symbols_to_files, _return_value
item = dependencies.items[name]
@@ -120,7 +147,7 @@ def _Resolve(name, parents):
dep_exports = dep_item["exports"]
dep_system_symbols = dep_item["system_symbols"]
if files and imports.isdisjoint(dep_exports) and imports.isdisjoint(dep_system_symbols):
- print "Info: %s %s does not need to depend on %s\n" % (item_type, name, dep)
+ print("Info: %s %s does not need to depend on %s\n" % (item_type, name, dep))
# We always include the dependency's exports, even if we do not need them
# to satisfy local imports.
exports |= dep_exports
@@ -130,6 +157,9 @@ def _Resolve(name, parents):
imports -= exports | system_symbols
for symbol in imports:
for file_name in files:
+ if (file_name, symbol) in allowed_errors:
+ sys.stderr.write("Info: ignoring %s imports %s\n\n" % (file_name, symbol))
+ continue
if symbol in _obj_files[file_name]["imports"]:
neededFile = _symbols_to_files.get(symbol)
if neededFile in dependencies.file_to_item:
@@ -138,7 +168,7 @@ def _Resolve(name, parents):
neededItem = "- is this a new system symbol?"
sys.stderr.write("Error: in %s %s: %s imports %s %s\n" %
(item_type, name, file_name, symbol, neededItem))
- _return_value = 1
+ _return_value = 1
del parents[-1]
return item
@@ -150,7 +180,7 @@ def Process(root_path):
global _ignored_symbols, _obj_files, _return_value
global _virtual_classes, _weak_destructors
dependencies.Load()
- for name_and_item in dependencies.items.iteritems():
+ for name_and_item in iteritems(dependencies.items):
name = name_and_item[0]
item = name_and_item[1]
system_symbols = item.get("system_symbols")
@@ -189,11 +219,11 @@ def main():
"need one argument with the root path to the built ICU libraries/*.o files."))
Process(sys.argv[1])
if _ignored_symbols:
- print "Info: ignored symbols:\n%s" % sorted(_ignored_symbols)
+ print("Info: ignored symbols:\n%s" % sorted(_ignored_symbols))
if not _return_value:
- print "OK: Specified and actual dependencies match."
+ print("OK: Specified and actual dependencies match.")
else:
- print "Error: There were errors, please fix them and re-run. Processing may have terminated abnormally."
+ print("Error: There were errors, please fix them and re-run. Processing may have terminated abnormally.")
return _return_value
if __name__ == "__main__":
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/Makefile.in b/Build/source/libs/icu/icu-src/source/test/fuzzer/Makefile.in
new file mode 100644
index 00000000000..37c609dfc89
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/Makefile.in
@@ -0,0 +1,99 @@
+# © 2019 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+#******************************************************************************
+## Makefile.in for ICU - test/fuzzer
+
+## Source directory information
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+top_builddir = ../..
+
+## All the flags and other definitions are included here.
+include $(top_builddir)/icudefs.mk
+
+## Build directory information
+subdir = test/fuzzer
+
+## Extra files to remove for 'make clean'
+CLEANFILES = *~ $(DEPS) $(TESTXML)
+
+## Target information
+TARGET = all_fuzzers
+
+BUILDDIR := $(CURR_SRCCODE_FULL_DIR)/../../
+# Simplify the path for Unix
+BUILDDIR := $(BUILDDIR:test/fuzzer/../../=)
+# Simplify the path for Windows
+BUILDDIR := $(BUILDDIR:test\\fuzzer/../../=)
+# Simplify the path for Windows 98
+BUILDDIR := $(BUILDDIR:TEST\\FUZZER/../../=)
+
+CPPFLAGS += -I$(srcdir) -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(top_srcdir)/tools/ctestfw -I$(top_srcdir)/io
+DEFS += -D'U_TOPSRCDIR="$(top_srcdir)/"' -D'U_TOPBUILDDIR="$(BUILDDIR)"'
+LIBS = $(LIBCTESTFW) $(LIBICUTOOLUTIL) $(LIBICUIO) $(LIBICUI18N) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M)
+
+FUZZER_TARGETS = break_iterator_fuzzer collator_compare_fuzzer collator_rulebased_fuzzer converter_fuzzer locale_fuzzer number_format_fuzzer ucasemap_fuzzer uloc_canonicalize_fuzzer uloc_for_language_tag_fuzzer uloc_get_name_fuzzer uloc_is_right_to_left_fuzzer uloc_open_keywords_fuzzer unicode_string_codepage_create_fuzzer uregex_open_fuzzer
+
+OBJECTS = $(FUZZER_TARGETS:%=%.o)
+OBJECTS += fuzzer_driver.o locale_util.o
+
+DEPS = $(OBJECTS:.o=.d)
+
+-include Makefile.local
+
+## List of phony targets
+.PHONY : all all-local install install-local clean clean-local \
+distclean distclean-local dist dist-local check check-local xcheck \
+check-exhaustive check-exhaustive-local all_fuzzers
+
+## Clear suffix list
+.SUFFIXES :
+
+## List of standard targets
+all: all-local
+install: install-local
+clean: clean-local
+distclean : distclean-local
+dist: dist-local
+check: all check-local
+xcheck: all xcheck-local
+
+all-local: $(TARGET)
+
+install-local:
+
+dist-local:
+
+clean-local:
+ test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)
+ $(RMV) $(OBJECTS) $(TARGET) $(FUZZER_TARGETS)
+
+distclean-local: clean-local
+ $(RMV) Makefile
+
+check-local: all-local
+ $(foreach trgt,$(FUZZER_TARGETS), echo $(trgt); $(INVOKE) ./$(trgt) \
+ $(TEST_OUTPUT_OPTS) || exit \
+ $(IOTEST_OPTS);)
+
+xcheck-local: check-local
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+all_fuzzers: $(FUZZER_TARGETS)
+
+%_fuzzer: %_fuzzer.o fuzzer_driver.o locale_util.o
+ $(LINK.cc) $(OUTOPT)$@ $^ $(LIBS)
+
+ifeq (,$(MAKECMDGOALS))
+-include $(DEPS)
+else
+ifneq ($(patsubst %clean,,$(MAKECMDGOALS)),)
+ifneq ($(patsubst %install,,$(MAKECMDGOALS)),)
+-include $(DEPS)
+endif
+endif
+endif
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/break_iterator_fuzzer.cpp b/Build/source/libs/icu/icu-src/source/test/fuzzer/break_iterator_fuzzer.cpp
new file mode 100644
index 00000000000..a2c9a3e9b5b
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/break_iterator_fuzzer.cpp
@@ -0,0 +1,71 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include <cstring>
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+#include <memory>
+#include <utility>
+#include "fuzzer_utils.h"
+#include "unicode/brkiter.h"
+#include "unicode/utext.h"
+
+IcuEnvironment* env = new IcuEnvironment();
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ UErrorCode status = U_ZERO_ERROR;
+ uint8_t rnd8 = 0;
+ uint16_t rnd16 = 0;
+
+ if (size < 3) {
+ return 0;
+ }
+ // Extract one and two bytes from fuzzer data for random selection purpose.
+ rnd8 = *data;
+ data++;
+ rnd16 = *(reinterpret_cast<const uint16_t *>(data));
+ data = data + 2;
+ size = size - 3;
+
+ size_t unistr_size = size/2;
+ std::unique_ptr<char16_t[]> fuzzbuff(new char16_t[unistr_size]);
+ std::memcpy(fuzzbuff.get(), data, unistr_size * 2);
+
+ UText* fuzzstr = utext_openUChars(nullptr, fuzzbuff.get(), unistr_size, &status);
+
+ const icu::Locale& locale = GetRandomLocale(rnd16);
+
+ std::unique_ptr<icu::BreakIterator> bi;
+
+ switch (rnd8 % 5) {
+ case 0:
+ bi.reset(icu::BreakIterator::createWordInstance(locale, status));
+ break;
+ case 1:
+ bi.reset(icu::BreakIterator::createLineInstance(locale, status));
+ break;
+ case 2:
+ bi.reset(icu::BreakIterator::createCharacterInstance(locale, status));
+ break;
+ case 3:
+ bi.reset(icu::BreakIterator::createSentenceInstance(locale, status));
+ break;
+ case 4:
+ bi.reset(icu::BreakIterator::createTitleInstance(locale, status));
+ break;
+ }
+
+ bi->setText(fuzzstr, status);
+
+ if (U_FAILURE(status)) {
+ utext_close(fuzzstr);
+ return 0;
+ }
+
+ for (int32_t p = bi->first(); p != icu::BreakIterator::DONE; p = bi->next()) {}
+
+ utext_close(fuzzstr);
+ return 0;
+}
+
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/collator_compare_fuzzer.cpp b/Build/source/libs/icu/icu-src/source/test/fuzzer/collator_compare_fuzzer.cpp
new file mode 100644
index 00000000000..87b2ea98c2c
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/collator_compare_fuzzer.cpp
@@ -0,0 +1,35 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include <cstring>
+
+#include "fuzzer_utils.h"
+#include "unicode/coll.h"
+#include "unicode/localpointer.h"
+#include "unicode/locid.h"
+
+IcuEnvironment* env = new IcuEnvironment();
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ UErrorCode status = U_ZERO_ERROR;
+
+ if (size < 2)
+ return 0;
+
+ std::unique_ptr<char16_t> compbuff1(new char16_t[size/4]);
+ std::memcpy(compbuff1.get(), data, (size/4)*2);
+ data = data + size/2;
+ std::unique_ptr<char16_t> compbuff2(new char16_t[size/4]);
+ std::memcpy(compbuff2.get(), data, (size/4)*2);
+
+ icu::LocalPointer<icu::Collator> fuzzCollator(
+ icu::Collator::createInstance(icu::Locale::getUS(), status), status);
+ if (U_FAILURE(status))
+ return 0;
+ fuzzCollator->setStrength(icu::Collator::TERTIARY);
+
+ fuzzCollator->compare(compbuff1.get(), size/4,
+ compbuff2.get(), size/4);
+
+ return 0;
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/collator_rulebased_fuzzer.cpp b/Build/source/libs/icu/icu-src/source/test/fuzzer/collator_rulebased_fuzzer.cpp
new file mode 100644
index 00000000000..98785000acb
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/collator_rulebased_fuzzer.cpp
@@ -0,0 +1,26 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include <cstring>
+
+#include "fuzzer_utils.h"
+#include "unicode/coll.h"
+#include "unicode/localpointer.h"
+#include "unicode/locid.h"
+#include "unicode/tblcoll.h"
+
+IcuEnvironment* env = new IcuEnvironment();
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ UErrorCode status = U_ZERO_ERROR;
+
+ size_t unistr_size = size/2;
+ std::unique_ptr<char16_t[]> fuzzbuff(new char16_t[unistr_size]);
+ std::memcpy(fuzzbuff.get(), data, unistr_size * 2);
+ icu::UnicodeString fuzzstr(false, fuzzbuff.get(), unistr_size);
+
+ icu::LocalPointer<icu::RuleBasedCollator> col1(
+ new icu::RuleBasedCollator(fuzzstr, status));
+
+ return 0;
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/collator_rulebased_fuzzer_seed_corpus.txt b/Build/source/libs/icu/icu-src/source/test/fuzzer/collator_rulebased_fuzzer_seed_corpus.txt
new file mode 100644
index 00000000000..241b803795a
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/collator_rulebased_fuzzer_seed_corpus.txt
Binary files differ
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/converter_fuzzer.cpp b/Build/source/libs/icu/icu-src/source/test/fuzzer/converter_fuzzer.cpp
new file mode 100644
index 00000000000..7d5c13d9222
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/converter_fuzzer.cpp
@@ -0,0 +1,55 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <algorithm>
+#include <array>
+#include <cstring>
+#include <functional>
+#include <memory>
+#include <vector>
+
+#include "fuzzer_utils.h"
+#include "unicode/unistr.h"
+#include "unicode/ucnv.h"
+
+IcuEnvironment* env = new IcuEnvironment();
+
+template <typename T>
+using deleted_unique_ptr = std::unique_ptr<T, std::function<void(T*)>>;
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ UErrorCode status = U_ZERO_ERROR;
+ uint16_t rnd = 0;
+
+ if (size < 2) {
+ return 0;
+ }
+
+ rnd = *(reinterpret_cast<const uint16_t *>(data));
+ data = data + 2;
+ size = size - 2;
+
+ size_t unistr_size = size/2;
+ std::unique_ptr<char16_t[]> fuzzbuff(new char16_t[unistr_size]);
+ std::memcpy(fuzzbuff.get(), data, unistr_size * 2);
+
+ icu::UnicodeString fuzzstr(false, fuzzbuff.get(), unistr_size);
+
+ const char* converter_name =
+ ucnv_getAvailableName(rnd % ucnv_countAvailable());
+ deleted_unique_ptr<UConverter> converter(ucnv_open(converter_name, &status),
+ &ucnv_close);
+ if (U_FAILURE(status)) {
+ return 0;
+ }
+
+ static const size_t dest_buffer_size = 1024 * 1204;
+ static const std::unique_ptr<char[]> dest_buffer(new char[dest_buffer_size]);
+
+ fuzzstr.extract(dest_buffer.get(), dest_buffer_size, converter.get(), status);
+
+ return 0;
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/fuzzer_driver.cpp b/Build/source/libs/icu/icu-src/source/test/fuzzer/fuzzer_driver.cpp
new file mode 100644
index 00000000000..820ed85a52c
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/fuzzer_driver.cpp
@@ -0,0 +1,20 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include "cmemory.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);
+
+int main(int argc, char* argv[])
+{
+ (void) argc;
+ (void) argv;
+ const char *fuzzer_data = "abc123";
+
+ LLVMFuzzerTestOneInput((const uint8_t *) fuzzer_data, strlen(fuzzer_data));
+
+ return 0;
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/fuzzer_utils.h b/Build/source/libs/icu/icu-src/source/test/fuzzer/fuzzer_utils.h
new file mode 100644
index 00000000000..8a4ed4714b4
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/fuzzer_utils.h
@@ -0,0 +1,24 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#ifndef FUZZER_UTILS_H_
+#define FUZZER_UTILS_H_
+
+#include <assert.h>
+
+#include "unicode/locid.h"
+
+struct IcuEnvironment {
+ IcuEnvironment() {
+ // nothing to initialize yet;
+ }
+};
+
+const icu::Locale& GetRandomLocale(uint16_t rnd) {
+ int32_t num_locales = 0;
+ const icu::Locale* locales = icu::Locale::getAvailableLocales(num_locales);
+ assert(num_locales > 0);
+ return locales[rnd % num_locales];
+}
+
+#endif // FUZZER_UTILS_H_
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/locale_fuzzer.cpp b/Build/source/libs/icu/icu-src/source/test/fuzzer/locale_fuzzer.cpp
new file mode 100644
index 00000000000..4d6355531bd
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/locale_fuzzer.cpp
@@ -0,0 +1,49 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+// Fuzzer for ICU Locales.
+
+#include <algorithm>
+#include <cstddef>
+#include <cstdint>
+#include <cstdlib>
+#include <string>
+#include <vector>
+
+#include "unicode/locid.h"
+
+namespace {
+
+void ConsumeNBytes(const uint8_t** data, size_t* size, size_t N) {
+ *data += N;
+ *size -= N;
+}
+
+uint8_t ConsumeUint8(const uint8_t** data, size_t* size) {
+ uint8_t tmp = 0;
+ if (*size >= 1) {
+ tmp = (*data)[0];
+ ConsumeNBytes(data, size, 1);
+ }
+ return tmp;
+}
+
+std::string ConsumeSubstring(const uint8_t** data, size_t* size) {
+ const size_t request_size = ConsumeUint8(data, size);
+ const char* substring_start = reinterpret_cast<const char*>(*data);
+ const size_t substring_size = std::min(*size, request_size);
+ ConsumeNBytes(data, size, substring_size);
+ return std::string(substring_start, substring_size);
+}
+
+} // namespace
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ const std::string language = ConsumeSubstring(&data, &size);
+ const std::string country = ConsumeSubstring(&data, &size);
+ const std::string variant = ConsumeSubstring(&data, &size);
+ const std::string kv_pairs = ConsumeSubstring(&data, &size);
+ icu::Locale locale(language.c_str(), country.c_str(), variant.c_str(),
+ kv_pairs.c_str());
+ return EXIT_SUCCESS;
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/locale_util.cpp b/Build/source/libs/icu/icu-src/source/test/fuzzer/locale_util.cpp
new file mode 100644
index 00000000000..d39aeeece57
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/locale_util.cpp
@@ -0,0 +1,12 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+// Helper method for ICU locale fuzzer.
+
+#include "locale_util.h"
+
+#include <string>
+
+std::string MakeZeroTerminatedInput(const uint8_t *data, int32_t size) {
+ return size == 0 ? "" : std::string(reinterpret_cast<const char *>(data), size);
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/locale_util.h b/Build/source/libs/icu/icu-src/source/test/fuzzer/locale_util.h
new file mode 100644
index 00000000000..09848ff4a37
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/locale_util.h
@@ -0,0 +1,12 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#ifndef I18N_ICU_FUZZ_LOCALE_UTIL_H_
+#define I18N_ICU_FUZZ_LOCALE_UTIL_H_
+
+#include <string>
+
+// Takes uint8_t data from fuzzer, and makes a zero terminated string.
+std::string MakeZeroTerminatedInput(const uint8_t* data, int32_t size);
+
+#endif // I18N_ICU_FUZZ_LOCALE_UTIL_H_
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/number_format_fuzzer.cpp b/Build/source/libs/icu/icu-src/source/test/fuzzer/number_format_fuzzer.cpp
new file mode 100644
index 00000000000..4be2f97a756
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/number_format_fuzzer.cpp
@@ -0,0 +1,45 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+// Fuzzer for NumberFormat::parse.
+
+#include <cstring>
+#include <stddef.h>
+#include <stdint.h>
+#include <string>
+#include <memory>
+#include "fuzzer_utils.h"
+#include "unicode/numfmt.h"
+
+IcuEnvironment* env = new IcuEnvironment();
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ UErrorCode status = U_ZERO_ERROR;
+ uint16_t rnd = 0;
+
+ if (size < 2) {
+ return 0;
+ }
+
+ rnd = *(reinterpret_cast<const uint16_t *>(data));
+ data = data + 2;
+ size = size - 2;
+
+ size_t unistr_size = size/2;
+ std::unique_ptr<char16_t[]> fuzzbuff(new char16_t[unistr_size]);
+ std::memcpy(fuzzbuff.get(), data, unistr_size * 2);
+
+ const icu::Locale& locale = GetRandomLocale(rnd);
+
+ std::unique_ptr<icu::NumberFormat> fmt(
+ icu::NumberFormat::createInstance(locale, status));
+ if (U_FAILURE(status)) {
+ return 0;
+ }
+
+ icu::UnicodeString fuzzstr(false, fuzzbuff.get(), unistr_size);
+ icu::Formattable result;
+ fmt->parse(fuzzstr, result, status);
+
+ return 0;
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/ucasemap_fuzzer.cpp b/Build/source/libs/icu/icu-src/source/test/fuzzer/ucasemap_fuzzer.cpp
new file mode 100644
index 00000000000..ddb03862efb
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/ucasemap_fuzzer.cpp
@@ -0,0 +1,72 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+// Fuzzer for ucasemap.
+
+#include <cstring>
+#include <functional>
+#include <memory>
+#include <stddef.h>
+#include <stdint.h>
+#include "fuzzer_utils.h"
+#include "unicode/ucasemap.h"
+
+IcuEnvironment* env = new IcuEnvironment();
+
+template<typename T>
+using deleted_unique_ptr = std::unique_ptr<T,std::function<void(T*)>>;
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ UErrorCode status = U_ZERO_ERROR;
+ uint8_t rnd8 = 0;
+ uint16_t rnd16 = 0;
+ uint32_t rnd32 = 0;
+
+ if (size < 7) {
+ return 0;
+ }
+ // Extract one, two, and four bytes from fuzzer data for random selection
+ // purposes.
+ rnd8 = *data;
+ data++;
+ rnd16 = *(reinterpret_cast<const uint16_t *>(data));
+ data = data + 2;
+ rnd32 = *(reinterpret_cast<const uint32_t *>(data));
+ data = data + 4;
+ size = size - 7;
+
+ std::unique_ptr<char[]> fuzzbuff(new char[size]);
+ std::memcpy(fuzzbuff.get(), data, size);
+
+ const icu::Locale& locale = GetRandomLocale(rnd16);
+ uint32_t open_flags = rnd32;
+
+ deleted_unique_ptr<UCaseMap> csm(
+ ucasemap_open(locale.getName(), open_flags, &status),
+ [](UCaseMap* map) { ucasemap_close(map); });
+
+ if (U_FAILURE(status)) {
+ return 0;
+ }
+
+ int32_t dst_size = size * 2;
+ std::unique_ptr<char[]> dst(new char[dst_size]);
+ auto src = reinterpret_cast<const char*>(fuzzbuff.get());
+
+ switch (rnd8 % 4) {
+ case 0: ucasemap_utf8ToLower(csm.get(), dst.get(), dst_size, src, size,
+ &status);
+ break;
+ case 1: ucasemap_utf8ToUpper(csm.get(), dst.get(), dst_size, src, size,
+ &status);
+ break;
+ case 2: ucasemap_utf8ToTitle(csm.get(), dst.get(), dst_size, src, size,
+ &status);
+ break;
+ case 3: ucasemap_utf8FoldCase(csm.get(), dst.get(), dst_size, src, size,
+ &status);
+ break;
+ }
+
+ return 0;
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_canonicalize_fuzzer.cpp b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_canonicalize_fuzzer.cpp
new file mode 100644
index 00000000000..51be32d8e99
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_canonicalize_fuzzer.cpp
@@ -0,0 +1,20 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include <string>
+
+#include "locale_util.h"
+#include "unicode/uloc.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ // Canonicalized locale name.
+ char name[ULOC_FULLNAME_CAPACITY];
+ int32_t name_capacity = ULOC_FULLNAME_CAPACITY;
+
+ const std::string input = MakeZeroTerminatedInput(data, size);
+
+ UErrorCode status = U_ZERO_ERROR;
+ uloc_canonicalize(input.c_str(), name, name_capacity, &status);
+
+ return 0;
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_canonicalize_fuzzer_seed_corpus.txt b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_canonicalize_fuzzer_seed_corpus.txt
new file mode 100644
index 00000000000..0a8f47f893b
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_canonicalize_fuzzer_seed_corpus.txt
@@ -0,0 +1,30 @@
+sr-Cyrl-RS
+zz-UND
+de_DE
+De_dE
+en-US-u-islamcal
+zh-CN-a-myext-x-private
+en-a-myext-b-another
+de-419-DE
+a-DE
+ar-a-aaa-b-bbb-a-ccc
+sl-rozaj
+sl-rozaj-biske
+de-CH-1901
+sl-IT-nedis
+hy-Latn-IT-arevela
+az-Arab-x-AZE-derbend
+Completely bad text for locale, even includes spaces and interpunction.!?
+fr-u-nu-arabext
+de-u-nu-beng-nu-bali-nu-khmr
+fil-u-ca-buddhist
+zh-Hant-CN-u-nu-arabext-ca-islamicc
+ja-u-ca-japanese
+hr-HR-u-ca-roc
+1234
+AAAAaaaaaaaVVVV_-=+
+ja%-x-%e3
+yq-U-98x-M85E-9pE-85Y-8xU985YE-89xxUy-xEyq-U85Y-8xE8-q5Y-8xU-9xE
+UN-u-jTKMwi-a0q-aeae-KaG-aab-2aG2-36C-2uzeal-STqROK-U36-366-U86-83S-c3SZEC-SCG-1366-SG66-KMi-a0ae-qae-KaG-aab-1a3
+sr-sr-u-z2r-4su-nms-5rsu-mns-6um-s5su-msu-ins1-7rzx-ianu-ssd-ss5r-d0r-U22su-n5sx-lvar-5su-ssu-nax-lvarUd-uimxE-112
+HR-u-roc85Y-4xU-d0r-U22x-lvariant-ims-0d0U22-js17zr-rsm-u56su-csu-ins1-ins17Rz-zax-ianu-ssd-d0U22-js1-7rzrsm-u56su-csu-ins1-ins17Rz-z
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_for_language_tag_fuzzer.cpp b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_for_language_tag_fuzzer.cpp
new file mode 100644
index 00000000000..65520443007
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_for_language_tag_fuzzer.cpp
@@ -0,0 +1,21 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include <string>
+
+#include "locale_util.h"
+#include "unicode/uloc.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ // Full locale id.
+ char locale_id[ULOC_FULLNAME_CAPACITY];
+ int32_t locale_id_capacity = ULOC_FULLNAME_CAPACITY;
+
+ const std::string input = MakeZeroTerminatedInput(data, size);
+
+ UErrorCode status = U_ZERO_ERROR;
+ uloc_forLanguageTag(input.c_str(), locale_id, locale_id_capacity, nullptr,
+ &status);
+
+ return 0;
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_for_language_tag_fuzzer_seed_corpus.txt b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_for_language_tag_fuzzer_seed_corpus.txt
new file mode 100644
index 00000000000..0a8f47f893b
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_for_language_tag_fuzzer_seed_corpus.txt
@@ -0,0 +1,30 @@
+sr-Cyrl-RS
+zz-UND
+de_DE
+De_dE
+en-US-u-islamcal
+zh-CN-a-myext-x-private
+en-a-myext-b-another
+de-419-DE
+a-DE
+ar-a-aaa-b-bbb-a-ccc
+sl-rozaj
+sl-rozaj-biske
+de-CH-1901
+sl-IT-nedis
+hy-Latn-IT-arevela
+az-Arab-x-AZE-derbend
+Completely bad text for locale, even includes spaces and interpunction.!?
+fr-u-nu-arabext
+de-u-nu-beng-nu-bali-nu-khmr
+fil-u-ca-buddhist
+zh-Hant-CN-u-nu-arabext-ca-islamicc
+ja-u-ca-japanese
+hr-HR-u-ca-roc
+1234
+AAAAaaaaaaaVVVV_-=+
+ja%-x-%e3
+yq-U-98x-M85E-9pE-85Y-8xU985YE-89xxUy-xEyq-U85Y-8xE8-q5Y-8xU-9xE
+UN-u-jTKMwi-a0q-aeae-KaG-aab-2aG2-36C-2uzeal-STqROK-U36-366-U86-83S-c3SZEC-SCG-1366-SG66-KMi-a0ae-qae-KaG-aab-1a3
+sr-sr-u-z2r-4su-nms-5rsu-mns-6um-s5su-msu-ins1-7rzx-ianu-ssd-ss5r-d0r-U22su-n5sx-lvar-5su-ssu-nax-lvarUd-uimxE-112
+HR-u-roc85Y-4xU-d0r-U22x-lvariant-ims-0d0U22-js17zr-rsm-u56su-csu-ins1-ins17Rz-zax-ianu-ssd-d0U22-js1-7rzrsm-u56su-csu-ins1-ins17Rz-z
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_get_name_fuzzer.cpp b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_get_name_fuzzer.cpp
new file mode 100644
index 00000000000..5a0dca92f53
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_get_name_fuzzer.cpp
@@ -0,0 +1,20 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include <string>
+
+#include "locale_util.h"
+#include "unicode/uloc.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ // Full locale name.
+ char name[ULOC_FULLNAME_CAPACITY];
+ int32_t name_capacity = ULOC_FULLNAME_CAPACITY;
+
+ const std::string input = MakeZeroTerminatedInput(data, size);
+
+ UErrorCode status = U_ZERO_ERROR;
+ uloc_getName(input.c_str(), name, name_capacity, &status);
+
+ return 0;
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_get_name_fuzzer_seed_corpus.txt b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_get_name_fuzzer_seed_corpus.txt
new file mode 100644
index 00000000000..0a8f47f893b
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_get_name_fuzzer_seed_corpus.txt
@@ -0,0 +1,30 @@
+sr-Cyrl-RS
+zz-UND
+de_DE
+De_dE
+en-US-u-islamcal
+zh-CN-a-myext-x-private
+en-a-myext-b-another
+de-419-DE
+a-DE
+ar-a-aaa-b-bbb-a-ccc
+sl-rozaj
+sl-rozaj-biske
+de-CH-1901
+sl-IT-nedis
+hy-Latn-IT-arevela
+az-Arab-x-AZE-derbend
+Completely bad text for locale, even includes spaces and interpunction.!?
+fr-u-nu-arabext
+de-u-nu-beng-nu-bali-nu-khmr
+fil-u-ca-buddhist
+zh-Hant-CN-u-nu-arabext-ca-islamicc
+ja-u-ca-japanese
+hr-HR-u-ca-roc
+1234
+AAAAaaaaaaaVVVV_-=+
+ja%-x-%e3
+yq-U-98x-M85E-9pE-85Y-8xU985YE-89xxUy-xEyq-U85Y-8xE8-q5Y-8xU-9xE
+UN-u-jTKMwi-a0q-aeae-KaG-aab-2aG2-36C-2uzeal-STqROK-U36-366-U86-83S-c3SZEC-SCG-1366-SG66-KMi-a0ae-qae-KaG-aab-1a3
+sr-sr-u-z2r-4su-nms-5rsu-mns-6um-s5su-msu-ins1-7rzx-ianu-ssd-ss5r-d0r-U22su-n5sx-lvar-5su-ssu-nax-lvarUd-uimxE-112
+HR-u-roc85Y-4xU-d0r-U22x-lvariant-ims-0d0U22-js17zr-rsm-u56su-csu-ins1-ins17Rz-zax-ianu-ssd-d0U22-js1-7rzrsm-u56su-csu-ins1-ins17Rz-z
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_is_right_to_left_fuzzer.cpp b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_is_right_to_left_fuzzer.cpp
new file mode 100644
index 00000000000..fe43089e6ca
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_is_right_to_left_fuzzer.cpp
@@ -0,0 +1,15 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include <string>
+
+#include "locale_util.h"
+#include "unicode/uloc.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ const std::string input = MakeZeroTerminatedInput(data, size);
+
+ uloc_isRightToLeft(input.c_str());
+
+ return 0;
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_is_right_to_left_fuzzer_seed_corpus.txt b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_is_right_to_left_fuzzer_seed_corpus.txt
new file mode 100644
index 00000000000..0a8f47f893b
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_is_right_to_left_fuzzer_seed_corpus.txt
@@ -0,0 +1,30 @@
+sr-Cyrl-RS
+zz-UND
+de_DE
+De_dE
+en-US-u-islamcal
+zh-CN-a-myext-x-private
+en-a-myext-b-another
+de-419-DE
+a-DE
+ar-a-aaa-b-bbb-a-ccc
+sl-rozaj
+sl-rozaj-biske
+de-CH-1901
+sl-IT-nedis
+hy-Latn-IT-arevela
+az-Arab-x-AZE-derbend
+Completely bad text for locale, even includes spaces and interpunction.!?
+fr-u-nu-arabext
+de-u-nu-beng-nu-bali-nu-khmr
+fil-u-ca-buddhist
+zh-Hant-CN-u-nu-arabext-ca-islamicc
+ja-u-ca-japanese
+hr-HR-u-ca-roc
+1234
+AAAAaaaaaaaVVVV_-=+
+ja%-x-%e3
+yq-U-98x-M85E-9pE-85Y-8xU985YE-89xxUy-xEyq-U85Y-8xE8-q5Y-8xU-9xE
+UN-u-jTKMwi-a0q-aeae-KaG-aab-2aG2-36C-2uzeal-STqROK-U36-366-U86-83S-c3SZEC-SCG-1366-SG66-KMi-a0ae-qae-KaG-aab-1a3
+sr-sr-u-z2r-4su-nms-5rsu-mns-6um-s5su-msu-ins1-7rzx-ianu-ssd-ss5r-d0r-U22su-n5sx-lvar-5su-ssu-nax-lvarUd-uimxE-112
+HR-u-roc85Y-4xU-d0r-U22x-lvariant-ims-0d0U22-js17zr-rsm-u56su-csu-ins1-ins17Rz-zax-ianu-ssd-d0U22-js1-7rzrsm-u56su-csu-ins1-ins17Rz-z
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_open_keywords_fuzzer.cpp b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_open_keywords_fuzzer.cpp
new file mode 100644
index 00000000000..db9d96703fc
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_open_keywords_fuzzer.cpp
@@ -0,0 +1,20 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include <string>
+
+#include "locale_util.h"
+#include "unicode/uenum.h"
+#include "unicode/uloc.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ const std::string input = MakeZeroTerminatedInput(data, size);
+
+ UErrorCode status = U_ZERO_ERROR;
+ UEnumeration* enumeration = uloc_openKeywords(input.c_str(), &status);
+
+ // Have to clean up. Call works even for nullptr enumeration.
+ uenum_close(enumeration);
+
+ return 0;
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_open_keywords_fuzzer_seed_corpus.txt b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_open_keywords_fuzzer_seed_corpus.txt
new file mode 100644
index 00000000000..0a8f47f893b
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/uloc_open_keywords_fuzzer_seed_corpus.txt
@@ -0,0 +1,30 @@
+sr-Cyrl-RS
+zz-UND
+de_DE
+De_dE
+en-US-u-islamcal
+zh-CN-a-myext-x-private
+en-a-myext-b-another
+de-419-DE
+a-DE
+ar-a-aaa-b-bbb-a-ccc
+sl-rozaj
+sl-rozaj-biske
+de-CH-1901
+sl-IT-nedis
+hy-Latn-IT-arevela
+az-Arab-x-AZE-derbend
+Completely bad text for locale, even includes spaces and interpunction.!?
+fr-u-nu-arabext
+de-u-nu-beng-nu-bali-nu-khmr
+fil-u-ca-buddhist
+zh-Hant-CN-u-nu-arabext-ca-islamicc
+ja-u-ca-japanese
+hr-HR-u-ca-roc
+1234
+AAAAaaaaaaaVVVV_-=+
+ja%-x-%e3
+yq-U-98x-M85E-9pE-85Y-8xU985YE-89xxUy-xEyq-U85Y-8xE8-q5Y-8xU-9xE
+UN-u-jTKMwi-a0q-aeae-KaG-aab-2aG2-36C-2uzeal-STqROK-U36-366-U86-83S-c3SZEC-SCG-1366-SG66-KMi-a0ae-qae-KaG-aab-1a3
+sr-sr-u-z2r-4su-nms-5rsu-mns-6um-s5su-msu-ins1-7rzx-ianu-ssd-ss5r-d0r-U22su-n5sx-lvar-5su-ssu-nax-lvarUd-uimxE-112
+HR-u-roc85Y-4xU-d0r-U22x-lvariant-ims-0d0U22-js17zr-rsm-u56su-csu-ins1-ins17Rz-zax-ianu-ssd-d0U22-js1-7rzrsm-u56su-csu-ins1-ins17Rz-z
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/unicode_string_codepage_create_fuzzer.cpp b/Build/source/libs/icu/icu-src/source/test/fuzzer/unicode_string_codepage_create_fuzzer.cpp
new file mode 100644
index 00000000000..d58b879f244
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/unicode_string_codepage_create_fuzzer.cpp
@@ -0,0 +1,85 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <cstring>
+#include <algorithm>
+#include <array>
+#include <vector>
+
+#include "fuzzer_utils.h"
+#include "unicode/unistr.h"
+
+// Taken from third_party/icu/source/data/mappings/convrtrs.txt file.
+static const std::array<const char*, 45> kConverters = {
+ {
+ "UTF-8",
+ "utf-16be",
+ "utf-16le",
+ "UTF-32",
+ "UTF-32BE",
+ "UTF-32LE",
+ "ibm866-html",
+ "iso-8859-2-html",
+ "iso-8859-3-html",
+ "iso-8859-4-html",
+ "iso-8859-5-html",
+ "iso-8859-6-html",
+ "iso-8859-7-html",
+ "iso-8859-8-html",
+ "ISO-8859-8-I",
+ "iso-8859-10-html",
+ "iso-8859-13-html",
+ "iso-8859-14-html",
+ "iso-8859-15-html",
+ "iso-8859-16-html",
+ "koi8-r-html",
+ "koi8-u-html",
+ "macintosh-html",
+ "windows-874-html",
+ "windows-1250-html",
+ "windows-1251-html",
+ "windows-1252-html",
+ "windows-1253-html",
+ "windows-1254-html",
+ "windows-1255-html",
+ "windows-1256-html",
+ "windows-1257-html",
+ "windows-1258-html",
+ "x-mac-cyrillic-html",
+ "windows-936-2000",
+ "gb18030",
+ "big5-html",
+ "euc-jp-html",
+ "ISO_2022,locale=ja,version=0",
+ "shift_jis-html",
+ "euc-kr-html",
+ "ISO-2022-KR",
+ "ISO-2022-CN",
+ "ISO-2022-CN-EXT",
+ "HZ-GB-2312"
+ }
+};
+
+IcuEnvironment* env = new IcuEnvironment();
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ if (size < 1) {
+ return 0;
+ }
+
+ // First byte is used for random converter selection.
+ uint8_t rnd = *data;
+ data++;
+ size--;
+
+ std::unique_ptr<char[]> fuzzbuff(new char[size]);
+ std::memcpy(fuzzbuff.get(), data, size);
+
+ icu::UnicodeString str(fuzzbuff.get(), size,
+ kConverters[rnd % kConverters.size()]);
+
+ return 0;
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/uregex_open_fuzzer.cpp b/Build/source/libs/icu/icu-src/source/test/fuzzer/uregex_open_fuzzer.cpp
new file mode 100644
index 00000000000..4cf4ceaf4be
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/uregex_open_fuzzer.cpp
@@ -0,0 +1,26 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+
+
+#include "fuzzer_utils.h"
+#include "unicode/regex.h"
+
+IcuEnvironment* env = new IcuEnvironment();
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ UParseError pe = { 0 };
+ UErrorCode status = U_ZERO_ERROR;
+
+ URegularExpression* re = uregex_open(reinterpret_cast<const UChar*>(data),
+ static_cast<int>(size) / sizeof(UChar),
+ 0, &pe, &status);
+
+ if (re)
+ uregex_close(re);
+
+ return 0;
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/fuzzer/uregex_open_fuzzer.dict b/Build/source/libs/icu/icu-src/source/test/fuzzer/uregex_open_fuzzer.dict
new file mode 100644
index 00000000000..f7011cf1e4a
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/fuzzer/uregex_open_fuzzer.dict
@@ -0,0 +1,102 @@
+# © 2019 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+"\\a"
+"\\A"
+"\\b"
+"\\B"
+"\\cX"
+"\\cC"
+"\\cZ"
+"\\d"
+"\\D"
+"\\e"
+"\\u001B"
+"\\E"
+"\\f"
+"\\u000C"
+"\\G"
+"\\h"
+"\\u0009"
+"\\H"
+"\\k"
+"\\n"
+"\\N"
+"\\p"
+"\\P"
+"{"
+"}"
+"\\Q"
+"\\r"
+"\\u000D"
+"\\R"
+"\\u000a"
+"\\u000b"
+"\\u000c"
+"\\u000d"
+"\\u0085"
+"\\u2028"
+"\\u2029"
+"\\s"
+"[\\t\\n\\f\\r\\p{Z}]"
+"\\S"
+"\\t"
+"\\u0009"
+"\\u"
+"\\uf0ff"
+"\\U"
+"\\U0010ffff."
+"\\v"
+"\\V"
+"\\w"
+"\\W"
+"\\x"
+"\\xhh"
+"\\X"
+"\\Z"
+"\\z"
+"\\n"
+"\\0"
+"\\0ooo"
+"."
+"^"
+"$"
+"\\"
+"|"
+"*"
+"+"
+"?"
+","
+"*?"
+"+?"
+"??"
+"*+"
+"++"
+"?+"
+"("
+"(?:"
+"(?>"
+"(?#"
+"(?="
+"(?!"
+"(?<="
+"(?<!"
+"(?"
+"-"
+")"
+":"
+"(?ismwx-ismwx:"
+"(?ismwx-ismwx)"
+"(?i)"
+"["
+"]"
+"[\\u0000-\\U0010ffff]"
+"[:script=Greek:]"
+"{script=Greek}"
+"gC"
+"sc"
+"scx"
+"WB"
+"Nd"
+"d"
+"MN"
diff --git a/Build/source/libs/icu/icu-src/source/test/hdrtst/Makefile.in b/Build/source/libs/icu/icu-src/source/test/hdrtst/Makefile.in
index 55e833943d5..60a8e72a677 100644
--- a/Build/source/libs/icu/icu-src/source/test/hdrtst/Makefile.in
+++ b/Build/source/libs/icu/icu-src/source/test/hdrtst/Makefile.in
@@ -17,9 +17,8 @@
##
## .. etc. Anything other than zero is an error. (except for the deprecation tests, where '1' is the correct value)
##
-##
-## If a header fails the C compile because it's a C++ header, add it to the
-## file named 'cxxfiles.txt' in this directory.
+## If a header fails the C compile test it is likely because the header is a
+## C++ header and isn't properly guarded by the U_SHOW_CPLUSPLUS_API macro.
##
## If a header fails because it is deprecated, add it to the 'dfiles.txt'
##
@@ -33,135 +32,84 @@ top_builddir = ../..
subdir = test/hdrtst
include $(shell icu-config --incfile)
-DIRS=$(prefix)/include/unicode
-LDIRS=$(prefix)/include/layout
-ECHO_T=@ECHO_T@
-ECHO_C=@ECHO_C@
-ECHO_N=@ECHO_N@
all:
@echo Please read this Makefile for more information.
@echo run \'$(MAKE) check\' to run the test "(use -k if you don't want to stop on errs)"
-E_NUM=8
-E_D="[1/$(E_NUM)] Deprecated: "
-E_C="[2/$(E_NUM)] C : "
-E_CXX="[3/$(E_NUM)] C++: "
-E_CXX_L="[4/$(E_NUM)] C++ layout: "
-E_DRF="[5/$(E_NUM)] Hide Draft: "
-E_DEP="[6/$(E_NUM)] Hide Deprecated: "
-E_INT="[7/$(E_NUM)] Hide Internal: "
-E_OBS="[8/$(E_NUM)] Hide Obsolete: "
-
-check: dtest ctest cpptest doclean drafttest deprtest internaltest obsoletetest
-ifeq ($(MAKECMDGOALS),check)
- $(MAKE) clean
-else
- @echo "(not cleaning automatically)"
-endif
-
-# break dependency
-doclean:
- make clean
-
-cpptest:
- @FAIL=0;for file in `ls $(prefix)/include/unicode/*.h | fgrep -v -f $(srcdir)/pfiles.txt`; do \
- incfile=`basename $$file .h` ; \
- echo "$@ unicode/$$incfile.h" ; \
- echo '#include "'unicode/$$incfile'.h"' > ht_$$incfile.cpp ; \
- echo 'void junk(){}' >> ht_$$incfile.cpp ; \
- $(COMPILE.cc) -c $(cppflags) ht_$$incfile.cpp || FAIL=1 ; \
- done ;\
- exit $$FAIL
-
-# layout is removed
+check: dtest ctest cpptest drafttest deprtest internaltest obsoletetest
-dtest:
- @FAIL=0;NONE="(No deprecated headers)";for stub in `cat $(srcdir)/dfiles.txt | grep -v '^#'` ; do \
- file=unicode/$$stub ; \
- NONE="" ; \
- incfile=`basename $$file .h` ; \
- echo "$@ unicode/$$incfile.h" ; \
- echo '#include "'unicode/$$incfile'.h"' > ht_$$incfile.cpp ; \
- echo 'void junk(){}' >> ht_$$incfile.cpp ; \
- echo > ht_dep.junk ; \
- $(COMPILE.cc) -c $(cppflags) ht_$$incfile.cpp 2>&1 | sed -e 's/^.*#error[^"]*"//' | fgrep -v ht_ | tee ht_dep.junk | fgrep -v "$$incfile.h header is obsolete" ; \
- RES=$$? ; \
- echo $$RES ; \
- fgrep -q "$$incfile.h header is obsolete" ht_dep.junk || echo "** FAIL Header unicode/$$incfile.h is not obsoleted properly" ; \
- fgrep -q "$$incfile.h header is obsolete" ht_dep.junk || FAIL=1 ; \
- rm -f unicode/$$stub ; \
+headertest:
+ @FAIL=0;stub=ht_stub_$(NAME.headers).$(SUFFIX.headers); for file in "$(prefix)/include/unicode"/*.h ; do \
+ incfile=`basename $$file` ; \
+ echo "$(NAME.headers) unicode/$$incfile" ; \
+ echo "#include <unicode/$$incfile>" > $$stub ; \
+ echo 'void junk(){}' >> $$stub ; \
+ $(COMPILE.headers) $(cppflags) $(FLAGS.headers) $$stub || FAIL=1 ; \
+ rm -f $$stub; \
done ; \
- echo "$@: $$NONE - exit status $$FAIL" ; \
exit $$FAIL
-# < ht_dep.junk && ; \
-
-
ctest:
- @echo Building test harness for header files in ../../common and ../../i18n
- @FAIL=0;for file in `ls $(prefix)/include/unicode/*.h | fgrep -v -f $(srcdir)/cxxfiles.txt | tee cfiles.txt`; do \
- incfile=`basename $$file .h` ; \
- echo "$@ unicode/$$incfile.h" ; \
- echo '#include "'unicode/$$incfile'.h"' > ht_$$incfile.c ; \
- echo 'void junk(void);' >> ht_$$incfile.c ; \
- echo 'void junk(){}' >> ht_$$incfile.c ; \
- $(COMPILE.c) -c $(cppflags) ht_$$incfile.c || FAIL=1 ; \
- done ;\
- exit $$FAIL
+ $(MAKE) headertest \
+ NAME.headers=$@ \
+ COMPILE.headers="$(COMPILE.c)" \
+ SUFFIX.headers=c \
+ FLAGS.headers=
+
+cpptest:
+ $(MAKE) headertest \
+ NAME.headers=$@ \
+ COMPILE.headers="$(COMPILE.cc)" \
+ SUFFIX.headers=cpp \
+ FLAGS.headers=
drafttest:
- @FAIL=0;for file in `ls $(prefix)/include/unicode/*.h | fgrep -v -f $(srcdir)/pfiles.txt`; do \
- incfile=`basename $$file .h` ; \
- echo "$@ unicode/$$incfile.h" ; \
- echo '#define U_HIDE_DRAFT_API' > hd_$$incfile.cpp ; \
- echo '#include "'unicode/$$incfile'.h"' >> hd_$$incfile.cpp ; \
- echo 'void junk(void);' >> hd_$$incfile.cpp ; \
- echo 'void junk(){}' >> hd_$$incfile.cpp ; \
- $(COMPILE.cc) -c $(cppflags) hd_$$incfile.cpp ||FAIL=1 ; \
- done ;\
- exit $$FAIL
+ $(MAKE) headertest \
+ NAME.headers=$@ \
+ COMPILE.headers="$(COMPILE.cc)" \
+ SUFFIX.headers=cpp \
+ FLAGS.headers="-DU_HIDE_DRAFT_API"
deprtest:
- @FAIL=0; for file in `ls $(prefix)/include/unicode/*.h | fgrep -v -f $(srcdir)/pfiles.txt`; do \
- incfile=`basename $$file .h` ; \
- echo "$@ unicode/$$incfile.h" ; \
- echo '#define U_HIDE_DEPRECATED_API' > hdp_$$incfile.cpp ; \
- echo '#include "'unicode/$$incfile'.h"' >> hdp_$$incfile.cpp ; \
- echo 'void junk(void);' >> hdp_$$incfile.cpp ; \
- echo 'void junk(){}' >> hdp_$$incfile.cpp ; \
- $(COMPILE.cc) -c $(cppflags) hdp_$$incfile.cpp || FAIL=1; \
- done ; \
- exit $$FAIL
+ $(MAKE) headertest \
+ NAME.headers=$@ \
+ COMPILE.headers="$(COMPILE.cc)" \
+ SUFFIX.headers=cpp \
+ FLAGS.headers="-DU_HIDE_DEPRECATED_API"
internaltest:
- @FAIL=0;\
- for file in `ls $(prefix)/include/unicode/*.h | fgrep -v -f $(srcdir)/pfiles.txt`; do \
- incfile=`basename $$file .h` ; \
- echo "$@ unicode/$$incfile.h" ; \
- echo '#define U_HIDE_INTERNAL_API' > hin_$$incfile.cpp ; \
- echo '#include "'unicode/$$incfile'.h"' >> hin_$$incfile.cpp ; \
- echo 'void junk(void);' >> hin_$$incfile.cpp ; \
- echo 'void junk(){}' >> hin_$$incfile.cpp ; \
- $(COMPILE.cc) -c $(cppflags) hin_$$incfile.cpp || FAIL=1 ; \
- done ; \
- exit $$FAIL
+ $(MAKE) headertest \
+ NAME.headers=$@ \
+ COMPILE.headers="$(COMPILE.cc)" \
+ SUFFIX.headers=cpp \
+ FLAGS.headers="-DU_HIDE_INTERNAL_API"
obsoletetest:
- @FAIL=0;for file in `ls $(prefix)/include/unicode/*.h | fgrep -v -f $(srcdir)/pfiles.txt`; do \
- incfile=`basename $$file .h` ; \
- echo "$@ unicode/$$incfile.h" ; \
- echo '#define U_HIDE_OBSOLETE_API' > hob_$$incfile.cpp ; \
- echo '#include "'unicode/$$incfile'.h"' >> hob_$$incfile.cpp ; \
- echo 'void junk(void);' >> hob_$$incfile.cpp ; \
- echo 'void junk(){}' >> hob_$$incfile.cpp ; \
- $(COMPILE.cc) -c $(cppflags) hob_$$incfile.cpp || FAIL=1 ; \
+ $(MAKE) headertest \
+ NAME.headers=$@ \
+ COMPILE.headers="$(COMPILE.cc)" \
+ SUFFIX.headers=cpp \
+ FLAGS.headers="-DU_HIDE_OBSOLETE_API"
+
+dtest:
+ @FAIL=0;NONE="(No deprecated headers)";stub=ht_stub_dtest.cpp;for incfile in `cat $(srcdir)/dfiles.txt | grep -v '^#' | sort` ; do \
+ NONE= ; \
+ echo "$@ unicode/$$incfile" ; \
+ echo "#include <unicode/$$incfile>" > $$stub ; \
+ echo 'void junk(){}' >> $$stub ; \
+ $(COMPILE.cc) $(cppflags) $$stub 2>&1 | tee $$stub.out || FAIL=1 ; \
+ if ! cat $$stub.out | sed -e 's/^.*#error[^"]*"//' | grep -v ht_ | grep -v "$$incfile header is obsolete"; then \
+ echo "** FAIL Header unicode/$$incfile is not obsoleted properly" ; \
+ FAIL=1 ; \
+ fi ; \
+ rm -f $$stub*; \
done ; \
+ echo "$@: $$NONE - exit status $$FAIL" ; \
exit $$FAIL
clean:
- -@echo cleaning..
- -@rm -f *.h *.c *.cpp *.o *.junk cfiles.txt
+ -@rm -f ht_*
distclean: clean
-@rm -f Makefile
@@ -170,5 +118,4 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) \
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-.PHONY: doclean check all cpptest dtest ctest clean distclean
-
+.PHONY: doclean check all headertest cpptest dtest ctest clean distclean
diff --git a/Build/source/libs/icu/icu-src/source/test/hdrtst/cxxfiles.txt b/Build/source/libs/icu/icu-src/source/test/hdrtst/cxxfiles.txt
deleted file mode 100644
index 2084d615737..00000000000
--- a/Build/source/libs/icu/icu-src/source/test/hdrtst/cxxfiles.txt
+++ /dev/null
@@ -1,134 +0,0 @@
-# Copyright (C) 2016 and later: Unicode, Inc. and others.
-# License & terms of use: http://www.unicode.org/copyright.html
-# Copyright (c) 2001-2016 International Business Machines
-# Corporation and others. All Rights Reserved.
-# Begin temporary addition.
-# These are very bad "C" APIs that do not work with a C compiler and
-# violate many ICU coding guidelines. These were added with ticket #5996.
-# Temporarily marked as C++ for the hdrtst to pass.
-# These are gone in ICU 50.1, remove
-#vzone.h
-#zrule.h
-#ztrans.h
-# End temporary addition.
-# common & i18n
-alphaindex.h
-appendable.h
-bidi.h
-basictz.h
-bmsearch.h
-brkiter.h
-bytestream.h
-bytestrie.h
-bytestriebuilder.h
-calendar.h
-caniter.h
-casemap.h
-char16ptr.h
-chariter.h
-choicfmt.h
-coleitr.h
-coll.h
-colldata.h
-convert.h
-cpdtrans.h
-curramt.h
-currunit.h
-currpinf.h
-datefmt.h
-dbbi.h
-dcfmtsym.h
-decimfmt.h
-dtintrv.h
-dtitvinf.h
-dtitvfmt.h
-dtfmtsym.h
-dtptngen.h
-dtrule.h
-edits.h
-enumset.h
-errorcode.h
-fieldpos.h
-filteredbrk.h
-fmtable.h
-format.h
-fpositer.h
-gender.h
-gregocal.h
-idna.h
-listformatter.h
-locdspnm.h
-locid.h
-measfmt.h
-measunit.h
-measure.h
-messagepattern.h
-msgfmt.h
-normalizer2.h
-normlzr.h
-nounit.h
-numberformatter.h
-numberrangeformatter.h
-numfmt.h
-numsys.h
-parsepos.h
-plurfmt.h
-plurrule.h
-rbbi.h
-rbnf.h
-rbtz.h
-regex.h
-region.h
-rep.h
-resbund.h
-schriter.h
-scientificformathelper.h
-scientificnumberformatter.h
-search.h
-selfmt.h
-simpleformatter.h
-simpletz.h
-smpdtfmt.h
-sortkey.h
-std_string.h
-strenum.h
-stringtriebuilder.h
-stringpiece.h
-stsearch.h
-symtable.h
-tblcoll.h
-timezone.h
-tmunit.h
-tmutamt.h
-tmutfmt.h
-translit.h
-tzfmt.h
-tznames.h
-tzrule.h
-tztrans.h
-ucharstrie.h
-ucharstriebuilder.h
-uchriter.h
-unifilt.h
-unifunct.h
-unimatch.h
-unirepl.h
-uniset.h
-unistr.h
-uobject.h
-usetiter.h
-vtzone.h
-# io library
-ustream.h
-# layout & layoutex
-LayoutEngine.h
-LEFontInstance.h
-LEGlyphFilter.h
-LEGlyphStorage.h
-LELanguages.h
-LEScripts.h
-LESwaps.h
-# LETypes.h -- C header
-# loengine.h -- C header
-ParagraphLayout.h
-RunArrays.h
diff --git a/Build/source/libs/icu/icu-src/source/test/hdrtst/pfiles.txt b/Build/source/libs/icu/icu-src/source/test/hdrtst/pfiles.txt
deleted file mode 100644
index 7b20c49a3e3..00000000000
--- a/Build/source/libs/icu/icu-src/source/test/hdrtst/pfiles.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright (C) 2016 and later: Unicode, Inc. and others.
-# License & terms of use: http://www.unicode.org/copyright.html
-# Copyright (c) 2001-2016 International Business Machines
-# Corporation and others. All Rights Reserved.
-# ICU 49 and later: no more platform-specific headers
diff --git a/Build/source/libs/icu/icu-src/source/test/hdrtst/testinternalheaders.sh b/Build/source/libs/icu/icu-src/source/test/hdrtst/testinternalheaders.sh
index 957b21080b4..5f70bcfb60d 100644
--- a/Build/source/libs/icu/icu-src/source/test/hdrtst/testinternalheaders.sh
+++ b/Build/source/libs/icu/icu-src/source/test/hdrtst/testinternalheaders.sh
@@ -85,7 +85,7 @@ for file in `ls test/cintltst/*.h`; do
$CC -c -std=c11 -I common -I i18n -I io -I tools/toolutil -I tools/ctestfw -I test/cintltst -O0 ht_temp.c ;
done ;
-for test in intltest iotest testmap thaitest; do
+for test in intltest iotest testmap thaitest fuzzer; do
for file in `ls test/$test/*.h`; do
echo $file
echo '#include "'$file'"' > ht_temp.cpp ;
@@ -105,4 +105,4 @@ done ;
# TODO: perf/*/*.h
-rm ht_temp.cpp ht_temp.o
+rm ht_temp.cpp ht_temp.c ht_temp.o
diff --git a/Build/source/libs/icu/icu-src/source/test/hdrtst/testtagsguards.sh b/Build/source/libs/icu/icu-src/source/test/hdrtst/testtagsguards.sh
new file mode 100755
index 00000000000..928707c8e3d
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/hdrtst/testtagsguards.sh
@@ -0,0 +1,94 @@
+# Copyright © 2019 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+# Run this script from $ICU_ROOT/icu4c.
+# ~/icu/mine/src/icu4c$ source/test/hdrtest/testtagsguards.sh
+
+# set -x # echo on
+
+DEF=-DU_NO_DEFAULT_INCLUDE_UTF_HEADERS=1
+INCL="-Isource/common -Isource/i18n -Isource/io"
+TMPDIR=`mktemp -d`
+DIFF="diff -u --minimal"
+
+echo "*** testtagsguards.sh TMPDIR=$TMPDIR"
+
+for file in source/common/unicode/*.h source/i18n/unicode/*.h source/io/unicode/*.h ; do
+ base=`basename $file`
+ echo $file
+ echo '#include "unicode/'$base'"' > $TMPDIR/ht-$base.cpp
+ # Preprocess only.
+ clang++ $INCL -C -E $DEF -o $TMPDIR/ht-$base-normal.i $TMPDIR/ht-$base.cpp
+
+ # When hiding @draft, none should be in the output.
+ TAG=draft
+ GUARD=DRAFT
+ echo " @$TAG"
+ clang++ $INCL -C -E -DU_HIDE_${GUARD}_API=1 -DU_FORCE_HIDE_${GUARD}_API=1 $DEF -o $TMPDIR/ht-$base-$TAG.i $TMPDIR/ht-$base.cpp
+ if grep "@$TAG" -C 5 $TMPDIR/ht-$base-$TAG.i; then
+ echo "*** error: @$TAG not hidden in $TMPDIR/ht-$base-$TAG.i"
+ exit 1
+ fi
+ # Only @draft should be hidden.
+ # Except: Ok to hide nested @internal/@system/@obsolete.
+ $DIFF $TMPDIR/ht-$base-normal.i $TMPDIR/ht-$base-$TAG.i > $TMPDIR/ht-$base-normal-$TAG.txt
+ if egrep '^-.*@(stable|deprecated)' -C 5 $TMPDIR/ht-$base-normal-$TAG.txt; then
+ echo "*** error: Non-@$TAG hidden in $TMPDIR/ht-$base-$TAG.i see $TMPDIR/ht-$base-normal-$TAG.txt"
+ cat $TMPDIR/ht-$base-normal-$TAG.txt
+ exit 1
+ fi
+
+ # @deprecated
+ TAG=deprecated
+ GUARD=DEPRECATED
+ echo " @$TAG"
+ clang++ $INCL -C -E -DU_HIDE_${GUARD}_API=1 -DU_FORCE_HIDE_${GUARD}_API=1 $DEF -o $TMPDIR/ht-$base-$TAG.i $TMPDIR/ht-$base.cpp
+ if grep "@$TAG" -C 5 $TMPDIR/ht-$base-$TAG.i; then
+ echo "*** error: @$TAG not hidden in $TMPDIR/ht-$base-$TAG.i"
+ exit 1
+ fi
+ # In the egrep: All tags except $TAG and @internal & similar.
+ $DIFF $TMPDIR/ht-$base-normal.i $TMPDIR/ht-$base-$TAG.i > $TMPDIR/ht-$base-normal-$TAG.txt
+ if egrep '^-.*@(stable|draft)' -C 5 $TMPDIR/ht-$base-normal-$TAG.txt; then
+ echo "*** error: Non-@$TAG hidden in $TMPDIR/ht-$base-$TAG.i see $TMPDIR/ht-$base-normal-$TAG.txt"
+ cat $TMPDIR/ht-$base-normal-$TAG.txt
+ exit 1
+ fi
+
+ # TODO: @internal
+ # Hiding some @internal definitions, in particular in platform.h and similar,
+ # tends to break even preprocessing of other headers.
+
+ # @system
+ TAG=system
+ GUARD=SYSTEM
+ echo " @$TAG"
+ clang++ $INCL -C -E -DU_HIDE_${GUARD}_API=1 -DU_FORCE_HIDE_${GUARD}_API=1 $DEF -o $TMPDIR/ht-$base-$TAG.i $TMPDIR/ht-$base.cpp
+ if grep "@$TAG" -C 5 $TMPDIR/ht-$base-$TAG.i; then
+ echo "*** error: @$TAG not hidden in $TMPDIR/ht-$base-$TAG.i"
+ exit 1
+ fi
+ # @system is orthogonal to @stable / @deprecated etc.,
+ # so we don't check that none of those are hidden.
+
+ # @obsolete
+ TAG=obsolete
+ GUARD=OBSOLETE
+ echo " @$TAG"
+ clang++ $INCL -C -E -DU_HIDE_${GUARD}_API=1 -DU_FORCE_HIDE_${GUARD}_API=1 $DEF -o $TMPDIR/ht-$base-$TAG.i $TMPDIR/ht-$base.cpp
+ if grep "@$TAG" -C 5 $TMPDIR/ht-$base-$TAG.i; then
+ echo "*** error: @$TAG not hidden in $TMPDIR/ht-$base-$TAG.i"
+ exit 1
+ fi
+ # In the egrep: All tags except $TAG and @internal & similar.
+ $DIFF $TMPDIR/ht-$base-normal.i $TMPDIR/ht-$base-$TAG.i > $TMPDIR/ht-$base-normal-$TAG.txt
+ if egrep '^-.*@(stable|draft|deprecated)' -C 5 $TMPDIR/ht-$base-normal-$TAG.txt; then
+ echo "*** error: Non-@$TAG hidden in $TMPDIR/ht-$base-$TAG.i see $TMPDIR/ht-$base-normal-$TAG.txt"
+ cat $TMPDIR/ht-$base-normal-$TAG.txt
+ exit 1
+ fi
+done
+
+echo "pass"
+rm -rf $TMPDIR
+
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/Makefile.in b/Build/source/libs/icu/icu-src/source/test/intltest/Makefile.in
index ad47ad0a14b..bcab2c98ba2 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/Makefile.in
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/Makefile.in
@@ -44,7 +44,8 @@ caltztst.o canittst.o citrtest.o colldata.o convtest.o currcoll.o collationtest.
fldset.o dadrfmt.o dadrcal.o dcfmapts.o decoll.o dtfmapts.o dtfmrgts.o dtfmtrtts.o dtfmttst.o \
dtptngts.o encoll.o escoll.o ficoll.o frcoll.o g7coll.o intltest.o \
itercoll.o itformat.o itmajor.o itutil.o jacoll.o lcukocol.o \
-loctest.o miscdtfm.o mnkytst.o msfmrgts.o nmfmapts.o nmfmtrt.o \
+loctest.o localebuildertest.o localematchertest.o \
+miscdtfm.o mnkytst.o msfmrgts.o nmfmapts.o nmfmtrt.o \
numfmtst.o numrgts.o plurults.o plurfmts.o pptest.o regcoll.o restest.o restsnew.o \
sdtfmtts.o svccoll.o tchcfmt.o selfmts.o \
tfsmalls.o tmsgfmt.o trcoll.o tscoll.o tsdate.o tsdcfmsy.o tsdtfmsy.o \
@@ -64,9 +65,10 @@ scientificnumberformattertest.o datadrivennumberformattestsuite.o \
numberformattesttuple.o pluralmaptest.o \
numbertest_affixutils.o numbertest_api.o numbertest_decimalquantity.o \
numbertest_modifiers.o numbertest_patternmodifier.o numbertest_patternstring.o \
-numbertest_stringbuilder.o numbertest_stringsegment.o \
+string_segment_test.o \
numbertest_parse.o numbertest_doubleconversion.o numbertest_skeletons.o \
-static_unisets_test.o numfmtdatadriventest.o numbertest_range.o erarulestest.o
+static_unisets_test.o numfmtdatadriventest.o numbertest_range.o erarulestest.o \
+formattedvaluetest.o formatted_string_builder_test.o numbertest_permutation.o
DEPS = $(OBJECTS:.o=.d)
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/alphaindextst.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/alphaindextst.cpp
index 8a4edb27711..f1b9b13878e 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/alphaindextst.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/alphaindextst.cpp
@@ -71,10 +71,19 @@ void AlphabeticIndexTest::runIndexedTest( int32_t index, UBool exec, const char*
TESTCASE_AUTO_END;
}
-#define TEST_CHECK_STATUS {if (U_FAILURE(status)) {dataerrln("%s:%d: Test failure. status=%s", \
- __FILE__, __LINE__, u_errorName(status)); return;}}
-
-#define TEST_ASSERT(expr) {if ((expr)==FALSE) {errln("%s:%d: Test failure \n", __FILE__, __LINE__);};}
+#define TEST_CHECK_STATUS UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(status)) { \
+ dataerrln("%s:%d: Test failure. status=%s", \
+ __FILE__, __LINE__, u_errorName(status)); \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define TEST_ASSERT(expr) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expr)==FALSE) { \
+ errln("%s:%d: Test failure \n", __FILE__, __LINE__); \
+ } \
+} UPRV_BLOCK_MACRO_END
//
// APITest. Invoke every function at least once, and check that it does something.
@@ -87,34 +96,35 @@ void AlphabeticIndexTest::APITest() {
UErrorCode status = U_ZERO_ERROR;
int32_t lc = 0;
int32_t i = 0;
- AlphabeticIndex *index = new AlphabeticIndex(Locale::getEnglish(), status);
+ LocalPointer<AlphabeticIndex> index(new AlphabeticIndex(Locale::getEnglish(), status));
TEST_CHECK_STATUS;
lc = index->getBucketCount(status);
TEST_CHECK_STATUS;
TEST_ASSERT(28 == lc); // 26 letters plus two under/overflow labels.
//printf("getBucketCount() == %d\n", lc);
- delete index;
+ index.adoptInstead(nullptr);
// Constructor from a Collator
//
status = U_ZERO_ERROR;
- RuleBasedCollator *coll = dynamic_cast<RuleBasedCollator *>(
- Collator::createInstance(Locale::getGerman(), status));
+ LocalPointer<RuleBasedCollator> coll(dynamic_cast<RuleBasedCollator *>(
+ Collator::createInstance(Locale::getGerman(), status)), status);
TEST_CHECK_STATUS;
- TEST_ASSERT(coll != NULL);
- index = new AlphabeticIndex(coll, status);
+ TEST_ASSERT(coll.isValid());
+ RuleBasedCollator *originalColl = coll.getAlias();
+ index.adoptInstead(new AlphabeticIndex(coll.orphan(), status));
TEST_CHECK_STATUS;
- TEST_ASSERT(coll == &index->getCollator());
+ TEST_ASSERT(originalColl == &index->getCollator());
assertEquals("only the underflow label in an index built from a collator",
1, index->getBucketCount(status));
TEST_CHECK_STATUS;
- delete index;
+ index.adoptInstead(nullptr);
// addLabels()
status = U_ZERO_ERROR;
- index = new AlphabeticIndex(Locale::getEnglish(), status);
+ index.adoptInstead(new AlphabeticIndex(Locale::getEnglish(), status));
TEST_CHECK_STATUS;
UnicodeSet additions;
additions.add((UChar32)0x410).add((UChar32)0x415); // A couple of Cyrillic letters
@@ -125,32 +135,31 @@ void AlphabeticIndexTest::APITest() {
assertEquals("underflow, A-Z, inflow, 2 Cyrillic, overflow",
31, index->getBucketCount(status));
// std::cout << lc << std::endl;
- delete index;
+ index.adoptInstead(nullptr);
// addLabels(Locale)
status = U_ZERO_ERROR;
- index = new AlphabeticIndex(Locale::getEnglish(), status);
+ index.adoptInstead(new AlphabeticIndex(Locale::getEnglish(), status));
TEST_CHECK_STATUS;
AlphabeticIndex &aip = index->addLabels(Locale::getJapanese(), status);
- TEST_ASSERT(&aip == index);
+ TEST_ASSERT(&aip == index.getAlias());
TEST_CHECK_STATUS;
lc = index->getBucketCount(status);
TEST_CHECK_STATUS;
TEST_ASSERT(35 < lc); // Japanese should add a bunch. Don't rely on the exact value.
- delete index;
+ index.adoptInstead(nullptr);
// GetCollator(), Get under/in/over flow labels
status = U_ZERO_ERROR;
- index = new AlphabeticIndex(Locale::getGerman(), status);
+ index.adoptInstead(new AlphabeticIndex(Locale::getGerman(), status));
TEST_CHECK_STATUS;
- Collator *germanCol = Collator::createInstance(Locale::getGerman(), status);
+ LocalPointer<Collator> germanCol(Collator::createInstance(Locale::getGerman(), status));
TEST_CHECK_STATUS;
const RuleBasedCollator &indexCol = index->getCollator();
TEST_ASSERT(*germanCol == indexCol);
- delete germanCol;
UnicodeString ELLIPSIS; ELLIPSIS.append((UChar32)0x2026);
UnicodeString s = index->getUnderflowLabel();
@@ -171,7 +180,7 @@ void AlphabeticIndexTest::APITest() {
- delete index;
+ index.adoptInstead(nullptr);
@@ -185,7 +194,7 @@ void AlphabeticIndexTest::APITest() {
// addRecord(), verify that it comes back out.
//
status = U_ZERO_ERROR;
- index = new AlphabeticIndex(Locale::getEnglish(), status);
+ index.adoptInstead(new AlphabeticIndex(Locale::getEnglish(), status));
TEST_CHECK_STATUS;
index->addRecord(UnicodeString("Adam"), this, status);
UBool b;
@@ -208,12 +217,12 @@ void AlphabeticIndexTest::APITest() {
const void *itemContext = index->getRecordData();
TEST_ASSERT(itemContext == this);
- delete index;
+ index.adoptInstead(nullptr);
// clearRecords, addRecord(), Iteration
status = U_ZERO_ERROR;
- index = new AlphabeticIndex(Locale::getEnglish(), status);
+ index.adoptInstead(new AlphabeticIndex(Locale::getEnglish(), status));
TEST_CHECK_STATUS;
while (index->nextBucket(status)) {
TEST_CHECK_STATUS;
@@ -256,12 +265,12 @@ void AlphabeticIndexTest::APITest() {
}
}
TEST_CHECK_STATUS;
- delete index;
+ index.adoptInstead(nullptr);
// getBucketLabel(), getBucketType()
status = U_ZERO_ERROR;
- index = new AlphabeticIndex(Locale::getEnglish(), status);
+ index.adoptInstead(new AlphabeticIndex(Locale::getEnglish(), status));
TEST_CHECK_STATUS;
index->setUnderflowLabel(adam, status).setOverflowLabel(charlie, status);
TEST_CHECK_STATUS;
@@ -285,12 +294,12 @@ void AlphabeticIndexTest::APITest() {
}
}
TEST_ASSERT(i==28);
- delete index;
+ index.adoptInstead(nullptr);
// getBucketIndex()
status = U_ZERO_ERROR;
- index = new AlphabeticIndex(Locale::getEnglish(), status);
+ index.adoptInstead(new AlphabeticIndex(Locale::getEnglish(), status));
TEST_CHECK_STATUS;
int32_t n = index->getBucketIndex(adam, status);
TEST_CHECK_STATUS;
@@ -310,8 +319,8 @@ void AlphabeticIndexTest::APITest() {
}
TEST_ASSERT(i == 28);
- delete index;
- index = new AlphabeticIndex(Locale::createFromName("ru"), status);
+ index.adoptInstead(nullptr);
+ index.adoptInstead(new AlphabeticIndex(Locale::createFromName("ru"), status));
TEST_CHECK_STATUS;
assertEquals("Russian index.getBucketCount()", 32, index->getBucketCount(status));
// Latin-script names should go into the underflow label (0)
@@ -333,8 +342,6 @@ void AlphabeticIndexTest::APITest() {
n = index->getBucketIndex(zed, status);
assertEquals("Russian index.getBucketIndex(zed)", expectedLatinIndex, n);
- delete index;
-
}
@@ -497,7 +504,7 @@ static const char *localeAndIndexCharactersLists[][2] = {
/* Greek*/ {"el", "\\u0391:\\u0392:\\u0393:\\u0394:\\u0395:\\u0396:\\u0397:\\u0398:\\u0399:\\u039A:\\u039B:\\u039C:\\u039D:\\u039E:\\u039F:\\u03A0:\\u03A1:\\u03A3:\\u03A4:\\u03A5:\\u03A6:\\u03A7:\\u03A8:\\u03A9"},
/* English*/ {"en", "A:B:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:R:S:T:U:V:W:X:Y:Z"},
/* Spanish*/ {"es", "A:B:C:D:E:F:G:H:I:J:K:L:M:N:\\u00D1:O:P:Q:R:S:T:U:V:W:X:Y:Z"},
- /* Estonian*/ {"et", "A:B:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:R:S:\\u0160:Z:\\u017D:T:U:V:\\u00D5:\\u00C4:\\u00D6:\\u00DC:X:Y"},
+ /* Estonian*/ {"et", "A:B:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:R:S:\\u0160:Z:\\u017D:T:U:V:W:\\u00D5:\\u00C4:\\u00D6:\\u00DC:X:Y"},
/* Basque*/ {"eu", "A:B:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:R:S:T:U:V:W:X:Y:Z"},
/* Finnish*/ {"fi", "A:B:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:R:S:T:U:V:W:X:Y:Z:\\u00C5:\\u00C4:\\u00D6"},
/* Filipino*/ {"fil", "A:B:C:D:E:F:G:H:I:J:K:L:M:N:\\u00D1:Ng:O:P:Q:R:S:T:U:V:W:X:Y:Z"},
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/apicoll.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/apicoll.cpp
index b08211a1d96..88eefa92b98 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/apicoll.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/apicoll.cpp
@@ -2000,7 +2000,7 @@ void CollationAPITest::TestUClassID()
class TestCollator : public Collator
{
public:
- virtual Collator* clone(void) const;
+ virtual TestCollator* clone() const;
using Collator::compare;
@@ -2048,9 +2048,9 @@ public:
virtual UBool operator==(const Collator& other) const;
// Collator::operator!= calls !Collator::operator== which works for all subclasses.
virtual void setLocales(const Locale& requestedLocale, const Locale& validLocale, const Locale& actualLocale);
- TestCollator() : Collator() {};
+ TestCollator() : Collator() {}
TestCollator(UCollationStrength collationStrength,
- UNormalizationMode decompositionMode) : Collator(collationStrength, decompositionMode) {};
+ UNormalizationMode decompositionMode) : Collator(collationStrength, decompositionMode) {}
};
inline UBool TestCollator::operator==(const Collator& other) const {
@@ -2065,7 +2065,7 @@ inline UBool TestCollator::operator==(const Collator& other) const {
// (compare this vs. o's subclass fields)
}
-Collator* TestCollator::clone() const
+TestCollator* TestCollator::clone() const
{
return new TestCollator();
}
@@ -2345,7 +2345,7 @@ void CollationAPITest::TestClone() {
dump("c1", c1, status);
logln("\ninit c2");
- RuleBasedCollator* c2 = (RuleBasedCollator*)c1->clone();
+ RuleBasedCollator* c2 = c1->clone();
val = c2->getAttribute(UCOL_CASE_FIRST, status);
if(val == UCOL_LOWER_FIRST){
c2->setAttribute(UCOL_CASE_FIRST, UCOL_UPPER_FIRST, status);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/astrotst.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/astrotst.cpp
index 87ae7d2a0d6..059e645d588 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/astrotst.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/astrotst.cpp
@@ -44,7 +44,12 @@ void AstroTest::runIndexedTest( int32_t index, UBool exec, const char* &name, ch
#undef CASE
-#define ASSERT_OK(x) if(U_FAILURE(x)) { dataerrln("%s:%d: %s\n", __FILE__, __LINE__, u_errorName(x)); return; }
+#define ASSERT_OK(x) UPRV_BLOCK_MACRO_BEGIN { \
+ if(U_FAILURE(x)) { \
+ dataerrln("%s:%d: %s\n", __FILE__, __LINE__, u_errorName(x)); \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
void AstroTest::initAstro(UErrorCode &status) {
@@ -256,7 +261,7 @@ void AstroTest::TestSunriseTimes(void) {
logln("Sunrise/Sunset times for Toronto, Canada");
// long = 79 25", lat = 43 40"
- CalendarAstronomer *astro3 = new CalendarAstronomer(-(79+25/60), 43+40/60);
+ CalendarAstronomer astro3(-(79+25/60), 43+40/60);
// As of ICU4J 2.8 the ICU4J time zones implement pass-through
// to the underlying JDK. Because of variation in the
@@ -266,46 +271,47 @@ void AstroTest::TestSunriseTimes(void) {
// [aliu 10/15/03]
// TimeZone tz = TimeZone.getTimeZone("America/Montreal");
- TimeZone *tz = new SimpleTimeZone(-18000000 + 3600000, "Montreal(FIXED)");
-
- GregorianCalendar *cal = new GregorianCalendar(tz->clone(), Locale::getUS(), status);
- GregorianCalendar *cal2 = new GregorianCalendar(tz->clone(), Locale::getUS(), status);
- cal->clear();
- cal->set(UCAL_YEAR, 2001);
- cal->set(UCAL_MONTH, UCAL_APRIL);
- cal->set(UCAL_DAY_OF_MONTH, 1);
- cal->set(UCAL_HOUR_OF_DAY, 12); // must be near local noon for getSunRiseSet to work
-
- DateFormat *df_t = DateFormat::createTimeInstance(DateFormat::MEDIUM,Locale::getUS());
- DateFormat *df_d = DateFormat::createDateInstance(DateFormat::MEDIUM,Locale::getUS());
- DateFormat *df_dt = DateFormat::createDateTimeInstance(DateFormat::MEDIUM, DateFormat::MEDIUM, Locale::getUS());
- if(!df_t || !df_d || !df_dt) {
- dataerrln("couldn't create dateformats.");
- return;
+ SimpleTimeZone tz(-18000000 + 3600000, "Montreal(FIXED)");
+
+ GregorianCalendar cal(tz.clone(), Locale::getUS(), status);
+ GregorianCalendar cal2(tz.clone(), Locale::getUS(), status);
+ cal.clear();
+ cal.set(UCAL_YEAR, 2001);
+ cal.set(UCAL_MONTH, UCAL_APRIL);
+ cal.set(UCAL_DAY_OF_MONTH, 1);
+ cal.set(UCAL_HOUR_OF_DAY, 12); // must be near local noon for getSunRiseSet to work
+
+ LocalPointer<DateFormat> df_t(DateFormat::createTimeInstance(DateFormat::MEDIUM,Locale::getUS()));
+ LocalPointer<DateFormat> df_d(DateFormat::createDateInstance(DateFormat::MEDIUM,Locale::getUS()));
+ LocalPointer<DateFormat> df_dt(DateFormat::createDateTimeInstance(DateFormat::MEDIUM, DateFormat::MEDIUM, Locale::getUS()));
+ if(!df_t.isValid() || !df_d.isValid() || !df_dt.isValid()) {
+ dataerrln("couldn't create dateformats.");
+ closeAstro(status);
+ return;
}
- df_t->adoptTimeZone(tz->clone());
- df_d->adoptTimeZone(tz->clone());
- df_dt->adoptTimeZone(tz->clone());
+ df_t->adoptTimeZone(tz.clone());
+ df_d->adoptTimeZone(tz.clone());
+ df_dt->adoptTimeZone(tz.clone());
for (int32_t i=0; i < 30; i++) {
logln("setDate\n");
- astro3->setDate(cal->getTime(status));
+ astro3.setDate(cal.getTime(status));
logln("getRiseSet(TRUE)\n");
- UDate sunrise = astro3->getSunRiseSet(TRUE);
+ UDate sunrise = astro3.getSunRiseSet(TRUE);
logln("getRiseSet(FALSE)\n");
- UDate sunset = astro3->getSunRiseSet(FALSE);
+ UDate sunset = astro3.getSunRiseSet(FALSE);
logln("end of getRiseSet\n");
- cal2->setTime(cal->getTime(status), status);
- cal2->set(UCAL_SECOND, 0);
- cal2->set(UCAL_MILLISECOND, 0);
+ cal2.setTime(cal.getTime(status), status);
+ cal2.set(UCAL_SECOND, 0);
+ cal2.set(UCAL_MILLISECOND, 0);
- cal2->set(UCAL_HOUR_OF_DAY, USNO[4*i+0]);
- cal2->set(UCAL_MINUTE, USNO[4*i+1]);
- UDate exprise = cal2->getTime(status);
- cal2->set(UCAL_HOUR_OF_DAY, USNO[4*i+2]);
- cal2->set(UCAL_MINUTE, USNO[4*i+3]);
- UDate expset = cal2->getTime(status);
+ cal2.set(UCAL_HOUR_OF_DAY, USNO[4*i+0]);
+ cal2.set(UCAL_MINUTE, USNO[4*i+1]);
+ UDate exprise = cal2.getTime(status);
+ cal2.set(UCAL_HOUR_OF_DAY, USNO[4*i+2]);
+ cal2.set(UCAL_MINUTE, USNO[4*i+3]);
+ UDate expset = cal2.getTime(status);
// Compute delta of what we got to the USNO data, in seconds
int32_t deltarise = (int32_t)uprv_fabs((sunrise - exprise) / 1000);
int32_t deltaset = (int32_t)uprv_fabs((sunset - expset) / 1000);
@@ -318,34 +324,34 @@ void AstroTest::TestSunriseTimes(void) {
UnicodeString s1, s2, s3, s4, s5;
if (deltarise > MAX_DEV || deltaset > MAX_DEV) {
if (deltarise > MAX_DEV) {
- errln("FAIL: (rise) " + df_d->format(cal->getTime(status),s1) +
+ errln("FAIL: (rise) " + df_d->format(cal.getTime(status),s1) +
", Sunrise: " + df_dt->format(sunrise, s2) +
" (USNO " + df_t->format(exprise,s3) +
" d=" + deltarise + "s)");
} else {
- logln(df_d->format(cal->getTime(status),s1) +
+ logln(df_d->format(cal.getTime(status),s1) +
", Sunrise: " + df_dt->format(sunrise,s2) +
" (USNO " + df_t->format(exprise,s3) + ")");
}
s1.remove(); s2.remove(); s3.remove(); s4.remove(); s5.remove();
if (deltaset > MAX_DEV) {
- errln("FAIL: (set) " + df_d->format(cal->getTime(status),s1) +
+ errln("FAIL: (set) " + df_d->format(cal.getTime(status),s1) +
", Sunset: " + df_dt->format(sunset,s2) +
" (USNO " + df_t->format(expset,s3) +
" d=" + deltaset + "s)");
} else {
- logln(df_d->format(cal->getTime(status),s1) +
+ logln(df_d->format(cal.getTime(status),s1) +
", Sunset: " + df_dt->format(sunset,s2) +
" (USNO " + df_t->format(expset,s3) + ")");
}
} else {
- logln(df_d->format(cal->getTime(status),s1) +
+ logln(df_d->format(cal.getTime(status),s1) +
", Sunrise: " + df_dt->format(sunrise,s2) +
" (USNO " + df_t->format(exprise,s3) + ")" +
", Sunset: " + df_dt->format(sunset,s4) +
" (USNO " + df_t->format(expset,s5) + ")");
}
- cal->add(UCAL_DATE, 1, status);
+ cal.add(UCAL_DATE, 1, status);
}
// CalendarAstronomer a = new CalendarAstronomer(-(71+5/60), 42+37/60);
@@ -358,13 +364,6 @@ void AstroTest::TestSunriseTimes(void) {
// cal.set(cal.DATE, 27);
// a.setDate(cal.getTime());
// long r = a.getSunRiseSet2(true);
- delete astro3;
- delete tz;
- delete cal;
- delete cal2;
- delete df_t;
- delete df_d;
- delete df_dt;
closeAstro(status);
ASSERT_OK(status);
}
@@ -380,38 +379,43 @@ void AstroTest::TestBasics(void) {
}
// Check that our JD computation is the same as the book's (p. 88)
- GregorianCalendar *cal3 = new GregorianCalendar(TimeZone::getGMT()->clone(), Locale::getUS(), status);
- DateFormat *d3 = DateFormat::createDateTimeInstance(DateFormat::MEDIUM,DateFormat::MEDIUM,Locale::getUS());
+ GregorianCalendar cal3(TimeZone::getGMT()->clone(), Locale::getUS(), status);
+ LocalPointer<DateFormat> d3(DateFormat::createDateTimeInstance(DateFormat::MEDIUM,DateFormat::MEDIUM,Locale::getUS()));
+ if (d3.isNull()) {
+ dataerrln("Got error: %s", u_errorName(status));
+ closeAstro(status);
+ return;
+ }
d3->setTimeZone(*TimeZone::getGMT());
- cal3->clear();
- cal3->set(UCAL_YEAR, 1980);
- cal3->set(UCAL_MONTH, UCAL_JULY);
- cal3->set(UCAL_DATE, 2);
- logln("cal3[a]=%.1lf, d=%d\n", cal3->getTime(status), cal3->get(UCAL_JULIAN_DAY,status));
+ cal3.clear();
+ cal3.set(UCAL_YEAR, 1980);
+ cal3.set(UCAL_MONTH, UCAL_JULY);
+ cal3.set(UCAL_DATE, 2);
+ logln("cal3[a]=%.1lf, d=%d\n", cal3.getTime(status), cal3.get(UCAL_JULIAN_DAY,status));
{
UnicodeString s;
- logln(UnicodeString("cal3[a] = ") + d3->format(cal3->getTime(status),s));
+ logln(UnicodeString("cal3[a] = ") + d3->format(cal3.getTime(status),s));
}
- cal3->clear();
- cal3->set(UCAL_YEAR, 1980);
- cal3->set(UCAL_MONTH, UCAL_JULY);
- cal3->set(UCAL_DATE, 27);
- logln("cal3=%.1lf, d=%d\n", cal3->getTime(status), cal3->get(UCAL_JULIAN_DAY,status));
+ cal3.clear();
+ cal3.set(UCAL_YEAR, 1980);
+ cal3.set(UCAL_MONTH, UCAL_JULY);
+ cal3.set(UCAL_DATE, 27);
+ logln("cal3=%.1lf, d=%d\n", cal3.getTime(status), cal3.get(UCAL_JULIAN_DAY,status));
ASSERT_OK(status);
{
UnicodeString s;
- logln(UnicodeString("cal3 = ") + d3->format(cal3->getTime(status),s));
+ logln(UnicodeString("cal3 = ") + d3->format(cal3.getTime(status),s));
}
- astro->setTime(cal3->getTime(status));
+ astro->setTime(cal3.getTime(status));
double jd = astro->getJulianDay() - 2447891.5;
double exp = -3444.;
if (jd == exp) {
UnicodeString s;
- logln(d3->format(cal3->getTime(status),s) + " => " + jd);
+ logln(d3->format(cal3.getTime(status),s) + " => " + jd);
} else {
UnicodeString s;
- errln("FAIL: " + d3->format(cal3->getTime(status), s) + " => " + jd +
+ errln("FAIL: " + d3->format(cal3.getTime(status), s) + " => " + jd +
", expected " + exp);
}
@@ -423,8 +427,6 @@ void AstroTest::TestBasics(void) {
// astro.setDate(cal3.getTime());
// astro.foo();
- delete cal3;
- delete d3;
ASSERT_OK(status);
closeAstro(status);
ASSERT_OK(status);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/bytestrietest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/bytestrietest.cpp
index 7123dbe25ab..bdf0b9003bb 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/bytestrietest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/bytestrietest.cpp
@@ -64,6 +64,7 @@ public:
void checkFirst(BytesTrie &trie, const StringAndValue data[], int32_t dataLength);
void checkNext(BytesTrie &trie, const StringAndValue data[], int32_t dataLength);
void checkNextWithState(BytesTrie &trie, const StringAndValue data[], int32_t dataLength);
+ void checkNextWithState64(BytesTrie &trie, const StringAndValue data[], int32_t dataLength);
void checkNextString(BytesTrie &trie, const StringAndValue data[], int32_t dataLength);
void checkIterator(const BytesTrie &trie, const StringAndValue data[], int32_t dataLength);
void checkIterator(BytesTrie::Iterator &iter, const StringAndValue data[], int32_t dataLength);
@@ -613,6 +614,7 @@ void BytesTrieTest::checkData(const StringAndValue data[], int32_t dataLength, U
checkFirst(*trie, data, dataLength);
checkNext(*trie, data, dataLength);
checkNextWithState(*trie, data, dataLength);
+ checkNextWithState64(*trie, data, dataLength);
checkNextString(*trie, data, dataLength);
checkIterator(*trie, data, dataLength);
}
@@ -691,7 +693,7 @@ void BytesTrieTest::checkNext(BytesTrie &trie,
const StringAndValue data[], int32_t dataLength) {
BytesTrie::State state;
for(int32_t i=0; i<dataLength; ++i) {
- int32_t stringLength= (i&1) ? -1 : strlen(data[i].s);
+ int32_t stringLength= (i&1) ? -1 : static_cast<int32_t>(strlen(data[i].s));
UStringTrieResult result;
if( !USTRINGTRIE_HAS_VALUE(result=trie.next(data[i].s, stringLength)) ||
result!=trie.current()
@@ -706,7 +708,7 @@ void BytesTrieTest::checkNext(BytesTrie &trie,
errln("trie value for %s changes when repeating current()/getValue()", data[i].s);
}
trie.reset();
- stringLength=strlen(data[i].s);
+ stringLength = static_cast<int32_t>(strlen(data[i].s));
result=trie.current();
for(int32_t j=0; j<stringLength; ++j) {
if(!USTRINGTRIE_HAS_NEXT(result)) {
@@ -776,8 +778,8 @@ void BytesTrieTest::checkNextWithState(BytesTrie &trie,
trie.resetToState(noState);
}
const char *expectedString=data[i].s;
- int32_t stringLength=strlen(expectedString);
- int32_t partialLength=stringLength/3;
+ int32_t stringLength= static_cast<int32_t>(strlen(expectedString));
+ int32_t partialLength = stringLength / 3;
for(int32_t j=0; j<partialLength; ++j) {
if(!USTRINGTRIE_MATCHES(trie.next(expectedString[j]))) {
errln("trie.next()=USTRINGTRIE_NO_MATCH for a prefix of %s", data[i].s);
@@ -825,13 +827,68 @@ void BytesTrieTest::checkNextWithState(BytesTrie &trie,
}
}
+void BytesTrieTest::checkNextWithState64(BytesTrie &trie,
+ const StringAndValue data[], int32_t dataLength) {
+ assertTrue("trie(initial state).getState64()!=0", trie.getState64() != 0);
+ for(int32_t i=0; i<dataLength; ++i) {
+ const char *expectedString=data[i].s;
+ int32_t stringLength= static_cast<int32_t>(strlen(expectedString));
+ int32_t partialLength = stringLength / 3;
+ for(int32_t j=0; j<partialLength; ++j) {
+ if(!USTRINGTRIE_MATCHES(trie.next(expectedString[j]))) {
+ errln("trie.next()=USTRINGTRIE_NO_MATCH for a prefix of %s", data[i].s);
+ return;
+ }
+ }
+ uint64_t state = trie.getState64();
+ assertTrue("trie.getState64()!=0", state != 0);
+ UStringTrieResult resultAtState=trie.current();
+ UStringTrieResult result;
+ int32_t valueAtState=-99;
+ if(USTRINGTRIE_HAS_VALUE(resultAtState)) {
+ valueAtState=trie.getValue();
+ }
+ result=trie.next(0); // mismatch
+ if(result!=USTRINGTRIE_NO_MATCH || result!=trie.current()) {
+ errln("trie.next(0) matched after part of %s", data[i].s);
+ }
+ if( resultAtState!=trie.resetToState64(state).current() ||
+ (USTRINGTRIE_HAS_VALUE(resultAtState) && valueAtState!=trie.getValue())
+ ) {
+ errln("trie.next(part of %s) changes current()/getValue() after "
+ "getState64/next(0)/resetToState64",
+ data[i].s);
+ } else if(!USTRINGTRIE_HAS_VALUE(
+ result=trie.next(expectedString+partialLength,
+ stringLength-partialLength)) ||
+ result!=trie.current()) {
+ errln("trie.next(rest of %s) does not seem to contain %s after "
+ "getState64/next(0)/resetToState64",
+ data[i].s, data[i].s);
+ } else if(!USTRINGTRIE_HAS_VALUE(
+ result=trie.resetToState64(state).
+ next(expectedString+partialLength,
+ stringLength-partialLength)) ||
+ result!=trie.current()) {
+ errln("trie does not seem to contain %s after getState64/next(rest)/resetToState64",
+ data[i].s);
+ } else if(trie.getValue()!=data[i].value) {
+ errln("trie value for %s is %ld=0x%lx instead of expected %ld=0x%lx",
+ data[i].s,
+ (long)trie.getValue(), (long)trie.getValue(),
+ (long)data[i].value, (long)data[i].value);
+ }
+ trie.reset();
+ }
+}
+
// next(string) is also tested in other functions,
// but here we try to go partway through the string, and then beyond it.
void BytesTrieTest::checkNextString(BytesTrie &trie,
const StringAndValue data[], int32_t dataLength) {
for(int32_t i=0; i<dataLength; ++i) {
const char *expectedString=data[i].s;
- int32_t stringLength=strlen(expectedString);
+ int32_t stringLength = static_cast<int32_t>(strlen(expectedString));
if(!trie.next(expectedString, stringLength/2)) {
errln("trie.next(up to middle of string)=USTRINGTRIE_NO_MATCH for %s", data[i].s);
continue;
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/calregts.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/calregts.cpp
index fc64851e249..744ca69baf8 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/calregts.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/calregts.cpp
@@ -96,6 +96,7 @@ CalendarRegressionTest::runIndexedTest( int32_t index, UBool exec, const char* &
CASE(52,TestPersianCalOverflow);
CASE(53,TestIslamicCalOverflow);
CASE(54,TestWeekOfYear13548);
+ CASE(55,Test13745);
default: name = ""; break;
}
}
@@ -193,7 +194,7 @@ CalendarRegressionTest::test4028518()
return;
}
failure(status, "new GregorianCalendar");
- GregorianCalendar *cal2 = (GregorianCalendar*) cal1->clone() ;
+ GregorianCalendar *cal2 = cal1->clone() ;
printdate(cal1, "cal1: ") ;
printdate(cal2, "cal2 - cloned(): ") ;
@@ -1455,31 +1456,26 @@ void CalendarRegressionTest::test4118384()
void CalendarRegressionTest::test4125881()
{
UErrorCode status = U_ZERO_ERROR;
- GregorianCalendar *cal = (GregorianCalendar*) Calendar::createInstance(status);
+ LocalPointer<GregorianCalendar> cal((GregorianCalendar*) Calendar::createInstance(status), status);
if(U_FAILURE(status)) {
- dataerrln("Error creating calendar %s", u_errorName(status));
- delete cal;
- return;
+ dataerrln("Error creating calendar %s", u_errorName(status));
+ return;
}
- DateFormat *fmt = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"),status);
+ SimpleDateFormat fmt(UnicodeString("MMMM d, yyyy G"),status);
if(U_FAILURE(status)) {
- dataerrln("Error creating SimpleDateFormat - %s", u_errorName(status));
- delete cal;
- return;
+ dataerrln("Error creating SimpleDateFormat - %s", u_errorName(status));
+ return;
}
cal->clear();
for (int32_t y=-20; y<=10; ++y) {
cal->set(UCAL_ERA, y < 1 ? GregorianCalendar::BC : GregorianCalendar::AD);
cal->set(UCAL_YEAR, y < 1 ? 1 - y : y);
UnicodeString temp;
- logln(UnicodeString("") + y + UnicodeString(" = ") + fmt->format(cal->getTime(status), temp) + " " +
+ logln(UnicodeString("") + y + UnicodeString(" = ") + fmt.format(cal->getTime(status), temp) + " " +
cal->isLeapYear(y));
if (cal->isLeapYear(y) != ((y+40)%4 == 0))
errln("Leap years broken");
}
-
- delete cal;
- delete fmt;
}
/**
@@ -1489,17 +1485,15 @@ void CalendarRegressionTest::test4125881()
*/
void CalendarRegressionTest::test4125892() {
UErrorCode status = U_ZERO_ERROR;
- GregorianCalendar *cal = (GregorianCalendar*) Calendar::createInstance(status);
+ LocalPointer<GregorianCalendar> cal((GregorianCalendar*) Calendar::createInstance(status), status);
if(U_FAILURE(status)) {
- dataerrln("Error creating calendar %s", u_errorName(status));
- delete cal;
- return;
+ dataerrln("Error creating calendar %s", u_errorName(status));
+ return;
}
- DateFormat *fmt = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"),status);
+ SimpleDateFormat fmt(UnicodeString("MMMM d, yyyy G"),status);
if(U_FAILURE(status)) {
- dataerrln("Error creating SimpleDateFormat - %s", u_errorName(status));
- delete cal;
- return;
+ dataerrln("Error creating SimpleDateFormat - %s", u_errorName(status));
+ return;
}
cal->clear();
cal->set(UCAL_ERA, GregorianCalendar::BC);
@@ -1513,8 +1507,6 @@ void CalendarRegressionTest::test4125892() {
!cal->isLeapYear(-80)) // -80 == 81 BC
errln("Calendar not proleptic");
- delete cal;
- delete fmt;
}
/**
@@ -1530,7 +1522,7 @@ void CalendarRegressionTest::test4141665()
delete cal;
return;
}
- GregorianCalendar *cal2 = (GregorianCalendar*)cal->clone();
+ GregorianCalendar *cal2 = cal->clone();
UDate cut = cal->getGregorianChange();
UDate cut2 = cut + 100*24*60*60*1000.0; // 100 days later
if (*cal != *cal2) {
@@ -1545,6 +1537,41 @@ void CalendarRegressionTest::test4141665()
delete cal2;
}
+const UDate MILLIS_IN_DAY = 86400000.0;
+/**
+ * ICU-13745
+ * GregorianCalendar::setGregorianChange() overflow
+ */
+void CalendarRegressionTest::Test13745()
+{
+ UErrorCode status = U_ZERO_ERROR;
+ GregorianCalendar *cal = new GregorianCalendar(status);
+ if(U_FAILURE(status)) {
+ dataerrln("Error creating calendar %s", u_errorName(status));
+ delete cal;
+ return;
+ }
+
+ // this line would overflow before fix 13745
+ cal->setGregorianChange(((double)INT32_MAX+1.0) * MILLIS_IN_DAY, status);
+ if(U_FAILURE(status)) {
+ errln("%s:%d Failure setting INT32_MAX+1 change on calendar: %s\n", __FILE__, __LINE__, u_errorName(status));
+ return;
+ }
+ assertEquals("getGregorianChange()", (double)INT32_MAX * MILLIS_IN_DAY, cal->getGregorianChange());
+
+ // test underflow
+ cal->setGregorianChange(((double)INT32_MIN-1.0) * MILLIS_IN_DAY, status);
+ if(U_FAILURE(status)) {
+ errln("%s:%d Failure setting INT32_MAX-1 change on calendar: %s\n", __FILE__, __LINE__, u_errorName(status));
+ return;
+ }
+ assertEquals("getGregorianChange()", (double)INT32_MIN * MILLIS_IN_DAY, cal->getGregorianChange());
+
+ delete cal;
+}
+
+
/**
* @bug 4142933
* Bug states that ArrayIndexOutOfBoundsException is thrown by GregorianCalendar::roll()
@@ -1913,22 +1940,21 @@ CalendarRegressionTest::Test4167060()
{
UErrorCode status = U_ZERO_ERROR;
UCalendarDateFields field = UCAL_YEAR;
- DateFormat *format = new SimpleDateFormat(UnicodeString("EEE MMM dd HH:mm:ss zzz yyyy G"),
- Locale::getUS(), status);
+ LocalPointer<DateFormat> format (new SimpleDateFormat(UnicodeString("EEE MMM dd HH:mm:ss zzz yyyy G"),
+ Locale::getUS(), status));
if(U_FAILURE(status)) {
dataerrln("Couldn't create SimpleDateFormat - %s", u_errorName(status));
return;
}
- GregorianCalendar *calendars [] = {
- new GregorianCalendar(100, UCAL_NOVEMBER, 1, status),
- new GregorianCalendar(-99 /*100BC*/, UCAL_JANUARY, 1, status),
- new GregorianCalendar(1996, UCAL_FEBRUARY, 29, status),
+ GregorianCalendar calendars [] = {
+ {100, UCAL_NOVEMBER, 1, status},
+ {-99 /*100BC*/, UCAL_JANUARY, 1, status},
+ {1996, UCAL_FEBRUARY, 29, status}
};
if(U_FAILURE(status)) {
errln("Couldn't create GregorianCalendars");
return;
- // could leak
}
UnicodeString id [] = { "Hybrid", "Gregorian", "Julian" };
@@ -1937,7 +1963,7 @@ CalendarRegressionTest::Test4167060()
logln("--- " + id[k] + " ---");
for (int32_t j=0; j < 3; ++j) {
- GregorianCalendar *calendar = calendars[j];
+ GregorianCalendar *calendar = &calendars[j];
if (k == 1) {
calendar->setGregorianChange(EARLIEST_SUPPORTED_MILLIS, status);
}
@@ -1947,7 +1973,7 @@ CalendarRegressionTest::Test4167060()
if(U_FAILURE(status))
errln("setGregorianChange() failed");
- format->adoptCalendar((Calendar*)calendar->clone());
+ format->adoptCalendar(calendar->clone());
UDate dateBefore = calendar->getTime(status);
if(U_FAILURE(status))
@@ -1988,11 +2014,6 @@ CalendarRegressionTest::Test4167060()
}
}
}
-
- delete format;
- delete calendars[0];
- delete calendars[1];
- delete calendars[2];
}
/**
@@ -2283,15 +2304,18 @@ void CalendarRegressionTest::TestJ438(void) {
1999, UCAL_JUNE, 4, 1964, UCAL_SEPTEMBER, 7,
};
int32_t DATA_length = UPRV_LENGTHOF(DATA);
- Calendar* pcal = Calendar::createInstance(Locale::getUS(), ec);
+ LocalPointer<Calendar> pcal(Calendar::createInstance(Locale::getUS(), ec));
if(U_FAILURE(ec)) {
- dataerrln("Error creating calendar %s", u_errorName(ec));
- delete pcal;
- return;
+ dataerrln("Error creating calendar %s", u_errorName(ec));
+ return;
}
Calendar& cal = *pcal;
int32_t i;
SimpleDateFormat fmt(UnicodeString("MMM dd yyyy",""), ec);
+ if (U_FAILURE(ec)) {
+ dataerrln("Error creating calendar %s", u_errorName(ec));
+ return;
+ }
fmt.setCalendar(cal);
UnicodeString s, t, u;
if (U_SUCCESS(ec)) {
@@ -2323,7 +2347,7 @@ void CalendarRegressionTest::TestJ438(void) {
break;
{
- Calendar *cal2 = cal.clone();
+ LocalPointer<Calendar> cal2(cal.clone());
UErrorCode ec2 = U_ZERO_ERROR;
cal2->setTime(date1, ec2);
@@ -2338,7 +2362,6 @@ void CalendarRegressionTest::TestJ438(void) {
(dy2 != dy)){
errln("fieldDifference(UCAL_...) and fieldDifference(Calendar::...) give different results!\n");
}
- delete cal2;
}
@@ -2374,7 +2397,6 @@ void CalendarRegressionTest::TestJ438(void) {
} else {
dataerrln("Error creating SimpleDateFormat - %s", u_errorName(ec));
}
- delete pcal;
}
void CalendarRegressionTest::TestT5555()
@@ -2747,7 +2769,7 @@ void CalendarRegressionTest::TestDeprecates(void)
{
UErrorCode status = U_ZERO_ERROR;
Calendar *c1 = Calendar::createInstance("ja_JP@calendar=japanese",status);
- Calendar *c2 = Calendar::createInstance("ja_JP_TRADITIONAL",status);
+ Calendar *c2 = Calendar::createInstance("ja_JP@calendar=japanese",status);
if(!c1 || !c2 || U_FAILURE(status)) {
dataerrln("Couldn't create calendars for roll of HOUR: %s", u_errorName(status));
@@ -2782,7 +2804,7 @@ void CalendarRegressionTest::TestDeprecates(void)
status = U_ZERO_ERROR;
- c1 = Calendar::createInstance("th_TH_TRADITIONAL",status);
+ c1 = Calendar::createInstance("th_TH@calendar=buddhist",status);
c2 = Calendar::createInstance("th_TH@calendar=buddhist",status);
if(!c1 || !c2 || U_FAILURE(status)) {
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/calregts.h b/Build/source/libs/icu/icu-src/source/test/intltest/calregts.h
index b4166a0c61d..6fc4bdda16e 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/calregts.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/calregts.h
@@ -82,6 +82,8 @@ public:
void TestIslamicCalOverflow(void);
void TestWeekOfYear13548(void);
+ void Test13745(void);
+
void printdate(GregorianCalendar *cal, const char *string);
void dowTest(UBool lenient) ;
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/caltest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/caltest.cpp
index e1c9fda10a8..677c98a1219 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/caltest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/caltest.cpp
@@ -25,23 +25,33 @@
#define mkcstr(U) u_austrcpy(calloc(8, u_strlen(U) + 1), U)
-#define TEST_CHECK_STATUS { \
+#define TEST_CHECK_STATUS UPRV_BLOCK_MACRO_BEGIN { \
if (U_FAILURE(status)) { \
if (status == U_MISSING_RESOURCE_ERROR) { \
dataerrln("%s:%d: Test failure. status=%s", __FILE__, __LINE__, u_errorName(status)); \
} else { \
errln("%s:%d: Test failure. status=%s", __FILE__, __LINE__, u_errorName(status)); \
- } return;}}
+ } \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
-#define TEST_CHECK_STATUS_LOCALE(testlocale) { \
+#define TEST_CHECK_STATUS_LOCALE(testlocale) UPRV_BLOCK_MACRO_BEGIN { \
if (U_FAILURE(status)) { \
if (status == U_MISSING_RESOURCE_ERROR) { \
dataerrln("%s:%d: Test failure, locale %s. status=%s", __FILE__, __LINE__, testlocale, u_errorName(status)); \
} else { \
errln("%s:%d: Test failure, locale %s. status=%s", __FILE__, __LINE__, testlocale, u_errorName(status)); \
- } return;}}
+ } \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
-#define TEST_ASSERT(expr) {if ((expr)==FALSE) {errln("%s:%d: Test failure \n", __FILE__, __LINE__);};}
+#define TEST_ASSERT(expr) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expr)==FALSE) { \
+ errln("%s:%d: Test failure \n", __FILE__, __LINE__); \
+ } \
+} UPRV_BLOCK_MACRO_END
// *****************************************************************************
// class CalendarTest
@@ -740,7 +750,7 @@ CalendarTest::TestClonesUnique908()
UErrorCode status = U_ZERO_ERROR;
Calendar *c = Calendar::createInstance(status);
if (failure(status, "Calendar::createInstance", TRUE)) return;
- Calendar *d = (Calendar*) c->clone();
+ Calendar *d = c->clone();
c->set(UCAL_MILLISECOND, 123);
d->set(UCAL_MILLISECOND, 456);
if (c->get(UCAL_MILLISECOND, status) != 123 ||
@@ -1110,7 +1120,11 @@ CalendarTest::TestAddRollExtensive()
status = U_ZERO_ERROR;
for (i = 0; i < limit; i++) {
temp->add(e, 1, status);
- if (U_FAILURE(status)) { limit = i; status = U_ZERO_ERROR; }
+ if (U_FAILURE(status)) {
+ limit = i;
+ status = U_ZERO_ERROR;
+ break; // Suppress compile warning. Shouldn't be necessary, but it is.
+ }
}
for (i = 0; i < limit; i++) {
temp->add(e, -1, status);
@@ -1718,7 +1732,7 @@ void
CalendarTest::marchByDelta(Calendar* cal, int32_t delta)
{
UErrorCode status = U_ZERO_ERROR;
- Calendar *cur = (Calendar*) cal->clone();
+ Calendar *cur = cal->clone();
int32_t initialDOW = cur->get(UCAL_DAY_OF_WEEK, status);
if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
int32_t DOW, newDOW = initialDOW;
@@ -1743,11 +1757,12 @@ CalendarTest::marchByDelta(Calendar* cal, int32_t delta)
delete cur;
}
-#define CHECK(status, msg) \
+#define CHECK(status, msg) UPRV_BLOCK_MACRO_BEGIN { \
if (U_FAILURE(status)) { \
errcheckln(status, msg); \
return; \
- }
+ } \
+} UPRV_BLOCK_MACRO_END
void CalendarTest::TestWOY(void) {
/*
@@ -2169,7 +2184,7 @@ int32_t CalendarTest::testLocaleCount()
if(gLocaleCount < 0) {
int32_t i;
for(i=0;testLocaleID(i) != NULL;i++) {
- ;
+ // do nothing
}
gLocaleCount = i;
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/citrtest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/citrtest.cpp
index 84a2b69ee09..dfd45aaba1f 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/citrtest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/citrtest.cpp
@@ -36,7 +36,7 @@ public:
}
- virtual ~SCharacterIterator(){};
+ virtual ~SCharacterIterator(){}
void setText(const UnicodeString& newText){
@@ -57,7 +57,7 @@ public:
return TRUE;
}
- virtual CharacterIterator* clone(void) const {
+ virtual SCharacterIterator* clone(void) const {
return NULL;
}
virtual int32_t hashCode(void) const{
@@ -65,19 +65,19 @@ public:
}
virtual UChar nextPostInc(void){ return text.charAt(pos++);}
virtual UChar32 next32PostInc(void){return text.char32At(pos++);}
- virtual UBool hasNext() { return TRUE;};
- virtual UChar first(){return DONE;};
- virtual UChar32 first32(){return DONE;};
- virtual UChar last(){return DONE;};
- virtual UChar32 last32(){return DONE;};
- virtual UChar setIndex(int32_t /*pos*/){return DONE;};
- virtual UChar32 setIndex32(int32_t /*pos*/){return DONE;};
- virtual UChar current() const{return DONE;};
- virtual UChar32 current32() const{return DONE;};
- virtual UChar next(){return DONE;};
- virtual UChar32 next32(){return DONE;};
- virtual UChar previous(){return DONE;};
- virtual UChar32 previous32(){return DONE;};
+ virtual UBool hasNext() { return TRUE;}
+ virtual UChar first(){return DONE;}
+ virtual UChar32 first32(){return DONE;}
+ virtual UChar last(){return DONE;}
+ virtual UChar32 last32(){return DONE;}
+ virtual UChar setIndex(int32_t /*pos*/){return DONE;}
+ virtual UChar32 setIndex32(int32_t /*pos*/){return DONE;}
+ virtual UChar current() const{return DONE;}
+ virtual UChar32 current32() const{return DONE;}
+ virtual UChar next(){return DONE;}
+ virtual UChar32 next32(){return DONE;}
+ virtual UChar previous(){return DONE;}
+ virtual UChar32 previous32(){return DONE;}
virtual int32_t move(int32_t delta,CharacterIterator::EOrigin origin){
switch(origin) {
case kStart:
@@ -100,7 +100,7 @@ public:
}
return pos;
- };
+ }
virtual int32_t move32(int32_t delta, CharacterIterator::EOrigin origin){
switch(origin) {
case kStart:
@@ -127,8 +127,8 @@ public:
}
return pos;
- };
- virtual UBool hasPrevious() {return TRUE;};
+ }
+ virtual UBool hasPrevious() {return TRUE;}
SCharacterIterator& operator=(const SCharacterIterator& that){
text = that.text;
@@ -198,7 +198,7 @@ void CharIterTest::TestConstructionAndEquality() {
UnicodeString testText2("Don't bother using this string.");
UnicodeString result1, result2, result3;
- CharacterIterator* test1 = new StringCharacterIterator(testText);
+ StringCharacterIterator* test1 = new StringCharacterIterator(testText);
CharacterIterator* test1b= new StringCharacterIterator(testText, -1);
CharacterIterator* test1c= new StringCharacterIterator(testText, 100);
CharacterIterator* test1d= new StringCharacterIterator(testText, -2, 100, 5);
@@ -257,7 +257,7 @@ void CharIterTest::TestConstructionAndEquality() {
StringCharacterIterator* testChar1=new StringCharacterIterator(testText);
StringCharacterIterator* testChar2=new StringCharacterIterator(testText2);
- StringCharacterIterator* testChar3=(StringCharacterIterator*)test1->clone();
+ StringCharacterIterator* testChar3=test1->clone();
testChar1->getText(result1);
testChar2->getText(result2);
@@ -292,7 +292,7 @@ void CharIterTest::TestConstructionAndEqualityUChariter() {
UCharCharacterIterator* test2 = new UCharCharacterIterator(testText, u_strlen(testText), 5);
UCharCharacterIterator* test3 = new UCharCharacterIterator(testText, u_strlen(testText), 2, 20, 5);
UCharCharacterIterator* test4 = new UCharCharacterIterator(testText2, u_strlen(testText2));
- UCharCharacterIterator* test5 = (UCharCharacterIterator*)test1->clone();
+ UCharCharacterIterator* test5 = test1->clone();
UCharCharacterIterator* test6 = new UCharCharacterIterator(*test1);
// j785: length=-1 will use u_strlen()
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/compactdecimalformattest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/compactdecimalformattest.cpp
index c38ae5879cb..5f25cedb891 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/compactdecimalformattest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/compactdecimalformattest.cpp
@@ -168,21 +168,21 @@ static ExpectedResult kArabicLong[] = {
{-5300.0, "\\u061C-\\u0665\\u066B\\u0663 \\u0623\\u0644\\u0641"}};
static ExpectedResult kChineseCurrencyTestData[] = {
- {1.0, "\\uFFE51"},
- {12.0, "\\uFFE512"},
- {123.0, "\\uFFE5120"},
- {1234.0, "\\uFFE51200"},
- {12345.0, "\\uFFE51.2\\u4E07"},
- {123456.0, "\\uFFE512\\u4E07"},
- {1234567.0, "\\uFFE5120\\u4E07"},
- {12345678.0, "\\uFFE51200\\u4E07"},
- {123456789.0, "\\uFFE51.2\\u4EBF"},
- {1234567890.0, "\\uFFE512\\u4EBF"},
- {12345678901.0, "\\uFFE5120\\u4EBF"},
- {123456789012.0, "\\uFFE51200\\u4EBF"},
- {1234567890123.0, "\\uFFE51.2\\u5146"},
- {12345678901234.0, "\\uFFE512\\u5146"},
- {123456789012345.0, "\\uFFE5120\\u5146"},
+ {1.0, "\\u00A51"},
+ {12.0, "\\u00A512"},
+ {123.0, "\\u00A5120"},
+ {1234.0, "\\u00A51200"},
+ {12345.0, "\\u00A51.2\\u4E07"},
+ {123456.0, "\\u00A512\\u4E07"},
+ {1234567.0, "\\u00A5120\\u4E07"},
+ {12345678.0, "\\u00A51200\\u4E07"},
+ {123456789.0, "\\u00A51.2\\u4EBF"},
+ {1234567890.0, "\\u00A512\\u4EBF"},
+ {12345678901.0, "\\u00A5120\\u4EBF"},
+ {123456789012.0, "\\u00A51200\\u4EBF"},
+ {1234567890123.0, "\\u00A51.2\\u4E07\\u4EBF"},
+ {12345678901234.0, "\\u00A512\\u4E07\\u4EBF"},
+ {123456789012345.0, "\\u00A5120\\u4E07\\u4EBF"},
};
static ExpectedResult kGermanCurrencyTestData[] = {
{1.0, u8"1\\u00A0\\u20AC"},
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/convtest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/convtest.cpp
index 3a0e5414d6f..53d8cfdbd12 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/convtest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/convtest.cpp
@@ -606,12 +606,7 @@ ConversionTest::TestGetUnicodeSet2() {
// First try to see if we have different sets because ucnv_getUnicodeSet()
// added strings: The above conversion method does not tell us what strings might be convertible.
// Remove strings from the set and compare again.
- // Unfortunately, there are no good, direct set methods for finding out whether there are strings
- // in the set, nor for enumerating or removing just them.
- // Intersect all code points with the set. The intersection will not contain strings.
- UnicodeSet temp(0, 0x10ffff);
- temp.retainAll(set);
- set=temp;
+ set.removeAllStrings();
}
if(set!=expected) {
UnicodeSet diffSet;
@@ -656,26 +651,26 @@ ConversionTest::TestDefaultIgnorableCallback() {
const char *pattern_ignorable = "[:Default_Ignorable_Code_Point:]";
const char *pattern_not_ignorable = "[:^Default_Ignorable_Code_Point:]";
- UnicodeSet *set_ignorable = new UnicodeSet(pattern_ignorable, status);
+ LocalPointer<UnicodeSet> set_ignorable(new UnicodeSet(pattern_ignorable, status));
if (U_FAILURE(status)) {
dataerrln("Unable to create Unicodeset: %s - %s\n", pattern_ignorable, u_errorName(status));
return;
}
- UnicodeSet *set_not_ignorable = new UnicodeSet(pattern_not_ignorable, status);
+ LocalPointer<UnicodeSet> set_not_ignorable(new UnicodeSet(pattern_not_ignorable, status));
if (U_FAILURE(status)) {
dataerrln("Unable to create Unicodeset: %s - %s\n", pattern_not_ignorable, u_errorName(status));
return;
}
- UConverter *cnv = cnv_open(cnv_name, status);
+ LocalUConverterPointer cnv(cnv_open(cnv_name, status));
if (U_FAILURE(status)) {
dataerrln("Unable to open converter: %s - %s\n", cnv_name, u_errorName(status));
return;
}
// set callback for the converter
- ucnv_setFromUCallBack(cnv, UCNV_FROM_U_CALLBACK_SUBSTITUTE, NULL, NULL, NULL, &status);
+ ucnv_setFromUCallBack(cnv.getAlias(), UCNV_FROM_U_CALLBACK_SUBSTITUTE, NULL, NULL, NULL, &status);
UChar32 input[1];
char output[10];
@@ -689,7 +684,7 @@ ConversionTest::TestDefaultIgnorableCallback() {
input[0] = set_ignorable->charAt(i);
- outputLength = ucnv_fromUChars(cnv, output, 10, UnicodeString::fromUTF32(input, 1).getTerminatedBuffer(), -1, &status);
+ outputLength = ucnv_fromUChars(cnv.getAlias(), output, 10, UnicodeString::fromUTF32(input, 1).getTerminatedBuffer(), -1, &status);
if (U_FAILURE(status) || outputLength != 0) {
errln("Ignorable code point: U+%04X not skipped as expected - %s", input[0], u_errorName(status));
}
@@ -707,15 +702,11 @@ ConversionTest::TestDefaultIgnorableCallback() {
continue;
}
- outputLength = ucnv_fromUChars(cnv, output, 10, UnicodeString::fromUTF32(input, 1).getTerminatedBuffer(), -1, &status);
+ outputLength = ucnv_fromUChars(cnv.getAlias(), output, 10, UnicodeString::fromUTF32(input, 1).getTerminatedBuffer(), -1, &status);
if (U_FAILURE(status) || outputLength <= 0) {
errln("Non-ignorable code point: U+%04X skipped unexpectedly - %s", input[0], u_errorName(status));
}
}
-
- ucnv_close(cnv);
- delete set_not_ignorable;
- delete set_ignorable;
}
void
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/cpdtrtst.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/cpdtrtst.cpp
index b5691947542..fbc4457f16d 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/cpdtrtst.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/cpdtrtst.cpp
@@ -159,10 +159,10 @@ void CompoundTransliteratorTest::TestCloneEqual(){
errln("Error: =operator or copy constructor failed");
}
- CompoundTransliterator *clonect1a=(CompoundTransliterator*)ct1->clone();
- CompoundTransliterator *clonect1b=(CompoundTransliterator*)equalct1.clone();
- CompoundTransliterator *clonect2a=(CompoundTransliterator*)ct2->clone();
- CompoundTransliterator *clonect2b=(CompoundTransliterator*)copyct2->clone();
+ CompoundTransliterator *clonect1a=ct1->clone();
+ CompoundTransliterator *clonect1b=equalct1.clone();
+ CompoundTransliterator *clonect2a=ct2->clone();
+ CompoundTransliterator *clonect2b=copyct2->clone();
if(clonect1a->getID() != ct1->getID() || clonect1a->getCount() != ct1->getCount() ||
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/csdetest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/csdetest.cpp
index 4edacad6435..4068df3bd3e 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/csdetest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/csdetest.cpp
@@ -20,6 +20,7 @@
#include "xmlparser.h"
+#include <memory>
#include <stdlib.h>
#include <string.h>
@@ -27,18 +28,22 @@
#include <stdio.h>
#endif
-#define NEW_ARRAY(type,count) (type *) /*uprv_*/malloc((count) * sizeof(type))
-#define DELETE_ARRAY(array) /*uprv_*/free((void *) (array))
#define CH_SPACE 0x0020
#define CH_SLASH 0x002F
-#define TEST_ASSERT(x) {if (!(x)) { \
- errln("Failure in file %s, line %d", __FILE__, __LINE__);}}
+#define TEST_ASSERT(x) UPRV_BLOCK_MACRO_BEGIN { \
+ if (!(x)) { \
+ errln("Failure in file %s, line %d", __FILE__, __LINE__); \
+ } \
+} UPRV_BLOCK_MACRO_END
-#define TEST_ASSERT_SUCCESS(errcode) { if (U_FAILURE(errcode)) { \
- errcheckln(errcode, "Failure in file %s, line %d, status = \"%s\"", __FILE__, __LINE__, u_errorName(errcode));\
- return;}}
+#define TEST_ASSERT_SUCCESS(errcode) UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(errcode)) { \
+ errcheckln(errcode, "Failure in file %s, line %d, status = \"%s\"", __FILE__, __LINE__, u_errorName(errcode)); \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
//---------------------------------------------------------------------------
@@ -142,23 +147,18 @@ static char *extractBytes(const UnicodeString &source, const char *codepage, int
length = source.extract(0, sLength, NULL, codepage);
if (length > 0) {
- bytes = NEW_ARRAY(char, length + 1);
+ bytes = new char[length + 1];
source.extract(0, sLength, bytes, codepage);
}
return bytes;
}
-static void freeBytes(char *bytes)
-{
- DELETE_ARRAY(bytes);
-}
-
void CharsetDetectionTest::checkEncoding(const UnicodeString &testString, const UnicodeString &encoding, const UnicodeString &id)
{
int32_t splits = 0;
int32_t testLength = testString.length();
- UnicodeString *eSplit = split(encoding, CH_SLASH, splits);
+ std::unique_ptr<UnicodeString []> eSplit(split(encoding, CH_SLASH, splits));
UErrorCode status = U_ZERO_ERROR;
int32_t cpLength = eSplit[0].length();
char codepage[64];
@@ -169,16 +169,16 @@ void CharsetDetectionTest::checkEncoding(const UnicodeString &testString, const
LocalUCharsetDetectorPointer csd(ucsdet_open(&status));
int32_t byteLength = 0;
- char *bytes = extractBytes(testString, codepage, byteLength);
+ std::unique_ptr<char []> bytes(extractBytes(testString, codepage, byteLength));
- if (bytes == NULL) {
+ if (! bytes) {
#if !UCONFIG_NO_LEGACY_CONVERSION
dataerrln("Can't open a " + encoding + " converter for " + id);
#endif
return;
}
- ucsdet_setText(csd.getAlias(), bytes, byteLength, &status);
+ ucsdet_setText(csd.getAlias(), bytes.get(), byteLength, &status);
int32_t matchCount = 0;
const UCharsetMatch **matches = ucsdet_detectAll(csd.getAlias(), &matchCount, &status);
@@ -191,7 +191,7 @@ void CharsetDetectionTest::checkEncoding(const UnicodeString &testString, const
if (matchCount == 0) {
errln("Encoding detection failure for " + id + ": expected " + eSplit[0] + ", got no matches");
- goto bail;
+ return;
}
if (name.compare(eSplit[0]) != 0) {
@@ -206,15 +206,15 @@ void CharsetDetectionTest::checkEncoding(const UnicodeString &testString, const
printf("%s (%s) %d\n", name, lang, confidence);
}
#endif
- goto bail;
+ return;
}
if (splits > 1 && lang.compare(eSplit[1]) != 0) {
errln("Language detection failure for " + id + ", " + eSplit[0] + ": expected " + eSplit[1] + ", got " + lang);
- goto bail;
+ return;
}
- decoded = NEW_ARRAY(UChar, testLength);
+ decoded = new UChar[testLength];
dLength = ucsdet_getUChars(matches[0], decoded, testLength, &status);
if (testString.compare(decoded, dLength) != 0) {
@@ -231,11 +231,7 @@ void CharsetDetectionTest::checkEncoding(const UnicodeString &testString, const
}
- DELETE_ARRAY(decoded);
-
-bail:
- freeBytes(bytes);
- delete[] eSplit;
+ delete[] decoded;
}
const char *CharsetDetectionTest::getPath(char buffer[2048], const char *filename) {
@@ -328,7 +324,7 @@ void CharsetDetectionTest::UTF8Test()
char *bytes = extractBytes(s, "UTF-8", byteLength);
UCharsetDetector *csd = ucsdet_open(&status);
const UCharsetMatch *match;
- UChar *detected = NEW_ARRAY(UChar, sLength);
+ UChar *detected = new UChar[sLength];
ucsdet_setText(csd, bytes, byteLength, &status);
match = ucsdet_detect(csd, &status);
@@ -347,8 +343,8 @@ void CharsetDetectionTest::UTF8Test()
ucsdet_setDeclaredEncoding(csd, "UTF-8", 5, &status); /* for coverage */
bail:
- DELETE_ARRAY(detected);
- freeBytes(bytes);
+ delete[] detected;
+ delete[] bytes;
ucsdet_close(csd);
}
@@ -364,66 +360,55 @@ void CharsetDetectionTest::UTF16Test()
0x064a, 0x062a, 0x0000};
UnicodeString s(chars);
int32_t beLength = 0, leLength = 0;
- char *beBytes = extractBytes(s, "UTF-16BE", beLength);
- char *leBytes = extractBytes(s, "UTF-16LE", leLength);
- UCharsetDetector *csd = ucsdet_open(&status);
+ std::unique_ptr<char []>beBytes(extractBytes(s, "UTF-16BE", beLength));
+ std::unique_ptr<char []>leBytes(extractBytes(s, "UTF-16LE", leLength));
+ LocalUCharsetDetectorPointer csd(ucsdet_open(&status));
const UCharsetMatch *match;
const char *name;
int32_t conf;
- ucsdet_setText(csd, beBytes, beLength, &status);
- match = ucsdet_detect(csd, &status);
+ ucsdet_setText(csd.getAlias(), beBytes.get(), beLength, &status);
+ match = ucsdet_detect(csd.getAlias(), &status);
if (match == NULL) {
errln("Encoding detection failure for UTF-16BE: got no matches.");
- goto try_le;
- }
-
- name = ucsdet_getName(match, &status);
- conf = ucsdet_getConfidence(match, &status);
+ } else {
- if (strcmp(name, "UTF-16BE") != 0) {
- errln("Encoding detection failure for UTF-16BE: got %s", name);
- goto try_le; // no point in looking at confidence if we got the wrong character set.
- }
+ name = ucsdet_getName(match, &status);
+ conf = ucsdet_getConfidence(match, &status);
- if (conf != 100) {
- errln("Did not get 100%% confidence for UTF-16BE: got %d", conf);
+ if (strcmp(name, "UTF-16BE") != 0) {
+ errln("Encoding detection failure for UTF-16BE: got %s", name);
+ } else if (conf != 100) {
+ errln("Did not get 100%% confidence for UTF-16BE: got %d", conf);
+ }
}
-try_le:
- ucsdet_setText(csd, leBytes, leLength, &status);
- match = ucsdet_detect(csd, &status);
+ ucsdet_setText(csd.getAlias(), leBytes.get(), leLength, &status);
+ match = ucsdet_detect(csd.getAlias(), &status);
if (match == NULL) {
errln("Encoding detection failure for UTF-16LE: got no matches.");
- goto bail;
+ return;
}
name = ucsdet_getName(match, &status);
conf = ucsdet_getConfidence(match, &status);
-
if (strcmp(name, "UTF-16LE") != 0) {
errln("Enconding detection failure for UTF-16LE: got %s", name);
- goto bail; // no point in looking at confidence if we got the wrong character set.
+ return;
}
if (conf != 100) {
errln("Did not get 100%% confidence for UTF-16LE: got %d", conf);
}
-
-bail:
- freeBytes(leBytes);
- freeBytes(beBytes);
- ucsdet_close(csd);
}
void CharsetDetectionTest::InputFilterTest()
{
UErrorCode status = U_ZERO_ERROR;
- UnicodeString ss = "<a> <lot> <of> <English> <inside> <the> <markup> Un tr\\u00E8s petit peu de Fran\\u00E7ais. <to> <confuse> <the> <detector>";
- UnicodeString s = ss.unescape();
+ UnicodeString s(u"<a> <lot> <of> <English> <inside> <the> <markup> Un très petit peu de Français. <to> <confuse> <the> <detector>");
int32_t byteLength = 0;
char *bytes = extractBytes(s, "ISO-8859-1", byteLength);
UCharsetDetector *csd = ucsdet_open(&status);
@@ -480,7 +465,7 @@ turn_off:
}
bail:
- freeBytes(bytes);
+ delete[] bytes;
ucsdet_close(csd);
}
@@ -527,8 +512,8 @@ void CharsetDetectionTest::C1BytesTest()
}
bail:
- freeBytes(bWindows);
- freeBytes(bISO);
+ delete[] bWindows;
+ delete[] bISO;
ucsdet_close(csd);
#endif
@@ -674,8 +659,8 @@ void CharsetDetectionTest::IBM424Test()
}
bail:
- freeBytes(bytes);
- freeBytes(bytes_r);
+ delete[] bytes;
+ delete[] bytes_r;
ucsdet_close(csd);
#endif
}
@@ -764,8 +749,8 @@ void CharsetDetectionTest::IBM420Test()
}
bail:
- freeBytes(bytes);
- freeBytes(bytes_r);
+ delete[] bytes;
+ delete[] bytes_r;
ucsdet_close(csd);
#endif
}
@@ -825,23 +810,23 @@ void CharsetDetectionTest::Ticket6954Test() {
"It also includes some \\u201CC1\\u201D bytes.", -1, US_INV);
UnicodeString sWindows = ssWindows.unescape();
int32_t lISO = 0, lWindows = 0;
- char *bISO = extractBytes(sISO, "ISO-8859-1", lISO);
- char *bWindows = extractBytes(sWindows, "windows-1252", lWindows);
+ std::unique_ptr<char[]> bISO(extractBytes(sISO, "ISO-8859-1", lISO));
+ std::unique_ptr<char[]> bWindows(extractBytes(sWindows, "windows-1252", lWindows));
// First do a plain vanilla detect of 1252 text
- UCharsetDetector *csd1 = ucsdet_open(&status);
- ucsdet_setText(csd1, bWindows, lWindows, &status);
- const UCharsetMatch *match1 = ucsdet_detect(csd1, &status);
+ LocalUCharsetDetectorPointer csd1(ucsdet_open(&status));
+ ucsdet_setText(csd1.getAlias(), bWindows.get(), lWindows, &status);
+ const UCharsetMatch *match1 = ucsdet_detect(csd1.getAlias(), &status);
const char *name1 = ucsdet_getName(match1, &status);
TEST_ASSERT_SUCCESS(status);
TEST_ASSERT(strcmp(name1, "windows-1252")==0);
// Next, using a completely separate detector, detect some 8859-1 text
- UCharsetDetector *csd2 = ucsdet_open(&status);
- ucsdet_setText(csd2, bISO, lISO, &status);
- const UCharsetMatch *match2 = ucsdet_detect(csd2, &status);
+ LocalUCharsetDetectorPointer csd2(ucsdet_open(&status));
+ ucsdet_setText(csd2.getAlias(), bISO.get(), lISO, &status);
+ const UCharsetMatch *match2 = ucsdet_detect(csd2.getAlias(), &status);
const char *name2 = ucsdet_getName(match2, &status);
TEST_ASSERT_SUCCESS(status);
TEST_ASSERT(strcmp(name2, "ISO-8859-1")==0);
@@ -852,10 +837,5 @@ void CharsetDetectionTest::Ticket6954Test() {
name1 = ucsdet_getName(match1, &status);
TEST_ASSERT_SUCCESS(status);
TEST_ASSERT(strcmp(name1, "windows-1252")==0);
-
- ucsdet_close(csd1);
- ucsdet_close(csd2);
- freeBytes(bISO);
- freeBytes(bWindows);
#endif
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/dadrcal.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/dadrcal.cpp
index 658d652ace3..08c9cec95c3 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/dadrcal.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/dadrcal.cpp
@@ -366,7 +366,7 @@ void DataDrivenCalendarTest::testConvert(int32_t n,
void DataDrivenCalendarTest::testConvert(TestData *testData,
const DataMap *settings, UBool forward) {
UErrorCode status = U_ZERO_ERROR;
- Calendar *toCalendar= NULL;
+ LocalPointer<Calendar> toCalendar;
const DataMap *currentCase= NULL;
char toCalLoc[256] = "";
char fromCalLoc[256] = "";
@@ -374,7 +374,7 @@ void DataDrivenCalendarTest::testConvert(TestData *testData,
UnicodeString testSetting = settings->getString("ToCalendar", status);
if (U_SUCCESS(status)) {
testSetting.extract(0, testSetting.length(), toCalLoc, (const char*)0);
- toCalendar = Calendar::createInstance(toCalLoc, status);
+ toCalendar.adoptInstead(Calendar::createInstance(toCalLoc, status));
if (U_FAILURE(status)) {
dataerrln(UnicodeString("Unable to instantiate ToCalendar for ")+testSetting);
return;
@@ -393,11 +393,11 @@ void DataDrivenCalendarTest::testConvert(TestData *testData,
int n = 0;
while (testData->nextCase(currentCase, status)) {
++n;
- Calendar *fromCalendar= NULL;
+ LocalPointer<Calendar> fromCalendar;
UnicodeString locale = currentCase->getString("locale", status);
if (U_SUCCESS(status)) {
locale.extract(0, locale.length(), fromCalLoc, (const char*)0); // default codepage. Invariant codepage doesn't have '@'!
- fromCalendar = Calendar::createInstance(fromCalLoc, status);
+ fromCalendar.adoptInstead(Calendar::createInstance(fromCalLoc, status));
if (U_FAILURE(status)) {
errln("Unable to instantiate fromCalendar for "+locale);
return;
@@ -435,16 +435,13 @@ void DataDrivenCalendarTest::testConvert(TestData *testData,
if (forward) {
logln((UnicodeString)"#"+n+" "+locale+"/"+from+" >>> "+toCalLoc+"/"
+to);
- testConvert(n, fromSet, fromCalendar, toSet, toCalendar, forward);
+ testConvert(n, fromSet, fromCalendar.getAlias(), toSet, toCalendar.getAlias(), forward);
} else {
logln((UnicodeString)"#"+n+" "+locale+"/"+from+" <<< "+toCalLoc+"/"
+to);
- testConvert(n, toSet, toCalendar, fromSet, fromCalendar, forward);
+ testConvert(n, toSet, toCalendar.getAlias(), fromSet, fromCalendar.getAlias(), forward);
}
-
- delete fromCalendar;
}
- delete toCalendar;
}
void DataDrivenCalendarTest::processTest(TestData *testData) {
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/datadrivennumberformattestsuite.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/datadrivennumberformattestsuite.cpp
index c8f10d13264..22a72f314a2 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/datadrivennumberformattestsuite.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/datadrivennumberformattestsuite.cpp
@@ -38,7 +38,7 @@ void DataDrivenNumberFormatTestSuite::run(const char *fileName, UBool runAllTest
}
UnicodeString columnValues[kNumberFormatTestTupleFieldCount];
ENumberFormatTestTupleField columnTypes[kNumberFormatTestTupleFieldCount];
- int32_t columnCount;
+ int32_t columnCount = 0;
int32_t state = 0;
while(U_SUCCESS(status)) {
// Read a new line if necessary.
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/dcfmapts.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/dcfmapts.cpp
index 6a79bab8509..c8bf97a6a21 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/dcfmapts.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/dcfmapts.cpp
@@ -95,6 +95,12 @@ void IntlTestDecimalFormatAPI::runIndexedTest( int32_t index, UBool exec, const
testErrorCode();
}
break;
+ case 9: name = "testInvalidObject";
+ if(exec) {
+ logln((UnicodeString) "testInvalidObject ---");
+ testInvalidObject();
+ }
+ break;
default: name = ""; break;
}
}
@@ -447,9 +453,10 @@ void IntlTestDecimalFormatAPI::testAPI(/*char *par*/)
void IntlTestDecimalFormatAPI::TestCurrencyPluralInfo(){
UErrorCode status = U_ZERO_ERROR;
- CurrencyPluralInfo *cpi = new CurrencyPluralInfo(status);
+ LocalPointer<CurrencyPluralInfo>cpi(new CurrencyPluralInfo(status), status);
if(U_FAILURE(status)) {
errln((UnicodeString)"ERROR: CurrencyPluralInfo(UErrorCode) could not be created");
+ return;
}
CurrencyPluralInfo cpi1 = *cpi;
@@ -473,19 +480,18 @@ void IntlTestDecimalFormatAPI::TestCurrencyPluralInfo(){
errln((UnicodeString)"ERROR: CurrencyPluralInfo::setPluralRules");
}
- DecimalFormat *df = new DecimalFormat(status);
+ LocalPointer<DecimalFormat>df(new DecimalFormat(status));
if(U_FAILURE(status)) {
errcheckln(status, "ERROR: Could not create DecimalFormat - %s", u_errorName(status));
return;
}
- df->adoptCurrencyPluralInfo(cpi);
+ df->adoptCurrencyPluralInfo(cpi.orphan());
df->getCurrencyPluralInfo();
df->setCurrencyPluralInfo(cpi1);
- delete df;
}
void IntlTestDecimalFormatAPI::testRounding(/*char *par*/)
@@ -636,34 +642,47 @@ void IntlTestDecimalFormatAPI::TestScale()
}
-#define ASSERT_EQUAL(expect, actual) { char tmp[200]; sprintf(tmp, "(%g==%g)", (double)(expect), (double)(actual)); \
- assertTrue(tmp, ((expect)==(actual)), FALSE, TRUE, __FILE__, __LINE__); }
-
+#define ASSERT_EQUAL(expect, actual) UPRV_BLOCK_MACRO_BEGIN { \
+ /* ICU-20080: Use temporary variables to avoid strange compiler behaviour \
+ (with the nice side-effect of avoiding repeated function calls too). */ \
+ auto lhs = (expect); \
+ auto rhs = (actual); \
+ char tmp[200]; \
+ sprintf(tmp, "(%g==%g)", (double)lhs, (double)rhs); \
+ assertTrue(tmp, (lhs==rhs), FALSE, TRUE, __FILE__, __LINE__); \
+} UPRV_BLOCK_MACRO_END
+
+#if defined(_MSC_VER)
+// Ignore the noisy warning 4805 (comparisons between int and bool) in the function below as we use the ICU TRUE/FALSE macros
+// which are int values, whereas some of the DecimalQuantity methods return C++ bools.
+#pragma warning(push)
+#pragma warning(disable: 4805)
+#endif
void IntlTestDecimalFormatAPI::TestFixedDecimal() {
UErrorCode status = U_ZERO_ERROR;
LocalPointer<DecimalFormat> df(new DecimalFormat("###", status), status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
if (status == U_MISSING_RESOURCE_ERROR) {
return;
}
number::impl::DecimalQuantity fd;
df->formatToDecimalQuantity(44, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(44, fd.getPluralOperand(PLURAL_OPERAND_N));
ASSERT_EQUAL(0, fd.getPluralOperand(PLURAL_OPERAND_V));
ASSERT_EQUAL(FALSE, fd.isNegative());
df->formatToDecimalQuantity(-44, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(44, fd.getPluralOperand(PLURAL_OPERAND_N));
ASSERT_EQUAL(0, fd.getPluralOperand(PLURAL_OPERAND_V));
ASSERT_EQUAL(TRUE, fd.isNegative());
df.adoptInsteadAndCheckErrorCode(new DecimalFormat("###.00##", status), status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
df->formatToDecimalQuantity(123.456, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(3, fd.getPluralOperand(PLURAL_OPERAND_V)); // v
ASSERT_EQUAL(456, fd.getPluralOperand(PLURAL_OPERAND_F)); // f
ASSERT_EQUAL(456, fd.getPluralOperand(PLURAL_OPERAND_T)); // t
@@ -673,7 +692,7 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
ASSERT_EQUAL(FALSE, fd.isNegative());
df->formatToDecimalQuantity(-123.456, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(3, fd.getPluralOperand(PLURAL_OPERAND_V)); // v
ASSERT_EQUAL(456, fd.getPluralOperand(PLURAL_OPERAND_F)); // f
ASSERT_EQUAL(456, fd.getPluralOperand(PLURAL_OPERAND_T)); // t
@@ -685,7 +704,7 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
// test max int digits
df->setMaximumIntegerDigits(2);
df->formatToDecimalQuantity(123.456, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(3, fd.getPluralOperand(PLURAL_OPERAND_V)); // v
ASSERT_EQUAL(456, fd.getPluralOperand(PLURAL_OPERAND_F)); // f
ASSERT_EQUAL(456, fd.getPluralOperand(PLURAL_OPERAND_T)); // t
@@ -695,7 +714,7 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
ASSERT_EQUAL(FALSE, fd.isNegative());
df->formatToDecimalQuantity(-123.456, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(3, fd.getPluralOperand(PLURAL_OPERAND_V)); // v
ASSERT_EQUAL(456, fd.getPluralOperand(PLURAL_OPERAND_F)); // f
ASSERT_EQUAL(456, fd.getPluralOperand(PLURAL_OPERAND_T)); // t
@@ -708,7 +727,7 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
df->setMaximumIntegerDigits(2000000000);
df->setMaximumFractionDigits(2);
df->formatToDecimalQuantity(123.456, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(2, fd.getPluralOperand(PLURAL_OPERAND_V)); // v
ASSERT_EQUAL(46, fd.getPluralOperand(PLURAL_OPERAND_F)); // f
ASSERT_EQUAL(46, fd.getPluralOperand(PLURAL_OPERAND_T)); // t
@@ -718,7 +737,7 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
ASSERT_EQUAL(FALSE, fd.isNegative());
df->formatToDecimalQuantity(-123.456, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(2, fd.getPluralOperand(PLURAL_OPERAND_V)); // v
ASSERT_EQUAL(46, fd.getPluralOperand(PLURAL_OPERAND_F)); // f
ASSERT_EQUAL(46, fd.getPluralOperand(PLURAL_OPERAND_T)); // t
@@ -732,7 +751,7 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
df->setRoundingIncrement(7.3);
df->formatToDecimalQuantity(30.0, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(2, fd.getPluralOperand(PLURAL_OPERAND_V)); // v
ASSERT_EQUAL(20, fd.getPluralOperand(PLURAL_OPERAND_F)); // f
ASSERT_EQUAL(2, fd.getPluralOperand(PLURAL_OPERAND_T)); // t
@@ -742,7 +761,7 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
ASSERT_EQUAL(FALSE, fd.isNegative());
df->formatToDecimalQuantity(-30.0, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(2, fd.getPluralOperand(PLURAL_OPERAND_V)); // v
ASSERT_EQUAL(20, fd.getPluralOperand(PLURAL_OPERAND_F)); // f
ASSERT_EQUAL(2, fd.getPluralOperand(PLURAL_OPERAND_T)); // t
@@ -752,9 +771,9 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
ASSERT_EQUAL(TRUE, fd.isNegative());
df.adoptInsteadAndCheckErrorCode(new DecimalFormat("###", status), status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
df->formatToDecimalQuantity(123.456, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(0, fd.getPluralOperand(PLURAL_OPERAND_V));
ASSERT_EQUAL(0, fd.getPluralOperand(PLURAL_OPERAND_F));
ASSERT_EQUAL(0, fd.getPluralOperand(PLURAL_OPERAND_T));
@@ -763,9 +782,9 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
ASSERT_EQUAL(FALSE, fd.isNegative());
df.adoptInsteadAndCheckErrorCode(new DecimalFormat("###.0", status), status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
df->formatToDecimalQuantity(123.01, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(1, fd.getPluralOperand(PLURAL_OPERAND_V));
ASSERT_EQUAL(0, fd.getPluralOperand(PLURAL_OPERAND_F));
ASSERT_EQUAL(0, fd.getPluralOperand(PLURAL_OPERAND_T));
@@ -774,9 +793,9 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
ASSERT_EQUAL(FALSE, fd.isNegative());
df.adoptInsteadAndCheckErrorCode(new DecimalFormat("###.0", status), status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
df->formatToDecimalQuantity(123.06, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(1, fd.getPluralOperand(PLURAL_OPERAND_V));
ASSERT_EQUAL(1, fd.getPluralOperand(PLURAL_OPERAND_F));
ASSERT_EQUAL(1, fd.getPluralOperand(PLURAL_OPERAND_T));
@@ -785,9 +804,9 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
ASSERT_EQUAL(FALSE, fd.isNegative());
df.adoptInsteadAndCheckErrorCode(new DecimalFormat("@@@@@", status), status); // Significant Digits
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
df->formatToDecimalQuantity(123, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(2, fd.getPluralOperand(PLURAL_OPERAND_V));
ASSERT_EQUAL(0, fd.getPluralOperand(PLURAL_OPERAND_F));
ASSERT_EQUAL(0, fd.getPluralOperand(PLURAL_OPERAND_T));
@@ -796,9 +815,9 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
ASSERT_EQUAL(FALSE, fd.isNegative());
df.adoptInsteadAndCheckErrorCode(new DecimalFormat("@@@@@", status), status); // Significant Digits
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
df->formatToDecimalQuantity(1.23, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(4, fd.getPluralOperand(PLURAL_OPERAND_V));
ASSERT_EQUAL(2300, fd.getPluralOperand(PLURAL_OPERAND_F));
ASSERT_EQUAL(23, fd.getPluralOperand(PLURAL_OPERAND_T));
@@ -807,24 +826,24 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
ASSERT_EQUAL(FALSE, fd.isNegative());
df->formatToDecimalQuantity(uprv_getInfinity(), fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(TRUE, fd.isNaN() || fd.isInfinite());
df->formatToDecimalQuantity(0.0, fd, status);
ASSERT_EQUAL(FALSE, fd.isNaN() || fd.isInfinite());
df->formatToDecimalQuantity(uprv_getNaN(), fd, status);
ASSERT_EQUAL(TRUE, fd.isNaN() || fd.isInfinite());
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
// Test Big Decimal input.
// 22 digits before and after decimal, will exceed the precision of a double
// and force DecimalFormat::getFixedDecimal() to work with a digit list.
df.adoptInsteadAndCheckErrorCode(
new DecimalFormat("#####################0.00####################", status), status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
Formattable fable("12.34", status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
df->formatToDecimalQuantity(fable, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(2, fd.getPluralOperand(PLURAL_OPERAND_V));
ASSERT_EQUAL(34, fd.getPluralOperand(PLURAL_OPERAND_F));
ASSERT_EQUAL(34, fd.getPluralOperand(PLURAL_OPERAND_T));
@@ -833,9 +852,9 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
ASSERT_EQUAL(FALSE, fd.isNegative());
fable.setDecimalNumber("12.3456789012345678900123456789", status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
df->formatToDecimalQuantity(fable, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(22, fd.getPluralOperand(PLURAL_OPERAND_V));
ASSERT_EQUAL(3456789012345678900LL, fd.getPluralOperand(PLURAL_OPERAND_F));
ASSERT_EQUAL(34567890123456789LL, fd.getPluralOperand(PLURAL_OPERAND_T));
@@ -845,9 +864,9 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
// On field overflow, Integer part is truncated on the left, fraction part on the right.
fable.setDecimalNumber("123456789012345678901234567890.123456789012345678901234567890", status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
df->formatToDecimalQuantity(fable, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(22, fd.getPluralOperand(PLURAL_OPERAND_V));
ASSERT_EQUAL(1234567890123456789LL, fd.getPluralOperand(PLURAL_OPERAND_F));
ASSERT_EQUAL(1234567890123456789LL, fd.getPluralOperand(PLURAL_OPERAND_T));
@@ -857,9 +876,9 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
// Digits way to the right of the decimal but within the format's precision aren't truncated
fable.setDecimalNumber("1.0000000000000000000012", status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
df->formatToDecimalQuantity(fable, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(22, fd.getPluralOperand(PLURAL_OPERAND_V));
ASSERT_EQUAL(12, fd.getPluralOperand(PLURAL_OPERAND_F));
ASSERT_EQUAL(12, fd.getPluralOperand(PLURAL_OPERAND_T));
@@ -869,9 +888,9 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
// Digits beyond the precision of the format are rounded away
fable.setDecimalNumber("1.000000000000000000000012", status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
df->formatToDecimalQuantity(fable, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(2, fd.getPluralOperand(PLURAL_OPERAND_V));
ASSERT_EQUAL(0, fd.getPluralOperand(PLURAL_OPERAND_F));
ASSERT_EQUAL(0, fd.getPluralOperand(PLURAL_OPERAND_T));
@@ -881,9 +900,9 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
// Negative numbers come through
fable.setDecimalNumber("-1.0000000000000000000012", status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
df->formatToDecimalQuantity(fable, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(22, fd.getPluralOperand(PLURAL_OPERAND_V));
ASSERT_EQUAL(12, fd.getPluralOperand(PLURAL_OPERAND_F));
ASSERT_EQUAL(12, fd.getPluralOperand(PLURAL_OPERAND_T));
@@ -893,9 +912,9 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
// MinFractionDigits from format larger than from number.
fable.setDecimalNumber("1000000000000000000000.3", status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
df->formatToDecimalQuantity(fable, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(2, fd.getPluralOperand(PLURAL_OPERAND_V));
ASSERT_EQUAL(30, fd.getPluralOperand(PLURAL_OPERAND_F));
ASSERT_EQUAL(3, fd.getPluralOperand(PLURAL_OPERAND_T));
@@ -904,9 +923,9 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
ASSERT_EQUAL(FALSE, fd.isNegative());
fable.setDecimalNumber("1000000000000000050000.3", status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
df->formatToDecimalQuantity(fable, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(2, fd.getPluralOperand(PLURAL_OPERAND_V));
ASSERT_EQUAL(30, fd.getPluralOperand(PLURAL_OPERAND_F));
ASSERT_EQUAL(3, fd.getPluralOperand(PLURAL_OPERAND_T));
@@ -916,9 +935,9 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
// Test some int64_t values that are out of the range of a double
fable.setInt64(4503599627370496LL);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
df->formatToDecimalQuantity(fable, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(2, fd.getPluralOperand(PLURAL_OPERAND_V));
ASSERT_EQUAL(0, fd.getPluralOperand(PLURAL_OPERAND_F));
ASSERT_EQUAL(0, fd.getPluralOperand(PLURAL_OPERAND_T));
@@ -927,9 +946,9 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
ASSERT_EQUAL(FALSE, fd.isNegative());
fable.setInt64(4503599627370497LL);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
df->formatToDecimalQuantity(fable, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(2, fd.getPluralOperand(PLURAL_OPERAND_V));
ASSERT_EQUAL(0, fd.getPluralOperand(PLURAL_OPERAND_F));
ASSERT_EQUAL(0, fd.getPluralOperand(PLURAL_OPERAND_T));
@@ -938,28 +957,23 @@ void IntlTestDecimalFormatAPI::TestFixedDecimal() {
ASSERT_EQUAL(FALSE, fd.isNegative());
fable.setInt64(9223372036854775807LL);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
df->formatToDecimalQuantity(fable, fd, status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
ASSERT_EQUAL(2, fd.getPluralOperand(PLURAL_OPERAND_V));
ASSERT_EQUAL(0, fd.getPluralOperand(PLURAL_OPERAND_F));
ASSERT_EQUAL(0, fd.getPluralOperand(PLURAL_OPERAND_T));
// note: going through DigitList path to FixedDecimal, which is trimming
// int64_t fields to 18 digits. See ticket Ticket #10374
- // ASSERT_EQUAL(223372036854775807LL, fd.getPluralOperand(PLURAL_OPERAND_I);
- if (!(
- fd.getPluralOperand(PLURAL_OPERAND_I) == 223372036854775807LL ||
- fd.getPluralOperand(PLURAL_OPERAND_I) == 9223372036854775807LL)) {
- dataerrln(
- "File %s, Line %d, fd.getPluralOperand(PLURAL_OPERAND_I = %lld",
- __FILE__,
- __LINE__,
- fd.getPluralOperand(PLURAL_OPERAND_I));
- }
+ ASSERT_EQUAL(223372036854775807LL, fd.getPluralOperand(PLURAL_OPERAND_I));
ASSERT_EQUAL(TRUE, fd.hasIntegerValue());
ASSERT_EQUAL(FALSE, fd.isNegative());
}
+#if defined(_MSC_VER)
+// Re-enable 4805 warnings (comparisons between int and bool).
+#pragma warning(pop)
+#endif
void IntlTestDecimalFormatAPI::TestBadFastpath() {
UErrorCode status = U_ZERO_ERROR;
@@ -1028,11 +1042,6 @@ void IntlTestDecimalFormatAPI::TestRequiredDecimalPoint() {
}
}
-// WHERE Macro yields a literal string of the form "source_file_name:line number "
-#define WHERE __FILE__ ":" XLINE(__LINE__) " "
-#define XLINE(s) LINE(s)
-#define LINE(s) #s
-
void IntlTestDecimalFormatAPI::testErrorCode() {
// Try each DecimalFormat constructor with an errorCode set on input,
// Verify no crashes or leaks, and that the errorCode is not altered.
@@ -1075,7 +1084,7 @@ void IntlTestDecimalFormatAPI::testErrorCode() {
}
// Try each DecimalFormat method with an error code parameter, verifying that
- // an input error is not altered.
+ // an input error is not altered, and that no segmentation faults occur.
status = U_INTERNAL_PROGRAM_ERROR;
DecimalFormat dfBogus(status);
@@ -1138,4 +1147,242 @@ void IntlTestDecimalFormatAPI::testErrorCode() {
}
}
+void IntlTestDecimalFormatAPI::testInvalidObject() {
+ {
+ UErrorCode status = U_INTERNAL_PROGRAM_ERROR;
+ DecimalFormat dfBogus(status);
+ assertEquals(WHERE, U_INTERNAL_PROGRAM_ERROR, status);
+
+ status = U_ZERO_ERROR;
+ DecimalFormat dfGood(status);
+ assertSuccess(WHERE, status);
+
+ // An invalid object should not be equal to a valid object.
+ // This also tests that no segmentation fault occurs in the comparison operator due
+ // to any dangling/nullptr pointers. (ICU-20381).
+ assertTrue(WHERE, dfGood != dfBogus);
+
+ status = U_MEMORY_ALLOCATION_ERROR;
+ DecimalFormat dfBogus2(status);
+ assertEquals(WHERE, U_MEMORY_ALLOCATION_ERROR, status);
+
+ // Two invalid objects should not be equal.
+ // (Also verify that nullptr isn't t dereferenced in the comparision operator.)
+ assertTrue(WHERE, dfBogus != dfBogus2);
+
+ // Verify the comparison operator works for two valid objects.
+ status = U_ZERO_ERROR;
+ DecimalFormat dfGood2(status);
+ assertSuccess(WHERE, status);
+ assertTrue(WHERE, dfGood == dfGood2);
+
+ // Verify that the assignment operator sets the object to an invalid state, and
+ // that no segmentation fault occurs due to any dangling/nullptr pointers.
+ status = U_INTERNAL_PROGRAM_ERROR;
+ DecimalFormat dfAssignmentBogus = DecimalFormat(status);
+ // Verify comparison for the assigned object.
+ assertTrue(WHERE, dfAssignmentBogus != dfGood);
+ assertTrue(WHERE, dfAssignmentBogus != dfGood2);
+ assertTrue(WHERE, dfAssignmentBogus != dfBogus);
+
+ // Verify that cloning our original invalid object gives nullptr.
+ auto dfBogusClone = dfBogus.clone();
+ assertTrue(WHERE, dfBogusClone == nullptr);
+ // Verify that cloning our assigned invalid object gives nullptr.
+ auto dfBogusClone2 = dfAssignmentBogus.clone();
+ assertTrue(WHERE, dfBogusClone2 == nullptr);
+
+ // Verify copy constructing from an invalid object is also invalid.
+ DecimalFormat dfCopy(dfBogus);
+ assertTrue(WHERE, dfCopy != dfGood);
+ assertTrue(WHERE, dfCopy != dfGood2);
+ assertTrue(WHERE, dfCopy != dfBogus);
+ DecimalFormat dfCopyAssign = dfBogus;
+ assertTrue(WHERE, dfCopyAssign != dfGood);
+ assertTrue(WHERE, dfCopyAssign != dfGood2);
+ assertTrue(WHERE, dfCopyAssign != dfBogus);
+ auto dfBogusCopyClone1 = dfCopy.clone();
+ auto dfBogusCopyClone2 = dfCopyAssign.clone();
+ assertTrue(WHERE, dfBogusCopyClone1 == nullptr);
+ assertTrue(WHERE, dfBogusCopyClone2 == nullptr);
+ }
+
+ {
+ // Try each DecimalFormat class method that lacks an error code parameter, verifying
+ // we don't crash (segmentation fault) on invalid objects.
+
+ UErrorCode status = U_ZERO_ERROR;
+ const UnicodeString pattern(u"0.###E0");
+ UParseError pe;
+ DecimalFormatSymbols symbols(Locale::getUS(), status);
+ assertSuccess(WHERE, status);
+ CurrencyPluralInfo currencyPI(status);
+ assertSuccess(WHERE, status);
+
+ status = U_INTERNAL_PROGRAM_ERROR;
+ DecimalFormat dfBogus1(status);
+ assertEquals(WHERE, U_INTERNAL_PROGRAM_ERROR, status);
+
+ status = U_INTERNAL_PROGRAM_ERROR;
+ DecimalFormat dfBogus2(pattern, status);
+ assertEquals(WHERE, U_INTERNAL_PROGRAM_ERROR, status);
+
+ status = U_INTERNAL_PROGRAM_ERROR;
+ DecimalFormat dfBogus3(pattern, new DecimalFormatSymbols(symbols), status);
+ assertEquals(WHERE, U_INTERNAL_PROGRAM_ERROR, status);
+
+ status = U_INTERNAL_PROGRAM_ERROR;
+ DecimalFormat dfBogus4(pattern, new DecimalFormatSymbols(symbols), UNumberFormatStyle::UNUM_CURRENCY, status);
+ assertEquals(WHERE, U_INTERNAL_PROGRAM_ERROR, status);
+
+ status = U_INTERNAL_PROGRAM_ERROR;
+ DecimalFormat dfBogus5(pattern, new DecimalFormatSymbols(symbols), pe, status);
+ assertEquals(WHERE, U_INTERNAL_PROGRAM_ERROR, status);
+
+ for (DecimalFormat *df : {&dfBogus1, &dfBogus2, &dfBogus3, &dfBogus4, &dfBogus5})
+ {
+ df->setGroupingUsed(true);
+
+ df->setParseIntegerOnly(false);
+
+ df->setLenient(true);
+
+ auto dfClone = df->clone();
+ assertTrue(WHERE, dfClone == nullptr);
+
+ UnicodeString dest;
+ FieldPosition fp;
+ df->format(1.2, dest, fp);
+ df->format(static_cast<int32_t>(1234), dest, fp);
+ df->format(static_cast<int64_t>(1234), dest, fp);
+
+ UnicodeString text("-1,234.00");
+ Formattable result;
+ ParsePosition pos(0);
+ df->parse(text, result, pos);
+
+ CurrencyAmount* ca = df->parseCurrency(text, pos);
+ assertTrue(WHERE, ca == nullptr);
+
+ const DecimalFormatSymbols* dfs = df->getDecimalFormatSymbols();
+ assertTrue(WHERE, dfs == nullptr);
+
+ df->adoptDecimalFormatSymbols(nullptr);
+
+ df->setDecimalFormatSymbols(symbols);
+
+ const CurrencyPluralInfo* cpi = df->getCurrencyPluralInfo();
+ assertTrue(WHERE, cpi == nullptr);
+
+ df->adoptCurrencyPluralInfo(nullptr);
+
+ df->setCurrencyPluralInfo(currencyPI);
+
+ UnicodeString prefix("-123");
+ df->getPositivePrefix(dest);
+ df->setPositivePrefix(prefix);
+ df->getNegativePrefix(dest);
+ df->setNegativePrefix(prefix);
+ df->getPositiveSuffix(dest);
+ df->setPositiveSuffix(prefix);
+ df->getNegativeSuffix(dest);
+ df->setNegativeSuffix(prefix);
+
+ df->isSignAlwaysShown();
+
+ df->setSignAlwaysShown(true);
+
+ df->getMultiplier();
+ df->setMultiplier(10);
+
+ df->getMultiplierScale();
+ df->setMultiplierScale(2);
+
+ df->getRoundingIncrement();
+ df->setRoundingIncrement(1.2);
+
+ df->getRoundingMode();
+ df->setRoundingMode(DecimalFormat::ERoundingMode::kRoundDown);
+
+ df->getFormatWidth();
+ df->setFormatWidth(0);
+
+ UnicodeString pad(" ");
+ df->getPadCharacterString();
+ df->setPadCharacter(pad);
+
+ df->getPadPosition();
+ df->setPadPosition(DecimalFormat::EPadPosition::kPadBeforePrefix);
+
+ df->isScientificNotation();
+ df->setScientificNotation(false);
+
+ df->getMinimumExponentDigits();
+ df->setMinimumExponentDigits(1);
+
+ df->isExponentSignAlwaysShown();
+ df->setExponentSignAlwaysShown(true);
+
+ df->getGroupingSize();
+ df->setGroupingSize(3);
+
+ df->getSecondaryGroupingSize();
+ df->setSecondaryGroupingSize(-1);
+
+ df->getMinimumGroupingDigits();
+ df->setMinimumGroupingDigits(-1);
+
+ df->isDecimalSeparatorAlwaysShown();
+ df->setDecimalSeparatorAlwaysShown(true);
+
+ df->isDecimalPatternMatchRequired();
+ df->setDecimalPatternMatchRequired(false);
+
+ df->isParseNoExponent();
+ df->setParseNoExponent(true);
+
+ df->isParseCaseSensitive();
+ df->setParseCaseSensitive(false);
+
+ df->isFormatFailIfMoreThanMaxDigits();
+ df->setFormatFailIfMoreThanMaxDigits(true);
+
+ df->toPattern(dest);
+ df->toLocalizedPattern(dest);
+
+ df->setMaximumIntegerDigits(10);
+ df->setMinimumIntegerDigits(0);
+
+ df->setMaximumFractionDigits(2);
+ df->setMinimumFractionDigits(0);
+
+ df->getMinimumSignificantDigits();
+ df->setMinimumSignificantDigits(0);
+
+ df->getMaximumSignificantDigits();
+ df->setMaximumSignificantDigits(5);
+
+ df->areSignificantDigitsUsed();
+ df->setSignificantDigitsUsed(true);
+
+ df->setCurrency(u"USD");
+
+ df->getCurrencyUsage();
+
+ const number::LocalizedNumberFormatter* lnf = df->toNumberFormatter(status);
+ assertEquals("toNumberFormatter should return nullptr",
+ (int64_t) nullptr, (int64_t) lnf);
+
+ // Should not crash when chaining to error code enabled methods on the LNF
+ lnf->formatInt(1, status);
+ lnf->formatDouble(1.0, status);
+ lnf->formatDecimal("1", status);
+ lnf->toFormat(status);
+ lnf->toSkeleton(status);
+ lnf->copyErrorTo(status);
+ }
+
+ }
+}
+
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/dcfmapts.h b/Build/source/libs/icu/icu-src/source/test/intltest/dcfmapts.h
index 2e4bff7fb7b..090da6d7445 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/dcfmapts.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/dcfmapts.h
@@ -34,6 +34,7 @@ public:
void TestBadFastpath();
void TestRequiredDecimalPoint();
void testErrorCode();
+ void testInvalidObject();
private:
/*Helper functions */
void verify(const UnicodeString& message, const UnicodeString& got, double expected);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/dcfmtest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/dcfmtest.cpp
index 2dc9f82a442..0f4c943bf03 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/dcfmtest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/dcfmtest.cpp
@@ -79,21 +79,41 @@ void DecimalFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &
// Error Checking / Reporting macros used in all of the tests.
//
//---------------------------------------------------------------------------
-#define DF_CHECK_STATUS {if (U_FAILURE(status)) \
- {dataerrln("DecimalFormatTest failure at line %d. status=%s", \
- __LINE__, u_errorName(status)); return 0;}}
-
-#define DF_ASSERT(expr) {if ((expr)==FALSE) {errln("DecimalFormatTest failure at line %d.\n", __LINE__);};}
-
-#define DF_ASSERT_FAIL(expr, errcode) {UErrorCode status=U_ZERO_ERROR; (expr);\
-if (status!=errcode) {dataerrln("DecimalFormatTest failure at line %d. Expected status=%s, got %s", \
- __LINE__, u_errorName(errcode), u_errorName(status));};}
-
-#define DF_CHECK_STATUS_L(line) {if (U_FAILURE(status)) {errln( \
- "DecimalFormatTest failure at line %d, from %d. status=%d\n",__LINE__, (line), status); }}
-
-#define DF_ASSERT_L(expr, line) {if ((expr)==FALSE) { \
- errln("DecimalFormatTest failure at line %d, from %d.", __LINE__, (line)); return;}}
+#define DF_CHECK_STATUS UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(status)) { \
+ dataerrln("DecimalFormatTest failure at line %d. status=%s", \
+ __LINE__, u_errorName(status)); \
+ return 0; \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define DF_ASSERT(expr) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expr)==FALSE) { \
+ errln("DecimalFormatTest failure at line %d.\n", __LINE__); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define DF_ASSERT_FAIL(expr, errcode) UPRV_BLOCK_MACRO_BEGIN { \
+ UErrorCode status=U_ZERO_ERROR; \
+ (expr); \
+ if (status!=errcode) { \
+ dataerrln("DecimalFormatTest failure at line %d. Expected status=%s, got %s", \
+ __LINE__, u_errorName(errcode), u_errorName(status)); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define DF_CHECK_STATUS_L(line) UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(status)) { \
+ errln("DecimalFormatTest failure at line %d, from %d. status=%d\n",__LINE__, (line), status); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define DF_ASSERT_L(expr, line) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expr)==FALSE) { \
+ errln("DecimalFormatTest failure at line %d, from %d.", __LINE__, (line)); \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
@@ -106,7 +126,7 @@ if (status!=errcode) {dataerrln("DecimalFormatTest failure at line %d. Expected
class InvariantStringPiece: public StringPiece {
public:
InvariantStringPiece(const UnicodeString &s);
- ~InvariantStringPiece() {};
+ ~InvariantStringPiece() {}
private:
MaybeStackArray<char, 20> buf;
};
@@ -130,7 +150,7 @@ InvariantStringPiece::InvariantStringPiece(const UnicodeString &s) {
class UnicodeStringPiece: public StringPiece {
public:
UnicodeStringPiece(const UnicodeString &s);
- ~UnicodeStringPiece() {};
+ ~UnicodeStringPiece() {}
private:
MaybeStackArray<char, 20> buf;
};
@@ -501,7 +521,7 @@ UChar *DecimalFormatTest::ReadAndConvertFile(const char *fileName, int32_t &ulen
fileSize = ftell(f);
fileBuf = new char[fileSize];
fseek(f, 0, SEEK_SET);
- amtRead = fread(fileBuf, 1, fileSize, f);
+ amtRead = static_cast<int32_t>(fread(fileBuf, 1, fileSize, f));
if (amtRead != fileSize || fileSize <= 0) {
errln("Error reading test data file.");
goto cleanUpAndReturn;
@@ -546,7 +566,7 @@ cleanUpAndReturn:
errln("ICU Error \"%s\"\n", u_errorName(status));
delete retPtr;
retPtr = NULL;
- };
+ }
return retPtr;
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/dtfmapts.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/dtfmapts.cpp
index 928a722a2f5..361c35c5bae 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/dtfmapts.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/dtfmapts.cpp
@@ -235,7 +235,7 @@ if (fr != NULL && it != NULL && de != NULL)
}
const NumberFormat *nf = def->getNumberFormat();
- NumberFormat *newNf = (NumberFormat*) nf->clone();
+ NumberFormat *newNf = nf->clone();
de->adoptNumberFormat(newNf);
it->setNumberFormat(*newNf);
if( *(de->getNumberFormat()) != *(it->getNumberFormat())) {
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/dtfmrgts.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/dtfmrgts.cpp
index 260f8fa5236..7b772f13219 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/dtfmrgts.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/dtfmrgts.cpp
@@ -59,11 +59,12 @@ DateFormatRegressionTest::runIndexedTest( int32_t index, UBool exec, const char*
CASE(26,Test5554)
CASE(27,Test9237)
CASE(28,TestParsing)
- CASE(29,TestT10334)
- CASE(30,TestT10619)
- CASE(31,TestT10855)
- CASE(32,TestT10906)
- CASE(33,TestT13380)
+ CASE(29,Test12902_yWithGregoCalInThaiLoc)
+ CASE(30,TestT10334)
+ CASE(31,TestT10619)
+ CASE(32,TestT10855)
+ CASE(33,TestT10906)
+ CASE(34,TestT13380)
default: name = ""; break;
}
}
@@ -289,23 +290,17 @@ void DateFormatRegressionTest::Test4059917(void)
{
UErrorCode status = U_ZERO_ERROR;
- SimpleDateFormat *fmt;
UnicodeString myDate;
- fmt = new SimpleDateFormat( UnicodeString("yyyy/MM/dd"), status );
+ SimpleDateFormat fmt(UnicodeString(u"yyyy/MM/dd"), status );
if (failure(status, "new SimpleDateFormat", TRUE)) return;
myDate = "1997/01/01";
- aux917( fmt, myDate );
-
- delete fmt;
- fmt = NULL;
-
- fmt = new SimpleDateFormat( UnicodeString("yyyyMMdd"), status );
+ aux917( &fmt, myDate );
+
+ SimpleDateFormat fmt2( UnicodeString(u"yyyyMMdd"), status );
if(failure(status, "new SimpleDateFormat")) return;
myDate = "19970101";
- aux917( fmt, myDate );
-
- delete fmt;
+ aux917(&fmt2, myDate );
}
void DateFormatRegressionTest::aux917( SimpleDateFormat *fmt, UnicodeString& str ) {
@@ -348,23 +343,22 @@ void DateFormatRegressionTest::Test4060212(void)
logln( "dateString= " + dateString );
logln("Using yyyy-DDD.hh:mm:ss");
UErrorCode status = U_ZERO_ERROR;
- SimpleDateFormat *formatter = new SimpleDateFormat(UnicodeString("yyyy-DDD.hh:mm:ss"), status);
+ SimpleDateFormat formatter(UnicodeString("yyyy-DDD.hh:mm:ss"), status);
if (failure(status, "new SimpleDateFormat", TRUE)) return;
ParsePosition pos(0);
- UDate myDate = formatter->parse( dateString, pos );
+ UDate myDate = formatter.parse( dateString, pos );
UnicodeString myString;
- DateFormat *fmt = DateFormat::createDateTimeInstance( DateFormat::FULL,
- DateFormat::LONG);
- if (fmt == NULL) {
+ LocalPointer<DateFormat> fmt(DateFormat::createDateTimeInstance( DateFormat::FULL,
+ DateFormat::LONG));
+ if (!fmt.isValid()) {
dataerrln("Error calling DateFormat::createDateTimeInstance");
- delete formatter;
return;
}
myString = fmt->format( myDate, myString);
logln( myString );
- Calendar *cal = new GregorianCalendar(status);
+ LocalPointer<Calendar> cal(new GregorianCalendar(status));
failure(status, "new GregorianCalendar");
cal->setTime(myDate, status);
failure(status, "cal->setTime");
@@ -375,12 +369,10 @@ void DateFormatRegressionTest::Test4060212(void)
// this is an odd usage of "ddd" and it doesn't
// work now that date values are range checked per #3579.
logln("Using yyyy-ddd.hh:mm:ss");
- delete formatter;
- formatter = NULL;
- formatter = new SimpleDateFormat(UnicodeString("yyyy-ddd.hh:mm:ss"), status);
+ SimpleDateFormat formatter2(UnicodeString(u"yyyy-ddd.hh:mm:ss"), status);
if(failure(status, "new SimpleDateFormat")) return;
pos.setIndex(0);
- myDate = formatter->parse( dateString, pos );
+ myDate = formatter2.parse( dateString, pos );
myString = fmt->format( myDate, myString );
logln( myString );
cal->setTime(myDate, status);
@@ -388,10 +380,6 @@ void DateFormatRegressionTest::Test4060212(void)
if ((cal->get(UCAL_DAY_OF_YEAR, status) != 40) || failure(status, "cal->get"))
errln((UnicodeString) "Fail: Got " + cal->get(UCAL_DAY_OF_YEAR, status) +
" Want 40");
-
- delete formatter;
- delete fmt;
- delete cal;
}
/**
@@ -718,22 +706,20 @@ void DateFormatRegressionTest::Test4100302(void)
void DateFormatRegressionTest::Test4101483(void)
{
UErrorCode status = U_ZERO_ERROR;
- SimpleDateFormat *sdf = new SimpleDateFormat(UnicodeString("z"), Locale::getUS(), status);
+ SimpleDateFormat sdf(UnicodeString("z"), Locale::getUS(), status);
if (failure(status, "new SimpleDateFormat", TRUE)) return;
FieldPosition fp(UDAT_TIMEZONE_FIELD);
//Date d = date(9234567890L);
UDate d = 9234567890.0;
//StringBuffer buf = new StringBuffer("");
UnicodeString buf;
- sdf->format(d, buf, fp);
+ sdf.format(d, buf, fp);
//logln(sdf.format(d, buf, fp).toString());
logln(dateToString(d) + " => " + buf);
logln(UnicodeString("beginIndex = ") + fp.getBeginIndex());
logln(UnicodeString("endIndex = ") + fp.getEndIndex());
if (fp.getBeginIndex() == fp.getEndIndex())
errln("Fail: Empty field");
-
- delete sdf;
}
/**
@@ -751,22 +737,20 @@ void DateFormatRegressionTest::Test4103340(void)
// choose a date that is the FIRST of some month
// and some arbitrary time
UDate d = date(97, 3, 1, 1, 1, 1);
- SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("MMMM"), Locale::getUS(), status);
+ SimpleDateFormat df(UnicodeString(u"MMMM"), Locale::getUS(), status);
if (failure(status, "new SimpleDateFormat", TRUE)) return;
UnicodeString s;
s = dateToString(d, s);
UnicodeString s2;
FieldPosition pos(FieldPosition::DONT_CARE);
- s2 = df->format(d, s2, pos);
+ s2 = df.format(d, s2, pos);
logln("Date=" + s);
logln("DF=" + s2);
UnicodeString substr;
s2.extract(0,2, substr);
if (s.indexOf(substr) == -1)
- errln("Months should match");
-
- delete df;
+ errln("Months should match");
}
/**
@@ -774,29 +758,23 @@ void DateFormatRegressionTest::Test4103340(void)
*/
void DateFormatRegressionTest::Test4103341(void)
{
- TimeZone *saveZone =TimeZone::createDefault();
- //try {
-
+ LocalPointer<TimeZone> saveZone(TimeZone::createDefault());
+ if (!saveZone.isValid()) {
+ dataerrln("TimeZone::createDefault() failed.");
+ return;
+ }
// {sfb} changed from setDefault to adoptDefault
TimeZone::adoptDefault(TimeZone::createTimeZone("CST"));
UErrorCode status = U_ZERO_ERROR;
- SimpleDateFormat *simple = new SimpleDateFormat(UnicodeString("MM/dd/yyyy HH:mm"), status);
+ SimpleDateFormat simple(UnicodeString("MM/dd/yyyy HH:mm"), status);
if(U_FAILURE(status)) {
- dataerrln("Couldn't create SimpleDateFormat, error %s", u_errorName(status));
- delete simple;
- return;
- }
- failure(status, "new SimpleDateFormat");
- TimeZone *temp = TimeZone::createDefault();
- if(simple->getTimeZone() != *temp)
+ dataerrln("Couldn't create SimpleDateFormat, error %s", u_errorName(status));
+ } else {
+ LocalPointer<TimeZone> temp(TimeZone::createDefault());
+ if(simple.getTimeZone() != *temp)
errln("Fail: SimpleDateFormat not using default zone");
- //}
- //finally {
- TimeZone::adoptDefault(saveZone);
- //}
-
- delete temp;
- delete simple;
+ }
+ TimeZone::adoptDefault(saveZone.orphan());
}
/**
@@ -1017,17 +995,15 @@ void DateFormatRegressionTest::Test4134203(void)
{
UErrorCode status = U_ZERO_ERROR;
UnicodeString dateFormat = "MM/dd/yy HH:mm:ss zzz";
- SimpleDateFormat *fmt = new SimpleDateFormat(dateFormat, status);
+ SimpleDateFormat fmt (dateFormat, status);
if (failure(status, "new SimpleDateFormat", TRUE)) return;
ParsePosition p0(0);
- UDate d = fmt->parse("01/22/92 04:52:00 GMT", p0);
+ UDate d = fmt.parse("01/22/92 04:52:00 GMT", p0);
logln(dateToString(d));
if(p0 == ParsePosition(0))
errln("Fail: failed to parse 'GMT'");
// In the failure case an exception is thrown by parse();
// if no exception is thrown, the test passes.
-
- delete fmt;
}
/**
@@ -1039,19 +1015,17 @@ void DateFormatRegressionTest::Test4151631(void)
UnicodeString pattern = "'TO_DATE('''dd'-'MM'-'yyyy HH:mm:ss''' , ''DD-MM-YYYY HH:MI:SS'')'";
logln("pattern=" + pattern);
UErrorCode status = U_ZERO_ERROR;
- SimpleDateFormat *format = new SimpleDateFormat(pattern, Locale::getUS(), status);
+ SimpleDateFormat format(pattern, Locale::getUS(), status);
if (failure(status, "new SimpleDateFormat", TRUE)) return;
UnicodeString result;
FieldPosition pos(FieldPosition::DONT_CARE);
- result = format->format(date(1998-1900, UCAL_JUNE, 30, 13, 30, 0), result, pos);
+ result = format.format(date(1998-1900, UCAL_JUNE, 30, 13, 30, 0), result, pos);
if (result != "TO_DATE('30-06-1998 13:30:00' , 'DD-MM-YYYY HH:MI:SS')") {
errln("Fail: result=" + result);
}
else {
logln("Pass: result=" + result);
}
-
- delete format;
}
/**
@@ -1460,7 +1434,7 @@ void DateFormatRegressionTest::Test5554(void)
if (U_FAILURE(status)) {
errln("Error getting time to format");
return;
- };
+ }
sdf->adoptCalendar(cal);
UnicodeString result;
UnicodeString correct("-0330", "");
@@ -1533,6 +1507,55 @@ void DateFormatRegressionTest::TestParsing(void) {
delete cal;
}
+void DateFormatRegressionTest::Test12902_yWithGregoCalInThaiLoc(void) {
+ UErrorCode status = U_ZERO_ERROR;
+ UDate testDate = 43200000.0; // 1970-Jan-01 12:00 GMT
+ const char* skeleton = "y";
+ // Note that in locale "th", the availableFormats for skeleton "y" differ by calendar:
+ // for buddhist (default calendar): y{"G y"}
+ // for gregorian: y{"y"}
+ const char* expectFormat = "1970"; // format for skeleton y in Thai locale with Gregorian calendar
+ UnicodeString getFmtStr;
+
+ const TimeZone* gmtZone = TimeZone::getGMT();
+ LocalPointer<GregorianCalendar> pureGregoCal(new GregorianCalendar(*gmtZone, Locale::getEnglish(), status));
+ if (U_FAILURE(status)) {
+ dataerrln("Fail in new GregorianCalendar(GMT, en): %s", u_errorName(status));
+ return;
+ }
+ LocalPointer<DateFormat> df1(DateFormat::createInstanceForSkeleton(pureGregoCal.orphan(), skeleton, "th", status));
+ if (U_FAILURE(status)) {
+ dataerrln("Fail in DateFormat::createInstanceForSkeleton for th with Grego cal: %s", u_errorName(status));
+ return;
+ }
+ status = U_ZERO_ERROR;
+ getFmtStr.remove();
+ getFmtStr = df1->format(testDate, getFmtStr);
+ if (U_FAILURE(status)) {
+ errln("Fail in DateFormat::format for th with Grego cal: %s", u_errorName(status));
+ } else if (getFmtStr != expectFormat) {
+ char getFormat[32];
+ getFmtStr.extract(0, getFmtStr.length(), getFormat, 32);
+ errln("Error in DateFormat::format for th with Grego cal, expect: %s, get: %s", expectFormat, getFormat);
+ }
+
+ LocalPointer<DateFormat> df2(DateFormat::createInstanceForSkeleton(skeleton, "th-u-ca-gregory", status));
+ if (U_FAILURE(status)) {
+ dataerrln("Fail in DateFormat::createInstanceForSkeleton for th-u-ca-gregory: %s", u_errorName(status));
+ return;
+ }
+ status = U_ZERO_ERROR;
+ getFmtStr.remove();
+ getFmtStr = df2->format(testDate, getFmtStr);
+ if (U_FAILURE(status)) {
+ errln("Fail in DateFormat::format for th-u-ca-gregory: %s", u_errorName(status));
+ } else if (getFmtStr != expectFormat) {
+ char getFormat[32];
+ getFmtStr.extract(0, getFmtStr.length(), getFormat, 32);
+ errln("Error in DateFormat::format for th with Grego cal, expect: %s, get: %s", expectFormat, getFormat);
+ }
+}
+
void DateFormatRegressionTest::TestT10334(void) {
UErrorCode status = U_ZERO_ERROR;
UnicodeString pattern("'--: 'EEE-WW-MMMM-yyyy");
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/dtfmrgts.h b/Build/source/libs/icu/icu-src/source/test/intltest/dtfmrgts.h
index be8dd0f2261..305487db17c 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/dtfmrgts.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/dtfmrgts.h
@@ -55,6 +55,7 @@ public:
void Test5554(void);
void Test9237(void);
void TestParsing(void);
+ void Test12902_yWithGregoCalInThaiLoc(void);
void TestT10334(void);
void TestT10619(void);
void TestT10855(void);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/dtfmtrtts.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/dtfmtrtts.cpp
index 2206d0fe0d9..01b7c8087ca 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/dtfmtrtts.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/dtfmtrtts.cpp
@@ -340,8 +340,13 @@ void DateFormatRoundTripTest::test(DateFormat *fmt, const Locale &origLocale, UB
for(loop = 0; loop < DEPTH; ++loop) {
if (loop > 0) {
d[loop] = fmt->parse(s[loop-1], status);
- failure(status, "fmt->parse", s[loop-1]+" in locale: " + origLocale.getName() + " with pattern: " + pat);
- status = U_ZERO_ERROR; /* any error would have been reported */
+ if(U_FAILURE(status)) {
+ ParsePosition ppos;
+ (void)fmt->parse(s[loop-1], ppos);
+ failure(status, "fmt->parse", s[loop-1]+" in locale: " + origLocale.getName() +
+ " with pattern: " + pat + " has errIndex: " + ppos.getErrorIndex());
+ status = U_ZERO_ERROR; /* any error would have been reported */
+ }
}
s[loop] = fmt->format(d[loop], s[loop]);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/dtfmttst.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/dtfmttst.cpp
index b272320e927..9684e882b0f 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/dtfmttst.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/dtfmttst.cpp
@@ -29,7 +29,12 @@
#include "windttst.h"
#endif
-#define ASSERT_OK(status) if(U_FAILURE(status)) {errcheckln(status, #status " = %s @ %s:%d", u_errorName(status), __FILE__, __LINE__); return; }
+#define ASSERT_OK(status) UPRV_BLOCK_MACRO_BEGIN { \
+ if(U_FAILURE(status)) { \
+ errcheckln(status, #status " = %s @ %s:%d", u_errorName(status), __FILE__, __LINE__); \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
// *****************************************************************************
// class DateFormatTest
@@ -122,6 +127,7 @@ void DateFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &nam
TESTCASE_AUTO(TestMinuteSecondFieldsInOddPlaces);
TESTCASE_AUTO(TestDayPeriodParsing);
TESTCASE_AUTO(TestParseRegression13744);
+ TESTCASE_AUTO(TestAdoptCalendarLeak);
TESTCASE_AUTO_END;
}
@@ -377,12 +383,12 @@ void
DateFormatTest::TestTwoDigitYearDSTParse(void)
{
UErrorCode status = U_ZERO_ERROR;
- SimpleDateFormat* fullFmt = new SimpleDateFormat((UnicodeString)"EEE MMM dd HH:mm:ss.SSS zzz yyyy G", status);
- SimpleDateFormat *fmt = new SimpleDateFormat((UnicodeString)"dd-MMM-yy h:mm:ss 'o''clock' a z", Locale::getEnglish(), status);
+ SimpleDateFormat fullFmt((UnicodeString)"EEE MMM dd HH:mm:ss.SSS zzz yyyy G", status);
+ SimpleDateFormat fmt((UnicodeString)"dd-MMM-yy h:mm:ss 'o''clock' a z", Locale::getEnglish(), status);
//DateFormat* fmt = DateFormat::createDateTimeInstance(DateFormat::MEDIUM, DateFormat::FULL, Locale::ENGLISH);
- UnicodeString* s = new UnicodeString("03-Apr-04 2:20:47 o'clock AM PST", "");
- TimeZone* defaultTZ = TimeZone::createDefault();
- TimeZone* PST = TimeZone::createTimeZone("PST");
+ UnicodeString s(u"03-Apr-04 2:20:47 o'clock AM PST");
+ LocalPointer<TimeZone> defaultTZ(TimeZone::createDefault());
+ LocalPointer<TimeZone> PST(TimeZone::createTimeZone("PST"));
int32_t defaultOffset = defaultTZ->getRawOffset();
int32_t PSTOffset = PST->getRawOffset();
int32_t hour = 2 + (defaultOffset - PSTOffset) / (60*60*1000);
@@ -396,8 +402,8 @@ DateFormatTest::TestTwoDigitYearDSTParse(void)
return;
}
- UDate d = fmt->parse(*s, status);
- logln(*s + " P> " + ((DateFormat*)fullFmt)->format(d, str));
+ UDate d = fmt.parse(s, status);
+ logln(s + " P> " + fullFmt.format(d, str));
int32_t y, m, day, hr, min, sec;
dateToFields(d, y, m, day, hr, min, sec);
hour += defaultTZ->inDaylightTime(d, status) ? 1 : 0;
@@ -407,12 +413,6 @@ DateFormatTest::TestTwoDigitYearDSTParse(void)
if (U_FAILURE(status))
errln((UnicodeString)"FAIL: " + (int32_t)status);
-
- delete s;
- delete fmt;
- delete fullFmt;
- delete PST;
- delete defaultTZ;
}
// -------------------------------------
@@ -1290,18 +1290,17 @@ DateFormatTest::TestDateFormatZone146()
int32_t DATA_length = UPRV_LENGTHOF(DATA);
for (int32_t i=0; i<DATA_length; i+=3) {
- DateFormat *fmt = new SimpleDateFormat(DATA[i+2], Locale::getEnglish(), status);
+ SimpleDateFormat fmt(DATA[i+2], Locale::getEnglish(), status);
if (U_FAILURE(status)) {
dataerrln("Unable to create SimpleDateFormat - %s", u_errorName(status));
break;
}
- fmt->setCalendar(*greenwichcalendar);
+ fmt.setCalendar(*greenwichcalendar);
UnicodeString result;
- result = fmt->format(greenwichdate, result);
+ result = fmt.format(greenwichdate, result);
logln(DATA[i] + result);
if (result != DATA[i+1])
errln("FAIL: Expected " + DATA[i+1] + ", got " + result);
- delete fmt;
}
}
//}
@@ -1856,10 +1855,10 @@ void DateFormatTest::TestNarrowNames()
const char *CA_DATA[] = {
"yyyy MM dd HH:mm:ss",
- "h:mm a", "2015 01 01 10:00:00", "10:00 a. m.",
- "h:mm a", "2015 01 01 22:00:00", "10:00 p. m.",
- "h:mm aaaaa", "2015 01 01 10:00:00", "10:00 a. m.",
- "h:mm aaaaa", "2015 01 01 22:00:00", "10:00 p. m.",
+ "h:mm a", "2015 01 01 10:00:00", "10:00 a.\\u00A0m.",
+ "h:mm a", "2015 01 01 22:00:00", "10:00 p.\\u00A0m.",
+ "h:mm aaaaa", "2015 01 01 10:00:00", "10:00 a.\\u00A0m.",
+ "h:mm aaaaa", "2015 01 01 22:00:00", "10:00 p.\\u00A0m.",
};
expectFormat(EN_DATA, UPRV_LENGTHOF(EN_DATA), Locale("en", "", ""));
@@ -3406,7 +3405,7 @@ void DateFormatTest::TestTimeZoneDisplayName()
};
UErrorCode status = U_ZERO_ERROR;
- Calendar *cal = GregorianCalendar::createInstance(status);
+ LocalPointer<Calendar> cal(GregorianCalendar::createInstance(status));
if (failure(status, "GregorianCalendar::createInstance", TRUE)) return;
SimpleDateFormat testfmt(UnicodeString("yyyy-MM-dd'T'HH:mm:ss'Z'"), status);
if (failure(status, "SimpleDateFormat constructor", TRUE)) return;
@@ -3434,13 +3433,12 @@ void DateFormatTest::TestTimeZoneDisplayName()
cal->adoptTimeZone(tz);
UnicodeString result;
FieldPosition pos(FieldPosition::DONT_CARE);
- fmt.format(*cal,result,pos);
+ fmt.format(*cal.getAlias(), result,pos);
if (result != info[4]) {
errln(info[0] + ";" + info[1] + ";" + info[2] + ";" + info[3] + " expected: '" +
info[4] + "' but got: '" + result + "'");
}
}
- delete cal;
}
void DateFormatTest::TestRoundtripWithCalendar(void) {
@@ -3590,98 +3588,94 @@ void DateFormatTest::Test6338(void)
{
UErrorCode status = U_ZERO_ERROR;
- SimpleDateFormat *fmt1 = new SimpleDateFormat(UnicodeString("y-M-d"), Locale("ar"), status);
+ SimpleDateFormat fmt1(UnicodeString(u"y-M-d"), Locale("ar"), status);
if (failure(status, "new SimpleDateFormat", TRUE)) return;
UDate dt1 = date(2008-1900, UCAL_JUNE, 10, 12, 00);
UnicodeString str1;
- str1 = fmt1->format(dt1, str1);
+ str1 = fmt1.format(dt1, str1);
logln(str1);
- UDate dt11 = fmt1->parse(str1, status);
+ UDate dt11 = fmt1.parse(str1, status);
failure(status, "fmt->parse");
UnicodeString str11;
- str11 = fmt1->format(dt11, str11);
+ str11 = fmt1.format(dt11, str11);
logln(str11);
if (str1 != str11) {
errln((UnicodeString)"FAIL: Different dates str1:" + str1
+ " str2:" + str11);
}
- delete fmt1;
/////////////////
status = U_ZERO_ERROR;
- SimpleDateFormat *fmt2 = new SimpleDateFormat(UnicodeString("y M d"), Locale("ar"), status);
+ SimpleDateFormat fmt2(UnicodeString(u"y M d"), Locale("ar"), status);
failure(status, "new SimpleDateFormat");
UDate dt2 = date(2008-1900, UCAL_JUNE, 10, 12, 00);
UnicodeString str2;
- str2 = fmt2->format(dt2, str2);
+ str2 = fmt2.format(dt2, str2);
logln(str2);
- UDate dt22 = fmt2->parse(str2, status);
+ UDate dt22 = fmt2.parse(str2, status);
failure(status, "fmt->parse");
UnicodeString str22;
- str22 = fmt2->format(dt22, str22);
+ str22 = fmt2.format(dt22, str22);
logln(str22);
if (str2 != str22) {
errln((UnicodeString)"FAIL: Different dates str1:" + str2
+ " str2:" + str22);
}
- delete fmt2;
/////////////////
status = U_ZERO_ERROR;
- SimpleDateFormat *fmt3 = new SimpleDateFormat(UnicodeString("y-M-d"), Locale("en-us"), status);
+ SimpleDateFormat fmt3(UnicodeString("y-M-d"), Locale("en-us"), status);
failure(status, "new SimpleDateFormat");
UDate dt3 = date(2008-1900, UCAL_JUNE, 10, 12, 00);
UnicodeString str3;
- str3 = fmt3->format(dt3, str3);
+ str3 = fmt3.format(dt3, str3);
logln(str3);
- UDate dt33 = fmt3->parse(str3, status);
+ UDate dt33 = fmt3.parse(str3, status);
failure(status, "fmt->parse");
UnicodeString str33;
- str33 = fmt3->format(dt33, str33);
+ str33 = fmt3.format(dt33, str33);
logln(str33);
if (str3 != str33) {
errln((UnicodeString)"FAIL: Different dates str1:" + str3
+ " str2:" + str33);
}
- delete fmt3;
/////////////////
status = U_ZERO_ERROR;
- SimpleDateFormat *fmt4 = new SimpleDateFormat(UnicodeString("y M d"), Locale("en-us"), status);
+ SimpleDateFormat fmt4(UnicodeString("y M d"), Locale("en-us"), status);
failure(status, "new SimpleDateFormat");
UDate dt4 = date(2008-1900, UCAL_JUNE, 10, 12, 00);
UnicodeString str4;
- str4 = fmt4->format(dt4, str4);
+ str4 = fmt4.format(dt4, str4);
logln(str4);
- UDate dt44 = fmt4->parse(str4, status);
+ UDate dt44 = fmt4.parse(str4, status);
failure(status, "fmt->parse");
UnicodeString str44;
- str44 = fmt4->format(dt44, str44);
+ str44 = fmt4.format(dt44, str44);
logln(str44);
if (str4 != str44) {
errln((UnicodeString)"FAIL: Different dates str1:" + str4
+ " str2:" + str44);
}
- delete fmt4;
}
@@ -3857,15 +3851,15 @@ void DateFormatTest::TestNumberAsStringParsing()
for (itemPtr = items; itemPtr->localeStr != NULL; itemPtr++ ) {
Locale locale = Locale::createFromName(itemPtr->localeStr);
UErrorCode status = U_ZERO_ERROR;
- SimpleDateFormat *formatter = new SimpleDateFormat(itemPtr->datePattern, locale, status);
- if (formatter == NULL || U_FAILURE(status)) {
+ SimpleDateFormat formatter(itemPtr->datePattern, locale, status);
+ if (U_FAILURE(status)) {
dataerrln("Unable to create SimpleDateFormat - %s", u_errorName(status));
return;
}
- formatter->setLenient(itemPtr->lenient);
- formatter->setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, itemPtr->lenient, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, itemPtr->lenient, status);
- UDate date1 = formatter->parse(itemPtr->dateString, status);
+ formatter.setLenient(itemPtr->lenient);
+ formatter.setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, itemPtr->lenient, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, itemPtr->lenient, status);
+ UDate date1 = formatter.parse(itemPtr->dateString, status);
if (U_FAILURE(status)) {
if (!itemPtr->expectFail) {
errln("FAIL, err when expected success: Locale \"" + UnicodeString(itemPtr->localeStr) + "\", lenient " + itemPtr->lenient +
@@ -3876,14 +3870,12 @@ void DateFormatTest::TestNumberAsStringParsing()
": using pattern \"" + itemPtr->datePattern + "\", did parse \"" + itemPtr->dateString + "\"." );
} else if (!itemPtr->lenient) {
UnicodeString formatted;
- formatter->format(date1, formatted);
+ formatter.format(date1, formatted);
if (formatted != itemPtr->dateString) {
errln("FAIL, mismatch formatting parsed date: Locale \"" + UnicodeString(itemPtr->localeStr) + "\", lenient " + itemPtr->lenient +
": using pattern \"" + itemPtr->datePattern + "\", did parse \"" + itemPtr->dateString + "\", formatted result \"" + formatted + "\".");
}
}
-
- delete formatter;
}
}
@@ -3935,20 +3927,19 @@ void DateFormatTest::TestISOEra() {
void DateFormatTest::TestFormalChineseDate() {
UErrorCode status = U_ZERO_ERROR;
- UnicodeString pattern ("y\\u5e74M\\u6708d\\u65e5", -1, US_INV );
- pattern = pattern.unescape();
- UnicodeString override ("y=hanidec;M=hans;d=hans", -1, US_INV );
+ UnicodeString pattern(u"y\u5e74M\u6708d\u65e5");
+ UnicodeString numsys_override(u"y=hanidec;M=hans;d=hans");
// create formatter
- SimpleDateFormat *sdf = new SimpleDateFormat(pattern,override,Locale::getChina(),status);
- if (failure(status, "new SimpleDateFormat with override", TRUE)) {
+ SimpleDateFormat sdf(pattern, numsys_override, Locale::getChina(),status);
+ if (failure(status, "new SimpleDateFormat with override", true)) {
return;
}
UDate thedate = date(2009-1900, UCAL_JULY, 28);
FieldPosition pos(FieldPosition::DONT_CARE);
UnicodeString result;
- sdf->format(thedate,result,pos);
+ sdf.format(thedate,result,pos);
UnicodeString expected = "\\u4e8c\\u3007\\u3007\\u4e5d\\u5e74\\u4e03\\u6708\\u4e8c\\u5341\\u516b\\u65e5";
expected = expected.unescape();
@@ -3956,37 +3947,34 @@ void DateFormatTest::TestFormalChineseDate() {
dataerrln((UnicodeString)"FAIL: -> " + result + " expected -> " + expected);
}
- UDate parsedate = sdf->parse(expected,status);
+ UDate parsedate = sdf.parse(expected,status);
if ( parsedate != thedate ) {
UnicodeString pat1 ("yyyy-MM-dd'T'HH:mm:ss'Z'", -1, US_INV );
- SimpleDateFormat *usf = new SimpleDateFormat(pat1,Locale::getEnglish(),status);
+ SimpleDateFormat usf(pat1, Locale::getEnglish(), status);
UnicodeString parsedres,expres;
- usf->format(parsedate,parsedres,pos);
- usf->format(thedate,expres,pos);
+ usf.format(parsedate,parsedres,pos);
+ usf.format(thedate,expres,pos);
dataerrln((UnicodeString)"FAIL: parsed -> " + parsedres + " expected -> " + expres);
- delete usf;
}
- delete sdf;
}
// Test case for #8675
// Incorrect parse offset with stand alone GMT string on 2nd or later iteration.
void DateFormatTest::TestStandAloneGMTParse() {
UErrorCode status = U_ZERO_ERROR;
- SimpleDateFormat *sdf = new SimpleDateFormat("ZZZZ", Locale(""), status);
+ SimpleDateFormat sdf("ZZZZ", Locale(""), status);
if (U_SUCCESS(status)) {
- UnicodeString inText("GMT$$$");
+ UnicodeString inText(u"GMT$$$");
for (int32_t i = 0; i < 10; i++) {
ParsePosition pos(0);
- sdf->parse(inText, pos);
+ sdf.parse(inText, pos);
if (pos.getIndex() != 3) {
errln((UnicodeString)"FAIL: Incorrect output parse position: actual=" + pos.getIndex() + " expected=3");
}
}
- delete sdf;
} else {
dataerrln("Unable to create SimpleDateFormat - %s", u_errorName(status));
}
@@ -4011,7 +3999,7 @@ void DateFormatTest::TestParsePosition() {
for (int32_t i = 0; TestData[i][0]; i++) {
UErrorCode status = U_ZERO_ERROR;
- SimpleDateFormat *sdf = new SimpleDateFormat(UnicodeString(TestData[i][0]), status);
+ SimpleDateFormat sdf(UnicodeString(TestData[i][0]), status);
if (failure(status, "new SimpleDateFormat", TRUE)) return;
int32_t startPos, resPos;
@@ -4029,14 +4017,12 @@ void DateFormatTest::TestParsePosition() {
ParsePosition pos(startPos);
//UDate d = sdf->parse(input, pos);
- (void)sdf->parse(input, pos);
+ (void)sdf.parse(input, pos);
if (pos.getIndex() != resPos) {
errln(UnicodeString("FAIL: Parsing [") + input + "] with pattern [" + TestData[i][0] + "] returns position - "
+ pos.getIndex() + ", expected - " + resPos);
}
-
- delete sdf;
}
}
@@ -4308,20 +4294,20 @@ void DateFormatTest::TestNonGregoFmtParse()
const TestNonGregoItem * itemPtr;
for (itemPtr = items; itemPtr->locale != NULL; itemPtr++) {
Locale locale = Locale::createFromName(itemPtr->locale);
- DateFormat * dfmt = NULL;
+ LocalPointer<DateFormat> dfmt;
UErrorCode status = U_ZERO_ERROR;
if (itemPtr->style != DateFormat::kNone) {
- dfmt = DateFormat::createDateInstance(itemPtr->style, locale);
+ dfmt.adoptInstead(DateFormat::createDateInstance(itemPtr->style, locale));
} else {
- dfmt = new SimpleDateFormat(itemPtr->pattern, locale, status);
+ dfmt.adoptInstead(new SimpleDateFormat(itemPtr->pattern, locale, status));
}
if (U_FAILURE(status)) {
dataerrln("new SimpleDateFormat fails for locale %s", itemPtr->locale);
- } else if (dfmt == NULL) {
+ } else if (!dfmt.isValid()) {
dataerrln("DateFormat::createDateInstance fails for locale %s", itemPtr->locale);
} else {
- Calendar * cal = (dfmt->getCalendar())->clone();
- if (cal == NULL) {
+ LocalPointer<Calendar>cal((dfmt->getCalendar())->clone());
+ if (!cal.isValid()) {
dataerrln("(DateFormat::getCalendar)->clone() fails for locale %s", itemPtr->locale);
} else {
const CalAndFmtTestItem * caftItemPtr;
@@ -4357,9 +4343,7 @@ void DateFormatTest::TestNonGregoFmtParse()
}
}
}
- delete cal;
}
- delete dfmt;
}
}
}
@@ -4758,6 +4742,10 @@ void DateFormatTest::TestNumberFormatOverride() {
assertSuccess("SimpleDateFormat with pattern MM d", status);
NumberFormat* overrideNF = NumberFormat::createInstance(Locale::createFromName("zh@numbers=hanidays"),status);
assertSuccess("NumberFormat zh@numbers=hanidays", status);
+ if (U_FAILURE(status)) {
+ status = U_ZERO_ERROR;
+ continue;
+ }
if (fields == (UnicodeString) "") { // use the one w/o fields
fmt->adoptNumberFormat(overrideNF);
@@ -4785,7 +4773,7 @@ void DateFormatTest::TestNumberFormatOverride() {
FieldPosition pos(FieldPosition::DONT_CARE);
fmt->format(test_date,result, pos);
- UnicodeString expected = ((UnicodeString)DATA[i][1]).unescape();;
+ UnicodeString expected = ((UnicodeString)DATA[i][1]).unescape();
if (result != expected)
errln("FAIL: Expected " + expected + " get: " + result);
@@ -5243,7 +5231,7 @@ void DateFormatTest::TestDayPeriodWithLocales() {
sdf.setTimeZone(*tz);
sdf.applyPattern(UnicodeString("hh:mm:ss BBBB"));
- assertEquals("hh:mm:ss BBBB | 01:00:00 | es_CO", UnicodeString("01:00:00 de la ma\\u00F1ana").unescape(),
+ assertEquals("hh:mm:ss BBBB | 01:00:00 | es_CO", u"01:00:00 de la mañana",
sdf.format(k010000, out.remove()));
sdf = SimpleDateFormat(UnicodeString(), Locale("es"), errorCode);
@@ -5553,6 +5541,20 @@ void DateFormatTest::TestParseRegression13744() {
assertEquals("Error index", inDate.length(), pos.getErrorIndex());
}
+void DateFormatTest::TestAdoptCalendarLeak() {
+ UErrorCode status = U_ZERO_ERROR;
+ // This test relies on the locale fullName exceeding ULOC_FULLNAME_CAPACITY
+ // in order for setKeywordValue to fail.
+ SimpleDateFormat sdf(
+ "d.M.y",
+ Locale("de__POSIX@colstrength=primary;currency=eur;em=default;"
+ "hours=h23;lb=strict;lw=normal;measure=metric;numbers=latn;"
+ "rg=atzzzz;sd=atat1;ss=none;timezone=Europe/Vienna"),
+ status);
+ ASSERT_OK(status);
+ sdf.adoptCalendar(Calendar::createInstance(status));
+}
+
#endif /* #if !UCONFIG_NO_FORMATTING */
//eof
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/dtfmttst.h b/Build/source/libs/icu/icu-src/source/test/intltest/dtfmttst.h
index efc56732494..fd07b5ae0e3 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/dtfmttst.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/dtfmttst.h
@@ -262,6 +262,7 @@ public:
void TestMinuteSecondFieldsInOddPlaces();
void TestDayPeriodParsing();
void TestParseRegression13744();
+ void TestAdoptCalendarLeak();
private:
UBool showParse(DateFormat &format, const UnicodeString &formattedString);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/dtifmtts.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/dtifmtts.cpp
index c5b96310833..e2a9faa25a0 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/dtifmtts.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/dtifmtts.cpp
@@ -25,6 +25,7 @@
#include "cstr.h"
#include "cstring.h"
#include "simplethread.h"
+#include "japancal.h"
#include "unicode/gregocal.h"
#include "unicode/dtintrv.h"
#include "unicode/dtitvinf.h"
@@ -55,6 +56,7 @@ void DateIntervalFormatTest::runIndexedTest( int32_t index, UBool exec, const ch
TESTCASE(7, testTicket11985);
TESTCASE(8, testTicket11669);
TESTCASE(9, testTicket12065);
+ TESTCASE(10, testFormattedDateInterval);
default: name = ""; break;
}
}
@@ -130,7 +132,7 @@ void DateIntervalFormatTest::testAPI() {
status = U_ZERO_ERROR;
logln("Testing DateIntervalFormat clone");
- DateIntervalFormat* another = (DateIntervalFormat*)dtitvfmt->clone();
+ DateIntervalFormat* another = dtitvfmt->clone();
if ( (*another) != (*dtitvfmt) ) {
dataerrln("%s:%d ERROR: clone failed", __FILE__, __LINE__);
}
@@ -222,7 +224,7 @@ void DateIntervalFormatTest::testAPI() {
}
status = U_ZERO_ERROR;
- DateFormat* nonConstFmt = (DateFormat*)fmt->clone();
+ DateFormat* nonConstFmt = fmt->clone();
dtitvfmt->adoptDateFormat(nonConstFmt, status);
anotherFmt = dtitvfmt->getDateFormat();
if ( (*fmt) != (*anotherFmt) || U_FAILURE(status) ) {
@@ -248,7 +250,7 @@ void DateIntervalFormatTest::testAPI() {
logln("Testing DateIntervalFormat constructor and assigment operator");
status = U_ZERO_ERROR;
- DateFormat* constFmt = (constFmt*)dtitvfmt->getDateFormat()->clone();
+ DateFormat* constFmt = dtitvfmt->getDateFormat()->clone();
inf = dtitvfmt->getDateIntervalInfo()->clone();
@@ -405,640 +407,666 @@ void DateIntervalFormatTest::testAPI() {
void DateIntervalFormatTest::testFormat() {
// first item is date pattern
// followed by a group of locale/from_data/to_data/skeleton/interval_data
+ // Note that from_data/to_data are specified using era names from root, for the calendar specified by locale.
const char* DATA[] = {
- "yyyy MM dd HH:mm:ss",
+ "GGGGG y MM dd HH:mm:ss", // pattern for from_data/to_data
// test root
- "root", "2007 11 10 10:10:10", "2007 12 10 10:10:10", "yM", "2007-11 \\u2013 2007-12",
+ "root", "CE 2007 11 10 10:10:10", "CE 2007 12 10 10:10:10", "yM", "2007-11 \\u2013 2007-12",
// test 'H' and 'h', using availableFormat in fallback
- "en", "2007 11 10 10:10:10", "2007 11 10 15:10:10", "Hms", "10:10:10 \\u2013 15:10:10",
- "en", "2007 11 10 10:10:10", "2007 11 10 15:10:10", "hms", "10:10:10 AM \\u2013 3:10:10 PM",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 10 15:10:10", "Hms", "10:10:10 \\u2013 15:10:10",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 10 15:10:10", "hms", "10:10:10 AM \\u2013 3:10:10 PM",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMM", "October 2007 \\u2013 October 2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMM", "Oct 2007 \\u2013 Oct 2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "MMMM", "October 2007 \\u2013 October 2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "MMM", "Oct 2007 \\u2013 Oct 2008",
// test skeleton with both date and time
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMyhm", "Nov 10, 2007, 10:10 AM \\u2013 Nov 20, 2007, 10:10 AM",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dMMMyhm", "Nov 10, 2007, 10:10 AM \\u2013 Nov 20, 2007, 10:10 AM",
- "en", "2007 11 10 10:10:10", "2007 11 10 11:10:10", "dMMMyhm", "Nov 10, 2007, 10:10 \\u2013 11:10 AM",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 10 11:10:10", "dMMMyhm", "Nov 10, 2007, 10:10 \\u2013 11:10 AM",
- "en", "2007 11 10 10:10:10", "2007 11 10 11:10:10", "hms", "10:10:10 AM \\u2013 11:10:10 AM",
- "en", "2007 11 10 10:10:10", "2007 11 10 11:10:10", "Hms", "10:10:10 \\u2013 11:10:10",
- "en", "2007 11 10 20:10:10", "2007 11 10 21:10:10", "Hms", "20:10:10 \\u2013 21:10:10",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 10 11:10:10", "hms", "10:10:10 AM \\u2013 11:10:10 AM",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 10 11:10:10", "Hms", "10:10:10 \\u2013 11:10:10",
+ "en", "CE 2007 11 10 20:10:10", "CE 2007 11 10 21:10:10", "Hms", "20:10:10 \\u2013 21:10:10",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMMy", "Wednesday, October 10, 2007 \\u2013 Friday, October 10, 2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EEEEdMMMMy", "Wednesday, October 10, 2007 \\u2013 Friday, October 10, 2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMMy", "October 10, 2007 \\u2013 October 10, 2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "dMMMMy", "October 10, 2007 \\u2013 October 10, 2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMM", "October 10, 2007 \\u2013 October 10, 2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "dMMMM", "October 10, 2007 \\u2013 October 10, 2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMMy", "October 2007 \\u2013 October 2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "MMMMy", "October 2007 \\u2013 October 2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMM", "Wednesday, October 10, 2007 \\u2013 Friday, October 10, 2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EEEEdMMMM", "Wednesday, October 10, 2007 \\u2013 Friday, October 10, 2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMMMy", "Wed, Oct 10, 2007 \\u2013 Fri, Oct 10, 2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EdMMMy", "Wed, Oct 10, 2007 \\u2013 Fri, Oct 10, 2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMy", "Oct 10, 2007 \\u2013 Oct 10, 2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "dMMMy", "Oct 10, 2007 \\u2013 Oct 10, 2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMM", "Oct 10, 2007 \\u2013 Oct 10, 2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "dMMM", "Oct 10, 2007 \\u2013 Oct 10, 2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMy", "Oct 2007 \\u2013 Oct 2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "MMMy", "Oct 2007 \\u2013 Oct 2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMMM", "Wed, Oct 10, 2007 \\u2013 Fri, Oct 10, 2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EdMMM", "Wed, Oct 10, 2007 \\u2013 Fri, Oct 10, 2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMy", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EdMy", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMy", "10/10/2007 \\u2013 10/10/2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "dMy", "10/10/2007 \\u2013 10/10/2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dM", "10/10/2007 \\u2013 10/10/2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "dM", "10/10/2007 \\u2013 10/10/2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "My", "10/2007 \\u2013 10/2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "My", "10/2007 \\u2013 10/2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdM", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EdM", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "d", "10/10/2007 \\u2013 10/10/2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "d", "10/10/2007 \\u2013 10/10/2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Ed", "10 Wed \\u2013 10 Fri",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "Ed", "10 Wed \\u2013 10 Fri",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "y", "2007 \\u2013 2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "y", "2007 \\u2013 2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "M", "10/2007 \\u2013 10/2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "M", "10/2007 \\u2013 10/2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hm", "10/10/2007, 10:10 AM \\u2013 10/10/2008, 10:10 AM",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Hm", "10/10/2007, 10:10 \\u2013 10/10/2008, 10:10",
- "en", "2007 10 10 20:10:10", "2008 10 10 20:10:10", "Hm", "10/10/2007, 20:10 \\u2013 10/10/2008, 20:10",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "hm", "10/10/2007, 10:10 AM \\u2013 10/10/2008, 10:10 AM",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "Hm", "10/10/2007, 10:10 \\u2013 10/10/2008, 10:10",
+ "en", "CE 2007 10 10 20:10:10", "CE 2008 10 10 20:10:10", "Hm", "10/10/2007, 20:10 \\u2013 10/10/2008, 20:10",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hmv", "10/10/2007, 10:10 AM PT \\u2013 10/10/2008, 10:10 AM PT",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "hmv", "10/10/2007, 10:10 AM PT \\u2013 10/10/2008, 10:10 AM PT",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hmz", "10/10/2007, 10:10 AM PDT \\u2013 10/10/2008, 10:10 AM PDT",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "hmz", "10/10/2007, 10:10 AM PDT \\u2013 10/10/2008, 10:10 AM PDT",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "h", "10/10/2007, 10 AM \\u2013 10/10/2008, 10 AM",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "h", "10/10/2007, 10 AM \\u2013 10/10/2008, 10 AM",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hv", "10/10/2007, 10 AM PT \\u2013 10/10/2008, 10 AM PT",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "hv", "10/10/2007, 10 AM PT \\u2013 10/10/2008, 10 AM PT",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hz", "10/10/2007, 10 AM PDT \\u2013 10/10/2008, 10 AM PDT",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "hz", "10/10/2007, 10 AM PDT \\u2013 10/10/2008, 10 AM PDT",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEddMMyyyy", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EEddMMyyyy", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EddMMy", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EddMMy", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hhmm", "10/10/2007, 10:10 AM \\u2013 10/10/2008, 10:10 AM",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "hhmm", "10/10/2007, 10:10 AM \\u2013 10/10/2008, 10:10 AM",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hhmmzz", "10/10/2007, 10:10 AM PDT \\u2013 10/10/2008, 10:10 AM PDT",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "hhmmzz", "10/10/2007, 10:10 AM PDT \\u2013 10/10/2008, 10:10 AM PDT",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hms", "10/10/2007, 10:10:10 AM \\u2013 10/10/2008, 10:10:10 AM",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "hms", "10/10/2007, 10:10:10 AM \\u2013 10/10/2008, 10:10:10 AM",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMMMy", "O 10, 2007 \\u2013 O 10, 2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "dMMMMMy", "O 10, 2007 \\u2013 O 10, 2008",
- "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEEdM", "W, 10/10/2007 \\u2013 F, 10/10/2008",
+ "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EEEEEdM", "W, 10/10/2007 \\u2013 F, 10/10/2008",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMMy", "Wednesday, October 10 \\u2013 Saturday, November 10, 2007",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EEEEdMMMMy", "Wednesday, October 10 \\u2013 Saturday, November 10, 2007",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMMy", "October 10 \\u2013 November 10, 2007",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "dMMMMy", "October 10 \\u2013 November 10, 2007",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMM", "October 10 \\u2013 November 10",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "dMMMM", "October 10 \\u2013 November 10",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMMy", "October \\u2013 November 2007",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "MMMMy", "October \\u2013 November 2007",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMM", "Wednesday, October 10 \\u2013 Saturday, November 10",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EEEEdMMMM", "Wednesday, October 10 \\u2013 Saturday, November 10",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMMMy", "Wed, Oct 10 \\u2013 Sat, Nov 10, 2007",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EdMMMy", "Wed, Oct 10 \\u2013 Sat, Nov 10, 2007",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMy", "Oct 10 \\u2013 Nov 10, 2007",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "dMMMy", "Oct 10 \\u2013 Nov 10, 2007",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMM", "Oct 10 \\u2013 Nov 10",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "dMMM", "Oct 10 \\u2013 Nov 10",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMy", "Oct \\u2013 Nov 2007",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "MMMy", "Oct \\u2013 Nov 2007",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMMM", "Wed, Oct 10 \\u2013 Sat, Nov 10",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EdMMM", "Wed, Oct 10 \\u2013 Sat, Nov 10",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMy", "Wed, 10/10/2007 \\u2013 Sat, 11/10/2007",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EdMy", "Wed, 10/10/2007 \\u2013 Sat, 11/10/2007",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMy", "10/10/2007 \\u2013 11/10/2007",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "dMy", "10/10/2007 \\u2013 11/10/2007",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "My", "10/2007 \\u2013 11/2007",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "My", "10/2007 \\u2013 11/2007",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdM", "Wed, 10/10 \\u2013 Sat, 11/10",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EdM", "Wed, 10/10 \\u2013 Sat, 11/10",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "d", "10/10 \\u2013 11/10",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "d", "10/10 \\u2013 11/10",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "Ed", "10 Wed \\u2013 10 Sat",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "Ed", "10 Wed \\u2013 10 Sat",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "y", "2007",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "y", "2007",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "M", "10 \\u2013 11",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "M", "10 \\u2013 11",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMM", "Oct \\u2013 Nov",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "MMM", "Oct \\u2013 Nov",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMM", "October \\u2013 November",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "MMMM", "October \\u2013 November",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hm", "10/10/2007, 10:10 AM \\u2013 11/10/2007, 10:10 AM",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "Hm", "10/10/2007, 10:10 \\u2013 11/10/2007, 10:10",
- "en", "2007 10 10 20:10:10", "2007 11 10 20:10:10", "Hm", "10/10/2007, 20:10 \\u2013 11/10/2007, 20:10",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "hm", "10/10/2007, 10:10 AM \\u2013 11/10/2007, 10:10 AM",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "Hm", "10/10/2007, 10:10 \\u2013 11/10/2007, 10:10",
+ "en", "CE 2007 10 10 20:10:10", "CE 2007 11 10 20:10:10", "Hm", "10/10/2007, 20:10 \\u2013 11/10/2007, 20:10",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hmv", "10/10/2007, 10:10 AM PT \\u2013 11/10/2007, 10:10 AM PT",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "hmv", "10/10/2007, 10:10 AM PT \\u2013 11/10/2007, 10:10 AM PT",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hmz", "10/10/2007, 10:10 AM PDT \\u2013 11/10/2007, 10:10 AM PST",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "hmz", "10/10/2007, 10:10 AM PDT \\u2013 11/10/2007, 10:10 AM PST",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "h", "10/10/2007, 10 AM \\u2013 11/10/2007, 10 AM",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "h", "10/10/2007, 10 AM \\u2013 11/10/2007, 10 AM",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hv", "10/10/2007, 10 AM PT \\u2013 11/10/2007, 10 AM PT",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "hv", "10/10/2007, 10 AM PT \\u2013 11/10/2007, 10 AM PT",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hz", "10/10/2007, 10 AM PDT \\u2013 11/10/2007, 10 AM PST",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "hz", "10/10/2007, 10 AM PDT \\u2013 11/10/2007, 10 AM PST",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEddMMyyyy", "Wed, 10/10/2007 \\u2013 Sat, 11/10/2007",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EEddMMyyyy", "Wed, 10/10/2007 \\u2013 Sat, 11/10/2007",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EddMMy", "Wed, 10/10/2007 \\u2013 Sat, 11/10/2007",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EddMMy", "Wed, 10/10/2007 \\u2013 Sat, 11/10/2007",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hhmmzz", "10/10/2007, 10:10 AM PDT \\u2013 11/10/2007, 10:10 AM PST",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "hhmmzz", "10/10/2007, 10:10 AM PDT \\u2013 11/10/2007, 10:10 AM PST",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hms", "10/10/2007, 10:10:10 AM \\u2013 11/10/2007, 10:10:10 AM",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "hms", "10/10/2007, 10:10:10 AM \\u2013 11/10/2007, 10:10:10 AM",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMMMy", "O 10 \\u2013 N 10, 2007",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "dMMMMMy", "O 10 \\u2013 N 10, 2007",
- "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEEdM", "W, 10/10 \\u2013 S, 11/10",
+ "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EEEEEdM", "W, 10/10 \\u2013 S, 11/10",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMMy", "Saturday, November 10 \\u2013 Tuesday, November 20, 2007",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EEEEdMMMMy", "Saturday, November 10 \\u2013 Tuesday, November 20, 2007",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMMy", "November 10 \\u2013 20, 2007",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dMMMMy", "November 10 \\u2013 20, 2007",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMM", "November 10 \\u2013 20",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dMMMM", "November 10 \\u2013 20",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMM", "Saturday, November 10 \\u2013 Tuesday, November 20",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EEEEdMMMM", "Saturday, November 10 \\u2013 Tuesday, November 20",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMMMy", "Sat, Nov 10 \\u2013 Tue, Nov 20, 2007",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EdMMMy", "Sat, Nov 10 \\u2013 Tue, Nov 20, 2007",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMy", "Nov 10 \\u2013 20, 2007",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dMMMy", "Nov 10 \\u2013 20, 2007",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMM", "Nov 10 \\u2013 20",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dMMM", "Nov 10 \\u2013 20",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMy", "Nov 2007",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "MMMy", "Nov 2007",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMMM", "Sat, Nov 10 \\u2013 Tue, Nov 20",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EdMMM", "Sat, Nov 10 \\u2013 Tue, Nov 20",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "Sat, 11/10/2007 \\u2013 Tue, 11/20/2007",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EdMy", "Sat, 11/10/2007 \\u2013 Tue, 11/20/2007",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMy", "11/10/2007 \\u2013 11/20/2007",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dMy", "11/10/2007 \\u2013 11/20/2007",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "11/10 \\u2013 11/20",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dM", "11/10 \\u2013 11/20",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "11/2007",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "My", "11/2007",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdM", "Sat, 11/10 \\u2013 Tue, 11/20",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EdM", "Sat, 11/10 \\u2013 Tue, 11/20",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "d", "10 \\u2013 20",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "d", "10 \\u2013 20",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Ed", "10 Sat \\u2013 20 Tue",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "Ed", "10 Sat \\u2013 20 Tue",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "y", "2007",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "y", "2007",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "M", "11",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "M", "11",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMM", "Nov",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "MMM", "Nov",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMM", "November",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "MMMM", "November",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hm", "11/10/2007, 10:10 AM \\u2013 11/20/2007, 10:10 AM",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Hm", "11/10/2007, 10:10 \\u2013 11/20/2007, 10:10",
- "en", "2007 11 10 20:10:10", "2007 11 20 20:10:10", "Hm", "11/10/2007, 20:10 \\u2013 11/20/2007, 20:10",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hm", "11/10/2007, 10:10 AM \\u2013 11/20/2007, 10:10 AM",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "Hm", "11/10/2007, 10:10 \\u2013 11/20/2007, 10:10",
+ "en", "CE 2007 11 10 20:10:10", "CE 2007 11 20 20:10:10", "Hm", "11/10/2007, 20:10 \\u2013 11/20/2007, 20:10",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmv", "11/10/2007, 10:10 AM PT \\u2013 11/20/2007, 10:10 AM PT",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hmv", "11/10/2007, 10:10 AM PT \\u2013 11/20/2007, 10:10 AM PT",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmz", "11/10/2007, 10:10 AM PST \\u2013 11/20/2007, 10:10 AM PST",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hmz", "11/10/2007, 10:10 AM PST \\u2013 11/20/2007, 10:10 AM PST",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "h", "11/10/2007, 10 AM \\u2013 11/20/2007, 10 AM",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "h", "11/10/2007, 10 AM \\u2013 11/20/2007, 10 AM",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hv", "11/10/2007, 10 AM PT \\u2013 11/20/2007, 10 AM PT",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hv", "11/10/2007, 10 AM PT \\u2013 11/20/2007, 10 AM PT",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hz", "11/10/2007, 10 AM PST \\u2013 11/20/2007, 10 AM PST",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hz", "11/10/2007, 10 AM PST \\u2013 11/20/2007, 10 AM PST",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEddMMyyyy", "Sat, 11/10/2007 \\u2013 Tue, 11/20/2007",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EEddMMyyyy", "Sat, 11/10/2007 \\u2013 Tue, 11/20/2007",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EddMMy", "Sat, 11/10/2007 \\u2013 Tue, 11/20/2007",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EddMMy", "Sat, 11/10/2007 \\u2013 Tue, 11/20/2007",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hhmm", "11/10/2007, 10:10 AM \\u2013 11/20/2007, 10:10 AM",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hhmm", "11/10/2007, 10:10 AM \\u2013 11/20/2007, 10:10 AM",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hhmmzz", "11/10/2007, 10:10 AM PST \\u2013 11/20/2007, 10:10 AM PST",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hhmmzz", "11/10/2007, 10:10 AM PST \\u2013 11/20/2007, 10:10 AM PST",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hms", "11/10/2007, 10:10:10 AM \\u2013 11/20/2007, 10:10:10 AM",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Hms", "11/10/2007, 10:10:10 \\u2013 11/20/2007, 10:10:10",
- "en", "2007 11 10 20:10:10", "2007 11 20 20:10:10", "Hms", "11/10/2007, 20:10:10 \\u2013 11/20/2007, 20:10:10",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hms", "11/10/2007, 10:10:10 AM \\u2013 11/20/2007, 10:10:10 AM",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "Hms", "11/10/2007, 10:10:10 \\u2013 11/20/2007, 10:10:10",
+ "en", "CE 2007 11 10 20:10:10", "CE 2007 11 20 20:10:10", "Hms", "11/10/2007, 20:10:10 \\u2013 11/20/2007, 20:10:10",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMMMy", "N 10 \\u2013 20, 2007",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dMMMMMy", "N 10 \\u2013 20, 2007",
- "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEEdM", "S, 11/10 \\u2013 T, 11/20",
+ "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EEEEEdM", "S, 11/10 \\u2013 T, 11/20",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMMy", "Wednesday, January 10, 2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EEEEdMMMMy", "Wednesday, January 10, 2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMMy", "January 10, 2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "dMMMMy", "January 10, 2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMM", "January 10",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "dMMMM", "January 10",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMMy", "January 2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "MMMMy", "January 2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMM", "Wednesday, January 10",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EEEEdMMMM", "Wednesday, January 10",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EdMMMy", "Wed, Jan 10, 2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EdMMMy", "Wed, Jan 10, 2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMy", "Jan 10, 2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "dMMMy", "Jan 10, 2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMM", "Jan 10",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "dMMM", "Jan 10",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMy", "Jan 2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "MMMy", "Jan 2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EdMMM", "Wed, Jan 10",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EdMMM", "Wed, Jan 10",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMy", "1/10/2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "dMy", "1/10/2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dM", "1/10",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "dM", "1/10",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "My", "1/2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "My", "1/2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EdM", "Wed, 1/10",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EdM", "Wed, 1/10",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "d", "10",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "d", "10",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Ed", "10 Wed",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "Ed", "10 Wed",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "y", "2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "y", "2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "M", "1",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "M", "1",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMM", "Jan",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "MMM", "Jan",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMM", "January",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "MMMM", "January",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hm", "10:00 AM \\u2013 2:10 PM",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Hm", "10:00 \\u2013 14:10",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hm", "10:00 AM \\u2013 2:10 PM",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "Hm", "10:00 \\u2013 14:10",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmv", "10:00 AM \\u2013 2:10 PM PT",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hmv", "10:00 AM \\u2013 2:10 PM PT",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmz", "10:00 AM \\u2013 2:10 PM PST",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hmz", "10:00 AM \\u2013 2:10 PM PST",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "10 AM \\u2013 2 PM",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "H", "10 \\u2013 14",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "h", "10 AM \\u2013 2 PM",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "H", "10 \\u2013 14",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hz", "10 AM \\u2013 2 PM PST",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hz", "10 AM \\u2013 2 PM PST",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEddMMyyyy", "Wed, 01/10/2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EEddMMyyyy", "Wed, 01/10/2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EddMMy", "Wed, 01/10/2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EddMMy", "Wed, 01/10/2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hhmm", "10:00 AM \\u2013 2:10 PM",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "HHmm", "10:00 \\u2013 14:10",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hhmm", "10:00 AM \\u2013 2:10 PM",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "HHmm", "10:00 \\u2013 14:10",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hhmmzz", "10:00 AM \\u2013 2:10 PM PST",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hhmmzz", "10:00 AM \\u2013 2:10 PM PST",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hms", "10:00:10 AM \\u2013 2:10:10 PM",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Hms", "10:00:10 \\u2013 14:10:10",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hms", "10:00:10 AM \\u2013 2:10:10 PM",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "Hms", "10:00:10 \\u2013 14:10:10",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMMMy", "J 10, 2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "dMMMMMy", "J 10, 2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEEdM", "W, 1/10",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMMy", "January 10, 2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EEEEEdM", "W, 1/10",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "dMMMMy", "January 10, 2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMM", "January 10",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "dMMMM", "January 10",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "MMMMy", "January 2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "MMMMy", "January 2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EEEEdMMMM", "Wednesday, January 10",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "EEEEdMMMM", "Wednesday, January 10",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdMMMy", "Wed, Jan 10, 2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "EdMMMy", "Wed, Jan 10, 2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMy", "Jan 10, 2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "dMMMy", "Jan 10, 2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMM", "Jan 10",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "dMMM", "Jan 10",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdMMM", "Wed, Jan 10",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "EdMMM", "Wed, Jan 10",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdMy", "Wed, 1/10/2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "EdMy", "Wed, 1/10/2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMy", "1/10/2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "dMy", "1/10/2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "My", "1/2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "My", "1/2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdM", "Wed, 1/10",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "EdM", "Wed, 1/10",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "d", "10",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "d", "10",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "y", "2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "y", "2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "M", "1",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "M", "1",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hm", "10:00 \\u2013 10:20 AM",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "Hm", "10:00 \\u2013 10:20",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hm", "10:00 \\u2013 10:20 AM",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "Hm", "10:00 \\u2013 10:20",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmz", "10:00 \\u2013 10:20 AM PST",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hmz", "10:00 \\u2013 10:20 AM PST",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hv", "10 AM PT",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hv", "10 AM PT",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EddMMy", "Wed, 01/10/2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "EddMMy", "Wed, 01/10/2007",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hhmm", "10:00 \\u2013 10:20 AM",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "HHmm", "10:00 \\u2013 10:20",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hhmm", "10:00 \\u2013 10:20 AM",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "HHmm", "10:00 \\u2013 10:20",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hhmmzz", "10:00 \\u2013 10:20 AM PST",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hhmmzz", "10:00 \\u2013 10:20 AM PST",
- "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMMMy", "J 10, 2007",
+ "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "dMMMMMy", "J 10, 2007",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEdMMMMy", "Wednesday, January 10, 2007",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "EEEEdMMMMy", "Wednesday, January 10, 2007",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMMMy", "January 10, 2007",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "dMMMMy", "January 10, 2007",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "MMMMy", "January 2007",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "MMMMy", "January 2007",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEdMMMM", "Wednesday, January 10",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "EEEEdMMMM", "Wednesday, January 10",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMMy", "Jan 10, 2007",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "dMMMy", "Jan 10, 2007",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMM", "Jan 10",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "dMMM", "Jan 10",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EdMMM", "Wed, Jan 10",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "EdMMM", "Wed, Jan 10",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EdMy", "Wed, 1/10/2007",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "EdMy", "Wed, 1/10/2007",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMy", "1/10/2007",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "dMy", "1/10/2007",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "My", "1/2007",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "My", "1/2007",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EdM", "Wed, 1/10",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "EdM", "Wed, 1/10",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "d", "10",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "d", "10",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "y", "2007",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "y", "2007",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "M", "1",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "M", "1",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "MMMM", "January",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "MMMM", "January",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hm", "10:10 AM",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "Hm", "10:10",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hm", "10:10 AM",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "Hm", "10:10",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmz", "10:10 AM PST",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hmz", "10:10 AM PST",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "h", "10 AM",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "h", "10 AM",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hv", "10 AM PT",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hv", "10 AM PT",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEddMMyyyy", "Wed, 01/10/2007",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "EEddMMyyyy", "Wed, 01/10/2007",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hhmm", "10:10 AM",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "HHmm", "10:10",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hhmm", "10:10 AM",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "HHmm", "10:10",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hhmmzz", "10:10 AM PST",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hhmmzz", "10:10 AM PST",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMMMMy", "J 10, 2007",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "dMMMMMy", "J 10, 2007",
- "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEEdM", "W, 1/10",
+ "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "EEEEEdM", "W, 1/10",
- "zh", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMMy", "2007\\u5e7410\\u670810\\u65e5\\u661f\\u671f\\u4e09\\u81f32008\\u5e7410\\u670810\\u65e5\\u661f\\u671f\\u4e94",
+ "zh", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EEEEdMMMMy", "2007\\u5e7410\\u670810\\u65e5\\u661f\\u671f\\u4e09\\u81f32008\\u5e7410\\u670810\\u65e5\\u661f\\u671f\\u4e94",
- "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMMy", "2007\\u5e7410\\u670810\\u65e5\\u81f311\\u670810\\u65e5",
+ "zh", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "dMMMMy", "2007\\u5e7410\\u670810\\u65e5\\u81f311\\u670810\\u65e5",
- "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMMy", "2007\\u5e7410\\u6708\\u81f311\\u6708",
+ "zh", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "MMMMy", "2007\\u5e7410\\u6708\\u81f311\\u6708",
- "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hmv", "2007/10/10 \\u6D1B\\u6749\\u77F6\\u65F6\\u95F4 \\u4E0A\\u534810:10 \\u2013 2007/11/10 \\u6D1B\\u6749\\u77F6\\u65F6\\u95F4 \\u4E0A\\u534810:10",
+ "zh", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "hmv", "2007/10/10 \\u6D1B\\u6749\\u77F6\\u65F6\\u95F4 \\u4E0A\\u534810:10 \\u2013 2007/11/10 \\u6D1B\\u6749\\u77F6\\u65F6\\u95F4 \\u4E0A\\u534810:10",
- "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMMy", "2007\\u5e7411\\u670810\\u65e5\\u661f\\u671f\\u516d\\u81f320\\u65e5\\u661f\\u671f\\u4e8c",
+ "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EEEEdMMMMy", "2007\\u5e7411\\u670810\\u65e5\\u661f\\u671f\\u516d\\u81f320\\u65e5\\u661f\\u671f\\u4e8c",
- "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMM", "11\\u670810\\u65e5\\u81f320\\u65e5",
+ "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dMMMM", "11\\u670810\\u65e5\\u81f320\\u65e5",
- "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMMy", "2007\\u5E7411\\u6708", // (fixed expected result per ticket:6626:)
+ "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "MMMMy", "2007\\u5E7411\\u6708", // (fixed expected result per ticket:6626:)
- "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMM", "11\\u670810\\u65e5\\u661f\\u671f\\u516d\\u81f320\\u65e5\\u661f\\u671f\\u4e8c",
+ "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EEEEdMMMM", "11\\u670810\\u65e5\\u661f\\u671f\\u516d\\u81f320\\u65e5\\u661f\\u671f\\u4e8c",
- "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "2007/11/10\\u5468\\u516d\\u81f32007/11/20\\u5468\\u4e8c",
+ "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EdMy", "2007/11/10\\u5468\\u516d\\u81f32007/11/20\\u5468\\u4e8c",
- "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "11/10 \\u2013 11/20",
+ "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dM", "11/10 \\u2013 11/20",
- "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "2007\\u5E7411\\u6708",
+ "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "My", "2007\\u5E7411\\u6708",
- "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdM", "11/10\\u5468\\u516d\\u81f311/20\\u5468\\u4e8c",
+ "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EdM", "11/10\\u5468\\u516d\\u81f311/20\\u5468\\u4e8c",
- "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "y", "2007\\u5E74", // (fixed expected result per ticket:6626:)
+ "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "y", "2007\\u5E74", // (fixed expected result per ticket:6626:)
- "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "M", "11\\u6708",
+ "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "M", "11\\u6708",
- "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMM", "11\\u6708", // (fixed expected result per ticket:6626: and others)
+ "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "MMM", "11\\u6708", // (fixed expected result per ticket:6626: and others)
- "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmz", "2007/11/10 GMT-8 \\u4e0a\\u534810:10 \\u2013 2007/11/20 GMT-8 \\u4e0a\\u534810:10",
+ "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hmz", "2007/11/10 GMT-8 \\u4e0a\\u534810:10 \\u2013 2007/11/20 GMT-8 \\u4e0a\\u534810:10",
- "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "h", "2007/11/10 \\u4e0a\\u534810\\u65f6 \\u2013 2007/11/20 \\u4e0a\\u534810\\u65f6",
+ "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "h", "2007/11/10 \\u4e0a\\u534810\\u65f6 \\u2013 2007/11/20 \\u4e0a\\u534810\\u65f6",
- "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMMy", "2007\\u5e741\\u670810\\u65e5\\u661f\\u671f\\u4e09", // (fixed expected result per ticket:6626:)
+ "zh", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EEEEdMMMMy", "2007\\u5e741\\u670810\\u65e5\\u661f\\u671f\\u4e09", // (fixed expected result per ticket:6626:)
- "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hm", "\\u4e0a\\u534810:00\\u81f3\\u4e0b\\u53482:10",
+ "zh", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hm", "\\u4e0a\\u534810:00\\u81f3\\u4e0b\\u53482:10",
- "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmz", "GMT-8\\u4e0a\\u534810:00\\u81f3\\u4e0b\\u53482:10",
+ "zh", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hmz", "GMT-8\\u4e0a\\u534810:00\\u81f3\\u4e0b\\u53482:10",
- "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "\\u4e0a\\u534810\\u65F6\\u81f3\\u4e0b\\u53482\\u65f6",
+ "zh", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "h", "\\u4e0a\\u534810\\u65F6\\u81f3\\u4e0b\\u53482\\u65f6",
- "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hv", "\\u6D1B\\u6749\\u77F6\\u65F6\\u95F4\\u4E0A\\u534810\\u65F6\\u81F3\\u4E0B\\u53482\\u65F6",
+ "zh", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hv", "\\u6D1B\\u6749\\u77F6\\u65F6\\u95F4\\u4E0A\\u534810\\u65F6\\u81F3\\u4E0B\\u53482\\u65F6",
- "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hm", "\\u4e0a\\u534810:00\\u81f310:20",
+ "zh", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hm", "\\u4e0a\\u534810:00\\u81f310:20",
- "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmv", "\\u6D1B\\u6749\\u77F6\\u65F6\\u95F4\\u4E0A\\u534810:00\\u81F310:20",
+ "zh", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hmv", "\\u6D1B\\u6749\\u77F6\\u65F6\\u95F4\\u4E0A\\u534810:00\\u81F310:20",
- "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hz", "GMT-8\\u4e0a\\u534810\\u65f6",
+ "zh", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hz", "GMT-8\\u4e0a\\u534810\\u65f6",
- "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hm", "\\u4e0a\\u534810:10",
+ "zh", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hm", "\\u4e0a\\u534810:10",
- "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "h", "\\u4e0a\\u534810\\u65f6",
+ "zh", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "h", "\\u4e0a\\u534810\\u65f6",
- "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMy", "Mittwoch, 10. Okt. 2007 \\u2013 Freitag, 10. Okt. 2008",
+ "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EEEEdMMMy", "Mittwoch, 10. Okt. 2007 \\u2013 Freitag, 10. Okt. 2008",
- "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMM", "10. Okt. 2007 \\u2013 10. Okt. 2008",
+ "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "dMMM", "10. Okt. 2007 \\u2013 10. Okt. 2008",
- "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMy", "Okt. 2007 \\u2013 Okt. 2008",
+ "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "MMMy", "Okt. 2007 \\u2013 Okt. 2008",
- "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMy", "Mi., 10.10.2007 \\u2013 Fr., 10.10.2008",
+ "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EdMy", "Mi., 10.10.2007 \\u2013 Fr., 10.10.2008",
- "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMy", "10.10.2007 \\u2013 10.10.2008",
+ "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "dMy", "10.10.2007 \\u2013 10.10.2008",
- "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "My", "10.2007 \\u2013 10.2008",
+ "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "My", "10.2007 \\u2013 10.2008",
- "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdM", "Mi., 10.10.2007 \\u2013 Fr., 10.10.2008",
+ "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EdM", "Mi., 10.10.2007 \\u2013 Fr., 10.10.2008",
- "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "y", "2007\\u20132008",
+ "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "y", "2007\\u20132008",
- "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "M", "10.2007 \\u2013 10.2008",
+ "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "M", "10.2007 \\u2013 10.2008",
- "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hm", "10.10.2007, 10:10 AM \\u2013 10.10.2008, 10:10 AM",
- "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Hm", "10.10.2007, 10:10 \\u2013 10.10.2008, 10:10",
+ "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "hm", "10.10.2007, 10:10 AM \\u2013 10.10.2008, 10:10 AM",
+ "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "Hm", "10.10.2007, 10:10 \\u2013 10.10.2008, 10:10",
- "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMy", "Mittwoch, 10. Okt. \\u2013 Samstag, 10. Nov. 2007",
+ "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EEEEdMMMy", "Mittwoch, 10. Okt. \\u2013 Samstag, 10. Nov. 2007",
- "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMM", "10. Okt. \\u2013 10. Nov.",
+ "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "dMMM", "10. Okt. \\u2013 10. Nov.",
- "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMy", "Okt.\\u2013Nov. 2007",
+ "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "MMMy", "Okt.\\u2013Nov. 2007",
- "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMM", "Mittwoch, 10. Okt. \\u2013 Samstag, 10. Nov.",
+ "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EEEEdMMM", "Mittwoch, 10. Okt. \\u2013 Samstag, 10. Nov.",
- "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dM", "10.10. \\u2013 10.11.",
+ "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "dM", "10.10. \\u2013 10.11.",
- "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "My", "10.2007 \\u2013 11.2007",
+ "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "My", "10.2007 \\u2013 11.2007",
- "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "d", "10.10. \\u2013 10.11.",
+ "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "d", "10.10. \\u2013 10.11.",
- "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "y", "2007",
+ "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "y", "2007",
- "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMM", "Okt.\\u2013Nov.",
+ "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "MMM", "Okt.\\u2013Nov.",
- "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hms", "10.10.2007, 10:10:10 AM \\u2013 10.11.2007, 10:10:10 AM",
- "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "Hms", "10.10.2007, 10:10:10 \\u2013 10.11.2007, 10:10:10",
+ "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "hms", "10.10.2007, 10:10:10 AM \\u2013 10.11.2007, 10:10:10 AM",
+ "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "Hms", "10.10.2007, 10:10:10 \\u2013 10.11.2007, 10:10:10",
- "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMy", "Samstag, 10. \\u2013 Dienstag, 20. Nov. 2007",
+ "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EEEEdMMMy", "Samstag, 10. \\u2013 Dienstag, 20. Nov. 2007",
- "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMy", "10.\\u201320. Nov. 2007",
+ "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dMMMy", "10.\\u201320. Nov. 2007",
- "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMy", "Nov. 2007",
+ "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "MMMy", "Nov. 2007",
- "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMM", "Samstag, 10. \\u2013 Dienstag, 20. Nov.",
+ "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EEEEdMMM", "Samstag, 10. \\u2013 Dienstag, 20. Nov.",
- "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "Sa., 10. \\u2013 Di., 20.11.2007",
+ "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EdMy", "Sa., 10. \\u2013 Di., 20.11.2007",
- "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "10.\\u201320.11.",
+ "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dM", "10.\\u201320.11.",
- "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "11.2007",
+ "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "My", "11.2007",
- "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "d", "10.\\u201320.",
+ "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "d", "10.\\u201320.",
- "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "y", "2007",
+ "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "y", "2007",
- "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmv", "10.11.2007, 10:10 AM Los Angeles Zeit \\u2013 20.11.2007, 10:10 AM Los Angeles Zeit",
+ "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hmv", "10.11.2007, 10:10 AM Los Angeles Zeit \\u2013 20.11.2007, 10:10 AM Los Angeles Zeit",
- "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMy", "Mittwoch, 10. Jan. 2007",
+ "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EEEEdMMMy", "Mittwoch, 10. Jan. 2007",
- "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMM", "10. Jan.",
+ "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "dMMM", "10. Jan.",
- "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMy", "Jan. 2007",
+ "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "MMMy", "Jan. 2007",
- "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMM", "Mittwoch, 10. Jan.",
+ "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EEEEdMMM", "Mittwoch, 10. Jan.",
/* Following is an important test, because the 'h' in 'Uhr' is interpreted as a pattern
if not escaped properly. */
- "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "10 Uhr AM \\u2013 2 Uhr PM",
- "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "H", "10\\u201314 Uhr",
+ "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "h", "10 Uhr AM \\u2013 2 Uhr PM",
+ "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "H", "10\\u201314 Uhr",
- "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EEEEdMMM", "Mittwoch, 10. Jan.",
+ "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "EEEEdMMM", "Mittwoch, 10. Jan.",
- "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmv", "10:00\\u201310:20 AM Los Angeles Zeit",
+ "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hmv", "10:00\\u201310:20 AM Los Angeles Zeit",
- "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmz", "10:00\\u201310:20 AM GMT-8",
+ "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hmz", "10:00\\u201310:20 AM GMT-8",
- "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "h", "10 Uhr AM",
- "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "H", "10 Uhr",
+ "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "h", "10 Uhr AM",
+ "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "H", "10 Uhr",
- "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hz", "10 Uhr AM GMT-8",
+ "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hz", "10 Uhr AM GMT-8",
- "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEdMMMy", "Mittwoch, 10. Jan. 2007",
+ "de", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "EEEEdMMMy", "Mittwoch, 10. Jan. 2007",
- "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmv", "10:10 AM Los Angeles Zeit",
+ "de", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hmv", "10:10 AM Los Angeles Zeit",
- "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmz", "10:10 AM GMT-8",
+ "de", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hmz", "10:10 AM GMT-8",
- "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hv", "10 Uhr AM Los Angeles Zeit",
+ "de", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hv", "10 Uhr AM Los Angeles Zeit",
- "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hz", "10 Uhr AM GMT-8",
+ "de", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hz", "10 Uhr AM GMT-8",
// Thai (default calendar buddhist)
- "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "EEEEdMMMy", "\\u0E27\\u0E31\\u0E19\\u0E1E\\u0E38\\u0E18\\u0E17\\u0E35\\u0E48 10 \\u0E15.\\u0E04. 2550 \\u2013 \\u0E27\\u0E31\\u0E19\\u0E28\\u0E38\\u0E01\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48 10 \\u0E15.\\u0E04. 2551",
+ "th", "BE 2550 10 10 10:10:10", "BE 2551 10 10 10:10:10", "EEEEdMMMy", "\\u0E27\\u0E31\\u0E19\\u0E1E\\u0E38\\u0E18\\u0E17\\u0E35\\u0E48 10 \\u0E15.\\u0E04. 2550 \\u2013 \\u0E27\\u0E31\\u0E19\\u0E28\\u0E38\\u0E01\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48 10 \\u0E15.\\u0E04. 2551",
+
+
+ "th", "BE 2550 10 10 10:10:10", "BE 2551 10 10 10:10:10", "dMMM", "10 \\u0E15.\\u0E04. 2550 \\u2013 10 \\u0E15.\\u0E04. 2551",
+
+ "th", "BE 2550 10 10 10:10:10", "BE 2551 10 10 10:10:10", "MMMy", "\\u0E15.\\u0E04. 2550 \\u2013 \\u0E15.\\u0E04. 2551",
+
+
+ "th", "BE 2550 10 10 10:10:10", "BE 2551 10 10 10:10:10", "EdMy", "\\u0E1E. 10/10/2550 \\u2013 \\u0E28. 10/10/2551",
+
+ "th", "BE 2550 10 10 10:10:10", "BE 2551 10 10 10:10:10", "dMy", "10/10/2550 \\u2013 10/10/2551",
+
+
+ "th", "BE 2550 10 10 10:10:10", "BE 2551 10 10 10:10:10", "My", "10/2550 \\u2013 10/2551",
+
+ "th", "BE 2550 10 10 10:10:10", "BE 2551 10 10 10:10:10", "EdM", "\\u0E1E. 10/10/2550 \\u2013 \\u0E28. 10/10/2551",
+
+ "th", "BE 2550 10 10 10:10:10", "BE 2551 10 10 10:10:10", "y", "2550\\u20132551",
- "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "dMMM", "10 \\u0E15.\\u0E04. 2550 \\u2013 10 \\u0E15.\\u0E04. 2551",
+ "th", "BE 2550 10 10 10:10:10", "BE 2551 10 10 10:10:10", "M", "10/2550 \\u2013 10/2551",
- "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "MMMy", "\\u0E15.\\u0E04. 2550 \\u2013 \\u0E15.\\u0E04. 2551",
+ "th", "BE 2550 10 10 10:10:10", "BE 2550 11 10 10:10:10", "EEEEdMMMy", "\\u0E27\\u0E31\\u0E19\\u0E1E\\u0E38\\u0E18\\u0E17\\u0E35\\u0E48 10 \\u0E15.\\u0E04. \\u2013 \\u0E27\\u0E31\\u0E19\\u0E40\\u0E2A\\u0E32\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48 10 \\u0E1E.\\u0E22. 2550",
- "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "EdMy", "\\u0E1E. 10/10/2550 \\u2013 \\u0E28. 10/10/2551",
- "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "dMy", "10/10/2550 \\u2013 10/10/2551",
+ "th", "BE 2550 10 10 10:10:10", "BE 2550 11 10 10:10:10", "dMMM", "10 \\u0E15.\\u0E04. \\u2013 10 \\u0E1E.\\u0E22.",
+ "th", "BE 2550 10 10 10:10:10", "BE 2550 11 10 10:10:10", "MMMy", "\\u0E15.\\u0E04.\\u2013\\u0E1E.\\u0E22. 2550",
- "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "My", "10/2550 \\u2013 10/2551",
+ "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "dM", "10/10 \\u2013 10/11",
- "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "EdM", "\\u0E1E. 10/10/2550 \\u2013 \\u0E28. 10/10/2551",
+ "th", "BE 2550 10 10 10:10:10", "BE 2550 11 10 10:10:10", "My", "10/2550 \\u2013 11/2550",
- "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "y", "2550\\u20132551",
+ "th", "BE 2550 10 10 10:10:10", "BE 2550 11 10 10:10:10", "d", "10/10 \\u2013 10/11",
- "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "M", "10/2550 \\u2013 10/2551",
+ "th", "BE 2550 10 10 10:10:10", "BE 2550 11 10 10:10:10", "y", "\\u0E1E.\\u0E28. 2550",
- "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "EEEEdMMMy", "\\u0E27\\u0E31\\u0E19\\u0E1E\\u0E38\\u0E18\\u0E17\\u0E35\\u0E48 10 \\u0E15.\\u0E04. \\u2013 \\u0E27\\u0E31\\u0E19\\u0E40\\u0E2A\\u0E32\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48 10 \\u0E1E.\\u0E22. 2550",
+ "th", "BE 2550 10 10 10:10:10", "BE 2550 11 10 10:10:10", "MMM", "\\u0E15.\\u0E04.\\u2013\\u0E1E.\\u0E22.",
+ // Tests for Japanese calendar with eras, including new era in 2019 (Heisei 31 through April 30, then new era)
- "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "dMMM", "10 \\u0E15.\\u0E04. \\u2013 10 \\u0E1E.\\u0E22.",
+ "en-u-ca-japanese", "H 31 03 15 09:00:00", "H 31 04 15 09:00:00", "GyMMMd", "Mar 15 \\u2013 Apr 15, 31 Heisei",
- "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "MMMy", "\\u0E15.\\u0E04.\\u2013\\u0E1E.\\u0E22. 2550",
+ "en-u-ca-japanese", "H 31 03 15 09:00:00", "H 31 04 15 09:00:00", "GGGGGyMd", "3/15/31 \\u2013 4/15/31 H",
- "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "dM", "10/10 \\u2013 10/11",
+ "en-u-ca-japanese", "S 64 01 05 09:00:00", "H 1 01 15 09:00:00", "GyMMMd", "Jan 5, 64 Sh\\u014Dwa \\u2013 Jan 15, 1 Heisei",
- "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "My", "10/2550 \\u2013 11/2550",
+ "en-u-ca-japanese", "S 64 01 05 09:00:00", "H 1 01 15 09:00:00", "GGGGGyMd", "1/5/64 S \\u2013 1/15/1 H",
+
+ "en-u-ca-japanese", "H 31 04 15 09:00:00", JP_ERA_2019_NARROW " 1 05 15 09:00:00", "GyMMMd", "Apr 15, 31 Heisei \\u2013 May 15, 1 " JP_ERA_2019_ROOT,
+ "en-u-ca-japanese", "H 31 04 15 09:00:00", JP_ERA_2019_NARROW " 1 05 15 09:00:00", "GGGGGyMd", "4/15/31 H \\u2013 5/15/1 " JP_ERA_2019_NARROW,
+
+
+ "ja-u-ca-japanese", "H 31 03 15 09:00:00", "H 31 04 15 09:00:00", "GyMMMd", "\\u5E73\\u621031\\u5E743\\u670815\\u65E5\\uFF5E4\\u670815\\u65E5",
- "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "d", "10/10 \\u2013 10/11",
+ "ja-u-ca-japanese", "H 31 03 15 09:00:00", "H 31 04 15 09:00:00", "GGGGGyMd", "H31/03/15\\uFF5E31/04/15",
- "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "y", "\\u0E1E.\\u0E28. 2550",
+ "ja-u-ca-japanese", "S 64 01 05 09:00:00", "H 1 01 15 09:00:00", "GyMMMd", "\\u662D\\u548C64\\u5E741\\u67085\\u65E5\\uFF5E\\u5E73\\u6210\\u5143\\u5E741\\u670815\\u65E5",
+ "ja-u-ca-japanese", "S 64 01 05 09:00:00", "H 1 01 15 09:00:00", "GGGGGyMd", "S64/01/05\\uFF5EH1/01/15",
- "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "MMM", "\\u0E15.\\u0E04.\\u2013\\u0E1E.\\u0E22.",
+ "ja-u-ca-japanese", "H 31 04 15 09:00:00", JP_ERA_2019_NARROW " 1 05 15 09:00:00", "GGGGGyMd", "H31/04/15\\uFF5E" JP_ERA_2019_NARROW "1/05/15",
};
expect(DATA, UPRV_LENGTHOF(DATA));
@@ -1049,22 +1077,33 @@ void DateIntervalFormatTest::expect(const char** data, int32_t data_length) {
int32_t i = 0;
UErrorCode ec = U_ZERO_ERROR;
UnicodeString str, str2;
- const char* pattern = data[0];
- i++;
+ const char* pattern = data[i++];
while (i<data_length) {
const char* locName = data[i++];
+ const char* datestr = data[i++];
+ const char* datestr_2 = data[i++];
+
Locale loc(locName);
- SimpleDateFormat ref(pattern, loc, ec);
+ LocalPointer<Calendar> defCal(Calendar::createInstance(loc, ec));
+ if (U_FAILURE(ec)) {
+ dataerrln("Calendar::createInstance fails for loc %s with: %s", locName, u_errorName(ec));
+ return;
+ }
+ const char* calType = defCal->getType();
+
+ Locale refLoc("root");
+ if (calType) {
+ refLoc.setKeywordValue("calendar", calType, ec);
+ }
+ SimpleDateFormat ref(pattern, refLoc, ec);
logln( "case %d, locale: %s\n", (i-1)/5, locName);
-
if (U_FAILURE(ec)) {
dataerrln("contruct SimpleDateFormat in expect failed: %s", u_errorName(ec));
return;
}
+
// 'f'
- const char* datestr = data[i++];
- const char* datestr_2 = data[i++];
logln("original date: %s - %s\n", datestr, datestr_2);
UDate date = ref.parse(ctou(datestr), ec);
if (!assertSuccess("parse 1st data in expect", ec)) return;
@@ -1444,7 +1483,7 @@ void DateIntervalFormatTest::stress(const char** data, int32_t data_length,
GregorianCalendar* gregCal = new GregorianCalendar(loc, ec);
if (!assertSuccess("GregorianCalendar()", ec)) return;
const DateFormat* dformat = dtitvfmt->getDateFormat();
- DateFormat* newOne = (DateFormat*)dformat->clone();
+ DateFormat* newOne = dformat->clone();
newOne->adoptCalendar(gregCal);
//dtitvfmt->adoptDateFormat(newOne, ec);
dtitvfmt->setDateFormat(*newOne, ec);
@@ -1601,7 +1640,7 @@ void DateIntervalFormatTest::testTicket12065() {
dataerrln("FAIL: DateIntervalFormat::createInstance failed for Locale::getEnglish()");
return;
}
- LocalPointer<DateIntervalFormat> clone(dynamic_cast<DateIntervalFormat *>(formatter->clone()));
+ LocalPointer<DateIntervalFormat> clone(formatter->clone());
if (*formatter != *clone) {
errln("%s:%d DateIntervalFormat and clone are not equal.", __FILE__, __LINE__);
return;
@@ -1620,4 +1659,114 @@ void DateIntervalFormatTest::testTicket12065() {
}
+void DateIntervalFormatTest::testFormattedDateInterval() {
+ IcuTestErrorCode status(*this, "testFormattedDateInterval");
+ LocalPointer<DateIntervalFormat> fmt(DateIntervalFormat::createInstance(u"dMMMMy", "en-US", status), status);
+
+ {
+ const char16_t* message = u"FormattedDateInterval test 1";
+ const char16_t* expectedString = u"July 20 \u2013 25, 2018";
+ LocalPointer<Calendar> input1(Calendar::createInstance("en-GB", status));
+ if (status.errIfFailureAndReset()) { return; }
+ LocalPointer<Calendar> input2(Calendar::createInstance("en-GB", status));
+ if (status.errIfFailureAndReset()) { return; }
+ input1->set(2018, 6, 20);
+ input2->set(2018, 6, 25);
+ FormattedDateInterval result = fmt->formatToValue(*input1, *input2, status);
+ static const UFieldPositionWithCategory expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 0, 4},
+ {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 0, 5, 7},
+ {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 5, 7},
+ {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 1, 10, 12},
+ {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 10, 12},
+ {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 14, 18}};
+ checkMixedFormattedValue(
+ message,
+ result,
+ expectedString,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ {
+ const char16_t* message = u"FormattedDateInterval identical dates test: no span field";
+ const char16_t* expectedString = u"July 20, 2018";
+ LocalPointer<Calendar> input1(Calendar::createInstance("en-GB", status));
+ input1->set(2018, 6, 20);
+ FormattedDateInterval result = fmt->formatToValue(*input1, *input1, status);
+ static const UFieldPositionWithCategory expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 0, 4},
+ {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 5, 7},
+ {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 9, 13}};
+ checkMixedFormattedValue(
+ message,
+ result,
+ expectedString,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ // Test sample code
+ {
+ LocalPointer<Calendar> input1(Calendar::createInstance("en-GB", status));
+ LocalPointer<Calendar> input2(Calendar::createInstance("en-GB", status));
+ input1->set(2018, 6, 20);
+ input2->set(2018, 7, 3);
+
+ // Let fmt be a DateIntervalFormat for locale en-US and skeleton dMMMMy
+ // Let input1 be July 20, 2018 and input2 be August 3, 2018:
+ FormattedDateInterval result = fmt->formatToValue(*input1, *input2, status);
+ assertEquals("Expected output from format",
+ u"July 20 \u2013 August 3, 2018", result.toString(status));
+ ConstrainedFieldPosition cfpos;
+ cfpos.constrainField(UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 0);
+ if (result.nextPosition(cfpos, status)) {
+ assertEquals("Expect start index", 0, cfpos.getStart());
+ assertEquals("Expect end index", 7, cfpos.getLimit());
+ } else {
+ // No such span: can happen if input dates are equal.
+ }
+ assertFalse("No more than one occurrence of the field",
+ result.nextPosition(cfpos, status));
+ }
+
+ // To test the fallback pattern behavior, make a custom DateIntervalInfo.
+ DateIntervalInfo dtitvinf(status);
+ dtitvinf.setFallbackIntervalPattern("<< {1} --- {0} >>", status);
+ fmt.adoptInsteadAndCheckErrorCode(
+ DateIntervalFormat::createInstance(u"dMMMMy", "en-US", dtitvinf, status),
+ status);
+
+ {
+ const char16_t* message = u"FormattedDateInterval with fallback format test 1";
+ const char16_t* expectedString = u"<< July 25, 2018 --- July 20, 2018 >>";
+ LocalPointer<Calendar> input1(Calendar::createInstance("en-GB", status));
+ if (status.errIfFailureAndReset()) { return; }
+ LocalPointer<Calendar> input2(Calendar::createInstance("en-GB", status));
+ if (status.errIfFailureAndReset()) { return; }
+ input1->set(2018, 6, 20);
+ input2->set(2018, 6, 25);
+ FormattedDateInterval result = fmt->formatToValue(*input1, *input2, status);
+ static const UFieldPositionWithCategory expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 1, 3, 16},
+ {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 3, 7},
+ {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 8, 10},
+ {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 12, 16},
+ {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 0, 21, 34},
+ {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 21, 25},
+ {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 26, 28},
+ {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 30, 34}};
+ checkMixedFormattedValue(
+ message,
+ result,
+ expectedString,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+}
+
+
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/dtifmtts.h b/Build/source/libs/icu/icu-src/source/test/intltest/dtifmtts.h
index b6cc0970270..9a72d6ebd1e 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/dtifmtts.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/dtifmtts.h
@@ -15,11 +15,12 @@
#if !UCONFIG_NO_FORMATTING
#include "intltest.h"
+#include "itformat.h"
/**
* Test basic functionality of various API functions
**/
-class DateIntervalFormatTest: public IntlTest {
+class DateIntervalFormatTest: public IntlTestWithFieldPosition {
void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = NULL );
public:
@@ -63,6 +64,8 @@ public:
void testTicket12065();
+ void testFormattedDateInterval();
+
private:
/**
* Test formatting against expected result
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/dtptngts.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/dtptngts.cpp
index f21856821f8..02745c12a2f 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/dtptngts.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/dtptngts.cpp
@@ -19,7 +19,9 @@
#include "unicode/dtfmtsym.h"
#include "unicode/dtptngen.h"
#include "unicode/ustring.h"
+#include "unicode/datefmt.h"
#include "cmemory.h"
+#include "cstring.h"
#include "loctest.h"
@@ -38,11 +40,14 @@ void IntlTestDateTimePatternGeneratorAPI::runIndexedTest( int32_t index, UBool e
TESTCASE(4, testC);
TESTCASE(5, testSkeletonsWithDayPeriods);
TESTCASE(6, testGetFieldDisplayNames);
+ TESTCASE(7, testJjMapping);
+ 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.
@@ -81,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
@@ -104,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
@@ -123,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
@@ -142,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
@@ -161,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"
@@ -171,7 +185,7 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/)
UnicodeString("13 ene."), // 05: MMMd -> "d 'de' MMM"
UnicodeString("13 de enero"), // 06: MMMMd -> "d 'de' MMMM"
UnicodeString("T1 1999"), // 07: yQQQ -> "QQQ y"
- UnicodeString("11:58 p. m."), // 08: hhmm -> "hh:mm a"
+ CharsToUnicodeString("11:58 p.\\u00A0m."), // 08: hhmm -> "hh:mm a"
UnicodeString("23:58"), // 09: HHmm -> "HH:mm"
UnicodeString("23:58"), // 10: jjmm -> "HH:mm"
UnicodeString("58:59"), // 11: mmss -> "mm:ss"
@@ -180,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
@@ -199,11 +215,13 @@ 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
- CharsToUnicodeString("\\u5E73\\u621011/1"), // 00: yM -> Gy/m
+ UnicodeString("H11/1"), // 00: yM -> GGGGGy/m
CharsToUnicodeString("\\u5E73\\u621011\\u5E741\\u6708"), // 01: yMMM -> Gy\u5E74M\u6708
- CharsToUnicodeString("\\u5E73\\u621011/1/13"), // 02: yMd -> Gy/m/d
+ UnicodeString("H11/1/13"), // 02: yMd -> GGGGGy/m/d
CharsToUnicodeString("\\u5E73\\u621011\\u5E741\\u670813\\u65E5"), // 03: yMMMd -> Gy\u5E74M\u6708d\u65E5
UnicodeString("1/13"), // 04: Md -> M/d
CharsToUnicodeString("1\\u670813\\u65E5"), // 05: MMMd -> M\u6708d\u65E5
@@ -218,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:)
@@ -237,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
@@ -256,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
@@ -275,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
@@ -294,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[] = {
@@ -631,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;
@@ -649,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++;
@@ -1111,13 +1175,14 @@ void IntlTestDateTimePatternGeneratorAPI::testC() {
{"en", "CCCCCCm", "hh:mm aaaaa"},
{"en-BN", "Cm", "h:mm b"},
{"gu-IN", "Cm", "h:mm B"},
- {"und-IN", "Cm", "h:mm a"}
+ {"und-IN", "Cm", "h:mm B"}
};
UErrorCode status = U_ZERO_ERROR;
int32_t numTests = UPRV_LENGTHOF(tests);
for (int32_t i = 0; i < numTests; ++i) {
- DateTimePatternGenerator *gen = DateTimePatternGenerator::createInstance(Locale(tests[i][0]), status);
+ DateTimePatternGenerator *gen = DateTimePatternGenerator::createInstance(
+ Locale::forLanguageTag(tests[i][0], status), status);
if (gen == NULL) {
dataerrln("FAIL: DateTimePatternGenerator::createInstance failed for %s", tests[i][0]);
return;
@@ -1259,4 +1324,156 @@ void IntlTestDateTimePatternGeneratorAPI::testGetFieldDisplayNames() {
}
}
+static const UChar timeCycleChars[] = { (UChar)0x0048, (UChar)0x0068, (UChar)0x004B, (UChar)0x006B, (UChar)0 };
+
+void IntlTestDateTimePatternGeneratorAPI::testJjMapping() {
+ UErrorCode status = U_ZERO_ERROR;
+ UnicodeString jSkeleton("j");
+ // First test that j maps correctly by region in a locale for which we do not have data.
+ {
+ const char* testLocaleID = "de_US"; // short patterns from fallback locale "de" have "HH"
+ Locale testLocale(testLocaleID);
+ LocalPointer<DateTimePatternGenerator> dtpg(DateTimePatternGenerator::createInstance(testLocale, status));
+ if (U_FAILURE(status)) {
+ dataerrln("FAIL: DateTimePatternGenerator::createInstance failed for locale %s: %s", testLocaleID, u_errorName(status));
+ } else {
+ UnicodeString jPattern = dtpg->getBestPattern(jSkeleton, UDATPG_MATCH_ALL_FIELDS_LENGTH, status); // get pattern with h e.g. "h 'Uhr' a"
+ if (U_FAILURE(status)) {
+ errln("FAIL: DateTimePatternGenerator::getBestPattern locale %s, pattern j: %s", testLocaleID, u_errorName(status));
+ } else {
+ UnicodeString jPatSkeleton = DateTimePatternGenerator::staticGetSkeleton(jPattern, status); // strip literals, get e.g. "ah"
+ if (U_FAILURE(status)) {
+ errln("FAIL: DateTimePatternGenerator::staticGetSkeleton locale %s: %s", testLocaleID, u_errorName(status));
+ } else if (jPatSkeleton.indexOf(u'h') < 0) { // expect US preferred cycle 'h', not H or other cycle
+ errln("ERROR: DateTimePatternGenerator::getBestPattern locale %s, pattern j did not use 'h'", testLocaleID);
+ }
+ }
+ }
+ }
+
+ // Next test that in all available Locales, the actual short time pattern uses the same cycle as produced by 'j'
+ int32_t locCount;
+ const Locale* localePtr = DateFormat::getAvailableLocales(locCount);
+ for (; locCount-- > 0; localePtr++) {
+ const char* localeID = localePtr->getName();
+ status = U_ZERO_ERROR;
+ LocalPointer<DateTimePatternGenerator> dtpg(DateTimePatternGenerator::createInstance(*localePtr, status));
+ if (U_FAILURE(status)) {
+ dataerrln("FAIL: DateTimePatternGenerator::createInstance failed for locale %s: %s", localeID, u_errorName(status));
+ continue;
+ }
+ LocalPointer<DateFormat> dfmt(DateFormat::createTimeInstance(DateFormat::kShort, *localePtr));
+ if (U_FAILURE(status)) {
+ dataerrln("FAIL: DateFormat::createTimeInstance kShort failed for locale %s: %s", localeID, u_errorName(status));
+ continue;
+ }
+ const SimpleDateFormat* sdfmt;
+ if ((sdfmt = dynamic_cast<const SimpleDateFormat*>(reinterpret_cast<const DateFormat*>(dfmt.getAlias()))) == NULL) {
+ continue;
+ }
+ UnicodeString shortPattern;
+ shortPattern = sdfmt->toPattern(shortPattern);
+ UnicodeString jPattern = dtpg->getBestPattern(jSkeleton, status);
+ if (U_FAILURE(status)) {
+ errln("FAIL: DateTimePatternGenerator::getBestPattern locale %s, pattern j: %s", localeID, u_errorName(status));
+ continue;
+ }
+ // Now check that shortPattern and jPattern use the same hour cycle
+ UnicodeString jPatSkeleton = DateTimePatternGenerator::staticGetSkeleton(jPattern, status);
+ UnicodeString shortPatSkeleton = DateTimePatternGenerator::staticGetSkeleton(shortPattern, status);
+ if (U_FAILURE(status)) {
+ errln("FAIL: DateTimePatternGenerator::staticGetSkeleton locale %s: %s", localeID, u_errorName(status));
+ continue;
+ }
+ const UChar* charPtr = timeCycleChars;
+ for (; *charPtr != (UChar)0; charPtr++) {
+ if (jPatSkeleton.indexOf(*charPtr) >= 0) {
+ if (shortPatSkeleton.indexOf(*charPtr) < 0) {
+ 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 (best pattern: '%s')", localeID, jcBuf, spBuf, dfmtCalType, jpBuf);
+ }
+ break;
+ }
+ }
+ }
+}
+
+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 deprecated region code;
+ // formerly New Hebrides, now Vanuatu => VU => h.
+ {"en_NH", u"h a", u"h:mm a"},
+ // ch_ZH is a typo (should be zh_CN), but we should fail gracefully.
+ // {"cn_ZH", u"HH", u"H:mm"}, // TODO(ICU-20653): Desired behavior
+ {"cn_ZH", u"HH", u"h:mm a"}, // Actual behavior
+ // a non-BCP47 locale without a country code should not fail
+ {"ja_TRADITIONAL", u"H時", u"H:mm"},
+ };
+
+ for (auto& cas : cases) {
+ status.setScope(cas.localeName);
+
+ Locale loc(cas.localeName);
+ LocalPointer<DateFormat> dtf(DateFormat::createTimeInstance(DateFormat::kShort, loc), status);
+ LocalPointer<DateTimePatternGenerator> dtpg(DateTimePatternGenerator::createInstance(loc, status));
+ if (status.errIfFailureAndReset()) {
+ return;
+ }
+
+ UnicodeString timePattern;
+ dynamic_cast<SimpleDateFormat*>(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];
+
+ uprv_strcpy(original, uloc_getDefault());
+ uloc_setDefault("root", &status);
+ if (U_FAILURE(status)) {
+ errln("ERROR: Failed to change the default locale to root! Default is: %s\n", uloc_getDefault());
+ }
+
+ DateTimePatternGenerator* dtpg = icu::DateTimePatternGenerator::createInstance("abcdedf", status);
+
+ if (U_FAILURE(status)) {
+ errln("ERROR: expected createInstance with invalid locale to succeed. Status: %s", u_errorName(status));
+ }
+ if (status != U_USING_DEFAULT_WARNING) {
+ errln("ERROR: expected createInstance to return U_USING_DEFAULT_WARNING for invalid locale and default root locale. Status: %s", u_errorName(status));
+ }
+
+ delete dtpg;
+
+ uloc_setDefault(original, &status);
+ if (U_FAILURE(status)) {
+ errln("ERROR: Failed to change the default locale back to %s\n", original);
+ }
+}
+
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/dtptngts.h b/Build/source/libs/icu/icu-src/source/test/intltest/dtptngts.h
index adef0dca5cf..c0bebccd3e3 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/dtptngts.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/dtptngts.h
@@ -32,6 +32,9 @@ private:
void testC();
void testSkeletonsWithDayPeriods();
void testGetFieldDisplayNames();
+ void testJjMapping();
+ void test20640_HourCyclArsEnNH();
+ void testFallbackWithDefaultRootLocale();
};
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/erarulestest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/erarulestest.cpp
index b550361b271..115e7eacbd1 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/erarulestest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/erarulestest.cpp
@@ -8,6 +8,7 @@
#include "unicode/calendar.h"
#include "unicode/localpointer.h"
#include "unicode/unistr.h"
+#include "unicode/timezone.h"
#include "erarules.h"
#include "erarulestest.h"
@@ -73,7 +74,7 @@ void EraRulesTest::testAPIs() {
+ calId);
}
- LocalPointer<Calendar> cal(Calendar::createInstance("en", status));
+ LocalPointer<Calendar> cal(Calendar::createInstance(*TimeZone::getGMT(), "en", status));
if (U_FAILURE(status)) {
errln("Failed to create a Calendar instance.");
continue;
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_stringbuilder.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/formatted_string_builder_test.cpp
index 3106bedb310..4ce63daec56 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_stringbuilder.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/formatted_string_builder_test.cpp
@@ -5,8 +5,28 @@
#if !UCONFIG_NO_FORMATTING
+#include "unicode/utf16.h"
#include "putilimp.h"
-#include "numbertest.h"
+#include "intltest.h"
+#include "formatted_string_builder.h"
+#include "formattedval_impl.h"
+
+
+class FormattedStringBuilderTest : public IntlTest {
+ public:
+ void testInsertAppendUnicodeString();
+ void testSplice();
+ void testInsertAppendCodePoint();
+ void testCopy();
+ void testFields();
+ void testUnlimitedCapacity();
+ void testCodePoints();
+
+ void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0);
+
+ private:
+ void assertEqualsImpl(const UnicodeString &a, const FormattedStringBuilder &b);
+};
static const char16_t *EXAMPLE_STRINGS[] = {
u"",
@@ -17,9 +37,9 @@ static const char16_t *EXAMPLE_STRINGS[] = {
u"with combining characters like 🇦🇧🇨🇩",
u"A very very very very very very very very very very long string to force heap"};
-void NumberStringBuilderTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char *) {
+void FormattedStringBuilderTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char *) {
if (exec) {
- logln("TestSuite NumberStringBuilderTest: ");
+ logln("TestSuite FormattedStringBuilderTest: ");
}
TESTCASE_AUTO_BEGIN;
TESTCASE_AUTO(testInsertAppendUnicodeString);
@@ -32,14 +52,14 @@ void NumberStringBuilderTest::runIndexedTest(int32_t index, UBool exec, const ch
TESTCASE_AUTO_END;
}
-void NumberStringBuilderTest::testInsertAppendUnicodeString() {
+void FormattedStringBuilderTest::testInsertAppendUnicodeString() {
UErrorCode status = U_ZERO_ERROR;
UnicodeString sb1;
- NumberStringBuilder sb2;
+ FormattedStringBuilder sb2;
for (const char16_t* strPtr : EXAMPLE_STRINGS) {
UnicodeString str(strPtr);
- NumberStringBuilder sb3;
+ FormattedStringBuilder sb3;
sb1.append(str);
// Note: UNUM_FIELD_COUNT is like passing null in Java
sb2.append(str, UNUM_FIELD_COUNT, status);
@@ -50,7 +70,7 @@ void NumberStringBuilderTest::testInsertAppendUnicodeString() {
assertEqualsImpl(str, sb3);
UnicodeString sb4;
- NumberStringBuilder sb5;
+ FormattedStringBuilder sb5;
sb4.append(u"😇");
sb4.append(str);
sb4.append(u"xx");
@@ -68,7 +88,7 @@ void NumberStringBuilderTest::testInsertAppendUnicodeString() {
assertEqualsImpl(sb4, sb5);
UnicodeString sb4cp(sb4);
- NumberStringBuilder sb5cp(sb5);
+ FormattedStringBuilder sb5cp(sb5);
sb4.append(sb4cp);
sb5.append(sb5cp, status);
assertSuccess("Appending again to sb5", status);
@@ -76,7 +96,7 @@ void NumberStringBuilderTest::testInsertAppendUnicodeString() {
}
}
-void NumberStringBuilderTest::testSplice() {
+void FormattedStringBuilderTest::testSplice() {
static const struct TestCase {
const char16_t* input;
const int32_t startThis;
@@ -94,7 +114,7 @@ void NumberStringBuilderTest::testSplice() {
UErrorCode status = U_ZERO_ERROR;
UnicodeString sb1;
- NumberStringBuilder sb2;
+ FormattedStringBuilder sb2;
for (auto cas : cases) {
for (const char16_t* replacementPtr : EXAMPLE_STRINGS) {
UnicodeString replacement(replacementPtr);
@@ -125,14 +145,14 @@ void NumberStringBuilderTest::testSplice() {
}
}
-void NumberStringBuilderTest::testInsertAppendCodePoint() {
+void FormattedStringBuilderTest::testInsertAppendCodePoint() {
static const UChar32 cases[] = {
0, 1, 60, 127, 128, 0x7fff, 0x8000, 0xffff, 0x10000, 0x1f000, 0x10ffff};
UErrorCode status = U_ZERO_ERROR;
UnicodeString sb1;
- NumberStringBuilder sb2;
+ FormattedStringBuilder sb2;
for (UChar32 cas : cases) {
- NumberStringBuilder sb3;
+ FormattedStringBuilder sb3;
sb1.append(cas);
sb2.appendCodePoint(cas, UNUM_FIELD_COUNT, status);
assertSuccess("Appending to sb2", status);
@@ -147,7 +167,7 @@ void NumberStringBuilderTest::testInsertAppendCodePoint() {
sb3.charAt(0));
UnicodeString sb4;
- NumberStringBuilder sb5;
+ FormattedStringBuilder sb5;
sb4.append(u"😇xx");
sb4.insert(2, cas);
sb5.append(u"😇xx", UNUM_FIELD_COUNT, status);
@@ -155,16 +175,28 @@ void NumberStringBuilderTest::testInsertAppendCodePoint() {
sb5.insertCodePoint(2, cas, UNUM_FIELD_COUNT, status);
assertSuccess("Inserting into sb5", status);
assertEqualsImpl(sb4, sb5);
+
+ UnicodeString sb6;
+ FormattedStringBuilder sb7;
+ sb6.append(cas);
+ if (U_IS_SUPPLEMENTARY(cas)) {
+ sb7.appendChar16(U16_TRAIL(cas), UNUM_FIELD_COUNT, status);
+ sb7.insertChar16(0, U16_LEAD(cas), UNUM_FIELD_COUNT, status);
+ } else {
+ sb7.insertChar16(0, cas, UNUM_FIELD_COUNT, status);
+ }
+ assertSuccess("Insert/append into sb7", status);
+ assertEqualsImpl(sb6, sb7);
}
}
-void NumberStringBuilderTest::testCopy() {
+void FormattedStringBuilderTest::testCopy() {
UErrorCode status = U_ZERO_ERROR;
for (UnicodeString str : EXAMPLE_STRINGS) {
- NumberStringBuilder sb1;
+ FormattedStringBuilder sb1;
sb1.append(str, UNUM_FIELD_COUNT, status);
assertSuccess("Appending to sb1 first time", status);
- NumberStringBuilder sb2(sb1);
+ FormattedStringBuilder sb2(sb1);
assertTrue("Content should equal itself", sb1.contentEquals(sb2));
sb1.append("12345", UNUM_FIELD_COUNT, status);
@@ -173,25 +205,28 @@ void NumberStringBuilderTest::testCopy() {
}
}
-void NumberStringBuilderTest::testFields() {
+void FormattedStringBuilderTest::testFields() {
UErrorCode status = U_ZERO_ERROR;
// Note: This is a C++11 for loop that calls the UnicodeString constructor on each iteration.
for (UnicodeString str : EXAMPLE_STRINGS) {
- NumberStringBuilder sb;
+ FormattedValueStringBuilderImpl sbi(0);
+ FormattedStringBuilder& sb = sbi.getStringRef();
sb.append(str, UNUM_FIELD_COUNT, status);
assertSuccess("Appending to sb", status);
sb.append(str, UNUM_CURRENCY_FIELD, status);
assertSuccess("Appending to sb", status);
assertEquals("Reference string copied twice", str.length() * 2, sb.length());
for (int32_t i = 0; i < str.length(); i++) {
- assertEquals("Null field first", UNUM_FIELD_COUNT, sb.fieldAt(i));
- assertEquals("Currency field second", UNUM_CURRENCY_FIELD, sb.fieldAt(i + str.length()));
+ assertEquals("Null field first",
+ (FormattedStringBuilder::Field) UNUM_FIELD_COUNT, sb.fieldAt(i));
+ assertEquals("Currency field second",
+ (FormattedStringBuilder::Field) UNUM_CURRENCY_FIELD, sb.fieldAt(i + str.length()));
}
// Very basic FieldPosition test. More robust tests happen in NumberFormatTest.
// Let NumberFormatTest also take care of FieldPositionIterator material.
FieldPosition fp(UNUM_CURRENCY_FIELD);
- sb.nextFieldPosition(fp, status);
+ sbi.nextFieldPosition(fp, status);
assertSuccess("Populating the FieldPosition", status);
assertEquals("Currency start position", str.length(), fp.getBeginIndex());
assertEquals("Currency end position", str.length() * 2, fp.getEndIndex());
@@ -200,17 +235,17 @@ void NumberStringBuilderTest::testFields() {
sb.insertCodePoint(2, 100, UNUM_INTEGER_FIELD, status);
assertSuccess("Inserting code point into sb", status);
assertEquals("New length", str.length() * 2 + 1, sb.length());
- assertEquals("Integer field", UNUM_INTEGER_FIELD, sb.fieldAt(2));
+ assertEquals("Integer field", (FormattedStringBuilder::Field) UNUM_INTEGER_FIELD, sb.fieldAt(2));
}
- NumberStringBuilder old(sb);
+ FormattedStringBuilder old(sb);
sb.append(old, status);
assertSuccess("Appending to myself", status);
int32_t numNull = 0;
int32_t numCurr = 0;
int32_t numInt = 0;
for (int32_t i = 0; i < sb.length(); i++) {
- UNumberFormatFields field = sb.fieldAt(i);
+ FormattedStringBuilder::Field field = sb.fieldAt(i);
assertEquals("Field should equal location in old", old.fieldAt(i % old.length()), field);
if (field == UNUM_FIELD_COUNT) {
numNull++;
@@ -228,9 +263,9 @@ void NumberStringBuilderTest::testFields() {
}
}
-void NumberStringBuilderTest::testUnlimitedCapacity() {
+void FormattedStringBuilderTest::testUnlimitedCapacity() {
UErrorCode status = U_ZERO_ERROR;
- NumberStringBuilder builder;
+ FormattedStringBuilder builder;
// The builder should never fail upon repeated appends.
for (int i = 0; i < 1000; i++) {
UnicodeString message("Iteration #");
@@ -242,9 +277,9 @@ void NumberStringBuilderTest::testUnlimitedCapacity() {
}
}
-void NumberStringBuilderTest::testCodePoints() {
+void FormattedStringBuilderTest::testCodePoints() {
UErrorCode status = U_ZERO_ERROR;
- NumberStringBuilder nsb;
+ FormattedStringBuilder nsb;
assertEquals("First is -1 on empty string", -1, nsb.getFirstCodePoint());
assertEquals("Last is -1 on empty string", -1, nsb.getLastCodePoint());
assertEquals("Length is 0 on empty string", 0, nsb.codePointCount());
@@ -268,7 +303,7 @@ void NumberStringBuilderTest::testCodePoints() {
assertEquals("Code point count is 2", 2, nsb.codePointCount());
}
-void NumberStringBuilderTest::assertEqualsImpl(const UnicodeString &a, const NumberStringBuilder &b) {
+void FormattedStringBuilderTest::assertEqualsImpl(const UnicodeString &a, const FormattedStringBuilder &b) {
// TODO: Why won't this compile without the IntlTest:: qualifier?
IntlTest::assertEquals("Lengths should be the same", a.length(), b.length());
IntlTest::assertEquals("Code point counts should be the same", a.countChar32(), b.codePointCount());
@@ -285,4 +320,9 @@ void NumberStringBuilderTest::assertEqualsImpl(const UnicodeString &a, const Num
}
}
+
+extern IntlTest *createFormattedStringBuilderTest() {
+ return new FormattedStringBuilderTest();
+}
+
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/formattedvaluetest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/formattedvaluetest.cpp
new file mode 100644
index 00000000000..976a90ba38e
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/formattedvaluetest.cpp
@@ -0,0 +1,308 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
+#include <set>
+
+#include "unicode/formattedvalue.h"
+#include "unicode/unum.h"
+#include "unicode/udat.h"
+#include "intltest.h"
+#include "itformat.h"
+
+
+class FormattedValueTest : public IntlTest {
+public:
+ void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0);
+private:
+ void testBasic();
+ void testSetters();
+ void testLocalPointer();
+
+ void assertAllPartsEqual(
+ UnicodeString messagePrefix,
+ const ConstrainedFieldPosition& cfpos,
+ int32_t matching,
+ UFieldCategory category,
+ int32_t field,
+ int32_t start,
+ int32_t limit,
+ int64_t context);
+};
+
+void FormattedValueTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char *) {
+ if (exec) {
+ logln("TestSuite FormattedValueTest: ");
+ }
+ TESTCASE_AUTO_BEGIN;
+ TESTCASE_AUTO(testBasic);
+ TESTCASE_AUTO(testSetters);
+ TESTCASE_AUTO(testLocalPointer);
+ TESTCASE_AUTO_END;
+}
+
+
+void FormattedValueTest::testBasic() {
+ IcuTestErrorCode status(*this, "testBasic");
+ ConstrainedFieldPosition cfpos;
+ assertAllPartsEqual(
+ u"basic",
+ cfpos,
+ 7,
+ UFIELD_CATEGORY_UNDEFINED,
+ 0,
+ 0,
+ 0,
+ 0LL);
+}
+
+void FormattedValueTest::testSetters() {
+ IcuTestErrorCode status(*this, "testSetters");
+ ConstrainedFieldPosition cfpos;
+
+ cfpos.constrainCategory(UFIELD_CATEGORY_DATE);
+ assertAllPartsEqual(
+ u"setters 0",
+ cfpos,
+ 4,
+ UFIELD_CATEGORY_DATE,
+ 0,
+ 0,
+ 0,
+ 0LL);
+
+ cfpos.constrainField(UFIELD_CATEGORY_NUMBER, UNUM_COMPACT_FIELD);
+ assertAllPartsEqual(
+ u"setters 1",
+ cfpos,
+ 2,
+ UFIELD_CATEGORY_NUMBER,
+ UNUM_COMPACT_FIELD,
+ 0,
+ 0,
+ 0LL);
+
+ cfpos.setInt64IterationContext(42424242424242LL);
+ assertAllPartsEqual(
+ u"setters 2",
+ cfpos,
+ 2,
+ UFIELD_CATEGORY_NUMBER,
+ UNUM_COMPACT_FIELD,
+ 0,
+ 0,
+ 42424242424242LL);
+
+ cfpos.setState(UFIELD_CATEGORY_NUMBER, UNUM_COMPACT_FIELD, 5, 10);
+ assertAllPartsEqual(
+ u"setters 3",
+ cfpos,
+ 2,
+ UFIELD_CATEGORY_NUMBER,
+ UNUM_COMPACT_FIELD,
+ 5,
+ 10,
+ 42424242424242LL);
+
+ cfpos.reset();
+ assertAllPartsEqual(
+ u"setters 4",
+ cfpos,
+ 7,
+ UFIELD_CATEGORY_UNDEFINED,
+ 0,
+ 0,
+ 0,
+ 0LL);
+}
+
+void FormattedValueTest::testLocalPointer() {
+ UErrorCode status = U_ZERO_ERROR;
+ LocalUConstrainedFieldPositionPointer ucfpos(ucfpos_open(&status));
+ assertSuccess("Openining LocalUConstrainedFieldPositionPointer", status);
+ assertEquals(u"Test that object is valid",
+ 0LL,
+ ucfpos_getInt64IterationContext(ucfpos.getAlias(), &status));
+ assertSuccess("Using LocalUConstrainedFieldPositionPointer", status);
+}
+
+/** For matching, turn on these bits:
+ *
+ * 1 = UNUM_INTEGER_FIELD
+ * 2 = UNUM_COMPACT_FIELD
+ * 4 = UDAT_AM_PM_FIELD
+ */
+void FormattedValueTest::assertAllPartsEqual(
+ UnicodeString messagePrefix,
+ const ConstrainedFieldPosition& cfpos,
+ int32_t matching,
+ UFieldCategory category,
+ int32_t field,
+ int32_t start,
+ int32_t limit,
+ int64_t context) {
+ assertEquals(messagePrefix + u": category",
+ category, cfpos.getCategory());
+ assertEquals(messagePrefix + u": field",
+ field, cfpos.getField());
+ assertEquals(messagePrefix + u": start",
+ start, cfpos.getStart());
+ assertEquals(messagePrefix + u": limit",
+ limit, cfpos.getLimit());
+ assertEquals(messagePrefix + u": context",
+ context, cfpos.getInt64IterationContext());
+
+ assertEquals(messagePrefix + u": integer field",
+ (UBool) ((matching & 1) != 0), cfpos.matchesField(UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD));
+ assertEquals(messagePrefix + u": compact field",
+ (UBool) ((matching & 2) != 0), cfpos.matchesField(UFIELD_CATEGORY_NUMBER, UNUM_COMPACT_FIELD));
+ assertEquals(messagePrefix + u": date field",
+ (UBool) ((matching & 4) != 0), cfpos.matchesField(UFIELD_CATEGORY_DATE, UDAT_AM_PM_FIELD));
+}
+
+
+void IntlTestWithFieldPosition::checkFormattedValue(
+ const char16_t* message,
+ const FormattedValue& fv,
+ UnicodeString expectedString,
+ UFieldCategory expectedCategory,
+ const UFieldPosition* expectedFieldPositions,
+ int32_t length) {
+ LocalArray<UFieldPositionWithCategory> converted(new UFieldPositionWithCategory[length]);
+ for (int32_t i=0; i<length; i++) {
+ converted[i].category = expectedCategory;
+ converted[i].field = expectedFieldPositions[i].field;
+ converted[i].beginIndex = expectedFieldPositions[i].beginIndex;
+ converted[i].endIndex = expectedFieldPositions[i].endIndex;
+ }
+ checkMixedFormattedValue(message, fv, expectedString, converted.getAlias(), length);
+}
+
+
+UnicodeString CFPosToUnicodeString(const ConstrainedFieldPosition& cfpos) {
+ UnicodeString sb;
+ sb.append(u"CFPos[");
+ sb.append(Int64ToUnicodeString(cfpos.getStart()));
+ sb.append(u'-');
+ sb.append(Int64ToUnicodeString(cfpos.getLimit()));
+ sb.append(u' ');
+ sb.append(Int64ToUnicodeString(cfpos.getCategory()));
+ sb.append(u':');
+ sb.append(Int64ToUnicodeString(cfpos.getField()));
+ sb.append(u']');
+ return sb;
+}
+
+
+void IntlTestWithFieldPosition::checkMixedFormattedValue(
+ const char16_t* message,
+ const FormattedValue& fv,
+ UnicodeString expectedString,
+ const UFieldPositionWithCategory* expectedFieldPositions,
+ int32_t length) {
+ IcuTestErrorCode status(*this, "checkMixedFormattedValue");
+ UnicodeString baseMessage = UnicodeString(message) + u": " + fv.toString(status) + u": ";
+
+ // Check string values
+ assertEquals(baseMessage + u"string", expectedString, fv.toString(status));
+ assertEquals(baseMessage + u"temp string", expectedString, fv.toTempString(status));
+
+ // The temp string is guaranteed to be NUL-terminated
+ UnicodeString readOnlyAlias = fv.toTempString(status);
+ if (!status.errIfFailureAndReset()) {
+ assertEquals(baseMessage + u"NUL-terminated",
+ 0, readOnlyAlias.getBuffer()[readOnlyAlias.length()]);
+ }
+
+ // Check nextPosition over all fields
+ ConstrainedFieldPosition cfpos;
+ for (int32_t i = 0; i < length; i++) {
+ assertTrue(baseMessage + u"A has next position @ " + Int64ToUnicodeString(i),
+ fv.nextPosition(cfpos, status));
+ int32_t expectedCategory = expectedFieldPositions[i].category;
+ int32_t expectedField = expectedFieldPositions[i].field;
+ int32_t expectedStart = expectedFieldPositions[i].beginIndex;
+ int32_t expectedLimit = expectedFieldPositions[i].endIndex;
+ assertEquals(baseMessage + u"A category @ " + Int64ToUnicodeString(i),
+ expectedCategory, cfpos.getCategory());
+ assertEquals(baseMessage + u"A field @ " + Int64ToUnicodeString(i),
+ expectedField, cfpos.getField());
+ assertEquals(baseMessage + u"A start @ " + Int64ToUnicodeString(i),
+ expectedStart, cfpos.getStart());
+ assertEquals(baseMessage + u"A limit @ " + Int64ToUnicodeString(i),
+ expectedLimit, cfpos.getLimit());
+ }
+ UBool afterLoopResult = fv.nextPosition(cfpos, status);
+ assertFalse(baseMessage + u"A after loop: " + CFPosToUnicodeString(cfpos), afterLoopResult);
+
+ // Check nextPosition constrained over each category one at a time
+ for (int32_t category=0; category<UFIELD_CATEGORY_COUNT; category++) {
+ cfpos.reset();
+ cfpos.constrainCategory(static_cast<UFieldCategory>(category));
+ for (int32_t i = 0; i < length; i++) {
+ if (expectedFieldPositions[i].category != category) {
+ continue;
+ }
+ assertTrue(baseMessage + u"B has next position @ " + Int64ToUnicodeString(i),
+ fv.nextPosition(cfpos, status));
+ int32_t expectedCategory = expectedFieldPositions[i].category;
+ int32_t expectedField = expectedFieldPositions[i].field;
+ int32_t expectedStart = expectedFieldPositions[i].beginIndex;
+ int32_t expectedLimit = expectedFieldPositions[i].endIndex;
+ assertEquals(baseMessage + u"B category @ " + Int64ToUnicodeString(i),
+ expectedCategory, cfpos.getCategory());
+ assertEquals(baseMessage + u"B field @ " + Int64ToUnicodeString(i),
+ expectedField, cfpos.getField());
+ assertEquals(baseMessage + u"B start @ " + Int64ToUnicodeString(i),
+ expectedStart, cfpos.getStart());
+ assertEquals(baseMessage + u"B limit @ " + Int64ToUnicodeString(i),
+ expectedLimit, cfpos.getLimit());
+ }
+ UBool afterLoopResult = fv.nextPosition(cfpos, status);
+ assertFalse(baseMessage + u"B after loop @ " + CFPosToUnicodeString(cfpos), afterLoopResult);
+ }
+
+ // Check nextPosition constrained over each field one at a time
+ std::set<std::pair<UFieldCategory, int32_t>> uniqueFields;
+ for (int32_t i = 0; i < length; i++) {
+ uniqueFields.insert({expectedFieldPositions[i].category, expectedFieldPositions[i].field});
+ }
+ for (std::pair<UFieldCategory, int32_t> categoryAndField : uniqueFields) {
+ cfpos.reset();
+ cfpos.constrainField(categoryAndField.first, categoryAndField.second);
+ for (int32_t i = 0; i < length; i++) {
+ if (expectedFieldPositions[i].category != categoryAndField.first) {
+ continue;
+ }
+ if (expectedFieldPositions[i].field != categoryAndField.second) {
+ continue;
+ }
+ assertTrue(baseMessage + u"C has next position @ " + Int64ToUnicodeString(i),
+ fv.nextPosition(cfpos, status));
+ int32_t expectedCategory = expectedFieldPositions[i].category;
+ int32_t expectedField = expectedFieldPositions[i].field;
+ int32_t expectedStart = expectedFieldPositions[i].beginIndex;
+ int32_t expectedLimit = expectedFieldPositions[i].endIndex;
+ assertEquals(baseMessage + u"C category @ " + Int64ToUnicodeString(i),
+ expectedCategory, cfpos.getCategory());
+ assertEquals(baseMessage + u"C field @ " + Int64ToUnicodeString(i),
+ expectedField, cfpos.getField());
+ assertEquals(baseMessage + u"C start @ " + Int64ToUnicodeString(i),
+ expectedStart, cfpos.getStart());
+ assertEquals(baseMessage + u"C limit @ " + Int64ToUnicodeString(i),
+ expectedLimit, cfpos.getLimit());
+ }
+ UBool afterLoopResult = fv.nextPosition(cfpos, status);
+ assertFalse(baseMessage + u"C after loop: " + CFPosToUnicodeString(cfpos), afterLoopResult);
+ }
+}
+
+
+extern IntlTest *createFormattedValueTest() {
+ return new FormattedValueTest();
+}
+
+#endif /* !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/idnaconf.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/idnaconf.cpp
index bad84cdd73b..cc8d89a9426 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/idnaconf.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/idnaconf.cpp
@@ -12,12 +12,13 @@
* created by: Raymond Yang
*/
-#if !UCONFIG_NO_IDNA
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_IDNA
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "unicode/utypes.h"
#include "unicode/ucnv.h"
#include "unicode/ustring.h"
#include "unicode/uidna.h"
@@ -73,7 +74,7 @@ UBool IdnaConfTest::ReadAndConvertFile(){
}
const char* name = "idna_conf.txt"; // test data file
- int t = strlen(path) + strlen(name) + 1;
+ int t = static_cast<int>(strlen(path) + strlen(name) + 1);
char* absolute_name = new char[t];
strcpy(absolute_name, path);
strcat(absolute_name, name);
@@ -108,14 +109,14 @@ UBool IdnaConfTest::ReadAndConvertFile(){
NULL, // dest,
0, // destCapacity,
source,
- source_len,
+ static_cast<int32_t>(source_len),
&status);
if (status == U_BUFFER_OVERFLOW_ERROR) {
// Buffer Overflow is expected from the preflight operation.
status = U_ZERO_ERROR;
UChar * dest = NULL;
dest = new UChar[ dest_len + 1];
- ucnv_toUChars(conv, dest, dest_len + 1, source, source_len, &status);
+ ucnv_toUChars(conv, dest, dest_len + 1, source, static_cast<int32_t>(source_len), &status);
// Do not know the "if possible" behavior of ucnv_toUChars()
// Do it by ourself.
dest[dest_len] = 0;
@@ -172,7 +173,7 @@ UBool IdnaConfTest::ReadOneLine(UnicodeString& buf){
curOffset += 1 + t; // BACKSLAH and NewlineMark
continue;
}
- };
+ }
buf.append(c);
curOffset++;
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/idnaref.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/idnaref.cpp
index 66608c485a0..afec7c9f505 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/idnaref.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/idnaref.cpp
@@ -198,6 +198,17 @@ CLEANUP:
return b2Len;
}
+
+static NamePrepTransform* getInstance(UErrorCode& status){
+ TestIDNA *thisTest = dynamic_cast<TestIDNA *>(IntlTest::gTest);
+ if (thisTest == nullptr && U_SUCCESS(status)) {
+ status = U_INTERNAL_PROGRAM_ERROR;
+ }
+ if (U_FAILURE(status)) return nullptr;
+ return thisTest->getInstance(status);
+}
+
+
static int32_t convertFromPuny( const UChar* src, int32_t srcLength,
UChar* dest, int32_t destCapacity,
UErrorCode& status){
@@ -288,7 +299,7 @@ idnaref_toASCII(const UChar* src, int32_t srcLength,
b1[b1Len++] = src[j];
}
- NamePrepTransform* prep = TestIDNA::getInstance(*status);
+ NamePrepTransform* prep = getInstance(*status);
if(U_FAILURE(*status)){
goto CLEANUP;
}
@@ -439,7 +450,7 @@ idnaref_toUnicode(const UChar* src, int32_t srcLength,
reqLength=0;
// UParseError parseError;
- NamePrepTransform* prep = TestIDNA::getInstance(*status);
+ NamePrepTransform* prep = getInstance(*status);
b1Len = 0;
UBool* caseFlags = NULL;
@@ -694,7 +705,7 @@ idnaref_IDNToASCII( const UChar* src, int32_t srcLength,
int32_t reqLength = 0;
// UParseError parseError;
- NamePrepTransform* prep = TestIDNA::getInstance(*status);
+ NamePrepTransform* prep = getInstance(*status);
//initialize pointers to stack buffers
UChar b1Stack[MAX_LABEL_BUFFER_SIZE];
@@ -815,7 +826,7 @@ idnaref_IDNToASCII( const UChar* src, int32_t srcLength,
}
labelStart = delimiter;
- remainingLen = srcLength - (delimiter - src);
+ remainingLen = static_cast<int32_t>(srcLength - (delimiter - src));
}
}
@@ -850,7 +861,7 @@ idnaref_IDNToUnicode( const UChar* src, int32_t srcLength,
UBool done = FALSE;
- NamePrepTransform* prep = TestIDNA::getInstance(*status);
+ NamePrepTransform* prep = getInstance(*status);
//initialize pointers to stack buffers
UChar b1Stack[MAX_LABEL_BUFFER_SIZE];
@@ -972,7 +983,7 @@ idnaref_IDNToUnicode( const UChar* src, int32_t srcLength,
}
labelStart = delimiter;
- remainingLen = srcLength - (delimiter - src);
+ remainingLen = static_cast<int32_t>(srcLength - (delimiter - src));
}
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/incaltst.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/incaltst.cpp
index 1e79576d882..4c58644c6e8 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/incaltst.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/incaltst.cpp
@@ -12,17 +12,22 @@
#include "string.h"
#include "unicode/locid.h"
#include "japancal.h"
+#include "unicode/localpointer.h"
+#include "unicode/datefmt.h"
+#include "unicode/smpdtfmt.h"
+#include "unicode/dtptngen.h"
#if !UCONFIG_NO_FORMATTING
#include <stdio.h>
#include "caltest.h"
-#define CHECK(status, msg) \
+#define CHECK(status, msg) UPRV_BLOCK_MACRO_BEGIN { \
if (U_FAILURE(status)) { \
- dataerrln((UnicodeString(u_errorName(status)) + UnicodeString(" : " ) )+ msg); \
+ dataerrln((UnicodeString(u_errorName(status)) + UnicodeString(" : " ) )+ msg); \
return; \
- }
+ } \
+} UPRV_BLOCK_MACRO_END
static UnicodeString escape( const UnicodeString&src)
@@ -74,9 +79,10 @@ void IntlCalendarTest::runIndexedTest( int32_t index, UBool exec, const char* &n
CASE(4,TestBuddhistFormat);
CASE(5,TestJapaneseFormat);
CASE(6,TestJapanese3860);
- CASE(7,TestPersian);
- CASE(8,TestPersianFormat);
- CASE(9,TestTaiwan);
+ CASE(7,TestForceGannenNumbering);
+ CASE(8,TestPersian);
+ CASE(9,TestPersianFormat);
+ CASE(10,TestTaiwan);
default: name = ""; break;
}
}
@@ -100,7 +106,6 @@ IntlCalendarTest::TestTypes()
"en_US_VALLEYGIRL@collation=phonebook;calendar=gregorian",
"ja_JP@calendar=japanese",
"th_TH@calendar=buddhist",
- "ja_JP_TRADITIONAL",
"th_TH_TRADITIONAL",
"th_TH_TRADITIONAL@calendar=gregorian",
"en_US",
@@ -114,7 +119,6 @@ IntlCalendarTest::TestTypes()
"gregorian",
"japanese",
"buddhist",
- "japanese",
"buddhist",
"gregorian",
"gregorian",
@@ -414,34 +418,28 @@ void IntlCalendarTest::TestBuddhistFormat() {
// First, a contrived English test..
UDate aDate = 999932400000.0;
- SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"), Locale("en_US@calendar=buddhist"), status);
+ SimpleDateFormat fmt(UnicodeString("MMMM d, yyyy G"), Locale("en_US@calendar=buddhist"), status);
CHECK(status, "creating date format instance");
- SimpleDateFormat *fmt2 = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"), Locale("en_US@calendar=gregorian"), status);
+ SimpleDateFormat fmt2(UnicodeString("MMMM d, yyyy G"), Locale("en_US@calendar=gregorian"), status);
CHECK(status, "creating gregorian date format instance");
- if(!fmt) {
- errln("Couldn't create en_US instance");
+ UnicodeString str;
+ fmt2.format(aDate, str);
+ logln(UnicodeString() + "Test Date: " + str);
+ str.remove();
+ fmt.format(aDate, str);
+ logln(UnicodeString() + "as Buddhist Calendar: " + escape(str));
+ UnicodeString expected("September 8, 2544 BE");
+ if(str != expected) {
+ errln("Expected " + escape(expected) + " but got " + escape(str));
+ }
+ UDate otherDate = fmt.parse(expected, status);
+ if(otherDate != aDate) {
+ UnicodeString str3;
+ fmt.format(otherDate, str3);
+ errln("Parse incorrect of " + escape(expected) + " - wanted " + aDate + " but got " + otherDate + ", " + escape(str3));
} else {
- UnicodeString str;
- fmt2->format(aDate, str);
- logln(UnicodeString() + "Test Date: " + str);
- str.remove();
- fmt->format(aDate, str);
- logln(UnicodeString() + "as Buddhist Calendar: " + escape(str));
- UnicodeString expected("September 8, 2544 BE");
- if(str != expected) {
- errln("Expected " + escape(expected) + " but got " + escape(str));
- }
- UDate otherDate = fmt->parse(expected, status);
- if(otherDate != aDate) {
- UnicodeString str3;
- fmt->format(otherDate, str3);
- errln("Parse incorrect of " + escape(expected) + " - wanted " + aDate + " but got " + otherDate + ", " + escape(str3));
- } else {
- logln("Parsed OK: " + expected);
- }
- delete fmt;
+ logln("Parsed OK: " + expected);
}
- delete fmt2;
CHECK(status, "Error occurred testing Buddhist Calendar in English ");
@@ -488,81 +486,68 @@ void IntlCalendarTest::TestBuddhistFormat() {
void IntlCalendarTest::TestJapaneseFormat() {
- Calendar *cal;
+ LocalPointer<Calendar> cal;
UErrorCode status = U_ZERO_ERROR;
- cal = Calendar::createInstance("ja_JP_TRADITIONAL", status);
- CHECK(status, UnicodeString("Creating ja_JP_TRADITIONAL calendar"));
+ cal.adoptInstead(Calendar::createInstance("ja_JP@calendar=japanese", status));
+ CHECK(status, UnicodeString("Creating ja_JP@calendar=japanese calendar"));
- Calendar *cal2 = cal->clone();
- delete cal;
- cal = NULL;
+ LocalPointer<Calendar> cal2(cal->clone());
+ cal.adoptInstead(nullptr);
// Test simple parse/format with adopt
UDate aDate = 999932400000.0;
- SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("MMMM d, yy G"), Locale("en_US@calendar=japanese"), status);
- SimpleDateFormat *fmt2 = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"), Locale("en_US@calendar=gregorian"), status);
+ SimpleDateFormat fmt(UnicodeString("MMMM d, yy G"), Locale("en_US@calendar=japanese"), status);
+ SimpleDateFormat fmt2(UnicodeString("MMMM d, yyyy G"), Locale("en_US@calendar=gregorian"), status);
CHECK(status, "creating date format instance");
- if(!fmt) {
- errln("Couldn't create en_US instance");
+ UnicodeString str;
+ fmt2.format(aDate, str);
+ logln(UnicodeString() + "Test Date: " + str);
+ str.remove();
+ fmt.format(aDate, str);
+ logln(UnicodeString() + "as Japanese Calendar: " + str);
+ UnicodeString expected("September 8, 13 Heisei");
+ if(str != expected) {
+ errln("Expected " + expected + " but got " + str);
+ }
+ UDate otherDate = fmt.parse(expected, status);
+ if(otherDate != aDate) {
+ UnicodeString str3;
+ ParsePosition pp;
+ fmt.parse(expected, *cal2, pp);
+ fmt.format(otherDate, str3);
+ errln("Parse incorrect of " + expected + " - wanted " + aDate + " but got " + " = " + otherDate + ", " + str3 + " = " + CalendarTest::calToStr(*cal2) );
+
} else {
- UnicodeString str;
- fmt2->format(aDate, str);
- logln(UnicodeString() + "Test Date: " + str);
- str.remove();
- fmt->format(aDate, str);
- logln(UnicodeString() + "as Japanese Calendar: " + str);
- UnicodeString expected("September 8, 13 Heisei");
- if(str != expected) {
- errln("Expected " + expected + " but got " + str);
- }
- UDate otherDate = fmt->parse(expected, status);
- if(otherDate != aDate) {
- UnicodeString str3;
- ParsePosition pp;
- fmt->parse(expected, *cal2, pp);
- fmt->format(otherDate, str3);
- errln("Parse incorrect of " + expected + " - wanted " + aDate + " but got " + " = " + otherDate + ", " + str3 + " = " + CalendarTest::calToStr(*cal2) );
-
- } else {
- logln("Parsed OK: " + expected);
- }
- delete fmt;
+ logln("Parsed OK: " + expected);
}
// Test parse with incomplete information
- fmt = new SimpleDateFormat(UnicodeString("G y"), Locale("en_US@calendar=japanese"), status);
+ SimpleDateFormat fmti(UnicodeString("G y"), Locale("en_US@calendar=japanese"), status);
aDate = -3197117222000.0;
CHECK(status, "creating date format instance");
- if(!fmt) {
- errln("Coudln't create en_US instance");
- } else {
- UnicodeString str;
- fmt2->format(aDate, str);
- logln(UnicodeString() + "Test Date: " + str);
- str.remove();
- fmt->format(aDate, str);
- logln(UnicodeString() + "as Japanese Calendar: " + str);
- UnicodeString expected("Meiji 1");
- if(str != expected) {
- errln("Expected " + expected + " but got " + str);
- }
- UDate otherDate = fmt->parse(expected, status);
- if(otherDate != aDate) {
- UnicodeString str3;
- ParsePosition pp;
- fmt->parse(expected, *cal2, pp);
- fmt->format(otherDate, str3);
- errln("Parse incorrect of " + expected + " - wanted " + aDate + " but got " + " = " +
+ str.remove();
+ fmt2.format(aDate, str);
+ logln(UnicodeString() + "Test Date: " + str);
+ str.remove();
+ fmti.format(aDate, str);
+ logln(UnicodeString() + "as Japanese Calendar: " + str);
+ expected = u"Meiji 1";
+ if(str != expected) {
+ errln("Expected " + expected + " but got " + str);
+ }
+ otherDate = fmti.parse(expected, status);
+ if(otherDate != aDate) {
+ UnicodeString str3;
+ ParsePosition pp;
+ fmti.parse(expected, *cal2, pp);
+ fmti.format(otherDate, str3);
+ errln("Parse incorrect of " + expected + " - wanted " + aDate + " but got " + " = " +
otherDate + ", " + str3 + " = " + CalendarTest::calToStr(*cal2) );
- } else {
- logln("Parsed OK: " + expected);
- }
- delete fmt;
+ } else {
+ logln("Parsed OK: " + expected);
}
- delete cal2;
- delete fmt2;
CHECK(status, "Error occurred");
// Now, try in Japanese
@@ -577,7 +562,7 @@ void IntlCalendarTest::TestJapaneseFormat() {
{
UnicodeString expect = CharsToUnicodeString("\\u5e73\\u621013\\u5e749\\u67088\\u65e5\\u571f\\u66dc\\u65e5");
UDate expectDate = 999932400000.0; // Testing a recent date
- Locale loc("ja_JP_TRADITIONAL"); // legacy
+ Locale loc("ja_JP@calendar=japanese");
status = U_ZERO_ERROR;
simpleTest(loc, expect, expectDate, status);
@@ -600,6 +585,15 @@ void IntlCalendarTest::TestJapaneseFormat() {
simpleTest(loc, expect, expectDate, status);
}
+ { // 1989 Jan 9 Monday = Heisei 1; full is Gy年M月d日EEEE => 平成元年1月9日月曜日
+ UnicodeString expect = CharsToUnicodeString("\\u5E73\\u6210\\u5143\\u5E741\\u67089\\u65E5\\u6708\\u66DC\\u65E5");
+ UDate expectDate = 600336000000.0;
+ Locale loc("ja_JP@calendar=japanese");
+
+ status = U_ZERO_ERROR;
+ simpleTest(loc, expect, expectDate, status);
+
+ }
{ // This Feb 29th falls on a leap year by gregorian year, but not by Japanese year.
UnicodeString expect = CharsToUnicodeString("\\u5EB7\\u6B632\\u5e742\\u670829\\u65e5\\u65e5\\u66dc\\u65e5");
UDate expectDate = -16214400422000.0; // 1456-03-09T00:00Z-075258
@@ -613,102 +607,150 @@ void IntlCalendarTest::TestJapaneseFormat() {
void IntlCalendarTest::TestJapanese3860()
{
- Calendar *cal;
+ LocalPointer<Calendar> cal;
UErrorCode status = U_ZERO_ERROR;
- cal = Calendar::createInstance("ja_JP@calendar=japanese", status);
+ cal.adoptInstead(Calendar::createInstance("ja_JP@calendar=japanese", status));
CHECK(status, UnicodeString("Creating ja_JP@calendar=japanese calendar"));
- Calendar *cal2 = cal->clone();
- SimpleDateFormat *fmt2 = new SimpleDateFormat(UnicodeString("HH:mm:ss.S MMMM d, yyyy G"), Locale("en_US@calendar=gregorian"), status);
+ LocalPointer<Calendar> cal2(cal->clone());
+ SimpleDateFormat fmt2(UnicodeString("HH:mm:ss.S MMMM d, yyyy G"), Locale("en_US@calendar=gregorian"), status);
UnicodeString str;
-
{
// Test simple parse/format with adopt
UDate aDate = 0;
-
+
// Test parse with missing era (should default to current era, heisei)
// Test parse with incomplete information
logln("Testing parse w/ missing era...");
- SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("y.M.d"), Locale("ja_JP@calendar=japanese"), status);
+ SimpleDateFormat fmt(UnicodeString("y/M/d"), Locale("ja_JP@calendar=japanese"), status);
CHECK(status, "creating date format instance");
- if(!fmt) {
- errln("Couldn't create en_US instance");
- } else {
- UErrorCode s2 = U_ZERO_ERROR;
- cal2->clear();
- UnicodeString samplestr("1.1.9");
- logln(UnicodeString() + "Test Year: " + samplestr);
- aDate = fmt->parse(samplestr, s2);
- ParsePosition pp=0;
- fmt->parse(samplestr, *cal2, pp);
- CHECK(s2, "parsing the 1.1.9 string");
- logln("*cal2 after 119 parse:");
- str.remove();
- fmt2->format(aDate, str);
- logln(UnicodeString() + "as Gregorian Calendar: " + str);
-
- cal2->setTime(aDate, s2);
- int32_t gotYear = cal2->get(UCAL_YEAR, s2);
- int32_t gotEra = cal2->get(UCAL_ERA, s2);
- int32_t expectYear = 1;
- int32_t expectEra = JapaneseCalendar::getCurrentEra();
- if((gotYear!=1) || (gotEra != expectEra)) {
- errln(UnicodeString("parse "+samplestr+" of 'y.m.d' as Japanese Calendar, expected year ") + expectYear +
+ UErrorCode s2 = U_ZERO_ERROR;
+ cal2->clear();
+ UnicodeString samplestr("1/5/9");
+ logln(UnicodeString() + "Test Year: " + samplestr);
+ aDate = fmt.parse(samplestr, s2);
+ ParsePosition pp=0;
+ fmt.parse(samplestr, *cal2, pp);
+ CHECK(s2, "parsing the 1/5/9 string");
+ logln("*cal2 after 159 parse:");
+ str.remove();
+ fmt2.format(aDate, str);
+ logln(UnicodeString() + "as Gregorian Calendar: " + str);
+
+ cal2->setTime(aDate, s2);
+ int32_t gotYear = cal2->get(UCAL_YEAR, s2);
+ int32_t gotEra = cal2->get(UCAL_ERA, s2);
+ int32_t expectYear = 1;
+ int32_t expectEra = JapaneseCalendar::getCurrentEra();
+ if((gotYear!=1) || (gotEra != expectEra)) {
+ errln(UnicodeString("parse "+samplestr+" of 'y/M/d' as Japanese Calendar, expected year ") + expectYear +
UnicodeString(" and era ") + expectEra +", but got year " + gotYear + " and era " + gotEra + " (Gregorian:" + str +")");
- } else {
- logln(UnicodeString() + " year: " + gotYear + ", era: " + gotEra);
- }
- delete fmt;
+ } else {
+ logln(UnicodeString() + " year: " + gotYear + ", era: " + gotEra);
}
}
{
// Test simple parse/format with adopt
UDate aDate = 0;
-
+
// Test parse with missing era (should default to current era, heisei)
// Test parse with incomplete information
logln("Testing parse w/ just year...");
- SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("y"), Locale("ja_JP@calendar=japanese"), status);
+ SimpleDateFormat fmt(UnicodeString("y"), Locale("ja_JP@calendar=japanese"), status);
CHECK(status, "creating date format instance");
- if(!fmt) {
- errln("Couldn't create en_US instance");
- } else {
- UErrorCode s2 = U_ZERO_ERROR;
- cal2->clear();
- UnicodeString samplestr("1");
- logln(UnicodeString() + "Test Year: " + samplestr);
- aDate = fmt->parse(samplestr, s2);
- ParsePosition pp=0;
- fmt->parse(samplestr, *cal2, pp);
- CHECK(s2, "parsing the 1 string");
- logln("*cal2 after 1 parse:");
- str.remove();
- fmt2->format(aDate, str);
- logln(UnicodeString() + "as Gregorian Calendar: " + str);
-
- cal2->setTime(aDate, s2);
- int32_t gotYear = cal2->get(UCAL_YEAR, s2);
- int32_t gotEra = cal2->get(UCAL_ERA, s2);
- int32_t expectYear = 1;
- int32_t expectEra = 235; //JapaneseCalendar::kCurrentEra;
- if((gotYear!=1) || (gotEra != expectEra)) {
- errln(UnicodeString("parse "+samplestr+" of 'y' as Japanese Calendar, expected year ") + expectYear +
+ UErrorCode s2 = U_ZERO_ERROR;
+ cal2->clear();
+ UnicodeString samplestr("1");
+ logln(UnicodeString() + "Test Year: " + samplestr);
+ aDate = fmt.parse(samplestr, s2);
+ ParsePosition pp=0;
+ fmt.parse(samplestr, *cal2, pp);
+ CHECK(s2, "parsing the 1 string");
+ logln("*cal2 after 1 parse:");
+ str.remove();
+ fmt2.format(aDate, str);
+ logln(UnicodeString() + "as Gregorian Calendar: " + str);
+
+ cal2->setTime(aDate, s2);
+ int32_t gotYear = cal2->get(UCAL_YEAR, s2);
+ int32_t gotEra = cal2->get(UCAL_ERA, s2);
+ int32_t expectYear = 1;
+ int32_t expectEra = JapaneseCalendar::getCurrentEra();
+ if((gotYear!=1) || (gotEra != expectEra)) {
+ errln(UnicodeString("parse "+samplestr+" of 'y' as Japanese Calendar, expected year ") + expectYear +
UnicodeString(" and era ") + expectEra +", but got year " + gotYear + " and era " + gotEra + " (Gregorian:" + str +")");
- } else {
- logln(UnicodeString() + " year: " + gotYear + ", era: " + gotEra);
- }
- delete fmt;
+ } else {
+ logln(UnicodeString() + " year: " + gotYear + ", era: " + gotEra);
}
}
-
- delete cal2;
- delete cal;
- delete fmt2;
}
+void IntlCalendarTest::TestForceGannenNumbering()
+{
+ UErrorCode status;
+ const char* locID = "ja_JP@calendar=japanese";
+ Locale loc(locID);
+ UDate refDate = 600336000000.0; // 1989 Jan 9 Monday = Heisei 1
+ UnicodeString patText(u"Gy年M月d日",-1);
+ UnicodeString patNumr(u"GGGGGy/MM/dd",-1);
+ UnicodeString skelText(u"yMMMM",-1);
+
+ // Test Gannen year forcing
+ status = U_ZERO_ERROR;
+ LocalPointer<SimpleDateFormat> testFmt1(new SimpleDateFormat(patText, loc, status));
+ LocalPointer<SimpleDateFormat> testFmt2(new SimpleDateFormat(patNumr, loc, status));
+ if (U_FAILURE(status)) {
+ dataerrln("Fail in new SimpleDateFormat locale %s: %s", locID, u_errorName(status));
+ } else {
+ UnicodeString testString1, testString2;
+ testString1 = testFmt1->format(refDate, testString1);
+ if (testString1.length() < 3 || testString1.charAt(2) != 0x5143) {
+ errln(UnicodeString("Formatting year 1 in created text style, got " + testString1 + " but expected 3rd char to be 0x5143"));
+ }
+ testString2 = testFmt2->format(refDate, testString2);
+ if (testString2.length() < 2 || testString2.charAt(1) != 0x0031) {
+ errln(UnicodeString("Formatting year 1 in created numeric style, got " + testString2 + " but expected 2nd char to be 1"));
+ }
+ // Now switch the patterns and verify that Gannen use follows the pattern
+ testFmt1->applyPattern(patNumr);
+ testString1.remove();
+ testString1 = testFmt1->format(refDate, testString1);
+ if (testString1.length() < 2 || testString1.charAt(1) != 0x0031) {
+ errln(UnicodeString("Formatting year 1 in applied numeric style, got " + testString1 + " but expected 2nd char to be 1"));
+ }
+ testFmt2->applyPattern(patText);
+ testString2.remove();
+ testString2 = testFmt2->format(refDate, testString2);
+ if (testString2.length() < 3 || testString2.charAt(2) != 0x5143) {
+ errln(UnicodeString("Formatting year 1 in applied text style, got " + testString2 + " but expected 3rd char to be 0x5143"));
+ }
+ }
-
+ // Test disabling of Gannen year forcing
+ status = U_ZERO_ERROR;
+ LocalPointer<DateTimePatternGenerator> dtpgen(DateTimePatternGenerator::createInstance(loc, status));
+ if (U_FAILURE(status)) {
+ dataerrln("Fail in DateTimePatternGenerator::createInstance locale %s: %s", locID, u_errorName(status));
+ } else {
+ UnicodeString pattern = dtpgen->getBestPattern(skelText, status);
+ if (U_FAILURE(status)) {
+ dataerrln("Fail in DateTimePatternGenerator::getBestPattern locale %s: %s", locID, u_errorName(status));
+ } else {
+ // Use override string of ""
+ LocalPointer<SimpleDateFormat> testFmt3(new SimpleDateFormat(pattern, UnicodeString(""), loc, status));
+ if (U_FAILURE(status)) {
+ dataerrln("Fail in new SimpleDateFormat locale %s: %s", locID, u_errorName(status));
+ } else {
+ UnicodeString testString3;
+ testString3 = testFmt3->format(refDate, testString3);
+ if (testString3.length() < 3 || testString3.charAt(2) != 0x0031) {
+ errln(UnicodeString("Formatting year 1 with Gannen disabled, got " + testString3 + " but expected 3rd char to be 1"));
+ }
+ }
+ }
+ }
+}
/**
* Verify the Persian Calendar.
@@ -833,48 +875,42 @@ void IntlCalendarTest::TestPersian() {
void IntlCalendarTest::TestPersianFormat() {
UErrorCode status = U_ZERO_ERROR;
- SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"), Locale(" en_US@calendar=persian"), status);
+ SimpleDateFormat fmt(UnicodeString("MMMM d, yyyy G"), Locale(" en_US@calendar=persian"), status);
CHECK(status, "creating date format instance");
- SimpleDateFormat *fmt2 = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"), Locale("en_US@calendar=gregorian"), status);
+ SimpleDateFormat fmt2(UnicodeString("MMMM d, yyyy G"), Locale("en_US@calendar=gregorian"), status);
CHECK(status, "creating gregorian date format instance");
UnicodeString gregorianDate("January 18, 2007 AD");
- UDate aDate = fmt2->parse(gregorianDate, status);
- if(!fmt) {
- errln("Couldn't create en_US instance");
+ UDate aDate = fmt2.parse(gregorianDate, status);
+ UnicodeString str;
+ fmt.format(aDate, str);
+ logln(UnicodeString() + "as Persian Calendar: " + escape(str));
+ UnicodeString expected("Dey 28, 1385 AP");
+ if(str != expected) {
+ errln("Expected " + escape(expected) + " but got " + escape(str));
+ }
+ UDate otherDate = fmt.parse(expected, status);
+ if(otherDate != aDate) {
+ UnicodeString str3;
+ fmt.format(otherDate, str3);
+ errln("Parse incorrect of " + escape(expected) + " - wanted " + aDate + " but got " + otherDate + ", " + escape(str3));
} else {
- UnicodeString str;
- fmt->format(aDate, str);
- logln(UnicodeString() + "as Persian Calendar: " + escape(str));
- UnicodeString expected("Dey 28, 1385 AP");
- if(str != expected) {
- errln("Expected " + escape(expected) + " but got " + escape(str));
- }
- UDate otherDate = fmt->parse(expected, status);
- if(otherDate != aDate) {
- UnicodeString str3;
- fmt->format(otherDate, str3);
- errln("Parse incorrect of " + escape(expected) + " - wanted " + aDate + " but got " + otherDate + ", " + escape(str3));
- } else {
- logln("Parsed OK: " + expected);
- }
- // Two digit year parsing problem #4732
- fmt->applyPattern("yy-MM-dd");
- str.remove();
- fmt->format(aDate, str);
- expected.setTo("85-10-28");
- if(str != expected) {
- errln("Expected " + escape(expected) + " but got " + escape(str));
- }
- otherDate = fmt->parse(expected, status);
- if (otherDate != aDate) {
- errln("Parse incorrect of " + escape(expected) + " - wanted " + aDate + " but got " + otherDate);
- } else {
- logln("Parsed OK: " + expected);
- }
- delete fmt;
+ logln("Parsed OK: " + expected);
}
- delete fmt2;
-
+ // Two digit year parsing problem #4732
+ fmt.applyPattern("yy-MM-dd");
+ str.remove();
+ fmt.format(aDate, str);
+ expected.setTo("85-10-28");
+ if(str != expected) {
+ errln("Expected " + escape(expected) + " but got " + escape(str));
+ }
+ otherDate = fmt.parse(expected, status);
+ if (otherDate != aDate) {
+ errln("Parse incorrect of " + escape(expected) + " - wanted " + aDate + " but got " + otherDate);
+ } else {
+ logln("Parsed OK: " + expected);
+ }
+
CHECK(status, "Error occured testing Persian Calendar in English ");
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/incaltst.h b/Build/source/libs/icu/icu-src/source/test/intltest/incaltst.h
index 628b6e4cd40..2d42bcc817f 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/incaltst.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/incaltst.h
@@ -34,6 +34,7 @@ public:
void TestJapanese(void);
void TestJapaneseFormat(void);
void TestJapanese3860(void);
+ void TestForceGannenNumbering(void);
void TestPersian(void);
void TestPersianFormat(void);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/intltest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/intltest.cpp
index e85ba87fca8..15cd2d30776 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/intltest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/intltest.cpp
@@ -593,6 +593,7 @@ void IntlTest::setCaller( IntlTest* callingTest )
quick = caller->quick;
threadCount = caller->threadCount;
testoutfp = caller->testoutfp;
+ write_golden_data = caller->write_golden_data;
LL_indentlevel = caller->LL_indentlevel + indentLevel_offset;
numProps = caller->numProps;
for (int32_t i = 0; i < numProps; i++) {
@@ -637,6 +638,13 @@ UBool IntlTest::setWarnOnMissingData( UBool warn_on_missing_dataVal )
return rval;
}
+UBool IntlTest::setWriteGoldenData( UBool write_golden_data )
+{
+ UBool rval = this->write_golden_data;
+ this->write_golden_data = write_golden_data;
+ return rval;
+}
+
UBool IntlTest::setNoErrMsg( UBool no_err_msgVal )
{
UBool rval = this->no_err_msg;
@@ -1109,7 +1117,6 @@ UBool IntlTest::printKnownIssues()
}
}
-static UMutex messageMutex = U_MUTEX_INITIALIZER;
void IntlTest::LL_message( UnicodeString message, UBool newline )
{
@@ -1117,6 +1124,7 @@ void IntlTest::LL_message( UnicodeString message, UBool newline )
// All error messages generated by tests funnel through here.
// Multithreaded tests can concurrently generate errors, requiring synchronization
// to keep each message together.
+ static UMutex messageMutex;
Mutex lock(&messageMutex);
// string that starts with a LineFeed character and continues
@@ -1224,6 +1232,7 @@ main(int argc, char* argv[])
UBool utf8 = FALSE;
const char *summary_file = NULL;
UBool warnOnMissingData = FALSE;
+ UBool writeGoldenData = FALSE;
UBool defaultDataFound = FALSE;
int32_t threadCount = 12;
UErrorCode errorCode = U_ZERO_ERROR;
@@ -1265,6 +1274,9 @@ main(int argc, char* argv[])
else if (strcmp("notime", str) == 0 ||
strcmp("T", str) == 0)
no_time = TRUE;
+ else if (strcmp("goldens", str) == 0 ||
+ strcmp("G", str) == 0)
+ writeGoldenData = TRUE;
else if (strncmp("E", str, 1) == 0)
summary_file = str+1;
else if (strcmp("x", str)==0) {
@@ -1338,6 +1350,7 @@ main(int argc, char* argv[])
major.setLeaks( leaks );
major.setThreadCount( threadCount );
major.setWarnOnMissingData( warnOnMissingData );
+ major.setWriteGoldenData( writeGoldenData );
major.setNotime (no_time);
for (int32_t i = 0; i < nProps; i++) {
major.setProperty(props[i]);
@@ -1371,9 +1384,10 @@ main(int argc, char* argv[])
fprintf(stdout, " Exhaustive (e) : %s\n", (!quick? "On" : "Off"));
fprintf(stdout, " Leaks (l) : %s\n", (leaks? "On" : "Off"));
fprintf(stdout, " utf-8 (u) : %s\n", (utf8? "On" : "Off"));
- fprintf(stdout, " notime (T) : %s\n", (no_time? "On" : "Off"));
- fprintf(stdout, " noknownissues (K) : %s\n", (noKnownIssues? "On" : "Off"));
+ fprintf(stdout, " notime (T) : %s\n", (no_time? "On" : "Off"));
+ fprintf(stdout, " noknownissues (K) : %s\n", (noKnownIssues? "On" : "Off"));
fprintf(stdout, " Warn on missing data (w) : %s\n", (warnOnMissingData? "On" : "Off"));
+ fprintf(stdout, " Write golden data (G) : %s\n", (writeGoldenData? "On" : "Off"));
fprintf(stdout, " Threads : %d\n", threadCount);
for (int32_t i = 0; i < nProps; i++) {
fprintf(stdout, " Custom property (prop:) : %s\n", props[i]);
@@ -2105,6 +2119,42 @@ UBool IntlTest::assertEquals(const char* message,
}
#endif
+std::string vectorToString(const std::vector<std::string>& strings) {
+ std::string result = "{";
+ bool first = true;
+ for (auto element : strings) {
+ if (first) {
+ first = false;
+ } else {
+ result += ", ";
+ }
+ result += "\"";
+ result += element;
+ result += "\"";
+ }
+ result += "}";
+ return result;
+}
+
+UBool IntlTest::assertEquals(const char* message,
+ const std::vector<std::string>& expected,
+ const std::vector<std::string>& actual) {
+ if (expected != actual) {
+ std::string expectedAsString = vectorToString(expected);
+ std::string actualAsString = vectorToString(actual);
+ errln((UnicodeString)"FAIL: " + message +
+ "; got " + actualAsString.c_str() +
+ "; expected " + expectedAsString.c_str());
+ return FALSE;
+ }
+#ifdef VERBOSE_ASSERTIONS
+ else {
+ logln((UnicodeString)"Ok: " + message + "; got " + vectorToString(actual).c_str());
+ }
+#endif
+ return TRUE;
+}
+
static char ASSERT_BUF[256];
static const char* extractToAssertBuf(const UnicodeString& message) {
@@ -2169,6 +2219,11 @@ UBool IntlTest::assertEquals(const UnicodeString& message,
const UnicodeSet& actual) {
return assertEquals(extractToAssertBuf(message), expected, actual);
}
+UBool IntlTest::assertEquals(const UnicodeString& message,
+ const std::vector<std::string>& expected,
+ const std::vector<std::string>& actual) {
+ return assertEquals(extractToAssertBuf(message), expected, actual);
+}
#if !UCONFIG_NO_FORMATTING
UBool IntlTest::assertEquals(const UnicodeString& message,
@@ -2188,7 +2243,7 @@ void IntlTest::setProperty(const char* propline) {
const char* IntlTest::getProperty(const char* prop) {
const char* val = NULL;
for (int32_t i = 0; i < numProps; i++) {
- int32_t plen = uprv_strlen(prop);
+ int32_t plen = static_cast<int32_t>(uprv_strlen(prop));
if ((int32_t)uprv_strlen(proplines[i]) > plen + 1
&& proplines[i][plen] == '='
&& uprv_strncmp(proplines[i], prop, plen) == 0) {
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/intltest.h b/Build/source/libs/icu/icu-src/source/test/intltest/intltest.h
index ee3c88324d2..027ebaa45e3 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/intltest.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/intltest.h
@@ -18,6 +18,9 @@
#include "unicode/testlog.h"
#include "unicode/uniset.h"
+#include <vector>
+#include <string>
+
U_NAMESPACE_USE
#if U_PLATFORM == U_PF_OS390
@@ -84,7 +87,7 @@ UnicodeString toString(UBool b);
//| TESTCASE_AUTO_END;
//| }
#define TESTCASE_AUTO_BEGIN \
- for(;;) { \
+ do { \
int32_t testCaseAutoNumber = 0
#define TESTCASE_AUTO(test) \
@@ -96,7 +99,7 @@ UnicodeString toString(UBool b);
test(); \
} \
break; \
- }
+ } else (void)0
#define TESTCASE_AUTO_CLASS(TestClass) \
if (index == testCaseAutoNumber++) { \
@@ -108,7 +111,7 @@ UnicodeString toString(UBool b);
callTest(test, par); \
} \
break; \
- }
+ } else (void)0
#define TESTCASE_AUTO_CREATE_CLASS(TestClass) \
if (index == testCaseAutoNumber++) { \
@@ -120,18 +123,18 @@ UnicodeString toString(UBool b);
callTest(*test, par); \
} \
break; \
- }
+ } else (void)0
#define TESTCASE_AUTO_END \
name = ""; \
break; \
- }
+ } while (TRUE)
-#define TEST_ASSERT_TRUE(x) \
- assertTrue(#x, (x), FALSE, FALSE, __FILE__, __LINE__)
-#define TEST_ASSERT_STATUS(x) \
- assertSuccess(#x, (x), FALSE, __FILE__, __LINE__)
+// WHERE Macro yields a literal string of the form "source_file_name:line number "
+#define WHERE __FILE__ ":" XLINE(__LINE__) " "
+#define XLINE(s) LINE(s)
+#define LINE(s) #s
class IntlTest : public TestLog {
public:
@@ -147,6 +150,7 @@ public:
virtual UBool setLeaks( UBool leaks = TRUE );
virtual UBool setNotime( UBool no_time = TRUE );
virtual UBool setWarnOnMissingData( UBool warn_on_missing_data = TRUE );
+ virtual UBool setWriteGoldenData( UBool write_golden_data = TRUE );
virtual int32_t setThreadCount( int32_t count = 1);
virtual int32_t getErrors( void );
@@ -297,6 +301,8 @@ public:
UBool assertEquals(const char* message, double expected, double actual);
UBool assertEquals(const char* message, UErrorCode expected, UErrorCode actual);
UBool assertEquals(const char* message, const UnicodeSet& expected, const UnicodeSet& actual);
+ UBool assertEquals(const char* message,
+ const std::vector<std::string>& expected, const std::vector<std::string>& actual);
#if !UCONFIG_NO_FORMATTING
UBool assertEquals(const char* message, const Formattable& expected,
const Formattable& actual, UBool possibleDataError=FALSE);
@@ -315,6 +321,8 @@ public:
UBool assertEquals(const UnicodeString& message, double expected, double actual);
UBool assertEquals(const UnicodeString& message, UErrorCode expected, UErrorCode actual);
UBool assertEquals(const UnicodeString& message, const UnicodeSet& expected, const UnicodeSet& actual);
+ UBool assertEquals(const UnicodeString& message,
+ const std::vector<std::string>& expected, const std::vector<std::string>& actual);
virtual void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = NULL ); // overide !
@@ -332,6 +340,7 @@ public:
UBool quick;
UBool leaks;
UBool warn_on_missing_data;
+ UBool write_golden_data;
UBool no_time;
int32_t threadCount;
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/intltest.vcxproj b/Build/source/libs/icu/icu-src/source/test/intltest/intltest.vcxproj
index 50e0e2e89c2..dbdb3e0f06c 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/intltest.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/intltest.vcxproj
@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Label="Globals">
<ProjectGuid>{73632960-B3A6-464D-83A3-4B43365F19B8}</ProjectGuid>
<RootNamespace>intltest</RootNamespace>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -34,121 +34,55 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
<!-- Options that are common to *all* project configurations -->
<ItemDefinitionGroup>
+ <Midl>
+ <TypeLibraryName>$(OutDir)\intltest.tlb</TypeLibraryName>
+ </Midl>
<ClCompile>
<AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\..\i18n;..\..\tools\toolutil;..\..\tools\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<DisableLanguageExtensions>false</DisableLanguageExtensions>
<WarningLevel>Level3</WarningLevel>
- </ClCompile>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Midl>
- <TypeLibraryName>.\x86\Debug/intltest.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x86\Debug/intltest.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
<CompileAs>Default</CompileAs>
+ <PrecompiledHeaderOutputFile>$(OutDir)/intltest.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)/intltest.pdb</ProgramDataBaseFileName>
</ClCompile>
<Link>
- <OutputFile>.\x86\Debug/intltest.exe</OutputFile>
- <AdditionalDependencies>icuucd.lib;icuind.lib;icutud.lib;icutestd.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x86\Debug/intltest.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <FixedBaseAddress>false</FixedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <OutputFile>$(OutDir)/intltest.exe</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Midl>
- <TypeLibraryName>.\x64\Debug/intltest.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x64\Debug/intltest.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
<BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
<Link>
- <OutputFile>.\x64\Debug/intltest.exe</OutputFile>
<AdditionalDependencies>icuucd.lib;icuind.lib;icutud.lib;icutestd.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x64\Debug/intltest.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <FixedBaseAddress>false</FixedBaseAddress>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Midl>
- <TypeLibraryName>.\x86\Release/intltest.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x86\Release/intltest.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
- <CompileAs>Default</CompileAs>
- </ClCompile>
- <Link>
- <OutputFile>.\x86\Release/intltest.exe</OutputFile>
- <AdditionalDependencies>icuuc.lib;icuin.lib;icutu.lib;icutest.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x86\Release/intltest.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Midl>
- <TypeLibraryName>.\x64\Release/intltest.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x64\Release/intltest.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- <CompileAs>Default</CompileAs>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
</ClCompile>
<Link>
- <OutputFile>.\x64\Release/intltest.exe</OutputFile>
<AdditionalDependencies>icuuc.lib;icuin.lib;icutu.lib;icutest.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x64\Release/intltest.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
@@ -232,6 +166,7 @@
</ClCompile>
<ClCompile Include="dtptngts.cpp" />
<ClCompile Include="fldset.cpp" />
+ <ClCompile Include="formatted_string_builder_test.cpp" />
<ClCompile Include="genderinfotest.cpp" />
<ClCompile Include="incaltst.cpp" />
<ClCompile Include="itformat.cpp" />
@@ -251,12 +186,12 @@
<ClCompile Include="numbertest_modifiers.cpp" />
<ClCompile Include="numbertest_patternmodifier.cpp" />
<ClCompile Include="numbertest_patternstring.cpp" />
- <ClCompile Include="numbertest_stringbuilder.cpp" />
- <ClCompile Include="numbertest_stringsegment.cpp" />
+ <ClCompile Include="string_segment_test.cpp" />
<ClCompile Include="numbertest_parse.cpp" />
<ClCompile Include="numbertest_doubleconversion.cpp" />
<ClCompile Include="numbertest_skeletons.cpp" />
<ClCompile Include="numbertest_range.cpp" />
+ <ClCompile Include="numbertest_permutation.cpp" />
<ClCompile Include="numfmtst.cpp" />
<ClCompile Include="numfmtdatadriventest.cpp" />
<ClCompile Include="numrgts.cpp" />
@@ -363,6 +298,9 @@
<ClCompile Include="csdetest.cpp" />
<ClCompile Include="bidiconf.cpp" />
<ClCompile Include="listformattertest.cpp" />
+ <ClCompile Include="formattedvaluetest.cpp" />
+ <ClCompile Include="localebuildertest.cpp" />
+ <ClCompile Include="localematchertest.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="colldata.h" />
@@ -493,8 +431,9 @@
<ClInclude Include="convtest.h" />
<ClInclude Include="csdetest.h" />
<ClInclude Include="listformattertest.h" />
+ <ClInclude Include="localebuildertest.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
-</Project> \ No newline at end of file
+</Project>
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/intltest.vcxproj.filters b/Build/source/libs/icu/icu-src/source/test/intltest/intltest.vcxproj.filters
index f1b740dbe99..0bf336b01ab 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/intltest.vcxproj.filters
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/intltest.vcxproj.filters
@@ -217,6 +217,9 @@
<ClCompile Include="fldset.cpp">
<Filter>formatting</Filter>
</ClCompile>
+ <ClCompile Include="formatted_string_builder_test.cpp">
+ <Filter>formatting</Filter>
+ </ClCompile>
<ClCompile Include="genderinfotest.cpp">
<Filter>formatting</Filter>
</ClCompile>
@@ -274,10 +277,7 @@
<ClCompile Include="numbertest_patternstring.cpp">
<Filter>formatting</Filter>
</ClCompile>
- <ClCompile Include="numbertest_stringbuilder.cpp">
- <Filter>formatting</Filter>
- </ClCompile>
- <ClCompile Include="numbertest_stringsegment.cpp">
+ <ClCompile Include="string_segment_test.cpp">
<Filter>formatting</Filter>
</ClCompile>
<ClCompile Include="numbertest_parse.cpp">
@@ -292,6 +292,9 @@
<ClCompile Include="numbertest_range.cpp">
<Filter>formatting</Filter>
</ClCompile>
+ <ClCompile Include="numbertest_permutation.cpp">
+ <Filter>formatting</Filter>
+ </ClCompile>
<ClCompile Include="numfmtst.cpp">
<Filter>formatting</Filter>
</ClCompile>
@@ -538,6 +541,15 @@
<ClCompile Include="erarulestest.cpp">
<Filter>formatting</Filter>
</ClCompile>
+ <ClCompile Include="formattedvaluetest.cpp">
+ <Filter>formatting</Filter>
+ </ClCompile>
+ <ClCompile Include="localebuildertest.cpp">
+ <Filter>locales &amp; resources</Filter>
+ </ClCompile>
+ <ClCompile Include="localematchertest.cpp">
+ <Filter>locales &amp; resources</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="itrbbi.h">
@@ -924,5 +936,8 @@
<ClInclude Include="erarulestest.h">
<Filter>formatting</Filter>
</ClInclude>
+ <ClInclude Include="localebuildertest.h">
+ <Filter>locales &amp; resources</Filter>
+ </ClInclude>
</ItemGroup>
-</Project> \ No newline at end of file
+</Project>
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/itformat.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/itformat.cpp
index d450922eb6e..870728a9a0a 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/itformat.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/itformat.cpp
@@ -71,6 +71,9 @@ extern IntlTest *createTimeUnitTest();
extern IntlTest *createMeasureFormatTest();
extern IntlTest *createNumberFormatSpecificationTest();
extern IntlTest *createScientificNumberFormatterTest();
+extern IntlTest *createFormattedValueTest();
+extern IntlTest *createFormattedStringBuilderTest();
+extern IntlTest *createStringSegmentTest();
#define TESTCLASS(id, TestClass) \
@@ -217,6 +220,33 @@ void IntlTestFormat::runIndexedTest( int32_t index, UBool exec, const char* &nam
TESTCLASS(50,NumberFormatDataDrivenTest);
TESTCLASS(51,NumberTest);
TESTCLASS(52,EraRulesTest);
+ case 53:
+ name = "FormattedValueTest";
+ if (exec) {
+ logln("FormattedValueTest test---");
+ logln((UnicodeString)"");
+ LocalPointer<IntlTest> test(createFormattedValueTest());
+ callTest(*test, par);
+ }
+ break;
+ case 54:
+ name = "FormattedStringBuilderTest";
+ if (exec) {
+ logln("FormattedStringBuilderTest test---");
+ logln((UnicodeString)"");
+ LocalPointer<IntlTest> test(createFormattedStringBuilderTest());
+ callTest(*test, par);
+ }
+ break;
+ case 55:
+ name = "StringSegmentTest";
+ if (exec) {
+ logln("StringSegmentTest test---");
+ logln((UnicodeString)"");
+ LocalPointer<IntlTest> test(createStringSegmentTest());
+ callTest(*test, par);
+ }
+ break;
default: name = ""; break; //needed to end loop
}
if (exec) {
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/itformat.h b/Build/source/libs/icu/icu-src/source/test/intltest/itformat.h
index 5af7601fb56..d8b17993c30 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/itformat.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/itformat.h
@@ -17,6 +17,7 @@
#if !UCONFIG_NO_FORMATTING
+#include "unicode/formattedvalue.h"
#include "intltest.h"
@@ -24,6 +25,33 @@ class IntlTestFormat: public IntlTest {
void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = NULL );
};
+
+typedef struct UFieldPositionWithCategory {
+ UFieldCategory category;
+ int32_t field;
+ int32_t beginIndex;
+ int32_t endIndex;
+} UFieldPositionWithCategory;
+
+class IntlTestWithFieldPosition : public IntlTest {
+public:
+ void checkFormattedValue(
+ const char16_t* message,
+ const FormattedValue& fv,
+ UnicodeString expectedString,
+ UFieldCategory expectedCategory,
+ const UFieldPosition* expectedFieldPositions,
+ int32_t length);
+
+ void checkMixedFormattedValue(
+ const char16_t* message,
+ const FormattedValue& fv,
+ UnicodeString expectedString,
+ const UFieldPositionWithCategory* expectedFieldPositions,
+ int32_t length);
+};
+
+
#endif /* #if !UCONFIG_NO_FORMATTING */
#endif
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/itrbnf.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/itrbnf.cpp
index 549f24ca059..ed4e865aaa3 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/itrbnf.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/itrbnf.cpp
@@ -166,7 +166,7 @@ IntlTestRBNF::TestAPI() {
// test clone
{
logln("Testing Clone");
- RuleBasedNumberFormat* rbnfClone = (RuleBasedNumberFormat *)formatter->clone();
+ RuleBasedNumberFormat* rbnfClone = formatter->clone();
if(rbnfClone != NULL) {
if(!(*rbnfClone == *formatter)) {
errln("Clone should be semantically equivalent to the original!");
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/itspoof.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/itspoof.cpp
index 4a441ddce1c..13861cc126d 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/itspoof.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/itspoof.cpp
@@ -29,22 +29,37 @@
#include <stdlib.h>
#include <stdio.h>
-#define TEST_ASSERT_SUCCESS(status) {if (U_FAILURE(status)) { \
- errcheckln(status, "Failure at file %s, line %d, error = %s", __FILE__, __LINE__, u_errorName(status));}}
-
-#define TEST_ASSERT(expr) {if ((expr)==FALSE) { \
- errln("Test Failure at file %s, line %d: \"%s\" is false.", __FILE__, __LINE__, #expr);};}
-
-#define TEST_ASSERT_MSG(expr, msg) {if ((expr)==FALSE) { \
- dataerrln("Test Failure at file %s, line %d, %s: \"%s\" is false.", __FILE__, __LINE__, msg, #expr);};}
-
-#define TEST_ASSERT_EQ(a, b) { if ((a) != (b)) { \
- errln("Test Failure at file %s, line %d: \"%s\" (%d) != \"%s\" (%d)", \
- __FILE__, __LINE__, #a, (a), #b, (b)); }}
-
-#define TEST_ASSERT_NE(a, b) { if ((a) == (b)) { \
- errln("Test Failure at file %s, line %d: \"%s\" (%d) == \"%s\" (%d)", \
- __FILE__, __LINE__, #a, (a), #b, (b)); }}
+#define TEST_ASSERT_SUCCESS(status) UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(status)) { \
+ errcheckln(status, "Failure at file %s, line %d, error = %s", __FILE__, __LINE__, u_errorName(status)); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define TEST_ASSERT(expr) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expr)==FALSE) { \
+ errln("Test Failure at file %s, line %d: \"%s\" is false.", __FILE__, __LINE__, #expr); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define TEST_ASSERT_MSG(expr, msg) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expr)==FALSE) { \
+ dataerrln("Test Failure at file %s, line %d, %s: \"%s\" is false.", __FILE__, __LINE__, msg, #expr); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define TEST_ASSERT_EQ(a, b) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((a) != (b)) { \
+ errln("Test Failure at file %s, line %d: \"%s\" (%d) != \"%s\" (%d)", \
+ __FILE__, __LINE__, #a, (a), #b, (b)); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define TEST_ASSERT_NE(a, b) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((a) == (b)) { \
+ errln("Test Failure at file %s, line %d: \"%s\" (%d) == \"%s\" (%d)", \
+ __FILE__, __LINE__, #a, (a), #b, (b)); \
+ } \
+} UPRV_BLOCK_MACRO_END
/*
* TEST_SETUP and TEST_TEARDOWN
@@ -52,7 +67,7 @@
* Put arbitrary test code between SETUP and TEARDOWN.
* "sc" is the ready-to-go SpoofChecker for use in the tests.
*/
-#define TEST_SETUP { \
+#define TEST_SETUP UPRV_BLOCK_MACRO_BEGIN { \
UErrorCode status = U_ZERO_ERROR; \
USpoofChecker *sc; \
sc = uspoof_open(&status); \
@@ -67,7 +82,7 @@
TEST_ASSERT_SUCCESS(status); \
uspoof_closeCheckResult(checkResult); \
uspoof_close(sc); \
-}
+} UPRV_BLOCK_MACRO_END
@@ -128,9 +143,9 @@ void IntlTestSpoof::testSpoofAPI() {
}
-#define CHECK_SKELETON(type, input, expected) { \
+#define CHECK_SKELETON(type, input, expected) UPRV_BLOCK_MACRO_BEGIN { \
checkSkeleton(sc, type, input, expected, __LINE__); \
- }
+} UPRV_BLOCK_MACRO_END
// testSkeleton. Spot check a number of confusable skeleton substitutions from the
@@ -341,7 +356,7 @@ void IntlTestSpoof::testConfData() {
int32_t fileSize = ftell(f.getAlias());
LocalArray<char> fileBuf(new char[fileSize]);
fseek(f.getAlias(), 0, SEEK_SET);
- int32_t amt_read = fread(fileBuf.getAlias(), 1, fileSize, f.getAlias());
+ int32_t amt_read = static_cast<int32_t>(fread(fileBuf.getAlias(), 1, fileSize, f.getAlias()));
TEST_ASSERT_EQ(amt_read, fileSize);
TEST_ASSERT(fileSize>0);
if (amt_read != fileSize || fileSize <=0) {
@@ -639,7 +654,7 @@ void IntlTestSpoof::testMixedNumbers() {
TEST_ASSERT_MSG((expectedSet.size() > 1) == mixedNumberFailure, msgBuf);
const UnicodeSet* actualSet = UnicodeSet::fromUSet(uspoof_getCheckResultNumerics(checkResult, &status));
TEST_ASSERT_MSG(expectedSet == *actualSet, msgBuf);
- TEST_TEARDOWN
+ TEST_TEARDOWN;
}
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/itutil.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/itutil.cpp
index 4d3466120cf..228dbf2f218 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/itutil.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/itutil.cpp
@@ -6,6 +6,7 @@
* others. All Rights Reserved.
********************************************************************/
+#include <utility>
/**
* IntlTestUtilities is the medium level test class for everything in the directory "utility".
@@ -18,6 +19,7 @@
#include "itutil.h"
#include "strtest.h"
#include "loctest.h"
+#include "localebuildertest.h"
#include "citrtest.h"
#include "ustrtest.h"
#include "ucdtest.h"
@@ -33,6 +35,7 @@
#include "usettest.h"
extern IntlTest *createBytesTrieTest();
+extern IntlTest *createLocaleMatcherTest();
static IntlTest *createLocalPointerTest();
extern IntlTest *createUCharsTrieTest();
static IntlTest *createEnumSetTest();
@@ -44,112 +47,40 @@ extern IntlTest *createPluralMapTest();
extern IntlTest *createStaticUnicodeSetsTest();
#endif
-
-#define CASE(id, test) case id: \
- name = #test; \
- if (exec) { \
- logln(#test "---"); logln(); \
- test t; \
- callTest(t, par); \
- } \
- break
-
void IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* &name, char* par )
{
if (exec) logln("TestSuite Utilities: ");
- switch (index) {
- CASE(0, MultithreadTest);
- CASE(1, StringTest);
- CASE(2, UnicodeStringTest);
- CASE(3, LocaleTest);
- CASE(4, CharIterTest);
- CASE(5, UObjectTest);
- CASE(6, UnicodeTest);
- CASE(7, ResourceBundleTest);
- CASE(8, NewResourceBundleTest);
- CASE(9, PUtilTest);
- CASE(10, UVector32Test);
- CASE(11, UVectorTest);
- CASE(12, UTextTest);
- CASE(13, LocaleAliasTest);
- CASE(14, UnicodeSetTest);
- CASE(15, ErrorCodeTest);
- case 16:
- name = "LocalPointerTest";
- if (exec) {
- logln("TestSuite LocalPointerTest---"); logln();
- LocalPointer<IntlTest> test(createLocalPointerTest());
- callTest(*test, par);
- }
- break;
- case 17:
- name = "BytesTrieTest";
- if (exec) {
- logln("TestSuite BytesTrieTest---"); logln();
- LocalPointer<IntlTest> test(createBytesTrieTest());
- callTest(*test, par);
- }
- break;
- case 18:
- name = "UCharsTrieTest";
- if (exec) {
- logln("TestSuite UCharsTrieTest---"); logln();
- LocalPointer<IntlTest> test(createUCharsTrieTest());
- callTest(*test, par);
- }
- break;
- case 19:
- name = "EnumSetTest";
- if (exec) {
- logln("TestSuite EnumSetTest---"); logln();
- LocalPointer<IntlTest> test(createEnumSetTest());
- callTest(*test, par);
- }
- break;
- case 20:
- name = "SimpleFormatterTest";
- if (exec) {
- logln("TestSuite SimpleFormatterTest---"); logln();
- LocalPointer<IntlTest> test(createSimpleFormatterTest());
- callTest(*test, par);
- }
- break;
- case 21:
- name = "UnifiedCacheTest";
- if (exec) {
- logln("TestSuite UnifiedCacheTest---"); logln();
- LocalPointer<IntlTest> test(createUnifiedCacheTest());
- callTest(*test, par);
- }
- break;
- case 22:
- name = "QuantityFormatterTest";
- if (exec) {
- logln("TestSuite QuantityFormatterTest---"); logln();
- LocalPointer<IntlTest> test(createQuantityFormatterTest());
- callTest(*test, par);
- }
- break;
- case 23:
- name = "PluralMapTest";
- if (exec) {
- logln("TestSuite PluralMapTest---"); logln();
- LocalPointer<IntlTest> test(createPluralMapTest());
- callTest(*test, par);
- }
- break;
- case 24:
- name = "StaticUnicodeSetsTest";
+ TESTCASE_AUTO_BEGIN;
+ TESTCASE_AUTO_CLASS(MultithreadTest);
+ TESTCASE_AUTO_CLASS(StringTest);
+ TESTCASE_AUTO_CLASS(UnicodeStringTest);
+ TESTCASE_AUTO_CLASS(LocaleTest);
+ TESTCASE_AUTO_CLASS(CharIterTest);
+ TESTCASE_AUTO_CLASS(UObjectTest);
+ TESTCASE_AUTO_CLASS(UnicodeTest);
+ TESTCASE_AUTO_CLASS(ResourceBundleTest);
+ TESTCASE_AUTO_CLASS(NewResourceBundleTest);
+ TESTCASE_AUTO_CLASS(PUtilTest);
+ TESTCASE_AUTO_CLASS(UVector32Test);
+ TESTCASE_AUTO_CLASS(UVectorTest);
+ TESTCASE_AUTO_CLASS(UTextTest);
+ TESTCASE_AUTO_CLASS(LocaleAliasTest);
+ TESTCASE_AUTO_CLASS(UnicodeSetTest);
+ TESTCASE_AUTO_CLASS(ErrorCodeTest);
+ TESTCASE_AUTO_CREATE_CLASS(LocalPointerTest);
+ TESTCASE_AUTO_CREATE_CLASS(BytesTrieTest);
+ TESTCASE_AUTO_CREATE_CLASS(UCharsTrieTest);
+ TESTCASE_AUTO_CREATE_CLASS(EnumSetTest);
+ TESTCASE_AUTO_CREATE_CLASS(SimpleFormatterTest);
+ TESTCASE_AUTO_CREATE_CLASS(UnifiedCacheTest);
+ TESTCASE_AUTO_CREATE_CLASS(QuantityFormatterTest);
+ TESTCASE_AUTO_CREATE_CLASS(PluralMapTest);
#if !UCONFIG_NO_FORMATTING
- if (exec) {
- logln("TestSuite StaticUnicodeSetsTest---"); logln();
- LocalPointer<IntlTest> test(createStaticUnicodeSetsTest());
- callTest(*test, par);
- }
+ TESTCASE_AUTO_CREATE_CLASS(StaticUnicodeSetsTest);
#endif
- break;
- default: name = ""; break; //needed to end loop
- }
+ TESTCASE_AUTO_CLASS(LocaleBuilderTest);
+ TESTCASE_AUTO_CREATE_CLASS(LocaleMatcherTest);
+ TESTCASE_AUTO_END;
}
void ErrorCodeTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/) {
@@ -385,11 +316,14 @@ public:
void TestLocalPointer();
void TestLocalPointerMoveSwap();
+ void TestLocalPointerStdUniquePtr();
void TestLocalArray();
void TestLocalArrayMoveSwap();
+ void TestLocalArrayStdUniquePtr();
void TestLocalXyzPointer();
void TestLocalXyzPointerMoveSwap();
void TestLocalXyzPointerNull();
+ void TestLocalXyzStdUniquePtr();
};
static IntlTest *createLocalPointerTest() {
@@ -403,11 +337,14 @@ void LocalPointerTest::runIndexedTest(int32_t index, UBool exec, const char *&na
TESTCASE_AUTO_BEGIN;
TESTCASE_AUTO(TestLocalPointer);
TESTCASE_AUTO(TestLocalPointerMoveSwap);
+ TESTCASE_AUTO(TestLocalPointerStdUniquePtr);
TESTCASE_AUTO(TestLocalArray);
TESTCASE_AUTO(TestLocalArrayMoveSwap);
+ TESTCASE_AUTO(TestLocalArrayStdUniquePtr);
TESTCASE_AUTO(TestLocalXyzPointer);
TESTCASE_AUTO(TestLocalXyzPointerMoveSwap);
TESTCASE_AUTO(TestLocalXyzPointerNull);
+ TESTCASE_AUTO(TestLocalXyzStdUniquePtr);
TESTCASE_AUTO_END;
}
@@ -479,6 +416,12 @@ void LocalPointerTest::TestLocalPointer() {
// destructor
}
+// Try to avoid clang -Wself-move warnings from s1 = std::move(s1);
+template<typename T>
+void moveFrom(T &dest, T &src) {
+ dest = std::move(src);
+}
+
void LocalPointerTest::TestLocalPointerMoveSwap() {
UnicodeString *p1 = new UnicodeString((UChar)0x61);
UnicodeString *p2 = new UnicodeString((UChar)0x62);
@@ -493,9 +436,9 @@ void LocalPointerTest::TestLocalPointerMoveSwap() {
errln("swap(LocalPointer) did not swap back");
}
LocalPointer<UnicodeString> s3;
- s3.moveFrom(s1);
+ s3 = std::move(s1);
if(s3.getAlias() != p1 || s1.isValid()) {
- errln("LocalPointer.moveFrom() did not move");
+ errln("LocalPointer = std::move() did not move");
}
infoln("TestLocalPointerMoveSwap() with rvalue references");
s1 = static_cast<LocalPointer<UnicodeString> &&>(s3);
@@ -510,8 +453,21 @@ void LocalPointerTest::TestLocalPointerMoveSwap() {
// Move self assignment leaves the object valid but in an undefined state.
// Do it to make sure there is no crash,
// but do not check for any particular resulting value.
- s1.moveFrom(s1);
- s3.moveFrom(s3);
+ moveFrom(s1, s1);
+ moveFrom(s3, s3);
+}
+
+void LocalPointerTest::TestLocalPointerStdUniquePtr() {
+ auto* ptr = new UnicodeString((UChar32)0x50005);
+ // Implicit conversion operator
+ std::unique_ptr<UnicodeString> s = LocalPointer<UnicodeString>(ptr);
+ // Explicit move constructor
+ LocalPointer<UnicodeString> s2(std::move(s));
+ // Conversion operator should also work with std::move
+ s = std::move(s2);
+ // Back again with move assignment
+ s2 = std::move(s);
+ assertTrue("Pointer should remain the same", ptr == s2.getAlias());
}
// Exercise almost every LocalArray method (but not LocalPointerBase).
@@ -586,9 +542,9 @@ void LocalPointerTest::TestLocalArrayMoveSwap() {
errln("swap(LocalArray) did not swap back");
}
LocalArray<UnicodeString> a3;
- a3.moveFrom(a1);
+ a3 = std::move(a1);
if(a3.getAlias() != p1 || a1.isValid()) {
- errln("LocalArray.moveFrom() did not move");
+ errln("LocalArray = std::move() did not move");
}
infoln("TestLocalArrayMoveSwap() with rvalue references");
a1 = static_cast<LocalArray<UnicodeString> &&>(a3);
@@ -603,8 +559,21 @@ void LocalPointerTest::TestLocalArrayMoveSwap() {
// Move self assignment leaves the object valid but in an undefined state.
// Do it to make sure there is no crash,
// but do not check for any particular resulting value.
- a1.moveFrom(a1);
- a3.moveFrom(a3);
+ moveFrom(a1, a1);
+ moveFrom(a3, a3);
+}
+
+void LocalPointerTest::TestLocalArrayStdUniquePtr() {
+ auto* ptr = new UnicodeString[2];
+ // Implicit conversion operator
+ std::unique_ptr<UnicodeString[]> a = LocalArray<UnicodeString>(ptr);
+ // Explicit move constructor
+ LocalArray<UnicodeString> a2(std::move(a));
+ // Conversion operator should also work with std::move
+ a = std::move(a2);
+ // Back again with move assignment
+ a2 = std::move(a);
+ assertTrue("Pointer should remain the same", ptr == a2.getAlias());
}
#include "unicode/ucnvsel.h"
@@ -616,6 +585,7 @@ void LocalPointerTest::TestLocalArrayMoveSwap() {
#include "unicode/unorm2.h"
#include "unicode/uregex.h"
#include "unicode/utrans.h"
+#include "unicode/uformattedvalue.h"
// Use LocalXyzPointer types that are not covered elsewhere in the intltest suite.
void LocalPointerTest::TestLocalXyzPointer() {
@@ -754,9 +724,9 @@ void LocalPointerTest::TestLocalXyzPointerMoveSwap() {
errln("swap(LocalUNormalizer2Pointer) did not swap back");
}
LocalUNormalizer2Pointer f3;
- f3.moveFrom(f1);
+ f3 = std::move(f1);
if(f3.getAlias() != p1 || f1.isValid()) {
- errln("LocalUNormalizer2Pointer.moveFrom() did not move");
+ errln("LocalUNormalizer2Pointer = std::move() did not move");
}
infoln("TestLocalXyzPointerMoveSwap() with rvalue references");
f1 = static_cast<LocalUNormalizer2Pointer &&>(f3);
@@ -770,8 +740,8 @@ void LocalPointerTest::TestLocalXyzPointerMoveSwap() {
// Move self assignment leaves the object valid but in an undefined state.
// Do it to make sure there is no crash,
// but do not check for any particular resulting value.
- f1.moveFrom(f1);
- f3.moveFrom(f3);
+ moveFrom(f1, f1);
+ moveFrom(f3, f3);
#endif /* !UCONFIG_NO_NORMALIZATION */
}
@@ -838,6 +808,23 @@ void LocalPointerTest::TestLocalXyzPointerNull() {
}
+void LocalPointerTest::TestLocalXyzStdUniquePtr() {
+ IcuTestErrorCode status(*this, "TestLocalXyzStdUniquePtr");
+#if !UCONFIG_NO_FORMATTING
+ auto* ptr = ucfpos_open(status);
+ // Implicit conversion operator
+ std::unique_ptr<UConstrainedFieldPosition, void(*)(UConstrainedFieldPosition*)> a =
+ LocalUConstrainedFieldPositionPointer(ptr);
+ // Explicit move constructor
+ LocalUConstrainedFieldPositionPointer a2(std::move(a));
+ // Conversion operator should also work with std::move
+ a = std::move(a2);
+ // Back again with move assignment
+ a2 = std::move(a);
+ assertTrue("Pointer should remain the same", ptr == a2.getAlias());
+#endif // UCONFIG_NO_FORMATTING
+}
+
/** EnumSet test **/
#include "unicode/enumset.h"
@@ -874,47 +861,47 @@ void EnumSetTest::TestEnumSet() {
logln("Enum is from [%d..%d]\n", MAX_NONBOOLEAN+1,
LIMIT_BOOLEAN);
- TEST_ASSERT_TRUE(flags.get(THING1) == FALSE);
- TEST_ASSERT_TRUE(flags.get(THING2) == FALSE);
- TEST_ASSERT_TRUE(flags.get(THING3) == FALSE);
+ assertFalse(WHERE, flags.get(THING1));
+ assertFalse(WHERE, flags.get(THING2));
+ assertFalse(WHERE, flags.get(THING3));
logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get(THING1), flags.get(THING2), flags.get(THING3));
logln("Value now: %d\n", flags.getAll());
flags.clear();
logln("clear -Value now: %d\n", flags.getAll());
logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get(THING1), flags.get(THING2), flags.get(THING3));
- TEST_ASSERT_TRUE(flags.get(THING1) == FALSE);
- TEST_ASSERT_TRUE(flags.get(THING2) == FALSE);
- TEST_ASSERT_TRUE(flags.get(THING3) == FALSE);
+ assertFalse(WHERE, flags.get(THING1));
+ assertFalse(WHERE, flags.get(THING2));
+ assertFalse(WHERE, flags.get(THING3));
flags.add(THING1);
logln("set THING1 -Value now: %d\n", flags.getAll());
- TEST_ASSERT_TRUE(flags.get(THING1) == TRUE);
- TEST_ASSERT_TRUE(flags.get(THING2) == FALSE);
- TEST_ASSERT_TRUE(flags.get(THING3) == FALSE);
+ assertTrue(WHERE, flags.get(THING1));
+ assertFalse(WHERE, flags.get(THING2));
+ assertFalse(WHERE, flags.get(THING3));
logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get(THING1), flags.get(THING2), flags.get(THING3));
flags.add(THING3);
logln("set THING3 -Value now: %d\n", flags.getAll());
- TEST_ASSERT_TRUE(flags.get(THING1) == TRUE);
- TEST_ASSERT_TRUE(flags.get(THING2) == FALSE);
- TEST_ASSERT_TRUE(flags.get(THING3) == TRUE);
+ assertTrue(WHERE, flags.get(THING1));
+ assertFalse(WHERE, flags.get(THING2));
+ assertTrue(WHERE, flags.get(THING3));
logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get(THING1), flags.get(THING2), flags.get(THING3));
flags.remove(THING2);
- TEST_ASSERT_TRUE(flags.get(THING1) == TRUE);
- TEST_ASSERT_TRUE(flags.get(THING2) == FALSE);
- TEST_ASSERT_TRUE(flags.get(THING3) == TRUE);
+ assertTrue(WHERE, flags.get(THING1));
+ assertFalse(WHERE, flags.get(THING2));
+ assertTrue(WHERE, flags.get(THING3));
logln("remove THING2 -Value now: %d\n", flags.getAll());
logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get(THING1), flags.get(THING2), flags.get(THING3));
flags.remove(THING1);
- TEST_ASSERT_TRUE(flags.get(THING1) == FALSE);
- TEST_ASSERT_TRUE(flags.get(THING2) == FALSE);
- TEST_ASSERT_TRUE(flags.get(THING3) == TRUE);
+ assertFalse(WHERE, flags.get(THING1));
+ assertFalse(WHERE, flags.get(THING2));
+ assertTrue(WHERE, flags.get(THING3));
logln("remove THING1 -Value now: %d\n", flags.getAll());
logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get(THING1), flags.get(THING2), flags.get(THING3));
flags.clear();
logln("clear -Value now: %d\n", flags.getAll());
logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get(THING1), flags.get(THING2), flags.get(THING3));
- TEST_ASSERT_TRUE(flags.get(THING1) == FALSE);
- TEST_ASSERT_TRUE(flags.get(THING2) == FALSE);
- TEST_ASSERT_TRUE(flags.get(THING3) == FALSE);
+ assertFalse(WHERE, flags.get(THING1));
+ assertFalse(WHERE, flags.get(THING2));
+ assertFalse(WHERE, flags.get(THING3));
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/listformattertest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/listformattertest.cpp
index 4cd1c1411c6..763f933095e 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/listformattertest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/listformattertest.cpp
@@ -18,6 +18,7 @@
#include "listformattertest.h"
#include "unicode/ulistformatter.h"
+#include "cmemory.h"
#include <string.h>
#if !UCONFIG_NO_FORMATTING
@@ -540,6 +541,76 @@ void ListFormatterTest::TestOutOfOrderPatterns() {
CheckFormatting(&formatter, input4, 4, results[3], "TestOutOfOrderPatterns()");
}
+void ListFormatterTest::TestFormattedValue() {
+ IcuTestErrorCode status(*this, "TestFormattedValue");
+ LocalPointer<ListFormatter> fmt(ListFormatter::createInstance("en", status));
+ if (status.errIfFailureAndReset()) { return; }
+
+ {
+ const char16_t* message = u"Field position test 1";
+ const char16_t* expectedString = u"hello, wonderful, and world";
+ const UnicodeString inputs[] = {
+ u"hello",
+ u"wonderful",
+ u"world"
+ };
+ FormattedList result = fmt->formatStringsToValue(inputs, UPRV_LENGTHOF(inputs), status);
+ static const UFieldPositionWithCategory expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UFIELD_CATEGORY_LIST_SPAN, 0, 0, 5},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 0, 5},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD, 5, 7},
+ {UFIELD_CATEGORY_LIST_SPAN, 1, 7, 16},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 7, 16},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD, 16, 22},
+ {UFIELD_CATEGORY_LIST_SPAN, 2, 22, 27},
+ {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 22, 27}};
+ checkMixedFormattedValue(
+ message,
+ result,
+ expectedString,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+}
+
+void ListFormatterTest::DoTheRealListStyleTesting(Locale locale,
+ UnicodeString items[], int itemCount,
+ const char* style, const char* expected, IcuTestErrorCode status) {
+
+ LocalPointer<ListFormatter> formatter(
+ ListFormatter::createInstance(locale, style, status));
+
+ UnicodeString actualResult;
+ formatter->format(items, itemCount, actualResult, status);
+ assertEquals(style, UnicodeString(expected), actualResult);
+}
+
+void ListFormatterTest::TestDifferentStyles() {
+ Locale locale("fr");
+ UnicodeString input[4] = { u"rouge", u"jaune", u"bleu", u"vert" };
+ IcuTestErrorCode status(*this, "TestDifferentStyles()");
+
+ DoTheRealListStyleTesting(locale, input, 4, "standard", "rouge, jaune, bleu et vert", status);
+ DoTheRealListStyleTesting(locale, input, 4, "or", "rouge, jaune, bleu ou vert", status);
+ DoTheRealListStyleTesting(locale, input, 4, "unit", "rouge, jaune, bleu et vert", status);
+ DoTheRealListStyleTesting(locale, input, 4, "unit-narrow", "rouge jaune bleu vert", status);
+ DoTheRealListStyleTesting(locale, input, 4, "unit-short", "rouge, jaune, bleu et vert", status);
+}
+
+void ListFormatterTest::TestBadStylesFail() {
+ Locale locale("fr");
+ const char * badStyles[4] = { "", "duration", "duration-short", "something-clearly-wrong" };
+ IcuTestErrorCode status(*this, "TestBadStylesFail()");
+
+ for (int i = 0; i < 4; ++i) {
+ LocalPointer<ListFormatter> formatter(ListFormatter::createInstance(locale, badStyles[i], status));
+ if (!status.expectErrorAndReset(U_MISSING_RESOURCE_ERROR, "style \"%s\"", badStyles[i])) {
+ // Do nothing, expectErrorAndReset already reports the error
+ }
+ }
+}
+
void ListFormatterTest::runIndexedTest(int32_t index, UBool exec,
const char* &name, char* /*par */) {
switch(index) {
@@ -582,6 +653,15 @@ void ListFormatterTest::runIndexedTest(int32_t index, UBool exec,
case 20: name = "TestFieldPositionIteratorWith3ItemsPatternShift";
if (exec) TestFieldPositionIteratorWith3ItemsPatternShift();
break;
+ case 21: name = "TestFormattedValue";
+ if (exec) TestFormattedValue();
+ break;
+ case 22: name = "TestDifferentStyles";
+ if (exec) TestDifferentStyles();
+ break;
+ case 23: name = "TestBadStylesFail";
+ if (exec) TestBadStylesFail();
+ break;
default: name = ""; break;
}
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/listformattertest.h b/Build/source/libs/icu/icu-src/source/test/intltest/listformattertest.h
index 61aad7ca614..decd13bcf6a 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/listformattertest.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/listformattertest.h
@@ -22,8 +22,11 @@
#include "unicode/fpositer.h"
#include "unicode/listformatter.h"
#include "intltest.h"
+#include "itformat.h"
-class ListFormatterTest : public IntlTest {
+#if !UCONFIG_NO_FORMATTING
+
+class ListFormatterTest : public IntlTestWithFieldPosition {
public:
ListFormatterTest();
virtual ~ListFormatterTest() {}
@@ -51,6 +54,9 @@ class ListFormatterTest : public IntlTest {
void TestFieldPositionIteratorWith3ItemsAndDataBefore();
void TestFieldPositionIteratorWith2ItemsPatternShift();
void TestFieldPositionIteratorWith3ItemsPatternShift();
+ void TestFormattedValue();
+ void TestDifferentStyles();
+ void TestBadStylesFail();
private:
void CheckFormatting(
@@ -104,6 +110,13 @@ class ListFormatterTest : public IntlTest {
UnicodeString four,
UnicodeString results[4],
const char* testName);
+ void DoTheRealListStyleTesting(
+ Locale locale,
+ UnicodeString items[],
+ int32_t itemCount,
+ const char* style,
+ const char* expected,
+ IcuTestErrorCode status);
private:
// Reused test data.
@@ -114,4 +127,6 @@ class ListFormatterTest : public IntlTest {
const UnicodeString four;
};
+#endif /* #if !UCONFIG_NO_FORMATTING */
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/localebuildertest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/localebuildertest.cpp
new file mode 100644
index 00000000000..b551bf8e6e9
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/localebuildertest.cpp
@@ -0,0 +1,1672 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include <memory>
+
+#include "cmemory.h"
+#include "cstring.h"
+#include "localebuildertest.h"
+#include "unicode/localebuilder.h"
+#include "unicode/strenum.h"
+
+LocaleBuilderTest::LocaleBuilderTest()
+{
+}
+
+LocaleBuilderTest::~LocaleBuilderTest()
+{
+}
+
+void LocaleBuilderTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
+{
+ TESTCASE_AUTO_BEGIN;
+ TESTCASE_AUTO(TestAddRemoveUnicodeLocaleAttribute);
+ TESTCASE_AUTO(TestAddRemoveUnicodeLocaleAttributeWellFormed);
+ TESTCASE_AUTO(TestAddUnicodeLocaleAttributeIllFormed);
+ TESTCASE_AUTO(TestLocaleBuilder);
+ TESTCASE_AUTO(TestLocaleBuilderBasic);
+ TESTCASE_AUTO(TestPosixCases);
+ TESTCASE_AUTO(TestSetExtensionOthers);
+ TESTCASE_AUTO(TestSetExtensionPU);
+ TESTCASE_AUTO(TestSetExtensionT);
+ TESTCASE_AUTO(TestSetExtensionU);
+ TESTCASE_AUTO(TestSetExtensionValidateOthersIllFormed);
+ TESTCASE_AUTO(TestSetExtensionValidateOthersWellFormed);
+ TESTCASE_AUTO(TestSetExtensionValidatePUIllFormed);
+ TESTCASE_AUTO(TestSetExtensionValidatePUWellFormed);
+ TESTCASE_AUTO(TestSetExtensionValidateTIllFormed);
+ TESTCASE_AUTO(TestSetExtensionValidateTWellFormed);
+ TESTCASE_AUTO(TestSetExtensionValidateUIllFormed);
+ TESTCASE_AUTO(TestSetExtensionValidateUWellFormed);
+ TESTCASE_AUTO(TestSetLanguageIllFormed);
+ TESTCASE_AUTO(TestSetLanguageWellFormed);
+ TESTCASE_AUTO(TestSetLocale);
+ TESTCASE_AUTO(TestSetRegionIllFormed);
+ TESTCASE_AUTO(TestSetRegionWellFormed);
+ TESTCASE_AUTO(TestSetScriptIllFormed);
+ TESTCASE_AUTO(TestSetScriptWellFormed);
+ TESTCASE_AUTO(TestSetUnicodeLocaleKeywordIllFormedKey);
+ TESTCASE_AUTO(TestSetUnicodeLocaleKeywordIllFormedValue);
+ TESTCASE_AUTO(TestSetUnicodeLocaleKeywordWellFormed);
+ TESTCASE_AUTO(TestSetVariantIllFormed);
+ TESTCASE_AUTO(TestSetVariantWellFormed);
+ TESTCASE_AUTO_END;
+}
+
+void LocaleBuilderTest::Verify(LocaleBuilder& bld, const char* expected, const char* msg) {
+ UErrorCode status = U_ZERO_ERROR;
+ UErrorCode copyStatus = U_ZERO_ERROR;
+ UErrorCode errorStatus = U_ILLEGAL_ARGUMENT_ERROR;
+ if (bld.copyErrorTo(copyStatus)) {
+ errln(msg, u_errorName(copyStatus));
+ }
+ if (!bld.copyErrorTo(errorStatus) || errorStatus != U_ILLEGAL_ARGUMENT_ERROR) {
+ errln("Should always get the previous error and return FALSE");
+ }
+ Locale loc = bld.build(status);
+ if (U_FAILURE(status)) {
+ errln(msg, u_errorName(status));
+ }
+ if (status != copyStatus) {
+ errln(msg, u_errorName(status));
+ }
+ std::string tag = loc.toLanguageTag<std::string>(status);
+ if (U_FAILURE(status)) {
+ errln("loc.toLanguageTag() got Error: %s\n",
+ u_errorName(status));
+ }
+ if (tag != expected) {
+ errln("should get \"%s\", but got \"%s\"\n", expected, tag.c_str());
+ }
+}
+
+void LocaleBuilderTest::TestLocaleBuilder() {
+ // The following test data are copy from
+ // icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/LocaleBuilderTest.java
+ // "L": +1 = language
+ // "S": +1 = script
+ // "R": +1 = region
+ // "V": +1 = variant
+ // "K": +1 = Unicode locale key / +2 = Unicode locale type
+ // "A": +1 = Unicode locale attribute
+ // "E": +1 = extension letter / +2 = extension value
+ // "P": +1 = private use
+ // "U": +1 = ULocale
+ // "B": +1 = BCP47 language tag
+ // "C": Clear all
+ // "N": Clear extensions
+ // "D": +1 = Unicode locale attribute to be removed
+ // "X": indicates an exception must be thrown
+ // "T": +1 = expected language tag / +2 = expected locale string
+ const char* TESTCASES[][14] = {
+ {"L", "en", "R", "us", "T", "en-US", "en_US"},
+ {"L", "en", "R", "CA", "L", nullptr, "T", "und-CA", "_CA"},
+ {"L", "en", "R", "CA", "L", "", "T", "und-CA", "_CA"},
+ {"L", "en", "R", "FR", "L", "fr", "T", "fr-FR", "fr_FR"},
+ {"L", "123", "X"},
+ {"R", "us", "T", "und-US", "_US"},
+ {"R", "usa", "X"},
+ {"R", "123", "L", "it", "R", nullptr, "T", "it", "it"},
+ {"R", "123", "L", "it", "R", "", "T", "it", "it"},
+ {"R", "123", "L", "en", "T", "en-123", "en_123"},
+ {"S", "LATN", "L", "DE", "T", "de-Latn", "de_Latn"},
+ {"L", "De", "S", "latn", "R", "de", "S", "", "T", "de-DE", "de_DE"},
+ {"L", "De", "S", "Arab", "R", "de", "S", nullptr, "T", "de-DE", "de_DE"},
+ {"S", "latin", "X"},
+ {"V", "1234", "L", "en", "T", "en-1234", "en__1234"},
+ {"V", "1234", "L", "en", "V", "5678", "T", "en-5678", "en__5678"},
+ {"V", "1234", "L", "en", "V", nullptr, "T", "en", "en"},
+ {"V", "1234", "L", "en", "V", "", "T", "en", "en"},
+ {"V", "123", "X"},
+ {"U", "en_US", "T", "en-US", "en_US"},
+ {"U", "en_US_WIN", "X"},
+ {"B", "fr-FR-1606nict-u-ca-gregory-x-test", "T",
+ "fr-FR-1606nict-u-ca-gregory-x-test",
+ "fr_FR_1606NICT@calendar=gregorian;x=test"},
+ {"B", "ab-cde-fghij", "T", "cde-fghij", "cde__FGHIJ"},
+ {"B", "und-CA", "T", "und-CA", "_CA"},
+ // Blocked by ICU-20327
+ // {"B", "en-US-x-test-lvariant-var", "T", "en-US-x-test-lvariant-var",
+ // "en_US_VAR@x=test"},
+ {"B", "en-US-VAR", "X"},
+ {"U", "ja_JP@calendar=japanese;currency=JPY", "L", "ko", "T",
+ "ko-JP-u-ca-japanese-cu-jpy", "ko_JP@calendar=japanese;currency=JPY"},
+ {"U", "ja_JP@calendar=japanese;currency=JPY", "K", "ca", nullptr, "T",
+ "ja-JP-u-cu-jpy", "ja_JP@currency=JPY"},
+ {"U", "ja_JP@calendar=japanese;currency=JPY", "E", "u",
+ "attr1-ca-gregory", "T", "ja-JP-u-attr1-ca-gregory",
+ "ja_JP@attribute=attr1;calendar=gregorian"},
+ {"U", "en@colnumeric=yes", "K", "kn", "true", "T", "en-u-kn-true",
+ "en@colnumeric=yes"},
+ {"L", "th", "R", "th", "K", "nu", "thai", "T", "th-TH-u-nu-thai",
+ "th_TH@numbers=thai"},
+ {"U", "zh_Hans", "R", "sg", "K", "ca", "badcalendar", "X"},
+ {"U", "zh_Hans", "R", "sg", "K", "cal", "gregory", "X"},
+ {"E", "z", "ExtZ", "L", "en", "T", "en-z-extz", "en@z=extz"},
+ {"E", "z", "ExtZ", "L", "en", "E", "z", "", "T", "en", "en"},
+ {"E", "z", "ExtZ", "L", "en", "E", "z", nullptr, "T", "en", "en"},
+ {"E", "a", "x", "X"},
+ {"E", "a", "abc_def", "T", "und-a-abc-def", "@a=abc-def"},
+ // Design limitation - typeless u extension keyword 0a below is interpreted as a boolean value true/yes.
+ // With the legacy keyword syntax, "yes" is used for such boolean value instead of "true".
+ // However, once the legacy keyword is translated back to BCP 47 u extension, key "0a" is unknown,
+ // so "yes" is preserved - not mapped to "true". We could change the code to automatically transform
+ // key = alphanum alpha
+ {"L", "en", "E", "u", "bbb-aaa-0a", "T", "en-u-aaa-bbb-0a-yes",
+ "en@0a=yes;attribute=aaa-bbb"},
+ {"L", "fr", "R", "FR", "P", "Yoshito-ICU", "T", "fr-FR-x-yoshito-icu",
+ "fr_FR@x=yoshito-icu"},
+ {"L", "ja", "R", "jp", "K", "ca", "japanese", "T", "ja-JP-u-ca-japanese",
+ "ja_JP@calendar=japanese"},
+ {"K", "co", "PHONEBK", "K", "ca", "gregory", "L", "De", "T",
+ "de-u-ca-gregory-co-phonebk", "de@calendar=gregorian;collation=phonebook"},
+ {"E", "o", "OPQR", "E", "a", "aBcD", "T", "und-a-abcd-o-opqr", "@a=abcd;o=opqr"},
+ {"E", "u", "nu-thai-ca-gregory", "L", "TH", "T", "th-u-ca-gregory-nu-thai",
+ "th@calendar=gregorian;numbers=thai"},
+ {"L", "en", "K", "tz", "usnyc", "R", "US", "T", "en-US-u-tz-usnyc",
+ "en_US@timezone=America/New_York"},
+ {"L", "de", "K", "co", "phonebk", "K", "ks", "level1", "K", "kk",
+ "true", "T", "de-u-co-phonebk-kk-true-ks-level1",
+ "de@collation=phonebook;colnormalization=yes;colstrength=primary"},
+ {"L", "en", "R", "US", "K", "ca", "gregory", "T", "en-US-u-ca-gregory",
+ "en_US@calendar=gregorian"},
+ {"L", "en", "R", "US", "K", "cal", "gregory", "X"},
+ {"L", "en", "R", "US", "K", "ca", "gregorian", "X"},
+ {"L", "en", "R", "US", "K", "kn", "true", "T", "en-US-u-kn-true",
+ "en_US@colnumeric=yes"},
+ {"B", "de-DE-u-co-phonebk", "C", "L", "pt", "T", "pt", "pt"},
+ {"B", "ja-jp-u-ca-japanese", "N", "T", "ja-JP", "ja_JP"},
+ {"B", "es-u-def-abc-co-trad", "A", "hij", "D", "def", "T",
+ "es-u-abc-hij-co-trad", "es@attribute=abc-hij;collation=traditional"},
+ {"B", "es-u-def-abc-co-trad", "A", "hij", "D", "def", "D", "def", "T",
+ "es-u-abc-hij-co-trad", "es@attribute=abc-hij;collation=traditional"},
+ {"L", "en", "A", "aa", "X"},
+ {"B", "fr-u-attr1-cu-eur", "D", "attribute1", "X"},
+ };
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ for (int tidx = 0; tidx < UPRV_LENGTHOF(TESTCASES); tidx++) {
+ const char* (&testCase)[14] = TESTCASES[tidx];
+ std::string actions;
+ for (int p = 0; p < UPRV_LENGTHOF(testCase); p++) {
+ if (testCase[p] == nullptr) {
+ actions += " (nullptr)";
+ break;
+ }
+ if (p > 0) actions += " ";
+ actions += testCase[p];
+ }
+ int i = 0;
+ const char* method;
+ status = U_ZERO_ERROR;
+ bld.clear();
+ while (true) {
+ status = U_ZERO_ERROR;
+ UErrorCode copyStatus = U_ZERO_ERROR;
+ method = testCase[i++];
+ if (strcmp("L", method) == 0) {
+ bld.setLanguage(testCase[i++]);
+ bld.copyErrorTo(copyStatus);
+ bld.build(status);
+ } else if (strcmp("S", method) == 0) {
+ bld.setScript(testCase[i++]);
+ bld.copyErrorTo(copyStatus);
+ bld.build(status);
+ } else if (strcmp("R", method) == 0) {
+ bld.setRegion(testCase[i++]);
+ bld.copyErrorTo(copyStatus);
+ bld.build(status);
+ } else if (strcmp("V", method) == 0) {
+ bld.setVariant(testCase[i++]);
+ bld.copyErrorTo(copyStatus);
+ bld.build(status);
+ } else if (strcmp("K", method) == 0) {
+ const char* key = testCase[i++];
+ const char* type = testCase[i++];
+ bld.setUnicodeLocaleKeyword(key, type);
+ bld.copyErrorTo(copyStatus);
+ bld.build(status);
+ } else if (strcmp("A", method) == 0) {
+ bld.addUnicodeLocaleAttribute(testCase[i++]);
+ bld.copyErrorTo(copyStatus);
+ bld.build(status);
+ } else if (strcmp("E", method) == 0) {
+ const char* key = testCase[i++];
+ const char* value = testCase[i++];
+ bld.setExtension(key[0], value);
+ bld.copyErrorTo(copyStatus);
+ bld.build(status);
+ } else if (strcmp("P", method) == 0) {
+ bld.setExtension('x', testCase[i++]);
+ bld.copyErrorTo(copyStatus);
+ bld.build(status);
+ } else if (strcmp("U", method) == 0) {
+ bld.setLocale(Locale(testCase[i++]));
+ bld.copyErrorTo(copyStatus);
+ bld.build(status);
+ } else if (strcmp("B", method) == 0) {
+ bld.setLanguageTag(testCase[i++]);
+ bld.copyErrorTo(copyStatus);
+ bld.build(status);
+ }
+ // clear / remove
+ else if (strcmp("C", method) == 0) {
+ bld.clear();
+ bld.copyErrorTo(copyStatus);
+ bld.build(status);
+ } else if (strcmp("N", method) == 0) {
+ bld.clearExtensions();
+ bld.copyErrorTo(copyStatus);
+ bld.build(status);
+ } else if (strcmp("D", method) == 0) {
+ bld.removeUnicodeLocaleAttribute(testCase[i++]);
+ bld.copyErrorTo(copyStatus);
+ bld.build(status);
+ }
+ // result
+ else if (strcmp("X", method) == 0) {
+ if (U_SUCCESS(status)) {
+ errln("FAIL: No error return - test case: %s", actions.c_str());
+ }
+ } else if (strcmp("T", method) == 0) {
+ status = U_ZERO_ERROR;
+ Locale loc = bld.build(status);
+ if (status != copyStatus) {
+ errln("copyErrorTo not matching");
+ }
+ if (U_FAILURE(status) ||
+ strcmp(loc.getName(), testCase[i + 1]) != 0) {
+ errln("FAIL: Wrong locale ID - %s %s %s", loc.getName(),
+ " for test case: ", actions.c_str());
+ }
+ std::string langtag = loc.toLanguageTag<std::string>(status);
+ if (U_FAILURE(status) || langtag != testCase[i]) {
+ errln("FAIL: Wrong language tag - %s %s %s", langtag.c_str(),
+ " for test case: ", actions.c_str());
+ }
+ break;
+ } else {
+ // Unknow test method
+ errln("Unknown test case method: There is an error in the test case data.");
+ break;
+ }
+ if (status != copyStatus) {
+ errln("copyErrorTo not matching");
+ }
+ if (U_FAILURE(status)) {
+ if (strcmp("X", testCase[i]) == 0) {
+ // This failure is expected
+ break;
+ } else {
+ errln("FAIL: U_ILLEGAL_ARGUMENT_ERROR at offset %d %s %s", i,
+ " in test case: ", actions.c_str());
+ break;
+ }
+ }
+ if (strcmp("T", method) == 0) {
+ break;
+ }
+ } // while(true)
+ } // for TESTCASES
+}
+
+void LocaleBuilderTest::TestLocaleBuilderBasic() {
+ LocaleBuilder bld;
+ bld.setLanguage("zh");
+ Verify(bld, "zh", "setLanguage('zh') got Error: %s\n");
+
+ bld.setScript("Hant");
+ Verify(bld, "zh-Hant", "setScript('Hant') got Error: %s\n");
+
+ bld.setRegion("SG");
+ Verify(bld, "zh-Hant-SG", "setRegion('SG') got Error: %s\n");
+
+ bld.setRegion("HK");
+ bld.setScript("Hans");
+ Verify(bld, "zh-Hans-HK",
+ "setRegion('HK') and setScript('Hans') got Error: %s\n");
+
+ bld.setVariant("revised");
+ Verify(bld, "zh-Hans-HK-revised",
+ "setVariant('revised') got Error: %s\n");
+
+ bld.setUnicodeLocaleKeyword("nu", "thai");
+ Verify(bld, "zh-Hans-HK-revised-u-nu-thai",
+ "setUnicodeLocaleKeyword('nu', 'thai'') got Error: %s\n");
+
+ bld.setUnicodeLocaleKeyword("co", "pinyin");
+ Verify(bld, "zh-Hans-HK-revised-u-co-pinyin-nu-thai",
+ "setUnicodeLocaleKeyword('co', 'pinyin'') got Error: %s\n");
+
+ bld.setUnicodeLocaleKeyword("nu", "latn");
+ Verify(bld, "zh-Hans-HK-revised-u-co-pinyin-nu-latn",
+ "setUnicodeLocaleKeyword('nu', 'latn'') got Error: %s\n");
+
+ bld.setUnicodeLocaleKeyword("nu", nullptr);
+ Verify(bld, "zh-Hans-HK-revised-u-co-pinyin",
+ "setUnicodeLocaleKeyword('nu', ''') got Error: %s\n");
+
+ bld.setUnicodeLocaleKeyword("co", nullptr);
+ Verify(bld, "zh-Hans-HK-revised",
+ "setUnicodeLocaleKeyword('nu', nullptr) got Error: %s\n");
+
+ bld.setScript("");
+ Verify(bld, "zh-HK-revised",
+ "setScript('') got Error: %s\n");
+
+ bld.setVariant("");
+ Verify(bld, "zh-HK",
+ "setVariant('') got Error: %s\n");
+
+ bld.setRegion("");
+ Verify(bld, "zh",
+ "setRegion('') got Error: %s\n");
+}
+
+void LocaleBuilderTest::TestSetLanguageWellFormed() {
+ // http://www.unicode.org/reports/tr35/tr35.html#unicode_language_subtag
+ // unicode_language_subtag = alpha{2,3} | alpha{5,8};
+ // ICUTC decided also support alpha{4}
+ static const char* wellFormedLanguages[] = {
+ "",
+
+ // alpha{2}
+ "en",
+ "NE",
+ "eN",
+ "Ne",
+
+ // alpha{3}
+ "aNe",
+ "zzz",
+ "AAA",
+
+ // alpha{4}
+ "ABCD",
+ "abcd",
+
+ // alpha{5}
+ "efgij",
+ "AbCAD",
+ "ZAASD",
+
+ // alpha{6}
+ "efgijk",
+ "AADGFE",
+ "AkDfFz",
+
+ // alpha{7}
+ "asdfads",
+ "ADSFADF",
+ "piSFkDk",
+
+ // alpha{8}
+ "oieradfz",
+ "IADSFJKR",
+ "kkDSFJkR",
+ };
+ for (const char* lang : wellFormedLanguages) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setLanguage(lang);
+ Locale loc = bld.build(status);
+ if (U_FAILURE(status)) {
+ errln("setLanguage(\"%s\") got Error: %s\n",
+ lang, u_errorName(status));
+ }
+ }
+}
+
+void LocaleBuilderTest::TestSetLanguageIllFormed() {
+ static const char* illFormed[] = {
+ "a",
+ "z",
+ "A",
+ "F",
+ "2",
+ "0",
+ "9"
+ "{",
+ ".",
+ "[",
+ "]",
+ "\\",
+
+ "e1",
+ "N2",
+ "3N",
+ "4e",
+ "e:",
+ "43",
+ "a9",
+
+ "aN0",
+ "z1z",
+ "2zz",
+ "3A3",
+ "456",
+ "af)",
+
+ // Per 2019-01-23 ICUTC, we still accept 4alpha as tlang. see ICU-20321.
+ // "latn",
+ // "Arab",
+ // "LATN",
+
+ "e)gij",
+ "Ab3AD",
+ "ZAAS8",
+
+ "efgi[]",
+ "AA9GFE",
+ "7kD3Fz",
+ "as8fads",
+ "0DSFADF",
+ "'iSFkDk",
+
+ "oieradf+",
+ "IADSFJK-",
+ "kkDSFJk0",
+
+ // alpha{9}
+ "oieradfab",
+ "IADSFJKDE",
+ "kkDSFJkzf",
+ };
+ for (const char* ill : illFormed) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setLanguage(ill);
+ Locale loc = bld.build(status);
+ if (status != U_ILLEGAL_ARGUMENT_ERROR) {
+ errln("setLanguage(\"%s\") should fail but has no Error\n", ill);
+ }
+ }
+}
+
+void LocaleBuilderTest::TestSetScriptWellFormed() {
+ // http://www.unicode.org/reports/tr35/tr35.html#unicode_script_subtag
+ // unicode_script_subtag = alpha{4} ;
+ static const char* wellFormedScripts[] = {
+ "",
+
+ "Latn",
+ "latn",
+ "lATN",
+ "laTN",
+ "arBN",
+ "ARbn",
+ "adsf",
+ "aADF",
+ "BSVS",
+ "LATn",
+ };
+ for (const char* script : wellFormedScripts) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setScript(script);
+ Locale loc = bld.build(status);
+ if (U_FAILURE(status)) {
+ errln("setScript(\"%s\") got Error: %s\n",
+ script, u_errorName(status));
+ }
+ }
+}
+
+void LocaleBuilderTest::TestSetScriptIllFormed() {
+ static const char* illFormed[] = {
+ "a",
+ "z",
+ "A",
+ "F",
+ "2",
+ "0",
+ "9"
+ "{",
+ ".",
+ "[",
+ "]",
+ "\\",
+
+ "e1",
+ "N2",
+ "3N",
+ "4e",
+ "e:",
+ "43",
+ "a9",
+
+ "aN0",
+ "z1z",
+ "2zz",
+ "3A3",
+ "456",
+ "af)",
+
+ "0atn",
+ "l1tn",
+ "lA2N",
+ "la4N",
+ "arB5",
+ "1234",
+
+ "e)gij",
+ "Ab3AD",
+ "ZAAS8",
+
+ "efgi[]",
+ "AA9GFE",
+ "7kD3Fz",
+
+ "as8fads",
+ "0DSFADF",
+ "'iSFkDk",
+
+ "oieradf+",
+ "IADSFJK-",
+ "kkDSFJk0",
+
+ // alpha{9}
+ "oieradfab",
+ "IADSFJKDE",
+ "kkDSFJkzf",
+ };
+ for (const char* ill : illFormed) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setScript(ill);
+ Locale loc = bld.build(status);
+ if (status != U_ILLEGAL_ARGUMENT_ERROR) {
+ errln("setScript(\"%s\") should fail but has no Error\n", ill);
+ }
+ }
+}
+
+void LocaleBuilderTest::TestSetRegionWellFormed() {
+ // http://www.unicode.org/reports/tr35/tr35.html#unicode_region_subtag
+ // unicode_region_subtag = (alpha{2} | digit{3})
+ static const char* wellFormedRegions[] = {
+ "",
+
+ // alpha{2}
+ "en",
+ "NE",
+ "eN",
+ "Ne",
+
+ // digit{3}
+ "000",
+ "999",
+ "123",
+ "987"
+ };
+ for (const char* region : wellFormedRegions) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setRegion(region);
+ Locale loc = bld.build(status);
+ if (U_FAILURE(status)) {
+ errln("setRegion(\"%s\") got Error: %s\n",
+ region, u_errorName(status));
+ }
+ }
+}
+
+void LocaleBuilderTest::TestSetRegionIllFormed() {
+ static const char* illFormed[] = {
+ "a",
+ "z",
+ "A",
+ "F",
+ "2",
+ "0",
+ "9"
+ "{",
+ ".",
+ "[",
+ "]",
+ "\\",
+
+ "e1",
+ "N2",
+ "3N",
+ "4e",
+ "e:",
+ "43",
+ "a9",
+
+ "aN0",
+ "z1z",
+ "2zz",
+ "3A3",
+ "4.6",
+ "af)",
+
+ "0atn",
+ "l1tn",
+ "lA2N",
+ "la4N",
+ "arB5",
+ "1234",
+
+ "e)gij",
+ "Ab3AD",
+ "ZAAS8",
+
+ "efgi[]",
+ "AA9GFE",
+ "7kD3Fz",
+
+ "as8fads",
+ "0DSFADF",
+ "'iSFkDk",
+
+ "oieradf+",
+ "IADSFJK-",
+ "kkDSFJk0",
+
+ // alpha{9}
+ "oieradfab",
+ "IADSFJKDE",
+ "kkDSFJkzf",
+ };
+ for (const char* ill : illFormed) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setRegion(ill);
+ Locale loc = bld.build(status);
+ if (status != U_ILLEGAL_ARGUMENT_ERROR) {
+ errln("setRegion(\"%s\") should fail but has no Error\n", ill);
+ }
+ }
+}
+
+void LocaleBuilderTest::TestSetVariantWellFormed() {
+ // http://www.unicode.org/reports/tr35/tr35.html#unicode_variant_subtag
+ // (sep unicode_variant_subtag)*
+ // unicode_variant_subtag = (alphanum{5,8} | digit alphanum{3}) ;
+ static const char* wellFormedVariants[] = {
+ "",
+
+ // alphanum{5}
+ "efgij",
+ "AbCAD",
+ "ZAASD",
+ "0AASD",
+ "A1CAD",
+ "ef2ij",
+ "ads3X",
+ "owqF4",
+
+ // alphanum{6}
+ "efgijk",
+ "AADGFE",
+ "AkDfFz",
+ "0ADGFE",
+ "A9DfFz",
+ "AADG7E",
+
+ // alphanum{7}
+ "asdfads",
+ "ADSFADF",
+ "piSFkDk",
+ "a0dfads",
+ "ADSF3DF",
+ "piSFkD9",
+
+ // alphanum{8}
+ "oieradfz",
+ "IADSFJKR",
+ "kkDSFJkR",
+ "0ADSFJKR",
+ "12345679",
+
+ // digit alphanum{3}
+ "0123",
+ "1abc",
+ "20EF",
+ "30EF",
+ "8A03",
+ "3Ax3",
+ "9Axy",
+
+ // (sep unicode_variant_subtag)*
+ "0123-4567",
+ "0ab3-ABCDE",
+ "9ax3-xByD9",
+ "9ax3-xByD9-adfk934a",
+
+ "0123_4567",
+ "0ab3_ABCDE",
+ "9ax3_xByD9",
+ "9ax3_xByD9_adfk934a",
+
+ "9ax3-xByD9_adfk934a",
+ "9ax3_xByD9-adfk934a",
+ };
+ for (const char* variant : wellFormedVariants) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setVariant(variant);
+ Locale loc = bld.build(status);
+ if (U_FAILURE(status)) {
+ errln("setVariant(\"%s\") got Error: %s\n",
+ variant, u_errorName(status));
+ }
+ }
+}
+
+void LocaleBuilderTest::TestSetVariantIllFormed() {
+ static const char* illFormed[] = {
+ "a",
+ "z",
+ "A",
+ "F",
+ "2",
+ "0",
+ "9"
+ "{",
+ ".",
+ "[",
+ "]",
+ "\\",
+
+ "e1",
+ "N2",
+ "3N",
+ "4e",
+ "e:",
+ "43",
+ "a9",
+ "en",
+ "NE",
+ "eN",
+ "Ne",
+
+ "aNe",
+ "zzz",
+ "AAA",
+ "aN0",
+ "z1z",
+ "2zz",
+ "3A3",
+ "4.6",
+ "af)",
+ "345",
+ "923",
+
+ "Latn",
+ "latn",
+ "lATN",
+ "laTN",
+ "arBN",
+ "ARbn",
+ "adsf",
+ "aADF",
+ "BSVS",
+ "LATn",
+ "l1tn",
+ "lA2N",
+ "la4N",
+ "arB5",
+ "abc3",
+ "A3BC",
+
+ "e)gij",
+ "A+3AD",
+ "ZAA=8",
+
+ "efgi[]",
+ "AA9]FE",
+ "7k[3Fz",
+
+ "as8f/ds",
+ "0DSFAD{",
+ "'iSFkDk",
+
+ "oieradf+",
+ "IADSFJK-",
+ "k}DSFJk0",
+
+ // alpha{9}
+ "oieradfab",
+ "IADSFJKDE",
+ "kkDSFJkzf",
+ "123456789",
+
+ "-0123",
+ "-0123-4567",
+ "0123-4567-",
+ "-123-4567",
+ "_0123",
+ "_0123_4567",
+ "0123_4567_",
+ "_123_4567",
+
+ "-abcde-figjk",
+ "abcde-figjk-",
+ "-abcde-figjk-",
+ "_abcde_figjk",
+ "abcde_figjk_",
+ "_abcde_figjk_",
+ };
+ for (const char* ill : illFormed) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setVariant(ill);
+ Locale loc = bld.build(status);
+ if (status != U_ILLEGAL_ARGUMENT_ERROR) {
+ errln("setVariant(\"%s\") should fail but has no Error\n", ill);
+ }
+ }
+}
+
+void LocaleBuilderTest::TestSetUnicodeLocaleKeywordWellFormed() {
+ // http://www.unicode.org/reports/tr35/tr35.html#unicode_locale_extensions
+ // keyword = key (sep type)? ;
+ // key = alphanum alpha ;
+ // type = alphanum{3,8} (sep alphanum{3,8})* ;
+ static const char* wellFormed_key_value[] = {
+ "aa", "123",
+ "3b", "zyzbcdef",
+ "0Z", "1ZB30zk9-abc",
+ "cZ", "2ck30zfZ-adsf023-234kcZ",
+ "ZZ", "Lant",
+ "ko", "",
+ };
+ for (int i = 0; i < UPRV_LENGTHOF(wellFormed_key_value); i += 2) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setUnicodeLocaleKeyword(wellFormed_key_value[i],
+ wellFormed_key_value[i + 1]);
+ Locale loc = bld.build(status);
+ if (U_FAILURE(status)) {
+ errln("setUnicodeLocaleKeyword(\"%s\", \"%s\") got Error: %s\n",
+ wellFormed_key_value[i],
+ wellFormed_key_value[i + 1],
+ u_errorName(status));
+ }
+ }
+}
+
+void LocaleBuilderTest::TestSetUnicodeLocaleKeywordIllFormedKey() {
+ static const char* illFormed[] = {
+ "34",
+ "ab-cde",
+ "123",
+ "b3",
+ "zyzabcdef",
+ "Z0",
+ };
+ for (const char* ill : illFormed) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setUnicodeLocaleKeyword(ill, "abc");
+ Locale loc = bld.build(status);
+ if (status != U_ILLEGAL_ARGUMENT_ERROR) {
+ errln("setUnicodeLocaleKeyword(\"%s\", \"abc\") should fail but has no Error\n",
+ ill);
+ }
+ }
+}
+
+void LocaleBuilderTest::TestSetUnicodeLocaleKeywordIllFormedValue() {
+ static const char* illFormed[] = {
+ "34",
+ "ab-",
+ "-cd",
+ "-ef-",
+ "zyzabcdef",
+ "ab-abc",
+ "1ZB30zfk9-abc",
+ "2ck30zfk9-adsf023-234kcZ",
+ };
+ for (const char* ill : illFormed) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setUnicodeLocaleKeyword("ab", ill);
+ Locale loc = bld.build(status);
+ if (status != U_ILLEGAL_ARGUMENT_ERROR) {
+ errln("setUnicodeLocaleKeyword(\"ab\", \"%s\") should fail but has no Error\n",
+ ill);
+ }
+ }
+}
+
+void LocaleBuilderTest::TestAddRemoveUnicodeLocaleAttribute() {
+ LocaleBuilder bld;
+ UErrorCode status = U_ZERO_ERROR;
+ Locale loc = bld.setLanguage("fr")
+ .addUnicodeLocaleAttribute("abc")
+ .addUnicodeLocaleAttribute("aBc")
+ .addUnicodeLocaleAttribute("EFG")
+ .addUnicodeLocaleAttribute("efghi")
+ .addUnicodeLocaleAttribute("efgh")
+ .addUnicodeLocaleAttribute("efGhi")
+ .addUnicodeLocaleAttribute("EFg")
+ .addUnicodeLocaleAttribute("hijk")
+ .addUnicodeLocaleAttribute("EFG")
+ .addUnicodeLocaleAttribute("HiJK")
+ .addUnicodeLocaleAttribute("aBc")
+ .build(status);
+ if (U_FAILURE(status)) {
+ errln("addUnicodeLocaleAttribute() got Error: %s\n",
+ u_errorName(status));
+ }
+ std::string expected("fr-u-abc-efg-efgh-efghi-hijk");
+ std::string actual = loc.toLanguageTag<std::string>(status);
+ if (U_FAILURE(status) || expected != actual) {
+ errln("Should get \"%s\" but get \"%s\"\n", expected.c_str(), actual.c_str());
+ }
+
+ // remove "efgh" in the middle with different casing.
+ loc = bld.removeUnicodeLocaleAttribute("eFgH").build(status);
+ if (U_FAILURE(status)) {
+ errln("removeUnicodeLocaleAttribute() got Error: %s\n",
+ u_errorName(status));
+ }
+ expected = "fr-u-abc-efg-efghi-hijk";
+ actual = loc.toLanguageTag<std::string>(status);
+ if (U_FAILURE(status) || expected != actual) {
+ errln("Should get \"%s\" but get \"%s\"\n", expected.c_str(), actual.c_str());
+ }
+
+ // remove non-existing attributes.
+ loc = bld.removeUnicodeLocaleAttribute("efgh").build(status);
+ if (U_FAILURE(status)) {
+ errln("removeUnicodeLocaleAttribute() got Error: %s\n",
+ u_errorName(status));
+ }
+ actual = loc.toLanguageTag<std::string>(status);
+ if (U_FAILURE(status) || expected != actual) {
+ errln("Should get \"%s\" but get \"%s\"\n", expected.c_str(), actual.c_str());
+ }
+
+ // remove "abc" in the beginning with different casing.
+ loc = bld.removeUnicodeLocaleAttribute("ABC").build(status);
+ if (U_FAILURE(status)) {
+ errln("removeUnicodeLocaleAttribute() got Error: %s\n",
+ u_errorName(status));
+ }
+ expected = "fr-u-efg-efghi-hijk";
+ actual = loc.toLanguageTag<std::string>(status);
+ if (U_FAILURE(status) || expected != actual) {
+ errln("Should get \"%s\" but get \"%s\"\n", expected.c_str(), actual.c_str());
+ }
+
+ // remove non-existing substring in the end.
+ loc = bld.removeUnicodeLocaleAttribute("hij").build(status);
+ if (U_FAILURE(status)) {
+ errln("removeUnicodeLocaleAttribute() got Error: %s\n",
+ u_errorName(status));
+ }
+ actual = loc.toLanguageTag<std::string>(status);
+ if (U_FAILURE(status) || expected != actual) {
+ errln("Should get \"%s\" but get \"%s\"\n", expected.c_str(), actual.c_str());
+ }
+
+ // remove "hijk" in the end with different casing.
+ loc = bld.removeUnicodeLocaleAttribute("hIJK").build(status);
+ if (U_FAILURE(status)) {
+ errln("removeUnicodeLocaleAttribute() got Error: %s\n",
+ u_errorName(status));
+ }
+ expected = "fr-u-efg-efghi";
+ actual = loc.toLanguageTag<std::string>(status);
+ if (U_FAILURE(status) || expected != actual) {
+ errln("Should get \"%s\" but get \"%s\"\n", expected.c_str(), actual.c_str());
+ }
+
+ // remove "efghi" in the end with different casing.
+ loc = bld.removeUnicodeLocaleAttribute("EFGhi").build(status);
+ if (U_FAILURE(status)) {
+ errln("removeUnicodeLocaleAttribute() got Error: %s\n",
+ u_errorName(status));
+ }
+ expected = "fr-u-efg";
+ actual = loc.toLanguageTag<std::string>(status);
+ if (U_FAILURE(status) || expected != actual) {
+ errln("Should get \"%s\" but get \"%s\"\n", expected.c_str(), actual.c_str());
+ }
+
+ // remove "efg" in as the only one, with different casing.
+ loc = bld.removeUnicodeLocaleAttribute("EFG").build(status);
+ if (U_FAILURE(status)) {
+ errln("removeUnicodeLocaleAttribute() got Error: %s\n",
+ u_errorName(status));
+ }
+ expected = "fr";
+ actual = loc.toLanguageTag<std::string>(status);
+ if (U_FAILURE(status) || expected != actual) {
+ errln("Should get \"%s\" but get \"%s\"\n", expected.c_str(), actual.c_str());
+ }
+
+}
+
+void LocaleBuilderTest::TestAddRemoveUnicodeLocaleAttributeWellFormed() {
+ // http://www.unicode.org/reports/tr35/tr35.html#unicode_locale_extensions
+ // attribute = alphanum{3,8} ;
+ static const char* wellFormedAttributes[] = {
+ // alphanum{3}
+ "AbC",
+ "ZAA",
+ "0AA",
+ "x3A",
+ "xa8",
+
+ // alphanum{4}
+ "AbCA",
+ "ZASD",
+ "0ASD",
+ "A3a4",
+ "zK90",
+
+ // alphanum{5}
+ "efgij",
+ "AbCAD",
+ "ZAASD",
+ "0AASD",
+ "A1CAD",
+ "ef2ij",
+ "ads3X",
+ "owqF4",
+
+ // alphanum{6}
+ "efgijk",
+ "AADGFE",
+ "AkDfFz",
+ "0ADGFE",
+ "A9DfFz",
+ "AADG7E",
+
+ // alphanum{7}
+ "asdfads",
+ "ADSFADF",
+ "piSFkDk",
+ "a0dfads",
+ "ADSF3DF",
+ "piSFkD9",
+
+ // alphanum{8}
+ "oieradfz",
+ "IADSFJKR",
+ "kkDSFJkR",
+ };
+ LocaleBuilder bld;
+ for (int i = 0; i < UPRV_LENGTHOF(wellFormedAttributes); i++) {
+ if (i % 5 == 0) {
+ bld.clear();
+ }
+ UErrorCode status = U_ZERO_ERROR;
+ bld.addUnicodeLocaleAttribute(wellFormedAttributes[i]);
+ Locale loc = bld.build(status);
+ if (U_FAILURE(status)) {
+ errln("addUnicodeLocaleAttribute(\"%s\") got Error: %s\n",
+ wellFormedAttributes[i], u_errorName(status));
+ }
+ if (i > 2) {
+ bld.removeUnicodeLocaleAttribute(wellFormedAttributes[i - 1]);
+ loc = bld.build(status);
+ if (U_FAILURE(status)) {
+ errln("removeUnicodeLocaleAttribute(\"%s\") got Error: %s\n",
+ wellFormedAttributes[i - 1], u_errorName(status));
+ }
+ bld.removeUnicodeLocaleAttribute(wellFormedAttributes[i - 3]);
+ loc = bld.build(status);
+ if (U_FAILURE(status)) {
+ errln("removeUnicodeLocaleAttribute(\"%s\") got Error: %s\n",
+ wellFormedAttributes[i - 3], u_errorName(status));
+ }
+ }
+ }
+}
+
+void LocaleBuilderTest::TestAddUnicodeLocaleAttributeIllFormed() {
+ static const char* illFormed[] = {
+ "aa",
+ "34",
+ "ab-",
+ "-cd",
+ "-ef-",
+ "zyzabcdef",
+ "123456789",
+ "ab-abc",
+ "1ZB30zfk9-abc",
+ "2ck30zfk9-adsf023-234kcZ",
+ };
+ for (const char* ill : illFormed) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.addUnicodeLocaleAttribute(ill);
+ Locale loc = bld.build(status);
+ if (status != U_ILLEGAL_ARGUMENT_ERROR) {
+ errln("addUnicodeLocaleAttribute(\"%s\") should fail but has no Error\n",
+ ill);
+ }
+ }
+}
+
+void LocaleBuilderTest::TestSetExtensionU() {
+ LocaleBuilder bld;
+ bld.setLanguage("zh");
+ Verify(bld, "zh",
+ "setLanguage(\"zh\") got Error: %s\n");
+
+ bld.setExtension('u', "co-stroke");
+ Verify(bld, "zh-u-co-stroke",
+ "setExtension('u', \"co-stroke\") got Error: %s\n");
+
+ bld.setExtension('U', "ca-islamic");
+ Verify(bld, "zh-u-ca-islamic",
+ "setExtension('U', \"zh-u-ca-islamic\") got Error: %s\n");
+
+ bld.setExtension('u', "ca-chinese");
+ Verify(bld, "zh-u-ca-chinese",
+ "setExtension('u', \"ca-chinese\") got Error: %s\n");
+
+ bld.setExtension('U', "co-pinyin");
+ Verify(bld, "zh-u-co-pinyin",
+ "setExtension('U', \"co-pinyin\") got Error: %s\n");
+
+ bld.setRegion("TW");
+ Verify(bld, "zh-TW-u-co-pinyin",
+ "setRegion(\"TW\") got Error: %s\n");
+
+ bld.setExtension('U', "");
+ Verify(bld, "zh-TW",
+ "setExtension('U', \"\") got Error: %s\n");
+
+ bld.setExtension('u', "abc-defg-kr-face");
+ Verify(bld, "zh-TW-u-abc-defg-kr-face",
+ "setExtension('u', \"abc-defg-kr-face\") got Error: %s\n");
+
+ bld.setExtension('U', "ca-japanese");
+ Verify(bld, "zh-TW-u-ca-japanese",
+ "setExtension('U', \"ca-japanese\") got Error: %s\n");
+
+}
+
+void LocaleBuilderTest::TestSetExtensionValidateUWellFormed() {
+ static const char* wellFormedExtensions[] = {
+ // keyword
+ // keyword = key (sep type)? ;
+ // key = alphanum alpha ;
+ // type = alphanum{3,8} (sep alphanum{3,8})* ;
+ "3A",
+ "ZA",
+ "az-abc",
+ "zz-123",
+ "7z-12345678",
+ "kb-A234567Z",
+ // (sep keyword)+
+ "1z-ZZ",
+ "2z-ZZ-123",
+ "3z-ZZ-123-cd",
+ "0z-ZZ-123-cd-efghijkl",
+ // attribute
+ "abc",
+ "456",
+ "87654321",
+ "ZABADFSD",
+ // (sep attribute)+
+ "abc-ZABADFSD",
+ "123-ZABADFSD",
+ "K2K-12345678",
+ "K2K-12345678-zzz",
+ // (sep attribute)+ (sep keyword)*
+ "K2K-12345678-zz",
+ "K2K-12345678-zz-0z",
+ "K2K-12345678-9z-AZ-abc",
+ "K2K-12345678-zz-9A-234",
+ "K2K-12345678-zk0-abc-efg-zz-9k-234",
+ };
+ for (const char* extension : wellFormedExtensions) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setExtension('u', extension);
+ Locale loc = bld.build(status);
+ if (U_FAILURE(status)) {
+ errln("setExtension('u', \"%s\") got Error: %s\n",
+ extension, u_errorName(status));
+ }
+ }
+}
+
+void LocaleBuilderTest::TestSetExtensionValidateUIllFormed() {
+ static const char* illFormed[] = {
+ // bad key
+ "-",
+ "-ab",
+ "ab-",
+ "abc-",
+ "-abc",
+ "0",
+ "a",
+ "A0",
+ "z9",
+ "09",
+ "90",
+ // bad keyword
+ "AB-A0",
+ "AB-efg-A0",
+ "xy-123456789",
+ "AB-Aa-",
+ "AB-Aac-",
+ // bad attribute
+ "abcdefghi",
+ "abcdefgh-",
+ "abcdefgh-abcdefghi",
+ "abcdefgh-1",
+ "abcdefgh-a",
+ "abcdefgh-a2345678z",
+ };
+ for (const char* ill : illFormed) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setExtension('u', ill);
+ Locale loc = bld.build(status);
+ if (status != U_ILLEGAL_ARGUMENT_ERROR) {
+ errln("setExtension('u', \"%s\") should fail but has no Error\n",
+ ill);
+ }
+ }
+}
+
+void LocaleBuilderTest::TestSetExtensionT() {
+ LocaleBuilder bld;
+ bld.setLanguage("fr");
+ Verify(bld, "fr",
+ "setLanguage(\"fr\") got Error: %s\n");
+
+ bld.setExtension('T', "zh");
+ Verify(bld, "fr-t-zh",
+ "setExtension('T', \"zh\") got Error: %s\n");
+
+ bld.setExtension('t', "zh-Hant-TW-1234-A9-123-456ABCDE");
+ Verify(bld, "fr-t-zh-hant-tw-1234-a9-123-456abcde",
+ "setExtension('t', \"zh-Hant-TW-1234-A9-123-456ABCDE\") got Error: %s\n");
+
+ bld.setExtension('T', "a9-123");
+ Verify(bld, "fr-t-a9-123",
+ "setExtension('T', \"a9-123\") got Error: %s\n");
+
+ bld.setRegion("MX");
+ Verify(bld, "fr-MX-t-a9-123",
+ "setRegion(\"MX\") got Error: %s\n");
+
+ bld.setScript("Hans");
+ Verify(bld, "fr-Hans-MX-t-a9-123",
+ "setScript(\"Hans\") got Error: %s\n");
+
+ bld.setVariant("9abc-abcde");
+ Verify(bld, "fr-Hans-MX-9abc-abcde-t-a9-123",
+ "setVariant(\"9abc-abcde\") got Error: %s\n");
+
+ bld.setExtension('T', "");
+ Verify(bld, "fr-Hans-MX-9abc-abcde",
+ "bld.setExtension('T', \"\") got Error: %s\n");
+}
+
+void LocaleBuilderTest::TestSetExtensionValidateTWellFormed() {
+ // ((sep tlang (sep tfield)*) | (sep tfield)+)
+ static const char* wellFormedExtensions[] = {
+ // tlang
+ // tlang = unicode_language_subtag (sep unicode_script_subtag)?
+ // (sep unicode_region_subtag)? (sep unicode_variant_subtag)* ;
+ // unicode_language_subtag
+ "en",
+ "abc",
+ "abcde",
+ "ABCDEFGH",
+ // unicode_language_subtag sep unicode_script_subtag
+ "en-latn",
+ "abc-arab",
+ "ABCDEFGH-Thai",
+ // unicode_language_subtag sep unicode_script_subtag sep unicode_region_subtag
+ "en-latn-ME",
+ "abc-arab-RU",
+ "ABCDEFGH-Thai-TH",
+ "en-latn-409",
+ "abc-arab-123",
+ "ABCDEFGH-Thai-456",
+ // unicode_language_subtag sep unicode_region_subtag
+ "en-ME",
+ "abc-RU",
+ "ABCDEFGH-TH",
+ "en-409",
+ "abc-123",
+ "ABCDEFGH-456",
+ // unicode_language_subtag sep unicode_script_subtag sep unicode_region_subtag
+ // sep (sep unicode_variant_subtag)*
+ "en-latn-ME-abcde",
+ "abc-arab-RU-3abc-abcdef",
+ "ABCDEFGH-Thai-TH-ADSFS-9xyz-abcdef",
+ "en-latn-409-xafsa",
+ "abc-arab-123-ADASDF",
+ "ABCDEFGH-Thai-456-9sdf-ADASFAS",
+ // (sep tfield)+
+ "A0-abcde",
+ "z9-abcde123",
+ "z9-abcde123-a1-abcde",
+ // tlang (sep tfield)*
+ "fr-A0-abcde",
+ "fr-FR-A0-abcde",
+ "fr-123-z9-abcde123-a1-abcde",
+ "fr-Latn-FR-z9-abcde123-a1-abcde",
+ "gab-Thai-TH-abcde-z9-abcde123-a1-abcde",
+ "gab-Thai-TH-0bde-z9-abcde123-a1-abcde",
+ };
+ for (const char* extension : wellFormedExtensions) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setExtension('t', extension);
+ Locale loc = bld.build(status);
+ if (U_FAILURE(status)) {
+ errln("setExtension('t', \"%s\") got Error: %s\n",
+ extension, u_errorName(status));
+ }
+ }
+}
+
+void LocaleBuilderTest::TestSetExtensionValidateTIllFormed() {
+ static const char* illFormed[] = {
+ "a",
+ "a-",
+ "0",
+ "9-",
+ "-9",
+ "-z",
+ // "Latn", // Per 2019-01-23 ICUTC, still accept 4alpha. See ICU-20321
+ "Latn-",
+ "en-",
+ "nob-",
+ "-z9",
+ "a3",
+ "a3-",
+ "3a",
+ "0z-",
+ "en-123-a1",
+ "en-TH-a1",
+ "gab-TH-a1",
+ "gab-Thai-a1",
+ "gab-Thai-TH-a1",
+ "gab-Thai-TH-0bde-a1",
+ "gab-Thai-TH-0bde-3b",
+ "gab-Thai-TH-0bde-z9-a1",
+ "gab-Thai-TH-0bde-z9-3b",
+ "gab-Thai-TH-0bde-z9-abcde123-3b",
+ "gab-Thai-TH-0bde-z9-abcde123-ab",
+ "gab-Thai-TH-0bde-z9-abcde123-ab",
+ "gab-Thai-TH-0bde-z9-abcde123-a1",
+ "gab-Thai-TH-0bde-z9-abcde123-a1-",
+ "gab-Thai-TH-0bde-z9-abcde123-a1-a",
+ "gab-Thai-TH-0bde-z9-abcde123-a1-ab",
+ };
+ for (const char* ill : illFormed) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setExtension('t', ill);
+ Locale loc = bld.build(status);
+ if (status != U_ILLEGAL_ARGUMENT_ERROR) {
+ errln("setExtension('t', \"%s\") should fail but has no Error\n",
+ ill);
+ }
+ }
+}
+
+void LocaleBuilderTest::TestSetExtensionPU() {
+ LocaleBuilder bld;
+ bld.setLanguage("ar");
+ Verify(bld, "ar",
+ "setLanguage(\"ar\") got Error: %s\n");
+
+ bld.setExtension('X', "a-b-c-d-e");
+ Verify(bld, "ar-x-a-b-c-d-e",
+ "setExtension('X', \"a-b-c-d-e\") got Error: %s\n");
+
+ bld.setExtension('x', "0-1-2-3");
+ Verify(bld, "ar-x-0-1-2-3",
+ "setExtension('x', \"0-1-2-3\") got Error: %s\n");
+
+ bld.setExtension('X', "0-12345678-x-x");
+ Verify(bld, "ar-x-0-12345678-x-x",
+ "setExtension('x', \"ar-x-0-12345678-x-x\") got Error: %s\n");
+
+ bld.setRegion("TH");
+ Verify(bld, "ar-TH-x-0-12345678-x-x",
+ "setRegion(\"TH\") got Error: %s\n");
+
+ bld.setExtension('X', "");
+ Verify(bld, "ar-TH",
+ "setExtension(\"X\") got Error: %s\n");
+}
+
+void LocaleBuilderTest::TestSetExtensionValidatePUWellFormed() {
+ // ((sep tlang (sep tfield)*) | (sep tfield)+)
+ static const char* wellFormedExtensions[] = {
+ "a", // Short subtag
+ "z", // Short subtag
+ "0", // Short subtag, digit
+ "9", // Short subtag, digit
+ "a-0", // Two short subtag, alpha and digit
+ "9-z", // Two short subtag, digit and alpha
+ "ab",
+ "abc",
+ "abcefghi", // Long subtag
+ "87654321",
+ "01",
+ "234",
+ "0a-ab-87654321", // Three subtags
+ "87654321-ab-00-3A", // Four subtabs
+ "a-9-87654321", // Three subtags with short and long subtags
+ "87654321-ab-0-3A",
+ };
+ for (const char* extension : wellFormedExtensions) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setExtension('x', extension);
+ Locale loc = bld.build(status);
+ if (U_FAILURE(status)) {
+ errln("setExtension('x', \"%s\") got Error: %s\n",
+ extension, u_errorName(status));
+ }
+ }
+}
+
+void LocaleBuilderTest::TestSetExtensionValidatePUIllFormed() {
+ static const char* illFormed[] = {
+ "123456789", // Too long
+ "abcdefghi", // Too long
+ "ab-123456789", // Second subtag too long
+ "abcdefghi-12", // First subtag too long
+ "a-ab-987654321", // Third subtag too long
+ "987654321-a-0-3", // First subtag too long
+ };
+ for (const char* ill : illFormed) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setExtension('x', ill);
+ Locale loc = bld.build(status);
+ if (status != U_ILLEGAL_ARGUMENT_ERROR) {
+ errln("setExtension('x', \"%s\") should fail but has no Error\n",
+ ill);
+ }
+ }
+}
+
+void LocaleBuilderTest::TestSetExtensionOthers() {
+ LocaleBuilder bld;
+ bld.setLanguage("fr");
+ Verify(bld, "fr",
+ "setLanguage(\"fr\") got Error: %s\n");
+
+ bld.setExtension('Z', "ab");
+ Verify(bld, "fr-z-ab",
+ "setExtension('Z', \"ab\") got Error: %s\n");
+
+ bld.setExtension('0', "xyz12345-abcdefg");
+ Verify(bld, "fr-0-xyz12345-abcdefg-z-ab",
+ "setExtension('0', \"xyz12345-abcdefg\") got Error: %s\n");
+
+ bld.setExtension('a', "01-12345678-ABcdef");
+ Verify(bld, "fr-0-xyz12345-abcdefg-a-01-12345678-abcdef-z-ab",
+ "setExtension('a', \"01-12345678-ABcdef\") got Error: %s\n");
+
+ bld.setRegion("TH");
+ Verify(bld, "fr-TH-0-xyz12345-abcdefg-a-01-12345678-abcdef-z-ab",
+ "setRegion(\"TH\") got Error: %s\n");
+
+ bld.setScript("Arab");
+ Verify(bld, "fr-Arab-TH-0-xyz12345-abcdefg-a-01-12345678-abcdef-z-ab",
+ "setRegion(\"Arab\") got Error: %s\n");
+
+ bld.setExtension('A', "97");
+ Verify(bld, "fr-Arab-TH-0-xyz12345-abcdefg-a-97-z-ab",
+ "setExtension('a', \"97\") got Error: %s\n");
+
+ bld.setExtension('a', "");
+ Verify(bld, "fr-Arab-TH-0-xyz12345-abcdefg-z-ab",
+ "setExtension('a', \"\") got Error: %s\n");
+
+ bld.setExtension('0', "");
+ Verify(bld, "fr-Arab-TH-z-ab",
+ "setExtension('0', \"\") got Error: %s\n");
+}
+
+void LocaleBuilderTest::TestSetExtensionValidateOthersWellFormed() {
+ static const char* wellFormedExtensions[] = {
+ "ab",
+ "abc",
+ "abcefghi",
+ "01",
+ "234",
+ "87654321",
+ "0a-ab-87654321",
+ "87654321-ab-00-3A",
+ };
+
+ const char * aToZ = "abcdefghijklmnopqrstuvwxyz";
+ const int32_t aToZLen = static_cast<int32_t>(uprv_strlen(aToZ));
+ int32_t i = 0;
+ for (const char* extension : wellFormedExtensions) {
+ char ch = aToZ[i];
+ i = (i + 1) % aToZLen;
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setExtension(ch, extension);
+ Locale loc = bld.build(status);
+ if (U_FAILURE(status)) {
+ errln("setExtension('%c', \"%s\") got Error: %s\n",
+ ch, extension, u_errorName(status));
+ }
+ }
+
+ const char* someChars =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`~!@#$%^&*()-_=+;:,.<>?";
+ const int32_t someCharsLen = static_cast<int32_t>(uprv_strlen(someChars));
+ for (int32_t i = 0; i < someCharsLen; i++) {
+ char ch = someChars[i];
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setExtension(ch, wellFormedExtensions[ch % UPRV_LENGTHOF(wellFormedExtensions)]);
+ Locale loc = bld.build(status);
+ if (uprv_isASCIILetter(ch) || ('0' <= ch && ch <= '9')) {
+ if (ch != 't' && ch != 'T' && ch != 'u' && ch != 'U' && ch != 'x' && ch != 'X') {
+ if (U_FAILURE(status)) {
+ errln("setExtension('%c', \"%s\") got Error: %s\n",
+ ch, wellFormedExtensions[ch % UPRV_LENGTHOF(wellFormedExtensions)], u_errorName(status));
+ }
+ }
+ } else {
+ if (status != U_ILLEGAL_ARGUMENT_ERROR) {
+ errln("setExtension('%c', \"%s\") should fail but has no Error\n",
+ ch, wellFormedExtensions[ch % UPRV_LENGTHOF(wellFormedExtensions)]);
+ }
+ }
+
+ }
+}
+
+void LocaleBuilderTest::TestSetExtensionValidateOthersIllFormed() {
+ static const char* illFormed[] = {
+ "0", // Too short
+ "a", // Too short
+ "123456789", // Too long
+ "abcdefghi", // Too long
+ "ab-123456789", // Second subtag too long
+ "abcdefghi-12", // First subtag too long
+ "a-ab-87654321", // Third subtag too long
+ "87654321-a-0-3", // First subtag too long
+ };
+ const char * aToZ = "abcdefghijklmnopqrstuvwxyz";
+ const int32_t aToZLen = static_cast<int32_t>(uprv_strlen(aToZ));
+ int32_t i = 0;
+ for (const char* ill : illFormed) {
+ char ch = aToZ[i];
+ i = (i + 1) % aToZLen;
+ UErrorCode status = U_ZERO_ERROR;
+ LocaleBuilder bld;
+ bld.setExtension(ch, ill);
+ Locale loc = bld.build(status);
+ if (status != U_ILLEGAL_ARGUMENT_ERROR) {
+ errln("setExtension('%c', \"%s\") should fail but has no Error\n",
+ ch, ill);
+ }
+ }
+}
+
+void LocaleBuilderTest::TestSetLocale() {
+ LocaleBuilder bld1, bld2;
+ UErrorCode status = U_ZERO_ERROR;
+ Locale l1 = bld1.setLanguage("en")
+ .setScript("Latn")
+ .setRegion("MX")
+ .setVariant("3456-abcde")
+ .addUnicodeLocaleAttribute("456")
+ .addUnicodeLocaleAttribute("123")
+ .setUnicodeLocaleKeyword("nu", "thai")
+ .setUnicodeLocaleKeyword("co", "stroke")
+ .setUnicodeLocaleKeyword("ca", "chinese")
+ .build(status);
+ if (U_FAILURE(status) || l1.isBogus()) {
+ errln("build got Error: %s\n", u_errorName(status));
+ }
+ status = U_ZERO_ERROR;
+ Locale l2 = bld1.setLocale(l1).build(status);
+ if (U_FAILURE(status) || l2.isBogus()) {
+ errln("build got Error: %s\n", u_errorName(status));
+ }
+
+ if (l1 != l2) {
+ errln("Two locales should be the same, but one is '%s' and the other is '%s'",
+ l1.getName(), l2.getName());
+ }
+}
+
+void LocaleBuilderTest::TestPosixCases() {
+ UErrorCode status = U_ZERO_ERROR;
+ Locale l1 = Locale::forLanguageTag("en-US-u-va-posix", status);
+ if (U_FAILURE(status) || l1.isBogus()) {
+ errln("build got Error: %s\n", u_errorName(status));
+ }
+ LocaleBuilder bld;
+ bld.setLanguage("en")
+ .setRegion("MX")
+ .setScript("Arab")
+ .setUnicodeLocaleKeyword("nu", "Thai")
+ .setExtension('x', "1");
+ // All of above should be cleared by the setLocale call.
+ Locale l2 = bld.setLocale(l1).build(status);
+ if (U_FAILURE(status) || l2.isBogus()) {
+ errln("build got Error: %s\n", u_errorName(status));
+ }
+ if (l1 != l2) {
+ errln("The result locale should be the set as the setLocale %s but got %s\n",
+ l1.toLanguageTag<std::string>(status).c_str(),
+ l2.toLanguageTag<std::string>(status).c_str());
+ }
+ Locale posix("en-US-POSIX");
+ if (posix != l2) {
+ errln("The result locale should be the set as %s but got %s\n",
+ posix.getName(), l2.getName());
+ }
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/localebuildertest.h b/Build/source/libs/icu/icu-src/source/test/intltest/localebuildertest.h
new file mode 100644
index 00000000000..41f3730ff24
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/localebuildertest.h
@@ -0,0 +1,51 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include "intltest.h"
+#include "unicode/localebuilder.h"
+
+
+/**
+ * Tests for the LocaleBuilder class
+ **/
+class LocaleBuilderTest: public IntlTest {
+ public:
+ LocaleBuilderTest();
+ virtual ~LocaleBuilderTest();
+
+ void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = NULL );
+
+ void TestAddRemoveUnicodeLocaleAttribute(void);
+ void TestAddRemoveUnicodeLocaleAttributeWellFormed(void);
+ void TestAddUnicodeLocaleAttributeIllFormed(void);
+ void TestLocaleBuilder(void);
+ void TestLocaleBuilderBasic(void);
+ void TestPosixCases(void);
+ void TestSetExtensionOthers(void);
+ void TestSetExtensionPU(void);
+ void TestSetExtensionT(void);
+ void TestSetExtensionU(void);
+ void TestSetExtensionValidateOthersIllFormed(void);
+ void TestSetExtensionValidateOthersWellFormed(void);
+ void TestSetExtensionValidatePUIllFormed(void);
+ void TestSetExtensionValidatePUWellFormed(void);
+ void TestSetExtensionValidateTIllFormed(void);
+ void TestSetExtensionValidateTWellFormed(void);
+ void TestSetExtensionValidateUIllFormed(void);
+ void TestSetExtensionValidateUWellFormed(void);
+ void TestSetLanguageIllFormed(void);
+ void TestSetLanguageWellFormed(void);
+ void TestSetLocale(void);
+ void TestSetRegionIllFormed(void);
+ void TestSetRegionWellFormed(void);
+ void TestSetScriptIllFormed(void);
+ void TestSetScriptWellFormed(void);
+ void TestSetUnicodeLocaleKeywordIllFormedKey(void);
+ void TestSetUnicodeLocaleKeywordIllFormedValue(void);
+ void TestSetUnicodeLocaleKeywordWellFormed(void);
+ void TestSetVariantIllFormed(void);
+ void TestSetVariantWellFormed(void);
+
+ private:
+ void Verify(LocaleBuilder& bld, const char* expected, const char* msg);
+};
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/localematchertest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/localematchertest.cpp
new file mode 100644
index 00000000000..f8cb7a311d5
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/localematchertest.cpp
@@ -0,0 +1,589 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+
+// localematchertest.cpp
+// created: 2019jul04 Markus W. Scherer
+
+#include <string>
+#include <vector>
+
+#include "unicode/utypes.h"
+#include "unicode/localematcher.h"
+#include "unicode/locid.h"
+#include "charstr.h"
+#include "cmemory.h"
+#include "intltest.h"
+#include "localeprioritylist.h"
+#include "ucbuf.h"
+
+#define ARRAY_RANGE(array) (array), ((array) + UPRV_LENGTHOF(array))
+
+namespace {
+
+const char *locString(const Locale *loc) {
+ return loc != nullptr ? loc->getName() : "(null)";
+}
+
+struct TestCase {
+ int32_t lineNr = 0;
+
+ CharString supported;
+ CharString def;
+ UnicodeString favor;
+ UnicodeString threshold;
+ CharString desired;
+ CharString expMatch;
+ CharString expDesired;
+ CharString expCombined;
+
+ void reset() {
+ supported.clear();
+ def.clear();
+ favor.remove();
+ threshold.remove();
+ }
+};
+
+} // namespace
+
+class LocaleMatcherTest : public IntlTest {
+public:
+ LocaleMatcherTest() {}
+
+ void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=NULL);
+
+ void testEmpty();
+ void testCopyErrorTo();
+ void testBasics();
+ void testSupportedDefault();
+ void testUnsupportedDefault();
+ void testDemotion();
+ void testMatch();
+ void testResolvedLocale();
+ void testDataDriven();
+
+private:
+ UBool dataDriven(const TestCase &test, IcuTestErrorCode &errorCode);
+};
+
+extern IntlTest *createLocaleMatcherTest() {
+ return new LocaleMatcherTest();
+}
+
+void LocaleMatcherTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char * /*par*/) {
+ if(exec) {
+ logln("TestSuite LocaleMatcherTest: ");
+ }
+ TESTCASE_AUTO_BEGIN;
+ TESTCASE_AUTO(testEmpty);
+ TESTCASE_AUTO(testCopyErrorTo);
+ TESTCASE_AUTO(testBasics);
+ TESTCASE_AUTO(testSupportedDefault);
+ TESTCASE_AUTO(testUnsupportedDefault);
+ TESTCASE_AUTO(testDemotion);
+ TESTCASE_AUTO(testMatch);
+ TESTCASE_AUTO(testResolvedLocale);
+ TESTCASE_AUTO(testDataDriven);
+ TESTCASE_AUTO_END;
+}
+
+void LocaleMatcherTest::testEmpty() {
+ IcuTestErrorCode errorCode(*this, "testEmpty");
+ LocaleMatcher matcher = LocaleMatcher::Builder().build(errorCode);
+ const Locale *best = matcher.getBestMatch(Locale::getFrench(), errorCode);
+ assertEquals("getBestMatch(fr)", "(null)", locString(best));
+ LocaleMatcher::Result result = matcher.getBestMatchResult("fr", errorCode);
+ assertEquals("getBestMatchResult(fr).des", "(null)", locString(result.getDesiredLocale()));
+ assertEquals("getBestMatchResult(fr).desIndex", -1, result.getDesiredIndex());
+ assertEquals("getBestMatchResult(fr).supp",
+ "(null)", locString(result.getSupportedLocale()));
+ assertEquals("getBestMatchResult(fr).suppIndex",
+ -1, result.getSupportedIndex());
+}
+
+void LocaleMatcherTest::testCopyErrorTo() {
+ IcuTestErrorCode errorCode(*this, "testCopyErrorTo");
+ // The builder does not set any errors except out-of-memory.
+ // Test what we can.
+ LocaleMatcher::Builder builder;
+ UErrorCode success = U_ZERO_ERROR;
+ assertFalse("no error", builder.copyErrorTo(success));
+ assertTrue("still success", U_SUCCESS(success));
+ UErrorCode failure = U_INVALID_FORMAT_ERROR;
+ assertTrue("failure passed in", builder.copyErrorTo(failure));
+ assertEquals("same failure", U_INVALID_FORMAT_ERROR, failure);
+}
+
+void LocaleMatcherTest::testBasics() {
+ IcuTestErrorCode errorCode(*this, "testBasics");
+ Locale locales[] = { "fr", "en_GB", "en" };
+ {
+ LocaleMatcher matcher = LocaleMatcher::Builder().
+ setSupportedLocales(ARRAY_RANGE(locales)).build(errorCode);
+ const Locale *best = matcher.getBestMatch("en_GB", errorCode);
+ assertEquals("fromRange.getBestMatch(en_GB)", "en_GB", locString(best));
+ best = matcher.getBestMatch("en_US", errorCode);
+ assertEquals("fromRange.getBestMatch(en_US)", "en", locString(best));
+ best = matcher.getBestMatch("fr_FR", errorCode);
+ assertEquals("fromRange.getBestMatch(fr_FR)", "fr", locString(best));
+ best = matcher.getBestMatch("ja_JP", errorCode);
+ assertEquals("fromRange.getBestMatch(ja_JP)", "fr", locString(best));
+ }
+ // Code coverage: Variations of setting supported locales.
+ {
+ std::vector<Locale> locales{ "fr", "en_GB", "en" };
+ LocaleMatcher matcher = LocaleMatcher::Builder().
+ setSupportedLocales(locales.begin(), locales.end()).build(errorCode);
+ const Locale *best = matcher.getBestMatch("en_GB", errorCode);
+ assertEquals("fromRange.getBestMatch(en_GB)", "en_GB", locString(best));
+ best = matcher.getBestMatch("en_US", errorCode);
+ assertEquals("fromRange.getBestMatch(en_US)", "en", locString(best));
+ best = matcher.getBestMatch("fr_FR", errorCode);
+ assertEquals("fromRange.getBestMatch(fr_FR)", "fr", locString(best));
+ best = matcher.getBestMatch("ja_JP", errorCode);
+ assertEquals("fromRange.getBestMatch(ja_JP)", "fr", locString(best));
+ }
+ {
+ Locale::RangeIterator<Locale *> iter(ARRAY_RANGE(locales));
+ LocaleMatcher matcher = LocaleMatcher::Builder().
+ setSupportedLocales(iter).build(errorCode);
+ const Locale *best = matcher.getBestMatch("en_GB", errorCode);
+ assertEquals("fromIter.getBestMatch(en_GB)", "en_GB", locString(best));
+ best = matcher.getBestMatch("en_US", errorCode);
+ assertEquals("fromIter.getBestMatch(en_US)", "en", locString(best));
+ best = matcher.getBestMatch("fr_FR", errorCode);
+ assertEquals("fromIter.getBestMatch(fr_FR)", "fr", locString(best));
+ best = matcher.getBestMatch("ja_JP", errorCode);
+ assertEquals("fromIter.getBestMatch(ja_JP)", "fr", locString(best));
+ }
+ {
+ Locale *pointers[] = { locales, locales + 1, locales + 2 };
+ // Lambda with explicit reference return type to prevent copy-constructing a temporary
+ // which would be destructed right away.
+ LocaleMatcher matcher = LocaleMatcher::Builder().
+ setSupportedLocalesViaConverter(
+ ARRAY_RANGE(pointers), [](const Locale *p) -> const Locale & { return *p; }).
+ build(errorCode);
+ const Locale *best = matcher.getBestMatch("en_GB", errorCode);
+ assertEquals("viaConverter.getBestMatch(en_GB)", "en_GB", locString(best));
+ best = matcher.getBestMatch("en_US", errorCode);
+ assertEquals("viaConverter.getBestMatch(en_US)", "en", locString(best));
+ best = matcher.getBestMatch("fr_FR", errorCode);
+ assertEquals("viaConverter.getBestMatch(fr_FR)", "fr", locString(best));
+ best = matcher.getBestMatch("ja_JP", errorCode);
+ assertEquals("viaConverter.getBestMatch(ja_JP)", "fr", locString(best));
+ }
+ {
+ LocaleMatcher matcher = LocaleMatcher::Builder().
+ addSupportedLocale(locales[0]).
+ addSupportedLocale(locales[1]).
+ addSupportedLocale(locales[2]).
+ build(errorCode);
+ const Locale *best = matcher.getBestMatch("en_GB", errorCode);
+ assertEquals("added.getBestMatch(en_GB)", "en_GB", locString(best));
+ best = matcher.getBestMatch("en_US", errorCode);
+ assertEquals("added.getBestMatch(en_US)", "en", locString(best));
+ best = matcher.getBestMatch("fr_FR", errorCode);
+ assertEquals("added.getBestMatch(fr_FR)", "fr", locString(best));
+ best = matcher.getBestMatch("ja_JP", errorCode);
+ assertEquals("added.getBestMatch(ja_JP)", "fr", locString(best));
+ }
+ {
+ LocaleMatcher matcher = LocaleMatcher::Builder().
+ setSupportedLocalesFromListString(
+ " el, fr;q=0.555555, en-GB ; q = 0.88 , el; q =0, en;q=0.88 , fr ").
+ build(errorCode);
+ const Locale *best = matcher.getBestMatchForListString("el, fr, fr;q=0, en-GB", errorCode);
+ assertEquals("fromList.getBestMatch(en_GB)", "en_GB", locString(best));
+ best = matcher.getBestMatch("en_US", errorCode);
+ assertEquals("fromList.getBestMatch(en_US)", "en", locString(best));
+ best = matcher.getBestMatch("fr_FR", errorCode);
+ assertEquals("fromList.getBestMatch(fr_FR)", "fr", locString(best));
+ best = matcher.getBestMatch("ja_JP", errorCode);
+ assertEquals("fromList.getBestMatch(ja_JP)", "fr", locString(best));
+ }
+ // more API coverage
+ {
+ LocalePriorityList list("fr, en-GB", errorCode);
+ LocalePriorityList::Iterator iter(list.iterator());
+ LocaleMatcher matcher = LocaleMatcher::Builder().
+ setSupportedLocales(iter).
+ addSupportedLocale(Locale::getEnglish()).
+ setDefaultLocale(&Locale::getGerman()).
+ build(errorCode);
+ const Locale *best = matcher.getBestMatch("en_GB", errorCode);
+ assertEquals("withDefault.getBestMatch(en_GB)", "en_GB", locString(best));
+ best = matcher.getBestMatch("en_US", errorCode);
+ assertEquals("withDefault.getBestMatch(en_US)", "en", locString(best));
+ best = matcher.getBestMatch("fr_FR", errorCode);
+ assertEquals("withDefault.getBestMatch(fr_FR)", "fr", locString(best));
+ best = matcher.getBestMatch("ja_JP", errorCode);
+ assertEquals("withDefault.getBestMatch(ja_JP)", "de", locString(best));
+
+ Locale desired("en_GB"); // distinct object from Locale.UK
+ LocaleMatcher::Result result = matcher.getBestMatchResult(desired, errorCode);
+ assertTrue("withDefault: exactly desired en-GB object",
+ &desired == result.getDesiredLocale());
+ assertEquals("withDefault: en-GB desired index", 0, result.getDesiredIndex());
+ assertEquals("withDefault: en-GB supported",
+ "en_GB", locString(result.getSupportedLocale()));
+ assertEquals("withDefault: en-GB supported index", 1, result.getSupportedIndex());
+
+ LocalePriorityList list2("ja-JP, en-US", errorCode);
+ LocalePriorityList::Iterator iter2(list2.iterator());
+ result = matcher.getBestMatchResult(iter2, errorCode);
+ assertEquals("withDefault: ja-JP, en-US desired index", 1, result.getDesiredIndex());
+ assertEquals("withDefault: ja-JP, en-US desired",
+ "en_US", locString(result.getDesiredLocale()));
+
+ desired = Locale("en", "US"); // distinct object from Locale.US
+ result = matcher.getBestMatchResult(desired, errorCode);
+ assertTrue("withDefault: exactly desired en-US object",
+ &desired == result.getDesiredLocale());
+ assertEquals("withDefault: en-US desired index", 0, result.getDesiredIndex());
+ assertEquals("withDefault: en-US supported", "en", locString(result.getSupportedLocale()));
+ assertEquals("withDefault: en-US supported index", 2, result.getSupportedIndex());
+
+ result = matcher.getBestMatchResult("ja_JP", errorCode);
+ assertEquals("withDefault: ja-JP desired", "(null)", locString(result.getDesiredLocale()));
+ assertEquals("withDefault: ja-JP desired index", -1, result.getDesiredIndex());
+ assertEquals("withDefault: ja-JP supported", "de", locString(result.getSupportedLocale()));
+ assertEquals("withDefault: ja-JP supported index", -1, result.getSupportedIndex());
+ }
+}
+
+void LocaleMatcherTest::testSupportedDefault() {
+ // The default locale is one of the supported locales.
+ IcuTestErrorCode errorCode(*this, "testSupportedDefault");
+ Locale locales[] = { "fr", "en_GB", "en" };
+ LocaleMatcher matcher = LocaleMatcher::Builder().
+ setSupportedLocales(ARRAY_RANGE(locales)).
+ setDefaultLocale(&locales[1]).
+ build(errorCode);
+ const Locale *best = matcher.getBestMatch("en_GB", errorCode);
+ assertEquals("getBestMatch(en_GB)", "en_GB", locString(best));
+ best = matcher.getBestMatch("en_US", errorCode);
+ assertEquals("getBestMatch(en_US)", "en", locString(best));
+ best = matcher.getBestMatch("fr_FR", errorCode);
+ assertEquals("getBestMatch(fr_FR)", "fr", locString(best));
+ best = matcher.getBestMatch("ja_JP", errorCode);
+ assertEquals("getBestMatch(ja_JP)", "en_GB", locString(best));
+ LocaleMatcher::Result result = matcher.getBestMatchResult("ja_JP", errorCode);
+ assertEquals("getBestMatchResult(ja_JP).supp",
+ "en_GB", locString(result.getSupportedLocale()));
+ assertEquals("getBestMatchResult(ja_JP).suppIndex",
+ 1, result.getSupportedIndex());
+}
+
+void LocaleMatcherTest::testUnsupportedDefault() {
+ // The default locale does not match any of the supported locales.
+ IcuTestErrorCode errorCode(*this, "testUnsupportedDefault");
+ Locale locales[] = { "fr", "en_GB", "en" };
+ Locale def("de");
+ LocaleMatcher matcher = LocaleMatcher::Builder().
+ setSupportedLocales(ARRAY_RANGE(locales)).
+ setDefaultLocale(&def).
+ build(errorCode);
+ const Locale *best = matcher.getBestMatch("en_GB", errorCode);
+ assertEquals("getBestMatch(en_GB)", "en_GB", locString(best));
+ best = matcher.getBestMatch("en_US", errorCode);
+ assertEquals("getBestMatch(en_US)", "en", locString(best));
+ best = matcher.getBestMatch("fr_FR", errorCode);
+ assertEquals("getBestMatch(fr_FR)", "fr", locString(best));
+ best = matcher.getBestMatch("ja_JP", errorCode);
+ assertEquals("getBestMatch(ja_JP)", "de", locString(best));
+ LocaleMatcher::Result result = matcher.getBestMatchResult("ja_JP", errorCode);
+ assertEquals("getBestMatchResult(ja_JP).supp",
+ "de", locString(result.getSupportedLocale()));
+ assertEquals("getBestMatchResult(ja_JP).suppIndex",
+ -1, result.getSupportedIndex());
+}
+
+void LocaleMatcherTest::testDemotion() {
+ IcuTestErrorCode errorCode(*this, "testDemotion");
+ Locale supported[] = { "fr", "de-CH", "it" };
+ Locale desired[] = { "fr-CH", "de-CH", "it" };
+ {
+ LocaleMatcher noDemotion = LocaleMatcher::Builder().
+ setSupportedLocales(ARRAY_RANGE(supported)).
+ setDemotionPerDesiredLocale(ULOCMATCH_DEMOTION_NONE).build(errorCode);
+ Locale::RangeIterator<Locale *> desiredIter(ARRAY_RANGE(desired));
+ assertEquals("no demotion",
+ "de_CH", locString(noDemotion.getBestMatch(desiredIter, errorCode)));
+ }
+
+ {
+ LocaleMatcher regionDemotion = LocaleMatcher::Builder().
+ setSupportedLocales(ARRAY_RANGE(supported)).
+ setDemotionPerDesiredLocale(ULOCMATCH_DEMOTION_REGION).build(errorCode);
+ Locale::RangeIterator<Locale *> desiredIter(ARRAY_RANGE(desired));
+ assertEquals("region demotion",
+ "fr", locString(regionDemotion.getBestMatch(desiredIter, errorCode)));
+ }
+}
+
+void LocaleMatcherTest::testMatch() {
+ IcuTestErrorCode errorCode(*this, "testMatch");
+ LocaleMatcher matcher = LocaleMatcher::Builder().build(errorCode);
+
+ // Java test function testMatch_exact()
+ Locale en_CA("en_CA");
+ assertEquals("exact match", 1.0, matcher.internalMatch(en_CA, en_CA, errorCode));
+
+ // testMatch_none
+ Locale ar_MK("ar_MK");
+ double match = matcher.internalMatch(ar_MK, en_CA, errorCode);
+ assertTrue("mismatch: 0<=match<0.2", 0 <= match && match < 0.2);
+
+ // testMatch_matchOnMaximized
+ Locale und_TW("und_TW");
+ Locale zh("zh");
+ Locale zh_Hant("zh_Hant");
+ double matchZh = matcher.internalMatch(und_TW, zh, errorCode);
+ double matchZhHant = matcher.internalMatch(und_TW, zh_Hant, errorCode);
+ assertTrue("und_TW should be closer to zh_Hant than to zh",
+ matchZh < matchZhHant);
+ Locale en_Hant_TW("en_Hant_TW");
+ double matchEnHantTw = matcher.internalMatch(en_Hant_TW, zh_Hant, errorCode);
+ assertTrue("zh_Hant should be closer to und_TW than to en_Hant_TW",
+ matchEnHantTw < matchZhHant);
+ assertTrue("zh should be closer to und_TW than to en_Hant_TW",
+ matchEnHantTw < matchZh);
+}
+
+void LocaleMatcherTest::testResolvedLocale() {
+ IcuTestErrorCode errorCode(*this, "testResolvedLocale");
+ LocaleMatcher matcher = LocaleMatcher::Builder().
+ addSupportedLocale("ar-EG").
+ build(errorCode);
+ Locale desired("ar-SA-u-nu-latn");
+ LocaleMatcher::Result result = matcher.getBestMatchResult(desired, errorCode);
+ assertEquals("best", "ar_EG", locString(result.getSupportedLocale()));
+ Locale resolved = result.makeResolvedLocale(errorCode);
+ assertEquals("ar-EG + ar-SA-u-nu-latn = ar-SA-u-nu-latn",
+ "ar-SA-u-nu-latn",
+ resolved.toLanguageTag<std::string>(errorCode).data());
+}
+
+namespace {
+
+bool toInvariant(const UnicodeString &s, CharString &inv, ErrorCode &errorCode) {
+ if (errorCode.isSuccess()) {
+ inv.clear().appendInvariantChars(s, errorCode);
+ return errorCode.isSuccess();
+ }
+ return false;
+}
+
+bool getSuffixAfterPrefix(const UnicodeString &s, int32_t limit,
+ const UnicodeString &prefix, UnicodeString &suffix) {
+ if (prefix.length() <= limit && s.startsWith(prefix)) {
+ suffix.setTo(s, prefix.length(), limit - prefix.length());
+ return true;
+ } else {
+ return false;
+ }
+}
+
+bool getInvariantSuffixAfterPrefix(const UnicodeString &s, int32_t limit,
+ const UnicodeString &prefix, CharString &suffix,
+ ErrorCode &errorCode) {
+ UnicodeString u_suffix;
+ return getSuffixAfterPrefix(s, limit, prefix, u_suffix) &&
+ toInvariant(u_suffix, suffix, errorCode);
+}
+
+bool readTestCase(const UnicodeString &line, TestCase &test, IcuTestErrorCode &errorCode) {
+ if (errorCode.isFailure()) { return false; }
+ ++test.lineNr;
+ // Start of comment, or end of line, minus trailing spaces.
+ int32_t limit = line.indexOf(u'#');
+ if (limit < 0) {
+ limit = line.length();
+ // Remove trailing CR LF.
+ char16_t c;
+ while (limit > 0 && ((c = line.charAt(limit - 1)) == u'\n' || c == u'\r')) {
+ --limit;
+ }
+ }
+ // Remove spaces before comment or at the end of the line.
+ char16_t c;
+ while (limit > 0 && ((c = line.charAt(limit - 1)) == u' ' || c == u'\t')) {
+ --limit;
+ }
+ if (limit == 0) { // empty line
+ return false;
+ }
+ if (line.startsWith(u"** test: ")) {
+ test.reset();
+ } else if (getInvariantSuffixAfterPrefix(line, limit, u"@supported=",
+ test.supported, errorCode)) {
+ } else if (getInvariantSuffixAfterPrefix(line, limit, u"@default=",
+ test.def, errorCode)) {
+ } else if (getSuffixAfterPrefix(line, limit, u"@favor=", test.favor)) {
+ } else if (getSuffixAfterPrefix(line, limit, u"@threshold=", test.threshold)) {
+ } else {
+ int32_t matchSep = line.indexOf(u">>");
+ // >> before an inline comment, and followed by more than white space.
+ if (0 <= matchSep && (matchSep + 2) < limit) {
+ toInvariant(line.tempSubStringBetween(0, matchSep).trim(), test.desired, errorCode);
+ test.expDesired.clear();
+ test.expCombined.clear();
+ int32_t start = matchSep + 2;
+ int32_t expLimit = line.indexOf(u'|', start);
+ if (expLimit < 0) {
+ toInvariant(line.tempSubStringBetween(start, limit).trim(),
+ test.expMatch, errorCode);
+ } else {
+ toInvariant(line.tempSubStringBetween(start, expLimit).trim(),
+ test.expMatch, errorCode);
+ start = expLimit + 1;
+ expLimit = line.indexOf(u'|', start);
+ if (expLimit < 0) {
+ toInvariant(line.tempSubStringBetween(start, limit).trim(),
+ test.expDesired, errorCode);
+ } else {
+ toInvariant(line.tempSubStringBetween(start, expLimit).trim(),
+ test.expDesired, errorCode);
+ toInvariant(line.tempSubStringBetween(expLimit + 1, limit).trim(),
+ test.expCombined, errorCode);
+ }
+ }
+ return errorCode.isSuccess();
+ } else {
+ errorCode.set(U_INVALID_FORMAT_ERROR);
+ }
+ }
+ return false;
+}
+
+Locale *getLocaleOrNull(const CharString &s, Locale &locale) {
+ if (s == "null") {
+ return nullptr;
+ } else {
+ return &(locale = Locale(s.data()));
+ }
+}
+
+} // namespace
+
+UBool LocaleMatcherTest::dataDriven(const TestCase &test, IcuTestErrorCode &errorCode) {
+ LocaleMatcher::Builder builder;
+ builder.setSupportedLocalesFromListString(test.supported.toStringPiece());
+ if (!test.def.isEmpty()) {
+ Locale defaultLocale(test.def.data());
+ builder.setDefaultLocale(&defaultLocale);
+ }
+ if (!test.favor.isEmpty()) {
+ ULocMatchFavorSubtag favor;
+ if (test.favor == u"normal") {
+ favor = ULOCMATCH_FAVOR_LANGUAGE;
+ } else if (test.favor == u"script") {
+ favor = ULOCMATCH_FAVOR_SCRIPT;
+ } else {
+ errln(UnicodeString(u"unsupported FavorSubtag value ") + test.favor);
+ return FALSE;
+ }
+ builder.setFavorSubtag(favor);
+ }
+ if (!test.threshold.isEmpty()) {
+ infoln("skipping test case on line %d with non-default threshold: not exposed via API",
+ (int)test.lineNr);
+ return TRUE;
+ // int32_t threshold = Integer.valueOf(test.threshold);
+ // builder.internalSetThresholdDistance(threshold);
+ }
+ LocaleMatcher matcher = builder.build(errorCode);
+ if (errorCode.errIfFailureAndReset("LocaleMatcher::Builder::build()")) {
+ return FALSE;
+ }
+
+ Locale expMatchLocale("");
+ Locale *expMatch = getLocaleOrNull(test.expMatch, expMatchLocale);
+ if (test.expDesired.isEmpty() && test.expCombined.isEmpty()) {
+ StringPiece desiredSP = test.desired.toStringPiece();
+ const Locale *bestSupported = matcher.getBestMatchForListString(desiredSP, errorCode);
+ if (!assertEquals("bestSupported from string",
+ locString(expMatch), locString(bestSupported))) {
+ return FALSE;
+ }
+ LocalePriorityList desired(test.desired.toStringPiece(), errorCode);
+ LocalePriorityList::Iterator desiredIter = desired.iterator();
+ if (desired.getLength() == 1) {
+ const Locale &desiredLocale = desiredIter.next();
+ bestSupported = matcher.getBestMatch(desiredLocale, errorCode);
+ UBool ok = assertEquals("bestSupported from Locale",
+ locString(expMatch), locString(bestSupported));
+
+ LocaleMatcher::Result result = matcher.getBestMatchResult(desiredLocale, errorCode);
+ return ok & assertEquals("result.getSupportedLocale from Locale",
+ locString(expMatch), locString(result.getSupportedLocale()));
+ } else {
+ bestSupported = matcher.getBestMatch(desiredIter, errorCode);
+ return assertEquals("bestSupported from Locale iterator",
+ locString(expMatch), locString(bestSupported));
+ }
+ } else {
+ LocalePriorityList desired(test.desired.toStringPiece(), errorCode);
+ LocalePriorityList::Iterator desiredIter = desired.iterator();
+ LocaleMatcher::Result result = matcher.getBestMatchResult(desiredIter, errorCode);
+ UBool ok = assertEquals("result.getSupportedLocale from Locales",
+ locString(expMatch), locString(result.getSupportedLocale()));
+ if (!test.expDesired.isEmpty()) {
+ Locale expDesiredLocale("");
+ Locale *expDesired = getLocaleOrNull(test.expDesired, expDesiredLocale);
+ ok &= assertEquals("result.getDesiredLocale from Locales",
+ locString(expDesired), locString(result.getDesiredLocale()));
+ }
+ if (!test.expCombined.isEmpty()) {
+ if (test.expMatch.contains("-u-")) {
+ logKnownIssue("20727",
+ UnicodeString(u"ignoring makeResolvedLocale() line ") + test.lineNr);
+ return ok;
+ }
+ Locale expCombinedLocale("");
+ Locale *expCombined = getLocaleOrNull(test.expCombined, expCombinedLocale);
+ Locale combined = result.makeResolvedLocale(errorCode);
+ ok &= assertEquals("combined Locale from Locales",
+ locString(expCombined), locString(&combined));
+ }
+ return ok;
+ }
+}
+
+void LocaleMatcherTest::testDataDriven() {
+ IcuTestErrorCode errorCode(*this, "testDataDriven");
+ CharString path(getSourceTestData(errorCode), errorCode);
+ path.appendPathPart("localeMatcherTest.txt", errorCode);
+ const char *codePage = "UTF-8";
+ LocalUCHARBUFPointer f(ucbuf_open(path.data(), &codePage, TRUE, FALSE, errorCode));
+ if(errorCode.errIfFailureAndReset("ucbuf_open(localeMatcherTest.txt)")) {
+ return;
+ }
+ int32_t lineLength;
+ const UChar *p;
+ UnicodeString line;
+ TestCase test;
+ int32_t numPassed = 0;
+ while ((p = ucbuf_readline(f.getAlias(), &lineLength, errorCode)) != nullptr &&
+ errorCode.isSuccess()) {
+ line.setTo(FALSE, p, lineLength);
+ if (!readTestCase(line, test, errorCode)) {
+ if (errorCode.errIfFailureAndReset(
+ "test data syntax error on line %d", (int)test.lineNr)) {
+ infoln(line);
+ }
+ continue;
+ }
+ UBool ok = dataDriven(test, errorCode);
+ if (errorCode.errIfFailureAndReset("test error on line %d", (int)test.lineNr)) {
+ infoln(line);
+ } else if (!ok) {
+ infoln("test failure on line %d", (int)test.lineNr);
+ infoln(line);
+ } else {
+ ++numPassed;
+ }
+ }
+ infoln("number of passing test cases: %d", (int)numPassed);
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/locnmtst.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/locnmtst.cpp
index a9ed5e64d25..26f730d4bb2 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/locnmtst.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/locnmtst.cpp
@@ -20,13 +20,12 @@
the macro is ugly but makes the tests pretty.
*/
-#define test_assert(test) \
- { \
- if(!(test)) \
- errln("FAIL: " #test " was not true. In " __FILE__ " on line %d", __LINE__ ); \
- else \
- logln("PASS: asserted " #test); \
- }
+#define test_assert(test) UPRV_BLOCK_MACRO_BEGIN { \
+ if(!(test)) \
+ errln("FAIL: " #test " was not true. In " __FILE__ " on line %d", __LINE__ ); \
+ else \
+ logln("PASS: asserted " #test); \
+} UPRV_BLOCK_MACRO_END
/*
Usage:
@@ -38,25 +37,25 @@
the macro is ugly but makes the tests pretty.
*/
-#define test_assert_print(test,print) \
- { \
- if(!(test)) \
- errln("FAIL: " #test " was not true. " + UnicodeString(print) ); \
- else \
- logln("PASS: asserted " #test "-> " + UnicodeString(print)); \
- }
+#define test_assert_print(test,print) UPRV_BLOCK_MACRO_BEGIN { \
+ if(!(test)) \
+ errln("FAIL: " #test " was not true. " + UnicodeString(print) ); \
+ else \
+ logln("PASS: asserted " #test "-> " + UnicodeString(print)); \
+} UPRV_BLOCK_MACRO_END
-#define test_assert_equal(target,value) \
- { \
+#define test_assert_equal(target,value) UPRV_BLOCK_MACRO_BEGIN { \
if (UnicodeString(target)!=(value)) { \
- logln("unexpected value '" + (value) + "'"); \
- dataerrln("FAIL: " #target " == " #value " was not true. In " __FILE__ " on line %d", __LINE__); \
+ logln("unexpected value '" + (value) + "'"); \
+ dataerrln("FAIL: " #target " == " #value " was not true. In " __FILE__ " on line %d", __LINE__); \
} else { \
- logln("PASS: asserted " #target " == " #value); \
+ logln("PASS: asserted " #target " == " #value); \
} \
- }
+} UPRV_BLOCK_MACRO_END
-#define test_dumpLocale(l) { logln(#l " = " + UnicodeString(l.getName(), "")); }
+#define test_dumpLocale(l) UPRV_BLOCK_MACRO_BEGIN { \
+ logln(#l " = " + UnicodeString(l.getName(), "")); \
+} UPRV_BLOCK_MACRO_END
LocaleDisplayNamesTest::LocaleDisplayNamesTest() {
}
@@ -82,6 +81,7 @@ void LocaleDisplayNamesTest::runIndexedTest(int32_t index, UBool exec, const cha
TESTCASE(11, TestPrivateUse);
TESTCASE(12, TestUldnDisplayContext);
TESTCASE(13, TestUldnWithGarbage);
+ TESTCASE(14, TestSubstituteHandling);
#endif
default:
name = "";
@@ -422,4 +422,161 @@ void LocaleDisplayNamesTest::TestRootEtc() {
delete ldn;
}
+static const char unknown_region[] = "wx";
+static const char unknown_lang[] = "xy";
+static const char unknown_script[] = "wxyz";
+static const char unknown_variant[] = "abc";
+static const char unknown_key[] = "efg";
+static const char unknown_ca_value[] = "ijk";
+static const char known_lang_unknown_script[] = "en-wxyz";
+static const char unknown_lang_unknown_script[] = "xy-wxyz";
+static const char unknown_lang_known_script[] = "xy-Latn";
+static const char unknown_lang_unknown_region[] = "xy-wx";
+static const char known_lang_unknown_region[] = "en-wx";
+static const char unknown_lang_known_region[] = "xy-US";
+static const char unknown_lang_unknown_script_unknown_region[] = "xy-wxyz-wx";
+static const char known_lang_unknown_script_unknown_region[] = "en-wxyz-wx";
+static const char unknown_lang_known_script_unknown_region[] = "xy-Latn-wx";
+static const char unknown_lang_known_script_known_region[] = "xy-wxyz-US";
+static const char known_lang[] = "en";
+static const char known_lang_known_script[] = "en-Latn";
+static const char known_lang_known_region[] = "en-US";
+static const char known_lang_known_script_known_region[] = "en-Latn-US";
+
+void LocaleDisplayNamesTest::VerifySubstitute(LocaleDisplayNames* ldn) {
+ UnicodeString temp;
+ // Ensure the default is UDISPCTX_SUBSTITUTE
+ UDisplayContext context = ldn->getContext(UDISPCTX_TYPE_SUBSTITUTE_HANDLING);
+ test_assert(UDISPCTX_SUBSTITUTE == context);
+
+ ldn->regionDisplayName(unknown_region, temp);
+ test_assert_equal(unknown_region, temp);
+ ldn->languageDisplayName(unknown_lang, temp);
+ test_assert_equal(unknown_lang, temp);
+ ldn->scriptDisplayName(unknown_script, temp);
+ test_assert_equal(unknown_script, temp);
+ ldn->variantDisplayName(unknown_variant, temp);
+ test_assert_equal(unknown_variant, temp);
+ ldn->keyDisplayName(unknown_key, temp);
+ test_assert_equal(unknown_key, temp);
+ ldn->keyValueDisplayName("ca", unknown_ca_value, temp);
+ test_assert_equal(unknown_ca_value, temp);
+
+ ldn->localeDisplayName(unknown_lang, temp);
+ test_assert_equal(unknown_lang, temp);
+ ldn->localeDisplayName(known_lang_unknown_script, temp);
+ test_assert_equal("Englisch (Wxyz)", temp);
+ ldn->localeDisplayName(unknown_lang_unknown_script, temp);
+ test_assert_equal("xy (Wxyz)", temp);
+ ldn->localeDisplayName(unknown_lang_known_script, temp);
+ test_assert_equal("xy (Lateinisch)", temp);
+ ldn->localeDisplayName(unknown_lang_unknown_region, temp);
+ test_assert_equal("xy (WX)", temp);
+ ldn->localeDisplayName(known_lang_unknown_region, temp);
+ test_assert_equal("Englisch (WX)", temp);
+ ldn->localeDisplayName(unknown_lang_known_region, temp);
+ test_assert_equal("xy (Vereinigte Staaten)", temp);
+ ldn->localeDisplayName(unknown_lang_unknown_script_unknown_region, temp);
+ test_assert_equal("xy (Wxyz, WX)", temp);
+ ldn->localeDisplayName(known_lang_unknown_script_unknown_region, temp);
+ test_assert_equal("Englisch (Wxyz, WX)", temp);
+ ldn->localeDisplayName(unknown_lang_known_script_unknown_region, temp);
+ test_assert_equal("xy (Lateinisch, WX)", temp);
+ ldn->localeDisplayName(unknown_lang_known_script_known_region, temp);
+ test_assert_equal("xy (Wxyz, Vereinigte Staaten)", temp);
+
+ ldn->localeDisplayName(known_lang, temp);
+ test_assert_equal("Englisch", temp);
+ ldn->localeDisplayName(known_lang_known_script, temp);
+ test_assert_equal("Englisch (Lateinisch)", temp);
+ ldn->localeDisplayName(known_lang_known_region, temp);
+ test_assert_equal("Englisch (Vereinigte Staaten)", temp);
+ ldn->localeDisplayName(known_lang_known_script_known_region, temp);
+ test_assert_equal("Englisch (Lateinisch, Vereinigte Staaten)", temp);
+}
+
+void LocaleDisplayNamesTest::VerifyNoSubstitute(LocaleDisplayNames* ldn) {
+ UnicodeString temp("");
+ std::string utf8;
+ // Ensure the default is UDISPCTX_SUBSTITUTE
+ UDisplayContext context = ldn->getContext(UDISPCTX_TYPE_SUBSTITUTE_HANDLING);
+ test_assert(UDISPCTX_NO_SUBSTITUTE == context);
+
+ ldn->regionDisplayName(unknown_region, temp);
+ test_assert(TRUE == temp.isBogus());
+ ldn->languageDisplayName(unknown_lang, temp);
+ test_assert(TRUE == temp.isBogus());
+ ldn->scriptDisplayName(unknown_script, temp);
+ test_assert(TRUE == temp.isBogus());
+ ldn->variantDisplayName(unknown_variant, temp);
+ test_assert(TRUE == temp.isBogus());
+ ldn->keyDisplayName(unknown_key, temp);
+ test_assert(TRUE == temp.isBogus());
+ ldn->keyValueDisplayName("ca", unknown_ca_value, temp);
+ test_assert(TRUE == temp.isBogus());
+
+ ldn->localeDisplayName(unknown_lang, temp);
+ test_assert(TRUE == temp.isBogus());
+ ldn->localeDisplayName(known_lang_unknown_script, temp);
+ test_assert(TRUE == temp.isBogus());
+ ldn->localeDisplayName(unknown_lang_unknown_script, temp);
+ test_assert(TRUE == temp.isBogus());
+ ldn->localeDisplayName(unknown_lang_known_script, temp);
+ test_assert(TRUE == temp.isBogus());
+ ldn->localeDisplayName(unknown_lang_unknown_region, temp);
+ test_assert(TRUE == temp.isBogus());
+ ldn->localeDisplayName(known_lang_unknown_region, temp);
+ test_assert(TRUE == temp.isBogus());
+ ldn->localeDisplayName(unknown_lang_known_region, temp);
+ test_assert(TRUE == temp.isBogus());
+ ldn->localeDisplayName(unknown_lang_unknown_script_unknown_region, temp);
+ test_assert(TRUE == temp.isBogus());
+ ldn->localeDisplayName(known_lang_unknown_script_unknown_region, temp);
+ test_assert(TRUE == temp.isBogus());
+ ldn->localeDisplayName(unknown_lang_known_script_unknown_region, temp);
+ test_assert(TRUE == temp.isBogus());
+ ldn->localeDisplayName(unknown_lang_known_script_known_region, temp);
+ test_assert(TRUE == temp.isBogus());
+
+ ldn->localeDisplayName(known_lang, temp);
+ test_assert_equal("Englisch", temp);
+ ldn->localeDisplayName(known_lang_known_script, temp);
+ test_assert_equal("Englisch (Lateinisch)", temp);
+ ldn->localeDisplayName(known_lang_known_region, temp);
+ test_assert_equal("Englisch (Vereinigte Staaten)", temp);
+ ldn->localeDisplayName(known_lang_known_script_known_region, temp);
+ test_assert_equal("Englisch (Lateinisch, Vereinigte Staaten)", temp);
+}
+
+void LocaleDisplayNamesTest::TestSubstituteHandling() {
+ // With substitute as default
+ logln("Context: none\n");
+ std::unique_ptr<LocaleDisplayNames> ldn(LocaleDisplayNames::createInstance(Locale::getGermany()));
+ VerifySubstitute(ldn.get());
+
+ // With explicit set substitute, and standard names
+ logln("Context: UDISPCTX_SUBSTITUTE, UDISPCTX_STANDARD_NAMES\n");
+ UDisplayContext context_1[] = { UDISPCTX_SUBSTITUTE, UDISPCTX_STANDARD_NAMES };
+ ldn.reset(LocaleDisplayNames::createInstance(Locale::getGermany(), context_1, 2));
+ VerifySubstitute(ldn.get());
+
+ // With explicit set substitute and dialect names
+ logln("Context: UDISPCTX_SUBSTITUTE, UDISPCTX_DIALECT_NAMES\n");
+ UDisplayContext context_2[] = { UDISPCTX_SUBSTITUTE, UDISPCTX_DIALECT_NAMES };
+ ldn.reset(LocaleDisplayNames::createInstance(Locale::getGermany(), context_2, 2));
+ VerifySubstitute(ldn.get());
+
+ // With explicit set no_substitute, and standard names
+ logln("Context: UDISPCTX_NO_SUBSTITUTE, UDISPCTX_STANDARD_NAMES\n");
+ UDisplayContext context_3[] = { UDISPCTX_NO_SUBSTITUTE, UDISPCTX_STANDARD_NAMES };
+ ldn.reset(LocaleDisplayNames::createInstance(Locale::getGermany(), context_3, 2));
+ VerifyNoSubstitute(ldn.get());
+
+ // With explicit set no_substitute and dialect names
+ logln("Context: UDISPCTX_NO_SUBSTITUTE, UDISPCTX_DIALECT_NAMES\n");
+ UDisplayContext context_4[] = { UDISPCTX_NO_SUBSTITUTE, UDISPCTX_DIALECT_NAMES };
+ ldn.reset(LocaleDisplayNames::createInstance(Locale::getGermany(), context_4, 2));
+ VerifyNoSubstitute(ldn.get());
+}
+
#endif /* UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/locnmtst.h b/Build/source/libs/icu/icu-src/source/test/intltest/locnmtst.h
index 0f84f98b73b..ad0af463a16 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/locnmtst.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/locnmtst.h
@@ -37,5 +37,10 @@ public:
void TestPrivateUse(void);
void TestUldnDisplayContext(void);
void TestUldnWithGarbage(void);
+ void TestSubstituteHandling(void);
+
+ void VerifySubstitute(LocaleDisplayNames* ldn);
+ void VerifyNoSubstitute(LocaleDisplayNames* ldn);
#endif
+
};
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/loctest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/loctest.cpp
index c467472767d..98612a1a37c 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/loctest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/loctest.cpp
@@ -6,11 +6,13 @@
* others. All Rights Reserved.
********************************************************************/
+#include <functional>
#include <iterator>
#include <set>
#include <utility>
#include "loctest.h"
+#include "unicode/localebuilder.h"
#include "unicode/localpointer.h"
#include "unicode/decimfmt.h"
#include "unicode/ucurr.h"
@@ -49,7 +51,7 @@ static const char* const rawData[33][8] = {
// LCID
{ "409", "40c", "403", "408", "814", "10", "0", "804" },
- // display langage (English)
+ // display language (English)
{ "English", "French", "Catalan", "Greek", "Norwegian", "Italian", "xx", "Chinese" },
// display script (English)
{ "", "", "", "", "", "", "", "Simplified Han" },
@@ -62,7 +64,7 @@ static const char* const rawData[33][8] = {
// (part of Euro support).
{ "English (United States)", "French (France)", "Catalan (Spain)", "Greek (Greece)", "Norwegian (Norway, NY)", "Italian", "xx (YY)", "Chinese (Simplified, China)" },
- // display langage (French)
+ // display language (French)
{ "anglais", "fran\\u00E7ais", "catalan", "grec", "norv\\u00E9gien", "italien", "xx", "chinois" },
// display script (French)
{ "", "", "", "", "", "", "", "sinogrammes simplifi\\u00E9s" },
@@ -86,7 +88,7 @@ static const char* const rawData[33][8] = {
/* display name (Catalan) */
{ "angl\\u00E8s (Estats Units)", "franc\\u00E8s (Fran\\u00E7a)", "catal\\u00E0 (Espanya)", "grec (Gr\\u00E8cia)", "noruec (Noruega, NY)", "itali\\u00E0", "", "xin\\u00E8s (simplificat, Xina)" },
- // display langage (Greek)[actual values listed below]
+ // display language (Greek)[actual values listed below]
{ "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac",
"\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac",
"\\u039a\\u03b1\\u03c4\\u03b1\\u03bb\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac",
@@ -121,7 +123,7 @@ static const char* const rawData[33][8] = {
"\\u039A\\u03B9\\u03BD\\u03B5\\u03B6\\u03B9\\u03BA\\u03AC (\\u0391\\u03c0\\u03bb\\u03bf\\u03c0\\u03bf\\u03b9\\u03b7\\u03bc\\u03ad\\u03bd\\u03bf, \\u039A\\u03AF\\u03BD\\u03B1)"
},
- // display langage (<root>)
+ // display language (<root>)
{ "English", "French", "Catalan", "Greek", "Norwegian", "Italian", "xx", "" },
// display script (<root>)
{ "", "", "", "", "", "", "", ""},
@@ -145,13 +147,12 @@ static const char* const rawData[33][8] = {
the macro is ugly but makes the tests pretty.
*/
-#define test_assert(test) \
- { \
- if(!(test)) \
- errln("FAIL: " #test " was not true. In " __FILE__ " on line %d", __LINE__ ); \
- else \
- logln("PASS: asserted " #test); \
- }
+#define test_assert(test) UPRV_BLOCK_MACRO_BEGIN { \
+ if(!(test)) \
+ errln("FAIL: " #test " was not true. In " __FILE__ " on line %d", __LINE__ ); \
+ else \
+ logln("PASS: asserted " #test); \
+} UPRV_BLOCK_MACRO_END
/*
Usage:
@@ -163,16 +164,17 @@ static const char* const rawData[33][8] = {
the macro is ugly but makes the tests pretty.
*/
-#define test_assert_print(test,print) \
- { \
- if(!(test)) \
- errln("FAIL: " #test " was not true. " + UnicodeString(print) ); \
- else \
- logln("PASS: asserted " #test "-> " + UnicodeString(print)); \
- }
+#define test_assert_print(test,print) UPRV_BLOCK_MACRO_BEGIN { \
+ if(!(test)) \
+ errln("FAIL: " #test " was not true. " + UnicodeString(print) ); \
+ else \
+ logln("PASS: asserted " #test "-> " + UnicodeString(print)); \
+} UPRV_BLOCK_MACRO_END
-#define test_dumpLocale(l) { logln(#l " = " + UnicodeString(l.getName(), "")); }
+#define test_dumpLocale(l) UPRV_BLOCK_MACRO_BEGIN { \
+ logln(#l " = " + UnicodeString(l.getName(), "")); \
+} UPRV_BLOCK_MACRO_END
LocaleTest::LocaleTest()
: dataTable(NULL)
@@ -220,6 +222,7 @@ void LocaleTest::runIndexedTest( int32_t index, UBool exec, const char* &name, c
TESTCASE_AUTO(Test4147317);
TESTCASE_AUTO(Test4147552);
TESTCASE_AUTO(TestVariantParsing);
+ TESTCASE_AUTO(Test20639_DeprecatesISO3Language);
#if !UCONFIG_NO_FORMATTING
TESTCASE_AUTO(Test4105828);
#endif
@@ -227,11 +230,14 @@ void LocaleTest::runIndexedTest( int32_t index, UBool exec, const char* &name, c
TESTCASE_AUTO(TestParallelAPIValues);
TESTCASE_AUTO(TestAddLikelySubtags);
TESTCASE_AUTO(TestMinimizeSubtags);
+ TESTCASE_AUTO(TestAddLikelyAndMinimizeSubtags);
TESTCASE_AUTO(TestKeywordVariants);
TESTCASE_AUTO(TestCreateUnicodeKeywords);
TESTCASE_AUTO(TestKeywordVariantParsing);
TESTCASE_AUTO(TestCreateKeywordSet);
+ TESTCASE_AUTO(TestCreateKeywordSetEmpty);
TESTCASE_AUTO(TestCreateUnicodeKeywordSet);
+ TESTCASE_AUTO(TestCreateUnicodeKeywordSetEmpty);
TESTCASE_AUTO(TestGetKeywordValueStdString);
TESTCASE_AUTO(TestGetUnicodeKeywordValueStdString);
TESTCASE_AUTO(TestSetKeywordValue);
@@ -248,11 +254,23 @@ void LocaleTest::runIndexedTest( int32_t index, UBool exec, const char* &name, c
TESTCASE_AUTO(TestIsRightToLeft);
TESTCASE_AUTO(TestBug13277);
TESTCASE_AUTO(TestBug13554);
+ TESTCASE_AUTO(TestBug20410);
+ TESTCASE_AUTO(TestConstructorAcceptsBCP47);
TESTCASE_AUTO(TestForLanguageTag);
TESTCASE_AUTO(TestToLanguageTag);
TESTCASE_AUTO(TestMoveAssign);
TESTCASE_AUTO(TestMoveCtor);
+ TESTCASE_AUTO(TestBug20407iVariantPreferredValue);
TESTCASE_AUTO(TestBug13417VeryLongLanguageTag);
+ TESTCASE_AUTO(TestBug11053UnderlineTimeZone);
+ TESTCASE_AUTO(TestUnd);
+ TESTCASE_AUTO(TestUndScript);
+ TESTCASE_AUTO(TestUndRegion);
+ TESTCASE_AUTO(TestUndCAPI);
+ TESTCASE_AUTO(TestRangeIterator);
+ TESTCASE_AUTO(TestPointerConvertingIterator);
+ TESTCASE_AUTO(TestTagConvertingIterator);
+ TESTCASE_AUTO(TestCapturingTagConvertingIterator);
TESTCASE_AUTO_END;
}
@@ -889,8 +907,8 @@ LocaleTest::TestGetLangsAndCountries()
;
/* TODO: Change this test to be more like the cloctst version? */
- if (testCount != 595)
- errln("Expected getISOLanguages() to return 595 languages; it returned %d", testCount);
+ if (testCount != 596)
+ errln("Expected getISOLanguages() to return 596 languages; it returned %d", testCount);
else {
for (i = 0; i < 15; i++) {
int32_t j;
@@ -1058,29 +1076,29 @@ LocaleTest::TestAtypicalLocales()
"Russian (Mexico)",
"English (France)",
"Spanish (Germany)",
- "Croatia",
- "Sweden",
- "Dominican Republic",
- "Belgium" };
+ "Unknown language (Croatia)",
+ "Unknown language (Sweden)",
+ "Unknown language (Dominican Republic)",
+ "Unknown language (Belgium)" };
UnicodeString frenchDisplayNames []= { "allemand (Canada)",
- "japonais (Afrique du Sud)",
- "russe (Mexique)",
+ "japonais (Afrique du Sud)",
+ "russe (Mexique)",
"anglais (France)",
"espagnol (Allemagne)",
- "Croatie",
- CharsToUnicodeString("Su\\u00E8de"),
- CharsToUnicodeString("R\\u00E9publique dominicaine"),
- "Belgique" };
+ u"langue indéterminée (Croatie)",
+ u"langue indéterminée (Suède)",
+ u"langue indéterminée (République dominicaine)",
+ u"langue indéterminée (Belgique)" };
UnicodeString spanishDisplayNames [] = {
- CharsToUnicodeString("alem\\u00E1n (Canad\\u00E1)"),
- CharsToUnicodeString("japon\\u00E9s (Sud\\u00E1frica)"),
- CharsToUnicodeString("ruso (M\\u00E9xico)"),
- CharsToUnicodeString("ingl\\u00E9s (Francia)"),
- CharsToUnicodeString("espa\\u00F1ol (Alemania)"),
- "Croacia",
- "Suecia",
- CharsToUnicodeString("Rep\\u00FAblica Dominicana"),
- CharsToUnicodeString("B\\u00E9lgica") };
+ u"alemán (Canadá)",
+ u"japonés (Sudáfrica)",
+ u"ruso (México)",
+ u"inglés (Francia)",
+ u"español (Alemania)",
+ "lengua desconocida (Croacia)",
+ "lengua desconocida (Suecia)",
+ u"lengua desconocida (República Dominicana)",
+ u"lengua desconocida (Bélgica)" };
// De-Anglicizing root required the change from
// English display names to ISO Codes - ram 2003/09/26
UnicodeString invDisplayNames [] = { "German (Canada)",
@@ -1088,10 +1106,10 @@ LocaleTest::TestAtypicalLocales()
"Russian (Mexico)",
"English (France)",
"Spanish (Germany)",
- "Croatia",
- "Sweden",
- "Dominican Republic",
- "Belgium" };
+ "Unknown language (Croatia)",
+ "Unknown language (Sweden)",
+ "Unknown language (Dominican Republic)",
+ "Unknown language (Belgium)" };
int32_t i;
UErrorCode status = U_ZERO_ERROR;
@@ -1198,8 +1216,8 @@ LocaleTest::TestEuroSupport()
"el_GR",
"en_BE",
"en_IE",
- "en_GB_EURO",
- "en_US_EURO",
+ "en_GB@currency=EUR",
+ "en_US@currency=EUR",
"es_ES",
"eu_ES",
"fi_FI",
@@ -1258,20 +1276,15 @@ LocaleTest::TestEuroSupport()
if (dollarStr != resultStr) {
errcheckln(status, "Fail: en_US didn't return USD - %s", u_errorName(status));
}
- ucurr_forLocale("en_US_EURO", tmp, 4, &status);
+ ucurr_forLocale("en_US@currency=EUR", tmp, 4, &status);
resultStr.setTo(tmp);
if (euroStr != resultStr) {
- errcheckln(status, "Fail: en_US_EURO didn't return EUR - %s", u_errorName(status));
+ errcheckln(status, "Fail: en_US@currency=EUR didn't return EUR - %s", u_errorName(status));
}
- ucurr_forLocale("en_GB_EURO", tmp, 4, &status);
+ ucurr_forLocale("en_GB@currency=EUR", tmp, 4, &status);
resultStr.setTo(tmp);
if (euroStr != resultStr) {
- errcheckln(status, "Fail: en_GB_EURO didn't return EUR - %s", u_errorName(status));
- }
- ucurr_forLocale("en_US_PREEURO", tmp, 4, &status);
- resultStr.setTo(tmp);
- if (dollarStr != resultStr) {
- errcheckln(status, "Fail: en_US_PREEURO didn't fallback to en_US - %s", u_errorName(status));
+ errcheckln(status, "Fail: en_GB@currency=EUR didn't return EUR - %s", u_errorName(status));
}
ucurr_forLocale("en_US_Q", tmp, 4, &status);
resultStr.setTo(tmp);
@@ -1570,6 +1583,27 @@ LocaleTest::TestVariantParsing()
}
}
+void LocaleTest::Test20639_DeprecatesISO3Language() {
+ IcuTestErrorCode status(*this, "Test20639_DeprecatesISO3Language");
+
+ const struct TestCase {
+ const char* localeName;
+ const char* expectedISO3Language;
+ } cases[] = {
+ {"nb", "nob"},
+ {"no", "nor"}, // why not nob?
+ {"he", "heb"},
+ {"iw", "heb"},
+ {"ro", "ron"},
+ {"mo", "mol"},
+ };
+ for (auto& cas : cases) {
+ Locale loc(cas.localeName);
+ const char* actual = loc.getISO3Language();
+ assertEquals(cas.localeName, cas.expectedISO3Language, actual);
+ }
+}
+
#if !UCONFIG_NO_FORMATTING
/**
@@ -1647,6 +1681,54 @@ LocaleTest::TestMinimizeSubtags() {
void
+LocaleTest::TestAddLikelyAndMinimizeSubtags() {
+ IcuTestErrorCode status(*this, "TestAddLikelyAndMinimizeSubtags()");
+
+ static const struct {
+ const char* const from;
+ const char* const add;
+ const char* const remove;
+ } full_data[] = {
+ {
+ "und_AQ",
+ "_Latn_AQ",
+ "_AQ"
+ }, {
+ "und_Zzzz_AQ",
+ "_Latn_AQ",
+ "_AQ"
+ }, {
+ "und_Latn_AQ",
+ "_Latn_AQ",
+ "_AQ"
+ }, {
+ "und_Moon_AQ",
+ "_Moon_AQ",
+ "_Moon_AQ"
+ },
+ };
+
+ for (const auto& item : full_data) {
+ const char* const org = item.from;
+ const char* const exp = item.add;
+ Locale res(org);
+ res.addLikelySubtags(status);
+ status.errIfFailureAndReset("\"%s\"", org);
+ assertEquals("addLikelySubtags", exp, res.getName());
+ }
+
+ for (const auto& item : full_data) {
+ const char* const org = item.from;
+ const char* const exp = item.remove;
+ Locale res(org);
+ res.minimizeSubtags(status);
+ status.errIfFailureAndReset("\"%s\"", org);
+ assertEquals("minimizeSubtags", exp, res.getName());
+ }
+}
+
+
+void
LocaleTest::TestKeywordVariants(void) {
static const struct {
const char *localeID;
@@ -1853,7 +1935,7 @@ LocaleTest::TestCreateKeywordSet(void) {
status);
status.errIfFailureAndReset("\"%s\"", l.getName());
- assertEquals("set::size()", 2, result.size());
+ assertEquals("set::size()", 2, static_cast<int32_t>(result.size()));
assertTrue("set::find(\"calendar\")",
result.find("calendar") != result.end());
assertTrue("set::find(\"collation\")",
@@ -1861,6 +1943,21 @@ LocaleTest::TestCreateKeywordSet(void) {
}
void
+LocaleTest::TestCreateKeywordSetEmpty(void) {
+ IcuTestErrorCode status(*this, "TestCreateKeywordSetEmpty()");
+
+ static const Locale l("de");
+
+ std::set<std::string> result;
+ l.getKeywords<std::string>(
+ std::insert_iterator<decltype(result)>(result, result.begin()),
+ status);
+ status.errIfFailureAndReset("\"%s\"", l.getName());
+
+ assertEquals("set::size()", 0, static_cast<int32_t>(result.size()));
+}
+
+void
LocaleTest::TestCreateUnicodeKeywordSet(void) {
IcuTestErrorCode status(*this, "TestCreateUnicodeKeywordSet()");
@@ -1872,7 +1969,7 @@ LocaleTest::TestCreateUnicodeKeywordSet(void) {
status);
status.errIfFailureAndReset("\"%s\"", l.getName());
- assertEquals("set::size()", 2, result.size());
+ assertEquals("set::size()", 2, static_cast<int32_t>(result.size()));
assertTrue("set::find(\"ca\")",
result.find("ca") != result.end());
assertTrue("set::find(\"co\")",
@@ -1880,6 +1977,21 @@ LocaleTest::TestCreateUnicodeKeywordSet(void) {
}
void
+LocaleTest::TestCreateUnicodeKeywordSetEmpty(void) {
+ IcuTestErrorCode status(*this, "TestCreateUnicodeKeywordSetEmpty()");
+
+ static const Locale l("de");
+
+ std::set<std::string> result;
+ l.getUnicodeKeywords<std::string>(
+ std::insert_iterator<decltype(result)>(result, result.begin()),
+ status);
+ status.errIfFailureAndReset("\"%s\"", l.getName());
+
+ assertEquals("set::size()", 0, static_cast<int32_t>(result.size()));
+}
+
+void
LocaleTest::TestGetKeywordValueStdString(void) {
IcuTestErrorCode status(*this, "TestGetKeywordValueStdString()");
@@ -1969,6 +2081,26 @@ LocaleTest::TestSetUnicodeKeywordValueStringPiece(void) {
static const char expected[] = "de@calendar=buddhist;collation=phonebook";
assertEquals("", expected, l.getName());
+
+ l.setUnicodeKeywordValue("cu", nullptr, status);
+ status.errIfFailureAndReset();
+ assertEquals("", expected, l.getName());
+
+ l.setUnicodeKeywordValue("!!", nullptr, status);
+ assertEquals("status", U_ILLEGAL_ARGUMENT_ERROR, status.reset());
+ assertEquals("", expected, l.getName());
+
+ l.setUnicodeKeywordValue("co", "!!", status);
+ assertEquals("status", U_ILLEGAL_ARGUMENT_ERROR, status.reset());
+ assertEquals("", expected, l.getName());
+
+ l.setUnicodeKeywordValue("co", nullptr, status);
+ status.errIfFailureAndReset();
+
+ l.setUnicodeKeywordValue("ca", "", status);
+ status.errIfFailureAndReset();
+
+ assertEquals("", Locale::getGerman().getName(), l.getName());
}
void
@@ -2019,8 +2151,8 @@ static UBool _loccmp(const char* string, const char* prefix) {
plen = (int32_t)strlen(prefix);
int32_t c = uprv_strncmp(string, prefix, plen);
/* 'root' is "less than" everything */
- if (uprv_strcmp(prefix, "root") == 0) {
- return (uprv_strcmp(string, "root") == 0) ? 0 : 1;
+ if (prefix[0] == '\0') {
+ return string[0] != '\0';
}
if (c) return -1; /* mismatch */
if (slen == plen) return 0;
@@ -2327,7 +2459,7 @@ void LocaleTest::checkRegisteredCollators(const char *expectExtra) {
int32_t count1=0,count2=0;
Hashtable oldHash(status);
Hashtable newHash(status);
- TEST_ASSERT_STATUS(status);
+ assertSuccess(WHERE, status);
UnicodeString expectStr(expectExtra?expectExtra:"n/a", "");
@@ -2455,40 +2587,9 @@ void LocaleTest::TestCanonicalization(void)
const char *getNameID; /* expected getName() result */
const char *canonicalID; /* expected canonicalize() result */
} testCases[] = {
- { "", "", "en_US_POSIX" },
- { "C", "c", "en_US_POSIX" },
- { "POSIX", "posix", "en_US_POSIX" },
- { "ca_ES_PREEURO-with-extra-stuff-that really doesn't make any sense-unless-you're trying to increase code coverage",
- "ca_ES_PREEURO_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE",
- "ca_ES_PREEURO_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE"},
- { "ca_ES_PREEURO", "ca_ES_PREEURO", "ca_ES@currency=ESP" },
- { "de_AT_PREEURO", "de_AT_PREEURO", "de_AT@currency=ATS" },
- { "de_DE_PREEURO", "de_DE_PREEURO", "de_DE@currency=DEM" },
- { "de_LU_PREEURO", "de_LU_PREEURO", "de_LU@currency=LUF" },
- { "el_GR_PREEURO", "el_GR_PREEURO", "el_GR@currency=GRD" },
- { "en_BE_PREEURO", "en_BE_PREEURO", "en_BE@currency=BEF" },
- { "en_IE_PREEURO", "en_IE_PREEURO", "en_IE@currency=IEP" },
- { "es_ES_PREEURO", "es_ES_PREEURO", "es_ES@currency=ESP" },
- { "eu_ES_PREEURO", "eu_ES_PREEURO", "eu_ES@currency=ESP" },
- { "fi_FI_PREEURO", "fi_FI_PREEURO", "fi_FI@currency=FIM" },
- { "fr_BE_PREEURO", "fr_BE_PREEURO", "fr_BE@currency=BEF" },
- { "fr_FR_PREEURO", "fr_FR_PREEURO", "fr_FR@currency=FRF" },
- { "fr_LU_PREEURO", "fr_LU_PREEURO", "fr_LU@currency=LUF" },
- { "ga_IE_PREEURO", "ga_IE_PREEURO", "ga_IE@currency=IEP" },
- { "gl_ES_PREEURO", "gl_ES_PREEURO", "gl_ES@currency=ESP" },
- { "it_IT_PREEURO", "it_IT_PREEURO", "it_IT@currency=ITL" },
- { "nl_BE_PREEURO", "nl_BE_PREEURO", "nl_BE@currency=BEF" },
- { "nl_NL_PREEURO", "nl_NL_PREEURO", "nl_NL@currency=NLG" },
- { "pt_PT_PREEURO", "pt_PT_PREEURO", "pt_PT@currency=PTE" },
- { "de__PHONEBOOK", "de__PHONEBOOK", "de@collation=phonebook" },
- { "en_GB_EURO", "en_GB_EURO", "en_GB@currency=EUR" },
- { "en_GB@EURO", "en_GB@EURO", "en_GB@currency=EUR" }, /* POSIX ID */
- { "es__TRADITIONAL", "es__TRADITIONAL", "es@collation=traditional" },
- { "hi__DIRECT", "hi__DIRECT", "hi@collation=direct" },
- { "ja_JP_TRADITIONAL", "ja_JP_TRADITIONAL", "ja_JP@calendar=japanese" },
- { "th_TH_TRADITIONAL", "th_TH_TRADITIONAL", "th_TH@calendar=buddhist" },
- { "zh_TW_STROKE", "zh_TW_STROKE", "zh_TW@collation=stroke" },
- { "zh__PINYIN", "zh__PINYIN", "zh@collation=pinyin" },
+ { "ca_ES-with-extra-stuff-that really doesn't make any sense-unless-you're trying to increase code coverage",
+ "ca_ES_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE",
+ "ca_ES_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE"},
{ "zh@collation=pinyin", "zh@collation=pinyin", "zh@collation=pinyin" },
{ "zh_CN@collation=pinyin", "zh_CN@collation=pinyin", "zh_CN@collation=pinyin" },
{ "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin" },
@@ -2497,19 +2598,12 @@ void LocaleTest::TestCanonicalization(void)
{ "no_NO_NY", "no_NO_NY", "no_NO_NY" /* not: "nn_NO" [alan ICU3.0] */ },
{ "no@ny", "no@ny", "no__NY" /* not: "nn" [alan ICU3.0] */ }, /* POSIX ID */
{ "no-no.utf32@B", "no_NO.utf32@B", "no_NO_B" /* not: "nb_NO_B" [alan ICU3.0] */ }, /* POSIX ID */
- { "qz-qz@Euro", "qz_QZ@Euro", "qz_QZ@currency=EUR" }, /* qz-qz uses private use iso codes */
+ { "qz-qz@Euro", "qz_QZ@Euro", "qz_QZ_EURO" }, /* qz-qz uses private use iso codes */
// NOTE: uloc_getName() works on en-BOONT, but Locale() parser considers it BOGUS
// TODO: unify this behavior
{ "en-BOONT", "en__BOONT", "en__BOONT" }, /* registered name */
{ "de-1901", "de__1901", "de__1901" }, /* registered name */
{ "de-1906", "de__1906", "de__1906" }, /* registered name */
- { "sr-SP-Cyrl", "sr_SP_CYRL", "sr_Cyrl_RS" }, /* .NET name */
- { "sr-SP-Latn", "sr_SP_LATN", "sr_Latn_RS" }, /* .NET name */
- { "sr_YU_CYRILLIC", "sr_YU_CYRILLIC", "sr_Cyrl_RS" }, /* Linux name */
- { "uz-UZ-Cyrl", "uz_UZ_CYRL", "uz_Cyrl_UZ" }, /* .NET name */
- { "uz-UZ-Latn", "uz_UZ_LATN", "uz_Latn_UZ" }, /* .NET name */
- { "zh-CHS", "zh_CHS", "zh_Hans" }, /* .NET name */
- { "zh-CHT", "zh_CHT", "zh_Hant" }, /* .NET name This may change back to zh_Hant */
/* posix behavior that used to be performed by getName */
{ "mr.utf8", "mr.utf8", "mr" },
@@ -2524,19 +2618,61 @@ void LocaleTest::TestCanonicalization(void)
{ "en_Hant_IL_VALLEY_GIRL@ currency = EUR; calendar = Japanese ;", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR" },
/* already-canonical ids are not changed */
{ "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR" },
- /* PRE_EURO and EURO conversions don't affect other keywords */
- { "es_ES_PREEURO@CALendar=Japanese", "es_ES_PREEURO@calendar=Japanese", "es_ES@calendar=Japanese;currency=ESP" },
- { "es_ES_EURO@SHOUT=zipeedeedoodah", "es_ES_EURO@shout=zipeedeedoodah", "es_ES@currency=EUR;shout=zipeedeedoodah" },
- /* currency keyword overrides PRE_EURO and EURO currency */
- { "es_ES_PREEURO@currency=EUR", "es_ES_PREEURO@currency=EUR", "es_ES@currency=EUR" },
- { "es_ES_EURO@currency=ESP", "es_ES_EURO@currency=ESP", "es_ES@currency=ESP" },
/* norwegian is just too weird, if we handle things in their full generality */
{ "no-Hant-GB_NY@currency=$$$", "no_Hant_GB_NY@currency=$$$", "no_Hant_GB_NY@currency=$$$" /* not: "nn_Hant_GB@currency=$$$" [alan ICU3.0] */ },
/* test cases reflecting internal resource bundle usage */
{ "root@kw=foo", "root@kw=foo", "root@kw=foo" },
{ "@calendar=gregorian", "@calendar=gregorian", "@calendar=gregorian" },
- { "ja_JP@calendar=Japanese", "ja_JP@calendar=Japanese", "ja_JP@calendar=Japanese" }
+ { "ja_JP@calendar=Japanese", "ja_JP@calendar=Japanese", "ja_JP@calendar=Japanese" },
+
+ // Before ICU 64, ICU locale canonicalization had some additional mappings.
+ // They were removed for ICU-20187 "drop support for long-obsolete locale ID variants".
+ // The following now use standard canonicalization.
+ { "", "", "" },
+ { "C", "c", "c" },
+ { "POSIX", "posix", "posix" },
+ { "ca_ES_PREEURO", "ca_ES_PREEURO", "ca_ES_PREEURO" },
+ { "de_AT_PREEURO", "de_AT_PREEURO", "de_AT_PREEURO" },
+ { "de_DE_PREEURO", "de_DE_PREEURO", "de_DE_PREEURO" },
+ { "de_LU_PREEURO", "de_LU_PREEURO", "de_LU_PREEURO" },
+ { "el_GR_PREEURO", "el_GR_PREEURO", "el_GR_PREEURO" },
+ { "en_BE_PREEURO", "en_BE_PREEURO", "en_BE_PREEURO" },
+ { "en_IE_PREEURO", "en_IE_PREEURO", "en_IE_PREEURO" },
+ { "es_ES_PREEURO", "es_ES_PREEURO", "es_ES_PREEURO" },
+ { "eu_ES_PREEURO", "eu_ES_PREEURO", "eu_ES_PREEURO" },
+ { "fi_FI_PREEURO", "fi_FI_PREEURO", "fi_FI_PREEURO" },
+ { "fr_BE_PREEURO", "fr_BE_PREEURO", "fr_BE_PREEURO" },
+ { "fr_FR_PREEURO", "fr_FR_PREEURO", "fr_FR_PREEURO" },
+ { "fr_LU_PREEURO", "fr_LU_PREEURO", "fr_LU_PREEURO" },
+ { "ga_IE_PREEURO", "ga_IE_PREEURO", "ga_IE_PREEURO" },
+ { "gl_ES_PREEURO", "gl_ES_PREEURO", "gl_ES_PREEURO" },
+ { "it_IT_PREEURO", "it_IT_PREEURO", "it_IT_PREEURO" },
+ { "nl_BE_PREEURO", "nl_BE_PREEURO", "nl_BE_PREEURO" },
+ { "nl_NL_PREEURO", "nl_NL_PREEURO", "nl_NL_PREEURO" },
+ { "pt_PT_PREEURO", "pt_PT_PREEURO", "pt_PT_PREEURO" },
+ { "de__PHONEBOOK", "de__PHONEBOOK", "de__PHONEBOOK" },
+ { "en_GB_EURO", "en_GB_EURO", "en_GB_EURO" },
+ { "en_GB@EURO", "en_GB@EURO", "en_GB_EURO" }, /* POSIX ID */
+ { "es__TRADITIONAL", "es__TRADITIONAL", "es__TRADITIONAL" },
+ { "hi__DIRECT", "hi__DIRECT", "hi__DIRECT" },
+ { "ja_JP_TRADITIONAL", "ja_JP_TRADITIONAL", "ja_JP_TRADITIONAL" },
+ { "th_TH_TRADITIONAL", "th_TH_TRADITIONAL", "th_TH_TRADITIONAL" },
+ { "zh_TW_STROKE", "zh_TW_STROKE", "zh_TW_STROKE" },
+ { "zh__PINYIN", "zh__PINYIN", "zh__PINYIN" },
+ { "sr-SP-Cyrl", "sr_SP_CYRL", "sr_SP_CYRL" }, /* .NET name */
+ { "sr-SP-Latn", "sr_SP_LATN", "sr_SP_LATN" }, /* .NET name */
+ { "sr_YU_CYRILLIC", "sr_YU_CYRILLIC", "sr_YU_CYRILLIC" }, /* Linux name */
+ { "uz-UZ-Cyrl", "uz_UZ_CYRL", "uz_UZ_CYRL" }, /* .NET name */
+ { "uz-UZ-Latn", "uz_UZ_LATN", "uz_UZ_LATN" }, /* .NET name */
+ { "zh-CHS", "zh_CHS", "zh_CHS" }, /* .NET name */
+ { "zh-CHT", "zh_CHT", "zh_CHT" }, /* .NET name This may change back to zh_Hant */
+ /* PRE_EURO and EURO conversions don't affect other keywords */
+ { "es_ES_PREEURO@CALendar=Japanese", "es_ES_PREEURO@calendar=Japanese", "es_ES_PREEURO@calendar=Japanese" },
+ { "es_ES_EURO@SHOUT=zipeedeedoodah", "es_ES_EURO@shout=zipeedeedoodah", "es_ES_EURO@shout=zipeedeedoodah" },
+ /* currency keyword overrides PRE_EURO and EURO currency */
+ { "es_ES_PREEURO@currency=EUR", "es_ES_PREEURO@currency=EUR", "es_ES_PREEURO@currency=EUR" },
+ { "es_ES_EURO@currency=ESP", "es_ES_EURO@currency=ESP", "es_ES_EURO@currency=ESP" },
};
static const char* label[] = { "createFromName", "createCanonical", "Locale" };
@@ -2564,7 +2700,7 @@ void LocaleTest::TestCurrencyByDate(void)
#if !UCONFIG_NO_FORMATTING
UErrorCode status = U_ZERO_ERROR;
UDate date = uprv_getUTCtime();
- UChar TMP[4];
+ UChar TMP[4] = {0, 0, 0, 0};
int32_t index = 0;
int32_t resLen = 0;
UnicodeString tempStr, resultStr;
@@ -2865,10 +3001,6 @@ void LocaleTest::TestCurrencyByDate(void)
if (u_strcmp(USD, TMP) != 0) {
errcheckln(status, "Fail: en_US didn't return USD - %s", u_errorName(status));
}
- ucurr_forLocaleAndDate("en_US_PREEURO", date, 1, TMP, 4, &status);
- if (u_strcmp(USD, TMP) != 0) {
- errcheckln(status, "Fail: en_US_PREEURO didn't fallback to en_US - %s", u_errorName(status));
- }
ucurr_forLocaleAndDate("en_US_Q", date, 1, TMP, 4, &status);
if (u_strcmp(USD, TMP) != 0) {
errcheckln(status, "Fail: en_US_Q didn't fallback to en_US - %s", u_errorName(status));
@@ -2948,6 +3080,71 @@ void LocaleTest::TestBug13554() {
}
}
+void LocaleTest::TestBug20410() {
+ IcuTestErrorCode status(*this, "TestBug20410()");
+
+ static const char tag1[] = "art-lojban-x-0";
+ static const Locale expected1("jbo@x=0");
+ Locale result1 = Locale::forLanguageTag(tag1, status);
+ status.errIfFailureAndReset("\"%s\"", tag1);
+ assertEquals(tag1, expected1.getName(), result1.getName());
+
+ static const char tag2[] = "zh-xiang-u-nu-thai-x-0";
+ static const Locale expected2("hsn@numbers=thai;x=0");
+ Locale result2 = Locale::forLanguageTag(tag2, status);
+ status.errIfFailureAndReset("\"%s\"", tag2);
+ assertEquals(tag2, expected2.getName(), result2.getName());
+
+ static const char locid3[] = "art__lojban@x=0";
+ Locale result3 = Locale::createCanonical(locid3);
+ static const Locale expected3("art__LOJBAN@x=0");
+ assertEquals(locid3, expected3.getName(), result3.getName());
+
+ static const char locid4[] = "art-lojban-x-0";
+ Locale result4 = Locale::createCanonical(locid4);
+ static const Locale expected4("jbo@x=0");
+ assertEquals(locid4, expected4.getName(), result4.getName());
+}
+
+void LocaleTest::TestConstructorAcceptsBCP47() {
+ IcuTestErrorCode status(*this, "TestConstructorAcceptsBCP47");
+
+ Locale loc1("ar-EG-u-nu-latn");
+ Locale loc2("ar-EG@numbers=latn");
+ Locale loc3("ar-EG");
+ std::string val;
+
+ // Check getKeywordValue "numbers"
+ val = loc1.getKeywordValue<std::string>("numbers", status);
+ assertEquals("BCP47 syntax has ICU keyword value", "latn", val.c_str());
+
+ val = loc2.getKeywordValue<std::string>("numbers", status);
+ assertEquals("ICU syntax has ICU keyword value", "latn", val.c_str());
+
+ val = loc3.getKeywordValue<std::string>("numbers", status);
+ assertEquals("Default, ICU keyword", "", val.c_str());
+
+ // Check getUnicodeKeywordValue "nu"
+ val = loc1.getUnicodeKeywordValue<std::string>("nu", status);
+ assertEquals("BCP47 syntax has short unicode keyword value", "latn", val.c_str());
+
+ val = loc2.getUnicodeKeywordValue<std::string>("nu", status);
+ assertEquals("ICU syntax has short unicode keyword value", "latn", val.c_str());
+
+ val = loc3.getUnicodeKeywordValue<std::string>("nu", status);
+ status.expectErrorAndReset(U_ILLEGAL_ARGUMENT_ERROR, "Default, short unicode keyword");
+
+ // Check getUnicodeKeywordValue "numbers"
+ val = loc1.getUnicodeKeywordValue<std::string>("numbers", status);
+ assertEquals("BCP47 syntax has long unicode keyword value", "latn", val.c_str());
+
+ val = loc2.getUnicodeKeywordValue<std::string>("numbers", status);
+ assertEquals("ICU syntax has long unicode keyword value", "latn", val.c_str());
+
+ val = loc3.getUnicodeKeywordValue<std::string>("numbers", status);
+ status.expectErrorAndReset(U_ILLEGAL_ARGUMENT_ERROR, "Default, long unicode keyword");
+}
+
void LocaleTest::TestForLanguageTag() {
IcuTestErrorCode status(*this, "TestForLanguageTag()");
@@ -2956,12 +3153,14 @@ void LocaleTest::TestForLanguageTag() {
static const char tag_af[] = "af-t-ar-i0-handwrit-u-ca-coptic-x-foo";
static const char tag_ill[] = "!";
static const char tag_no_nul[] = { 'e', 'n', '-', 'G', 'B' };
+ static const char tag_ext[] = "en-GB-1-abc-efg-a-xyz";
static const Locale loc_en("en_US");
static const Locale loc_oed("en_GB_OXENDICT");
static const Locale loc_af("af@calendar=coptic;t=ar-i0-handwrit;x=foo");
static const Locale loc_null("");
static const Locale loc_gb("en_GB");
+ static const Locale loc_ext("en_GB@1=abc-efg;a=xyz");
Locale result_en = Locale::forLanguageTag(tag_en, status);
status.errIfFailureAndReset("\"%s\"", tag_en);
@@ -2994,20 +3193,26 @@ void LocaleTest::TestForLanguageTag() {
status.errIfFailureAndReset("\"%.*s\"", sp_no_nul.size(), sp_no_nul.data());
assertEquals(CharString(sp_no_nul, status).data(),
loc_gb.getName(), result_no_nul.getName());
+
+ Locale result_ext = Locale::forLanguageTag(tag_ext, status);
+ status.errIfFailureAndReset("\"%s\"", tag_ext);
+ assertEquals(tag_ext, loc_ext.getName(), result_ext.getName());
}
void LocaleTest::TestToLanguageTag() {
IcuTestErrorCode status(*this, "TestToLanguageTag()");
- static const Locale loc_c("C");
+ static const Locale loc_c("en_US_POSIX");
static const Locale loc_en("en_US");
static const Locale loc_af("af@calendar=coptic;t=ar-i0-handwrit;x=foo");
+ static const Locale loc_ext("en@0=abc;a=xyz");
static const Locale loc_empty("");
static const Locale loc_ill("!");
static const char tag_c[] = "en-US-u-va-posix";
static const char tag_en[] = "en-US";
static const char tag_af[] = "af-t-ar-i0-handwrit-u-ca-coptic-x-foo";
+ static const char tag_ext[] = "en-0-abc-a-xyz";
static const char tag_und[] = "und";
std::string result;
@@ -3028,6 +3233,10 @@ void LocaleTest::TestToLanguageTag() {
status.errIfFailureAndReset("\"%s\"", loc_af.getName());
assertEquals(loc_af.getName(), tag_af, result_af.c_str());
+ std::string result_ext = loc_ext.toLanguageTag<std::string>(status);
+ status.errIfFailureAndReset("\"%s\"", loc_ext.getName());
+ assertEquals(loc_ext.getName(), tag_ext, result_ext.c_str());
+
std::string result_empty = loc_empty.toLanguageTag<std::string>(status);
status.errIfFailureAndReset("\"%s\"", loc_empty.getName());
assertEquals(loc_empty.getName(), tag_und, result_empty.c_str());
@@ -3135,6 +3344,24 @@ void LocaleTest::TestMoveCtor() {
assertEquals("bogus", l7.isBogus(), l8.isBogus());
}
+void LocaleTest::TestBug20407iVariantPreferredValue() {
+ IcuTestErrorCode status(*this, "TestBug20407iVariantPreferredValue()");
+
+ Locale l = Locale::forLanguageTag("hy-arevela", status);
+ status.errIfFailureAndReset("hy-arevela fail");
+ assertTrue("!l.isBogus()", !l.isBogus());
+
+ std::string result = l.toLanguageTag<std::string>(status);
+ assertEquals(l.getName(), "hy", result.c_str());
+
+ l = Locale::forLanguageTag("hy-arevmda", status);
+ status.errIfFailureAndReset("hy-arevmda");
+ assertTrue("!l.isBogus()", !l.isBogus());
+
+ result = l.toLanguageTag<std::string>(status);
+ assertEquals(l.getName(), "hyw", result.c_str());
+}
+
void LocaleTest::TestBug13417VeryLongLanguageTag() {
IcuTestErrorCode status(*this, "TestBug13417VeryLongLanguageTag()");
@@ -3154,3 +3381,574 @@ void LocaleTest::TestBug13417VeryLongLanguageTag() {
status.errIfFailureAndReset("\"%s\"", l.getName());
assertEquals("equals", tag, result.c_str());
}
+
+void LocaleTest::TestBug11053UnderlineTimeZone() {
+ static const char* const tz_in_ext[] = {
+ "etadd",
+ "tzdar",
+ "eheai",
+ "sttms",
+ "arirj",
+ "arrgl",
+ "aruaq",
+ "arluq",
+ "mxpvr",
+ "brbvb",
+ "arbue",
+ "caycb",
+ "brcgr",
+ "cayzs",
+ "crsjo",
+ "caydq",
+ "svsal",
+ "cafne",
+ "caglb",
+ "cagoo",
+ "tcgdt",
+ "ustel",
+ "bolpb",
+ "uslax",
+ "sxphi",
+ "mxmex",
+ "usnyc",
+ "usxul",
+ "usndcnt",
+ "usndnsl",
+ "ttpos",
+ "brpvh",
+ "prsju",
+ "clpuq",
+ "caffs",
+ "cayek",
+ "brrbr",
+ "mxstis",
+ "dosdq",
+ "brsao",
+ "gpsbh",
+ "casjf",
+ "knbas",
+ "lccas",
+ "vistt",
+ "vcsvd",
+ "cayyn",
+ "cathu",
+ "hkhkg",
+ "mykul",
+ "khpnh",
+ "cvrai",
+ "gsgrv",
+ "shshn",
+ "aubhq",
+ "auldh",
+ "imdgs",
+ "smsai",
+ "asppg",
+ "pgpom",
+ };
+ static const char* const tzname_with_underline[] = {
+ "America/Buenos_Aires",
+ "America/Coral_Harbour",
+ "America/Los_Angeles",
+ "America/Mexico_City",
+ "America/New_York",
+ "America/Rio_Branco",
+ "America/Sao_Paulo",
+ "America/St_Johns",
+ "America/St_Thomas",
+ "Australia/Broken_Hill",
+ "Australia/Lord_Howe",
+ "Pacific/Pago_Pago",
+ };
+ std::string locale_str;
+ for (int32_t i = 0; i < UPRV_LENGTHOF(tz_in_ext); i++) {
+ locale_str = "en-u-tz-";
+ locale_str += tz_in_ext[i];
+ Locale l(locale_str.c_str());
+ assertTrue((locale_str + " !l.isBogus()").c_str(), !l.isBogus());
+ }
+ for (int32_t i = 0; i < UPRV_LENGTHOF(tzname_with_underline); i++) {
+ locale_str = "en@timezone=";
+ locale_str += tzname_with_underline[i];
+ Locale l(locale_str.c_str());
+ assertTrue((locale_str + " !l.isBogus()").c_str(), !l.isBogus());
+ }
+ locale_str = "en_US@timezone=America/Coral_Harbour";
+ Locale l2(locale_str.c_str());
+ assertTrue((locale_str + " !l2.isBogus()").c_str(), !l2.isBogus());
+ locale_str = "en_Latn@timezone=America/New_York";
+ Locale l3(locale_str.c_str());
+ assertTrue((locale_str + " !l3.isBogus()").c_str(), !l3.isBogus());
+ locale_str = "en_Latn_US@timezone=Australia/Broken_Hill";
+ Locale l4(locale_str.c_str());
+ assertTrue((locale_str + " !l4.isBogus()").c_str(), !l4.isBogus());
+ locale_str = "en-u-tz-ciabj";
+ Locale l5(locale_str.c_str());
+ assertTrue((locale_str + " !l5.isBogus()").c_str(), !l5.isBogus());
+ locale_str = "en-US-u-tz-asppg";
+ Locale l6(locale_str.c_str());
+ assertTrue((locale_str + " !l6.isBogus()").c_str(), !l6.isBogus());
+ locale_str = "fil-Latn-u-tz-cvrai";
+ Locale l7(locale_str.c_str());
+ assertTrue((locale_str + " !l7.isBogus()").c_str(), !l7.isBogus());
+ locale_str = "fil-Latn-PH-u-tz-gsgrv";
+ Locale l8(locale_str.c_str());
+ assertTrue((locale_str + " !l8.isBogus()").c_str(), !l8.isBogus());
+}
+
+void LocaleTest::TestUnd() {
+ IcuTestErrorCode status(*this, "TestUnd()");
+
+ static const char empty[] = "";
+ static const char root[] = "root";
+ static const char und[] = "und";
+
+ Locale empty_ctor(empty);
+ Locale empty_tag = Locale::forLanguageTag(empty, status);
+ status.errIfFailureAndReset("\"%s\"", empty);
+
+ Locale root_ctor(root);
+ Locale root_tag = Locale::forLanguageTag(root, status);
+ Locale root_build = LocaleBuilder().setLanguageTag(root).build(status);
+ status.errIfFailureAndReset("\"%s\"", root);
+
+ Locale und_ctor(und);
+ Locale und_tag = Locale::forLanguageTag(und, status);
+ Locale und_build = LocaleBuilder().setLanguageTag(und).build(status);
+ status.errIfFailureAndReset("\"%s\"", und);
+
+ assertEquals("getName()", empty, empty_ctor.getName());
+ assertEquals("getName()", empty, root_ctor.getName());
+ assertEquals("getName()", empty, und_ctor.getName());
+
+ assertEquals("getName()", empty, empty_tag.getName());
+ assertEquals("getName()", empty, root_tag.getName());
+ assertEquals("getName()", empty, und_tag.getName());
+
+ assertEquals("getName()", empty, root_build.getName());
+ assertEquals("getName()", empty, und_build.getName());
+
+ assertEquals("toLanguageTag()", und, empty_ctor.toLanguageTag<std::string>(status).c_str());
+ assertEquals("toLanguageTag()", und, root_ctor.toLanguageTag<std::string>(status).c_str());
+ assertEquals("toLanguageTag()", und, und_ctor.toLanguageTag<std::string>(status).c_str());
+ status.errIfFailureAndReset();
+
+ assertEquals("toLanguageTag()", und, empty_tag.toLanguageTag<std::string>(status).c_str());
+ assertEquals("toLanguageTag()", und, root_tag.toLanguageTag<std::string>(status).c_str());
+ assertEquals("toLanguageTag()", und, und_tag.toLanguageTag<std::string>(status).c_str());
+ status.errIfFailureAndReset();
+
+ assertEquals("toLanguageTag()", und, root_build.toLanguageTag<std::string>(status).c_str());
+ assertEquals("toLanguageTag()", und, und_build.toLanguageTag<std::string>(status).c_str());
+ status.errIfFailureAndReset();
+
+ assertTrue("empty_ctor == empty_tag", empty_ctor == empty_tag);
+
+ assertTrue("root_ctor == root_tag", root_ctor == root_tag);
+ assertTrue("root_ctor == root_build", root_ctor == root_build);
+ assertTrue("root_tag == root_build", root_tag == root_build);
+
+ assertTrue("und_ctor == und_tag", und_ctor == und_tag);
+ assertTrue("und_ctor == und_build", und_ctor == und_build);
+ assertTrue("und_tag == und_build", und_tag == und_build);
+
+ assertTrue("empty_ctor == root_ctor", empty_ctor == root_ctor);
+ assertTrue("empty_ctor == und_ctor", empty_ctor == und_ctor);
+ assertTrue("root_ctor == und_ctor", root_ctor == und_ctor);
+
+ assertTrue("empty_tag == root_tag", empty_tag == root_tag);
+ assertTrue("empty_tag == und_tag", empty_tag == und_tag);
+ assertTrue("root_tag == und_tag", root_tag == und_tag);
+
+ assertTrue("root_build == und_build", root_build == und_build);
+
+ static const Locale& displayLocale = Locale::getEnglish();
+ static const UnicodeString displayName("Unknown language");
+ UnicodeString tmp;
+
+ assertEquals("getDisplayName()", displayName, empty_ctor.getDisplayName(displayLocale, tmp));
+ assertEquals("getDisplayName()", displayName, root_ctor.getDisplayName(displayLocale, tmp));
+ assertEquals("getDisplayName()", displayName, und_ctor.getDisplayName(displayLocale, tmp));
+
+ assertEquals("getDisplayName()", displayName, empty_tag.getDisplayName(displayLocale, tmp));
+ assertEquals("getDisplayName()", displayName, root_tag.getDisplayName(displayLocale, tmp));
+ assertEquals("getDisplayName()", displayName, und_tag.getDisplayName(displayLocale, tmp));
+
+ assertEquals("getDisplayName()", displayName, root_build.getDisplayName(displayLocale, tmp));
+ assertEquals("getDisplayName()", displayName, und_build.getDisplayName(displayLocale, tmp));
+}
+
+void LocaleTest::TestUndScript() {
+ IcuTestErrorCode status(*this, "TestUndScript()");
+
+ static const char id[] = "_Cyrl";
+ static const char tag[] = "und-Cyrl";
+ static const char script[] = "Cyrl";
+
+ Locale locale_ctor(id);
+ Locale locale_legacy(tag);
+ Locale locale_tag = Locale::forLanguageTag(tag, status);
+ Locale locale_build = LocaleBuilder().setScript(script).build(status);
+ status.errIfFailureAndReset("\"%s\"", tag);
+
+ assertEquals("getName()", id, locale_ctor.getName());
+ assertEquals("getName()", id, locale_legacy.getName());
+ assertEquals("getName()", id, locale_tag.getName());
+ assertEquals("getName()", id, locale_build.getName());
+
+ assertEquals("toLanguageTag()", tag, locale_ctor.toLanguageTag<std::string>(status).c_str());
+ assertEquals("toLanguageTag()", tag, locale_legacy.toLanguageTag<std::string>(status).c_str());
+ assertEquals("toLanguageTag()", tag, locale_tag.toLanguageTag<std::string>(status).c_str());
+ assertEquals("toLanguageTag()", tag, locale_build.toLanguageTag<std::string>(status).c_str());
+ status.errIfFailureAndReset();
+
+ static const Locale& displayLocale = Locale::getEnglish();
+ static const UnicodeString displayName("Unknown language (Cyrillic)");
+ UnicodeString tmp;
+
+ assertEquals("getDisplayName()", displayName, locale_ctor.getDisplayName(displayLocale, tmp));
+ assertEquals("getDisplayName()", displayName, locale_legacy.getDisplayName(displayLocale, tmp));
+ assertEquals("getDisplayName()", displayName, locale_tag.getDisplayName(displayLocale, tmp));
+ assertEquals("getDisplayName()", displayName, locale_build.getDisplayName(displayLocale, tmp));
+}
+
+void LocaleTest::TestUndRegion() {
+ IcuTestErrorCode status(*this, "TestUndRegion()");
+
+ static const char id[] = "_AQ";
+ static const char tag[] = "und-AQ";
+ static const char region[] = "AQ";
+
+ Locale locale_ctor(id);
+ Locale locale_legacy(tag);
+ Locale locale_tag = Locale::forLanguageTag(tag, status);
+ Locale locale_build = LocaleBuilder().setRegion(region).build(status);
+ status.errIfFailureAndReset("\"%s\"", tag);
+
+ assertEquals("getName()", id, locale_ctor.getName());
+ assertEquals("getName()", id, locale_legacy.getName());
+ assertEquals("getName()", id, locale_tag.getName());
+ assertEquals("getName()", id, locale_build.getName());
+
+ assertEquals("toLanguageTag()", tag, locale_ctor.toLanguageTag<std::string>(status).c_str());
+ assertEquals("toLanguageTag()", tag, locale_legacy.toLanguageTag<std::string>(status).c_str());
+ assertEquals("toLanguageTag()", tag, locale_tag.toLanguageTag<std::string>(status).c_str());
+ assertEquals("toLanguageTag()", tag, locale_build.toLanguageTag<std::string>(status).c_str());
+ status.errIfFailureAndReset();
+
+ static const Locale& displayLocale = Locale::getEnglish();
+ static const UnicodeString displayName("Unknown language (Antarctica)");
+ UnicodeString tmp;
+
+ assertEquals("getDisplayName()", displayName, locale_ctor.getDisplayName(displayLocale, tmp));
+ assertEquals("getDisplayName()", displayName, locale_legacy.getDisplayName(displayLocale, tmp));
+ assertEquals("getDisplayName()", displayName, locale_tag.getDisplayName(displayLocale, tmp));
+ assertEquals("getDisplayName()", displayName, locale_build.getDisplayName(displayLocale, tmp));
+}
+
+void LocaleTest::TestUndCAPI() {
+ IcuTestErrorCode status(*this, "TestUndCAPI()");
+
+ static const char empty[] = "";
+ static const char root[] = "root";
+ static const char und[] = "und";
+
+ static const char empty_script[] = "_Cyrl";
+ static const char empty_region[] = "_AQ";
+
+ static const char und_script[] = "und_Cyrl";
+ static const char und_region[] = "und_AQ";
+
+ char tmp[ULOC_FULLNAME_CAPACITY];
+ int32_t reslen;
+
+ // uloc_getName()
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getName(empty, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", empty);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getName()", empty, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getName(root, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", root);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getName()", empty, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getName(und, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", und);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getName()", empty, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getName(empty_script, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", empty_script);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getName()", empty_script, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getName(empty_region, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", empty_region);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getName()", empty_region, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getName(und_script, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", und_script);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getName()", empty_script, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getName(und_region, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", und_region);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getName()", empty_region, tmp);
+
+ // uloc_getBaseName()
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getBaseName(empty, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", empty);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getBaseName()", empty, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getBaseName(root, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", root);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getBaseName()", empty, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getBaseName(und, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", und);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getBaseName()", empty, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getBaseName(empty_script, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", empty_script);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getBaseName()", empty_script, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getBaseName(empty_region, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", empty_region);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getBaseName()", empty_region, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getBaseName(und_script, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", und_script);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getBaseName()", empty_script, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getBaseName(und_region, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", und_region);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getBaseName()", empty_region, tmp);
+
+ // uloc_getParent()
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getParent(empty, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", empty);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getParent()", empty, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getParent(root, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", root);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getParent()", empty, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getParent(und, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", und);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getParent()", empty, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getParent(empty_script, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", empty_script);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getParent()", empty, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getParent(empty_region, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", empty_region);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getParent()", empty, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getParent(und_script, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", und_script);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getParent()", empty, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getParent(und_region, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", und_region);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getParent()", empty, tmp);
+
+ // uloc_getLanguage()
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getLanguage(empty, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", empty);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getLanguage()", empty, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getLanguage(root, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", root);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getLanguage()", empty, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getLanguage(und, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", und);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getLanguage()", empty, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getLanguage(empty_script, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", empty_script);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getLanguage()", empty, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getLanguage(empty_region, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", empty_region);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getLanguage()", empty, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getLanguage(und_script, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", und_script);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getLanguage()", empty, tmp);
+
+ uprv_memset(tmp, '!', sizeof tmp);
+ reslen = uloc_getLanguage(und_region, tmp, sizeof tmp, status);
+ status.errIfFailureAndReset("\"%s\"", und_region);
+ assertTrue("reslen >= 0", reslen >= 0);
+ assertEquals("uloc_getLanguage()", empty, tmp);
+}
+
+#define ARRAY_RANGE(array) (array), ((array) + UPRV_LENGTHOF(array))
+
+void LocaleTest::TestRangeIterator() {
+ IcuTestErrorCode status(*this, "TestRangeIterator");
+ Locale locales[] = { "fr", "en_GB", "en" };
+ Locale::RangeIterator<Locale *> iter(ARRAY_RANGE(locales));
+
+ assertTrue("0.hasNext()", iter.hasNext());
+ const Locale &l0 = iter.next();
+ assertEquals("0.next()", "fr", l0.getName());
+ assertTrue("&0.next()", &l0 == &locales[0]);
+
+ assertTrue("1.hasNext()", iter.hasNext());
+ const Locale &l1 = iter.next();
+ assertEquals("1.next()", "en_GB", l1.getName());
+ assertTrue("&1.next()", &l1 == &locales[1]);
+
+ assertTrue("2.hasNext()", iter.hasNext());
+ const Locale &l2 = iter.next();
+ assertEquals("2.next()", "en", l2.getName());
+ assertTrue("&2.next()", &l2 == &locales[2]);
+
+ assertFalse("3.hasNext()", iter.hasNext());
+}
+
+void LocaleTest::TestPointerConvertingIterator() {
+ IcuTestErrorCode status(*this, "TestPointerConvertingIterator");
+ Locale locales[] = { "fr", "en_GB", "en" };
+ Locale *pointers[] = { locales, locales + 1, locales + 2 };
+ // Lambda with explicit reference return type to prevent copy-constructing a temporary
+ // which would be destructed right away.
+ Locale::ConvertingIterator<Locale **, std::function<const Locale &(const Locale *)>> iter(
+ ARRAY_RANGE(pointers), [](const Locale *p) -> const Locale & { return *p; });
+
+ assertTrue("0.hasNext()", iter.hasNext());
+ const Locale &l0 = iter.next();
+ assertEquals("0.next()", "fr", l0.getName());
+ assertTrue("&0.next()", &l0 == pointers[0]);
+
+ assertTrue("1.hasNext()", iter.hasNext());
+ const Locale &l1 = iter.next();
+ assertEquals("1.next()", "en_GB", l1.getName());
+ assertTrue("&1.next()", &l1 == pointers[1]);
+
+ assertTrue("2.hasNext()", iter.hasNext());
+ const Locale &l2 = iter.next();
+ assertEquals("2.next()", "en", l2.getName());
+ assertTrue("&2.next()", &l2 == pointers[2]);
+
+ assertFalse("3.hasNext()", iter.hasNext());
+}
+
+namespace {
+
+class LocaleFromTag {
+public:
+ LocaleFromTag() : locale(Locale::getRoot()) {}
+ const Locale &operator()(const char *tag) { return locale = Locale(tag); }
+
+private:
+ // Store the locale in the converter, rather than return a reference to a temporary,
+ // or a value which could go out of scope with the caller's reference to it.
+ Locale locale;
+};
+
+} // namespace
+
+void LocaleTest::TestTagConvertingIterator() {
+ IcuTestErrorCode status(*this, "TestTagConvertingIterator");
+ const char *tags[] = { "fr", "en_GB", "en" };
+ LocaleFromTag converter;
+ Locale::ConvertingIterator<const char **, LocaleFromTag> iter(ARRAY_RANGE(tags), converter);
+
+ assertTrue("0.hasNext()", iter.hasNext());
+ const Locale &l0 = iter.next();
+ assertEquals("0.next()", "fr", l0.getName());
+
+ assertTrue("1.hasNext()", iter.hasNext());
+ const Locale &l1 = iter.next();
+ assertEquals("1.next()", "en_GB", l1.getName());
+
+ assertTrue("2.hasNext()", iter.hasNext());
+ const Locale &l2 = iter.next();
+ assertEquals("2.next()", "en", l2.getName());
+
+ assertFalse("3.hasNext()", iter.hasNext());
+}
+
+void LocaleTest::TestCapturingTagConvertingIterator() {
+ IcuTestErrorCode status(*this, "TestCapturingTagConvertingIterator");
+ const char *tags[] = { "fr", "en_GB", "en" };
+ // Store the converted locale in a locale variable,
+ // rather than return a reference to a temporary,
+ // or a value which could go out of scope with the caller's reference to it.
+ Locale locale;
+ // Lambda with explicit reference return type to prevent copy-constructing a temporary
+ // which would be destructed right away.
+ Locale::ConvertingIterator<const char **, std::function<const Locale &(const char *)>> iter(
+ ARRAY_RANGE(tags), [&](const char *tag) -> const Locale & { return locale = Locale(tag); });
+
+ assertTrue("0.hasNext()", iter.hasNext());
+ const Locale &l0 = iter.next();
+ assertEquals("0.next()", "fr", l0.getName());
+
+ assertTrue("1.hasNext()", iter.hasNext());
+ const Locale &l1 = iter.next();
+ assertEquals("1.next()", "en_GB", l1.getName());
+
+ assertTrue("2.hasNext()", iter.hasNext());
+ const Locale &l2 = iter.next();
+ assertEquals("2.next()", "en", l2.getName());
+
+ assertFalse("3.hasNext()", iter.hasNext());
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/loctest.h b/Build/source/libs/icu/icu-src/source/test/intltest/loctest.h
index 2a83be51a05..065213e9227 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/loctest.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/loctest.h
@@ -69,6 +69,8 @@ public:
void Test4147315(void);
void Test4147317(void);
void Test4147552(void);
+
+ void Test20639_DeprecatesISO3Language();
void TestVariantParsing(void);
@@ -79,7 +81,9 @@ public:
/* Test getting keyword values */
void TestKeywordVariantParsing(void);
void TestCreateKeywordSet(void);
+ void TestCreateKeywordSetEmpty(void);
void TestCreateUnicodeKeywordSet(void);
+ void TestCreateUnicodeKeywordSetEmpty(void);
void TestGetKeywordValueStdString(void);
void TestGetUnicodeKeywordValueStdString(void);
@@ -114,9 +118,12 @@ public:
void TestBug11421();
void TestBug13277();
void TestBug13554();
+ void TestBug20410();
+ void TestConstructorAcceptsBCP47();
void TestAddLikelySubtags();
void TestMinimizeSubtags();
+ void TestAddLikelyAndMinimizeSubtags();
void TestForLanguageTag();
void TestToLanguageTag();
@@ -124,8 +131,21 @@ public:
void TestMoveAssign();
void TestMoveCtor();
+ void TestBug20407iVariantPreferredValue();
+
void TestBug13417VeryLongLanguageTag();
+ void TestBug11053UnderlineTimeZone();
+
+ void TestUnd();
+ void TestUndScript();
+ void TestUndRegion();
+ void TestUndCAPI();
+ void TestRangeIterator();
+ void TestPointerConvertingIterator();
+ void TestTagConvertingIterator();
+ void TestCapturingTagConvertingIterator();
+
private:
void _checklocs(const char* label,
const char* req,
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/measfmttest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/measfmttest.cpp
index a0599bae884..2b53f8bc024 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/measfmttest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/measfmttest.cpp
@@ -28,6 +28,7 @@
#include "charstr.h"
#include "cstr.h"
#include "unicode/reldatefmt.h"
+#include "unicode/rbnf.h"
struct ExpectedResult {
const Measure *measures;
@@ -51,6 +52,8 @@ private:
void TestCompatible58();
void TestCompatible59();
void TestCompatible63();
+ void TestCompatible64();
+ void TestCompatible65();
void TestGetAvailable();
void TestExamplesInDocs();
void TestFormatPeriodEn();
@@ -73,6 +76,9 @@ private:
void TestDoubleZero();
void TestUnitPerUnitResolution();
void TestIndividualPluralFallback();
+ void Test20332_PersonUnits();
+ void TestNumericTime();
+ void TestNumericTimeSomeSpecialFormats();
void verifyFormat(
const char *description,
const MeasureFormat &fmt,
@@ -149,6 +155,8 @@ void MeasureFormatTest::runIndexedTest(
TESTCASE_AUTO(TestCompatible58);
TESTCASE_AUTO(TestCompatible59);
TESTCASE_AUTO(TestCompatible63);
+ TESTCASE_AUTO(TestCompatible64);
+ TESTCASE_AUTO(TestCompatible65);
TESTCASE_AUTO(TestGetAvailable);
TESTCASE_AUTO(TestExamplesInDocs);
TESTCASE_AUTO(TestFormatPeriodEn);
@@ -171,6 +179,9 @@ void MeasureFormatTest::runIndexedTest(
TESTCASE_AUTO(TestDoubleZero);
TESTCASE_AUTO(TestUnitPerUnitResolution);
TESTCASE_AUTO(TestIndividualPluralFallback);
+ TESTCASE_AUTO(Test20332_PersonUnits);
+ TESTCASE_AUTO(TestNumericTime);
+ TESTCASE_AUTO(TestNumericTimeSomeSpecialFormats);
TESTCASE_AUTO_END;
}
@@ -1189,6 +1200,686 @@ void MeasureFormatTest::TestCompatible63() {
assertSuccess("", status);
}
+void MeasureFormatTest::TestCompatible64() {
+ UErrorCode status = U_ZERO_ERROR;
+ LocalPointer<MeasureUnit> measureUnit;
+ MeasureUnit measureUnitValue;
+ measureUnit.adoptInstead(MeasureUnit::createGForce(status));
+ measureUnitValue = MeasureUnit::getGForce();
+ measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status));
+ measureUnitValue = MeasureUnit::getMeterPerSecondSquared();
+ measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
+ measureUnitValue = MeasureUnit::getArcMinute();
+ measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
+ measureUnitValue = MeasureUnit::getArcSecond();
+ measureUnit.adoptInstead(MeasureUnit::createDegree(status));
+ measureUnitValue = MeasureUnit::getDegree();
+ measureUnit.adoptInstead(MeasureUnit::createRadian(status));
+ measureUnitValue = MeasureUnit::getRadian();
+ measureUnit.adoptInstead(MeasureUnit::createRevolutionAngle(status));
+ measureUnitValue = MeasureUnit::getRevolutionAngle();
+ measureUnit.adoptInstead(MeasureUnit::createAcre(status));
+ measureUnitValue = MeasureUnit::getAcre();
+ measureUnit.adoptInstead(MeasureUnit::createDunam(status));
+ measureUnitValue = MeasureUnit::getDunam();
+ measureUnit.adoptInstead(MeasureUnit::createHectare(status));
+ measureUnitValue = MeasureUnit::getHectare();
+ measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status));
+ measureUnitValue = MeasureUnit::getSquareCentimeter();
+ measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
+ measureUnitValue = MeasureUnit::getSquareFoot();
+ measureUnit.adoptInstead(MeasureUnit::createSquareInch(status));
+ measureUnitValue = MeasureUnit::getSquareInch();
+ measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
+ measureUnitValue = MeasureUnit::getSquareKilometer();
+ measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
+ measureUnitValue = MeasureUnit::getSquareMeter();
+ measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
+ measureUnitValue = MeasureUnit::getSquareMile();
+ measureUnit.adoptInstead(MeasureUnit::createSquareYard(status));
+ measureUnitValue = MeasureUnit::getSquareYard();
+ measureUnit.adoptInstead(MeasureUnit::createKarat(status));
+ measureUnitValue = MeasureUnit::getKarat();
+ measureUnit.adoptInstead(MeasureUnit::createMilligramPerDeciliter(status));
+ measureUnitValue = MeasureUnit::getMilligramPerDeciliter();
+ measureUnit.adoptInstead(MeasureUnit::createMillimolePerLiter(status));
+ measureUnitValue = MeasureUnit::getMillimolePerLiter();
+ measureUnit.adoptInstead(MeasureUnit::createMole(status));
+ measureUnitValue = MeasureUnit::getMole();
+ measureUnit.adoptInstead(MeasureUnit::createPartPerMillion(status));
+ measureUnitValue = MeasureUnit::getPartPerMillion();
+ measureUnit.adoptInstead(MeasureUnit::createPercent(status));
+ measureUnitValue = MeasureUnit::getPercent();
+ measureUnit.adoptInstead(MeasureUnit::createPermille(status));
+ measureUnitValue = MeasureUnit::getPermille();
+ measureUnit.adoptInstead(MeasureUnit::createPermyriad(status));
+ measureUnitValue = MeasureUnit::getPermyriad();
+ measureUnit.adoptInstead(MeasureUnit::createLiterPer100Kilometers(status));
+ measureUnitValue = MeasureUnit::getLiterPer100Kilometers();
+ measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status));
+ measureUnitValue = MeasureUnit::getLiterPerKilometer();
+ measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status));
+ measureUnitValue = MeasureUnit::getMilePerGallon();
+ measureUnit.adoptInstead(MeasureUnit::createMilePerGallonImperial(status));
+ measureUnitValue = MeasureUnit::getMilePerGallonImperial();
+ measureUnit.adoptInstead(MeasureUnit::createBit(status));
+ measureUnitValue = MeasureUnit::getBit();
+ measureUnit.adoptInstead(MeasureUnit::createByte(status));
+ measureUnitValue = MeasureUnit::getByte();
+ measureUnit.adoptInstead(MeasureUnit::createGigabit(status));
+ measureUnitValue = MeasureUnit::getGigabit();
+ measureUnit.adoptInstead(MeasureUnit::createGigabyte(status));
+ measureUnitValue = MeasureUnit::getGigabyte();
+ measureUnit.adoptInstead(MeasureUnit::createKilobit(status));
+ measureUnitValue = MeasureUnit::getKilobit();
+ measureUnit.adoptInstead(MeasureUnit::createKilobyte(status));
+ measureUnitValue = MeasureUnit::getKilobyte();
+ measureUnit.adoptInstead(MeasureUnit::createMegabit(status));
+ measureUnitValue = MeasureUnit::getMegabit();
+ measureUnit.adoptInstead(MeasureUnit::createMegabyte(status));
+ measureUnitValue = MeasureUnit::getMegabyte();
+ measureUnit.adoptInstead(MeasureUnit::createPetabyte(status));
+ measureUnitValue = MeasureUnit::getPetabyte();
+ measureUnit.adoptInstead(MeasureUnit::createTerabit(status));
+ measureUnitValue = MeasureUnit::getTerabit();
+ measureUnit.adoptInstead(MeasureUnit::createTerabyte(status));
+ measureUnitValue = MeasureUnit::getTerabyte();
+ measureUnit.adoptInstead(MeasureUnit::createCentury(status));
+ measureUnitValue = MeasureUnit::getCentury();
+ measureUnit.adoptInstead(MeasureUnit::createDay(status));
+ measureUnitValue = MeasureUnit::getDay();
+ measureUnit.adoptInstead(MeasureUnit::createDayPerson(status));
+ measureUnitValue = MeasureUnit::getDayPerson();
+ measureUnit.adoptInstead(MeasureUnit::createHour(status));
+ measureUnitValue = MeasureUnit::getHour();
+ measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status));
+ measureUnitValue = MeasureUnit::getMicrosecond();
+ measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
+ measureUnitValue = MeasureUnit::getMillisecond();
+ measureUnit.adoptInstead(MeasureUnit::createMinute(status));
+ measureUnitValue = MeasureUnit::getMinute();
+ measureUnit.adoptInstead(MeasureUnit::createMonth(status));
+ measureUnitValue = MeasureUnit::getMonth();
+ measureUnit.adoptInstead(MeasureUnit::createMonthPerson(status));
+ measureUnitValue = MeasureUnit::getMonthPerson();
+ measureUnit.adoptInstead(MeasureUnit::createNanosecond(status));
+ measureUnitValue = MeasureUnit::getNanosecond();
+ measureUnit.adoptInstead(MeasureUnit::createSecond(status));
+ measureUnitValue = MeasureUnit::getSecond();
+ measureUnit.adoptInstead(MeasureUnit::createWeek(status));
+ measureUnitValue = MeasureUnit::getWeek();
+ measureUnit.adoptInstead(MeasureUnit::createWeekPerson(status));
+ measureUnitValue = MeasureUnit::getWeekPerson();
+ measureUnit.adoptInstead(MeasureUnit::createYear(status));
+ measureUnitValue = MeasureUnit::getYear();
+ measureUnit.adoptInstead(MeasureUnit::createYearPerson(status));
+ measureUnitValue = MeasureUnit::getYearPerson();
+ measureUnit.adoptInstead(MeasureUnit::createAmpere(status));
+ measureUnitValue = MeasureUnit::getAmpere();
+ measureUnit.adoptInstead(MeasureUnit::createMilliampere(status));
+ measureUnitValue = MeasureUnit::getMilliampere();
+ measureUnit.adoptInstead(MeasureUnit::createOhm(status));
+ measureUnitValue = MeasureUnit::getOhm();
+ measureUnit.adoptInstead(MeasureUnit::createVolt(status));
+ measureUnitValue = MeasureUnit::getVolt();
+ measureUnit.adoptInstead(MeasureUnit::createBritishThermalUnit(status));
+ measureUnitValue = MeasureUnit::getBritishThermalUnit();
+ measureUnit.adoptInstead(MeasureUnit::createCalorie(status));
+ measureUnitValue = MeasureUnit::getCalorie();
+ measureUnit.adoptInstead(MeasureUnit::createElectronvolt(status));
+ measureUnitValue = MeasureUnit::getElectronvolt();
+ measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status));
+ measureUnitValue = MeasureUnit::getFoodcalorie();
+ measureUnit.adoptInstead(MeasureUnit::createJoule(status));
+ measureUnitValue = MeasureUnit::getJoule();
+ measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status));
+ measureUnitValue = MeasureUnit::getKilocalorie();
+ measureUnit.adoptInstead(MeasureUnit::createKilojoule(status));
+ measureUnitValue = MeasureUnit::getKilojoule();
+ measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status));
+ measureUnitValue = MeasureUnit::getKilowattHour();
+ measureUnit.adoptInstead(MeasureUnit::createNewton(status));
+ measureUnitValue = MeasureUnit::getNewton();
+ measureUnit.adoptInstead(MeasureUnit::createPoundForce(status));
+ measureUnitValue = MeasureUnit::getPoundForce();
+ measureUnit.adoptInstead(MeasureUnit::createGigahertz(status));
+ measureUnitValue = MeasureUnit::getGigahertz();
+ measureUnit.adoptInstead(MeasureUnit::createHertz(status));
+ measureUnitValue = MeasureUnit::getHertz();
+ measureUnit.adoptInstead(MeasureUnit::createKilohertz(status));
+ measureUnitValue = MeasureUnit::getKilohertz();
+ measureUnit.adoptInstead(MeasureUnit::createMegahertz(status));
+ measureUnitValue = MeasureUnit::getMegahertz();
+ measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status));
+ measureUnitValue = MeasureUnit::getAstronomicalUnit();
+ measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
+ measureUnitValue = MeasureUnit::getCentimeter();
+ measureUnit.adoptInstead(MeasureUnit::createDecimeter(status));
+ measureUnitValue = MeasureUnit::getDecimeter();
+ measureUnit.adoptInstead(MeasureUnit::createFathom(status));
+ measureUnitValue = MeasureUnit::getFathom();
+ measureUnit.adoptInstead(MeasureUnit::createFoot(status));
+ measureUnitValue = MeasureUnit::getFoot();
+ measureUnit.adoptInstead(MeasureUnit::createFurlong(status));
+ measureUnitValue = MeasureUnit::getFurlong();
+ measureUnit.adoptInstead(MeasureUnit::createInch(status));
+ measureUnitValue = MeasureUnit::getInch();
+ measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
+ measureUnitValue = MeasureUnit::getKilometer();
+ measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
+ measureUnitValue = MeasureUnit::getLightYear();
+ measureUnit.adoptInstead(MeasureUnit::createMeter(status));
+ measureUnitValue = MeasureUnit::getMeter();
+ measureUnit.adoptInstead(MeasureUnit::createMicrometer(status));
+ measureUnitValue = MeasureUnit::getMicrometer();
+ measureUnit.adoptInstead(MeasureUnit::createMile(status));
+ measureUnitValue = MeasureUnit::getMile();
+ measureUnit.adoptInstead(MeasureUnit::createMileScandinavian(status));
+ measureUnitValue = MeasureUnit::getMileScandinavian();
+ measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
+ measureUnitValue = MeasureUnit::getMillimeter();
+ measureUnit.adoptInstead(MeasureUnit::createNanometer(status));
+ measureUnitValue = MeasureUnit::getNanometer();
+ measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status));
+ measureUnitValue = MeasureUnit::getNauticalMile();
+ measureUnit.adoptInstead(MeasureUnit::createParsec(status));
+ measureUnitValue = MeasureUnit::getParsec();
+ measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
+ measureUnitValue = MeasureUnit::getPicometer();
+ measureUnit.adoptInstead(MeasureUnit::createPoint(status));
+ measureUnitValue = MeasureUnit::getPoint();
+ measureUnit.adoptInstead(MeasureUnit::createSolarRadius(status));
+ measureUnitValue = MeasureUnit::getSolarRadius();
+ measureUnit.adoptInstead(MeasureUnit::createYard(status));
+ measureUnitValue = MeasureUnit::getYard();
+ measureUnit.adoptInstead(MeasureUnit::createLux(status));
+ measureUnitValue = MeasureUnit::getLux();
+ measureUnit.adoptInstead(MeasureUnit::createSolarLuminosity(status));
+ measureUnitValue = MeasureUnit::getSolarLuminosity();
+ measureUnit.adoptInstead(MeasureUnit::createCarat(status));
+ measureUnitValue = MeasureUnit::getCarat();
+ measureUnit.adoptInstead(MeasureUnit::createDalton(status));
+ measureUnitValue = MeasureUnit::getDalton();
+ measureUnit.adoptInstead(MeasureUnit::createEarthMass(status));
+ measureUnitValue = MeasureUnit::getEarthMass();
+ measureUnit.adoptInstead(MeasureUnit::createGram(status));
+ measureUnitValue = MeasureUnit::getGram();
+ measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
+ measureUnitValue = MeasureUnit::getKilogram();
+ measureUnit.adoptInstead(MeasureUnit::createMetricTon(status));
+ measureUnitValue = MeasureUnit::getMetricTon();
+ measureUnit.adoptInstead(MeasureUnit::createMicrogram(status));
+ measureUnitValue = MeasureUnit::getMicrogram();
+ measureUnit.adoptInstead(MeasureUnit::createMilligram(status));
+ measureUnitValue = MeasureUnit::getMilligram();
+ measureUnit.adoptInstead(MeasureUnit::createOunce(status));
+ measureUnitValue = MeasureUnit::getOunce();
+ measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status));
+ measureUnitValue = MeasureUnit::getOunceTroy();
+ measureUnit.adoptInstead(MeasureUnit::createPound(status));
+ measureUnitValue = MeasureUnit::getPound();
+ measureUnit.adoptInstead(MeasureUnit::createSolarMass(status));
+ measureUnitValue = MeasureUnit::getSolarMass();
+ measureUnit.adoptInstead(MeasureUnit::createStone(status));
+ measureUnitValue = MeasureUnit::getStone();
+ measureUnit.adoptInstead(MeasureUnit::createTon(status));
+ measureUnitValue = MeasureUnit::getTon();
+ measureUnit.adoptInstead(MeasureUnit::createGigawatt(status));
+ measureUnitValue = MeasureUnit::getGigawatt();
+ measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
+ measureUnitValue = MeasureUnit::getHorsepower();
+ measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
+ measureUnitValue = MeasureUnit::getKilowatt();
+ measureUnit.adoptInstead(MeasureUnit::createMegawatt(status));
+ measureUnitValue = MeasureUnit::getMegawatt();
+ measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status));
+ measureUnitValue = MeasureUnit::getMilliwatt();
+ measureUnit.adoptInstead(MeasureUnit::createWatt(status));
+ measureUnitValue = MeasureUnit::getWatt();
+ measureUnit.adoptInstead(MeasureUnit::createAtmosphere(status));
+ measureUnitValue = MeasureUnit::getAtmosphere();
+ measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
+ measureUnitValue = MeasureUnit::getHectopascal();
+ measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
+ measureUnitValue = MeasureUnit::getInchHg();
+ measureUnit.adoptInstead(MeasureUnit::createKilopascal(status));
+ measureUnitValue = MeasureUnit::getKilopascal();
+ measureUnit.adoptInstead(MeasureUnit::createMegapascal(status));
+ measureUnitValue = MeasureUnit::getMegapascal();
+ measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
+ measureUnitValue = MeasureUnit::getMillibar();
+ measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status));
+ measureUnitValue = MeasureUnit::getMillimeterOfMercury();
+ measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status));
+ measureUnitValue = MeasureUnit::getPoundPerSquareInch();
+ measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
+ measureUnitValue = MeasureUnit::getKilometerPerHour();
+ measureUnit.adoptInstead(MeasureUnit::createKnot(status));
+ measureUnitValue = MeasureUnit::getKnot();
+ measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
+ measureUnitValue = MeasureUnit::getMeterPerSecond();
+ measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
+ measureUnitValue = MeasureUnit::getMilePerHour();
+ measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
+ measureUnitValue = MeasureUnit::getCelsius();
+ measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
+ measureUnitValue = MeasureUnit::getFahrenheit();
+ measureUnit.adoptInstead(MeasureUnit::createGenericTemperature(status));
+ measureUnitValue = MeasureUnit::getGenericTemperature();
+ measureUnit.adoptInstead(MeasureUnit::createKelvin(status));
+ measureUnitValue = MeasureUnit::getKelvin();
+ measureUnit.adoptInstead(MeasureUnit::createNewtonMeter(status));
+ measureUnitValue = MeasureUnit::getNewtonMeter();
+ measureUnit.adoptInstead(MeasureUnit::createPoundFoot(status));
+ measureUnitValue = MeasureUnit::getPoundFoot();
+ measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status));
+ measureUnitValue = MeasureUnit::getAcreFoot();
+ measureUnit.adoptInstead(MeasureUnit::createBarrel(status));
+ measureUnitValue = MeasureUnit::getBarrel();
+ measureUnit.adoptInstead(MeasureUnit::createBushel(status));
+ measureUnitValue = MeasureUnit::getBushel();
+ measureUnit.adoptInstead(MeasureUnit::createCentiliter(status));
+ measureUnitValue = MeasureUnit::getCentiliter();
+ measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status));
+ measureUnitValue = MeasureUnit::getCubicCentimeter();
+ measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status));
+ measureUnitValue = MeasureUnit::getCubicFoot();
+ measureUnit.adoptInstead(MeasureUnit::createCubicInch(status));
+ measureUnitValue = MeasureUnit::getCubicInch();
+ measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
+ measureUnitValue = MeasureUnit::getCubicKilometer();
+ measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status));
+ measureUnitValue = MeasureUnit::getCubicMeter();
+ measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
+ measureUnitValue = MeasureUnit::getCubicMile();
+ measureUnit.adoptInstead(MeasureUnit::createCubicYard(status));
+ measureUnitValue = MeasureUnit::getCubicYard();
+ measureUnit.adoptInstead(MeasureUnit::createCup(status));
+ measureUnitValue = MeasureUnit::getCup();
+ measureUnit.adoptInstead(MeasureUnit::createCupMetric(status));
+ measureUnitValue = MeasureUnit::getCupMetric();
+ measureUnit.adoptInstead(MeasureUnit::createDeciliter(status));
+ measureUnitValue = MeasureUnit::getDeciliter();
+ measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status));
+ measureUnitValue = MeasureUnit::getFluidOunce();
+ measureUnit.adoptInstead(MeasureUnit::createFluidOunceImperial(status));
+ measureUnitValue = MeasureUnit::getFluidOunceImperial();
+ measureUnit.adoptInstead(MeasureUnit::createGallon(status));
+ measureUnitValue = MeasureUnit::getGallon();
+ measureUnit.adoptInstead(MeasureUnit::createGallonImperial(status));
+ measureUnitValue = MeasureUnit::getGallonImperial();
+ measureUnit.adoptInstead(MeasureUnit::createHectoliter(status));
+ measureUnitValue = MeasureUnit::getHectoliter();
+ measureUnit.adoptInstead(MeasureUnit::createLiter(status));
+ measureUnitValue = MeasureUnit::getLiter();
+ measureUnit.adoptInstead(MeasureUnit::createMegaliter(status));
+ measureUnitValue = MeasureUnit::getMegaliter();
+ measureUnit.adoptInstead(MeasureUnit::createMilliliter(status));
+ measureUnitValue = MeasureUnit::getMilliliter();
+ measureUnit.adoptInstead(MeasureUnit::createPint(status));
+ measureUnitValue = MeasureUnit::getPint();
+ measureUnit.adoptInstead(MeasureUnit::createPintMetric(status));
+ measureUnitValue = MeasureUnit::getPintMetric();
+ measureUnit.adoptInstead(MeasureUnit::createQuart(status));
+ measureUnitValue = MeasureUnit::getQuart();
+ measureUnit.adoptInstead(MeasureUnit::createTablespoon(status));
+ measureUnitValue = MeasureUnit::getTablespoon();
+ measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status));
+ measureUnitValue = MeasureUnit::getTeaspoon();
+ assertSuccess("", status);
+}
+
+void MeasureFormatTest::TestCompatible65() {
+ UErrorCode status = U_ZERO_ERROR;
+ LocalPointer<MeasureUnit> measureUnit;
+ MeasureUnit measureUnitValue;
+ measureUnit.adoptInstead(MeasureUnit::createGForce(status));
+ measureUnitValue = MeasureUnit::getGForce();
+ measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status));
+ measureUnitValue = MeasureUnit::getMeterPerSecondSquared();
+ measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
+ measureUnitValue = MeasureUnit::getArcMinute();
+ measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
+ measureUnitValue = MeasureUnit::getArcSecond();
+ measureUnit.adoptInstead(MeasureUnit::createDegree(status));
+ measureUnitValue = MeasureUnit::getDegree();
+ measureUnit.adoptInstead(MeasureUnit::createRadian(status));
+ measureUnitValue = MeasureUnit::getRadian();
+ measureUnit.adoptInstead(MeasureUnit::createRevolutionAngle(status));
+ measureUnitValue = MeasureUnit::getRevolutionAngle();
+ measureUnit.adoptInstead(MeasureUnit::createAcre(status));
+ measureUnitValue = MeasureUnit::getAcre();
+ measureUnit.adoptInstead(MeasureUnit::createDunam(status));
+ measureUnitValue = MeasureUnit::getDunam();
+ measureUnit.adoptInstead(MeasureUnit::createHectare(status));
+ measureUnitValue = MeasureUnit::getHectare();
+ measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status));
+ measureUnitValue = MeasureUnit::getSquareCentimeter();
+ measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
+ measureUnitValue = MeasureUnit::getSquareFoot();
+ measureUnit.adoptInstead(MeasureUnit::createSquareInch(status));
+ measureUnitValue = MeasureUnit::getSquareInch();
+ measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
+ measureUnitValue = MeasureUnit::getSquareKilometer();
+ measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
+ measureUnitValue = MeasureUnit::getSquareMeter();
+ measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
+ measureUnitValue = MeasureUnit::getSquareMile();
+ measureUnit.adoptInstead(MeasureUnit::createSquareYard(status));
+ measureUnitValue = MeasureUnit::getSquareYard();
+ measureUnit.adoptInstead(MeasureUnit::createKarat(status));
+ measureUnitValue = MeasureUnit::getKarat();
+ measureUnit.adoptInstead(MeasureUnit::createMilligramPerDeciliter(status));
+ measureUnitValue = MeasureUnit::getMilligramPerDeciliter();
+ measureUnit.adoptInstead(MeasureUnit::createMillimolePerLiter(status));
+ measureUnitValue = MeasureUnit::getMillimolePerLiter();
+ measureUnit.adoptInstead(MeasureUnit::createMole(status));
+ measureUnitValue = MeasureUnit::getMole();
+ measureUnit.adoptInstead(MeasureUnit::createPartPerMillion(status));
+ measureUnitValue = MeasureUnit::getPartPerMillion();
+ measureUnit.adoptInstead(MeasureUnit::createPercent(status));
+ measureUnitValue = MeasureUnit::getPercent();
+ measureUnit.adoptInstead(MeasureUnit::createPermille(status));
+ measureUnitValue = MeasureUnit::getPermille();
+ measureUnit.adoptInstead(MeasureUnit::createPermyriad(status));
+ measureUnitValue = MeasureUnit::getPermyriad();
+ measureUnit.adoptInstead(MeasureUnit::createLiterPer100Kilometers(status));
+ measureUnitValue = MeasureUnit::getLiterPer100Kilometers();
+ measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status));
+ measureUnitValue = MeasureUnit::getLiterPerKilometer();
+ measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status));
+ measureUnitValue = MeasureUnit::getMilePerGallon();
+ measureUnit.adoptInstead(MeasureUnit::createMilePerGallonImperial(status));
+ measureUnitValue = MeasureUnit::getMilePerGallonImperial();
+ measureUnit.adoptInstead(MeasureUnit::createBit(status));
+ measureUnitValue = MeasureUnit::getBit();
+ measureUnit.adoptInstead(MeasureUnit::createByte(status));
+ measureUnitValue = MeasureUnit::getByte();
+ measureUnit.adoptInstead(MeasureUnit::createGigabit(status));
+ measureUnitValue = MeasureUnit::getGigabit();
+ measureUnit.adoptInstead(MeasureUnit::createGigabyte(status));
+ measureUnitValue = MeasureUnit::getGigabyte();
+ measureUnit.adoptInstead(MeasureUnit::createKilobit(status));
+ measureUnitValue = MeasureUnit::getKilobit();
+ measureUnit.adoptInstead(MeasureUnit::createKilobyte(status));
+ measureUnitValue = MeasureUnit::getKilobyte();
+ measureUnit.adoptInstead(MeasureUnit::createMegabit(status));
+ measureUnitValue = MeasureUnit::getMegabit();
+ measureUnit.adoptInstead(MeasureUnit::createMegabyte(status));
+ measureUnitValue = MeasureUnit::getMegabyte();
+ measureUnit.adoptInstead(MeasureUnit::createPetabyte(status));
+ measureUnitValue = MeasureUnit::getPetabyte();
+ measureUnit.adoptInstead(MeasureUnit::createTerabit(status));
+ measureUnitValue = MeasureUnit::getTerabit();
+ measureUnit.adoptInstead(MeasureUnit::createTerabyte(status));
+ measureUnitValue = MeasureUnit::getTerabyte();
+ measureUnit.adoptInstead(MeasureUnit::createCentury(status));
+ measureUnitValue = MeasureUnit::getCentury();
+ measureUnit.adoptInstead(MeasureUnit::createDay(status));
+ measureUnitValue = MeasureUnit::getDay();
+ measureUnit.adoptInstead(MeasureUnit::createDayPerson(status));
+ measureUnitValue = MeasureUnit::getDayPerson();
+ measureUnit.adoptInstead(MeasureUnit::createDecade(status));
+ measureUnitValue = MeasureUnit::getDecade();
+ measureUnit.adoptInstead(MeasureUnit::createHour(status));
+ measureUnitValue = MeasureUnit::getHour();
+ measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status));
+ measureUnitValue = MeasureUnit::getMicrosecond();
+ measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
+ measureUnitValue = MeasureUnit::getMillisecond();
+ measureUnit.adoptInstead(MeasureUnit::createMinute(status));
+ measureUnitValue = MeasureUnit::getMinute();
+ measureUnit.adoptInstead(MeasureUnit::createMonth(status));
+ measureUnitValue = MeasureUnit::getMonth();
+ measureUnit.adoptInstead(MeasureUnit::createMonthPerson(status));
+ measureUnitValue = MeasureUnit::getMonthPerson();
+ measureUnit.adoptInstead(MeasureUnit::createNanosecond(status));
+ measureUnitValue = MeasureUnit::getNanosecond();
+ measureUnit.adoptInstead(MeasureUnit::createSecond(status));
+ measureUnitValue = MeasureUnit::getSecond();
+ measureUnit.adoptInstead(MeasureUnit::createWeek(status));
+ measureUnitValue = MeasureUnit::getWeek();
+ measureUnit.adoptInstead(MeasureUnit::createWeekPerson(status));
+ measureUnitValue = MeasureUnit::getWeekPerson();
+ measureUnit.adoptInstead(MeasureUnit::createYear(status));
+ measureUnitValue = MeasureUnit::getYear();
+ measureUnit.adoptInstead(MeasureUnit::createYearPerson(status));
+ measureUnitValue = MeasureUnit::getYearPerson();
+ measureUnit.adoptInstead(MeasureUnit::createAmpere(status));
+ measureUnitValue = MeasureUnit::getAmpere();
+ measureUnit.adoptInstead(MeasureUnit::createMilliampere(status));
+ measureUnitValue = MeasureUnit::getMilliampere();
+ measureUnit.adoptInstead(MeasureUnit::createOhm(status));
+ measureUnitValue = MeasureUnit::getOhm();
+ measureUnit.adoptInstead(MeasureUnit::createVolt(status));
+ measureUnitValue = MeasureUnit::getVolt();
+ measureUnit.adoptInstead(MeasureUnit::createBritishThermalUnit(status));
+ measureUnitValue = MeasureUnit::getBritishThermalUnit();
+ measureUnit.adoptInstead(MeasureUnit::createCalorie(status));
+ measureUnitValue = MeasureUnit::getCalorie();
+ measureUnit.adoptInstead(MeasureUnit::createElectronvolt(status));
+ measureUnitValue = MeasureUnit::getElectronvolt();
+ measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status));
+ measureUnitValue = MeasureUnit::getFoodcalorie();
+ measureUnit.adoptInstead(MeasureUnit::createJoule(status));
+ measureUnitValue = MeasureUnit::getJoule();
+ measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status));
+ measureUnitValue = MeasureUnit::getKilocalorie();
+ measureUnit.adoptInstead(MeasureUnit::createKilojoule(status));
+ measureUnitValue = MeasureUnit::getKilojoule();
+ measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status));
+ measureUnitValue = MeasureUnit::getKilowattHour();
+ measureUnit.adoptInstead(MeasureUnit::createThermUs(status));
+ measureUnitValue = MeasureUnit::getThermUs();
+ measureUnit.adoptInstead(MeasureUnit::createNewton(status));
+ measureUnitValue = MeasureUnit::getNewton();
+ measureUnit.adoptInstead(MeasureUnit::createPoundForce(status));
+ measureUnitValue = MeasureUnit::getPoundForce();
+ measureUnit.adoptInstead(MeasureUnit::createGigahertz(status));
+ measureUnitValue = MeasureUnit::getGigahertz();
+ measureUnit.adoptInstead(MeasureUnit::createHertz(status));
+ measureUnitValue = MeasureUnit::getHertz();
+ measureUnit.adoptInstead(MeasureUnit::createKilohertz(status));
+ measureUnitValue = MeasureUnit::getKilohertz();
+ measureUnit.adoptInstead(MeasureUnit::createMegahertz(status));
+ measureUnitValue = MeasureUnit::getMegahertz();
+ measureUnit.adoptInstead(MeasureUnit::createDotPerCentimeter(status));
+ measureUnitValue = MeasureUnit::getDotPerCentimeter();
+ measureUnit.adoptInstead(MeasureUnit::createDotPerInch(status));
+ measureUnitValue = MeasureUnit::getDotPerInch();
+ measureUnit.adoptInstead(MeasureUnit::createEm(status));
+ measureUnitValue = MeasureUnit::getEm();
+ measureUnit.adoptInstead(MeasureUnit::createMegapixel(status));
+ measureUnitValue = MeasureUnit::getMegapixel();
+ measureUnit.adoptInstead(MeasureUnit::createPixel(status));
+ measureUnitValue = MeasureUnit::getPixel();
+ measureUnit.adoptInstead(MeasureUnit::createPixelPerCentimeter(status));
+ measureUnitValue = MeasureUnit::getPixelPerCentimeter();
+ measureUnit.adoptInstead(MeasureUnit::createPixelPerInch(status));
+ measureUnitValue = MeasureUnit::getPixelPerInch();
+ measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status));
+ measureUnitValue = MeasureUnit::getAstronomicalUnit();
+ measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
+ measureUnitValue = MeasureUnit::getCentimeter();
+ measureUnit.adoptInstead(MeasureUnit::createDecimeter(status));
+ measureUnitValue = MeasureUnit::getDecimeter();
+ measureUnit.adoptInstead(MeasureUnit::createFathom(status));
+ measureUnitValue = MeasureUnit::getFathom();
+ measureUnit.adoptInstead(MeasureUnit::createFoot(status));
+ measureUnitValue = MeasureUnit::getFoot();
+ measureUnit.adoptInstead(MeasureUnit::createFurlong(status));
+ measureUnitValue = MeasureUnit::getFurlong();
+ measureUnit.adoptInstead(MeasureUnit::createInch(status));
+ measureUnitValue = MeasureUnit::getInch();
+ measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
+ measureUnitValue = MeasureUnit::getKilometer();
+ measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
+ measureUnitValue = MeasureUnit::getLightYear();
+ measureUnit.adoptInstead(MeasureUnit::createMeter(status));
+ measureUnitValue = MeasureUnit::getMeter();
+ measureUnit.adoptInstead(MeasureUnit::createMicrometer(status));
+ measureUnitValue = MeasureUnit::getMicrometer();
+ measureUnit.adoptInstead(MeasureUnit::createMile(status));
+ measureUnitValue = MeasureUnit::getMile();
+ measureUnit.adoptInstead(MeasureUnit::createMileScandinavian(status));
+ measureUnitValue = MeasureUnit::getMileScandinavian();
+ measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
+ measureUnitValue = MeasureUnit::getMillimeter();
+ measureUnit.adoptInstead(MeasureUnit::createNanometer(status));
+ measureUnitValue = MeasureUnit::getNanometer();
+ measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status));
+ measureUnitValue = MeasureUnit::getNauticalMile();
+ measureUnit.adoptInstead(MeasureUnit::createParsec(status));
+ measureUnitValue = MeasureUnit::getParsec();
+ measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
+ measureUnitValue = MeasureUnit::getPicometer();
+ measureUnit.adoptInstead(MeasureUnit::createPoint(status));
+ measureUnitValue = MeasureUnit::getPoint();
+ measureUnit.adoptInstead(MeasureUnit::createSolarRadius(status));
+ measureUnitValue = MeasureUnit::getSolarRadius();
+ measureUnit.adoptInstead(MeasureUnit::createYard(status));
+ measureUnitValue = MeasureUnit::getYard();
+ measureUnit.adoptInstead(MeasureUnit::createLux(status));
+ measureUnitValue = MeasureUnit::getLux();
+ measureUnit.adoptInstead(MeasureUnit::createSolarLuminosity(status));
+ measureUnitValue = MeasureUnit::getSolarLuminosity();
+ measureUnit.adoptInstead(MeasureUnit::createCarat(status));
+ measureUnitValue = MeasureUnit::getCarat();
+ measureUnit.adoptInstead(MeasureUnit::createDalton(status));
+ measureUnitValue = MeasureUnit::getDalton();
+ measureUnit.adoptInstead(MeasureUnit::createEarthMass(status));
+ measureUnitValue = MeasureUnit::getEarthMass();
+ measureUnit.adoptInstead(MeasureUnit::createGram(status));
+ measureUnitValue = MeasureUnit::getGram();
+ measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
+ measureUnitValue = MeasureUnit::getKilogram();
+ measureUnit.adoptInstead(MeasureUnit::createMetricTon(status));
+ measureUnitValue = MeasureUnit::getMetricTon();
+ measureUnit.adoptInstead(MeasureUnit::createMicrogram(status));
+ measureUnitValue = MeasureUnit::getMicrogram();
+ measureUnit.adoptInstead(MeasureUnit::createMilligram(status));
+ measureUnitValue = MeasureUnit::getMilligram();
+ measureUnit.adoptInstead(MeasureUnit::createOunce(status));
+ measureUnitValue = MeasureUnit::getOunce();
+ measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status));
+ measureUnitValue = MeasureUnit::getOunceTroy();
+ measureUnit.adoptInstead(MeasureUnit::createPound(status));
+ measureUnitValue = MeasureUnit::getPound();
+ measureUnit.adoptInstead(MeasureUnit::createSolarMass(status));
+ measureUnitValue = MeasureUnit::getSolarMass();
+ measureUnit.adoptInstead(MeasureUnit::createStone(status));
+ measureUnitValue = MeasureUnit::getStone();
+ measureUnit.adoptInstead(MeasureUnit::createTon(status));
+ measureUnitValue = MeasureUnit::getTon();
+ measureUnit.adoptInstead(MeasureUnit::createGigawatt(status));
+ measureUnitValue = MeasureUnit::getGigawatt();
+ measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
+ measureUnitValue = MeasureUnit::getHorsepower();
+ measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
+ measureUnitValue = MeasureUnit::getKilowatt();
+ measureUnit.adoptInstead(MeasureUnit::createMegawatt(status));
+ measureUnitValue = MeasureUnit::getMegawatt();
+ measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status));
+ measureUnitValue = MeasureUnit::getMilliwatt();
+ measureUnit.adoptInstead(MeasureUnit::createWatt(status));
+ measureUnitValue = MeasureUnit::getWatt();
+ measureUnit.adoptInstead(MeasureUnit::createAtmosphere(status));
+ measureUnitValue = MeasureUnit::getAtmosphere();
+ measureUnit.adoptInstead(MeasureUnit::createBar(status));
+ measureUnitValue = MeasureUnit::getBar();
+ measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
+ measureUnitValue = MeasureUnit::getHectopascal();
+ measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
+ measureUnitValue = MeasureUnit::getInchHg();
+ measureUnit.adoptInstead(MeasureUnit::createKilopascal(status));
+ measureUnitValue = MeasureUnit::getKilopascal();
+ measureUnit.adoptInstead(MeasureUnit::createMegapascal(status));
+ measureUnitValue = MeasureUnit::getMegapascal();
+ measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
+ measureUnitValue = MeasureUnit::getMillibar();
+ measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status));
+ measureUnitValue = MeasureUnit::getMillimeterOfMercury();
+ measureUnit.adoptInstead(MeasureUnit::createPascal(status));
+ measureUnitValue = MeasureUnit::getPascal();
+ measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status));
+ measureUnitValue = MeasureUnit::getPoundPerSquareInch();
+ measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
+ measureUnitValue = MeasureUnit::getKilometerPerHour();
+ measureUnit.adoptInstead(MeasureUnit::createKnot(status));
+ measureUnitValue = MeasureUnit::getKnot();
+ measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
+ measureUnitValue = MeasureUnit::getMeterPerSecond();
+ measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
+ measureUnitValue = MeasureUnit::getMilePerHour();
+ measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
+ measureUnitValue = MeasureUnit::getCelsius();
+ measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
+ measureUnitValue = MeasureUnit::getFahrenheit();
+ measureUnit.adoptInstead(MeasureUnit::createGenericTemperature(status));
+ measureUnitValue = MeasureUnit::getGenericTemperature();
+ measureUnit.adoptInstead(MeasureUnit::createKelvin(status));
+ measureUnitValue = MeasureUnit::getKelvin();
+ measureUnit.adoptInstead(MeasureUnit::createNewtonMeter(status));
+ measureUnitValue = MeasureUnit::getNewtonMeter();
+ measureUnit.adoptInstead(MeasureUnit::createPoundFoot(status));
+ measureUnitValue = MeasureUnit::getPoundFoot();
+ measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status));
+ measureUnitValue = MeasureUnit::getAcreFoot();
+ measureUnit.adoptInstead(MeasureUnit::createBarrel(status));
+ measureUnitValue = MeasureUnit::getBarrel();
+ measureUnit.adoptInstead(MeasureUnit::createBushel(status));
+ measureUnitValue = MeasureUnit::getBushel();
+ measureUnit.adoptInstead(MeasureUnit::createCentiliter(status));
+ measureUnitValue = MeasureUnit::getCentiliter();
+ measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status));
+ measureUnitValue = MeasureUnit::getCubicCentimeter();
+ measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status));
+ measureUnitValue = MeasureUnit::getCubicFoot();
+ measureUnit.adoptInstead(MeasureUnit::createCubicInch(status));
+ measureUnitValue = MeasureUnit::getCubicInch();
+ measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
+ measureUnitValue = MeasureUnit::getCubicKilometer();
+ measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status));
+ measureUnitValue = MeasureUnit::getCubicMeter();
+ measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
+ measureUnitValue = MeasureUnit::getCubicMile();
+ measureUnit.adoptInstead(MeasureUnit::createCubicYard(status));
+ measureUnitValue = MeasureUnit::getCubicYard();
+ measureUnit.adoptInstead(MeasureUnit::createCup(status));
+ measureUnitValue = MeasureUnit::getCup();
+ measureUnit.adoptInstead(MeasureUnit::createCupMetric(status));
+ measureUnitValue = MeasureUnit::getCupMetric();
+ measureUnit.adoptInstead(MeasureUnit::createDeciliter(status));
+ measureUnitValue = MeasureUnit::getDeciliter();
+ measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status));
+ measureUnitValue = MeasureUnit::getFluidOunce();
+ measureUnit.adoptInstead(MeasureUnit::createFluidOunceImperial(status));
+ measureUnitValue = MeasureUnit::getFluidOunceImperial();
+ measureUnit.adoptInstead(MeasureUnit::createGallon(status));
+ measureUnitValue = MeasureUnit::getGallon();
+ measureUnit.adoptInstead(MeasureUnit::createGallonImperial(status));
+ measureUnitValue = MeasureUnit::getGallonImperial();
+ measureUnit.adoptInstead(MeasureUnit::createHectoliter(status));
+ measureUnitValue = MeasureUnit::getHectoliter();
+ measureUnit.adoptInstead(MeasureUnit::createLiter(status));
+ measureUnitValue = MeasureUnit::getLiter();
+ measureUnit.adoptInstead(MeasureUnit::createMegaliter(status));
+ measureUnitValue = MeasureUnit::getMegaliter();
+ measureUnit.adoptInstead(MeasureUnit::createMilliliter(status));
+ measureUnitValue = MeasureUnit::getMilliliter();
+ measureUnit.adoptInstead(MeasureUnit::createPint(status));
+ measureUnitValue = MeasureUnit::getPint();
+ measureUnit.adoptInstead(MeasureUnit::createPintMetric(status));
+ measureUnitValue = MeasureUnit::getPintMetric();
+ measureUnit.adoptInstead(MeasureUnit::createQuart(status));
+ measureUnitValue = MeasureUnit::getQuart();
+ measureUnit.adoptInstead(MeasureUnit::createTablespoon(status));
+ measureUnitValue = MeasureUnit::getTablespoon();
+ measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status));
+ measureUnitValue = MeasureUnit::getTeaspoon();
+ assertSuccess("", status);
+}
+
void MeasureFormatTest::TestBasic() {
UErrorCode status = U_ZERO_ERROR;
MeasureUnit *ptr1 = MeasureUnit::createArcMinute(status);
@@ -1206,7 +1897,7 @@ void MeasureFormatTest::TestBasic() {
if (!(*ptr1 != *ptr3)) {
errln("Expect != to work.");
}
- MeasureUnit *ptr4 = (MeasureUnit *) ptr1->clone();
+ MeasureUnit *ptr4 = ptr1->clone();
if (*ptr1 != *ptr4) {
errln("Expect clone to work.");
}
@@ -1362,6 +2053,10 @@ void MeasureFormatTest::TestExamplesInDocs() {
void MeasureFormatTest::TestFormatPeriodEn() {
UErrorCode status = U_ZERO_ERROR;
+ Measure t_1y[] = {Measure((double)1, MeasureUnit::createYear(status), status)};
+ Measure t_5M[] = {Measure((double)5, MeasureUnit::createMonth(status), status)};
+ Measure t_4d[] = {Measure((double)4, MeasureUnit::createDay(status), status)};
+ Measure t_2h[] = {Measure((double)2, MeasureUnit::createHour(status), status)};
Measure t_19m[] = {Measure((double)19, MeasureUnit::createMinute(status), status)};
Measure t_1h_23_5s[] = {
Measure((double)1.0, MeasureUnit::createHour(status), status),
@@ -1504,6 +2199,46 @@ void MeasureFormatTest::TestFormatPeriodEn() {
{t_6h_56_92m, UPRV_LENGTHOF(t_6h_56_92m), "6:56,92"},
{t_3h_5h, UPRV_LENGTHOF(t_3h_5h), "3 Std., 5 Std."}};
+ ExpectedResult numericDataBn[] = {
+ {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "\\u09E7:\\u09EB\\u09EF.\\u09EF\\u09EF\\u09EF\\u09EC"},
+ {t_19m, UPRV_LENGTHOF(t_19m), "\\u09E7\\u09EF \\u09AE\\u09BF\\u0983"},
+ {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "\\u09E7:\\u09E6\\u09E6:\\u09E8\\u09E9.\\u09EB"},
+ {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "\\u09E7:\\u09E6\\u09E6:\\u09E8\\u09E9"},
+ {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "\\u09E7:\\u09E8\\u09E9.\\u09EB"},
+ {t_5h_17m, UPRV_LENGTHOF(t_5h_17m), "\\u09EB:\\u09E7\\u09ED"},
+ {t_19m_28s, UPRV_LENGTHOF(t_19m_28s), "\\u09E7\\u09EF:\\u09E8\\u09EE"},
+ {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "\\u09E8 \\u09AC\\u099B\\u09B0, \\u09EB \\u09AE\\u09BE\\u09B8, \\u09E9 \\u09B8\\u09AA\\u09CD\\u09A4\\u09BE\\u09B9, \\u09EA \\u09A6\\u09BF\\u09A8"},
+ {t_0h_0m_17s, UPRV_LENGTHOF(t_0h_0m_17s), "\\u09E6:\\u09E6\\u09E6:\\u09E7\\u09ED"},
+ {t_6h_56_92m, UPRV_LENGTHOF(t_6h_56_92m), "\\u09EC:\\u09EB\\u09EC.\\u09EF\\u09E8"},
+ {t_3h_5h, UPRV_LENGTHOF(t_3h_5h), "\\u09E9 \\u0998\\u0983, \\u09EB \\u0998\\u0983"}};
+
+ ExpectedResult numericDataBnLatn[] = {
+ {t_1m_59_9996s, UPRV_LENGTHOF(t_1m_59_9996s), "1:59.9996"},
+ {t_19m, UPRV_LENGTHOF(t_19m), "19 \\u09AE\\u09BF\\u0983"},
+ {t_1h_23_5s, UPRV_LENGTHOF(t_1h_23_5s), "1:00:23.5"},
+ {t_1h_0m_23s, UPRV_LENGTHOF(t_1h_0m_23s), "1:00:23"},
+ {t_1h_23_5m, UPRV_LENGTHOF(t_1h_23_5m), "1:23.5"},
+ {t_5h_17m, UPRV_LENGTHOF(t_5h_17m), "5:17"},
+ {t_19m_28s, UPRV_LENGTHOF(t_19m_28s), "19:28"},
+ {t_2y_5M_3w_4d, UPRV_LENGTHOF(t_2y_5M_3w_4d), "2 \\u09AC\\u099B\\u09B0, 5 \\u09AE\\u09BE\\u09B8, 3 \\u09B8\\u09AA\\u09CD\\u09A4\\u09BE\\u09B9, 4 \\u09A6\\u09BF\\u09A8"},
+ {t_0h_0m_17s, UPRV_LENGTHOF(t_0h_0m_17s), "0:00:17"},
+ {t_6h_56_92m, UPRV_LENGTHOF(t_6h_56_92m), "6:56.92"},
+ {t_3h_5h, UPRV_LENGTHOF(t_3h_5h), "3 \\u0998\\u0983, 5 \\u0998\\u0983"}};
+
+ ExpectedResult fullDataSpellout[] = {
+ {t_1y, UPRV_LENGTHOF(t_1y), "one year"},
+ {t_5M, UPRV_LENGTHOF(t_5M), "five months"},
+ {t_4d, UPRV_LENGTHOF(t_4d), "four days"},
+ {t_2h, UPRV_LENGTHOF(t_2h), "two hours"},
+ {t_19m, UPRV_LENGTHOF(t_19m), "nineteen minutes"}};
+
+ ExpectedResult fullDataSpelloutFr[] = {
+ {t_1y, UPRV_LENGTHOF(t_1y), "un\\u00A0an"},
+ {t_5M, UPRV_LENGTHOF(t_5M), "cinq\\u00A0mois"},
+ {t_4d, UPRV_LENGTHOF(t_4d), "quatre\\u00A0jours"},
+ {t_2h, UPRV_LENGTHOF(t_2h), "deux\\u00A0heures"},
+ {t_19m, UPRV_LENGTHOF(t_19m), "dix-neuf minutes"}};
+
Locale en(Locale::getEnglish());
LocalPointer<NumberFormat> nf(NumberFormat::createInstance(en, status));
if (U_FAILURE(status)) {
@@ -1511,7 +2246,7 @@ void MeasureFormatTest::TestFormatPeriodEn() {
return;
}
nf->setMaximumFractionDigits(4);
- MeasureFormat mf(en, UMEASFMT_WIDTH_WIDE, (NumberFormat *) nf->clone(), status);
+ MeasureFormat mf(en, UMEASFMT_WIDTH_WIDE, nf->clone(), status);
if (!assertSuccess("Error creating measure format en WIDE", status)) {
return;
}
@@ -1524,21 +2259,21 @@ void MeasureFormatTest::TestFormatPeriodEn() {
}
// exercise clone
{
- MeasureFormat *mf3 = (MeasureFormat *) mf.clone();
+ MeasureFormat *mf3 = mf.clone();
verifyFormat("en WIDE copy", *mf3, fullData, UPRV_LENGTHOF(fullData));
delete mf3;
}
- mf = MeasureFormat(en, UMEASFMT_WIDTH_SHORT, (NumberFormat *) nf->clone(), status);
+ mf = MeasureFormat(en, UMEASFMT_WIDTH_SHORT, nf->clone(), status);
if (!assertSuccess("Error creating measure format en SHORT", status)) {
return;
}
verifyFormat("en SHORT", mf, abbrevData, UPRV_LENGTHOF(abbrevData));
- mf = MeasureFormat(en, UMEASFMT_WIDTH_NARROW, (NumberFormat *) nf->clone(), status);
+ mf = MeasureFormat(en, UMEASFMT_WIDTH_NARROW, nf->clone(), status);
if (!assertSuccess("Error creating measure format en NARROW", status)) {
return;
}
verifyFormat("en NARROW", mf, narrowData, UPRV_LENGTHOF(narrowData));
- mf = MeasureFormat(en, UMEASFMT_WIDTH_NUMERIC, (NumberFormat *) nf->clone(), status);
+ mf = MeasureFormat(en, UMEASFMT_WIDTH_NUMERIC, nf->clone(), status);
if (!assertSuccess("Error creating measure format en NUMERIC", status)) {
return;
}
@@ -1550,16 +2285,64 @@ void MeasureFormatTest::TestFormatPeriodEn() {
return;
}
nf->setMaximumFractionDigits(4);
- mf = MeasureFormat(de, UMEASFMT_WIDTH_WIDE, (NumberFormat *) nf->clone(), status);
+ mf = MeasureFormat(de, UMEASFMT_WIDTH_WIDE, nf->clone(), status);
if (!assertSuccess("Error creating measure format de WIDE", status)) {
return;
}
verifyFormat("de WIDE", mf, fullDataDe, UPRV_LENGTHOF(fullDataDe));
- mf = MeasureFormat(de, UMEASFMT_WIDTH_NUMERIC, (NumberFormat *) nf->clone(), status);
+ mf = MeasureFormat(de, UMEASFMT_WIDTH_NUMERIC, nf->clone(), status);
if (!assertSuccess("Error creating measure format de NUMERIC", status)) {
return;
}
verifyFormat("de NUMERIC", mf, numericDataDe, UPRV_LENGTHOF(numericDataDe));
+
+ Locale bengali("bn");
+ nf.adoptInstead(NumberFormat::createInstance(bengali, status));
+ if (!assertSuccess("Error creating number format de object", status)) {
+ return;
+ }
+ nf->setMaximumFractionDigits(4);
+ mf = MeasureFormat(bengali, UMEASFMT_WIDTH_NUMERIC, nf->clone(), status);
+ if (!assertSuccess("Error creating measure format bn NUMERIC", status)) {
+ return;
+ }
+ verifyFormat("bn NUMERIC", mf, numericDataBn, UPRV_LENGTHOF(numericDataBn));
+
+ Locale bengaliLatin("bn-u-nu-latn");
+ nf.adoptInstead(NumberFormat::createInstance(bengaliLatin, status));
+ if (!assertSuccess("Error creating number format de object", status)) {
+ return;
+ }
+ nf->setMaximumFractionDigits(4);
+ mf = MeasureFormat(bengaliLatin, UMEASFMT_WIDTH_NUMERIC, nf->clone(), status);
+ if (!assertSuccess("Error creating measure format bn-u-nu-latn NUMERIC", status)) {
+ return;
+ }
+ verifyFormat("bn-u-nu-latn NUMERIC", mf, numericDataBnLatn, UPRV_LENGTHOF(numericDataBnLatn));
+
+ status = U_ZERO_ERROR;
+ LocalPointer<RuleBasedNumberFormat> rbnf(new RuleBasedNumberFormat(URBNF_SPELLOUT, en, status));
+ if (U_FAILURE(status)) {
+ dataerrln("Error creating rbnf en object - %s", u_errorName(status));
+ return;
+ }
+ mf = MeasureFormat(en, UMEASFMT_WIDTH_WIDE, rbnf->clone(), status);
+ if (!assertSuccess("Error creating measure format en WIDE with rbnf", status)) {
+ return;
+ }
+ verifyFormat("en WIDE rbnf", mf, fullDataSpellout, UPRV_LENGTHOF(fullDataSpellout));
+
+ Locale fr(Locale::getFrench());
+ LocalPointer<RuleBasedNumberFormat> rbnffr(new RuleBasedNumberFormat(URBNF_SPELLOUT, fr, status));
+ if (U_FAILURE(status)) {
+ dataerrln("Error creating rbnf fr object - %s", u_errorName(status));
+ return;
+ }
+ mf = MeasureFormat(fr, UMEASFMT_WIDTH_WIDE, rbnffr->clone(), status);
+ if (!assertSuccess("Error creating measure format fr WIDE with rbnf", status)) {
+ return;
+ }
+ verifyFormat("fr WIDE rbnf", mf, fullDataSpelloutFr, UPRV_LENGTHOF(fullDataSpellout));
}
void MeasureFormatTest::Test10219FractionalPlurals() {
@@ -1634,7 +2417,7 @@ void MeasureFormatTest::TestGreek() {
"1 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B1",
"1 \\u03B5\\u03B2\\u03B4.",
"1 \\u03BC\\u03AE\\u03BD.",
- "1 \\u03AD\\u03C4.", // year (one)
+ "1 \\u03AD\\u03C4.", // year (one)
// "el_GR" 7 wide
"7 \\u03B4\\u03B5\\u03C5\\u03C4\\u03B5\\u03C1\\u03CC\\u03BB\\u03B5\\u03C0\\u03C4\\u03B1",
"7 \\u03BB\\u03B5\\u03C0\\u03C4\\u03AC",
@@ -1646,7 +2429,7 @@ void MeasureFormatTest::TestGreek() {
// "el_GR" 7 short
"7 \\u03B4\\u03B5\\u03C5\\u03C4.",
"7 \\u03BB\\u03B5\\u03C0.",
- "7 \\u03CE\\u03C1.", // hour (other)
+ "7 \\u03CE\\u03C1.", // hour (other)
"7 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B5\\u03C2",
"7 \\u03B5\\u03B2\\u03B4.",
"7 \\u03BC\\u03AE\\u03BD.",
@@ -1667,7 +2450,7 @@ void MeasureFormatTest::TestGreek() {
"1 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B1",
"1 \\u03B5\\u03B2\\u03B4.",
"1 \\u03BC\\u03AE\\u03BD.",
- "1 \\u03AD\\u03C4.", // year (one)
+ "1 \\u03AD\\u03C4.", // year (one)
// "el" 7 wide
"7 \\u03B4\\u03B5\\u03C5\\u03C4\\u03B5\\u03C1\\u03CC\\u03BB\\u03B5\\u03C0\\u03C4\\u03B1",
"7 \\u03BB\\u03B5\\u03C0\\u03C4\\u03AC",
@@ -1679,7 +2462,7 @@ void MeasureFormatTest::TestGreek() {
// "el" 7 short
"7 \\u03B4\\u03B5\\u03C5\\u03C4.",
"7 \\u03BB\\u03B5\\u03C0.",
- "7 \\u03CE\\u03C1.", // hour (other)
+ "7 \\u03CE\\u03C1.", // hour (other)
"7 \\u03B7\\u03BC\\u03AD\\u03C1\\u03B5\\u03C2",
"7 \\u03B5\\u03B2\\u03B4.",
"7 \\u03BC\\u03AE\\u03BD.",
@@ -1861,7 +2644,7 @@ void MeasureFormatTest::helperTestSimplePer(
if (!assertSuccess("Error creating format object", status)) {
return;
}
- Measure measure(value, (MeasureUnit *) unit.clone(), status);
+ Measure measure(value, unit.clone(), status);
if (!assertSuccess("Error creating measure object", status)) {
return;
}
@@ -1934,7 +2717,7 @@ void MeasureFormatTest::TestManyLocaleDurations() {
if (!assertSuccess("Error creating measures", status)) {
return;
}
- helperTestManyLocaleDurations("da", UMEASFMT_WIDTH_NARROW, measures, UPRV_LENGTHOF(measures), "5 t og 37 min");
+ helperTestManyLocaleDurations("da", UMEASFMT_WIDTH_NARROW, measures, UPRV_LENGTHOF(measures), "5 t og 37 m");
helperTestManyLocaleDurations("da", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5.37");
helperTestManyLocaleDurations("de", UMEASFMT_WIDTH_NARROW, measures, UPRV_LENGTHOF(measures), "5 Std., 37 Min.");
helperTestManyLocaleDurations("de", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
@@ -1942,11 +2725,11 @@ void MeasureFormatTest::TestManyLocaleDurations() {
helperTestManyLocaleDurations("en", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
helperTestManyLocaleDurations("en_GB", UMEASFMT_WIDTH_NARROW, measures, UPRV_LENGTHOF(measures), "5h 37m");
helperTestManyLocaleDurations("en_GB", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
- helperTestManyLocaleDurations("es", UMEASFMT_WIDTH_NARROW, measures, UPRV_LENGTHOF(measures), "5h 37min");
+ helperTestManyLocaleDurations("es", UMEASFMT_WIDTH_NARROW, measures, UPRV_LENGTHOF(measures), "5 h 37 min");
helperTestManyLocaleDurations("es", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
helperTestManyLocaleDurations("fi", UMEASFMT_WIDTH_NARROW, measures, UPRV_LENGTHOF(measures), "5t 37min");
helperTestManyLocaleDurations("fi", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5.37");
- helperTestManyLocaleDurations("fr", UMEASFMT_WIDTH_NARROW, measures, UPRV_LENGTHOF(measures), "5h 37\\u202Fmin");
+ helperTestManyLocaleDurations("fr", UMEASFMT_WIDTH_NARROW, measures, UPRV_LENGTHOF(measures), "5h 37min");
helperTestManyLocaleDurations("fr", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
helperTestManyLocaleDurations("is", UMEASFMT_WIDTH_NARROW, measures, UPRV_LENGTHOF(measures), "5 klst. og 37 m\\u00EDn.");
helperTestManyLocaleDurations("is", UMEASFMT_WIDTH_NUMERIC, measures, UPRV_LENGTHOF(measures), "5:37");
@@ -2328,6 +3111,111 @@ void MeasureFormatTest::TestIndividualPluralFallback() {
assertEquals("2 deg temp in fr_CA", expected, mf.format(twoDeg.orphan(), actual, errorCode), TRUE);
}
+void MeasureFormatTest::Test20332_PersonUnits() {
+ IcuTestErrorCode status(*this, "Test20332_PersonUnits");
+ const struct TestCase {
+ const char* locale;
+ MeasureUnit* unitToAdopt;
+ UMeasureFormatWidth width;
+ const char* expected;
+ } cases[] = {
+ {"en-us", MeasureUnit::createYearPerson(status), UMEASFMT_WIDTH_NARROW, "25y"},
+ {"en-us", MeasureUnit::createYearPerson(status), UMEASFMT_WIDTH_SHORT, "25 yrs"},
+ {"en-us", MeasureUnit::createYearPerson(status), UMEASFMT_WIDTH_WIDE, "25 years"},
+ {"en-us", MeasureUnit::createMonthPerson(status), UMEASFMT_WIDTH_NARROW, "25m"},
+ {"en-us", MeasureUnit::createMonthPerson(status), UMEASFMT_WIDTH_SHORT, "25 mths"},
+ {"en-us", MeasureUnit::createMonthPerson(status), UMEASFMT_WIDTH_WIDE, "25 months"},
+ {"en-us", MeasureUnit::createWeekPerson(status), UMEASFMT_WIDTH_NARROW, "25w"},
+ {"en-us", MeasureUnit::createWeekPerson(status), UMEASFMT_WIDTH_SHORT, "25 wks"},
+ {"en-us", MeasureUnit::createWeekPerson(status), UMEASFMT_WIDTH_WIDE, "25 weeks"},
+ {"en-us", MeasureUnit::createDayPerson(status), UMEASFMT_WIDTH_NARROW, "25d"},
+ {"en-us", MeasureUnit::createDayPerson(status), UMEASFMT_WIDTH_SHORT, "25 days"},
+ {"en-us", MeasureUnit::createDayPerson(status), UMEASFMT_WIDTH_WIDE, "25 days"}
+ };
+ for (const auto& cas : cases) {
+ MeasureFormat mf(cas.locale, cas.width, status);
+ if (status.errIfFailureAndReset()) { return; }
+ Measure measure(25, cas.unitToAdopt, status);
+ if (status.errIfFailureAndReset()) { return; }
+ verifyFormat(cas.locale, mf, &measure, 1, cas.expected);
+ }
+}
+
+void MeasureFormatTest::TestNumericTime() {
+ IcuTestErrorCode status(*this, "TestNumericTime");
+
+ MeasureFormat fmt("en", UMEASFMT_WIDTH_NUMERIC, status);
+
+ Measure hours(112, MeasureUnit::createHour(status), status);
+ Measure minutes(113, MeasureUnit::createMinute(status), status);
+ Measure seconds(114, MeasureUnit::createSecond(status), status);
+ Measure fhours(112.8765, MeasureUnit::createHour(status), status);
+ Measure fminutes(113.8765, MeasureUnit::createMinute(status), status);
+ Measure fseconds(114.8765, MeasureUnit::createSecond(status), status);
+ if (status.errDataIfFailureAndReset(WHERE)) return;
+
+ verifyFormat("hours", fmt, &hours, 1, "112h");
+ verifyFormat("minutes", fmt, &minutes, 1, "113m");
+ verifyFormat("seconds", fmt, &seconds, 1, "114s");
+
+ verifyFormat("fhours", fmt, &fhours, 1, "112.876h");
+ verifyFormat("fminutes", fmt, &fminutes, 1, "113.876m");
+ verifyFormat("fseconds", fmt, &fseconds, 1, "114.876s");
+
+ Measure hoursMinutes[2] = {hours, minutes};
+ verifyFormat("hoursMinutes", fmt, hoursMinutes, 2, "112:113");
+ Measure hoursSeconds[2] = {hours, seconds};
+ verifyFormat("hoursSeconds", fmt, hoursSeconds, 2, "112:00:114");
+ Measure minutesSeconds[2] = {minutes, seconds};
+ verifyFormat("minutesSeconds", fmt, minutesSeconds, 2, "113:114");
+
+ Measure hoursFminutes[2] = {hours, fminutes};
+ verifyFormat("hoursFminutes", fmt, hoursFminutes, 2, "112:113.876");
+ Measure hoursFseconds[2] = {hours, fseconds};
+ verifyFormat("hoursFseconds", fmt, hoursFseconds, 2, "112:00:114.876");
+ Measure minutesFseconds[2] = {minutes, fseconds};
+ verifyFormat("hoursMminutesFsecondsinutes", fmt, minutesFseconds, 2, "113:114.876");
+
+ Measure fhoursMinutes[2] = {fhours, minutes};
+ verifyFormat("fhoursMinutes", fmt, fhoursMinutes, 2, "112:113");
+ Measure fhoursSeconds[2] = {fhours, seconds};
+ verifyFormat("fhoursSeconds", fmt, fhoursSeconds, 2, "112:00:114");
+ Measure fminutesSeconds[2] = {fminutes, seconds};
+ verifyFormat("fminutesSeconds", fmt, fminutesSeconds, 2, "113:114");
+
+ Measure fhoursFminutes[2] = {fhours, fminutes};
+ verifyFormat("fhoursFminutes", fmt, fhoursFminutes, 2, "112:113.876");
+ Measure fhoursFseconds[2] = {fhours, fseconds};
+ verifyFormat("fhoursFseconds", fmt, fhoursFseconds, 2, "112:00:114.876");
+ Measure fminutesFseconds[2] = {fminutes, fseconds};
+ verifyFormat("fminutesFseconds", fmt, fminutesFseconds, 2, "113:114.876");
+
+ Measure hoursMinutesSeconds[3] = {hours, minutes, seconds};
+ verifyFormat("hoursMinutesSeconds", fmt, hoursMinutesSeconds, 3, "112:113:114");
+ Measure fhoursFminutesFseconds[3] = {fhours, fminutes, fseconds};
+ verifyFormat("fhoursFminutesFseconds", fmt, fhoursFminutesFseconds, 3, "112:113:114.876");
+}
+
+void MeasureFormatTest::TestNumericTimeSomeSpecialFormats() {
+ IcuTestErrorCode status(*this, "TestNumericTimeSomeSpecialFormats");
+
+ Measure fhours(2.8765432, MeasureUnit::createHour(status), status);
+ Measure fminutes(3.8765432, MeasureUnit::createMinute(status), status);
+ if (status.errDataIfFailureAndReset(WHERE)) return;
+
+ Measure fhoursFminutes[2] = {fhours, fminutes};
+
+ // Latvian is one of the very few locales 0-padding the hour
+ MeasureFormat fmtLt("lt", UMEASFMT_WIDTH_NUMERIC, status);
+ if (status.errDataIfFailureAndReset(WHERE)) return;
+ verifyFormat("Latvian fhoursFminutes", fmtLt, fhoursFminutes, 2, "02:03,877");
+
+ // Danish is one of the very few locales using '.' as separator
+ MeasureFormat fmtDa("da", UMEASFMT_WIDTH_NUMERIC, status);
+ verifyFormat("Danish fhoursFminutes", fmtDa, fhoursFminutes, 2, "2.03,877");
+}
+
+
void MeasureFormatTest::verifyFieldPosition(
const char *description,
const MeasureFormat &fmt,
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/miscdtfm.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/miscdtfm.cpp
index a623326a1d6..134f9136834 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/miscdtfm.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/miscdtfm.cpp
@@ -113,8 +113,8 @@ DateFormatMiscTests::test4097450()
};*/
UErrorCode status = U_ZERO_ERROR;
- SimpleDateFormat *formatter;
- SimpleDateFormat *resultFormatter = new SimpleDateFormat((UnicodeString)"yyyy", status);
+ LocalPointer<SimpleDateFormat> formatter;
+ SimpleDateFormat resultFormatter((UnicodeString)u"yyyy", status);
if (U_FAILURE(status)) {
dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status));
return;
@@ -125,24 +125,21 @@ DateFormatMiscTests::test4097450()
for (int i = 0; i < 14/*dstring.length*/; i++)
{
log(dformat[i] + "\t" + dstring[i] + "\t");
- formatter = new SimpleDateFormat(dformat[i], status);
+ formatter.adoptInstead(new SimpleDateFormat(dformat[i], status));
if(failure(status, "new SimpleDateFormat")) return;
//try {
UnicodeString str;
FieldPosition pos(FieldPosition::DONT_CARE);
- logln(resultFormatter->format(formatter->parse(dstring[i], status), str, pos));
- failure(status, "resultFormatter->format");
+ logln(resultFormatter.format(formatter->parse(dstring[i], status), str, pos));
+ failure(status, "resultFormatter.format");
//if ( !dresult[i] ) System.out.print(" <-- error!");
/*}
catch (ParseException exception) {
//if ( dresult[i] ) System.out.print(" <-- error!");
System.out.print("exception --> " + exception);
}*/
- delete formatter;
logln();
}
-
- delete resultFormatter;
}
/*
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/msfmrgts.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/msfmrgts.cpp
index 78ec942e8b7..1b83b10876d 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/msfmrgts.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/msfmrgts.cpp
@@ -1,11 +1,11 @@
// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/***********************************************************************
- * COPYRIGHT:
+ * COPYRIGHT:
* Copyright (c) 1997-2016, International Business Machines Corporation
* and others. All Rights Reserved.
***********************************************************************/
-
+
#include "unicode/utypes.h"
#if !UCONFIG_NO_FORMATTING
@@ -32,32 +32,33 @@ void
MessageFormatRegressionTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
{
TESTCASE_AUTO_BEGIN;
- TESTCASE_AUTO(Test4074764)
+ TESTCASE_AUTO(Test4074764);
//TESTCASE_AUTO(Test4058973) -- disabled/obsolete in ICU 4.8
- TESTCASE_AUTO(Test4031438)
- TESTCASE_AUTO(Test4052223)
- TESTCASE_AUTO(Test4104976)
- TESTCASE_AUTO(Test4106659)
- TESTCASE_AUTO(Test4106660)
- TESTCASE_AUTO(Test4111739)
- TESTCASE_AUTO(Test4114743)
- TESTCASE_AUTO(Test4116444)
- TESTCASE_AUTO(Test4114739)
- TESTCASE_AUTO(Test4113018)
- TESTCASE_AUTO(Test4106661)
- TESTCASE_AUTO(Test4094906)
- TESTCASE_AUTO(Test4118592)
- TESTCASE_AUTO(Test4118594)
- TESTCASE_AUTO(Test4105380)
- TESTCASE_AUTO(Test4120552)
- TESTCASE_AUTO(Test4142938)
- TESTCASE_AUTO(TestChoicePatternQuote)
- TESTCASE_AUTO(Test4112104)
- TESTCASE_AUTO(TestAPI)
+ TESTCASE_AUTO(Test4031438);
+ TESTCASE_AUTO(Test4052223);
+ TESTCASE_AUTO(Test4104976);
+ TESTCASE_AUTO(Test4106659);
+ TESTCASE_AUTO(Test4106660);
+ TESTCASE_AUTO(Test4111739);
+ TESTCASE_AUTO(Test4114743);
+ TESTCASE_AUTO(Test4116444);
+ TESTCASE_AUTO(Test4114739);
+ TESTCASE_AUTO(Test4113018);
+ TESTCASE_AUTO(Test4106661);
+ TESTCASE_AUTO(Test4094906);
+ TESTCASE_AUTO(Test4118592);
+ TESTCASE_AUTO(Test4118594);
+ TESTCASE_AUTO(Test4105380);
+ TESTCASE_AUTO(Test4120552);
+ TESTCASE_AUTO(Test4142938);
+ TESTCASE_AUTO(TestChoicePatternQuote);
+ TESTCASE_AUTO(Test4112104);
+ TESTCASE_AUTO(TestICU12584);
+ TESTCASE_AUTO(TestAPI);
TESTCASE_AUTO_END;
}
-UBool
+UBool
MessageFormatRegressionTest::failure(UErrorCode status, const char* msg, UBool possibleDataError)
{
if(U_FAILURE(status)) {
@@ -98,7 +99,7 @@ void MessageFormatRegressionTest::Test4074764() {
failure(status, "messageFormat->applyPattern");
//Object[] params = {new UnicodeString("BUG"), new Date()};
Formattable params [] = {
- Formattable(UnicodeString("BUG")),
+ Formattable(UnicodeString("BUG")),
Formattable(0, Formattable::kIsDate)
};
UnicodeString tempBuffer;
@@ -111,14 +112,14 @@ void MessageFormatRegressionTest::Test4074764() {
//Apply pattern without param and print the result
messageFormatter->applyPattern(pattern[0], status);
failure(status, "messageFormatter->applyPattern");
-
+
// {sfb} how much does this apply in C++?
// do we want to verify that the Formattable* array is not NULL,
// or is that the user's responsibility?
// additionally, what should be the item count?
// for bug testing purposes, assume that something was set to
// NULL by mistake, and that the length should be non-zero
-
+
//tempBuffer = messageFormatter->format(NULL, 1, tempBuffer, FieldPosition(FieldPosition::DONT_CARE), status);
tempBuffer.remove();
tempBuffer = messageFormatter->format(NULL, 0, tempBuffer, pos, status);
@@ -175,16 +176,16 @@ void MessageFormatRegressionTest::Test4058973()
/* @bug 4031438
* More robust message formats.
*/
-void MessageFormatRegressionTest::Test4031438()
+void MessageFormatRegressionTest::Test4031438()
{
UErrorCode status = U_ZERO_ERROR;
-
+
UnicodeString pattern1("Impossible {1} has occurred -- status code is {0} and message is {2}.");
UnicodeString pattern2("Double '' Quotes {0} test and quoted '{1}' test plus 'other {2} stuff'.");
MessageFormat *messageFormatter = new MessageFormat("", status);
failure(status, "new MessageFormat");
-
+
const UBool possibleDataError = TRUE;
//try {
@@ -209,9 +210,9 @@ void MessageFormatRegressionTest::Test4031438()
NumberFormat *fmt = 0;
UnicodeString temp, temp1;
-
+
for (int i = 0; i < count; i++) {
-
+
// convert to string if not already
Formattable obj = objs[i];
temp.remove();
@@ -245,13 +246,13 @@ void MessageFormatRegressionTest::Test4031438()
//if (objs[i] != NULL && objs[i].getString(temp1) != params[i].getString(temp2)) {
if (temp != temp1) {
errln("Parse failed on object " + objs[i].getString(temp1) + " at index : " + i);
- }
+ }
}
delete fmt;
delete [] objs;
- // {sfb} does this apply? no way to really pass a null Formattable,
+ // {sfb} does this apply? no way to really pass a null Formattable,
// only a null array
/*tempBuffer = messageFormatter->format(null, tempBuffer, FieldPosition(FieldPosition::DONT_CARE), status);
@@ -266,7 +267,7 @@ void MessageFormatRegressionTest::Test4031438()
if (tempBuffer != "Double ' Quotes 7 test and quoted {1} test plus 'other {2} stuff'.")
dataerrln("quote format test (w/ params) failed. - %s", u_errorName(status));
logln("Formatted with params : " + tempBuffer);
-
+
/*tempBuffer = messageFormatter->format(null);
if (!tempBuffer.equals("Double ' Quotes {0} test and quoted {1} test plus other {2} stuff."))
errln("quote format test (w/ null) failed.");
@@ -290,7 +291,7 @@ void MessageFormatRegressionTest::Test4052223()
MessageFormat *fmt = new MessageFormat("There are {0} apples growing on the {1} tree.", status);
failure(status, "new MessageFormat");
UnicodeString str("There is one apple growing on the peach tree.");
-
+
int32_t count = 0;
fmt->parse(str, pos, count);
@@ -300,27 +301,27 @@ void MessageFormatRegressionTest::Test4052223()
pos.setErrorIndex(4);
if (pos.getErrorIndex() != 4)
errln(UnicodeString("setErrorIndex failed, got ") + pos.getErrorIndex() + " instead of 4");
-
+
ChoiceFormat *f = new ChoiceFormat(
"-1#are negative|0#are no or fraction|1#is one|1.0<is 1+|2#are two|2<are more than 2.", status);
failure(status, "new ChoiceFormat");
- pos.setIndex(0);
+ pos.setIndex(0);
pos.setErrorIndex(-1);
Formattable obj;
f->parse("are negative", obj, pos);
if (pos.getErrorIndex() != -1 && obj.getDouble() == -1.0)
errln(UnicodeString("Parse with \"are negative\" failed, at ") + pos.getErrorIndex());
- pos.setIndex(0);
+ pos.setIndex(0);
pos.setErrorIndex(-1);
f->parse("are no or fraction ", obj, pos);
if (pos.getErrorIndex() != -1 && obj.getDouble() == 0.0)
errln(UnicodeString("Parse with \"are no or fraction\" failed, at ") + pos.getErrorIndex());
- pos.setIndex(0);
+ pos.setIndex(0);
pos.setErrorIndex(-1);
f->parse("go postal", obj, pos);
if (pos.getErrorIndex() == -1 && ! uprv_isNaN(obj.getDouble()))
errln(UnicodeString("Parse with \"go postal\" failed, at ") + pos.getErrorIndex());
-
+
delete fmt;
delete f;
}
@@ -334,7 +335,7 @@ void MessageFormatRegressionTest::Test4104976()
{
double limits [] = {1, 20};
UnicodeString formats [] = {
- UnicodeString("xyz"),
+ UnicodeString("xyz"),
UnicodeString("abc")
};
int32_t formats_length = UPRV_LENGTHOF(formats);
@@ -374,7 +375,7 @@ void MessageFormatRegressionTest::Test4106659()
// logln("ChoiceFormat constructor should check for the array lengths");
// cf = null;
//}
- //if (cf != null)
+ //if (cf != null)
// errln(cf->format(5));
//
delete cf;
@@ -390,8 +391,8 @@ void MessageFormatRegressionTest::Test4106660()
{
double limits [] = {3, 1, 2};
UnicodeString formats [] = {
- UnicodeString("Three"),
- UnicodeString("One"),
+ UnicodeString("Three"),
+ UnicodeString("One"),
UnicodeString("Two")
};
ChoiceFormat *cf = new ChoiceFormat(limits, formats, 3);
@@ -475,12 +476,12 @@ void MessageFormatRegressionTest::Test4114743()
void MessageFormatRegressionTest::Test4116444()
{
UnicodeString patterns [] = {
- (UnicodeString)"",
- (UnicodeString)"one",
+ (UnicodeString)"",
+ (UnicodeString)"one",
(UnicodeString) "{0,date,short}"
};
-
- UErrorCode status = U_ZERO_ERROR;
+
+ UErrorCode status = U_ZERO_ERROR;
MessageFormat *mf = new MessageFormat("", status);
failure(status, "new MessageFormat");
@@ -490,7 +491,7 @@ void MessageFormatRegressionTest::Test4116444()
failure(status, "mf->applyPattern", TRUE);
//try {
- int32_t count = 0;
+ int32_t count = 0;
ParsePosition pp(0);
Formattable *array = mf->parse(UnicodeString(""), pp, count);
logln("pattern: \"" + pattern + "\"");
@@ -503,7 +504,7 @@ void MessageFormatRegressionTest::Test4116444()
dataerrln("\"" + array[j].getString(dummy) + "\"");
//else
// log("null");
- if (j < count- 1)
+ if (j < count- 1)
log(",");
}
log("}") ;
@@ -528,7 +529,7 @@ void MessageFormatRegressionTest::Test4116444()
void MessageFormatRegressionTest::Test4114739()
{
- UErrorCode status = U_ZERO_ERROR;
+ UErrorCode status = U_ZERO_ERROR;
MessageFormat *mf = new MessageFormat("<{0}>", status);
failure(status, "new MessageFormat");
@@ -716,7 +717,7 @@ void MessageFormatRegressionTest::Test4118592()
UnicodeString pat;
logln(UnicodeString("") + i + ". pattern :\"" + mf->toPattern(pat) + "\"");
log(" \"" + formatted + "\" parsed as ");
- if (objs == NULL)
+ if (objs == NULL)
logln(" null");
else {
UnicodeString temp;
@@ -805,10 +806,10 @@ void MessageFormatRegressionTest::Test4105380()
form2->setFormat(0, *fileform);
//Object[] testArgs = {new Long(12373), "MyDisk"};
Formattable testArgs [] = {
- Formattable((int32_t)12373),
+ Formattable((int32_t)12373),
Formattable((UnicodeString)"MyDisk")
};
-
+
FieldPosition bogus(FieldPosition::DONT_CARE);
UnicodeString result;
@@ -831,8 +832,8 @@ void MessageFormatRegressionTest::Test4120552()
MessageFormat *mf = new MessageFormat("pattern", status);
failure(status, "new MessageFormat");
UnicodeString texts[] = {
- (UnicodeString)"pattern",
- (UnicodeString)"pat",
+ (UnicodeString)"pattern",
+ (UnicodeString)"pat",
(UnicodeString)"1234"
};
UnicodeString pat;
@@ -861,7 +862,7 @@ void MessageFormatRegressionTest::Test4120552()
* This is actually a problem in ChoiceFormat; it doesn't
* understand single quotes.
*/
-void MessageFormatRegressionTest::Test4142938()
+void MessageFormatRegressionTest::Test4142938()
{
UnicodeString pat = CharsToUnicodeString("''Vous'' {0,choice,0#n''|1#}avez s\\u00E9lectionn\\u00E9 "
"{0,choice,0#aucun|1#{0}} client{0,choice,0#s|1#|2#s} "
@@ -874,7 +875,7 @@ void MessageFormatRegressionTest::Test4142938()
CharsToUnicodeString("'Vous' n'avez s\\u00E9lectionn\\u00E9 aucun clients personnels."),
CharsToUnicodeString("'Vous' avez s\\u00E9lectionn\\u00E9 "),
CharsToUnicodeString("'Vous' avez s\\u00E9lectionn\\u00E9 ")
- };
+ };
UnicodeString SUFFIX [] = {
UnicodeString(),
UNICODE_STRING(" client personnel.", 18),
@@ -914,7 +915,7 @@ void MessageFormatRegressionTest::Test4142938()
* pattern characters '|', '#', '<', and '\u2264'. Two quotes in a row
* is a quote literal.
*/
-void MessageFormatRegressionTest::TestChoicePatternQuote()
+void MessageFormatRegressionTest::TestChoicePatternQuote()
{
// ICU 4.8 ChoiceFormat (like PluralFormat & SelectFormat)
// returns the chosen string unmodified, so that it is usable in a MessageFormat.
@@ -958,7 +959,7 @@ void MessageFormatRegressionTest::TestChoicePatternQuote()
catch (IllegalArgumentException e) {
errln("Fail: Pattern \"" + DATA[i] + "\" -> " + e);
}*/
-
+
delete cf;
delete cf2;
}
@@ -969,7 +970,7 @@ void MessageFormatRegressionTest::TestChoicePatternQuote()
* MessageFormat.equals(null) throws a NullPointerException. The JLS states
* that it should return false.
*/
-void MessageFormatRegressionTest::Test4112104()
+void MessageFormatRegressionTest::Test4112104()
{
UErrorCode status = U_ZERO_ERROR;
MessageFormat *format = new MessageFormat("", status);
@@ -987,11 +988,37 @@ void MessageFormatRegressionTest::Test4112104()
delete format;
}
+void MessageFormatRegressionTest::TestICU12584() {
+ // We were able to handle only 10 due to the bug ICU-12584.
+ UnicodeString pattern(
+ u"{1}{2}{3}{1}{2}{3}{1}{2}{3}{1}{2}{3}{1}{2}{3}{1}{2}{3}{1}{2}{3}{1}"
+ u"{2}{3}{1}{2}{3}{1}{2}{3}{1}{2}{3}{1}{2}{3}{1}{2}{3}{1}{2}{3}");
+
+ UErrorCode status = U_ZERO_ERROR;
+
+ MessageFormat msg(pattern, status);
+ failure(status, "Flat message");
+
+ int32_t count;
+ msg.getFormats(count);
+ assertEquals("Plain placeholder match", 42, count);
+
+ // Make sure we iterate only over top level arguments (so we don't over allocate).
+ UnicodeString inner_pattern("{1}{1,select,fem {1} masc {2} other {3}}{2}");
+ status = U_ZERO_ERROR;
+ MessageFormat inner_msg(inner_pattern, status);
+ failure(status, "Inner message");
+
+ count = 0;
+ inner_msg.getFormats(count);
+ assertEquals("Inner placeholder match", 3, count);
+}
+
void MessageFormatRegressionTest::TestAPI() {
UErrorCode status = U_ZERO_ERROR;
MessageFormat *format = new MessageFormat("", status);
failure(status, "new MessageFormat");
-
+
// Test adoptFormat
MessageFormat *fmt = new MessageFormat("",status);
format->adoptFormat("some_name",fmt,status); // Must at least pass a valid identifier.
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/msfmrgts.h b/Build/source/libs/icu/icu-src/source/test/intltest/msfmrgts.h
index b346c870dac..3330184554d 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/msfmrgts.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/msfmrgts.h
@@ -1,25 +1,25 @@
// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/********************************************************************
- * COPYRIGHT:
+ * COPYRIGHT:
* Copyright (c) 1997-2009, International Business Machines Corporation and
* others. All Rights Reserved.
********************************************************************/
#ifndef _MESSAGEFORMATREGRESSIONTEST_
#define _MESSAGEFORMATREGRESSIONTEST_
-
+
#include "unicode/utypes.h"
#if !UCONFIG_NO_FORMATTING
#include "intltest.h"
-/**
+/**
* Performs regression test for MessageFormat
**/
-class MessageFormatRegressionTest: public IntlTest {
-
+class MessageFormatRegressionTest: public IntlTest {
+
// IntlTest override
void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par );
public:
@@ -45,6 +45,7 @@ public:
void Test4142938(void);
void TestChoicePatternQuote(void);
void Test4112104(void);
+ void TestICU12584(void);
void TestAPI(void);
protected:
@@ -53,6 +54,6 @@ protected:
};
#endif /* #if !UCONFIG_NO_FORMATTING */
-
+
#endif // _MESSAGEFORMATREGRESSIONTEST_
//eof
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/nmfmapts.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/nmfmapts.cpp
index 07b2044610c..e5b69e44a09 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/nmfmapts.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/nmfmapts.cpp
@@ -274,7 +274,7 @@ public:
virtual NumberFormat* createFormat(const Locale& /* loc */, UNumberFormatStyle formatType)
{
if (formatType == UNUM_CURRENCY) {
- return (NumberFormat*)currencyStyle->clone();
+ return currencyStyle->clone();
}
return NULL;
}
@@ -310,7 +310,7 @@ IntlTestNumberFormatAPI::testRegistration()
LocalPointer<NumberFormat> f3a(NumberFormat::createCurrencyInstance(SRC_LOC, status));
LocalPointer<NumberFormat> f4(NumberFormat::createInstance(SRC_LOC, status));
- StringEnumeration* locs = NumberFormat::getAvailableLocales();
+ LocalPointer<StringEnumeration> locs(NumberFormat::getAvailableLocales());
LocalUNumberFormatPointer uf3(unum_open(UNUM_CURRENCY, NULL, 0, SRC_LOC.getName(), NULL, &status));
LocalUNumberFormatPointer uf4(unum_open(UNUM_DEFAULT, NULL, 0, SRC_LOC.getName(), NULL, &status));
@@ -325,7 +325,7 @@ IntlTestNumberFormatAPI::testRegistration()
LocalUNumberFormatPointer uf5(unum_open(UNUM_CURRENCY, NULL, 0, SRC_LOC.getName(), NULL, &status));
if (U_FAILURE(status)) {
- dataerrln("Error creating instnaces.");
+ dataerrln("Error creating instanaces.");
return;
} else {
float n = 1234.567f;
@@ -391,8 +391,6 @@ IntlTestNumberFormatAPI::testRegistration()
for (res = locs->snext(status); res; res = locs->snext(status)) {
logln(*res);
}
-
- delete locs;
#endif
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/nmfmtrt.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/nmfmtrt.cpp
index 2379277aebb..30ff2ac763f 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/nmfmtrt.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/nmfmtrt.cpp
@@ -250,7 +250,12 @@ NumberFormatRoundTripTest::test(NumberFormat *fmt, const Formattable& value)
logln(/*value.getString(temp) +*/ " F> " + escape(s));
fmt->parse(s, n, status);
- failure(status, "fmt->parse");
+ if(U_FAILURE(status)) {
+ UErrorCode infoStatus = U_ZERO_ERROR;
+ const char* localeID = fmt->getLocaleID(ULOC_ACTUAL_LOCALE, infoStatus);
+ localeID = (U_SUCCESS(infoStatus) && localeID)? localeID: "?";
+ errln(UnicodeString("FAIL: fmt->parse failed, locale: ") + localeID + ", error: " + u_errorName(status));
+ }
if(DEBUG_VAR)
logln(escape(s) + " P> " /*+ n.getString(temp)*/);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/normconf.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/normconf.cpp
index 62710dbb46d..7c574ddb3ed 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/normconf.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/normconf.cpp
@@ -482,7 +482,7 @@ UBool NormalizerConformanceTest::checkNorm(UNormalizationMode mode, int32_t opti
std::string out8;
Edits edits;
Edits *editsPtr = (mode == UNORM_NFC || mode == UNORM_NFKC) ? &edits : nullptr;
- StringByteSink<std::string> sink(&out8, exp8.length());
+ StringByteSink<std::string> sink(&out8, static_cast<int32_t>(exp8.length()));
norm2->normalizeUTF8(0, s8, sink, editsPtr, errorCode);
if (U_FAILURE(errorCode)) {
errln("Normalizer2.%s.normalizeUTF8(%s) failed: %s",
@@ -505,8 +505,8 @@ UBool NormalizerConformanceTest::checkNorm(UNormalizationMode mode, int32_t opti
(int32_t)(out8.length() - s8.length()), edits.lengthDelta());
Edits::Iterator iter = edits.getCoarseIterator();
while (iter.next(errorCode)) {}
- pass &= assertEquals("edits source length", s8.length(), iter.sourceIndex());
- pass &= assertEquals("edits destination length", out8.length(), iter.destinationIndex());
+ pass &= assertEquals("edits source length", static_cast<int32_t>(s8.length()), iter.sourceIndex());
+ pass &= assertEquals("edits destination length", static_cast<int32_t>(out8.length()), iter.destinationIndex());
return pass;
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/nptrans.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/nptrans.cpp
index 6c1c7be3361..160cf5143f6 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/nptrans.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/nptrans.cpp
@@ -47,11 +47,10 @@ NamePrepTransform* NamePrepTransform::createInstance(UParseError& parseError, UE
//constructor
NamePrepTransform::NamePrepTransform(UParseError& parseError, UErrorCode& status)
-: unassigned(), prohibited(), labelSeparatorSet(){
+ : mapping(nullptr), unassigned(), prohibited(), labelSeparatorSet(), bundle(nullptr) {
- mapping = NULL;
- bundle = NULL;
-
+ LocalPointer<Transliterator> lmapping;
+ LocalUResourceBundlePointer lbundle;
const char* testDataName = IntlTest::loadTestData(status);
@@ -59,31 +58,31 @@ NamePrepTransform::NamePrepTransform(UParseError& parseError, UErrorCode& status
return;
}
- bundle = ures_openDirect(testDataName,"idna_rules",&status);
+ lbundle.adoptInstead(ures_openDirect(testDataName,"idna_rules",&status));
- if(bundle != NULL && U_SUCCESS(status)){
+ if(lbundle.isValid() && U_SUCCESS(status)){
// create the mapping transliterator
int32_t ruleLen = 0;
- const UChar* ruleUChar = ures_getStringByKey(bundle, "MapNFKC",&ruleLen, &status);
+ const UChar* ruleUChar = ures_getStringByKey(lbundle.getAlias(), "MapNFKC",&ruleLen, &status);
int32_t mapRuleLen = 0;
- const UChar *mapRuleUChar = ures_getStringByKey(bundle, "MapNoNormalization", &mapRuleLen, &status);
+ const UChar *mapRuleUChar = ures_getStringByKey(lbundle.getAlias(), "MapNoNormalization", &mapRuleLen, &status);
UnicodeString rule(mapRuleUChar, mapRuleLen);
rule.append(ruleUChar, ruleLen);
- mapping = Transliterator::createFromRules(UnicodeString("NamePrepTransform", ""), rule,
- UTRANS_FORWARD, parseError,status);
+ lmapping.adoptInstead( Transliterator::createFromRules(UnicodeString("NamePrepTransform", ""), rule,
+ UTRANS_FORWARD, parseError,status));
if(U_FAILURE(status)) {
- return;
+ return;
}
//create the unassigned set
int32_t patternLen =0;
- const UChar* pattern = ures_getStringByKey(bundle,"UnassignedSet",&patternLen, &status);
+ const UChar* pattern = ures_getStringByKey(lbundle.getAlias(),"UnassignedSet",&patternLen, &status);
unassigned.applyPattern(UnicodeString(pattern, patternLen), status);
//create prohibited set
patternLen=0;
- pattern = ures_getStringByKey(bundle,"ProhibitedSet",&patternLen, &status);
+ pattern = ures_getStringByKey(lbundle.getAlias(),"ProhibitedSet",&patternLen, &status);
UnicodeString test(pattern,patternLen);
prohibited.applyPattern(test,status);
#ifdef NPTRANS_DEBUG
@@ -107,20 +106,18 @@ NamePrepTransform::NamePrepTransform(UParseError& parseError, UErrorCode& status
//create label separator set
patternLen=0;
- pattern = ures_getStringByKey(bundle,"LabelSeparatorSet",&patternLen, &status);
+ pattern = ures_getStringByKey(lbundle.getAlias(), "LabelSeparatorSet", &patternLen, &status);
labelSeparatorSet.applyPattern(UnicodeString(pattern,patternLen),status);
}
- if(U_SUCCESS(status) &&
- (mapping == NULL)
- ){
+ if(U_SUCCESS(status) && (lmapping.isNull())) {
status = U_MEMORY_ALLOCATION_ERROR;
- delete mapping;
- ures_close(bundle);
- mapping = NULL;
- bundle = NULL;
}
-
+ if (U_FAILURE(status)) {
+ return;
+ }
+ mapping = lmapping.orphan();
+ bundle = lbundle.orphan();
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest.h b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest.h
index 49c2d4411a9..7f5bcdf4a8e 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest.h
@@ -6,10 +6,12 @@
#if !UCONFIG_NO_FORMATTING
#pragma once
-#include "number_stringbuilder.h"
+#include "formatted_string_builder.h"
#include "intltest.h"
+#include "itformat.h"
#include "number_affixutils.h"
-#include "numparse_stringsegment.h"
+#include "string_segment.h"
+#include "numrange_impl.h"
#include "unicode/locid.h"
#include "unicode/numberformatter.h"
#include "unicode/numberrangeformatter.h"
@@ -42,7 +44,7 @@ class AffixUtilsTest : public IntlTest {
UErrorCode &status);
};
-class NumberFormatterApiTest : public IntlTest {
+class NumberFormatterApiTest : public IntlTestWithFieldPosition {
public:
NumberFormatterApiTest();
NumberFormatterApiTest(UErrorCode &status);
@@ -54,6 +56,7 @@ class NumberFormatterApiTest : public IntlTest {
void unitCompoundMeasure();
void unitCurrency();
void unitPercent();
+ void percentParity();
void roundingFraction();
void roundingFigures();
void roundingFractionFigures();
@@ -65,16 +68,21 @@ class NumberFormatterApiTest : public IntlTest {
// TODO: Add this method if currency symbols override support is added.
//void symbolsOverride();
void sign();
+ void signCoverage();
void decimal();
void scale();
void locale();
+ void skeletonUserGuideExamples();
void formatTypes();
- void fieldPosition();
+ void fieldPositionLogic();
+ void fieldPositionCoverage();
void toFormat();
void errors();
void validRanges();
void copyMove();
void localPointerCAPI();
+ void toObject();
+ void toDecimalNumber();
void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0);
@@ -85,6 +93,7 @@ class NumberFormatterApiTest : public IntlTest {
CurrencyUnit CAD;
CurrencyUnit ESP;
CurrencyUnit PTE;
+ CurrencyUnit RON;
MeasureUnit METER;
MeasureUnit DAY;
@@ -110,11 +119,18 @@ class NumberFormatterApiTest : public IntlTest {
void assertFormatDescendingBig(const char16_t* message, const char16_t* skeleton,
const UnlocalizedNumberFormatter& f, Locale locale, ...);
- void assertFormatSingle(const char16_t* message, const char16_t* skeleton,
- const UnlocalizedNumberFormatter& f, Locale locale, double input,
- const UnicodeString& expected);
+ FormattedNumber
+ assertFormatSingle(const char16_t* message, const char16_t* skeleton,
+ const UnlocalizedNumberFormatter& f, Locale locale, double input,
+ const UnicodeString& expected);
void assertUndefinedSkeleton(const UnlocalizedNumberFormatter& f);
+
+ void assertNumberFieldPositions(
+ const char16_t* message,
+ const FormattedNumber& formattedNumber,
+ const UFieldPosition* expectedFieldPositions,
+ int32_t length);
};
class DecimalQuantityTest : public IntlTest {
@@ -128,6 +144,7 @@ class DecimalQuantityTest : public IntlTest {
void testHardDoubleConversion();
void testToDouble();
void testMaxDigits();
+ void testNickelRounding();
void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0);
@@ -159,7 +176,7 @@ class ModifiersTest : public IntlTest {
UnicodeString expectedChars, UnicodeString expectedFields,
UErrorCode &status);
- void assertModifierEquals(const Modifier &mod, NumberStringBuilder &sb, int32_t expectedPrefixLength,
+ void assertModifierEquals(const Modifier &mod, FormattedStringBuilder &sb, int32_t expectedPrefixLength,
bool expectedStrong, UnicodeString expectedChars,
UnicodeString expectedFields, UErrorCode &status);
};
@@ -189,33 +206,6 @@ class PatternStringTest : public IntlTest {
private:
};
-class NumberStringBuilderTest : public IntlTest {
- public:
- void testInsertAppendUnicodeString();
- void testSplice();
- void testInsertAppendCodePoint();
- void testCopy();
- void testFields();
- void testUnlimitedCapacity();
- void testCodePoints();
-
- void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0);
-
- private:
- void assertEqualsImpl(const UnicodeString &a, const NumberStringBuilder &b);
-};
-
-class StringSegmentTest : public IntlTest {
- public:
- void testOffset();
- void testLength();
- void testCharAt();
- void testGetCodePoint();
- void testCommonPrefixLength();
-
- void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0);
-};
-
class NumberParserTest : public IntlTest {
public:
void testBasic();
@@ -225,6 +215,8 @@ class NumberParserTest : public IntlTest {
void testAffixPatternMatcher();
void testGroupingDisabled();
void testCaseFolding();
+ void test20360_BidiOverflow();
+ void testInfiniteRecursion();
void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0);
};
@@ -246,7 +238,7 @@ class NumberSkeletonTest : public IntlTest {
void expectedErrorSkeleton(const char16_t** cases, int32_t casesLen);
};
-class NumberRangeFormatterTest : public IntlTest {
+class NumberRangeFormatterTest : public IntlTestWithFieldPosition {
public:
NumberRangeFormatterTest();
NumberRangeFormatterTest(UErrorCode &status);
@@ -257,7 +249,9 @@ class NumberRangeFormatterTest : public IntlTest {
void testIdentity();
void testDifferentFormatters();
void testPlurals();
+ void testFieldPositions();
void testCopyMove();
+ void toObject();
void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0);
@@ -286,7 +280,7 @@ class NumberRangeFormatterTest : public IntlTest {
const char16_t* expected_50K_50K,
const char16_t* expected_50K_50M);
- void assertFormattedRangeEquals(
+ FormattedNumberRange assertFormattedRangeEquals(
const char16_t* message,
const LocalizedNumberRangeFormatter& l,
double first,
@@ -294,6 +288,13 @@ class NumberRangeFormatterTest : public IntlTest {
const char16_t* expected);
};
+class NumberPermutationTest : public IntlTest {
+ public:
+ void testPermutations();
+
+ void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0);
+};
+
// NOTE: This macro is identical to the one in itformat.cpp
#define TESTCLASS(id, TestClass) \
@@ -321,12 +322,11 @@ class NumberTest : public IntlTest {
TESTCLASS(3, ModifiersTest);
TESTCLASS(4, PatternModifierTest);
TESTCLASS(5, PatternStringTest);
- TESTCLASS(6, NumberStringBuilderTest);
- TESTCLASS(7, DoubleConversionTest);
- TESTCLASS(8, StringSegmentTest);
- TESTCLASS(9, NumberParserTest);
- TESTCLASS(10, NumberSkeletonTest);
- TESTCLASS(11, NumberRangeFormatterTest);
+ TESTCLASS(6, DoubleConversionTest);
+ TESTCLASS(7, NumberParserTest);
+ TESTCLASS(8, NumberSkeletonTest);
+ TESTCLASS(9, NumberRangeFormatterTest);
+ TESTCLASS(10, NumberPermutationTest);
default: name = ""; break; // needed to end loop
}
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_affixutils.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_affixutils.cpp
index d72991a042f..7f29ad19903 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_affixutils.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_affixutils.cpp
@@ -42,8 +42,7 @@ class DefaultSymbolProvider : public SymbolProvider {
case TYPE_CURRENCY_OVERFLOW:
return u"\uFFFD";
default:
- U_ASSERT(false);
- return {}; // silence compiler warnings
+ UPRV_UNREACHABLE;
}
}
};
@@ -218,12 +217,12 @@ void AffixUtilsTest::testUnescapeWithSymbolProvider() {
NumericSymbolProvider provider;
UErrorCode status = U_ZERO_ERROR;
- NumberStringBuilder sb;
+ FormattedStringBuilder sb;
for (auto& cas : cases) {
UnicodeString input(cas[0]);
UnicodeString expected(cas[1]);
sb.clear();
- AffixUtils::unescape(input, sb, 0, provider, status);
+ AffixUtils::unescape(input, sb, 0, provider, UNUM_FIELD_COUNT, status);
assertSuccess("Spot 1", status);
assertEquals(input, expected, sb.toUnicodeString());
assertEquals(input, expected, sb.toTempUnicodeString());
@@ -233,15 +232,15 @@ void AffixUtilsTest::testUnescapeWithSymbolProvider() {
sb.clear();
sb.append(u"abcdefg", UNUM_FIELD_COUNT, status);
assertSuccess("Spot 2", status);
- AffixUtils::unescape(u"-+%", sb, 4, provider, status);
+ AffixUtils::unescape(u"-+%", sb, 4, provider, UNUM_FIELD_COUNT, status);
assertSuccess("Spot 3", status);
assertEquals(u"Symbol provider into middle", u"abcd123efg", sb.toUnicodeString());
}
UnicodeString AffixUtilsTest::unescapeWithDefaults(const SymbolProvider &defaultProvider,
UnicodeString input, UErrorCode &status) {
- NumberStringBuilder nsb;
- int32_t length = AffixUtils::unescape(input, nsb, 0, defaultProvider, status);
+ FormattedStringBuilder nsb;
+ int32_t length = AffixUtils::unescape(input, nsb, 0, defaultProvider, UNUM_FIELD_COUNT, status);
assertEquals("Return value of unescape", nsb.length(), length);
return nsb.toUnicodeString();
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_api.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_api.cpp
index 54f5e63ce14..4e4f0b72e15 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_api.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_api.cpp
@@ -8,6 +8,7 @@
#include "charstr.h"
#include <cstdarg>
#include <cmath>
+#include <memory>
#include "unicode/unum.h"
#include "unicode/numberformatter.h"
#include "number_asformat.h"
@@ -31,6 +32,7 @@ NumberFormatterApiTest::NumberFormatterApiTest(UErrorCode& status)
CAD(u"CAD", status),
ESP(u"ESP", status),
PTE(u"PTE", status),
+ RON(u"RON", status),
FRENCH_SYMBOLS(Locale::getFrench(), status),
SWISS_SYMBOLS(Locale("de-CH"), status),
MYANMAR_SYMBOLS(Locale("my"), status) {
@@ -69,6 +71,10 @@ void NumberFormatterApiTest::runIndexedTest(int32_t index, UBool exec, const cha
TESTCASE_AUTO(unitCompoundMeasure);
TESTCASE_AUTO(unitCurrency);
TESTCASE_AUTO(unitPercent);
+ if (!quick) {
+ // Slow test: run in exhaustive mode only
+ TESTCASE_AUTO(percentParity);
+ }
TESTCASE_AUTO(roundingFraction);
TESTCASE_AUTO(roundingFigures);
TESTCASE_AUTO(roundingFractionFigures);
@@ -80,16 +86,25 @@ void NumberFormatterApiTest::runIndexedTest(int32_t index, UBool exec, const cha
// TODO: Add this method if currency symbols override support is added.
//TESTCASE_AUTO(symbolsOverride);
TESTCASE_AUTO(sign);
+ TESTCASE_AUTO(signCoverage);
TESTCASE_AUTO(decimal);
TESTCASE_AUTO(scale);
TESTCASE_AUTO(locale);
+ TESTCASE_AUTO(skeletonUserGuideExamples);
TESTCASE_AUTO(formatTypes);
- TESTCASE_AUTO(fieldPosition);
+ TESTCASE_AUTO(fieldPositionLogic);
+ TESTCASE_AUTO(fieldPositionCoverage);
TESTCASE_AUTO(toFormat);
TESTCASE_AUTO(errors);
- TESTCASE_AUTO(validRanges);
+ if (!quick) {
+ // Slow test: run in exhaustive mode only
+ // (somewhat slow to check all permutations of settings)
+ TESTCASE_AUTO(validRanges);
+ }
TESTCASE_AUTO(copyMove);
TESTCASE_AUTO(localPointerCAPI);
+ TESTCASE_AUTO(toObject);
+ TESTCASE_AUTO(toDecimalNumber);
TESTCASE_AUTO_END;
}
@@ -203,6 +218,22 @@ void NumberFormatterApiTest::notationScientific() {
Locale::getEnglish(),
-1000000,
u"-1E6");
+
+ assertFormatSingle(
+ u"Scientific Infinity",
+ u"scientific",
+ NumberFormatter::with().notation(Notation::scientific()),
+ Locale::getEnglish(),
+ -uprv_getInfinity(),
+ u"-∞");
+
+ assertFormatSingle(
+ u"Scientific NaN",
+ u"scientific",
+ NumberFormatter::with().notation(Notation::scientific()),
+ Locale::getEnglish(),
+ uprv_getNaN(),
+ u"NaN");
}
void NumberFormatterApiTest::notationCompact() {
@@ -419,6 +450,22 @@ void NumberFormatterApiTest::notationCompact() {
1e7,
u"1000\u842C");
+ assertFormatSingle(
+ u"Compact Infinity",
+ u"compact-short",
+ NumberFormatter::with().notation(Notation::compactShort()),
+ Locale::getEnglish(),
+ -uprv_getInfinity(),
+ u"-∞");
+
+ assertFormatSingle(
+ u"Compact NaN",
+ u"compact-short",
+ NumberFormatter::with().notation(Notation::compactShort()),
+ Locale::getEnglish(),
+ uprv_getNaN(),
+ u"NaN");
+
// NOTE: There is no API for compact custom data in C++
// and thus no "Compact Somali No Figure" test
}
@@ -427,7 +474,7 @@ void NumberFormatterApiTest::unitMeasure() {
assertFormatDescending(
u"Meters Short and unit() method",
u"measure-unit/length-meter",
- NumberFormatter::with().unit(METER),
+ NumberFormatter::with().unit(MeasureUnit::getMeter()),
Locale::getEnglish(),
u"87,650 m",
u"8,765 m",
@@ -524,6 +571,15 @@ void NumberFormatterApiTest::unitMeasure() {
5.43,
u"5.43 m²");
+ // Try accessing a narrow unit directly from root.
+ assertFormatSingle(
+ u"Interesting Data Fallback 4",
+ u"measure-unit/area-square-meter unit-width-narrow",
+ NumberFormatter::with().unit(SQUARE_METER).unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_NARROW),
+ Locale::createFromName("root"),
+ 5.43,
+ u"5.43 m²");
+
// es_US has "{0}°" for unitsNarrow/temperature/FAHRENHEIT.
// NOTE: This example is in the documentation.
assertFormatSingle(
@@ -559,6 +615,15 @@ void NumberFormatterApiTest::unitMeasure() {
Locale("es-MX"),
1,
u"kelvin");
+
+ assertFormatSingle(
+ u"Person unit not in short form",
+ u"measure-unit/duration-year-person unit-width-full-name",
+ NumberFormatter::with().unit(MeasureUnit::getYearPerson())
+ .unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME),
+ Locale("es-MX"),
+ 5,
+ u"5 a\u00F1os");
}
void NumberFormatterApiTest::unitCompoundMeasure() {
@@ -750,7 +815,7 @@ void NumberFormatterApiTest::unitCurrency() {
NumberFormatter::with().unit(PTE).unitWidth(UNUM_UNIT_WIDTH_NARROW),
Locale("pt-PT"),
444444.55,
- u"444,444$55 PTE");
+ u"444,444$55 \u200B");
assertFormatSingle(
u"Currency-dependent symbols (Test ISO Code)",
@@ -759,6 +824,14 @@ void NumberFormatterApiTest::unitCurrency() {
Locale("pt-PT"),
444444.55,
u"444,444$55 PTE");
+
+ assertFormatSingle(
+ u"Plural form depending on visible digits (ICU-20499)",
+ u"currency/RON unit-width-full-name",
+ NumberFormatter::with().unit(RON).unitWidth(UNUM_UNIT_WIDTH_FULL_NAME),
+ Locale("ro-RO"),
+ 24,
+ u"24,00 lei românești");
}
void NumberFormatterApiTest::unitPercent() {
@@ -809,6 +882,33 @@ void NumberFormatterApiTest::unitPercent() {
u"-98.765432%");
}
+void NumberFormatterApiTest::percentParity() {
+ IcuTestErrorCode status(*this, "percentParity");
+ UnlocalizedNumberFormatter uNoUnitPercent = NumberFormatter::with().unit(NoUnit::percent());
+ UnlocalizedNumberFormatter uNoUnitPermille = NumberFormatter::with().unit(NoUnit::permille());
+ UnlocalizedNumberFormatter uMeasurePercent = NumberFormatter::with().unit(MeasureUnit::getPercent());
+ UnlocalizedNumberFormatter uMeasurePermille = NumberFormatter::with().unit(MeasureUnit::getPermille());
+
+ int32_t localeCount;
+ auto locales = Locale::getAvailableLocales(localeCount);
+ for (int32_t i=0; i<localeCount; i++) {
+ auto& locale = locales[i];
+ UnicodeString sNoUnitPercent = uNoUnitPercent.locale(locale)
+ .formatDouble(50, status).toString(status);
+ UnicodeString sNoUnitPermille = uNoUnitPermille.locale(locale)
+ .formatDouble(50, status).toString(status);
+ UnicodeString sMeasurePercent = uMeasurePercent.locale(locale)
+ .formatDouble(50, status).toString(status);
+ UnicodeString sMeasurePermille = uMeasurePermille.locale(locale)
+ .formatDouble(50, status).toString(status);
+
+ assertEquals(u"Percent, locale " + UnicodeString(locale.getName()),
+ sNoUnitPercent, sMeasurePercent);
+ assertEquals(u"Permille, locale " + UnicodeString(locale.getName()),
+ sNoUnitPermille, sMeasurePermille);
+ }
+}
+
void NumberFormatterApiTest::roundingFraction() {
assertFormatDescending(
u"Integer",
@@ -1079,6 +1179,36 @@ void NumberFormatterApiTest::roundingOther() {
u"0.00");
assertFormatDescending(
+ u"Strange Increment",
+ u"precision-increment/3.140",
+ NumberFormatter::with().precision(Precision::increment(3.14).withMinFraction(3)),
+ Locale::getEnglish(),
+ u"87,649.960",
+ u"8,763.740",
+ u"876.060",
+ u"87.920",
+ u"9.420",
+ u"0.000",
+ u"0.000",
+ u"0.000",
+ u"0.000");
+
+ assertFormatDescending(
+ u"Increment Resolving to Power of 10",
+ u"precision-increment/0.010",
+ NumberFormatter::with().precision(Precision::increment(0.01).withMinFraction(3)),
+ Locale::getEnglish(),
+ u"87,650.000",
+ u"8,765.000",
+ u"876.500",
+ u"87.650",
+ u"8.760",
+ u"0.880",
+ u"0.090",
+ u"0.010",
+ u"0.000");
+
+ assertFormatDescending(
u"Currency Standard",
u"currency/CZK precision-currency-standard",
NumberFormatter::with().precision(Precision::currency(UCurrencyUsage::UCURR_USAGE_STANDARD))
@@ -1250,17 +1380,18 @@ void NumberFormatterApiTest::grouping() {
u"8.765",
u"0");
- // NOTE: Hungarian is interesting because it has minimumGroupingDigits=4 in locale data
+ // NOTE: Polish is interesting because it has minimumGroupingDigits=2 in locale data
+ // (Most locales have either 1 or 2)
// If this test breaks due to data changes, find another locale that has minimumGroupingDigits.
assertFormatDescendingBig(
- u"Hungarian Grouping",
+ u"Polish Grouping",
u"group-auto",
NumberFormatter::with().grouping(UNUM_GROUPING_AUTO),
- Locale("hu"),
+ Locale("pl"),
u"87 650 000",
u"8 765 000",
- u"876500",
- u"87650",
+ u"876 500",
+ u"87 650",
u"8765",
u"876,5",
u"87,65",
@@ -1268,14 +1399,14 @@ void NumberFormatterApiTest::grouping() {
u"0");
assertFormatDescendingBig(
- u"Hungarian Grouping, Min 2",
+ u"Polish Grouping, Min 2",
u"group-min2",
NumberFormatter::with().grouping(UNUM_GROUPING_MIN2),
- Locale("hu"),
+ Locale("pl"),
u"87 650 000",
u"8 765 000",
- u"876500",
- u"87650",
+ u"876 500",
+ u"87 650",
u"8765",
u"876,5",
u"87,65",
@@ -1283,10 +1414,10 @@ void NumberFormatterApiTest::grouping() {
u"0");
assertFormatDescendingBig(
- u"Hungarian Grouping, Always",
+ u"Polish Grouping, Always",
u"group-on-aligned",
NumberFormatter::with().grouping(UNUM_GROUPING_ON_ALIGNED),
- Locale("hu"),
+ Locale("pl"),
u"87 650 000",
u"8 765 000",
u"876 500",
@@ -1562,6 +1693,31 @@ void NumberFormatterApiTest::integerWidth() {
u"00.08765",
u"00.008765",
u"00");
+
+ assertFormatSingle(
+ u"Integer Width Remove All A",
+ u"integer-width/00",
+ NumberFormatter::with().integerWidth(IntegerWidth::zeroFillTo(2).truncateAt(2)),
+ "en",
+ 2500,
+ u"00");
+
+ assertFormatSingle(
+ u"Integer Width Remove All B",
+ u"integer-width/00",
+ NumberFormatter::with().integerWidth(IntegerWidth::zeroFillTo(2).truncateAt(2)),
+ "en",
+ 25000,
+ u"00");
+
+ assertFormatSingle(
+ u"Integer Width Remove All B, Bytes Mode",
+ u"integer-width/00",
+ NumberFormatter::with().integerWidth(IntegerWidth::zeroFillTo(2).truncateAt(2)),
+ "en",
+ // Note: this double produces all 17 significant digits
+ 10000000000000002000.0,
+ u"00");
}
void NumberFormatterApiTest::symbols() {
@@ -1683,7 +1839,7 @@ void NumberFormatterApiTest::symbols() {
NumberFormatter::withLocale(Locale("ar@numbers=arab")).adoptSymbols(new NumberingSystem(LATN))
.unit(USD)
.formatDouble(12345.67, status)
- .toString());
+ .toString(status));
DecimalFormatSymbols symbols = SWISS_SYMBOLS;
UnlocalizedNumberFormatter f = NumberFormatter::with().symbols(symbols);
@@ -1893,12 +2049,92 @@ void NumberFormatterApiTest::sign() {
assertFormatSingle(
u"Sign Accounting Negative Hidden",
u"currency/USD unit-width-hidden sign-accounting",
- NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_ACCOUNTING)
+ NumberFormatter::with()
+ .sign(UNumberSignDisplay::UNUM_SIGN_ACCOUNTING)
.unit(USD)
.unitWidth(UNUM_UNIT_WIDTH_HIDDEN),
Locale::getEnglish(),
-444444,
u"(444,444.00)");
+
+ assertFormatSingle(
+ u"Sign Accounting Negative Narrow",
+ u"currency/USD unit-width-narrow sign-accounting",
+ NumberFormatter::with()
+ .sign(UNumberSignDisplay::UNUM_SIGN_ACCOUNTING)
+ .unit(USD)
+ .unitWidth(UNUM_UNIT_WIDTH_NARROW),
+ Locale::getCanada(),
+ -444444,
+ u"($444,444.00)");
+
+ assertFormatSingle(
+ u"Sign Accounting Negative Short",
+ u"currency/USD sign-accounting",
+ NumberFormatter::with()
+ .sign(UNumberSignDisplay::UNUM_SIGN_ACCOUNTING)
+ .unit(USD)
+ .unitWidth(UNUM_UNIT_WIDTH_SHORT),
+ Locale::getCanada(),
+ -444444,
+ u"(US$444,444.00)");
+
+ assertFormatSingle(
+ u"Sign Accounting Negative Iso Code",
+ u"currency/USD unit-width-iso-code sign-accounting",
+ NumberFormatter::with()
+ .sign(UNumberSignDisplay::UNUM_SIGN_ACCOUNTING)
+ .unit(USD)
+ .unitWidth(UNUM_UNIT_WIDTH_ISO_CODE),
+ Locale::getCanada(),
+ -444444,
+ u"(USD 444,444.00)");
+
+ // Note: CLDR does not provide an accounting pattern for long name currency.
+ // We fall back to normal currency format. This may change in the future.
+ assertFormatSingle(
+ u"Sign Accounting Negative Full Name",
+ u"currency/USD unit-width-full-name sign-accounting",
+ NumberFormatter::with()
+ .sign(UNumberSignDisplay::UNUM_SIGN_ACCOUNTING)
+ .unit(USD)
+ .unitWidth(UNUM_UNIT_WIDTH_FULL_NAME),
+ Locale::getCanada(),
+ -444444,
+ u"-444,444.00 US dollars");
+}
+
+void NumberFormatterApiTest::signCoverage() {
+ // https://unicode-org.atlassian.net/browse/ICU-20708
+ IcuTestErrorCode status(*this, "signCoverage");
+ const struct TestCase {
+ UNumberSignDisplay sign;
+ const char16_t* expectedStrings[8];
+ } cases[] = {
+ { UNUM_SIGN_AUTO, { u"-∞", u"-1", u"-0", u"0", u"1", u"∞", u"NaN", u"-NaN" } },
+ { UNUM_SIGN_ALWAYS, { u"-∞", u"-1", u"-0", u"+0", u"+1", u"+∞", u"+NaN", u"-NaN" } },
+ { UNUM_SIGN_NEVER, { u"∞", u"1", u"0", u"0", u"1", u"∞", u"NaN", u"NaN" } },
+ { UNUM_SIGN_EXCEPT_ZERO, { u"-∞", u"-1", u"-0", u"0", u"+1", u"+∞", u"NaN", u"-NaN" } },
+ };
+ double negNaN = std::copysign(uprv_getNaN(), -0.0);
+ const double inputs[] = {
+ -uprv_getInfinity(), -1, -0.0, 0, 1, uprv_getInfinity(), uprv_getNaN(), negNaN
+ };
+ for (auto& cas : cases) {
+ auto sign = cas.sign;
+ for (int32_t i = 0; i < UPRV_LENGTHOF(inputs); i++) {
+ auto input = inputs[i];
+ auto expected = cas.expectedStrings[i];
+ auto actual = NumberFormatter::with()
+ .sign(sign)
+ .locale(Locale::getUS())
+ .formatDouble(input, status)
+ .toString(status);
+ assertEquals(
+ DoubleToUnicodeString(input) + " " + Int64ToUnicodeString(sign),
+ expected, actual);
+ }
+ }
}
void NumberFormatterApiTest::decimal() {
@@ -2061,36 +2297,85 @@ void NumberFormatterApiTest::locale() {
// Coverage for the locale setters.
UErrorCode status = U_ZERO_ERROR;
UnicodeString actual = NumberFormatter::withLocale(Locale::getFrench()).formatInt(1234, status)
- .toString();
+ .toString(status);
assertEquals("Locale withLocale()", u"1\u202f234", actual);
}
+void NumberFormatterApiTest::skeletonUserGuideExamples() {
+ IcuTestErrorCode status(*this, "skeletonUserGuideExamples");
+
+ // Test the skeleton examples in userguide/format_parse/numbers/skeletons.md
+ struct TestCase {
+ const char16_t* skeleton;
+ double input;
+ const char16_t* expected;
+ } cases[] = {
+ {u"percent", 25, u"25%"},
+ {u".00", 25, u"25.00"},
+ {u"percent .00", 25, u"25.00%"},
+ {u"scale/100", 0.3, u"30"},
+ {u"percent scale/100", 0.3, u"30%"},
+ {u"measure-unit/length-meter", 5, u"5 m"},
+ {u"measure-unit/length-meter unit-width-full-name", 5, u"5 meters"},
+ {u"currency/CAD", 10, u"CA$10.00"},
+ {u"currency/CAD unit-width-narrow", 10, u"$10.00"},
+ {u"compact-short", 5000, u"5K"},
+ {u"compact-long", 5000, u"5 thousand"},
+ {u"compact-short currency/CAD", 5000, u"CA$5K"},
+ {u"", 5000, u"5,000"},
+ {u"group-min2", 5000, u"5000"},
+ {u"group-min2", 15000, u"15,000"},
+ {u"sign-always", 60, u"+60"},
+ {u"sign-always", 0, u"+0"},
+ {u"sign-except-zero", 60, u"+60"},
+ {u"sign-except-zero", 0, u"0"},
+ {u"sign-accounting currency/CAD", -40, u"(CA$40.00)"}
+ };
+
+ for (const auto& cas : cases) {
+ status.setScope(cas.skeleton);
+ FormattedNumber actual = NumberFormatter::forSkeleton(cas.skeleton, status)
+ .locale("en-US")
+ .formatDouble(cas.input, status);
+ assertEquals(cas.skeleton, cas.expected, actual.toTempString(status));
+ status.errIfFailureAndReset();
+ }
+}
+
void NumberFormatterApiTest::formatTypes() {
UErrorCode status = U_ZERO_ERROR;
LocalizedNumberFormatter formatter = NumberFormatter::withLocale(Locale::getEnglish());
// Double
- assertEquals("Format double", "514.23", formatter.formatDouble(514.23, status).toString());
+ assertEquals("Format double", "514.23", formatter.formatDouble(514.23, status).toString(status));
// Int64
- assertEquals("Format int64", "51,423", formatter.formatDouble(51423L, status).toString());
+ assertEquals("Format int64", "51,423", formatter.formatDouble(51423L, status).toString(status));
// decNumber
- UnicodeString actual = formatter.formatDecimal("98765432123456789E1", status).toString();
+ UnicodeString actual = formatter.formatDecimal("98765432123456789E1", status).toString(status);
assertEquals("Format decNumber", u"987,654,321,234,567,890", actual);
// Also test proper DecimalQuantity bytes storage when all digits are in the fraction.
// The number needs to have exactly 40 digits, which is the size of the default buffer.
// (issue discovered by the address sanitizer in C++)
static const char* str = "0.009876543210987654321098765432109876543211";
- actual = formatter.precision(Precision::unlimited()).formatDecimal(str, status).toString();
+ actual = formatter.precision(Precision::unlimited()).formatDecimal(str, status).toString(status);
assertEquals("Format decNumber to 40 digits", str, actual);
}
-void NumberFormatterApiTest::fieldPosition() {
- IcuTestErrorCode status(*this, "fieldPosition");
- FormattedNumber fmtd = NumberFormatter::withLocale("en").formatDouble(-9876543210.12, status);
- assertEquals("Should have expected format output", u"-9,876,543,210.12", fmtd.toString(status));
+void NumberFormatterApiTest::fieldPositionLogic() {
+ IcuTestErrorCode status(*this, "fieldPositionLogic");
+
+ const char16_t* message = u"Field position logic test";
+
+ FormattedNumber fmtd = assertFormatSingle(
+ message,
+ u"",
+ NumberFormatter::with(),
+ Locale::getEnglish(),
+ -9876543210.12,
+ u"-9,876,543,210.12");
static const UFieldPosition expectedFieldPositions[] = {
// field, begin index, end index
@@ -2102,56 +2387,15 @@ void NumberFormatterApiTest::fieldPosition() {
{UNUM_DECIMAL_SEPARATOR_FIELD, 14, 15},
{UNUM_FRACTION_FIELD, 15, 17}};
- FieldPositionIterator fpi;
- fmtd.getAllFieldPositions(fpi, status);
- int32_t i = 0;
- FieldPosition actual;
- while (fpi.next(actual)) {
- UFieldPosition expected = expectedFieldPositions[i++];
- assertEquals(
- UnicodeString(u"Field, case #") + Int64ToUnicodeString(i),
- expected.field,
- actual.getField());
- assertEquals(
- UnicodeString(u"Iterator, begin index, case #") + Int64ToUnicodeString(i),
- expected.beginIndex,
- actual.getBeginIndex());
- assertEquals(
- UnicodeString(u"Iterator, end index, case #") + Int64ToUnicodeString(i),
- expected.endIndex,
- actual.getEndIndex());
-
- // Check for the first location of the field
- if (expected.field != UNUM_GROUPING_SEPARATOR_FIELD) {
- FieldPosition actual2(expected.field);
- UBool found = fmtd.nextFieldPosition(actual2, status);
- assertEquals(
- UnicodeString(u"Next, found first time, case #") + Int64ToUnicodeString(i),
- (UBool) TRUE,
- found);
- assertEquals(
- UnicodeString(u"Next, begin index, case #") + Int64ToUnicodeString(i),
- expected.beginIndex,
- actual2.getBeginIndex());
- assertEquals(
- UnicodeString(u"Next, end index, case #") + Int64ToUnicodeString(i),
- expected.endIndex,
- actual2.getEndIndex());
- found = fmtd.nextFieldPosition(actual2, status);
- assertEquals(
- UnicodeString(u"Next, found second time, case #") + Int64ToUnicodeString(i),
- (UBool) FALSE,
- found);
- }
- }
- assertEquals(
- "Should have seen every field position",
- sizeof(expectedFieldPositions) / sizeof(*expectedFieldPositions),
- i);
+ assertNumberFieldPositions(
+ message,
+ fmtd,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
// Test the iteration functionality of nextFieldPosition
- actual = {UNUM_GROUPING_SEPARATOR_FIELD};
- i = 1;
+ FieldPosition actual = {UNUM_GROUPING_SEPARATOR_FIELD};
+ int32_t i = 1;
while (fmtd.nextFieldPosition(actual, status)) {
UFieldPosition expected = expectedFieldPositions[i++];
assertEquals(
@@ -2175,6 +2419,285 @@ void NumberFormatterApiTest::fieldPosition() {
assertFalse(u"No fraction part in an integer", fmtd.nextFieldPosition(actual, status));
}
+void NumberFormatterApiTest::fieldPositionCoverage() {
+ IcuTestErrorCode status(*this, "fieldPositionCoverage");
+
+ {
+ const char16_t* message = u"Measure unit field position basic";
+ FormattedNumber result = assertFormatSingle(
+ message,
+ u"measure-unit/temperature-fahrenheit",
+ NumberFormatter::with().unit(FAHRENHEIT),
+ Locale::getEnglish(),
+ 68,
+ u"68°F");
+ static const UFieldPosition expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UNUM_INTEGER_FIELD, 0, 2},
+ {UNUM_MEASURE_UNIT_FIELD, 2, 4}};
+ assertNumberFieldPositions(
+ message,
+ result,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ {
+ const char16_t* message = u"Measure unit field position with compound unit";
+ FormattedNumber result = assertFormatSingle(
+ message,
+ u"measure-unit/temperature-fahrenheit per-measure-unit/duration-day",
+ NumberFormatter::with().unit(FAHRENHEIT).perUnit(DAY),
+ Locale::getEnglish(),
+ 68,
+ u"68°F/d");
+ static const UFieldPosition expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UNUM_INTEGER_FIELD, 0, 2},
+ // coverage for old enum:
+ {DecimalFormat::kMeasureUnitField, 2, 6}};
+ assertNumberFieldPositions(
+ message,
+ result,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ {
+ const char16_t* message = u"Measure unit field position with spaces";
+ FormattedNumber result = assertFormatSingle(
+ message,
+ u"measure-unit/length-meter unit-width-full-name",
+ NumberFormatter::with().unit(METER).unitWidth(UNUM_UNIT_WIDTH_FULL_NAME),
+ Locale::getEnglish(),
+ 68,
+ u"68 meters");
+ static const UFieldPosition expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UNUM_INTEGER_FIELD, 0, 2},
+ // note: field starts after the space
+ {UNUM_MEASURE_UNIT_FIELD, 3, 9}};
+ assertNumberFieldPositions(
+ message,
+ result,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ {
+ const char16_t* message = u"Measure unit field position with prefix and suffix";
+ FormattedNumber result = assertFormatSingle(
+ message,
+ u"measure-unit/length-meter per-measure-unit/duration-second unit-width-full-name",
+ NumberFormatter::with().unit(METER).perUnit(SECOND).unitWidth(UNUM_UNIT_WIDTH_FULL_NAME),
+ "ky", // locale with the interesting data
+ 68,
+ u"секундасына 68 метр");
+ static const UFieldPosition expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UNUM_MEASURE_UNIT_FIELD, 0, 11},
+ {UNUM_INTEGER_FIELD, 12, 14},
+ {UNUM_MEASURE_UNIT_FIELD, 15, 19}};
+ assertNumberFieldPositions(
+ message,
+ result,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ {
+ const char16_t* message = u"Measure unit field position with inner spaces";
+ FormattedNumber result = assertFormatSingle(
+ message,
+ u"measure-unit/temperature-fahrenheit unit-width-full-name",
+ NumberFormatter::with().unit(FAHRENHEIT).unitWidth(UNUM_UNIT_WIDTH_FULL_NAME),
+ "vi", // locale with the interesting data
+ 68,
+ u"68 độ F");
+ static const UFieldPosition expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UNUM_INTEGER_FIELD, 0, 2},
+ // Should trim leading/trailing spaces, but not inner spaces:
+ {UNUM_MEASURE_UNIT_FIELD, 3, 7}};
+ assertNumberFieldPositions(
+ message,
+ result,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ {
+ // Data: other{"‎{0} K"} == "\u200E{0} K"
+ // If that data changes, try to find another example of a non-empty unit prefix/suffix
+ // that is also all ignorables (whitespace and bidi control marks).
+ const char16_t* message = u"Measure unit field position with fully ignorable prefix";
+ FormattedNumber result = assertFormatSingle(
+ message,
+ u"measure-unit/temperature-kelvin",
+ NumberFormatter::with().unit(KELVIN),
+ "fa", // locale with the interesting data
+ 68,
+ u"‎۶۸ K");
+ static const UFieldPosition expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UNUM_INTEGER_FIELD, 1, 3},
+ {UNUM_MEASURE_UNIT_FIELD, 4, 5}};
+ assertNumberFieldPositions(
+ message,
+ result,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ {
+ const char16_t* message = u"Compact field basic";
+ FormattedNumber result = assertFormatSingle(
+ message,
+ u"compact-short",
+ NumberFormatter::with().notation(Notation::compactShort()),
+ Locale::getUS(),
+ 65000,
+ u"65K");
+ static const UFieldPosition expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UNUM_INTEGER_FIELD, 0, 2},
+ {UNUM_COMPACT_FIELD, 2, 3}};
+ assertNumberFieldPositions(
+ message,
+ result,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ {
+ const char16_t* message = u"Compact field with spaces";
+ FormattedNumber result = assertFormatSingle(
+ message,
+ u"compact-long",
+ NumberFormatter::with().notation(Notation::compactLong()),
+ Locale::getUS(),
+ 65000,
+ u"65 thousand");
+ static const UFieldPosition expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UNUM_INTEGER_FIELD, 0, 2},
+ {UNUM_COMPACT_FIELD, 3, 11}};
+ assertNumberFieldPositions(
+ message,
+ result,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ {
+ const char16_t* message = u"Compact field with inner space";
+ FormattedNumber result = assertFormatSingle(
+ message,
+ u"compact-long",
+ NumberFormatter::with().notation(Notation::compactLong()),
+ "fil", // locale with interesting data
+ 6000,
+ u"6 na libo");
+ static const UFieldPosition expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UNUM_INTEGER_FIELD, 0, 1},
+ {UNUM_COMPACT_FIELD, 2, 9}};
+ assertNumberFieldPositions(
+ message,
+ result,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ {
+ const char16_t* message = u"Compact field with bidi mark";
+ FormattedNumber result = assertFormatSingle(
+ message,
+ u"compact-long",
+ NumberFormatter::with().notation(Notation::compactLong()),
+ "he", // locale with interesting data
+ 6000,
+ u"\u200F6 אלף");
+ static const UFieldPosition expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UNUM_INTEGER_FIELD, 1, 2},
+ {UNUM_COMPACT_FIELD, 3, 6}};
+ assertNumberFieldPositions(
+ message,
+ result,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ {
+ const char16_t* message = u"Compact with currency fields";
+ FormattedNumber result = assertFormatSingle(
+ message,
+ u"compact-short currency/USD",
+ NumberFormatter::with().notation(Notation::compactShort()).unit(USD),
+ "sr_Latn", // locale with interesting data
+ 65000,
+ u"65 hilj. US$");
+ static const UFieldPosition expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UNUM_INTEGER_FIELD, 0, 2},
+ {UNUM_COMPACT_FIELD, 3, 8},
+ {UNUM_CURRENCY_FIELD, 9, 12}};
+ assertNumberFieldPositions(
+ message,
+ result,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ {
+ const char16_t* message = u"Currency long name fields";
+ FormattedNumber result = assertFormatSingle(
+ message,
+ u"currency/USD unit-width-full-name",
+ NumberFormatter::with().unit(USD)
+ .unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME),
+ "en",
+ 12345,
+ u"12,345.00 US dollars");
+ static const UFieldPosition expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UNUM_GROUPING_SEPARATOR_FIELD, 2, 3},
+ {UNUM_INTEGER_FIELD, 0, 6},
+ {UNUM_DECIMAL_SEPARATOR_FIELD, 6, 7},
+ {UNUM_FRACTION_FIELD, 7, 9},
+ {UNUM_CURRENCY_FIELD, 10, 20}};
+ assertNumberFieldPositions(
+ message,
+ result,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ {
+ const char16_t* message = u"Compact with measure unit fields";
+ FormattedNumber result = assertFormatSingle(
+ message,
+ u"compact-long measure-unit/length-meter unit-width-full-name",
+ NumberFormatter::with().notation(Notation::compactLong())
+ .unit(METER)
+ .unitWidth(UNUM_UNIT_WIDTH_FULL_NAME),
+ Locale::getUS(),
+ 65000,
+ u"65 thousand meters");
+ static const UFieldPosition expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UNUM_INTEGER_FIELD, 0, 2},
+ {UNUM_COMPACT_FIELD, 3, 11},
+ {UNUM_MEASURE_UNIT_FIELD, 12, 18}};
+ assertNumberFieldPositions(
+ message,
+ result,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+}
+
void NumberFormatterApiTest::toFormat() {
IcuTestErrorCode status(*this, "icuFormat");
LocalizedNumberFormatter lnf = NumberFormatter::withLocale("fr")
@@ -2250,7 +2773,7 @@ void NumberFormatterApiTest::errors() {
// FieldPosition
status = U_ZERO_ERROR;
FieldPosition fp;
- fn.populateFieldPosition(fp, status);
+ fn.nextFieldPosition(fp, status);
assertEquals(
"Should fail on FieldPosition terminal method with correct error code",
U_NUMBER_ARG_OUTOFBOUNDS_ERROR,
@@ -2259,7 +2782,7 @@ void NumberFormatterApiTest::errors() {
// FieldPositionIterator
status = U_ZERO_ERROR;
FieldPositionIterator fpi;
- fn.populateFieldPositionIterator(fpi, status);
+ fn.getAllFieldPositions(fpi, status);
assertEquals(
"Should fail on FieldPositoinIterator terminal method with correct error code",
U_NUMBER_ARG_OUTOFBOUNDS_ERROR,
@@ -2298,7 +2821,7 @@ void NumberFormatterApiTest::validRanges() {
#define EXPECTED_MAX_INT_FRAC_SIG 999
-#define VALID_RANGE_ASSERT(status, method, lowerBound, argument) { \
+#define VALID_RANGE_ASSERT(status, method, lowerBound, argument) UPRV_BLOCK_MACRO_BEGIN { \
UErrorCode expectedStatus = ((lowerBound <= argument) && (argument <= EXPECTED_MAX_INT_FRAC_SIG)) \
? U_ZERO_ERROR \
: U_NUMBER_ARG_OUTOFBOUNDS_ERROR; \
@@ -2307,17 +2830,17 @@ void NumberFormatterApiTest::validRanges() {
+ Int64ToUnicodeString(argument), \
expectedStatus, \
status); \
-}
+} UPRV_BLOCK_MACRO_END
-#define VALID_RANGE_ONEARG(setting, method, lowerBound) { \
+#define VALID_RANGE_ONEARG(setting, method, lowerBound) UPRV_BLOCK_MACRO_BEGIN { \
for (int32_t argument = -2; argument <= EXPECTED_MAX_INT_FRAC_SIG + 2; argument++) { \
UErrorCode status = U_ZERO_ERROR; \
NumberFormatter::with().setting(method(argument)).copyErrorTo(status); \
VALID_RANGE_ASSERT(status, method, lowerBound, argument); \
} \
-}
+} UPRV_BLOCK_MACRO_END
-#define VALID_RANGE_TWOARGS(setting, method, lowerBound) { \
+#define VALID_RANGE_TWOARGS(setting, method, lowerBound) UPRV_BLOCK_MACRO_BEGIN { \
for (int32_t argument = -2; argument <= EXPECTED_MAX_INT_FRAC_SIG + 2; argument++) { \
UErrorCode status = U_ZERO_ERROR; \
/* Pass EXPECTED_MAX_INT_FRAC_SIG as the second argument so arg1 <= arg2 in expected cases */ \
@@ -2333,18 +2856,18 @@ void NumberFormatterApiTest::validRanges() {
U_NUMBER_ARG_OUTOFBOUNDS_ERROR, \
status); \
} \
-}
-
- VALID_RANGE_ONEARG(rounding, Precision::fixedFraction, 0);
- VALID_RANGE_ONEARG(rounding, Precision::minFraction, 0);
- VALID_RANGE_ONEARG(rounding, Precision::maxFraction, 0);
- VALID_RANGE_TWOARGS(rounding, Precision::minMaxFraction, 0);
- VALID_RANGE_ONEARG(rounding, Precision::fixedSignificantDigits, 1);
- VALID_RANGE_ONEARG(rounding, Precision::minSignificantDigits, 1);
- VALID_RANGE_ONEARG(rounding, Precision::maxSignificantDigits, 1);
- VALID_RANGE_TWOARGS(rounding, Precision::minMaxSignificantDigits, 1);
- VALID_RANGE_ONEARG(rounding, Precision::fixedFraction(1).withMinDigits, 1);
- VALID_RANGE_ONEARG(rounding, Precision::fixedFraction(1).withMaxDigits, 1);
+} UPRV_BLOCK_MACRO_END
+
+ VALID_RANGE_ONEARG(precision, Precision::fixedFraction, 0);
+ VALID_RANGE_ONEARG(precision, Precision::minFraction, 0);
+ VALID_RANGE_ONEARG(precision, Precision::maxFraction, 0);
+ VALID_RANGE_TWOARGS(precision, Precision::minMaxFraction, 0);
+ VALID_RANGE_ONEARG(precision, Precision::fixedSignificantDigits, 1);
+ VALID_RANGE_ONEARG(precision, Precision::minSignificantDigits, 1);
+ VALID_RANGE_ONEARG(precision, Precision::maxSignificantDigits, 1);
+ VALID_RANGE_TWOARGS(precision, Precision::minMaxSignificantDigits, 1);
+ VALID_RANGE_ONEARG(precision, Precision::fixedFraction(1).withMinDigits, 1);
+ VALID_RANGE_ONEARG(precision, Precision::fixedFraction(1).withMaxDigits, 1);
VALID_RANGE_ONEARG(notation, Notation::scientific().withMinExponentDigits, 1);
VALID_RANGE_ONEARG(integerWidth, IntegerWidth::zeroFillTo, 0);
VALID_RANGE_ONEARG(integerWidth, IntegerWidth::zeroFillTo(0).truncateAt, -1);
@@ -2355,33 +2878,33 @@ void NumberFormatterApiTest::copyMove() {
// Default constructors
LocalizedNumberFormatter l1;
- assertEquals("Initial behavior", u"10", l1.formatInt(10, status).toString(), true);
+ assertEquals("Initial behavior", u"10", l1.formatInt(10, status).toString(status), true);
if (status.errDataIfFailureAndReset()) { return; }
assertEquals("Initial call count", 1, l1.getCallCount());
assertTrue("Initial compiled", l1.getCompiled() == nullptr);
// Setup
l1 = NumberFormatter::withLocale("en").unit(NoUnit::percent()).threshold(3);
- assertEquals("Initial behavior", u"10%", l1.formatInt(10, status).toString());
+ assertEquals("Initial behavior", u"10%", l1.formatInt(10, status).toString(status));
assertEquals("Initial call count", 1, l1.getCallCount());
assertTrue("Initial compiled", l1.getCompiled() == nullptr);
l1.formatInt(123, status);
assertEquals("Still not compiled", 2, l1.getCallCount());
assertTrue("Still not compiled", l1.getCompiled() == nullptr);
l1.formatInt(123, status);
- assertEquals("Compiled", u"10%", l1.formatInt(10, status).toString());
+ assertEquals("Compiled", u"10%", l1.formatInt(10, status).toString(status));
assertEquals("Compiled", INT32_MIN, l1.getCallCount());
assertTrue("Compiled", l1.getCompiled() != nullptr);
// Copy constructor
LocalizedNumberFormatter l2 = l1;
- assertEquals("[constructor] Copy behavior", u"10%", l2.formatInt(10, status).toString());
+ assertEquals("[constructor] Copy behavior", u"10%", l2.formatInt(10, status).toString(status));
assertEquals("[constructor] Copy should not have compiled state", 1, l2.getCallCount());
assertTrue("[constructor] Copy should not have compiled state", l2.getCompiled() == nullptr);
// Move constructor
LocalizedNumberFormatter l3 = std::move(l1);
- assertEquals("[constructor] Move behavior", u"10%", l3.formatInt(10, status).toString());
+ assertEquals("[constructor] Move behavior", u"10%", l3.formatInt(10, status).toString(status));
assertEquals("[constructor] Move *should* have compiled state", INT32_MIN, l3.getCallCount());
assertTrue("[constructor] Move *should* have compiled state", l3.getCompiled() != nullptr);
assertEquals("[constructor] Source should be reset after move", 0, l1.getCallCount());
@@ -2400,13 +2923,13 @@ void NumberFormatterApiTest::copyMove() {
// Copy assignment
l1 = l3;
- assertEquals("[assignment] Copy behavior", u"10%", l1.formatInt(10, status).toString());
+ assertEquals("[assignment] Copy behavior", u"10%", l1.formatInt(10, status).toString(status));
assertEquals("[assignment] Copy should not have compiled state", 1, l1.getCallCount());
assertTrue("[assignment] Copy should not have compiled state", l1.getCompiled() == nullptr);
// Move assignment
l2 = std::move(l3);
- assertEquals("[assignment] Move behavior", u"10%", l2.formatInt(10, status).toString());
+ assertEquals("[assignment] Move behavior", u"10%", l2.formatInt(10, status).toString(status));
assertEquals("[assignment] Move *should* have compiled state", INT32_MIN, l2.getCallCount());
assertTrue("[assignment] Move *should* have compiled state", l2.getCompiled() != nullptr);
assertEquals("[assignment] Source should be reset after move", 0, l3.getCallCount());
@@ -2414,22 +2937,22 @@ void NumberFormatterApiTest::copyMove() {
// Coverage tests for UnlocalizedNumberFormatter
UnlocalizedNumberFormatter u1;
- assertEquals("Default behavior", u"10", u1.locale("en").formatInt(10, status).toString());
+ assertEquals("Default behavior", u"10", u1.locale("en").formatInt(10, status).toString(status));
u1 = u1.unit(NoUnit::percent());
- assertEquals("Copy assignment", u"10%", u1.locale("en").formatInt(10, status).toString());
+ assertEquals("Copy assignment", u"10%", u1.locale("en").formatInt(10, status).toString(status));
UnlocalizedNumberFormatter u2 = u1;
- assertEquals("Copy constructor", u"10%", u2.locale("en").formatInt(10, status).toString());
+ assertEquals("Copy constructor", u"10%", u2.locale("en").formatInt(10, status).toString(status));
UnlocalizedNumberFormatter u3 = std::move(u1);
- assertEquals("Move constructor", u"10%", u3.locale("en").formatInt(10, status).toString());
+ assertEquals("Move constructor", u"10%", u3.locale("en").formatInt(10, status).toString(status));
u1 = NumberFormatter::with();
u1 = std::move(u2);
- assertEquals("Move assignment", u"10%", u1.locale("en").formatInt(10, status).toString());
+ assertEquals("Move assignment", u"10%", u1.locale("en").formatInt(10, status).toString(status));
// FormattedNumber move operators
FormattedNumber result = l1.formatInt(10, status);
- assertEquals("FormattedNumber move constructor", u"10%", result.toString());
+ assertEquals("FormattedNumber move constructor", u"10%", result.toString(status));
result = l1.formatInt(20, status);
- assertEquals("FormattedNumber move assignment", u"20%", result.toString());
+ assertEquals("FormattedNumber move assignment", u"20%", result.toString(status));
}
void NumberFormatterApiTest::localPointerCAPI() {
@@ -2454,6 +2977,76 @@ void NumberFormatterApiTest::localPointerCAPI() {
// No need to do any cleanup since we are using LocalPointer.
}
+void NumberFormatterApiTest::toObject() {
+ IcuTestErrorCode status(*this, "toObject");
+
+ // const lvalue version
+ {
+ LocalizedNumberFormatter lnf = NumberFormatter::withLocale("en")
+ .precision(Precision::fixedFraction(2));
+ LocalPointer<LocalizedNumberFormatter> lnf2(lnf.clone());
+ assertFalse("should create successfully, const lvalue", lnf2.isNull());
+ assertEquals("object API test, const lvalue", u"1,000.00",
+ lnf2->formatDouble(1000, status).toString(status));
+ }
+
+ // rvalue reference version
+ {
+ LocalPointer<LocalizedNumberFormatter> lnf(
+ NumberFormatter::withLocale("en")
+ .precision(Precision::fixedFraction(2))
+ .clone());
+ assertFalse("should create successfully, rvalue reference", lnf.isNull());
+ assertEquals("object API test, rvalue reference", u"1,000.00",
+ lnf->formatDouble(1000, status).toString(status));
+ }
+
+ // to std::unique_ptr via constructor
+ {
+ std::unique_ptr<LocalizedNumberFormatter> lnf(
+ NumberFormatter::withLocale("en")
+ .precision(Precision::fixedFraction(2))
+ .clone());
+ assertTrue("should create successfully, unique_ptr", static_cast<bool>(lnf));
+ assertEquals("object API test, unique_ptr", u"1,000.00",
+ lnf->formatDouble(1000, status).toString(status));
+ }
+
+ // to std::unique_ptr via assignment
+ {
+ std::unique_ptr<LocalizedNumberFormatter> lnf =
+ NumberFormatter::withLocale("en")
+ .precision(Precision::fixedFraction(2))
+ .clone();
+ assertTrue("should create successfully, unique_ptr B", static_cast<bool>(lnf));
+ assertEquals("object API test, unique_ptr B", u"1,000.00",
+ lnf->formatDouble(1000, status).toString(status));
+ }
+
+ // to LocalPointer via assignment
+ {
+ LocalPointer<UnlocalizedNumberFormatter> f =
+ NumberFormatter::with().clone();
+ }
+
+ // make sure no memory leaks
+ {
+ NumberFormatter::with().clone();
+ }
+}
+
+void NumberFormatterApiTest::toDecimalNumber() {
+ IcuTestErrorCode status(*this, "toDecimalNumber");
+ FormattedNumber fn = NumberFormatter::withLocale("bn-BD")
+ .scale(Scale::powerOfTen(2))
+ .precision(Precision::maxSignificantDigits(5))
+ .formatDouble(9.87654321e12, status);
+ assertEquals("Should have expected localized string result",
+ u"৯৮,৭৬,৫০,০০,০০,০০,০০০", fn.toString(status));
+ assertEquals(u"Should have expected toDecimalNumber string result",
+ "9.8765E+14", fn.toDecimalNumber<std::string>(status).c_str());
+}
+
void NumberFormatterApiTest::assertFormatDescending(const char16_t* umessage, const char16_t* uskeleton,
const UnlocalizedNumberFormatter& f, Locale locale,
@@ -2472,10 +3065,10 @@ void NumberFormatterApiTest::assertFormatDescending(const char16_t* umessage, co
double d = inputs[i];
UnicodeString expected = va_arg(args, const char16_t*);
expecteds[i] = expected;
- UnicodeString actual1 = l1.formatDouble(d, status).toString();
+ UnicodeString actual1 = l1.formatDouble(d, status).toString(status);
assertSuccess(message + u": Unsafe Path: " + caseNumber, status);
assertEquals(message + u": Unsafe Path: " + caseNumber, expected, actual1);
- UnicodeString actual2 = l2.formatDouble(d, status).toString();
+ UnicodeString actual2 = l2.formatDouble(d, status).toString(status);
assertSuccess(message + u": Safe Path: " + caseNumber, status);
assertEquals(message + u": Safe Path: " + caseNumber, expected, actual2);
}
@@ -2488,7 +3081,7 @@ void NumberFormatterApiTest::assertFormatDescending(const char16_t* umessage, co
LocalizedNumberFormatter l3 = NumberFormatter::forSkeleton(normalized, status).locale(locale);
for (int32_t i = 0; i < 9; i++) {
double d = inputs[i];
- UnicodeString actual3 = l3.formatDouble(d, status).toString();
+ UnicodeString actual3 = l3.formatDouble(d, status).toString(status);
assertEquals(message + ": Skeleton Path: '" + normalized + "': " + d, expecteds[i], actual3);
}
} else {
@@ -2513,10 +3106,10 @@ void NumberFormatterApiTest::assertFormatDescendingBig(const char16_t* umessage,
double d = inputs[i];
UnicodeString expected = va_arg(args, const char16_t*);
expecteds[i] = expected;
- UnicodeString actual1 = l1.formatDouble(d, status).toString();
+ UnicodeString actual1 = l1.formatDouble(d, status).toString(status);
assertSuccess(message + u": Unsafe Path: " + caseNumber, status);
assertEquals(message + u": Unsafe Path: " + caseNumber, expected, actual1);
- UnicodeString actual2 = l2.formatDouble(d, status).toString();
+ UnicodeString actual2 = l2.formatDouble(d, status).toString(status);
assertSuccess(message + u": Safe Path: " + caseNumber, status);
assertEquals(message + u": Safe Path: " + caseNumber, expected, actual2);
}
@@ -2529,7 +3122,7 @@ void NumberFormatterApiTest::assertFormatDescendingBig(const char16_t* umessage,
LocalizedNumberFormatter l3 = NumberFormatter::forSkeleton(normalized, status).locale(locale);
for (int32_t i = 0; i < 9; i++) {
double d = inputs[i];
- UnicodeString actual3 = l3.formatDouble(d, status).toString();
+ UnicodeString actual3 = l3.formatDouble(d, status).toString(status);
assertEquals(message + ": Skeleton Path: '" + normalized + "': " + d, expecteds[i], actual3);
}
} else {
@@ -2537,18 +3130,20 @@ void NumberFormatterApiTest::assertFormatDescendingBig(const char16_t* umessage,
}
}
-void NumberFormatterApiTest::assertFormatSingle(const char16_t* umessage, const char16_t* uskeleton,
- const UnlocalizedNumberFormatter& f, Locale locale,
- double input, const UnicodeString& expected) {
+FormattedNumber
+NumberFormatterApiTest::assertFormatSingle(const char16_t* umessage, const char16_t* uskeleton,
+ const UnlocalizedNumberFormatter& f, Locale locale,
+ double input, const UnicodeString& expected) {
UnicodeString message(TRUE, umessage, -1);
const LocalizedNumberFormatter l1 = f.threshold(0).locale(locale); // no self-regulation
const LocalizedNumberFormatter l2 = f.threshold(1).locale(locale); // all self-regulation
IcuTestErrorCode status(*this, "assertFormatSingle");
status.setScope(message);
- UnicodeString actual1 = l1.formatDouble(input, status).toString();
+ FormattedNumber result1 = l1.formatDouble(input, status);
+ UnicodeString actual1 = result1.toString(status);
assertSuccess(message + u": Unsafe Path", status);
assertEquals(message + u": Unsafe Path", expected, actual1);
- UnicodeString actual2 = l2.formatDouble(input, status).toString();
+ UnicodeString actual2 = l2.formatDouble(input, status).toString(status);
assertSuccess(message + u": Safe Path", status);
assertEquals(message + u": Safe Path", expected, actual2);
if (uskeleton != nullptr) { // if null, skeleton is declared as undefined.
@@ -2558,11 +3153,12 @@ void NumberFormatterApiTest::assertFormatSingle(const char16_t* umessage, const
UnicodeString normalized = NumberFormatter::forSkeleton(skeleton, status).toSkeleton(status);
assertEquals(message + ": Skeleton:", normalized, f.toSkeleton(status));
LocalizedNumberFormatter l3 = NumberFormatter::forSkeleton(normalized, status).locale(locale);
- UnicodeString actual3 = l3.formatDouble(input, status).toString();
+ UnicodeString actual3 = l3.formatDouble(input, status).toString(status);
assertEquals(message + ": Skeleton Path: '" + normalized + "': " + input, expected, actual3);
} else {
assertUndefinedSkeleton(f);
}
+ return result1;
}
void NumberFormatterApiTest::assertUndefinedSkeleton(const UnlocalizedNumberFormatter& f) {
@@ -2574,4 +3170,78 @@ void NumberFormatterApiTest::assertUndefinedSkeleton(const UnlocalizedNumberForm
status);
}
+void NumberFormatterApiTest::assertNumberFieldPositions(
+ const char16_t* message, const FormattedNumber& formattedNumber,
+ const UFieldPosition* expectedFieldPositions, int32_t length) {
+ IcuTestErrorCode status(*this, "assertNumberFieldPositions");
+
+ // Check FormattedValue functions
+ checkFormattedValue(
+ message,
+ static_cast<const FormattedValue&>(formattedNumber),
+ formattedNumber.toString(status),
+ UFIELD_CATEGORY_NUMBER,
+ expectedFieldPositions,
+ length);
+
+ // Check FormattedNumber-specific functions
+ UnicodeString baseMessage = UnicodeString(message) + u": " + formattedNumber.toString(status) + u": ";
+ FieldPositionIterator fpi;
+ formattedNumber.getAllFieldPositions(fpi, status);
+ int32_t i = 0;
+ FieldPosition actual;
+ while (fpi.next(actual)) {
+ UFieldPosition expected = expectedFieldPositions[i++];
+ assertEquals(
+ baseMessage + UnicodeString(u"Field, case #") + Int64ToUnicodeString(i),
+ expected.field,
+ actual.getField());
+ assertEquals(
+ baseMessage + UnicodeString(u"Iterator, begin, case #") + Int64ToUnicodeString(i),
+ expected.beginIndex,
+ actual.getBeginIndex());
+ assertEquals(
+ baseMessage + UnicodeString(u"Iterator, end, case #") + Int64ToUnicodeString(i),
+ expected.endIndex,
+ actual.getEndIndex());
+
+ // Check for the first location of the field
+ FieldPosition actual2(expected.field);
+ // Fast-forward the field to skip previous occurrences of the field:
+ actual2.setBeginIndex(expected.beginIndex);
+ actual2.setEndIndex(expected.beginIndex);
+ UBool found = formattedNumber.nextFieldPosition(actual2, status);
+ assertEquals(
+ baseMessage + UnicodeString(u"Next, found first, case #") + Int64ToUnicodeString(i),
+ (UBool) TRUE,
+ found);
+ assertEquals(
+ baseMessage + UnicodeString(u"Next, begin, case #") + Int64ToUnicodeString(i),
+ expected.beginIndex,
+ actual2.getBeginIndex());
+ assertEquals(
+ baseMessage + UnicodeString(u"Next, end, case #") + Int64ToUnicodeString(i),
+ expected.endIndex,
+ actual2.getEndIndex());
+
+ // The next position should be empty unless the field occurs again
+ UBool occursAgain = false;
+ for (int32_t j=i; j<length; j++) {
+ if (expectedFieldPositions[j].field == expected.field) {
+ occursAgain = true;
+ break;
+ }
+ }
+ if (!occursAgain) {
+ found = formattedNumber.nextFieldPosition(actual2, status);
+ assertEquals(
+ baseMessage + UnicodeString(u"Next, found second, case #") + Int64ToUnicodeString(i),
+ (UBool) FALSE,
+ found);
+ }
+ }
+ assertEquals(baseMessage + u"Should have seen every field position", length, i);
+}
+
+
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_decimalquantity.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_decimalquantity.cpp
index 48b9f91e27a..d0ccfe015a7 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_decimalquantity.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_decimalquantity.cpp
@@ -18,14 +18,18 @@ void DecimalQuantityTest::runIndexedTest(int32_t index, UBool exec, const char *
}
TESTCASE_AUTO_BEGIN;
TESTCASE_AUTO(testDecimalQuantityBehaviorStandalone);
- TESTCASE_AUTO(testSwitchStorage);;
+ TESTCASE_AUTO(testSwitchStorage);
TESTCASE_AUTO(testCopyMove);
TESTCASE_AUTO(testAppend);
- TESTCASE_AUTO(testConvertToAccurateDouble);
+ if (!quick) {
+ // Slow test: run in exhaustive mode only
+ TESTCASE_AUTO(testConvertToAccurateDouble);
+ }
TESTCASE_AUTO(testUseApproximateDoubleWhenAble);
TESTCASE_AUTO(testHardDoubleConversion);
TESTCASE_AUTO(testToDouble);
TESTCASE_AUTO(testMaxDigits);
+ TESTCASE_AUTO(testNickelRounding);
TESTCASE_AUTO_END;
}
@@ -76,27 +80,30 @@ void DecimalQuantityTest::checkDoubleBehavior(double d, bool explicitRequired) {
void DecimalQuantityTest::testDecimalQuantityBehaviorStandalone() {
UErrorCode status = U_ZERO_ERROR;
DecimalQuantity fq;
- assertToStringAndHealth(fq, u"<DecimalQuantity 999:0:0:-999 long 0E0>");
+ assertToStringAndHealth(fq, u"<DecimalQuantity 0:0 long 0E0>");
fq.setToInt(51423);
- assertToStringAndHealth(fq, u"<DecimalQuantity 999:0:0:-999 long 51423E0>");
+ assertToStringAndHealth(fq, u"<DecimalQuantity 0:0 long 51423E0>");
fq.adjustMagnitude(-3);
- assertToStringAndHealth(fq, u"<DecimalQuantity 999:0:0:-999 long 51423E-3>");
- fq.setToLong(999999999999000L);
- assertToStringAndHealth(fq, u"<DecimalQuantity 999:0:0:-999 long 999999999999E3>");
- fq.setIntegerLength(2, 5);
- assertToStringAndHealth(fq, u"<DecimalQuantity 5:2:0:-999 long 999999999999E3>");
- fq.setFractionLength(3, 6);
- assertToStringAndHealth(fq, u"<DecimalQuantity 5:2:-3:-6 long 999999999999E3>");
+ assertToStringAndHealth(fq, u"<DecimalQuantity 0:0 long 51423E-3>");
+
+ fq.setToLong(90909090909000L);
+ assertToStringAndHealth(fq, u"<DecimalQuantity 0:0 long 90909090909E3>");
+ fq.setMinInteger(2);
+ fq.applyMaxInteger(5);
+ assertToStringAndHealth(fq, u"<DecimalQuantity 2:0 long 9E3>");
+ fq.setMinFraction(3);
+ assertToStringAndHealth(fq, u"<DecimalQuantity 2:-3 long 9E3>");
+
fq.setToDouble(987.654321);
- assertToStringAndHealth(fq, u"<DecimalQuantity 5:2:-3:-6 long 987654321E-6>");
+ assertToStringAndHealth(fq, u"<DecimalQuantity 2:-3 long 987654321E-6>");
fq.roundToInfinity();
- assertToStringAndHealth(fq, u"<DecimalQuantity 5:2:-3:-6 long 987654321E-6>");
- fq.roundToIncrement(0.005, RoundingMode::UNUM_ROUND_HALFEVEN, 3, status);
+ assertToStringAndHealth(fq, u"<DecimalQuantity 2:-3 long 987654321E-6>");
+ fq.roundToIncrement(0.005, RoundingMode::UNUM_ROUND_HALFEVEN, status);
assertSuccess("Rounding to increment", status);
- assertToStringAndHealth(fq, u"<DecimalQuantity 5:2:-3:-6 long 987655E-3>");
+ assertToStringAndHealth(fq, u"<DecimalQuantity 2:-3 long 987655E-3>");
fq.roundToMagnitude(-2, RoundingMode::UNUM_ROUND_HALFEVEN, status);
assertSuccess("Rounding to magnitude", status);
- assertToStringAndHealth(fq, u"<DecimalQuantity 5:2:-3:-6 long 98766E-2>");
+ assertToStringAndHealth(fq, u"<DecimalQuantity 2:-3 long 98766E-2>");
}
void DecimalQuantityTest::testSwitchStorage() {
@@ -118,6 +125,15 @@ void DecimalQuantityTest::testSwitchStorage() {
assertFalse("Should not be using byte array", fq.isUsingBytes());
assertEquals("Failed on round", u"1.23412341234E+16", fq.toScientificString());
assertHealth(fq);
+ // Bytes with popFromLeft
+ fq.setToDecNumber({"999999999999999999"}, status);
+ assertToStringAndHealth(fq, u"<DecimalQuantity 0:0 bytes 999999999999999999E0>");
+ fq.applyMaxInteger(17);
+ assertToStringAndHealth(fq, u"<DecimalQuantity 0:0 bytes 99999999999999999E0>");
+ fq.applyMaxInteger(16);
+ assertToStringAndHealth(fq, u"<DecimalQuantity 0:0 long 9999999999999999E0>");
+ fq.applyMaxInteger(15);
+ assertToStringAndHealth(fq, u"<DecimalQuantity 0:0 long 999999999999999E0>");
}
void DecimalQuantityTest::testCopyMove() {
@@ -126,21 +142,21 @@ void DecimalQuantityTest::testCopyMove() {
DecimalQuantity a;
a.setToLong(1234123412341234L);
DecimalQuantity b = a; // copy constructor
- assertToStringAndHealth(a, u"<DecimalQuantity 999:0:0:-999 long 1234123412341234E0>");
- assertToStringAndHealth(b, u"<DecimalQuantity 999:0:0:-999 long 1234123412341234E0>");
+ assertToStringAndHealth(a, u"<DecimalQuantity 0:0 long 1234123412341234E0>");
+ assertToStringAndHealth(b, u"<DecimalQuantity 0:0 long 1234123412341234E0>");
DecimalQuantity c(std::move(a)); // move constructor
- assertToStringAndHealth(c, u"<DecimalQuantity 999:0:0:-999 long 1234123412341234E0>");
+ assertToStringAndHealth(c, u"<DecimalQuantity 0:0 long 1234123412341234E0>");
c.setToLong(54321L);
- assertToStringAndHealth(c, u"<DecimalQuantity 999:0:0:-999 long 54321E0>");
+ assertToStringAndHealth(c, u"<DecimalQuantity 0:0 long 54321E0>");
c = b; // copy assignment
- assertToStringAndHealth(b, u"<DecimalQuantity 999:0:0:-999 long 1234123412341234E0>");
- assertToStringAndHealth(c, u"<DecimalQuantity 999:0:0:-999 long 1234123412341234E0>");
+ assertToStringAndHealth(b, u"<DecimalQuantity 0:0 long 1234123412341234E0>");
+ assertToStringAndHealth(c, u"<DecimalQuantity 0:0 long 1234123412341234E0>");
b.setToLong(45678);
c.setToLong(56789);
c = std::move(b); // move assignment
- assertToStringAndHealth(c, u"<DecimalQuantity 999:0:0:-999 long 45678E0>");
+ assertToStringAndHealth(c, u"<DecimalQuantity 0:0 long 45678E0>");
a = std::move(c); // move assignment to a defunct object
- assertToStringAndHealth(a, u"<DecimalQuantity 999:0:0:-999 long 45678E0>");
+ assertToStringAndHealth(a, u"<DecimalQuantity 0:0 long 45678E0>");
}
// Large numbers (requires byte allocation)
@@ -149,21 +165,21 @@ void DecimalQuantityTest::testCopyMove() {
DecimalQuantity a;
a.setToDecNumber({"1234567890123456789", -1}, status);
DecimalQuantity b = a; // copy constructor
- assertToStringAndHealth(a, u"<DecimalQuantity 999:0:0:-999 bytes 1234567890123456789E0>");
- assertToStringAndHealth(b, u"<DecimalQuantity 999:0:0:-999 bytes 1234567890123456789E0>");
+ assertToStringAndHealth(a, u"<DecimalQuantity 0:0 bytes 1234567890123456789E0>");
+ assertToStringAndHealth(b, u"<DecimalQuantity 0:0 bytes 1234567890123456789E0>");
DecimalQuantity c(std::move(a)); // move constructor
- assertToStringAndHealth(c, u"<DecimalQuantity 999:0:0:-999 bytes 1234567890123456789E0>");
+ assertToStringAndHealth(c, u"<DecimalQuantity 0:0 bytes 1234567890123456789E0>");
c.setToDecNumber({"9876543210987654321", -1}, status);
- assertToStringAndHealth(c, u"<DecimalQuantity 999:0:0:-999 bytes 9876543210987654321E0>");
+ assertToStringAndHealth(c, u"<DecimalQuantity 0:0 bytes 9876543210987654321E0>");
c = b; // copy assignment
- assertToStringAndHealth(b, u"<DecimalQuantity 999:0:0:-999 bytes 1234567890123456789E0>");
- assertToStringAndHealth(c, u"<DecimalQuantity 999:0:0:-999 bytes 1234567890123456789E0>");
+ assertToStringAndHealth(b, u"<DecimalQuantity 0:0 bytes 1234567890123456789E0>");
+ assertToStringAndHealth(c, u"<DecimalQuantity 0:0 bytes 1234567890123456789E0>");
b.setToDecNumber({"876543210987654321", -1}, status);
c.setToDecNumber({"987654321098765432", -1}, status);
c = std::move(b); // move assignment
- assertToStringAndHealth(c, u"<DecimalQuantity 999:0:0:-999 bytes 876543210987654321E0>");
+ assertToStringAndHealth(c, u"<DecimalQuantity 0:0 bytes 876543210987654321E0>");
a = std::move(c); // move assignment to a defunct object
- assertToStringAndHealth(a, u"<DecimalQuantity 999:0:0:-999 bytes 876543210987654321E0>");
+ assertToStringAndHealth(a, u"<DecimalQuantity 0:0 bytes 876543210987654321E0>");
}
}
@@ -363,8 +379,10 @@ void DecimalQuantityTest::testMaxDigits() {
DecimalQuantity dq;
dq.setToDouble(876.543);
dq.roundToInfinity();
- dq.setIntegerLength(0, 2);
- dq.setFractionLength(0, 2);
+ dq.setMinInteger(0);
+ dq.applyMaxInteger(2);
+ dq.setMinFraction(0);
+ dq.roundToMagnitude(-2, UNUM_ROUND_FLOOR, status);
assertEquals("Should trim, toPlainString", "76.54", dq.toPlainString());
assertEquals("Should trim, toScientificString", "7.654E+1", dq.toScientificString());
assertEquals("Should trim, toLong", 76LL, dq.toLong(true));
@@ -375,9 +393,78 @@ void DecimalQuantityTest::testMaxDigits() {
dq.toDecNum(dn, status);
DecimalQuantity copy;
copy.setToDecNum(dn, status);
- if (!logKnownIssue("13701")) {
- assertEquals("Should trim, toDecNum", "76.54", copy.toPlainString());
+ assertEquals("Should trim, toDecNum", "76.54", copy.toPlainString());
+}
+
+void DecimalQuantityTest::testNickelRounding() {
+ IcuTestErrorCode status(*this, "testNickelRounding");
+ struct TestCase {
+ double input;
+ int32_t magnitude;
+ UNumberFormatRoundingMode roundingMode;
+ const char16_t* expected;
+ } cases[] = {
+ {1.000, -2, UNUM_ROUND_HALFEVEN, u"1"},
+ {1.001, -2, UNUM_ROUND_HALFEVEN, u"1"},
+ {1.010, -2, UNUM_ROUND_HALFEVEN, u"1"},
+ {1.020, -2, UNUM_ROUND_HALFEVEN, u"1"},
+ {1.024, -2, UNUM_ROUND_HALFEVEN, u"1"},
+ {1.025, -2, UNUM_ROUND_HALFEVEN, u"1"},
+ {1.025, -2, UNUM_ROUND_HALFDOWN, u"1"},
+ {1.025, -2, UNUM_ROUND_HALFUP, u"1.05"},
+ {1.026, -2, UNUM_ROUND_HALFEVEN, u"1.05"},
+ {1.030, -2, UNUM_ROUND_HALFEVEN, u"1.05"},
+ {1.040, -2, UNUM_ROUND_HALFEVEN, u"1.05"},
+ {1.050, -2, UNUM_ROUND_HALFEVEN, u"1.05"},
+ {1.060, -2, UNUM_ROUND_HALFEVEN, u"1.05"},
+ {1.070, -2, UNUM_ROUND_HALFEVEN, u"1.05"},
+ {1.074, -2, UNUM_ROUND_HALFEVEN, u"1.05"},
+ {1.075, -2, UNUM_ROUND_HALFDOWN, u"1.05"},
+ {1.075, -2, UNUM_ROUND_HALFUP, u"1.1"},
+ {1.075, -2, UNUM_ROUND_HALFEVEN, u"1.1"},
+ {1.076, -2, UNUM_ROUND_HALFEVEN, u"1.1"},
+ {1.080, -2, UNUM_ROUND_HALFEVEN, u"1.1"},
+ {1.090, -2, UNUM_ROUND_HALFEVEN, u"1.1"},
+ {1.099, -2, UNUM_ROUND_HALFEVEN, u"1.1"},
+ {1.999, -2, UNUM_ROUND_HALFEVEN, u"2"},
+ {2.25, -1, UNUM_ROUND_HALFEVEN, u"2"},
+ {2.25, -1, UNUM_ROUND_HALFUP, u"2.5"},
+ {2.75, -1, UNUM_ROUND_HALFDOWN, u"2.5"},
+ {2.75, -1, UNUM_ROUND_HALFEVEN, u"3"},
+ {3.00, -1, UNUM_ROUND_CEILING, u"3"},
+ {3.25, -1, UNUM_ROUND_CEILING, u"3.5"},
+ {3.50, -1, UNUM_ROUND_CEILING, u"3.5"},
+ {3.75, -1, UNUM_ROUND_CEILING, u"4"},
+ {4.00, -1, UNUM_ROUND_FLOOR, u"4"},
+ {4.25, -1, UNUM_ROUND_FLOOR, u"4"},
+ {4.50, -1, UNUM_ROUND_FLOOR, u"4.5"},
+ {4.75, -1, UNUM_ROUND_FLOOR, u"4.5"},
+ {5.00, -1, UNUM_ROUND_UP, u"5"},
+ {5.25, -1, UNUM_ROUND_UP, u"5.5"},
+ {5.50, -1, UNUM_ROUND_UP, u"5.5"},
+ {5.75, -1, UNUM_ROUND_UP, u"6"},
+ {6.00, -1, UNUM_ROUND_DOWN, u"6"},
+ {6.25, -1, UNUM_ROUND_DOWN, u"6"},
+ {6.50, -1, UNUM_ROUND_DOWN, u"6.5"},
+ {6.75, -1, UNUM_ROUND_DOWN, u"6.5"},
+ {7.00, -1, UNUM_ROUND_UNNECESSARY, u"7"},
+ {7.50, -1, UNUM_ROUND_UNNECESSARY, u"7.5"},
+ };
+ for (const auto& cas : cases) {
+ UnicodeString message = DoubleToUnicodeString(cas.input) + u" @ " + Int64ToUnicodeString(cas.magnitude) + u" / " + Int64ToUnicodeString(cas.roundingMode);
+ status.setScope(message);
+ DecimalQuantity dq;
+ dq.setToDouble(cas.input);
+ dq.roundToNickel(cas.magnitude, cas.roundingMode, status);
+ status.errIfFailureAndReset();
+ UnicodeString actual = dq.toPlainString();
+ assertEquals(message, cas.expected, actual);
}
+ status.setScope("");
+ DecimalQuantity dq;
+ dq.setToDouble(7.1);
+ dq.roundToNickel(-1, UNUM_ROUND_UNNECESSARY, status);
+ status.expectErrorAndReset(U_FORMAT_INEXACT_ERROR);
}
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_modifiers.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_modifiers.cpp
index 52f4f494751..90144ad1c64 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_modifiers.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_modifiers.cpp
@@ -7,7 +7,7 @@
#include "putilimp.h"
#include "intltest.h"
-#include "number_stringbuilder.h"
+#include "formatted_string_builder.h"
#include "number_modifiers.h"
#include "numbertest.h"
@@ -36,8 +36,8 @@ void ModifiersTest::testConstantAffixModifier() {
void ModifiersTest::testConstantMultiFieldModifier() {
UErrorCode status = U_ZERO_ERROR;
- NumberStringBuilder prefix;
- NumberStringBuilder suffix;
+ FormattedStringBuilder prefix;
+ FormattedStringBuilder suffix;
ConstantMultiFieldModifier mod1(prefix, suffix, false, true);
assertModifierEquals(mod1, 0, true, u"|", u"n", status);
assertSuccess("Spot 1", status);
@@ -87,7 +87,7 @@ void ModifiersTest::testSimpleModifier() {
// Test strange insertion positions
for (int32_t j = 0; j < NUM_OUTPUTS; j++) {
- NumberStringBuilder output;
+ FormattedStringBuilder output;
output.append(outputs[j].baseString, UNUM_FIELD_COUNT, status);
mod.apply(output, outputs[j].leftIndex, outputs[j].rightIndex, status);
UnicodeString expected = expecteds[j][i];
@@ -105,8 +105,8 @@ void ModifiersTest::testCurrencySpacingEnabledModifier() {
return;
}
- NumberStringBuilder prefix;
- NumberStringBuilder suffix;
+ FormattedStringBuilder prefix;
+ FormattedStringBuilder suffix;
CurrencySpacingEnabledModifier mod1(prefix, suffix, false, true, symbols, status);
assertSuccess("Spot 2", status);
assertModifierEquals(mod1, 0, true, u"|", u"n", status);
@@ -120,15 +120,15 @@ void ModifiersTest::testCurrencySpacingEnabledModifier() {
assertSuccess("Spot 6", status);
// Test the default currency spacing rules
- NumberStringBuilder sb;
+ FormattedStringBuilder sb;
sb.append("123", UNUM_INTEGER_FIELD, status);
assertSuccess("Spot 7", status);
- NumberStringBuilder sb1(sb);
+ FormattedStringBuilder sb1(sb);
assertModifierEquals(mod2, sb1, 3, true, u"USD\u00A0123", u"$$$niii", status);
assertSuccess("Spot 8", status);
// Compare with the unsafe code path
- NumberStringBuilder sb2(sb);
+ FormattedStringBuilder sb2(sb);
sb2.insert(0, "USD", UNUM_CURRENCY_FIELD, status);
assertSuccess("Spot 9", status);
CurrencySpacingEnabledModifier::applyCurrencySpacing(sb2, 0, 3, 6, 0, symbols, status);
@@ -149,14 +149,14 @@ void ModifiersTest::testCurrencySpacingEnabledModifier() {
void ModifiersTest::assertModifierEquals(const Modifier &mod, int32_t expectedPrefixLength,
bool expectedStrong, UnicodeString expectedChars,
UnicodeString expectedFields, UErrorCode &status) {
- NumberStringBuilder sb;
+ FormattedStringBuilder sb;
sb.appendCodePoint('|', UNUM_FIELD_COUNT, status);
assertModifierEquals(
mod, sb, expectedPrefixLength, expectedStrong, expectedChars, expectedFields, status);
}
-void ModifiersTest::assertModifierEquals(const Modifier &mod, NumberStringBuilder &sb,
+void ModifiersTest::assertModifierEquals(const Modifier &mod, FormattedStringBuilder &sb,
int32_t expectedPrefixLength, bool expectedStrong,
UnicodeString expectedChars, UnicodeString expectedFields,
UErrorCode &status) {
@@ -171,7 +171,7 @@ void ModifiersTest::assertModifierEquals(const Modifier &mod, NumberStringBuilde
}
UnicodeString debugString;
- debugString.append(u"<NumberStringBuilder [");
+ debugString.append(u"<FormattedStringBuilder [");
debugString.append(expectedChars);
debugString.append(u"] [");
debugString.append(expectedFields);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_parse.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_parse.cpp
index d5276b4fac3..12ecc751bc7 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_parse.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_parse.cpp
@@ -14,8 +14,6 @@
#include <cmath>
#include <numparse_affixes.h>
-using icu::unisets::get;
-
void NumberParserTest::runIndexedTest(int32_t index, UBool exec, const char*& name, char*) {
if (exec) {
logln("TestSuite NumberParserTest: ");
@@ -25,6 +23,8 @@ void NumberParserTest::runIndexedTest(int32_t index, UBool exec, const char*& na
TESTCASE_AUTO(testSeriesMatcher);
TESTCASE_AUTO(testCombinedCurrencyMatcher);
TESTCASE_AUTO(testAffixPatternMatcher);
+ TESTCASE_AUTO(test20360_BidiOverflow);
+ TESTCASE_AUTO(testInfiniteRecursion);
TESTCASE_AUTO_END;
}
@@ -111,6 +111,10 @@ void NumberParserTest::testBasic() {
{3, u"𝟱.𝟭𝟰𝟮E𝟯", u"0", 12, 5142.},
{3, u"𝟱.𝟭𝟰𝟮E-𝟯", u"0", 13, 0.005142},
{3, u"𝟱.𝟭𝟰𝟮e-𝟯", u"0", 13, 0.005142},
+ {3, u"5.142e+3", u"0", 8, 5142.0 },
+ {3, u"5.142\u200Ee+3", u"0", 9, 5142.0},
+ {3, u"5.142e\u200E+3", u"0", 9, 5142.0},
+ {3, u"5.142e+\u200E3", u"0", 9, 5142.0},
{7, u"5,142.50 Canadian dollars", u"#,##,##0 ¤¤¤", 25, 5142.5},
{3, u"a$ b5", u"a ¤ b0", 5, 5.0},
{3, u"📺1.23", u"📺0;📻0", 6, 1.23},
@@ -139,10 +143,10 @@ void NumberParserTest::testBasic() {
ParsedNumber resultObject;
parser->parse(inputString, true, resultObject, status);
assertTrue("Greedy Parse failed: " + message, resultObject.success());
- assertEquals(
- "Greedy Parse failed: " + message, cas.expectedCharsConsumed, resultObject.charEnd);
- assertEquals(
- "Greedy Parse failed: " + message, cas.expectedResultDouble, resultObject.getDouble());
+ assertEquals("Greedy Parse failed: " + message,
+ cas.expectedCharsConsumed, resultObject.charEnd);
+ assertEquals("Greedy Parse failed: " + message,
+ cas.expectedResultDouble, resultObject.getDouble(status));
}
if (0 != (cas.flags & 0x02)) {
@@ -157,7 +161,7 @@ void NumberParserTest::testBasic() {
assertEquals(
"Non-Greedy Parse failed: " + message,
cas.expectedResultDouble,
- resultObject.getDouble());
+ resultObject.getDouble(status));
}
if (0 != (cas.flags & 0x04)) {
@@ -171,10 +175,10 @@ void NumberParserTest::testBasic() {
ParsedNumber resultObject;
parser->parse(inputString, true, resultObject, status);
assertTrue("Strict Parse failed: " + message, resultObject.success());
- assertEquals(
- "Strict Parse failed: " + message, cas.expectedCharsConsumed, resultObject.charEnd);
- assertEquals(
- "Strict Parse failed: " + message, cas.expectedResultDouble, resultObject.getDouble());
+ assertEquals("Strict Parse failed: " + message,
+ cas.expectedCharsConsumed, resultObject.charEnd);
+ assertEquals("Strict Parse failed: " + message,
+ cas.expectedResultDouble, resultObject.getDouble(status));
}
}
}
@@ -188,9 +192,9 @@ void NumberParserTest::testSeriesMatcher() {
}
PlusSignMatcher m0(symbols, false);
MinusSignMatcher m1(symbols, false);
- IgnorablesMatcher m2(unisets::DEFAULT_IGNORABLES);
+ IgnorablesMatcher m2(0);
PercentMatcher m3(symbols);
- IgnorablesMatcher m4(unisets::DEFAULT_IGNORABLES);
+ IgnorablesMatcher m4(0);
ArraySeriesMatcher::MatcherArray matchers(5);
matchers[0] = &m0;
@@ -238,7 +242,7 @@ void NumberParserTest::testSeriesMatcher() {
void NumberParserTest::testCombinedCurrencyMatcher() {
IcuTestErrorCode status(*this, "testCombinedCurrencyMatcher");
- IgnorablesMatcher ignorables(unisets::DEFAULT_IGNORABLES);
+ IgnorablesMatcher ignorables(0);
Locale locale = Locale::getEnglish();
DecimalFormatSymbols dfs(locale, status);
@@ -305,7 +309,7 @@ void NumberParserTest::testCombinedCurrencyMatcher() {
void NumberParserTest::testAffixPatternMatcher() {
IcuTestErrorCode status(*this, "testAffixPatternMatcher");
Locale locale = Locale::getEnglish();
- IgnorablesMatcher ignorables(unisets::DEFAULT_IGNORABLES);
+ IgnorablesMatcher ignorables(0);
DecimalFormatSymbols dfs(locale, status);
dfs.setSymbol(DecimalFormatSymbols::kCurrencySymbol, u"IU$", status);
@@ -350,5 +354,59 @@ void NumberParserTest::testAffixPatternMatcher() {
}
}
+void NumberParserTest::test20360_BidiOverflow() {
+ IcuTestErrorCode status(*this, "test20360_BidiOverflow");
+ UnicodeString inputString;
+ inputString.append(u'-');
+ for (int32_t i=0; i<100000; i++) {
+ inputString.append(u'\u061C');
+ }
+ inputString.append(u'5');
+
+ LocalPointer<const NumberParserImpl> parser(NumberParserImpl::createSimpleParser("en", u"0", 0, status));
+ if (status.errDataIfFailureAndReset("createSimpleParser() failed")) {
+ return;
+ }
+
+ ParsedNumber resultObject;
+ parser->parse(inputString, true, resultObject, status);
+ assertTrue("Greedy Parse, success", resultObject.success());
+ assertEquals("Greedy Parse, chars consumed", 100002, resultObject.charEnd);
+ assertEquals("Greedy Parse, expected double", -5.0, resultObject.getDouble(status));
+
+ resultObject.clear();
+ parser->parse(inputString, false, resultObject, status);
+ assertFalse("Non-Greedy Parse, success", resultObject.success());
+ assertEquals("Non-Greedy Parse, chars consumed", 1, resultObject.charEnd);
+}
+
+void NumberParserTest::testInfiniteRecursion() {
+ IcuTestErrorCode status(*this, "testInfiniteRecursion");
+ UnicodeString inputString;
+ inputString.append(u'-');
+ for (int32_t i=0; i<200; i++) {
+ inputString.append(u'\u061C');
+ }
+ inputString.append(u'5');
+
+ LocalPointer<const NumberParserImpl> parser(NumberParserImpl::createSimpleParser("en", u"0", 0, status));
+ if (status.errDataIfFailureAndReset("createSimpleParser() failed")) {
+ return;
+ }
+
+ ParsedNumber resultObject;
+ parser->parse(inputString, false, resultObject, status);
+ assertFalse("Default recursion limit, success", resultObject.success());
+ assertEquals("Default recursion limit, chars consumed", 1, resultObject.charEnd);
+
+ parser.adoptInstead(NumberParserImpl::createSimpleParser(
+ "en", u"0", PARSE_FLAG_ALLOW_INFINITE_RECURSION, status));
+ resultObject.clear();
+ parser->parse(inputString, false, resultObject, status);
+ assertTrue("Unlimited recursion, success", resultObject.success());
+ assertEquals("Unlimited recursion, chars consumed", 202, resultObject.charEnd);
+ assertEquals("Unlimited recursion, expected double", -5.0, resultObject.getDouble(status));
+}
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_patternmodifier.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_patternmodifier.cpp
index 3a0fda82675..8f612423c37 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_patternmodifier.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_patternmodifier.cpp
@@ -26,7 +26,7 @@ void PatternModifierTest::testBasic() {
ParsedPatternInfo patternInfo;
PatternParser::parseToPatternInfo(u"a0b", patternInfo, status);
assertSuccess("Spot 1", status);
- mod.setPatternInfo(&patternInfo);
+ mod.setPatternInfo(&patternInfo, UNUM_FIELD_COUNT);
mod.setPatternAttributes(UNUM_SIGN_AUTO, false);
DecimalFormatSymbols symbols(Locale::getEnglish(), status);
CurrencySymbols currencySymbols({u"USD", status}, "en", status);
@@ -35,19 +35,19 @@ void PatternModifierTest::testBasic() {
}
mod.setSymbols(&symbols, &currencySymbols, UNUM_UNIT_WIDTH_SHORT, nullptr);
- mod.setNumberProperties(1, StandardPlural::Form::COUNT);
+ mod.setNumberProperties(SIGNUM_POS, StandardPlural::Form::COUNT);
assertEquals("Pattern a0b", u"a", getPrefix(mod, status));
assertEquals("Pattern a0b", u"b", getSuffix(mod, status));
mod.setPatternAttributes(UNUM_SIGN_ALWAYS, false);
assertEquals("Pattern a0b", u"+a", getPrefix(mod, status));
assertEquals("Pattern a0b", u"b", getSuffix(mod, status));
- mod.setNumberProperties(0, StandardPlural::Form::COUNT);
+ mod.setNumberProperties(SIGNUM_ZERO, StandardPlural::Form::COUNT);
assertEquals("Pattern a0b", u"+a", getPrefix(mod, status));
assertEquals("Pattern a0b", u"b", getSuffix(mod, status));
mod.setPatternAttributes(UNUM_SIGN_EXCEPT_ZERO, false);
assertEquals("Pattern a0b", u"a", getPrefix(mod, status));
assertEquals("Pattern a0b", u"b", getSuffix(mod, status));
- mod.setNumberProperties(-1, StandardPlural::Form::COUNT);
+ mod.setNumberProperties(SIGNUM_NEG, StandardPlural::Form::COUNT);
assertEquals("Pattern a0b", u"-a", getPrefix(mod, status));
assertEquals("Pattern a0b", u"b", getSuffix(mod, status));
mod.setPatternAttributes(UNUM_SIGN_NEVER, false);
@@ -58,21 +58,21 @@ void PatternModifierTest::testBasic() {
ParsedPatternInfo patternInfo2;
PatternParser::parseToPatternInfo(u"a0b;c-0d", patternInfo2, status);
assertSuccess("Spot 4", status);
- mod.setPatternInfo(&patternInfo2);
+ mod.setPatternInfo(&patternInfo2, UNUM_FIELD_COUNT);
mod.setPatternAttributes(UNUM_SIGN_AUTO, false);
- mod.setNumberProperties(1, StandardPlural::Form::COUNT);
+ mod.setNumberProperties(SIGNUM_POS, StandardPlural::Form::COUNT);
assertEquals("Pattern a0b;c-0d", u"a", getPrefix(mod, status));
assertEquals("Pattern a0b;c-0d", u"b", getSuffix(mod, status));
mod.setPatternAttributes(UNUM_SIGN_ALWAYS, false);
assertEquals("Pattern a0b;c-0d", u"c+", getPrefix(mod, status));
assertEquals("Pattern a0b;c-0d", u"d", getSuffix(mod, status));
- mod.setNumberProperties(0, StandardPlural::Form::COUNT);
+ mod.setNumberProperties(SIGNUM_ZERO, StandardPlural::Form::COUNT);
assertEquals("Pattern a0b;c-0d", u"c+", getPrefix(mod, status));
assertEquals("Pattern a0b;c-0d", u"d", getSuffix(mod, status));
mod.setPatternAttributes(UNUM_SIGN_EXCEPT_ZERO, false);
assertEquals("Pattern a0b;c-0d", u"a", getPrefix(mod, status));
assertEquals("Pattern a0b;c-0d", u"b", getSuffix(mod, status));
- mod.setNumberProperties(-1, StandardPlural::Form::COUNT);
+ mod.setNumberProperties(SIGNUM_NEG, StandardPlural::Form::COUNT);
assertEquals("Pattern a0b;c-0d", u"c-", getPrefix(mod, status));
assertEquals("Pattern a0b;c-0d", u"d", getSuffix(mod, status));
mod.setPatternAttributes(UNUM_SIGN_NEVER, false);
@@ -88,7 +88,7 @@ void PatternModifierTest::testPatternWithNoPlaceholder() {
ParsedPatternInfo patternInfo;
PatternParser::parseToPatternInfo(u"abc", patternInfo, status);
assertSuccess("Spot 1", status);
- mod.setPatternInfo(&patternInfo);
+ mod.setPatternInfo(&patternInfo, UNUM_FIELD_COUNT);
mod.setPatternAttributes(UNUM_SIGN_AUTO, false);
DecimalFormatSymbols symbols(Locale::getEnglish(), status);
CurrencySymbols currencySymbols({u"USD", status}, "en", status);
@@ -96,10 +96,10 @@ void PatternModifierTest::testPatternWithNoPlaceholder() {
return;
}
mod.setSymbols(&symbols, &currencySymbols, UNUM_UNIT_WIDTH_SHORT, nullptr);
- mod.setNumberProperties(1, StandardPlural::Form::COUNT);
+ mod.setNumberProperties(SIGNUM_POS, StandardPlural::Form::COUNT);
// Unsafe Code Path
- NumberStringBuilder nsb;
+ FormattedStringBuilder nsb;
nsb.append(u"x123y", UNUM_FIELD_COUNT, status);
assertSuccess("Spot 3", status);
mod.apply(nsb, 1, 4, status);
@@ -119,7 +119,7 @@ void PatternModifierTest::testPatternWithNoPlaceholder() {
return;
}
DecimalQuantity quantity;
- imod->applyToMicros(micros, quantity);
+ imod->applyToMicros(micros, quantity, status);
micros.modMiddle->apply(nsb, 1, 4, status);
assertSuccess("Spot 7", status);
assertEquals("Safe Path", u"xabcy", nsb.toUnicodeString());
@@ -131,7 +131,7 @@ void PatternModifierTest::testMutableEqualsImmutable() {
ParsedPatternInfo patternInfo;
PatternParser::parseToPatternInfo("a0b;c-0d", patternInfo, status);
assertSuccess("Spot 1", status);
- mod.setPatternInfo(&patternInfo);
+ mod.setPatternInfo(&patternInfo, UNUM_FIELD_COUNT);
mod.setPatternAttributes(UNUM_SIGN_AUTO, false);
DecimalFormatSymbols symbols(Locale::getEnglish(), status);
CurrencySymbols currencySymbols({u"USD", status}, "en", status);
@@ -141,21 +141,21 @@ void PatternModifierTest::testMutableEqualsImmutable() {
DecimalQuantity fq;
fq.setToInt(1);
- NumberStringBuilder nsb1;
+ FormattedStringBuilder nsb1;
MicroProps micros1;
mod.addToChain(&micros1);
mod.processQuantity(fq, micros1, status);
micros1.modMiddle->apply(nsb1, 0, 0, status);
assertSuccess("Spot 3", status);
- NumberStringBuilder nsb2;
+ FormattedStringBuilder nsb2;
MicroProps micros2;
LocalPointer<ImmutablePatternModifier> immutable(mod.createImmutable(status));
- immutable->applyToMicros(micros2, fq);
+ immutable->applyToMicros(micros2, fq, status);
micros2.modMiddle->apply(nsb2, 0, 0, status);
assertSuccess("Spot 4", status);
- NumberStringBuilder nsb3;
+ FormattedStringBuilder nsb3;
MicroProps micros3;
mod.addToChain(&micros3);
mod.setPatternAttributes(UNUM_SIGN_ALWAYS, false);
@@ -168,14 +168,14 @@ void PatternModifierTest::testMutableEqualsImmutable() {
}
UnicodeString PatternModifierTest::getPrefix(const MutablePatternModifier &mod, UErrorCode &status) {
- NumberStringBuilder nsb;
+ FormattedStringBuilder nsb;
mod.apply(nsb, 0, 0, status);
int32_t prefixLength = mod.getPrefixLength();
return UnicodeString(nsb.toUnicodeString(), 0, prefixLength);
}
UnicodeString PatternModifierTest::getSuffix(const MutablePatternModifier &mod, UErrorCode &status) {
- NumberStringBuilder nsb;
+ FormattedStringBuilder nsb;
mod.apply(nsb, 0, 0, status);
int32_t prefixLength = mod.getPrefixLength();
return UnicodeString(nsb.toUnicodeString(), prefixLength, nsb.length() - prefixLength);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_permutation.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_permutation.cpp
new file mode 100644
index 00000000000..85f32d550b5
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_permutation.cpp
@@ -0,0 +1,198 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
+#include <fstream>
+#include <iostream>
+#include <vector>
+
+#include "numbertest.h"
+#include "ucbuf.h"
+#include "unicode/numberformatter.h"
+
+void NumberPermutationTest::runIndexedTest(int32_t index, UBool exec, const char*& name, char*) {
+ if (exec) {
+ logln("TestSuite NumberPermutationTest: ");
+ }
+ TESTCASE_AUTO_BEGIN;
+ TESTCASE_AUTO(testPermutations);
+ TESTCASE_AUTO_END;
+}
+
+static const char16_t* kSkeletonParts[] = {
+ // Notation
+ u"compact-short",
+ u"scientific/+ee/sign-always",
+ nullptr,
+ // Unit
+ u"percent",
+ u"currency/EUR",
+ u"measure-unit/length-furlong",
+ nullptr,
+ // Unit Width
+ u"unit-width-narrow",
+ u"unit-width-full-name",
+ nullptr,
+ // Precision
+ u"precision-integer",
+ u".000",
+ u".##/@@@+",
+ u"@@",
+ nullptr,
+ // Rounding Mode
+ u"rounding-mode-floor",
+ nullptr,
+ // Integer Width
+ u"integer-width/##00",
+ nullptr,
+ // Scale
+ u"scale/0.5",
+ nullptr,
+ // Grouping
+ u"group-on-aligned",
+ nullptr,
+ // Symbols
+ u"latin",
+ nullptr,
+ // Sign Display
+ u"sign-accounting-except-zero",
+ nullptr,
+ // Decimal Separator Display
+ u"decimal-always",
+ nullptr,
+};
+
+static const double kNumbersToTest[]{0, 91827.3645, -0.22222};
+
+/**
+ * Test permutations of 3 orthogonal skeleton parts from the list above.
+ * Compare the results against the golden data file:
+ * numberpermutationtest.txt
+ * To regenerate that file, run intltest with the -G option.
+ */
+void NumberPermutationTest::testPermutations() {
+ IcuTestErrorCode status(*this, "testPermutations");
+
+ const struct LocaleData {
+ Locale locale;
+ const char16_t* ustring;
+ } localesToTest[] = {
+ {"es-MX", u"es-MX"},
+ {"zh-TW", u"zh-TW"},
+ {"bn-BD", u"bn-BD"},
+ };
+
+ // Convert kSkeletonParts to a more convenient data structure
+ auto skeletonParts = std::vector<std::vector<const char16_t*>>();
+ auto currentSection = std::vector<const char16_t*>();
+ for (int32_t i = 0; i < UPRV_LENGTHOF(kSkeletonParts); i++) {
+ const char16_t* skeletonPart = kSkeletonParts[i];
+ if (skeletonPart == nullptr) {
+ skeletonParts.push_back(currentSection);
+ currentSection.clear();
+ } else {
+ currentSection.push_back(skeletonPart);
+ }
+ }
+
+ // Build up the golden data string as we evaluate all permutations
+ std::vector<UnicodeString> resultLines;
+ resultLines.push_back(u"# © 2019 and later: Unicode, Inc. and others.");
+ resultLines.push_back(u"# License & terms of use: http://www.unicode.org/copyright.html");
+ resultLines.push_back(UnicodeString());
+
+ // Take combinations of 3 orthogonal options
+ for (size_t i = 0; i < skeletonParts.size() - 2; i++) {
+ const auto& skeletons1 = skeletonParts[i];
+ for (size_t j = i + 1; j < skeletonParts.size() - 1; j++) {
+ const auto& skeletons2 = skeletonParts[j];
+ for (size_t k = j + 1; k < skeletonParts.size(); k++) {
+ const auto& skeletons3 = skeletonParts[k];
+
+ // Evaluate all combinations of skeletons for these options
+ for (const auto& skel1 : skeletons1) {
+ for (const auto& skel2 : skeletons2) {
+ for (const auto& skel3 : skeletons3) {
+ // Compute the skeleton
+ UnicodeString skeleton;
+ skeleton
+ .append(skel1) //
+ .append(u' ') //
+ .append(skel2) //
+ .append(u' ') //
+ .append(skel3);
+ resultLines.push_back(skeleton);
+
+ // Check several locales and several numbers in each locale
+ for (const auto& locData : localesToTest) {
+ auto lnf = NumberFormatter::forSkeleton(skeleton, status)
+ .locale(locData.locale);
+ resultLines.push_back(UnicodeString(u" ").append(locData.ustring));
+ for (const auto& input : kNumbersToTest) {
+ resultLines.push_back(UnicodeString(u" ").append(
+ lnf.formatDouble(input, status).toTempString(status)));
+ }
+ }
+
+ resultLines.push_back(UnicodeString());
+ }
+ }
+ }
+ }
+
+ // Quick mode: test all fields at least once but stop early.
+ if (quick) {
+ infoln(u"Quick mode: stopped after " + Int64ToUnicodeString(resultLines.size()) +
+ u" lines");
+ goto outerEnd;
+ }
+ }
+ }
+outerEnd:
+ void();
+
+ CharString goldenFilePath(getSourceTestData(status), status);
+ goldenFilePath.appendPathPart("numberpermutationtest.txt", status);
+
+ // Compare it to the golden file
+ const char* codePage = "UTF-8";
+ LocalUCHARBUFPointer f(ucbuf_open(goldenFilePath.data(), &codePage, TRUE, FALSE, status));
+ if (!assertSuccess("Can't open data file", status)) {
+ return;
+ }
+
+ int32_t lineNumber = 1;
+ int32_t lineLength;
+ for (const auto& actualLine : resultLines) {
+ const UChar* lineBuf = ucbuf_readline(f.getAlias(), &lineLength, status);
+ if (lineBuf == nullptr) {
+ errln("More lines generated than are in the data file!");
+ break;
+ }
+ UnicodeString expectedLine(lineBuf, lineLength - 1);
+ assertEquals(u"Line #" + Int64ToUnicodeString(lineNumber) + u" differs", //
+ expectedLine, actualLine);
+ lineNumber++;
+ }
+ // Quick mode: test all fields at least once but stop early.
+ if (!quick && ucbuf_readline(f.getAlias(), &lineLength, status) != nullptr) {
+ errln("Fewer lines generated than are in the data file!");
+ }
+
+ // Overwrite the golden data if requested
+ if (write_golden_data) {
+ std::ofstream outFile;
+ outFile.open(goldenFilePath.data());
+ for (const auto& uniLine : resultLines) {
+ std::string byteLine;
+ uniLine.toUTF8String(byteLine);
+ outFile << byteLine << std::endl;
+ }
+ outFile.close();
+ }
+}
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_range.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_range.cpp
index 571864644f6..75816ba9573 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_range.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_range.cpp
@@ -48,7 +48,9 @@ void NumberRangeFormatterTest::runIndexedTest(int32_t index, UBool exec, const c
TESTCASE_AUTO(testIdentity);
TESTCASE_AUTO(testDifferentFormatters);
TESTCASE_AUTO(testPlurals);
+ TESTCASE_AUTO(testFieldPositions);
TESTCASE_AUTO(testCopyMove);
+ TESTCASE_AUTO(toObject);
TESTCASE_AUTO_END;
}
@@ -646,7 +648,7 @@ void NumberRangeFormatterTest::testDifferentFormatters() {
u"Different rounding rules",
NumberRangeFormatter::with()
.numberFormatterFirst(NumberFormatter::with().precision(Precision::integer()))
- .numberFormatterSecond(NumberFormatter::with().precision(Precision::fixedDigits(2))),
+ .numberFormatterSecond(NumberFormatter::with().precision(Precision::fixedSignificantDigits(2))),
Locale("en-us"),
u"1–5.0",
u"5–5.0",
@@ -713,9 +715,9 @@ void NumberRangeFormatterTest::testPlurals() {
{5, 5, u"5–5 britanskih funtov"}, // other + other -> other
};
for (auto& cas : cases) {
- UnicodeString message = Int64ToUnicodeString(cas.first);
+ UnicodeString message = Int64ToUnicodeString(static_cast<int64_t>(cas.first));
message += u" ";
- message += Int64ToUnicodeString(cas.second);
+ message += Int64ToUnicodeString(static_cast<int64_t>(cas.second));
status.setScope(message);
UnicodeString actual = lnrf.formatFormattableRange(cas.first, cas.second, status).toString(status);
assertEquals(message, cas.expected, actual);
@@ -723,6 +725,63 @@ void NumberRangeFormatterTest::testPlurals() {
}
}
+void NumberRangeFormatterTest::testFieldPositions() {
+ {
+ const char16_t* message = u"Field position test 1";
+ const char16_t* expectedString = u"3K – 5K m";
+ FormattedNumberRange result = assertFormattedRangeEquals(
+ message,
+ NumberRangeFormatter::with()
+ .numberFormatterBoth(NumberFormatter::with()
+ .unit(METER)
+ .notation(Notation::compactShort()))
+ .locale("en-us"),
+ 3000,
+ 5000,
+ expectedString);
+ static const UFieldPosition expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UNUM_INTEGER_FIELD, 0, 1},
+ {UNUM_COMPACT_FIELD, 1, 2},
+ {UNUM_INTEGER_FIELD, 5, 6},
+ {UNUM_COMPACT_FIELD, 6, 7},
+ {UNUM_MEASURE_UNIT_FIELD, 8, 9}};
+ checkFormattedValue(
+ message,
+ result,
+ expectedString,
+ UFIELD_CATEGORY_NUMBER,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ {
+ const char16_t* message = u"Field position test 2";
+ const char16_t* expectedString = u"87,654,321–98,765,432";
+ FormattedNumberRange result = assertFormattedRangeEquals(
+ message,
+ NumberRangeFormatter::withLocale("en-us"),
+ 87654321,
+ 98765432,
+ expectedString);
+ static const UFieldPosition expectedFieldPositions[] = {
+ // field, begin index, end index
+ {UNUM_GROUPING_SEPARATOR_FIELD, 2, 3},
+ {UNUM_GROUPING_SEPARATOR_FIELD, 6, 7},
+ {UNUM_INTEGER_FIELD, 0, 10},
+ {UNUM_GROUPING_SEPARATOR_FIELD, 13, 14},
+ {UNUM_GROUPING_SEPARATOR_FIELD, 17, 18},
+ {UNUM_INTEGER_FIELD, 11, 21}};
+ checkFormattedValue(
+ message,
+ result,
+ expectedString,
+ UFIELD_CATEGORY_NUMBER,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+}
+
void NumberRangeFormatterTest::testCopyMove() {
IcuTestErrorCode status(*this, "testCopyMove");
@@ -765,6 +824,42 @@ void NumberRangeFormatterTest::testCopyMove() {
assertEquals("FormattedNumberRange move assignment", u"3,00–6,00 $US", result.toString(status));
}
+void NumberRangeFormatterTest::toObject() {
+ IcuTestErrorCode status(*this, "toObject");
+
+ // const lvalue version
+ {
+ LocalizedNumberRangeFormatter lnf = NumberRangeFormatter::withLocale("en");
+ LocalPointer<LocalizedNumberRangeFormatter> lnf2(lnf.clone());
+ assertFalse("should create successfully, const lvalue", lnf2.isNull());
+ assertEquals("object API test, const lvalue", u"5–7",
+ lnf2->formatFormattableRange(5, 7, status).toString(status));
+ }
+
+ // rvalue reference version
+ {
+ LocalPointer<LocalizedNumberRangeFormatter> lnf(
+ NumberRangeFormatter::withLocale("en").clone());
+ assertFalse("should create successfully, rvalue reference", lnf.isNull());
+ assertEquals("object API test, rvalue reference", u"5–7",
+ lnf->formatFormattableRange(5, 7, status).toString(status));
+ }
+
+ // to std::unique_ptr via assignment
+ {
+ std::unique_ptr<LocalizedNumberRangeFormatter> lnf =
+ NumberRangeFormatter::withLocale("en").clone();
+ assertTrue("should create successfully, unique_ptr B", static_cast<bool>(lnf));
+ assertEquals("object API test, unique_ptr B", u"5–7",
+ lnf->formatFormattableRange(5, 7, status).toString(status));
+ }
+
+ // make sure no memory leaks
+ {
+ NumberRangeFormatter::with().clone();
+ }
+}
+
void NumberRangeFormatterTest::assertFormatRange(
const char16_t* message,
const UnlocalizedNumberRangeFormatter& f,
@@ -792,7 +887,7 @@ void NumberRangeFormatterTest::assertFormatRange(
assertFormattedRangeEquals(message, l, 5e3, 5e6, expected_50K_50M);
}
-void NumberRangeFormatterTest::assertFormattedRangeEquals(
+FormattedNumberRange NumberRangeFormatterTest::assertFormattedRangeEquals(
const char16_t* message,
const LocalizedNumberRangeFormatter& l,
double first,
@@ -801,8 +896,10 @@ void NumberRangeFormatterTest::assertFormattedRangeEquals(
IcuTestErrorCode status(*this, "assertFormattedRangeEquals");
UnicodeString fullMessage = UnicodeString(message) + u": " + DoubleToUnicodeString(first) + u", " + DoubleToUnicodeString(second);
status.setScope(fullMessage);
- UnicodeString actual = l.formatFormattableRange(first, second, status).toString(status);
+ FormattedNumberRange fnr = l.formatFormattableRange(first, second, status);
+ UnicodeString actual = fnr.toString(status);
assertEquals(fullMessage, expected, actual);
+ return fnr;
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_skeletons.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_skeletons.cpp
index 8ac05298538..635ea879906 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_skeletons.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_skeletons.cpp
@@ -110,8 +110,10 @@ void NumberSkeletonTest::validTokens() {
for (auto& cas : cases) {
UnicodeString skeletonString(cas);
status.setScope(skeletonString);
- NumberFormatter::forSkeleton(skeletonString, status);
+ UParseError perror;
+ NumberFormatter::forSkeleton(skeletonString, perror, status);
assertSuccess(CStr(skeletonString)(), status, true);
+ assertEquals(skeletonString, -1, perror.offset);
status.errIfFailureAndReset();
}
}
@@ -147,6 +149,8 @@ void NumberSkeletonTest::invalidTokens() {
u"integer-width/xxx",
u"integer-width/0+",
u"integer-width/+0#",
+ u"integer-width/+#",
+ u"integer-width/+#0",
u"scientific/foo"};
expectedErrorSkeleton(cases, UPRV_LENGTHOF(cases));
@@ -193,7 +197,7 @@ void NumberSkeletonTest::stemsRequiringOption() {
static const char16_t* stems[] = {
u"precision-increment",
u"measure-unit",
- u"per-unit",
+ u"per-measure-unit",
u"currency",
u"integer-width",
u"numbering-system",
@@ -204,8 +208,23 @@ void NumberSkeletonTest::stemsRequiringOption() {
for (auto& suffix : suffixes) {
UnicodeString skeletonString = UnicodeString(stem) + suffix;
UErrorCode status = U_ZERO_ERROR;
- NumberFormatter::forSkeleton(skeletonString, status);
+ UParseError perror;
+ NumberFormatter::forSkeleton(skeletonString, perror, status);
assertEquals(skeletonString, U_NUMBER_SKELETON_SYNTAX_ERROR, status);
+
+ // Check the UParseError for integrity.
+ // If an option is present, the option is wrong; error offset is at the start of the option
+ // If an option is not present, the error offset is at the token separator (end of stem)
+ int32_t expectedOffset = u_strlen(stem) + ((suffix[0] == u'/') ? 1 : 0);
+ assertEquals(skeletonString, expectedOffset, perror.offset);
+ UnicodeString expectedPreContext = skeletonString.tempSubString(0, expectedOffset);
+ if (expectedPreContext.length() >= U_PARSE_CONTEXT_LEN - 1) {
+ expectedPreContext = expectedPreContext.tempSubString(expectedOffset - U_PARSE_CONTEXT_LEN + 1);
+ }
+ assertEquals(skeletonString, expectedPreContext, perror.preContext);
+ UnicodeString expectedPostContext = skeletonString.tempSubString(expectedOffset);
+ // None of the postContext strings in this test exceed U_PARSE_CONTEXT_LEN
+ assertEquals(skeletonString, expectedPostContext, perror.postContext);
}
}
}
@@ -250,7 +269,7 @@ void NumberSkeletonTest::flexibleSeparators() {
status.setScope(skeletonString);
UnicodeString actual = NumberFormatter::forSkeleton(skeletonString, status).locale("en")
.formatDouble(5142.3, status)
- .toString();
+ .toString(status);
if (!status.errDataIfFailureAndReset()) {
assertEquals(skeletonString, expected, actual);
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/numfmtspectest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/numfmtspectest.cpp
index 7d59678c929..99af1c27482 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/numfmtspectest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/numfmtspectest.cpp
@@ -148,9 +148,7 @@ void NumberFormatSpecificationTest::TestScientificNotation() {
assertPatternFr("12,300E3", 12300.1, "##0.0000E0", TRUE);
assertPatternFr("12,30E3", 12300.1, "##0.000#E0", TRUE);
assertPatternFr("12,301E3", 12301.0, "##0.000#E0", TRUE);
- if (!logKnownIssue("11020")) {
- assertPatternFr("1,25E4", 12301.2, "0.05E0");
- }
+ assertPatternFr("1,25E4", 12301.2, "0.05E0");
assertPatternFr("170,0E-3", 0.17, "##0.000#E0", TRUE);
}
@@ -185,10 +183,8 @@ void NumberFormatSpecificationTest::TestPadding() {
assertPatternFr("ne1\\u202F234nx", -1234, "####,##0$*x;ne#n", TRUE);
assertPatternFr("n1\\u202F234*xx", -1234, "####,##0$*x;n#'*'", TRUE);
assertPatternFr("yyyy%432,6", 4.33, "*y%4.2######", TRUE);
- if (!logKnownIssue("11025")) {
- assertPatternFr("EUR *433,00", 433.0, "\\u00a4\\u00a4 **####0.00");
- assertPatternFr("EUR *433,00", 433.0, "\\u00a4\\u00a4 **#######0");
- }
+ assertPatternFr("EUR *433,00", 433.0, "\\u00a4\\u00a4 **####0.00");
+ assertPatternFr("EUR *433,00", 433.0, "\\u00a4\\u00a4 **#######0");
{
UnicodeString upattern("\\u00a4\\u00a4 **#######0", -1, US_INV);
upattern = upattern.unescape();
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/numfmtst.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/numfmtst.cpp
index 34355939113..bc9fc7fcb8a 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/numfmtst.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/numfmtst.cpp
@@ -81,8 +81,18 @@ static const UChar ISO_CURRENCY_USD[] = {0x55, 0x53, 0x44, 0}; // "USD"
// class NumberFormatTest
// *****************************************************************************
-#define CHECK(status,str) if (U_FAILURE(status)) { errcheckln(status, UnicodeString("FAIL: ") + str + " - " + u_errorName(status)); return; }
-#define CHECK_DATA(status,str) if (U_FAILURE(status)) { dataerrln(UnicodeString("FAIL: ") + str + " - " + u_errorName(status)); return; }
+#define CHECK(status,str) UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(status)) { \
+ errcheckln(status, UnicodeString("FAIL: ") + str + " - " + u_errorName(status)); \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
+#define CHECK_DATA(status,str) UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(status)) { \
+ dataerrln(UnicodeString("FAIL: ") + str + " - " + u_errorName(status)); \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
void NumberFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
{
@@ -94,6 +104,7 @@ void NumberFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &n
TESTCASE_AUTO(TestQuotes);
TESTCASE_AUTO(TestExponential);
TESTCASE_AUTO(TestPatterns);
+ TESTCASE_AUTO(Test20186_SpacesAroundSemicolon);
// Upgrade to alphaWorks - liu 5/99
TESTCASE_AUTO(TestExponent);
@@ -122,6 +133,7 @@ void NumberFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &n
TESTCASE_AUTO(TestCases);
TESTCASE_AUTO(TestCurrencyNames);
+ TESTCASE_AUTO(Test20484_NarrowSymbolFallback);
TESTCASE_AUTO(TestCurrencyAmount);
TESTCASE_AUTO(TestCurrencyUnit);
TESTCASE_AUTO(TestCoverage);
@@ -167,6 +179,7 @@ void NumberFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &n
TESTCASE_AUTO(TestRoundingScientific10542);
TESTCASE_AUTO(TestZeroScientific10547);
TESTCASE_AUTO(TestAccountingCurrency);
+ TESTCASE_AUTO(TestCurrencyFormatForMissingLocale);
TESTCASE_AUTO(TestEquality);
TESTCASE_AUTO(TestCurrencyUsage);
TESTCASE_AUTO(TestDoubleLimit11439);
@@ -195,6 +208,11 @@ void NumberFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &n
TESTCASE_AUTO(TestFastFormatInt32);
TESTCASE_AUTO(Test11646_Equality);
TESTCASE_AUTO(TestParseNaN);
+ TESTCASE_AUTO(TestFormatFailIfMoreThanMaxDigits);
+ TESTCASE_AUTO(TestParseCaseSensitive);
+ TESTCASE_AUTO(TestParseNoExponent);
+ TESTCASE_AUTO(TestSignAlwaysShown);
+ TESTCASE_AUTO(TestMinimumGroupingDigits);
TESTCASE_AUTO(Test11897_LocalizedPatternSeparator);
TESTCASE_AUTO(Test13055_PercentageRounding);
TESTCASE_AUTO(Test11839);
@@ -219,6 +237,10 @@ void NumberFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &n
TESTCASE_AUTO(Test20037_ScientificIntegerOverflow);
TESTCASE_AUTO(Test13840_ParseLongStringCrash);
TESTCASE_AUTO(Test13850_EmptyStringCurrency);
+ TESTCASE_AUTO(Test20348_CurrencyPrefixOverride);
+ TESTCASE_AUTO(Test20358_GroupingInPattern);
+ TESTCASE_AUTO(Test13731_DefaultCurrency);
+ TESTCASE_AUTO(Test20499_CurrencyVisibleDigitsPlural);
TESTCASE_AUTO_END;
}
@@ -276,7 +298,7 @@ NumberFormatTest::TestAPI(void)
class StubNumberFormat :public NumberFormat{
public:
- StubNumberFormat(){};
+ StubNumberFormat(){}
virtual UnicodeString& format(double ,UnicodeString& appendTo,FieldPosition& ) const {
return appendTo;
}
@@ -299,7 +321,7 @@ public:
static char classID = 0;
return (UClassID)&classID;
}
- virtual Format* clone() const {return NULL;}
+ virtual StubNumberFormat* clone() const {return NULL;}
};
void
@@ -310,7 +332,7 @@ NumberFormatTest::TestCoverage(void){
int64_t num = 4;
if (stub.format(num, agent, pos) != UnicodeString("agent3")){
errln("NumberFormat::format(int64, UnicodString&, FieldPosition&) should delegate to (int32, ,)");
- };
+ }
}
void NumberFormatTest::TestLocalizedPatternSymbolCoverage() {
@@ -397,6 +419,25 @@ NumberFormatTest::TestPatterns(void)
}
}
+void NumberFormatTest::Test20186_SpacesAroundSemicolon() {
+ IcuTestErrorCode status(*this, "Test20186_SpacesAroundSemicolon");
+ DecimalFormat df(u"0.00 ; -0.00", {"en-us", status}, status);
+ expect2(df, 1, u"1.00 ");
+ expect2(df, -1, u" -1.00");
+
+ df = DecimalFormat(u"0.00;", {"en-us", status}, status);
+ expect2(df, 1, u"1.00");
+ expect2(df, -1, u"-1.00");
+
+ df = DecimalFormat(u"0.00;0.00", {"en-us", status}, status);
+ expect2(df, 1, u"1.00");
+ expect(df, -1, u"1.00"); // parses as 1, not -1
+
+ df = DecimalFormat(u" 0.00 ; -0.00 ", {"en-us", status}, status);
+ expect2(df, 1, u" 1.00 ");
+ expect2(df, -1, u" -1.00 ");
+}
+
/*
icu_2_4::DigitList::operator== 0 0 2 icuuc24d.dll digitlst.cpp Doug
icu_2_4::DigitList::append 0 0 4 icuin24d.dll digitlst.h Doug
@@ -855,15 +896,15 @@ NumberFormatTest::escape(UnicodeString& s)
// -------------------------------------
static const char* testCases[][2]= {
/* locale ID */ /* expected */
- {"ca_ES_PREEURO", "\\u20A7\\u00A01.150" },
- {"de_LU_PREEURO", "1,150\\u00A0F" },
- {"el_GR_PREEURO", "1.150,50\\u00A0\\u0394\\u03C1\\u03C7" },
- {"en_BE_PREEURO", "1.150,50\\u00A0BEF" },
- {"es_ES_PREEURO", "1.150\\u00A0\\u20A7" },
- {"eu_ES_PREEURO", "\\u20A7\\u00A01.150" },
- {"gl_ES_PREEURO", "1.150\\u00A0\\u20A7" },
- {"it_IT_PREEURO", "ITL\\u00A01.150" },
- {"pt_PT_PREEURO", "1,150$50\\u00A0\\u200B"}, // per cldrbug 7670
+ {"ca_ES@currency=ESP", "\\u20A7\\u00A01.150" },
+ {"de_LU@currency=LUF", "1,150\\u00A0F" },
+ {"el_GR@currency=GRD", "1.150,50\\u00A0\\u0394\\u03C1\\u03C7" },
+ {"en_BE@currency=BEF", "1.150,50\\u00A0BEF" },
+ {"es_ES@currency=ESP", "1.150\\u00A0\\u20A7" },
+ {"eu_ES@currency=ESP", "\\u20A7\\u00A01.150" },
+ {"gl_ES@currency=ESP", "1.150\\u00A0\\u20A7" },
+ {"it_IT@currency=ITL", "ITL\\u00A01.150" },
+ {"pt_PT@currency=PTE", "1,150$50\\u00A0\\u200B"}, // per cldrbug 7670
{"en_US@currency=JPY", "\\u00A51,150"},
{"en_US@currency=jpy", "\\u00A51,150"},
{"en-US-u-cu-jpy", "\\u00A51,150"}
@@ -888,7 +929,7 @@ NumberFormatTest::TestCurrency(void)
delete currencyFmt;
s.truncate(0);
char loc[256]={0};
- int len = uloc_canonicalize("de_DE_PREEURO", loc, 256, &status);
+ int len = uloc_canonicalize("de_DE@currency=DEM", loc, 256, &status);
(void)len; // Suppress unused variable warning.
currencyFmt = NumberFormat::createCurrencyInstance(Locale(loc),status);
currencyFmt->format(1.50, s);
@@ -897,7 +938,7 @@ NumberFormatTest::TestCurrency(void)
errln((UnicodeString)"FAIL: Expected 1,50<nbsp>DM but got " + s);
delete currencyFmt;
s.truncate(0);
- len = uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status);
+ len = uloc_canonicalize("fr_FR@currency=FRF", loc, 256, &status);
currencyFmt = NumberFormat::createCurrencyInstance(Locale(loc), status);
currencyFmt->format(1.50, s);
logln((UnicodeString)"Un pauvre en France a....." + s);
@@ -1907,25 +1948,19 @@ void NumberFormatTest::TestRegCurrency(void) {
UChar YEN[4];
ucurr_forLocale("ja_JP", YEN, 4, &status);
UChar TMP[4];
- static const UChar QQQ[] = {0x51, 0x51, 0x51, 0};
+
if(U_FAILURE(status)) {
errcheckln(status, "Unable to get currency for locale, error %s", u_errorName(status));
return;
}
UCurrRegistryKey enkey = ucurr_register(YEN, "en_US", &status);
- UCurrRegistryKey enUSEUROkey = ucurr_register(QQQ, "en_US_EURO", &status);
ucurr_forLocale("en_US", TMP, 4, &status);
if (u_strcmp(YEN, TMP) != 0) {
errln("FAIL: didn't return YEN registered for en_US");
}
- ucurr_forLocale("en_US_EURO", TMP, 4, &status);
- if (u_strcmp(QQQ, TMP) != 0) {
- errln("FAIL: didn't return QQQ for en_US_EURO");
- }
-
int32_t fallbackLen = ucurr_forLocale("en_XX_BAR", TMP, 4, &status);
if (fallbackLen) {
errln("FAIL: tried to fallback en_XX_BAR");
@@ -1942,26 +1977,11 @@ void NumberFormatTest::TestRegCurrency(void) {
}
status = U_ZERO_ERROR; // reset
- ucurr_forLocale("en_US_EURO", TMP, 4, &status);
- if (u_strcmp(QQQ, TMP) != 0) {
- errln("FAIL: didn't return QQQ for en_US_EURO after unregister of en_US");
- }
-
ucurr_forLocale("en_US_BLAH", TMP, 4, &status);
if (u_strcmp(USD, TMP) != 0) {
errln("FAIL: could not find USD for en_US_BLAH after unregister of en");
}
status = U_ZERO_ERROR; // reset
-
- if (!ucurr_unregister(enUSEUROkey, &status)) {
- errln("FAIL: couldn't unregister enUSEUROkey");
- }
-
- ucurr_forLocale("en_US_EURO", TMP, 4, &status);
- if (u_strcmp(EUR, TMP) != 0) {
- errln("FAIL: didn't return EUR for en_US_EURO after unregister of en_US_EURO");
- }
- status = U_ZERO_ERROR; // reset
#endif
}
@@ -2090,6 +2110,50 @@ void NumberFormatTest::TestCurrencyNames(void) {
// TODO add more tests later
}
+void NumberFormatTest::Test20484_NarrowSymbolFallback(){
+ IcuTestErrorCode status(*this, "Test20484_NarrowSymbolFallback");
+
+ struct TestCase {
+ const char* locale;
+ const char16_t* isoCode;
+ const char16_t* expectedShort;
+ const char16_t* expectedNarrow;
+ UErrorCode expectedNarrowError;
+ } cases[] = {
+ {"en-US", u"CAD", u"CA$", u"$", U_USING_DEFAULT_WARNING}, // narrow: fallback to root
+ {"en-US", u"CDF", u"CDF", u"CDF", U_USING_FALLBACK_WARNING}, // narrow: fallback to short
+ {"sw-CD", u"CDF", u"FC", u"FC", U_USING_FALLBACK_WARNING}, // narrow: fallback to short
+ {"en-US", u"GEL", u"GEL", u"₾", U_USING_DEFAULT_WARNING}, // narrow: fallback to root
+ {"ka-GE", u"GEL", u"₾", u"₾", U_USING_FALLBACK_WARNING}, // narrow: fallback to ka
+ {"ka", u"GEL", u"₾", u"₾", U_ZERO_ERROR}, // no fallback on narrow
+ };
+ for (const auto& cas : cases) {
+ status.setScope(cas.isoCode);
+ UBool choiceFormatIgnored;
+ int32_t lengthIgnored;
+ const UChar* actualShort = ucurr_getName(
+ cas.isoCode,
+ cas.locale,
+ UCURR_SYMBOL_NAME,
+ &choiceFormatIgnored,
+ &lengthIgnored,
+ status);
+ status.errIfFailureAndReset();
+ const UChar* actualNarrow = ucurr_getName(
+ cas.isoCode,
+ cas.locale,
+ UCURR_NARROW_SYMBOL_NAME,
+ &choiceFormatIgnored,
+ &lengthIgnored,
+ status);
+ status.expectErrorAndReset(cas.expectedNarrowError);
+ assertEquals(UnicodeString("Short symbol: ") + cas.locale + u": " + cas.isoCode,
+ cas.expectedShort, actualShort);
+ assertEquals(UnicodeString("Narrow symbol: ") + cas.locale + ": " + cas.isoCode,
+ cas.expectedNarrow, actualNarrow);
+ }
+}
+
void NumberFormatTest::TestCurrencyUnit(void){
UErrorCode ec = U_ZERO_ERROR;
static const UChar USD[] = u"USD";
@@ -2098,18 +2162,69 @@ void NumberFormatTest::TestCurrencyUnit(void){
static const UChar BAD2[] = u"??A";
static const UChar XXX[] = u"XXX";
static const char XXX8[] = "XXX";
+ static const UChar INV[] = u"{$%";
+ static const char INV8[] = "{$%";
+ static const UChar ZZZ[] = u"zz";
+ static const char ZZZ8[] = "zz";
+
+ UChar* EUR = (UChar*) malloc(6);
+ EUR[0] = u'E';
+ EUR[1] = u'U';
+ EUR[2] = u'R';
+ char* EUR8 = (char*) malloc(3);
+ EUR8[0] = 'E';
+ EUR8[1] = 'U';
+ EUR8[2] = 'R';
+
CurrencyUnit cu(USD, ec);
assertSuccess("CurrencyUnit", ec);
assertEquals("getISOCurrency()", USD, cu.getISOCurrency());
assertEquals("getSubtype()", USD8, cu.getSubtype());
+ CurrencyUnit inv(INV, ec);
+ assertEquals("non-invariant", U_INVARIANT_CONVERSION_ERROR, ec);
+ assertEquals("non-invariant", XXX, inv.getISOCurrency());
+ ec = U_ZERO_ERROR;
+
+ CurrencyUnit zzz(ZZZ, ec);
+ assertEquals("too short", U_ILLEGAL_ARGUMENT_ERROR, ec);
+ assertEquals("too short", XXX, zzz.getISOCurrency());
+ ec = U_ZERO_ERROR;
+
+ CurrencyUnit eur(EUR, ec);
+ assertEquals("non-nul-terminated", u"EUR", eur.getISOCurrency());
+ assertEquals("non-nul-terminated", "EUR", eur.getSubtype());
+
+ // Test StringPiece constructor
+ CurrencyUnit cu8(USD8, ec);
+ assertEquals("StringPiece constructor", USD, cu8.getISOCurrency());
+
+ CurrencyUnit inv8(INV8, ec);
+ assertEquals("non-invariant 8", U_INVARIANT_CONVERSION_ERROR, ec);
+ assertEquals("non-invariant 8", XXX, inv8.getISOCurrency());
+ ec = U_ZERO_ERROR;
+
+ CurrencyUnit zzz8(ZZZ8, ec);
+ assertEquals("too short 8", U_ILLEGAL_ARGUMENT_ERROR, ec);
+ assertEquals("too short 8", XXX, zzz8.getISOCurrency());
+ ec = U_ZERO_ERROR;
+
+ CurrencyUnit zzz8b({ZZZ8, 3}, ec);
+ assertEquals("too short 8b", U_ILLEGAL_ARGUMENT_ERROR, ec);
+ assertEquals("too short 8b", XXX, zzz8b.getISOCurrency());
+ ec = U_ZERO_ERROR;
+
+ CurrencyUnit eur8({EUR8, 3}, ec);
+ assertEquals("non-nul-terminated 8", u"EUR", eur8.getISOCurrency());
+ assertEquals("non-nul-terminated 8", "EUR", eur8.getSubtype());
+
CurrencyUnit cu2(cu);
if (!(cu2 == cu)){
errln("CurrencyUnit copy constructed object should be same");
}
- CurrencyUnit * cu3 = (CurrencyUnit *)cu.clone();
+ CurrencyUnit * cu3 = cu.clone();
if (!(*cu3 == cu)){
errln("CurrencyUnit cloned object should be same");
}
@@ -2156,6 +2271,9 @@ void NumberFormatTest::TestCurrencyUnit(void){
CurrencyUnit failure(*meter, ec);
assertEquals("Copying from meter should fail", ec, U_ILLEGAL_ARGUMENT_ERROR);
assertEquals("Copying should not give uninitialized ISO code", u"", failure.getISOCurrency());
+
+ free(EUR);
+ free(EUR8);
}
void NumberFormatTest::TestCurrencyAmount(void){
@@ -2174,7 +2292,7 @@ void NumberFormatTest::TestCurrencyAmount(void){
errln("CurrencyAmount assigned object should be same");
}
- CurrencyAmount *ca3 = (CurrencyAmount *)ca.clone();
+ CurrencyAmount *ca3 = ca.clone();
if (!(*ca3 == ca)){
errln("CurrencyAmount cloned object should be same");
}
@@ -2195,7 +2313,7 @@ void NumberFormatTest::TestSymbolsWithBadLocale(void) {
for (i = 0; i < UPRV_LENGTHOF(badLocales); i++) {
const char *localeName = badLocales[i];
Locale locBad(localeName);
- TEST_ASSERT_TRUE(!locBad.isBogus());
+ assertTrue(WHERE, !locBad.isBogus());
UErrorCode status = U_ZERO_ERROR;
UnicodeString intlCurrencySymbol((UChar)0xa4);
@@ -3065,7 +3183,7 @@ void NumberFormatTest::TestCurrencyFormat()
dataerrln("FAIL: Status %s", u_errorName(status));
return;
}
- cloneObj = (MeasureFormat *)measureObj->clone();
+ cloneObj = measureObj->clone();
if (cloneObj == NULL) {
errln("Clone doesn't work");
return;
@@ -3375,7 +3493,7 @@ void NumberFormatTest::TestNumberingSystems() {
continue;
}
// Clone to test ticket #10682
- NumberFormat *fmt = (NumberFormat *) origFmt->clone();
+ NumberFormat *fmt = origFmt->clone();
delete origFmt;
@@ -3436,9 +3554,9 @@ NumberFormatTest::TestMultiCurrencySign() {
{"en_US", "\\u00A4#,##0.00;-\\u00A4#,##0.00", "-1234.56", "-$1,234.56", "-USD\\u00A01,234.56", "-US dollars\\u00A01,234.56"},
{"en_US", "\\u00A4#,##0.00;-\\u00A4#,##0.00", "1", "$1.00", "USD\\u00A01.00", "US dollars\\u00A01.00"},
// for CHINA locale
- {"zh_CN", "\\u00A4#,##0.00;(\\u00A4#,##0.00)", "1234.56", "\\uFFE51,234.56", "CNY\\u00A01,234.56", "\\u4EBA\\u6C11\\u5E01\\u00A01,234.56"},
- {"zh_CN", "\\u00A4#,##0.00;(\\u00A4#,##0.00)", "-1234.56", "(\\uFFE51,234.56)", "(CNY\\u00A01,234.56)", "(\\u4EBA\\u6C11\\u5E01\\u00A01,234.56)"},
- {"zh_CN", "\\u00A4#,##0.00;(\\u00A4#,##0.00)", "1", "\\uFFE51.00", "CNY\\u00A01.00", "\\u4EBA\\u6C11\\u5E01\\u00A01.00"}
+ {"zh_CN", "\\u00A4#,##0.00;(\\u00A4#,##0.00)", "1234.56", "\\u00A51,234.56", "CNY\\u00A01,234.56", "\\u4EBA\\u6C11\\u5E01\\u00A01,234.56"},
+ {"zh_CN", "\\u00A4#,##0.00;(\\u00A4#,##0.00)", "-1234.56", "(\\u00A51,234.56)", "(CNY\\u00A01,234.56)", "(\\u4EBA\\u6C11\\u5E01\\u00A01,234.56)"},
+ {"zh_CN", "\\u00A4#,##0.00;(\\u00A4#,##0.00)", "1", "\\u00A51.00", "CNY\\u00A01.00", "\\u4EBA\\u6C11\\u5E01\\u00A01.00"}
};
const UChar doubleCurrencySign[] = {0xA4, 0xA4, 0};
@@ -3653,8 +3771,8 @@ NumberFormatTest::TestCurrencyIsoPluralFormat() {
{"en_US", "-1234.56", "USD", "-$1,234.56", "-USD\\u00A01,234.56", "-1,234.56 US dollars"},
{"zh_CN", "1", "USD", "US$1.00", "USD\\u00A01.00", "1.00\\u00A0\\u7F8E\\u5143"},
{"zh_CN", "1234.56", "USD", "US$1,234.56", "USD\\u00A01,234.56", "1,234.56\\u00A0\\u7F8E\\u5143"},
- {"zh_CN", "1", "CNY", "\\uFFE51.00", "CNY\\u00A01.00", "1.00\\u00A0\\u4EBA\\u6C11\\u5E01"},
- {"zh_CN", "1234.56", "CNY", "\\uFFE51,234.56", "CNY\\u00A01,234.56", "1,234.56\\u00A0\\u4EBA\\u6C11\\u5E01"},
+ {"zh_CN", "1", "CNY", "\\u00A51.00", "CNY\\u00A01.00", "1.00\\u00A0\\u4EBA\\u6C11\\u5E01"},
+ {"zh_CN", "1234.56", "CNY", "\\u00A51,234.56", "CNY\\u00A01,234.56", "1,234.56\\u00A0\\u4EBA\\u6C11\\u5E01"},
{"ru_RU", "1", "RUB", "1,00\\u00A0\\u20BD", "1,00\\u00A0RUB", "1,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"},
{"ru_RU", "2", "RUB", "2,00\\u00A0\\u20BD", "2,00\\u00A0RUB", "2,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"},
{"ru_RU", "5", "RUB", "5,00\\u00A0\\u20BD", "5,00\\u00A0RUB", "5,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"},
@@ -3757,7 +3875,7 @@ NumberFormatTest::TestCurrencyParsing() {
{"it_IT", "1", "USD", "1,00\\u00a0USD", "1,00\\u00a0USD", "1,00 dollari statunitensi"},
{"ko_KR", "1", "USD", "US$\\u00A01.00", "USD\\u00A01.00", "1.00 \\ubbf8\\uad6d \\ub2ec\\ub7ec"},
{"ja_JP", "1", "USD", "$1.00", "USD\\u00A01.00", "1.00\\u00A0\\u7c73\\u30c9\\u30eb"},
- {"zh_CN", "1", "CNY", "\\uFFE51.00", "CNY\\u00A001.00", "1.00\\u00A0\\u4EBA\\u6C11\\u5E01"},
+ {"zh_CN", "1", "CNY", "\\u00A51.00", "CNY\\u00A001.00", "1.00\\u00A0\\u4EBA\\u6C11\\u5E01"},
{"zh_TW", "1", "CNY", "CN\\u00A51.00", "CNY\\u00A01.00", "1.00 \\u4eba\\u6c11\\u5e63"},
{"zh_Hant", "1", "CNY", "CN\\u00A51.00", "CNY\\u00A01.00", "1.00 \\u4eba\\u6c11\\u5e63"},
{"zh_Hant", "1", "JPY", "\\u00A51.00", "JPY\\u00A01.00", "1 \\u65E5\\u5713"},
@@ -6636,12 +6754,12 @@ const char* attrString(int32_t attrId) {
// API test, not a comprehensive test.
// See DecimalFormatTest/DataDrivenTests
//
-#define ASSERT_SUCCESS(status) { \
+#define ASSERT_SUCCESS(status) UPRV_BLOCK_MACRO_BEGIN { \
assertSuccess(UnicodeString("file ") + __FILE__ + ", line " + __LINE__, (status)); \
-}
-#define ASSERT_EQUALS(expected, actual) { \
+} UPRV_BLOCK_MACRO_END
+#define ASSERT_EQUALS(expected, actual) UPRV_BLOCK_MACRO_BEGIN { \
assertEquals(UnicodeString("file ") + __FILE__ + ", line " + __LINE__, (expected), (actual)); \
-}
+} UPRV_BLOCK_MACRO_END
void NumberFormatTest::TestDecimal() {
{
@@ -6694,7 +6812,7 @@ void NumberFormatTest::TestDecimal() {
ASSERT_EQUALS(1234567890123LL, f.getInt64());
ASSERT_EQUALS(1234567890123LL, f.getInt64(status));
ASSERT_SUCCESS(status);
- ASSERT_EQUALS("1.234567890123E+12", f.getDecimalNumber(status).data());
+ ASSERT_EQUALS("1234567890123", f.getDecimalNumber(status).data());
ASSERT_SUCCESS(status);
}
@@ -6894,9 +7012,9 @@ void NumberFormatTest::TestExplicitParents() {
* Test available numbering systems API.
*/
void NumberFormatTest::TestAvailableNumberingSystems() {
- UErrorCode status = U_ZERO_ERROR;
+ IcuTestErrorCode status(*this, "TestAvailableNumberingSystems");
StringEnumeration *availableNumberingSystems = NumberingSystem::getAvailableNames(status);
- CHECK_DATA(status, "NumberingSystem::getAvailableNames()")
+ CHECK_DATA(status, "NumberingSystem::getAvailableNames()");
int32_t nsCount = availableNumberingSystems->count(status);
if ( nsCount < 74 ) {
@@ -6909,6 +7027,7 @@ void NumberFormatTest::TestAvailableNumberingSystems() {
/* one that we initially thought. */
int32_t len;
+ const char* prevName = nullptr;
for ( int32_t i = 0 ; i < nsCount ; i++ ) {
const char *nsname = availableNumberingSystems->next(&len,status);
NumberingSystem* ns = NumberingSystem::createInstanceByName(nsname,status);
@@ -6916,10 +7035,23 @@ void NumberFormatTest::TestAvailableNumberingSystems() {
if ( uprv_strcmp(nsname,ns->getName()) ) {
errln("FAIL: Numbering system name didn't match for name = %s\n",nsname);
}
+ if (prevName != nullptr) {
+ int comp = uprv_strcmp(prevName, nsname);
+ assertTrue(
+ UnicodeString(u"NS names should be in alphabetical order: ")
+ + prevName + u" vs " + nsname,
+ // TODO: Why are there duplicates? This doesn't work if comp < 0
+ comp <= 0);
+ }
+ prevName = nsname;
delete ns;
}
+ LocalPointer<NumberingSystem> dummy(NumberingSystem::createInstanceByName("dummy", status), status);
+ status.expectErrorAndReset(U_UNSUPPORTED_ERROR);
+ assertTrue("Non-existent numbering system should return null", dummy.isNull());
+
delete availableNumberingSystems;
}
@@ -7352,7 +7484,7 @@ void NumberFormatTest::TestSignificantDigits(void) {
Locale locale("en_US");
LocalPointer<DecimalFormat> numberFormat(static_cast<DecimalFormat*>(
NumberFormat::createInstance(locale, status)));
- CHECK_DATA(status,"NumberFormat::createInstance")
+ CHECK_DATA(status,"NumberFormat::createInstance");
numberFormat->setSignificantDigitsUsed(TRUE);
numberFormat->setMinimumSignificantDigits(3);
@@ -7405,7 +7537,7 @@ void NumberFormatTest::TestShowZero() {
Locale locale("en_US");
LocalPointer<DecimalFormat> numberFormat(static_cast<DecimalFormat*>(
NumberFormat::createInstance(locale, status)));
- CHECK_DATA(status, "NumberFormat::createInstance")
+ CHECK_DATA(status, "NumberFormat::createInstance");
numberFormat->setSignificantDigitsUsed(TRUE);
numberFormat->setMaximumSignificantDigits(3);
@@ -7456,7 +7588,7 @@ void NumberFormatTest::TestBug9936() {
void NumberFormatTest::TestParseNegativeWithFaLocale() {
UErrorCode status = U_ZERO_ERROR;
DecimalFormat *test = (DecimalFormat *) NumberFormat::createInstance("fa", status);
- CHECK_DATA(status, "NumberFormat::createInstance")
+ CHECK_DATA(status, "NumberFormat::createInstance");
test->setLenient(TRUE);
Formattable af;
ParsePosition ppos;
@@ -7472,7 +7604,7 @@ void NumberFormatTest::TestParseNegativeWithFaLocale() {
void NumberFormatTest::TestParseNegativeWithAlternateMinusSign() {
UErrorCode status = U_ZERO_ERROR;
DecimalFormat *test = (DecimalFormat *) NumberFormat::createInstance("en", status);
- CHECK_DATA(status, "NumberFormat::createInstance")
+ CHECK_DATA(status, "NumberFormat::createInstance");
test->setLenient(TRUE);
Formattable af;
ParsePosition ppos;
@@ -7893,6 +8025,52 @@ void NumberFormatTest::TestAccountingCurrency() {
(Formattable)(double)-1000.5, UnicodeString("(\\uFFE51,000)").unescape(), FALSE, status);
expect(NumberFormat::createInstance("de_DE", style, status),
(Formattable)(double)-23456.7, UnicodeString("-23.456,70\\u00A0\\u20AC").unescape(), TRUE, status);
+ expect(NumberFormat::createInstance("en_ID", style, status),
+ (Formattable)(double)0, UnicodeString("IDR\\u00A00.00").unescape(), TRUE, status);
+ expect(NumberFormat::createInstance("en_ID", style, status),
+ (Formattable)(double)-0.2, UnicodeString("(IDR\\u00A00.20)").unescape(), TRUE, status);
+ expect(NumberFormat::createInstance("sh_ME", style, status),
+ (Formattable)(double)0, UnicodeString("0,00\\u00A0\\u20AC").unescape(), TRUE, status);
+ expect(NumberFormat::createInstance("sh_ME", style, status),
+ (Formattable)(double)-0.2, UnicodeString("(0,20\\u00A0\\u20AC)").unescape(), TRUE, status);
+}
+
+/**
+ * ICU4J has the behavior explained below, but ICU4C is not affected. Test is added to prevent regression.
+ *
+ * en_ID/sh_ME uses language only locales en/sh which requires NumberFormatServiceShim to fill in the currency, but
+ * prior to ICU-20631, currency was not filled in for accounting, cash and standard, so currency placeholder was
+ * used instead of the desired locale's currency.
+ */
+void NumberFormatTest::TestCurrencyFormatForMissingLocale() {
+ IcuTestErrorCode status(*this, "TestCurrencyFormatForMissingLocale");
+ Locale locale = Locale::createCanonical("sh_ME");
+
+ LocalPointer<NumberFormat> curFmt(NumberFormat::createInstance(locale, UNUM_CURRENCY, status));
+ // Fail here with missing data.
+ if (!assertTrue(WHERE, curFmt.isValid(), false, true)) {return;};
+ assertEquals("Currency instance is not for the desired locale for CURRENCYSTYLE", curFmt->getCurrency(), "EUR");
+ UnicodeString currBuf;
+ curFmt->format(-1234.5, currBuf);
+ assertEquals("NumberFormat format outputs wrong value for CURRENCYSTYLE", u"-1.234,50\u00A0\u20AC", currBuf);
+
+ LocalPointer<NumberFormat> accFmt(NumberFormat::createInstance(locale, UNUM_CURRENCY_ACCOUNTING, status));
+ assertEquals("Currency instance is not for the desired locale for ACCOUNTINGCURRENCYSTYLE", accFmt->getCurrency(), "EUR");
+ UnicodeString accBuf;
+ accFmt->format(-1234.5, accBuf);
+ assertEquals("NumberFormat format outputs wrong value for ACCOUNTINGCURRENCYSTYLE", u"(1.234,50\u00A0\u20AC)", accBuf);
+
+ LocalPointer<NumberFormat> cashFmt(NumberFormat::createInstance(locale, UNUM_CASH_CURRENCY, status));
+ assertEquals("Currency instance is not for the desired locale for CASHCURRENCYSTYLE", cashFmt->getCurrency(), "EUR");
+ UnicodeString cashBuf;
+ cashFmt->format(-1234.5, cashBuf);
+ assertEquals("NumberFormat format outputs wrong value for CASHCURRENCYSTYLE", u"-1.234,50\u00A0\u20AC", cashBuf);
+
+ LocalPointer<NumberFormat> stdFmt(NumberFormat::createInstance(locale, UNUM_CURRENCY_STANDARD, status));
+ assertEquals("Currency instance is not for the desired locale for STANDARDCURRENCYSTYLE", stdFmt->getCurrency(), "EUR");
+ UnicodeString stdBuf;
+ stdFmt->format(-1234.5, stdBuf);
+ assertEquals("NumberFormat format outputs wrong value for STANDARDCURRENCYSTYLE", u"-1.234,50\u00A0\u20AC", stdBuf);
}
// for #5186
@@ -7910,7 +8088,7 @@ void NumberFormatTest::TestEquality() {
return;
}
- DecimalFormat* fmtClone = (DecimalFormat*)fmtBase.clone();
+ DecimalFormat* fmtClone = fmtBase.clone();
fmtClone->setFormatWidth(fmtBase.getFormatWidth() + 32);
if (*fmtClone == fmtBase) {
errln("Error: DecimalFormat == does not distinguish objects that differ only in FormatWidth");
@@ -8315,6 +8493,9 @@ void NumberFormatTest::Test11739_ParseLongCurrency() {
ParsePosition ppos(0);
LocalPointer<CurrencyAmount> result(nf->parseCurrency(u"1.500 амерички долар", ppos));
assertEquals("Should parse to 1500 USD", -1, ppos.getErrorIndex());
+ if (ppos.getErrorIndex() != -1) {
+ return;
+ }
assertEquals("Should parse to 1500 USD", 1500LL, result->getNumber().getInt64(status));
assertEquals("Should parse to 1500 USD", u"USD", result->getISOCurrency());
}
@@ -8711,7 +8892,7 @@ void NumberFormatTest::TestFastFormatInt32() {
static_cast<double>(INT32_MIN) + 1};
for (auto num : nums) {
- UnicodeString expected = lnf.formatDouble(num, status).toString();
+ UnicodeString expected = lnf.formatDouble(num, status).toString(status);
UnicodeString actual;
df->format(num, actual);
assertEquals(UnicodeString("d = ") + num, expected, actual);
@@ -8771,6 +8952,91 @@ void NumberFormatTest::TestParseNaN() {
assertEquals("NaN should round-trip", u"NaN", formatResult);
}
+void NumberFormatTest::TestFormatFailIfMoreThanMaxDigits() {
+ IcuTestErrorCode status(*this, "TestFormatFailIfMoreThanMaxDigits");
+
+ DecimalFormat df("0", {"en-US", status}, status);
+ if (status.errDataIfFailureAndReset()) {
+ return;
+ }
+ assertEquals("Coverage for getter 1", (UBool) FALSE, df.isFormatFailIfMoreThanMaxDigits());
+ df.setFormatFailIfMoreThanMaxDigits(TRUE);
+ assertEquals("Coverage for getter 2", (UBool) TRUE, df.isFormatFailIfMoreThanMaxDigits());
+ df.setMaximumIntegerDigits(2);
+ UnicodeString result;
+ df.format(1234, result, status);
+ status.expectErrorAndReset(U_ILLEGAL_ARGUMENT_ERROR);
+}
+
+void NumberFormatTest::TestParseCaseSensitive() {
+ IcuTestErrorCode status(*this, "TestParseCaseSensitive");
+
+ DecimalFormat df(u"0", {"en-US", status}, status);
+ if (status.errDataIfFailureAndReset()) {
+ return;
+ }
+ assertEquals("Coverage for getter 1", (UBool) FALSE, df.isParseCaseSensitive());
+ df.setParseCaseSensitive(TRUE);
+ assertEquals("Coverage for getter 1", (UBool) TRUE, df.isParseCaseSensitive());
+ Formattable result;
+ ParsePosition ppos;
+ df.parse(u"1e2", result, ppos);
+ assertEquals("Should parse only 1 digit", 1, ppos.getIndex());
+ assertEquals("Result should be 1", 1.0, result.getDouble(status));
+}
+
+void NumberFormatTest::TestParseNoExponent() {
+ IcuTestErrorCode status(*this, "TestParseNoExponent");
+
+ DecimalFormat df(u"0", {"en-US", status}, status);
+ if (status.errDataIfFailureAndReset()) {
+ return;
+ }
+ assertEquals("Coverage for getter 1", (UBool) FALSE, df.isParseNoExponent());
+ df.setParseNoExponent(TRUE);
+ assertEquals("Coverage for getter 1", (UBool) TRUE, df.isParseNoExponent());
+ Formattable result;
+ ParsePosition ppos;
+ df.parse(u"1E2", result, ppos);
+ assertEquals("Should parse only 1 digit", 1, ppos.getIndex());
+ assertEquals("Result should be 1", 1.0, result.getDouble(status));
+}
+
+void NumberFormatTest::TestSignAlwaysShown() {
+ IcuTestErrorCode status(*this, "TestSignAlwaysShown");
+
+ DecimalFormat df(u"0", {"en-US", status}, status);
+ if (status.errDataIfFailureAndReset()) {
+ return;
+ }
+ assertEquals("Coverage for getter 1", (UBool) FALSE, df.isSignAlwaysShown());
+ df.setSignAlwaysShown(TRUE);
+ assertEquals("Coverage for getter 1", (UBool) TRUE, df.isSignAlwaysShown());
+ UnicodeString result;
+ df.format(1234, result, status);
+ status.errIfFailureAndReset();
+ assertEquals("Should show sign on positive number", u"+1234", result);
+}
+
+void NumberFormatTest::TestMinimumGroupingDigits() {
+ IcuTestErrorCode status(*this, "TestMinimumGroupingDigits");
+
+ DecimalFormat df(u"#,##0", {"en-US", status}, status);
+ if (status.errDataIfFailureAndReset()) {
+ return;
+ }
+ assertEquals("Coverage for getter 1", -1, df.getMinimumGroupingDigits());
+ df.setMinimumGroupingDigits(2);
+ assertEquals("Coverage for getter 1", 2, df.getMinimumGroupingDigits());
+ UnicodeString result;
+ df.format(1234, result, status);
+ status.errIfFailureAndReset();
+ assertEquals("Should not have grouping", u"1234", result);
+ df.format(12345, result.remove(), status);
+ status.errIfFailureAndReset();
+ assertEquals("Should have grouping", u"12,345", result);
+}
+
void NumberFormatTest::Test11897_LocalizedPatternSeparator() {
IcuTestErrorCode status(*this, "Test11897_LocalizedPatternSeparator");
@@ -9226,6 +9492,40 @@ void NumberFormatTest::Test20037_ScientificIntegerOverflow() {
assertEquals(u"Should not overflow and should parse only the first exponent",
u"1E-2147483647",
{sp.data(), sp.length(), US_INV});
+
+ // Test edge case overflow of exponent
+ result = Formattable();
+ nf->parse(u".0003e-2147483644", result, status);
+ sp = result.getDecimalNumber(status);
+ assertEquals(u"Should not overflow",
+ u"3E-2147483648",
+ {sp.data(), sp.length(), US_INV});
+
+ // Test largest parseable exponent
+ result = Formattable();
+ nf->parse(u"9876e2147483643", result, status);
+ sp = result.getDecimalNumber(status);
+ assertEquals(u"Should not overflow",
+ u"9.876E+2147483646",
+ {sp.data(), sp.length(), US_INV});
+
+ // Test max value as well
+ const char16_t* infinityInputs[] = {
+ u"9876e2147483644",
+ u"9876e2147483645",
+ u"9876e2147483646",
+ u"9876e2147483647",
+ u"9876e2147483648",
+ u"9876e2147483649",
+ };
+ for (const auto& input : infinityInputs) {
+ result = Formattable();
+ nf->parse(input, result, status);
+ sp = result.getDecimalNumber(status);
+ assertEquals(UnicodeString("Should become Infinity: ") + input,
+ u"Infinity",
+ {sp.data(), sp.length(), US_INV});
+ }
}
void NumberFormatTest::Test13840_ParseLongStringCrash() {
@@ -9297,4 +9597,112 @@ void NumberFormatTest::Test13850_EmptyStringCurrency() {
}
}
+void NumberFormatTest::Test20348_CurrencyPrefixOverride() {
+ IcuTestErrorCode status(*this, "Test20348_CurrencyPrefixOverride");
+ LocalPointer<DecimalFormat> fmt(static_cast<DecimalFormat*>(
+ NumberFormat::createCurrencyInstance("en", status)));
+ if (status.errIfFailureAndReset()) { return; }
+ UnicodeString result;
+ assertEquals("Initial pattern",
+ u"¤#,##0.00", fmt->toPattern(result.remove()));
+ assertEquals("Initial prefix",
+ u"¤", fmt->getPositivePrefix(result.remove()));
+ assertEquals("Initial suffix",
+ u"-¤", fmt->getNegativePrefix(result.remove()));
+ assertEquals("Initial format",
+ u"\u00A4100.00", fmt->format(100, result.remove(), NULL, status));
+
+ fmt->setPositivePrefix(u"$");
+ assertEquals("Set positive prefix pattern",
+ u"$#,##0.00;-\u00A4#,##0.00", fmt->toPattern(result.remove()));
+ assertEquals("Set positive prefix prefix",
+ u"$", fmt->getPositivePrefix(result.remove()));
+ assertEquals("Set positive prefix suffix",
+ u"-¤", fmt->getNegativePrefix(result.remove()));
+ assertEquals("Set positive prefix format",
+ u"$100.00", fmt->format(100, result.remove(), NULL, status));
+
+ fmt->setNegativePrefix(u"-$");
+ assertEquals("Set negative prefix pattern",
+ u"$#,##0.00;'-'$#,##0.00", fmt->toPattern(result.remove()));
+ assertEquals("Set negative prefix prefix",
+ u"$", fmt->getPositivePrefix(result.remove()));
+ assertEquals("Set negative prefix suffix",
+ u"-$", fmt->getNegativePrefix(result.remove()));
+ assertEquals("Set negative prefix format",
+ u"$100.00", fmt->format(100, result.remove(), NULL, status));
+}
+
+void NumberFormatTest::Test20358_GroupingInPattern() {
+ IcuTestErrorCode status(*this, "Test20358_GroupingInPattern");
+ LocalPointer<DecimalFormat> fmt(static_cast<DecimalFormat*>(
+ NumberFormat::createInstance("en", status)));
+ if (status.errIfFailureAndReset()) { return; }
+ UnicodeString result;
+ assertEquals("Initial pattern",
+ u"#,##0.###", fmt->toPattern(result.remove()));
+ assertTrue("Initial grouping",
+ fmt->isGroupingUsed());
+ assertEquals("Initial format",
+ u"54,321", fmt->format(54321, result.remove(), NULL, status));
+
+ fmt->setGroupingUsed(false);
+ assertEquals("Set grouping false",
+ u"0.###", fmt->toPattern(result.remove()));
+ assertFalse("Set grouping false grouping",
+ fmt->isGroupingUsed());
+ assertEquals("Set grouping false format",
+ u"54321", fmt->format(54321, result.remove(), NULL, status));
+
+ fmt->setGroupingUsed(true);
+ assertEquals("Set grouping true",
+ u"#,##0.###", fmt->toPattern(result.remove()));
+ assertTrue("Set grouping true grouping",
+ fmt->isGroupingUsed());
+ assertEquals("Set grouping true format",
+ u"54,321", fmt->format(54321, result.remove(), NULL, status));
+}
+
+void NumberFormatTest::Test13731_DefaultCurrency() {
+ IcuTestErrorCode status(*this, "Test13731_DefaultCurrency");
+ UnicodeString result;
+ {
+ LocalPointer<NumberFormat> nf(NumberFormat::createInstance(
+ "en", UNumberFormatStyle::UNUM_CURRENCY, status), status);
+ if (status.errIfFailureAndReset()) { return; }
+ assertEquals("symbol", u"¤1.10",
+ nf->format(1.1, result.remove(), status));
+ assertEquals("currency", u"XXX", nf->getCurrency());
+ }
+ {
+ LocalPointer<NumberFormat> nf(NumberFormat::createInstance(
+ "en", UNumberFormatStyle::UNUM_CURRENCY_ISO, status), status);
+ if (status.errIfFailureAndReset()) { return; }
+ assertEquals("iso_code", u"XXX 1.10",
+ nf->format(1.1, result.remove(), status));
+ assertEquals("currency", u"XXX", nf->getCurrency());
+ }
+ {
+ LocalPointer<NumberFormat> nf(NumberFormat::createInstance(
+ "en", UNumberFormatStyle::UNUM_CURRENCY_PLURAL, status), status);
+ if (status.errIfFailureAndReset()) { return; }
+ assertEquals("plural", u"1.10 (unknown currency)",
+ nf->format(1.1, result.remove(), status));
+ assertEquals("currency", u"XXX", nf->getCurrency());
+ }
+}
+
+void NumberFormatTest::Test20499_CurrencyVisibleDigitsPlural() {
+ IcuTestErrorCode status(*this, "Test20499_CurrencyVisibleDigitsPlural");
+ LocalPointer<NumberFormat> nf(NumberFormat::createInstance(
+ "ro-RO", UNumberFormatStyle::UNUM_CURRENCY_PLURAL, status), status);
+ const char16_t* expected = u"24,00 lei românești";
+ for (int32_t i=0; i<5; i++) {
+ UnicodeString actual;
+ nf->format(24, actual, status);
+ assertEquals(UnicodeString(u"iteration ") + Int64ToUnicodeString(i),
+ expected, actual);
+ }
+}
+
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/numfmtst.h b/Build/source/libs/icu/icu-src/source/test/intltest/numfmtst.h
index 9d255383243..66c4b2d9c73 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/numfmtst.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/numfmtst.h
@@ -98,6 +98,8 @@ class NumberFormatTest: public CalendarTimeZoneTest {
**/
//void TestDigitList(void);
+ void Test20186_SpacesAroundSemicolon(void);
+
/**
* Test localized currency patterns.
*/
@@ -151,6 +153,8 @@ class NumberFormatTest: public CalendarTimeZoneTest {
void TestCurrencyNames(void);
+ void Test20484_NarrowSymbolFallback(void);
+
void TestCurrencyAmount(void);
void TestCurrencyUnit(void);
@@ -227,6 +231,7 @@ class NumberFormatTest: public CalendarTimeZoneTest {
void TestRoundingScientific10542();
void TestZeroScientific10547();
void TestAccountingCurrency();
+ void TestCurrencyFormatForMissingLocale();
void TestEquality();
void TestCurrencyUsage();
@@ -259,6 +264,11 @@ class NumberFormatTest: public CalendarTimeZoneTest {
void TestFastFormatInt32();
void Test11646_Equality();
void TestParseNaN();
+ void TestFormatFailIfMoreThanMaxDigits();
+ void TestParseCaseSensitive();
+ void TestParseNoExponent();
+ void TestSignAlwaysShown();
+ void TestMinimumGroupingDigits();
void Test11897_LocalizedPatternSeparator();
void Test13055_PercentageRounding();
void Test11839();
@@ -283,6 +293,10 @@ class NumberFormatTest: public CalendarTimeZoneTest {
void Test20037_ScientificIntegerOverflow();
void Test13840_ParseLongStringCrash();
void Test13850_EmptyStringCurrency();
+ void Test20348_CurrencyPrefixOverride();
+ void Test20358_GroupingInPattern();
+ void Test13731_DefaultCurrency();
+ void Test20499_CurrencyVisibleDigitsPlural();
private:
UBool testFormattableAsUFormattable(const char *file, int line, Formattable &f);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/numrgts.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/numrgts.cpp
index 2cfc4eecd60..7bdb5f86ea8 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/numrgts.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/numrgts.cpp
@@ -78,7 +78,7 @@ public:
{
NumberFormat::parse(text, result, status);
}
- virtual Format* clone() const
+ virtual MyNumberFormatTest* clone() const
{ return NULL; }
virtual UnicodeString& format(int32_t,
@@ -850,15 +850,15 @@ void NumberFormatRegressionTest::Test4092480 (void)
void NumberFormatRegressionTest::Test4087244 (void) {
UErrorCode status = U_ZERO_ERROR;
char loc[256] = {0};
- uloc_canonicalize("pt_PT_PREEURO", loc, 256, &status);
- Locale *de = new Locale(loc);
- NumberFormat *nf = NumberFormat::createCurrencyInstance(*de, status);
+
+ uloc_canonicalize("pt_PT@currency=PTE", loc, 256, &status);
+ Locale de(loc);
+ LocalPointer<NumberFormat> nf(NumberFormat::createCurrencyInstance(de, status));
if(U_FAILURE(status)) {
- dataerrln("Error creating DecimalFormat: %s", u_errorName(status));
- delete nf;
- return;
+ dataerrln("Error creating DecimalFormat: %s", u_errorName(status));
+ return;
}
- DecimalFormat *df = dynamic_cast<DecimalFormat *>(nf);
+ DecimalFormat *df = dynamic_cast<DecimalFormat *>(nf.getAlias());
if(df == NULL) {
errln("expected DecimalFormat!");
return;
@@ -887,8 +887,6 @@ void NumberFormatRegressionTest::Test4087244 (void) {
monStr +
"\" and not \"" + decStr + '"');
}
- delete de;
- delete nf;
}
/* @bug 4070798
* Number format data rounding errors for locale FR
@@ -918,7 +916,7 @@ void NumberFormatRegressionTest::Test4070798 (void)
UErrorCode status = U_ZERO_ERROR;
char loc[256]={0};
- int len = uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status);
+ int len = uloc_canonicalize("fr_FR@currency=FRF", loc, 256, &status);
(void)len; // Suppress set but not used warning.
formatter = NumberFormat::createInstance(Locale(loc), status);
if(U_FAILURE(status)) {
@@ -937,7 +935,7 @@ void NumberFormatRegressionTest::Test4070798 (void)
" Received " + tempString );
}
delete formatter;
- len = uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status);
+ len = uloc_canonicalize("fr_FR@currency=FRF", loc, 256, &status);
formatter = NumberFormat::createCurrencyInstance(loc, status);
failure(status, "NumberFormat::createCurrencyInstance", loc);
tempString.remove();
@@ -952,7 +950,7 @@ void NumberFormatRegressionTest::Test4070798 (void)
}
delete formatter;
- uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status);
+ uloc_canonicalize("fr_FR@currency=FRF", loc, 256, &status);
formatter = NumberFormat::createPercentInstance(Locale(loc), status);
failure(status, "NumberFormat::createPercentInstance", loc);
tempString.remove();
@@ -998,7 +996,7 @@ void NumberFormatRegressionTest::Test4071005 (void)
if (failure(status, "NumberFormat::createInstance", Locale::getCanadaFrench(), TRUE)){
delete formatter;
return;
- };
+ }
tempString = formatter->format (-5789.9876, tempString);
if (tempString == expectedDefault) {
@@ -1061,7 +1059,7 @@ void NumberFormatRegressionTest::Test4071014 (void)
UErrorCode status = U_ZERO_ERROR;
char loc[256]={0};
- uloc_canonicalize("de_DE_PREEURO", loc, 256, &status);
+ uloc_canonicalize("de_DE@currency=DEM", loc, 256, &status);
formatter = NumberFormat::createInstance(Locale(loc), status);
if (failure(status, "NumberFormat::createInstance", loc, TRUE)){
delete formatter;
@@ -1078,7 +1076,7 @@ void NumberFormatRegressionTest::Test4071014 (void)
" Received " + tempString );
}
delete formatter;
- uloc_canonicalize("de_DE_PREEURO", loc, 256, &status);
+ uloc_canonicalize("de_DE@currency=DEM", loc, 256, &status);
formatter = NumberFormat::createCurrencyInstance(Locale(loc), status);
failure(status, "NumberFormat::createCurrencyInstance", loc);
tempString.remove();
@@ -1127,12 +1125,12 @@ void NumberFormatRegressionTest::Test4071859 (void)
UErrorCode status = U_ZERO_ERROR;
char loc[256]={0};
- uloc_canonicalize("it_IT_PREEURO", loc, 256, &status);
+ uloc_canonicalize("it_IT@currency=ITL", loc, 256, &status);
formatter = NumberFormat::createInstance(Locale(loc), status);
if (failure(status, "NumberFormat::createNumberInstance", TRUE)){
delete formatter;
return;
- };
+ }
tempString = formatter->format (-5789.9876, tempString);
if (tempString == expectedDefault) {
@@ -1143,7 +1141,7 @@ void NumberFormatRegressionTest::Test4071859 (void)
" Received " + tempString );
}
delete formatter;
- uloc_canonicalize("it_IT_PREEURO", loc, 256, &status);
+ uloc_canonicalize("it_IT@currency=ITL", loc, 256, &status);
formatter = NumberFormat::createCurrencyInstance(Locale(loc), status);
failure(status, "NumberFormat::createCurrencyInstance");
tempString.remove();
@@ -1157,7 +1155,7 @@ void NumberFormatRegressionTest::Test4071859 (void)
" Received " + tempString );
}
delete formatter;
- uloc_canonicalize("it_IT_PREEURO", loc, 256, &status);
+ uloc_canonicalize("it_IT@currency=ITL", loc, 256, &status);
formatter = NumberFormat::createPercentInstance(Locale(loc), status);
failure(status, "NumberFormat::createPercentInstance");
tempString.remove();
@@ -1942,7 +1940,7 @@ void NumberFormatRegressionTest::Test4145457() {
if (failure(status, "NumberFormat::createInstance", TRUE)){
delete nff;
return;
- };
+ }
DecimalFormat *nf = dynamic_cast<DecimalFormat *>(nff);
if(nf == NULL) {
errln("DecimalFormat needed to continue");
@@ -2185,7 +2183,7 @@ void NumberFormatRegressionTest::Test4167494(void) {
if (failure(status, "NumberFormat::createInstance", TRUE)){
delete fmt;
return;
- };
+ }
double a = DBL_MAX * 0.99; // DBL_MAX itself overflows to +Inf
UnicodeString s;
@@ -2515,7 +2513,7 @@ void NumberFormatRegressionTest::Test4216742(void) {
if (failure(status, "createInstance", Locale::getUS(), TRUE)){
delete fmt;
return;
- };
+ }
int32_t DATA[] = { INT32_MIN, INT32_MAX, -100000000, 100000000 };
int DATA_length = UPRV_LENGTHOF(DATA);
for (int i=0; i<DATA_length; ++i) {
@@ -2557,7 +2555,7 @@ void NumberFormatRegressionTest::Test4217661(void) {
if (failure(status, "createInstance", Locale::getUS(), TRUE)){
delete fmt;
return;
- };
+ }
fmt->setMaximumFractionDigits(2);
for (int i=0; i<D_length; i++) {
UnicodeString s;
@@ -2578,7 +2576,7 @@ void NumberFormatRegressionTest::Test4161100(void) {
if (failure(status, "createInstance", Locale::getUS(), TRUE)){
delete nf;
return;
- };
+ }
nf->setMinimumFractionDigits(1);
nf->setMaximumFractionDigits(1);
double a = -0.09;
@@ -2681,18 +2679,18 @@ void NumberFormatRegressionTest::TestJ691(void) {
Locale loc("fr", "CH");
// set up the input date string & expected output
- UnicodeString udt("11.10.2000", "");
- UnicodeString exp("11.10.00", "");
+ UnicodeString udt(u"11.10.2000");
+ UnicodeString exp(u"11.10.00");
// create a Calendar for this locale
- Calendar *cal = Calendar::createInstance(loc, status);
+ LocalPointer<Calendar> cal(Calendar::createInstance(loc, status));
if (U_FAILURE(status)) {
dataerrln("FAIL: Calendar::createInstance() returned " + (UnicodeString)u_errorName(status));
return;
}
// create a NumberFormat for this locale
- NumberFormat *nf = NumberFormat::createInstance(loc, status);
+ LocalPointer<NumberFormat> nf(NumberFormat::createInstance(loc, status));
if (U_FAILURE(status)) {
dataerrln("FAIL: NumberFormat::createInstance() returned " + (UnicodeString)u_errorName(status));
return;
@@ -2705,14 +2703,14 @@ void NumberFormatRegressionTest::TestJ691(void) {
// so they are done in DateFormat::adoptNumberFormat
// create the DateFormat
- DateFormat *df = DateFormat::createDateInstance(DateFormat::kShort, loc);
+ LocalPointer<DateFormat> df(DateFormat::createDateInstance(DateFormat::kShort, loc));
if (U_FAILURE(status)) {
errln("FAIL: DateFormat::createInstance() returned " + (UnicodeString)u_errorName(status));
return;
}
- df->adoptCalendar(cal);
- df->adoptNumberFormat(nf);
+ df->adoptCalendar(cal.orphan());
+ df->adoptNumberFormat(nf.orphan());
// set parsing to lenient & parse
df->setLenient(TRUE);
@@ -2725,8 +2723,6 @@ void NumberFormatRegressionTest::TestJ691(void) {
if (outString != exp) {
errln("FAIL: " + udt + " => " + outString);
}
-
- delete df;
}
//---------------------------------------------------------------------------
@@ -2734,27 +2730,28 @@ void NumberFormatRegressionTest::TestJ691(void) {
// Error Checking / Reporting macros
//
//---------------------------------------------------------------------------
-#define TEST_CHECK_STATUS(status) { \
+#define TEST_CHECK_STATUS(status) UPRV_BLOCK_MACRO_BEGIN { \
if (U_FAILURE(status)) { \
if (status == U_MISSING_RESOURCE_ERROR) { \
dataerrln("File %s, Line %d: status=%s", __FILE__, __LINE__, u_errorName(status)); \
} else { \
errln("File %s, Line %d: status=%s", __FILE__, __LINE__, u_errorName(status)); \
} return; \
- }}
+ } \
+} UPRV_BLOCK_MACRO_END
-#define TEST_ASSERT(expr) \
+#define TEST_ASSERT(expr) UPRV_BLOCK_MACRO_BEGIN { \
if ((expr)==FALSE) {\
errln("File %s, line %d: Assertion Failed: " #expr "\n", __FILE__, __LINE__);\
- }
-#define TEST_ASSERT_EQUALS(x,y) \
- { \
+ } \
+} UPRV_BLOCK_MACRO_END
+#define TEST_ASSERT_EQUALS(x,y) UPRV_BLOCK_MACRO_BEGIN { \
char _msg[1000]; \
int32_t len = sprintf (_msg,"File %s, line %d: " #x "==" #y, __FILE__, __LINE__); \
(void)len; \
U_ASSERT(len < (int32_t) sizeof(_msg)); \
assertEquals((const char*) _msg, x,y); \
- }
+} UPRV_BLOCK_MACRO_END
// Ticket 8199: Parse failure for numbers in the range of 1E10 - 1E18
@@ -2911,7 +2908,7 @@ void NumberFormatRegressionTest::Test9780(void) {
if (failure(status, "NumberFormat::createInstance", TRUE)){
delete nf;
return;
- };
+ }
DecimalFormat *df = dynamic_cast<DecimalFormat *>(nf);
if(df == NULL) {
errln("DecimalFormat needed to continue");
@@ -3025,7 +3022,6 @@ void NumberFormatRegressionTest::Test9677(void) {
errln("FAIL: with different neg prefix , parse error %s\n", u_errorName(status));
status = U_ZERO_ERROR;
} else {
-;
if(n!=-123456789) {
errln("FAIL: with different neg prefix , unum_parse status %s, result %d expected -123456789\n", u_errorName(status), n);
} else {
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/plurfmts.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/plurfmts.cpp
index c676a8fc833..30ecb408f03 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/plurfmts.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/plurfmts.cpp
@@ -124,7 +124,7 @@ void PluralFormatTest::pluralFormatBasicTest(/*char *par*/)
}
if ( U_SUCCESS(status[1]) ) {
- plFmt[2] = (PluralFormat*) plFmt[1]->clone();
+ plFmt[2] = plFmt[1]->clone();
if (plFmt[1]!=NULL) {
if ( *plFmt[1] != *plFmt[2] ) {
@@ -194,7 +194,7 @@ void PluralFormatTest::pluralFormatUnitTest(/*char *par*/)
UErrorCode status = U_ZERO_ERROR;
UnicodeString oddAndEvenRule = UNICODE_STRING_SIMPLE("odd: n mod 2 is 1");
- PluralRules* plRules = PluralRules::createRules(oddAndEvenRule, status);
+ LocalPointer<PluralRules>plRules(PluralRules::createRules(oddAndEvenRule, status));
if (U_FAILURE(status)) {
dataerrln("ERROR: create PluralRules instance failed in unit tests.- exitting");
return;
@@ -223,7 +223,7 @@ void PluralFormatTest::pluralFormatUnitTest(/*char *par*/)
status = U_ZERO_ERROR;
UBool overwrite[PLURAL_PATTERN_DATA] = {FALSE, FALSE, TRUE, TRUE};
- NumberFormat *numFmt = NumberFormat::createInstance(status);
+ LocalPointer<NumberFormat> numFmt(NumberFormat::createInstance(status));
UnicodeString message=UnicodeString("ERROR: PluralFormat tests various pattern ...");
if (U_FAILURE(status)) {
dataerrln("ERROR: Could not create NumberFormat instance with default locale ");
@@ -240,37 +240,33 @@ void PluralFormatTest::pluralFormatUnitTest(/*char *par*/)
errln("ERROR: PluralFormat failed to apply pattern- "+patternTestData[i]);
continue;
}
- numberFormatTest(&plFmt, numFmt, 1, 10, (UnicodeString *)&patternOddTestResult[i],
+ numberFormatTest(&plFmt, numFmt.getAlias(), 1, 10, (UnicodeString *)&patternOddTestResult[i],
(UnicodeString *)&patternEvenTestResult[i], overwrite[i], &message);
}
- delete plRules;
- delete numFmt;
// ======= Test set locale
status = U_ZERO_ERROR;
- plRules = PluralRules::createRules(UNICODE_STRING_SIMPLE("odd: n mod 2 is 1"), status);
+ plRules.adoptInstead(PluralRules::createRules(UNICODE_STRING_SIMPLE("odd: n mod 2 is 1"), status));
PluralFormat pluralFmt = PluralFormat(*plRules, status);
if (U_FAILURE(status)) {
dataerrln("ERROR: Could not create PluralFormat instance in setLocale() test - exitting. ");
- delete plRules;
return;
}
pluralFmt.applyPattern(UNICODE_STRING_SIMPLE("odd{odd} other{even}"), status);
pluralFmt.setLocale(Locale::getEnglish(), status);
if (U_FAILURE(status)) {
dataerrln("ERROR: Could not setLocale() with English locale ");
- delete plRules;
return;
}
message = UNICODE_STRING_SIMPLE("Error set locale: pattern is not reset!");
// Check that pattern gets deleted.
logln("\n Test setLocale() ..\n");
- numFmt = NumberFormat::createInstance(Locale::getEnglish(), status);
+ numFmt.adoptInstead(NumberFormat::createInstance(Locale::getEnglish(), status));
if (U_FAILURE(status)) {
dataerrln("ERROR: Could not create NumberFormat instance with English locale ");
}
- numberFormatTest(&pluralFmt, numFmt, 5, 5, NULL, NULL, FALSE, &message);
+ numberFormatTest(&pluralFmt, numFmt.getAlias(), 5, 5, NULL, NULL, FALSE, &message);
pluralFmt.applyPattern(UNICODE_STRING_SIMPLE("odd__{odd} other{even}"), status);
if (pluralFmt.format((int32_t)1, status) != UNICODE_STRING_SIMPLE("even")) {
errln("SetLocale should reset rules but did not.");
@@ -302,9 +298,6 @@ void PluralFormatTest::pluralFormatUnitTest(/*char *par*/)
if (pluralFmt != dupPFmt) {
errln("Failed in PluralFormat copy constructor or == operator");
}
-
- delete plRules;
- delete numFmt;
}
@@ -389,9 +382,10 @@ PluralFormatTest::pluralFormatLocaleTest(/*char *par*/)
pluralResults[0]= PFT_FEW;
for (int32_t i=1; i<20; ++i) {
pluralResults[i] = PFT_FEW; // note override after loop
- pluralResults[100+i] = PFT_FEW;
+ pluralResults[100+i] = PFT_FEW; // note override after loop
}
pluralResults[1]= PFT_ONE;
+ pluralResults[101]= PFT_OTHER;
helperTestResults(singularZeroSomeLocales, 1, testPattern, pluralResults);
// ======== Test Special 12/19.
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/plurults.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/plurults.cpp
index ae7fd4b5869..a70c362b7ab 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/plurults.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/plurults.cpp
@@ -6,7 +6,7 @@
* others. All Rights Reserved.
********************************************************************************
-* File PLURRULTS.cpp
+* File PLURULTS.cpp
*
********************************************************************************
*/
@@ -22,6 +22,7 @@
#include "unicode/localpointer.h"
#include "unicode/plurrule.h"
#include "unicode/stringpiece.h"
+#include "unicode/numberformatter.h"
#include "cmemory.h"
#include "plurrule_impl.h"
@@ -53,6 +54,8 @@ void PluralRulesTest::runIndexedTest( int32_t index, UBool exec, const char* &na
TESTCASE_AUTO(testAvailbleLocales);
TESTCASE_AUTO(testParseErrors);
TESTCASE_AUTO(testFixedDecimal);
+ TESTCASE_AUTO(testSelectTrailingZeros);
+ TESTCASE_AUTO(testLocaleExtension);
TESTCASE_AUTO_END;
}
@@ -66,9 +69,9 @@ class US {
US(const UnicodeString &us) {
int32_t bufLen = us.extract((int32_t)0, us.length(), (char *)NULL, (uint32_t)0) + 1;
buf = (char *)uprv_malloc(bufLen);
- us.extract(0, us.length(), buf, bufLen); };
- const char *cstr() {return buf;};
- ~US() { uprv_free(buf);};
+ us.extract(0, us.length(), buf, bufLen); }
+ const char *cstr() {return buf;}
+ ~US() { uprv_free(buf);}
};
@@ -644,7 +647,7 @@ void PluralRulesTest::checkSelect(const LocalPointer<PluralRules> &rules, UError
}
double numDbl = dl.toDouble();
const char *decimalPoint = strchr(num, '.');
- int fractionDigitCount = decimalPoint == NULL ? 0 : (num + strlen(num) - 1) - decimalPoint;
+ int fractionDigitCount = decimalPoint == NULL ? 0 : static_cast<int>((num + strlen(num) - 1) - decimalPoint);
int fractionDigits = fractionDigitCount == 0 ? 0 : atoi(decimalPoint + 1);
FixedDecimal ni(numDbl, fractionDigitCount, fractionDigits);
@@ -1004,5 +1007,64 @@ void PluralRulesTest::testFixedDecimal() {
}
+void PluralRulesTest::testSelectTrailingZeros() {
+ IcuTestErrorCode status(*this, "testSelectTrailingZeros");
+ number::UnlocalizedNumberFormatter unf = number::NumberFormatter::with()
+ .precision(number::Precision::fixedFraction(2));
+ struct TestCase {
+ const char* localeName;
+ const char16_t* expectedDoubleKeyword;
+ const char16_t* expectedFormattedKeyword;
+ double number;
+ } cases[] = {
+ {"bs", u"few", u"other", 5.2}, // 5.2 => two, but 5.20 => other
+ {"si", u"one", u"one", 0.0},
+ {"si", u"one", u"one", 1.0},
+ {"si", u"one", u"other", 0.1}, // 0.1 => one, but 0.10 => other
+ {"si", u"one", u"one", 0.01}, // 0.01 => one
+ {"hsb", u"few", u"few", 1.03}, // (f % 100 == 3) => few
+ {"hsb", u"few", u"other", 1.3}, // 1.3 => few, but 1.30 => other
+ };
+ for (const auto& cas : cases) {
+ UnicodeString message(UnicodeString(cas.localeName) + u" " + DoubleToUnicodeString(cas.number));
+ status.setScope(message);
+ Locale locale(cas.localeName);
+ LocalPointer<PluralRules> rules(PluralRules::forLocale(locale, status));
+ assertEquals(message, cas.expectedDoubleKeyword, rules->select(cas.number));
+ number::FormattedNumber fn = unf.locale(locale).formatDouble(cas.number, status);
+ assertEquals(message, cas.expectedFormattedKeyword, rules->select(fn, status));
+ status.errIfFailureAndReset();
+ }
+}
+
+void PluralRulesTest::compareLocaleResults(const char* loc1, const char* loc2, const char* loc3) {
+ UErrorCode status = U_ZERO_ERROR;
+ LocalPointer<PluralRules> rules1(PluralRules::forLocale(loc1, status));
+ LocalPointer<PluralRules> rules2(PluralRules::forLocale(loc2, status));
+ LocalPointer<PluralRules> rules3(PluralRules::forLocale(loc3, status));
+ if (U_FAILURE(status)) {
+ dataerrln("Failed to create PluralRules for one of %s, %s, %s: %s\n", loc1, loc2, loc3, u_errorName(status));
+ return;
+ }
+ for (int32_t value = 0; value <= 12; value++) {
+ UnicodeString result1 = rules1->select(value);
+ UnicodeString result2 = rules2->select(value);
+ UnicodeString result3 = rules3->select(value);
+ if (result1 != result2 || result1 != result3) {
+ errln("PluralRules.select(%d) does not return the same values for %s, %s, %s\n", value, loc1, loc2, loc3);
+ }
+ }
+}
+
+void PluralRulesTest::testLocaleExtension() {
+ IcuTestErrorCode errorCode(*this, "testLocaleExtension");
+ LocalPointer<PluralRules> rules(PluralRules::forLocale("pt@calendar=gregorian", errorCode));
+ if (errorCode.errIfFailureAndReset("PluralRules::forLocale()")) { return; }
+ UnicodeString key = rules->select(1);
+ assertEquals("pt@calendar=gregorian select(1)", u"one", key);
+ compareLocaleResults("ar", "ar_SA", "ar_SA@calendar=gregorian");
+ compareLocaleResults("ru", "ru_UA", "ru-u-cu-RUB");
+ compareLocaleResults("fr", "fr_CH", "fr@ms=uksystem");
+}
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/plurults.h b/Build/source/libs/icu/icu-src/source/test/intltest/plurults.h
index 2189593aad1..784b0d3bf27 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/plurults.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/plurults.h
@@ -37,12 +37,15 @@ private:
void testAvailbleLocales();
void testParseErrors();
void testFixedDecimal();
+ void testSelectTrailingZeros();
+ void testLocaleExtension();
void assertRuleValue(const UnicodeString& rule, double expected);
void assertRuleKeyValue(const UnicodeString& rule, const UnicodeString& key,
double expected);
void checkSelect(const LocalPointer<PluralRules> &rules, UErrorCode &status,
int32_t line, const char *keyword, ...);
+ void compareLocaleResults(const char* loc1, const char* loc2, const char* loc3);
};
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/pptest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/pptest.cpp
index 75bc0944816..0f619d0e1c6 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/pptest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/pptest.cpp
@@ -182,7 +182,7 @@ void ParsePositionTest::TestFieldPosition_example()
if (failure(status, "NumberFormat::createInstance", TRUE)){
delete nf;
return;
- };
+ }
DecimalFormat *fmt = dynamic_cast<DecimalFormat *>(nf);
if(fmt == NULL) {
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/punyref.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/punyref.cpp
index 77c3e27fa6e..8ac7d49406e 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/punyref.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/punyref.cpp
@@ -65,7 +65,7 @@ U_CDECL_BEGIN
static punycode_uint decode_digit(punycode_uint cp)
{
return cp - 48 < 10 ? cp - 22 : cp - 65 < 26 ? cp - 65 :
- cp - 97 < 26 ? cp - 97 : base;
+ cp - 97 < 26 ? cp - 97 : static_cast<punycode_uint>(base);
}
/* encode_digit(d,flag) returns the basic code point whose value */
@@ -191,8 +191,8 @@ enum punycode_status punycode_encode(
for (q = delta, k = base; ; k += base) {
if (out >= max_out) return punycode_big_output;
- t = k <= bias /* + tmin */ ? tmin : /* +tmin not needed */
- k >= bias + tmax ? tmax : k - bias;
+ t = k <= bias /* + tmin */ ? static_cast<punycode_uint>(tmin) : /* +tmin not needed */
+ k >= bias + tmax ? static_cast<punycode_uint>(tmax) : k - bias;
if (q < t) break;
output[out++] = encode_digit(t + (q - t) % (base - t), 0);
q = (q - t) / (base - t);
@@ -263,8 +263,8 @@ enum punycode_status punycode_decode(
if (digit >= base) return punycode_bad_input;
if (digit > (maxint - i) / w) return punycode_overflow;
i += digit * w;
- t = k <= bias /* + tmin */ ? tmin : /* +tmin not needed */
- k >= bias + tmax ? tmax : k - bias;
+ t = k <= bias /* + tmin */ ? static_cast<punycode_uint>(tmin) : /* +tmin not needed */
+ k >= bias + tmax ? static_cast<punycode_uint>(tmax) : k - bias;
if (digit < t) break;
if (w > maxint / (base - t)) return punycode_overflow;
w *= (base - t);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/quantityformattertest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/quantityformattertest.cpp
index 2d4f0c0c720..9fc57e43b0e 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/quantityformattertest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/quantityformattertest.cpp
@@ -17,6 +17,12 @@
#include "unicode/numfmt.h"
#include "unicode/plurrule.h"
+#define ASSERT_OK(status) UPRV_BLOCK_MACRO_BEGIN { \
+ if(U_FAILURE(status)) { \
+ errcheckln(status, #status " = %s @ %s:%d", u_errorName(status), __FILE__, __LINE__); \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
class QuantityFormatterTest : public IntlTest {
public:
@@ -117,6 +123,7 @@ void QuantityFormatterTest::TestBasic() {
NumberFormat::createInstance(Locale::getEnglish(), status));
LocalPointer<PluralRules> plurrule(
PluralRules::forLocale("en", status));
+ ASSERT_OK(status);
FieldPosition pos(FieldPosition::DONT_CARE);
UnicodeString appendTo;
assertEquals(
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/rbbiapts.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/rbbiapts.cpp
index fa6ea066807..ecc10e8ea65 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/rbbiapts.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/rbbiapts.cpp
@@ -34,11 +34,17 @@
*/
-#define TEST_ASSERT_SUCCESS(status) {if (U_FAILURE(status)) {\
-dataerrln("Failure at file %s, line %d, error = %s", __FILE__, __LINE__, u_errorName(status));}}
-
-#define TEST_ASSERT(expr) {if ((expr) == FALSE) { \
- errln("Test Failure at file %s, line %d: \"%s\" is false.\n", __FILE__, __LINE__, #expr);};}
+#define TEST_ASSERT_SUCCESS(status) UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(status)) { \
+ dataerrln("Failure at file %s, line %d, error = %s", __FILE__, __LINE__, u_errorName(status)); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define TEST_ASSERT(expr) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expr) == FALSE) { \
+ errln("Test Failure at file %s, line %d: \"%s\" is false.\n", __FILE__, __LINE__, #expr); \
+ } \
+} UPRV_BLOCK_MACRO_END
void RBBIAPITest::TestCloneEquals()
{
@@ -126,8 +132,8 @@ void RBBIAPITest::TestCloneEquals()
logln((UnicodeString)"Testing clone()");
- RuleBasedBreakIterator* bi1clone = dynamic_cast<RuleBasedBreakIterator *>(bi1->clone());
- RuleBasedBreakIterator* bi2clone = dynamic_cast<RuleBasedBreakIterator *>(bi2->clone());
+ RuleBasedBreakIterator* bi1clone = bi1->clone();
+ RuleBasedBreakIterator* bi2clone = bi2->clone();
if(*bi1clone != *bi1 || *bi1clone != *biequal ||
*bi1clone == *bi3 || *bi1clone == *bi2)
@@ -197,7 +203,7 @@ void RBBIAPITest::TestgetRules()
UnicodeString text(u"Hello there");
bi1->setText(text);
- LocalPointer <RuleBasedBreakIterator> bi3((RuleBasedBreakIterator*)bi1->clone());
+ LocalPointer <RuleBasedBreakIterator> bi3(bi1->clone());
UnicodeString temp=bi1->getRules();
UnicodeString temp2=bi2->getRules();
@@ -232,8 +238,8 @@ void RBBIAPITest::TestHashCode()
bi2->setText((UnicodeString)"Hash code");
bi3->setText((UnicodeString)"Hash code");
- RuleBasedBreakIterator* bi1clone= (RuleBasedBreakIterator*)bi1->clone();
- RuleBasedBreakIterator* bi2clone= (RuleBasedBreakIterator*)bi2->clone();
+ RuleBasedBreakIterator* bi1clone= bi1->clone();
+ RuleBasedBreakIterator* bi2clone= bi2->clone();
if(bi1->hashCode() != bi1clone->hashCode() || bi1->hashCode() != bi3->hashCode() ||
bi1clone->hashCode() != bi3->hashCode() || bi2->hashCode() != bi2clone->hashCode())
@@ -294,7 +300,7 @@ void RBBIAPITest::TestGetSetAdoptText()
TEST_ASSERT(tstr == str1);
- LocalPointer<RuleBasedBreakIterator> rb((RuleBasedBreakIterator*)wordIter1->clone());
+ LocalPointer<RuleBasedBreakIterator> rb(wordIter1->clone());
rb->adoptText(text1);
if(rb->getText() != *text1)
errln((UnicodeString)"ERROR:1 error in adoptText ");
@@ -1041,7 +1047,7 @@ void RBBIAPITest::RoundtripRule(const char *dataFile) {
__FILE__, __LINE__, u_errorName(status), parseError.line, parseError.offset);
errln(UnicodeString(builtSource));
return;
- };
+ }
rbbiRules = brkItr->getBinaryRules(length);
logln("Comparing \"%s\" len=%d", dataFile, length);
if (memcmp(builtRules, rbbiRules, (int32_t)length) != 0) {
@@ -1389,9 +1395,9 @@ void RBBIAPITest::TestFilteredBreakIteratorBuilder() {
prtbrks(filteredBI.getAlias(), frText, *this);
// Verify ==
- TEST_ASSERT_TRUE(*frenchBI == *frenchBI);
- TEST_ASSERT_TRUE(*filteredBI != *frenchBI);
- TEST_ASSERT_TRUE(*frenchBI != *filteredBI);
+ assertTrue(WHERE, *frenchBI == *frenchBI);
+ assertTrue(WHERE, *filteredBI != *frenchBI);
+ assertTrue(WHERE, *frenchBI != *filteredBI);
} else {
dataerrln("French BI: not valid.");
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/rbbimonkeytest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/rbbimonkeytest.cpp
index 2a45ae6fad2..2b91ab38f73 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/rbbimonkeytest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/rbbimonkeytest.cpp
@@ -135,13 +135,13 @@ CharClass *BreakRules::addCharClass(const UnicodeString &name, const UnicodeStri
printf("epandedDef: %s\n", CStr(expandedDef)());
}
- UnicodeSet *s = new UnicodeSet(expandedDef, USET_IGNORE_SPACE, NULL, status);
+ LocalPointer<UnicodeSet> s(new UnicodeSet(expandedDef, USET_IGNORE_SPACE, NULL, status), status);
if (U_FAILURE(status)) {
- IntlTest::gTest->errln("%s:%d: error %s creating UnicodeSet %s", __FILE__, __LINE__,
- u_errorName(status), CStr(name)());
- return NULL;
+ IntlTest::gTest->errln("%s:%d: error %s creating UnicodeSet %s\n Expanded set definition: %s",
+ __FILE__, __LINE__, u_errorName(status), CStr(name)(), CStr(expandedDef)());
+ return nullptr;
}
- CharClass *cclass = new CharClass(name, definition, expandedDef, s);
+ CharClass *cclass = new CharClass(name, definition, expandedDef, s.orphan());
CharClass *previousClass = static_cast<CharClass *>(uhash_put(fCharClasses.getAlias(),
new UnicodeString(name), // Key, owned by hash table.
cclass, // Value, owned by hash table.
@@ -660,12 +660,12 @@ void RBBIMonkeyImpl::join() {
}
-#define MONKEY_ERROR(msg, index) { \
+#define MONKEY_ERROR(msg, index) UPRV_BLOCK_MACRO_BEGIN { \
IntlTest::gTest->errln("%s:%d %s at index %d. Parameters to reproduce: @rules=%s,seed=%u,loop=1,verbose ", \
__FILE__, __LINE__, msg, index, fRuleFileName, fTestData->fRandomSeed); \
if (fVerbose) { fTestData->dump(index); } \
status = U_INVALID_STATE_ERROR; \
-}
+} UPRV_BLOCK_MACRO_END
void RBBIMonkeyImpl::runTest() {
UErrorCode status = U_ZERO_ERROR;
@@ -906,7 +906,7 @@ void RBBIMonkeyTest::testMonkey() {
UnicodeString params(fParams);
UErrorCode status = U_ZERO_ERROR;
- const char *tests[] = {"grapheme.txt", "word.txt", "line.txt", "sentence.txt", "line_normal.txt",
+ const char *tests[] = {"grapheme.txt", "word.txt", "line.txt", "line_cj.txt", "sentence.txt", "line_normal.txt",
"line_normal_cj.txt", "line_loose.txt", "line_loose_cj.txt", "word_POSIX.txt",
NULL };
CharString testNameFromParams;
@@ -954,8 +954,8 @@ void RBBIMonkeyTest::testMonkey() {
}
test->fDumpExpansions = dumpExpansions;
test->fVerbose = verbose;
- test->fRandomGenerator.seed((uint32_t)seed);
- test->fLoopCount = loopCount;
+ test->fRandomGenerator.seed(static_cast<uint32_t>(seed));
+ test->fLoopCount = static_cast<int32_t>(loopCount);
test->setup(tests[i], status);
if (U_FAILURE(status)) {
dataerrln("%s:%d: error %s while starting test %s.", __FILE__, __LINE__, u_errorName(status), tests[i]);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/rbbimonkeytest.h b/Build/source/libs/icu/icu-src/source/test/intltest/rbbimonkeytest.h
index 54d23fcceae..cff731ae6b6 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/rbbimonkeytest.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/rbbimonkeytest.h
@@ -148,8 +148,8 @@ class BreakRules: public UObject {
class MonkeyTestData: public UObject {
public:
- MonkeyTestData() {};
- ~MonkeyTestData() {};
+ MonkeyTestData() {}
+ ~MonkeyTestData() {}
void set(BreakRules *rules, IntlTest::icu_rand &rand, UErrorCode &status);
void clearActualBreaks();
void dump(int32_t around = -1) const;
@@ -216,8 +216,8 @@ class RBBIMonkeyImpl: public UObject {
private:
RBBIMonkeyImpl *fMonkeyImpl;
public:
- RBBIMonkeyThread(RBBIMonkeyImpl *impl) : fMonkeyImpl(impl) {};
- void run() U_OVERRIDE { fMonkeyImpl->runTest(); };
+ RBBIMonkeyThread(RBBIMonkeyImpl *impl) : fMonkeyImpl(impl) {}
+ void run() U_OVERRIDE { fMonkeyImpl->runTest(); }
};
private:
void openBreakRules(const char *fileName, UErrorCode &status);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/rbbitst.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/rbbitst.cpp
index 048e2bb8ed5..8f063d0e416 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/rbbitst.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/rbbitst.cpp
@@ -51,11 +51,17 @@
#include "unicode/filteredbrk.h"
#endif // !UCONFIG_NO_FILTERED_BREAK_ITERATION
-#define TEST_ASSERT(x) {if (!(x)) { \
- errln("Failure in file %s, line %d", __FILE__, __LINE__);}}
-
-#define TEST_ASSERT_SUCCESS(errcode) { if (U_FAILURE(errcode)) { \
- errcheckln(errcode, "Failure in file %s, line %d, status = \"%s\"", __FILE__, __LINE__, u_errorName(errcode));}}
+#define TEST_ASSERT(x) UPRV_BLOCK_MACRO_BEGIN { \
+ if (!(x)) { \
+ errln("Failure in file %s, line %d", __FILE__, __LINE__); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define TEST_ASSERT_SUCCESS(errcode) UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(errcode)) { \
+ errcheckln(errcode, "Failure in file %s, line %d, status = \"%s\"", __FILE__, __LINE__, u_errorName(errcode)); \
+ } \
+} UPRV_BLOCK_MACRO_END
//---------------------------------------------
// runIndexedTest
@@ -139,7 +145,7 @@ static void printStringBreaks(UText *tstr, int expected[], int expectedCount) {
printf("code alpha extend alphanum type word sent line name\n");
int nextExpectedIndex = 0;
utext_setNativeIndex(tstr, 0);
- for (int j = 0; j < utext_nativeLength(tstr); j=utext_getNativeIndex(tstr)) {
+ for (int j = 0; j < static_cast<int>(utext_nativeLength(tstr)); j=static_cast<int>(utext_getNativeIndex(tstr))) {
if (nextExpectedIndex < expectedCount && j >= expected[nextExpectedIndex] ) {
printf("------------------------------------------------ %d\n", j);
++nextExpectedIndex;
@@ -575,7 +581,7 @@ void RBBITest::executeTest(TestParams *t, UErrorCode &status) {
//
// Run the iterator backwards, verify that the same breaks are found.
//
- prevBP = utext_nativeLength(t->textToBreak)+2; // start with a phony value for the last break pos seen.
+ prevBP = static_cast<int32_t>(utext_nativeLength(t->textToBreak) + 2); // start with a phony value for the last break pos seen.
bp = t->bi->last();
while (bp != BreakIterator::DONE) {
if (prevBP == bp) {
@@ -639,10 +645,10 @@ void RBBITest::executeTest(TestParams *t, UErrorCode &status) {
}
// Check following()
- for (i=0; i < utext_nativeLength(t->textToBreak); i++) {
+ for (i=0; i < static_cast<int32_t>(utext_nativeLength(t->textToBreak)); i++) {
int32_t actualBreak = t->bi->following(i);
int32_t expectedBreak = BreakIterator::DONE;
- for (int32_t j=i+1; j <= utext_nativeLength(t->textToBreak); j++) {
+ for (int32_t j=i+1; j <= static_cast<int32_t>(utext_nativeLength(t->textToBreak)); j++) {
if (t->getExpectedBreak(j) != 0) {
expectedBreak = j;
break;
@@ -656,7 +662,7 @@ void RBBITest::executeTest(TestParams *t, UErrorCode &status) {
}
// Check preceding()
- for (i=utext_nativeLength(t->textToBreak); i>=0; i--) {
+ for (i=static_cast<int32_t>(utext_nativeLength(t->textToBreak)); i>=0; i--) {
int32_t actualBreak = t->bi->preceding(i);
int32_t expectedBreak = BreakIterator::DONE;
@@ -666,7 +672,7 @@ void RBBITest::executeTest(TestParams *t, UErrorCode &status) {
// Therefore, start looking at the expected break data not at i-1, but at
// the start of code point index - 1.
utext_setNativeIndex(t->textToBreak, i);
- int32_t j = utext_getNativeIndex(t->textToBreak) - 1;
+ int32_t j = static_cast<int32_t>(utext_getNativeIndex(t->textToBreak) - 1);
for (; j >= 0; j--) {
if (t->getExpectedBreak(j) != 0) {
expectedBreak = j;
@@ -736,7 +742,7 @@ void RBBITest::TestExtended() {
int32_t tagValue = 0; // The numeric value of a <nnn> tag.
UnicodeString rules; // Holds rules from a <rules> ... </rules> block
- int32_t rulesFirstLine; // Line number of the start of current <rules> block
+ int32_t rulesFirstLine = 0; // Line number of the start of current <rules> block
for (charIdx = 0; charIdx < len; ) {
status = U_ZERO_ERROR;
@@ -1175,7 +1181,7 @@ UChar *RBBITest::ReadAndConvertFile(const char *fileName, int &ulen, const char
fileSize = ftell(f);
fileBuf = new char[fileSize];
fseek(f, 0, SEEK_SET);
- amt_read = fread(fileBuf, 1, fileSize, f);
+ amt_read = static_cast<int>(fread(fileBuf, 1, fileSize, f));
if (amt_read != fileSize || fileSize <= 0) {
errln("Error reading test data file.");
goto cleanUpAndReturn;
@@ -1237,7 +1243,7 @@ cleanUpAndReturn:
delete []retPtr;
retPtr = 0;
ulen = 0;
- };
+ }
return retPtr;
}
@@ -1310,6 +1316,23 @@ UBool RBBITest::testCaseIsKnownIssue(const UnicodeString &testCase, const char *
{"8151", "LineBreakTest.txt", u"\u002d\u0308\U00050005"},
{"8151", "LineBreakTest.txt", u"\u002d\u0e01"},
{"8151", "LineBreakTest.txt", u"\u002d\u0308\u0e01"},
+
+ // Issue ICU-12017 Improve line break around numbers
+ {"12017", "LineBreakTest.txt", u"\u002C\u0030"}, // ",0"
+ {"12017", "LineBreakTest.txt", u"\u002C\u0308\u0030"},
+ {"12017", "LineBreakTest.txt", u"find .com"},
+ {"12017", "LineBreakTest.txt", u"equals .35 cents"},
+ {"12017", "LineBreakTest.txt", u"a.2 "},
+ {"12017", "LineBreakTest.txt", u"a.2 \u0915"},
+ {"12017", "LineBreakTest.txt", u"a.2 \u672C"},
+ {"12017", "LineBreakTest.txt", u"a.2\u3000\u672C"},
+ {"12017", "LineBreakTest.txt", u"a.2\u3000\u307E"},
+ {"12017", "LineBreakTest.txt", u"a.2\u3000\u0033"},
+ {"12017", "LineBreakTest.txt", u"A.1 \uBABB"},
+ {"12017", "LineBreakTest.txt", u"\uBD24\uC5B4\u002E\u0020\u0041\u002E\u0032\u0020\uBCFC"},
+ {"12017", "LineBreakTest.txt", u"\uBD10\uC694\u002E\u0020\u0041\u002E\u0033\u0020\uBABB"},
+ {"12017", "LineBreakTest.txt", u"\uC694\u002E\u0020\u0041\u002E\u0034\u0020\uBABB"},
+ {"12017", "LineBreakTest.txt", u"a.2\u3000\u300C"},
};
for (int n=0; n<UPRV_LENGTHOF(badTestCases); n++) {
@@ -1594,6 +1617,9 @@ private:
UnicodeSet *fLVTSet;
UnicodeSet *fHangulSet;
UnicodeSet *fExtendedPictSet;
+ UnicodeSet *fViramaSet;
+ UnicodeSet *fLinkingConsonantSet;
+ UnicodeSet *fExtCccZwjSet;
UnicodeSet *fAnySet;
const UnicodeString *fText;
@@ -1626,6 +1652,11 @@ RBBICharMonkey::RBBICharMonkey() {
fHangulSet->addAll(*fLVTSet);
fExtendedPictSet = new UnicodeSet(u"[:Extended_Pictographic:]", status);
+ fViramaSet = new UnicodeSet(u"[\\p{Gujr}\\p{sc=Telu}\\p{sc=Mlym}\\p{sc=Orya}\\p{sc=Beng}\\p{sc=Deva}&"
+ "\\p{Indic_Syllabic_Category=Virama}]", status);
+ fLinkingConsonantSet = new UnicodeSet(u"[\\p{Gujr}\\p{sc=Telu}\\p{sc=Mlym}\\p{sc=Orya}\\p{sc=Beng}\\p{sc=Deva}&"
+ "\\p{Indic_Syllabic_Category=Consonant}]", status);
+ fExtCccZwjSet = new UnicodeSet(u"[[\\p{gcb=Extend}-\\p{ccc=0}] \\p{gcb=ZWJ}]", status);
fAnySet = new UnicodeSet(0, 0x10ffff);
fSets = new UVector(status);
@@ -1641,6 +1672,9 @@ RBBICharMonkey::RBBICharMonkey() {
fSets->addElement(fAnySet, status);
fSets->addElement(fZWJSet, status);
fSets->addElement(fExtendedPictSet, status);
+ fSets->addElement(fViramaSet, status);
+ fSets->addElement(fLinkingConsonantSet, status);
+ fSets->addElement(fExtCccZwjSet, status);
if (U_FAILURE(status)) {
deferredStatus = status;
}
@@ -1760,6 +1794,22 @@ int32_t RBBICharMonkey::next(int32_t prevPos) {
continue;
}
+ // Rule (GB9.3) LinkingConsonant ExtCccZwj* Virama ExtCccZwj* × LinkingConsonant
+ // Note: Viramas are also included in the ExtCccZwj class.
+ if (fLinkingConsonantSet->contains(c2)) {
+ int pi = p1;
+ bool sawVirama = false;
+ while (pi > 0 && fExtCccZwjSet->contains(fText->char32At(pi))) {
+ if (fViramaSet->contains(fText->char32At(pi))) {
+ sawVirama = true;
+ }
+ pi = fText->moveIndex32(pi, -1);
+ }
+ if (sawVirama && fLinkingConsonantSet->contains(fText->char32At(pi))) {
+ continue;
+ }
+ }
+
// Rule (GB11) Extended_Pictographic Extend * ZWJ x Extended_Pictographic
if (fExtendedPictSet->contains(cBase) && fZWJSet->contains(c1) && fExtendedPictSet->contains(c2)) {
continue;
@@ -1810,7 +1860,9 @@ RBBICharMonkey::~RBBICharMonkey() {
delete fAnySet;
delete fZWJSet;
delete fExtendedPictSet;
-}
+ delete fViramaSet;
+ delete fLinkingConsonantSet;
+ delete fExtCccZwjSet;}
//------------------------------------------------------------------------------------------
//
@@ -1872,7 +1924,7 @@ RBBIWordMonkey::RBBIWordMonkey()
fMidNumLetSet = new UnicodeSet(u"[\\p{Word_Break = MidNumLet}]", status);
fMidLetterSet = new UnicodeSet(u"[\\p{Word_Break = MidLetter}]", status);
fMidNumSet = new UnicodeSet(u"[\\p{Word_Break = MidNum}]", status);
- fNumericSet = new UnicodeSet(u"[\\p{Word_Break = Numeric}]", status);
+ fNumericSet = new UnicodeSet(u"[[\\p{Word_Break = Numeric}][\\uff10-\\uff19]]", status);
fFormatSet = new UnicodeSet(u"[\\p{Word_Break = Format}]", status);
fExtendNumLetSet = new UnicodeSet(u"[\\p{Word_Break = ExtendNumLet}]", status);
fExtendSet = new UnicodeSet(u"[\\p{Word_Break = Extend}]", status);
@@ -1987,7 +2039,7 @@ int32_t RBBIWordMonkey::next(int32_t prevPos) {
c3 = fText->char32At(p3);
if (fCRSet->contains(c2) || fLFSet->contains(c2) || fNewlineSet->contains(c2)) {
break;
- };
+ }
}
while (fFormatSet->contains(c3) || fExtendSet->contains(c3) || fZWJSet->contains(c3));
@@ -2013,10 +2065,10 @@ int32_t RBBIWordMonkey::next(int32_t prevPos) {
//
if (fCRSet->contains(c1) || fLFSet->contains(c1) || fNewlineSet->contains(c1)) {
break;
- };
+ }
if (fCRSet->contains(c2) || fLFSet->contains(c2) || fNewlineSet->contains(c2)) {
break;
- };
+ }
// Rule (3c) ZWJ x Extended_Pictographic
// Not ignoring extend chars, so peek into input text to
@@ -2684,6 +2736,7 @@ RBBILineMonkey::RBBILineMonkey() :
const char *rules =
"((\\p{Line_Break=PR}|\\p{Line_Break=PO})(\\p{Line_Break=CM}|\\u200d)*)?"
"((\\p{Line_Break=OP}|\\p{Line_Break=HY})(\\p{Line_Break=CM}|\\u200d)*)?"
+ "((\\p{Line_Break=IS})(\\p{Line_Break=CM}|\\u200d)*)?"
"\\p{Line_Break=NU}(\\p{Line_Break=CM}|\\u200d)*"
"((\\p{Line_Break=NU}|\\p{Line_Break=IS}|\\p{Line_Break=SY})(\\p{Line_Break=CM}|\\u200d)*)*"
"((\\p{Line_Break=CL}|\\p{Line_Break=CP})(\\p{Line_Break=CM}|\\u200d)*)?"
@@ -2936,17 +2989,12 @@ int32_t RBBILineMonkey::next(int32_t startPos) {
continue;
}
-
-
// LB 13 Don't break before closings.
- // NU x CL, NU x CP and NU x IS are not matched here so that they will
- // fall into LB 17 and the more general number regular expression.
//
- if ((!fNU->contains(prevChar) && fCL->contains(thisChar)) ||
- (!fNU->contains(prevChar) && fCP->contains(thisChar)) ||
- fEX->contains(thisChar) ||
- (!fNU->contains(prevChar) && fIS->contains(thisChar)) ||
- (!fNU->contains(prevChar) && fSY->contains(thisChar))) {
+ if (fCL->contains(thisChar) ||
+ fCP->contains(thisChar) ||
+ fEX->contains(thisChar) ||
+ fSY->contains(thisChar)) {
continue;
}
@@ -2954,7 +3002,7 @@ int32_t RBBILineMonkey::next(int32_t startPos) {
// Scan backwards, checking for this sequence.
// The OP char could include combining marks, so we actually check for
// OP CM* SP*
- // Another Twist: The Rule 67 fixes may have changed a SP CM
+ // Another Twist: The Rule 9 fixes may have changed a SP CM
// sequence into a ID char, so before scanning back through spaces,
// verify that prevChar is indeed a space. The prevChar variable
// may differ from fText[prevPos]
@@ -2972,6 +3020,21 @@ int32_t RBBILineMonkey::next(int32_t startPos) {
}
+ // LB 14a Break before an IS that begins a number and follows a space
+ if (nextPos < fText->length()) {
+ // note: UnicodeString::char32At(length) returns ffff, not distinguishable
+ // from a legit ffff character. So test length separately.
+ UChar32 nextChar = fText->char32At(nextPos);
+ if (fSP->contains(prevChar) && fIS->contains(thisChar) && fNU->contains(nextChar)) {
+ break;
+ }
+ }
+
+ // LB14b Do not break before numeric separators, even after spaces.
+ if (fIS->contains(thisChar)) {
+ continue;
+ }
+
// LB 15 QU SP* x OP
if (fOP->contains(thisChar)) {
// Scan backwards from prevChar to see if it is preceded by QU CM* SP*
@@ -4356,13 +4419,6 @@ void RBBITest::TestEmoji() {
// TestBug12519 - Correct handling of Locales by assignment / copy / clone
-// WHERE Macro yields a literal string of the form "source_file_name:line number "
-// TODO: propose something equivalent as a test framework addition.
-
-#define WHERE __FILE__ ":" XLINE(__LINE__) " "
-#define XLINE(s) LINE(s)
-#define LINE(s) #s
-
void RBBITest::TestBug12519() {
UErrorCode status = U_ZERO_ERROR;
LocalPointer<RuleBasedBreakIterator> biEn((RuleBasedBreakIterator *)BreakIterator::createWordInstance(Locale::getEnglish(), status));
@@ -4376,11 +4432,11 @@ void RBBITest::TestBug12519() {
assertTrue(WHERE, Locale::getFrench() == biFr->getLocale(ULOC_VALID_LOCALE, status));
assertTrue(WHERE "Locales do not participate in BreakIterator equality.", *biEn == *biFr);
- LocalPointer<RuleBasedBreakIterator>cloneEn((RuleBasedBreakIterator *)biEn->clone());
+ LocalPointer<RuleBasedBreakIterator>cloneEn(biEn->clone());
assertTrue(WHERE, *biEn == *cloneEn);
assertTrue(WHERE, Locale::getEnglish() == cloneEn->getLocale(ULOC_VALID_LOCALE, status));
- LocalPointer<RuleBasedBreakIterator>cloneFr((RuleBasedBreakIterator *)biFr->clone());
+ LocalPointer<RuleBasedBreakIterator>cloneFr(biFr->clone());
assertTrue(WHERE, *biFr == *cloneFr);
assertTrue(WHERE, Locale::getFrench() == cloneFr->getLocale(ULOC_VALID_LOCALE, status));
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/regcoll.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/regcoll.cpp
index 766a72ec300..67c95a6a8c2 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/regcoll.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/regcoll.cpp
@@ -142,7 +142,7 @@ void CollationRegressionTest::Test4054238(/* char* par */)
{
const UChar chars3[] = {0x61, 0x00FC, 0x62, 0x65, 0x63, 0x6b, 0x20, 0x47, 0x72, 0x00F6, 0x00DF, 0x65, 0x20, 0x4c, 0x00FC, 0x62, 0x63, 0x6b, 0};
const UnicodeString test3(chars3);
- RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone();
+ RuleBasedCollator *c = en_us->clone();
// NOTE: The Java code uses en_us to create the CollationElementIterators
// but I'm pretty sure that's wrong, so I've changed this to use c.
@@ -184,7 +184,7 @@ void CollationRegressionTest::Test4054734(/* char* par */)
UErrorCode status = U_ZERO_ERROR;
- RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone();
+ RuleBasedCollator *c = en_us->clone();
c->setStrength(Collator::IDENTICAL);
@@ -201,7 +201,7 @@ void CollationRegressionTest::Test4054734(/* char* par */)
void CollationRegressionTest::Test4054736(/* char* par */)
{
UErrorCode status = U_ZERO_ERROR;
- RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone();
+ RuleBasedCollator *c = en_us->clone();
c->setStrength(Collator::SECONDARY);
c->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
@@ -425,11 +425,11 @@ void CollationRegressionTest::Test4066189(/* char* par */)
// NOTE: The java code used en_us to create the
// CollationElementIterator's. I'm pretty sure that
// was wrong, so I've change the code to use c1 and c2
- RuleBasedCollator *c1 = (RuleBasedCollator *) en_us->clone();
+ RuleBasedCollator *c1 = en_us->clone();
c1->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
CollationElementIterator *i1 = c1->createCollationElementIterator(test1);
- RuleBasedCollator *c2 = (RuleBasedCollator *) en_us->clone();
+ RuleBasedCollator *c2 = en_us->clone();
c2->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_OFF, status);
CollationElementIterator *i2 = c2->createCollationElementIterator(test2);
@@ -495,7 +495,7 @@ void CollationRegressionTest::Test4076676(/* char* par */)
static const UChar s1[] = {0x41, 0x0301, 0x0302, 0x0300, 0};
static const UChar s2[] = {0x41, 0x0302, 0x0300, 0x0301, 0};
- RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone();
+ RuleBasedCollator *c = en_us->clone();
c->setStrength(Collator::TERTIARY);
if (c->compare(s1,s2) == 0)
@@ -573,7 +573,7 @@ void CollationRegressionTest::Test4081866(/* char* par */)
static const UChar s2[] = {0x41, 0x0327, 0x0316, 0x0315, 0x0300, 0};
UErrorCode status = U_ZERO_ERROR;
- RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone();
+ RuleBasedCollator *c = en_us->clone();
c->setStrength(Collator::TERTIARY);
// Now that the default collators are set to NO_DECOMPOSITION
@@ -628,7 +628,7 @@ void CollationRegressionTest::Test4087241(/* char* par */)
//
void CollationRegressionTest::Test4087243(/* char* par */)
{
- RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone();
+ RuleBasedCollator *c = en_us->clone();
c->setStrength(Collator::TERTIARY);
static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] =
@@ -738,7 +738,7 @@ void CollationRegressionTest::Test4101940(/* char* par */)
//
void CollationRegressionTest::Test4103436(/* char* par */)
{
- RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone();
+ RuleBasedCollator *c = en_us->clone();
c->setStrength(Collator::TERTIARY);
static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] =
@@ -759,7 +759,7 @@ void CollationRegressionTest::Test4103436(/* char* par */)
void CollationRegressionTest::Test4114076(/* char* par */)
{
UErrorCode status = U_ZERO_ERROR;
- RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone();
+ RuleBasedCollator *c = en_us->clone();
c->setStrength(Collator::TERTIARY);
//
@@ -884,7 +884,7 @@ void CollationRegressionTest::Test4114077(/* char* par */)
// as we do with it on....
UErrorCode status = U_ZERO_ERROR;
- RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone();
+ RuleBasedCollator *c = en_us->clone();
c->setStrength(Collator::TERTIARY);
static const UChar test1[][CollationRegressionTest::MAX_TOKEN_LEN] =
@@ -1253,7 +1253,7 @@ void CollationRegressionTest::TestT7189() {
}
void CollationRegressionTest::TestCaseFirstCompression() {
- RuleBasedCollator *col = (RuleBasedCollator *) en_us->clone();
+ RuleBasedCollator *col = en_us->clone();
UErrorCode status = U_ZERO_ERROR;
// default
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/regextst.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/regextst.cpp
index 4b0a2f43fca..b6391d2fa28 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/regextst.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/regextst.cpp
@@ -104,6 +104,7 @@ void RegexTest::runIndexedTest( int32_t index, UBool exec, const char* &name, ch
TESTCASE_AUTO(TestBug12884);
TESTCASE_AUTO(TestBug13631);
TESTCASE_AUTO(TestBug13632);
+ TESTCASE_AUTO(TestBug20359);
TESTCASE_AUTO_END;
}
@@ -176,29 +177,56 @@ const char* RegexTest::extractToAssertBuf(const UnicodeString& message) {
return ASSERT_BUF;
}
-#define REGEX_VERBOSE_TEXT(text) {char buf[200];utextToPrintable(buf,UPRV_LENGTHOF(buf),text);logln("%s:%d: UText %s=\"%s\"", __FILE__, __LINE__, #text, buf);}
-
-#define REGEX_CHECK_STATUS {if (U_FAILURE(status)) {dataerrln("%s:%d: RegexTest failure. status=%s", \
- __FILE__, __LINE__, u_errorName(status)); return;}}
-
-#define REGEX_ASSERT(expr) {if ((expr)==FALSE) {errln("%s:%d: RegexTest failure: REGEX_ASSERT(%s) failed \n", __FILE__, __LINE__, #expr);};}
-
-#define REGEX_ASSERT_FAIL(expr, errcode) {UErrorCode status=U_ZERO_ERROR; (expr);\
-if (status!=errcode) {dataerrln("RegexTest failure at line %d. Expected status=%s, got %s", \
- __LINE__, u_errorName(errcode), u_errorName(status));};}
-
-#define REGEX_CHECK_STATUS_L(line) {if (U_FAILURE(status)) {errln( \
- "RegexTest failure at line %d, from %d. status=%d\n",__LINE__, (line), status); }}
-
-#define REGEX_ASSERT_L(expr, line) {if ((expr)==FALSE) { \
- errln("RegexTest failure at line %d, from %d.", __LINE__, (line)); return;}}
+#define REGEX_VERBOSE_TEXT(text) UPRV_BLOCK_MACRO_BEGIN { \
+ char buf[200]; \
+ utextToPrintable(buf,UPRV_LENGTHOF(buf),text); \
+ logln("%s:%d: UText %s=\"%s\"", __FILE__, __LINE__, #text, buf); \
+} UPRV_BLOCK_MACRO_END
+
+#define REGEX_CHECK_STATUS UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(status)) { \
+ dataerrln("%s:%d: RegexTest failure. status=%s", \
+ __FILE__, __LINE__, u_errorName(status)); \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define REGEX_ASSERT(expr) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expr)==FALSE) { \
+ errln("%s:%d: RegexTest failure: REGEX_ASSERT(%s) failed \n", __FILE__, __LINE__, #expr); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define REGEX_ASSERT_FAIL(expr, errcode) UPRV_BLOCK_MACRO_BEGIN { \
+ UErrorCode status=U_ZERO_ERROR; \
+ (expr); \
+ if (status!=errcode) { \
+ dataerrln("RegexTest failure at line %d. Expected status=%s, got %s", \
+ __LINE__, u_errorName(errcode), u_errorName(status)); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define REGEX_CHECK_STATUS_L(line) UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(status)) { \
+ errln("RegexTest failure at line %d, from %d. status=%d\n",__LINE__, (line), status); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define REGEX_ASSERT_L(expr, line) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expr)==FALSE) { \
+ errln("RegexTest failure at line %d, from %d.", __LINE__, (line)); \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
// expected: const char * , restricted to invariant characters.
// actual: const UnicodeString &
-#define REGEX_ASSERT_UNISTR(expected, actual) { \
+#define REGEX_ASSERT_UNISTR(expected, actual) UPRV_BLOCK_MACRO_BEGIN { \
if (UnicodeString(expected, -1, US_INV) != (actual)) { \
errln("%s:%d: RegexTest failure: REGEX_ASSERT_UNISTR(%s, %s) failed \n", \
- __FILE__, __LINE__, expected, extractToAssertBuf(actual));};}
+ __FILE__, __LINE__, expected, extractToAssertBuf(actual)); \
+ } \
+} UPRV_BLOCK_MACRO_END
static UBool testUTextEqual(UText *uta, UText *utb) {
@@ -328,7 +356,10 @@ static UText* regextst_openUTF8FromInvariant(UText *ut, const char *inv, int64_t
//
//---------------------------------------------------------------------------
-#define REGEX_TESTLM(pat, text, looking, match) {doRegexLMTest(pat, text, looking, match, __LINE__);doRegexLMTestUTF8(pat, text, looking, match, __LINE__);}
+#define REGEX_TESTLM(pat, text, looking, match) UPRV_BLOCK_MACRO_BEGIN { \
+ doRegexLMTest(pat, text, looking, match, __LINE__); \
+ doRegexLMTestUTF8(pat, text, looking, match, __LINE__); \
+} UPRV_BLOCK_MACRO_END
UBool RegexTest::doRegexLMTest(const char *pat, const char *text, UBool looking, UBool match, int32_t line) {
const UnicodeString pattern(pat, -1, US_INV);
@@ -480,7 +511,7 @@ UBool RegexTest::doRegexLMTestUTF8(const char *pat, const char *text, UBool look
// REGEX_ERR("pattern", expected error line, column, expected status);
//
//---------------------------------------------------------------------------
-#define REGEX_ERR(pat, line, col, status) regex_err(pat, line, col, status, __LINE__);
+#define REGEX_ERR(pat, line, col, status) regex_err(pat, line, col, status, __LINE__)
void RegexTest::regex_err(const char *pat, int32_t errLine, int32_t errCol,
UErrorCode expectedStatus, int32_t line) {
@@ -1821,8 +1852,8 @@ void RegexTest::API_Match_UTF8() {
REGEX_VERBOSE_TEXT(&input2);
utext_openUChars(&empty, NULL, 0, &status);
- int32_t input1Len = strlen("abcdef this is a test"); /* TODO: why not nativelen (input1) ? */
- int32_t input2Len = strlen("not abc");
+ int32_t input1Len = static_cast<int32_t>(strlen("abcdef this is a test")); /* TODO: why not nativelen (input1) ? */
+ int32_t input2Len = static_cast<int32_t>(strlen("not abc"));
//
@@ -3494,11 +3525,16 @@ void RegexTest::regex_find(const UnicodeString &pattern,
}
}
parseMatcher->appendTail(deTaggedInput);
- REGEX_ASSERT_L(groupStarts.size() == groupEnds.size(), line);
+
+ if (groupStarts.size() != groupEnds.size()) {
+ errln("Error at line %d: mismatched <n> group tags in expected results.", line);
+ failed = true;
+ goto cleanupAndReturn;
+ }
if ((regionStart>=0 || regionEnd>=0) && (regionStart<0 || regionStart>regionEnd)) {
- errln("mismatched <r> tags");
- failed = TRUE;
- goto cleanupAndReturn;
+ errln("mismatched <r> tags");
+ failed = TRUE;
+ goto cleanupAndReturn;
}
//
@@ -3861,7 +3897,7 @@ UChar *RegexTest::ReadAndConvertFile(const char *fileName, int32_t &ulen,
fileSize = ftell(f);
fileBuf = new char[fileSize];
fseek(f, 0, SEEK_SET);
- amt_read = fread(fileBuf, 1, fileSize, f);
+ amt_read = static_cast<int32_t>(fread(fileBuf, 1, fileSize, f));
if (amt_read != fileSize || fileSize <= 0) {
errln("Error reading test data file.");
goto cleanUpAndReturn;
@@ -3927,7 +3963,7 @@ cleanUpAndReturn:
delete []retPtr;
retPtr = 0;
ulen = 0;
- };
+ }
return retPtr;
}
@@ -4754,7 +4790,7 @@ struct callBackContext {
int32_t maxCalls;
int32_t numCalls;
int32_t lastSteps;
- void reset(int32_t max) {maxCalls=max; numCalls=0; lastSteps=0;};
+ void reset(int32_t max) {maxCalls=max; numCalls=0; lastSteps=0;}
};
U_CDECL_BEGIN
@@ -4857,7 +4893,7 @@ struct progressCallBackContext {
int64_t lastIndex;
int32_t maxCalls;
int32_t numCalls;
- void reset(int32_t max) {maxCalls=max; numCalls=0;lastIndex=0;};
+ void reset(int32_t max) {maxCalls=max; numCalls=0;lastIndex=0;}
};
// call-back function for find().
@@ -5667,7 +5703,7 @@ void RegexTest::TestCase11049(const char *pattern, const char *data, UBool expec
// Size of the original char * data (invariant charset) will be <= than the equivalent UTF-8
// because string.unescape() will only shrink it.
char * utf8Buffer = new char[uprv_strlen(data)+1];
- u_strToUTF8(utf8Buffer, uprv_strlen(data)+1, NULL, dataString.getBuffer(), dataString.length(), &status);
+ u_strToUTF8(utf8Buffer, static_cast<int32_t>(uprv_strlen(data)+1), NULL, dataString.getBuffer(), dataString.length(), &status);
REGEX_CHECK_STATUS;
ut = utext_openUTF8(ut, utf8Buffer, -1, &status);
REGEX_CHECK_STATUS;
@@ -5851,4 +5887,30 @@ void RegexTest::TestBug13632() {
uregex_close(re);
}
+void RegexTest::TestBug20359() {
+ // The bug was stack overflow while parsing a pattern with a huge number of adjacent \Q\E
+ // pairs. (Enter and exit pattern literal quote mode). Logic was correct.
+ // Changed implementation to loop instead of recursing.
+
+ UnicodeString pattern;
+ for (int i=0; i<50000; ++i) {
+ pattern += u"\\Q\\E";
+ }
+ pattern += u"x";
+
+ UErrorCode status = U_ZERO_ERROR;
+ LocalURegularExpressionPointer re(uregex_open(pattern.getBuffer(), pattern.length(),
+ 0, nullptr, &status));
+ assertSuccess(WHERE, status);
+
+ // We have passed the point where the bug crashed. The following is a small sanity
+ // check that the pattern works, that all the \Q\E\Q\E... didn't cause other problems.
+
+ uregex_setText(re.getAlias(), u"abcxyz", -1, &status);
+ assertSuccess(WHERE, status);
+ assertTrue(WHERE, uregex_find(re.getAlias(), 0, &status));
+ assertEquals(WHERE, 3, uregex_start(re.getAlias(), 0, &status));
+ assertSuccess(WHERE, status);
+}
+
#endif /* !UCONFIG_NO_REGULAR_EXPRESSIONS */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/regextst.h b/Build/source/libs/icu/icu-src/source/test/intltest/regextst.h
index cfa62d70384..58e9acb22c6 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/regextst.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/regextst.h
@@ -59,6 +59,7 @@ public:
virtual void TestBug12884();
virtual void TestBug13631();
virtual void TestBug13632();
+ virtual void TestBug20359();
// The following functions are internal to the regexp tests.
virtual void assertUText(const char *expected, UText *actual, const char *file, int line);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/reldatefmttest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/reldatefmttest.cpp
index 4481f420cb8..661228dc9fe 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/reldatefmttest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/reldatefmttest.cpp
@@ -22,7 +22,9 @@
#include "unicode/localpointer.h"
#include "unicode/numfmt.h"
#include "unicode/reldatefmt.h"
+#include "unicode/rbnf.h"
#include "cmemory.h"
+#include "itformat.h"
static const char *DirectionStr(UDateDirection direction);
static const char *RelativeUnitStr(UDateRelativeUnit unit);
@@ -284,6 +286,8 @@ static WithoutQuantityExpected kEnglishNoQuantity[] = {
{UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_FRIDAY, "this Friday"},
{UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SATURDAY, "this Saturday"},
{UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, "this Sunday"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_HOUR, "this hour"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MINUTE, "this minute"},
{UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_DAY, "day"},
{UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEEK, "week"},
@@ -297,6 +301,8 @@ static WithoutQuantityExpected kEnglishNoQuantity[] = {
{UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_FRIDAY, "Friday"},
{UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SATURDAY, "Saturday"},
{UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, "Sunday"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_HOUR, "hour"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MINUTE, "minute"},
{UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "now"}
};
@@ -621,11 +627,11 @@ static WithQuantityExpectedRelativeDateTimeUnit kEnglishFormat[] = {
{0.5, UDAT_REL_UNIT_SECOND, "in 0.5 seconds"},
{1.0, UDAT_REL_UNIT_SECOND, "in 1 second"},
{2.0, UDAT_REL_UNIT_SECOND, "in 2 seconds"},
- {0.0, UDAT_REL_UNIT_MINUTE, "in 0 minutes"},
+ {0.0, UDAT_REL_UNIT_MINUTE, "this minute"},
{0.5, UDAT_REL_UNIT_MINUTE, "in 0.5 minutes"},
{1.0, UDAT_REL_UNIT_MINUTE, "in 1 minute"},
{2.0, UDAT_REL_UNIT_MINUTE, "in 2 minutes"},
- {0.0, UDAT_REL_UNIT_HOUR, "in 0 hours"},
+ {0.0, UDAT_REL_UNIT_HOUR, "this hour"},
{0.5, UDAT_REL_UNIT_HOUR, "in 0.5 hours"},
{1.0, UDAT_REL_UNIT_HOUR, "in 1 hour"},
{2.0, UDAT_REL_UNIT_HOUR, "in 2 hours"},
@@ -682,11 +688,11 @@ static WithQuantityExpectedRelativeDateTimeUnit kEnglishFormat[] = {
{-0.5, UDAT_REL_UNIT_SECOND, "0.5 seconds ago"},
{-1.0, UDAT_REL_UNIT_SECOND, "1 second ago"},
{-2.0, UDAT_REL_UNIT_SECOND, "2 seconds ago"},
- {-0.0, UDAT_REL_UNIT_MINUTE, "0 minutes ago"},
+ {-0.0, UDAT_REL_UNIT_MINUTE, "this minute"},
{-0.5, UDAT_REL_UNIT_MINUTE, "0.5 minutes ago"},
{-1.0, UDAT_REL_UNIT_MINUTE, "1 minute ago"},
{-2.0, UDAT_REL_UNIT_MINUTE, "2 minutes ago"},
- {-0.0, UDAT_REL_UNIT_HOUR, "0 hours ago"},
+ {-0.0, UDAT_REL_UNIT_HOUR, "this hour"},
{-0.5, UDAT_REL_UNIT_HOUR, "0.5 hours ago"},
{-1.0, UDAT_REL_UNIT_HOUR, "1 hour ago"},
{-2.0, UDAT_REL_UNIT_HOUR, "2 hours ago"},
@@ -740,8 +746,28 @@ static WithQuantityExpectedRelativeDateTimeUnit kEnglishFormat[] = {
{-2.0, UDAT_REL_UNIT_SATURDAY, "2 Saturdays ago"}
};
+static WithQuantityExpected kAfrikaans[] = {
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "oor 1 maand"},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "oor 2 maande"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "1 maand gelede"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "2 maande gelede"},
+};
+
+static WithoutQuantityExpected kAfrikaansNoQuantity[] = {
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONTH, "volgende maand"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONTH, "verlede maand"},
+};
+
+static WithQuantityExpectedRelativeDateTimeUnit kAfrikaansFormatNumeric[] = {
+ {0.0, UDAT_REL_UNIT_MONTH, "oor 0 maande"},
+ {1.0, UDAT_REL_UNIT_MONTH, "oor 1 maand"},
+ {2.0, UDAT_REL_UNIT_MONTH, "oor 2 maande"},
+ {-0.0, UDAT_REL_UNIT_MONTH, "0 maande gelede"},
+ {-1.0, UDAT_REL_UNIT_MONTH, "1 maand gelede"},
+ {-2.0, UDAT_REL_UNIT_MONTH, "2 maande gelede"},
+};
-class RelativeDateTimeFormatterTest : public IntlTest {
+class RelativeDateTimeFormatterTest : public IntlTestWithFieldPosition {
public:
RelativeDateTimeFormatterTest() {
}
@@ -759,6 +785,7 @@ private:
void TestEnglishNoQuantityShort();
void TestEnglishNoQuantityNarrow();
void TestSpanishNoQuantity();
+ void TestAfrikaans();
void TestFormatWithQuantityIllegalArgument();
void TestFormatWithoutQuantityIllegalArgument();
void TestCustomNumberFormat();
@@ -768,6 +795,9 @@ private:
void TestFormat();
void TestFormatNumeric();
void TestLocales();
+ void TestFields();
+ void TestRBNF();
+
void RunTest(
const Locale& locale,
const WithQuantityExpected* expectedResults,
@@ -848,6 +878,7 @@ void RelativeDateTimeFormatterTest::runIndexedTest(
TESTCASE_AUTO(TestEnglishNoQuantityShort);
TESTCASE_AUTO(TestEnglishNoQuantityNarrow);
TESTCASE_AUTO(TestSpanishNoQuantity);
+ TESTCASE_AUTO(TestAfrikaans);
TESTCASE_AUTO(TestFormatWithQuantityIllegalArgument);
TESTCASE_AUTO(TestFormatWithoutQuantityIllegalArgument);
TESTCASE_AUTO(TestCustomNumberFormat);
@@ -858,6 +889,8 @@ void RelativeDateTimeFormatterTest::runIndexedTest(
TESTCASE_AUTO(TestFormat);
TESTCASE_AUTO(TestFormatNumeric);
TESTCASE_AUTO(TestLocales);
+ TESTCASE_AUTO(TestFields);
+ TESTCASE_AUTO(TestRBNF);
TESTCASE_AUTO_END;
}
@@ -944,6 +977,12 @@ void RelativeDateTimeFormatterTest::TestSpanishNoQuantity() {
RunTest("es", kSpanishNoQuantity, UPRV_LENGTHOF(kSpanishNoQuantity));
}
+void RelativeDateTimeFormatterTest::TestAfrikaans() {
+ RunTest("af", kAfrikaans, UPRV_LENGTHOF(kAfrikaans));
+ RunTest("af", kAfrikaansNoQuantity, UPRV_LENGTHOF(kAfrikaansNoQuantity));
+ RunTest("af", kAfrikaansFormatNumeric, UPRV_LENGTHOF(kAfrikaansFormatNumeric), true);
+}
+
void RelativeDateTimeFormatterTest::TestFormatWithQuantityIllegalArgument() {
UErrorCode status = U_ZERO_ERROR;
RelativeDateTimeFormatter fmt("en", status);
@@ -977,7 +1016,7 @@ void RelativeDateTimeFormatterTest::TestCustomNumberFormat() {
"Failure creating format object - %s", u_errorName(status));
return;
}
- nf = (NumberFormat *) fmt.getNumberFormat().clone();
+ nf = fmt.getNumberFormat().clone();
}
nf->setMinimumFractionDigits(1);
nf->setMaximumFractionDigits(1);
@@ -1277,7 +1316,7 @@ void RelativeDateTimeFormatterTest::TestSidewaysDataLoading(void) {
fmt.format(-3.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, actual.remove(), status);
assertEquals("3 days ago (negative 3.0): ", expected, actual);
- expected = "next yr.";
+ expected = "next yr";
fmt.format(UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, actual.remove(), status);
assertEquals("next year: ", expected, actual);
@@ -1287,7 +1326,7 @@ void RelativeDateTimeFormatterTest::TestSidewaysDataLoading(void) {
expected = "now";
fmtshort.format(0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, actual.remove(), status);
- expected = "next yr.";
+ expected = "next yr";
fmt.format(UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, actual.remove(), status);
assertEquals("next year: ", expected, actual);
}
@@ -1313,6 +1352,138 @@ void RelativeDateTimeFormatterTest::TestLocales() {
}
}
+void RelativeDateTimeFormatterTest::TestFields() {
+ IcuTestErrorCode status(*this, "TestFields");
+
+ RelativeDateTimeFormatter fmt("en-US", status);
+
+ {
+ const char16_t* message = u"automatic absolute unit";
+ FormattedRelativeDateTime fv = fmt.formatToValue(1, UDAT_REL_UNIT_DAY, status);
+ const char16_t* expectedString = u"tomorrow";
+ static const UFieldPositionWithCategory expectedFieldPositions[] = {
+ {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 0, 8}};
+ checkMixedFormattedValue(
+ message,
+ fv,
+ expectedString,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+ {
+ const char16_t* message = u"automatic numeric unit";
+ FormattedRelativeDateTime fv = fmt.formatToValue(3, UDAT_REL_UNIT_DAY, status);
+ const char16_t* expectedString = u"in 3 days";
+ static const UFieldPositionWithCategory expectedFieldPositions[] = {
+ {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 0, 2},
+ {UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD, 3, 4},
+ {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_NUMERIC_FIELD, 3, 4},
+ {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 5, 9}};
+ checkMixedFormattedValue(
+ message,
+ fv,
+ expectedString,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+ {
+ const char16_t* message = u"manual absolute unit";
+ FormattedRelativeDateTime fv = fmt.formatToValue(UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONDAY, status);
+ const char16_t* expectedString = u"next Monday";
+ static const UFieldPositionWithCategory expectedFieldPositions[] = {
+ {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 0, 11}};
+ checkMixedFormattedValue(
+ message,
+ fv,
+ expectedString,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+ {
+ const char16_t* message = u"manual numeric unit";
+ FormattedRelativeDateTime fv = fmt.formatNumericToValue(1.5, UDAT_REL_UNIT_WEEK, status);
+ const char16_t* expectedString = u"in 1.5 weeks";
+ static const UFieldPositionWithCategory expectedFieldPositions[] = {
+ {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 0, 2},
+ {UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD, 3, 4},
+ {UFIELD_CATEGORY_NUMBER, UNUM_DECIMAL_SEPARATOR_FIELD, 4, 5},
+ {UFIELD_CATEGORY_NUMBER, UNUM_FRACTION_FIELD, 5, 6},
+ {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_NUMERIC_FIELD, 3, 6},
+ {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 7, 12}};
+ checkMixedFormattedValue(
+ message,
+ fv,
+ expectedString,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+ {
+ const char16_t* message = u"manual numeric resolved unit";
+ FormattedRelativeDateTime fv = fmt.formatToValue(12, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, status);
+ const char16_t* expectedString = u"12 hours ago";
+ static const UFieldPositionWithCategory expectedFieldPositions[] = {
+ {UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD, 0, 2},
+ {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_NUMERIC_FIELD, 0, 2},
+ {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 3, 12}};
+ checkMixedFormattedValue(
+ message,
+ fv,
+ expectedString,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+
+ // Test when the number field is at the end
+ fmt = RelativeDateTimeFormatter("sw", status);
+ {
+ const char16_t* message = u"numeric field at end";
+ FormattedRelativeDateTime fv = fmt.formatToValue(12, UDAT_REL_UNIT_HOUR, status);
+ const char16_t* expectedString = u"baada ya saa 12";
+ static const UFieldPositionWithCategory expectedFieldPositions[] = {
+ {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 0, 12},
+ {UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD, 13, 15},
+ {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_NUMERIC_FIELD, 13, 15}};
+ checkMixedFormattedValue(
+ message,
+ fv,
+ expectedString,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+}
+
+void RelativeDateTimeFormatterTest::TestRBNF() {
+ IcuTestErrorCode status(*this, "TestRBNF");
+
+ LocalPointer<RuleBasedNumberFormat> rbnf(new RuleBasedNumberFormat(URBNF_SPELLOUT, "en-us", status));
+ if (status.errIfFailureAndReset()) { return; }
+ RelativeDateTimeFormatter fmt("en-us", rbnf.orphan(), status);
+ UnicodeString result;
+ assertEquals("format (direction)", "in five seconds",
+ fmt.format(5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, result, status));
+ assertEquals("formatNumeric", "one week ago",
+ fmt.formatNumeric(-1, UDAT_REL_UNIT_WEEK, result.remove(), status));
+ assertEquals("format (absolute)", "yesterday",
+ fmt.format(UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, result.remove(), status));
+ assertEquals("format (relative)", "in forty-two months",
+ fmt.format(42, UDAT_REL_UNIT_MONTH, result.remove(), status));
+
+ {
+ const char16_t* message = u"formatToValue (relative)";
+ FormattedRelativeDateTime fv = fmt.formatToValue(-100, UDAT_REL_UNIT_YEAR, status);
+ const char16_t* expectedString = u"one hundred years ago";
+ static const UFieldPositionWithCategory expectedFieldPositions[] = {
+ {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_NUMERIC_FIELD, 0, 11},
+ {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 12, 21}};
+ checkMixedFormattedValue(
+ message,
+ fv,
+ expectedString,
+ expectedFieldPositions,
+ UPRV_LENGTHOF(expectedFieldPositions));
+ }
+}
+
static const char *kLast2 = "Last_2";
static const char *kLast = "Last";
static const char *kThis = "This";
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/reptest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/reptest.cpp
index 35a3f5dcf5e..bf4a7224318 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/reptest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/reptest.cpp
@@ -71,7 +71,7 @@ public:
this->styles = s;
}
- virtual Replaceable *clone() const {
+ virtual TestReplaceable *clone() const {
return new TestReplaceable(chars, styles);
}
@@ -289,7 +289,7 @@ void ReplaceableTest::check(const UnicodeString& transliteratorName,
pe, status);
// test clone()
- TestReplaceable *tr2 = (TestReplaceable *)tr->clone();
+ TestReplaceable *tr2 = tr->clone();
if(tr2 != NULL) {
delete tr;
tr = tr2;
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/restest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/restest.cpp
index 5ffcb948226..839c5607f21 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/restest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/restest.cpp
@@ -37,11 +37,35 @@ enum E_Where
//***************************************************************************************
-#define CONFIRM_EQ(actual, expected, myAction) if ((expected)==(actual)) { record_pass(myAction); } else { record_fail(myAction + (UnicodeString)" returned " + (actual) + (UnicodeString)" instead of " + (expected) + "\n");}
-#define CONFIRM_GE(actual, expected, myAction) if ((actual)>=(expected)) { record_pass(myAction); } else { record_fail(myAction + (UnicodeString)" returned " + (actual) + (UnicodeString)" instead of x >= " + (expected) + "\n");}
-#define CONFIRM_NE(actual, expected, myAction) if ((expected)!=(actual)) { record_pass(myAction); } else { record_fail(myAction + (UnicodeString)" returned " + (actual) + (UnicodeString)" instead of x != " + (expected) + "\n");}
-
-#define CONFIRM_UErrorCode(actual, expected, myAction) if ((expected)==(actual)) { record_pass(myAction); } else { record_fail(myAction + (UnicodeString)" returned " + u_errorName(actual) + " instead of " + u_errorName(expected) + "\n"); }
+#define CONFIRM_EQ(actual, expected, myAction) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expected)==(actual)) { \
+ record_pass(myAction); \
+ } else { \
+ record_fail(myAction + (UnicodeString)" returned " + (actual) + (UnicodeString)" instead of " + (expected) + "\n"); \
+ } \
+} UPRV_BLOCK_MACRO_END
+#define CONFIRM_GE(actual, expected, myAction) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((actual)>=(expected)) { \
+ record_pass(myAction); \
+ } else { \
+ record_fail(myAction + (UnicodeString)" returned " + (actual) + (UnicodeString)" instead of x >= " + (expected) + "\n"); \
+ } \
+} UPRV_BLOCK_MACRO_END
+#define CONFIRM_NE(actual, expected, myAction) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expected)!=(actual)) { \
+ record_pass(myAction); \
+ } else { \
+ record_fail(myAction + (UnicodeString)" returned " + (actual) + (UnicodeString)" instead of x != " + (expected) + "\n"); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define CONFIRM_UErrorCode(actual, expected, myAction) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expected)==(actual)) { \
+ record_pass(myAction); \
+ } else { \
+ record_fail(myAction + (UnicodeString)" returned " + u_errorName(actual) + " instead of " + u_errorName(expected) + "\n"); \
+ } \
+} UPRV_BLOCK_MACRO_END
//***************************************************************************************
@@ -581,8 +605,8 @@ ResourceBundleTest::TestGetLocaleByType(void)
} test[] = {
{ "te_IN_BLAH", "string_only_in_te_IN", "te_IN", "te_IN" },
{ "te_IN_BLAH", "string_only_in_te", "te_IN", "te" },
- { "te_IN_BLAH", "string_only_in_Root", "te_IN", "root" },
- { "te_IN_BLAH_01234567890_01234567890_01234567890_01234567890_01234567890_01234567890", "array_2d_only_in_Root", "te_IN", "root" },
+ { "te_IN_BLAH", "string_only_in_Root", "te_IN", "" },
+ { "te_IN_BLAH_01234567890_01234567890_01234567890_01234567890_01234567890_01234567890", "array_2d_only_in_Root", "te_IN", "" },
{ "te_IN_BLAH@currency=euro", "array_2d_only_in_te_IN", "te_IN", "te_IN" },
{ "te_IN_BLAH@calendar=thai;collation=phonebook", "array_2d_only_in_te", "te_IN", "te" }
};
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/restsnew.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/restsnew.cpp
index 5483cddbe2a..c55f2239225 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/restsnew.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/restsnew.cpp
@@ -11,12 +11,42 @@
#include "cstring.h"
#include "unicode/unistr.h"
#include "unicode/resbund.h"
+#include "unicode/brkiter.h"
+#include "unicode/utrace.h"
+#include "unicode/ucurr.h"
#include "restsnew.h"
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <limits.h>
+#include <vector>
+#include <string>
+
+//***************************************************************************************
+
+void NewResourceBundleTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
+{
+ if (exec) logln("TestSuite ResourceBundleTest: ");
+ TESTCASE_AUTO_BEGIN;
+
+#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
+ TESTCASE_AUTO(TestResourceBundles);
+ TESTCASE_AUTO(TestConstruction);
+ TESTCASE_AUTO(TestIteration);
+ TESTCASE_AUTO(TestOtherAPI);
+ TESTCASE_AUTO(TestNewTypes);
+#endif
+
+ TESTCASE_AUTO(TestGetByFallback);
+ TESTCASE_AUTO(TestFilter);
+
+#if U_ENABLE_TRACING
+ TESTCASE_AUTO(TestTrace);
+#endif
+
+ TESTCASE_AUTO_END;
+}
//***************************************************************************************
@@ -36,11 +66,39 @@ enum E_Where
//***************************************************************************************
-#define CONFIRM_EQ(actual,expected) if ((expected)==(actual)) { record_pass(); } else { record_fail(); errln(action + (UnicodeString)" returned " + (actual) + (UnicodeString)" instead of " + (expected)); }
-#define CONFIRM_GE(actual,expected) if ((actual)>=(expected)) { record_pass(); } else { record_fail(); errln(action + (UnicodeString)" returned " + (actual) + (UnicodeString)" instead of x >= " + (expected)); }
-#define CONFIRM_NE(actual,expected) if ((expected)!=(actual)) { record_pass(); } else { record_fail(); errln(action + (UnicodeString)" returned " + (actual) + (UnicodeString)" instead of x != " + (expected)); }
-
-#define CONFIRM_UErrorCode(actual,expected) if ((expected)==(actual)) { record_pass(); } else { record_fail(); errln(action + (UnicodeString)" returned " + (UnicodeString)u_errorName(actual) + (UnicodeString)" instead of " + (UnicodeString)u_errorName(expected)); }
+#define CONFIRM_EQ(actual,expected) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expected)==(actual)) { \
+ record_pass(); \
+ } else { \
+ record_fail(); \
+ errln(action + (UnicodeString)" returned " + (actual) + (UnicodeString)" instead of " + (expected)); \
+ } \
+} UPRV_BLOCK_MACRO_END
+#define CONFIRM_GE(actual,expected) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((actual)>=(expected)) { \
+ record_pass(); \
+ } else { \
+ record_fail(); \
+ errln(action + (UnicodeString)" returned " + (actual) + (UnicodeString)" instead of x >= " + (expected)); \
+ } \
+} UPRV_BLOCK_MACRO_END
+#define CONFIRM_NE(actual,expected) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expected)!=(actual)) { \
+ record_pass(); \
+ } else { \
+ record_fail(); \
+ errln(action + (UnicodeString)" returned " + (actual) + (UnicodeString)" instead of x != " + (expected)); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define CONFIRM_UErrorCode(actual,expected) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((expected)==(actual)) { \
+ record_pass(); \
+ } else { \
+ record_fail(); \
+ errln(action + (UnicodeString)" returned " + (UnicodeString)u_errorName(actual) + (UnicodeString)" instead of " + (UnicodeString)u_errorName(expected)); \
+ } \
+} UPRV_BLOCK_MACRO_END
//***************************************************************************************
@@ -180,25 +238,6 @@ NewResourceBundleTest::~NewResourceBundleTest()
}
}
-void NewResourceBundleTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
-{
- if (exec) logln("TestSuite ResourceBundleTest: ");
- switch (index) {
-#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
- case 0: name = "TestResourceBundles"; if (exec) TestResourceBundles(); break;
- case 1: name = "TestConstruction"; if (exec) TestConstruction(); break;
- case 2: name = "TestIteration"; if (exec) TestIteration(); break;
- case 3: name = "TestOtherAPI"; if(exec) TestOtherAPI(); break;
- case 4: name = "TestNewTypes"; if(exec) TestNewTypes(); break;
-#else
- case 0: case 1: case 2: case 3: case 4: name = "skip"; break;
-#endif
-
- case 5: name = "TestGetByFallback"; if(exec) TestGetByFallback(); break;
- default: name = ""; break; //needed to end loop
- }
-}
-
//***************************************************************************************
void
@@ -1198,5 +1237,240 @@ NewResourceBundleTest::TestGetByFallback() {
status = U_ZERO_ERROR;
}
+
+
+#define REQUIRE_SUCCESS(status) UPRV_BLOCK_MACRO_BEGIN { \
+ if (status.errIfFailureAndReset("line %d", __LINE__)) { \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define REQUIRE_ERROR(expected, status) UPRV_BLOCK_MACRO_BEGIN { \
+ if (!status.expectErrorAndReset(expected, "line %d", __LINE__)) { \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+/**
+ * Tests the --filterDir option in genrb.
+ *
+ * Input resource text file: test/testdata/filtertest.txt
+ * Input filter rule file: test/testdata/filters/filtertest.txt
+ *
+ * The resource bundle should contain no keys matched by the filter
+ * and should contain all other keys.
+ */
+void NewResourceBundleTest::TestFilter() {
+ IcuTestErrorCode status(*this, "TestFilter");
+
+ ResourceBundle rb(loadTestData(status), "filtertest", status);
+ REQUIRE_SUCCESS(status);
+ assertEquals("rb", rb.getType(), URES_TABLE);
+
+ ResourceBundle alabama = rb.get("alabama", status);
+ REQUIRE_SUCCESS(status);
+ assertEquals("alabama", alabama.getType(), URES_TABLE);
+
+ {
+ ResourceBundle alaska = alabama.get("alaska", status);
+ REQUIRE_SUCCESS(status);
+ assertEquals("alaska", alaska.getType(), URES_TABLE);
+
+ {
+ ResourceBundle arizona = alaska.get("arizona", status);
+ REQUIRE_SUCCESS(status);
+ assertEquals("arizona", arizona.getType(), URES_STRING);
+ assertEquals("arizona", u"arkansas", arizona.getString(status));
+ REQUIRE_SUCCESS(status);
+
+ // Filter: california should not be included
+ ResourceBundle california = alaska.get("california", status);
+ REQUIRE_ERROR(U_MISSING_RESOURCE_ERROR, status);
+ }
+
+ // Filter: connecticut should not be included
+ ResourceBundle connecticut = alabama.get("connecticut", status);
+ REQUIRE_ERROR(U_MISSING_RESOURCE_ERROR, status);
+ }
+
+ ResourceBundle fornia = rb.get("fornia", status);
+ REQUIRE_SUCCESS(status);
+ assertEquals("fornia", fornia.getType(), URES_TABLE);
+
+ {
+ // Filter: hawaii should not be included based on parent inheritance
+ ResourceBundle hawaii = fornia.get("hawaii", status);
+ REQUIRE_ERROR(U_MISSING_RESOURCE_ERROR, status);
+
+ // Filter: illinois should not be included based on direct rule
+ ResourceBundle illinois = fornia.get("illinois", status);
+ REQUIRE_ERROR(U_MISSING_RESOURCE_ERROR, status);
+ }
+
+ ResourceBundle mississippi = rb.get("mississippi", status);
+ REQUIRE_SUCCESS(status);
+ assertEquals("mississippi", mississippi.getType(), URES_TABLE);
+
+ {
+ ResourceBundle louisiana = mississippi.get("louisiana", status);
+ REQUIRE_SUCCESS(status);
+ assertEquals("louisiana", louisiana.getType(), URES_TABLE);
+
+ {
+ ResourceBundle maine = louisiana.get("maine", status);
+ REQUIRE_SUCCESS(status);
+ assertEquals("maine", maine.getType(), URES_STRING);
+ assertEquals("maine", u"maryland", maine.getString(status));
+ REQUIRE_SUCCESS(status);
+
+ ResourceBundle iowa = louisiana.get("iowa", status);
+ REQUIRE_SUCCESS(status);
+ assertEquals("iowa", iowa.getType(), URES_STRING);
+ assertEquals("iowa", u"kansas", iowa.getString(status));
+ REQUIRE_SUCCESS(status);
+
+ // Filter: missouri should not be included
+ ResourceBundle missouri = louisiana.get("missouri", status);
+ REQUIRE_ERROR(U_MISSING_RESOURCE_ERROR, status);
+ }
+
+ ResourceBundle michigan = mississippi.get("michigan", status);
+ REQUIRE_SUCCESS(status);
+ assertEquals("michigan", michigan.getType(), URES_TABLE);
+
+ {
+ ResourceBundle maine = michigan.get("maine", status);
+ REQUIRE_SUCCESS(status);
+ assertEquals("maine", maine.getType(), URES_STRING);
+ assertEquals("maine", u"minnesota", maine.getString(status));
+ REQUIRE_SUCCESS(status);
+
+ // Filter: iowa should not be included
+ ResourceBundle iowa = michigan.get("iowa", status);
+ REQUIRE_ERROR(U_MISSING_RESOURCE_ERROR, status);
+
+ ResourceBundle missouri = michigan.get("missouri", status);
+ REQUIRE_SUCCESS(status);
+ assertEquals("missouri", missouri.getType(), URES_STRING);
+ assertEquals("missouri", u"nebraska", missouri.getString(status));
+ REQUIRE_SUCCESS(status);
+ }
+
+ ResourceBundle nevada = mississippi.get("nevada", status);
+ REQUIRE_SUCCESS(status);
+ assertEquals("nevada", nevada.getType(), URES_TABLE);
+
+ {
+ ResourceBundle maine = nevada.get("maine", status);
+ REQUIRE_SUCCESS(status);
+ assertEquals("maine", maine.getType(), URES_STRING);
+ assertEquals("maine", u"new-hampshire", maine.getString(status));
+ REQUIRE_SUCCESS(status);
+
+ // Filter: iowa should not be included
+ ResourceBundle iowa = nevada.get("iowa", status);
+ REQUIRE_ERROR(U_MISSING_RESOURCE_ERROR, status);
+
+ // Filter: missouri should not be included
+ ResourceBundle missouri = nevada.get("missouri", status);
+ REQUIRE_ERROR(U_MISSING_RESOURCE_ERROR, status);
+ }
+ }
+
+ // Filter: northCarolina should be included based on direct rule,
+ // and so should its child, northDakota
+ ResourceBundle northCarolina = rb.get("northCarolina", status);
+ REQUIRE_SUCCESS(status);
+ assertEquals("northCarolina", northCarolina.getType(), URES_TABLE);
+
+ {
+ ResourceBundle northDakota = northCarolina.get("northDakota", status);
+ REQUIRE_SUCCESS(status);
+ assertEquals("northDakota", northDakota.getType(), URES_STRING);
+ assertEquals("northDakota", u"west-virginia", northDakota.getString(status));
+ REQUIRE_SUCCESS(status);
+ }
+}
+
+#if U_ENABLE_TRACING
+
+static std::vector<std::string> gResourcePathsTraced;
+static std::vector<std::string> gDataFilesTraced;
+static std::vector<std::string> gBundlesTraced;
+
+static void U_CALLCONV traceData(
+ const void*,
+ int32_t fnNumber,
+ int32_t,
+ const char *,
+ va_list args) {
+
+ // NOTE: Whether this test is run in isolation affects whether or not
+ // *.res files are opened. For stability, ignore *.res file opens.
+
+ if (fnNumber == UTRACE_UDATA_RESOURCE) {
+ va_arg(args, const char*); // type
+ va_arg(args, const char*); // file
+ const char* resourcePath = va_arg(args, const char*);
+ gResourcePathsTraced.push_back(resourcePath);
+ } else if (fnNumber == UTRACE_UDATA_BUNDLE) {
+ const char* filePath = va_arg(args, const char*);
+ gBundlesTraced.push_back(filePath);
+ } else if (fnNumber == UTRACE_UDATA_DATA_FILE) {
+ const char* filePath = va_arg(args, const char*);
+ gDataFilesTraced.push_back(filePath);
+ } else if (fnNumber == UTRACE_UDATA_RES_FILE) {
+ // ignore
+ }
+}
+
+void NewResourceBundleTest::TestTrace() {
+ IcuTestErrorCode status(*this, "TestTrace");
+
+ assertEquals("Start position stability coverage", 0x3000, UTRACE_UDATA_START);
+
+ const void* context;
+ utrace_setFunctions(context, nullptr, nullptr, traceData);
+ utrace_setLevel(UTRACE_VERBOSE);
+
+ {
+ LocalPointer<BreakIterator> brkitr(BreakIterator::createWordInstance("zh-CN", status));
+
+ assertEquals("Should touch expected resource paths",
+ { "/boundaries", "/boundaries/word", "/boundaries/word" },
+ gResourcePathsTraced);
+ assertEquals("Should touch expected resource bundles",
+ { U_ICUDATA_NAME "-brkitr/zh.res" },
+ gBundlesTraced);
+ assertEquals("Should touch expected data files",
+ { U_ICUDATA_NAME "-brkitr/word.brk" },
+ gDataFilesTraced);
+ gResourcePathsTraced.clear();
+ gDataFilesTraced.clear();
+ gBundlesTraced.clear();
+ }
+
+ {
+ ucurr_getDefaultFractionDigits(u"USD", status);
+
+ assertEquals("Should touch expected resource paths",
+ { "/CurrencyMeta", "/CurrencyMeta/DEFAULT", "/CurrencyMeta/DEFAULT" },
+ gResourcePathsTraced);
+ assertEquals("Should touch expected resource bundles",
+ { U_ICUDATA_NAME "-curr/supplementalData.res" },
+ gBundlesTraced);
+ assertEquals("Should touch expected data files",
+ { },
+ gDataFilesTraced);
+ gResourcePathsTraced.clear();
+ gDataFilesTraced.clear();
+ gBundlesTraced.clear();
+ }
+
+ utrace_setFunctions(context, nullptr, nullptr, nullptr);
+}
+
+#endif
+
//eof
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/restsnew.h b/Build/source/libs/icu/icu-src/source/test/intltest/restsnew.h
index 817e5b347cd..9ae3bf048e2 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/restsnew.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/restsnew.h
@@ -38,6 +38,12 @@ public:
void TestGetByFallback(void);
+ void TestFilter(void);
+
+#if U_ENABLE_TRACING
+ void TestTrace(void);
+#endif
+
private:
/**
* The assignment operator has no real implementation.
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/selfmts.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/selfmts.cpp
index 81b73aec796..3bf1be60bd1 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/selfmts.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/selfmts.cpp
@@ -23,8 +23,13 @@
#define EXP_FORMAT_RESULT_DATA 12
#define NUM_OF_FORMAT_ARGS 3
-#define VERBOSE_INT(x) {logln("%s:%d: int %s=%d\n", __FILE__, __LINE__, #x, (x));}
-#define VERBOSE_USTRING(text) {logln("%s:%d: UnicodeString %s(%d) = ", __FILE__, __LINE__, #text, text.length()); logln(UnicodeString(" \"")+text+UnicodeString("\";"));}
+#define VERBOSE_INT(x) UPRV_BLOCK_MACRO_BEGIN { \
+ logln("%s:%d: int %s=%d\n", __FILE__, __LINE__, #x, (x)); \
+} UPRV_BLOCK_MACRO_END
+#define VERBOSE_USTRING(text) UPRV_BLOCK_MACRO_BEGIN { \
+ logln("%s:%d: UnicodeString %s(%d) = ", __FILE__, __LINE__, #text, text.length()); \
+ logln(UnicodeString(" \"")+text+UnicodeString("\";")); \
+} UPRV_BLOCK_MACRO_END
void SelectFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
@@ -230,7 +235,7 @@ void SelectFormatTest::selectFormatAPITest(/*char *par*/)
// ======= Test clone && == operator.
logln("SelectFormat API test: Testing clone and == operator ...");
if ( U_SUCCESS(status[0]) ) {
- selFmt[1] = (SelectFormat*)selFmt[0]->clone();
+ selFmt[1] = selFmt[0]->clone();
if (selFmt[1]!=NULL) {
if ( *selFmt[1] != *selFmt[0] ) {
errln("ERROR: SelectFormat API test clone test failed!");
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/simpleformattertest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/simpleformattertest.cpp
index 3a777688e79..8c230ff2b01 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/simpleformattertest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/simpleformattertest.cpp
@@ -329,10 +329,21 @@ void SimpleFormatterTest::TestBadArguments() {
}
void SimpleFormatterTest::TestTextWithNoArguments() {
- UErrorCode status = U_ZERO_ERROR;
+ IcuTestErrorCode status(*this, "TestTextWithNoArguments");
SimpleFormatter fmt("{0} has no {1} arguments.", status);
- assertEquals(
- "", " has no arguments.", fmt.getTextWithNoArguments());
+ assertEquals("String output 1",
+ " has no arguments.", fmt.getTextWithNoArguments());
+
+ // Test offset positions
+ int32_t offsets[3];
+ assertEquals("String output 2",
+ u" has no arguments.", fmt.getTextWithNoArguments(offsets, 3));
+ assertEquals("Offset at 0",
+ 0, offsets[0]);
+ assertEquals("Offset at 1",
+ 8, offsets[1]);
+ assertEquals("Offset at 2",
+ -1, offsets[2]);
}
void SimpleFormatterTest::TestFormatReplaceNoOptimization() {
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/simplethread.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/simplethread.cpp
index 10b635d3aec..f308958bed8 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/simplethread.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/simplethread.cpp
@@ -6,289 +6,37 @@
* others. All Rights Reserved.
********************************************************************/
-#if defined(hpux)
-# ifndef _INCLUDE_POSIX_SOURCE
-# define _INCLUDE_POSIX_SOURCE
-# endif
-#endif
-
-/* Define __EXTENSIONS__ for Solaris and old friends in strict mode. */
-#ifndef __EXTENSIONS__
-#define __EXTENSIONS__
-#endif
-
-// Defines _XOPEN_SOURCE for access to POSIX functions.
-// Must be before any other #includes.
-#include "uposixdefs.h"
#include "simplethread.h"
+#include <thread>
#include "unicode/utypes.h"
-#include "unicode/ustring.h"
-#include "umutex.h"
-#include "cmemory.h"
-#include "cstring.h"
-#include "uparse.h"
-#include "unicode/resbund.h"
-#include "unicode/udata.h"
-#include "unicode/uloc.h"
-#include "unicode/locid.h"
-#include "putilimp.h"
#include "intltest.h"
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h> // tolower, toupper
-
-#if U_PLATFORM_USES_ONLY_WIN32_API
- /* Prefer native Windows APIs even if POSIX is implemented (i.e., on Cygwin). */
-# undef POSIX
-#elif U_PLATFORM_IMPLEMENTS_POSIX
-# define POSIX
-#else
-# undef POSIX
-#endif
-
-/* Needed by z/OS to get usleep */
-#if U_PLATFORM == U_PF_OS390
-#define __DOT1 1
-#ifndef __UU
-# define __UU
-#endif
-#ifndef _XPG4_2
-# define _XPG4_2
-#endif
-#include <unistd.h>
-#endif
-
-#if defined(POSIX)
-#define HAVE_IMP
-
-#include <pthread.h>
-
-#if U_PLATFORM == U_PF_OS390
-#include <sys/types.h>
-#endif
-
-#if U_PLATFORM != U_PF_OS390
-#include <signal.h>
-#endif
-
-/* Define _XPG4_2 for Solaris and friends. */
-#ifndef _XPG4_2
-#define _XPG4_2
-#endif
-
-/* Define __USE_XOPEN_EXTENDED for Linux and glibc. */
-#ifndef __USE_XOPEN_EXTENDED
-#define __USE_XOPEN_EXTENDED
-#endif
-
-/* Define _INCLUDE_XOPEN_SOURCE_EXTENDED for HP/UX (11?). */
-#ifndef _INCLUDE_XOPEN_SOURCE_EXTENDED
-#define _INCLUDE_XOPEN_SOURCE_EXTENDED
-#endif
-
-#include <unistd.h>
-
-#endif
-/* HPUX */
-#ifdef sleep
-#undef sleep
-#endif
-
-
-#include "unicode/putil.h"
-/* for mthreadtest*/
-#include "unicode/numfmt.h"
-#include "unicode/choicfmt.h"
-#include "unicode/msgfmt.h"
-#include "unicode/locid.h"
-#include "unicode/ucol.h"
-#include "unicode/calendar.h"
-#include "ucaconf.h"
-
-#if U_PLATFORM_USES_ONLY_WIN32_API
-#define HAVE_IMP
-
-# define VC_EXTRALEAN
-# define WIN32_LEAN_AND_MEAN
-# define NOUSER
-# define NOSERVICE
-# define NOIME
-# define NOMCX
-#include <windows.h>
-#include <process.h>
-
-//-----------------------------------------------------------------------------------
-//
-// class SimpleThread Windows Implementation
-//
-//-----------------------------------------------------------------------------------
-struct Win32ThreadImplementation
-{
- HANDLE fHandle;
- unsigned int fThreadID;
-};
-
-
-extern "C" unsigned int __stdcall SimpleThreadProc(void *arg)
-{
- ((SimpleThread*)arg)->run();
- return 0;
+SimpleThread::SimpleThread() {
}
-SimpleThread::SimpleThread()
-:fImplementation(0)
-{
- Win32ThreadImplementation *imp = new Win32ThreadImplementation;
- imp->fHandle = 0;
- fImplementation = imp;
+SimpleThread::~SimpleThread() {
+ this->join(); // Avoid crashes if user neglected to join().
}
-SimpleThread::~SimpleThread()
-{
- // Destructor. Because we start the thread running with _beginthreadex(),
- // we own the Windows HANDLE for the thread and must
- // close it here.
- Win32ThreadImplementation *imp = (Win32ThreadImplementation*)fImplementation;
- if (imp != 0) {
- if (imp->fHandle != 0) {
- CloseHandle(imp->fHandle);
- imp->fHandle = 0;
- }
- }
- delete (Win32ThreadImplementation*)fImplementation;
-}
-
-int32_t SimpleThread::start()
-{
- Win32ThreadImplementation *imp = (Win32ThreadImplementation*)fImplementation;
- if(imp->fHandle != NULL) {
- // The thread appears to have already been started.
- // This is probably an error on the part of our caller.
- return -1;
- }
-
- imp->fHandle = (HANDLE) _beginthreadex(
- NULL, // Security
- 0x20000, // Stack Size
- SimpleThreadProc, // Function to Run
- (void *)this, // Arg List
- 0, // initflag. Start running, not suspended
- &imp->fThreadID // thraddr
- );
-
- if (imp->fHandle == 0) {
- // An error occured
- int err = errno;
- if (err == 0) {
- err = -1;
- }
- return err;
- }
- return 0;
+int SimpleThread::start() {
+ fThread = std::thread(&SimpleThread::run, this);
+ return fThread.joinable() ? 0 : 1;
}
-
void SimpleThread::join() {
- Win32ThreadImplementation *imp = (Win32ThreadImplementation*)fImplementation;
- if (imp->fHandle == 0) {
- // No handle, thread must not be running.
- return;
+ if (fThread.joinable()) {
+ fThread.join();
}
- WaitForSingleObject(imp->fHandle, INFINITE);
}
-#endif
-
-
-//-----------------------------------------------------------------------------------
-//
-// class SimpleThread POSIX implementation
-//
-//-----------------------------------------------------------------------------------
-#if defined(POSIX)
-#define HAVE_IMP
-
-struct PosixThreadImplementation
-{
- pthread_t fThread;
-};
-
-extern "C" void* SimpleThreadProc(void *arg)
-{
- // This is the code that is run in the new separate thread.
- SimpleThread *This = (SimpleThread *)arg;
- This->run();
- return 0;
-}
-
-SimpleThread::SimpleThread()
-{
- PosixThreadImplementation *imp = new PosixThreadImplementation;
- fImplementation = imp;
-}
-
-SimpleThread::~SimpleThread()
-{
- PosixThreadImplementation *imp = (PosixThreadImplementation*)fImplementation;
- delete imp;
- fImplementation = (void *)0xdeadbeef;
-}
-
-int32_t SimpleThread::start()
-{
- int32_t rc;
- static pthread_attr_t attr;
- static UBool attrIsInitialized = FALSE;
-
- PosixThreadImplementation *imp = (PosixThreadImplementation*)fImplementation;
-
- if (attrIsInitialized == FALSE) {
- rc = pthread_attr_init(&attr);
-#if U_PLATFORM == U_PF_OS390
- {
- int detachstate = 0; // jdc30: detach state of zero causes
- //threads created with this attr to be in
- //an undetached state. An undetached
- //thread will keep its resources after
- //termination.
- pthread_attr_setdetachstate(&attr, &detachstate);
- }
-#else
- // pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
-#endif
- attrIsInitialized = TRUE;
- }
- rc = pthread_create(&(imp->fThread), &attr, &SimpleThreadProc, (void*)this);
-
- if (rc != 0) {
- // some kind of error occured, the thread did not start.
- }
-
- return rc;
-}
-
-void SimpleThread::join() {
- PosixThreadImplementation *imp = (PosixThreadImplementation*)fImplementation;
- pthread_join(imp->fThread, NULL);
-}
-
-#endif
-// end POSIX
-
-
-#ifndef HAVE_IMP
-#error No implementation for threads! Cannot test.
-#endif
class ThreadPoolThread: public SimpleThread {
public:
- ThreadPoolThread(ThreadPoolBase *pool, int32_t threadNum) : fPool(pool), fNum(threadNum) {};
+ ThreadPoolThread(ThreadPoolBase *pool, int32_t threadNum) : fPool(pool), fNum(threadNum) {}
virtual void run() {fPool->callFn(fNum); }
ThreadPoolBase *fPool;
int32_t fNum;
@@ -337,6 +85,3 @@ ThreadPoolBase::~ThreadPoolBase() {
fThreads = NULL;
}
}
-
-
-
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/simplethread.h b/Build/source/libs/icu/icu-src/source/test/intltest/simplethread.h
index 9fcb52a1341..22f245a5a92 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/simplethread.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/simplethread.h
@@ -9,20 +9,29 @@
#ifndef SIMPLETHREAD_H
#define SIMPLETHREAD_H
-#include "mutex.h"
+#include <thread>
+#include "unicode/utypes.h"
-class U_EXPORT SimpleThread
+/*
+ * Simple class for creating threads in ICU tests.
+ * Originally created to provide a portable abstraction over platform
+ * (POSIX or Win32) threading interfaces.
+ *
+ * New threaded tests should consider skipping this class and directly using C++ std library
+ * threading functions. SimpleThread is retained primarily to support existing use.
+ */
+class SimpleThread
{
public:
SimpleThread();
virtual ~SimpleThread();
- int32_t start(void); // start the thread. Return 0 if successfull.
+ int32_t start(); // start the thread. Return 0 if successfull.
void join(); // A thread must be joined before deleting its SimpleThread.
- virtual void run(void) = 0; // Override this to provide the code to run
+ virtual void run() = 0; // Override this to provide the code to run
// in the thread.
private:
- void *fImplementation;
+ std::thread fThread = {};
};
@@ -67,8 +76,8 @@ class ThreadPool : public ThreadPoolBase {
void (TestClass::*fRunFnPtr)(int32_t);
public:
ThreadPool(TestClass *test, int howMany, void (TestClass::*runFnPtr)(int32_t threadNumber)) :
- ThreadPoolBase(test, howMany), fRunFnPtr(runFnPtr) {};
- virtual ~ThreadPool() {};
+ ThreadPoolBase(test, howMany), fRunFnPtr(runFnPtr) {}
+ virtual ~ThreadPool() {}
private:
virtual void callFn(int32_t param) {
TestClass *test = dynamic_cast<TestClass *>(fIntlTest);
@@ -76,4 +85,3 @@ class ThreadPool : public ThreadPoolBase {
}
};
#endif
-
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/srchtest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/srchtest.cpp
index a7534ddc64d..573158a3cd8 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/srchtest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/srchtest.cpp
@@ -769,7 +769,7 @@ void StringSearchTest::TestInitialization()
}
delete copy;
- copy = (StringSearch *)result->safeClone();
+ copy = result->safeClone();
if (*(copy->getCollator()) != *(result->getCollator()) ||
copy->getBreakIterator() != result->getBreakIterator() ||
copy->getMatchedLength() != result->getMatchedLength() ||
@@ -2452,11 +2452,11 @@ void StringSearchTest::TestSubclass()
class StubSearchIterator:public SearchIterator{
public:
StubSearchIterator(){}
- virtual void setOffset(int32_t , UErrorCode &) {};
- virtual int32_t getOffset(void) const {return 0;};
- virtual SearchIterator* safeClone(void) const {return NULL;};
- virtual int32_t handleNext(int32_t , UErrorCode &){return 0;};
- virtual int32_t handlePrev(int32_t , UErrorCode &) {return 0;};
+ virtual void setOffset(int32_t , UErrorCode &) {}
+ virtual int32_t getOffset(void) const {return 0;}
+ virtual SearchIterator* safeClone(void) const {return NULL;}
+ virtual int32_t handleNext(int32_t , UErrorCode &){return 0;}
+ virtual int32_t handlePrev(int32_t , UErrorCode &) {return 0;}
virtual UClassID getDynamicClassID() const {
static char classID = 0;
return (UClassID)&classID;
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/ssearch.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/ssearch.cpp
index 5a68838340c..41483f5ceea 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/ssearch.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/ssearch.cpp
@@ -32,15 +32,25 @@
char testId[100];
-#define TEST_ASSERT(x) {if (!(x)) { \
- errln("Failure in file %s, line %d, test ID = \"%s\"", __FILE__, __LINE__, testId);}}
-
-#define TEST_ASSERT_M(x, m) {if (!(x)) { \
- dataerrln("Failure in file %s, line %d. \"%s\"", __FILE__, __LINE__, m);return;}}
-
-#define TEST_ASSERT_SUCCESS(errcode) {if (U_FAILURE(errcode)) { \
- dataerrln("Failure in file %s, line %d, test ID \"%s\", status = \"%s\"", \
- __FILE__, __LINE__, testId, u_errorName(errcode));}}
+#define TEST_ASSERT(x) UPRV_BLOCK_MACRO_BEGIN { \
+ if (!(x)) { \
+ errln("Failure in file %s, line %d, test ID = \"%s\"", __FILE__, __LINE__, testId); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define TEST_ASSERT_M(x, m) UPRV_BLOCK_MACRO_BEGIN { \
+ if (!(x)) { \
+ dataerrln("Failure in file %s, line %d. \"%s\"", __FILE__, __LINE__, m); \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define TEST_ASSERT_SUCCESS(errcode) UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(errcode)) { \
+ dataerrln("Failure in file %s, line %d, test ID \"%s\", status = \"%s\"", \
+ __FILE__, __LINE__, testId, u_errorName(errcode)); \
+ } \
+} UPRV_BLOCK_MACRO_END
#define NEW_ARRAY(type, count) (type *) uprv_malloc((count) * sizeof(type))
#define DELETE_ARRAY(array) uprv_free((void *) (array))
@@ -173,7 +183,7 @@ void SSearchTest::searchTest()
// This assert is a little deceiving in that strength can be
// any of the allowed values, not just TERTIARY, but it will
// do the job of getting the error output.
- TEST_ASSERT(*strength=="TERTIARY")
+ TEST_ASSERT(*strength=="TERTIARY");
}
//
@@ -201,7 +211,7 @@ void SSearchTest::searchTest()
const UnicodeString *locale = testCase->getAttribute("locale");
if (locale == NULL || locale->length()==0) {
locale = &defLocale;
- };
+ }
locale->extract(0, locale->length(), clocale, sizeof(clocale), NULL);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/static_unisets_test.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/static_unisets_test.cpp
index bfe69963526..5cc946bc225 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/static_unisets_test.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/static_unisets_test.cpp
@@ -34,7 +34,10 @@ void StaticUnicodeSetsTest::runIndexedTest(int32_t index, UBool exec, const char
logln("TestSuite StaticUnicodeSetsTest: ");
}
TESTCASE_AUTO_BEGIN;
- TESTCASE_AUTO(testSetCoverage);
+ if (!quick) {
+ // Slow test: run in exhaustive mode only
+ TESTCASE_AUTO(testSetCoverage);
+ }
TESTCASE_AUTO(testNonEmpty);
TESTCASE_AUTO_END;
}
@@ -64,7 +67,7 @@ void StaticUnicodeSetsTest::testSetCoverage() {
const UnicodeSet &minusSign = *get(unisets::MINUS_SIGN);
const UnicodeSet &percent = *get(unisets::PERCENT_SIGN);
const UnicodeSet &permille = *get(unisets::PERMILLE_SIGN);
- const UnicodeSet &infinity = *get(unisets::INFINITY_KEY);
+ const UnicodeSet &infinity = *get(unisets::INFINITY_SIGN);
int32_t localeCount;
const Locale* allAvailableLocales = Locale::getAvailableLocales(localeCount);
@@ -87,7 +90,7 @@ void StaticUnicodeSetsTest::testSetCoverage() {
}
void StaticUnicodeSetsTest::testNonEmpty() {
- for (int32_t i=0; i<unisets::COUNT; i++) {
+ for (int32_t i=0; i<unisets::UNISETS_KEY_COUNT; i++) {
if (i == unisets::EMPTY) {
continue;
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/strcase.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/strcase.cpp
index 3fb05849925..9b753e4b12d 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/strcase.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/strcase.cpp
@@ -747,7 +747,7 @@ StringCaseTest::assertGreekUpper(const char16_t *s, const char16_t *expected) {
msg = UnicodeString("ucasemap_utf8ToUpper/Greek(\"") + s16 + "\")";
char dest8[1000];
length = ucasemap_utf8ToUpper(csm.getAlias(), dest8, UPRV_LENGTHOF(dest8),
- s8.data(), s8.length(), &errorCode);
+ s8.data(), static_cast<int32_t>(s8.length()), &errorCode);
assertSuccess("ucasemap_utf8ToUpper", errorCode);
StringPiece result8(dest8, length);
UnicodeString result16From8 = UnicodeString::fromUTF8(result8);
@@ -765,7 +765,7 @@ StringCaseTest::assertGreekUpper(const char16_t *s, const char16_t *expected) {
memset(dest8b, 0x5A, UPRV_LENGTHOF(dest8b));
UErrorCode errorCode = U_ZERO_ERROR;
length = ucasemap_utf8ToUpper(csm.getAlias(), dest8b, cap,
- s8.data(), s8.length(), &errorCode);
+ s8.data(), static_cast<int32_t>(s8.length()), &errorCode);
assertEquals(msg + cap, expected8Length, length);
UErrorCode expectedErrorCode;
if (cap < expected8Length) {
@@ -910,7 +910,7 @@ void StringCaseTest::TestBufferOverflow() {
std::string data_utf8;
data.toUTF8String(data_utf8);
#if !UCONFIG_NO_BREAK_ITERATION
- result = ucasemap_utf8ToTitle(csm.getAlias(), NULL, 0, data_utf8.c_str(), data_utf8.length(), errorCode);
+ result = ucasemap_utf8ToTitle(csm.getAlias(), NULL, 0, data_utf8.c_str(), static_cast<int32_t>(data_utf8.length()), errorCode);
if (errorCode.get() != U_BUFFER_OVERFLOW_ERROR || result != (int32_t)data_utf8.length()) {
errln("%s:%d ucasemap_toTitle(\"hello world\") failed: "
"expected (U_BUFFER_OVERFLOW_ERROR, %d), got (%s, %d)",
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_stringsegment.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/string_segment_test.cpp
index bb54781cb97..0548d9ad928 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_stringsegment.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/string_segment_test.cpp
@@ -5,8 +5,19 @@
#if !UCONFIG_NO_FORMATTING
-#include "numbertest.h"
-#include "numparse_stringsegment.h"
+#include "string_segment.h"
+#include "intltest.h"
+
+class StringSegmentTest : public IntlTest {
+ public:
+ void testOffset();
+ void testLength();
+ void testCharAt();
+ void testGetCodePoint();
+ void testCommonPrefixLength();
+
+ void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0);
+};
static const char16_t* SAMPLE_STRING = u"📻 radio 📻";
@@ -24,7 +35,9 @@ void StringSegmentTest::runIndexedTest(int32_t index, UBool exec, const char*&na
}
void StringSegmentTest::testOffset() {
- StringSegment segment(SAMPLE_STRING, false);
+ // Note: sampleString needs function scope so it is valid while the StringSegment is valid
+ UnicodeString sampleString(SAMPLE_STRING);
+ StringSegment segment(sampleString, false);
assertEquals("Initial Offset", 0, segment.getOffset());
segment.adjustOffset(3);
assertEquals("Adjust A", 3, segment.getOffset());
@@ -35,7 +48,9 @@ void StringSegmentTest::testOffset() {
}
void StringSegmentTest::testLength() {
- StringSegment segment(SAMPLE_STRING, false);
+ // Note: sampleString needs function scope so it is valid while the StringSegment is valid
+ UnicodeString sampleString(SAMPLE_STRING);
+ StringSegment segment(sampleString, false);
assertEquals("Initial length", 11, segment.length());
segment.adjustOffset(3);
assertEquals("Adjust", 8, segment.length());
@@ -48,7 +63,9 @@ void StringSegmentTest::testLength() {
}
void StringSegmentTest::testCharAt() {
- StringSegment segment(SAMPLE_STRING, false);
+ // Note: sampleString needs function scope so it is valid while the StringSegment is valid
+ UnicodeString sampleString(SAMPLE_STRING);
+ StringSegment segment(sampleString, false);
assertEquals("Initial", SAMPLE_STRING, segment.toUnicodeString());
assertEquals("Initial", SAMPLE_STRING, segment.toTempUnicodeString());
segment.adjustOffset(3);
@@ -60,7 +77,9 @@ void StringSegmentTest::testCharAt() {
}
void StringSegmentTest::testGetCodePoint() {
- StringSegment segment(SAMPLE_STRING, false);
+ // Note: sampleString needs function scope so it is valid while the StringSegment is valid
+ UnicodeString sampleString(SAMPLE_STRING);
+ StringSegment segment(sampleString, false);
assertEquals("Double-width code point", 0x1F4FB, segment.getCodePoint());
segment.setLength(1);
assertEquals("Inalid A", -1, segment.getCodePoint());
@@ -72,7 +91,9 @@ void StringSegmentTest::testGetCodePoint() {
}
void StringSegmentTest::testCommonPrefixLength() {
- StringSegment segment(SAMPLE_STRING, false);
+ // Note: sampleString needs function scope so it is valid while the StringSegment is valid
+ UnicodeString sampleString(SAMPLE_STRING);
+ StringSegment segment(sampleString, false);
assertEquals("", 11, segment.getCommonPrefixLength(SAMPLE_STRING));
assertEquals("", 4, segment.getCommonPrefixLength(u"📻 r"));
assertEquals("", 3, segment.getCommonPrefixLength(u"📻 x"));
@@ -91,4 +112,9 @@ void StringSegmentTest::testCommonPrefixLength() {
assertEquals("", 0, segment.getCommonPrefixLength(u"foo"));
}
+
+extern IntlTest *createStringSegmentTest() {
+ return new StringSegmentTest();
+}
+
#endif
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/strtest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/strtest.cpp
index b95b525296e..7bb9662c36c 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/strtest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/strtest.cpp
@@ -14,6 +14,11 @@
* created by: Markus W. Scherer
*/
+#ifdef U_HAVE_STRING_VIEW
+#include <string_view>
+#endif
+
+#include <cstddef>
#include <string.h>
#include "unicode/utypes.h"
@@ -28,6 +33,7 @@
#include "cstr.h"
#include "intltest.h"
#include "strtest.h"
+#include "uinvchar.h"
StringTest::~StringTest() {}
@@ -142,6 +148,64 @@ StringTest::Test_UNICODE_STRING_SIMPLE() {
}
}
+namespace {
+
+// See U_CHARSET_FAMILY in unicode/platform.h.
+const char *nativeInvChars =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789 \"%&'()*+,-./:;<=>?_";
+const char16_t *asciiInvChars =
+ u"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ u"abcdefghijklmnopqrstuvwxyz"
+ u"0123456789 \"%&'()*+,-./:;<=>?_";
+
+} // namespace
+
+void
+StringTest::TestUpperOrdinal() {
+ for (int32_t i = 0;; ++i) {
+ char ic = nativeInvChars[i];
+ uint8_t ac = asciiInvChars[i];
+ int32_t expected = ac - 'A';
+ int32_t actual = uprv_upperOrdinal(ic);
+ if (0 <= expected && expected <= 25) {
+ if (actual != expected) {
+ errln("uprv_upperOrdinal('%c')=%d != expected %d",
+ ic, (int)actual, (int)expected);
+ }
+ } else {
+ if (0 <= actual && actual <= 25) {
+ errln("uprv_upperOrdinal('%c')=%d should have been outside 0..25",
+ ic, (int)actual);
+ }
+ }
+ if (ic == 0) { break; }
+ }
+}
+
+void
+StringTest::TestLowerOrdinal() {
+ for (int32_t i = 0;; ++i) {
+ char ic = nativeInvChars[i];
+ uint8_t ac = asciiInvChars[i];
+ int32_t expected = ac - 'a';
+ int32_t actual = uprv_lowerOrdinal(ic);
+ if (0 <= expected && expected <= 25) {
+ if (actual != expected) {
+ errln("uprv_lowerOrdinal('%c')=%d != expected %d",
+ ic, (int)actual, (int)expected);
+ }
+ } else {
+ if (0 <= actual && actual <= 25) {
+ errln("uprv_lowerOrdinal('%c')=%d should have been outside 0..25",
+ ic, (int)actual);
+ }
+ }
+ if (ic == 0) { break; }
+ }
+}
+
void
StringTest::Test_UTF8_COUNT_TRAIL_BYTES() {
#if !U_HIDE_OBSOLETE_UTF_OLD_H
@@ -173,10 +237,16 @@ void StringTest::runIndexedTest(int32_t index, UBool exec, const char *&name, ch
TESTCASE_AUTO(Test_U_STRING);
TESTCASE_AUTO(Test_UNICODE_STRING);
TESTCASE_AUTO(Test_UNICODE_STRING_SIMPLE);
+ TESTCASE_AUTO(TestUpperOrdinal);
+ TESTCASE_AUTO(TestLowerOrdinal);
TESTCASE_AUTO(Test_UTF8_COUNT_TRAIL_BYTES);
TESTCASE_AUTO(TestSTLCompatibility);
TESTCASE_AUTO(TestStringPiece);
TESTCASE_AUTO(TestStringPieceComparisons);
+ TESTCASE_AUTO(TestStringPieceOther);
+#ifdef U_HAVE_STRING_VIEW
+ TESTCASE_AUTO(TestStringPieceStringView);
+#endif
TESTCASE_AUTO(TestByteSink);
TESTCASE_AUTO(TestCheckedArrayByteSink);
TESTCASE_AUTO(TestStringByteSink);
@@ -346,6 +416,36 @@ StringTest::TestStringPieceComparisons() {
}
}
+void
+StringTest::TestStringPieceOther() {
+ static constexpr char msg[] = "Kapow!";
+
+ // Another string piece implementation.
+ struct Other {
+ const char* data() { return msg; }
+ size_t size() { return sizeof msg - 1; }
+ };
+
+ Other other;
+ StringPiece piece(other);
+
+ assertEquals("size()", piece.size(), other.size());
+ assertEquals("data()", piece.data(), other.data());
+}
+
+#ifdef U_HAVE_STRING_VIEW
+void
+StringTest::TestStringPieceStringView() {
+ static constexpr char msg[] = "Kapow!";
+
+ std::string_view view(msg); // C++17
+ StringPiece piece(view);
+
+ assertEquals("size()", piece.size(), view.size());
+ assertEquals("data()", piece.data(), view.data());
+}
+#endif
+
// Verify that ByteSink is subclassable and Flush() overridable.
class SimpleByteSink : public ByteSink {
public:
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/strtest.h b/Build/source/libs/icu/icu-src/source/test/intltest/strtest.h
index 5462afb2088..040c0b0e3c9 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/strtest.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/strtest.h
@@ -39,9 +39,15 @@ private:
void Test_U_STRING();
void Test_UNICODE_STRING();
void Test_UNICODE_STRING_SIMPLE();
+ void TestUpperOrdinal();
+ void TestLowerOrdinal();
void Test_UTF8_COUNT_TRAIL_BYTES();
void TestStringPiece();
void TestStringPieceComparisons();
+ void TestStringPieceOther();
+#ifdef U_HAVE_STRING_VIEW
+ void TestStringPieceStringView();
+#endif
void TestByteSink();
void TestCheckedArrayByteSink();
void TestStringByteSink();
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/svccoll.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/svccoll.cpp
index ecc1d5026d9..8d46c68f37f 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/svccoll.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/svccoll.cpp
@@ -583,7 +583,7 @@ void CollationServiceTest::TestSeparateTree() {
Locale::createFromName("de"),
isAvailable, ec);
assertSuccess("getFunctionalEquivalent", ec);
- assertEquals("getFunctionalEquivalent(de)", "root", equiv.getName());
+ assertEquals("getFunctionalEquivalent(de)", "", equiv.getName());
assertTrue("getFunctionalEquivalent(de).isAvailable==TRUE",
isAvailable == TRUE);
@@ -591,7 +591,7 @@ void CollationServiceTest::TestSeparateTree() {
Locale::createFromName("de_DE"),
isAvailable, ec);
assertSuccess("getFunctionalEquivalent", ec);
- assertEquals("getFunctionalEquivalent(de_DE)", "root", equiv.getName());
+ assertEquals("getFunctionalEquivalent(de_DE)", "", equiv.getName());
assertTrue("getFunctionalEquivalent(de_DE).isAvailable==FALSE",
isAvailable == FALSE);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/tchcfmt.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/tchcfmt.cpp
index 942119e7062..89526b92461 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/tchcfmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/tchcfmt.cpp
@@ -311,7 +311,7 @@ TestChoiceFormat::TestComplexExample( void )
it_errln("*** operator!=");
}
- ChoiceFormat* form_A3 = (ChoiceFormat*) form_A->clone();
+ ChoiceFormat* form_A3 = form_A->clone();
if (!form_A3) {
it_errln("*** ChoiceFormat->clone is nil.");
}else{
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/testidna.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/testidna.cpp
index e5eb44eb75a..4b4b2d410b8 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/testidna.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/testidna.cpp
@@ -1597,25 +1597,22 @@ void TestIDNA::TestRefIDNA(){
void TestIDNA::TestDataFile(){
testData(*this);
}
+
TestIDNA::~TestIDNA(){
- if(gPrep!=NULL){
- delete gPrep;
- gPrep = NULL;
- }
+ delete gPrep;
+ gPrep = NULL;
}
-NamePrepTransform* TestIDNA::gPrep = NULL;
-
NamePrepTransform* TestIDNA::getInstance(UErrorCode& status){
- if(TestIDNA::gPrep == NULL){
+ if(gPrep == NULL){
UParseError parseError;
- TestIDNA::gPrep = NamePrepTransform::createInstance(parseError, status);
- if(TestIDNA::gPrep ==NULL){
+ gPrep = NamePrepTransform::createInstance(parseError, status);
+ if(gPrep == NULL){
//status = U_MEMORY_ALLOCATION_ERROR;
return NULL;
}
}
- return TestIDNA::gPrep;
+ return gPrep;
}
#endif /* #if !UCONFIG_NO_IDNA */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/testidna.h b/Build/source/libs/icu/icu-src/source/test/intltest/testidna.h
index 250a3f8ec53..676d2e26600 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/testidna.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/testidna.h
@@ -66,8 +66,9 @@ public:
void TestRefIDNA();
void TestIDNAMonkeyTest();
void TestConformance();
- static NamePrepTransform* getInstance(UErrorCode& status);
- static NamePrepTransform* gPrep;
+ NamePrepTransform* getInstance(UErrorCode& status);
+ NamePrepTransform* gPrep;
+ TestIDNA() : gPrep(nullptr) {}
virtual ~TestIDNA();
private:
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/tmsgfmt.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/tmsgfmt.cpp
index 7249001f5eb..335bcf07cad 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/tmsgfmt.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/tmsgfmt.cpp
@@ -21,6 +21,7 @@
#include "tmsgfmt.h"
#include "cmemory.h"
+#include "loctest.h"
#include "unicode/format.h"
#include "unicode/decimfmt.h"
@@ -72,6 +73,8 @@ TestMessageFormat::runIndexedTest(int32_t index, UBool exec,
TESTCASE_AUTO(TestDecimals);
TESTCASE_AUTO(TestArgIsPrefixOfAnother);
TESTCASE_AUTO(TestMessageFormatNumberSkeleton);
+ TESTCASE_AUTO(TestMessageFormatDateSkeleton);
+ TESTCASE_AUTO(TestMessageFormatTimeSkeleton);
TESTCASE_AUTO_END;
}
@@ -182,7 +185,7 @@ void TestMessageFormat::testBug2()
// {sfb} use double format in pattern, so result will match (not strictly necessary)
const UnicodeString pattern = "There {0,choice,0#are no files|1#is one file|1<are {0, number} files} on disk {1}. ";
logln("The input pattern : " + pattern);
- MessageFormat *fmt = new MessageFormat(pattern, status);
+ LocalPointer<MessageFormat> fmt(new MessageFormat(pattern, status));
if (U_FAILURE(status)) {
dataerrln("MessageFormat pattern creation failed. - %s", u_errorName(status));
return;
@@ -191,7 +194,6 @@ void TestMessageFormat::testBug2()
if (pattern != result) {
errln("MessageFormat::toPattern() failed.");
}
- delete fmt;
}
#if 0
@@ -297,10 +299,10 @@ void TestMessageFormat::PatternTest()
for (int32_t i = 0; i < 9; ++i) {
//it_out << "\nPat in: " << testCases[i]);
- MessageFormat *form = 0;
+ LocalPointer<MessageFormat> form;
UErrorCode success = U_ZERO_ERROR;
UnicodeString buffer;
- form = new MessageFormat(testCases[i], Locale::getUS(), success);
+ form.adoptInstead(new MessageFormat(testCases[i], Locale::getUS(), success));
if (U_FAILURE(success)) {
dataerrln("MessageFormat creation failed.#1 - %s", u_errorName(success));
logln(((UnicodeString)"MessageFormat for ") + testCases[i] + " creation failed.\n");
@@ -365,7 +367,6 @@ void TestMessageFormat::PatternTest()
if (failed)
errln("MessageFormat failed test #6");
#endif
- delete form;
}
}
@@ -673,13 +674,13 @@ MessageFormat* TestMessageFormat::internalCreate(
UnicodeString pattern ,Locale locale ,UErrorCode &status , char* errMsg)
{
//Create the MessageFormat with simple SelectFormat
- MessageFormat* msgFmt = new MessageFormat(pattern, locale, status);
+ LocalPointer<MessageFormat> msgFmt(new MessageFormat(pattern, locale, status));
if (U_FAILURE(status)) {
dataerrln( "%s error while constructing with ErrorCode as %s" ,errMsg, u_errorName(status) );
logln(UnicodeString("TestMessageFormat::testMsgFormatSelect #1 with error code ")+(int32_t)status);
- return NULL;
+ return nullptr;
}
- return msgFmt;
+ return msgFmt.orphan();
}
void TestMessageFormat::testMsgFormatSelect(/* char* par */)
@@ -806,7 +807,8 @@ void TestMessageFormat::testMsgFormatSelect(/* char* par */)
//Select, plural, and number formats heavily nested
UnicodeString t6("{0} und {1, select, female {{2, plural, one {{3, select, female {ihre Freundin} other {ihr Freund}} } other {ihre {2, number, integer} {3, select, female {Freundinnen} other {Freunde}} } }} other{{2, plural, one {{3, select, female {seine Freundin} other {sein Freund}}} other {seine {2, number, integer} {3, select, female {Freundinnen} other {Freunde}}}}} } gingen nach Paris.");
//Create the MessageFormat with Select, plural, and number formats heavily nested
- MessageFormat* msgFmt6 = internalCreate(t6, Locale("de"),err,(char*)"From TestMessageFormat::TestSelectFormat create t6");
+ LocalPointer<MessageFormat> msgFmt6(
+ internalCreate(t6, Locale("de"),err,(char*)"From TestMessageFormat::TestSelectFormat create t6"));
if (!U_FAILURE(err)) {
//Arguments
Formattable testArgs10[] = {"Kirti","other",(int32_t)1,"other"};
@@ -845,10 +847,9 @@ void TestMessageFormat::testMsgFormatSelect(/* char* par */)
};
//Format
for( int i=0; i< 14; i++){
- internalFormat( msgFmt6 , testArgs[i], 4, exp[i] ,(char*)"From TestMessageFormat::testSelectFormat format t6");
+ internalFormat( msgFmt6.getAlias(), testArgs[i], 4, exp[i] ,(char*)"From TestMessageFormat::testSelectFormat format t6");
}
}
- delete msgFmt6;
}
//---------------------------------
@@ -920,7 +921,7 @@ void TestMessageFormat::testClone()
MessageFormat *x = new MessageFormat("There are {0} files on {1}", success);
MessageFormat *z = new MessageFormat("There are {0} files on {1} created", success);
MessageFormat *y = 0;
- y = (MessageFormat*)x->clone();
+ y = x->clone();
if ( (*x == *y) &&
(*x != *z) &&
(*y != *z) )
@@ -1085,7 +1086,7 @@ void TestMessageFormat::testFormat()
result = msg.format(
*fmt,
result,
- //FieldPosition(0),
+ //FieldPosition(FieldPosition::DONT_CARE),
fp,
err);
@@ -1099,7 +1100,7 @@ void TestMessageFormat::testFormat()
result = msg.format(
ft_arr,
result,
- //FieldPosition(0),
+ //FieldPosition(FieldPosition::DONT_CARE),
fp,
err);
@@ -1432,8 +1433,8 @@ static void _testCopyConstructor2()
goto cleanup;
}
- fmt3 = (MessageFormat*) fmt1->clone();
- fmt4 = (MessageFormat*) fmt2->clone();
+ fmt3 = fmt1->clone();
+ fmt4 = fmt2->clone();
if (fmt3 == NULL) {
it_err("testCopyConstructor2: (fmt3 != NULL)");
@@ -2020,7 +2021,7 @@ void TestMessageFormat::TestMessageFormatNumberSkeleton() {
status.setScope(cas.messagePattern);
MessageFormat msgf(cas.messagePattern, cas.localeName, status);
UnicodeString sb;
- FieldPosition fpos(0);
+ FieldPosition fpos(FieldPosition::DONT_CARE);
Formattable argsArray[] = {{cas.arg}};
Formattable args(argsArray, 1);
msgf.format(args, sb, status);
@@ -2029,4 +2030,47 @@ void TestMessageFormat::TestMessageFormatNumberSkeleton() {
}
}
+void TestMessageFormat::doTheRealDateTimeSkeletonTesting(UDate testDate,
+ const char16_t* messagePattern, const char* localeName, const char16_t* expected,
+ IcuTestErrorCode& status) {
+
+ status.setScope(messagePattern);
+ MessageFormat msgf(messagePattern, localeName, status);
+ UnicodeString sb;
+ FieldPosition fpos(FieldPosition::DONT_CARE);
+ Formattable argsArray[] = { Formattable(testDate, Formattable::kIsDate) };
+ Formattable args(argsArray, 1);
+ msgf.format(args, sb, status);
+
+ assertEquals(messagePattern, expected, sb);
+}
+
+void TestMessageFormat::TestMessageFormatDateSkeleton() {
+ IcuTestErrorCode status(*this, "TestMessageFormatDateSkeleton");
+
+ UDate date = LocaleTest::date(2021-1900, UCAL_NOVEMBER, 23, 16, 42, 55);
+
+ doTheRealDateTimeSkeletonTesting(date, u"{0,date,::MMMMd}", "en", u"November 23", status);
+ doTheRealDateTimeSkeletonTesting(date, u"{0,date,::yMMMMdjm}", "en", u"November 23, 2021, 4:42 PM", status);
+ doTheRealDateTimeSkeletonTesting(date, u"{0,date, :: yMMMMd }", "en", u"November 23, 2021", status);
+ doTheRealDateTimeSkeletonTesting(date, u"{0,date,::yMMMMd}", "fr", u"23 novembre 2021", status);
+ doTheRealDateTimeSkeletonTesting(date, u"Expiration: {0,date,::yMMM}!", "en", u"Expiration: Nov 2021!", status);
+ // pattern literal
+ doTheRealDateTimeSkeletonTesting(date, u"{0,date,'::'yMMMMd}", "en", u"::2021November23", status);
+}
+
+void TestMessageFormat::TestMessageFormatTimeSkeleton() {
+ IcuTestErrorCode status(*this, "TestMessageFormatTimeSkeleton");
+
+ UDate date = LocaleTest::date(2021-1900, UCAL_NOVEMBER, 23, 16, 42, 55);
+
+ doTheRealDateTimeSkeletonTesting(date, u"{0,time,::MMMMd}", "en", u"November 23", status);
+ doTheRealDateTimeSkeletonTesting(date, u"{0,time,::yMMMMdjm}", "en", u"November 23, 2021, 4:42 PM", status);
+ doTheRealDateTimeSkeletonTesting(date, u"{0,time, :: yMMMMd }", "en", u"November 23, 2021", status);
+ doTheRealDateTimeSkeletonTesting(date, u"{0,time,::yMMMMd}", "fr", u"23 novembre 2021", status);
+ doTheRealDateTimeSkeletonTesting(date, u"Expiration: {0,time,::yMMM}!", "en", u"Expiration: Nov 2021!", status);
+ // pattern literal
+ doTheRealDateTimeSkeletonTesting(date, u"{0,time,'::'yMMMMd}", "en", u"::2021November23", status);
+}
+
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/tmsgfmt.h b/Build/source/libs/icu/icu-src/source/test/intltest/tmsgfmt.h
index d4bc13d9eaa..dd2153650ab 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/tmsgfmt.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/tmsgfmt.h
@@ -122,9 +122,14 @@ public:
void TestDecimals();
void TestArgIsPrefixOfAnother();
void TestMessageFormatNumberSkeleton();
+ void TestMessageFormatDateSkeleton();
+ void TestMessageFormatTimeSkeleton();
private:
UnicodeString GetPatternAndSkipSyntax(const MessagePattern& pattern);
+ void doTheRealDateTimeSkeletonTesting(UDate testDate,
+ const char16_t* messagePattern, const char* localeName, const char16_t* expected,
+ IcuTestErrorCode& status);
};
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/transapi.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/transapi.cpp
index 76597d28a21..4b59ecfde49 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/transapi.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/transapi.cpp
@@ -512,17 +512,18 @@ void TransliteratorAPITest::TestKeyboardTransliterator1(){
logln("Testing transliterate(Replaceable, int32_t, UChar, UErrorCode)");
for(i=10; i<UPRV_LENGTHOF(Data); i=i+2){
UnicodeString log;
- if (Data[i+0] != "") {
- log = s + " + " + Data[i+0] + " -> ";
- UChar c=Data[i+0].charAt(0);
- t->transliterate(s, index, c, status);
- if(U_FAILURE(status))
+ if (Data[i+0] != "") {
+ log = s + " + " + Data[i+0] + " -> ";
+ UChar c=Data[i+0].charAt(0);
+ t->transliterate(s, index, c, status);
+ if(U_FAILURE(status)) {
errln("FAIL: " + t->getID()+ ".transliterate(Replaceable, int32_t[], UChar, UErrorCode)-->" + (UnicodeString)u_errorName(status));
continue;
- }else {
+ }
+ } else {
log = s + " => ";
t->finishTransliteration(s, index);
- }
+ }
// Show the start index '{' and the cursor '|'
displayOutput(s, Data[i+1], log, index);
}
@@ -711,7 +712,7 @@ int gTestFilter3ClassID = 0;
*/
class TestFilter1 : public UnicodeFilter {
UClassID getDynamicClassID()const { return &gTestFilter1ClassID; }
- virtual UnicodeFunctor* clone() const {
+ virtual TestFilter1* clone() const {
return new TestFilter1(*this);
}
virtual UBool contains(UChar32 c) const {
@@ -732,7 +733,7 @@ class TestFilter1 : public UnicodeFilter {
};
class TestFilter2 : public UnicodeFilter {
UClassID getDynamicClassID()const { return &gTestFilter2ClassID; }
- virtual UnicodeFunctor* clone() const {
+ virtual TestFilter2* clone() const {
return new TestFilter2(*this);
}
virtual UBool contains(UChar32 c) const {
@@ -753,7 +754,7 @@ class TestFilter2 : public UnicodeFilter {
};
class TestFilter3 : public UnicodeFilter {
UClassID getDynamicClassID()const { return &gTestFilter3ClassID; }
- virtual UnicodeFunctor* clone() const {
+ virtual TestFilter3* clone() const {
return new TestFilter3(*this);
}
virtual UBool contains(UChar32 c) const {
@@ -914,8 +915,12 @@ void TransliteratorAPITest::doTest(const UnicodeString& message, const UnicodeSt
// transliterator, just to verify that they don't fail in some
// destructive way.
//
-#define CEASSERT(a) {if (!(a)) { \
-errln("FAIL at line %d from line %d: %s", __LINE__, line, #a); return; }}
+#define CEASSERT(a) UPRV_BLOCK_MACRO_BEGIN { \
+ if (!(a)) { \
+ errln("FAIL at line %d from line %d: %s", __LINE__, line, #a); \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
void TransliteratorAPITest::callEverything(const Transliterator *tr, int line) {
Transliterator *clonedTR = tr->clone();
@@ -969,7 +974,7 @@ class MyUnicodeFunctorTestClass : public UnicodeFunctor {
public:
virtual UnicodeFunctor* clone() const {return NULL;}
static UClassID getStaticClassID(void) {return (UClassID)&MyUnicodeFunctorTestClassID;}
- virtual UClassID getDynamicClassID(void) const {return getStaticClassID();};
+ virtual UClassID getDynamicClassID(void) const {return getStaticClassID();}
virtual void setData(const TransliterationRuleData*) {}
};
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/transrt.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/transrt.cpp
index 0b8c9440f61..c1c30d3adcd 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/transrt.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/transrt.cpp
@@ -33,6 +33,7 @@
#include "cmemory.h"
#include "transrt.h"
#include "testutil.h"
+#include "uassert.h"
#include <string.h>
#include <stdio.h>
@@ -1033,11 +1034,14 @@ void TransliteratorRoundTripTest::TestHangul() {
}
-#define ASSERT_SUCCESS(status) {if (U_FAILURE(status)) { \
- errcheckln(status, "error at file %s, line %d, status = %s", __FILE__, __LINE__, \
- u_errorName(status)); \
- return;}}
-
+#define ASSERT_SUCCESS(status) UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(status)) { \
+ errcheckln(status, "error at file %s, line %d, status = %s", __FILE__, __LINE__, \
+ u_errorName(status)); \
+ return; \
+ } \
+} UPRV_BLOCK_MACRO_END
+
static void writeStringInU8(FILE *out, const UnicodeString &s) {
int i;
@@ -1047,6 +1051,8 @@ static void writeStringInU8(FILE *out, const UnicodeString &s) {
UBool isError = FALSE;
int32_t destIdx = 0;
U8_APPEND(bufForOneChar, destIdx, (int32_t)sizeof(bufForOneChar), c, isError);
+ U_ASSERT(!isError);
+ (void)isError;
fwrite(bufForOneChar, 1, destIdx, out);
}
}
@@ -1057,7 +1063,10 @@ static void writeStringInU8(FILE *out, const UnicodeString &s) {
void TransliteratorRoundTripTest::TestHan() {
UErrorCode status = U_ZERO_ERROR;
LocalULocaleDataPointer uld(ulocdata_open("zh",&status));
- LocalUSetPointer USetExemplars(ulocdata_getExemplarSet(uld.getAlias(), uset_openEmpty(), 0, ULOCDATA_ES_STANDARD, &status));
+ LocalUSetPointer USetExemplars(uset_openEmpty());
+ assertTrue("", USetExemplars.isValid(), false, false, __FILE__, __LINE__);
+ if (! USetExemplars.isValid()) return;
+ ulocdata_getExemplarSet(uld.getAlias(), USetExemplars.getAlias(), 0, ULOCDATA_ES_STANDARD, &status);
ASSERT_SUCCESS(status);
UnicodeString source;
@@ -1279,7 +1288,7 @@ class LegalIndic :public Legal{
public:
LegalIndic();
virtual UBool is(const UnicodeString& sourceString) const;
- virtual ~LegalIndic() {};
+ virtual ~LegalIndic() {}
};
UBool LegalIndic::is(const UnicodeString& sourceString) const{
int cp=sourceString.charAt(0);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/transtst.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/transtst.cpp
index b2c496db801..965fca88ebb 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/transtst.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/transtst.cpp
@@ -657,7 +657,7 @@ int gTestFilterClassID = 0;
* Used by TestFiltering().
*/
class TestFilter : public UnicodeFilter {
- virtual UnicodeFunctor* clone() const {
+ virtual TestFilter* clone() const {
return new TestFilter(*this);
}
virtual UBool contains(UChar32 c) const {
@@ -1947,7 +1947,7 @@ class TestTrans : public Transliterator {
public:
TestTrans(const UnicodeString& id) : Transliterator(id, 0) {
}
- virtual Transliterator* clone(void) const {
+ virtual TestTrans* clone(void) const {
return new TestTrans(getID());
}
virtual void handleTransliterate(Replaceable& /*text*/, UTransPosition& offsets,
@@ -2340,17 +2340,17 @@ void TransliteratorTest::TestCompoundFilterID(void) {
exp = CharsToUnicodeString(DATA[i+3]);
}
UBool expOk = (DATA[i+1] != NULL);
- Transliterator* t = NULL;
+ LocalPointer<Transliterator> t;
UParseError pe;
UErrorCode ec = U_ZERO_ERROR;
if (id.charAt(0) == 0x23/*#*/) {
- t = Transliterator::createFromRules("ID", id, direction, pe, ec);
+ t.adoptInstead(Transliterator::createFromRules("ID", id, direction, pe, ec));
} else {
- t = Transliterator::createInstance(id, direction, pe, ec);
+ t.adoptInstead(Transliterator::createInstance(id, direction, pe, ec));
}
- UBool ok = (t != NULL && U_SUCCESS(ec));
+ UBool ok = (t.isValid() && U_SUCCESS(ec));
UnicodeString transID;
- if (t!=0) {
+ if (t.isValid()) {
transID = t->getID();
}
else {
@@ -2362,7 +2362,6 @@ void TransliteratorTest::TestCompoundFilterID(void) {
if (source.length() != 0) {
expect(*t, source, exp);
}
- delete t;
} else {
dataerrln((UnicodeString)"FAIL: " + id + " => " + transID + ", " +
u_errorName(ec));
@@ -3176,12 +3175,12 @@ void TransliteratorTest::TestToRulesMark() {
UParseError pe;
UErrorCode ec = U_ZERO_ERROR;
- Transliterator *t2 = Transliterator::createFromRules("source-target", UnicodeString(testRules, -1, US_INV), UTRANS_FORWARD, pe, ec);
- Transliterator *t3 = Transliterator::createFromRules("target-source", UnicodeString(testRules, -1, US_INV), UTRANS_REVERSE, pe, ec);
+ LocalPointer<Transliterator> t2(
+ Transliterator::createFromRules("source-target", UnicodeString(testRules, -1, US_INV), UTRANS_FORWARD, pe, ec));
+ LocalPointer<Transliterator> t3(
+ Transliterator::createFromRules("target-source", UnicodeString(testRules, -1, US_INV), UTRANS_REVERSE, pe, ec));
if (U_FAILURE(ec)) {
- delete t2;
- delete t3;
dataerrln((UnicodeString)"FAIL: createFromRules => " + u_errorName(ec));
return;
}
@@ -3191,9 +3190,6 @@ void TransliteratorTest::TestToRulesMark() {
checkRules("Failed toRules FORWARD", *t2, UnicodeString(testRulesForward, -1, US_INV));
checkRules("Failed toRules BACKWARD", *t3, UnicodeString(testRulesBackward, -1, US_INV));
-
- delete t2;
- delete t3;
}
/**
@@ -4066,7 +4062,7 @@ void TransliteratorTest::TestAllCodepoints(){
}
-#define TEST_TRANSLIT_ID(id, cls) { \
+#define TEST_TRANSLIT_ID(id, cls) UPRV_BLOCK_MACRO_BEGIN { \
UErrorCode ec = U_ZERO_ERROR; \
Transliterator* t = Transliterator::createInstance(id, UTRANS_FORWARD, ec); \
if (U_FAILURE(ec)) { \
@@ -4078,9 +4074,9 @@ void TransliteratorTest::TestAllCodepoints(){
/* *t = *t; */ /*can't do this: coverage test for assignment op*/ \
} \
delete t; \
-}
+} UPRV_BLOCK_MACRO_END
-#define TEST_TRANSLIT_RULE(rule, cls) { \
+#define TEST_TRANSLIT_RULE(rule, cls) UPRV_BLOCK_MACRO_BEGIN { \
UErrorCode ec = U_ZERO_ERROR; \
UParseError pe; \
Transliterator* t = Transliterator::createFromRules("_", rule, UTRANS_FORWARD, pe, ec); \
@@ -4093,7 +4089,7 @@ void TransliteratorTest::TestAllCodepoints(){
/* *t = *t; */ /*can't do this: coverage test for assignment op*/ \
} \
delete t; \
-}
+} UPRV_BLOCK_MACRO_END
void TransliteratorTest::TestBoilerplate() {
TEST_TRANSLIT_ID("Any-Latin", AnyTransliterator);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/tsdate.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/tsdate.cpp
index 596ce97024b..79e61e82054 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/tsdate.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/tsdate.cpp
@@ -164,14 +164,22 @@ void IntlTestDateFormat::tryDate(UDate theDate)
date[0] = theDate;
fFormat->format(theDate, string[0]);
+ UErrorCode status = U_ZERO_ERROR;
+ const char* locID = "??";
+ Locale loc = fFormat->getCalendar()->getLocale(ULOC_VALID_LOCALE, status);
+ if (U_SUCCESS(status)) {
+ locID = loc.getName();
+ }
+
for (i=1; i<DEPTH; ++i)
{
- UErrorCode status = U_ZERO_ERROR;
+ status = U_ZERO_ERROR;
date[i] = fFormat->parse(string[i-1], status);
if (U_FAILURE(status))
{
describeTest();
- errln("**** FAIL: Parse of " + prettify(string[i-1], FALSE) + " failed.");
+ errln("**** FAIL, locale " + UnicodeString(locID,-1,US_INV) +
+ ": Parse of " + prettify(string[i-1], FALSE) + " failed.");
dump = TRUE;
break;
}
@@ -181,7 +189,8 @@ void IntlTestDateFormat::tryDate(UDate theDate)
else if (dateMatch > 0 && date[i] != date[i-1])
{
describeTest();
- errln("**** FAIL: Date mismatch after match for " + string[i]);
+ errln("**** FAIL, locale " + UnicodeString(locID,-1,US_INV) +
+ ": Date mismatch after match for " + string[i]);
dump = TRUE;
break;
}
@@ -190,7 +199,8 @@ void IntlTestDateFormat::tryDate(UDate theDate)
else if (stringMatch > 0 && string[i] != string[i-1])
{
describeTest();
- errln("**** FAIL: String mismatch after match for " + string[i]);
+ errln("**** FAIL, locale " + UnicodeString(locID,-1,US_INV) +
+ ": String mismatch after match for " + string[i]);
dump = TRUE;
break;
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/tsmthred.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/tsmthred.cpp
index 0c8219a9ba5..98e04869d85 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/tsmthred.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/tsmthred.cpp
@@ -30,11 +30,6 @@
#include "uassert.h"
-#define TSMTHREAD_FAIL(msg) errln("%s at file %s, line %d", msg, __FILE__, __LINE__)
-#define TSMTHREAD_ASSERT(expr) {if (!(expr)) {TSMTHREAD_FAIL("Fail");}}
-#define TSMTHREAD_ASSERT_SUCCESS(status) {if (U_FAILURE(status)) { \
- errln("file: %s:%d status = %s\n", __FILE__, __LINE__, u_errorName(status));}}
-
MultithreadTest::MultithreadTest()
{
}
@@ -67,7 +62,6 @@ void MultithreadTest::runIndexedTest( int32_t index, UBool exec,
TESTCASE_AUTO_BEGIN;
TESTCASE_AUTO(TestThreads);
- TESTCASE_AUTO(TestMutex);
#if !UCONFIG_NO_FORMATTING
TESTCASE_AUTO(TestThreadedIntl);
#endif
@@ -77,7 +71,6 @@ void MultithreadTest::runIndexedTest( int32_t index, UBool exec,
TESTCASE_AUTO(TestString);
TESTCASE_AUTO(TestArabicShapingThreads);
TESTCASE_AUTO(TestAnyTranslit);
- TESTCASE_AUTO(TestConditionVariables);
TESTCASE_AUTO(TestUnifiedCache);
#if !UCONFIG_NO_TRANSLITERATION
TESTCASE_AUTO(TestBreakTranslit);
@@ -86,7 +79,7 @@ void MultithreadTest::runIndexedTest( int32_t index, UBool exec,
TESTCASE_AUTO(Test20104);
#endif /* #if !UCONFIG_NO_FORMATTING */
#endif /* #if !UCONFIG_NO_TRANSLITERATION */
- TESTCASE_AUTO_END
+ TESTCASE_AUTO_END;
}
@@ -138,10 +131,7 @@ void MultithreadTest::TestThreads()
logln(" Subthread started.");
}
- if (numThreadsStarted != THREADTEST_NRTHREADS) {
- errln("Not all threads could be started for testing!");
- return;
- }
+ assertTrue(WHERE, THREADTEST_NRTHREADS == numThreadsStarted);
logln("Waiting for threads to be set..");
for(i=0; i<THREADTEST_NRTHREADS; i++) {
@@ -168,8 +158,8 @@ void MultithreadTest::TestThreads()
class TestArabicShapeThreads : public SimpleThread
{
public:
- TestArabicShapeThreads() {};
- virtual void run() { doTailTest(); };
+ TestArabicShapeThreads() {}
+ virtual void run() { doTailTest(); }
private:
void doTailTest();
};
@@ -200,7 +190,7 @@ void TestArabicShapeThreads::doTailTest(void) {
}
- //"Trying new tail
+ // Trying new tail
status = U_ZERO_ERROR;
length = u_shapeArabic(src, -1, dst, UPRV_LENGTHOF(dst),
U_SHAPE_LETTERS_SHAPE|U_SHAPE_SEEN_TWOCELL_NEAR|U_SHAPE_TAIL_NEW_UNICODE, &status);
@@ -240,103 +230,6 @@ void MultithreadTest::TestArabicShapingThreads()
}
-//-----------------------------------------------------------------------
-//
-// TestMutex - a simple (non-stress) test to verify that ICU mutexes
-// and condition variables are functioning. Does not test the use of
-// mutexes within ICU services, but rather that the
-// platform's mutex support is at least superficially there.
-//
-//----------------------------------------------------------------------
-static UMutex gTestMutexA = U_MUTEX_INITIALIZER;
-static UConditionVar gThreadsCountChanged = U_CONDITION_INITIALIZER;
-
-static int gThreadsStarted = 0;
-static int gThreadsInMiddle = 0;
-static int gThreadsDone = 0;
-
-static const int TESTMUTEX_THREAD_COUNT = 40;
-
-class TestMutexThread : public SimpleThread
-{
-public:
- virtual void run() {
- // This is the code that each of the spawned threads runs.
- // All threads move together throught the started - middle - done sequence together,
- // waiting for all other threads to reach each point before advancing.
- umtx_lock(&gTestMutexA);
- gThreadsStarted += 1;
- umtx_condBroadcast(&gThreadsCountChanged);
- while (gThreadsStarted < TESTMUTEX_THREAD_COUNT) {
- if (gThreadsInMiddle != 0) {
- IntlTest::gTest->errln(
- "%s:%d gThreadsInMiddle = %d. Expected 0.", __FILE__, __LINE__, gThreadsInMiddle);
- return;
- }
- umtx_condWait(&gThreadsCountChanged, &gTestMutexA);
- }
-
- gThreadsInMiddle += 1;
- umtx_condBroadcast(&gThreadsCountChanged);
- while (gThreadsInMiddle < TESTMUTEX_THREAD_COUNT) {
- if (gThreadsDone != 0) {
- IntlTest::gTest->errln(
- "%s:%d gThreadsDone = %d. Expected 0.", __FILE__, __LINE__, gThreadsDone);
- return;
- }
- umtx_condWait(&gThreadsCountChanged, &gTestMutexA);
- }
-
- gThreadsDone += 1;
- umtx_condBroadcast(&gThreadsCountChanged);
- while (gThreadsDone < TESTMUTEX_THREAD_COUNT) {
- umtx_condWait(&gThreadsCountChanged, &gTestMutexA);
- }
- umtx_unlock(&gTestMutexA);
- }
-};
-
-void MultithreadTest::TestMutex()
-{
- gThreadsStarted = 0;
- gThreadsInMiddle = 0;
- gThreadsDone = 0;
- int32_t i = 0;
- TestMutexThread threads[TESTMUTEX_THREAD_COUNT];
- umtx_lock(&gTestMutexA);
- for (i=0; i<TESTMUTEX_THREAD_COUNT; i++) {
- if (threads[i].start() != 0) {
- errln("%s:%d Error starting thread %d", __FILE__, __LINE__, i);
- return;
- }
- }
-
- // Because we are holding gTestMutexA, all of the threads should be blocked
- // at the start of their run() function.
- if (gThreadsStarted != 0) {
- errln("%s:%d gThreadsStarted=%d. Expected 0.", __FILE__, __LINE__, gThreadsStarted);
- return;
- }
-
- while (gThreadsInMiddle < TESTMUTEX_THREAD_COUNT) {
- if (gThreadsDone != 0) {
- errln("%s:%d gThreadsDone=%d. Expected 0.", __FILE__, __LINE__, gThreadsStarted);
- return;
- }
- umtx_condWait(&gThreadsCountChanged, &gTestMutexA);
- }
-
- while (gThreadsDone < TESTMUTEX_THREAD_COUNT) {
- umtx_condWait(&gThreadsCountChanged, &gTestMutexA);
- }
- umtx_unlock(&gTestMutexA);
-
- for (i=0; i<TESTMUTEX_THREAD_COUNT; i++) {
- threads[i].join();
- }
-}
-
-
//-------------------------------------------------------------------------------------------
//
// TestMultithreadedIntl. Test ICU Formatting in a multi-threaded environment
@@ -348,26 +241,26 @@ void MultithreadTest::TestMutex()
UnicodeString showDifference(const UnicodeString& expected, const UnicodeString& result)
{
UnicodeString res;
- res = expected + "<Expected\n";
+ res = expected + u"<Expected\n";
if(expected.length() != result.length())
- res += " [ Different lengths ] \n";
+ res += u" [ Different lengths ] \n";
else
{
for(int32_t i=0;i<expected.length();i++)
{
if(expected[i] == result[i])
{
- res += " ";
+ res += u" ";
}
else
{
- res += "|";
+ res += u"|";
}
}
- res += "<Differences";
- res += "\n";
+ res += u"<Differences";
+ res += u"\n";
}
- res += result + "<Result\n";
+ res += result + u"<Result\n";
return res;
}
@@ -416,19 +309,15 @@ static void formatErrorMessage(UErrorCode &realStatus, const UnicodeString& patt
Formattable(currency3)// currency3 {3,number,currency}
};
- MessageFormat *fmt = new MessageFormat("MessageFormat's API is broken!!!!!!!!!!!",realStatus);
- fmt->setLocale(theLocale);
- fmt->applyPattern(pattern, realStatus);
-
+ LocalPointer<MessageFormat> fmt(new MessageFormat(u"MessageFormat's API is broken!!!!!!!!!!!",realStatus), realStatus);
if (U_FAILURE(realStatus)) {
- delete fmt;
return;
}
+ fmt->setLocale(theLocale);
+ fmt->applyPattern(pattern, realStatus);
FieldPosition ignore = 0;
fmt->format(myArgs,4,result,ignore,realStatus);
-
- delete fmt;
}
/**
@@ -451,8 +340,8 @@ const ThreadSafeFormatSharedData *gSharedData = NULL;
ThreadSafeFormatSharedData::ThreadSafeFormatSharedData(UErrorCode &status) {
fFormat.adoptInstead(NumberFormat::createCurrencyInstance(Locale::getUS(), status));
- static const UChar kYDD[] = { 0x59, 0x44, 0x44, 0x00 };
- static const UChar kBBD[] = { 0x42, 0x42, 0x44, 0x00 };
+ static const UChar *kYDD = u"YDD";
+ static const UChar *kBBD = u"BBD";
fYDDThing.adoptObject(new CurrencyAmount(123.456, kYDD, status));
fBBDThing.adoptObject(new CurrencyAmount(987.654, kBBD, status));
if (U_FAILURE(status)) {
@@ -488,26 +377,26 @@ ThreadSafeFormat::ThreadSafeFormat(UErrorCode &status) {
fFormat.adoptInstead(NumberFormat::createCurrencyInstance(Locale::getUS(), status));
}
-static const UChar kUSD[] = { 0x55, 0x53, 0x44, 0x00 };
+static const UChar *kUSD = u"USD";
UBool ThreadSafeFormat::doStuff(int32_t offset, UnicodeString &appendErr, UErrorCode &status) const {
UBool okay = TRUE;
if(u_strcmp(fFormat->getCurrency(), kUSD)) {
- appendErr.append("fFormat currency != ")
+ appendErr.append(u"fFormat currency != ")
.append(kUSD)
- .append(", =")
+ .append(u", =")
.append(fFormat->getCurrency())
- .append("! ");
+ .append(u"! ");
okay = FALSE;
}
if(u_strcmp(gSharedData->fFormat->getCurrency(), kUSD)) {
- appendErr.append("gFormat currency != ")
+ appendErr.append(u"gFormat currency != ")
.append(kUSD)
- .append(", =")
+ .append(u", =")
.append(gSharedData->fFormat->getCurrency())
- .append("! ");
+ .append(u"! ");
okay = FALSE;
}
UnicodeString str;
@@ -698,38 +587,36 @@ public:
default:
case 0:
statusToCheck= U_FILE_ACCESS_ERROR;
- patternToCheck= "0:Someone from {2} is receiving a #{0}"
- " error - {1}. Their telephone call is costing "
- "{3,number,currency}."; // number,currency
+ patternToCheck= u"0:Someone from {2} is receiving a #{0}"
+ " error - {1}. Their telephone call is costing "
+ "{3,number,currency}."; // number,currency
messageLocale= Locale("en","US");
countryToCheck= Locale("","HR");
currencyToCheck= 8192.77;
- expected= "0:Someone from Croatia is receiving a #4 error - "
+ expected= u"0:Someone from Croatia is receiving a #4 error - "
"U_FILE_ACCESS_ERROR. Their telephone call is costing $8,192.77.";
break;
case 1:
statusToCheck= U_INDEX_OUTOFBOUNDS_ERROR;
- patternToCheck= "1:A customer in {2} is receiving a #{0} error - {1}. "
- "Their telephone call is costing {3,number,currency}."; // number,currency
+ patternToCheck= u"1:A customer in {2} is receiving a #{0} error - {1}. "
+ "Their telephone call is costing {3,number,currency}."; // number,currency
messageLocale= Locale("de","DE@currency=DEM");
countryToCheck= Locale("","BF");
currencyToCheck= 2.32;
- expected= CharsToUnicodeString(
- "1:A customer in Burkina Faso is receiving a #8 error - U_INDEX_OUTOFBOUNDS_ERROR. "
- "Their telephone call is costing 2,32\\u00A0DM.");
+ expected= u"1:A customer in Burkina Faso is receiving a #8 error - U_INDEX_OUTOFBOUNDS_ERROR. "
+ u"Their telephone call is costing 2,32\u00A0DM.";
break;
case 2:
statusToCheck= U_MEMORY_ALLOCATION_ERROR;
- patternToCheck= "2:user in {2} is receiving a #{0} error - {1}. "
+ patternToCheck= u"2:user in {2} is receiving a #{0} error - {1}. "
"They insist they just spent {3,number,currency} "
"on memory."; // number,currency
messageLocale= Locale("de","AT@currency=ATS"); // Austrian German
countryToCheck= Locale("","US"); // hmm
currencyToCheck= 40193.12;
- expected= CharsToUnicodeString(
- "2:user in Vereinigte Staaten is receiving a #7 error"
- " - U_MEMORY_ALLOCATION_ERROR. They insist they just spent"
- " \\u00f6S\\u00A040.193,12 on memory.");
+ expected= u"2:user in Vereinigte Staaten is receiving a #7 error"
+ u" - U_MEMORY_ALLOCATION_ERROR. They insist they just spent"
+ u" \u00f6S\u00A040.193,12 on memory.";
break;
}
@@ -740,14 +627,14 @@ public:
if(U_FAILURE(status))
{
UnicodeString tmp(u_errorName(status));
- IntlTest::gTest->errln("Failure on message format, pattern=" + patternToCheck +
+ IntlTest::gTest->errln(u"Failure on message format, pattern=" + patternToCheck +
", error = " + tmp);
goto cleanupAndReturn;
}
if(result != expected)
{
- IntlTest::gTest->errln("PatternFormat: \n" + showDifference(expected,result));
+ IntlTest::gTest->errln(u"PatternFormat: \n" + showDifference(expected,result));
goto cleanupAndReturn;
}
// test the Thread Safe Format
@@ -777,7 +664,7 @@ void MultithreadTest::TestThreadedIntl()
UErrorCode threadSafeErr = U_ZERO_ERROR;
ThreadSafeFormatSharedData sharedData(threadSafeErr);
- assertSuccess("initializing ThreadSafeFormat", threadSafeErr, TRUE);
+ assertSuccess(WHERE, threadSafeErr, TRUE);
//
// Create and start the test threads
@@ -823,17 +710,6 @@ struct Line {
int32_t buflen;
} ;
-static UBool
-skipLineBecauseOfBug(const UChar *s, int32_t length) {
- // TODO: Fix ICU ticket #8052
- if(length >= 3 &&
- (s[0] == 0xfb2 || s[0] == 0xfb3) &&
- s[1] == 0x334 &&
- (s[2] == 0xf73 || s[2] == 0xf75 || s[2] == 0xf81)) {
- return TRUE;
- }
- return FALSE;
-}
static UCollationResult
normalizeResult(int32_t result) {
@@ -854,7 +730,7 @@ public:
noLines(0),
isAtLeastUCA62(TRUE)
{
- };
+ }
void setCollator(Collator *c, Line *l, int32_t nl, UBool atLeastUCA62)
{
coll = c;
@@ -872,8 +748,6 @@ public:
for(i = 0; i < noLines; i++) {
if(lines[i].buflen == 0) { continue; }
- if(skipLineBecauseOfBug(lines[i].buff, lines[i].buflen)) { continue; }
-
int32_t resLen = coll->getSortKey(lines[i].buff, lines[i].buflen, newSk, 1024);
if(oldSk != NULL) {
@@ -882,12 +756,12 @@ public:
int32_t cmpres2 = coll->compare(lines[i].buff, lines[i].buflen, lines[prev].buff, lines[prev].buflen);
if(cmpres != -cmpres2) {
- IntlTest::gTest->errln(UnicodeString("Compare result not symmetrical on line ") + (i + 1));
+ IntlTest::gTest->errln(UnicodeString(u"Compare result not symmetrical on line ") + (i + 1));
break;
}
if(cmpres != normalizeResult(skres)) {
- IntlTest::gTest->errln(UnicodeString("Difference between coll->compare and sortkey compare on line ") + (i + 1));
+ IntlTest::gTest->errln(UnicodeString(u"Difference between coll->compare and sortkey compare on line ") + (i + 1));
break;
}
@@ -901,7 +775,7 @@ public:
// which we do via setting strength=identical.
}
if(res > 0) {
- IntlTest::gTest->errln(UnicodeString("Line is not greater or equal than previous line, for line ") + (i + 1));
+ IntlTest::gTest->errln(UnicodeString(u"Line is not greater or equal than previous line, for line ") + (i + 1));
break;
}
}
@@ -1020,7 +894,7 @@ void MultithreadTest::TestCollators()
int32_t spawnResult = 0;
LocalArray<CollatorThreadTest> tests(new CollatorThreadTest[kCollatorThreadThreads]);
- logln(UnicodeString("Spawning: ") + kCollatorThreadThreads + " threads * " + kFormatThreadIterations + " iterations each.");
+ logln(UnicodeString(u"Spawning: ") + kCollatorThreadThreads + u" threads * " + kFormatThreadIterations + u" iterations each.");
int32_t j = 0;
for(j = 0; j < kCollatorThreadThreads; j++) {
//logln("Setting collator %i", j);
@@ -1068,7 +942,7 @@ public:
: SimpleThread(),
fTraceInfo(0)
{
- };
+ }
virtual void run()
@@ -1077,12 +951,12 @@ public:
int loopCount = 0;
for (loopCount = 0; loopCount < kStringThreadIterations; loopCount++) {
- if (*gSharedString != "This is the original test string.") {
+ if (*gSharedString != u"This is the original test string.") {
IntlTest::gTest->errln("%s:%d Original string is corrupt.", __FILE__, __LINE__);
break;
}
UnicodeString s1 = *gSharedString;
- s1 += "cat this";
+ s1 += u"cat this";
UnicodeString s2(s1);
UnicodeString s3 = *gSharedString;
s2 = s3;
@@ -1103,10 +977,10 @@ const UnicodeString *StringThreadTest2::gSharedString = NULL;
void MultithreadTest::TestString()
{
int j;
- StringThreadTest2::gSharedString = new UnicodeString("This is the original test string.");
+ StringThreadTest2::gSharedString = new UnicodeString(u"This is the original test string.");
StringThreadTest2 tests[kStringThreadThreads];
- logln(UnicodeString("Spawning: ") + kStringThreadThreads + " threads * " + kStringThreadIterations + " iterations each.");
+ logln(UnicodeString(u"Spawning: ") + kStringThreadThreads + u" threads * " + kStringThreadIterations + u" iterations each.");
for(j = 0; j < kStringThreadThreads; j++) {
int32_t threadStatus = tests[j].start();
if (threadStatus != 0) {
@@ -1119,7 +993,7 @@ void MultithreadTest::TestString()
for(j=0; j<kStringThreadThreads; j++) {
tests[j].join();
- logln(UnicodeString("Test #") + j + " is complete.. ");
+ logln(UnicodeString(u"Test #") + j + u" is complete.. ");
}
delete StringThreadTest2::gSharedString;
@@ -1138,20 +1012,16 @@ void MultithreadTest::TestString()
Transliterator *gSharedTranslit = NULL;
class TxThread: public SimpleThread {
public:
- TxThread() {};
+ TxThread() {}
~TxThread();
void run();
};
TxThread::~TxThread() {}
void TxThread::run() {
- UnicodeString greekString("\\u03B4\\u03B9\\u03B1\\u03C6\\u03BF\\u03C1\\u03B5\\u03C4\\u03B9\\u03BA\\u03BF\\u03CD\\u03C2");
- greekString = greekString.unescape();
+ UnicodeString greekString(u"διαφορετικούς");
gSharedTranslit->transliterate(greekString);
- if (greekString[0] != 0x64) // 'd'. The whole transliterated string is "diaphoretikous" (accented u).
- {
- IntlTest::gTest->errln("%s:%d Transliteration failed.", __FILE__, __LINE__);
- }
+ IntlTest::gTest->assertEquals(WHERE, UnicodeString(u"diaphoretikoús"), greekString);
}
#endif
@@ -1160,10 +1030,8 @@ void MultithreadTest::TestAnyTranslit() {
#if !UCONFIG_NO_TRANSLITERATION
UErrorCode status = U_ZERO_ERROR;
LocalPointer<Transliterator> tx(Transliterator::createInstance("Any-Latin", UTRANS_FORWARD, status));
- if (U_FAILURE(status)) {
- dataerrln("File %s, Line %d: Error, status = %s", __FILE__, __LINE__, u_errorName(status));
- return;
- }
+ if (!assertSuccess(WHERE, status, true)) { return; }
+
gSharedTranslit = tx.getAlias();
TxThread threads[4];
int32_t i;
@@ -1179,93 +1047,6 @@ void MultithreadTest::TestAnyTranslit() {
}
-//
-// Condition Variables Test
-// Create a swarm of threads.
-// Using a mutex and a condition variables each thread
-// Increments a global count of started threads.
-// Broadcasts that it has started.
-// Waits on the condition that all threads have started.
-// Increments a global count of finished threads.
-// Waits on the condition that all threads have finished.
-// Exits.
-//
-
-class CondThread: public SimpleThread {
- public:
- CondThread() :fFinished(false) {};
- ~CondThread() {};
- void run();
- bool fFinished;
-};
-
-static UMutex gCTMutex = U_MUTEX_INITIALIZER;
-static UConditionVar gCTConditionVar = U_CONDITION_INITIALIZER;
-int gConditionTestOne = 1; // Value one. Non-const, extern linkage to inhibit
- // compiler assuming a known value.
-int gStartedThreads;
-int gFinishedThreads;
-static const int NUMTHREADS = 10;
-
-
-// Worker thread function.
-void CondThread::run() {
- umtx_lock(&gCTMutex);
- gStartedThreads += gConditionTestOne;
- umtx_condBroadcast(&gCTConditionVar);
-
- while (gStartedThreads < NUMTHREADS) {
- if (gFinishedThreads != 0) {
- IntlTest::gTest->errln("File %s, Line %d: Error, gStartedThreads = %d, gFinishedThreads = %d",
- __FILE__, __LINE__, gStartedThreads, gFinishedThreads);
- }
- umtx_condWait(&gCTConditionVar, &gCTMutex);
- }
-
- gFinishedThreads += gConditionTestOne;
- fFinished = true;
- umtx_condBroadcast(&gCTConditionVar);
-
- while (gFinishedThreads < NUMTHREADS) {
- umtx_condWait(&gCTConditionVar, &gCTMutex);
- }
- umtx_unlock(&gCTMutex);
-}
-
-void MultithreadTest::TestConditionVariables() {
- gStartedThreads = 0;
- gFinishedThreads = 0;
- int i;
-
- umtx_lock(&gCTMutex);
- CondThread *threads[NUMTHREADS];
- for (i=0; i<NUMTHREADS; ++i) {
- threads[i] = new CondThread;
- threads[i]->start();
- }
-
- while (gStartedThreads < NUMTHREADS) {
- umtx_condWait(&gCTConditionVar, &gCTMutex);
- }
-
- while (gFinishedThreads < NUMTHREADS) {
- umtx_condWait(&gCTConditionVar, &gCTMutex);
- }
-
- umtx_unlock(&gCTMutex);
-
- for (i=0; i<NUMTHREADS; ++i) {
- if (!threads[i]->fFinished) {
- errln("File %s, Line %d: Error, threads[%d]->fFinished == false", __FILE__, __LINE__, i);
- }
- }
-
- for (i=0; i<NUMTHREADS; ++i) {
- threads[i]->join();
- delete threads[i];
- }
-}
-
//
// Unified Cache Test
@@ -1300,6 +1081,9 @@ class UCTMultiThreadItem : public SharedObject {
U_NAMESPACE_BEGIN
+static std::mutex *gCTMutex = nullptr;
+static std::condition_variable *gCTConditionVar = nullptr;
+
template<> U_EXPORT
const UCTMultiThreadItem *LocaleCacheKey<UCTMultiThreadItem>::createObject(
const void *context, UErrorCode &status) const {
@@ -1315,21 +1099,23 @@ const UCTMultiThreadItem *LocaleCacheKey<UCTMultiThreadItem>::createObject(
return result;
}
- umtx_lock(&gCTMutex);
- bool firstObject = (gObjectsCreated == 0);
- if (firstObject) {
- // Force the first object creation that comes through to wait
- // until other have completed. Verifies that cache doesn't
- // deadlock when a creation is slow.
-
- // Note that gObjectsCreated needs to be incremeneted from 0 to 1
- // early, to keep subsequent threads from entering this path.
- gObjectsCreated = 1;
- while (gObjectsCreated < 3) {
- umtx_condWait(&gCTConditionVar, &gCTMutex);
+ bool firstObject = false;
+ {
+ std::unique_lock<std::mutex> lock(*gCTMutex);
+ firstObject = (gObjectsCreated == 0);
+ if (firstObject) {
+ // Force the first object creation that comes through to wait
+ // until other have completed. Verifies that cache doesn't
+ // deadlock when a creation is slow.
+
+ // Note that gObjectsCreated needs to be incremeneted from 0 to 1
+ // early, to keep subsequent threads from entering this path.
+ gObjectsCreated = 1;
+ while (gObjectsCreated < 3) {
+ gCTConditionVar->wait(lock);
+ }
}
}
- umtx_unlock(&gCTMutex);
const UCTMultiThreadItem *result =
new UCTMultiThreadItem(fLoc.getLanguage());
@@ -1341,12 +1127,13 @@ const UCTMultiThreadItem *LocaleCacheKey<UCTMultiThreadItem>::createObject(
// Log that we created an object. The first object was already counted,
// don't do it again.
- umtx_lock(&gCTMutex);
- if (!firstObject) {
- gObjectsCreated += 1;
+ {
+ std::unique_lock<std::mutex> lock(*gCTMutex);
+ if (!firstObject) {
+ gObjectsCreated += 1;
+ }
+ gCTConditionVar->notify_all();
}
- umtx_condBroadcast(&gCTConditionVar);
- umtx_unlock(&gCTMutex);
return result;
}
@@ -1358,8 +1145,8 @@ class UnifiedCacheThread: public SimpleThread {
UnifiedCacheThread(
const UnifiedCache *cache,
const char *loc,
- const char *loc2) : fCache(cache), fLoc(loc), fLoc2(loc2) {};
- ~UnifiedCacheThread() {};
+ const char *loc2) : fCache(cache), fLoc(loc), fLoc2(loc2) {}
+ ~UnifiedCacheThread() {}
void run();
void exerciseByLocale(const Locale &);
const UnifiedCache *fCache;
@@ -1373,12 +1160,7 @@ void UnifiedCacheThread::exerciseByLocale(const Locale &locale) {
fCache->get(
LocaleCacheKey<UCTMultiThreadItem>(locale), fCache, origItem, status);
U_ASSERT(U_SUCCESS(status));
- if (uprv_strcmp(locale.getLanguage(), origItem->value)) {
- IntlTest::gTest->errln(
- "%s:%d Expected %s, got %s", __FILE__, __LINE__,
- locale.getLanguage(),
- origItem->value);
- }
+ IntlTest::gTest->assertEquals(WHERE, locale.getLanguage(), origItem->value);
// Fetch the same item again many times. We should always get the same
// pointer since this client is already holding onto it
@@ -1386,12 +1168,7 @@ void UnifiedCacheThread::exerciseByLocale(const Locale &locale) {
const UCTMultiThreadItem *item = NULL;
fCache->get(
LocaleCacheKey<UCTMultiThreadItem>(locale), fCache, item, status);
- if (item != origItem) {
- IntlTest::gTest->errln(
- "%s:%d Expected to get the same pointer",
- __FILE__,
- __LINE__);
- }
+ IntlTest::gTest->assertTrue(WHERE, item == origItem);
if (item != NULL) {
item->removeRef();
}
@@ -1418,7 +1195,9 @@ void MultithreadTest::TestUnifiedCache() {
cache.setEvictionPolicy(2, 0, status);
U_ASSERT(U_SUCCESS(status));
- gFinishedThreads = 0;
+ gCTMutex = new std::mutex();
+ gCTConditionVar = new std::condition_variable();
+
gObjectsCreated = 0;
UnifiedCacheThread *threads[CACHE_LOAD][UPRV_LENGTHOF(gCacheLocales)];
@@ -1452,7 +1231,7 @@ void MultithreadTest::TestUnifiedCache() {
}
- assertEquals("unused values", 2, cache.unusedCount());
+ assertEquals(WHERE, 2, cache.unusedCount());
// clean up threads
for (int32_t i=0; i<CACHE_LOAD; ++i) {
@@ -1460,6 +1239,8 @@ void MultithreadTest::TestUnifiedCache() {
delete threads[i][j];
}
}
+ delete gCTMutex;
+ delete gCTConditionVar;
}
#if !UCONFIG_NO_TRANSLITERATION
@@ -1474,8 +1255,8 @@ static const UnicodeString *gTranslitExpected;
class BreakTranslitThread: public SimpleThread {
public:
- BreakTranslitThread() {};
- ~BreakTranslitThread() {};
+ BreakTranslitThread() {}
+ ~BreakTranslitThread() {}
void run();
};
@@ -1493,16 +1274,16 @@ void BreakTranslitThread::run() {
void MultithreadTest::TestBreakTranslit() {
UErrorCode status = U_ZERO_ERROR;
UnicodeString input(
- "\\u0E42\\u0E14\\u0E22\\u0E1E\\u0E37\\u0E49\\u0E19\\u0E10\\u0E32\\u0E19\\u0E41\\u0E25\\u0E49\\u0E27,");
- input = input.unescape();
+ u"\u0E42\u0E14\u0E22\u0E1E\u0E37\u0E49\u0E19\u0E10\u0E32\u0E19\u0E41\u0E25\u0E49\u0E27,");
+ // Thai script, โดยพื้นฐานแล้ว
gTranslitInput = &input;
gSharedTransliterator = Transliterator::createInstance(
- UNICODE_STRING_SIMPLE("Any-Latin; Lower; NFD; [:Diacritic:]Remove; NFC; Latin-ASCII;"), UTRANS_FORWARD, status);
- if (!gSharedTransliterator) {
- return;
- }
- TSMTHREAD_ASSERT_SUCCESS(status);
+ UnicodeString(u"Any-Latin; Lower; NFD; [:Diacritic:]Remove; NFC; Latin-ASCII;"), UTRANS_FORWARD, status);
+ assertSuccess(WHERE, status);
+ if (!assertTrue(WHERE, gSharedTransliterator != nullptr)) {
+ return;
+ }
UnicodeString expected(*gTranslitInput);
gSharedTransliterator->transliterate(expected);
@@ -1524,7 +1305,7 @@ void MultithreadTest::TestBreakTranslit() {
class TestIncDecThread : public SimpleThread {
public:
- TestIncDecThread() { };
+ TestIncDecThread() {}
virtual void run();
};
@@ -1549,7 +1330,7 @@ void MultithreadTest::TestIncDec()
for (auto &thread:threads) {
thread.join();
}
- assertEquals("TestIncDec", NUM_THREADS, gIncDecCounter);
+ assertEquals(WHERE, NUM_THREADS, gIncDecCounter);
}
#if !UCONFIG_NO_FORMATTING
@@ -1557,7 +1338,7 @@ static Calendar *gSharedCalendar = {};
class Test20104Thread : public SimpleThread {
public:
- Test20104Thread() { };
+ Test20104Thread() {}
virtual void run();
};
@@ -1569,7 +1350,7 @@ void MultithreadTest::Test20104() {
UErrorCode status = U_ZERO_ERROR;
Locale loc("hi_IN");
gSharedCalendar = new IndianCalendar(loc, status);
- assertSuccess("Test20104", status);
+ assertSuccess(WHERE, status);
static constexpr int NUM_THREADS = 4;
Test20104Thread threads[NUM_THREADS];
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/tsmthred.h b/Build/source/libs/icu/icu-src/source/test/intltest/tsmthred.h
index 565080ac69a..d3983cf33f8 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/tsmthred.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/tsmthred.h
@@ -36,10 +36,6 @@ public:
**/
void TestArabicShapingThreads(void);
- /**
- * test that mutexes work
- **/
- void TestMutex(void);
#if !UCONFIG_NO_FORMATTING
/**
* test that intl functions work in a multithreaded context
@@ -49,7 +45,6 @@ public:
void TestCollators(void);
void TestString();
void TestAnyTranslit();
- void TestConditionVariables();
void TestUnifiedCache();
void TestBreakTranslit();
void TestIncDec();
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/tstnorm.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/tstnorm.cpp
index 741211b170f..b3f4185ab50 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/tstnorm.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/tstnorm.cpp
@@ -1369,7 +1369,7 @@ initExpectedSkippables(UnicodeSet skipSets[UNORM_MODE_COUNT], UErrorCode &errorC
// We need not look at control codes, Han characters nor Hangul LVT syllables because they
// do not combine forward. LV syllables are already removed.
UnicodeSet notInteresting("[[:C:][:Unified_Ideograph:][:HST=LVT:]]", errorCode);
- LocalPointer<UnicodeSet> unsure(&((UnicodeSet *)(skipSets[UNORM_NFC].clone()))->removeAll(notInteresting));
+ LocalPointer<UnicodeSet> unsure(&(skipSets[UNORM_NFC].clone())->removeAll(notInteresting));
// System.out.format("unsure.size()=%d\n", unsure.size());
// For each character about which we are unsure, see if it changes when we add
@@ -1577,7 +1577,7 @@ BasicNormalizerTest::TestNormalizeUTF8WithEdits() {
u8" AÄA\u0308A\u0308\u00ad\u0323Ä\u0323,\u00ad\u1100\u1161가\u11A8가\u3133 ";
std::string expected = u8" aääạ\u0308ạ\u0308,가각갃 ";
std::string result;
- StringByteSink<std::string> sink(&result, expected.length());
+ StringByteSink<std::string> sink(&result, static_cast<int32_t>(expected.length()));
Edits edits;
nfkc_cf->normalizeUTF8(0, src, sink, &edits, errorCode);
assertSuccess("normalizeUTF8 with Edits", errorCode.get());
@@ -1780,7 +1780,7 @@ BasicNormalizerTest::TestComposeJamoTBase() {
std::string s8(u8"\u1100\u1161\u11A7\u1100\u314F\u11A7가\u11A7");
std::string expected8(u8"가\u11A7가\u11A7가\u11A7");
std::string result8;
- StringByteSink<std::string> sink(&result8, expected8.length());
+ StringByteSink<std::string> sink(&result8, static_cast<int32_t>(expected8.length()));
nfkc->normalizeUTF8(0, s8, sink, nullptr, errorCode);
assertSuccess("normalizeUTF8(LV+11A7)", errorCode.get());
assertEquals("normalizeUTF8(LV+11A7)", expected8.c_str(), result8.c_str());
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/tufmtts.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/tufmtts.cpp
index 91a26678caf..3a0d7b65f87 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/tufmtts.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/tufmtts.cpp
@@ -171,7 +171,7 @@ void TimeUnitTest::testAPI() {
TimeUnit* tmunit = TimeUnit::createInstance(TimeUnit::UTIMEUNIT_YEAR, status);
if (!assertSuccess("TimeUnit::createInstance", status)) return;
- TimeUnit* another = (TimeUnit*)tmunit->clone();
+ TimeUnit* another = tmunit->clone();
TimeUnit third(*tmunit);
TimeUnit fourth = third;
@@ -239,7 +239,7 @@ void TimeUnitTest::testAPI() {
TimeUnitAmount second(tma);
TimeUnitAmount third_tma = tma;
- TimeUnitAmount* fourth_tma = (TimeUnitAmount*)tma.clone();
+ TimeUnitAmount* fourth_tma = tma.clone();
assertTrue("orig and copy are equal", (second == tma));
assertTrue("clone and assigned are equal", (third_tma == *fourth_tma));
@@ -266,7 +266,7 @@ void TimeUnitTest::testAPI() {
TimeUnitFormat tmf_copy(tmf_fr);
assertTrue("TimeUnitFormat: orig and copy are equal", (tmf_fr == tmf_copy));
- TimeUnitFormat* tmf_clone = (TimeUnitFormat*)tmf_en->clone();
+ TimeUnitFormat* tmf_clone = tmf_en->clone();
assertTrue("TimeUnitFormat: orig and clone are equal", (*tmf_en == *tmf_clone));
delete tmf_clone;
@@ -386,7 +386,7 @@ void TimeUnitTest::testGreekWithFallback() {
unitIndex < UPRV_LENGTHOF(tunits);
++unitIndex ) {
- TimeUnitAmount *tamt = new TimeUnitAmount(numbers[numberIndex], tunits[unitIndex], status);
+ LocalPointer<TimeUnitAmount>tamt(new TimeUnitAmount(numbers[numberIndex], tunits[unitIndex], status));
if (U_FAILURE(status)) {
dataerrln("generating TimeUnitAmount Object failed.");
#ifdef TUFMTTS_DEBUG
@@ -395,7 +395,7 @@ void TimeUnitTest::testGreekWithFallback() {
return;
}
- TimeUnitFormat *tfmt = new TimeUnitFormat(l, styles[styleIndex], status);
+ LocalPointer<TimeUnitFormat> tfmt(new TimeUnitFormat(l, styles[styleIndex], status));
if (U_FAILURE(status)) {
dataerrln("generating TimeUnitAmount Object failed.");
#ifdef TUFMTTS_DEBUG
@@ -407,10 +407,9 @@ void TimeUnitTest::testGreekWithFallback() {
Formattable fmt;
UnicodeString str;
- fmt.adoptObject(tamt);
- str = ((Format *)tfmt)->format(fmt, str, status);
+ fmt.adoptObject(tamt.orphan());
+ str = ((Format *)tfmt.getAlias())->format(fmt, str, status);
if (!assertSuccess("formatting relative time failed", status)) {
- delete tfmt;
#ifdef TUFMTTS_DEBUG
std::cout << "Failed to format" << "\n";
#endif
@@ -426,11 +425,9 @@ void TimeUnitTest::testGreekWithFallback() {
std::cout << "Formatted string : " << tmp << " expected : " << tmp1 << "\n";
#endif
if (!assertEquals("formatted time string is not expected, locale: " + UnicodeString(locales[locIndex]) + " style: " + (int)styles[styleIndex] + " units: " + (int)tunits[unitIndex], expected[counter], str)) {
- delete tfmt;
str.remove();
return;
}
- delete tfmt;
str.remove();
++counter;
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/tzfmttst.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/tzfmttst.cpp
index 46a640ae688..40362aacd0a 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/tzfmttst.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/tzfmttst.cpp
@@ -85,6 +85,7 @@ TimeZoneFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &name
TESTCASE(5, TestFormatTZDBNames);
TESTCASE(6, TestFormatCustomZone);
TESTCASE(7, TestFormatTZDBNamesAllZoneCoverage);
+ TESTCASE(8, TestAdoptDefaultThreadSafe);
default: name = ""; break;
}
}
@@ -409,7 +410,7 @@ struct LocaleData {
for (int i=0; i<UPRV_LENGTHOF(times); i++) {
times[i] = 0;
}
- };
+ }
void resetTestIteration() {
localeIndex = -1;
@@ -711,6 +712,44 @@ void TimeZoneFormatTest::RunTimeRoundTripTests(int32_t threadNumber) {
delete tzids;
}
+void
+TimeZoneFormatTest::TestAdoptDefaultThreadSafe(void) {
+ ThreadPool<TimeZoneFormatTest> threads(this, threadCount, &TimeZoneFormatTest::RunAdoptDefaultThreadSafeTests);
+ threads.start(); // Start all threads.
+ threads.join(); // Wait for all threads to finish.
+}
+
+static const int32_t kAdoptDefaultIteration = 10;
+static const int32_t kCreateDefaultIteration = 5000;
+static const int64_t kStartTime = 1557288964845;
+
+void TimeZoneFormatTest::RunAdoptDefaultThreadSafeTests(int32_t threadNumber) {
+ UErrorCode status = U_ZERO_ERROR;
+ if (threadNumber % 2 == 0) {
+ for (int32_t i = 0; i < kAdoptDefaultIteration; i++) {
+ std::unique_ptr<icu::StringEnumeration> timezones(
+ icu::TimeZone::createEnumeration());
+ // Fails with missing data.
+ if (!assertTrue(WHERE, (bool)timezones, false, true)) {return;}
+ while (const icu::UnicodeString* timezone = timezones->snext(status)) {
+ status = U_ZERO_ERROR;
+ icu::TimeZone::adoptDefault(icu::TimeZone::createTimeZone(*timezone));
+ }
+ }
+ } else {
+ int32_t rawOffset;
+ int32_t dstOffset;
+ int64_t date = kStartTime;
+ for (int32_t i = 0; i < kCreateDefaultIteration; i++) {
+ date += 6000 * i;
+ std::unique_ptr<icu::TimeZone> tz(icu::TimeZone::createDefault());
+ status = U_ZERO_ERROR;
+ tz->getOffset(date, TRUE, rawOffset, dstOffset, status);
+ status = U_ZERO_ERROR;
+ tz->getOffset(date, FALSE, rawOffset, dstOffset, status);
+ }
+ }
+}
typedef struct {
const char* text;
@@ -1301,5 +1340,4 @@ TimeZoneFormatTest::TestFormatTZDBNamesAllZoneCoverage(void) {
}
}
}
-
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/tzfmttst.h b/Build/source/libs/icu/icu-src/source/test/intltest/tzfmttst.h
index 89ece5e2e06..1335a087c2f 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/tzfmttst.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/tzfmttst.h
@@ -29,8 +29,10 @@ class TimeZoneFormatTest : public IntlTest {
void TestFormatTZDBNames(void);
void TestFormatCustomZone(void);
void TestFormatTZDBNamesAllZoneCoverage(void);
+ void TestAdoptDefaultThreadSafe(void);
void RunTimeRoundTripTests(int32_t threadNumber);
+ void RunAdoptDefaultThreadSafeTests(int32_t threadNumber);
};
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/tzregts.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/tzregts.cpp
index c5f59d9182d..5268254ba93 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/tzregts.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/tzregts.cpp
@@ -352,7 +352,7 @@ UBool
TimeZoneRegressionTest::checkCalendar314(GregorianCalendar *testCal, TimeZone *testTZ)
{
UErrorCode status = U_ZERO_ERROR;
- // GregorianCalendar testCal = (GregorianCalendar)aCal.clone();
+ // GregorianCalendar testCal = aCal.clone();
int32_t tzOffset, tzRawOffset;
float tzOffsetFloat,tzRawOffsetFloat;
@@ -922,26 +922,26 @@ void TimeZoneRegressionTest::Test4176686() {
// that does have a DST savings (which should be ignored).
UErrorCode status = U_ZERO_ERROR;
int32_t offset = 90 * 60000; // 1:30
- SimpleTimeZone* z1 = new SimpleTimeZone(offset, "_std_zone_");
- z1->setDSTSavings(45 * 60000, status); // 0:45
+ SimpleTimeZone z1(offset, "_std_zone_");
+ z1.setDSTSavings(45 * 60000, status); // 0:45
// Construct a zone that observes DST for the first 6 months.
- SimpleTimeZone* z2 = new SimpleTimeZone(offset, "_dst_zone_");
- z2->setDSTSavings(45 * 60000, status); // 0:45
- z2->setStartRule(UCAL_JANUARY, 1, 0, status);
- z2->setEndRule(UCAL_JULY, 1, 0, status);
+ SimpleTimeZone z2(offset, "_dst_zone_");
+ z2.setDSTSavings(45 * 60000, status); // 0:45
+ z2.setStartRule(UCAL_JANUARY, 1, 0, status);
+ z2.setEndRule(UCAL_JULY, 1, 0, status);
// Also check DateFormat
- DateFormat* fmt1 = new SimpleDateFormat(UnicodeString("z"), status);
+ SimpleDateFormat fmt1(UnicodeString(u"z"), status);
if (U_FAILURE(status)) {
dataerrln("Failure trying to construct: %s", u_errorName(status));
return;
}
- fmt1->setTimeZone(*z1); // Format uses standard zone
- DateFormat* fmt2 = new SimpleDateFormat(UnicodeString("z"), status);
+ fmt1.setTimeZone(z1); // Format uses standard zone
+ SimpleDateFormat fmt2(UnicodeString(u"z"), status);
if(!assertSuccess("trying to construct", status))return;
- fmt2->setTimeZone(*z2); // Format uses DST zone
- Calendar* tempcal = Calendar::createInstance(status);
+ fmt2.setTimeZone(z2); // Format uses DST zone
+ LocalPointer<Calendar> tempcal(Calendar::createInstance(status));
tempcal->clear();
tempcal->set(1970, UCAL_FEBRUARY, 1);
UDate dst = tempcal->getTime(status); // Time in DST
@@ -951,26 +951,26 @@ void TimeZoneRegressionTest::Test4176686() {
// Description, Result, Expected Result
UnicodeString a,b,c,d,e,f,g,h,i,j,k,l;
UnicodeString DATA[] = {
- "z1->getDisplayName(false, SHORT)/std zone",
- z1->getDisplayName(FALSE, TimeZone::SHORT, a), "GMT+1:30",
- "z1->getDisplayName(false, LONG)/std zone",
- z1->getDisplayName(FALSE, TimeZone::LONG, b), "GMT+01:30",
- "z1->getDisplayName(true, SHORT)/std zone",
- z1->getDisplayName(TRUE, TimeZone::SHORT, c), "GMT+1:30",
- "z1->getDisplayName(true, LONG)/std zone",
- z1->getDisplayName(TRUE, TimeZone::LONG, d ), "GMT+01:30",
- "z2->getDisplayName(false, SHORT)/dst zone",
- z2->getDisplayName(FALSE, TimeZone::SHORT, e), "GMT+1:30",
- "z2->getDisplayName(false, LONG)/dst zone",
- z2->getDisplayName(FALSE, TimeZone::LONG, f ), "GMT+01:30",
- "z2->getDisplayName(true, SHORT)/dst zone",
- z2->getDisplayName(TRUE, TimeZone::SHORT, g), "GMT+2:15",
- "z2->getDisplayName(true, LONG)/dst zone",
- z2->getDisplayName(TRUE, TimeZone::LONG, h ), "GMT+02:15",
- "DateFormat.format(std)/std zone", fmt1->format(std, i), "GMT+1:30",
- "DateFormat.format(dst)/std zone", fmt1->format(dst, j), "GMT+1:30",
- "DateFormat.format(std)/dst zone", fmt2->format(std, k), "GMT+1:30",
- "DateFormat.format(dst)/dst zone", fmt2->format(dst, l), "GMT+2:15",
+ "z1.getDisplayName(false, SHORT)/std zone",
+ z1.getDisplayName(FALSE, TimeZone::SHORT, a), "GMT+1:30",
+ "z1.getDisplayName(false, LONG)/std zone",
+ z1.getDisplayName(FALSE, TimeZone::LONG, b), "GMT+01:30",
+ "z1.getDisplayName(true, SHORT)/std zone",
+ z1.getDisplayName(TRUE, TimeZone::SHORT, c), "GMT+1:30",
+ "z1.getDisplayName(true, LONG)/std zone",
+ z1.getDisplayName(TRUE, TimeZone::LONG, d ), "GMT+01:30",
+ "z2.getDisplayName(false, SHORT)/dst zone",
+ z2.getDisplayName(FALSE, TimeZone::SHORT, e), "GMT+1:30",
+ "z2.getDisplayName(false, LONG)/dst zone",
+ z2.getDisplayName(FALSE, TimeZone::LONG, f ), "GMT+01:30",
+ "z2.getDisplayName(true, SHORT)/dst zone",
+ z2.getDisplayName(TRUE, TimeZone::SHORT, g), "GMT+2:15",
+ "z2.getDisplayName(true, LONG)/dst zone",
+ z2.getDisplayName(TRUE, TimeZone::LONG, h ), "GMT+02:15",
+ "DateFormat.format(std)/std zone", fmt1.format(std, i), "GMT+1:30",
+ "DateFormat.format(dst)/std zone", fmt1.format(dst, j), "GMT+1:30",
+ "DateFormat.format(std)/dst zone", fmt2.format(std, k), "GMT+1:30",
+ "DateFormat.format(dst)/dst zone", fmt2.format(dst, l), "GMT+2:15",
};
for (int32_t idx=0; idx<UPRV_LENGTHOF(DATA); idx+=3) {
@@ -978,11 +978,6 @@ void TimeZoneRegressionTest::Test4176686() {
errln("FAIL: " + DATA[idx] + " -> " + DATA[idx+1] + ", exp " + DATA[idx+2]);
}
}
- delete z1;
- delete z2;
- delete fmt1;
- delete fmt2;
- delete tempcal;
}
/**
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/tzrulets.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/tzrulets.cpp
index cc699bb45c4..dc644329e94 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/tzrulets.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/tzrulets.cpp
@@ -266,7 +266,7 @@ TimeZoneRuleTest::TestSimpleRuleBasedTimeZone(void) {
if (rbtz1->hasSameRules(*rbtz3)) {
errln("FAIL: rbtz1 and rbtz3 have different rules, but returned true.");
}
- RuleBasedTimeZone *rbtz1c = (RuleBasedTimeZone*)rbtz1->clone();
+ RuleBasedTimeZone *rbtz1c = rbtz1->clone();
if (!rbtz1->hasSameRules(*rbtz1c)) {
errln("FAIL: Cloned RuleBasedTimeZone must have the same rules with the original.");
}
@@ -548,7 +548,7 @@ TimeZoneRuleTest::TestHistoricalRuleBasedTimeZone(void) {
if (ny->hasSameRules(*rbtz) || rbtz->hasSameRules(*ny)) {
errln("FAIL: hasSameRules must return false");
}
- RuleBasedTimeZone *rbtzc = (RuleBasedTimeZone*)rbtz->clone();
+ RuleBasedTimeZone *rbtzc = rbtz->clone();
if (!rbtz->hasSameRules(*rbtzc) || !rbtz->hasEquivalentTransitions(*rbtzc, jan1_1950, jan1_2010, TRUE, status)) {
errln("FAIL: hasSameRules/hasEquivalentTransitions must return true for cloned RBTZs");
}
@@ -742,7 +742,7 @@ TimeZoneRuleTest::TestHasEquivalentTransitions(void) {
}
// Cloned TimeZone
- BasicTimeZone *newyork2 = (BasicTimeZone*)newyork->clone();
+ BasicTimeZone *newyork2 = newyork->clone();
if (!newyork->hasEquivalentTransitions(*newyork2, jan1_1971, jan1_2011, FALSE, status)) {
errln("FAIL: Cloned TimeZone must have the same transitions");
}
@@ -1695,7 +1695,7 @@ TimeZoneRuleTest::TestVTimeZoneCoverage(void) {
// setRawOffset
const int32_t RAW = -10*HOUR;
- VTimeZone *tmpvtz = (VTimeZone*)vtz->clone();
+ VTimeZone *tmpvtz = vtz->clone();
tmpvtz->setRawOffset(RAW);
if (tmpvtz->getRawOffset() != RAW) {
logln("setRawOffset is implemented in VTimeZone");
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/tztest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/tztest.cpp
index 3ab04d20649..a3873bcb2b4 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/tztest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/tztest.cpp
@@ -72,6 +72,7 @@ void TimeZoneTest::runIndexedTest( int32_t index, UBool exec, const char* &name,
TESTCASE_AUTO(TestGetRegion);
TESTCASE_AUTO(TestGetAvailableIDsNew);
TESTCASE_AUTO(TestGetUnknown);
+ TESTCASE_AUTO(TestGetGMT);
TESTCASE_AUTO(TestGetWindowsID);
TESTCASE_AUTO(TestGetIDForWindowsID);
TESTCASE_AUTO_END;
@@ -422,7 +423,7 @@ TimeZoneTest::TestGetAvailableIDs913()
#endif
UnicodeString str;
- UnicodeString *buf = new UnicodeString("TimeZone::createEnumeration() = { ");
+ UnicodeString buf(u"TimeZone::createEnumeration() = { ");
int32_t s_length;
StringEnumeration* s = TimeZone::createEnumeration();
if (s == NULL) {
@@ -431,11 +432,11 @@ TimeZoneTest::TestGetAvailableIDs913()
}
s_length = s->count(ec);
for (i = 0; i < s_length;++i) {
- if (i > 0) *buf += ", ";
+ if (i > 0) buf += ", ";
if ((i & 1) == 0) {
- *buf += *s->snext(ec);
+ buf += *s->snext(ec);
} else {
- *buf += UnicodeString(s->next(NULL, ec), "");
+ buf += UnicodeString(s->next(NULL, ec), "");
}
if((i % 5) == 4) {
@@ -449,8 +450,8 @@ TimeZoneTest::TestGetAvailableIDs913()
}
}
}
- *buf += " };";
- logln(*buf);
+ buf += " };";
+ logln(buf);
/* Confirm that the following zones can be retrieved: The first
* zone, the last zone, and one in-between. This tests the binary
@@ -477,31 +478,31 @@ TimeZoneTest::TestGetAvailableIDs913()
}
delete s;
- buf->truncate(0);
- *buf += "TimeZone::createEnumeration(GMT+01:00) = { ";
+ buf.truncate(0);
+ buf += "TimeZone::createEnumeration(GMT+01:00) = { ";
s = TimeZone::createEnumeration(1 * U_MILLIS_PER_HOUR);
s_length = s->count(ec);
for (i = 0; i < s_length;++i) {
- if (i > 0) *buf += ", ";
- *buf += *s->snext(ec);
+ if (i > 0) buf += ", ";
+ buf += *s->snext(ec);
}
delete s;
- *buf += " };";
- logln(*buf);
+ buf += " };";
+ logln(buf);
- buf->truncate(0);
- *buf += "TimeZone::createEnumeration(US) = { ";
+ buf.truncate(0);
+ buf += "TimeZone::createEnumeration(US) = { ";
s = TimeZone::createEnumeration("US");
s_length = s->count(ec);
for (i = 0; i < s_length;++i) {
- if (i > 0) *buf += ", ";
- *buf += *s->snext(ec);
+ if (i > 0) buf += ", ";
+ buf += *s->snext(ec);
}
- *buf += " };";
- logln(*buf);
+ buf += " };";
+ logln(buf);
TimeZone *tz = TimeZone::createTimeZone("PST");
if (tz != 0) logln("getTimeZone(PST) = " + tz->getID(str));
@@ -521,7 +522,6 @@ TimeZoneTest::TestGetAvailableIDs913()
errln("FAIL: getTimeZone(NON_EXISTENT) = " + temp);
delete tz;
- delete buf;
delete s;
}
@@ -2420,6 +2420,15 @@ void TimeZoneTest::TestGetUnknown() {
assertFalse("getUnknown() uses DST", unknown.useDaylightTime());
}
+void TimeZoneTest::TestGetGMT() {
+ const TimeZone *gmt = TimeZone::getGMT();
+ UnicodeString expectedID = UNICODE_STRING_SIMPLE("GMT");
+ UnicodeString id;
+ assertEquals("getGMT() wrong ID", expectedID, gmt->getID(id));
+ assertTrue("getGMT() wrong offset", 0 == gmt->getRawOffset());
+ assertFalse("getGMT() uses DST", gmt->useDaylightTime());
+}
+
void TimeZoneTest::TestGetWindowsID(void) {
static const struct {
const char *id;
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/tztest.h b/Build/source/libs/icu/icu-src/source/test/intltest/tztest.h
index 99a44fe5466..52feaa210a8 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/tztest.h
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/tztest.h
@@ -99,6 +99,7 @@ public:
void TestGetRegion(void);
void TestGetUnknown();
+ void TestGetGMT();
void TestGetWindowsID(void);
void TestGetIDForWindowsID(void);
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/ucharstrietest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/ucharstrietest.cpp
index 316880eb3f4..394c48b3b59 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/ucharstrietest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/ucharstrietest.cpp
@@ -71,6 +71,7 @@ public:
void checkFirst(UCharsTrie &trie, const StringAndValue data[], int32_t dataLength);
void checkNext(UCharsTrie &trie, const StringAndValue data[], int32_t dataLength);
void checkNextWithState(UCharsTrie &trie, const StringAndValue data[], int32_t dataLength);
+ void checkNextWithState64(UCharsTrie &trie, const StringAndValue data[], int32_t dataLength);
void checkNextString(UCharsTrie &trie, const StringAndValue data[], int32_t dataLength);
void checkIterator(UCharsTrie &trie, const StringAndValue data[], int32_t dataLength);
void checkIterator(UCharsTrie::Iterator &iter, const StringAndValue data[], int32_t dataLength);
@@ -762,6 +763,7 @@ void UCharsTrieTest::checkData(const StringAndValue data[], int32_t dataLength,
checkFirst(*trie, data, dataLength);
checkNext(*trie, data, dataLength);
checkNextWithState(*trie, data, dataLength);
+ checkNextWithState64(*trie, data, dataLength);
checkNextString(*trie, data, dataLength);
checkIterator(*trie, data, dataLength);
}
@@ -987,6 +989,61 @@ void UCharsTrieTest::checkNextWithState(UCharsTrie &trie,
}
}
+void UCharsTrieTest::checkNextWithState64(UCharsTrie &trie,
+ const StringAndValue data[], int32_t dataLength) {
+ assertTrue("trie(initial state).getState64()!=0", trie.getState64() != 0);
+ for(int32_t i=0; i<dataLength; ++i) {
+ UnicodeString expectedString=UnicodeString(data[i].s, -1, US_INV).unescape();
+ int32_t stringLength=expectedString.length();
+ int32_t partialLength = stringLength / 3;
+ for(int32_t j=0; j<partialLength; ++j) {
+ if(!USTRINGTRIE_MATCHES(trie.next(expectedString[j]))) {
+ errln("trie.next()=USTRINGTRIE_NO_MATCH for a prefix of %s", data[i].s);
+ return;
+ }
+ }
+ uint64_t state = trie.getState64();
+ assertTrue("trie.getState64()!=0", state != 0);
+ UStringTrieResult resultAtState=trie.current();
+ UStringTrieResult result;
+ int32_t valueAtState=-99;
+ if(USTRINGTRIE_HAS_VALUE(resultAtState)) {
+ valueAtState=trie.getValue();
+ }
+ result=trie.next(0); // mismatch
+ if(result!=USTRINGTRIE_NO_MATCH || result!=trie.current()) {
+ errln("trie.next(0) matched after part of %s", data[i].s);
+ }
+ if( resultAtState!=trie.resetToState64(state).current() ||
+ (USTRINGTRIE_HAS_VALUE(resultAtState) && valueAtState!=trie.getValue())
+ ) {
+ errln("trie.next(part of %s) changes current()/getValue() after "
+ "getState64/next(0)/resetToState64",
+ data[i].s);
+ } else if(!USTRINGTRIE_HAS_VALUE(
+ result=trie.next(expectedString.getTerminatedBuffer()+partialLength,
+ stringLength-partialLength)) ||
+ result!=trie.current()) {
+ errln("trie.next(rest of %s) does not seem to contain %s after "
+ "getState64/next(0)/resetToState64",
+ data[i].s, data[i].s);
+ } else if(!USTRINGTRIE_HAS_VALUE(
+ result=trie.resetToState64(state).
+ next(expectedString.getTerminatedBuffer()+partialLength,
+ stringLength-partialLength)) ||
+ result!=trie.current()) {
+ errln("trie does not seem to contain %s after getState64/next(rest)/resetToState64",
+ data[i].s);
+ } else if(trie.getValue()!=data[i].value) {
+ errln("trie value for %s is %ld=0x%lx instead of expected %ld=0x%lx",
+ data[i].s,
+ (long)trie.getValue(), (long)trie.getValue(),
+ (long)data[i].value, (long)data[i].value);
+ }
+ trie.reset();
+ }
+}
+
// next(string) is also tested in other functions,
// but here we try to go partway through the string, and then beyond it.
void UCharsTrieTest::checkNextString(UCharsTrie &trie,
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/uobjtest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/uobjtest.cpp
index d55ba7e5a13..3c4abb0dad0 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/uobjtest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/uobjtest.cpp
@@ -48,53 +48,53 @@
#define TESTCLASSID_NONE_DEFAULT(c) \
delete testClassNoClassID(new c, #c, "new " #c)
-#define TESTCLASSID_NONE_CTOR(c, x) { \
+#define TESTCLASSID_NONE_CTOR(c, x) UPRV_BLOCK_MACRO_BEGIN { \
delete testClassNoClassID(new c x, #c, "new " #c #x); \
if(U_FAILURE(status)) { \
dataerrln(UnicodeString(#c " - new " #x " - got err status ") + UnicodeString(u_errorName(status))); \
status = U_ZERO_ERROR; \
} \
-}
-#define TESTCLASSID_NONE_FACTORY(c, f) { \
+} UPRV_BLOCK_MACRO_END
+#define TESTCLASSID_NONE_FACTORY(c, f) UPRV_BLOCK_MACRO_BEGIN { \
delete testClassNoClassID(f, #c, #f); \
if(U_FAILURE(status)) { \
dataerrln(UnicodeString(#c " - " #f " - got err status ") + UnicodeString(u_errorName(status))); \
status = U_ZERO_ERROR; \
} \
-}
-#define TESTCLASSID_FACTORY(c, f) { \
+} UPRV_BLOCK_MACRO_END
+#define TESTCLASSID_FACTORY(c, f) UPRV_BLOCK_MACRO_BEGIN { \
delete testClass(f, #c, #f, c ::getStaticClassID()); \
if(U_FAILURE(status)) { \
dataerrln(UnicodeString(#c " - " #f " - got err status ") + UnicodeString(u_errorName(status))); \
status = U_ZERO_ERROR; \
} \
-}
-#define TESTCLASSID_TRANSLIT(c, t) { \
+} UPRV_BLOCK_MACRO_END
+#define TESTCLASSID_TRANSLIT(c, t) UPRV_BLOCK_MACRO_BEGIN { \
delete testClass(Transliterator::createInstance(UnicodeString(t), UTRANS_FORWARD,parseError,status), #c, "Transliterator: " #t, c ::getStaticClassID()); \
if(U_FAILURE(status)) { \
dataerrln(UnicodeString(#c " - Transliterator: " #t " - got err status ") + UnicodeString(u_errorName(status))); \
status = U_ZERO_ERROR; \
} \
-}
-#define TESTCLASSID_CTOR(c, x) { \
+} UPRV_BLOCK_MACRO_END
+#define TESTCLASSID_CTOR(c, x) UPRV_BLOCK_MACRO_BEGIN { \
delete testClass(new c x, #c, "new " #c #x, c ::getStaticClassID()); \
if(U_FAILURE(status)) { \
dataerrln(UnicodeString(#c " - new " #x " - got err status ") + UnicodeString(u_errorName(status))); \
status = U_ZERO_ERROR; \
} \
-}
+} UPRV_BLOCK_MACRO_END
#define TESTCLASSID_DEFAULT(c) \
delete testClass(new c, #c, "new " #c , c::getStaticClassID())
#define TESTCLASSID_ABSTRACT(c) \
testClass(NULL, #c, NULL, c::getStaticClassID())
-#define TESTCLASSID_FACTORY_HIDDEN(c, f) { \
+#define TESTCLASSID_FACTORY_HIDDEN(c, f) UPRV_BLOCK_MACRO_BEGIN { \
UObject *objVar = f; \
delete testClass(objVar, #c, #f, objVar!=NULL? objVar->getDynamicClassID(): NULL); \
if(U_FAILURE(status)) { \
dataerrln(UnicodeString(#c " - " #f " - got err status ") + UnicodeString(u_errorName(status))); \
status = U_ZERO_ERROR; \
} \
-}
+} UPRV_BLOCK_MACRO_END
#define MAX_CLASS_ID 200
@@ -495,7 +495,7 @@ void UObjectTest::testIDs()
TESTCLASSID_NONE_CTOR(AlphabeticIndex, (Locale::getEnglish(), status));
#endif
-#if UOBJTEST_DUMP_IDS
+#ifdef UOBJTEST_DUMP_IDS
int i;
for(i=0;i<ids_count;i++) {
char junk[800];
@@ -509,19 +509,15 @@ void UObjectTest::testIDs()
void UObjectTest::testUMemory() {
// additional tests for code coverage
#if U_OVERRIDE_CXX_ALLOCATION && U_HAVE_PLACEMENT_NEW
- union {
- UAlignedMemory align_;
- char bytes_[sizeof(UnicodeString)];
- } stackMemory;
- char *bytes = stackMemory.bytes_;
+ alignas(UnicodeString) char bytes[sizeof(UnicodeString)];
UnicodeString *p;
enum { len=20 };
- p=new(bytes) UnicodeString(len, (UChar32)0x20ac, len);
+ p=new(bytes) UnicodeString(len, (UChar32)U'€', len);
if((void *)p!=(void *)bytes) {
errln("placement new did not place the object at the expected address");
}
- if(p->length()!=len || p->charAt(0)!=0x20ac || p->charAt(len-1)!=0x20ac) {
+ if(p->length()!=len || p->charAt(0)!=u'€' || p->charAt(len-1)!=u'€') {
errln("constructor used with placement new did not work right");
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/usettest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/usettest.cpp
index b6f2eab6a84..b8dbae76d4d 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/usettest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/usettest.cpp
@@ -29,12 +29,18 @@
#include "cmemory.h"
#include "hash.h"
-#define TEST_ASSERT_SUCCESS(status) {if (U_FAILURE(status)) { \
- dataerrln("fail in file \"%s\", line %d: \"%s\"", __FILE__, __LINE__, \
- u_errorName(status));}}
-
-#define TEST_ASSERT(expr) {if (!(expr)) { \
- dataerrln("fail in file \"%s\", line %d", __FILE__, __LINE__); }}
+#define TEST_ASSERT_SUCCESS(status) UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(status)) { \
+ dataerrln("fail in file \"%s\", line %d: \"%s\"", __FILE__, __LINE__, \
+ u_errorName(status)); \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+#define TEST_ASSERT(expr) UPRV_BLOCK_MACRO_BEGIN { \
+ if (!(expr)) { \
+ dataerrln("fail in file \"%s\", line %d", __FILE__, __LINE__); \
+ } \
+} UPRV_BLOCK_MACRO_END
UnicodeString operator+(const UnicodeString& left, const UnicodeSet& set) {
UnicodeString pat;
@@ -358,8 +364,8 @@ UnicodeSetTest::TestCloneEqualHash(void) {
}
logln("Testing clone()");
- UnicodeSet *set1clone=(UnicodeSet*)set1->clone();
- UnicodeSet *set2clone=(UnicodeSet*)set2->clone();
+ UnicodeSet *set1clone=set1->clone();
+ UnicodeSet *set2clone=set2->clone();
if(*set1clone != *set1 || *set1clone != *set1copy || *set1clone != set1equal ||
*set2clone != *set2 || *set2clone == *set1copy || *set2clone != set2equal ||
*set2clone == *set1 || *set2clone == set1equal || *set2clone == *set1clone){
@@ -2249,7 +2255,7 @@ void UnicodeSetTest::TestFreezable() {
errln("FAIL: copying a frozen set results in a thawed one");
}
- UnicodeSet *cloned=(UnicodeSet *)frozen.clone();
+ UnicodeSet *cloned=frozen.clone();
if(!cloned->isFrozen() || *cloned!=frozen || cloned->containsSome(0xd802, 0xd805)) {
errln("FAIL: clone() failed");
}
@@ -2259,7 +2265,7 @@ void UnicodeSetTest::TestFreezable() {
}
delete cloned;
- UnicodeSet *thawed=(UnicodeSet *)frozen.cloneAsThawed();
+ UnicodeSet *thawed=frozen.cloneAsThawed();
if(thawed->isFrozen() || *thawed!=frozen || thawed->containsSome(0xd802, 0xd805)) {
errln("FAIL: cloneAsThawed() failed");
}
@@ -2892,7 +2898,7 @@ static inline USetSpanCondition invertSpanCondition(USetSpanCondition spanCondit
}
static inline int32_t slen(const void *s, UBool isUTF16) {
- return isUTF16 ? u_strlen((const UChar *)s) : strlen((const char *)s);
+ return isUTF16 ? u_strlen((const UChar *)s) : static_cast<int32_t>(strlen((const char *)s));
}
/*
@@ -3686,11 +3692,11 @@ void UnicodeSetTest::TestSpan() {
// Intermediate set: Test cloning of a frozen set.
UnicodeSet *fast=new UnicodeSet(*sets[SLOW]);
fast->freeze();
- sets[FAST]=(UnicodeSet *)fast->clone();
+ sets[FAST]=fast->clone();
delete fast;
UnicodeSet *fastNot=new UnicodeSet(*sets[SLOW_NOT]);
fastNot->freeze();
- sets[FAST_NOT]=(UnicodeSet *)fastNot->clone();
+ sets[FAST_NOT]=fastNot->clone();
delete fastNot;
for(j=0; j<SET_COUNT; ++j) {
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/ustrtest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/ustrtest.cpp
index 57d72fb3f54..b6515ea813c 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/ustrtest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/ustrtest.cpp
@@ -6,6 +6,8 @@
* others. All Rights Reserved.
********************************************************************/
+#include <utility>
+
#include "ustrtest.h"
#include "unicode/appendable.h"
#include "unicode/std_string.h"
@@ -75,7 +77,7 @@ UnicodeStringTest::TestBasicManipulation()
UnicodeString expectedValue;
UnicodeString *c;
- c=(UnicodeString *)test1.clone();
+ c=test1.clone();
test1.insert(24, "good ");
expectedValue = "Now is the time for all good men to come swiftly to the aid of the party.\n";
if (test1 != expectedValue)
@@ -1252,7 +1254,7 @@ UnicodeStringTest::TestStackAllocation()
errln("UnicodeString.setTo(readonly alias) does not alias correctly");
}
- UnicodeString *c=(UnicodeString *)test->clone();
+ UnicodeString *c=test->clone();
workingBuffer[1] = 0x109;
if(test->charAt(1) != 0x109) {
@@ -2129,6 +2131,11 @@ UnicodeStringTest::TestSizeofUnicodeString() {
}
}
+// Try to avoid clang -Wself-move warnings from s1 = std::move(s1);
+void moveFrom(UnicodeString &dest, UnicodeString &src) {
+ dest = std::move(src);
+}
+
void
UnicodeStringTest::TestMoveSwap() {
static const UChar abc[3] = { 0x61, 0x62, 0x63 }; // "abc"
@@ -2145,19 +2152,19 @@ UnicodeStringTest::TestMoveSwap() {
errln("swap(UnicodeString) did not swap back");
}
UnicodeString s4;
- s4.moveFrom(s1);
+ s4 = std::move(s1);
if(s4.getBuffer() != p || s4.length() != 100 || !s1.isBogus()) {
- errln("UnicodeString.moveFrom(heap) did not move");
+ errln("UnicodeString = std::move(heap) did not move");
}
UnicodeString s5;
- s5.moveFrom(s2);
+ s5 = std::move(s2);
if(s5 != UNICODE_STRING_SIMPLE("defg")) {
- errln("UnicodeString.moveFrom(stack) did not move");
+ errln("UnicodeString = std::move(stack) did not move");
}
UnicodeString s6;
- s6.moveFrom(s3);
+ s6 = std::move(s3);
if(s6.getBuffer() != abc || s6.length() != 3) {
- errln("UnicodeString.moveFrom(alias) did not move");
+ errln("UnicodeString = std::move(alias) did not move");
}
infoln("TestMoveSwap() with rvalue references");
s1 = static_cast<UnicodeString &&>(s6);
@@ -2172,13 +2179,13 @@ UnicodeStringTest::TestMoveSwap() {
// Move self assignment leaves the object valid but in an undefined state.
// Do it to make sure there is no crash,
// but do not check for any particular resulting value.
- s1.moveFrom(s1);
- s2.moveFrom(s2);
- s3.moveFrom(s3);
- s4.moveFrom(s4);
- s5.moveFrom(s5);
- s6.moveFrom(s6);
- s7.moveFrom(s7);
+ moveFrom(s1, s1);
+ moveFrom(s2, s2);
+ moveFrom(s3, s3);
+ moveFrom(s4, s4);
+ moveFrom(s5, s5);
+ moveFrom(s6, s6);
+ moveFrom(s7, s7);
// Simple copy assignment must work.
UnicodeString simple = UNICODE_STRING_SIMPLE("simple");
s1 = s6 = s4 = s7 = simple;
@@ -2204,7 +2211,7 @@ UnicodeStringTest::TestUInt16Pointers() {
UErrorCode errorCode = U_ZERO_ERROR;
int32_t length = UnicodeString(u"def").extract(arr, 4, errorCode);
- TEST_ASSERT_STATUS(errorCode);
+ assertSuccess(WHERE, errorCode);
assertEquals("def from extract()", UnicodeString(u"def"), UnicodeString(arr, length));
}
@@ -2226,7 +2233,7 @@ UnicodeStringTest::TestWCharPointers() {
UErrorCode errorCode = U_ZERO_ERROR;
int32_t length = UnicodeString(u"def").extract(arr, 4, errorCode);
- TEST_ASSERT_STATUS(errorCode);
+ assertSuccess(WHERE, errorCode);
assertEquals("def from extract()", UnicodeString(u"def"), UnicodeString(arr, length));
#endif
}
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/utxttest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/utxttest.cpp
index 2a779b21213..09e7b602aa6 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/utxttest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/utxttest.cpp
@@ -29,17 +29,21 @@ static int gTestNum = 0;
// Forward decl
UText *openFragmentedUnicodeString(UText *ut, UnicodeString *s, UErrorCode *status);
-#define TEST_ASSERT(x) \
-{ if ((x)==FALSE) {errln("Test #%d failure in file %s at line %d\n", gTestNum, __FILE__, __LINE__);\
- gFailed = TRUE;\
- }}
-
-
-#define TEST_SUCCESS(status) \
-{ if (U_FAILURE(status)) {errln("Test #%d failure in file %s at line %d. Error = \"%s\"\n", \
- gTestNum, __FILE__, __LINE__, u_errorName(status)); \
- gFailed = TRUE;\
- }}
+#define TEST_ASSERT(x) UPRV_BLOCK_MACRO_BEGIN { \
+ if ((x)==FALSE) { \
+ errln("Test #%d failure in file %s at line %d\n", gTestNum, __FILE__, __LINE__); \
+ gFailed = TRUE; \
+ } \
+} UPRV_BLOCK_MACRO_END
+
+
+#define TEST_SUCCESS(status) UPRV_BLOCK_MACRO_BEGIN { \
+ if (U_FAILURE(status)) { \
+ errln("Test #%d failure in file %s at line %d. Error = \"%s\"\n", \
+ gTestNum, __FILE__, __LINE__, u_errorName(status)); \
+ gFailed = TRUE; \
+ } \
+} UPRV_BLOCK_MACRO_END
UTextTest::UTextTest() {
}
@@ -266,7 +270,7 @@ void UTextTest::TestString(const UnicodeString &s) {
i = 0; // native utf-8 index
for (j=0; j<cpCount ; j++) { // code point number
u8Map[j].nativeIdx = i;
- U8_NEXT(u8String, i, u8Len, c)
+ U8_NEXT(u8String, i, u8Len, c);
u8Map[j].cp = c;
}
u8Map[cpCount].nativeIdx = u8Len; // position following the last char in utf-8 string.
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/uvectest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/uvectest.cpp
index 4b73b566ad3..3829ba2668d 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/uvectest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/uvectest.cpp
@@ -57,16 +57,18 @@ void UVectorTest::runIndexedTest( int32_t index, UBool exec, const char* &name,
// Error Checking / Reporting macros used in all of the tests.
//
//---------------------------------------------------------------------------
-#define TEST_CHECK_STATUS(status) \
+#define TEST_CHECK_STATUS(status) UPRV_BLOCK_MACRO_BEGIN {\
if (U_FAILURE(status)) {\
errln("UVectorTest failure at line %d. status=%s\n", __LINE__, u_errorName(status));\
return;\
- }
+ }\
+} UPRV_BLOCK_MACRO_END
-#define TEST_ASSERT(expr) \
+#define TEST_ASSERT(expr) UPRV_BLOCK_MACRO_BEGIN {\
if ((expr)==FALSE) {\
errln("UVectorTest failure at line %d.\n", __LINE__);\
- }
+ }\
+} UPRV_BLOCK_MACRO_END
static int8_t U_CALLCONV
UVectorTest_compareInt32(UElement key1, UElement key2) {
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/v32test.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/v32test.cpp
index 85567c0828a..5380bcc0dfe 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/v32test.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/v32test.cpp
@@ -57,16 +57,18 @@ void UVector32Test::runIndexedTest( int32_t index, UBool exec, const char* &name
// Error Checking / Reporting macros used in all of the tests.
//
//---------------------------------------------------------------------------
-#define TEST_CHECK_STATUS(status) \
+#define TEST_CHECK_STATUS(status) UPRV_BLOCK_MACRO_BEGIN {\
if (U_FAILURE(status)) {\
errln("UVector32Test failure at line %d. status=%s\n", __LINE__, u_errorName(status));\
return;\
- }
+ }\
+} UPRV_BLOCK_MACRO_END
-#define TEST_ASSERT(expr) \
+#define TEST_ASSERT(expr) UPRV_BLOCK_MACRO_BEGIN {\
if ((expr)==FALSE) {\
errln("UVector32Test failure at line %d.\n", __LINE__);\
- }
+ }\
+} UPRV_BLOCK_MACRO_END
//---------------------------------------------------------------------------
//
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/windttst.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/windttst.cpp
index 97c98d69e7e..92d6f6721e7 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/windttst.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/windttst.cpp
@@ -116,6 +116,7 @@ void Win32DateTimeTest::testLocales(DateFormatTest *log)
for(int i = 0; i < lcidCount; i += 1) {
UErrorCode status = U_ZERO_ERROR;
WCHAR longDateFormat[81], longTimeFormat[81], wdBuffer[256], wtBuffer[256];
+ DWORD value = 0;
int32_t calType = 0;
// NULL localeID means ICU didn't recognize this locale
@@ -140,8 +141,9 @@ void Win32DateTimeTest::testLocales(DateFormatTest *log)
GetLocaleInfoW(lcidRecords[i].lcid, LOCALE_SLONGDATE, longDateFormat, 81);
GetLocaleInfoW(lcidRecords[i].lcid, LOCALE_STIMEFORMAT, longTimeFormat, 81);
- GetLocaleInfoW(lcidRecords[i].lcid, LOCALE_RETURN_NUMBER|LOCALE_ICALENDARTYPE, (LPWSTR) calType, sizeof(int32_t));
+ GetLocaleInfoW(lcidRecords[i].lcid, LOCALE_RETURN_NUMBER|LOCALE_ICALENDARTYPE, (LPWSTR)&value, sizeof(value)/sizeof(WCHAR));
+ calType = value;
char localeID[64];
uprv_strcpy(localeID, lcidRecords[i].localeID);
diff --git a/Build/source/libs/icu/icu-src/source/test/iotest/filetst.c b/Build/source/libs/icu/icu-src/source/test/iotest/filetst.c
index 1c667e174e1..e074b9020d8 100644
--- a/Build/source/libs/icu/icu-src/source/test/iotest/filetst.c
+++ b/Build/source/libs/icu/icu-src/source/test/iotest/filetst.c
@@ -1120,7 +1120,7 @@ static void TestFilePrintCompatibility(void) {
}
#endif
-#define TestFPrintFormat(uFormat, uValue, cFormat, cValue) \
+#define TestFPrintFormat(uFormat, uValue, cFormat, cValue) UPRV_BLOCK_MACRO_BEGIN { \
myFile = u_fopen(STANDARD_TEST_FILE, "w", STANDARD_TEST_LOCALE, NULL);\
if (myFile == NULL) {\
log_err("Can't write test file for %s.\n", uFormat);\
@@ -1146,6 +1146,7 @@ static void TestFilePrintCompatibility(void) {
if (buffer[uNumPrinted+1] != '*') {\
log_err("%" uFormat " too much stored\n");\
}\
+} UPRV_BLOCK_MACRO_END
#if !UCONFIG_NO_FORMATTING
static void TestFprintfFormat(void) {
@@ -1381,6 +1382,7 @@ static void TestFScanset(void) {
#endif
#if !UCONFIG_NO_FORMATTING
static void TestBadFScanfFormat(const char *format, const UChar *uValue, const char *cValue) {
+ (void)cValue; // suppress compiler warnings about unused variable
UFILE *myFile;
UChar uBuffer[256];
int32_t uNumScanned;
diff --git a/Build/source/libs/icu/icu-src/source/test/iotest/iotest.vcxproj b/Build/source/libs/icu/icu-src/source/test/iotest/iotest.vcxproj
index f67c0b19a48..4de454058b2 100644
--- a/Build/source/libs/icu/icu-src/source/test/iotest/iotest.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/iotest/iotest.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{E4993E82-D68A-46CA-BAE0-9D35E172E46F}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -34,123 +33,55 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
- <!-- Options that are common to *all* project configurations -->
+ <!-- Options that are common to *all* configurations -->
<ItemDefinitionGroup>
+ <Midl>
+ <TypeLibraryName>$(OutDir)\iotest.tlb</TypeLibraryName>
+ </Midl>
<ClCompile>
<AdditionalIncludeDirectories>..\..\..\include;..\..\tools\ctestfw;..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<DisableLanguageExtensions>true</DisableLanguageExtensions>
<WarningLevel>Level3</WarningLevel>
- </ClCompile>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Midl>
- <TypeLibraryName>.\x86\Debug/iotest.tlb</TypeLibraryName>
- <HeaderFileName>
- </HeaderFileName>
- </Midl>
- <ClCompile>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <PrecompiledHeaderOutputFile>.\x86\Debug/iotest.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- </ClCompile>
- <Link>
- <OutputFile>.\x86\Debug/iotest.exe</OutputFile>
- <AdditionalDependencies>icuucd.lib;icuind.lib;icuiod.lib;icutestd.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x86\Debug/iotest.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Midl>
- <TypeLibraryName>.\x86\Release/iotest.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x86\Release/iotest.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
<CompileAs>Default</CompileAs>
+ <PrecompiledHeaderOutputFile>$(OutDir)\iotest.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)\iotest.pdb</ProgramDataBaseFileName>
</ClCompile>
<Link>
- <OutputFile>.\x86\Release/iotest.exe</OutputFile>
- <AdditionalDependencies>icuuc.lib;icuin.lib;icuio.lib;icutest.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x86\Release/iotest.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <OutputFile>$(OutDir)\iotest.exe</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Midl>
- <TypeLibraryName>.\x64\Debug/iotest.tlb</TypeLibraryName>
- <HeaderFileName>
- </HeaderFileName>
- </Midl>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x64\Debug/iotest.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
<BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
<Link>
- <OutputFile>.\x64\Debug/iotest.exe</OutputFile>
<AdditionalDependencies>icuucd.lib;icuind.lib;icuiod.lib;icutestd.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x64\Debug/iotest.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Midl>
- <TypeLibraryName>.\x64\Release/iotest.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x64\Release/iotest.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- <CompileAs>Default</CompileAs>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
</ClCompile>
<Link>
- <OutputFile>.\x64\Release/iotest.exe</OutputFile>
<AdditionalDependencies>icuuc.lib;icuin.lib;icuio.lib;icutest.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x64\Release/iotest.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/test/iotest/strtst.c b/Build/source/libs/icu/icu-src/source/test/iotest/strtst.c
index ce38aff1411..ee67b4c3ab1 100644
--- a/Build/source/libs/icu/icu-src/source/test/iotest/strtst.c
+++ b/Build/source/libs/icu/icu-src/source/test/iotest/strtst.c
@@ -313,7 +313,7 @@ static void TestLocalizedString(void) {
}
#if !UCONFIG_NO_FORMATTING
-#define Test_u_snprintf(limit, format, value, expectedSize, expectedStr) \
+#define Test_u_snprintf(limit, format, value, expectedSize, expectedStr) UPRV_BLOCK_MACRO_BEGIN { \
u_uastrncpy(testStr, "xxxxxxxxxxxxxx", UPRV_LENGTHOF(testStr));\
size = u_snprintf(testStr, limit, format, value);\
u_austrncpy(cTestResult, testStr, UPRV_LENGTHOF(cTestResult));\
@@ -324,6 +324,7 @@ static void TestLocalizedString(void) {
else {\
log_verbose("Got: %s\n", cTestResult);\
}\
+} UPRV_BLOCK_MACRO_END
#endif
@@ -358,7 +359,7 @@ static void TestSnprintf(void) {
#endif
}
-#define TestSPrintFormat(uFormat, uValue, cFormat, cValue) \
+#define TestSPrintFormat(uFormat, uValue, cFormat, cValue) UPRV_BLOCK_MACRO_BEGIN { \
/* Reinitialize the buffer to verify null termination works. */\
u_memset(uBuffer, 0x2a, UPRV_LENGTHOF(uBuffer));\
memset(buffer, '*', UPRV_LENGTHOF(buffer));\
@@ -375,6 +376,7 @@ static void TestSnprintf(void) {
if (buffer[uNumPrinted+1] != '*') {\
log_err("%" uFormat " too much stored\n");\
}\
+} UPRV_BLOCK_MACRO_END
static void TestSprintfFormat(void) {
#if !UCONFIG_NO_FORMATTING
@@ -687,6 +689,7 @@ static void TestSScanset(void) {
static void TestBadSScanfFormat(const char *format, const UChar *uValue, const char *cValue) {
#if !UCONFIG_NO_FORMATTING
+ (void)cValue; // suppress compiler warnings about unused variable
UChar uBuffer[256];
int32_t uNumScanned;
diff --git a/Build/source/libs/icu/icu-src/source/test/letest/gendata.vcxproj b/Build/source/libs/icu/icu-src/source/test/letest/gendata.vcxproj
index 0e564b930b5..5a0b943d64b 100644
--- a/Build/source/libs/icu/icu-src/source/test/letest/gendata.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/letest/gendata.vcxproj
@@ -114,7 +114,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/gendata.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -153,7 +152,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/gendata.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
@@ -191,7 +189,6 @@
<SuppressStartupBanner>true</SuppressStartupBanner>
<ProgramDatabaseFile>.\x86\Release/gendata.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -229,7 +226,6 @@
<SuppressStartupBanner>true</SuppressStartupBanner>
<ProgramDatabaseFile>.\x64\Release/gendata.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
diff --git a/Build/source/libs/icu/icu-src/source/test/letest/letest.cpp b/Build/source/libs/icu/icu-src/source/test/letest/letest.cpp
index bb94a098ca6..35c326f7e3f 100644
--- a/Build/source/libs/icu/icu-src/source/test/letest/letest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/letest/letest.cpp
@@ -244,7 +244,7 @@ static void U_CALLCONV AccessTest(void)
SimpleFontInstance *font = new SimpleFontInstance(12, status);
LayoutEngine *engine = LayoutEngine::layoutEngineFactory(font, arabScriptCode, -1, status);
le_int32 glyphCount;
- LEGlyphID glyphs[6], extraBitGlyphs[6];;
+ LEGlyphID glyphs[6], extraBitGlyphs[6];
le_int32 biasedIndices[6], indices[6], glyph;
float positions[6 * 2 + 2];
LEUnicode chars[] = {
diff --git a/Build/source/libs/icu/icu-src/source/test/letest/letest.vcxproj b/Build/source/libs/icu/icu-src/source/test/letest/letest.vcxproj
index 0a83aacc285..e2a5499b383 100644
--- a/Build/source/libs/icu/icu-src/source/test/letest/letest.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/letest/letest.vcxproj
@@ -114,7 +114,6 @@
<AdditionalLibraryDirectories>.\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/letest.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -154,7 +153,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/letest.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
diff --git a/Build/source/libs/icu/icu-src/source/test/perf/DateFmtPerf/DateFmtPerf.vcxproj b/Build/source/libs/icu/icu-src/source/test/perf/DateFmtPerf/DateFmtPerf.vcxproj
index 5903da25b5b..c03f3960035 100644
--- a/Build/source/libs/icu/icu-src/source/test/perf/DateFmtPerf/DateFmtPerf.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/perf/DateFmtPerf/DateFmtPerf.vcxproj
@@ -16,16 +16,16 @@
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -95,7 +95,6 @@
</EnableCOMDATFolding>
<LinkTimeCodeGeneration>
</LinkTimeCodeGeneration>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
diff --git a/Build/source/libs/icu/icu-src/source/test/perf/charperf/charperf.vcxproj b/Build/source/libs/icu/icu-src/source/test/perf/charperf/charperf.vcxproj
index 49887c8dbef..1128037fb7c 100644
--- a/Build/source/libs/icu/icu-src/source/test/perf/charperf/charperf.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/perf/charperf/charperf.vcxproj
@@ -22,29 +22,27 @@
<ProjectGuid>{D850A4B6-7D94-476E-9392-E9272DA4EAAF}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -117,7 +115,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/charperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -159,7 +156,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/charperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
@@ -200,7 +196,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/charperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
@@ -242,7 +237,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/charperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
diff --git a/Build/source/libs/icu/icu-src/source/test/perf/collationperf/collperf.cpp b/Build/source/libs/icu/icu-src/source/test/perf/collationperf/collperf.cpp
index fe334a2c19e..33e3e6c696d 100644
--- a/Build/source/libs/icu/icu-src/source/test/perf/collationperf/collperf.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/perf/collationperf/collperf.cpp
@@ -374,7 +374,6 @@ void doKeyGen()
int line;
int loops = 0;
int iLoop;
- int t;
int len=-1;
// Adjust loop count to compensate for file size. Should be order n
@@ -392,9 +391,9 @@ void doKeyGen()
len = gFileLines[line].len;
}
for (iLoop=0; iLoop < opt_iLoopCount; iLoop++) {
- t=LCMapStringW(gWinLCID, LCMAP_SORTKEY,
+ LCMapStringW(gWinLCID, LCMAP_SORTKEY,
gFileLines[line].name, len,
- (unsigned short *)gFileLines[line].winSortKey, 5000); // TODO something with length.
+ (UChar *)gFileLines[line].winSortKey, 5000); // TODO something with length.
}
}
}
@@ -407,7 +406,7 @@ void doKeyGen()
len = gFileLines[line].len;
}
for (iLoop=0; iLoop < opt_iLoopCount; iLoop++) {
- t = ucol_getSortKey(gCol, gFileLines[line].name, len, (unsigned char *)gFileLines[line].icuSortKey, 5000);
+ ucol_getSortKey(gCol, gFileLines[line].name, len, (unsigned char *)gFileLines[line].icuSortKey, 5000);
}
}
}
@@ -417,7 +416,7 @@ void doKeyGen()
for (loops=0; loops<adj_loopCount; loops++) {
for (line=0; line < gNumFileLines; line++) {
for (iLoop=0; iLoop < opt_iLoopCount; iLoop++) {
- t = strxfrm(gFileLines[line].unixSortKey, gFileLines[line].unixName, 5000);
+ strxfrm(gFileLines[line].unixSortKey, gFileLines[line].unixName, 5000);
}
}
}
@@ -1637,7 +1636,7 @@ int main(int argc, const char** argv) {
t=LCMapStringW(gWinLCID, LCMAP_SORTKEY, gFileLines[line].name, -1, buf, sizeof(buf));
gFileLines[line].winSortKey = new char[t];
if (t > (int32_t)sizeof(buf)) {
- t = LCMapStringW(gWinLCID, LCMAP_SORTKEY, gFileLines[line].name, -1, (unsigned short *)(gFileLines[line].winSortKey), t);
+ t = LCMapStringW(gWinLCID, LCMAP_SORTKEY, gFileLines[line].name, -1, (UChar *)(gFileLines[line].winSortKey), t);
}
else
{
diff --git a/Build/source/libs/icu/icu-src/source/test/perf/collperf/collperf.vcxproj b/Build/source/libs/icu/icu-src/source/test/perf/collperf/collperf.vcxproj
index b296c24f069..807894d60fe 100644
--- a/Build/source/libs/icu/icu-src/source/test/perf/collperf/collperf.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/perf/collperf/collperf.vcxproj
@@ -22,29 +22,27 @@
<ProjectGuid>{01807B4A-E3B5-4B97-A7F3-207746DCD71E}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -115,7 +113,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/collperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -155,7 +152,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/collperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
@@ -194,7 +190,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/collperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
@@ -234,7 +229,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib64\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/collperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
diff --git a/Build/source/libs/icu/icu-src/source/test/perf/collperf2/collperf2.vcxproj b/Build/source/libs/icu/icu-src/source/test/perf/collperf2/collperf2.vcxproj
index 9dbd58c5c5b..cb6cb110750 100644
--- a/Build/source/libs/icu/icu-src/source/test/perf/collperf2/collperf2.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/perf/collperf2/collperf2.vcxproj
@@ -22,29 +22,27 @@
<ProjectGuid>{6FE64E07-4C7D-4EFD-959D-A440F9DF8476}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -115,7 +113,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/collperf2.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -155,7 +152,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/collperf2.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
@@ -194,7 +190,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/collperf2.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
@@ -234,7 +229,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib64\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/collperf2.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
diff --git a/Build/source/libs/icu/icu-src/source/test/perf/convperf/convperf.cpp b/Build/source/libs/icu/icu-src/source/test/perf/convperf/convperf.cpp
index 69e4d1132b3..d5437487346 100644
--- a/Build/source/libs/icu/icu-src/source/test/perf/convperf/convperf.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/perf/convperf/convperf.cpp
@@ -144,7 +144,7 @@ UPerfFunction* ConverterPerformanceTest::TestICU_OpenAllConverters() {
UPerfFunction* ConverterPerformanceTest::TestICU_UTF8_FromUnicode(){
UErrorCode status = U_ZERO_ERROR;
- ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("utf-8",utf8_uniSource, UPRV_LENGTHOF(utf8_uniSource), status);
+ ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("utf-8", (UChar *)utf8_uniSource, UPRV_LENGTHOF(utf8_uniSource), status);
if(U_FAILURE(status)){
return NULL;
}
@@ -201,7 +201,7 @@ UPerfFunction* ConverterPerformanceTest::TestWinANSI_UTF8_ToUnicode(){
UPerfFunction* ConverterPerformanceTest::TestICU_Latin1_FromUnicode(){
UErrorCode status = U_ZERO_ERROR;
- ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("iso-8859-1",latin1_uniSource, UPRV_LENGTHOF(latin1_uniSource), status);
+ ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("iso-8859-1", (UChar *)latin1_uniSource, UPRV_LENGTHOF(latin1_uniSource), status);
if(U_FAILURE(status)){
return NULL;
}
@@ -258,7 +258,7 @@ UPerfFunction* ConverterPerformanceTest::TestWinANSI_Latin1_ToUnicode(){
UPerfFunction* ConverterPerformanceTest::TestICU_Latin8_FromUnicode(){
UErrorCode status = U_ZERO_ERROR;
- ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("iso-8859-8",latin8_uniSource, UPRV_LENGTHOF(latin8_uniSource), status);
+ ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("iso-8859-8", (UChar *)latin8_uniSource, UPRV_LENGTHOF(latin8_uniSource), status);
if(U_FAILURE(status)){
return NULL;
}
@@ -315,7 +315,7 @@ UPerfFunction* ConverterPerformanceTest::TestWinANSI_Latin8_ToUnicode(){
UPerfFunction* ConverterPerformanceTest::TestICU_EBCDIC_Arabic_FromUnicode(){
UErrorCode status = U_ZERO_ERROR;
- ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("x-EBCDIC-Arabic",ebcdic_arabic_uniSource, UPRV_LENGTHOF(ebcdic_arabic_uniSource), status);
+ ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("x-EBCDIC-Arabic", (UChar *)ebcdic_arabic_uniSource, UPRV_LENGTHOF(ebcdic_arabic_uniSource), status);
if(U_FAILURE(status)){
return NULL;
}
@@ -372,7 +372,7 @@ UPerfFunction* ConverterPerformanceTest::TestWinANSI_EBCDIC_Arabic_ToUnicode(){
UPerfFunction* ConverterPerformanceTest::TestICU_SJIS_FromUnicode(){
UErrorCode status = U_ZERO_ERROR;
- ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("sjis",sjis_uniSource, UPRV_LENGTHOF(sjis_uniSource), status);
+ ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("sjis", (UChar *)sjis_uniSource, UPRV_LENGTHOF(sjis_uniSource), status);
if(U_FAILURE(status)){
return NULL;
}
@@ -431,7 +431,7 @@ UPerfFunction* ConverterPerformanceTest::TestWinANSI_SJIS_ToUnicode(){
UPerfFunction* ConverterPerformanceTest::TestICU_EUCJP_FromUnicode(){
UErrorCode status = U_ZERO_ERROR;
- ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("euc-jp",eucjp_uniSource, UPRV_LENGTHOF(eucjp_uniSource), status);
+ ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("euc-jp", (UChar *)eucjp_uniSource, UPRV_LENGTHOF(eucjp_uniSource), status);
if(U_FAILURE(status)){
return NULL;
}
@@ -490,7 +490,7 @@ UPerfFunction* ConverterPerformanceTest::TestWinANSI_EUCJP_ToUnicode(){
UPerfFunction* ConverterPerformanceTest::TestICU_GB2312_FromUnicode(){
UErrorCode status = U_ZERO_ERROR;
- ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("gb2312",gb2312_uniSource, UPRV_LENGTHOF(gb2312_uniSource), status);
+ ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("gb2312", (UChar *)gb2312_uniSource, UPRV_LENGTHOF(gb2312_uniSource), status);
if(U_FAILURE(status)){
return NULL;
}
@@ -548,7 +548,7 @@ UPerfFunction* ConverterPerformanceTest::TestWinANSI_GB2312_ToUnicode(){
UPerfFunction* ConverterPerformanceTest::TestICU_ISO2022KR_FromUnicode(){
UErrorCode status = U_ZERO_ERROR;
- ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("iso-2022-kr",iso2022kr_uniSource, UPRV_LENGTHOF(iso2022kr_uniSource), status);
+ ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("iso-2022-kr", (UChar *)iso2022kr_uniSource, UPRV_LENGTHOF(iso2022kr_uniSource), status);
if(U_FAILURE(status)){
return NULL;
}
@@ -605,7 +605,7 @@ UPerfFunction* ConverterPerformanceTest::TestWinANSI_ISO2022KR_ToUnicode(){
UPerfFunction* ConverterPerformanceTest::TestICU_ISO2022JP_FromUnicode(){
UErrorCode status = U_ZERO_ERROR;
- ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("iso-2022-jp",iso2022jp_uniSource, UPRV_LENGTHOF(iso2022jp_uniSource), status);
+ ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("iso-2022-jp", (UChar *)iso2022jp_uniSource, UPRV_LENGTHOF(iso2022jp_uniSource), status);
if(U_FAILURE(status)){
return NULL;
}
diff --git a/Build/source/libs/icu/icu-src/source/test/perf/convperf/convperf.vcxproj b/Build/source/libs/icu/icu-src/source/test/perf/convperf/convperf.vcxproj
index 60a5edf8e29..41bdd92f7e2 100644
--- a/Build/source/libs/icu/icu-src/source/test/perf/convperf/convperf.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/perf/convperf/convperf.vcxproj
@@ -22,29 +22,27 @@
<ProjectGuid>{B4C03939-D417-41F0-85B4-848ECF105E3A}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -116,7 +114,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/convperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
@@ -158,7 +155,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib64\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/convperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
@@ -200,7 +196,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/convperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -242,7 +237,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/convperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
diff --git a/Build/source/libs/icu/icu-src/source/test/perf/normperf/dtfmtrtperf.vcxproj b/Build/source/libs/icu/icu-src/source/test/perf/normperf/dtfmtrtperf.vcxproj
index d97e0503aec..689ce0693a4 100644
--- a/Build/source/libs/icu/icu-src/source/test/perf/normperf/dtfmtrtperf.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/perf/normperf/dtfmtrtperf.vcxproj
@@ -118,7 +118,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/dtfmtrtperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -158,7 +157,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/normperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
@@ -201,7 +199,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/normperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
@@ -243,7 +240,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib64\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/normperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
diff --git a/Build/source/libs/icu/icu-src/source/test/perf/normperf/normperf.h b/Build/source/libs/icu/icu-src/source/test/perf/normperf/normperf.h
index 0913fb39a41..c05715442d3 100644
--- a/Build/source/libs/icu/icu-src/source/test/perf/normperf/normperf.h
+++ b/Build/source/libs/icu/icu-src/source/test/perf/normperf/normperf.h
@@ -322,18 +322,18 @@ int32_t ICUIsNormalized(const UChar* src,int32_t srcLen, UNormalizationMode mode
#if U_PLATFORM_HAS_WIN32_API
int32_t WinNormNFD(const UChar* src, int32_t srcLen, UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
- return FoldStringW(MAP_COMPOSITE,src,srcLen,dest,dstLen);
+ return FoldStringW(MAP_COMPOSITE, toOldUCharPtr(src),srcLen, toOldUCharPtr(dest),dstLen);
}
int32_t WinNormNFC(const UChar* src, int32_t srcLen, UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
- return FoldStringW(MAP_PRECOMPOSED,src,srcLen,dest,dstLen);
+ return FoldStringW(MAP_PRECOMPOSED, toOldUCharPtr(src),srcLen, toOldUCharPtr(dest),dstLen);
}
int32_t WinNormNFKD(const UChar* src, int32_t srcLen, UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
- return FoldStringW(MAP_COMPOSITE+MAP_FOLDCZONE,src,srcLen,dest,dstLen);
+ return FoldStringW(MAP_COMPOSITE+MAP_FOLDCZONE, toOldUCharPtr(src),srcLen, toOldUCharPtr(dest),dstLen);
}
int32_t WinNormNFKC(const UChar* src, int32_t srcLen, UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
- return FoldStringW(MAP_FOLDCZONE,src,srcLen,dest,dstLen);
+ return FoldStringW(MAP_FOLDCZONE, toOldUCharPtr(src),srcLen, toOldUCharPtr(dest),dstLen);
}
#else
int32_t WinNormNFD(const UChar* src, int32_t srcLen, UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
diff --git a/Build/source/libs/icu/icu-src/source/test/perf/normperf/normperf.vcxproj b/Build/source/libs/icu/icu-src/source/test/perf/normperf/normperf.vcxproj
index f059869f0e5..62c9aad1d42 100644
--- a/Build/source/libs/icu/icu-src/source/test/perf/normperf/normperf.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/perf/normperf/normperf.vcxproj
@@ -22,29 +22,27 @@
<ProjectGuid>{56CCC661-8D33-4F0A-B62F-C619CE843C68}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -117,7 +115,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/normperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -159,7 +156,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/normperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
@@ -200,7 +196,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/normperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
@@ -242,7 +237,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib64\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/normperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
diff --git a/Build/source/libs/icu/icu-src/source/test/perf/strsrchperf/strsrchperf.vcxproj b/Build/source/libs/icu/icu-src/source/test/perf/strsrchperf/strsrchperf.vcxproj
index 3f71269d75b..89f2ccdbc9c 100644
--- a/Build/source/libs/icu/icu-src/source/test/perf/strsrchperf/strsrchperf.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/perf/strsrchperf/strsrchperf.vcxproj
@@ -22,29 +22,27 @@
<ProjectGuid>{241DED26-1635-45E6-9564-7742AC8043B5}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -117,7 +115,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/strsrchperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -159,7 +156,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/strsrchperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
@@ -200,7 +196,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/strsrchperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
@@ -242,7 +237,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib64\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/strsrchperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
diff --git a/Build/source/libs/icu/icu-src/source/test/perf/ubrkperf/ubrkperf.vcxproj b/Build/source/libs/icu/icu-src/source/test/perf/ubrkperf/ubrkperf.vcxproj
index 343b7ebc94e..f38d9b4d503 100644
--- a/Build/source/libs/icu/icu-src/source/test/perf/ubrkperf/ubrkperf.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/perf/ubrkperf/ubrkperf.vcxproj
@@ -22,29 +22,27 @@
<ProjectGuid>{7E280294-49BD-43D1-9903-CF29648D88CA}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -115,7 +113,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/ubrkperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -153,7 +150,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/ubrkperf24.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
@@ -194,7 +190,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/ubrkperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
@@ -234,7 +229,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib64\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/ubrkperf24.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
diff --git a/Build/source/libs/icu/icu-src/source/test/perf/ucnvavailperf/ucnvavailperf.vcxproj b/Build/source/libs/icu/icu-src/source/test/perf/ucnvavailperf/ucnvavailperf.vcxproj
index 8005fbca537..83ee363b840 100644
--- a/Build/source/libs/icu/icu-src/source/test/perf/ucnvavailperf/ucnvavailperf.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/perf/ucnvavailperf/ucnvavailperf.vcxproj
@@ -16,16 +16,16 @@
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
diff --git a/Build/source/libs/icu/icu-src/source/test/perf/unisetperf/unisetperf.vcxproj b/Build/source/libs/icu/icu-src/source/test/perf/unisetperf/unisetperf.vcxproj
index 212cfba4863..7e689014152 100644
--- a/Build/source/libs/icu/icu-src/source/test/perf/unisetperf/unisetperf.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/perf/unisetperf/unisetperf.vcxproj
@@ -22,29 +22,27 @@
<ProjectGuid>{E7728E98-0469-AF37-43F4-4529A3D52C6B}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -114,7 +112,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/unisetperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
@@ -154,7 +151,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/unisetperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
@@ -193,7 +189,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/unisetperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
@@ -233,7 +228,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib64\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/unisetperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
diff --git a/Build/source/libs/icu/icu-src/source/test/perf/usetperf/usetperf.vcxproj b/Build/source/libs/icu/icu-src/source/test/perf/usetperf/usetperf.vcxproj
index 1c9dce34a55..801b8a80742 100644
--- a/Build/source/libs/icu/icu-src/source/test/perf/usetperf/usetperf.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/perf/usetperf/usetperf.vcxproj
@@ -22,29 +22,27 @@
<ProjectGuid>{EC5DF28A-D789-4C46-A55D-0AD55B50ECE8}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -114,7 +112,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/usetperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
@@ -154,7 +151,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/usetperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
@@ -193,7 +189,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/usetperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -232,7 +227,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/usetperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
diff --git a/Build/source/libs/icu/icu-src/source/test/perf/ustrperf/stringperf.vcxproj b/Build/source/libs/icu/icu-src/source/test/perf/ustrperf/stringperf.vcxproj
index 59a556eeead..a6b4e5cbd7f 100644
--- a/Build/source/libs/icu/icu-src/source/test/perf/ustrperf/stringperf.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/perf/ustrperf/stringperf.vcxproj
@@ -22,29 +22,27 @@
<ProjectGuid>{523710EA-349D-45BF-8B39-289CC86E7D91}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -116,7 +114,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/stringperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
@@ -158,7 +155,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib64\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/stringperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
@@ -200,7 +196,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/stringperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -242,7 +237,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/stringperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
diff --git a/Build/source/libs/icu/icu-src/source/test/perf/utfperf/utfperf.vcxproj b/Build/source/libs/icu/icu-src/source/test/perf/utfperf/utfperf.vcxproj
index db8a15c3534..0d0eef71fcc 100644
--- a/Build/source/libs/icu/icu-src/source/test/perf/utfperf/utfperf.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/perf/utfperf/utfperf.vcxproj
@@ -22,29 +22,27 @@
<ProjectGuid>{E7728E98-0469-43F4-AF37-4529A3D52C6B}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -114,7 +112,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/utfperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -153,7 +150,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/utfperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
@@ -192,7 +188,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/utfperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
@@ -232,7 +227,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib64\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/utfperf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
diff --git a/Build/source/libs/icu/icu-src/source/test/perf/utrie2perf/utrie2perf.vcxproj b/Build/source/libs/icu/icu-src/source/test/perf/utrie2perf/utrie2perf.vcxproj
index fa6c969344d..bca5958b8bb 100644
--- a/Build/source/libs/icu/icu-src/source/test/perf/utrie2perf/utrie2perf.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/test/perf/utrie2perf/utrie2perf.vcxproj
@@ -22,29 +22,27 @@
<ProjectGuid>{B9458CB3-9B09-402A-8C4C-43B6D0EA9691}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -114,7 +112,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/utrie2perf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
@@ -153,7 +150,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x64\Debug/utrie2perf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
@@ -192,7 +188,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x86\Release/utrie2perf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
@@ -232,7 +227,6 @@
<AdditionalLibraryDirectories>..\..\..\..\lib64\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\x64\Release/utrie2perf.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX64</TargetMachine>
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/BUILDRULES.py b/Build/source/libs/icu/icu-src/source/test/testdata/BUILDRULES.py
new file mode 100644
index 00000000000..2a5eed8755c
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/BUILDRULES.py
@@ -0,0 +1,231 @@
+# Copyright (C) 2018 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+from icutools.databuilder import *
+from icutools.databuilder.request_types import *
+
+
+def generate(config, glob, common_vars):
+ requests = []
+ requests += generate_rb(config, glob, common_vars)
+ requests += generate_sprep(config, glob, common_vars)
+ requests += generate_conv(config, glob, common_vars)
+ requests += generate_other(config, glob, common_vars)
+ requests += generate_copy(config, glob, common_vars)
+
+ requests += [
+ ListRequest(
+ name = "testdata_list",
+ variable_name = "testdata_all_output_files",
+ output_file = TmpFile("testdata.lst"),
+ include_tmp = True
+ )
+ ]
+
+ return requests
+
+
+def generate_rb(config, glob, common_vars):
+ basenames = [
+ "calendar",
+ "casing",
+ "conversion",
+ "format",
+ "icuio",
+ "idna_rules",
+ "mc",
+ "root",
+ "sh_YU",
+ "sh",
+ "structLocale",
+ "te_IN_REVISED",
+ "te_IN",
+ "te",
+ "testaliases",
+ "testempty",
+ "testtypes",
+ # "metaZones",
+ # "timezoneTypes",
+ # "windowsZones",
+ ]
+ return [
+ # Inference rule for creating resource bundles
+ # Some test data resource bundles are known to have warnings and bad data.
+ # The -q option is there on purpose, so we don't see it normally.
+ # TODO: Use option -k?
+ RepeatedExecutionRequest(
+ name = "testrb",
+ category = "tests",
+ input_files = [InFile("%s.txt" % bn) for bn in basenames],
+ output_files = [OutFile("%s.res" % bn) for bn in basenames],
+ tool = IcuTool("genrb"),
+ args = "-q -s {IN_DIR} -d {OUT_DIR} {INPUT_FILE}",
+ format_with = {},
+ repeat_with = {}
+ ),
+ # Other standalone res files
+ SingleExecutionRequest(
+ name = "encoded",
+ category = "tests",
+ input_files = [InFile("encoded.utf16be")],
+ output_files = [OutFile("encoded.res")],
+ tool = IcuTool("genrb"),
+ args = "-s {IN_DIR} -eUTF-16BE -d {OUT_DIR} {INPUT_FILES[0]}",
+ format_with = {}
+ ),
+ SingleExecutionRequest(
+ name = "zoneinfo64",
+ category = "tests",
+ input_files = [InFile("zoneinfo64.txt")],
+ output_files = [TmpFile("zoneinfo64.res")],
+ tool = IcuTool("genrb"),
+ args = "-s {IN_DIR} -d {TMP_DIR} {INPUT_FILES[0]}",
+ format_with = {}
+ ),
+ SingleExecutionRequest(
+ name = "filtertest",
+ category = "tests",
+ input_files = [InFile("filtertest.txt")],
+ output_files = [OutFile("filtertest.res")],
+ tool = IcuTool("genrb"),
+ args = "-s {IN_DIR} -d {OUT_DIR} -i {OUT_DIR} "
+ "--filterDir {IN_DIR}/filters filtertest.txt",
+ format_with = {}
+ )
+ ]
+
+
+def generate_sprep(config, glob, common_vars):
+ return [
+ SingleExecutionRequest(
+ name = "nfscsi",
+ category = "tests",
+ input_files = [InFile("nfs4_cs_prep_ci.txt")],
+ output_files = [OutFile("nfscsi.spp")],
+ tool = IcuTool("gensprep"),
+ args = "-s {IN_DIR} -d {OUT_DIR} -b nfscsi -u 3.2.0 {INPUT_FILES[0]}",
+ format_with = {}
+ ),
+ SingleExecutionRequest(
+ name = "nfscss",
+ category = "tests",
+ input_files = [InFile("nfs4_cs_prep_cs.txt")],
+ output_files = [OutFile("nfscss.spp")],
+ tool = IcuTool("gensprep"),
+ args = "-s {IN_DIR} -d {OUT_DIR} -b nfscss -u 3.2.0 {INPUT_FILES[0]}",
+ format_with = {}
+ ),
+ SingleExecutionRequest(
+ name = "nfscis",
+ category = "tests",
+ input_files = [InFile("nfs4_cis_prep.txt")],
+ output_files = [OutFile("nfscis.spp")],
+ tool = IcuTool("gensprep"),
+ args = "-s {IN_DIR} -d {OUT_DIR} -b nfscis -u 3.2.0 -k -n {IN_DIR}/../../data/unidata {INPUT_FILES[0]}",
+ format_with = {}
+ ),
+ SingleExecutionRequest(
+ name = "nfsmxs",
+ category = "tests",
+ input_files = [InFile("nfs4_mixed_prep_s.txt")],
+ output_files = [OutFile("nfsmxs.spp")],
+ tool = IcuTool("gensprep"),
+ args = "-s {IN_DIR} -d {OUT_DIR} -b nfsmxs -u 3.2.0 -k -n {IN_DIR}/../../data/unidata {INPUT_FILES[0]}",
+ format_with = {}
+ ),
+ SingleExecutionRequest(
+ name = "nfsmxp",
+ category = "tests",
+ input_files = [InFile("nfs4_mixed_prep_p.txt")],
+ output_files = [OutFile("nfsmxp.spp")],
+ tool = IcuTool("gensprep"),
+ args = "-s {IN_DIR} -d {OUT_DIR} -b nfsmxp -u 3.2.0 -k -n {IN_DIR}/../../data/unidata {INPUT_FILES[0]}",
+ format_with = {}
+ )
+ ]
+
+
+def generate_conv(config, glob, common_vars):
+ basenames = [
+ "test1",
+ "test1bmp",
+ "test2",
+ "test3",
+ "test4",
+ "test4x",
+ "test5",
+ "ibm9027"
+ ]
+ return [
+ RepeatedExecutionRequest(
+ name = "test_conv",
+ category = "tests",
+ input_files = [InFile("%s.ucm" % bn) for bn in basenames],
+ output_files = [OutFile("%s.cnv" % bn) for bn in basenames],
+ tool = IcuTool("makeconv"),
+ args = "--small -d {OUT_DIR} {IN_DIR}/{INPUT_FILE}",
+ format_with = {},
+ repeat_with = {}
+ )
+ ]
+
+
+def generate_copy(config, glob, common_vars):
+ return [
+ CopyRequest(
+ name = "nam_typ",
+ input_file = OutFile("te.res"),
+ output_file = TmpFile("nam.typ")
+ ),
+ CopyRequest(
+ name = "old_l_testtypes",
+ input_file = InFile("old_l_testtypes.res"),
+ output_file = OutFile("old_l_testtypes.res")
+ ),
+ CopyRequest(
+ name = "old_e_testtypes",
+ input_file = InFile("old_e_testtypes.res"),
+ output_file = OutFile("old_e_testtypes.res")
+ ),
+ ]
+
+
+def generate_other(config, glob, common_vars):
+ return [
+ SingleExecutionRequest(
+ name = "testnorm",
+ category = "tests",
+ input_files = [InFile("testnorm.txt")],
+ output_files = [OutFile("testnorm.nrm")],
+ tool = IcuTool("gennorm2"),
+ args = "-s {IN_DIR} {INPUT_FILES[0]} -o {OUT_DIR}/{OUTPUT_FILES[0]}",
+ format_with = {}
+ ),
+ SingleExecutionRequest(
+ name = "test_icu",
+ category = "tests",
+ input_files = [],
+ output_files = [OutFile("test.icu")],
+ tool = IcuTool("gentest"),
+ args = "-d {OUT_DIR}",
+ format_with = {}
+ ),
+ SingleExecutionRequest(
+ name = "testtable32_txt",
+ category = "tests",
+ input_files = [],
+ output_files = [TmpFile("testtable32.txt")],
+ tool = IcuTool("gentest"),
+ args = "-r -d {TMP_DIR}",
+ format_with = {}
+ ),
+ SingleExecutionRequest(
+ name = "testtable32_res",
+ category = "tests",
+ input_files = [TmpFile("testtable32.txt")],
+ output_files = [OutFile("testtable32.res")],
+ tool = IcuTool("genrb"),
+ args = "-s {TMP_DIR} -d {OUT_DIR} {INPUT_FILES[0]}",
+ format_with = {}
+ )
+ ]
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/BidiTest.txt b/Build/source/libs/icu/icu-src/source/test/testdata/BidiTest.txt
index e7637c3de25..49665bd198c 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/BidiTest.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/BidiTest.txt
@@ -1,6 +1,6 @@
-# BidiTest-11.0.0.txt
-# Date: 2018-01-31, 08:20:07 GMT
-# © 2018 Unicode®, Inc.
+# BidiTest-12.1.0.txt
+# Date: 2019-03-08, 23:59:20 GMT
+# © 2019 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/CollationTest_NON_IGNORABLE_SHORT.txt b/Build/source/libs/icu/icu-src/source/test/testdata/CollationTest_NON_IGNORABLE_SHORT.txt
index 58b3110aa62..488aa673c13 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/CollationTest_NON_IGNORABLE_SHORT.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/CollationTest_NON_IGNORABLE_SHORT.txt
@@ -1,10 +1,10 @@
# CollationTest_CLDR_NON_IGNORABLE_SHORT.txt
-# Date: 2018-05-21, 23:52:51 GMT
-# © 2018 Unicode®, Inc.
+# Date: 2019-04-01, 20:17:34 GMT
+# © 2019 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
-# UCA Version: 11.0.0
-# UCD Version: 11.0.0
+# UCA Version: 12.1.0
+# UCD Version: 12.1.0
# For a description of the format and usage, see
# http://www.unicode.org/reports/tr35/tr35-collation.html#Root_Data_Files
@@ -1183,18 +1183,40 @@ A92D 0334
193B 0334
0334 16B30
16B30 0334
+0334 1E131
+1E131 0334
0334 16B31
16B31 0334
+0334 1E136
+1E136 0334
0334 16B32
16B32 0334
+0334 1E132
+1E132 0334
0334 16B33
16B33 0334
+0334 1E133
+1E133 0334
0334 16B34
16B34 0334
+0334 1E130
+1E130 0334
0334 16B35
16B35 0334
+0334 1E134
+1E134 0334
0334 16B36
16B36 0334
+0334 1E135
+1E135 0334
+0334 1E2EC
+1E2EC 0334
+0334 1E2ED
+1E2ED 0334
+0334 1E2EE
+1E2EE 0334
+0334 1E2EF
+1E2EF 0334
0334 302A
302A 0334
0334 302B
@@ -1622,6 +1644,11 @@ FE10 0062
2E4E 0061
2E4E 0041
2E4E 0062
+2E4F 0021
+2E4F 003F
+2E4F 0061
+2E4F 0041
+2E4F 0062
055D 0021
055D 003F
055D 0061
@@ -1712,6 +1739,11 @@ FE46 003F
FE46 0061
FE46 0041
FE46 0062
+16FE2 0021
+16FE2 003F
+16FE2 0061
+16FE2 0041
+16FE2 0062
003B 0021
037E 0021
FF1B 0021
@@ -2299,6 +2331,15 @@ FFFB 0021
11372 0021
11373 0021
11374 0021
+13430 0021
+13431 0021
+13432 0021
+13433 0021
+13434 0021
+13435 0021
+13436 0021
+13437 0021
+13438 0021
1BCA0 0021
1BCA1 0021
1BCA2 0021
@@ -3277,6 +3318,7 @@ A981 0021
1163D 0021
116AB 0021
11837 0021
+119DE 0021
11A38 0021
11A96 0021
11C3D 0021
@@ -3313,6 +3355,7 @@ A983 0021
1163E 0021
116AC 0021
11838 0021
+119DF 0021
11A39 0021
11A97 0021
11C3E 0021
@@ -3369,12 +3412,23 @@ A92D 0021
193A 0021
193B 0021
16B30 0021
+1E131 0021
16B31 0021
+1E136 0021
16B32 0021
+1E132 0021
16B33 0021
+1E133 0021
16B34 0021
+1E130 0021
16B35 0021
+1E134 0021
16B36 0021
+1E135 0021
+1E2EC 0021
+1E2ED 0021
+1E2EE 0021
+1E2EF 0021
302A 0021
302B 0021
302C 0021
@@ -3774,6 +3828,15 @@ FFFB 003F
11372 003F
11373 003F
11374 003F
+13430 003F
+13431 003F
+13432 003F
+13433 003F
+13434 003F
+13435 003F
+13436 003F
+13437 003F
+13438 003F
1BCA0 003F
1BCA1 003F
1BCA2 003F
@@ -4752,6 +4815,7 @@ A981 003F
1163D 003F
116AB 003F
11837 003F
+119DE 003F
11A38 003F
11A96 003F
11C3D 003F
@@ -4788,6 +4852,7 @@ A983 003F
1163E 003F
116AC 003F
11838 003F
+119DF 003F
11A39 003F
11A97 003F
11C3E 003F
@@ -4844,12 +4909,23 @@ A92D 003F
193A 003F
193B 003F
16B30 003F
+1E131 003F
16B31 003F
+1E136 003F
16B32 003F
+1E132 003F
16B33 003F
+1E133 003F
16B34 003F
+1E130 003F
16B35 003F
+1E134 003F
16B36 003F
+1E135 003F
+1E2EC 003F
+1E2ED 003F
+1E2EE 003F
+1E2EF 003F
302A 003F
302B 003F
302C 003F
@@ -8042,6 +8118,11 @@ A8FC 0062
0AF0 0061
0AF0 0041
0AF0 0062
+0C77 0021
+0C77 003F
+0C77 0061
+0C77 0041
+0C77 0062
0C84 0021
0C84 003F
0C84 0061
@@ -8377,11 +8458,6 @@ AADF 0062
1AAD 0061
1AAD 0041
1AAD 0062
-166D 0021
-166D 003F
-166D 0061
-166D 0041
-166D 0062
1CC0 0021
1CC0 003F
1CC0 0061
@@ -8822,6 +8898,16 @@ AA5C 0062
1183B 0061
1183B 0041
1183B 0062
+119E2 0021
+119E2 003F
+119E2 0061
+119E2 0041
+119E2 0062
+11FFF 0021
+11FFF 003F
+11FFF 0061
+11FFF 0041
+11FFF 0062
16B37 0021
16B37 003F
16B37 0061
@@ -9795,6 +9881,131 @@ FBC1 0062
0BFA 0061
0BFA 0041
0BFA 0062
+11FD5 0021
+11FD5 003F
+11FD5 0061
+11FD5 0041
+11FD5 0062
+11FD6 0021
+11FD6 003F
+11FD6 0061
+11FD6 0041
+11FD6 0062
+11FD7 0021
+11FD7 003F
+11FD7 0061
+11FD7 0041
+11FD7 0062
+11FD8 0021
+11FD8 003F
+11FD8 0061
+11FD8 0041
+11FD8 0062
+11FD9 0021
+11FD9 003F
+11FD9 0061
+11FD9 0041
+11FD9 0062
+11FDA 0021
+11FDA 003F
+11FDA 0061
+11FDA 0041
+11FDA 0062
+11FDB 0021
+11FDB 003F
+11FDB 0061
+11FDB 0041
+11FDB 0062
+11FDC 0021
+11FDC 003F
+11FDC 0061
+11FDC 0041
+11FDC 0062
+11FE1 0021
+11FE1 003F
+11FE1 0061
+11FE1 0041
+11FE1 0062
+11FE2 0021
+11FE2 003F
+11FE2 0061
+11FE2 0041
+11FE2 0062
+11FE3 0021
+11FE3 003F
+11FE3 0061
+11FE3 0041
+11FE3 0062
+11FE4 0021
+11FE4 003F
+11FE4 0061
+11FE4 0041
+11FE4 0062
+11FE5 0021
+11FE5 003F
+11FE5 0061
+11FE5 0041
+11FE5 0062
+11FE6 0021
+11FE6 003F
+11FE6 0061
+11FE6 0041
+11FE6 0062
+11FE7 0021
+11FE7 003F
+11FE7 0061
+11FE7 0041
+11FE7 0062
+11FE8 0021
+11FE8 003F
+11FE8 0061
+11FE8 0041
+11FE8 0062
+11FE9 0021
+11FE9 003F
+11FE9 0061
+11FE9 0041
+11FE9 0062
+11FEA 0021
+11FEA 003F
+11FEA 0061
+11FEA 0041
+11FEA 0062
+11FEB 0021
+11FEB 003F
+11FEB 0061
+11FEB 0041
+11FEB 0062
+11FEC 0021
+11FEC 003F
+11FEC 0061
+11FEC 0041
+11FEC 0062
+11FED 0021
+11FED 003F
+11FED 0061
+11FED 0041
+11FED 0062
+11FEE 0021
+11FEE 003F
+11FEE 0061
+11FEE 0041
+11FEE 0062
+11FEF 0021
+11FEF 003F
+11FEF 0061
+11FEF 0041
+11FEF 0062
+11FF0 0021
+11FF0 003F
+11FF0 0061
+11FF0 0041
+11FF0 0062
+11FF1 0021
+11FF1 003F
+11FF1 0061
+11FF1 0041
+11FF1 0062
0C7F 0021
0C7F 003F
0C7F 0061
@@ -10025,6 +10236,11 @@ A839 0062
0FD8 0061
0FD8 0041
0FD8 0062
+166D 0021
+166D 003F
+166D 0061
+166D 0041
+166D 0062
1940 0021
1940 003F
1940 0061
@@ -21145,6 +21361,11 @@ FFEE 0062
2BC8 0061
2BC8 0041
2BC8 0062
+2BC9 0021
+2BC9 003F
+2BC9 0061
+2BC9 0041
+2BC9 0062
2BCA 0021
2BCA 003F
2BCA 0061
@@ -21410,6 +21631,11 @@ FFEE 0062
2BFE 0061
2BFE 0041
2BFE 0062
+2BFF 0021
+2BFF 003F
+2BFF 0061
+2BFF 0041
+2BFF 0062
2CE5 0021
2CE5 003F
2CE5 0061
@@ -24290,6 +24516,11 @@ A4C6 0062
16B45 0061
16B45 0041
16B45 0062
+1E14F 0021
+1E14F 003F
+1E14F 0061
+1E14F 0041
+1E14F 0062
1D000 0021
1D000 003F
1D000 0061
@@ -26893,6 +27124,11 @@ A4C6 0062
1ECAC 0061
1ECAC 0041
1ECAC 0062
+1ED2E 0021
+1ED2E 003F
+1ED2E 0061
+1ED2E 0041
+1ED2E 0062
1F000 0021
1F000 003F
1F000 0061
@@ -28023,6 +28259,426 @@ A4C6 0062
1F0F5 0061
1F0F5 0041
1F0F5 0062
+1FA00 0021
+1FA00 003F
+1FA00 0061
+1FA00 0041
+1FA00 0062
+1FA01 0021
+1FA01 003F
+1FA01 0061
+1FA01 0041
+1FA01 0062
+1FA02 0021
+1FA02 003F
+1FA02 0061
+1FA02 0041
+1FA02 0062
+1FA03 0021
+1FA03 003F
+1FA03 0061
+1FA03 0041
+1FA03 0062
+1FA04 0021
+1FA04 003F
+1FA04 0061
+1FA04 0041
+1FA04 0062
+1FA05 0021
+1FA05 003F
+1FA05 0061
+1FA05 0041
+1FA05 0062
+1FA06 0021
+1FA06 003F
+1FA06 0061
+1FA06 0041
+1FA06 0062
+1FA07 0021
+1FA07 003F
+1FA07 0061
+1FA07 0041
+1FA07 0062
+1FA08 0021
+1FA08 003F
+1FA08 0061
+1FA08 0041
+1FA08 0062
+1FA09 0021
+1FA09 003F
+1FA09 0061
+1FA09 0041
+1FA09 0062
+1FA0A 0021
+1FA0A 003F
+1FA0A 0061
+1FA0A 0041
+1FA0A 0062
+1FA0B 0021
+1FA0B 003F
+1FA0B 0061
+1FA0B 0041
+1FA0B 0062
+1FA0C 0021
+1FA0C 003F
+1FA0C 0061
+1FA0C 0041
+1FA0C 0062
+1FA0D 0021
+1FA0D 003F
+1FA0D 0061
+1FA0D 0041
+1FA0D 0062
+1FA0E 0021
+1FA0E 003F
+1FA0E 0061
+1FA0E 0041
+1FA0E 0062
+1FA0F 0021
+1FA0F 003F
+1FA0F 0061
+1FA0F 0041
+1FA0F 0062
+1FA10 0021
+1FA10 003F
+1FA10 0061
+1FA10 0041
+1FA10 0062
+1FA11 0021
+1FA11 003F
+1FA11 0061
+1FA11 0041
+1FA11 0062
+1FA12 0021
+1FA12 003F
+1FA12 0061
+1FA12 0041
+1FA12 0062
+1FA13 0021
+1FA13 003F
+1FA13 0061
+1FA13 0041
+1FA13 0062
+1FA14 0021
+1FA14 003F
+1FA14 0061
+1FA14 0041
+1FA14 0062
+1FA15 0021
+1FA15 003F
+1FA15 0061
+1FA15 0041
+1FA15 0062
+1FA16 0021
+1FA16 003F
+1FA16 0061
+1FA16 0041
+1FA16 0062
+1FA17 0021
+1FA17 003F
+1FA17 0061
+1FA17 0041
+1FA17 0062
+1FA18 0021
+1FA18 003F
+1FA18 0061
+1FA18 0041
+1FA18 0062
+1FA19 0021
+1FA19 003F
+1FA19 0061
+1FA19 0041
+1FA19 0062
+1FA1A 0021
+1FA1A 003F
+1FA1A 0061
+1FA1A 0041
+1FA1A 0062
+1FA1B 0021
+1FA1B 003F
+1FA1B 0061
+1FA1B 0041
+1FA1B 0062
+1FA1C 0021
+1FA1C 003F
+1FA1C 0061
+1FA1C 0041
+1FA1C 0062
+1FA1D 0021
+1FA1D 003F
+1FA1D 0061
+1FA1D 0041
+1FA1D 0062
+1FA1E 0021
+1FA1E 003F
+1FA1E 0061
+1FA1E 0041
+1FA1E 0062
+1FA1F 0021
+1FA1F 003F
+1FA1F 0061
+1FA1F 0041
+1FA1F 0062
+1FA20 0021
+1FA20 003F
+1FA20 0061
+1FA20 0041
+1FA20 0062
+1FA21 0021
+1FA21 003F
+1FA21 0061
+1FA21 0041
+1FA21 0062
+1FA22 0021
+1FA22 003F
+1FA22 0061
+1FA22 0041
+1FA22 0062
+1FA23 0021
+1FA23 003F
+1FA23 0061
+1FA23 0041
+1FA23 0062
+1FA24 0021
+1FA24 003F
+1FA24 0061
+1FA24 0041
+1FA24 0062
+1FA25 0021
+1FA25 003F
+1FA25 0061
+1FA25 0041
+1FA25 0062
+1FA26 0021
+1FA26 003F
+1FA26 0061
+1FA26 0041
+1FA26 0062
+1FA27 0021
+1FA27 003F
+1FA27 0061
+1FA27 0041
+1FA27 0062
+1FA28 0021
+1FA28 003F
+1FA28 0061
+1FA28 0041
+1FA28 0062
+1FA29 0021
+1FA29 003F
+1FA29 0061
+1FA29 0041
+1FA29 0062
+1FA2A 0021
+1FA2A 003F
+1FA2A 0061
+1FA2A 0041
+1FA2A 0062
+1FA2B 0021
+1FA2B 003F
+1FA2B 0061
+1FA2B 0041
+1FA2B 0062
+1FA2C 0021
+1FA2C 003F
+1FA2C 0061
+1FA2C 0041
+1FA2C 0062
+1FA2D 0021
+1FA2D 003F
+1FA2D 0061
+1FA2D 0041
+1FA2D 0062
+1FA2E 0021
+1FA2E 003F
+1FA2E 0061
+1FA2E 0041
+1FA2E 0062
+1FA2F 0021
+1FA2F 003F
+1FA2F 0061
+1FA2F 0041
+1FA2F 0062
+1FA30 0021
+1FA30 003F
+1FA30 0061
+1FA30 0041
+1FA30 0062
+1FA31 0021
+1FA31 003F
+1FA31 0061
+1FA31 0041
+1FA31 0062
+1FA32 0021
+1FA32 003F
+1FA32 0061
+1FA32 0041
+1FA32 0062
+1FA33 0021
+1FA33 003F
+1FA33 0061
+1FA33 0041
+1FA33 0062
+1FA34 0021
+1FA34 003F
+1FA34 0061
+1FA34 0041
+1FA34 0062
+1FA35 0021
+1FA35 003F
+1FA35 0061
+1FA35 0041
+1FA35 0062
+1FA36 0021
+1FA36 003F
+1FA36 0061
+1FA36 0041
+1FA36 0062
+1FA37 0021
+1FA37 003F
+1FA37 0061
+1FA37 0041
+1FA37 0062
+1FA38 0021
+1FA38 003F
+1FA38 0061
+1FA38 0041
+1FA38 0062
+1FA39 0021
+1FA39 003F
+1FA39 0061
+1FA39 0041
+1FA39 0062
+1FA3A 0021
+1FA3A 003F
+1FA3A 0061
+1FA3A 0041
+1FA3A 0062
+1FA3B 0021
+1FA3B 003F
+1FA3B 0061
+1FA3B 0041
+1FA3B 0062
+1FA3C 0021
+1FA3C 003F
+1FA3C 0061
+1FA3C 0041
+1FA3C 0062
+1FA3D 0021
+1FA3D 003F
+1FA3D 0061
+1FA3D 0041
+1FA3D 0062
+1FA3E 0021
+1FA3E 003F
+1FA3E 0061
+1FA3E 0041
+1FA3E 0062
+1FA3F 0021
+1FA3F 003F
+1FA3F 0061
+1FA3F 0041
+1FA3F 0062
+1FA40 0021
+1FA40 003F
+1FA40 0061
+1FA40 0041
+1FA40 0062
+1FA41 0021
+1FA41 003F
+1FA41 0061
+1FA41 0041
+1FA41 0062
+1FA42 0021
+1FA42 003F
+1FA42 0061
+1FA42 0041
+1FA42 0062
+1FA43 0021
+1FA43 003F
+1FA43 0061
+1FA43 0041
+1FA43 0062
+1FA44 0021
+1FA44 003F
+1FA44 0061
+1FA44 0041
+1FA44 0062
+1FA45 0021
+1FA45 003F
+1FA45 0061
+1FA45 0041
+1FA45 0062
+1FA46 0021
+1FA46 003F
+1FA46 0061
+1FA46 0041
+1FA46 0062
+1FA47 0021
+1FA47 003F
+1FA47 0061
+1FA47 0041
+1FA47 0062
+1FA48 0021
+1FA48 003F
+1FA48 0061
+1FA48 0041
+1FA48 0062
+1FA49 0021
+1FA49 003F
+1FA49 0061
+1FA49 0041
+1FA49 0062
+1FA4A 0021
+1FA4A 003F
+1FA4A 0061
+1FA4A 0041
+1FA4A 0062
+1FA4B 0021
+1FA4B 003F
+1FA4B 0061
+1FA4B 0041
+1FA4B 0062
+1FA4C 0021
+1FA4C 003F
+1FA4C 0061
+1FA4C 0041
+1FA4C 0062
+1FA4D 0021
+1FA4D 003F
+1FA4D 0061
+1FA4D 0041
+1FA4D 0062
+1FA4E 0021
+1FA4E 003F
+1FA4E 0061
+1FA4E 0041
+1FA4E 0062
+1FA4F 0021
+1FA4F 003F
+1FA4F 0061
+1FA4F 0041
+1FA4F 0062
+1FA50 0021
+1FA50 003F
+1FA50 0061
+1FA50 0041
+1FA50 0062
+1FA51 0021
+1FA51 003F
+1FA51 0061
+1FA51 0041
+1FA51 0062
+1FA52 0021
+1FA52 003F
+1FA52 0061
+1FA52 0041
+1FA52 0062
+1FA53 0021
+1FA53 003F
+1FA53 0061
+1FA53 0041
+1FA53 0062
1FA60 0021
1FA60 003F
1FA60 0061
@@ -32023,6 +32679,21 @@ A4C6 0062
1F90B 0061
1F90B 0041
1F90B 0062
+1F90D 0021
+1F90D 003F
+1F90D 0061
+1F90D 0041
+1F90D 0062
+1F90E 0021
+1F90E 003F
+1F90E 0061
+1F90E 0041
+1F90E 0062
+1F90F 0021
+1F90F 003F
+1F90F 0061
+1F90F 0041
+1F90F 0062
1F910 0021
1F910 003F
1F910 0061
@@ -32258,6 +32929,11 @@ A4C6 0062
1F93E 0061
1F93E 0041
1F93E 0062
+1F93F 0021
+1F93F 003F
+1F93F 0061
+1F93F 0041
+1F93F 0062
1F940 0021
1F940 003F
1F940 0061
@@ -32503,6 +33179,11 @@ A4C6 0062
1F970 0061
1F970 0041
1F970 0062
+1F971 0021
+1F971 003F
+1F971 0061
+1F971 0041
+1F971 0062
1F973 0021
1F973 003F
1F973 0061
@@ -32528,6 +33209,11 @@ A4C6 0062
1F97A 0061
1F97A 0041
1F97A 0062
+1F97B 0021
+1F97B 003F
+1F97B 0061
+1F97B 0041
+1F97B 0062
1F97C 0021
1F97C 003F
1F97C 0061
@@ -32723,6 +33409,46 @@ A4C6 0062
1F9A2 0061
1F9A2 0041
1F9A2 0062
+1F9A5 0021
+1F9A5 003F
+1F9A5 0061
+1F9A5 0041
+1F9A5 0062
+1F9A6 0021
+1F9A6 003F
+1F9A6 0061
+1F9A6 0041
+1F9A6 0062
+1F9A7 0021
+1F9A7 003F
+1F9A7 0061
+1F9A7 0041
+1F9A7 0062
+1F9A8 0021
+1F9A8 003F
+1F9A8 0061
+1F9A8 0041
+1F9A8 0062
+1F9A9 0021
+1F9A9 003F
+1F9A9 0061
+1F9A9 0041
+1F9A9 0062
+1F9AA 0021
+1F9AA 003F
+1F9AA 0061
+1F9AA 0041
+1F9AA 0062
+1F9AE 0021
+1F9AE 003F
+1F9AE 0061
+1F9AE 0041
+1F9AE 0062
+1F9AF 0021
+1F9AF 003F
+1F9AF 0061
+1F9AF 0041
+1F9AF 0062
1F9B0 0021
1F9B0 003F
1F9B0 0061
@@ -32773,6 +33499,36 @@ A4C6 0062
1F9B9 0061
1F9B9 0041
1F9B9 0062
+1F9BA 0021
+1F9BA 003F
+1F9BA 0061
+1F9BA 0041
+1F9BA 0062
+1F9BB 0021
+1F9BB 003F
+1F9BB 0061
+1F9BB 0041
+1F9BB 0062
+1F9BC 0021
+1F9BC 003F
+1F9BC 0061
+1F9BC 0041
+1F9BC 0062
+1F9BD 0021
+1F9BD 003F
+1F9BD 0061
+1F9BD 0041
+1F9BD 0062
+1F9BE 0021
+1F9BE 003F
+1F9BE 0061
+1F9BE 0041
+1F9BE 0062
+1F9BF 0021
+1F9BF 003F
+1F9BF 0061
+1F9BF 0041
+1F9BF 0062
1F9C0 0021
1F9C0 003F
1F9C0 0061
@@ -32788,6 +33544,61 @@ A4C6 0062
1F9C2 0061
1F9C2 0041
1F9C2 0062
+1F9C3 0021
+1F9C3 003F
+1F9C3 0061
+1F9C3 0041
+1F9C3 0062
+1F9C4 0021
+1F9C4 003F
+1F9C4 0061
+1F9C4 0041
+1F9C4 0062
+1F9C5 0021
+1F9C5 003F
+1F9C5 0061
+1F9C5 0041
+1F9C5 0062
+1F9C6 0021
+1F9C6 003F
+1F9C6 0061
+1F9C6 0041
+1F9C6 0062
+1F9C7 0021
+1F9C7 003F
+1F9C7 0061
+1F9C7 0041
+1F9C7 0062
+1F9C8 0021
+1F9C8 003F
+1F9C8 0061
+1F9C8 0041
+1F9C8 0062
+1F9C9 0021
+1F9C9 003F
+1F9C9 0061
+1F9C9 0041
+1F9C9 0062
+1F9CA 0021
+1F9CA 003F
+1F9CA 0061
+1F9CA 0041
+1F9CA 0062
+1F9CD 0021
+1F9CD 003F
+1F9CD 0061
+1F9CD 0041
+1F9CD 0062
+1F9CE 0021
+1F9CE 003F
+1F9CE 0061
+1F9CE 0041
+1F9CE 0062
+1F9CF 0021
+1F9CF 003F
+1F9CF 0061
+1F9CF 0041
+1F9CF 0062
1F9D0 0021
1F9D0 003F
1F9D0 0061
@@ -33028,6 +33839,86 @@ A4C6 0062
1F9FF 0061
1F9FF 0041
1F9FF 0062
+1FA70 0021
+1FA70 003F
+1FA70 0061
+1FA70 0041
+1FA70 0062
+1FA71 0021
+1FA71 003F
+1FA71 0061
+1FA71 0041
+1FA71 0062
+1FA72 0021
+1FA72 003F
+1FA72 0061
+1FA72 0041
+1FA72 0062
+1FA73 0021
+1FA73 003F
+1FA73 0061
+1FA73 0041
+1FA73 0062
+1FA78 0021
+1FA78 003F
+1FA78 0061
+1FA78 0041
+1FA78 0062
+1FA79 0021
+1FA79 003F
+1FA79 0061
+1FA79 0041
+1FA79 0062
+1FA7A 0021
+1FA7A 003F
+1FA7A 0061
+1FA7A 0041
+1FA7A 0062
+1FA80 0021
+1FA80 003F
+1FA80 0061
+1FA80 0041
+1FA80 0062
+1FA81 0021
+1FA81 003F
+1FA81 0061
+1FA81 0041
+1FA81 0062
+1FA82 0021
+1FA82 003F
+1FA82 0061
+1FA82 0041
+1FA82 0062
+1FA90 0021
+1FA90 003F
+1FA90 0061
+1FA90 0041
+1FA90 0062
+1FA91 0021
+1FA91 003F
+1FA91 0061
+1FA91 0041
+1FA91 0062
+1FA92 0021
+1FA92 003F
+1FA92 0061
+1FA92 0041
+1FA92 0062
+1FA93 0021
+1FA93 003F
+1FA93 0061
+1FA93 0041
+1FA93 0062
+1FA94 0021
+1FA94 003F
+1FA94 0061
+1FA94 0041
+1FA94 0062
+1FA95 0021
+1FA95 003F
+1FA95 0061
+1FA95 0041
+1FA95 0062
1F600 0021
1F600 003F
1F600 0061
@@ -34093,6 +34984,11 @@ A4C6 0062
1F6D4 0061
1F6D4 0041
1F6D4 0062
+1F6D5 0021
+1F6D5 003F
+1F6D5 0061
+1F6D5 0041
+1F6D5 0062
1F6E0 0021
1F6E0 003F
1F6E0 0061
@@ -34208,6 +35104,11 @@ A4C6 0062
1F6F9 0061
1F6F9 0041
1F6F9 0062
+1F6FA 0021
+1F6FA 003F
+1F6FA 0061
+1F6FA 0041
+1F6FA 0062
1F700 0021
1F700 003F
1F700 0061
@@ -35233,6 +36134,66 @@ A4C6 0062
1F7D8 0061
1F7D8 0041
1F7D8 0062
+1F7E0 0021
+1F7E0 003F
+1F7E0 0061
+1F7E0 0041
+1F7E0 0062
+1F7E1 0021
+1F7E1 003F
+1F7E1 0061
+1F7E1 0041
+1F7E1 0062
+1F7E2 0021
+1F7E2 003F
+1F7E2 0061
+1F7E2 0041
+1F7E2 0062
+1F7E3 0021
+1F7E3 003F
+1F7E3 0061
+1F7E3 0041
+1F7E3 0062
+1F7E4 0021
+1F7E4 003F
+1F7E4 0061
+1F7E4 0041
+1F7E4 0062
+1F7E5 0021
+1F7E5 003F
+1F7E5 0061
+1F7E5 0041
+1F7E5 0062
+1F7E6 0021
+1F7E6 003F
+1F7E6 0061
+1F7E6 0041
+1F7E6 0062
+1F7E7 0021
+1F7E7 003F
+1F7E7 0061
+1F7E7 0041
+1F7E7 0062
+1F7E8 0021
+1F7E8 003F
+1F7E8 0061
+1F7E8 0041
+1F7E8 0062
+1F7E9 0021
+1F7E9 003F
+1F7E9 0061
+1F7E9 0041
+1F7E9 0062
+1F7EA 0021
+1F7EA 003F
+1F7EA 0061
+1F7EA 0041
+1F7EA 0062
+1F7EB 0021
+1F7EB 003F
+1F7EB 0061
+1F7EB 0041
+1F7EB 0062
1F800 0021
1F800 003F
1F800 0061
@@ -39048,6 +40009,16 @@ AAF4 0062
16B43 0061
16B43 0041
16B43 0062
+1E13C 0021
+1E13C 003F
+1E13C 0061
+1E13C 0041
+1E13C 0062
+1E13D 0021
+1E13D 003F
+1E13D 0061
+1E13D 0041
+1E13D 0062
3005 0021
3005 003F
3005 0061
@@ -39068,6 +40039,11 @@ AAF4 0062
16FE1 0061
16FE1 0041
16FE1 0062
+16FE3 0021
+16FE3 003F
+16FE3 0061
+16FE3 0041
+16FE3 0062
3031 0021
3032 0021
3031 003F
@@ -39229,6 +40205,26 @@ A838 0062
0BF9 0061
0BF9 0041
0BF9 0062
+11FDD 0021
+11FDD 003F
+11FDD 0061
+11FDD 0041
+11FDD 0062
+11FDE 0021
+11FDE 003F
+11FDE 0061
+11FDE 0041
+11FDE 0062
+11FDF 0021
+11FDF 003F
+11FDF 0061
+11FDF 0041
+11FDF 0062
+11FE0 0021
+11FE0 003F
+11FE0 0061
+11FE0 0041
+11FE0 0062
0E3F 0021
0E3F 003F
0E3F 0061
@@ -39239,6 +40235,11 @@ A838 0062
17DB 0061
17DB 0041
17DB 0062
+1E2FF 0021
+1E2FF 003F
+1E2FF 0061
+1E2FF 0041
+1E2FF 0062
20A0 0021
20A0 003F
20A0 0061
@@ -39519,6 +40520,111 @@ A835 0062
0BF2 0061
0BF2 0041
0BF2 0062
+11FC0 0021
+11FC0 003F
+11FC0 0061
+11FC0 0041
+11FC0 0062
+11FC1 0021
+11FC1 003F
+11FC1 0061
+11FC1 0041
+11FC1 0062
+11FC2 0021
+11FC2 003F
+11FC2 0061
+11FC2 0041
+11FC2 0062
+11FC3 0021
+11FC3 003F
+11FC3 0061
+11FC3 0041
+11FC3 0062
+11FC4 0021
+11FC4 003F
+11FC4 0061
+11FC4 0041
+11FC4 0062
+11FC5 0021
+11FC5 003F
+11FC5 0061
+11FC5 0041
+11FC5 0062
+11FC6 0021
+11FC6 003F
+11FC6 0061
+11FC6 0041
+11FC6 0062
+11FC7 0021
+11FC7 003F
+11FC7 0061
+11FC7 0041
+11FC7 0062
+11FC8 0021
+11FC8 003F
+11FC8 0061
+11FC8 0041
+11FC8 0062
+11FC9 0021
+11FC9 003F
+11FC9 0061
+11FC9 0041
+11FC9 0062
+11FCA 0021
+11FCA 003F
+11FCA 0061
+11FCA 0041
+11FCA 0062
+11FCB 0021
+11FCB 003F
+11FCB 0061
+11FCB 0041
+11FCB 0062
+11FCC 0021
+11FCC 003F
+11FCC 0061
+11FCC 0041
+11FCC 0062
+11FCD 0021
+11FCD 003F
+11FCD 0061
+11FCD 0041
+11FCD 0062
+11FCE 0021
+11FCE 003F
+11FCE 0061
+11FCE 0041
+11FCE 0062
+11FCF 0021
+11FCF 003F
+11FCF 0061
+11FCF 0041
+11FCF 0062
+11FD0 0021
+11FD0 003F
+11FD0 0061
+11FD0 0041
+11FD0 0062
+11FD1 0021
+11FD1 003F
+11FD1 0061
+11FD1 0041
+11FD1 0062
+11FD2 0021
+11FD2 003F
+11FD2 0061
+11FD2 0041
+11FD2 0062
+11FD3 0021
+11FD3 003F
+11FD3 0061
+11FD3 0041
+11FD3 0062
+11FD4 0021
+11FD4 003F
+11FD4 0061
+11FD4 0041
+11FD4 0062
0D58 0021
0D58 003F
0D58 0061
@@ -41149,6 +42255,221 @@ A835 0062
1ECB4 0061
1ECB4 0041
1ECB4 0062
+1ED0A 0021
+1ED0A 003F
+1ED0A 0061
+1ED0A 0041
+1ED0A 0062
+1ED0B 0021
+1ED0B 003F
+1ED0B 0061
+1ED0B 0041
+1ED0B 0062
+1ED0C 0021
+1ED0C 003F
+1ED0C 0061
+1ED0C 0041
+1ED0C 0062
+1ED0D 0021
+1ED0D 003F
+1ED0D 0061
+1ED0D 0041
+1ED0D 0062
+1ED0E 0021
+1ED0E 003F
+1ED0E 0061
+1ED0E 0041
+1ED0E 0062
+1ED0F 0021
+1ED0F 003F
+1ED0F 0061
+1ED0F 0041
+1ED0F 0062
+1ED10 0021
+1ED10 003F
+1ED10 0061
+1ED10 0041
+1ED10 0062
+1ED11 0021
+1ED11 003F
+1ED11 0061
+1ED11 0041
+1ED11 0062
+1ED12 0021
+1ED12 003F
+1ED12 0061
+1ED12 0041
+1ED12 0062
+1ED13 0021
+1ED13 003F
+1ED13 0061
+1ED13 0041
+1ED13 0062
+1ED14 0021
+1ED14 003F
+1ED14 0061
+1ED14 0041
+1ED14 0062
+1ED15 0021
+1ED15 003F
+1ED15 0061
+1ED15 0041
+1ED15 0062
+1ED16 0021
+1ED16 003F
+1ED16 0061
+1ED16 0041
+1ED16 0062
+1ED17 0021
+1ED17 003F
+1ED17 0061
+1ED17 0041
+1ED17 0062
+1ED18 0021
+1ED18 003F
+1ED18 0061
+1ED18 0041
+1ED18 0062
+1ED19 0021
+1ED19 003F
+1ED19 0061
+1ED19 0041
+1ED19 0062
+1ED1A 0021
+1ED1A 003F
+1ED1A 0061
+1ED1A 0041
+1ED1A 0062
+1ED1B 0021
+1ED1B 003F
+1ED1B 0061
+1ED1B 0041
+1ED1B 0062
+1ED1C 0021
+1ED1C 003F
+1ED1C 0061
+1ED1C 0041
+1ED1C 0062
+1ED1D 0021
+1ED1D 003F
+1ED1D 0061
+1ED1D 0041
+1ED1D 0062
+1ED1E 0021
+1ED1E 003F
+1ED1E 0061
+1ED1E 0041
+1ED1E 0062
+1ED1F 0021
+1ED1F 003F
+1ED1F 0061
+1ED1F 0041
+1ED1F 0062
+1ED20 0021
+1ED20 003F
+1ED20 0061
+1ED20 0041
+1ED20 0062
+1ED21 0021
+1ED21 003F
+1ED21 0061
+1ED21 0041
+1ED21 0062
+1ED22 0021
+1ED22 003F
+1ED22 0061
+1ED22 0041
+1ED22 0062
+1ED23 0021
+1ED23 003F
+1ED23 0061
+1ED23 0041
+1ED23 0062
+1ED24 0021
+1ED24 003F
+1ED24 0061
+1ED24 0041
+1ED24 0062
+1ED25 0021
+1ED25 003F
+1ED25 0061
+1ED25 0041
+1ED25 0062
+1ED26 0021
+1ED26 003F
+1ED26 0061
+1ED26 0041
+1ED26 0062
+1ED27 0021
+1ED27 003F
+1ED27 0061
+1ED27 0041
+1ED27 0062
+1ED28 0021
+1ED28 003F
+1ED28 0061
+1ED28 0041
+1ED28 0062
+1ED29 0021
+1ED29 003F
+1ED29 0061
+1ED29 0041
+1ED29 0062
+1ED2A 0021
+1ED2A 003F
+1ED2A 0061
+1ED2A 0041
+1ED2A 0062
+1ED2B 0021
+1ED2B 003F
+1ED2B 0061
+1ED2B 0041
+1ED2B 0062
+1ED2C 0021
+1ED2C 003F
+1ED2C 0061
+1ED2C 0041
+1ED2C 0062
+1ED2D 0021
+1ED2D 003F
+1ED2D 0061
+1ED2D 0041
+1ED2D 0062
+1ED37 0021
+1ED37 003F
+1ED37 0061
+1ED37 0041
+1ED37 0062
+1ED38 0021
+1ED38 003F
+1ED38 0061
+1ED38 0041
+1ED38 0062
+1ED39 0021
+1ED39 003F
+1ED39 0061
+1ED39 0041
+1ED39 0062
+1ED3A 0021
+1ED3A 003F
+1ED3A 0061
+1ED3A 0041
+1ED3A 0062
+1ED3B 0021
+1ED3B 003F
+1ED3B 0061
+1ED3B 0041
+1ED3B 0062
+1ED3C 0021
+1ED3C 003F
+1ED3C 0061
+1ED3C 0041
+1ED3C 0062
+1ED3D 0021
+1ED3D 003F
+1ED3D 0061
+1ED3D 0041
+1ED3D 0062
109C9 0021
109C9 003F
109C9 0061
@@ -41619,6 +42940,8 @@ ABF0 0021
16B50 0021
16E80 0021
1D2E0 0021
+1E140 0021
+1E2F0 0021
1E950 0021
FF10 0021
0F33 0021
@@ -41693,6 +43016,8 @@ ABF0 003F
16B50 003F
16E80 003F
1D2E0 003F
+1E140 003F
+1E2F0 003F
1E950 003F
FF10 003F
0F33 003F
@@ -41777,6 +43102,8 @@ ABF0 0061
16B50 0061
16E80 0061
1D2E0 0061
+1E140 0061
+1E2F0 0061
1E950 0061
0030 0041
0660 0041
@@ -41838,6 +43165,8 @@ ABF0 0041
16B50 0041
16E80 0041
1D2E0 0041
+1E140 0041
+1E2F0 0041
1E950 0041
FF10 0061
FF10 0041
@@ -41925,6 +43254,8 @@ ABF0 0062
16B50 0062
16E80 0062
1D2E0 0062
+1E140 0062
+1E2F0 0062
1E950 0062
FF10 0062
0F33 0062
@@ -42048,10 +43379,13 @@ ABF1 0021
1D360 0021
1D372 0021
1D377 0021
+1E141 0021
+1E2F1 0021
1E8C7 0021
1E951 0021
1EC71 0021
1ECA3 0021
+1ED01 0021
FF11 0021
0F2A 0021
1D7CF 0021
@@ -42167,10 +43501,13 @@ ABF1 003F
1D360 003F
1D372 003F
1D377 003F
+1E141 003F
+1E2F1 003F
1E8C7 003F
1E951 003F
1EC71 003F
1ECA3 003F
+1ED01 003F
FF11 003F
0F2A 003F
1D7CF 003F
@@ -42631,10 +43968,13 @@ ABF1 0061
1D360 0061
1D372 0061
1D377 0061
+1E141 0061
+1E2F1 0061
1E8C7 0061
1E951 0061
1EC71 0061
1ECA3 0061
+1ED01 0061
0031 0041
0661 0041
06F1 0041
@@ -42734,10 +44074,13 @@ ABF1 0041
1D360 0041
1D372 0041
1D377 0041
+1E141 0041
+1E2F1 0041
1E8C7 0041
1E951 0041
1EC71 0041
1ECA3 0041
+1ED01 0041
FF11 0061
FF11 0041
0F2A 0061
@@ -42869,10 +44212,13 @@ ABF1 0062
1D360 0062
1D372 0062
1D377 0062
+1E141 0062
+1E2F1 0062
1E8C7 0062
1E951 0062
1EC71 0062
1ECA3 0062
+1ED01 0062
FF11 0062
0F2A 0062
1D7CF 0062
@@ -43003,10 +44349,13 @@ ABF2 0021
1D2E2 0021
1D361 0021
1D373 0021
+1E142 0021
+1E2F2 0021
1E8C8 0021
1E952 0021
1EC72 0021
1ECA4 0021
+1ED02 0021
FF12 0021
0F2B 0021
1D7D0 0021
@@ -43023,6 +44372,7 @@ FF12 0021
2082 0021
16E95 0021
1ECB2 0021
+1ED2F 0021
0032 003F
0662 003F
06F2 003F
@@ -43117,10 +44467,13 @@ ABF2 003F
1D2E2 003F
1D361 003F
1D373 003F
+1E142 003F
+1E2F2 003F
1E8C8 003F
1E952 003F
1EC72 003F
1ECA4 003F
+1ED02 003F
FF12 003F
0F2B 003F
1D7D0 003F
@@ -43137,6 +44490,7 @@ FF12 003F
2082 003F
16E95 003F
1ECB2 003F
+1ED2F 003F
2489 0021
2489 003F
2489 0061
@@ -43391,10 +44745,13 @@ ABF2 0061
1D2E2 0061
1D361 0061
1D373 0061
+1E142 0061
+1E2F2 0061
1E8C8 0061
1E952 0061
1EC72 0061
1ECA4 0061
+1ED02 0061
0032 0041
0662 0041
06F2 0041
@@ -43489,10 +44846,13 @@ ABF2 0041
1D2E2 0041
1D361 0041
1D373 0041
+1E142 0041
+1E2F2 0041
1E8C8 0041
1E952 0041
1EC72 0041
1ECA4 0041
+1ED02 0041
FF12 0061
FF12 0041
0F2B 0061
@@ -43523,8 +44883,10 @@ FF12 0041
2082 0041
16E95 0061
1ECB2 0061
+1ED2F 0061
16E95 0041
1ECB2 0041
+1ED2F 0041
0032 0062
0662 0062
06F2 0062
@@ -43619,10 +44981,13 @@ ABF2 0062
1D2E2 0062
1D361 0062
1D373 0062
+1E142 0062
+1E2F2 0062
1E8C8 0062
1E952 0062
1EC72 0062
1ECA4 0062
+1ED02 0062
FF12 0062
0F2B 0062
1D7D0 0062
@@ -43639,6 +45004,7 @@ FF12 0062
2082 0062
16E95 0062
1ECB2 0062
+1ED2F 0062
1F19D 0021
1F19D 003F
1F19D 0061
@@ -43763,10 +45129,13 @@ ABF3 0021
1D2E3 0021
1D362 0021
1D374 0021
+1E143 0021
+1E2F3 0021
1E8C9 0021
1E953 0021
1EC73 0021
1ECA5 0021
+1ED03 0021
FF13 0021
0F2C 0021
1D7D1 0021
@@ -43782,6 +45151,7 @@ FF13 0021
00B3 0021
2083 0021
16E96 0021
+1ED30 0021
0033 003F
0663 003F
06F3 003F
@@ -43876,10 +45246,13 @@ ABF3 003F
1D2E3 003F
1D362 003F
1D374 003F
+1E143 003F
+1E2F3 003F
1E8C9 003F
1E953 003F
1EC73 003F
1ECA5 003F
+1ED03 003F
FF13 003F
0F2C 003F
1D7D1 003F
@@ -43895,6 +45268,7 @@ FF13 003F
00B3 003F
2083 003F
16E96 003F
+1ED30 003F
248A 0021
248A 003F
248A 0061
@@ -44074,10 +45448,13 @@ ABF3 0061
1D2E3 0061
1D362 0061
1D374 0061
+1E143 0061
+1E2F3 0061
1E8C9 0061
1E953 0061
1EC73 0061
1ECA5 0061
+1ED03 0061
0033 0041
0663 0041
06F3 0041
@@ -44172,10 +45549,13 @@ ABF3 0041
1D2E3 0041
1D362 0041
1D374 0041
+1E143 0041
+1E2F3 0041
1E8C9 0041
1E953 0041
1EC73 0041
1ECA5 0041
+1ED03 0041
FF13 0061
FF13 0041
0F2C 0061
@@ -44206,6 +45586,8 @@ FF13 0041
2083 0041
16E96 0061
16E96 0041
+1ED30 0061
+1ED30 0041
0033 0062
0663 0062
06F3 0062
@@ -44300,10 +45682,13 @@ ABF3 0062
1D2E3 0062
1D362 0062
1D374 0062
+1E143 0062
+1E2F3 0062
1E8C9 0062
1E953 0062
1EC73 0062
1ECA5 0062
+1ED03 0062
FF13 0062
0F2C 0062
1D7D1 0062
@@ -44319,6 +45704,7 @@ FF13 0062
00B3 0062
2083 0062
16E96 0062
+1ED30 0062
1F19B 0021
1F19B 003F
1F19B 0061
@@ -44436,10 +45822,13 @@ ABF4 0021
1D2E4 0021
1D363 0021
1D375 0021
+1E144 0021
+1E2F4 0021
1E8CA 0021
1E954 0021
1EC74 0021
1ECA6 0021
+1ED04 0021
FF14 0021
0F2D 0021
1D7D2 0021
@@ -44454,6 +45843,7 @@ FF14 0021
278D 0021
2074 0021
2084 0021
+1ED31 0021
0034 003F
0664 003F
06F4 003F
@@ -44546,10 +45936,13 @@ ABF4 003F
1D2E4 003F
1D363 003F
1D375 003F
+1E144 003F
+1E2F4 003F
1E8CA 003F
1E954 003F
1EC74 003F
1ECA6 003F
+1ED04 003F
FF14 003F
0F2D 003F
1D7D2 003F
@@ -44564,6 +45957,7 @@ FF14 003F
278D 003F
2074 003F
2084 003F
+1ED31 003F
248B 0021
248B 003F
248B 0061
@@ -44721,10 +46115,13 @@ ABF4 0061
1D2E4 0061
1D363 0061
1D375 0061
+1E144 0061
+1E2F4 0061
1E8CA 0061
1E954 0061
1EC74 0061
1ECA6 0061
+1ED04 0061
0034 0041
0664 0041
06F4 0041
@@ -44817,10 +46214,13 @@ ABF4 0041
1D2E4 0041
1D363 0041
1D375 0041
+1E144 0041
+1E2F4 0041
1E8CA 0041
1E954 0041
1EC74 0041
1ECA6 0041
+1ED04 0041
FF14 0061
FF14 0041
0F2D 0061
@@ -44849,6 +46249,8 @@ FF14 0041
2074 0041
2084 0061
2084 0041
+1ED31 0061
+1ED31 0041
0034 0062
0664 0062
06F4 0062
@@ -44941,10 +46343,13 @@ ABF4 0062
1D2E4 0062
1D363 0062
1D375 0062
+1E144 0062
+1E2F4 0062
1E8CA 0062
1E954 0062
1EC74 0062
1ECA6 0062
+1ED04 0062
FF14 0062
0F2D 0062
1D7D2 0062
@@ -44959,6 +46364,7 @@ FF14 0062
278D 0062
2074 0062
2084 0062
+1ED31 0062
1F19E 0021
1F19E 003F
1F19E 0061
@@ -45077,10 +46483,13 @@ ABF5 0021
1D364 0021
1D376 0021
1D378 0021
+1E145 0021
+1E2F5 0021
1E8CB 0021
1E955 0021
1EC75 0021
1ECA7 0021
+1ED05 0021
FF15 0021
0F2E 0021
1D7D3 0021
@@ -45095,6 +46504,7 @@ FF15 0021
278E 0021
2075 0021
2085 0021
+1ED32 0021
0035 003F
0665 003F
06F5 003F
@@ -45188,10 +46598,13 @@ ABF5 003F
1D364 003F
1D376 003F
1D378 003F
+1E145 003F
+1E2F5 003F
1E8CB 003F
1E955 003F
1EC75 003F
1ECA7 003F
+1ED05 003F
FF15 003F
0F2E 003F
1D7D3 003F
@@ -45206,6 +46619,7 @@ FF15 003F
278E 003F
2075 003F
2085 003F
+1ED32 003F
248C 0021
248C 003F
1F1A0 0021
@@ -45329,10 +46743,13 @@ ABF5 0061
1D364 0061
1D376 0061
1D378 0061
+1E145 0061
+1E2F5 0061
1E8CB 0061
1E955 0061
1EC75 0061
1ECA7 0061
+1ED05 0061
0035 0041
0665 0041
06F5 0041
@@ -45426,10 +46843,13 @@ ABF5 0041
1D364 0041
1D376 0041
1D378 0041
+1E145 0041
+1E2F5 0041
1E8CB 0041
1E955 0041
1EC75 0041
1ECA7 0041
+1ED05 0041
FF15 0061
FF15 0041
0F2E 0061
@@ -45458,6 +46878,8 @@ FF15 0041
2075 0041
2085 0061
2085 0041
+1ED32 0061
+1ED32 0041
0035 0062
0665 0062
06F5 0062
@@ -45551,10 +46973,13 @@ ABF5 0062
1D364 0062
1D376 0062
1D378 0062
+1E145 0062
+1E2F5 0062
1E8CB 0062
1E955 0062
1EC75 0062
1ECA7 0062
+1ED05 0062
FF15 0062
0F2E 0062
1D7D3 0062
@@ -45569,6 +46994,7 @@ FF15 0062
278E 0062
2075 0062
2085 0062
+1ED32 0062
33E4 0021
33E4 003F
33E4 0061
@@ -45665,10 +47091,13 @@ ABF6 0021
16E86 0021
1D2E6 0021
1D365 0021
+1E146 0021
+1E2F6 0021
1E8CC 0021
1E956 0021
1EC76 0021
1ECA8 0021
+1ED06 0021
FF16 0021
0F2F 0021
1D7D4 0021
@@ -45683,6 +47112,7 @@ FF16 0021
278F 0021
2076 0021
2086 0021
+1ED33 0021
0036 003F
0666 003F
06F6 003F
@@ -45759,10 +47189,13 @@ ABF6 003F
16E86 003F
1D2E6 003F
1D365 003F
+1E146 003F
+1E2F6 003F
1E8CC 003F
1E956 003F
1EC76 003F
1ECA8 003F
+1ED06 003F
FF16 003F
0F2F 003F
1D7D4 003F
@@ -45777,6 +47210,7 @@ FF16 003F
278F 003F
2076 003F
2086 003F
+1ED33 003F
248D 0021
248D 003F
248D 0061
@@ -45868,10 +47302,13 @@ ABF6 0061
16E86 0061
1D2E6 0061
1D365 0061
+1E146 0061
+1E2F6 0061
1E8CC 0061
1E956 0061
1EC76 0061
1ECA8 0061
+1ED06 0061
0036 0041
0666 0041
06F6 0041
@@ -45948,10 +47385,13 @@ ABF6 0041
16E86 0041
1D2E6 0041
1D365 0041
+1E146 0041
+1E2F6 0041
1E8CC 0041
1E956 0041
1EC76 0041
1ECA8 0041
+1ED06 0041
FF16 0061
FF16 0041
0F2F 0061
@@ -45980,6 +47420,8 @@ FF16 0041
2076 0041
2086 0061
2086 0041
+1ED33 0061
+1ED33 0041
0036 0062
0666 0062
06F6 0062
@@ -46056,10 +47498,13 @@ ABF6 0062
16E86 0062
1D2E6 0062
1D365 0062
+1E146 0062
+1E2F6 0062
1E8CC 0062
1E956 0062
1EC76 0062
1ECA8 0062
+1ED06 0062
FF16 0062
0F2F 0062
1D7D4 0062
@@ -46074,6 +47519,7 @@ FF16 0062
278F 0062
2076 0062
2086 0062
+1ED33 0062
33E5 0021
33E5 003F
33E5 0061
@@ -46170,10 +47616,13 @@ ABF7 0021
16E87 0021
1D2E7 0021
1D366 0021
+1E147 0021
+1E2F7 0021
1E8CD 0021
1E957 0021
1EC77 0021
1ECA9 0021
+1ED07 0021
FF17 0021
0F30 0021
1D7D5 0021
@@ -46188,6 +47637,7 @@ FF17 0021
2790 0021
2077 0021
2087 0021
+1ED34 0021
0037 003F
0667 003F
06F7 003F
@@ -46264,10 +47714,13 @@ ABF7 003F
16E87 003F
1D2E7 003F
1D366 003F
+1E147 003F
+1E2F7 003F
1E8CD 003F
1E957 003F
1EC77 003F
1ECA9 003F
+1ED07 003F
FF17 003F
0F30 003F
1D7D5 003F
@@ -46282,6 +47735,7 @@ FF17 003F
2790 003F
2077 003F
2087 003F
+1ED34 003F
248E 0021
248E 003F
1F1A1 0021
@@ -46378,10 +47832,13 @@ ABF7 0061
16E87 0061
1D2E7 0061
1D366 0061
+1E147 0061
+1E2F7 0061
1E8CD 0061
1E957 0061
1EC77 0061
1ECA9 0061
+1ED07 0061
0037 0041
0667 0041
06F7 0041
@@ -46458,10 +47915,13 @@ ABF7 0041
16E87 0041
1D2E7 0041
1D366 0041
+1E147 0041
+1E2F7 0041
1E8CD 0041
1E957 0041
1EC77 0041
1ECA9 0041
+1ED07 0041
FF17 0061
FF17 0041
0F30 0061
@@ -46490,6 +47950,8 @@ FF17 0041
2077 0041
2087 0061
2087 0041
+1ED34 0061
+1ED34 0041
0037 0062
0667 0062
06F7 0062
@@ -46566,10 +48028,13 @@ ABF7 0062
16E87 0062
1D2E7 0062
1D366 0062
+1E147 0062
+1E2F7 0062
1E8CD 0062
1E957 0062
1EC77 0062
1ECA9 0062
+1ED07 0062
FF17 0062
0F30 0062
1D7D5 0062
@@ -46584,6 +48049,7 @@ FF17 0062
2790 0062
2077 0062
2087 0062
+1ED34 0062
33E6 0021
33E6 003F
33E6 0061
@@ -46679,10 +48145,13 @@ ABF8 0021
16E88 0021
1D2E8 0021
1D367 0021
+1E148 0021
+1E2F8 0021
1E8CE 0021
1E958 0021
1EC78 0021
1ECAA 0021
+1ED08 0021
FF18 0021
0F31 0021
1D7D6 0021
@@ -46697,6 +48166,7 @@ FF18 0021
2791 0021
2078 0021
2088 0021
+1ED35 0021
0038 003F
0668 003F
06F8 003F
@@ -46772,10 +48242,13 @@ ABF8 003F
16E88 003F
1D2E8 003F
1D367 003F
+1E148 003F
+1E2F8 003F
1E8CE 003F
1E958 003F
1EC78 003F
1ECAA 003F
+1ED08 003F
FF18 003F
0F31 003F
1D7D6 003F
@@ -46790,6 +48263,7 @@ FF18 003F
2791 003F
2078 003F
2088 003F
+1ED35 003F
248F 0021
248F 003F
248F 0061
@@ -46875,10 +48349,13 @@ ABF8 0061
16E88 0061
1D2E8 0061
1D367 0061
+1E148 0061
+1E2F8 0061
1E8CE 0061
1E958 0061
1EC78 0061
1ECAA 0061
+1ED08 0061
0038 0041
0668 0041
06F8 0041
@@ -46954,10 +48431,13 @@ ABF8 0041
16E88 0041
1D2E8 0041
1D367 0041
+1E148 0041
+1E2F8 0041
1E8CE 0041
1E958 0041
1EC78 0041
1ECAA 0041
+1ED08 0041
FF18 0061
FF18 0041
0F31 0061
@@ -46986,6 +48466,8 @@ FF18 0041
2078 0041
2088 0061
2088 0041
+1ED35 0061
+1ED35 0041
0038 0062
0668 0062
06F8 0062
@@ -47061,10 +48543,13 @@ ABF8 0062
16E88 0062
1D2E8 0062
1D367 0062
+1E148 0062
+1E2F8 0062
1E8CE 0062
1E958 0062
1EC78 0062
1ECAA 0062
+1ED08 0062
FF18 0062
0F31 0062
1D7D6 0062
@@ -47079,6 +48564,7 @@ FF18 0062
2791 0062
2078 0062
2088 0062
+1ED35 0062
1F19F 0021
1F19F 003F
1F19F 0061
@@ -47181,10 +48667,13 @@ ABF9 0021
16E89 0021
1D2E9 0021
1D368 0021
+1E149 0021
+1E2F9 0021
1E8CF 0021
1E959 0021
1EC79 0021
1ECAB 0021
+1ED09 0021
FF19 0021
0F32 0021
1D7D7 0021
@@ -47199,6 +48688,7 @@ FF19 0021
2792 0021
2079 0021
2089 0021
+1ED36 0021
0039 003F
0669 003F
06F9 003F
@@ -47276,10 +48766,13 @@ ABF9 003F
16E89 003F
1D2E9 003F
1D368 003F
+1E149 003F
+1E2F9 003F
1E8CF 003F
1E959 003F
1EC79 003F
1ECAB 003F
+1ED09 003F
FF19 003F
0F32 003F
1D7D7 003F
@@ -47294,6 +48787,7 @@ FF19 003F
2792 003F
2079 003F
2089 003F
+1ED36 003F
2490 0021
2490 003F
2490 0061
@@ -47376,10 +48870,13 @@ ABF9 0061
16E89 0061
1D2E9 0061
1D368 0061
+1E149 0061
+1E2F9 0061
1E8CF 0061
1E959 0061
1EC79 0061
1ECAB 0061
+1ED09 0061
0039 0041
0669 0041
06F9 0041
@@ -47457,10 +48954,13 @@ ABF9 0041
16E89 0041
1D2E9 0041
1D368 0041
+1E149 0041
+1E2F9 0041
1E8CF 0041
1E959 0041
1EC79 0041
1ECAB 0041
+1ED09 0041
FF19 0061
FF19 0041
0F32 0061
@@ -47489,6 +48989,8 @@ FF19 0041
2079 0041
2089 0061
2089 0041
+1ED36 0061
+1ED36 0041
0039 0062
0669 0062
06F9 0062
@@ -47566,10 +49068,13 @@ ABF9 0062
16E89 0062
1D2E9 0062
1D368 0062
+1E149 0062
+1E2F9 0062
1E8CF 0062
1E959 0062
1EC79 0062
1ECAB 0062
+1ED09 0062
FF19 0062
0F32 0062
1D7D7 0062
@@ -47584,6 +49089,7 @@ FF19 0062
2792 0062
2079 0062
2089 0062
+1ED36 0062
33E8 0021
33E8 003F
33E8 0061
@@ -47921,6 +49427,15 @@ FFFB 0061
11372 0061
11373 0061
11374 0061
+13430 0061
+13431 0061
+13432 0061
+13433 0061
+13434 0061
+13435 0061
+13436 0061
+13437 0061
+13438 0061
1BCA0 0061
1BCA1 0061
1BCA2 0061
@@ -48759,6 +50274,15 @@ FFFB 0041
11372 0041
11373 0041
11374 0041
+13430 0041
+13431 0041
+13432 0041
+13433 0041
+13434 0041
+13435 0041
+13436 0041
+13437 0041
+13438 0041
1BCA0 0041
1BCA1 0041
1BCA2 0041
@@ -50373,6 +51897,7 @@ A981 0061
1163D 0061
116AB 0061
11837 0061
+119DE 0061
11A38 0061
11A96 0061
11C3D 0061
@@ -50416,6 +51941,7 @@ A981 0041
1163D 0041
116AB 0041
11837 0041
+119DE 0041
11A38 0041
11A96 0041
11C3D 0041
@@ -50452,6 +51978,7 @@ A983 0061
1163E 0061
116AC 0061
11838 0061
+119DF 0061
11A39 0061
11A97 0061
11C3E 0061
@@ -50487,6 +52014,7 @@ A983 0041
1163E 0041
116AC 0041
11838 0041
+119DF 0041
11A39 0041
11A97 0041
11C3E 0041
@@ -50593,19 +52121,41 @@ A92D 0041
193B 0061
193B 0041
16B30 0061
+1E131 0061
16B30 0041
+1E131 0041
16B31 0061
+1E136 0061
16B31 0041
+1E136 0041
16B32 0061
+1E132 0061
16B32 0041
+1E132 0041
16B33 0061
+1E133 0061
16B33 0041
+1E133 0041
16B34 0061
+1E130 0061
16B34 0041
+1E130 0041
16B35 0061
+1E134 0061
16B35 0041
+1E134 0041
16B36 0061
+1E135 0061
16B36 0041
+1E135 0041
+1E2EC 0061
+1E2EC 0041
+1E2ED 0061
+1E2ED 0041
+1E2EE 0061
+1E2EE 0041
+1E2EF 0061
+1E2EF 0041
302A 0061
302A 0041
302B 0061
@@ -51355,6 +52905,16 @@ A73C 0062
1D8F 0061
1D8F 0041
1D8F 0062
+A7BB 0021
+A7BA 0021
+A7BB 003F
+A7BA 003F
+A7BB 0061
+A7BB 0041
+A7BA 0061
+A7BA 0041
+A7BB 0062
+A7BA 0062
1D01 0021
1D01 003F
1D01 0061
@@ -51764,6 +53324,15 @@ FFFB 0062
11372 0062
11373 0062
11374 0062
+13430 0062
+13431 0062
+13432 0062
+13433 0062
+13434 0062
+13435 0062
+13436 0062
+13437 0062
+13438 0062
1BCA0 0062
1BCA1 0062
1BCA2 0062
@@ -52762,6 +54331,7 @@ A981 0062
1163D 0062
116AB 0062
11837 0062
+119DE 0062
11A38 0062
11A96 0062
11C3D 0062
@@ -52798,6 +54368,7 @@ A983 0062
1163E 0062
116AC 0062
11838 0062
+119DF 0062
11A39 0062
11A97 0062
11C3E 0062
@@ -52854,12 +54425,23 @@ A92D 0062
193A 0062
193B 0062
16B30 0062
+1E131 0062
16B31 0062
+1E136 0062
16B32 0062
+1E132 0062
16B33 0062
+1E133 0062
16B34 0062
+1E130 0062
16B35 0062
+1E134 0062
16B36 0062
+1E135 0062
+1E2EC 0062
+1E2ED 0062
+1E2EE 0062
+1E2EF 0062
302A 0062
302B 0062
302C 0062
@@ -53594,10 +55176,15 @@ A792 0041
A793 0062
A792 0062
A794 0021
+A7C4 0021
A794 003F
+A7C4 003F
A794 0061
A794 0041
+A7C4 0061
+A7C4 0041
A794 0062
+A7C4 0062
0188 0021
0187 0021
0188 003F
@@ -54075,6 +55662,11 @@ A779 0062
01C6 0062
01C5 0062
01C4 0062
+AB66 0021
+AB66 003F
+AB66 0061
+AB66 0041
+AB66 0062
02A5 0021
02A5 003F
02A5 0061
@@ -56813,6 +58405,16 @@ A7F7 0062
1D96 0061
1D96 0041
1D96 0062
+A7BD 0021
+A7BC 0021
+A7BD 003F
+A7BC 003F
+A7BD 0061
+A7BD 0041
+A7BC 0061
+A7BC 0041
+A7BD 0062
+A7BC 0062
0269 0021
0196 0021
1DA5 0021
@@ -58521,6 +60123,11 @@ FF2D 0062
33AB 0061
33AB 0041
33AB 0062
+1F16C 0021
+1F16C 003F
+1F16C 0061
+1F16C 0041
+1F16C 0062
33B3 0021
33B3 003F
33B3 0061
@@ -61891,14 +63498,19 @@ A731 0062
1D8A 0041
1D8A 0062
0282 0021
+A7C5 0021
1DB3 0021
0282 003F
+A7C5 003F
1DB3 003F
0282 0061
0282 0041
+A7C5 0061
+A7C5 0041
1DB3 0061
1DB3 0041
0282 0062
+A7C5 0062
1DB3 0062
023F 0021
2C7E 0021
@@ -62334,6 +63946,11 @@ A786 0062
02A6 0041
01BE 0062
02A6 0062
+AB67 0021
+AB67 003F
+AB67 0061
+AB67 0041
+AB67 0062
02A7 0021
02A7 003F
02A7 0061
@@ -63261,6 +64878,16 @@ AB5F 0061
AB5F 0041
AB52 0062
AB5F 0062
+A7BF 0021
+A7BE 0021
+A7BF 003F
+A7BE 003F
+A7BF 0061
+A7BF 0041
+A7BE 0061
+A7BE 0041
+A7BF 0062
+A7BE 0062
0265 0021
A78D 0021
1DA3 0021
@@ -64030,6 +65657,16 @@ FF37 0062
1D21 0061
1D21 0041
1D21 0062
+A7C3 0021
+A7C2 0021
+A7C3 003F
+A7C2 003F
+A7C3 0061
+A7C3 0041
+A7C2 0061
+A7C2 0041
+A7C3 0062
+A7C2 0062
2C73 0021
2C72 0021
2C73 003F
@@ -65041,10 +66678,15 @@ FF3A 0062
1D76 0041
1D76 0062
1D8E 0021
+A7C6 0021
1D8E 003F
+A7C6 003F
1D8E 0061
1D8E 0041
+A7C6 0061
+A7C6 0041
1D8E 0062
+A7C6 0062
0225 0021
0224 0021
0225 003F
@@ -84828,6 +86470,7 @@ A8FE 0062
1CEF 0021
1CF0 0021
1CF1 0021
+1CFA 0021
1CE9 003F
1CEA 003F
1CEB 003F
@@ -84836,6 +86479,7 @@ A8FE 0062
1CEF 003F
1CF0 003F
1CF1 003F
+1CFA 003F
1CE9 0061
1CE9 0041
1CEA 0061
@@ -84845,6 +86489,7 @@ A8FE 0062
1CEF 0061
1CF0 0061
1CF1 0061
+1CFA 0061
1CEA 0041
1CEB 0041
1CEC 0041
@@ -84852,6 +86497,7 @@ A8FE 0062
1CEF 0041
1CF0 0041
1CF1 0041
+1CFA 0041
1CE9 0062
1CEA 0062
1CEB 0062
@@ -84860,6 +86506,7 @@ A8FE 0062
1CEF 0062
1CF0 0062
1CF1 0062
+1CFA 0062
1CF5 0021
1CF5 003F
1CF5 0061
@@ -91497,6 +93144,11 @@ A8C4 0062
11448 0061
11448 0041
11448 0062
+1145F 0021
+1145F 003F
+1145F 0061
+1145F 0041
+1145F 0062
11435 0021
11435 003F
11435 0061
@@ -92665,6 +94317,11 @@ A8C4 0062
1168B 0061
1168B 0041
1168B 0062
+116B8 0021
+116B8 003F
+116B8 0061
+116B8 0041
+116B8 0062
1168C 0021
1168C 003F
1168C 0061
@@ -92857,6 +94514,318 @@ A8C4 0062
116B6 0061
116B6 0041
116B6 0062
+119A0 0021
+119A0 003F
+119A0 0061
+119A0 0041
+119A0 0062
+119A1 0021
+119A1 003F
+119A1 0061
+119A1 0041
+119A1 0062
+119A2 0021
+119A2 003F
+119A2 0061
+119A2 0041
+119A2 0062
+119A3 0021
+119A3 003F
+119A3 0061
+119A3 0041
+119A3 0062
+119A4 0021
+119A4 003F
+119A4 0061
+119A4 0041
+119A4 0062
+119A5 0021
+119A5 003F
+119A5 0061
+119A5 0041
+119A5 0062
+119A6 0021
+119A6 003F
+119A6 0061
+119A6 0041
+119A6 0062
+119A7 0021
+119A7 003F
+119A7 0061
+119A7 0041
+119A7 0062
+119AA 0021
+119AA 003F
+119AA 0061
+119AA 0041
+119AA 0062
+119AB 0021
+119AB 003F
+119AB 0061
+119AB 0041
+119AB 0062
+119AC 0021
+119AC 003F
+119AC 0061
+119AC 0041
+119AC 0062
+119AD 0021
+119AD 003F
+119AD 0061
+119AD 0041
+119AD 0062
+119AE 0021
+119AE 003F
+119AE 0061
+119AE 0041
+119AE 0062
+119AF 0021
+119AF 003F
+119AF 0061
+119AF 0041
+119AF 0062
+119B0 0021
+119B0 003F
+119B0 0061
+119B0 0041
+119B0 0062
+119B1 0021
+119B1 003F
+119B1 0061
+119B1 0041
+119B1 0062
+119B2 0021
+119B2 003F
+119B2 0061
+119B2 0041
+119B2 0062
+119B3 0021
+119B3 003F
+119B3 0061
+119B3 0041
+119B3 0062
+119B4 0021
+119B4 003F
+119B4 0061
+119B4 0041
+119B4 0062
+119B5 0021
+119B5 003F
+119B5 0061
+119B5 0041
+119B5 0062
+119B6 0021
+119B6 003F
+119B6 0061
+119B6 0041
+119B6 0062
+119B7 0021
+119B7 003F
+119B7 0061
+119B7 0041
+119B7 0062
+119B8 0021
+119B8 003F
+119B8 0061
+119B8 0041
+119B8 0062
+119B9 0021
+119B9 003F
+119B9 0061
+119B9 0041
+119B9 0062
+119BA 0021
+119BA 003F
+119BA 0061
+119BA 0041
+119BA 0062
+119BB 0021
+119BB 003F
+119BB 0061
+119BB 0041
+119BB 0062
+119BC 0021
+119BC 003F
+119BC 0061
+119BC 0041
+119BC 0062
+119BD 0021
+119BD 003F
+119BD 0061
+119BD 0041
+119BD 0062
+119BE 0021
+119BE 003F
+119BE 0061
+119BE 0041
+119BE 0062
+119BF 0021
+119BF 003F
+119BF 0061
+119BF 0041
+119BF 0062
+119C0 0021
+119C0 003F
+119C0 0061
+119C0 0041
+119C0 0062
+119C1 0021
+119C1 003F
+119C1 0061
+119C1 0041
+119C1 0062
+119C2 0021
+119C2 003F
+119C2 0061
+119C2 0041
+119C2 0062
+119C3 0021
+119C3 003F
+119C3 0061
+119C3 0041
+119C3 0062
+119C4 0021
+119C4 003F
+119C4 0061
+119C4 0041
+119C4 0062
+119C5 0021
+119C5 003F
+119C5 0061
+119C5 0041
+119C5 0062
+119C6 0021
+119C6 003F
+119C6 0061
+119C6 0041
+119C6 0062
+119C7 0021
+119C7 003F
+119C7 0061
+119C7 0041
+119C7 0062
+119C8 0021
+119C8 003F
+119C8 0061
+119C8 0041
+119C8 0062
+119C9 0021
+119C9 003F
+119C9 0061
+119C9 0041
+119C9 0062
+119CA 0021
+119CA 003F
+119CA 0061
+119CA 0041
+119CA 0062
+119CB 0021
+119CB 003F
+119CB 0061
+119CB 0041
+119CB 0062
+119CC 0021
+119CC 003F
+119CC 0061
+119CC 0041
+119CC 0062
+119CD 0021
+119CD 003F
+119CD 0061
+119CD 0041
+119CD 0062
+119CE 0021
+119CE 003F
+119CE 0061
+119CE 0041
+119CE 0062
+119CF 0021
+119CF 003F
+119CF 0061
+119CF 0041
+119CF 0062
+119D0 0021
+119D0 003F
+119D0 0061
+119D0 0041
+119D0 0062
+119E1 0021
+119E1 003F
+119E1 0061
+119E1 0041
+119E1 0062
+119E3 0021
+119E3 003F
+119E3 0061
+119E3 0041
+119E3 0062
+119D1 0021
+119D1 003F
+119D1 0061
+119D1 0041
+119D1 0062
+119D2 0021
+119D2 003F
+119D2 0061
+119D2 0041
+119D2 0062
+119D3 0021
+119D3 003F
+119D3 0061
+119D3 0041
+119D3 0062
+119D4 0021
+119D4 003F
+119D4 0061
+119D4 0041
+119D4 0062
+119D5 0021
+119D5 003F
+119D5 0061
+119D5 0041
+119D5 0062
+119D6 0021
+119D6 003F
+119D6 0061
+119D6 0041
+119D6 0062
+119D7 0021
+119D7 003F
+119D7 0061
+119D7 0041
+119D7 0062
+119DA 0021
+119DA 003F
+119DA 0061
+119DA 0041
+119DA 0062
+119E4 0021
+119E4 003F
+119E4 0061
+119E4 0041
+119E4 0062
+119DB 0021
+119DB 003F
+119DB 0061
+119DB 0041
+119DB 0062
+119DC 0021
+119DC 003F
+119DC 0061
+119DC 0041
+119DC 0062
+119DD 0021
+119DD 003F
+119DD 0061
+119DD 0041
+119DD 0062
+0334 119E0
+119E0 0334
+119E0 0021
+119E0 003F
+119E0 0061
+119E0 0041
+119E0 0062
11800 0021
11800 003F
11800 0061
@@ -97343,6 +99312,36 @@ A8C4 0062
0EC4 0E84 0061
0EC4 0E84 0041
0EC4 0E84 0062
+0E86 0021
+0E86 003F
+0E86 0061
+0E86 0041
+0E86 0062
+0EC0 0E86 0021
+0EC0 0E86 003F
+0EC0 0E86 0061
+0EC0 0E86 0041
+0EC0 0E86 0062
+0EC1 0E86 0021
+0EC1 0E86 003F
+0EC1 0E86 0061
+0EC1 0E86 0041
+0EC1 0E86 0062
+0EC2 0E86 0021
+0EC2 0E86 003F
+0EC2 0E86 0061
+0EC2 0E86 0041
+0EC2 0E86 0062
+0EC3 0E86 0021
+0EC3 0E86 003F
+0EC3 0E86 0061
+0EC3 0E86 0041
+0EC3 0E86 0062
+0EC4 0E86 0021
+0EC4 0E86 003F
+0EC4 0E86 0061
+0EC4 0E86 0041
+0EC4 0E86 0062
0E87 0021
0E87 003F
0E87 0061
@@ -97403,6 +99402,36 @@ A8C4 0062
0EC4 0E88 0061
0EC4 0E88 0041
0EC4 0E88 0062
+0E89 0021
+0E89 003F
+0E89 0061
+0E89 0041
+0E89 0062
+0EC0 0E89 0021
+0EC0 0E89 003F
+0EC0 0E89 0061
+0EC0 0E89 0041
+0EC0 0E89 0062
+0EC1 0E89 0021
+0EC1 0E89 003F
+0EC1 0E89 0061
+0EC1 0E89 0041
+0EC1 0E89 0062
+0EC2 0E89 0021
+0EC2 0E89 003F
+0EC2 0E89 0061
+0EC2 0E89 0041
+0EC2 0E89 0062
+0EC3 0E89 0021
+0EC3 0E89 003F
+0EC3 0E89 0061
+0EC3 0E89 0041
+0EC3 0E89 0062
+0EC4 0E89 0021
+0EC4 0E89 003F
+0EC4 0E89 0061
+0EC4 0E89 0041
+0EC4 0E89 0062
0EAA 0021
0EAA 003F
0EAA 0061
@@ -97463,6 +99492,66 @@ A8C4 0062
0EC4 0E8A 0061
0EC4 0E8A 0041
0EC4 0E8A 0062
+0E8C 0021
+0E8C 003F
+0E8C 0061
+0E8C 0041
+0E8C 0062
+0EC0 0E8C 0021
+0EC0 0E8C 003F
+0EC0 0E8C 0061
+0EC0 0E8C 0041
+0EC0 0E8C 0062
+0EC1 0E8C 0021
+0EC1 0E8C 003F
+0EC1 0E8C 0061
+0EC1 0E8C 0041
+0EC1 0E8C 0062
+0EC2 0E8C 0021
+0EC2 0E8C 003F
+0EC2 0E8C 0061
+0EC2 0E8C 0041
+0EC2 0E8C 0062
+0EC3 0E8C 0021
+0EC3 0E8C 003F
+0EC3 0E8C 0061
+0EC3 0E8C 0041
+0EC3 0E8C 0062
+0EC4 0E8C 0021
+0EC4 0E8C 003F
+0EC4 0E8C 0061
+0EC4 0E8C 0041
+0EC4 0E8C 0062
+0E8E 0021
+0E8E 003F
+0E8E 0061
+0E8E 0041
+0E8E 0062
+0EC0 0E8E 0021
+0EC0 0E8E 003F
+0EC0 0E8E 0061
+0EC0 0E8E 0041
+0EC0 0E8E 0062
+0EC1 0E8E 0021
+0EC1 0E8E 003F
+0EC1 0E8E 0061
+0EC1 0E8E 0041
+0EC1 0E8E 0062
+0EC2 0E8E 0021
+0EC2 0E8E 003F
+0EC2 0E8E 0061
+0EC2 0E8E 0041
+0EC2 0E8E 0062
+0EC3 0E8E 0021
+0EC3 0E8E 003F
+0EC3 0E8E 0061
+0EC3 0E8E 0041
+0EC3 0E8E 0062
+0EC4 0E8E 0021
+0EC4 0E8E 003F
+0EC4 0E8E 0061
+0EC4 0E8E 0041
+0EC4 0E8E 0062
0EDF 0021
0EDF 003F
0EDF 0061
@@ -97523,6 +99612,156 @@ A8C4 0062
0EC4 0E8D 0061
0EC4 0E8D 0041
0EC4 0E8D 0062
+0E8F 0021
+0E8F 003F
+0E8F 0061
+0E8F 0041
+0E8F 0062
+0EC0 0E8F 0021
+0EC0 0E8F 003F
+0EC0 0E8F 0061
+0EC0 0E8F 0041
+0EC0 0E8F 0062
+0EC1 0E8F 0021
+0EC1 0E8F 003F
+0EC1 0E8F 0061
+0EC1 0E8F 0041
+0EC1 0E8F 0062
+0EC2 0E8F 0021
+0EC2 0E8F 003F
+0EC2 0E8F 0061
+0EC2 0E8F 0041
+0EC2 0E8F 0062
+0EC3 0E8F 0021
+0EC3 0E8F 003F
+0EC3 0E8F 0061
+0EC3 0E8F 0041
+0EC3 0E8F 0062
+0EC4 0E8F 0021
+0EC4 0E8F 003F
+0EC4 0E8F 0061
+0EC4 0E8F 0041
+0EC4 0E8F 0062
+0E90 0021
+0E90 003F
+0E90 0061
+0E90 0041
+0E90 0062
+0EC0 0E90 0021
+0EC0 0E90 003F
+0EC0 0E90 0061
+0EC0 0E90 0041
+0EC0 0E90 0062
+0EC1 0E90 0021
+0EC1 0E90 003F
+0EC1 0E90 0061
+0EC1 0E90 0041
+0EC1 0E90 0062
+0EC2 0E90 0021
+0EC2 0E90 003F
+0EC2 0E90 0061
+0EC2 0E90 0041
+0EC2 0E90 0062
+0EC3 0E90 0021
+0EC3 0E90 003F
+0EC3 0E90 0061
+0EC3 0E90 0041
+0EC3 0E90 0062
+0EC4 0E90 0021
+0EC4 0E90 003F
+0EC4 0E90 0061
+0EC4 0E90 0041
+0EC4 0E90 0062
+0E91 0021
+0E91 003F
+0E91 0061
+0E91 0041
+0E91 0062
+0EC0 0E91 0021
+0EC0 0E91 003F
+0EC0 0E91 0061
+0EC0 0E91 0041
+0EC0 0E91 0062
+0EC1 0E91 0021
+0EC1 0E91 003F
+0EC1 0E91 0061
+0EC1 0E91 0041
+0EC1 0E91 0062
+0EC2 0E91 0021
+0EC2 0E91 003F
+0EC2 0E91 0061
+0EC2 0E91 0041
+0EC2 0E91 0062
+0EC3 0E91 0021
+0EC3 0E91 003F
+0EC3 0E91 0061
+0EC3 0E91 0041
+0EC3 0E91 0062
+0EC4 0E91 0021
+0EC4 0E91 003F
+0EC4 0E91 0061
+0EC4 0E91 0041
+0EC4 0E91 0062
+0E92 0021
+0E92 003F
+0E92 0061
+0E92 0041
+0E92 0062
+0EC0 0E92 0021
+0EC0 0E92 003F
+0EC0 0E92 0061
+0EC0 0E92 0041
+0EC0 0E92 0062
+0EC1 0E92 0021
+0EC1 0E92 003F
+0EC1 0E92 0061
+0EC1 0E92 0041
+0EC1 0E92 0062
+0EC2 0E92 0021
+0EC2 0E92 003F
+0EC2 0E92 0061
+0EC2 0E92 0041
+0EC2 0E92 0062
+0EC3 0E92 0021
+0EC3 0E92 003F
+0EC3 0E92 0061
+0EC3 0E92 0041
+0EC3 0E92 0062
+0EC4 0E92 0021
+0EC4 0E92 003F
+0EC4 0E92 0061
+0EC4 0E92 0041
+0EC4 0E92 0062
+0E93 0021
+0E93 003F
+0E93 0061
+0E93 0041
+0E93 0062
+0EC0 0E93 0021
+0EC0 0E93 003F
+0EC0 0E93 0061
+0EC0 0E93 0041
+0EC0 0E93 0062
+0EC1 0E93 0021
+0EC1 0E93 003F
+0EC1 0E93 0061
+0EC1 0E93 0041
+0EC1 0E93 0062
+0EC2 0E93 0021
+0EC2 0E93 003F
+0EC2 0E93 0061
+0EC2 0E93 0041
+0EC2 0E93 0062
+0EC3 0E93 0021
+0EC3 0E93 003F
+0EC3 0E93 0061
+0EC3 0E93 0041
+0EC3 0E93 0062
+0EC4 0E93 0021
+0EC4 0E93 003F
+0EC4 0E93 0061
+0EC4 0E93 0041
+0EC4 0E93 0062
0E94 0021
0E94 003F
0E94 0061
@@ -97643,6 +99882,36 @@ A8C4 0062
0EC4 0E97 0061
0EC4 0E97 0041
0EC4 0E97 0062
+0E98 0021
+0E98 003F
+0E98 0061
+0E98 0041
+0E98 0062
+0EC0 0E98 0021
+0EC0 0E98 003F
+0EC0 0E98 0061
+0EC0 0E98 0041
+0EC0 0E98 0062
+0EC1 0E98 0021
+0EC1 0E98 003F
+0EC1 0E98 0061
+0EC1 0E98 0041
+0EC1 0E98 0062
+0EC2 0E98 0021
+0EC2 0E98 003F
+0EC2 0E98 0061
+0EC2 0E98 0041
+0EC2 0E98 0062
+0EC3 0E98 0021
+0EC3 0E98 003F
+0EC3 0E98 0061
+0EC3 0E98 0041
+0EC3 0E98 0062
+0EC4 0E98 0021
+0EC4 0E98 003F
+0EC4 0E98 0061
+0EC4 0E98 0041
+0EC4 0E98 0062
0E99 0021
0E99 003F
0E99 0061
@@ -97853,6 +100122,36 @@ A8C4 0062
0EC4 0E9F 0061
0EC4 0E9F 0041
0EC4 0E9F 0062
+0EA0 0021
+0EA0 003F
+0EA0 0061
+0EA0 0041
+0EA0 0062
+0EC0 0EA0 0021
+0EC0 0EA0 003F
+0EC0 0EA0 0061
+0EC0 0EA0 0041
+0EC0 0EA0 0062
+0EC1 0EA0 0021
+0EC1 0EA0 003F
+0EC1 0EA0 0061
+0EC1 0EA0 0041
+0EC1 0EA0 0062
+0EC2 0EA0 0021
+0EC2 0EA0 003F
+0EC2 0EA0 0061
+0EC2 0EA0 0041
+0EC2 0EA0 0062
+0EC3 0EA0 0021
+0EC3 0EA0 003F
+0EC3 0EA0 0061
+0EC3 0EA0 0041
+0EC3 0EA0 0062
+0EC4 0EA0 0021
+0EC4 0EA0 003F
+0EC4 0EA0 0061
+0EC4 0EA0 0041
+0EC4 0EA0 0062
0EA1 0021
0EA1 003F
0EA1 0061
@@ -98003,6 +100302,66 @@ A8C4 0062
0EC4 0EA7 0061
0EC4 0EA7 0041
0EC4 0EA7 0062
+0EA8 0021
+0EA8 003F
+0EA8 0061
+0EA8 0041
+0EA8 0062
+0EC0 0EA8 0021
+0EC0 0EA8 003F
+0EC0 0EA8 0061
+0EC0 0EA8 0041
+0EC0 0EA8 0062
+0EC1 0EA8 0021
+0EC1 0EA8 003F
+0EC1 0EA8 0061
+0EC1 0EA8 0041
+0EC1 0EA8 0062
+0EC2 0EA8 0021
+0EC2 0EA8 003F
+0EC2 0EA8 0061
+0EC2 0EA8 0041
+0EC2 0EA8 0062
+0EC3 0EA8 0021
+0EC3 0EA8 003F
+0EC3 0EA8 0061
+0EC3 0EA8 0041
+0EC3 0EA8 0062
+0EC4 0EA8 0021
+0EC4 0EA8 003F
+0EC4 0EA8 0061
+0EC4 0EA8 0041
+0EC4 0EA8 0062
+0EA9 0021
+0EA9 003F
+0EA9 0061
+0EA9 0041
+0EA9 0062
+0EC0 0EA9 0021
+0EC0 0EA9 003F
+0EC0 0EA9 0061
+0EC0 0EA9 0041
+0EC0 0EA9 0062
+0EC1 0EA9 0021
+0EC1 0EA9 003F
+0EC1 0EA9 0061
+0EC1 0EA9 0041
+0EC1 0EA9 0062
+0EC2 0EA9 0021
+0EC2 0EA9 003F
+0EC2 0EA9 0061
+0EC2 0EA9 0041
+0EC2 0EA9 0062
+0EC3 0EA9 0021
+0EC3 0EA9 003F
+0EC3 0EA9 0061
+0EC3 0EA9 0041
+0EC3 0EA9 0062
+0EC4 0EA9 0021
+0EC4 0EA9 003F
+0EC4 0EA9 0061
+0EC4 0EA9 0041
+0EC4 0EA9 0062
0EAB 0021
0EAB 003F
0EAB 0061
@@ -98093,6 +100452,36 @@ A8C4 0062
0EC4 0EAB 0061
0EC4 0EAB 0041
0EC4 0EAB 0062
+0EAC 0021
+0EAC 003F
+0EAC 0061
+0EAC 0041
+0EAC 0062
+0EC0 0EAC 0021
+0EC0 0EAC 003F
+0EC0 0EAC 0061
+0EC0 0EAC 0041
+0EC0 0EAC 0062
+0EC1 0EAC 0021
+0EC1 0EAC 003F
+0EC1 0EAC 0061
+0EC1 0EAC 0041
+0EC1 0EAC 0062
+0EC2 0EAC 0021
+0EC2 0EAC 003F
+0EC2 0EAC 0061
+0EC2 0EAC 0041
+0EC2 0EAC 0062
+0EC3 0EAC 0021
+0EC3 0EAC 003F
+0EC3 0EAC 0061
+0EC3 0EAC 0041
+0EC3 0EAC 0062
+0EC4 0EAC 0021
+0EC4 0EAC 003F
+0EC4 0EAC 0061
+0EC4 0EAC 0041
+0EC4 0EAC 0062
0EAD 0021
0EAD 003F
0EAD 0061
@@ -98220,6 +100609,13 @@ A8C4 0062
0EB9 0061
0EB9 0041
0EB9 0062
+0334 0EBA
+0EBA 0334
+0EBA 0021
+0EBA 003F
+0EBA 0061
+0EBA 0041
+0EBA 0062
0EBB 0021
0EBB 003F
0EBB 0061
@@ -98252,24 +100648,51 @@ A8C4 0062
0EC0 0001 0E84 0061
0EC0 0591 0E84 0061
0EC0 1D165 0E84 0061
+0EC0 0001 0E86 0061
+0EC0 0591 0E86 0061
+0EC0 1D165 0E86 0061
0EC0 0001 0E87 0061
0EC0 0591 0E87 0061
0EC0 1D165 0E87 0061
0EC0 0001 0E88 0061
0EC0 0591 0E88 0061
0EC0 1D165 0E88 0061
+0EC0 0001 0E89 0061
+0EC0 0591 0E89 0061
+0EC0 1D165 0E89 0061
0EC0 0001 0EAA 0061
0EC0 0591 0EAA 0061
0EC0 1D165 0EAA 0061
0EC0 0001 0E8A 0061
0EC0 0591 0E8A 0061
0EC0 1D165 0E8A 0061
+0EC0 0001 0E8C 0061
+0EC0 0591 0E8C 0061
+0EC0 1D165 0E8C 0061
+0EC0 0001 0E8E 0061
+0EC0 0591 0E8E 0061
+0EC0 1D165 0E8E 0061
0EC0 0001 0EDF 0061
0EC0 0591 0EDF 0061
0EC0 1D165 0EDF 0061
0EC0 0001 0E8D 0061
0EC0 0591 0E8D 0061
0EC0 1D165 0E8D 0061
+0EC0 0001 0E8F 0061
+0EC0 0591 0E8F 0061
+0EC0 1D165 0E8F 0061
+0EC0 0001 0E90 0061
+0EC0 0591 0E90 0061
+0EC0 1D165 0E90 0061
+0EC0 0001 0E91 0061
+0EC0 0591 0E91 0061
+0EC0 1D165 0E91 0061
+0EC0 0001 0E92 0061
+0EC0 0591 0E92 0061
+0EC0 1D165 0E92 0061
+0EC0 0001 0E93 0061
+0EC0 0591 0E93 0061
+0EC0 1D165 0E93 0061
0EC0 0001 0E94 0061
0EC0 0591 0E94 0061
0EC0 1D165 0E94 0061
@@ -98282,6 +100705,9 @@ A8C4 0062
0EC0 0001 0E97 0061
0EC0 0591 0E97 0061
0EC0 1D165 0E97 0061
+0EC0 0001 0E98 0061
+0EC0 0591 0E98 0061
+0EC0 1D165 0E98 0061
0EC0 0001 0E99 0061
0EC0 0591 0E99 0061
0EC0 1D165 0E99 0061
@@ -98303,6 +100729,9 @@ A8C4 0062
0EC0 0001 0E9F 0061
0EC0 0591 0E9F 0061
0EC0 1D165 0E9F 0061
+0EC0 0001 0EA0 0061
+0EC0 0591 0EA0 0061
+0EC0 1D165 0EA0 0061
0EC0 0001 0EA1 0061
0EC0 0591 0EA1 0061
0EC0 1D165 0EA1 0061
@@ -98318,6 +100747,12 @@ A8C4 0062
0EC0 0001 0EA7 0061
0EC0 0591 0EA7 0061
0EC0 1D165 0EA7 0061
+0EC0 0001 0EA8 0061
+0EC0 0591 0EA8 0061
+0EC0 1D165 0EA8 0061
+0EC0 0001 0EA9 0061
+0EC0 0591 0EA9 0061
+0EC0 1D165 0EA9 0061
0EC0 0001 0EAB 0061
0EC0 0591 0EAB 0061
0EC0 1D165 0EAB 0061
@@ -98327,6 +100762,9 @@ A8C4 0062
0EC0 0001 0EDD 0061
0EC0 0591 0EDD 0061
0EC0 1D165 0EDD 0061
+0EC0 0001 0EAC 0061
+0EC0 0591 0EAC 0061
+0EC0 1D165 0EAC 0061
0EC0 0001 0EAD 0061
0EC0 0591 0EAD 0061
0EC0 1D165 0EAD 0061
@@ -98350,24 +100788,51 @@ A8C4 0062
0EC1 0001 0E84 0061
0EC1 0591 0E84 0061
0EC1 1D165 0E84 0061
+0EC1 0001 0E86 0061
+0EC1 0591 0E86 0061
+0EC1 1D165 0E86 0061
0EC1 0001 0E87 0061
0EC1 0591 0E87 0061
0EC1 1D165 0E87 0061
0EC1 0001 0E88 0061
0EC1 0591 0E88 0061
0EC1 1D165 0E88 0061
+0EC1 0001 0E89 0061
+0EC1 0591 0E89 0061
+0EC1 1D165 0E89 0061
0EC1 0001 0EAA 0061
0EC1 0591 0EAA 0061
0EC1 1D165 0EAA 0061
0EC1 0001 0E8A 0061
0EC1 0591 0E8A 0061
0EC1 1D165 0E8A 0061
+0EC1 0001 0E8C 0061
+0EC1 0591 0E8C 0061
+0EC1 1D165 0E8C 0061
+0EC1 0001 0E8E 0061
+0EC1 0591 0E8E 0061
+0EC1 1D165 0E8E 0061
0EC1 0001 0EDF 0061
0EC1 0591 0EDF 0061
0EC1 1D165 0EDF 0061
0EC1 0001 0E8D 0061
0EC1 0591 0E8D 0061
0EC1 1D165 0E8D 0061
+0EC1 0001 0E8F 0061
+0EC1 0591 0E8F 0061
+0EC1 1D165 0E8F 0061
+0EC1 0001 0E90 0061
+0EC1 0591 0E90 0061
+0EC1 1D165 0E90 0061
+0EC1 0001 0E91 0061
+0EC1 0591 0E91 0061
+0EC1 1D165 0E91 0061
+0EC1 0001 0E92 0061
+0EC1 0591 0E92 0061
+0EC1 1D165 0E92 0061
+0EC1 0001 0E93 0061
+0EC1 0591 0E93 0061
+0EC1 1D165 0E93 0061
0EC1 0001 0E94 0061
0EC1 0591 0E94 0061
0EC1 1D165 0E94 0061
@@ -98380,6 +100845,9 @@ A8C4 0062
0EC1 0001 0E97 0061
0EC1 0591 0E97 0061
0EC1 1D165 0E97 0061
+0EC1 0001 0E98 0061
+0EC1 0591 0E98 0061
+0EC1 1D165 0E98 0061
0EC1 0001 0E99 0061
0EC1 0591 0E99 0061
0EC1 1D165 0E99 0061
@@ -98401,6 +100869,9 @@ A8C4 0062
0EC1 0001 0E9F 0061
0EC1 0591 0E9F 0061
0EC1 1D165 0E9F 0061
+0EC1 0001 0EA0 0061
+0EC1 0591 0EA0 0061
+0EC1 1D165 0EA0 0061
0EC1 0001 0EA1 0061
0EC1 0591 0EA1 0061
0EC1 1D165 0EA1 0061
@@ -98416,6 +100887,12 @@ A8C4 0062
0EC1 0001 0EA7 0061
0EC1 0591 0EA7 0061
0EC1 1D165 0EA7 0061
+0EC1 0001 0EA8 0061
+0EC1 0591 0EA8 0061
+0EC1 1D165 0EA8 0061
+0EC1 0001 0EA9 0061
+0EC1 0591 0EA9 0061
+0EC1 1D165 0EA9 0061
0EC1 0001 0EAB 0061
0EC1 0591 0EAB 0061
0EC1 1D165 0EAB 0061
@@ -98425,6 +100902,9 @@ A8C4 0062
0EC1 0001 0EDD 0061
0EC1 0591 0EDD 0061
0EC1 1D165 0EDD 0061
+0EC1 0001 0EAC 0061
+0EC1 0591 0EAC 0061
+0EC1 1D165 0EAC 0061
0EC1 0001 0EAD 0061
0EC1 0591 0EAD 0061
0EC1 1D165 0EAD 0061
@@ -98448,24 +100928,51 @@ A8C4 0062
0EC2 0001 0E84 0061
0EC2 0591 0E84 0061
0EC2 1D165 0E84 0061
+0EC2 0001 0E86 0061
+0EC2 0591 0E86 0061
+0EC2 1D165 0E86 0061
0EC2 0001 0E87 0061
0EC2 0591 0E87 0061
0EC2 1D165 0E87 0061
0EC2 0001 0E88 0061
0EC2 0591 0E88 0061
0EC2 1D165 0E88 0061
+0EC2 0001 0E89 0061
+0EC2 0591 0E89 0061
+0EC2 1D165 0E89 0061
0EC2 0001 0EAA 0061
0EC2 0591 0EAA 0061
0EC2 1D165 0EAA 0061
0EC2 0001 0E8A 0061
0EC2 0591 0E8A 0061
0EC2 1D165 0E8A 0061
+0EC2 0001 0E8C 0061
+0EC2 0591 0E8C 0061
+0EC2 1D165 0E8C 0061
+0EC2 0001 0E8E 0061
+0EC2 0591 0E8E 0061
+0EC2 1D165 0E8E 0061
0EC2 0001 0EDF 0061
0EC2 0591 0EDF 0061
0EC2 1D165 0EDF 0061
0EC2 0001 0E8D 0061
0EC2 0591 0E8D 0061
0EC2 1D165 0E8D 0061
+0EC2 0001 0E8F 0061
+0EC2 0591 0E8F 0061
+0EC2 1D165 0E8F 0061
+0EC2 0001 0E90 0061
+0EC2 0591 0E90 0061
+0EC2 1D165 0E90 0061
+0EC2 0001 0E91 0061
+0EC2 0591 0E91 0061
+0EC2 1D165 0E91 0061
+0EC2 0001 0E92 0061
+0EC2 0591 0E92 0061
+0EC2 1D165 0E92 0061
+0EC2 0001 0E93 0061
+0EC2 0591 0E93 0061
+0EC2 1D165 0E93 0061
0EC2 0001 0E94 0061
0EC2 0591 0E94 0061
0EC2 1D165 0E94 0061
@@ -98478,6 +100985,9 @@ A8C4 0062
0EC2 0001 0E97 0061
0EC2 0591 0E97 0061
0EC2 1D165 0E97 0061
+0EC2 0001 0E98 0061
+0EC2 0591 0E98 0061
+0EC2 1D165 0E98 0061
0EC2 0001 0E99 0061
0EC2 0591 0E99 0061
0EC2 1D165 0E99 0061
@@ -98499,6 +101009,9 @@ A8C4 0062
0EC2 0001 0E9F 0061
0EC2 0591 0E9F 0061
0EC2 1D165 0E9F 0061
+0EC2 0001 0EA0 0061
+0EC2 0591 0EA0 0061
+0EC2 1D165 0EA0 0061
0EC2 0001 0EA1 0061
0EC2 0591 0EA1 0061
0EC2 1D165 0EA1 0061
@@ -98514,6 +101027,12 @@ A8C4 0062
0EC2 0001 0EA7 0061
0EC2 0591 0EA7 0061
0EC2 1D165 0EA7 0061
+0EC2 0001 0EA8 0061
+0EC2 0591 0EA8 0061
+0EC2 1D165 0EA8 0061
+0EC2 0001 0EA9 0061
+0EC2 0591 0EA9 0061
+0EC2 1D165 0EA9 0061
0EC2 0001 0EAB 0061
0EC2 0591 0EAB 0061
0EC2 1D165 0EAB 0061
@@ -98523,6 +101042,9 @@ A8C4 0062
0EC2 0001 0EDD 0061
0EC2 0591 0EDD 0061
0EC2 1D165 0EDD 0061
+0EC2 0001 0EAC 0061
+0EC2 0591 0EAC 0061
+0EC2 1D165 0EAC 0061
0EC2 0001 0EAD 0061
0EC2 0591 0EAD 0061
0EC2 1D165 0EAD 0061
@@ -98546,24 +101068,51 @@ A8C4 0062
0EC3 0001 0E84 0061
0EC3 0591 0E84 0061
0EC3 1D165 0E84 0061
+0EC3 0001 0E86 0061
+0EC3 0591 0E86 0061
+0EC3 1D165 0E86 0061
0EC3 0001 0E87 0061
0EC3 0591 0E87 0061
0EC3 1D165 0E87 0061
0EC3 0001 0E88 0061
0EC3 0591 0E88 0061
0EC3 1D165 0E88 0061
+0EC3 0001 0E89 0061
+0EC3 0591 0E89 0061
+0EC3 1D165 0E89 0061
0EC3 0001 0EAA 0061
0EC3 0591 0EAA 0061
0EC3 1D165 0EAA 0061
0EC3 0001 0E8A 0061
0EC3 0591 0E8A 0061
0EC3 1D165 0E8A 0061
+0EC3 0001 0E8C 0061
+0EC3 0591 0E8C 0061
+0EC3 1D165 0E8C 0061
+0EC3 0001 0E8E 0061
+0EC3 0591 0E8E 0061
+0EC3 1D165 0E8E 0061
0EC3 0001 0EDF 0061
0EC3 0591 0EDF 0061
0EC3 1D165 0EDF 0061
0EC3 0001 0E8D 0061
0EC3 0591 0E8D 0061
0EC3 1D165 0E8D 0061
+0EC3 0001 0E8F 0061
+0EC3 0591 0E8F 0061
+0EC3 1D165 0E8F 0061
+0EC3 0001 0E90 0061
+0EC3 0591 0E90 0061
+0EC3 1D165 0E90 0061
+0EC3 0001 0E91 0061
+0EC3 0591 0E91 0061
+0EC3 1D165 0E91 0061
+0EC3 0001 0E92 0061
+0EC3 0591 0E92 0061
+0EC3 1D165 0E92 0061
+0EC3 0001 0E93 0061
+0EC3 0591 0E93 0061
+0EC3 1D165 0E93 0061
0EC3 0001 0E94 0061
0EC3 0591 0E94 0061
0EC3 1D165 0E94 0061
@@ -98576,6 +101125,9 @@ A8C4 0062
0EC3 0001 0E97 0061
0EC3 0591 0E97 0061
0EC3 1D165 0E97 0061
+0EC3 0001 0E98 0061
+0EC3 0591 0E98 0061
+0EC3 1D165 0E98 0061
0EC3 0001 0E99 0061
0EC3 0591 0E99 0061
0EC3 1D165 0E99 0061
@@ -98597,6 +101149,9 @@ A8C4 0062
0EC3 0001 0E9F 0061
0EC3 0591 0E9F 0061
0EC3 1D165 0E9F 0061
+0EC3 0001 0EA0 0061
+0EC3 0591 0EA0 0061
+0EC3 1D165 0EA0 0061
0EC3 0001 0EA1 0061
0EC3 0591 0EA1 0061
0EC3 1D165 0EA1 0061
@@ -98612,6 +101167,12 @@ A8C4 0062
0EC3 0001 0EA7 0061
0EC3 0591 0EA7 0061
0EC3 1D165 0EA7 0061
+0EC3 0001 0EA8 0061
+0EC3 0591 0EA8 0061
+0EC3 1D165 0EA8 0061
+0EC3 0001 0EA9 0061
+0EC3 0591 0EA9 0061
+0EC3 1D165 0EA9 0061
0EC3 0001 0EAB 0061
0EC3 0591 0EAB 0061
0EC3 1D165 0EAB 0061
@@ -98621,6 +101182,9 @@ A8C4 0062
0EC3 0001 0EDD 0061
0EC3 0591 0EDD 0061
0EC3 1D165 0EDD 0061
+0EC3 0001 0EAC 0061
+0EC3 0591 0EAC 0061
+0EC3 1D165 0EAC 0061
0EC3 0001 0EAD 0061
0EC3 0591 0EAD 0061
0EC3 1D165 0EAD 0061
@@ -98644,24 +101208,51 @@ A8C4 0062
0EC4 0001 0E84 0061
0EC4 0591 0E84 0061
0EC4 1D165 0E84 0061
+0EC4 0001 0E86 0061
+0EC4 0591 0E86 0061
+0EC4 1D165 0E86 0061
0EC4 0001 0E87 0061
0EC4 0591 0E87 0061
0EC4 1D165 0E87 0061
0EC4 0001 0E88 0061
0EC4 0591 0E88 0061
0EC4 1D165 0E88 0061
+0EC4 0001 0E89 0061
+0EC4 0591 0E89 0061
+0EC4 1D165 0E89 0061
0EC4 0001 0EAA 0061
0EC4 0591 0EAA 0061
0EC4 1D165 0EAA 0061
0EC4 0001 0E8A 0061
0EC4 0591 0E8A 0061
0EC4 1D165 0E8A 0061
+0EC4 0001 0E8C 0061
+0EC4 0591 0E8C 0061
+0EC4 1D165 0E8C 0061
+0EC4 0001 0E8E 0061
+0EC4 0591 0E8E 0061
+0EC4 1D165 0E8E 0061
0EC4 0001 0EDF 0061
0EC4 0591 0EDF 0061
0EC4 1D165 0EDF 0061
0EC4 0001 0E8D 0061
0EC4 0591 0E8D 0061
0EC4 1D165 0E8D 0061
+0EC4 0001 0E8F 0061
+0EC4 0591 0E8F 0061
+0EC4 1D165 0E8F 0061
+0EC4 0001 0E90 0061
+0EC4 0591 0E90 0061
+0EC4 1D165 0E90 0061
+0EC4 0001 0E91 0061
+0EC4 0591 0E91 0061
+0EC4 1D165 0E91 0061
+0EC4 0001 0E92 0061
+0EC4 0591 0E92 0061
+0EC4 1D165 0E92 0061
+0EC4 0001 0E93 0061
+0EC4 0591 0E93 0061
+0EC4 1D165 0E93 0061
0EC4 0001 0E94 0061
0EC4 0591 0E94 0061
0EC4 1D165 0E94 0061
@@ -98674,6 +101265,9 @@ A8C4 0062
0EC4 0001 0E97 0061
0EC4 0591 0E97 0061
0EC4 1D165 0E97 0061
+0EC4 0001 0E98 0061
+0EC4 0591 0E98 0061
+0EC4 1D165 0E98 0061
0EC4 0001 0E99 0061
0EC4 0591 0E99 0061
0EC4 1D165 0E99 0061
@@ -98695,6 +101289,9 @@ A8C4 0062
0EC4 0001 0E9F 0061
0EC4 0591 0E9F 0061
0EC4 1D165 0E9F 0061
+0EC4 0001 0EA0 0061
+0EC4 0591 0EA0 0061
+0EC4 1D165 0EA0 0061
0EC4 0001 0EA1 0061
0EC4 0591 0EA1 0061
0EC4 1D165 0EA1 0061
@@ -98710,6 +101307,12 @@ A8C4 0062
0EC4 0001 0EA7 0061
0EC4 0591 0EA7 0061
0EC4 1D165 0EA7 0061
+0EC4 0001 0EA8 0061
+0EC4 0591 0EA8 0061
+0EC4 1D165 0EA8 0061
+0EC4 0001 0EA9 0061
+0EC4 0591 0EA9 0061
+0EC4 1D165 0EA9 0061
0EC4 0001 0EAB 0061
0EC4 0591 0EAB 0061
0EC4 1D165 0EAB 0061
@@ -98719,6 +101322,9 @@ A8C4 0062
0EC4 0001 0EDD 0061
0EC4 0591 0EDD 0061
0EC4 1D165 0EDD 0061
+0EC4 0001 0EAC 0061
+0EC4 0591 0EAC 0061
+0EC4 1D165 0EAC 0061
0EC4 0001 0EAD 0061
0EC4 0591 0EAD 0061
0EC4 1D165 0EAD 0061
@@ -102423,6 +105029,16 @@ AADC 0062
11A82 0061
11A82 0041
11A82 0062
+11A84 0021
+11A84 003F
+11A84 0061
+11A84 0041
+11A84 0062
+11A85 0021
+11A85 003F
+11A85 0061
+11A85 0041
+11A85 0062
0334 11A99
11A99 0334
11A99 0021
@@ -123499,6 +126115,11 @@ A6EF 0062
1E921 0041
1E943 0062
1E921 0062
+1E94B 0021
+1E94B 003F
+1E94B 0061
+1E94B 0041
+1E94B 0062
1100 0021
3131 0021
3260 0021
@@ -128330,64 +130951,92 @@ FF9C 0062
30F0 0334 3099
30F0 3099 0334
30F8 0334
+1B150 0021
3090 0021
+1B164 0021
30F0 0021
32FC 0021
30F8 0021
+1B150 003F
3090 003F
+1B164 003F
30F0 003F
32FC 003F
30F8 003F
+1B150 0061
+1B150 0041
3090 0061
3090 0041
+1B164 0061
+1B164 0041
30F0 0061
30F0 0041
32FC 0061
32FC 0041
30F8 0061
30F8 0041
+1B150 0062
3090 0062
+1B164 0062
30F0 0062
32FC 0062
30F8 0062
30F1 0334 3099
30F1 3099 0334
30F9 0334
+1B151 0021
3091 0021
+1B165 0021
30F1 0021
32FD 0021
30F9 0021
+1B151 003F
3091 003F
+1B165 003F
30F1 003F
32FD 003F
30F9 003F
+1B151 0061
+1B151 0041
3091 0061
3091 0041
+1B165 0061
+1B165 0041
30F1 0061
30F1 0041
32FD 0061
32FD 0041
30F9 0061
30F9 0041
+1B151 0062
3091 0062
+1B165 0062
30F1 0062
32FD 0062
30F9 0062
30F2 0334 3099
30F2 3099 0334
30FA 0334
+1B152 0021
3092 0021
+1B166 0021
30F2 0021
FF66 0021
32FE 0021
30FA 0021
+1B152 003F
3092 003F
+1B166 003F
30F2 003F
FF66 003F
32FE 003F
30FA 003F
+1B152 0061
+1B152 0041
3092 0061
3092 0041
+1B166 0061
+1B166 0041
30F2 0061
30F2 0041
FF66 0061
@@ -128396,24 +131045,31 @@ FF66 0041
32FE 0041
30FA 0061
30FA 0041
+1B152 0062
3092 0062
+1B166 0062
30F2 0062
FF66 0062
32FE 0062
30FA 0062
3093 0021
+1B167 0021
30F3 0021
FF9D 0021
3093 003F
+1B167 003F
30F3 003F
FF9D 003F
3093 0061
3093 0041
+1B167 0061
+1B167 0041
30F3 0061
30F3 0041
FF9D 0061
FF9D 0041
3093 0062
+1B167 0062
30F3 0062
FF9D 0062
1B002 0021
@@ -136271,6 +138927,11 @@ A4F7 0062
16F03 0061
16F03 0041
16F03 0062
+16F45 0021
+16F45 003F
+16F45 0061
+16F45 0041
+16F45 0062
16F04 0021
16F06 0021
16F04 003F
@@ -136321,6 +138982,11 @@ A4F7 0062
16F0D 0061
16F0D 0041
16F0D 0062
+16F48 0021
+16F48 003F
+16F48 0061
+16F48 0041
+16F48 0062
16F0E 0021
16F0E 003F
16F0E 0061
@@ -136331,6 +138997,11 @@ A4F7 0062
16F0F 0061
16F0F 0041
16F0F 0062
+16F4A 0021
+16F4A 003F
+16F4A 0061
+16F4A 0041
+16F4A 0062
16F10 0021
16F13 0021
16F10 003F
@@ -136506,11 +139177,21 @@ A4F7 0062
16F32 0061
16F32 0041
16F32 0062
+16F47 0021
+16F47 003F
+16F47 0061
+16F47 0041
+16F47 0062
16F33 0021
16F33 003F
16F33 0061
16F33 0041
16F33 0062
+16F46 0021
+16F46 003F
+16F46 0061
+16F46 0041
+16F46 0062
16F34 0021
16F34 003F
16F34 0061
@@ -136541,6 +139222,11 @@ A4F7 0062
16F39 0061
16F39 0041
16F39 0062
+16F49 0021
+16F49 003F
+16F49 0061
+16F49 0041
+16F49 0062
16F3A 0021
16F3A 003F
16F3A 0061
@@ -136616,6 +139302,11 @@ A4F7 0062
16F53 0061
16F53 0041
16F53 0062
+16F4F 0021
+16F4F 003F
+16F4F 0061
+16F4F 0041
+16F4F 0062
16F54 0021
16F54 003F
16F54 0061
@@ -136641,6 +139332,11 @@ A4F7 0062
16F58 0061
16F58 0041
16F58 0062
+16F81 0021
+16F81 003F
+16F81 0061
+16F81 0041
+16F81 0062
16F59 0021
16F59 003F
16F59 0061
@@ -136661,6 +139357,11 @@ A4F7 0062
16F5C 0061
16F5C 0041
16F5C 0062
+16F83 0021
+16F83 003F
+16F83 0061
+16F83 0041
+16F83 0062
16F5D 0021
16F5D 003F
16F5D 0061
@@ -136681,6 +139382,11 @@ A4F7 0062
16F60 0061
16F60 0041
16F60 0062
+16F84 0021
+16F84 003F
+16F84 0061
+16F84 0041
+16F84 0062
16F61 0021
16F61 003F
16F61 0061
@@ -136706,6 +139412,11 @@ A4F7 0062
16F65 0061
16F65 0041
16F65 0062
+16F86 0021
+16F86 003F
+16F86 0061
+16F86 0041
+16F86 0062
16F66 0021
16F66 003F
16F66 0061
@@ -136746,6 +139457,16 @@ A4F7 0062
16F6D 0061
16F6D 0041
16F6D 0062
+16F7F 0021
+16F7F 003F
+16F7F 0061
+16F7F 0041
+16F7F 0062
+16F87 0021
+16F87 003F
+16F87 0061
+16F87 0041
+16F87 0062
16F6E 0021
16F6E 003F
16F6E 0061
@@ -136771,6 +139492,11 @@ A4F7 0062
16F72 0061
16F72 0041
16F72 0062
+16F80 0021
+16F80 003F
+16F80 0061
+16F80 0041
+16F80 0062
16F73 0021
16F73 003F
16F73 0061
@@ -136781,6 +139507,16 @@ A4F7 0062
16F74 0061
16F74 0041
16F74 0062
+16F85 0021
+16F85 003F
+16F85 0061
+16F85 0041
+16F85 0062
+16F82 0021
+16F82 003F
+16F82 0061
+16F82 0041
+16F82 0062
16F75 0021
16F75 003F
16F75 0061
@@ -137976,6 +140712,481 @@ A4F7 0062
16B8F 0061
16B8F 0041
16B8F 0062
+1E100 0021
+1E100 003F
+1E100 0061
+1E100 0041
+1E100 0062
+1E101 0021
+1E101 003F
+1E101 0061
+1E101 0041
+1E101 0062
+1E102 0021
+1E102 003F
+1E102 0061
+1E102 0041
+1E102 0062
+1E103 0021
+1E103 003F
+1E103 0061
+1E103 0041
+1E103 0062
+1E104 0021
+1E104 003F
+1E104 0061
+1E104 0041
+1E104 0062
+1E105 0021
+1E105 003F
+1E105 0061
+1E105 0041
+1E105 0062
+1E106 0021
+1E106 003F
+1E106 0061
+1E106 0041
+1E106 0062
+1E107 0021
+1E107 003F
+1E107 0061
+1E107 0041
+1E107 0062
+1E108 0021
+1E108 003F
+1E108 0061
+1E108 0041
+1E108 0062
+1E109 0021
+1E109 003F
+1E109 0061
+1E109 0041
+1E109 0062
+1E10A 0021
+1E10A 003F
+1E10A 0061
+1E10A 0041
+1E10A 0062
+1E10B 0021
+1E10B 003F
+1E10B 0061
+1E10B 0041
+1E10B 0062
+1E10C 0021
+1E10C 003F
+1E10C 0061
+1E10C 0041
+1E10C 0062
+1E10D 0021
+1E10D 003F
+1E10D 0061
+1E10D 0041
+1E10D 0062
+1E10E 0021
+1E10E 003F
+1E10E 0061
+1E10E 0041
+1E10E 0062
+1E10F 0021
+1E10F 003F
+1E10F 0061
+1E10F 0041
+1E10F 0062
+1E110 0021
+1E110 003F
+1E110 0061
+1E110 0041
+1E110 0062
+1E111 0021
+1E111 003F
+1E111 0061
+1E111 0041
+1E111 0062
+1E112 0021
+1E112 003F
+1E112 0061
+1E112 0041
+1E112 0062
+1E113 0021
+1E113 003F
+1E113 0061
+1E113 0041
+1E113 0062
+1E114 0021
+1E114 003F
+1E114 0061
+1E114 0041
+1E114 0062
+1E115 0021
+1E115 003F
+1E115 0061
+1E115 0041
+1E115 0062
+1E116 0021
+1E116 003F
+1E116 0061
+1E116 0041
+1E116 0062
+1E117 0021
+1E117 003F
+1E117 0061
+1E117 0041
+1E117 0062
+1E118 0021
+1E118 003F
+1E118 0061
+1E118 0041
+1E118 0062
+1E119 0021
+1E119 003F
+1E119 0061
+1E119 0041
+1E119 0062
+1E11A 0021
+1E11A 003F
+1E11A 0061
+1E11A 0041
+1E11A 0062
+1E11B 0021
+1E11B 003F
+1E11B 0061
+1E11B 0041
+1E11B 0062
+1E11C 0021
+1E11C 003F
+1E11C 0061
+1E11C 0041
+1E11C 0062
+1E11D 0021
+1E11D 003F
+1E11D 0061
+1E11D 0041
+1E11D 0062
+1E11E 0021
+1E11E 003F
+1E11E 0061
+1E11E 0041
+1E11E 0062
+1E11F 0021
+1E11F 003F
+1E11F 0061
+1E11F 0041
+1E11F 0062
+1E120 0021
+1E120 003F
+1E120 0061
+1E120 0041
+1E120 0062
+1E121 0021
+1E121 003F
+1E121 0061
+1E121 0041
+1E121 0062
+1E122 0021
+1E122 003F
+1E122 0061
+1E122 0041
+1E122 0062
+1E123 0021
+1E123 003F
+1E123 0061
+1E123 0041
+1E123 0062
+1E124 0021
+1E124 003F
+1E124 0061
+1E124 0041
+1E124 0062
+1E125 0021
+1E125 003F
+1E125 0061
+1E125 0041
+1E125 0062
+1E126 0021
+1E126 003F
+1E126 0061
+1E126 0041
+1E126 0062
+1E127 0021
+1E127 003F
+1E127 0061
+1E127 0041
+1E127 0062
+1E128 0021
+1E128 003F
+1E128 0061
+1E128 0041
+1E128 0062
+1E129 0021
+1E129 003F
+1E129 0061
+1E129 0041
+1E129 0062
+1E12A 0021
+1E12A 003F
+1E12A 0061
+1E12A 0041
+1E12A 0062
+1E12B 0021
+1E12B 003F
+1E12B 0061
+1E12B 0041
+1E12B 0062
+1E12C 0021
+1E12C 003F
+1E12C 0061
+1E12C 0041
+1E12C 0062
+1E137 0021
+1E137 003F
+1E137 0061
+1E137 0041
+1E137 0062
+1E138 0021
+1E138 003F
+1E138 0061
+1E138 0041
+1E138 0062
+1E139 0021
+1E139 003F
+1E139 0061
+1E139 0041
+1E139 0062
+1E13A 0021
+1E13A 003F
+1E13A 0061
+1E13A 0041
+1E13A 0062
+1E13B 0021
+1E13B 003F
+1E13B 0061
+1E13B 0041
+1E13B 0062
+1E14E 0021
+1E14E 003F
+1E14E 0061
+1E14E 0041
+1E14E 0062
+1E2C0 0021
+1E2C0 003F
+1E2C0 0061
+1E2C0 0041
+1E2C0 0062
+1E2C1 0021
+1E2C1 003F
+1E2C1 0061
+1E2C1 0041
+1E2C1 0062
+1E2C2 0021
+1E2C2 003F
+1E2C2 0061
+1E2C2 0041
+1E2C2 0062
+1E2C3 0021
+1E2C3 003F
+1E2C3 0061
+1E2C3 0041
+1E2C3 0062
+1E2C4 0021
+1E2C4 003F
+1E2C4 0061
+1E2C4 0041
+1E2C4 0062
+1E2C5 0021
+1E2C5 003F
+1E2C5 0061
+1E2C5 0041
+1E2C5 0062
+1E2C6 0021
+1E2C6 003F
+1E2C6 0061
+1E2C6 0041
+1E2C6 0062
+1E2C7 0021
+1E2C7 003F
+1E2C7 0061
+1E2C7 0041
+1E2C7 0062
+1E2C8 0021
+1E2C8 003F
+1E2C8 0061
+1E2C8 0041
+1E2C8 0062
+1E2C9 0021
+1E2C9 003F
+1E2C9 0061
+1E2C9 0041
+1E2C9 0062
+1E2CA 0021
+1E2CA 003F
+1E2CA 0061
+1E2CA 0041
+1E2CA 0062
+1E2CB 0021
+1E2CB 003F
+1E2CB 0061
+1E2CB 0041
+1E2CB 0062
+1E2CC 0021
+1E2CC 003F
+1E2CC 0061
+1E2CC 0041
+1E2CC 0062
+1E2CD 0021
+1E2CD 003F
+1E2CD 0061
+1E2CD 0041
+1E2CD 0062
+1E2CE 0021
+1E2CE 003F
+1E2CE 0061
+1E2CE 0041
+1E2CE 0062
+1E2CF 0021
+1E2CF 003F
+1E2CF 0061
+1E2CF 0041
+1E2CF 0062
+1E2D0 0021
+1E2D0 003F
+1E2D0 0061
+1E2D0 0041
+1E2D0 0062
+1E2D1 0021
+1E2D1 003F
+1E2D1 0061
+1E2D1 0041
+1E2D1 0062
+1E2D2 0021
+1E2D2 003F
+1E2D2 0061
+1E2D2 0041
+1E2D2 0062
+1E2D3 0021
+1E2D3 003F
+1E2D3 0061
+1E2D3 0041
+1E2D3 0062
+1E2D4 0021
+1E2D4 003F
+1E2D4 0061
+1E2D4 0041
+1E2D4 0062
+1E2D5 0021
+1E2D5 003F
+1E2D5 0061
+1E2D5 0041
+1E2D5 0062
+1E2D6 0021
+1E2D6 003F
+1E2D6 0061
+1E2D6 0041
+1E2D6 0062
+1E2D7 0021
+1E2D7 003F
+1E2D7 0061
+1E2D7 0041
+1E2D7 0062
+1E2D8 0021
+1E2D8 003F
+1E2D8 0061
+1E2D8 0041
+1E2D8 0062
+1E2D9 0021
+1E2D9 003F
+1E2D9 0061
+1E2D9 0041
+1E2D9 0062
+1E2DA 0021
+1E2DA 003F
+1E2DA 0061
+1E2DA 0041
+1E2DA 0062
+1E2DB 0021
+1E2DB 003F
+1E2DB 0061
+1E2DB 0041
+1E2DB 0062
+1E2DC 0021
+1E2DC 003F
+1E2DC 0061
+1E2DC 0041
+1E2DC 0062
+1E2DD 0021
+1E2DD 003F
+1E2DD 0061
+1E2DD 0041
+1E2DD 0062
+1E2DE 0021
+1E2DE 003F
+1E2DE 0061
+1E2DE 0041
+1E2DE 0062
+1E2DF 0021
+1E2DF 003F
+1E2DF 0061
+1E2DF 0041
+1E2DF 0062
+1E2E0 0021
+1E2E0 003F
+1E2E0 0061
+1E2E0 0041
+1E2E0 0062
+1E2E1 0021
+1E2E1 003F
+1E2E1 0061
+1E2E1 0041
+1E2E1 0062
+1E2E2 0021
+1E2E2 003F
+1E2E2 0061
+1E2E2 0041
+1E2E2 0062
+1E2E3 0021
+1E2E3 003F
+1E2E3 0061
+1E2E3 0041
+1E2E3 0062
+1E2E4 0021
+1E2E4 003F
+1E2E4 0061
+1E2E4 0041
+1E2E4 0062
+1E2E5 0021
+1E2E5 003F
+1E2E5 0061
+1E2E5 0041
+1E2E5 0062
+1E2E6 0021
+1E2E6 003F
+1E2E6 0061
+1E2E6 0041
+1E2E6 0062
+1E2E7 0021
+1E2E7 003F
+1E2E7 0061
+1E2E7 0041
+1E2E7 0062
+1E2E8 0021
+1E2E8 003F
+1E2E8 0061
+1E2E8 0041
+1E2E8 0062
+1E2E9 0021
+1E2E9 003F
+1E2E9 0061
+1E2E9 0041
+1E2E9 0062
+1E2EA 0021
+1E2EA 003F
+1E2EA 0061
+1E2EA 0041
+1E2EA 0062
+1E2EB 0021
+1E2EB 003F
+1E2EB 0061
+1E2EB 0041
+1E2EB 0062
10280 0021
10280 003F
10280 0061
@@ -145406,6 +148617,121 @@ A4F7 0062
10B91 0061
10B91 0041
10B91 0062
+10FE0 0021
+10FE0 003F
+10FE0 0061
+10FE0 0041
+10FE0 0062
+10FE1 0021
+10FE1 003F
+10FE1 0061
+10FE1 0041
+10FE1 0062
+10FE2 0021
+10FE2 003F
+10FE2 0061
+10FE2 0041
+10FE2 0062
+10FE3 0021
+10FE3 003F
+10FE3 0061
+10FE3 0041
+10FE3 0062
+10FE4 0021
+10FE4 003F
+10FE4 0061
+10FE4 0041
+10FE4 0062
+10FE5 0021
+10FE5 003F
+10FE5 0061
+10FE5 0041
+10FE5 0062
+10FE6 0021
+10FE6 003F
+10FE6 0061
+10FE6 0041
+10FE6 0062
+10FF6 0021
+10FF6 003F
+10FF6 0061
+10FF6 0041
+10FF6 0062
+10FE7 0021
+10FE7 003F
+10FE7 0061
+10FE7 0041
+10FE7 0062
+10FE8 0021
+10FE8 003F
+10FE8 0061
+10FE8 0041
+10FE8 0062
+10FE9 0021
+10FE9 003F
+10FE9 0061
+10FE9 0041
+10FE9 0062
+10FEA 0021
+10FEA 003F
+10FEA 0061
+10FEA 0041
+10FEA 0062
+10FEB 0021
+10FEB 003F
+10FEB 0061
+10FEB 0041
+10FEB 0062
+10FEC 0021
+10FEC 003F
+10FEC 0061
+10FEC 0041
+10FEC 0062
+10FED 0021
+10FED 003F
+10FED 0061
+10FED 0041
+10FED 0062
+10FEE 0021
+10FEE 003F
+10FEE 0061
+10FEE 0041
+10FEE 0062
+10FEF 0021
+10FEF 003F
+10FEF 0061
+10FEF 0041
+10FEF 0062
+10FF0 0021
+10FF0 003F
+10FF0 0061
+10FF0 0041
+10FF0 0062
+10FF1 0021
+10FF1 003F
+10FF1 0061
+10FF1 0041
+10FF1 0062
+10FF2 0021
+10FF2 003F
+10FF2 0061
+10FF2 0041
+10FF2 0062
+10FF3 0021
+10FF3 003F
+10FF3 0061
+10FF3 0041
+10FF3 0062
+10FF4 0021
+10FF4 003F
+10FF4 0061
+10FF4 0041
+10FF4 0062
+10FF5 0021
+10FF5 003F
+10FF5 0061
+10FF5 0041
+10FF5 0062
10AC0 0021
10AC0 003F
10AC0 0061
@@ -160721,6 +164047,11 @@ F9A8 003F
F9A8 0061
F9A8 0041
F9A8 0062
+32FF 0021
+32FF 003F
+32FF 0061
+32FF 0041
+32FF 0062
32AD 0021
32AD 003F
32AD 0061
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/CollationTest_SHIFTED_SHORT.txt b/Build/source/libs/icu/icu-src/source/test/testdata/CollationTest_SHIFTED_SHORT.txt
index d634c5997ba..4a208898073 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/CollationTest_SHIFTED_SHORT.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/CollationTest_SHIFTED_SHORT.txt
@@ -1,10 +1,10 @@
# CollationTest_CLDR_SHIFTED_SHORT.txt
-# Date: 2018-05-21, 23:52:53 GMT
-# © 2018 Unicode®, Inc.
+# Date: 2019-04-01, 20:17:36 GMT
+# © 2019 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
-# UCA Version: 11.0.0
-# UCD Version: 11.0.0
+# UCA Version: 12.1.0
+# UCD Version: 12.1.0
# For a description of the format and usage, see
# http://www.unicode.org/reports/tr35/tr35-collation.html#Root_Data_Files
@@ -158,6 +158,8 @@ FF0C 003F
2E4C 003F
2E4E 0021
2E4E 003F
+2E4F 0021
+2E4F 003F
055D 0021
055D 003F
060C 0021
@@ -195,6 +197,9 @@ FE45 0021
FE45 003F
FE46 0021
FE46 003F
+16FE2 0334
+16FE2 0021
+16FE2 003F
003B 0021
037E 0021
FE14 0021
@@ -621,6 +626,15 @@ FFFB 0021
11372 0021
11373 0021
11374 0021
+13430 0021
+13431 0021
+13432 0021
+13433 0021
+13434 0021
+13435 0021
+13436 0021
+13437 0021
+13438 0021
1BCA0 0021
1BCA1 0021
1BCA2 0021
@@ -1482,6 +1496,15 @@ FFFB 003F
11372 003F
11373 003F
11374 003F
+13430 003F
+13431 003F
+13432 003F
+13433 003F
+13434 003F
+13435 003F
+13436 003F
+13437 003F
+13438 003F
1BCA0 003F
1BCA1 003F
1BCA2 003F
@@ -3044,6 +3067,8 @@ A8FC 003F
0A76 003F
0AF0 0021
0AF0 003F
+0C77 0021
+0C77 003F
0C84 0021
0C84 003F
0DF4 0021
@@ -3196,8 +3221,6 @@ AADF 003F
1AAC 003F
1AAD 0021
1AAD 003F
-166D 0021
-166D 003F
1CC0 0021
1CC0 003F
1CC1 0021
@@ -3443,6 +3466,12 @@ AA5C 003F
1183B 0334
1183B 0021
1183B 003F
+119E2 0334
+119E2 0021
+119E2 003F
+11FFF 0334
+11FFF 0021
+11FFF 003F
16B37 0334
16B37 0021
16B37 003F
@@ -4339,6 +4368,15 @@ FE2F 0334
1CE8 0334
110BD 0334
110CD 0334
+13430 0334
+13431 0334
+13432 0334
+13433 0334
+13434 0334
+13435 0334
+13436 0334
+13437 0334
+13438 0334
1BCA0 0334
1BCA1 0334
1BCA2 0334
@@ -5549,18 +5587,40 @@ A92D 0334
193B 0334
0334 16B30
16B30 0334
+0334 1E131
+1E131 0334
0334 16B31
16B31 0334
+0334 1E136
+1E136 0334
0334 16B32
16B32 0334
+0334 1E132
+1E132 0334
0334 16B33
16B33 0334
+0334 1E133
+1E133 0334
0334 16B34
16B34 0334
+0334 1E130
+1E130 0334
0334 16B35
16B35 0334
+0334 1E134
+1E134 0334
0334 16B36
16B36 0334
+0334 1E135
+1E135 0334
+0334 1E2EC
+1E2EC 0334
+0334 1E2ED
+1E2ED 0334
+0334 1E2EE
+1E2EE 0334
+0334 1E2EF
+1E2EF 0334
0334 302A
302A 0334
0334 302B
@@ -6098,6 +6158,7 @@ A981 0021
1163D 0021
116AB 0021
11837 0021
+119DE 0021
11A38 0021
11A96 0021
11C3D 0021
@@ -6141,6 +6202,7 @@ A981 003F
1163D 003F
116AB 003F
11837 003F
+119DE 003F
11A38 003F
11A96 003F
11C3D 003F
@@ -6161,6 +6223,7 @@ A981 003F
1163D 0334
116AB 0334
11837 0334
+119DE 0334
11A38 0334
11A96 0334
11C3D 0334
@@ -6197,6 +6260,7 @@ A983 0021
1163E 0021
116AC 0021
11838 0021
+119DF 0021
11A39 0021
11A97 0021
11C3E 0021
@@ -6232,6 +6296,7 @@ A983 003F
1163E 003F
116AC 003F
11838 003F
+119DF 003F
11A39 003F
11A97 003F
11C3E 003F
@@ -6247,6 +6312,7 @@ A983 003F
1163E 0334
116AC 0334
11838 0334
+119DF 0334
11A39 0334
11A97 0334
11C3E 0334
@@ -6358,19 +6424,41 @@ A92D 003F
193B 0021
193B 003F
16B30 0021
+1E131 0021
16B30 003F
+1E131 003F
16B31 0021
+1E136 0021
16B31 003F
+1E136 003F
16B32 0021
+1E132 0021
16B32 003F
+1E132 003F
16B33 0021
+1E133 0021
16B33 003F
+1E133 003F
16B34 0021
+1E130 0021
16B34 003F
+1E130 003F
16B35 0021
+1E134 0021
16B35 003F
+1E134 003F
16B36 0021
+1E135 0021
16B36 003F
+1E135 003F
+1E2EC 0021
+1E2EC 003F
+1E2ED 0021
+1E2ED 003F
+1E2EE 0021
+1E2EE 003F
+1E2EF 0021
+1E2EF 003F
302A 0021
302A 003F
302B 0021
@@ -7328,6 +7416,156 @@ FBC1 0062
0BFA 0061
0BFA 0041
0BFA 0062
+11FD5 0021
+11FD5 003F
+11FD5 0334
+11FD5 0061
+11FD5 0041
+11FD5 0062
+11FD6 0021
+11FD6 003F
+11FD6 0334
+11FD6 0061
+11FD6 0041
+11FD6 0062
+11FD7 0021
+11FD7 003F
+11FD7 0334
+11FD7 0061
+11FD7 0041
+11FD7 0062
+11FD8 0021
+11FD8 003F
+11FD8 0334
+11FD8 0061
+11FD8 0041
+11FD8 0062
+11FD9 0021
+11FD9 003F
+11FD9 0334
+11FD9 0061
+11FD9 0041
+11FD9 0062
+11FDA 0021
+11FDA 003F
+11FDA 0334
+11FDA 0061
+11FDA 0041
+11FDA 0062
+11FDB 0021
+11FDB 003F
+11FDB 0334
+11FDB 0061
+11FDB 0041
+11FDB 0062
+11FDC 0021
+11FDC 003F
+11FDC 0334
+11FDC 0061
+11FDC 0041
+11FDC 0062
+11FE1 0021
+11FE1 003F
+11FE1 0334
+11FE1 0061
+11FE1 0041
+11FE1 0062
+11FE2 0021
+11FE2 003F
+11FE2 0334
+11FE2 0061
+11FE2 0041
+11FE2 0062
+11FE3 0021
+11FE3 003F
+11FE3 0334
+11FE3 0061
+11FE3 0041
+11FE3 0062
+11FE4 0021
+11FE4 003F
+11FE4 0334
+11FE4 0061
+11FE4 0041
+11FE4 0062
+11FE5 0021
+11FE5 003F
+11FE5 0334
+11FE5 0061
+11FE5 0041
+11FE5 0062
+11FE6 0021
+11FE6 003F
+11FE6 0334
+11FE6 0061
+11FE6 0041
+11FE6 0062
+11FE7 0021
+11FE7 003F
+11FE7 0334
+11FE7 0061
+11FE7 0041
+11FE7 0062
+11FE8 0021
+11FE8 003F
+11FE8 0334
+11FE8 0061
+11FE8 0041
+11FE8 0062
+11FE9 0021
+11FE9 003F
+11FE9 0334
+11FE9 0061
+11FE9 0041
+11FE9 0062
+11FEA 0021
+11FEA 003F
+11FEA 0334
+11FEA 0061
+11FEA 0041
+11FEA 0062
+11FEB 0021
+11FEB 003F
+11FEB 0334
+11FEB 0061
+11FEB 0041
+11FEB 0062
+11FEC 0021
+11FEC 003F
+11FEC 0334
+11FEC 0061
+11FEC 0041
+11FEC 0062
+11FED 0021
+11FED 003F
+11FED 0334
+11FED 0061
+11FED 0041
+11FED 0062
+11FEE 0021
+11FEE 003F
+11FEE 0334
+11FEE 0061
+11FEE 0041
+11FEE 0062
+11FEF 0021
+11FEF 003F
+11FEF 0334
+11FEF 0061
+11FEF 0041
+11FEF 0062
+11FF0 0021
+11FF0 003F
+11FF0 0334
+11FF0 0061
+11FF0 0041
+11FF0 0062
+11FF1 0021
+11FF1 003F
+11FF1 0334
+11FF1 0061
+11FF1 0041
+11FF1 0062
0C7F 0021
0C7F 003F
0C7F 0061
@@ -7558,6 +7796,11 @@ A839 0062
0FD8 0061
0FD8 0041
0FD8 0062
+166D 0021
+166D 003F
+166D 0061
+166D 0041
+166D 0062
1940 0021
1940 003F
1940 0061
@@ -18721,6 +18964,11 @@ FFEE 0062
2BC8 0061
2BC8 0041
2BC8 0062
+2BC9 0021
+2BC9 003F
+2BC9 0061
+2BC9 0041
+2BC9 0062
2BCA 0021
2BCA 003F
2BCA 0061
@@ -18986,6 +19234,11 @@ FFEE 0062
2BFE 0061
2BFE 0041
2BFE 0062
+2BFF 0021
+2BFF 003F
+2BFF 0061
+2BFF 0041
+2BFF 0062
2CE5 0021
2CE5 003F
2CE5 0061
@@ -22047,6 +22300,12 @@ A4C6 0062
16B45 0061
16B45 0041
16B45 0062
+1E14F 0021
+1E14F 003F
+1E14F 0334
+1E14F 0061
+1E14F 0041
+1E14F 0062
1D000 0021
1D000 003F
1D000 0334
@@ -25150,6 +25409,12 @@ A4C6 0062
1ECAC 0061
1ECAC 0041
1ECAC 0062
+1ED2E 0021
+1ED2E 003F
+1ED2E 0334
+1ED2E 0061
+1ED2E 0041
+1ED2E 0062
1F000 0021
1F000 003F
1F000 0334
@@ -26506,6 +26771,510 @@ A4C6 0062
1F0F5 0061
1F0F5 0041
1F0F5 0062
+1FA00 0021
+1FA00 003F
+1FA00 0334
+1FA00 0061
+1FA00 0041
+1FA00 0062
+1FA01 0021
+1FA01 003F
+1FA01 0334
+1FA01 0061
+1FA01 0041
+1FA01 0062
+1FA02 0021
+1FA02 003F
+1FA02 0334
+1FA02 0061
+1FA02 0041
+1FA02 0062
+1FA03 0021
+1FA03 003F
+1FA03 0334
+1FA03 0061
+1FA03 0041
+1FA03 0062
+1FA04 0021
+1FA04 003F
+1FA04 0334
+1FA04 0061
+1FA04 0041
+1FA04 0062
+1FA05 0021
+1FA05 003F
+1FA05 0334
+1FA05 0061
+1FA05 0041
+1FA05 0062
+1FA06 0021
+1FA06 003F
+1FA06 0334
+1FA06 0061
+1FA06 0041
+1FA06 0062
+1FA07 0021
+1FA07 003F
+1FA07 0334
+1FA07 0061
+1FA07 0041
+1FA07 0062
+1FA08 0021
+1FA08 003F
+1FA08 0334
+1FA08 0061
+1FA08 0041
+1FA08 0062
+1FA09 0021
+1FA09 003F
+1FA09 0334
+1FA09 0061
+1FA09 0041
+1FA09 0062
+1FA0A 0021
+1FA0A 003F
+1FA0A 0334
+1FA0A 0061
+1FA0A 0041
+1FA0A 0062
+1FA0B 0021
+1FA0B 003F
+1FA0B 0334
+1FA0B 0061
+1FA0B 0041
+1FA0B 0062
+1FA0C 0021
+1FA0C 003F
+1FA0C 0334
+1FA0C 0061
+1FA0C 0041
+1FA0C 0062
+1FA0D 0021
+1FA0D 003F
+1FA0D 0334
+1FA0D 0061
+1FA0D 0041
+1FA0D 0062
+1FA0E 0021
+1FA0E 003F
+1FA0E 0334
+1FA0E 0061
+1FA0E 0041
+1FA0E 0062
+1FA0F 0021
+1FA0F 003F
+1FA0F 0334
+1FA0F 0061
+1FA0F 0041
+1FA0F 0062
+1FA10 0021
+1FA10 003F
+1FA10 0334
+1FA10 0061
+1FA10 0041
+1FA10 0062
+1FA11 0021
+1FA11 003F
+1FA11 0334
+1FA11 0061
+1FA11 0041
+1FA11 0062
+1FA12 0021
+1FA12 003F
+1FA12 0334
+1FA12 0061
+1FA12 0041
+1FA12 0062
+1FA13 0021
+1FA13 003F
+1FA13 0334
+1FA13 0061
+1FA13 0041
+1FA13 0062
+1FA14 0021
+1FA14 003F
+1FA14 0334
+1FA14 0061
+1FA14 0041
+1FA14 0062
+1FA15 0021
+1FA15 003F
+1FA15 0334
+1FA15 0061
+1FA15 0041
+1FA15 0062
+1FA16 0021
+1FA16 003F
+1FA16 0334
+1FA16 0061
+1FA16 0041
+1FA16 0062
+1FA17 0021
+1FA17 003F
+1FA17 0334
+1FA17 0061
+1FA17 0041
+1FA17 0062
+1FA18 0021
+1FA18 003F
+1FA18 0334
+1FA18 0061
+1FA18 0041
+1FA18 0062
+1FA19 0021
+1FA19 003F
+1FA19 0334
+1FA19 0061
+1FA19 0041
+1FA19 0062
+1FA1A 0021
+1FA1A 003F
+1FA1A 0334
+1FA1A 0061
+1FA1A 0041
+1FA1A 0062
+1FA1B 0021
+1FA1B 003F
+1FA1B 0334
+1FA1B 0061
+1FA1B 0041
+1FA1B 0062
+1FA1C 0021
+1FA1C 003F
+1FA1C 0334
+1FA1C 0061
+1FA1C 0041
+1FA1C 0062
+1FA1D 0021
+1FA1D 003F
+1FA1D 0334
+1FA1D 0061
+1FA1D 0041
+1FA1D 0062
+1FA1E 0021
+1FA1E 003F
+1FA1E 0334
+1FA1E 0061
+1FA1E 0041
+1FA1E 0062
+1FA1F 0021
+1FA1F 003F
+1FA1F 0334
+1FA1F 0061
+1FA1F 0041
+1FA1F 0062
+1FA20 0021
+1FA20 003F
+1FA20 0334
+1FA20 0061
+1FA20 0041
+1FA20 0062
+1FA21 0021
+1FA21 003F
+1FA21 0334
+1FA21 0061
+1FA21 0041
+1FA21 0062
+1FA22 0021
+1FA22 003F
+1FA22 0334
+1FA22 0061
+1FA22 0041
+1FA22 0062
+1FA23 0021
+1FA23 003F
+1FA23 0334
+1FA23 0061
+1FA23 0041
+1FA23 0062
+1FA24 0021
+1FA24 003F
+1FA24 0334
+1FA24 0061
+1FA24 0041
+1FA24 0062
+1FA25 0021
+1FA25 003F
+1FA25 0334
+1FA25 0061
+1FA25 0041
+1FA25 0062
+1FA26 0021
+1FA26 003F
+1FA26 0334
+1FA26 0061
+1FA26 0041
+1FA26 0062
+1FA27 0021
+1FA27 003F
+1FA27 0334
+1FA27 0061
+1FA27 0041
+1FA27 0062
+1FA28 0021
+1FA28 003F
+1FA28 0334
+1FA28 0061
+1FA28 0041
+1FA28 0062
+1FA29 0021
+1FA29 003F
+1FA29 0334
+1FA29 0061
+1FA29 0041
+1FA29 0062
+1FA2A 0021
+1FA2A 003F
+1FA2A 0334
+1FA2A 0061
+1FA2A 0041
+1FA2A 0062
+1FA2B 0021
+1FA2B 003F
+1FA2B 0334
+1FA2B 0061
+1FA2B 0041
+1FA2B 0062
+1FA2C 0021
+1FA2C 003F
+1FA2C 0334
+1FA2C 0061
+1FA2C 0041
+1FA2C 0062
+1FA2D 0021
+1FA2D 003F
+1FA2D 0334
+1FA2D 0061
+1FA2D 0041
+1FA2D 0062
+1FA2E 0021
+1FA2E 003F
+1FA2E 0334
+1FA2E 0061
+1FA2E 0041
+1FA2E 0062
+1FA2F 0021
+1FA2F 003F
+1FA2F 0334
+1FA2F 0061
+1FA2F 0041
+1FA2F 0062
+1FA30 0021
+1FA30 003F
+1FA30 0334
+1FA30 0061
+1FA30 0041
+1FA30 0062
+1FA31 0021
+1FA31 003F
+1FA31 0334
+1FA31 0061
+1FA31 0041
+1FA31 0062
+1FA32 0021
+1FA32 003F
+1FA32 0334
+1FA32 0061
+1FA32 0041
+1FA32 0062
+1FA33 0021
+1FA33 003F
+1FA33 0334
+1FA33 0061
+1FA33 0041
+1FA33 0062
+1FA34 0021
+1FA34 003F
+1FA34 0334
+1FA34 0061
+1FA34 0041
+1FA34 0062
+1FA35 0021
+1FA35 003F
+1FA35 0334
+1FA35 0061
+1FA35 0041
+1FA35 0062
+1FA36 0021
+1FA36 003F
+1FA36 0334
+1FA36 0061
+1FA36 0041
+1FA36 0062
+1FA37 0021
+1FA37 003F
+1FA37 0334
+1FA37 0061
+1FA37 0041
+1FA37 0062
+1FA38 0021
+1FA38 003F
+1FA38 0334
+1FA38 0061
+1FA38 0041
+1FA38 0062
+1FA39 0021
+1FA39 003F
+1FA39 0334
+1FA39 0061
+1FA39 0041
+1FA39 0062
+1FA3A 0021
+1FA3A 003F
+1FA3A 0334
+1FA3A 0061
+1FA3A 0041
+1FA3A 0062
+1FA3B 0021
+1FA3B 003F
+1FA3B 0334
+1FA3B 0061
+1FA3B 0041
+1FA3B 0062
+1FA3C 0021
+1FA3C 003F
+1FA3C 0334
+1FA3C 0061
+1FA3C 0041
+1FA3C 0062
+1FA3D 0021
+1FA3D 003F
+1FA3D 0334
+1FA3D 0061
+1FA3D 0041
+1FA3D 0062
+1FA3E 0021
+1FA3E 003F
+1FA3E 0334
+1FA3E 0061
+1FA3E 0041
+1FA3E 0062
+1FA3F 0021
+1FA3F 003F
+1FA3F 0334
+1FA3F 0061
+1FA3F 0041
+1FA3F 0062
+1FA40 0021
+1FA40 003F
+1FA40 0334
+1FA40 0061
+1FA40 0041
+1FA40 0062
+1FA41 0021
+1FA41 003F
+1FA41 0334
+1FA41 0061
+1FA41 0041
+1FA41 0062
+1FA42 0021
+1FA42 003F
+1FA42 0334
+1FA42 0061
+1FA42 0041
+1FA42 0062
+1FA43 0021
+1FA43 003F
+1FA43 0334
+1FA43 0061
+1FA43 0041
+1FA43 0062
+1FA44 0021
+1FA44 003F
+1FA44 0334
+1FA44 0061
+1FA44 0041
+1FA44 0062
+1FA45 0021
+1FA45 003F
+1FA45 0334
+1FA45 0061
+1FA45 0041
+1FA45 0062
+1FA46 0021
+1FA46 003F
+1FA46 0334
+1FA46 0061
+1FA46 0041
+1FA46 0062
+1FA47 0021
+1FA47 003F
+1FA47 0334
+1FA47 0061
+1FA47 0041
+1FA47 0062
+1FA48 0021
+1FA48 003F
+1FA48 0334
+1FA48 0061
+1FA48 0041
+1FA48 0062
+1FA49 0021
+1FA49 003F
+1FA49 0334
+1FA49 0061
+1FA49 0041
+1FA49 0062
+1FA4A 0021
+1FA4A 003F
+1FA4A 0334
+1FA4A 0061
+1FA4A 0041
+1FA4A 0062
+1FA4B 0021
+1FA4B 003F
+1FA4B 0334
+1FA4B 0061
+1FA4B 0041
+1FA4B 0062
+1FA4C 0021
+1FA4C 003F
+1FA4C 0334
+1FA4C 0061
+1FA4C 0041
+1FA4C 0062
+1FA4D 0021
+1FA4D 003F
+1FA4D 0334
+1FA4D 0061
+1FA4D 0041
+1FA4D 0062
+1FA4E 0021
+1FA4E 003F
+1FA4E 0334
+1FA4E 0061
+1FA4E 0041
+1FA4E 0062
+1FA4F 0021
+1FA4F 003F
+1FA4F 0334
+1FA4F 0061
+1FA4F 0041
+1FA4F 0062
+1FA50 0021
+1FA50 003F
+1FA50 0334
+1FA50 0061
+1FA50 0041
+1FA50 0062
+1FA51 0021
+1FA51 003F
+1FA51 0334
+1FA51 0061
+1FA51 0041
+1FA51 0062
+1FA52 0021
+1FA52 003F
+1FA52 0334
+1FA52 0061
+1FA52 0041
+1FA52 0062
+1FA53 0021
+1FA53 003F
+1FA53 0334
+1FA53 0061
+1FA53 0041
+1FA53 0062
1FA60 0021
1FA60 003F
1FA60 0334
@@ -31306,6 +32075,24 @@ A4C6 0062
1F90B 0061
1F90B 0041
1F90B 0062
+1F90D 0021
+1F90D 003F
+1F90D 0334
+1F90D 0061
+1F90D 0041
+1F90D 0062
+1F90E 0021
+1F90E 003F
+1F90E 0334
+1F90E 0061
+1F90E 0041
+1F90E 0062
+1F90F 0021
+1F90F 003F
+1F90F 0334
+1F90F 0061
+1F90F 0041
+1F90F 0062
1F910 0021
1F910 003F
1F910 0334
@@ -31588,6 +32375,12 @@ A4C6 0062
1F93E 0061
1F93E 0041
1F93E 0062
+1F93F 0021
+1F93F 003F
+1F93F 0334
+1F93F 0061
+1F93F 0041
+1F93F 0062
1F940 0021
1F940 003F
1F940 0334
@@ -31882,6 +32675,12 @@ A4C6 0062
1F970 0061
1F970 0041
1F970 0062
+1F971 0021
+1F971 003F
+1F971 0334
+1F971 0061
+1F971 0041
+1F971 0062
1F973 0021
1F973 003F
1F973 0334
@@ -31912,6 +32711,12 @@ A4C6 0062
1F97A 0061
1F97A 0041
1F97A 0062
+1F97B 0021
+1F97B 003F
+1F97B 0334
+1F97B 0061
+1F97B 0041
+1F97B 0062
1F97C 0021
1F97C 003F
1F97C 0334
@@ -32146,6 +32951,54 @@ A4C6 0062
1F9A2 0061
1F9A2 0041
1F9A2 0062
+1F9A5 0021
+1F9A5 003F
+1F9A5 0334
+1F9A5 0061
+1F9A5 0041
+1F9A5 0062
+1F9A6 0021
+1F9A6 003F
+1F9A6 0334
+1F9A6 0061
+1F9A6 0041
+1F9A6 0062
+1F9A7 0021
+1F9A7 003F
+1F9A7 0334
+1F9A7 0061
+1F9A7 0041
+1F9A7 0062
+1F9A8 0021
+1F9A8 003F
+1F9A8 0334
+1F9A8 0061
+1F9A8 0041
+1F9A8 0062
+1F9A9 0021
+1F9A9 003F
+1F9A9 0334
+1F9A9 0061
+1F9A9 0041
+1F9A9 0062
+1F9AA 0021
+1F9AA 003F
+1F9AA 0334
+1F9AA 0061
+1F9AA 0041
+1F9AA 0062
+1F9AE 0021
+1F9AE 003F
+1F9AE 0334
+1F9AE 0061
+1F9AE 0041
+1F9AE 0062
+1F9AF 0021
+1F9AF 003F
+1F9AF 0334
+1F9AF 0061
+1F9AF 0041
+1F9AF 0062
1F9B0 0021
1F9B0 003F
1F9B0 0334
@@ -32206,6 +33059,42 @@ A4C6 0062
1F9B9 0061
1F9B9 0041
1F9B9 0062
+1F9BA 0021
+1F9BA 003F
+1F9BA 0334
+1F9BA 0061
+1F9BA 0041
+1F9BA 0062
+1F9BB 0021
+1F9BB 003F
+1F9BB 0334
+1F9BB 0061
+1F9BB 0041
+1F9BB 0062
+1F9BC 0021
+1F9BC 003F
+1F9BC 0334
+1F9BC 0061
+1F9BC 0041
+1F9BC 0062
+1F9BD 0021
+1F9BD 003F
+1F9BD 0334
+1F9BD 0061
+1F9BD 0041
+1F9BD 0062
+1F9BE 0021
+1F9BE 003F
+1F9BE 0334
+1F9BE 0061
+1F9BE 0041
+1F9BE 0062
+1F9BF 0021
+1F9BF 003F
+1F9BF 0334
+1F9BF 0061
+1F9BF 0041
+1F9BF 0062
1F9C0 0021
1F9C0 003F
1F9C0 0334
@@ -32224,6 +33113,72 @@ A4C6 0062
1F9C2 0061
1F9C2 0041
1F9C2 0062
+1F9C3 0021
+1F9C3 003F
+1F9C3 0334
+1F9C3 0061
+1F9C3 0041
+1F9C3 0062
+1F9C4 0021
+1F9C4 003F
+1F9C4 0334
+1F9C4 0061
+1F9C4 0041
+1F9C4 0062
+1F9C5 0021
+1F9C5 003F
+1F9C5 0334
+1F9C5 0061
+1F9C5 0041
+1F9C5 0062
+1F9C6 0021
+1F9C6 003F
+1F9C6 0334
+1F9C6 0061
+1F9C6 0041
+1F9C6 0062
+1F9C7 0021
+1F9C7 003F
+1F9C7 0334
+1F9C7 0061
+1F9C7 0041
+1F9C7 0062
+1F9C8 0021
+1F9C8 003F
+1F9C8 0334
+1F9C8 0061
+1F9C8 0041
+1F9C8 0062
+1F9C9 0021
+1F9C9 003F
+1F9C9 0334
+1F9C9 0061
+1F9C9 0041
+1F9C9 0062
+1F9CA 0021
+1F9CA 003F
+1F9CA 0334
+1F9CA 0061
+1F9CA 0041
+1F9CA 0062
+1F9CD 0021
+1F9CD 003F
+1F9CD 0334
+1F9CD 0061
+1F9CD 0041
+1F9CD 0062
+1F9CE 0021
+1F9CE 003F
+1F9CE 0334
+1F9CE 0061
+1F9CE 0041
+1F9CE 0062
+1F9CF 0021
+1F9CF 003F
+1F9CF 0334
+1F9CF 0061
+1F9CF 0041
+1F9CF 0062
1F9D0 0021
1F9D0 003F
1F9D0 0334
@@ -32512,6 +33467,102 @@ A4C6 0062
1F9FF 0061
1F9FF 0041
1F9FF 0062
+1FA70 0021
+1FA70 003F
+1FA70 0334
+1FA70 0061
+1FA70 0041
+1FA70 0062
+1FA71 0021
+1FA71 003F
+1FA71 0334
+1FA71 0061
+1FA71 0041
+1FA71 0062
+1FA72 0021
+1FA72 003F
+1FA72 0334
+1FA72 0061
+1FA72 0041
+1FA72 0062
+1FA73 0021
+1FA73 003F
+1FA73 0334
+1FA73 0061
+1FA73 0041
+1FA73 0062
+1FA78 0021
+1FA78 003F
+1FA78 0334
+1FA78 0061
+1FA78 0041
+1FA78 0062
+1FA79 0021
+1FA79 003F
+1FA79 0334
+1FA79 0061
+1FA79 0041
+1FA79 0062
+1FA7A 0021
+1FA7A 003F
+1FA7A 0334
+1FA7A 0061
+1FA7A 0041
+1FA7A 0062
+1FA80 0021
+1FA80 003F
+1FA80 0334
+1FA80 0061
+1FA80 0041
+1FA80 0062
+1FA81 0021
+1FA81 003F
+1FA81 0334
+1FA81 0061
+1FA81 0041
+1FA81 0062
+1FA82 0021
+1FA82 003F
+1FA82 0334
+1FA82 0061
+1FA82 0041
+1FA82 0062
+1FA90 0021
+1FA90 003F
+1FA90 0334
+1FA90 0061
+1FA90 0041
+1FA90 0062
+1FA91 0021
+1FA91 003F
+1FA91 0334
+1FA91 0061
+1FA91 0041
+1FA91 0062
+1FA92 0021
+1FA92 003F
+1FA92 0334
+1FA92 0061
+1FA92 0041
+1FA92 0062
+1FA93 0021
+1FA93 003F
+1FA93 0334
+1FA93 0061
+1FA93 0041
+1FA93 0062
+1FA94 0021
+1FA94 003F
+1FA94 0334
+1FA94 0061
+1FA94 0041
+1FA94 0062
+1FA95 0021
+1FA95 003F
+1FA95 0334
+1FA95 0061
+1FA95 0041
+1FA95 0062
1F600 0021
1F600 003F
1F600 0334
@@ -33790,6 +34841,12 @@ A4C6 0062
1F6D4 0061
1F6D4 0041
1F6D4 0062
+1F6D5 0021
+1F6D5 003F
+1F6D5 0334
+1F6D5 0061
+1F6D5 0041
+1F6D5 0062
1F6E0 0021
1F6E0 003F
1F6E0 0334
@@ -33928,6 +34985,12 @@ A4C6 0062
1F6F9 0061
1F6F9 0041
1F6F9 0062
+1F6FA 0021
+1F6FA 003F
+1F6FA 0334
+1F6FA 0061
+1F6FA 0041
+1F6FA 0062
1F700 0021
1F700 003F
1F700 0334
@@ -35158,6 +36221,78 @@ A4C6 0062
1F7D8 0061
1F7D8 0041
1F7D8 0062
+1F7E0 0021
+1F7E0 003F
+1F7E0 0334
+1F7E0 0061
+1F7E0 0041
+1F7E0 0062
+1F7E1 0021
+1F7E1 003F
+1F7E1 0334
+1F7E1 0061
+1F7E1 0041
+1F7E1 0062
+1F7E2 0021
+1F7E2 003F
+1F7E2 0334
+1F7E2 0061
+1F7E2 0041
+1F7E2 0062
+1F7E3 0021
+1F7E3 003F
+1F7E3 0334
+1F7E3 0061
+1F7E3 0041
+1F7E3 0062
+1F7E4 0021
+1F7E4 003F
+1F7E4 0334
+1F7E4 0061
+1F7E4 0041
+1F7E4 0062
+1F7E5 0021
+1F7E5 003F
+1F7E5 0334
+1F7E5 0061
+1F7E5 0041
+1F7E5 0062
+1F7E6 0021
+1F7E6 003F
+1F7E6 0334
+1F7E6 0061
+1F7E6 0041
+1F7E6 0062
+1F7E7 0021
+1F7E7 003F
+1F7E7 0334
+1F7E7 0061
+1F7E7 0041
+1F7E7 0062
+1F7E8 0021
+1F7E8 003F
+1F7E8 0334
+1F7E8 0061
+1F7E8 0041
+1F7E8 0062
+1F7E9 0021
+1F7E9 003F
+1F7E9 0334
+1F7E9 0061
+1F7E9 0041
+1F7E9 0062
+1F7EA 0021
+1F7EA 003F
+1F7EA 0334
+1F7EA 0061
+1F7EA 0041
+1F7EA 0062
+1F7EB 0021
+1F7EB 003F
+1F7EB 0334
+1F7EB 0061
+1F7EB 0041
+1F7EB 0062
1F800 0021
1F800 003F
1F800 0334
@@ -39663,6 +40798,18 @@ AAF4 0062
16B43 0061
16B43 0041
16B43 0062
+1E13C 0021
+1E13C 003F
+1E13C 0334
+1E13C 0061
+1E13C 0041
+1E13C 0062
+1E13D 0021
+1E13D 003F
+1E13D 0334
+1E13D 0061
+1E13D 0041
+1E13D 0062
3005 0021
3005 003F
3005 0061
@@ -39685,6 +40832,12 @@ AAF4 0062
16FE1 0061
16FE1 0041
16FE1 0062
+16FE3 0021
+16FE3 003F
+16FE3 0334
+16FE3 0061
+16FE3 0041
+16FE3 0062
3031 0021
3031 003F
3032 0021
@@ -39846,6 +40999,30 @@ A838 0062
0BF9 0061
0BF9 0041
0BF9 0062
+11FDD 0021
+11FDD 003F
+11FDD 0334
+11FDD 0061
+11FDD 0041
+11FDD 0062
+11FDE 0021
+11FDE 003F
+11FDE 0334
+11FDE 0061
+11FDE 0041
+11FDE 0062
+11FDF 0021
+11FDF 003F
+11FDF 0334
+11FDF 0061
+11FDF 0041
+11FDF 0062
+11FE0 0021
+11FE0 003F
+11FE0 0334
+11FE0 0061
+11FE0 0041
+11FE0 0062
0E3F 0021
0E3F 003F
0E3F 0061
@@ -39856,6 +41033,12 @@ A838 0062
17DB 0061
17DB 0041
17DB 0062
+1E2FF 0021
+1E2FF 003F
+1E2FF 0334
+1E2FF 0061
+1E2FF 0041
+1E2FF 0062
20A0 0021
20A0 003F
20A0 0061
@@ -40137,6 +41320,132 @@ A835 0062
0BF2 0061
0BF2 0041
0BF2 0062
+11FC0 0021
+11FC0 003F
+11FC0 0334
+11FC0 0061
+11FC0 0041
+11FC0 0062
+11FC1 0021
+11FC1 003F
+11FC1 0334
+11FC1 0061
+11FC1 0041
+11FC1 0062
+11FC2 0021
+11FC2 003F
+11FC2 0334
+11FC2 0061
+11FC2 0041
+11FC2 0062
+11FC3 0021
+11FC3 003F
+11FC3 0334
+11FC3 0061
+11FC3 0041
+11FC3 0062
+11FC4 0021
+11FC4 003F
+11FC4 0334
+11FC4 0061
+11FC4 0041
+11FC4 0062
+11FC5 0021
+11FC5 003F
+11FC5 0334
+11FC5 0061
+11FC5 0041
+11FC5 0062
+11FC6 0021
+11FC6 003F
+11FC6 0334
+11FC6 0061
+11FC6 0041
+11FC6 0062
+11FC7 0021
+11FC7 003F
+11FC7 0334
+11FC7 0061
+11FC7 0041
+11FC7 0062
+11FC8 0021
+11FC8 003F
+11FC8 0334
+11FC8 0061
+11FC8 0041
+11FC8 0062
+11FC9 0021
+11FC9 003F
+11FC9 0334
+11FC9 0061
+11FC9 0041
+11FC9 0062
+11FCA 0021
+11FCA 003F
+11FCA 0334
+11FCA 0061
+11FCA 0041
+11FCA 0062
+11FCB 0021
+11FCB 003F
+11FCB 0334
+11FCB 0061
+11FCB 0041
+11FCB 0062
+11FCC 0021
+11FCC 003F
+11FCC 0334
+11FCC 0061
+11FCC 0041
+11FCC 0062
+11FCD 0021
+11FCD 003F
+11FCD 0334
+11FCD 0061
+11FCD 0041
+11FCD 0062
+11FCE 0021
+11FCE 003F
+11FCE 0334
+11FCE 0061
+11FCE 0041
+11FCE 0062
+11FCF 0021
+11FCF 003F
+11FCF 0334
+11FCF 0061
+11FCF 0041
+11FCF 0062
+11FD0 0021
+11FD0 003F
+11FD0 0334
+11FD0 0061
+11FD0 0041
+11FD0 0062
+11FD1 0021
+11FD1 003F
+11FD1 0334
+11FD1 0061
+11FD1 0041
+11FD1 0062
+11FD2 0021
+11FD2 003F
+11FD2 0334
+11FD2 0061
+11FD2 0041
+11FD2 0062
+11FD3 0021
+11FD3 003F
+11FD3 0334
+11FD3 0061
+11FD3 0041
+11FD3 0062
+11FD4 0021
+11FD4 003F
+11FD4 0334
+11FD4 0061
+11FD4 0041
+11FD4 0062
0D58 0021
0D58 003F
0D58 0061
@@ -42059,6 +43368,264 @@ A835 0062
1ECB4 0061
1ECB4 0041
1ECB4 0062
+1ED0A 0021
+1ED0A 003F
+1ED0A 0334
+1ED0A 0061
+1ED0A 0041
+1ED0A 0062
+1ED0B 0021
+1ED0B 003F
+1ED0B 0334
+1ED0B 0061
+1ED0B 0041
+1ED0B 0062
+1ED0C 0021
+1ED0C 003F
+1ED0C 0334
+1ED0C 0061
+1ED0C 0041
+1ED0C 0062
+1ED0D 0021
+1ED0D 003F
+1ED0D 0334
+1ED0D 0061
+1ED0D 0041
+1ED0D 0062
+1ED0E 0021
+1ED0E 003F
+1ED0E 0334
+1ED0E 0061
+1ED0E 0041
+1ED0E 0062
+1ED0F 0021
+1ED0F 003F
+1ED0F 0334
+1ED0F 0061
+1ED0F 0041
+1ED0F 0062
+1ED10 0021
+1ED10 003F
+1ED10 0334
+1ED10 0061
+1ED10 0041
+1ED10 0062
+1ED11 0021
+1ED11 003F
+1ED11 0334
+1ED11 0061
+1ED11 0041
+1ED11 0062
+1ED12 0021
+1ED12 003F
+1ED12 0334
+1ED12 0061
+1ED12 0041
+1ED12 0062
+1ED13 0021
+1ED13 003F
+1ED13 0334
+1ED13 0061
+1ED13 0041
+1ED13 0062
+1ED14 0021
+1ED14 003F
+1ED14 0334
+1ED14 0061
+1ED14 0041
+1ED14 0062
+1ED15 0021
+1ED15 003F
+1ED15 0334
+1ED15 0061
+1ED15 0041
+1ED15 0062
+1ED16 0021
+1ED16 003F
+1ED16 0334
+1ED16 0061
+1ED16 0041
+1ED16 0062
+1ED17 0021
+1ED17 003F
+1ED17 0334
+1ED17 0061
+1ED17 0041
+1ED17 0062
+1ED18 0021
+1ED18 003F
+1ED18 0334
+1ED18 0061
+1ED18 0041
+1ED18 0062
+1ED19 0021
+1ED19 003F
+1ED19 0334
+1ED19 0061
+1ED19 0041
+1ED19 0062
+1ED1A 0021
+1ED1A 003F
+1ED1A 0334
+1ED1A 0061
+1ED1A 0041
+1ED1A 0062
+1ED1B 0021
+1ED1B 003F
+1ED1B 0334
+1ED1B 0061
+1ED1B 0041
+1ED1B 0062
+1ED1C 0021
+1ED1C 003F
+1ED1C 0334
+1ED1C 0061
+1ED1C 0041
+1ED1C 0062
+1ED1D 0021
+1ED1D 003F
+1ED1D 0334
+1ED1D 0061
+1ED1D 0041
+1ED1D 0062
+1ED1E 0021
+1ED1E 003F
+1ED1E 0334
+1ED1E 0061
+1ED1E 0041
+1ED1E 0062
+1ED1F 0021
+1ED1F 003F
+1ED1F 0334
+1ED1F 0061
+1ED1F 0041
+1ED1F 0062
+1ED20 0021
+1ED20 003F
+1ED20 0334
+1ED20 0061
+1ED20 0041
+1ED20 0062
+1ED21 0021
+1ED21 003F
+1ED21 0334
+1ED21 0061
+1ED21 0041
+1ED21 0062
+1ED22 0021
+1ED22 003F
+1ED22 0334
+1ED22 0061
+1ED22 0041
+1ED22 0062
+1ED23 0021
+1ED23 003F
+1ED23 0334
+1ED23 0061
+1ED23 0041
+1ED23 0062
+1ED24 0021
+1ED24 003F
+1ED24 0334
+1ED24 0061
+1ED24 0041
+1ED24 0062
+1ED25 0021
+1ED25 003F
+1ED25 0334
+1ED25 0061
+1ED25 0041
+1ED25 0062
+1ED26 0021
+1ED26 003F
+1ED26 0334
+1ED26 0061
+1ED26 0041
+1ED26 0062
+1ED27 0021
+1ED27 003F
+1ED27 0334
+1ED27 0061
+1ED27 0041
+1ED27 0062
+1ED28 0021
+1ED28 003F
+1ED28 0334
+1ED28 0061
+1ED28 0041
+1ED28 0062
+1ED29 0021
+1ED29 003F
+1ED29 0334
+1ED29 0061
+1ED29 0041
+1ED29 0062
+1ED2A 0021
+1ED2A 003F
+1ED2A 0334
+1ED2A 0061
+1ED2A 0041
+1ED2A 0062
+1ED2B 0021
+1ED2B 003F
+1ED2B 0334
+1ED2B 0061
+1ED2B 0041
+1ED2B 0062
+1ED2C 0021
+1ED2C 003F
+1ED2C 0334
+1ED2C 0061
+1ED2C 0041
+1ED2C 0062
+1ED2D 0021
+1ED2D 003F
+1ED2D 0334
+1ED2D 0061
+1ED2D 0041
+1ED2D 0062
+1ED37 0021
+1ED37 003F
+1ED37 0334
+1ED37 0061
+1ED37 0041
+1ED37 0062
+1ED38 0021
+1ED38 003F
+1ED38 0334
+1ED38 0061
+1ED38 0041
+1ED38 0062
+1ED39 0021
+1ED39 003F
+1ED39 0334
+1ED39 0061
+1ED39 0041
+1ED39 0062
+1ED3A 0021
+1ED3A 003F
+1ED3A 0334
+1ED3A 0061
+1ED3A 0041
+1ED3A 0062
+1ED3B 0021
+1ED3B 003F
+1ED3B 0334
+1ED3B 0061
+1ED3B 0041
+1ED3B 0062
+1ED3C 0021
+1ED3C 003F
+1ED3C 0334
+1ED3C 0061
+1ED3C 0041
+1ED3C 0062
+1ED3D 0021
+1ED3D 003F
+1ED3D 0334
+1ED3D 0061
+1ED3D 0041
+1ED3D 0062
109C9 0021
109C9 003F
109C9 0334
@@ -42605,6 +44172,8 @@ ABF0 0021
16B50 0021
16E80 0021
1D2E0 0021
+1E140 0021
+1E2F0 0021
1E950 0021
0030 003F
0660 003F
@@ -42666,6 +44235,8 @@ ABF0 003F
16B50 003F
16E80 003F
1D2E0 003F
+1E140 003F
+1E2F0 003F
1E950 003F
FF10 0021
FF10 003F
@@ -42720,6 +44291,8 @@ FF10 003F
16B50 0334
16E80 0334
1D2E0 0334
+1E140 0334
+1E2F0 0334
1E950 0334
1D7CE 0334
1D7D8 0334
@@ -42793,6 +44366,8 @@ ABF0 0061
16B50 0061
16E80 0061
1D2E0 0061
+1E140 0061
+1E2F0 0061
1E950 0061
0030 0041
0660 0041
@@ -42854,6 +44429,8 @@ ABF0 0041
16B50 0041
16E80 0041
1D2E0 0041
+1E140 0041
+1E2F0 0041
1E950 0041
FF10 0061
FF10 0041
@@ -42945,6 +44522,8 @@ ABF0 0062
16B50 0062
16E80 0062
1D2E0 0062
+1E140 0062
+1E2F0 0062
1E950 0062
FF10 0062
1F101 0062
@@ -43065,10 +44644,13 @@ ABF1 0021
1D360 0021
1D372 0021
1D377 0021
+1E141 0021
+1E2F1 0021
1E8C7 0021
1E951 0021
1EC71 0021
1ECA3 0021
+1ED01 0021
0031 003F
0661 003F
06F1 003F
@@ -43168,10 +44750,13 @@ ABF1 003F
1D360 003F
1D372 003F
1D377 003F
+1E141 003F
+1E2F1 003F
1E8C7 003F
1E951 003F
1EC71 003F
1ECA3 003F
+1ED01 003F
FF11 0021
FF11 003F
2474 0021
@@ -43264,10 +44849,13 @@ FF11 003F
1D360 0334
1D372 0334
1D377 0334
+1E141 0334
+1E2F1 0334
1E8C7 0334
1E951 0334
1EC71 0334
1ECA3 0334
+1ED01 0334
1D7CF 0334
1D7D9 0334
1D7E3 0334
@@ -43769,10 +45357,13 @@ ABF1 0061
1D360 0061
1D372 0061
1D377 0061
+1E141 0061
+1E2F1 0061
1E8C7 0061
1E951 0061
1EC71 0061
1ECA3 0061
+1ED01 0061
0031 0041
0661 0041
06F1 0041
@@ -43872,10 +45463,13 @@ ABF1 0041
1D360 0041
1D372 0041
1D377 0041
+1E141 0041
+1E2F1 0041
1E8C7 0041
1E951 0041
1EC71 0041
1ECA3 0041
+1ED01 0041
FF11 0061
FF11 0041
2474 0061
@@ -44013,10 +45607,13 @@ ABF1 0062
1D360 0062
1D372 0062
1D377 0062
+1E141 0062
+1E2F1 0062
1E8C7 0062
1E951 0062
1EC71 0062
1ECA3 0062
+1ED01 0062
FF11 0062
2474 0062
1F102 0062
@@ -44145,10 +45742,13 @@ ABF2 0021
1D2E2 0021
1D361 0021
1D373 0021
+1E142 0021
+1E2F2 0021
1E8C8 0021
1E952 0021
1EC72 0021
1ECA4 0021
+1ED02 0021
0032 003F
0662 003F
06F2 003F
@@ -44243,10 +45843,13 @@ ABF2 003F
1D2E2 003F
1D361 003F
1D373 003F
+1E142 003F
+1E2F2 003F
1E8C8 003F
1E952 003F
1EC72 003F
1ECA4 003F
+1ED02 003F
FF12 0021
FF12 003F
2475 0021
@@ -44335,10 +45938,13 @@ FF12 003F
1D2E2 0334
1D361 0334
1D373 0334
+1E142 0334
+1E2F2 0334
1E8C8 0334
1E952 0334
1EC72 0334
1ECA4 0334
+1ED02 0334
1D7D0 0334
1D7DA 0334
1D7E4 0334
@@ -44346,10 +45952,13 @@ FF12 003F
1D7F8 0334
16E95 0021
1ECB2 0021
+1ED2F 0021
16E95 003F
1ECB2 003F
+1ED2F 003F
16E95 0334
1ECB2 0334
+1ED2F 0334
2154 0021
2154 003F
2154 0061
@@ -44605,10 +46214,13 @@ ABF2 0061
1D2E2 0061
1D361 0061
1D373 0061
+1E142 0061
+1E2F2 0061
1E8C8 0061
1E952 0061
1EC72 0061
1ECA4 0061
+1ED02 0061
0032 0041
0662 0041
06F2 0041
@@ -44703,10 +46315,13 @@ ABF2 0041
1D2E2 0041
1D361 0041
1D373 0041
+1E142 0041
+1E2F2 0041
1E8C8 0041
1E952 0041
1EC72 0041
1ECA4 0041
+1ED02 0041
FF12 0061
FF12 0041
2475 0061
@@ -44743,8 +46358,10 @@ FF12 0041
2082 0041
16E95 0061
1ECB2 0061
+1ED2F 0061
16E95 0041
1ECB2 0041
+1ED2F 0041
0032 0062
0662 0062
06F2 0062
@@ -44839,10 +46456,13 @@ ABF2 0062
1D2E2 0062
1D361 0062
1D373 0062
+1E142 0062
+1E2F2 0062
1E8C8 0062
1E952 0062
1EC72 0062
1ECA4 0062
+1ED02 0062
FF12 0062
2475 0062
1F103 0062
@@ -44862,6 +46482,7 @@ FF12 0062
2082 0062
16E95 0062
1ECB2 0062
+1ED2F 0062
1F19D 0021
1F19D 003F
1F19D 0334
@@ -44983,10 +46604,13 @@ ABF3 0021
1D2E3 0021
1D362 0021
1D374 0021
+1E143 0021
+1E2F3 0021
1E8C9 0021
1E953 0021
1EC73 0021
1ECA5 0021
+1ED03 0021
0033 003F
0663 003F
06F3 003F
@@ -45081,10 +46705,13 @@ ABF3 003F
1D2E3 003F
1D362 003F
1D374 003F
+1E143 003F
+1E2F3 003F
1E8C9 003F
1E953 003F
1EC73 003F
1ECA5 003F
+1ED03 003F
FF13 0021
FF13 003F
2476 0021
@@ -45173,10 +46800,13 @@ FF13 003F
1D2E3 0334
1D362 0334
1D374 0334
+1E143 0334
+1E2F3 0334
1E8C9 0334
1E953 0334
1EC73 0334
1ECA5 0334
+1ED03 0334
1D7D1 0334
1D7DB 0334
1D7E5 0334
@@ -45184,7 +46814,10 @@ FF13 003F
1D7F9 0334
16E96 0021
16E96 003F
+1ED30 0021
+1ED30 003F
16E96 0334
+1ED30 0334
00BE 0021
00BE 003F
00BE 0061
@@ -45359,10 +46992,13 @@ ABF3 0061
1D2E3 0061
1D362 0061
1D374 0061
+1E143 0061
+1E2F3 0061
1E8C9 0061
1E953 0061
1EC73 0061
1ECA5 0061
+1ED03 0061
0033 0041
0663 0041
06F3 0041
@@ -45457,10 +47093,13 @@ ABF3 0041
1D2E3 0041
1D362 0041
1D374 0041
+1E143 0041
+1E2F3 0041
1E8C9 0041
1E953 0041
1EC73 0041
1ECA5 0041
+1ED03 0041
FF13 0061
FF13 0041
2476 0061
@@ -45497,6 +47136,8 @@ FF13 0041
2083 0041
16E96 0061
16E96 0041
+1ED30 0061
+1ED30 0041
0033 0062
0663 0062
06F3 0062
@@ -45591,10 +47232,13 @@ ABF3 0062
1D2E3 0062
1D362 0062
1D374 0062
+1E143 0062
+1E2F3 0062
1E8C9 0062
1E953 0062
1EC73 0062
1ECA5 0062
+1ED03 0062
FF13 0062
2476 0062
1F104 0062
@@ -45613,6 +47257,7 @@ FF13 0062
00B3 0062
2083 0062
16E96 0062
+1ED30 0062
1F19B 0021
1F19B 003F
1F19B 0334
@@ -45726,10 +47371,13 @@ ABF4 0021
1D2E4 0021
1D363 0021
1D375 0021
+1E144 0021
+1E2F4 0021
1E8CA 0021
1E954 0021
1EC74 0021
1ECA6 0021
+1ED04 0021
0034 003F
0664 003F
06F4 003F
@@ -45822,10 +47470,13 @@ ABF4 003F
1D2E4 003F
1D363 003F
1D375 003F
+1E144 003F
+1E2F4 003F
1E8CA 003F
1E954 003F
1EC74 003F
1ECA6 003F
+1ED04 003F
FF14 0021
FF14 003F
2477 0021
@@ -45914,15 +47565,21 @@ FF14 003F
1D2E4 0334
1D363 0334
1D375 0334
+1E144 0334
+1E2F4 0334
1E8CA 0334
1E954 0334
1EC74 0334
1ECA6 0334
+1ED04 0334
1D7D2 0334
1D7DC 0334
1D7E6 0334
1D7F0 0334
1D7FA 0334
+1ED31 0021
+1ED31 003F
+1ED31 0334
2158 0021
2158 003F
2158 0061
@@ -46075,10 +47732,13 @@ ABF4 0061
1D2E4 0061
1D363 0061
1D375 0061
+1E144 0061
+1E2F4 0061
1E8CA 0061
1E954 0061
1EC74 0061
1ECA6 0061
+1ED04 0061
0034 0041
0664 0041
06F4 0041
@@ -46171,10 +47831,13 @@ ABF4 0041
1D2E4 0041
1D363 0041
1D375 0041
+1E144 0041
+1E2F4 0041
1E8CA 0041
1E954 0041
1EC74 0041
1ECA6 0041
+1ED04 0041
FF14 0061
FF14 0041
2477 0061
@@ -46209,6 +47872,8 @@ FF14 0041
2074 0041
2084 0061
2084 0041
+1ED31 0061
+1ED31 0041
0034 0062
0664 0062
06F4 0062
@@ -46301,10 +47966,13 @@ ABF4 0062
1D2E4 0062
1D363 0062
1D375 0062
+1E144 0062
+1E2F4 0062
1E8CA 0062
1E954 0062
1EC74 0062
1ECA6 0062
+1ED04 0062
FF14 0062
2477 0062
1F105 0062
@@ -46322,6 +47990,7 @@ FF14 0062
278D 0062
2074 0062
2084 0062
+1ED31 0062
1F19E 0021
1F19E 003F
1F19E 0334
@@ -46436,10 +48105,13 @@ ABF5 0021
1D364 0021
1D376 0021
1D378 0021
+1E145 0021
+1E2F5 0021
1E8CB 0021
1E955 0021
1EC75 0021
1ECA7 0021
+1ED05 0021
0035 003F
0665 003F
06F5 003F
@@ -46533,10 +48205,13 @@ ABF5 003F
1D364 003F
1D376 003F
1D378 003F
+1E145 003F
+1E2F5 003F
1E8CB 003F
1E955 003F
1EC75 003F
1ECA7 003F
+1ED05 003F
FF15 0021
FF15 003F
2478 0021
@@ -46626,15 +48301,21 @@ FF15 003F
1D364 0334
1D376 0334
1D378 0334
+1E145 0334
+1E2F5 0334
1E8CB 0334
1E955 0334
1EC75 0334
1ECA7 0334
+1ED05 0334
1D7D3 0334
1D7DD 0334
1D7E7 0334
1D7F1 0334
1D7FB 0334
+1ED32 0021
+1ED32 003F
+1ED32 0334
215A 0021
215A 003F
215A 0061
@@ -46754,10 +48435,13 @@ ABF5 0061
1D364 0061
1D376 0061
1D378 0061
+1E145 0061
+1E2F5 0061
1E8CB 0061
1E955 0061
1EC75 0061
1ECA7 0061
+1ED05 0061
0035 0041
0665 0041
06F5 0041
@@ -46851,10 +48535,13 @@ ABF5 0041
1D364 0041
1D376 0041
1D378 0041
+1E145 0041
+1E2F5 0041
1E8CB 0041
1E955 0041
1EC75 0041
1ECA7 0041
+1ED05 0041
FF15 0061
FF15 0041
2478 0061
@@ -46889,6 +48576,8 @@ FF15 0041
2075 0041
2085 0061
2085 0041
+1ED32 0061
+1ED32 0041
0035 0062
0665 0062
06F5 0062
@@ -46982,10 +48671,13 @@ ABF5 0062
1D364 0062
1D376 0062
1D378 0062
+1E145 0062
+1E2F5 0062
1E8CB 0062
1E955 0062
1EC75 0062
1ECA7 0062
+1ED05 0062
FF15 0062
2478 0062
1F106 0062
@@ -47003,6 +48695,7 @@ FF15 0062
278E 0062
2075 0062
2085 0062
+1ED32 0062
33E4 0021
33E4 003F
33E4 0061
@@ -47094,10 +48787,13 @@ ABF6 0021
16E86 0021
1D2E6 0021
1D365 0021
+1E146 0021
+1E2F6 0021
1E8CC 0021
1E956 0021
1EC76 0021
1ECA8 0021
+1ED06 0021
0036 003F
0666 003F
06F6 003F
@@ -47174,10 +48870,13 @@ ABF6 003F
16E86 003F
1D2E6 003F
1D365 003F
+1E146 003F
+1E2F6 003F
1E8CC 003F
1E956 003F
1EC76 003F
1ECA8 003F
+1ED06 003F
FF16 0021
FF16 003F
2479 0021
@@ -47249,15 +48948,21 @@ FF16 003F
16E86 0334
1D2E6 0334
1D365 0334
+1E146 0334
+1E2F6 0334
1E8CC 0334
1E956 0334
1EC76 0334
1ECA8 0334
+1ED06 0334
1D7D4 0334
1D7DE 0334
1D7E8 0334
1D7F2 0334
1D7FC 0334
+1ED33 0021
+1ED33 003F
+1ED33 0334
324D 0021
324D 003F
324D 0061
@@ -47345,10 +49050,13 @@ ABF6 0061
16E86 0061
1D2E6 0061
1D365 0061
+1E146 0061
+1E2F6 0061
1E8CC 0061
1E956 0061
1EC76 0061
1ECA8 0061
+1ED06 0061
0036 0041
0666 0041
06F6 0041
@@ -47425,10 +49133,13 @@ ABF6 0041
16E86 0041
1D2E6 0041
1D365 0041
+1E146 0041
+1E2F6 0041
1E8CC 0041
1E956 0041
1EC76 0041
1ECA8 0041
+1ED06 0041
FF16 0061
FF16 0041
2479 0061
@@ -47463,6 +49174,8 @@ FF16 0041
2076 0041
2086 0061
2086 0041
+1ED33 0061
+1ED33 0041
0036 0062
0666 0062
06F6 0062
@@ -47539,10 +49252,13 @@ ABF6 0062
16E86 0062
1D2E6 0062
1D365 0062
+1E146 0062
+1E2F6 0062
1E8CC 0062
1E956 0062
1EC76 0062
1ECA8 0062
+1ED06 0062
FF16 0062
2479 0062
1F107 0062
@@ -47560,6 +49276,7 @@ FF16 0062
278F 0062
2076 0062
2086 0062
+1ED33 0062
33E5 0021
33E5 003F
33E5 0061
@@ -47651,10 +49368,13 @@ ABF7 0021
16E87 0021
1D2E7 0021
1D366 0021
+1E147 0021
+1E2F7 0021
1E8CD 0021
1E957 0021
1EC77 0021
1ECA9 0021
+1ED07 0021
0037 003F
0667 003F
06F7 003F
@@ -47731,10 +49451,13 @@ ABF7 003F
16E87 003F
1D2E7 003F
1D366 003F
+1E147 003F
+1E2F7 003F
1E8CD 003F
1E957 003F
1EC77 003F
1ECA9 003F
+1ED07 003F
FF17 0021
FF17 003F
247A 0021
@@ -47807,15 +49530,21 @@ FF17 003F
16E87 0334
1D2E7 0334
1D366 0334
+1E147 0334
+1E2F7 0334
1E8CD 0334
1E957 0334
1EC77 0334
1ECA9 0334
+1ED07 0334
1D7D5 0334
1D7DF 0334
1D7E9 0334
1D7F3 0334
1D7FD 0334
+1ED34 0021
+1ED34 003F
+1ED34 0334
215E 0021
215E 003F
215E 0061
@@ -47908,10 +49637,13 @@ ABF7 0061
16E87 0061
1D2E7 0061
1D366 0061
+1E147 0061
+1E2F7 0061
1E8CD 0061
1E957 0061
1EC77 0061
1ECA9 0061
+1ED07 0061
0037 0041
0667 0041
06F7 0041
@@ -47988,10 +49720,13 @@ ABF7 0041
16E87 0041
1D2E7 0041
1D366 0041
+1E147 0041
+1E2F7 0041
1E8CD 0041
1E957 0041
1EC77 0041
1ECA9 0041
+1ED07 0041
FF17 0061
FF17 0041
247A 0061
@@ -48026,6 +49761,8 @@ FF17 0041
2077 0041
2087 0061
2087 0041
+1ED34 0061
+1ED34 0041
0037 0062
0667 0062
06F7 0062
@@ -48102,10 +49839,13 @@ ABF7 0062
16E87 0062
1D2E7 0062
1D366 0062
+1E147 0062
+1E2F7 0062
1E8CD 0062
1E957 0062
1EC77 0062
1ECA9 0062
+1ED07 0062
FF17 0062
247A 0062
1F108 0062
@@ -48123,6 +49863,7 @@ FF17 0062
2790 0062
2077 0062
2087 0062
+1ED34 0062
33E6 0021
33E6 003F
33E6 0061
@@ -48213,10 +49954,13 @@ ABF8 0021
16E88 0021
1D2E8 0021
1D367 0021
+1E148 0021
+1E2F8 0021
1E8CE 0021
1E958 0021
1EC78 0021
1ECAA 0021
+1ED08 0021
0038 003F
0668 003F
06F8 003F
@@ -48292,10 +50036,13 @@ ABF8 003F
16E88 003F
1D2E8 003F
1D367 003F
+1E148 003F
+1E2F8 003F
1E8CE 003F
1E958 003F
1EC78 003F
1ECAA 003F
+1ED08 003F
FF18 0021
FF18 003F
247B 0021
@@ -48367,15 +50114,21 @@ FF18 003F
16E88 0334
1D2E8 0334
1D367 0334
+1E148 0334
+1E2F8 0334
1E8CE 0334
1E958 0334
1EC78 0334
1ECAA 0334
+1ED08 0334
1D7D6 0334
1D7E0 0334
1D7EA 0334
1D7F4 0334
1D7FE 0334
+1ED35 0021
+1ED35 003F
+1ED35 0334
324F 0021
324F 003F
324F 0061
@@ -48456,10 +50209,13 @@ ABF8 0061
16E88 0061
1D2E8 0061
1D367 0061
+1E148 0061
+1E2F8 0061
1E8CE 0061
1E958 0061
1EC78 0061
1ECAA 0061
+1ED08 0061
0038 0041
0668 0041
06F8 0041
@@ -48535,10 +50291,13 @@ ABF8 0041
16E88 0041
1D2E8 0041
1D367 0041
+1E148 0041
+1E2F8 0041
1E8CE 0041
1E958 0041
1EC78 0041
1ECAA 0041
+1ED08 0041
FF18 0061
FF18 0041
247B 0061
@@ -48573,6 +50332,8 @@ FF18 0041
2078 0041
2088 0061
2088 0041
+1ED35 0061
+1ED35 0041
0038 0062
0668 0062
06F8 0062
@@ -48648,10 +50409,13 @@ ABF8 0062
16E88 0062
1D2E8 0062
1D367 0062
+1E148 0062
+1E2F8 0062
1E8CE 0062
1E958 0062
1EC78 0062
1ECAA 0062
+1ED08 0062
FF18 0062
247B 0062
1F109 0062
@@ -48669,6 +50433,7 @@ FF18 0062
2791 0062
2078 0062
2088 0062
+1ED35 0062
1F19F 0021
1F19F 003F
1F19F 0334
@@ -48767,10 +50532,13 @@ ABF9 0021
16E89 0021
1D2E9 0021
1D368 0021
+1E149 0021
+1E2F9 0021
1E8CF 0021
1E959 0021
1EC79 0021
1ECAB 0021
+1ED09 0021
0039 003F
0669 003F
06F9 003F
@@ -48848,10 +50616,13 @@ ABF9 003F
16E89 003F
1D2E9 003F
1D368 003F
+1E149 003F
+1E2F9 003F
1E8CF 003F
1E959 003F
1EC79 003F
1ECAB 003F
+1ED09 003F
FF19 0021
FF19 003F
247C 0021
@@ -48925,15 +50696,21 @@ FF19 003F
16E89 0334
1D2E9 0334
1D368 0334
+1E149 0334
+1E2F9 0334
1E8CF 0334
1E959 0334
1EC79 0334
1ECAB 0334
+1ED09 0334
1D7D7 0334
1D7E1 0334
1D7EB 0334
1D7F5 0334
1D7FF 0334
+1ED36 0021
+1ED36 003F
+1ED36 0334
0039 0061
0669 0061
06F9 0061
@@ -49011,10 +50788,13 @@ ABF9 0061
16E89 0061
1D2E9 0061
1D368 0061
+1E149 0061
+1E2F9 0061
1E8CF 0061
1E959 0061
1EC79 0061
1ECAB 0061
+1ED09 0061
0039 0041
0669 0041
06F9 0041
@@ -49092,10 +50872,13 @@ ABF9 0041
16E89 0041
1D2E9 0041
1D368 0041
+1E149 0041
+1E2F9 0041
1E8CF 0041
1E959 0041
1EC79 0041
1ECAB 0041
+1ED09 0041
FF19 0061
FF19 0041
247C 0061
@@ -49130,6 +50913,8 @@ FF19 0041
2079 0041
2089 0061
2089 0041
+1ED36 0061
+1ED36 0041
0039 0062
0669 0062
06F9 0062
@@ -49207,10 +50992,13 @@ ABF9 0062
16E89 0062
1D2E9 0062
1D368 0062
+1E149 0062
+1E2F9 0062
1E8CF 0062
1E959 0062
1EC79 0062
1ECAB 0062
+1ED09 0062
FF19 0062
247C 0062
1F10A 0062
@@ -49228,6 +51016,7 @@ FF19 0062
2792 0062
2079 0062
2089 0062
+1ED36 0062
33E8 0021
33E8 003F
33E8 0061
@@ -49318,6 +51107,7 @@ FF0C 0061
2E41 0061
2E4C 0061
2E4E 0061
+2E4F 0061
055D 0061
060C 0061
060D 0061
@@ -49336,6 +51126,7 @@ FE51 0061
FF64 0061
FE45 0061
FE46 0061
+16FE2 0061
003B 0061
037E 0061
FE14 0061
@@ -49884,6 +51675,7 @@ A8FC 0061
09FD 0061
0A76 0061
0AF0 0061
+0C77 0061
0C84 0061
0DF4 0061
0E4F 0061
@@ -49951,7 +51743,6 @@ AADF 0061
1AA6 0061
1AAC 0061
1AAD 0061
-166D 0061
1CC0 0061
1CC1 0061
1CC2 0061
@@ -50040,6 +51831,8 @@ AA5C 0061
115D7 0061
11643 0061
1183B 0061
+119E2 0061
+11FFF 0061
16B37 0061
16B38 0061
16B39 0061
@@ -50376,6 +52169,15 @@ FFFB 0061
11372 0061
11373 0061
11374 0061
+13430 0061
+13431 0061
+13432 0061
+13433 0061
+13434 0061
+13435 0061
+13436 0061
+13437 0061
+13438 0061
1BCA0 0061
1BCA1 0061
1BCA2 0061
@@ -51003,6 +52805,7 @@ FF0C 0041
2E41 0041
2E4C 0041
2E4E 0041
+2E4F 0041
055D 0041
060C 0041
060D 0041
@@ -51021,6 +52824,7 @@ FE51 0041
FF64 0041
FE45 0041
FE46 0041
+16FE2 0041
003B 0041
037E 0041
FE14 0041
@@ -51569,6 +53373,7 @@ A8FC 0041
09FD 0041
0A76 0041
0AF0 0041
+0C77 0041
0C84 0041
0DF4 0041
0E4F 0041
@@ -51636,7 +53441,6 @@ AADF 0041
1AA6 0041
1AAC 0041
1AAD 0041
-166D 0041
1CC0 0041
1CC1 0041
1CC2 0041
@@ -51725,6 +53529,8 @@ AA5C 0041
115D7 0041
11643 0041
1183B 0041
+119E2 0041
+11FFF 0041
16B37 0041
16B38 0041
16B39 0041
@@ -52061,6 +53867,15 @@ FFFB 0041
11372 0041
11373 0041
11374 0041
+13430 0041
+13431 0041
+13432 0041
+13433 0041
+13434 0041
+13435 0041
+13436 0041
+13437 0041
+13438 0041
1BCA0 0041
1BCA1 0041
1BCA2 0041
@@ -53879,6 +55694,7 @@ A981 0061
1163D 0061
116AB 0061
11837 0061
+119DE 0061
11A38 0061
11A96 0061
11C3D 0061
@@ -53922,6 +55738,7 @@ A981 0041
1163D 0041
116AB 0041
11837 0041
+119DE 0041
11A38 0041
11A96 0041
11C3D 0041
@@ -53958,6 +55775,7 @@ A983 0061
1163E 0061
116AC 0061
11838 0061
+119DF 0061
11A39 0061
11A97 0061
11C3E 0061
@@ -53993,6 +55811,7 @@ A983 0041
1163E 0041
116AC 0041
11838 0041
+119DF 0041
11A39 0041
11A97 0041
11C3E 0041
@@ -54099,19 +55918,41 @@ A92D 0041
193B 0061
193B 0041
16B30 0061
+1E131 0061
16B30 0041
+1E131 0041
16B31 0061
+1E136 0061
16B31 0041
+1E136 0041
16B32 0061
+1E132 0061
16B32 0041
+1E132 0041
16B33 0061
+1E133 0061
16B33 0041
+1E133 0041
16B34 0061
+1E130 0061
16B34 0041
+1E130 0041
16B35 0061
+1E134 0061
16B35 0041
+1E134 0041
16B36 0061
+1E135 0061
16B36 0041
+1E135 0041
+1E2EC 0061
+1E2EC 0041
+1E2ED 0061
+1E2ED 0041
+1E2EE 0061
+1E2EE 0041
+1E2EF 0061
+1E2EF 0041
302A 0061
302A 0041
302B 0061
@@ -54662,6 +56503,16 @@ A73C 0062
1D8F 0061
1D8F 0041
1D8F 0062
+A7BB 0021
+A7BB 003F
+A7BA 0021
+A7BA 003F
+A7BB 0061
+A7BB 0041
+A7BA 0061
+A7BA 0041
+A7BB 0062
+A7BA 0062
1D01 0021
1D01 003F
1D01 0061
@@ -54824,6 +56675,7 @@ FF0C 0062
2E41 0062
2E4C 0062
2E4E 0062
+2E4F 0062
055D 0062
060C 0062
060D 0062
@@ -54842,6 +56694,7 @@ FE51 0062
FF64 0062
FE45 0062
FE46 0062
+16FE2 0062
003B 0062
037E 0062
FE14 0062
@@ -55390,6 +57243,7 @@ A8FC 0062
09FD 0062
0A76 0062
0AF0 0062
+0C77 0062
0C84 0062
0DF4 0062
0E4F 0062
@@ -55457,7 +57311,6 @@ AADF 0062
1AA6 0062
1AAC 0062
1AAD 0062
-166D 0062
1CC0 0062
1CC1 0062
1CC2 0062
@@ -55546,6 +57399,8 @@ AA5C 0062
115D7 0062
11643 0062
1183B 0062
+119E2 0062
+11FFF 0062
16B37 0062
16B38 0062
16B39 0062
@@ -55882,6 +57737,15 @@ FFFB 0062
11372 0062
11373 0062
11374 0062
+13430 0062
+13431 0062
+13432 0062
+13433 0062
+13434 0062
+13435 0062
+13436 0062
+13437 0062
+13438 0062
1BCA0 0062
1BCA1 0062
1BCA2 0062
@@ -57001,6 +58865,7 @@ A981 0062
1163D 0062
116AB 0062
11837 0062
+119DE 0062
11A38 0062
11A96 0062
11C3D 0062
@@ -57037,6 +58902,7 @@ A983 0062
1163E 0062
116AC 0062
11838 0062
+119DF 0062
11A39 0062
11A97 0062
11C3E 0062
@@ -57093,12 +58959,23 @@ A92D 0062
193A 0062
193B 0062
16B30 0062
+1E131 0062
16B31 0062
+1E136 0062
16B32 0062
+1E132 0062
16B33 0062
+1E133 0062
16B34 0062
+1E130 0062
16B35 0062
+1E134 0062
16B36 0062
+1E135 0062
+1E2EC 0062
+1E2ED 0062
+1E2EE 0062
+1E2EF 0062
302A 0062
302B 0062
302C 0062
@@ -57794,9 +59671,14 @@ A793 0062
A792 0062
A794 0021
A794 003F
+A7C4 0021
+A7C4 003F
A794 0061
A794 0041
+A7C4 0061
+A7C4 0041
A794 0062
+A7C4 0062
0188 0021
0188 003F
0187 0021
@@ -58316,6 +60198,11 @@ A779 0062
01C6 0062
01C5 0062
01C4 0062
+AB66 0021
+AB66 003F
+AB66 0061
+AB66 0041
+AB66 0062
02A5 0021
02A5 003F
02A5 0061
@@ -61252,6 +63139,16 @@ A7F7 0062
1D96 0061
1D96 0041
1D96 0062
+A7BD 0021
+A7BD 003F
+A7BC 0021
+A7BC 003F
+A7BD 0061
+A7BD 0041
+A7BC 0061
+A7BC 0041
+A7BD 0062
+A7BC 0062
0269 0021
0269 003F
0196 0021
@@ -63122,6 +65019,12 @@ FF2D 0062
33AB 0061
33AB 0041
33AB 0062
+1F16C 0021
+1F16C 003F
+1F16C 0334
+1F16C 0061
+1F16C 0041
+1F16C 0062
33B3 0021
33B3 003F
33B3 0061
@@ -66745,13 +68648,18 @@ A731 0062
1D8A 0062
0282 0021
0282 003F
+A7C5 0021
+A7C5 003F
1DB3 0021
1DB3 003F
0282 0061
0282 0041
+A7C5 0061
+A7C5 0041
1DB3 0061
1DB3 0041
0282 0062
+A7C5 0062
1DB3 0062
023F 0021
023F 003F
@@ -67227,6 +69135,11 @@ A786 0062
02A6 0041
01BE 0062
02A6 0062
+AB67 0021
+AB67 003F
+AB67 0061
+AB67 0041
+AB67 0062
02A7 0021
02A7 003F
02A7 0061
@@ -68196,6 +70109,16 @@ AB5F 0061
AB5F 0041
AB52 0062
AB5F 0062
+A7BF 0021
+A7BF 003F
+A7BE 0021
+A7BE 003F
+A7BF 0061
+A7BF 0041
+A7BE 0061
+A7BE 0041
+A7BF 0062
+A7BE 0062
0265 0021
0265 003F
A78D 0021
@@ -69050,6 +70973,16 @@ FF37 0062
1D21 0061
1D21 0041
1D21 0062
+A7C3 0021
+A7C3 003F
+A7C2 0021
+A7C2 003F
+A7C3 0061
+A7C3 0041
+A7C2 0061
+A7C2 0041
+A7C3 0062
+A7C2 0062
2C73 0021
2C73 003F
2C72 0021
@@ -70180,9 +72113,14 @@ FF3A 0062
1D76 0062
1D8E 0021
1D8E 003F
+A7C6 0021
+A7C6 003F
1D8E 0061
1D8E 0041
+A7C6 0061
+A7C6 0041
1D8E 0062
+A7C6 0062
0225 0021
0225 003F
0224 0021
@@ -90450,6 +92388,7 @@ A8FE 0062
1CEF 0021
1CF0 0021
1CF1 0021
+1CFA 0021
1CEA 003F
1CEB 003F
1CEC 003F
@@ -90457,6 +92396,7 @@ A8FE 0062
1CEF 003F
1CF0 003F
1CF1 003F
+1CFA 003F
1CE9 0061
1CE9 0041
1CEA 0061
@@ -90466,6 +92406,7 @@ A8FE 0062
1CEF 0061
1CF0 0061
1CF1 0061
+1CFA 0061
1CEA 0041
1CEB 0041
1CEC 0041
@@ -90473,6 +92414,7 @@ A8FE 0062
1CEF 0041
1CF0 0041
1CF1 0041
+1CFA 0041
1CE9 0062
1CEA 0062
1CEB 0062
@@ -90481,6 +92423,7 @@ A8FE 0062
1CEF 0062
1CF0 0062
1CF1 0062
+1CFA 0062
1CF5 0021
1CF5 003F
1CF5 0061
@@ -97542,6 +99485,12 @@ A8C4 0062
11448 0061
11448 0041
11448 0062
+1145F 0021
+1145F 003F
+1145F 0334
+1145F 0061
+1145F 0041
+1145F 0062
11435 0021
11435 003F
11435 0334
@@ -98935,6 +100884,12 @@ A8C4 0062
1168B 0061
1168B 0041
1168B 0062
+116B8 0021
+116B8 003F
+116B8 0334
+116B8 0061
+116B8 0041
+116B8 0062
1168C 0021
1168C 003F
1168C 0334
@@ -99164,6 +101119,379 @@ A8C4 0062
116B6 0061
116B6 0041
116B6 0062
+119A0 0021
+119A0 003F
+119A0 0334
+119A0 0061
+119A0 0041
+119A0 0062
+119A1 0021
+119A1 003F
+119A1 0334
+119A1 0061
+119A1 0041
+119A1 0062
+119A2 0021
+119A2 003F
+119A2 0334
+119A2 0061
+119A2 0041
+119A2 0062
+119A3 0021
+119A3 003F
+119A3 0334
+119A3 0061
+119A3 0041
+119A3 0062
+119A4 0021
+119A4 003F
+119A4 0334
+119A4 0061
+119A4 0041
+119A4 0062
+119A5 0021
+119A5 003F
+119A5 0334
+119A5 0061
+119A5 0041
+119A5 0062
+119A6 0021
+119A6 003F
+119A6 0334
+119A6 0061
+119A6 0041
+119A6 0062
+119A7 0021
+119A7 003F
+119A7 0334
+119A7 0061
+119A7 0041
+119A7 0062
+119AA 0021
+119AA 003F
+119AA 0334
+119AA 0061
+119AA 0041
+119AA 0062
+119AB 0021
+119AB 003F
+119AB 0334
+119AB 0061
+119AB 0041
+119AB 0062
+119AC 0021
+119AC 003F
+119AC 0334
+119AC 0061
+119AC 0041
+119AC 0062
+119AD 0021
+119AD 003F
+119AD 0334
+119AD 0061
+119AD 0041
+119AD 0062
+119AE 0021
+119AE 003F
+119AE 0334
+119AE 0061
+119AE 0041
+119AE 0062
+119AF 0021
+119AF 003F
+119AF 0334
+119AF 0061
+119AF 0041
+119AF 0062
+119B0 0021
+119B0 003F
+119B0 0334
+119B0 0061
+119B0 0041
+119B0 0062
+119B1 0021
+119B1 003F
+119B1 0334
+119B1 0061
+119B1 0041
+119B1 0062
+119B2 0021
+119B2 003F
+119B2 0334
+119B2 0061
+119B2 0041
+119B2 0062
+119B3 0021
+119B3 003F
+119B3 0334
+119B3 0061
+119B3 0041
+119B3 0062
+119B4 0021
+119B4 003F
+119B4 0334
+119B4 0061
+119B4 0041
+119B4 0062
+119B5 0021
+119B5 003F
+119B5 0334
+119B5 0061
+119B5 0041
+119B5 0062
+119B6 0021
+119B6 003F
+119B6 0334
+119B6 0061
+119B6 0041
+119B6 0062
+119B7 0021
+119B7 003F
+119B7 0334
+119B7 0061
+119B7 0041
+119B7 0062
+119B8 0021
+119B8 003F
+119B8 0334
+119B8 0061
+119B8 0041
+119B8 0062
+119B9 0021
+119B9 003F
+119B9 0334
+119B9 0061
+119B9 0041
+119B9 0062
+119BA 0021
+119BA 003F
+119BA 0334
+119BA 0061
+119BA 0041
+119BA 0062
+119BB 0021
+119BB 003F
+119BB 0334
+119BB 0061
+119BB 0041
+119BB 0062
+119BC 0021
+119BC 003F
+119BC 0334
+119BC 0061
+119BC 0041
+119BC 0062
+119BD 0021
+119BD 003F
+119BD 0334
+119BD 0061
+119BD 0041
+119BD 0062
+119BE 0021
+119BE 003F
+119BE 0334
+119BE 0061
+119BE 0041
+119BE 0062
+119BF 0021
+119BF 003F
+119BF 0334
+119BF 0061
+119BF 0041
+119BF 0062
+119C0 0021
+119C0 003F
+119C0 0334
+119C0 0061
+119C0 0041
+119C0 0062
+119C1 0021
+119C1 003F
+119C1 0334
+119C1 0061
+119C1 0041
+119C1 0062
+119C2 0021
+119C2 003F
+119C2 0334
+119C2 0061
+119C2 0041
+119C2 0062
+119C3 0021
+119C3 003F
+119C3 0334
+119C3 0061
+119C3 0041
+119C3 0062
+119C4 0021
+119C4 003F
+119C4 0334
+119C4 0061
+119C4 0041
+119C4 0062
+119C5 0021
+119C5 003F
+119C5 0334
+119C5 0061
+119C5 0041
+119C5 0062
+119C6 0021
+119C6 003F
+119C6 0334
+119C6 0061
+119C6 0041
+119C6 0062
+119C7 0021
+119C7 003F
+119C7 0334
+119C7 0061
+119C7 0041
+119C7 0062
+119C8 0021
+119C8 003F
+119C8 0334
+119C8 0061
+119C8 0041
+119C8 0062
+119C9 0021
+119C9 003F
+119C9 0334
+119C9 0061
+119C9 0041
+119C9 0062
+119CA 0021
+119CA 003F
+119CA 0334
+119CA 0061
+119CA 0041
+119CA 0062
+119CB 0021
+119CB 003F
+119CB 0334
+119CB 0061
+119CB 0041
+119CB 0062
+119CC 0021
+119CC 003F
+119CC 0334
+119CC 0061
+119CC 0041
+119CC 0062
+119CD 0021
+119CD 003F
+119CD 0334
+119CD 0061
+119CD 0041
+119CD 0062
+119CE 0021
+119CE 003F
+119CE 0334
+119CE 0061
+119CE 0041
+119CE 0062
+119CF 0021
+119CF 003F
+119CF 0334
+119CF 0061
+119CF 0041
+119CF 0062
+119D0 0021
+119D0 003F
+119D0 0334
+119D0 0061
+119D0 0041
+119D0 0062
+119E1 0021
+119E1 003F
+119E1 0334
+119E1 0061
+119E1 0041
+119E1 0062
+119E3 0021
+119E3 003F
+119E3 0334
+119E3 0061
+119E3 0041
+119E3 0062
+119D1 0021
+119D1 003F
+119D1 0334
+119D1 0061
+119D1 0041
+119D1 0062
+119D2 0021
+119D2 003F
+119D2 0334
+119D2 0061
+119D2 0041
+119D2 0062
+119D3 0021
+119D3 003F
+119D3 0334
+119D3 0061
+119D3 0041
+119D3 0062
+119D4 0021
+119D4 003F
+119D4 0334
+119D4 0061
+119D4 0041
+119D4 0062
+119D5 0021
+119D5 003F
+119D5 0334
+119D5 0061
+119D5 0041
+119D5 0062
+119D6 0021
+119D6 003F
+119D6 0334
+119D6 0061
+119D6 0041
+119D6 0062
+119D7 0021
+119D7 003F
+119D7 0334
+119D7 0061
+119D7 0041
+119D7 0062
+119DA 0021
+119DA 003F
+119DA 0334
+119DA 0061
+119DA 0041
+119DA 0062
+119E4 0021
+119E4 003F
+119E4 0334
+119E4 0061
+119E4 0041
+119E4 0062
+119DB 0021
+119DB 003F
+119DB 0334
+119DB 0061
+119DB 0041
+119DB 0062
+119DC 0021
+119DC 003F
+119DC 0334
+119DC 0061
+119DC 0041
+119DC 0062
+119DD 0021
+119DD 003F
+119DD 0334
+119DD 0061
+119DD 0041
+119DD 0062
+119E0 0021
+119E0 003F
+0334 119E0
+119E0 0334
+119E0 0061
+119E0 0041
+119E0 0062
11800 0021
11800 003F
11800 0334
@@ -104024,6 +106352,36 @@ A8C4 0062
0EC4 0E84 0061
0EC4 0E84 0041
0EC4 0E84 0062
+0E86 0021
+0E86 003F
+0E86 0061
+0E86 0041
+0E86 0062
+0EC0 0E86 0021
+0EC0 0E86 003F
+0EC0 0E86 0061
+0EC0 0E86 0041
+0EC0 0E86 0062
+0EC1 0E86 0021
+0EC1 0E86 003F
+0EC1 0E86 0061
+0EC1 0E86 0041
+0EC1 0E86 0062
+0EC2 0E86 0021
+0EC2 0E86 003F
+0EC2 0E86 0061
+0EC2 0E86 0041
+0EC2 0E86 0062
+0EC3 0E86 0021
+0EC3 0E86 003F
+0EC3 0E86 0061
+0EC3 0E86 0041
+0EC3 0E86 0062
+0EC4 0E86 0021
+0EC4 0E86 003F
+0EC4 0E86 0061
+0EC4 0E86 0041
+0EC4 0E86 0062
0E87 0021
0E87 003F
0E87 0061
@@ -104084,6 +106442,36 @@ A8C4 0062
0EC4 0E88 0061
0EC4 0E88 0041
0EC4 0E88 0062
+0E89 0021
+0E89 003F
+0E89 0061
+0E89 0041
+0E89 0062
+0EC0 0E89 0021
+0EC0 0E89 003F
+0EC0 0E89 0061
+0EC0 0E89 0041
+0EC0 0E89 0062
+0EC1 0E89 0021
+0EC1 0E89 003F
+0EC1 0E89 0061
+0EC1 0E89 0041
+0EC1 0E89 0062
+0EC2 0E89 0021
+0EC2 0E89 003F
+0EC2 0E89 0061
+0EC2 0E89 0041
+0EC2 0E89 0062
+0EC3 0E89 0021
+0EC3 0E89 003F
+0EC3 0E89 0061
+0EC3 0E89 0041
+0EC3 0E89 0062
+0EC4 0E89 0021
+0EC4 0E89 003F
+0EC4 0E89 0061
+0EC4 0E89 0041
+0EC4 0E89 0062
0EAA 0021
0EAA 003F
0EAA 0061
@@ -104144,6 +106532,66 @@ A8C4 0062
0EC4 0E8A 0061
0EC4 0E8A 0041
0EC4 0E8A 0062
+0E8C 0021
+0E8C 003F
+0E8C 0061
+0E8C 0041
+0E8C 0062
+0EC0 0E8C 0021
+0EC0 0E8C 003F
+0EC0 0E8C 0061
+0EC0 0E8C 0041
+0EC0 0E8C 0062
+0EC1 0E8C 0021
+0EC1 0E8C 003F
+0EC1 0E8C 0061
+0EC1 0E8C 0041
+0EC1 0E8C 0062
+0EC2 0E8C 0021
+0EC2 0E8C 003F
+0EC2 0E8C 0061
+0EC2 0E8C 0041
+0EC2 0E8C 0062
+0EC3 0E8C 0021
+0EC3 0E8C 003F
+0EC3 0E8C 0061
+0EC3 0E8C 0041
+0EC3 0E8C 0062
+0EC4 0E8C 0021
+0EC4 0E8C 003F
+0EC4 0E8C 0061
+0EC4 0E8C 0041
+0EC4 0E8C 0062
+0E8E 0021
+0E8E 003F
+0E8E 0061
+0E8E 0041
+0E8E 0062
+0EC0 0E8E 0021
+0EC0 0E8E 003F
+0EC0 0E8E 0061
+0EC0 0E8E 0041
+0EC0 0E8E 0062
+0EC1 0E8E 0021
+0EC1 0E8E 003F
+0EC1 0E8E 0061
+0EC1 0E8E 0041
+0EC1 0E8E 0062
+0EC2 0E8E 0021
+0EC2 0E8E 003F
+0EC2 0E8E 0061
+0EC2 0E8E 0041
+0EC2 0E8E 0062
+0EC3 0E8E 0021
+0EC3 0E8E 003F
+0EC3 0E8E 0061
+0EC3 0E8E 0041
+0EC3 0E8E 0062
+0EC4 0E8E 0021
+0EC4 0E8E 003F
+0EC4 0E8E 0061
+0EC4 0E8E 0041
+0EC4 0E8E 0062
0EDF 0021
0EDF 003F
0EDF 0061
@@ -104204,6 +106652,156 @@ A8C4 0062
0EC4 0E8D 0061
0EC4 0E8D 0041
0EC4 0E8D 0062
+0E8F 0021
+0E8F 003F
+0E8F 0061
+0E8F 0041
+0E8F 0062
+0EC0 0E8F 0021
+0EC0 0E8F 003F
+0EC0 0E8F 0061
+0EC0 0E8F 0041
+0EC0 0E8F 0062
+0EC1 0E8F 0021
+0EC1 0E8F 003F
+0EC1 0E8F 0061
+0EC1 0E8F 0041
+0EC1 0E8F 0062
+0EC2 0E8F 0021
+0EC2 0E8F 003F
+0EC2 0E8F 0061
+0EC2 0E8F 0041
+0EC2 0E8F 0062
+0EC3 0E8F 0021
+0EC3 0E8F 003F
+0EC3 0E8F 0061
+0EC3 0E8F 0041
+0EC3 0E8F 0062
+0EC4 0E8F 0021
+0EC4 0E8F 003F
+0EC4 0E8F 0061
+0EC4 0E8F 0041
+0EC4 0E8F 0062
+0E90 0021
+0E90 003F
+0E90 0061
+0E90 0041
+0E90 0062
+0EC0 0E90 0021
+0EC0 0E90 003F
+0EC0 0E90 0061
+0EC0 0E90 0041
+0EC0 0E90 0062
+0EC1 0E90 0021
+0EC1 0E90 003F
+0EC1 0E90 0061
+0EC1 0E90 0041
+0EC1 0E90 0062
+0EC2 0E90 0021
+0EC2 0E90 003F
+0EC2 0E90 0061
+0EC2 0E90 0041
+0EC2 0E90 0062
+0EC3 0E90 0021
+0EC3 0E90 003F
+0EC3 0E90 0061
+0EC3 0E90 0041
+0EC3 0E90 0062
+0EC4 0E90 0021
+0EC4 0E90 003F
+0EC4 0E90 0061
+0EC4 0E90 0041
+0EC4 0E90 0062
+0E91 0021
+0E91 003F
+0E91 0061
+0E91 0041
+0E91 0062
+0EC0 0E91 0021
+0EC0 0E91 003F
+0EC0 0E91 0061
+0EC0 0E91 0041
+0EC0 0E91 0062
+0EC1 0E91 0021
+0EC1 0E91 003F
+0EC1 0E91 0061
+0EC1 0E91 0041
+0EC1 0E91 0062
+0EC2 0E91 0021
+0EC2 0E91 003F
+0EC2 0E91 0061
+0EC2 0E91 0041
+0EC2 0E91 0062
+0EC3 0E91 0021
+0EC3 0E91 003F
+0EC3 0E91 0061
+0EC3 0E91 0041
+0EC3 0E91 0062
+0EC4 0E91 0021
+0EC4 0E91 003F
+0EC4 0E91 0061
+0EC4 0E91 0041
+0EC4 0E91 0062
+0E92 0021
+0E92 003F
+0E92 0061
+0E92 0041
+0E92 0062
+0EC0 0E92 0021
+0EC0 0E92 003F
+0EC0 0E92 0061
+0EC0 0E92 0041
+0EC0 0E92 0062
+0EC1 0E92 0021
+0EC1 0E92 003F
+0EC1 0E92 0061
+0EC1 0E92 0041
+0EC1 0E92 0062
+0EC2 0E92 0021
+0EC2 0E92 003F
+0EC2 0E92 0061
+0EC2 0E92 0041
+0EC2 0E92 0062
+0EC3 0E92 0021
+0EC3 0E92 003F
+0EC3 0E92 0061
+0EC3 0E92 0041
+0EC3 0E92 0062
+0EC4 0E92 0021
+0EC4 0E92 003F
+0EC4 0E92 0061
+0EC4 0E92 0041
+0EC4 0E92 0062
+0E93 0021
+0E93 003F
+0E93 0061
+0E93 0041
+0E93 0062
+0EC0 0E93 0021
+0EC0 0E93 003F
+0EC0 0E93 0061
+0EC0 0E93 0041
+0EC0 0E93 0062
+0EC1 0E93 0021
+0EC1 0E93 003F
+0EC1 0E93 0061
+0EC1 0E93 0041
+0EC1 0E93 0062
+0EC2 0E93 0021
+0EC2 0E93 003F
+0EC2 0E93 0061
+0EC2 0E93 0041
+0EC2 0E93 0062
+0EC3 0E93 0021
+0EC3 0E93 003F
+0EC3 0E93 0061
+0EC3 0E93 0041
+0EC3 0E93 0062
+0EC4 0E93 0021
+0EC4 0E93 003F
+0EC4 0E93 0061
+0EC4 0E93 0041
+0EC4 0E93 0062
0E94 0021
0E94 003F
0E94 0061
@@ -104324,6 +106922,36 @@ A8C4 0062
0EC4 0E97 0061
0EC4 0E97 0041
0EC4 0E97 0062
+0E98 0021
+0E98 003F
+0E98 0061
+0E98 0041
+0E98 0062
+0EC0 0E98 0021
+0EC0 0E98 003F
+0EC0 0E98 0061
+0EC0 0E98 0041
+0EC0 0E98 0062
+0EC1 0E98 0021
+0EC1 0E98 003F
+0EC1 0E98 0061
+0EC1 0E98 0041
+0EC1 0E98 0062
+0EC2 0E98 0021
+0EC2 0E98 003F
+0EC2 0E98 0061
+0EC2 0E98 0041
+0EC2 0E98 0062
+0EC3 0E98 0021
+0EC3 0E98 003F
+0EC3 0E98 0061
+0EC3 0E98 0041
+0EC3 0E98 0062
+0EC4 0E98 0021
+0EC4 0E98 003F
+0EC4 0E98 0061
+0EC4 0E98 0041
+0EC4 0E98 0062
0E99 0021
0E99 003F
0E99 0061
@@ -104534,6 +107162,36 @@ A8C4 0062
0EC4 0E9F 0061
0EC4 0E9F 0041
0EC4 0E9F 0062
+0EA0 0021
+0EA0 003F
+0EA0 0061
+0EA0 0041
+0EA0 0062
+0EC0 0EA0 0021
+0EC0 0EA0 003F
+0EC0 0EA0 0061
+0EC0 0EA0 0041
+0EC0 0EA0 0062
+0EC1 0EA0 0021
+0EC1 0EA0 003F
+0EC1 0EA0 0061
+0EC1 0EA0 0041
+0EC1 0EA0 0062
+0EC2 0EA0 0021
+0EC2 0EA0 003F
+0EC2 0EA0 0061
+0EC2 0EA0 0041
+0EC2 0EA0 0062
+0EC3 0EA0 0021
+0EC3 0EA0 003F
+0EC3 0EA0 0061
+0EC3 0EA0 0041
+0EC3 0EA0 0062
+0EC4 0EA0 0021
+0EC4 0EA0 003F
+0EC4 0EA0 0061
+0EC4 0EA0 0041
+0EC4 0EA0 0062
0EA1 0021
0EA1 003F
0EA1 0061
@@ -104684,6 +107342,66 @@ A8C4 0062
0EC4 0EA7 0061
0EC4 0EA7 0041
0EC4 0EA7 0062
+0EA8 0021
+0EA8 003F
+0EA8 0061
+0EA8 0041
+0EA8 0062
+0EC0 0EA8 0021
+0EC0 0EA8 003F
+0EC0 0EA8 0061
+0EC0 0EA8 0041
+0EC0 0EA8 0062
+0EC1 0EA8 0021
+0EC1 0EA8 003F
+0EC1 0EA8 0061
+0EC1 0EA8 0041
+0EC1 0EA8 0062
+0EC2 0EA8 0021
+0EC2 0EA8 003F
+0EC2 0EA8 0061
+0EC2 0EA8 0041
+0EC2 0EA8 0062
+0EC3 0EA8 0021
+0EC3 0EA8 003F
+0EC3 0EA8 0061
+0EC3 0EA8 0041
+0EC3 0EA8 0062
+0EC4 0EA8 0021
+0EC4 0EA8 003F
+0EC4 0EA8 0061
+0EC4 0EA8 0041
+0EC4 0EA8 0062
+0EA9 0021
+0EA9 003F
+0EA9 0061
+0EA9 0041
+0EA9 0062
+0EC0 0EA9 0021
+0EC0 0EA9 003F
+0EC0 0EA9 0061
+0EC0 0EA9 0041
+0EC0 0EA9 0062
+0EC1 0EA9 0021
+0EC1 0EA9 003F
+0EC1 0EA9 0061
+0EC1 0EA9 0041
+0EC1 0EA9 0062
+0EC2 0EA9 0021
+0EC2 0EA9 003F
+0EC2 0EA9 0061
+0EC2 0EA9 0041
+0EC2 0EA9 0062
+0EC3 0EA9 0021
+0EC3 0EA9 003F
+0EC3 0EA9 0061
+0EC3 0EA9 0041
+0EC3 0EA9 0062
+0EC4 0EA9 0021
+0EC4 0EA9 003F
+0EC4 0EA9 0061
+0EC4 0EA9 0041
+0EC4 0EA9 0062
0EAB 0021
0EAB 003F
0EAB 0061
@@ -104774,6 +107492,36 @@ A8C4 0062
0EC4 0EAB 0061
0EC4 0EAB 0041
0EC4 0EAB 0062
+0EAC 0021
+0EAC 003F
+0EAC 0061
+0EAC 0041
+0EAC 0062
+0EC0 0EAC 0021
+0EC0 0EAC 003F
+0EC0 0EAC 0061
+0EC0 0EAC 0041
+0EC0 0EAC 0062
+0EC1 0EAC 0021
+0EC1 0EAC 003F
+0EC1 0EAC 0061
+0EC1 0EAC 0041
+0EC1 0EAC 0062
+0EC2 0EAC 0021
+0EC2 0EAC 003F
+0EC2 0EAC 0061
+0EC2 0EAC 0041
+0EC2 0EAC 0062
+0EC3 0EAC 0021
+0EC3 0EAC 003F
+0EC3 0EAC 0061
+0EC3 0EAC 0041
+0EC3 0EAC 0062
+0EC4 0EAC 0021
+0EC4 0EAC 003F
+0EC4 0EAC 0061
+0EC4 0EAC 0041
+0EC4 0EAC 0062
0EAD 0021
0EAD 003F
0EAD 0061
@@ -104901,6 +107649,13 @@ A8C4 0062
0EB9 0061
0EB9 0041
0EB9 0062
+0EBA 0021
+0EBA 003F
+0334 0EBA
+0EBA 0334
+0EBA 0061
+0EBA 0041
+0EBA 0062
0EBB 0021
0EBB 003F
0EBB 0061
@@ -104933,24 +107688,51 @@ A8C4 0062
0EC0 0001 0E84 0061
0EC0 0591 0E84 0061
0EC0 1D165 0E84 0061
+0EC0 0001 0E86 0061
+0EC0 0591 0E86 0061
+0EC0 1D165 0E86 0061
0EC0 0001 0E87 0061
0EC0 0591 0E87 0061
0EC0 1D165 0E87 0061
0EC0 0001 0E88 0061
0EC0 0591 0E88 0061
0EC0 1D165 0E88 0061
+0EC0 0001 0E89 0061
+0EC0 0591 0E89 0061
+0EC0 1D165 0E89 0061
0EC0 0001 0EAA 0061
0EC0 0591 0EAA 0061
0EC0 1D165 0EAA 0061
0EC0 0001 0E8A 0061
0EC0 0591 0E8A 0061
0EC0 1D165 0E8A 0061
+0EC0 0001 0E8C 0061
+0EC0 0591 0E8C 0061
+0EC0 1D165 0E8C 0061
+0EC0 0001 0E8E 0061
+0EC0 0591 0E8E 0061
+0EC0 1D165 0E8E 0061
0EC0 0001 0EDF 0061
0EC0 0591 0EDF 0061
0EC0 1D165 0EDF 0061
0EC0 0001 0E8D 0061
0EC0 0591 0E8D 0061
0EC0 1D165 0E8D 0061
+0EC0 0001 0E8F 0061
+0EC0 0591 0E8F 0061
+0EC0 1D165 0E8F 0061
+0EC0 0001 0E90 0061
+0EC0 0591 0E90 0061
+0EC0 1D165 0E90 0061
+0EC0 0001 0E91 0061
+0EC0 0591 0E91 0061
+0EC0 1D165 0E91 0061
+0EC0 0001 0E92 0061
+0EC0 0591 0E92 0061
+0EC0 1D165 0E92 0061
+0EC0 0001 0E93 0061
+0EC0 0591 0E93 0061
+0EC0 1D165 0E93 0061
0EC0 0001 0E94 0061
0EC0 0591 0E94 0061
0EC0 1D165 0E94 0061
@@ -104963,6 +107745,9 @@ A8C4 0062
0EC0 0001 0E97 0061
0EC0 0591 0E97 0061
0EC0 1D165 0E97 0061
+0EC0 0001 0E98 0061
+0EC0 0591 0E98 0061
+0EC0 1D165 0E98 0061
0EC0 0001 0E99 0061
0EC0 0591 0E99 0061
0EC0 1D165 0E99 0061
@@ -104984,6 +107769,9 @@ A8C4 0062
0EC0 0001 0E9F 0061
0EC0 0591 0E9F 0061
0EC0 1D165 0E9F 0061
+0EC0 0001 0EA0 0061
+0EC0 0591 0EA0 0061
+0EC0 1D165 0EA0 0061
0EC0 0001 0EA1 0061
0EC0 0591 0EA1 0061
0EC0 1D165 0EA1 0061
@@ -104999,6 +107787,12 @@ A8C4 0062
0EC0 0001 0EA7 0061
0EC0 0591 0EA7 0061
0EC0 1D165 0EA7 0061
+0EC0 0001 0EA8 0061
+0EC0 0591 0EA8 0061
+0EC0 1D165 0EA8 0061
+0EC0 0001 0EA9 0061
+0EC0 0591 0EA9 0061
+0EC0 1D165 0EA9 0061
0EC0 0001 0EAB 0061
0EC0 0591 0EAB 0061
0EC0 1D165 0EAB 0061
@@ -105008,6 +107802,9 @@ A8C4 0062
0EC0 0001 0EDD 0061
0EC0 0591 0EDD 0061
0EC0 1D165 0EDD 0061
+0EC0 0001 0EAC 0061
+0EC0 0591 0EAC 0061
+0EC0 1D165 0EAC 0061
0EC0 0001 0EAD 0061
0EC0 0591 0EAD 0061
0EC0 1D165 0EAD 0061
@@ -105031,24 +107828,51 @@ A8C4 0062
0EC1 0001 0E84 0061
0EC1 0591 0E84 0061
0EC1 1D165 0E84 0061
+0EC1 0001 0E86 0061
+0EC1 0591 0E86 0061
+0EC1 1D165 0E86 0061
0EC1 0001 0E87 0061
0EC1 0591 0E87 0061
0EC1 1D165 0E87 0061
0EC1 0001 0E88 0061
0EC1 0591 0E88 0061
0EC1 1D165 0E88 0061
+0EC1 0001 0E89 0061
+0EC1 0591 0E89 0061
+0EC1 1D165 0E89 0061
0EC1 0001 0EAA 0061
0EC1 0591 0EAA 0061
0EC1 1D165 0EAA 0061
0EC1 0001 0E8A 0061
0EC1 0591 0E8A 0061
0EC1 1D165 0E8A 0061
+0EC1 0001 0E8C 0061
+0EC1 0591 0E8C 0061
+0EC1 1D165 0E8C 0061
+0EC1 0001 0E8E 0061
+0EC1 0591 0E8E 0061
+0EC1 1D165 0E8E 0061
0EC1 0001 0EDF 0061
0EC1 0591 0EDF 0061
0EC1 1D165 0EDF 0061
0EC1 0001 0E8D 0061
0EC1 0591 0E8D 0061
0EC1 1D165 0E8D 0061
+0EC1 0001 0E8F 0061
+0EC1 0591 0E8F 0061
+0EC1 1D165 0E8F 0061
+0EC1 0001 0E90 0061
+0EC1 0591 0E90 0061
+0EC1 1D165 0E90 0061
+0EC1 0001 0E91 0061
+0EC1 0591 0E91 0061
+0EC1 1D165 0E91 0061
+0EC1 0001 0E92 0061
+0EC1 0591 0E92 0061
+0EC1 1D165 0E92 0061
+0EC1 0001 0E93 0061
+0EC1 0591 0E93 0061
+0EC1 1D165 0E93 0061
0EC1 0001 0E94 0061
0EC1 0591 0E94 0061
0EC1 1D165 0E94 0061
@@ -105061,6 +107885,9 @@ A8C4 0062
0EC1 0001 0E97 0061
0EC1 0591 0E97 0061
0EC1 1D165 0E97 0061
+0EC1 0001 0E98 0061
+0EC1 0591 0E98 0061
+0EC1 1D165 0E98 0061
0EC1 0001 0E99 0061
0EC1 0591 0E99 0061
0EC1 1D165 0E99 0061
@@ -105082,6 +107909,9 @@ A8C4 0062
0EC1 0001 0E9F 0061
0EC1 0591 0E9F 0061
0EC1 1D165 0E9F 0061
+0EC1 0001 0EA0 0061
+0EC1 0591 0EA0 0061
+0EC1 1D165 0EA0 0061
0EC1 0001 0EA1 0061
0EC1 0591 0EA1 0061
0EC1 1D165 0EA1 0061
@@ -105097,6 +107927,12 @@ A8C4 0062
0EC1 0001 0EA7 0061
0EC1 0591 0EA7 0061
0EC1 1D165 0EA7 0061
+0EC1 0001 0EA8 0061
+0EC1 0591 0EA8 0061
+0EC1 1D165 0EA8 0061
+0EC1 0001 0EA9 0061
+0EC1 0591 0EA9 0061
+0EC1 1D165 0EA9 0061
0EC1 0001 0EAB 0061
0EC1 0591 0EAB 0061
0EC1 1D165 0EAB 0061
@@ -105106,6 +107942,9 @@ A8C4 0062
0EC1 0001 0EDD 0061
0EC1 0591 0EDD 0061
0EC1 1D165 0EDD 0061
+0EC1 0001 0EAC 0061
+0EC1 0591 0EAC 0061
+0EC1 1D165 0EAC 0061
0EC1 0001 0EAD 0061
0EC1 0591 0EAD 0061
0EC1 1D165 0EAD 0061
@@ -105129,24 +107968,51 @@ A8C4 0062
0EC2 0001 0E84 0061
0EC2 0591 0E84 0061
0EC2 1D165 0E84 0061
+0EC2 0001 0E86 0061
+0EC2 0591 0E86 0061
+0EC2 1D165 0E86 0061
0EC2 0001 0E87 0061
0EC2 0591 0E87 0061
0EC2 1D165 0E87 0061
0EC2 0001 0E88 0061
0EC2 0591 0E88 0061
0EC2 1D165 0E88 0061
+0EC2 0001 0E89 0061
+0EC2 0591 0E89 0061
+0EC2 1D165 0E89 0061
0EC2 0001 0EAA 0061
0EC2 0591 0EAA 0061
0EC2 1D165 0EAA 0061
0EC2 0001 0E8A 0061
0EC2 0591 0E8A 0061
0EC2 1D165 0E8A 0061
+0EC2 0001 0E8C 0061
+0EC2 0591 0E8C 0061
+0EC2 1D165 0E8C 0061
+0EC2 0001 0E8E 0061
+0EC2 0591 0E8E 0061
+0EC2 1D165 0E8E 0061
0EC2 0001 0EDF 0061
0EC2 0591 0EDF 0061
0EC2 1D165 0EDF 0061
0EC2 0001 0E8D 0061
0EC2 0591 0E8D 0061
0EC2 1D165 0E8D 0061
+0EC2 0001 0E8F 0061
+0EC2 0591 0E8F 0061
+0EC2 1D165 0E8F 0061
+0EC2 0001 0E90 0061
+0EC2 0591 0E90 0061
+0EC2 1D165 0E90 0061
+0EC2 0001 0E91 0061
+0EC2 0591 0E91 0061
+0EC2 1D165 0E91 0061
+0EC2 0001 0E92 0061
+0EC2 0591 0E92 0061
+0EC2 1D165 0E92 0061
+0EC2 0001 0E93 0061
+0EC2 0591 0E93 0061
+0EC2 1D165 0E93 0061
0EC2 0001 0E94 0061
0EC2 0591 0E94 0061
0EC2 1D165 0E94 0061
@@ -105159,6 +108025,9 @@ A8C4 0062
0EC2 0001 0E97 0061
0EC2 0591 0E97 0061
0EC2 1D165 0E97 0061
+0EC2 0001 0E98 0061
+0EC2 0591 0E98 0061
+0EC2 1D165 0E98 0061
0EC2 0001 0E99 0061
0EC2 0591 0E99 0061
0EC2 1D165 0E99 0061
@@ -105180,6 +108049,9 @@ A8C4 0062
0EC2 0001 0E9F 0061
0EC2 0591 0E9F 0061
0EC2 1D165 0E9F 0061
+0EC2 0001 0EA0 0061
+0EC2 0591 0EA0 0061
+0EC2 1D165 0EA0 0061
0EC2 0001 0EA1 0061
0EC2 0591 0EA1 0061
0EC2 1D165 0EA1 0061
@@ -105195,6 +108067,12 @@ A8C4 0062
0EC2 0001 0EA7 0061
0EC2 0591 0EA7 0061
0EC2 1D165 0EA7 0061
+0EC2 0001 0EA8 0061
+0EC2 0591 0EA8 0061
+0EC2 1D165 0EA8 0061
+0EC2 0001 0EA9 0061
+0EC2 0591 0EA9 0061
+0EC2 1D165 0EA9 0061
0EC2 0001 0EAB 0061
0EC2 0591 0EAB 0061
0EC2 1D165 0EAB 0061
@@ -105204,6 +108082,9 @@ A8C4 0062
0EC2 0001 0EDD 0061
0EC2 0591 0EDD 0061
0EC2 1D165 0EDD 0061
+0EC2 0001 0EAC 0061
+0EC2 0591 0EAC 0061
+0EC2 1D165 0EAC 0061
0EC2 0001 0EAD 0061
0EC2 0591 0EAD 0061
0EC2 1D165 0EAD 0061
@@ -105227,24 +108108,51 @@ A8C4 0062
0EC3 0001 0E84 0061
0EC3 0591 0E84 0061
0EC3 1D165 0E84 0061
+0EC3 0001 0E86 0061
+0EC3 0591 0E86 0061
+0EC3 1D165 0E86 0061
0EC3 0001 0E87 0061
0EC3 0591 0E87 0061
0EC3 1D165 0E87 0061
0EC3 0001 0E88 0061
0EC3 0591 0E88 0061
0EC3 1D165 0E88 0061
+0EC3 0001 0E89 0061
+0EC3 0591 0E89 0061
+0EC3 1D165 0E89 0061
0EC3 0001 0EAA 0061
0EC3 0591 0EAA 0061
0EC3 1D165 0EAA 0061
0EC3 0001 0E8A 0061
0EC3 0591 0E8A 0061
0EC3 1D165 0E8A 0061
+0EC3 0001 0E8C 0061
+0EC3 0591 0E8C 0061
+0EC3 1D165 0E8C 0061
+0EC3 0001 0E8E 0061
+0EC3 0591 0E8E 0061
+0EC3 1D165 0E8E 0061
0EC3 0001 0EDF 0061
0EC3 0591 0EDF 0061
0EC3 1D165 0EDF 0061
0EC3 0001 0E8D 0061
0EC3 0591 0E8D 0061
0EC3 1D165 0E8D 0061
+0EC3 0001 0E8F 0061
+0EC3 0591 0E8F 0061
+0EC3 1D165 0E8F 0061
+0EC3 0001 0E90 0061
+0EC3 0591 0E90 0061
+0EC3 1D165 0E90 0061
+0EC3 0001 0E91 0061
+0EC3 0591 0E91 0061
+0EC3 1D165 0E91 0061
+0EC3 0001 0E92 0061
+0EC3 0591 0E92 0061
+0EC3 1D165 0E92 0061
+0EC3 0001 0E93 0061
+0EC3 0591 0E93 0061
+0EC3 1D165 0E93 0061
0EC3 0001 0E94 0061
0EC3 0591 0E94 0061
0EC3 1D165 0E94 0061
@@ -105257,6 +108165,9 @@ A8C4 0062
0EC3 0001 0E97 0061
0EC3 0591 0E97 0061
0EC3 1D165 0E97 0061
+0EC3 0001 0E98 0061
+0EC3 0591 0E98 0061
+0EC3 1D165 0E98 0061
0EC3 0001 0E99 0061
0EC3 0591 0E99 0061
0EC3 1D165 0E99 0061
@@ -105278,6 +108189,9 @@ A8C4 0062
0EC3 0001 0E9F 0061
0EC3 0591 0E9F 0061
0EC3 1D165 0E9F 0061
+0EC3 0001 0EA0 0061
+0EC3 0591 0EA0 0061
+0EC3 1D165 0EA0 0061
0EC3 0001 0EA1 0061
0EC3 0591 0EA1 0061
0EC3 1D165 0EA1 0061
@@ -105293,6 +108207,12 @@ A8C4 0062
0EC3 0001 0EA7 0061
0EC3 0591 0EA7 0061
0EC3 1D165 0EA7 0061
+0EC3 0001 0EA8 0061
+0EC3 0591 0EA8 0061
+0EC3 1D165 0EA8 0061
+0EC3 0001 0EA9 0061
+0EC3 0591 0EA9 0061
+0EC3 1D165 0EA9 0061
0EC3 0001 0EAB 0061
0EC3 0591 0EAB 0061
0EC3 1D165 0EAB 0061
@@ -105302,6 +108222,9 @@ A8C4 0062
0EC3 0001 0EDD 0061
0EC3 0591 0EDD 0061
0EC3 1D165 0EDD 0061
+0EC3 0001 0EAC 0061
+0EC3 0591 0EAC 0061
+0EC3 1D165 0EAC 0061
0EC3 0001 0EAD 0061
0EC3 0591 0EAD 0061
0EC3 1D165 0EAD 0061
@@ -105325,24 +108248,51 @@ A8C4 0062
0EC4 0001 0E84 0061
0EC4 0591 0E84 0061
0EC4 1D165 0E84 0061
+0EC4 0001 0E86 0061
+0EC4 0591 0E86 0061
+0EC4 1D165 0E86 0061
0EC4 0001 0E87 0061
0EC4 0591 0E87 0061
0EC4 1D165 0E87 0061
0EC4 0001 0E88 0061
0EC4 0591 0E88 0061
0EC4 1D165 0E88 0061
+0EC4 0001 0E89 0061
+0EC4 0591 0E89 0061
+0EC4 1D165 0E89 0061
0EC4 0001 0EAA 0061
0EC4 0591 0EAA 0061
0EC4 1D165 0EAA 0061
0EC4 0001 0E8A 0061
0EC4 0591 0E8A 0061
0EC4 1D165 0E8A 0061
+0EC4 0001 0E8C 0061
+0EC4 0591 0E8C 0061
+0EC4 1D165 0E8C 0061
+0EC4 0001 0E8E 0061
+0EC4 0591 0E8E 0061
+0EC4 1D165 0E8E 0061
0EC4 0001 0EDF 0061
0EC4 0591 0EDF 0061
0EC4 1D165 0EDF 0061
0EC4 0001 0E8D 0061
0EC4 0591 0E8D 0061
0EC4 1D165 0E8D 0061
+0EC4 0001 0E8F 0061
+0EC4 0591 0E8F 0061
+0EC4 1D165 0E8F 0061
+0EC4 0001 0E90 0061
+0EC4 0591 0E90 0061
+0EC4 1D165 0E90 0061
+0EC4 0001 0E91 0061
+0EC4 0591 0E91 0061
+0EC4 1D165 0E91 0061
+0EC4 0001 0E92 0061
+0EC4 0591 0E92 0061
+0EC4 1D165 0E92 0061
+0EC4 0001 0E93 0061
+0EC4 0591 0E93 0061
+0EC4 1D165 0E93 0061
0EC4 0001 0E94 0061
0EC4 0591 0E94 0061
0EC4 1D165 0E94 0061
@@ -105355,6 +108305,9 @@ A8C4 0062
0EC4 0001 0E97 0061
0EC4 0591 0E97 0061
0EC4 1D165 0E97 0061
+0EC4 0001 0E98 0061
+0EC4 0591 0E98 0061
+0EC4 1D165 0E98 0061
0EC4 0001 0E99 0061
0EC4 0591 0E99 0061
0EC4 1D165 0E99 0061
@@ -105376,6 +108329,9 @@ A8C4 0062
0EC4 0001 0E9F 0061
0EC4 0591 0E9F 0061
0EC4 1D165 0E9F 0061
+0EC4 0001 0EA0 0061
+0EC4 0591 0EA0 0061
+0EC4 1D165 0EA0 0061
0EC4 0001 0EA1 0061
0EC4 0591 0EA1 0061
0EC4 1D165 0EA1 0061
@@ -105391,6 +108347,12 @@ A8C4 0062
0EC4 0001 0EA7 0061
0EC4 0591 0EA7 0061
0EC4 1D165 0EA7 0061
+0EC4 0001 0EA8 0061
+0EC4 0591 0EA8 0061
+0EC4 1D165 0EA8 0061
+0EC4 0001 0EA9 0061
+0EC4 0591 0EA9 0061
+0EC4 1D165 0EA9 0061
0EC4 0001 0EAB 0061
0EC4 0591 0EAB 0061
0EC4 1D165 0EAB 0061
@@ -105400,6 +108362,9 @@ A8C4 0062
0EC4 0001 0EDD 0061
0EC4 0591 0EDD 0061
0EC4 1D165 0EDD 0061
+0EC4 0001 0EAC 0061
+0EC4 0591 0EAC 0061
+0EC4 1D165 0EAC 0061
0EC4 0001 0EAD 0061
0EC4 0591 0EAD 0061
0EC4 1D165 0EAD 0061
@@ -109228,6 +112193,18 @@ AADC 0062
11A82 0061
11A82 0041
11A82 0062
+11A84 0021
+11A84 003F
+11A84 0334
+11A84 0061
+11A84 0041
+11A84 0062
+11A85 0021
+11A85 003F
+11A85 0334
+11A85 0061
+11A85 0041
+11A85 0062
11A99 0021
11A99 003F
0334 11A99
@@ -131656,6 +134633,12 @@ A6EF 0062
1E921 0041
1E943 0062
1E921 0062
+1E94B 0021
+1E94B 003F
+1E94B 0334
+1E94B 0061
+1E94B 0041
+1E94B 0062
1100 0021
1100 003F
3200 0021
@@ -136644,54 +139627,82 @@ FF9C 0062
3357 0061
3357 0041
3357 0062
+1B150 0021
+1B150 003F
3090 0021
3090 003F
+1B164 0021
+1B164 003F
30F0 0021
30F0 003F
32FC 0021
32FC 003F
30F8 0021
30F8 003F
+1B150 0334
+1B164 0334
30F0 0334 3099
30F0 3099 0334
30F8 0334
+1B150 0061
+1B150 0041
3090 0061
3090 0041
+1B164 0061
+1B164 0041
30F0 0061
30F0 0041
32FC 0061
32FC 0041
30F8 0061
30F8 0041
+1B150 0062
3090 0062
+1B164 0062
30F0 0062
32FC 0062
30F8 0062
+1B151 0021
+1B151 003F
3091 0021
3091 003F
+1B165 0021
+1B165 003F
30F1 0021
30F1 003F
32FD 0021
32FD 003F
30F9 0021
30F9 003F
+1B151 0334
+1B165 0334
30F1 0334 3099
30F1 3099 0334
30F9 0334
+1B151 0061
+1B151 0041
3091 0061
3091 0041
+1B165 0061
+1B165 0041
30F1 0061
30F1 0041
32FD 0061
32FD 0041
30F9 0061
30F9 0041
+1B151 0062
3091 0062
+1B165 0062
30F1 0062
32FD 0062
30F9 0062
+1B152 0021
+1B152 003F
3092 0021
3092 003F
+1B166 0021
+1B166 003F
30F2 0021
30F2 003F
FF66 0021
@@ -136700,11 +139711,17 @@ FF66 003F
32FE 003F
30FA 0021
30FA 003F
+1B152 0334
+1B166 0334
30F2 0334 3099
30F2 3099 0334
30FA 0334
+1B152 0061
+1B152 0041
3092 0061
3092 0041
+1B166 0061
+1B166 0041
30F2 0061
30F2 0041
FF66 0061
@@ -136713,24 +139730,32 @@ FF66 0041
32FE 0041
30FA 0061
30FA 0041
+1B152 0062
3092 0062
+1B166 0062
30F2 0062
FF66 0062
32FE 0062
30FA 0062
3093 0021
3093 003F
+1B167 0021
+1B167 003F
30F3 0021
30F3 003F
FF9D 0021
FF9D 003F
+1B167 0334
3093 0061
3093 0041
+1B167 0061
+1B167 0041
30F3 0061
30F3 0041
FF9D 0061
FF9D 0041
3093 0062
+1B167 0062
30F3 0062
FF9D 0062
1B002 0021
@@ -144878,6 +147903,12 @@ A4F7 0062
16F03 0061
16F03 0041
16F03 0062
+16F45 0021
+16F45 003F
+16F45 0334
+16F45 0061
+16F45 0041
+16F45 0062
16F04 0021
16F04 003F
16F06 0021
@@ -144938,6 +147969,12 @@ A4F7 0062
16F0D 0061
16F0D 0041
16F0D 0062
+16F48 0021
+16F48 003F
+16F48 0334
+16F48 0061
+16F48 0041
+16F48 0062
16F0E 0021
16F0E 003F
16F0E 0334
@@ -144950,6 +147987,12 @@ A4F7 0062
16F0F 0061
16F0F 0041
16F0F 0062
+16F4A 0021
+16F4A 003F
+16F4A 0334
+16F4A 0061
+16F4A 0041
+16F4A 0062
16F10 0021
16F10 003F
16F13 0021
@@ -145160,12 +148203,24 @@ A4F7 0062
16F32 0061
16F32 0041
16F32 0062
+16F47 0021
+16F47 003F
+16F47 0334
+16F47 0061
+16F47 0041
+16F47 0062
16F33 0021
16F33 003F
16F33 0334
16F33 0061
16F33 0041
16F33 0062
+16F46 0021
+16F46 003F
+16F46 0334
+16F46 0061
+16F46 0041
+16F46 0062
16F34 0021
16F34 003F
16F34 0334
@@ -145202,6 +148257,12 @@ A4F7 0062
16F39 0061
16F39 0041
16F39 0062
+16F49 0021
+16F49 003F
+16F49 0334
+16F49 0061
+16F49 0041
+16F49 0062
16F3A 0021
16F3A 003F
16F3A 0334
@@ -145292,6 +148353,12 @@ A4F7 0062
16F53 0061
16F53 0041
16F53 0062
+16F4F 0021
+16F4F 003F
+16F4F 0334
+16F4F 0061
+16F4F 0041
+16F4F 0062
16F54 0021
16F54 003F
16F54 0334
@@ -145322,6 +148389,12 @@ A4F7 0062
16F58 0061
16F58 0041
16F58 0062
+16F81 0021
+16F81 003F
+16F81 0334
+16F81 0061
+16F81 0041
+16F81 0062
16F59 0021
16F59 003F
16F59 0334
@@ -145346,6 +148419,12 @@ A4F7 0062
16F5C 0061
16F5C 0041
16F5C 0062
+16F83 0021
+16F83 003F
+16F83 0334
+16F83 0061
+16F83 0041
+16F83 0062
16F5D 0021
16F5D 003F
16F5D 0334
@@ -145370,6 +148449,12 @@ A4F7 0062
16F60 0061
16F60 0041
16F60 0062
+16F84 0021
+16F84 003F
+16F84 0334
+16F84 0061
+16F84 0041
+16F84 0062
16F61 0021
16F61 003F
16F61 0334
@@ -145400,6 +148485,12 @@ A4F7 0062
16F65 0061
16F65 0041
16F65 0062
+16F86 0021
+16F86 003F
+16F86 0334
+16F86 0061
+16F86 0041
+16F86 0062
16F66 0021
16F66 003F
16F66 0334
@@ -145448,6 +148539,18 @@ A4F7 0062
16F6D 0061
16F6D 0041
16F6D 0062
+16F7F 0021
+16F7F 003F
+16F7F 0334
+16F7F 0061
+16F7F 0041
+16F7F 0062
+16F87 0021
+16F87 003F
+16F87 0334
+16F87 0061
+16F87 0041
+16F87 0062
16F6E 0021
16F6E 003F
16F6E 0334
@@ -145478,6 +148581,12 @@ A4F7 0062
16F72 0061
16F72 0041
16F72 0062
+16F80 0021
+16F80 003F
+16F80 0334
+16F80 0061
+16F80 0041
+16F80 0062
16F73 0021
16F73 003F
16F73 0334
@@ -145490,6 +148599,18 @@ A4F7 0062
16F74 0061
16F74 0041
16F74 0062
+16F85 0021
+16F85 003F
+16F85 0334
+16F85 0061
+16F85 0041
+16F85 0062
+16F82 0021
+16F82 003F
+16F82 0334
+16F82 0061
+16F82 0041
+16F82 0062
16F75 0021
16F75 003F
16F75 0334
@@ -146924,6 +150045,576 @@ A4F7 0062
16B8F 0061
16B8F 0041
16B8F 0062
+1E100 0021
+1E100 003F
+1E100 0334
+1E100 0061
+1E100 0041
+1E100 0062
+1E101 0021
+1E101 003F
+1E101 0334
+1E101 0061
+1E101 0041
+1E101 0062
+1E102 0021
+1E102 003F
+1E102 0334
+1E102 0061
+1E102 0041
+1E102 0062
+1E103 0021
+1E103 003F
+1E103 0334
+1E103 0061
+1E103 0041
+1E103 0062
+1E104 0021
+1E104 003F
+1E104 0334
+1E104 0061
+1E104 0041
+1E104 0062
+1E105 0021
+1E105 003F
+1E105 0334
+1E105 0061
+1E105 0041
+1E105 0062
+1E106 0021
+1E106 003F
+1E106 0334
+1E106 0061
+1E106 0041
+1E106 0062
+1E107 0021
+1E107 003F
+1E107 0334
+1E107 0061
+1E107 0041
+1E107 0062
+1E108 0021
+1E108 003F
+1E108 0334
+1E108 0061
+1E108 0041
+1E108 0062
+1E109 0021
+1E109 003F
+1E109 0334
+1E109 0061
+1E109 0041
+1E109 0062
+1E10A 0021
+1E10A 003F
+1E10A 0334
+1E10A 0061
+1E10A 0041
+1E10A 0062
+1E10B 0021
+1E10B 003F
+1E10B 0334
+1E10B 0061
+1E10B 0041
+1E10B 0062
+1E10C 0021
+1E10C 003F
+1E10C 0334
+1E10C 0061
+1E10C 0041
+1E10C 0062
+1E10D 0021
+1E10D 003F
+1E10D 0334
+1E10D 0061
+1E10D 0041
+1E10D 0062
+1E10E 0021
+1E10E 003F
+1E10E 0334
+1E10E 0061
+1E10E 0041
+1E10E 0062
+1E10F 0021
+1E10F 003F
+1E10F 0334
+1E10F 0061
+1E10F 0041
+1E10F 0062
+1E110 0021
+1E110 003F
+1E110 0334
+1E110 0061
+1E110 0041
+1E110 0062
+1E111 0021
+1E111 003F
+1E111 0334
+1E111 0061
+1E111 0041
+1E111 0062
+1E112 0021
+1E112 003F
+1E112 0334
+1E112 0061
+1E112 0041
+1E112 0062
+1E113 0021
+1E113 003F
+1E113 0334
+1E113 0061
+1E113 0041
+1E113 0062
+1E114 0021
+1E114 003F
+1E114 0334
+1E114 0061
+1E114 0041
+1E114 0062
+1E115 0021
+1E115 003F
+1E115 0334
+1E115 0061
+1E115 0041
+1E115 0062
+1E116 0021
+1E116 003F
+1E116 0334
+1E116 0061
+1E116 0041
+1E116 0062
+1E117 0021
+1E117 003F
+1E117 0334
+1E117 0061
+1E117 0041
+1E117 0062
+1E118 0021
+1E118 003F
+1E118 0334
+1E118 0061
+1E118 0041
+1E118 0062
+1E119 0021
+1E119 003F
+1E119 0334
+1E119 0061
+1E119 0041
+1E119 0062
+1E11A 0021
+1E11A 003F
+1E11A 0334
+1E11A 0061
+1E11A 0041
+1E11A 0062
+1E11B 0021
+1E11B 003F
+1E11B 0334
+1E11B 0061
+1E11B 0041
+1E11B 0062
+1E11C 0021
+1E11C 003F
+1E11C 0334
+1E11C 0061
+1E11C 0041
+1E11C 0062
+1E11D 0021
+1E11D 003F
+1E11D 0334
+1E11D 0061
+1E11D 0041
+1E11D 0062
+1E11E 0021
+1E11E 003F
+1E11E 0334
+1E11E 0061
+1E11E 0041
+1E11E 0062
+1E11F 0021
+1E11F 003F
+1E11F 0334
+1E11F 0061
+1E11F 0041
+1E11F 0062
+1E120 0021
+1E120 003F
+1E120 0334
+1E120 0061
+1E120 0041
+1E120 0062
+1E121 0021
+1E121 003F
+1E121 0334
+1E121 0061
+1E121 0041
+1E121 0062
+1E122 0021
+1E122 003F
+1E122 0334
+1E122 0061
+1E122 0041
+1E122 0062
+1E123 0021
+1E123 003F
+1E123 0334
+1E123 0061
+1E123 0041
+1E123 0062
+1E124 0021
+1E124 003F
+1E124 0334
+1E124 0061
+1E124 0041
+1E124 0062
+1E125 0021
+1E125 003F
+1E125 0334
+1E125 0061
+1E125 0041
+1E125 0062
+1E126 0021
+1E126 003F
+1E126 0334
+1E126 0061
+1E126 0041
+1E126 0062
+1E127 0021
+1E127 003F
+1E127 0334
+1E127 0061
+1E127 0041
+1E127 0062
+1E128 0021
+1E128 003F
+1E128 0334
+1E128 0061
+1E128 0041
+1E128 0062
+1E129 0021
+1E129 003F
+1E129 0334
+1E129 0061
+1E129 0041
+1E129 0062
+1E12A 0021
+1E12A 003F
+1E12A 0334
+1E12A 0061
+1E12A 0041
+1E12A 0062
+1E12B 0021
+1E12B 003F
+1E12B 0334
+1E12B 0061
+1E12B 0041
+1E12B 0062
+1E12C 0021
+1E12C 003F
+1E12C 0334
+1E12C 0061
+1E12C 0041
+1E12C 0062
+1E137 0021
+1E137 003F
+1E137 0334
+1E137 0061
+1E137 0041
+1E137 0062
+1E138 0021
+1E138 003F
+1E138 0334
+1E138 0061
+1E138 0041
+1E138 0062
+1E139 0021
+1E139 003F
+1E139 0334
+1E139 0061
+1E139 0041
+1E139 0062
+1E13A 0021
+1E13A 003F
+1E13A 0334
+1E13A 0061
+1E13A 0041
+1E13A 0062
+1E13B 0021
+1E13B 003F
+1E13B 0334
+1E13B 0061
+1E13B 0041
+1E13B 0062
+1E14E 0021
+1E14E 003F
+1E14E 0334
+1E14E 0061
+1E14E 0041
+1E14E 0062
+1E2C0 0021
+1E2C0 003F
+1E2C0 0334
+1E2C0 0061
+1E2C0 0041
+1E2C0 0062
+1E2C1 0021
+1E2C1 003F
+1E2C1 0334
+1E2C1 0061
+1E2C1 0041
+1E2C1 0062
+1E2C2 0021
+1E2C2 003F
+1E2C2 0334
+1E2C2 0061
+1E2C2 0041
+1E2C2 0062
+1E2C3 0021
+1E2C3 003F
+1E2C3 0334
+1E2C3 0061
+1E2C3 0041
+1E2C3 0062
+1E2C4 0021
+1E2C4 003F
+1E2C4 0334
+1E2C4 0061
+1E2C4 0041
+1E2C4 0062
+1E2C5 0021
+1E2C5 003F
+1E2C5 0334
+1E2C5 0061
+1E2C5 0041
+1E2C5 0062
+1E2C6 0021
+1E2C6 003F
+1E2C6 0334
+1E2C6 0061
+1E2C6 0041
+1E2C6 0062
+1E2C7 0021
+1E2C7 003F
+1E2C7 0334
+1E2C7 0061
+1E2C7 0041
+1E2C7 0062
+1E2C8 0021
+1E2C8 003F
+1E2C8 0334
+1E2C8 0061
+1E2C8 0041
+1E2C8 0062
+1E2C9 0021
+1E2C9 003F
+1E2C9 0334
+1E2C9 0061
+1E2C9 0041
+1E2C9 0062
+1E2CA 0021
+1E2CA 003F
+1E2CA 0334
+1E2CA 0061
+1E2CA 0041
+1E2CA 0062
+1E2CB 0021
+1E2CB 003F
+1E2CB 0334
+1E2CB 0061
+1E2CB 0041
+1E2CB 0062
+1E2CC 0021
+1E2CC 003F
+1E2CC 0334
+1E2CC 0061
+1E2CC 0041
+1E2CC 0062
+1E2CD 0021
+1E2CD 003F
+1E2CD 0334
+1E2CD 0061
+1E2CD 0041
+1E2CD 0062
+1E2CE 0021
+1E2CE 003F
+1E2CE 0334
+1E2CE 0061
+1E2CE 0041
+1E2CE 0062
+1E2CF 0021
+1E2CF 003F
+1E2CF 0334
+1E2CF 0061
+1E2CF 0041
+1E2CF 0062
+1E2D0 0021
+1E2D0 003F
+1E2D0 0334
+1E2D0 0061
+1E2D0 0041
+1E2D0 0062
+1E2D1 0021
+1E2D1 003F
+1E2D1 0334
+1E2D1 0061
+1E2D1 0041
+1E2D1 0062
+1E2D2 0021
+1E2D2 003F
+1E2D2 0334
+1E2D2 0061
+1E2D2 0041
+1E2D2 0062
+1E2D3 0021
+1E2D3 003F
+1E2D3 0334
+1E2D3 0061
+1E2D3 0041
+1E2D3 0062
+1E2D4 0021
+1E2D4 003F
+1E2D4 0334
+1E2D4 0061
+1E2D4 0041
+1E2D4 0062
+1E2D5 0021
+1E2D5 003F
+1E2D5 0334
+1E2D5 0061
+1E2D5 0041
+1E2D5 0062
+1E2D6 0021
+1E2D6 003F
+1E2D6 0334
+1E2D6 0061
+1E2D6 0041
+1E2D6 0062
+1E2D7 0021
+1E2D7 003F
+1E2D7 0334
+1E2D7 0061
+1E2D7 0041
+1E2D7 0062
+1E2D8 0021
+1E2D8 003F
+1E2D8 0334
+1E2D8 0061
+1E2D8 0041
+1E2D8 0062
+1E2D9 0021
+1E2D9 003F
+1E2D9 0334
+1E2D9 0061
+1E2D9 0041
+1E2D9 0062
+1E2DA 0021
+1E2DA 003F
+1E2DA 0334
+1E2DA 0061
+1E2DA 0041
+1E2DA 0062
+1E2DB 0021
+1E2DB 003F
+1E2DB 0334
+1E2DB 0061
+1E2DB 0041
+1E2DB 0062
+1E2DC 0021
+1E2DC 003F
+1E2DC 0334
+1E2DC 0061
+1E2DC 0041
+1E2DC 0062
+1E2DD 0021
+1E2DD 003F
+1E2DD 0334
+1E2DD 0061
+1E2DD 0041
+1E2DD 0062
+1E2DE 0021
+1E2DE 003F
+1E2DE 0334
+1E2DE 0061
+1E2DE 0041
+1E2DE 0062
+1E2DF 0021
+1E2DF 003F
+1E2DF 0334
+1E2DF 0061
+1E2DF 0041
+1E2DF 0062
+1E2E0 0021
+1E2E0 003F
+1E2E0 0334
+1E2E0 0061
+1E2E0 0041
+1E2E0 0062
+1E2E1 0021
+1E2E1 003F
+1E2E1 0334
+1E2E1 0061
+1E2E1 0041
+1E2E1 0062
+1E2E2 0021
+1E2E2 003F
+1E2E2 0334
+1E2E2 0061
+1E2E2 0041
+1E2E2 0062
+1E2E3 0021
+1E2E3 003F
+1E2E3 0334
+1E2E3 0061
+1E2E3 0041
+1E2E3 0062
+1E2E4 0021
+1E2E4 003F
+1E2E4 0334
+1E2E4 0061
+1E2E4 0041
+1E2E4 0062
+1E2E5 0021
+1E2E5 003F
+1E2E5 0334
+1E2E5 0061
+1E2E5 0041
+1E2E5 0062
+1E2E6 0021
+1E2E6 003F
+1E2E6 0334
+1E2E6 0061
+1E2E6 0041
+1E2E6 0062
+1E2E7 0021
+1E2E7 003F
+1E2E7 0334
+1E2E7 0061
+1E2E7 0041
+1E2E7 0062
+1E2E8 0021
+1E2E8 003F
+1E2E8 0334
+1E2E8 0061
+1E2E8 0041
+1E2E8 0062
+1E2E9 0021
+1E2E9 003F
+1E2E9 0334
+1E2E9 0061
+1E2E9 0041
+1E2E9 0062
+1E2EA 0021
+1E2EA 003F
+1E2EA 0334
+1E2EA 0061
+1E2EA 0041
+1E2EA 0062
+1E2EB 0021
+1E2EB 003F
+1E2EB 0334
+1E2EB 0061
+1E2EB 0041
+1E2EB 0062
10280 0021
10280 003F
10280 0334
@@ -155840,6 +159531,144 @@ A4F7 0062
10B91 0061
10B91 0041
10B91 0062
+10FE0 0021
+10FE0 003F
+10FE0 0334
+10FE0 0061
+10FE0 0041
+10FE0 0062
+10FE1 0021
+10FE1 003F
+10FE1 0334
+10FE1 0061
+10FE1 0041
+10FE1 0062
+10FE2 0021
+10FE2 003F
+10FE2 0334
+10FE2 0061
+10FE2 0041
+10FE2 0062
+10FE3 0021
+10FE3 003F
+10FE3 0334
+10FE3 0061
+10FE3 0041
+10FE3 0062
+10FE4 0021
+10FE4 003F
+10FE4 0334
+10FE4 0061
+10FE4 0041
+10FE4 0062
+10FE5 0021
+10FE5 003F
+10FE5 0334
+10FE5 0061
+10FE5 0041
+10FE5 0062
+10FE6 0021
+10FE6 003F
+10FE6 0334
+10FE6 0061
+10FE6 0041
+10FE6 0062
+10FF6 0021
+10FF6 003F
+10FF6 0334
+10FF6 0061
+10FF6 0041
+10FF6 0062
+10FE7 0021
+10FE7 003F
+10FE7 0334
+10FE7 0061
+10FE7 0041
+10FE7 0062
+10FE8 0021
+10FE8 003F
+10FE8 0334
+10FE8 0061
+10FE8 0041
+10FE8 0062
+10FE9 0021
+10FE9 003F
+10FE9 0334
+10FE9 0061
+10FE9 0041
+10FE9 0062
+10FEA 0021
+10FEA 003F
+10FEA 0334
+10FEA 0061
+10FEA 0041
+10FEA 0062
+10FEB 0021
+10FEB 003F
+10FEB 0334
+10FEB 0061
+10FEB 0041
+10FEB 0062
+10FEC 0021
+10FEC 003F
+10FEC 0334
+10FEC 0061
+10FEC 0041
+10FEC 0062
+10FED 0021
+10FED 003F
+10FED 0334
+10FED 0061
+10FED 0041
+10FED 0062
+10FEE 0021
+10FEE 003F
+10FEE 0334
+10FEE 0061
+10FEE 0041
+10FEE 0062
+10FEF 0021
+10FEF 003F
+10FEF 0334
+10FEF 0061
+10FEF 0041
+10FEF 0062
+10FF0 0021
+10FF0 003F
+10FF0 0334
+10FF0 0061
+10FF0 0041
+10FF0 0062
+10FF1 0021
+10FF1 003F
+10FF1 0334
+10FF1 0061
+10FF1 0041
+10FF1 0062
+10FF2 0021
+10FF2 003F
+10FF2 0334
+10FF2 0061
+10FF2 0041
+10FF2 0062
+10FF3 0021
+10FF3 003F
+10FF3 0334
+10FF3 0061
+10FF3 0041
+10FF3 0062
+10FF4 0021
+10FF4 003F
+10FF4 0334
+10FF4 0061
+10FF4 0041
+10FF4 0062
+10FF5 0021
+10FF5 003F
+10FF5 0334
+10FF5 0061
+10FF5 0041
+10FF5 0062
10AC0 0021
10AC0 003F
10AC0 0334
@@ -174217,6 +178046,11 @@ F9A8 003F
F9A8 0061
F9A8 0041
F9A8 0062
+32FF 0021
+32FF 003F
+32FF 0061
+32FF 0041
+32FF 0062
323D 0021
323D 003F
32AD 0021
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/GraphemeBreakTest.txt b/Build/source/libs/icu/icu-src/source/test/testdata/GraphemeBreakTest.txt
index 6847953c237..6f8ca3ab129 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/GraphemeBreakTest.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/GraphemeBreakTest.txt
@@ -1,6 +1,6 @@
-# GraphemeBreakTest-11.0.0.txt
-# Date: 2018-03-18, 13:30:33 GMT
-# © 2018 Unicode®, Inc.
+# GraphemeBreakTest-12.0.0.txt
+# Date: 2019-02-21, 07:57:26 GMT
+# © 2019 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@@ -48,16 +48,18 @@
÷ 0020 × 0308 ÷ AC00 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
÷ 0020 ÷ AC01 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
÷ 0020 × 0308 ÷ AC01 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 0020 ÷ 0915 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 0020 × 0308 ÷ 0915 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
÷ 0020 ÷ 231A ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 0020 × 0308 ÷ 231A ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 0020 × 0300 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
÷ 0020 × 0308 × 0300 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 0020 × 094D ÷ # ÷ [0.2] SPACE (Other) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 0020 × 0308 × 094D ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
÷ 0020 × 200D ÷ # ÷ [0.2] SPACE (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 0020 × 0308 × 200D ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 0020 ÷ 0378 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
÷ 0020 × 0308 ÷ 0378 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
-÷ 0020 ÷ D800 ÷ # ÷ [0.2] SPACE (Other) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ 0020 × 0308 ÷ D800 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
÷ 000D ÷ 0020 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] SPACE (Other) ÷ [0.3]
÷ 000D ÷ 0308 ÷ 0020 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 000D ÷ 000D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -84,16 +86,18 @@
÷ 000D ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
÷ 000D ÷ AC01 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
÷ 000D ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 000D ÷ 0915 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 000D ÷ 0308 ÷ 0915 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
÷ 000D ÷ 231A ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] WATCH (ExtPict) ÷ [0.3]
÷ 000D ÷ 0308 ÷ 231A ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 000D ÷ 0300 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
÷ 000D ÷ 0308 × 0300 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 000D ÷ 094D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 000D ÷ 0308 × 094D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
÷ 000D ÷ 200D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 000D ÷ 0308 × 200D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 000D ÷ 0378 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] <reserved-0378> (Other) ÷ [0.3]
÷ 000D ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
-÷ 000D ÷ D800 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ 000D ÷ 0308 ÷ D800 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
÷ 000A ÷ 0020 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] SPACE (Other) ÷ [0.3]
÷ 000A ÷ 0308 ÷ 0020 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 000A ÷ 000D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -120,16 +124,18 @@
÷ 000A ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
÷ 000A ÷ AC01 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
÷ 000A ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 000A ÷ 0915 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 000A ÷ 0308 ÷ 0915 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
÷ 000A ÷ 231A ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] WATCH (ExtPict) ÷ [0.3]
÷ 000A ÷ 0308 ÷ 231A ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 000A ÷ 0300 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
÷ 000A ÷ 0308 × 0300 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 000A ÷ 094D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 000A ÷ 0308 × 094D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
÷ 000A ÷ 200D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 000A ÷ 0308 × 200D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 000A ÷ 0378 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <reserved-0378> (Other) ÷ [0.3]
÷ 000A ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
-÷ 000A ÷ D800 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ 000A ÷ 0308 ÷ D800 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
÷ 0001 ÷ 0020 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] SPACE (Other) ÷ [0.3]
÷ 0001 ÷ 0308 ÷ 0020 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 0001 ÷ 000D ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -156,16 +162,18 @@
÷ 0001 ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
÷ 0001 ÷ AC01 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
÷ 0001 ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 0001 ÷ 0915 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 0001 ÷ 0308 ÷ 0915 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
÷ 0001 ÷ 231A ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] WATCH (ExtPict) ÷ [0.3]
÷ 0001 ÷ 0308 ÷ 231A ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 0001 ÷ 0300 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
÷ 0001 ÷ 0308 × 0300 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 0001 ÷ 094D ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 0001 ÷ 0308 × 094D ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
÷ 0001 ÷ 200D ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 0001 ÷ 0308 × 200D ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 0001 ÷ 0378 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] <reserved-0378> (Other) ÷ [0.3]
÷ 0001 ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
-÷ 0001 ÷ D800 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ 0001 ÷ 0308 ÷ D800 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
÷ 034F ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 034F × 0308 ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 034F ÷ 000D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -192,16 +200,18 @@
÷ 034F × 0308 ÷ AC00 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
÷ 034F ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
÷ 034F × 0308 ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 034F ÷ 0915 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 034F × 0308 ÷ 0915 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
÷ 034F ÷ 231A ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 034F × 0308 ÷ 231A ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 034F × 0300 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
÷ 034F × 0308 × 0300 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 034F × 094D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 034F × 0308 × 094D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
÷ 034F × 200D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 034F × 0308 × 200D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 034F ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
÷ 034F × 0308 ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
-÷ 034F ÷ D800 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ 034F × 0308 ÷ D800 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
÷ 1F1E6 ÷ 0020 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 1F1E6 × 0308 ÷ 0020 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 1F1E6 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -228,16 +238,18 @@
÷ 1F1E6 × 0308 ÷ AC00 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
÷ 1F1E6 ÷ AC01 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
÷ 1F1E6 × 0308 ÷ AC01 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 1F1E6 ÷ 0915 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 0915 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
÷ 1F1E6 ÷ 231A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 1F1E6 × 0308 ÷ 231A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 1F1E6 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
÷ 1F1E6 × 0308 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 1F1E6 × 094D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 1F1E6 × 0308 × 094D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
÷ 1F1E6 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 1F1E6 × 0308 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 1F1E6 ÷ 0378 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
÷ 1F1E6 × 0308 ÷ 0378 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
-÷ 1F1E6 ÷ D800 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ D800 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
÷ 0600 × 0020 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] SPACE (Other) ÷ [0.3]
÷ 0600 × 0308 ÷ 0020 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 0600 ÷ 000D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -264,16 +276,18 @@
÷ 0600 × 0308 ÷ AC00 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
÷ 0600 × AC01 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
÷ 0600 × 0308 ÷ AC01 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 0600 × 0915 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 0600 × 0308 ÷ 0915 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
÷ 0600 × 231A ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] WATCH (ExtPict) ÷ [0.3]
÷ 0600 × 0308 ÷ 231A ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 0600 × 0300 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
÷ 0600 × 0308 × 0300 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 0600 × 094D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 0600 × 0308 × 094D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
÷ 0600 × 200D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 0600 × 0308 × 200D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 0600 × 0378 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] <reserved-0378> (Other) ÷ [0.3]
÷ 0600 × 0308 ÷ 0378 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
-÷ 0600 ÷ D800 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ 0600 × 0308 ÷ D800 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
÷ 0903 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 0903 × 0308 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 0903 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -300,16 +314,18 @@
÷ 0903 × 0308 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
÷ 0903 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
÷ 0903 × 0308 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 0903 ÷ 0915 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 0903 × 0308 ÷ 0915 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
÷ 0903 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 0903 × 0308 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 0903 × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
÷ 0903 × 0308 × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 0903 × 094D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 0903 × 0308 × 094D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
÷ 0903 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 0903 × 0308 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 0903 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
÷ 0903 × 0308 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
-÷ 0903 ÷ D800 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ 0903 × 0308 ÷ D800 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
÷ 1100 ÷ 0020 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 1100 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 1100 ÷ 000D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -336,16 +352,18 @@
÷ 1100 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
÷ 1100 × AC01 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
÷ 1100 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 1100 ÷ 0915 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 1100 × 0308 ÷ 0915 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
÷ 1100 ÷ 231A ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 1100 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 1100 × 0300 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
÷ 1100 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 1100 × 094D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 1100 × 0308 × 094D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
÷ 1100 × 200D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 1100 × 0308 × 200D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 1100 ÷ 0378 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
÷ 1100 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
-÷ 1100 ÷ D800 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ 1100 × 0308 ÷ D800 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
÷ 1160 ÷ 0020 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 1160 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 1160 ÷ 000D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -372,16 +390,18 @@
÷ 1160 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
÷ 1160 ÷ AC01 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
÷ 1160 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 1160 ÷ 0915 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 1160 × 0308 ÷ 0915 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
÷ 1160 ÷ 231A ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 1160 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 1160 × 0300 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
÷ 1160 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 1160 × 094D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 1160 × 0308 × 094D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
÷ 1160 × 200D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 1160 × 0308 × 200D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 1160 ÷ 0378 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
÷ 1160 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
-÷ 1160 ÷ D800 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ 1160 × 0308 ÷ D800 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
÷ 11A8 ÷ 0020 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 11A8 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 11A8 ÷ 000D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -408,16 +428,18 @@
÷ 11A8 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
÷ 11A8 ÷ AC01 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
÷ 11A8 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 11A8 ÷ 0915 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 11A8 × 0308 ÷ 0915 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
÷ 11A8 ÷ 231A ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 11A8 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 11A8 × 0300 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
÷ 11A8 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 11A8 × 094D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 11A8 × 0308 × 094D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
÷ 11A8 × 200D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 11A8 × 0308 × 200D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 11A8 ÷ 0378 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
÷ 11A8 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
-÷ 11A8 ÷ D800 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ 11A8 × 0308 ÷ D800 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
÷ AC00 ÷ 0020 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ AC00 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ AC00 ÷ 000D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -444,16 +466,18 @@
÷ AC00 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
÷ AC00 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
÷ AC00 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ AC00 ÷ 0915 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ AC00 × 0308 ÷ 0915 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
÷ AC00 ÷ 231A ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ AC00 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ AC00 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
÷ AC00 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ AC00 × 094D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ AC00 × 0308 × 094D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
÷ AC00 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ AC00 × 0308 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ AC00 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
÷ AC00 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
-÷ AC00 ÷ D800 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ AC00 × 0308 ÷ D800 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
÷ AC01 ÷ 0020 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ AC01 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ AC01 ÷ 000D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -480,16 +504,56 @@
÷ AC01 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
÷ AC01 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
÷ AC01 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ AC01 ÷ 0915 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ AC01 × 0308 ÷ 0915 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
÷ AC01 ÷ 231A ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ AC01 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ AC01 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
÷ AC01 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ AC01 × 094D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ AC01 × 0308 × 094D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
÷ AC01 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ AC01 × 0308 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ AC01 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
÷ AC01 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
-÷ AC01 ÷ D800 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ AC01 × 0308 ÷ D800 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
+÷ 0915 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ 0915 × 0308 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ 0915 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0915 × 0308 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0915 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0915 × 0308 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0915 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3]
+÷ 0915 × 0308 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3]
+÷ 0915 × 034F ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3]
+÷ 0915 × 0308 × 034F ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3]
+÷ 0915 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 0915 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 0915 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3]
+÷ 0915 × 0308 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3]
+÷ 0915 × 0903 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ 0915 × 0308 × 0903 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ 0915 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 0915 × 0308 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 0915 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 0915 × 0308 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 0915 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 0915 × 0308 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 0915 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ 0915 × 0308 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ 0915 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 0915 × 0308 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 0915 ÷ 0915 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 0915 × 0308 ÷ 0915 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 0915 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
+÷ 0915 × 0308 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
+÷ 0915 × 0300 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 0915 × 0308 × 0300 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 0915 × 094D ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 0915 × 0308 × 094D ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 0915 × 200D ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
+÷ 0915 × 0308 × 200D ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
+÷ 0915 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
+÷ 0915 × 0308 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
÷ 231A ÷ 0020 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 231A × 0308 ÷ 0020 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 231A ÷ 000D ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -516,16 +580,18 @@
÷ 231A × 0308 ÷ AC00 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
÷ 231A ÷ AC01 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
÷ 231A × 0308 ÷ AC01 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 231A ÷ 0915 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 231A × 0308 ÷ 0915 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
÷ 231A ÷ 231A ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 231A × 0308 ÷ 231A ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 231A × 0300 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
÷ 231A × 0308 × 0300 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 231A × 094D ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 231A × 0308 × 094D ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
÷ 231A × 200D ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 231A × 0308 × 200D ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 231A ÷ 0378 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
÷ 231A × 0308 ÷ 0378 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
-÷ 231A ÷ D800 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ 231A × 0308 ÷ D800 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
÷ 0300 ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 0300 × 0308 ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 0300 ÷ 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -552,16 +618,56 @@
÷ 0300 × 0308 ÷ AC00 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
÷ 0300 ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
÷ 0300 × 0308 ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 0300 ÷ 0915 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 0300 × 0308 ÷ 0915 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
÷ 0300 ÷ 231A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 0300 × 0308 ÷ 231A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 0300 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
÷ 0300 × 0308 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 0300 × 094D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 0300 × 0308 × 094D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
÷ 0300 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 0300 × 0308 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 0300 ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
÷ 0300 × 0308 ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
-÷ 0300 ÷ D800 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ 0300 × 0308 ÷ D800 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
+÷ 094D ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ 094D × 0308 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ 094D ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 094D × 0308 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 094D ÷ 000A ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 094D × 0308 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 094D ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3]
+÷ 094D × 0308 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3]
+÷ 094D × 034F ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3]
+÷ 094D × 0308 × 034F ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3]
+÷ 094D ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 094D × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 094D ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3]
+÷ 094D × 0308 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3]
+÷ 094D × 0903 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ 094D × 0308 × 0903 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ 094D ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 094D × 0308 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 094D ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 094D × 0308 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 094D ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 094D × 0308 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 094D ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ 094D × 0308 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ 094D ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 094D × 0308 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 094D ÷ 0915 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 094D × 0308 ÷ 0915 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 094D ÷ 231A ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
+÷ 094D × 0308 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
+÷ 094D × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 094D × 0308 × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 094D × 094D ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 094D × 0308 × 094D ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 094D × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
+÷ 094D × 0308 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
+÷ 094D ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
+÷ 094D × 0308 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
÷ 200D ÷ 0020 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 200D × 0308 ÷ 0020 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 200D ÷ 000D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -588,16 +694,18 @@
÷ 200D × 0308 ÷ AC00 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
÷ 200D ÷ AC01 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
÷ 200D × 0308 ÷ AC01 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 200D ÷ 0915 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 200D × 0308 ÷ 0915 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
÷ 200D ÷ 231A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 200D × 0308 ÷ 231A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 200D × 0300 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
÷ 200D × 0308 × 0300 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 200D × 094D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 200D × 0308 × 094D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
÷ 200D × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 200D × 0308 × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 200D ÷ 0378 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
÷ 200D × 0308 ÷ 0378 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
-÷ 200D ÷ D800 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ 200D × 0308 ÷ D800 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
÷ 0378 ÷ 0020 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 0378 × 0308 ÷ 0020 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
÷ 0378 ÷ 000D ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -624,52 +732,18 @@
÷ 0378 × 0308 ÷ AC00 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
÷ 0378 ÷ AC01 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
÷ 0378 × 0308 ÷ AC01 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 0378 ÷ 0915 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
+÷ 0378 × 0308 ÷ 0915 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [0.3]
÷ 0378 ÷ 231A ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 0378 × 0308 ÷ 231A ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
÷ 0378 × 0300 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
÷ 0378 × 0308 × 0300 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
+÷ 0378 × 094D ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
+÷ 0378 × 0308 × 094D ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [0.3]
÷ 0378 × 200D ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 0378 × 0308 × 200D ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
÷ 0378 ÷ 0378 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
÷ 0378 × 0308 ÷ 0378 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
-÷ 0378 ÷ D800 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ 0378 × 0308 ÷ D800 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ D800 ÷ 0020 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] SPACE (Other) ÷ [0.3]
-÷ D800 ÷ 0308 ÷ 0020 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3]
-÷ D800 ÷ 000D ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ D800 ÷ 0308 ÷ 000D ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ D800 ÷ 000A ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ D800 ÷ 0308 ÷ 000A ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ D800 ÷ 0001 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] <START OF HEADING> (Control) ÷ [0.3]
-÷ D800 ÷ 0308 ÷ 0001 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3]
-÷ D800 ÷ 034F ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3]
-÷ D800 ÷ 0308 × 034F ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3]
-÷ D800 ÷ 1F1E6 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-÷ D800 ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-÷ D800 ÷ 0600 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3]
-÷ D800 ÷ 0308 ÷ 0600 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3]
-÷ D800 ÷ 0903 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
-÷ D800 ÷ 0308 × 0903 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
-÷ D800 ÷ 1100 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
-÷ D800 ÷ 0308 ÷ 1100 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
-÷ D800 ÷ 1160 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
-÷ D800 ÷ 0308 ÷ 1160 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
-÷ D800 ÷ 11A8 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
-÷ D800 ÷ 0308 ÷ 11A8 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
-÷ D800 ÷ AC00 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
-÷ D800 ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
-÷ D800 ÷ AC01 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
-÷ D800 ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
-÷ D800 ÷ 231A ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] WATCH (ExtPict) ÷ [0.3]
-÷ D800 ÷ 0308 ÷ 231A ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3]
-÷ D800 ÷ 0300 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
-÷ D800 ÷ 0308 × 0300 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3]
-÷ D800 ÷ 200D ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
-÷ D800 ÷ 0308 × 200D ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3]
-÷ D800 ÷ 0378 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] <reserved-0378> (Other) ÷ [0.3]
-÷ D800 ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3]
-÷ D800 ÷ D800 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] <surrogate-D800> (Control) ÷ [0.3]
-÷ D800 ÷ 0308 ÷ D800 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3]
÷ 000D × 000A ÷ 0061 ÷ 000A ÷ 0308 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) × [3.0] <LINE FEED (LF)> (LF) ÷ [4.0] LATIN SMALL LETTER A (Other) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [0.3]
÷ 0061 × 0308 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [0.3]
÷ 0020 × 200D ÷ 0646 ÷ # ÷ [0.2] SPACE (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] ARABIC LETTER NOON (Other) ÷ [0.3]
@@ -686,6 +760,15 @@
÷ 0061 × 0308 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3]
÷ 0061 × 0903 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3]
÷ 0061 ÷ 0600 × 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) × [9.2] LATIN SMALL LETTER B (Other) ÷ [0.3]
+÷ 0915 ÷ 0924 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) ÷ [999.0] DEVANAGARI LETTER TA (LinkingConsonant) ÷ [0.3]
+÷ 0915 × 094D × 0924 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.3] DEVANAGARI LETTER TA (LinkingConsonant) ÷ [0.3]
+÷ 0915 × 094D × 200D × 0924 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.3] DEVANAGARI LETTER TA (LinkingConsonant) ÷ [0.3]
+÷ 0915 × 093C × 200D × 094D × 0924 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.3] DEVANAGARI LETTER TA (LinkingConsonant) ÷ [0.3]
+÷ 0915 × 093C × 094D × 200D × 0924 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.3] DEVANAGARI LETTER TA (LinkingConsonant) ÷ [0.3]
+÷ 0915 × 094D × 0924 × 094D × 092F ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.3] DEVANAGARI LETTER TA (LinkingConsonant) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) × [9.3] DEVANAGARI LETTER YA (LinkingConsonant) ÷ [0.3]
+÷ 0915 × 094D ÷ 0061 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (LinkingConsonant) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [999.0] LATIN SMALL LETTER A (Other) ÷ [0.3]
+÷ 0061 × 094D ÷ 0924 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER TA (LinkingConsonant) ÷ [0.3]
+÷ 003F × 094D ÷ 0924 ÷ # ÷ [0.2] QUESTION MARK (Other) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_Virama_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER TA (LinkingConsonant) ÷ [0.3]
÷ 1F476 × 1F3FF ÷ 1F476 ÷ # ÷ [0.2] BABY (ExtPict) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [999.0] BABY (ExtPict) ÷ [0.3]
÷ 0061 × 1F3FF ÷ 1F476 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [999.0] BABY (ExtPict) ÷ [0.3]
÷ 0061 × 1F3FF ÷ 1F476 × 200D × 1F6D1 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [999.0] BABY (ExtPict) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] OCTAGONAL SIGN (ExtPict) ÷ [0.3]
@@ -695,6 +778,6 @@
÷ 2701 × 200D × 2701 ÷ # ÷ [0.2] UPPER BLADE SCISSORS (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] UPPER BLADE SCISSORS (Other) ÷ [0.3]
÷ 0061 × 200D ÷ 2701 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] UPPER BLADE SCISSORS (Other) ÷ [0.3]
#
-# Lines: 672
+# Lines: 755
#
# EOF
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/IdnaTestV2.txt b/Build/source/libs/icu/icu-src/source/test/testdata/IdnaTestV2.txt
index 8897be96b6f..731b78177b0 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/IdnaTestV2.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/IdnaTestV2.txt
@@ -1,10 +1,15 @@
# IdnaTestV2.txt
-# Date: 2018-05-22, 05:53:13 GMT
-# © 2018 Unicode®, Inc.
+# Date: 2019-04-01, 09:18:19 GMT
+# © 2019 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
-# Contains test cases for verifying UTS #46 conformance. For more information,
-# see http://www.unicode.org/reports/tr46/
+#
+# Unicode IDNA Compatible Preprocessing for UTS #46
+# Version: 12.1.0
+#
+# For documentation and usage, see http://www.unicode.org/reports/tr46
+#
+# Test cases for verifying UTS #46 conformance.
#
# FORMAT:
#
@@ -1614,8 +1619,8 @@ xn--h8e470bl0d838o.xn----381i; ꡦᡑ‍⒈.𐋣-; [C2, V3, V6]; xn--h8e470bl0d8
xn--3kj.xn--yib19191t; ⴌ.􍼠ٹ; [B5, B6, V6]; xn--3kj.xn--yib19191t; ; ; # ⴌ.ٹ
xn--knd.xn--yib19191t; Ⴌ.􍼠ٹ; [B5, B6, V6]; xn--knd.xn--yib19191t; ; ; # Ⴌ.ٹ
ⴌ。􍼠ﭩ; ⴌ.􍼠ٹ; [B5, B6, P1, V6]; xn--3kj.xn--yib19191t; ; ; # ⴌ.ٹ
-𐮁𐭱.྄፞-ᳺ; ; [B1, P1, V5, V6]; xn--r19c5a.xn----xjg270ag3m; ; ; # 𐮁𐭱.྄፞-
-xn--r19c5a.xn----xjg270ag3m; 𐮁𐭱.྄፞-ᳺ; [B1, V5, V6]; xn--r19c5a.xn----xjg270ag3m; ; ; # 𐮁𐭱.྄፞-
+𐮁𐭱.྄፞-ᳺ; ; [B1, V5]; xn--r19c5a.xn----xjg270ag3m; ; ; # 𐮁𐭱.྄፞-ᳺ
+xn--r19c5a.xn----xjg270ag3m; 𐮁𐭱.྄፞-ᳺ; [B1, V5]; xn--r19c5a.xn----xjg270ag3m; ; ; # 𐮁𐭱.྄፞-ᳺ
⒈䰹‍-。웈; ⒈䰹‍-.웈; [C2, P1, V3, V6]; xn----tgnx5rjr6c.xn--kp5b; ; xn----dcp160o.xn--kp5b; [P1, V3, V6] # ⒈䰹-.웈
⒈䰹‍-。웈; ⒈䰹‍-.웈; [C2, P1, V3, V6]; xn----tgnx5rjr6c.xn--kp5b; ; xn----dcp160o.xn--kp5b; [P1, V3, V6] # ⒈䰹-.웈
1.䰹‍-。웈; 1.䰹‍-.웈; [C2, V3]; 1.xn----tgnz80r.xn--kp5b; ; 1.xn----zw5a.xn--kp5b; [V3] # 1.䰹-.웈
@@ -1668,28 +1673,28 @@ xn--gdh.xn--lfb92e; ≮.ݩ؃; [B1, V6]; xn--gdh.xn--lfb92e; ; ; # ≮.ݩ
𐶭舌。‌𑚶򟱃𞰘; 𐶭舌.‌𑚶򟱃𞰘; [B1, B2, B3, C1, P1, V6]; xn--tc1ao37z.xn--0ugx728gi1nfwqz2e; ; xn--tc1ao37z.xn--6e2dw557azds2d; [B2, B3, B5, B6, P1, V5, V6] # 舌.𑚶
xn--tc1ao37z.xn--6e2dw557azds2d; 𐶭舌.𑚶򟱃𞰘; [B2, B3, B5, B6, V5, V6]; xn--tc1ao37z.xn--6e2dw557azds2d; ; ; # 舌.𑚶
xn--tc1ao37z.xn--0ugx728gi1nfwqz2e; 𐶭舌.‌𑚶򟱃𞰘; [B1, B2, B3, C1, V6]; xn--tc1ao37z.xn--0ugx728gi1nfwqz2e; ; ; # 舌.𑚶
-‌Ⴠ-.𝟷ς𞴺ς; ‌Ⴠ-.1ς𞴺ς; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-ymba92321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1ςς
-‌Ⴠ-.1ς𞴺ς; ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-ymba92321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1ςς
-‌ⴠ-.1ς𞴺ς; ; [B1, C1, P1, V3, V6]; xn----rgn530d.xn--1-ymba92321c; ; xn----2ws.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # ⴠ-.1ςς
-‌Ⴠ-.1Σ𞴺Σ; ‌Ⴠ-.1σ𞴺σ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-0mba52321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1σσ
-‌ⴠ-.1σ𞴺σ; ; [B1, C1, P1, V3, V6]; xn----rgn530d.xn--1-0mba52321c; ; xn----2ws.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # ⴠ-.1σσ
-‌Ⴠ-.1σ𞴺Σ; ‌Ⴠ-.1σ𞴺σ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-0mba52321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1σσ
-xn----z1g.xn--1-0mba52321c; Ⴠ-.1σ𞴺σ; [B1, B6, V3, V6]; xn----z1g.xn--1-0mba52321c; ; ; # Ⴠ-.1σσ
-xn----z1g168i.xn--1-0mba52321c; ‌Ⴠ-.1σ𞴺σ; [B1, C1, V3, V6]; xn----z1g168i.xn--1-0mba52321c; ; ; # Ⴠ-.1σσ
-xn----2ws.xn--1-0mba52321c; ⴠ-.1σ𞴺σ; [B1, B6, V3, V6]; xn----2ws.xn--1-0mba52321c; ; ; # ⴠ-.1σσ
-xn----rgn530d.xn--1-0mba52321c; ‌ⴠ-.1σ𞴺σ; [B1, C1, V3, V6]; xn----rgn530d.xn--1-0mba52321c; ; ; # ⴠ-.1σσ
-‌Ⴠ-.1ς𞴺Σ; ‌Ⴠ-.1ς𞴺σ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-ymbd52321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1ςσ
-‌ⴠ-.1ς𞴺σ; ; [B1, C1, P1, V3, V6]; xn----rgn530d.xn--1-ymbd52321c; ; xn----2ws.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # ⴠ-.1ςσ
-xn----rgn530d.xn--1-ymbd52321c; ‌ⴠ-.1ς𞴺σ; [B1, C1, V3, V6]; xn----rgn530d.xn--1-ymbd52321c; ; ; # ⴠ-.1ςσ
-xn----z1g168i.xn--1-ymbd52321c; ‌Ⴠ-.1ς𞴺σ; [B1, C1, V3, V6]; xn----z1g168i.xn--1-ymbd52321c; ; ; # Ⴠ-.1ςσ
-xn----rgn530d.xn--1-ymba92321c; ‌ⴠ-.1ς𞴺ς; [B1, C1, V3, V6]; xn----rgn530d.xn--1-ymba92321c; ; ; # ⴠ-.1ςς
-xn----z1g168i.xn--1-ymba92321c; ‌Ⴠ-.1ς𞴺ς; [B1, C1, V3, V6]; xn----z1g168i.xn--1-ymba92321c; ; ; # Ⴠ-.1ςς
-‌ⴠ-.𝟷ς𞴺ς; ‌ⴠ-.1ς𞴺ς; [B1, C1, P1, V3, V6]; xn----rgn530d.xn--1-ymba92321c; ; xn----2ws.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # ⴠ-.1ςς
-‌Ⴠ-.𝟷Σ𞴺Σ; ‌Ⴠ-.1σ𞴺σ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-0mba52321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1σσ
-‌ⴠ-.𝟷σ𞴺σ; ‌ⴠ-.1σ𞴺σ; [B1, C1, P1, V3, V6]; xn----rgn530d.xn--1-0mba52321c; ; xn----2ws.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # ⴠ-.1σσ
-‌Ⴠ-.𝟷σ𞴺Σ; ‌Ⴠ-.1σ𞴺σ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-0mba52321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1σσ
-‌Ⴠ-.𝟷ς𞴺Σ; ‌Ⴠ-.1ς𞴺σ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-ymbd52321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1ςσ
-‌ⴠ-.𝟷ς𞴺σ; ‌ⴠ-.1ς𞴺σ; [B1, C1, P1, V3, V6]; xn----rgn530d.xn--1-ymbd52321c; ; xn----2ws.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # ⴠ-.1ςσ
+‌Ⴠ-.𝟷ς𞴺ς; ‌Ⴠ-.1ς𞴺ς; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-ymba92321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1ς𞴺ς
+‌Ⴠ-.1ς𞴺ς; ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-ymba92321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1ς𞴺ς
+‌ⴠ-.1ς𞴺ς; ; [B1, C1, V3]; xn----rgn530d.xn--1-ymba92321c; ; xn----2ws.xn--1-0mba52321c; [B1, B6, V3] # ⴠ-.1ς𞴺ς
+‌Ⴠ-.1Σ𞴺Σ; ‌Ⴠ-.1σ𞴺σ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-0mba52321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1σ𞴺σ
+‌ⴠ-.1σ𞴺σ; ; [B1, C1, V3]; xn----rgn530d.xn--1-0mba52321c; ; xn----2ws.xn--1-0mba52321c; [B1, B6, V3] # ⴠ-.1σ𞴺σ
+‌Ⴠ-.1σ𞴺Σ; ‌Ⴠ-.1σ𞴺σ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-0mba52321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1σ𞴺σ
+xn----z1g.xn--1-0mba52321c; Ⴠ-.1σ𞴺σ; [B1, B6, V3, V6]; xn----z1g.xn--1-0mba52321c; ; ; # Ⴠ-.1σ𞴺σ
+xn----z1g168i.xn--1-0mba52321c; ‌Ⴠ-.1σ𞴺σ; [B1, C1, V3, V6]; xn----z1g168i.xn--1-0mba52321c; ; ; # Ⴠ-.1σ𞴺σ
+xn----2ws.xn--1-0mba52321c; ⴠ-.1σ𞴺σ; [B1, B6, V3]; xn----2ws.xn--1-0mba52321c; ; ; # ⴠ-.1σ𞴺σ
+xn----rgn530d.xn--1-0mba52321c; ‌ⴠ-.1σ𞴺σ; [B1, C1, V3]; xn----rgn530d.xn--1-0mba52321c; ; ; # ⴠ-.1σ𞴺σ
+‌Ⴠ-.1ς𞴺Σ; ‌Ⴠ-.1ς𞴺σ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-ymbd52321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1ς𞴺σ
+‌ⴠ-.1ς𞴺σ; ; [B1, C1, V3]; xn----rgn530d.xn--1-ymbd52321c; ; xn----2ws.xn--1-0mba52321c; [B1, B6, V3] # ⴠ-.1ς𞴺σ
+xn----rgn530d.xn--1-ymbd52321c; ‌ⴠ-.1ς𞴺σ; [B1, C1, V3]; xn----rgn530d.xn--1-ymbd52321c; ; ; # ⴠ-.1ς𞴺σ
+xn----z1g168i.xn--1-ymbd52321c; ‌Ⴠ-.1ς𞴺σ; [B1, C1, V3, V6]; xn----z1g168i.xn--1-ymbd52321c; ; ; # Ⴠ-.1ς𞴺σ
+xn----rgn530d.xn--1-ymba92321c; ‌ⴠ-.1ς𞴺ς; [B1, C1, V3]; xn----rgn530d.xn--1-ymba92321c; ; ; # ⴠ-.1ς𞴺ς
+xn----z1g168i.xn--1-ymba92321c; ‌Ⴠ-.1ς𞴺ς; [B1, C1, V3, V6]; xn----z1g168i.xn--1-ymba92321c; ; ; # Ⴠ-.1ς𞴺ς
+‌ⴠ-.𝟷ς𞴺ς; ‌ⴠ-.1ς𞴺ς; [B1, C1, V3]; xn----rgn530d.xn--1-ymba92321c; ; xn----2ws.xn--1-0mba52321c; [B1, B6, V3] # ⴠ-.1ς𞴺ς
+‌Ⴠ-.𝟷Σ𞴺Σ; ‌Ⴠ-.1σ𞴺σ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-0mba52321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1σ𞴺σ
+‌ⴠ-.𝟷σ𞴺σ; ‌ⴠ-.1σ𞴺σ; [B1, C1, V3]; xn----rgn530d.xn--1-0mba52321c; ; xn----2ws.xn--1-0mba52321c; [B1, B6, V3] # ⴠ-.1σ𞴺σ
+‌Ⴠ-.𝟷σ𞴺Σ; ‌Ⴠ-.1σ𞴺σ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-0mba52321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1σ𞴺σ
+‌Ⴠ-.𝟷ς𞴺Σ; ‌Ⴠ-.1ς𞴺σ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-ymbd52321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1ς𞴺σ
+‌ⴠ-.𝟷ς𞴺σ; ‌ⴠ-.1ς𞴺σ; [B1, C1, V3]; xn----rgn530d.xn--1-ymbd52321c; ; xn----2ws.xn--1-0mba52321c; [B1, B6, V3] # ⴠ-.1ς𞴺σ
𑲘󠄒𓑡。𝟪Ⴜ; 𑲘𓑡.8Ⴜ; [P1, V5, V6]; xn--7m3d291b.xn--8-s1g; ; ; # 𑲘.8Ⴜ
𑲘󠄒𓑡。8Ⴜ; 𑲘𓑡.8Ⴜ; [P1, V5, V6]; xn--7m3d291b.xn--8-s1g; ; ; # 𑲘.8Ⴜ
𑲘󠄒𓑡。8ⴜ; 𑲘𓑡.8ⴜ; [P1, V5, V6]; xn--7m3d291b.xn--8-vws; ; ; # 𑲘.8ⴜ
@@ -2111,11 +2116,10 @@ xn--6-gsc039eqq6k.xn--0gb6bxkx18g; ڇ6Ⴔ辘.صيڇ‌; [B2, B3, C1, V6]; xn--6-
꡽≯.򻲀򒳄; ꡽≯.򻲀򒳄; [P1, V6]; xn--hdh8193c.xn--5z40cp629b; ; ; # ≯.
xn--hdh8193c.xn--5z40cp629b; ꡽≯.򻲀򒳄; [V6]; xn--hdh8193c.xn--5z40cp629b; ; ; # ≯.
ςოٻ.ςܔ; ; [B5, B6]; xn--3xa80l26n.xn--3xa41o; ; xn--4xa60l26n.xn--4xa21o; # ςოٻ.ςܔ
-ΣᲝٻ.Σܔ; σᲝٻ.σܔ; [B5, B6, P1, V6]; xn--4xa60lw94a.xn--4xa21o; ; ; # σᲝٻ.σܔ
+ΣᲝٻ.Σܔ; σოٻ.σܔ; [B5, B6]; xn--4xa60l26n.xn--4xa21o; ; ; # σოٻ.σܔ
σოٻ.σܔ; ; [B5, B6]; xn--4xa60l26n.xn--4xa21o; ; ; # σოٻ.σܔ
Σოٻ.σܔ; σოٻ.σܔ; [B5, B6]; xn--4xa60l26n.xn--4xa21o; ; ; # σოٻ.σܔ
xn--4xa60l26n.xn--4xa21o; σოٻ.σܔ; [B5, B6]; xn--4xa60l26n.xn--4xa21o; ; ; # σოٻ.σܔ
-xn--4xa60lw94a.xn--4xa21o; σᲝٻ.σܔ; [B5, B6, V6]; xn--4xa60lw94a.xn--4xa21o; ; ; # σᲝٻ.σܔ
Σოٻ.ςܔ; σოٻ.ςܔ; [B5, B6]; xn--4xa60l26n.xn--3xa41o; ; xn--4xa60l26n.xn--4xa21o; # σოٻ.ςܔ
σოٻ.ςܔ; ; [B5, B6]; xn--4xa60l26n.xn--3xa41o; ; xn--4xa60l26n.xn--4xa21o; # σოٻ.ςܔ
xn--4xa60l26n.xn--3xa41o; σოٻ.ςܔ; [B5, B6]; xn--4xa60l26n.xn--3xa41o; ; ; # σოٻ.ςܔ
@@ -4038,8 +4042,8 @@ xn--1ss-ir6ln166b.xn--weg; 1꫶ss𑲥.ᷘ; [V5]; xn--1ss-ir6ln166b.xn--weg; ; ;
xn--1-qfa2471kdb0d.xn--weg; 1꫶ß𑲥.ᷘ; [V5]; xn--1-qfa2471kdb0d.xn--weg; ; ; # 1꫶ß𑲥.ᷘ
1꫶SS𑲥。ᷘ; 1꫶ss𑲥.ᷘ; [V5]; xn--1ss-ir6ln166b.xn--weg; ; ; # 1꫶ss𑲥.ᷘ
1꫶ss𑲥。ᷘ; 1꫶ss𑲥.ᷘ; [V5]; xn--1ss-ir6ln166b.xn--weg; ; ; # 1꫶ss𑲥.ᷘ
-1꫶Ss𑲥。ᷘ; 1꫶ss𑲥.ᷘ; [V5]; xn--1ss-ir6ln166b.xn--weg; ; ; # 1꫶ss𑲥.ᷘ
1꫶Ss𑲥。ᷘ; 1꫶ss𑲥.ᷘ; [V5]; xn--1ss-ir6ln166b.xn--weg; ; ; # 1꫶ss𑲥.ᷘ
+1꫶Ss𑲥。ᷘ; 1꫶ss𑲥.ᷘ; [V5]; xn--1ss-ir6ln166b.xn--weg; ; ; # 1꫶ss𑲥.ᷘ
‍񫶩𞪯್。ݼ⒈; ‍񫶩𞪯್.ݼ⒈; [B1, C2, P1, V6]; xn--8tc969gzn94a4lm8a.xn--dqb689l; ; xn--8tc9875v5is1a.xn--dqb689l; [B5, B6, P1, V6] # ್.ݼ⒈
‍񫶩𞪯್。ݼ1.; ‍񫶩𞪯್.ݼ1.; [B1, C2, P1, V6]; xn--8tc969gzn94a4lm8a.xn--1-g6c.; ; xn--8tc9875v5is1a.xn--1-g6c.; [B5, B6, P1, V6] # ್.ݼ1.
xn--8tc9875v5is1a.xn--1-g6c.; 񫶩𞪯್.ݼ1.; [B5, B6, V6]; xn--8tc9875v5is1a.xn--1-g6c.; ; ; # ್.ݼ1.
@@ -5577,12 +5581,11 @@ xn-----bk9hu24z.xn--o4e6836dpxudz0v1c; ꡰ︒--.៌靈𐹢񘳮; [B1, B6, V2, V3,
ᅟႿႵრ。୍; ᅟႿႵრ.୍; [P1, V5, V6]; xn--tndt4hvw.xn--9ic; ; ; # ႿႵრ.୍
ᅟႿႵრ。୍; ᅟႿႵრ.୍; [P1, V5, V6]; xn--tndt4hvw.xn--9ic; ; ; # ႿႵრ.୍
ᅟⴟⴕრ。୍; ᅟⴟⴕრ.୍; [P1, V5, V6]; xn--1od7wz74eeb.xn--9ic; ; ; # ⴟⴕრ.୍
-ᅟႿႵᲠ。୍; ᅟႿႵᲠ.୍; [P1, V5, V6]; xn--tndt39bg47a.xn--9ic; ; ; # ႿႵᲠ.୍
-xn--tndt39bg47a.xn--9ic; ᅟႿႵᲠ.୍; [V5, V6]; xn--tndt39bg47a.xn--9ic; ; ; # ႿႵᲠ.୍
-xn--1od7wz74eeb.xn--9ic; ᅟⴟⴕრ.୍; [V5, V6]; xn--1od7wz74eeb.xn--9ic; ; ; # ⴟⴕრ.୍
+ᅟႿႵᲠ。୍; ᅟႿႵრ.୍; [P1, V5, V6]; xn--tndt4hvw.xn--9ic; ; ; # ႿႵრ.୍
xn--tndt4hvw.xn--9ic; ᅟႿႵრ.୍; [V5, V6]; xn--tndt4hvw.xn--9ic; ; ; # ႿႵრ.୍
+xn--1od7wz74eeb.xn--9ic; ᅟⴟⴕრ.୍; [V5, V6]; xn--1od7wz74eeb.xn--9ic; ; ; # ⴟⴕრ.୍
ᅟⴟⴕრ。୍; ᅟⴟⴕრ.୍; [P1, V5, V6]; xn--1od7wz74eeb.xn--9ic; ; ; # ⴟⴕრ.୍
-ᅟႿႵᲠ。୍; ᅟႿႵᲠ.୍; [P1, V5, V6]; xn--tndt39bg47a.xn--9ic; ; ; # ႿႵᲠ.୍
+ᅟႿႵᲠ。୍; ᅟႿႵრ.୍; [P1, V5, V6]; xn--tndt4hvw.xn--9ic; ; ; # ႿႵრ.୍
ᅟႿⴕრ。୍; ᅟႿⴕრ.୍; [P1, V5, V6]; xn--3nd0etsm92g.xn--9ic; ; ; # Ⴟⴕრ.୍
xn--3nd0etsm92g.xn--9ic; ᅟႿⴕრ.୍; [V5, V6]; xn--3nd0etsm92g.xn--9ic; ; ; # Ⴟⴕრ.୍
ᅟႿⴕრ。୍; ᅟႿⴕრ.୍; [P1, V5, V6]; xn--3nd0etsm92g.xn--9ic; ; ; # Ⴟⴕრ.୍
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/LineBreakTest.txt b/Build/source/libs/icu/icu-src/source/test/testdata/LineBreakTest.txt
index 0e9e678a852..eb056990a0d 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/LineBreakTest.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/LineBreakTest.txt
@@ -1,6 +1,6 @@
-# LineBreakTest-11.0.0.txt
-# Date: 2018-05-20, 09:03:09 GMT
-# © 2018 Unicode®, Inc.
+# LineBreakTest-12.1.0.txt
+# Date: 2019-03-10, 10:53:14 GMT
+# © 2019 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/Makefile.in b/Build/source/libs/icu/icu-src/source/test/testdata/Makefile.in
index 003226154db..04bc1c1afad 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/Makefile.in
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/Makefile.in
@@ -127,105 +127,22 @@ TESTDATA=testdata
# prefix for files that are testdata
TESTDT=$(TESTDATA)
-# File definitions
-TEST_DAT_FILES=$(TESTBUILDDIR)/test.icu
-TEST_SPP_FILES=$(TESTBUILDDIR)/nfscsi.spp $(TESTBUILDDIR)/nfscss.spp $(TESTBUILDDIR)/nfscis.spp $(TESTBUILDDIR)/nfsmxs.spp $(TESTBUILDDIR)/nfsmxp.spp
+# Variable names for rules.mk
+OUT_DIR=$(TESTBUILDDIR)
+TMP_DIR=$(TESTOUTDIR)/$(TESTDT)
-TEST_UCM_SOURCE= test1.ucm test1bmp.ucm test2.ucm test3.ucm test4.ucm test4x.ucm test5.ucm ibm9027.ucm
-TEST_UCM_FILES=$(TEST_UCM_SOURCE:%=$(TESTSRCDATADIR)/data/%)
-TEST_CNV_FILES=$(TEST_UCM_SOURCE:%.ucm=$(TESTBUILDDIR)/%.cnv)
+## Include the Python-generated rules
-TEST_NRM_FILES=$(TESTBUILDDIR)/testnorm.nrm
+include $(top_builddir)/$(subdir)/rules.mk
-# import the shared .mk file
-include $(TESTSRCDATADIR)/tstfiles.mk
--include $(TESTSRCDATADIR)/tstlocal.mk
-# TEST_RES_SOURCE comes from tstfiles.mk
-TEST_RES = $(TEST_RES_SOURCE) $(TEST_RES_LOCAL) casing.txt mc.txt root.txt sh.txt sh_YU.txt te.txt te_IN.txt te_IN_REVISED.txt testtypes.txt testaliases.txt testempty.txt structLocale.txt idna_rules.txt conversion.txt icuio.txt testtable32.txt metaZones.txt timezoneTypes.txt windowsZones.txt zoneinfo64.txt
-TEST_RES_FILES=$(TEST_RES:%.txt=$(TESTBUILDDIR)/%.res) $(TESTBUILDDIR)/encoded.res $(TESTBUILDDIR)/old_l_testtypes.res $(TESTBUILDDIR)/old_e_testtypes.res
+build-testdata: build-dir $(TESTDATA_ALL_OUTPUT_FILES)
-ALL_TEST_FILES = $(TEST_DAT_FILES) $(TEST_SPP_FILES) $(TEST_BRK_FILES) $(TEST_CNV_FILES) $(TEST_NRM_FILES) $(TEST_RES_FILES) $(TESTOUTDIR)/$(TESTDT)/nam.typ $(TESTOUTDIR)/$(TESTDT)/zoneinfo64.res
+testdata: build-testdata
-# list
-$(TESTBUILDDIR)/testdata.lst: $(SRCLISTDEPS)
- @echo "generating $@ (list of data files)"
- @-$(RMV) $@
- @for file in $(TEST_RES_FILES:$(TESTBUILDDIR)/%.res=%.res) $(TEST_DAT_FILES:$(TESTBUILDDIR)/%.icu=%.icu) $(TEST_SPP_FILES:$(TESTBUILDDIR)/%.spp=%.spp) $(TEST_CNV_FILES:$(TESTBUILDDIR)/%.cnv=%.cnv) $(TEST_NRM_FILES:$(TESTBUILDDIR)/%.nrm=%.nrm); do \
- echo $$file >> $@; \
- done;
-
-
-build-testdata: build-dir $(ALL_TEST_FILES) $(TESTBUILDDIR)/testdata.lst $(TESTBUILDDIR)/encoded.res
-
-# test.icu
-$(TESTBUILDDIR)/test.icu: $(GENTEST)
- $(INVOKE) $(GENTEST) -d $(TESTBUILDDIR)
-
-$(TESTBUILDDIR)/testtable32.txt: $(GENTEST)
- $(INVOKE) $(GENTEST) -r -d $(TESTBUILDDIR)
-
-$(TESTBUILDDIR)/testtable32.res: $(TESTBUILDDIR)/testtable32.txt $(TOOLBINDIR)/genrb$(EXEEXT)
- $(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -s $(TESTBUILDDIR) $(ICU_DATA_OPT) -d $(TESTBUILDDIR) $(<F)
-
-# Targets for nfscsi.spp
-$(TESTBUILDDIR)/nfscsi.spp: $(TOOLBINDIR)/gensprep$(EXEEXT) $(TESTSRCDATADIR)/nfs4_cs_prep_ci.txt
- @echo Building nfscsi.icu
- $(INVOKE) $(TOOLBINDIR)/gensprep -s $(TESTSRCDATADIR) $(ICU_DATA_OPT) -d $(TESTBUILDDIR) -b nfscsi -u 3.2.0 nfs4_cs_prep_ci.txt
-
-# Targets for nfscss.spp
-$(TESTBUILDDIR)/nfscss.spp: $(TOOLBINDIR)/gensprep$(EXEEXT) $(TESTSRCDATADIR)/nfs4_cs_prep_cs.txt
- @echo Building nfscss.icu
- $(INVOKE) $(TOOLBINDIR)/gensprep -s $(TESTSRCDATADIR) $(ICU_DATA_OPT) -d $(TESTBUILDDIR) -b nfscss -u 3.2.0 nfs4_cs_prep_cs.txt
-
-# Targets for nfscis.spp
-$(TESTBUILDDIR)/nfscis.spp: $(TOOLBINDIR)/gensprep$(EXEEXT) $(TESTSRCDATADIR)/nfs4_cis_prep.txt
- @echo Building nfscis.spp
- $(INVOKE) $(TOOLBINDIR)/gensprep -s $(TESTSRCDATADIR) $(ICU_DATA_OPT) -d $(TESTBUILDDIR) -b nfscis -k -n $(UNICODEDATADIR) -u 3.2.0 nfs4_cis_prep.txt
-
-# Targets for nfsmxs.spp
-$(TESTBUILDDIR)/nfsmxs.spp: $(TOOLBINDIR)/gensprep$(EXEEXT) $(TESTSRCDATADIR)/nfs4_mixed_prep_s.txt
- @echo Building nfsmxs.spp
- $(INVOKE) $(TOOLBINDIR)/gensprep -s $(TESTSRCDATADIR) $(ICU_DATA_OPT) -d $(TESTBUILDDIR) -b nfsmxs -k -n $(UNICODEDATADIR) -u 3.2.0 nfs4_mixed_prep_s.txt
-
-# Targets for nfsmxp.spp
-$(TESTBUILDDIR)/nfsmxp.spp: $(TOOLBINDIR)/gensprep$(EXEEXT) $(TESTSRCDATADIR)/nfs4_mixed_prep_p.txt
- @echo Building nfsmxp.spp
- $(INVOKE) $(TOOLBINDIR)/gensprep -s $(TESTSRCDATADIR) $(ICU_DATA_OPT) -d $(TESTBUILDDIR) -b nfsmxp -k -n $(UNICODEDATADIR) -u 3.2.0 nfs4_mixed_prep_p.txt
-
-$(TESTBUILDDIR)/%.cnv: $(TESTSRCDATADIR)/%.ucm $(TOOLBINDIR)/makeconv$(EXEEXT)
- $(INVOKE) $(TOOLBINDIR)/makeconv --small -c -d $(TESTBUILDDIR) $(TESTSRCDATADIR)/$(<F)
-
-$(TESTBUILDDIR)/%.nrm: $(TESTSRCDATADIR)/%.txt $(TOOLBINDIR)/gennorm2$(EXEEXT)
- $(INVOKE) $(TOOLBINDIR)/gennorm2 -s $(TESTSRCDATADIR) $(<F) -o $@
-
-$(TESTBUILDDIR)/%.res: $(TESTSRCDATADIR)/%.txt $(TOOLBINDIR)/genrb$(EXEEXT) $(DAT_FILES)
- $(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -q -s $(TESTSRCDATADIR) $(ICU_DATA_OPT) -d $(TESTBUILDDIR) $(<F)
-
-$(TESTBUILDDIR)/encoded.res: $(TESTSRCDATADIR)/encoded.utf16be $(TOOLBINDIR)/genrb$(EXEEXT)
- @echo Testing genrb -e option
- ICU_DATA=$(BUILDDIR) $(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -s $(TESTSRCDATADIR) -eUTF-16BE -d $(TESTBUILDDIR) $(<F)
- @echo Finished testing genrb -e option
-
-################################################################### TYP
-# TYP FILES
-
-$(TESTOUTDIR)/$(TESTDT)/nam.typ: $(TESTBUILDDIR)/te_IN.res
- cp $< $@
-$(TESTBUILDDIR)/old_l_testtypes.res: $(TESTSRCDATADIR)/old_l_testtypes.res
- cp $< $@
-$(TESTBUILDDIR)/old_e_testtypes.res: $(TESTSRCDATADIR)/old_e_testtypes.res
- cp $< $@
-$(TESTOUTDIR)/$(TESTDT)/zoneinfo64.res: $(TESTBUILDDIR)/zoneinfo64.res
- cp $< $@
-
-testdata: build-dir $(ALL_TEST_FILES) $(UNPACKAGEDTESTDATA)
-
-#$(ALL_TEST_FILES) $(TESTBUILDDIR)/testtable32.txt $(TESTBUILDDIR)/testdata.lst: build-dir
-
-packagetest: build-dir testdata pkgdata.inc $(TESTBUILDDIR)/testdata.lst
- $(PKGDATA_INVOKE) $(PKGDATA) -T $(TESTBUILDDIR) -d $(TESTOUTDIR) -s $(TESTBUILDDIR) -p $(TESTDATA) -m common $(TESTBUILDDIR)/testdata.lst
+packagetest: build-dir testdata pkgdata.inc $(TMP_DIR)/testdata.lst
+ $(PKGDATA_INVOKE) $(PKGDATA) -T $(TESTBUILDDIR) -d $(TESTOUTDIR) -s $(TESTBUILDDIR) -p $(TESTDATA) -m common $(TMP_DIR)/testdata.lst
build-dir: $(BUILD_DIRS)
$(BUILD_DIRS):
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/SentenceBreakTest.txt b/Build/source/libs/icu/icu-src/source/test/testdata/SentenceBreakTest.txt
index 70898a31773..7c1c34afbd0 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/SentenceBreakTest.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/SentenceBreakTest.txt
@@ -1,6 +1,6 @@
-# SentenceBreakTest-11.0.0.txt
-# Date: 2018-01-31, 08:20:29 GMT
-# © 2018 Unicode®, Inc.
+# SentenceBreakTest-12.1.0.txt
+# Date: 2019-03-10, 10:53:28 GMT
+# © 2019 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/WordBreakTest.txt b/Build/source/libs/icu/icu-src/source/test/testdata/WordBreakTest.txt
index c4c92550ec5..facd8920ea8 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/WordBreakTest.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/WordBreakTest.txt
@@ -1,6 +1,6 @@
-# WordBreakTest-11.0.0.txt
-# Date: 2018-03-16, 20:34:16 GMT
-# © 2018 Unicode®, Inc.
+# WordBreakTest-12.1.0.txt
+# Date: 2019-03-10, 10:53:29 GMT
+# © 2019 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/README.md b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/README.md
new file mode 100644
index 00000000000..b5b9bd8e518
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/README.md
@@ -0,0 +1,100 @@
+<!--
+Copyright (C) 2016 and later: Unicode, Inc. and others.
+License & terms of use: http://www.unicode.org/copyright.html#License
+
+Copyright (c) 2015-2016, International Business Machines Corporation and others. All Rights Reserved.
+-->
+
+This directory contains the break iterator reference rule files used by intltest rbbi/RBBIMonkeyTest/testMonkey.
+===========================================
+
+The rules in this directory track the boundary rules from Unicode UAX 14 and 29. They are interpreted
+to provide an expected set of boundary positions to compare with the results from ICU break iteration.
+
+ICU4J also includes copies of the test reference rules, located in the directory
+main/tests/core/src/com/ibm/icu/dev/test/rbbi/break_rules/
+The copies should be kept synchronized; there should be no differences.
+
+Each set of reference break rules lives in a separate file.
+The list of rule files to run by default is hard coded into the test code, in rbbimonkeytest.cpp.
+
+Each test file includes
+ - The type of ICU break iterator to create (word, line, sentence, etc.)
+ - The locale to use
+ - Character Class definitions
+ - Rule definitions
+
+To Do
+ - Extend the syntax to support rule tailoring.
+
+
+**character class definition**
+
+ name = set_regular_expression;
+
+*caution* When referenced, these definitions are textually substituted into the overall rule.
+To avoid unexpected behavior, include [brackets] around the full definition
+
+ letter_number = [:Letter:][:Number:];
+
+Will compile, but will produce unexpected results.
+
+ letter_number = [[:Letter:][:Number:]];
+
+is safe. The issue is similar to the problems that can occur with the C preprocessor
+and the use of parentheses around macro paramteters.
+
+**rule definition**
+
+ rule_regular_expression;
+
+**name**
+
+ [A-Za-z_][A-Za-z0-9_]*
+
+**set_regular_expression**
+
+The intersection of an ICU regular expression [set] expression and a UnicodeSet pattern
+(They are mostly the same). May include previously defined set names, which are logically
+expanded in-place.
+
+**rule_regular_expression**
+
+ An ICU Regular Expression.
+ May include set names, which are logically expanded in-place.
+ May include a '÷', which defines a boundary position.
+
+Application of the rules:
+
+Matching begins at the start of text, or after a previously identified boundary.
+The pseudo-code below finds the next boundary.
+
+ while position < end of text
+ for each rule
+ if the text at position matches this rule
+ if the rule has a '÷'
+ Boundary is found.
+ return the position of the '÷' within the match.
+ else
+ position = last character of the rule match.
+ break from the inner rule loop, continue the outer loop.
+
+This differs from the Unicode UAX algorithm in that each position in the text is
+not tested separately. Instead, when a rule match is found, rule application restarts with the last
+character of the preceding rule match. ICU's break rules also operate this way.
+
+Expressing rules this way simplifies UAX rules that have leading or trailing context; it
+is no longer necessary to write expressions that match the context starting from
+any position within it.
+
+This rule form differs from ICU rules in that the rules are applied sequentially, as they
+are with the Unicode UAX rules. With the main ICU break rules, all are applied in parallel.
+
+**Word Dictionaries**
+
+
+The monkey test does not test dictionary based breaking. The set named 'dictionary' is special,
+as it is in the main ICU rules. For the monkey test, no characters from the dictionary set are
+included in the randomly-generated test data.
+
+
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/grapheme.txt b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/grapheme.txt
index 27498c1ff13..c57a898fbf6 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/grapheme.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/grapheme.txt
@@ -37,6 +37,13 @@ LVT = [\p{Grapheme_Cluster_Break = LVT}];
Extended_Pict = [:ExtPict:];
+# Indic Sequences
+Virama_ = [[\p{Gujr}\p{sc=Telu}\p{sc=Mlym}\p{sc=Orya}\p{sc=Beng}\p{sc=Deva}] & [\p{Indic_Syllabic_Category=Virama}]];
+
+LinkingConsonant = [[\p{Gujr}\p{sc=Telu}\p{sc=Mlym}\p{sc=Orya}\p{sc=Beng}\p{sc=Deva}] & [\p{Indic_Syllabic_Category=Consonant}]];
+
+ExtCccZwj = [[Extend-[\p{ccc=0}]] ZWJ];
+
GB3: CR LF;
GB4: (Control | CR | LF) ÷;
GB5: . ÷ (Control | CR | LF);
@@ -46,6 +53,7 @@ GB7: (LV | V) (V | T);
GB8: (LVT | T) T;
GB11: Extended_Pict Extend* ZWJ Extended_Pict;
+GB9c: LinkingConsonant ExtCccZwj* Virama_ ExtCccZwj* LinkingConsonant;
GB9: . (Extend | ZWJ);
GB9a: . SpacingMark;
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line.txt b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line.txt
index 3e0324bf93d..425f0109bc8 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line.txt
@@ -78,19 +78,33 @@ LB5.3: NL ÷;
LB6: . (BK | CR | LF | NL);
LB6.1: [^BK CR LF NL SP ZW] CM* (BK | CR | LF | NL);
+# LB8 break after ZW SP*.
+# Precedes LB7 because both rules will match the sequences like ZW SP,
+# and LB8 must take precedence.
+
+LB8: ZW SP* ÷ [^ZW SP BK CR LF NL];
+
+# Numbers. Equivalent to Tailoring example 8 from UAX 14.
+# Moved up, before LB14, because it can match longer sequences which must take precedence.
+LB25: ((PR | PO)CM*)? ((OP | HY)CM*)? (IS CM*)? NU (CM*(NU | SY | IS))* (CM*(CL | CP))? (CM*(PR | PO))?;
+
# Rules LB14 - LB17.
-# Moved before LB7, because they can match a longer sequence that would also match LB7,
-# for example, the sequence "OP CM SP AL" matches LB14 while the prefix of it,
-# "while only the prefix "OP CM SP" matches LB7.1
+# Moved up, before LB7, because they can match a longer sequence that would also match LB7.
+# For example, the sequence "OP CM SP AL" matches LB14
+# while the prefix of it, "OP CM SP" matches LB7.1
LB14: OP CM* SP* .;
+
+# LB 14a Break before an IS that begins a number and follows a space.
+LB14a: SP ÷ IS CM* NU;
+
+# LB14b × IS
+LB14b.1: [^SP] CM* IS;
+LB14b.2: SP IS;
+
LB15: QU CM* SP* OP;
LB16: (CL | CP)CM* SP* NS;
LB17: B2 CM* SP* B2;
-# LB8, break after ZW SP*, precedes LB7 because they will both match the sequences like ZW SP,
-# and LB8 should take precedence.
-
-LB8: ZW SP* ÷ [^ZW SP BK CR LF NL];
# LB7 Do not break before spaces or zero width space.
@@ -118,15 +132,9 @@ LB12: GL CM* [^CM];
LB12a: [^SP BA HY] CM* GL;
-# LB 13 ICU Tailoring, matches tailoring example 8 from UAX 14.
-#
-# LB13.1 [^SP] CM* [CL CP EX IS SY] # original UAX 14 rule.
-# LB13.2 SP CM* [CL CP EX IS SY]
-
-LB13.1: [^NU SP] CM* [CL CP IS SY];
-LB13.2: [^SP] CM* EX;
-LB13.2: SP [CL CP EX IS SY];
-
+# LB 13 Do not break before ‘]’ or ‘!’ or ‘/’, even after spaces.
+LB13.1: [^SP] CM* [CL CP EX SY];
+LB13.2: SP [CL CP EX SY];
# LB 14-17 are moved above LB 7.
@@ -172,8 +180,6 @@ LB23a.2: (ID | EB | EM) CM* PO;
LB24.2: (PR | PO) CM* (AL | HL);
LB24.3: (AL | HL | CM) CM* (PR | PO);
-# Numbers. Equivalent to Tailoring example 8 from UAX 14.
-LB25: ((PR | PO)CM*)? ((OP | HY)CM*)? NU (CM*(NU | SY | IS))* (CM*(CL | CP))? (CM*(PR | PO))?;
LB26.1: JL CM* (JL | JV | H2 | H3);
LB26.2: (JV | H2) CM* (JV | JT);
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_cj.txt b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_cj.txt
new file mode 100644
index 00000000000..765953bb0c0
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_cj.txt
@@ -0,0 +1,213 @@
+#
+# Copyright (C) 2016 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+# Copyright (c) 2016, International Business Machines Corporation and others. All Rights Reserved.
+
+# file: line.txt
+#
+# Reference Line Break rules for intltest rbbi/RBBIMonkeyTest.
+# Rules derived from Unicode Standard Annex #14 Revision 40 for Unicode 11.0
+#
+# Note: Rule syntax and the monkey test itself are still a work in progress.
+# They are expected to change with review and the addition of support for rule tailoring.
+
+
+type = line;
+locale = zh;
+
+
+AI = [:LineBreak = Ambiguous:];
+AL = [:LineBreak = Alphabetic:];
+BA = [:LineBreak = Break_After:];
+HH = [\u2010]; # \u2010 is HYPHEN, default line break is BA.
+BB = [:LineBreak = Break_Before:];
+BK = [:LineBreak = Mandatory_Break:];
+B2 = [:LineBreak = Break_Both:];
+CB = [:LineBreak = Contingent_Break:];
+CJ = [:LineBreak = Conditional_Japanese_Starter:];
+CL = [[:LineBreak = Close_Punctuation:] \u201d];
+CMS = [:LineBreak = Combining_Mark:];
+CP = [:LineBreak = Close_Parenthesis:];
+CR = [:LineBreak = Carriage_Return:];
+EB = [:LineBreak = EB:];
+EM = [:LineBreak = EM:];
+EX = [:LineBreak = Exclamation:];
+GL = [:LineBreak = Glue:];
+HL = [:LineBreak = Hebrew_Letter:];
+HY = [:LineBreak = Hyphen:];
+H2 = [:LineBreak = H2:];
+H3 = [:LineBreak = H3:];
+ID = [:LineBreak = Ideographic:];
+IN = [:LineBreak = Inseperable:];
+IS = [:LineBreak = Infix_Numeric:];
+JL = [:LineBreak = JL:];
+JV = [:LineBreak = JV:];
+JT = [:LineBreak = JT:];
+LF = [:LineBreak = Line_Feed:];
+NL = [:LineBreak = Next_Line:];
+NS = [[:LineBreak = Nonstarter:] CJ]; # CSS Strict tailoring: CJ resolves to NS.
+NU = [:LineBreak = Numeric:];
+OP = [[:LineBreak = Open_Punctuation:] \u201c];
+PO = [:LineBreak = Postfix_Numeric:];
+PR = [:LineBreak = Prefix_Numeric:];
+QU = [[:LineBreak = Quotation:] - [\u201c\u201d]];
+RI = [:LineBreak = Regional_Indicator:];
+SA = [:LineBreak = Complex_Context:];
+SG = [:LineBreak = Surrogate:];
+SP = [:LineBreak = Space:];
+SY = [:LineBreak = Break_Symbols:];
+WJ = [:LineBreak = Word_Joiner:];
+XX = [:LineBreak = Unknown:];
+ZW = [:LineBreak = ZWSpace:];
+ZWJ = [:LineBreak = ZWJ:];
+
+# LB1 - Resolve AI, CB, CJ, SA, SG, and XX into other line breaking classes
+AL = [AL AI SG XX ];
+dictionary = SA;
+
+# By LB9, a ZWJ also behaves as a CM. Including it in the definition of CM avoids having to explicitly
+# list it in the numerous rules that use CM.
+CM = [CMS ZWJ];
+
+LB4: BK ÷;
+LB5: CR LF;
+LB5.1: CR ÷;
+LB5.2: LF ÷;
+LB5.3: NL ÷;
+
+LB6: . (BK | CR | LF | NL);
+LB6.1: [^BK CR LF NL SP ZW] CM* (BK | CR | LF | NL);
+
+# LB8 break after ZW SP*.
+# Precedes LB7 because both rules will match the sequences like ZW SP,
+# and LB8 must take precedence.
+
+LB8: ZW SP* ÷ [^ZW SP BK CR LF NL];
+
+# Numbers. Equivalent to Tailoring example 8 from UAX 14.
+# Moved up, before LB14, because it can match longer sequences which must take precedence.
+LB25: ((PR | PO)CM*)? ((OP | HY)CM*)? (IS CM*)? NU (CM*(NU | SY | IS))* (CM*(CL | CP))? (CM*(PR | PO))?;
+
+# Rules LB14 - LB17.
+# Moved up, before LB7, because they can match a longer sequence that would also match LB7.
+# For example, the sequence "OP CM SP AL" matches LB14
+# while the prefix of it, "OP CM SP" matches LB7.1
+LB14: OP CM* SP* .;
+
+# LB 14a Break before an IS that begins a number and follows a space.
+LB14a: SP ÷ IS CM* NU;
+
+# LB14b × IS
+LB14b.1: [^SP] CM* IS;
+LB14b.2: SP IS;
+
+LB15: QU CM* SP* OP;
+LB16: (CL | CP)CM* SP* NS;
+LB17: B2 CM* SP* B2;
+
+
+# LB7 Do not break before spaces or zero width space.
+
+LB7.1: [^ZW SP] CM* [SP ZW];
+LB7.2: [ZW SP] [SP ZW];
+
+# LB8a
+# ZWJ x
+# Don't match a CM on the right - let other rules pick up CM sequences, where
+# the ZWJ behaves as just another generic CM.
+LB8a: ZWJ [^CM];
+
+
+# LB9: X CM -> X
+# LB10: Unattached CM -> AL
+
+#LB11: × WJ;
+# WJ ×
+
+LB11.1: [^SP] CM* WJ;
+LB11.2: SP WJ;
+LB11.3: WJ CM* [^CM];
+
+LB12: GL CM* [^CM];
+
+LB12a: [^SP BA HY] CM* GL;
+
+# LB 13 Do not break before ‘]’ or ‘!’ or ‘/’, even after spaces.
+LB13.1: [^SP] CM* [CL CP EX SY];
+LB13.2: SP [CL CP EX SY];
+
+# LB 14-17 are moved above LB 7.
+
+LB18: SP ÷;
+
+LB19: . CM* QU;
+LB19.1: QU CM* [^CM];
+
+# LB 20 Break before and after CB.
+# Interaction with LB8a: ZWJ x . is tricky because CM includes ZWJ.
+# ZWJ acts like a CM to the left, combining with CB.
+# ZWJ acts independently to the right, no break after by LB8a.
+LB20.1: . CM* ZWJ CB;
+LB20.2: . CM* ÷ CB;
+
+LB20.3: CB CM* ZWJ [^CM];
+LB20.4: CB CM* ÷;
+
+# LB 20.09 Don't break between Hyphens and Letters when there is a break preceding the hyphen.
+LB20.09: ^(HY | HH) CM* AL;
+
+# Note: Rule 21a must come before 21 to prevent 21.1 from matching HL BA, then
+# not picking up the continuing match after the BA from 21a.
+LB21a: HL CM* (HY | BA) CM* [^CM CB];
+
+LB21.1: . CM* [BA HY NS];
+LB21.2: BB CM* [^CM CB];
+
+LB21b: SY CM* HL;
+
+LB22.1: (AL | HL | CM) CM* IN; # The CM is from LB10, treat an unattached CM as AL.
+LB22.2: EX CM* IN;
+LB22.3: (ID | EB | EM) CM* IN;
+LB22.4: IN CM* IN;
+LB22.5: NU CM* IN;
+
+LB23.1: (AL | HL | CM) CM* NU;
+LB23.2: NU CM* (AL | HL);
+
+LB23a.1: PR CM* (ID | EB | EM);
+LB23a.2: (ID | EB | EM) CM* PO;
+
+LB24.2: (PR | PO) CM* (AL | HL);
+LB24.3: (AL | HL | CM) CM* (PR | PO);
+
+
+LB26.1: JL CM* (JL | JV | H2 | H3);
+LB26.2: (JV | H2) CM* (JV | JT);
+LB26.3: (JT | H3) CM* JT;
+
+LB27.1: (JL | JV | JT | H2 | H3) CM* IN;
+LB27.2: (JL | JV | JT | H2 | H3) CM* PO;
+LB27.3: PR CM* (JL | JV | JT | H2 | H3);
+
+# LB28 Do not break between Alphabetics.
+# Unattached (leading) CM treated as AL.
+LB28: (AL | HL | CM)CM* (AL | HL);
+
+LB29: IS CM* (AL | HL);
+
+# LB30 is adjusted for unattached leading CM being treated as AL.
+LB30.1: (AL | CM | HL | NU) CM* OP;
+LB30.2: CP CM* (AL | HL | NU);
+
+# LB30a keep pairs of RI together.
+LB30a.1: RI CM* RI ÷ [^BK CR LF NL SP ZW WJ CL CP EX IS SY GL QU BA HY NS CM];
+LB30a.2: RI CM* RI CM* CMS ÷ [^BK CR LF NL SP ZW WJ CL CP EX IS SY GL QU BA HY NS CM];
+LB30a.3: RI CM* RI CM* [BK CR LF NL SP ZW WJ GL CL CP EX IS SY QU BA HY NS ZWJ]?;
+
+# LB30b Do not break between Emoji Base and Emoji Modifier
+LB30b: EB CM* EM;
+
+# LB31 Break Everywhere Else.
+# Include combining marks
+LB31.1: . CM* ZWJ [^CM];
+LB31.2: . CM* ÷;
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_loose.txt b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_loose.txt
index 8395192365f..86eb170c46e 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_loose.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_loose.txt
@@ -86,19 +86,33 @@ LB5.3: NL ÷;
LB6: . (BK | CR | LF | NL);
LB6.1: [^BK CR LF NL SP ZW] CM* (BK | CR | LF | NL);
+# LB8 break after ZW SP*.
+# Precedes LB7 because both rules will match the sequences like ZW SP,
+# and LB8 must take precedence.
+
+LB8: ZW SP* ÷ [^ZW SP BK CR LF NL];
+
+# Numbers. Equivalent to Tailoring example 8 from UAX 14.
+# Moved up, before LB14, because it can match longer sequences which must take precedence.
+LB25: ((PR | PO)CM*)? ((OP | HY)CM*)? (IS CM*)? NU (CM*(NU | SY | IS))* (CM*(CL | CP))? (CM*(PR | PO))?;
+
# Rules LB14 - LB17.
-# Moved before LB7, because they can match a longer sequence that would also match LB7,
-# for example, the sequence "OP CM SP AL" matches LB14 while the prefix of it,
-# "while only the prefix "OP CM SP" matches LB7.1
+# Moved up, before LB7, because they can match a longer sequence that would also match LB7.
+# For example, the sequence "OP CM SP AL" matches LB14
+# while the prefix of it, "OP CM SP" matches LB7.1
LB14: OP CM* SP* .;
+
+# LB 14a Break before an IS that begins a number and follows a space.
+LB14a: SP ÷ IS CM* NU;
+
+# LB14b × IS
+LB14b.1: [^SP] CM* IS;
+LB14b.2: SP IS;
+
LB15: QU CM* SP* OP;
LB16: (CL | CP)CM* SP* NS;
LB17: B2 CM* SP* B2;
-# LB8, break after ZW SP*, precedes LB7 because they will both match the sequences like ZW SP,
-# and LB8 should take precedence.
-
-LB8: ZW SP* ÷ [^ZW SP BK CR LF NL];
# LB7 Do not break before spaces or zero width space.
@@ -126,15 +140,9 @@ LB12: GL CM* [^CM];
LB12a: [^SP BA HY] CM* GL;
-# LB 13 ICU Tailoring, matches tailoring example 8 from UAX 14.
-#
-# LB13.1 [^SP] CM* [CL CP EX IS SY] # original UAX 14 rule.
-# LB13.2 SP CM* [CL CP EX IS SY]
-
-LB13.1: [^NU SP] CM* [CL CP IS SY];
-LB13.2: [^SP] CM* EX;
-LB13.2: SP [CL CP EX IS SY];
-
+# LB 13 Do not break before ‘]’ or ‘!’ or ‘/’, even after spaces.
+LB13.1: [^SP] CM* [CL CP EX SY];
+LB13.2: SP [CL CP EX SY];
# LB 14-17 are moved above LB 7.
@@ -180,8 +188,6 @@ LB23a.2: (ID | EB | EM) CM* PO;
LB24.2: (PR | PO) CM* (AL | HL);
LB24.3: (AL | HL | CM) CM* (PR | PO);
-# Numbers. Equivalent to Tailoring example 8 from UAX 14.
-LB25: ((PR | PO)CM*)? ((OP | HY)CM*)? NU (CM*(NU | SY | IS))* (CM*(CL | CP))? (CM*(PR | PO))?;
LB26.1: JL CM* (JL | JV | H2 | H3);
LB26.2: (JV | H2) CM* (JV | JT);
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_loose_cj.txt b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_loose_cj.txt
index d674327102b..049ecd017a3 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_loose_cj.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_loose_cj.txt
@@ -30,6 +30,7 @@
# this includes: 00B0 2030 2032 2033 2035 2103 2109 FE6A FF05 FFE0
# * after prefix characters with LineBreak class PR and EastAsianWidth A,F,W;
# this includes: 00A4 00B1 20AC 2116 FE69 FF04 FFE1 FFE5 FFE6
+# It allows breaking before 201C and after 201D, for zh_Hans, zh_Hant, and ja.
type = line;
@@ -46,7 +47,7 @@ BK = [:LineBreak = Mandatory_Break:];
B2 = [:LineBreak = Break_Both:];
CB = [:LineBreak = Contingent_Break:];
CJ = [:LineBreak = Conditional_Japanese_Starter:];
-CL = [:LineBreak = Close_Punctuation:];
+CL = [[:LineBreak = Close_Punctuation:] \u201d];
CMS = [:LineBreak = Combining_Mark:];
CP = [:LineBreak = Close_Parenthesis:];
CR = [:LineBreak = Carriage_Return:];
@@ -70,12 +71,12 @@ NL = [:LineBreak = Next_Line:];
NSX = [\u301C \u30A0 \u3005 \u303B \u309D \u309E \u30FD \u30FE \u203C \u2047 \u2048 \u2049 \u30FB \uFF1A \uFF1B \uFF65];
NS = [[:LineBreak = Nonstarter:] - NSX];
NU = [:LineBreak = Numeric:];
-OP = [:LineBreak = Open_Punctuation:];
+OP = [[:LineBreak = Open_Punctuation:] \u201c];
POX = [\u00B0 \u2030 \u2032 \u2033 \u2035 \u2103 \u2109 \uFE6A \uFF05 \uFFE0];
PO = [[:LineBreak = Postfix_Numeric:] - POX];
PRX = [\u00A4 \u00B1 \u20AC \u2116 \uFE69 \uFF04 \uFFE1 \uFFE5 \uFFE6];
PR = [[:LineBreak = Prefix_Numeric:] - PRX];
-QU = [:LineBreak = Quotation:];
+QU = [[:LineBreak = Quotation:] - [\u201c\u201d]];
RI = [:LineBreak = Regional_Indicator:];
SA = [:LineBreak = Complex_Context:];
SG = [:LineBreak = Surrogate:];
@@ -103,19 +104,34 @@ LB5.3: NL ÷;
LB6: . (BK | CR | LF | NL);
LB6.1: [^BK CR LF NL SP ZW] CM* (BK | CR | LF | NL);
+# LB8 break after ZW SP*.
+# Precedes LB7 because both rules will match the sequences like ZW SP,
+# and LB8 must take precedence.
+
+LB8: ZW SP* ÷ [^ZW SP BK CR LF NL];
+
+# Numbers. Equivalent to Tailoring example 8 from UAX 14.
+# Moved up, before LB14, because it can match longer sequences which must take precedence.
+# Loose_cj tailoring: do not include $PRX at the beginning or $POX at the end.
+LB25: ((PR | PO | POX)CM*)? ((OP | HY)CM*)? (IS CM*)? NU (CM*(NU | SY | IS))* (CM*(CL | CP))? (CM*(PR | PRX | PO))?;
+
# Rules LB14 - LB17.
-# Moved before LB7, because they can match a longer sequence that would also match LB7,
-# for example, the sequence "OP CM SP AL" matches LB14 while the prefix of it,
-# "while only the prefix "OP CM SP" matches LB7.1
+# Moved up, before LB7, because they can match a longer sequence that would also match LB7.
+# For example, the sequence "OP CM SP AL" matches LB14
+# while the prefix of it, "OP CM SP" matches LB7.1
LB14: OP CM* SP* .;
+
+# LB 14a Break before an IS that begins a number and follows a space.
+LB14a: SP ÷ IS CM* NU;
+
+# LB14b × IS
+LB14b.1: [^SP] CM* IS;
+LB14b.2: SP IS;
+
LB15: QU CM* SP* OP;
LB16: (CL | CP)CM* SP* NS;
LB17: B2 CM* SP* B2;
-# LB8, break after ZW SP*, precedes LB7 because they will both match the sequences like ZW SP,
-# and LB8 should take precedence.
-
-LB8: ZW SP* ÷ [^ZW SP BK CR LF NL];
# LB7 Do not break before spaces or zero width space.
@@ -143,14 +159,9 @@ LB12: GL CM* [^CM];
LB12a: [^SP BA BAX HY] CM* GL;
-# LB 13 ICU Tailoring, matches tailoring exmaple 8 from UAX 14.
-#
-# LB13.1 [^SP] CM* [CL CP EX IS SY] # original UAX 14 rule.
-# LB13.2 SP CM* [CL CP EX IS SY]
-
-LB13.1: [^NU SP] CM* [CL CP IS SY];
-LB13.2: [^SP] CM* EX;
-LB13.2: SP [CL CP EX IS SY];
+# LB 13 Do not break before ‘]’ or ‘!’ or ‘/’, even after spaces.
+LB13.1: [^SP] CM* [CL CP EX SY];
+LB13.2: SP [CL CP EX SY];
# LB 14-17 are moved above LB 7.
@@ -200,9 +211,6 @@ LB23a.2: (ID | EB | EM) CM* PO;
LB24.2: (PR | PO | POX) CM* (AL | HL);
LB24.3: (AL | HL | CM) CM* (PR | PO | POX);
-# Numbers. Equivalent to Tailoring example 8 from UAx 14.
-# Loose_cj tailoring: do not include $PRX at the beginning or $POX at the end.
-LB25: ((PR | PO | POX)CM*)? ((OP | HY)CM*)? NU (CM*(NU | SY | IS))* (CM*(CL | CP))? (CM*(PR | PRX | PO))?;
LB26.1: JL CM* (JL | JV | H2 | H3);
LB26.2: (JV | H2) CM* (JV | JT);
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_normal.txt b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_normal.txt
index 7f5b91c42ab..2cf6e7c1158 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_normal.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_normal.txt
@@ -92,19 +92,33 @@ LB5.3: NL ÷;
LB6: . (BK | CR | LF | NL);
LB6.1: [^BK CR LF NL SP ZW] CM* (BK | CR | LF | NL);
+# LB8 break after ZW SP*.
+# Precedes LB7 because both rules will match the sequences like ZW SP,
+# and LB8 must take precedence.
+
+LB8: ZW SP* ÷ [^ZW SP BK CR LF NL];
+
+# Numbers. Equivalent to Tailoring example 8 from UAX 14.
+# Moved up, before LB14, because it can match longer sequences which must take precedence.
+LB25: ((PR | PO)CM*)? ((OP | HY)CM*)? (IS CM*)? NU (CM*(NU | SY | IS))* (CM*(CL | CP))? (CM*(PR | PO))?;
+
# Rules LB14 - LB17.
-# Moved before LB7, because they can match a longer sequence that would also match LB7,
-# for example, the sequence "OP CM SP AL" matches LB14 while the prefix of it,
-# "while only the prefix "OP CM SP" matches LB7.1
+# Moved up, before LB7, because they can match a longer sequence that would also match LB7.
+# For example, the sequence "OP CM SP AL" matches LB14
+# while the prefix of it, "OP CM SP" matches LB7.1
LB14: OP CM* SP* .;
+
+# LB 14a Break before an IS that begins a number and follows a space.
+LB14a: SP ÷ IS CM* NU;
+
+# LB14b × IS
+LB14b.1: [^SP] CM* IS;
+LB14b.2: SP IS;
+
LB15: QU CM* SP* OP;
LB16: (CL | CP)CM* SP* NS;
LB17: B2 CM* SP* B2;
-# LB8, break after ZW SP*, precedes LB7 because they will both match the sequences like ZW SP,
-# and LB8 should take precedence.
-
-LB8: ZW SP* ÷ [^ZW SP BK CR LF NL];
# LB7 Do not break before spaces or zero width space.
@@ -132,15 +146,9 @@ LB12: GL CM* [^CM];
LB12a: [^SP BA HY] CM* GL;
-# LB 13 ICU Tailoring, matches tailoring exmaple 8 from UAX 14.
-#
-# LB13.1 [^SP] CM* [CL CP EX IS SY] # original UAX 14 rule.
-# LB13.2 SP CM* [CL CP EX IS SY]
-
-LB13.1: [^NU SP] CM* [CL CP IS SY];
-LB13.2: [^SP] CM* EX;
-LB13.2: SP [CL CP EX IS SY];
-
+# LB 13 Do not break before ‘]’ or ‘!’ or ‘/’, even after spaces.
+LB13.1: [^SP] CM* [CL CP EX SY];
+LB13.2: SP [CL CP EX SY];
# LB 14-17 are moved above LB 7.
@@ -186,8 +194,6 @@ LB23a.2: (ID | EB | EM) CM* PO;
LB24.2: (PR | PO) CM* (AL | HL);
LB24.3: (AL | HL | CM) CM* (PR | PO);
-# Numbers. Equivalent to Tailoring example 8 from UAx 14.
-LB25: ((PR | PO)CM*)? ((OP | HY)CM*)? NU (CM*(NU | SY | IS))* (CM*(CL | CP))? (CM*(PR | PO))?;
LB26.1: JL CM* (JL | JV | H2 | H3);
LB26.2: (JV | H2) CM* (JV | JT);
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_normal_cj.txt b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_normal_cj.txt
index cf90751715c..57139f4b231 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_normal_cj.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_normal_cj.txt
@@ -26,6 +26,7 @@
# It sets characters of class CJ to behave like ID.
# In addition, it allows breaks:
# * before hyphens 2010 & 2013 (both BA) and 301C, 30A0 (both NS)
+# It allows breaking before 201C and after 201D, for zh_Hans, zh_Hant, and ja.
type = line;
locale = ja@lb=normal;
@@ -40,7 +41,7 @@ BK = [:LineBreak = Mandatory_Break:];
B2 = [:LineBreak = Break_Both:];
CB = [:LineBreak = Contingent_Break:];
CJ = [:LineBreak = Conditional_Japanese_Starter:];
-CL = [:LineBreak = Close_Punctuation:];
+CL = [[:LineBreak = Close_Punctuation:] \u201d];
CMS = [:LineBreak = Combining_Mark:];
CP = [:LineBreak = Close_Parenthesis:];
CR = [:LineBreak = Carriage_Return:];
@@ -63,10 +64,10 @@ NL = [:LineBreak = Next_Line:];
NSX = [\u301C \u30A0];
NS = [[:LineBreak = Nonstarter:] - NSX];
NU = [:LineBreak = Numeric:];
-OP = [:LineBreak = Open_Punctuation:];
+OP = [[:LineBreak = Open_Punctuation:] \u201c];
PO = [:LineBreak = Postfix_Numeric:];
PR = [:LineBreak = Prefix_Numeric:];
-QU = [:LineBreak = Quotation:];
+QU = [[:LineBreak = Quotation:] - [\u201c\u201d]];
RI = [:LineBreak = Regional_Indicator:];
SA = [:LineBreak = Complex_Context:];
SG = [:LineBreak = Surrogate:];
@@ -94,11 +95,29 @@ LB5.3: NL ÷;
LB6: . (BK | CR | LF | NL);
LB6.1: [^BK CR LF NL SP ZW] CM* (BK | CR | LF | NL);
+# LB8 break after ZW SP*.
+# Precedes LB7 because both rules will match the sequences like ZW SP,
+# and LB8 must take precedence.
+
+LB8: ZW SP* ÷ [^ZW SP BK CR LF NL];
+
+# Numbers. Equivalent to Tailoring example 8 from UAX 14.
+# Moved up, before LB14, because it can match longer sequences which must take precedence.
+LB25: ((PR | PO)CM*)? ((OP | HY)CM*)? (IS CM*)? NU (CM*(NU | SY | IS))* (CM*(CL | CP))? (CM*(PR | PO))?;
+
# Rules LB14 - LB17.
-# Moved before LB7, because they can match a longer sequence that would also match LB7,
-# for example, the sequence "OP CM SP AL" matches LB14 while the prefix of it,
-# "while only the prefix "OP CM SP" matches LB7.1
+# Moved up, before LB7, because they can match a longer sequence that would also match LB7.
+# For example, the sequence "OP CM SP AL" matches LB14
+# while the prefix of it, "OP CM SP" matches LB7.1
LB14: OP CM* SP* .;
+
+# LB 14a Break before an IS that begins a number and follows a space.
+LB14a: SP ÷ IS CM* NU;
+
+# LB14b × IS
+LB14b.1: [^SP] CM* IS;
+LB14b.2: SP IS;
+
LB15: QU CM* SP* OP;
# Do not break between closing punctuation and $NS, even with intervening spaces
@@ -106,11 +125,6 @@ LB15: QU CM* SP* OP;
LB16: (CL | CP)CM* SP* NS;
LB17: B2 CM* SP* B2;
-# LB8, break after ZW SP*, precedes LB7 because they will both match the sequences like ZW SP,
-# and LB8 should take precedence.
-
-LB8: ZW SP* ÷ [^ZW SP BK CR LF NL];
-
# LB7 Do not break before spaces or zero width space.
LB7.1: [^ZW SP] CM* [SP ZW];
@@ -137,15 +151,9 @@ LB12: GL CM* [^CM];
LB12a: [^SP BA BAX HY] CM* GL;
-# LB 13 ICU Tailoring, matches tailoring exmaple 8 from UAX 14.
-#
-# LB13.1 [^SP] CM* [CL CP EX IS SY] # original UAX 14 rule.
-# LB13.2 SP CM* [CL CP EX IS SY]
-
-LB13.1: [^NU SP] CM* [CL CP IS SY];
-LB13.2: [^SP] CM* EX;
-LB13.2: SP [CL CP EX IS SY];
-
+# LB 13 Do not break before ‘]’ or ‘!’ or ‘/’, even after spaces.
+LB13.1: [^SP] CM* [CL CP EX SY];
+LB13.2: SP [CL CP EX SY];
# LB 14-17 are moved above LB 7.
@@ -195,9 +203,6 @@ LB23a.2: (ID | EB | EM) CM* PO;
LB24.2: (PR | PO) CM* (AL | HL);
LB24.3: (AL | HL | CM) CM* (PR | PO);
-# Numbers. Equivalent to Tailoring example 8 from UAx 14.
-LB25: ((PR | PO)CM*)? ((OP | HY)CM*)? NU (CM*(NU | SY | IS))* (CM*(CL | CP))? (CM*(PR | PO))?;
-
LB26.1: JL CM* (JL | JV | H2 | H3);
LB26.2: (JV | H2) CM* (JV | JT);
LB26.3: (JT | H3) CM* JT;
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/readme.txt b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/readme.txt
deleted file mode 100644
index 52d54a0f3d6..00000000000
--- a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/readme.txt
+++ /dev/null
@@ -1,76 +0,0 @@
-file: testdata/break_rules/readme.txt
-Copyright (C) 2016 and later: Unicode, Inc. and others.
-License & terms of use: http://www.unicode.org/copyright.html#License
-
-Copyright (c) 2015-2016, International Business Machines Corporation and others. All Rights Reserved.
-
-This directory contains the break iterator reference rule files used by intltest rbbi/RBBIMonkeyTest/testMonkey.
-The rules in this directory track the boundary rules from Unicode UAX 14 and 29. They are interpreted
-to provide an expected set of boundary positions to compare with the results from ICU break iteration.
-
-ICU4J also includes copies of the test reference rules, located in the directory
-main/tests/core/src/com/ibm/icu/dev/test/rbbi/break_rules/
-The copies should be kept synchronized; there should be no differences.
-
-Each set of reference break rules lives in a separate file.
-The list of rule files to run by default is hard coded into the test code, in rbbimonkeytest.cpp.
-
-Each test file includes
- - The type of ICU break iterator to create (word, line, sentence, etc.)
- - The locale to use
- - Character Class definitions
- - Rule definitions
-
-To Do
- - Extend the syntax to support rule tailoring.
-
-
-Character Class Definition:
- name = set_regular_expression;
-
-Rule Definition:
- rule_regular_expression;
-
-name:
- [A-Za-z_][A-Za-z0-9_]*
-
-set_regular_expression:
- The intersection of an ICU regular expression [set] expression and a UnicodeSet pattern.
- (They are mostly the same)
- May include previously defined set names, which are logically expanded in-place.
-
-rule_regular_expression:
- An ICU Regular Expression.
- May include set names, which are logically expanded in-place.
- May include a '÷', which defines a boundary position.
-
-Application of the rules:
- Matching begins at the start of text, or after a previously identified boundary.
- The pseudo-code below finds the next boundary.
-
- while position < end of text
- for each rule
- if the text at position matches this rule
- if the rule has a '÷'
- Boundary is found.
- return the position of the '÷' within the match.
- else
- position = last character of the rule match.
- break from the inner rule loop, continue the outer loop.
-
- This differs from the Unicode UAX algorithm in that each position in the text is
- not tested separately. Instead, when a rule match is found, rule application restarts with the last
- character of the preceding rule match. ICU's break rules also operate this way.
-
- Expressing rules this way simplifies UAX rules that have leading or trailing context; it
- is no longer necessary to write expressions that match the context starting from
- any position within it.
-
- This rule form differs from ICU rules in that the rules are applied sequentially, as they
- are with the Unicode UAX rules. With the main ICU break rules, all are applied in parallel.
-
-Word Dictionaries
- The monkey test does not test dictionary based breaking. The set named 'dictionary' is special,
- as it is in the main ICU rules. For the monkey test, no characters from the dictionary set are
- included in the randomly-generated test data.
-
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/word.txt b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/word.txt
index fc7bc9b1886..9b3e527ee72 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/word.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/word.txt
@@ -30,7 +30,7 @@ Double_Quote = [\p{Word_Break = Double_Quote}];
MidNumLet = [\p{Word_Break = MidNumLet}];
MidLetter = [\p{Word_Break = MidLetter}];
MidNum = [\p{Word_Break = MidNum}];
-Numeric = [\p{Word_Break = Numeric}];
+Numeric = [[\p{Word_Break = Numeric}] [\uFF10-\uff19]]; # Patch for ICU-12079;
ExtendNumLet = [\p{Word_Break = ExtendNumLet}];
WSegSpace = [\p{Word_Break = WSegSpace}];
Extended_Pict = [:ExtPict:];
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/word_POSIX.txt b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/word_POSIX.txt
index 10efc32d210..04bcb321ae9 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/word_POSIX.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/word_POSIX.txt
@@ -29,7 +29,7 @@ Double_Quote = [\p{Word_Break = Double_Quote}];
MidNumLet = [\p{Word_Break = MidNumLet} - [.]];
MidLetter = [\p{Word_Break = MidLetter} - [\:]];
MidNum = [\p{Word_Break = MidNum} [.]];
-Numeric = [\p{Word_Break = Numeric}];
+Numeric = [[\p{Word_Break = Numeric}] [\uFF10-\uff19]]; # Patch for ICU-12079;
ExtendNumLet = [\p{Word_Break = ExtendNumLet}];
WSegSpace = [\p{Word_Break = WSegSpace}];
Extended_Pict = [:ExtPict:];
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/filters/filtertest.txt b/Build/source/libs/icu/icu-src/source/test/testdata/filters/filtertest.txt
new file mode 100644
index 00000000000..f884dd124cd
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/filters/filtertest.txt
@@ -0,0 +1,13 @@
+# Copyright (C) 2018 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+-/
+-/alabama
++/alabama/alaska/arizona
+-/fornia/illinois
+-/mississippi
++/mississippi/michigan
++/mississippi/*/maine
+-/mississippi/*/iowa
++/mississippi/louisiana/iowa
++/northCarolina
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/filtertest.txt b/Build/source/libs/icu/icu-src/source/test/testdata/filtertest.txt
new file mode 100644
index 00000000000..1fbc71c01ec
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/filtertest.txt
@@ -0,0 +1,40 @@
+// Copyright (C) 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+filtertest {
+ alabama {
+ alaska {
+ arizona {"arkansas"}
+ california {"colorado"}
+ }
+ connecticut {
+ arizona {"delaware"}
+ california {"florida"}
+ }
+ }
+ // test suffixes
+ fornia {
+ hawaii {"idaho"}
+ illinois {"indiana"}
+ }
+ mississippi {
+ louisiana {
+ maine {"maryland"}
+ iowa {"kansas"}
+ missouri {"montana"}
+ }
+ michigan {
+ maine {"minnesota"}
+ iowa {"kentucky"}
+ missouri {"nebraska"}
+ }
+ nevada {
+ maine {"new-hampshire"}
+ iowa {"new-mexico"}
+ missouri {"new-york"}
+ }
+ }
+ northCarolina {
+ northDakota {"west-virginia"}
+ }
+}
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/format.txt b/Build/source/libs/icu/icu-src/source/test/testdata/format.txt
index 18bacecee5b..02add1b96d6 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/format.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/format.txt
@@ -489,41 +489,41 @@ format:table(nofallback) {
},
// Japanese
- {
- "en_US@calendar=japanese",
- "",
- "PATTERN=G y",
- "YEAR=8",
- "Heisei 8"
- },
- {
- "en_US@calendar=japanese",
- "",
- "PATTERN=G yy",
- "YEAR=8",
- "Heisei 08"
- },
- {
- "en_US@calendar=japanese",
- "",
- "PATTERN=G yyy",
- "YEAR=8",
- "Heisei 008"
- },
- {
- "en_US@calendar=japanese",
- "",
- "PATTERN=G yyyy",
- "YEAR=8",
- "Heisei 0008"
- },
- {
- "en_US@calendar=japanese",
- "",
- "PATTERN=G yyyyy",
- "YEAR=8",
- "Heisei 00008"
- },
+// {
+// "en_US@calendar=japanese",
+// "",
+// "PATTERN=G y",
+// "YEAR=8",
+// "Heisei 8"
+// },
+// {
+// "en_US@calendar=japanese",
+// "",
+// "PATTERN=G yy",
+// "YEAR=8",
+// "Heisei 08"
+// },
+// {
+// "en_US@calendar=japanese",
+// "",
+// "PATTERN=G yyy",
+// "YEAR=8",
+// "Heisei 008"
+// },
+// {
+// "en_US@calendar=japanese",
+// "",
+// "PATTERN=G yyyy",
+// "YEAR=8",
+// "Heisei 0008"
+// },
+// {
+// "en_US@calendar=japanese",
+// "",
+// "PATTERN=G yyyyy",
+// "YEAR=8",
+// "Heisei 00008"
+// },
}
}
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/localeMatcherTest.txt b/Build/source/libs/icu/icu-src/source/test/testdata/localeMatcherTest.txt
new file mode 100644
index 00000000000..21c9b601410
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/localeMatcherTest.txt
@@ -0,0 +1,1959 @@
+# © 2017 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html#License
+#
+# Data-driven test for the language/locale matcher.
+# Format:
+#
+# Everything after "#" is a comment.
+# ** test: This line starts a group of test cases.
+#
+# Lines starting with an '@' sign provide matcher parameters.
+# @supported=<comma-separated supported languages>
+# @default=<default language> # no value = no explicit default
+# @favor=[normal|script] # no value = no explicit setting
+# @threshold=<number 0..100> # no value = no explicit setting
+#
+# A line with ">>" is a getBestMatch() test case:
+# <comma-separated desired languages> >> match | desired | combined
+# - match is the expected best supported language
+# - desired is the expected best desired language
+# - combined is the expected result of combine(match, desired)
+# An expected language can be "null" to check for the matcher returning null.
+# An empty or omitted value is not tested. (Omitted = not even the '|' separator.)
+#
+# ** test: A new test group resets all matcher parameters.
+
+## X
+
+** test: testParentLocales
+
+# es-419, es-AR, and es-MX are in a cluster; es is in a different one
+
+@supported=es-419, es-ES
+es-AR >> es-419
+@supported=es-ES, es-419
+es-AR >> es-419
+
+@supported=es-419, es
+es-AR >> es-419
+@supported=es, es-419
+es-AR >> es-419
+
+@supported=es-MX, es
+es-AR >> es-MX
+@supported=es, es-MX
+es-AR >> es-MX
+
+# en-GB, en-AU, and en-NZ are in a cluster; en in a different one
+
+@supported=en-GB, en-US
+en-AU >> en-GB
+@supported=en-US, en-GB
+en-AU >> en-GB
+
+@supported=en-GB, en
+en-AU >> en-GB
+@supported=en, en-GB
+en-AU >> en-GB
+
+@supported=en-NZ, en-US
+en-AU >> en-NZ
+@supported=en-US, en-NZ
+en-AU >> en-NZ
+
+@supported=en-NZ, en
+en-AU >> en-NZ
+@supported=en, en-NZ
+en-AU >> en-NZ
+
+# pt-AU and pt-PT in one cluster; pt-BR in another
+
+@supported=pt-PT, pt-BR
+pt-AO >> pt-PT
+@supported=pt-BR, pt-PT
+pt-AO >> pt-PT
+
+@supported=pt-PT, pt
+pt-AO >> pt-PT
+@supported=pt, pt-PT
+pt-AO >> pt-PT
+
+@supported=zh-MO, zh-TW
+zh-HK >> zh-MO
+@supported=zh-TW, zh-MO
+zh-HK >> zh-MO
+
+@supported=zh-MO, zh-CN
+zh-HK >> zh-MO
+@supported=zh-CN, zh-MO
+zh-HK >> zh-MO
+
+@supported=zh-MO, zh
+zh-HK >> zh-MO
+@supported=zh, zh-MO
+zh-HK >> zh-MO
+
+@favor=script
+@supported=es-419, es-ES
+es-AR >> es-419
+@supported=es-ES, es-419
+es-AR >> es-419
+@supported=es-419, es
+es-AR >> es-419
+@supported=es, es-419
+es-AR >> es-419
+@supported=es-MX, es
+es-AR >> es-MX
+@supported=es, es-MX
+es-AR >> es-MX
+@supported=en-GB, en-US
+en-AU >> en-GB
+@supported=en-US, en-GB
+en-AU >> en-GB
+@supported=en-GB, en
+en-AU >> en-GB
+@supported=en, en-GB
+en-AU >> en-GB
+@supported=en-NZ, en-US
+en-AU >> en-NZ
+@supported=en-US, en-NZ
+en-AU >> en-NZ
+@supported=en-NZ, en
+en-AU >> en-NZ
+@supported=en, en-NZ
+en-AU >> en-NZ
+@supported=pt-PT, pt-BR
+pt-AO >> pt-PT
+@supported=pt-BR, pt-PT
+pt-AO >> pt-PT
+@supported=pt-PT, pt
+pt-AO >> pt-PT
+@supported=pt, pt-PT
+pt-AO >> pt-PT
+@supported=zh-MO, zh-TW
+zh-HK >> zh-MO
+@supported=zh-TW, zh-MO
+zh-HK >> zh-MO
+@supported=zh-MO, zh-CN
+zh-HK >> zh-MO
+@supported=zh-CN, zh-MO
+zh-HK >> zh-MO
+@supported=zh-MO, zh
+zh-HK >> zh-MO
+@supported=zh, zh-MO
+zh-HK >> zh-MO
+
+** test: testChinese
+
+@supported=zh-CN, zh-TW, iw
+zh-Hant-TW >> zh-TW
+zh-Hant >> zh-TW
+zh-TW >> zh-TW
+zh-Hans-CN >> zh-CN
+zh-CN >> zh-CN
+zh >> zh-CN
+
+@favor=script
+zh-Hant-TW >> zh-TW
+zh-Hant >> zh-TW
+zh-TW >> zh-TW
+zh-Hans-CN >> zh-CN
+zh-CN >> zh-CN
+zh >> zh-CN
+
+** test: testenGB
+
+@supported=fr, en, en-GB, es-419, es-MX, es
+en-NZ >> en-GB
+es-ES >> es
+es-AR >> es-419
+es-MX >> es-MX
+
+@favor=script
+en-NZ >> en-GB
+es-ES >> es
+es-AR >> es-419
+es-MX >> es-MX
+
+** test: testFallbacks
+
+@supported=91, en, hi
+sa >> hi
+
+@favor=script
+sa >> hi
+
+** test: testBasics
+
+@supported=fr, en-GB, en
+en-GB >> en-GB
+en >> en
+fr >> fr
+ja >> fr # return first if no match
+
+@favor=script
+en-GB >> en-GB
+en >> en
+fr >> fr
+ja >> fr
+
+** test: testFallback
+
+# check that script fallbacks are handled right
+
+@supported=zh-CN, zh-TW, iw
+zh-Hant >> zh-TW
+zh >> zh-CN
+zh-Hans-CN >> zh-CN
+zh-Hant-HK >> zh-TW
+he-IT >> iw
+
+@favor=script
+zh-Hant >> zh-TW
+zh >> zh-CN
+zh-Hans-CN >> zh-CN
+zh-Hant-HK >> zh-TW
+he-IT >> iw
+
+** test: testSpecials
+
+# check that nearby languages are handled
+
+@supported=en, fil, ro, nn
+tl >> fil
+mo >> ro
+nb >> nn
+
+# make sure default works
+
+ja >> en
+
+@favor=script
+tl >> fil
+mo >> ro
+nb >> nn
+ja >> en
+
+** test: testRegionalSpecials
+
+# verify that en-AU is closer to en-GB than to en (which is en-US)
+
+@supported=en, en-GB, es, es-419
+es-MX >> es-419
+en-AU >> en-GB
+es-ES >> es
+
+@favor=script
+es-MX >> es-419
+en-AU >> en-GB
+es-ES >> es
+
+** test: testHK
+
+# HK and MO are closer to each other for Hant than to TW
+
+@supported=zh, zh-TW, zh-MO
+zh-HK >> zh-MO
+@supported=zh, zh-TW, zh-HK
+zh-MO >> zh-HK
+
+@favor=script
+@supported=zh, zh-TW, zh-MO
+zh-HK >> zh-MO
+@supported=zh, zh-TW, zh-HK
+zh-MO >> zh-HK
+
+** test: testMatch-matchOnMazimized
+
+@supported=zh, zh-Hant
+und-TW >> zh-Hant # und-TW should be closer to zh-Hant than to zh
+
+@supported=en-Hant-TW, und-TW
+zh-Hant >> und-TW # zh-Hant should be closer to und-TW than to en-Hant-TW
+zh >> und-TW # zh should be closer to und-TW than to en-Hant-TW
+
+@favor=script
+@supported=zh, zh-Hant
+und-TW >> zh-Hant
+@supported=en-Hant-TW, und-TW
+zh-Hant >> und-TW
+zh >> und-TW
+
+** test: testMatchGrandfatheredCode
+
+@supported=fr, i-klingon, en-Latn-US
+en-GB-oed >> en-Latn-US
+
+@favor=script
+en-GB-oed >> en-Latn-US
+
+** test: testGetBestMatchForList-exactMatch
+@supported=fr, en-GB, ja, es-ES, es-MX
+ja, de >> ja
+
+@favor=script
+ja, de >> ja
+
+** test: testGetBestMatchForList-simpleVariantMatch
+@supported=fr, en-GB, ja, es-ES, es-MX
+de, en-US >> en-GB # Intentionally avoiding a perfect-match or two candidates for variant matches.
+
+# Fallback.
+
+de, zh >> fr
+
+@favor=script
+de, en-US >> en-GB
+de, zh >> fr
+
+** test: testGetBestMatchForList-matchOnMaximized
+# Check that if the preference is maximized already, it works as well.
+
+@supported=en, ja
+ja-Jpan-JP, en-AU >> ja # Match for ja-Jpan-JP (maximized already)
+
+# ja-JP matches ja on likely subtags, and it's listed first, thus it wins over the second preference en-GB.
+
+ja-JP, en-US >> ja # Match for ja-Jpan-JP (maximized already)
+
+# Check that if the preference is maximized already, it works as well.
+
+ja-Jpan-JP, en-US >> ja # Match for ja-Jpan-JP (maximized already)
+
+@favor=script
+ja-Jpan-JP, en-AU >> ja
+ja-JP, en-US >> ja
+ja-Jpan-JP, en-US >> ja
+
+** test: testGetBestMatchForList-noMatchOnMaximized
+# Regression test for http://b/5714572 .
+# de maximizes to de-DE. Pick the exact match for the secondary language instead.
+@supported=en, de, fr, ja
+de-CH, fr >> de
+
+@favor=script
+de-CH, fr >> de
+
+** test: testBestMatchForTraditionalChinese
+
+# Scenario: An application that only supports Simplified Chinese (and some other languages),
+# but does not support Traditional Chinese. zh-Hans-CN could be replaced with zh-CN, zh, or
+# zh-Hans, it wouldn't make much of a difference.
+
+# The script distance (simplified vs. traditional Han) is considered small enough
+# to be an acceptable match. The regional difference is considered almost insignificant.
+
+@supported=fr, zh-Hans-CN, en-US
+zh-TW >> zh-Hans-CN
+zh-Hant >> zh-Hans-CN
+
+# For geopolitical reasons, you might want to avoid a zh-Hant -> zh-Hans match.
+# In this case, if zh-TW, zh-HK or a tag starting with zh-Hant is requested, you can
+# change your call to getBestMatch to include a 2nd language preference.
+# "en" is a better match since its distance to "en-US" is closer than the distance
+# from "zh-TW" to "zh-CN" (script distance).
+
+zh-TW, en >> en-US
+zh-Hant-CN, en >> en-US
+zh-Hans, en >> zh-Hans-CN
+
+@favor=script
+zh-TW >> zh-Hans-CN
+zh-Hant >> zh-Hans-CN
+zh-TW, en >> en-US
+zh-Hant-CN, en >> en-US
+zh-Hans, en >> zh-Hans-CN
+
+** test: testUndefined
+# When the undefined language doesn't match anything in the list,
+# getBestMatch returns the default, as usual.
+
+@supported=it, fr
+und >> it
+
+# When it *does* occur in the list, bestMatch returns it, as expected.
+@supported=it, und
+und >> und
+
+# The unusual part: max("und") = "en-Latn-US", and since matching is based on maximized
+# tags, the undefined language would normally match English. But that would produce the
+# counterintuitive results that getBestMatch("und", XLocaleMatcher("it,en")) would be "en", and
+# getBestMatch("en", XLocaleMatcher("it,und")) would be "und".
+
+# To avoid that, we change the matcher's definitions of max
+# so that max("und")="und". That produces the following, more desirable
+# results:
+
+@supported=it, en
+und >> it
+@supported=it, und
+en >> it
+
+@favor=script
+@supported=it, fr
+und >> it
+@supported=it, und
+und >> und
+@supported=it, en
+und >> it
+@supported=it, und
+en >> it
+
+** test: testGetBestMatch-regionDistance
+
+@supported=es-AR, es
+es-MX >> es-AR
+@supported=fr, en, en-GB
+en-CA >> en-GB
+@supported=de-AT, de-DE, de-CH
+de >> de-DE
+
+@favor=script
+@supported=es-AR, es
+es-MX >> es-AR
+@supported=fr, en, en-GB
+en-CA >> en-GB
+@supported=de-AT, de-DE, de-CH
+de >> de-DE
+
+** test: testAsymmetry
+
+@supported=mul, nl
+af >> nl # af => nl
+@supported=mul, af
+nl >> mul # but nl !=> af
+
+@favor=script
+@supported=mul, nl
+af >> nl
+@supported=mul, af
+nl >> mul
+
+** test: testGetBestMatchForList-matchOnMaximized2
+
+# ja-JP matches ja on likely subtags, and it's listed first, thus it wins over the second preference en-GB.
+
+@supported=fr, en-GB, ja, es-ES, es-MX
+ja-JP, en-GB >> ja # Match for ja-JP, with likely region subtag
+
+# Check that if the preference is maximized already, it works as well.
+
+ja-Jpan-JP, en-GB >> ja # Match for ja-Jpan-JP (maximized already)
+
+@favor=script
+ja-JP, en-GB >> ja
+ja-Jpan-JP, en-GB >> ja
+
+** test: testGetBestMatchForList-closeEnoughMatchOnMaximized
+
+@supported=en-GB, en, de, fr, ja
+de-CH, fr >> de
+en-US, ar, nl, de, ja >> en
+
+@favor=script
+de-CH, fr >> de
+en-US, ar, nl, de, ja >> en
+
+** test: testGetBestMatchForPortuguese
+
+# pt might be supported and not pt-PT
+
+# European user who prefers Spanish over Brazilian Portuguese as a fallback.
+
+@supported=pt-PT, pt-BR, es, es-419
+pt-PT, es, pt >> pt-PT
+@supported=pt-PT, pt, es, es-419
+pt-PT, es, pt >> pt-PT # pt implicit
+
+# Brazilian user who prefers South American Spanish over European Portuguese as a fallback.
+# The asymmetry between this case and above is because it's "pt-PT" that's missing between the
+# matchers as "pt-BR" is a much more common language.
+
+@supported=pt-PT, pt-BR, es, es-419
+pt, es-419, pt-PT >> pt-BR
+pt-PT, es, pt >> pt-PT
+@supported=pt-PT, pt, es, es-419
+pt-PT, es, pt >> pt-PT
+pt, es-419, pt-PT >> pt
+
+@supported=pt-BR, es, es-419
+pt, es-419, pt-PT >> pt-BR
+
+# Code that adds the user's country can get "pt-US" for a user's language.
+# That should fall back to "pt-BR".
+
+@supported=pt-PT, pt-BR, es, es-419
+pt-US, pt-PT >> pt-BR
+@supported=pt-PT, pt, es, es-419
+pt-US, pt-PT, pt >> pt # pt-BR implicit
+
+@favor=script
+@supported=pt-PT, pt-BR, es, es-419
+pt-PT, es, pt >> pt-PT
+@supported=pt-PT, pt, es, es-419
+pt-PT, es, pt >> pt-PT
+
+@supported=pt-PT, pt-BR, es, es-419
+pt, es-419, pt-PT >> pt-BR
+pt-PT, es, pt >> pt-PT
+@supported=pt-PT, pt, es, es-419
+pt-PT, es, pt >> pt-PT
+pt, es-419, pt-PT >> pt
+
+@supported=pt-BR, es, es-419
+pt, es-419, pt-PT >> pt-BR
+
+@supported=pt-PT, pt-BR, es, es-419
+pt-US, pt-PT >> pt-BR
+@supported=pt-PT, pt, es, es-419
+pt-US, pt-PT, pt >> pt
+
+** test: testVariantWithScriptMatch 1 and 2
+
+@supported=fr, en, sv
+en-GB >> en
+@supported=en, sv
+en-GB, sv >> en
+
+@favor=script
+@supported=fr, en, sv
+en-GB >> en
+@supported=en, sv
+en-GB, sv >> en
+
+** test: testLongLists
+
+@supported=en, sv
+sv >> sv
+
+@supported=af, am, ar, az, be, bg, bn, bs, ca, cs, cy, da, de, el, en, en-GB, es, es-419, et, eu, fa, fi, fil, fr, ga, gl, gu, hi, hr, hu, hy, id, is, it, iw, ja, ka, kk, km, kn, ko, ky, lo, lt, lv, mk, ml, mn, mr, ms, my, ne, nl, no, pa, pl, pt, pt-PT, ro, ru, si, sk, sl, sq, sr, sr-Latn, sv, sw, ta, te, th, tr, uk, ur, uz, vi, zh-CN, zh-TW, zu
+sv >> sv
+
+@supported=af, af-NA, af-ZA, agq, agq-CM, ak, ak-GH, am, am-ET, ar, ar-001, ar-AE, ar-BH, ar-DJ, ar-DZ, ar-EG, ar-EH, ar-ER, ar-IL, ar-IQ, ar-JO, ar-KM, ar-KW, ar-LB, ar-LY, ar-MA, ar-MR, ar-OM, ar-PS, ar-QA, ar-SA, ar-SD, ar-SO, ar-SS, ar-SY, ar-TD, ar-TN, ar-YE, as, as-IN, asa, asa-TZ, ast, ast-ES, az, az-Cyrl, az-Cyrl-AZ, az-Latn, az-Latn-AZ, bas, bas-CM, be, be-BY, bem, bem-ZM, bez, bez-TZ, bg, bg-BG, bm, bm-ML, bn, bn-BD, bn-IN, bo, bo-CN, bo-IN, br, br-FR, brx, brx-IN, bs, bs-Cyrl, bs-Cyrl-BA, bs-Latn, bs-Latn-BA, ca, ca-AD, ca-ES, ca-ES-VALENCIA, ca-FR, ca-IT, ce, ce-RU, cgg, cgg-UG, chr, chr-US, ckb, ckb-IQ, ckb-IR, cs, cs-CZ, cu, cu-RU, cy, cy-GB, da, da-DK, da-GL, dav, dav-KE, de, de-AT, de-BE, de-CH, de-DE, de-LI, de-LU, dje, dje-NE, dsb, dsb-DE, dua, dua-CM, dyo, dyo-SN, dz, dz-BT, ebu, ebu-KE, ee, ee-GH, ee-TG, el, el-CY, el-GR, en, en-001, en-150, en-AG, en-AI, en-AS, en-AT, en-AU, en-BB, en-BE, en-BI, en-BM, en-BS, en-BW, en-BZ, en-CA, en-CC, en-CH, en-CK, en-CM, en-CX, en-CY, en-DE, en-DG, en-DK, en-DM, en-ER, en-FI, en-FJ, en-FK, en-FM, en-GB, en-GD, en-GG, en-GH, en-GI, en-GM, en-GU, en-GY, en-HK, en-IE, en-IL, en-IM, en-IN, en-IO, en-JE, en-JM, en-KE, en-KI, en-KN, en-KY, en-LC, en-LR, en-LS, en-MG, en-MH, en-MO, en-MP, en-MS, en-MT, en-MU, en-MW, en-MY, en-NA, en-NF, en-NG, en-NL, en-NR, en-NU, en-NZ, en-PG, en-PH, en-PK, en-PN, en-PR, en-PW, en-RW, en-SB, en-SC, en-SD, en-SE, en-SG, en-SH, en-SI, en-SL, en-SS, en-SX, en-SZ, en-TC, en-TK, en-TO, en-TT, en-TV, en-TZ, en-UG, en-UM, en-US, en-US-POSIX, en-VC, en-VG, en-VI, en-VU, en-WS, en-ZA, en-ZM, en-ZW, eo, eo-001, es, es-419, es-AR, es-BO, es-CL, es-CO, es-CR, es-CU, es-DO, es-EA, es-EC, es-ES, es-GQ, es-GT, es-HN, es-IC, es-MX, es-NI, es-PA, es-PE, es-PH, es-PR, es-PY, es-SV, es-US, es-UY, es-VE, et, et-EE, eu, eu-ES, ewo, ewo-CM, fa, fa-AF, fa-IR, ff, ff-CM, ff-GN, ff-MR, ff-SN, fi, fi-FI, fil, fil-PH, fo, fo-DK, fo-FO, fr, fr-BE, fr-BF, fr-BI, fr-BJ, fr-BL, fr-CA, fr-CD, fr-CF, fr-CG, fr-CH, fr-CI, fr-CM, fr-DJ, fr-DZ, fr-FR, fr-GA, fr-GF, fr-GN, fr-GP, fr-GQ, fr-HT, fr-KM, fr-LU, fr-MA, fr-MC, fr-MF, fr-MG, fr-ML, fr-MQ, fr-MR, fr-MU, fr-NC, fr-NE, fr-PF, fr-PM, fr-RE, fr-RW, fr-SC, fr-SN, fr-SY, fr-TD, fr-TG, fr-TN, fr-VU, fr-WF, fr-YT, fur, fur-IT, fy, fy-NL, ga, ga-IE, gd, gd-GB, gl, gl-ES, gsw, gsw-CH, gsw-FR, gsw-LI, gu, gu-IN, guz, guz-KE, gv, gv-IM, ha, ha-GH, ha-NE, ha-NG, haw, haw-US, he, he-IL, hi, hi-IN, hr, hr-BA, hr-HR, hsb, hsb-DE, hu, hu-HU, hy, hy-AM, id, id-ID, ig, ig-NG, ii, ii-CN, is, is-IS, it, it-CH, it-IT, it-SM, ja, ja-JP, jgo, jgo-CM, jmc, jmc-TZ, ka, ka-GE, kab, kab-DZ, kam, kam-KE, kde, kde-TZ, kea, kea-CV, khq, khq-ML, ki, ki-KE, kk, kk-KZ, kkj, kkj-CM, kl, kl-GL, kln, kln-KE, km, km-KH, kn, kn-IN, ko, ko-KP, ko-KR, kok, kok-IN, ks, ks-IN, ksb, ksb-TZ, ksf, ksf-CM, ksh, ksh-DE, kw, kw-GB, ky, ky-KG, lag, lag-TZ, lb, lb-LU, lg, lg-UG, lkt, lkt-US, ln, ln-AO, ln-CD, ln-CF, ln-CG, lo, lo-LA, lrc, lrc-IQ, lrc-IR, lt, lt-LT, lu, lu-CD, luo, luo-KE, luy, luy-KE, lv, lv-LV, mas, mas-KE, mas-TZ, mer, mer-KE, mfe, mfe-MU, mg, mg-MG, mgh, mgh-MZ, mgo, mgo-CM, mk, mk-MK, ml, ml-IN, mn, mn-MN, mr, mr-IN, ms, ms-BN, ms-MY, ms-SG, mt, mt-MT, mua, mua-CM, my, my-MM, mzn, mzn-IR, naq, naq-NA, nb, nb-NO, nb-SJ, nd, nd-ZW, ne, ne-IN, ne-NP, nl, nl-AW, nl-BE, nl-BQ, nl-CW, nl-NL, nl-SR, nl-SX, nmg, nmg-CM, nn, nn-NO, nnh, nnh-CM, nus, nus-SS, nyn, nyn-UG, om, om-ET, om-KE, or, or-IN, os, os-GE, os-RU, pa, pa-Arab, pa-Arab-PK, pa-Guru, pa-Guru-IN, pl, pl-PL, prg, prg-001, ps, ps-AF, pt, pt-AO, pt-BR, pt-CV, pt-GW, pt-MO, pt-MZ, pt-PT, pt-ST, pt-TL, qu, qu-BO, qu-EC, qu-PE, rm, rm-CH, rn, rn-BI, ro, ro-MD, ro-RO, rof, rof-TZ, root, ru, ru-BY, ru-KG, ru-KZ, ru-MD, ru-RU, ru-UA, rw, rw-RW, rwk, rwk-TZ, sah, sah-RU, saq, saq-KE, sbp, sbp-TZ, se, se-FI, se-NO, se-SE, seh, seh-MZ, ses, ses-ML, sg, sg-CF, shi, shi-Latn, shi-Latn-MA, shi-Tfng, shi-Tfng-MA, si, si-LK, sk, sk-SK, sl, sl-SI, smn, smn-FI, sn, sn-ZW, so, so-DJ, so-ET, so-KE, so-SO, sq, sq-AL, sq-MK, sq-XK, sr, sr-Cyrl, sr-Cyrl-BA, sr-Cyrl-ME, sr-Cyrl-RS, sr-Cyrl-XK, sr-Latn, sr-Latn-BA, sr-Latn-ME, sr-Latn-RS, sr-Latn-XK, sv, sv-AX, sv-FI, sv-SE, sw, sw-CD, sw-KE, sw-TZ, sw-UG, ta, ta-IN, ta-LK, ta-MY, ta-SG, te, te-IN, teo, teo-KE, teo-UG, th, th-TH, ti, ti-ER, ti-ET, tk, tk-TM, to, to-TO, tr, tr-CY, tr-TR, twq, twq-NE, tzm, tzm-MA, ug, ug-CN, uk, uk-UA, ur, ur-IN, ur-PK, uz, uz-Arab, uz-Arab-AF, uz-Cyrl, uz-Cyrl-UZ, uz-Latn, uz-Latn-UZ, vai, vai-Latn, vai-Latn-LR, vai-Vaii, vai-Vaii-LR, vi, vi-VN, vo, vo-001, vun, vun-TZ, wae, wae-CH, xog, xog-UG, yav, yav-CM, yi, yi-001, yo, yo-BJ, yo-NG, zgh, zgh-MA, zh, zh-Hans, zh-Hans-CN, zh-Hans-HK, zh-Hans-MO, zh-Hans-SG, zh-Hant, zh-Hant-HK, zh-Hant-MO, zh-Hant-TW, zu, zu-ZA
+sv >> sv
+
+@favor=script
+@supported=en, sv
+sv >> sv
+
+@supported=af, am, ar, az, be, bg, bn, bs, ca, cs, cy, da, de, el, en, en-GB, es, es-419, et, eu, fa, fi, fil, fr, ga, gl, gu, hi, hr, hu, hy, id, is, it, iw, ja, ka, kk, km, kn, ko, ky, lo, lt, lv, mk, ml, mn, mr, ms, my, ne, nl, no, pa, pl, pt, pt-PT, ro, ru, si, sk, sl, sq, sr, sr-Latn, sv, sw, ta, te, th, tr, uk, ur, uz, vi, zh-CN, zh-TW, zu
+sv >> sv
+
+@supported=af, af-NA, af-ZA, agq, agq-CM, ak, ak-GH, am, am-ET, ar, ar-001, ar-AE, ar-BH, ar-DJ, ar-DZ, ar-EG, ar-EH, ar-ER, ar-IL, ar-IQ, ar-JO, ar-KM, ar-KW, ar-LB, ar-LY, ar-MA, ar-MR, ar-OM, ar-PS, ar-QA, ar-SA, ar-SD, ar-SO, ar-SS, ar-SY, ar-TD, ar-TN, ar-YE, as, as-IN, asa, asa-TZ, ast, ast-ES, az, az-Cyrl, az-Cyrl-AZ, az-Latn, az-Latn-AZ, bas, bas-CM, be, be-BY, bem, bem-ZM, bez, bez-TZ, bg, bg-BG, bm, bm-ML, bn, bn-BD, bn-IN, bo, bo-CN, bo-IN, br, br-FR, brx, brx-IN, bs, bs-Cyrl, bs-Cyrl-BA, bs-Latn, bs-Latn-BA, ca, ca-AD, ca-ES, ca-ES-VALENCIA, ca-FR, ca-IT, ce, ce-RU, cgg, cgg-UG, chr, chr-US, ckb, ckb-IQ, ckb-IR, cs, cs-CZ, cu, cu-RU, cy, cy-GB, da, da-DK, da-GL, dav, dav-KE, de, de-AT, de-BE, de-CH, de-DE, de-LI, de-LU, dje, dje-NE, dsb, dsb-DE, dua, dua-CM, dyo, dyo-SN, dz, dz-BT, ebu, ebu-KE, ee, ee-GH, ee-TG, el, el-CY, el-GR, en, en-001, en-150, en-AG, en-AI, en-AS, en-AT, en-AU, en-BB, en-BE, en-BI, en-BM, en-BS, en-BW, en-BZ, en-CA, en-CC, en-CH, en-CK, en-CM, en-CX, en-CY, en-DE, en-DG, en-DK, en-DM, en-ER, en-FI, en-FJ, en-FK, en-FM, en-GB, en-GD, en-GG, en-GH, en-GI, en-GM, en-GU, en-GY, en-HK, en-IE, en-IL, en-IM, en-IN, en-IO, en-JE, en-JM, en-KE, en-KI, en-KN, en-KY, en-LC, en-LR, en-LS, en-MG, en-MH, en-MO, en-MP, en-MS, en-MT, en-MU, en-MW, en-MY, en-NA, en-NF, en-NG, en-NL, en-NR, en-NU, en-NZ, en-PG, en-PH, en-PK, en-PN, en-PR, en-PW, en-RW, en-SB, en-SC, en-SD, en-SE, en-SG, en-SH, en-SI, en-SL, en-SS, en-SX, en-SZ, en-TC, en-TK, en-TO, en-TT, en-TV, en-TZ, en-UG, en-UM, en-US, en-US-POSIX, en-VC, en-VG, en-VI, en-VU, en-WS, en-ZA, en-ZM, en-ZW, eo, eo-001, es, es-419, es-AR, es-BO, es-CL, es-CO, es-CR, es-CU, es-DO, es-EA, es-EC, es-ES, es-GQ, es-GT, es-HN, es-IC, es-MX, es-NI, es-PA, es-PE, es-PH, es-PR, es-PY, es-SV, es-US, es-UY, es-VE, et, et-EE, eu, eu-ES, ewo, ewo-CM, fa, fa-AF, fa-IR, ff, ff-CM, ff-GN, ff-MR, ff-SN, fi, fi-FI, fil, fil-PH, fo, fo-DK, fo-FO, fr, fr-BE, fr-BF, fr-BI, fr-BJ, fr-BL, fr-CA, fr-CD, fr-CF, fr-CG, fr-CH, fr-CI, fr-CM, fr-DJ, fr-DZ, fr-FR, fr-GA, fr-GF, fr-GN, fr-GP, fr-GQ, fr-HT, fr-KM, fr-LU, fr-MA, fr-MC, fr-MF, fr-MG, fr-ML, fr-MQ, fr-MR, fr-MU, fr-NC, fr-NE, fr-PF, fr-PM, fr-RE, fr-RW, fr-SC, fr-SN, fr-SY, fr-TD, fr-TG, fr-TN, fr-VU, fr-WF, fr-YT, fur, fur-IT, fy, fy-NL, ga, ga-IE, gd, gd-GB, gl, gl-ES, gsw, gsw-CH, gsw-FR, gsw-LI, gu, gu-IN, guz, guz-KE, gv, gv-IM, ha, ha-GH, ha-NE, ha-NG, haw, haw-US, he, he-IL, hi, hi-IN, hr, hr-BA, hr-HR, hsb, hsb-DE, hu, hu-HU, hy, hy-AM, id, id-ID, ig, ig-NG, ii, ii-CN, is, is-IS, it, it-CH, it-IT, it-SM, ja, ja-JP, jgo, jgo-CM, jmc, jmc-TZ, ka, ka-GE, kab, kab-DZ, kam, kam-KE, kde, kde-TZ, kea, kea-CV, khq, khq-ML, ki, ki-KE, kk, kk-KZ, kkj, kkj-CM, kl, kl-GL, kln, kln-KE, km, km-KH, kn, kn-IN, ko, ko-KP, ko-KR, kok, kok-IN, ks, ks-IN, ksb, ksb-TZ, ksf, ksf-CM, ksh, ksh-DE, kw, kw-GB, ky, ky-KG, lag, lag-TZ, lb, lb-LU, lg, lg-UG, lkt, lkt-US, ln, ln-AO, ln-CD, ln-CF, ln-CG, lo, lo-LA, lrc, lrc-IQ, lrc-IR, lt, lt-LT, lu, lu-CD, luo, luo-KE, luy, luy-KE, lv, lv-LV, mas, mas-KE, mas-TZ, mer, mer-KE, mfe, mfe-MU, mg, mg-MG, mgh, mgh-MZ, mgo, mgo-CM, mk, mk-MK, ml, ml-IN, mn, mn-MN, mr, mr-IN, ms, ms-BN, ms-MY, ms-SG, mt, mt-MT, mua, mua-CM, my, my-MM, mzn, mzn-IR, naq, naq-NA, nb, nb-NO, nb-SJ, nd, nd-ZW, ne, ne-IN, ne-NP, nl, nl-AW, nl-BE, nl-BQ, nl-CW, nl-NL, nl-SR, nl-SX, nmg, nmg-CM, nn, nn-NO, nnh, nnh-CM, nus, nus-SS, nyn, nyn-UG, om, om-ET, om-KE, or, or-IN, os, os-GE, os-RU, pa, pa-Arab, pa-Arab-PK, pa-Guru, pa-Guru-IN, pl, pl-PL, prg, prg-001, ps, ps-AF, pt, pt-AO, pt-BR, pt-CV, pt-GW, pt-MO, pt-MZ, pt-PT, pt-ST, pt-TL, qu, qu-BO, qu-EC, qu-PE, rm, rm-CH, rn, rn-BI, ro, ro-MD, ro-RO, rof, rof-TZ, root, ru, ru-BY, ru-KG, ru-KZ, ru-MD, ru-RU, ru-UA, rw, rw-RW, rwk, rwk-TZ, sah, sah-RU, saq, saq-KE, sbp, sbp-TZ, se, se-FI, se-NO, se-SE, seh, seh-MZ, ses, ses-ML, sg, sg-CF, shi, shi-Latn, shi-Latn-MA, shi-Tfng, shi-Tfng-MA, si, si-LK, sk, sk-SK, sl, sl-SI, smn, smn-FI, sn, sn-ZW, so, so-DJ, so-ET, so-KE, so-SO, sq, sq-AL, sq-MK, sq-XK, sr, sr-Cyrl, sr-Cyrl-BA, sr-Cyrl-ME, sr-Cyrl-RS, sr-Cyrl-XK, sr-Latn, sr-Latn-BA, sr-Latn-ME, sr-Latn-RS, sr-Latn-XK, sv, sv-AX, sv-FI, sv-SE, sw, sw-CD, sw-KE, sw-TZ, sw-UG, ta, ta-IN, ta-LK, ta-MY, ta-SG, te, te-IN, teo, teo-KE, teo-UG, th, th-TH, ti, ti-ER, ti-ET, tk, tk-TM, to, to-TO, tr, tr-CY, tr-TR, twq, twq-NE, tzm, tzm-MA, ug, ug-CN, uk, uk-UA, ur, ur-IN, ur-PK, uz, uz-Arab, uz-Arab-AF, uz-Cyrl, uz-Cyrl-UZ, uz-Latn, uz-Latn-UZ, vai, vai-Latn, vai-Latn-LR, vai-Vaii, vai-Vaii-LR, vi, vi-VN, vo, vo-001, vun, vun-TZ, wae, wae-CH, xog, xog-UG, yav, yav-CM, yi, yi-001, yo, yo-BJ, yo-NG, zgh, zgh-MA, zh, zh-Hans, zh-Hans-CN, zh-Hans-HK, zh-Hans-MO, zh-Hans-SG, zh-Hant, zh-Hant-HK, zh-Hant-MO, zh-Hant-TW, zu, zu-ZA
+sv >> sv
+
+** test: test8288
+
+@supported=it, en
+und >> it
+und, en >> en
+
+# examples from
+# http://unicode.org/repos/cldr/tags/latest/common/bcp47/
+# http://unicode.org/repos/cldr/tags/latest/common/validity/variant.xml
+
+@favor=script
+und >> it
+und, en >> en
+
+** test: testUnHack
+
+@supported=en-NZ, en-IT
+en-US >> en-NZ
+
+@favor=script
+en-US >> en-NZ
+
+** test: testEmptySupported => null
+en >> null
+
+# testVariantsAndExtensions
+
+** test: tests the .combine() method
+
+@supported=und, fr
+fr-BE-fonipa >> fr | | fr-BE-fonipa
+@supported=und, fr-CA
+fr-BE-fonipa >> fr-CA | | fr-BE-fonipa
+@supported=und, fr-fonupa
+fr-BE-fonipa >> fr-fonupa | | fr-BE-fonipa
+@supported=und, no
+nn-BE-fonipa >> no | | no-BE-fonipa
+@supported=und, en-GB-u-sd-gbsct
+en-fonipa-u-nu-Arab-ca-buddhist-t-m0-iso-i0-pinyin >> en-GB-u-sd-gbsct | | en-GB-fonipa-u-nu-Arab-ca-buddhist-t-m0-iso-i0-pinyin
+
+@supported=en-PSCRACK, de-PSCRACK, fr-PSCRACK, pt-PT-PSCRACK
+fr-PSCRACK >> fr-PSCRACK
+fr >> en-PSCRACK
+de-CH >> en-PSCRACK
+
+@favor=script
+@supported=und, fr
+fr-BE-fonipa >> fr
+@supported=und, fr-CA
+fr-BE-fonipa >> fr-CA
+@supported=und, fr-fonupa
+fr-BE-fonipa >> fr-fonupa
+@supported=und, no
+nn-BE-fonipa >> no | | no-BE-fonipa
+@supported=und, en-GB-u-sd-gbsct
+en-fonipa-u-nu-Arab-ca-buddhist-t-m0-iso-i0-pinyin >> en-GB-u-sd-gbsct | | en-GB-fonipa-u-nu-Arab-ca-buddhist-t-m0-iso-i0-pinyin
+
+@supported=en-PSCRACK, de-PSCRACK, fr-PSCRACK, pt-PT-PSCRACK
+fr-PSCRACK >> fr-PSCRACK
+fr >> en-PSCRACK
+de-CH >> en-PSCRACK
+
+** test: testClusters
+# we favor es-419 over others in cluster. Clusters: es- {ES, MA, EA} {419, AR, MX}
+
+@supported=und, es, es-MA, es-MX, es-419
+es-AR >> es-419
+@supported=und, es-MA, es, es-419, es-MX
+es-AR >> es-419
+@supported=und, es, es-MA, es-MX, es-419
+es-EA >> es
+@supported=und, es-MA, es, es-419, es-MX
+es-EA >> es
+
+# of course, fall back to within cluster
+
+@supported=und, es, es-MA, es-MX
+es-AR >> es-MX
+@supported=und, es-MA, es, es-MX
+es-AR >> es-MX
+@supported=und, es-MA, es-MX, es-419
+es-EA >> es-MA
+@supported=und, es-MA, es-419, es-MX
+es-EA >> es-MA
+
+# we favor es-GB over others in cluster. Clusters: en- {US, GU, VI} {GB, IN, ZA}
+
+@supported=und, en, en-GU, en-IN, en-GB
+en-ZA >> en-GB
+@supported=und, en-GU, en, en-GB, en-IN
+en-ZA >> en-GB
+@supported=und, en, en-GU, en-IN, en-GB
+en-VI >> en
+@supported=und, en-GU, en, en-GB, en-IN
+en-VI >> en
+
+# of course, fall back to within cluster
+
+@supported=und, en, en-GU, en-IN
+en-ZA >> en-IN
+@supported=und, en-GU, en, en-IN
+en-ZA >> en-IN
+@supported=und, en-GU, en-IN, en-GB
+en-VI >> en-GU
+@supported=und, en-GU, en-GB, en-IN
+en-VI >> en-GU
+
+@favor=script
+@supported=und, es, es-MA, es-MX, es-419
+es-AR >> es-419
+@supported=und, es-MA, es, es-419, es-MX
+es-AR >> es-419
+@supported=und, es, es-MA, es-MX, es-419
+es-EA >> es
+@supported=und, es-MA, es, es-419, es-MX
+es-EA >> es
+
+@supported=und, es, es-MA, es-MX
+es-AR >> es-MX
+@supported=und, es-MA, es, es-MX
+es-AR >> es-MX
+@supported=und, es-MA, es-MX, es-419
+es-EA >> es-MA
+@supported=und, es-MA, es-419, es-MX
+es-EA >> es-MA
+
+@supported=und, en, en-GU, en-IN, en-GB
+en-ZA >> en-GB
+@supported=und, en-GU, en, en-GB, en-IN
+en-ZA >> en-GB
+@supported=und, en, en-GU, en-IN, en-GB
+en-VI >> en
+@supported=und, en-GU, en, en-GB, en-IN
+en-VI >> en
+
+@supported=und, en, en-GU, en-IN
+en-ZA >> en-IN
+@supported=und, en-GU, en, en-IN
+en-ZA >> en-IN
+@supported=und, en-GU, en-IN, en-GB
+en-VI >> en-GU
+@supported=und, en-GU, en-GB, en-IN
+en-VI >> en-GU
+
+** test: testThreshold
+@supported=50, und, fr-CA-fonupa
+@threshold=60
+fr-BE-fonipa >> fr-CA-fonupa | | fr-BE-fonipa
+@supported=und, fr-Cyrl-CA-fonupa
+fr-BE-fonipa >> fr-Cyrl-CA-fonupa | | fr-Cyrl-BE-fonipa
+@threshold=50
+fr-BE-fonipa >> und
+
+@favor=script
+@supported=50, und, fr-CA-fonupa
+@threshold=
+fr-BE-fonipa >> fr-CA-fonupa | | fr-BE-fonipa
+@supported=und, fr-Cyrl-CA-fonupa
+fr-BE-fonipa >> und
+
+** test: testScriptFirst
+@supported=ru, fr
+zh, pl >> ru
+zh-Cyrl, pl >> ru
+@supported=hr, en-Cyrl
+sr >> hr
+@supported=da, ru, hr
+sr >> da
+
+@favor=script
+@supported=ru, fr
+zh, pl >> fr
+zh-Cyrl, pl >> ru
+@supported=hr, en-Cyrl
+sr >> en-Cyrl
+@supported=da, ru, hr
+sr >> ru
+
+## III
+
+** test: testBasicsWithDefault
+@supported=en-GB, en
+@default=fr
+en-GB >> en-GB
+en-US >> en
+fr >> fr
+ja >> fr
+
+@favor=script
+en-GB >> en-GB
+en-US >> en
+fr >> en-GB
+ja >> fr
+
+** test: testEmptyWithDefault
+@default=en
+fr >> en
+
+** test: testGetBestMatchForList_exactMatch
+@supported=fr, en-GB, ja, es-ES, es-MX
+ja, de >> ja
+
+** test: testGetBestMatchForList_simpleVariantMatch
+# Intentionally avoiding a perfect-match or two candidates for variant matches.
+@supported=fr, en-GB, ja, es-ES, es-MX
+de, en-US >> en-GB
+# Fall back.
+de, zh >> fr
+
+** test: TestEuHack
+@supported=en-NZ, en-IT
+en-US >> en-NZ
+
+** test: TestBasics
+@supported=fr, en-GB, en
+en-GB >> en-GB
+en-US >> en
+fr-FR >> fr
+ja-JP >> fr
+# For a language that doesn't match anything, return the default.
+zu >> en-GB
+zxx >> fr
+
+@favor=script
+en-GB >> en-GB
+en-US >> en
+fr-FR >> fr
+ja-JP >> fr
+zu >> en-GB
+zxx >> en
+
+** test: TestExactMatch
+@supported=fr, en-GB, ja, es-ES, es-MX
+ja, de >> ja
+
+** test: TestSimpleVariantMatch
+@supported=fr, en-GB, ja, es-ES, es-MX
+de, en-US >> en-GB
+de, zh >> fr
+
+** test: TestMatchOnMaximized
+# ja-JP matches ja on likely subtags, and it's listed first, thus it wins
+# over the secondary preference en-GB.
+@supported=fr, en-GB, ja, es-ES, es-MX
+ja-JP, en-GB >> ja
+# Check that if the preference is maximized already, it works as well.
+ja-Jpan-JP, en-GB >> ja
+@supported=fr, zh-Hant, en
+zh, en >> en
+
+@favor=script
+zh, en >> en
+
+** test: TestCloseEnoughMatchOnMaximized
+@supported=en-GB, en, de, fr, ja
+de-CH, fr >> de
+en-US, ar, nl, de, ja >> en
+
+** test: TestGetBestMatchForPortuguese
+# 1. a supported set containing an explicit pt: {pt-PT, pt-BR, es, es-419}
+# 2. a supported set containing an implicit pt: {pt-PT, pt, es, es-419}
+# 3. a supported set containing no pt: {pt-BR, es, es-419}
+# European user who prefers Spanish over Brazilian Portuguese as a fallback.
+@supported=pt-PT, pt-BR, es, es-419
+pt-PT, es, pt >> pt-PT
+@supported=pt-PT, pt, es, es-419
+pt-PT, es, pt >> pt-PT
+@supported=pt-BR, es, es-419
+pt-PT, es, pt >> pt-BR
+
+# Brazilian user who prefers South American Spanish over European Portuguese
+# as a fallback. The asymmetry between this case and above is because it's
+# "pt-PT" that's missing between the matchers.
+@supported=pt-PT, pt-BR, es, es-419
+pt, es-419, pt-PT >> pt-BR
+@supported=pt-PT, pt, es, es-419
+pt, es-419, pt-PT >> pt
+@supported=pt-BR, es, es-419
+pt, es-419, pt-PT >> pt-BR
+
+# Sometimes we get "pt-US" for a user's language (which CLDR doesn't
+# recognize) but we deal with that as a synonym for "pt-BR".
+@supported=pt-PT, pt-BR, es, es-419
+pt-US, pt-PT >> pt-BR
+@supported=pt-PT, pt, es, es-419
+pt-US, pt-PT >> pt
+
+@favor=script
+@supported=pt-BR, es, es-419
+pt-PT, es, pt >> pt-BR
+@supported=pt-PT, pt, es, es-419
+pt-US, pt-PT >> pt
+
+** test: TestScriptAndRegion
+@supported=en-GB, en
+en-CA >> en-GB
+# fr-CA is a "close enough" match to "fr" to be returned in favor of "en-GB"
+@supported=fr, en-GB, en
+fr-CA, en-CA >> fr
+@supported=zh-Hant, zh-TW
+zh-HK >> zh-Hant
+
+@favor=script
+@supported=en-GB, en
+en-CA >> en-GB
+@supported=fr, en-GB, en
+fr-CA, en-CA >> fr
+@supported=zh-Hant, zh-TW
+zh-HK >> zh-Hant
+
+** test: TestFallback
+@supported=zh-CN, zh-TW, iw
+zh-Hant >> zh-TW
+zh >> zh-CN
+zh-Hans-CN >> zh-CN
+zh-Hant-HK >> zh-TW
+he-IT >> iw
+
+** test: TestFallbackWithDefault
+# Check that script fallbacks are handled right and that we don't have to
+# fall back to the default.
+@supported=zh-CN, zh-TW, iw
+@default=fr
+zh-Hant >> zh-TW
+zh >> zh-CN
+zh-Hans-CN >> zh-CN
+zh-Hant-HK >> zh-TW
+he-IT >> iw
+
+@favor=script
+zh-Hant >> zh-TW
+zh >> zh-CN
+zh-Hans-CN >> zh-CN
+zh-Hant-HK >> zh-TW
+he-IT >> iw
+
+** test: TestSpecials
+# Check that nearby languages are handled.
+@supported=en, fil, ro, nn
+tl >> fil
+mo >> ro
+nb >> nn
+ja >> en # Make sure default works.
+
+** test: TestRegionalSpecials
+# Verify that en-AU is closer to en-GB than to en (which is en-US).
+@supported=en, en-GB, es-ES, es-419
+en-AU >> en-GB
+# Following 2 cases test closer/smaller region difference.
+es-MX >> es-419
+es-PT >> es-ES
+
+@favor=script
+en-AU >> en-GB
+es-MX >> es-419
+es-PT >> es-ES
+
+** test: TestEmpty
+fr >> null
+
+** test: TestUndefined
+# When the undefined language doesn't match anything in the list,
+# return the default.
+@supported=it, fr
+und >> it
+# When it *does* occur in the list, return it.
+@supported=it, und
+und >> und
+# The unusual part:
+# max("und") = "en-Latn-US", and since matching is based on
+# maximized tags, the undefined language would normally match
+# English. But that would produce the counterintuitive results
+# that BestMatchFor("und", LanguageMatcher("it,en")) would be "en",
+# and BestMatchFor("en", LanguageMatcher("it,und")) would be "und".
+
+# To avoid that, we change the matcher's definitions of max
+# (AddLikelySubtagsWithDefaults) so that max("und")="und". That
+# produces the following, more desirable results:
+@supported=it, en
+und >> it
+@supported=it, und
+en >> it
+
+** test: TestVariantWithScriptMatch
+@supported=fr, en, sv
+en-GB >> en
+en-GB, sv >> en
+
+@favor=script
+en-GB, sv >> en
+
+** test: Serbian
+@supported=und, sr
+sr-ME >> sr
+@supported=und, sr-ME
+sr >> sr-ME
+@supported=und, sr-Latn
+bs >> und
+@supported=und, bs
+sr-Latn >> und
+@supported=und, sr
+bs >> und
+@supported=und, bs
+sr >> und
+@supported=und, sr-Latn
+sr >> sr-Latn
+@supported=und, sr
+sr-Latn >> sr
+
+@favor=script
+sr-ME >> sr
+@supported=und, sr-ME
+sr >> sr-ME
+@supported=und, sr-Latn
+bs >> sr-Latn
+@supported=und, bs
+sr-Latn >> bs
+@supported=und, sr
+bs >> und
+@supported=und, bs
+sr >> und
+@supported=und, sr-Latn
+sr >> sr-Latn
+@supported=und, sr
+sr-Latn >> sr
+
+** test: MatchGooglePrivateUseSubtag
+@supported=fr, x-bork, en-Latn-US
+x-piglatin >> fr
+x-bork >> x-bork
+@supported=fr, en-GB, x-bork, es-ES, es-419
+x-piglatin >> fr
+x-bork >> x-bork
+
+@favor=script
+@supported=fr, x-bork, en-Latn-US
+x-piglatin >> x-bork
+x-bork >> x-bork
+@supported=fr, en-GB, x-bork, es-ES, es-419
+x-piglatin >> x-bork
+x-bork >> x-bork
+
+** test: MatchGrandfatheredCode
+@supported=fr, i-klingon, en-Latn-US
+en-GB-oed >> en-Latn-US
+i-klingon >> tlh
+
+@favor=script
+en-GB-oed >> en-Latn-US
+i-klingon >> tlh
+
+** test: MatchGooglePseudoLocale
+# Google pseudo locales using variant subtags.
+# (See below for the region code based pseudo locales.)
+@supported=fr, en-PSACCENT, ar-PSBIDI, en-PSCRACK, zh-Hans-PSCRACK, pt-PT-PSCRACK, pt
+de >> fr
+en-US >> fr
+en >> fr
+ar-PSBIDI >> ar-PSBIDI
+en-PSACCENT >> en-PSACCENT
+en-PSCRACK >> en-PSCRACK
+pt-BR >> pt
+pt-PT-PSCRACK >> pt-PT-PSCRACK
+zh-Hans-PSCRACK >> zh-Hans-PSCRACK
+
+@favor=script
+de >> fr
+en-US >> fr
+en >> fr
+ar-PSBIDI >> ar-PSBIDI
+en-PSACCENT >> en-PSACCENT
+en-PSCRACK >> en-PSCRACK
+pt-BR >> pt
+pt-PT-PSCRACK >> pt-PT-PSCRACK
+zh-Hans-PSCRACK >> zh-Hans-PSCRACK
+
+** test: MatchGooglePseudoLocaleWithFallbacks
+# Pseudo locales based on the fall back option (XA..XC region codes).
+@supported=fr, en-XA, ar-XB, en-XC, zh-Hans-XC, pt
+de >> fr
+en-US >> fr
+en >> fr
+ar-XB >> ar-XB
+en-XA >> en-XA
+en-XC >> en-XC
+pt-BR >> pt
+zh-Hans-XC >> zh-Hans-XC
+
+@favor=script
+de >> fr
+en-US >> fr
+en >> fr
+ar-XB >> ar-XB
+en-XA >> en-XA
+en-XC >> en-XC
+pt-BR >> pt
+zh-Hans-XC >> zh-Hans-XC
+
+** test: DoNotMatchGooglePseudoLocale
+@supported=fr, en-XA, ar-XB, en-PSACCENT, ar-PSBIDI, en-DE, pt, ar-SY, ar-PSCRACK
+de >> fr
+# We wouldn't want to return pseudo locales when there's a good match for an
+# ordinary locale.
+# Note: If LanguageMatcher was not aware of PSACCENT, it would consider the
+# distance from "en" to "en-PSACCENT" smaller than to "en-DE" (the standard
+# variant distance is smaller than a region distance).
+en >> en-DE
+ar-EG >> ar-SY
+pt-BR >> pt
+ar-XB >> ar-XB
+ar-PSBIDI >> ar-XB # These are equivalent.
+en-XA >> en-XA
+en-PSACCENT >> en-XA # These are equivalent.
+ar-PSCRACK >> ar-PSCRACK
+
+@favor=script
+de >> en-DE
+en >> en-DE
+ar-EG >> ar-SY
+pt-BR >> pt
+ar-XB >> ar-XB
+ar-PSBIDI >> ar-XB # These are equivalent.
+en-XA >> en-XA
+en-PSACCENT >> en-XA # These are equivalent.
+ar-PSCRACK >> ar-PSCRACK
+
+** test: BestMatchForTraditionalChinese
+# Scenario: An application that only supports Simplified Chinese (and some
+# other languages), but does not support Traditional Chinese. zh-Hans-CN
+# could be replaced with zh-CN, zh, or zh-Hans, it wouldn't make much of a
+# difference.
+# The script distance (simplified vs. traditional Han) is considered small
+# enough to be an acceptable match. The regional difference is considered
+# almost insignificant.
+@supported=fr, zh-Hans-CN, en-US
+zh-TW >> zh-Hans-CN
+zh-Hant >> zh-Hans-CN
+
+# For geopolitical reasons, you might want to avoid a zh-Hant -> zh-Hans
+# match. In this case, if zh-TW, zh-HK or a tag starting with zh-Hant is
+# requested, you can change your call to getBestMatch to include a 2nd
+# language preference. "en" is a better match since its distance to "en-US"
+# is closer than the distance from "zh-TW" to "zh-CN" (script distance).
+zh-TW, en >> en-US
+zh-Hant-CN, en >> en-US
+zh-Hans, en >> zh-Hans-CN
+
+** test: MaxBeforeEquals
+# Compare maximized forms of earlier items before testing equality
+# of later items.
+@supported=en, fr-CA
+en-US, fr-CA >> en
+
+@favor=script
+en-US, fr-CA >> en
+
+** test: SiblingDefaultRegion
+@supported=de-AT, de-DE, de-CH
+de >> de-DE
+
+** test: ReturnDefaultInsteadOfNullForEmptyPriorityList
+@default=und
+de >> und
+
+** test: ReturnSpecifiedDefaultForNoMatch
+@supported=de, en, fr
+@default=und
+hi >> und
+
+@favor=script
+hi >> und
+
+** test: MatchedLanguageIgnoresDefault
+@supported=de, en, fr
+@default=und
+fr >> fr
+
+@favor=script
+fr >> fr
+
+## GenX
+
+** test: TwoSpanishes
+@supported=es, es-MX
+@default=und
+es-001 >> es
+und >> und
+ca >> und
+gl-ES >> es
+es >> es
+es-MX >> es-MX
+es-002 >> es
+es-003 >> es-MX
+es-005 >> es-MX
+es-019 >> es-MX
+es-029 >> es-MX
+es-419 >> es-MX
+es-142 >> es
+es-150 >> es
+es-AD >> es
+es-AR >> es-MX
+es-BO >> es-MX
+es-BZ >> es-MX
+es-CA >> es-MX
+es-CL >> es-MX
+es-CO >> es-MX
+es-CR >> es-MX
+es-CU >> es-MX
+es-DO >> es-MX
+es-EC >> es-MX
+es-ES >> es
+es-GI >> es
+es-GQ >> es
+es-GT >> es-MX
+es-HN >> es-MX
+es-NI >> es-MX
+es-PA >> es-MX
+es-PE >> es-MX
+es-PH >> es
+es-PR >> es-MX
+es-PY >> es-MX
+es-SV >> es-MX
+es-US >> es-MX
+es-UY >> es-MX
+es-VE >> es-MX
+
+@favor=script
+es-001 >> es
+und >> und
+ca >> es
+gl-ES >> es
+es >> es
+es-MX >> es-MX
+es-002 >> es
+es-003 >> es-MX
+es-005 >> es-MX
+es-019 >> es-MX
+es-029 >> es-MX
+es-419 >> es-MX
+es-142 >> es
+es-150 >> es
+es-AD >> es
+es-AR >> es-MX
+es-BO >> es-MX
+es-BZ >> es-MX
+es-CA >> es-MX
+es-CL >> es-MX
+es-CO >> es-MX
+es-CR >> es-MX
+es-CU >> es-MX
+es-DO >> es-MX
+es-EC >> es-MX
+es-ES >> es
+es-GI >> es
+es-GQ >> es
+es-GT >> es-MX
+es-HN >> es-MX
+es-NI >> es-MX
+es-PA >> es-MX
+es-PE >> es-MX
+es-PH >> es
+es-PR >> es-MX
+es-PY >> es-MX
+es-SV >> es-MX
+es-US >> es-MX
+es-UY >> es-MX
+es-VE >> es-MX
+
+** test: Three Spanishes
+@supported=es, es-419, es-MX
+@default=und
+es-001 >> es
+und >> und
+ca >> und
+gl-ES >> es
+es >> es
+es-419 >> es-419
+es-002 >> es
+es-003 >> es-419
+es-005 >> es-419
+es-019 >> es-419
+es-029 >> es-419
+es-142 >> es
+es-150 >> es
+es-AD >> es
+es-AR >> es-419
+es-BO >> es-419
+es-BZ >> es-419
+es-CA >> es-419
+es-CL >> es-419
+es-CO >> es-419
+es-CR >> es-419
+es-CU >> es-419
+es-DO >> es-419
+es-EC >> es-419
+es-ES >> es
+es-GI >> es
+es-GQ >> es
+es-GT >> es-419
+es-HN >> es-419
+es-MX >> es-MX
+es-NI >> es-419
+es-PA >> es-419
+es-PE >> es-419
+es-PH >> es
+es-PR >> es-419
+es-PY >> es-419
+es-SV >> es-419
+es-US >> es-419
+es-UY >> es-419
+es-VE >> es-419
+
+@favor=script
+es-001 >> es
+und >> und
+ca >> es
+gl-ES >> es
+es >> es
+es-419 >> es-419
+es-002 >> es
+es-003 >> es-419
+es-005 >> es-419
+es-019 >> es-419
+es-029 >> es-419
+es-142 >> es
+es-150 >> es
+es-AD >> es
+es-AR >> es-419
+es-BO >> es-419
+es-BZ >> es-419
+es-CA >> es-419
+es-CL >> es-419
+es-CO >> es-419
+es-CR >> es-419
+es-CU >> es-419
+es-DO >> es-419
+es-EC >> es-419
+es-ES >> es
+es-GI >> es
+es-GQ >> es
+es-GT >> es-419
+es-HN >> es-419
+es-MX >> es-MX
+es-NI >> es-419
+es-PA >> es-419
+es-PE >> es-419
+es-PH >> es
+es-PR >> es-419
+es-PY >> es-419
+es-SV >> es-419
+es-US >> es-419
+es-UY >> es-419
+es-VE >> es-419
+
+** test: Englishes
+@supported=en-GB, en-US
+@default=und
+und >> und
+ja >> und
+fr-CA >> und
+
+# Great Britain fallback
+en-AU >> en-GB
+en-BZ >> en-GB
+en-CA >> en-GB
+en-IN >> en-GB
+en-IE >> en-GB
+en-JM >> en-GB
+en-NZ >> en-GB
+en-PK >> en-GB
+en-TT >> en-GB
+en-ZA >> en-GB
+
+# United States fallback
+en-US >> en-US
+en >> en-US
+
+@favor=script
+und >> und
+ja >> und
+fr-CA >> en-GB
+en-AU >> en-GB
+en-BZ >> en-GB
+en-CA >> en-GB
+en-IN >> en-GB
+en-IE >> en-GB
+en-JM >> en-GB
+en-NZ >> en-GB
+en-PK >> en-GB
+en-TT >> en-GB
+en-ZA >> en-GB
+en-US >> en-US
+en >> en-US
+
+** test: TestFallback
+# manyEnMatcher
+@supported=en-GB, en-US, en, en-AU
+@default=und
+und >> und
+ja >> und
+fr-CA >> und
+
+# nonUsMatcher
+fr >> und
+
+# onlyAuMatcher
+@supported=en-AU, ja, ca
+fr >> und
+
+# noEnMatcher
+@supported=pl, ja, ca
+fr >> und
+
+@favor=script
+@supported=en-GB, en-US, en, en-AU
+und >> und
+ja >> und
+fr-CA >> en-GB
+fr >> en-GB
+@supported=en-AU, ja, ca
+fr >> en-AU
+@supported=pl, ja, ca
+fr >> pl
+
+## Go
+
+** test: basics
+@supported=fr, en-GB, en
+en-GB >> en-GB
+en-US >> en
+fr-FR >> fr
+ja-JP >> fr
+
+** test: script fallbacks
+@supported=zh-CN, zh-TW, iw
+zh-Hant >> zh-TW
+zh >> zh-CN
+zh-Hans-CN >> zh-CN
+zh-Hant-HK >> zh-TW
+@default=iw
+he-IT >> iw
+
+@favor=script
+he-IT >> iw
+
+** test: language-specific script fallbacks 1
+@supported=en, sr, nl
+sr-Latn >> sr
+sh >> en
+hr >> en
+bs >> en
+nl-Cyrl >> en # Mark: Expected value should be en not sr. Script difference exceeds threshold, so can't be nl
+
+@favor=script
+sr-Latn >> sr
+hr >> en
+bs >> en
+nl-Cyrl >> sr
+
+** test: language-specific script fallbacks 2
+@supported=en, sr-Latn
+sr >> sr-Latn
+sr-Cyrl >> sr-Latn
+@default=und
+hr >> und
+
+@favor=script
+@default=
+sr >> sr-Latn
+sr-Cyrl >> sr-Latn
+@default=und
+hr >> en
+
+** test: don't match hr to sr-Latn
+@supported=en, sr-Latn
+hr >> en
+
+@favor=script
+hr >> en
+
+** test: both deprecated and not
+@supported=fil, tl, iw, he
+he-IT >> iw
+he >> iw
+iw >> iw
+fil-IT >> fil
+fil >> fil
+tl >> fil
+
+@favor=script
+he-IT >> iw
+he >> iw
+iw >> iw
+fil-IT >> fil
+fil >> fil
+tl >> fil
+
+** test: nearby languages: Nynorsk to Bokmål
+@supported=en, nb
+nn >> nb
+
+@favor=script
+nn >> nb
+
+** test: nearby languages: Danish does not match nn
+@supported=en, nn
+da >> en
+
+@favor=script
+da >> en
+
+** test: nearby languages: Danish matches no
+@supported=en, no
+da >> no
+
+@favor=script
+da >> no
+
+** test: nearby languages: Danish matches nb
+@supported=en, nb
+da >> nb
+
+** test: prefer matching languages over language variants.
+@supported=nn, en-GB
+no, en-US >> nn
+nb, en-US >> nn
+
+@favor=script
+no, en-US >> nn
+nb, en-US >> nn
+
+** test: deprecated version is closer than same language with other differences
+@supported=nl, he, en-GB
+iw, en-US >> he
+
+@favor=script
+iw, en-US >> he
+
+** test: macro equivalent is closer than same language with other differences
+@supported=nl, zh, en-GB, no
+cmn, en-US >> zh
+nb, en-US >> no
+
+@favor=script
+cmn, en-US >> zh
+nb, en-US >> no
+
+** test: legacy equivalent is closer than same language with other differences
+@supported=nl, fil, en-GB
+tl, en-US >> fil
+
+@favor=script
+tl, en-US >> fil
+
+** test: distinguish near equivalents
+@supported=en, ro, mo, ro-MD
+ro >> ro
+mo >> ro # ro=mo for the locale matcher
+ro-MD >> ro-MD
+
+@favor=script
+ro >> ro
+mo >> ro # ro=mo for the locale matcher
+ro-MD >> ro-MD
+
+** test: maximization of legacy
+@supported=sr-Cyrl, sr-Latn, ro, ro-MD
+sh >> sr-Latn
+mo >> ro
+
+@favor=script
+sh >> sr-Latn
+mo >> ro
+
+** test: empty
+fr >> null
+en >> null
+
+** test: private use subtags
+@supported=fr, en-GB, x-bork, es-ES, es-419
+x-piglatin >> fr
+x-bork >> x-bork
+
+** test: grandfathered codes
+@supported=fr, i-klingon, en-Latn-US
+en-GB-oed >> en-Latn-US
+i-klingon >> tlh
+
+
+** test: simple variant match
+@supported=fr, en-GB, ja, es-ES, es-MX
+de, en-US >> en-GB
+de, zh >> fr
+
+** test: best match for traditional Chinese
+@supported=fr, zh-Hans-CN, en-US
+zh-TW >> zh-Hans-CN
+zh-Hant >> zh-Hans-CN
+zh-TW, en >> en-US
+zh-Hant-CN, en >> en-US
+zh-Hans, en >> zh-Hans-CN
+
+** test: return first among likely-subtags equivalent locales
+# Was: more specific script should win in case regions are identical
+# with some different results.
+@supported=af, af-Latn, af-Arab
+af >> af
+af-ZA >> af
+af-Latn-ZA >> af
+af-Latn >> af
+
+@favor=script
+af >> af
+af-ZA >> af
+af-Latn-ZA >> af
+af-Latn >> af
+
+# Was: more specific region should win
+# with some different results.
+@supported=nl, nl-NL, nl-BE
+@favor=
+nl >> nl
+nl-Latn >> nl
+nl-Latn-NL >> nl
+nl-NL >> nl
+
+@favor=script
+nl >> nl
+nl-Latn >> nl
+nl-Latn-NL >> nl
+nl-NL >> nl
+
+# Was: more specific region wins over more specific script
+# with some different results.
+@supported=nl, nl-Latn, nl-NL, nl-BE
+@favor=
+nl >> nl
+nl-Latn >> nl
+nl-NL >> nl
+nl-Latn-NL >> nl
+
+@favor=script
+nl >> nl
+nl-Latn >> nl
+nl-NL >> nl
+nl-Latn-NL >> nl
+
+** test: region may replace matched if matched is enclosing
+@supported=es-419, es
+@default=es-MX
+es-MX >> es-419
+@default=
+es-SG >> es
+
+@favor=script
+@default=es-MX
+es-MX >> es-419
+@default=
+es-SG >> es
+
+** test: region distance Portuguese
+@supported=pt, pt-PT
+pt-ES >> pt-PT
+
+@favor=script
+pt-ES >> pt-PT
+
+** test: if no preferred locale specified, pick top language, not regional
+@supported=en, fr, fr-CA, fr-CH
+fr-US >> fr
+
+@favor=script
+fr-US >> fr
+
+** test: region distance German
+@supported=de-AT, de-DE, de-CH
+de >> de-DE
+
+** test: en-AU is closer to en-GB than to en (which is en-US)
+@supported=en, en-GB, es-ES, es-419
+en-AU >> en-GB
+@default=es-MX
+es-MX >> es-419
+@default=
+es-PT >> es-ES
+
+@favor=script
+en-AU >> en-GB
+es-MX >> es-419
+@default=
+es-PT >> es-ES
+
+** test: undefined
+@supported=it, fr
+und >> it
+
+** test: und does not match en
+@supported=it, en
+und >> it
+
+** test: undefined in priority list
+@supported=it, und
+und >> und
+en >> it
+
+** test: undefined
+@supported=it, fr, zh
+und-FR >> fr
+und-CN >> zh
+und-Hans >> zh
+und-Hant >> zh
+und-Latn >> it
+
+@favor=script
+und-FR >> fr
+und-CN >> zh
+und-Hans >> zh
+und-Hant >> zh
+und-Latn >> it
+
+** test: match on maximized tag
+@supported=fr, en-GB, ja, es-ES, es-MX
+ja-JP, en-GB >> ja
+ja-Jpan-JP, en-GB >> ja
+
+** test: pick best maximized tag
+@supported=ja, ja-Jpan-US, ja-JP, en, ru
+ja-Jpan, ru >> ja
+ja-JP, ru >> ja
+ja-US, ru >> ja-Jpan-US
+
+@favor=script
+ja-Jpan, ru >> ja
+ja-JP, ru >> ja
+ja-US, ru >> ja-Jpan-US
+
+** test: termination: pick best maximized match
+@supported=ja, ja-Jpan, ja-JP, en, ru
+ja-Jpan-JP, ru >> ja
+ja-Jpan, ru >> ja
+
+@favor=script
+ja-Jpan-JP, ru >> ja
+ja-Jpan, ru >> ja
+
+** test: same language over exact, but distinguish when user is explicit
+@supported=fr, en-GB, ja, es-ES, es-MX
+ja, de >> ja
+@supported=en, de, fr, ja
+de-CH, fr >> de
+@supported=en-GB, nl
+en, nl >> en-GB
+en, nl, en-GB >> en-GB
+
+@favor=script
+@supported=fr, en-GB, ja, es-ES, es-MX
+ja, de >> ja
+@supported=en, de, fr, ja
+de-CH, fr >> de
+@supported=en-GB, nl
+en, nl >> en-GB
+en, nl, en-GB >> en-GB
+
+** test: parent relation preserved
+@supported=en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK
+en-150 >> en-GB
+en-AU >> en-GB
+en-BE >> en-GB
+en-GG >> en-GB
+en-GI >> en-GB
+en-HK >> en-GB
+en-IE >> en-GB
+en-IM >> en-GB
+en-IN >> en-GB
+en-JE >> en-GB
+en-MT >> en-GB
+en-NZ >> en-GB
+en-PK >> en-GB
+en-SG >> en-GB
+en-DE >> en-GB
+@default=es-AR
+es-AR >> es-419
+@default=es-BO
+es-BO >> es-419
+@default=es-CL
+es-CL >> es-419
+@default=es-CO
+es-CO >> es-419
+@default=es-CR
+es-CR >> es-419
+@default=es-CU
+es-CU >> es-419
+@default=es-DO
+es-DO >> es-419
+@default=es-EC
+es-EC >> es-419
+@default=es-GT
+es-GT >> es-419
+@default=es-HN
+es-HN >> es-419
+@default=es-MX
+es-MX >> es-419
+@default=es-NI
+es-NI >> es-419
+@default=es-PA
+es-PA >> es-419
+@default=es-PE
+es-PE >> es-419
+@default=es-PR
+es-PR >> es-419
+@default=
+es-PT >> es
+@default=es-PY
+es-PY >> es-419
+@default=es-SV
+es-SV >> es-419
+@default=
+es-US >> es-419
+@default=es-UY
+es-UY >> es-419
+@default=es-VE
+es-VE >> es-419
+@default=
+pt-AO >> pt-PT
+pt-CV >> pt-PT
+pt-GW >> pt-PT
+pt-MO >> pt-PT
+pt-MZ >> pt-PT
+pt-ST >> pt-PT
+pt-TL >> pt-PT
+
+@favor=script
+en-150 >> en-GB
+en-AU >> en-GB
+en-BE >> en-GB
+en-GG >> en-GB
+en-GI >> en-GB
+en-HK >> en-GB
+en-IE >> en-GB
+en-IM >> en-GB
+en-IN >> en-GB
+en-JE >> en-GB
+en-MT >> en-GB
+en-NZ >> en-GB
+en-PK >> en-GB
+en-SG >> en-GB
+en-DE >> en-GB
+@default=es-AR
+es-AR >> es-419
+@default=es-BO
+es-BO >> es-419
+@default=es-CL
+es-CL >> es-419
+@default=es-CO
+es-CO >> es-419
+@default=es-CR
+es-CR >> es-419
+@default=es-CU
+es-CU >> es-419
+@default=es-DO
+es-DO >> es-419
+@default=es-EC
+es-EC >> es-419
+@default=es-GT
+es-GT >> es-419
+@default=es-HN
+es-HN >> es-419
+@default=es-MX
+es-MX >> es-419
+@default=es-NI
+es-NI >> es-419
+@default=es-PA
+es-PA >> es-419
+@default=es-PE
+es-PE >> es-419
+@default=es-PR
+es-PR >> es-419
+@default=
+es-PT >> es
+@default=es-PY
+es-PY >> es-419
+@default=es-SV
+es-SV >> es-419
+@default=
+es-US >> es-419
+@default=es-UY
+es-UY >> es-419
+@default=es-VE
+es-VE >> es-419
+@default=
+pt-AO >> pt-PT
+pt-CV >> pt-PT
+pt-GW >> pt-PT
+pt-MO >> pt-PT
+pt-MZ >> pt-PT
+pt-ST >> pt-PT
+pt-TL >> pt-PT
+
+** test: preserve extensions
+@supported=en, de, sl-NEDIS
+@default=de-u-co-phonebk
+de-FR-u-co-phonebk >> de
+@default=sl-NEDIS-u-cu-eur
+sl-NEDIS-u-cu-eur >> sl-NEDIS
+sl-u-cu-eur >> sl-NEDIS
+sl-HR-NEDIS-u-cu-eur >> sl-NEDIS
+@default=de-t-m0-iso-i0-pinyin
+de-t-m0-iso-i0-pinyin >> de
+
+@favor=script
+@default=de-u-co-phonebk
+de-FR-u-co-phonebk >> de
+@default=sl-NEDIS-u-cu-eur
+sl-NEDIS-u-cu-eur >> sl-NEDIS
+sl-u-cu-eur >> sl-NEDIS
+sl-HR-NEDIS-u-cu-eur >> sl-NEDIS
+@default=de-t-m0-iso-i0-pinyin
+de-t-m0-iso-i0-pinyin >> de
+
+## ULS
+
+** test: testEmptyUserLanguagesGetsEmpty_getBestMatches
+@supported=de
+ >> de
+
+** test: testNoStrongMatchGetsEmpty_getBestMatches
+@supported=de
+fr >> de
+
+@favor=script
+fr >> de
+
+** test: testLooseMatchForGeneral_getBestMatches
+@supported=es-419
+es-MX >> es-419
+
+@favor=script
+es-MX >> es-419
+
+** test: testLooseMatchForEnglish_getBestMatches
+@supported=en, en-GB
+en-CA >> en-GB
+
+@favor=script
+en-CA >> en-GB
+
+** test: testLooseMatchForChinese_getBestMatches
+@supported=zh
+zh-TW >> zh
+
+@favor=script
+zh-TW >> zh
+
+## Geo
+
+** test: testGetBestMatchWithMinMatchScore
+@supported=fr-FR, fr, fr-CA, en
+@default=und
+fr >> fr-FR # First likely-subtags equivalent match is chosen.
+@supported=en, fr, fr-CA
+fr-FR >> fr # Parent match is chosen.
+@supported=en, fr-CA
+fr-FR >> fr-CA # Sibling match is chosen.
+@supported=fr-CA, fr-FR
+fr >> fr-FR # Inferred region match is chosen.
+fr-SN >> fr-CA
+@supported=en, fr-FR
+fr >> fr-FR # Child match is chosen.
+@supported=de, en, it
+fr >> und
+@supported=iw, en
+iw-Latn >> und
+@supported=iw, no
+ru >> und
+@supported=iw-Latn, iw-Cyrl, iw
+ru >> und
+@supported=iw, iw-Latn
+ru >> und
+en >> und
+@supported=en, uk
+ru >> und
+@supported=zh-TW, en
+zh-CN >> zh-TW
+@supported=ja
+ru >> und
+
+@favor=script
+@supported=fr-FR, fr, fr-CA, en
+fr >> fr-FR
+@supported=en, fr, fr-CA
+fr-FR >> fr
+@supported=en, fr-CA
+fr-FR >> fr-CA
+@supported=fr-CA, fr-FR
+fr >> fr-FR
+fr-SN >> fr-CA
+@supported=en, fr-FR
+fr >> fr-FR
+@supported=de, en, it
+fr >> en
+@supported=iw, en
+iw-Latn >> en
+@supported=iw, no
+ru >> und
+@supported=iw-Latn, iw-Cyrl, iw
+ru >> iw-Cyrl
+@supported=iw, iw-Latn
+ru >> und
+en >> iw-Latn
+@supported=en, uk
+ru >> uk
+@supported=zh-TW, en
+zh-CN >> zh-TW
+@supported=ja
+ru >> und
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/numberformattestspecification.txt b/Build/source/libs/icu/icu-src/source/test/testdata/numberformattestspecification.txt
index 6ff99a8f201..aa4fa3c3f7a 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/numberformattestspecification.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/numberformattestspecification.txt
@@ -10,7 +10,6 @@
// per line.
//
// Field names:
-// H = ICU4J 58 (archive)
// J = ICU4J (current)
// K = JDK (ignored if not OpenJDK 1.8)
// C = ICU4C (current)
@@ -25,7 +24,7 @@ set locale ar-EG
set pattern +0;-#
begin
format output breaks
-6 \u061C+\u0666 HK
+6 \u061C+\u0666 K
-6 \u061C-\u0666 K
test basic patterns
@@ -188,7 +187,7 @@ pattern format output breaks
// JDK gives 12,3001E3
##0.000#E0 12300.1 12,30E3 K
##0.000#E0 12301 12,301E3
-0.05E0 12301.2 1,25E4 HK
+0.05E0 12301.2 1,25E4 K
##0.000#E0 0.17 170,0E-3
// JDK doesn't support significant digits in exponents
@@@E0 6.235 6,24E0 K
@@ -204,6 +203,29 @@ pattern format output breaks
#E0 52413 5,2413E4 K
0E0 52413 5E4
+test scientific infinite precision
+// ICU-11511, ICU-7460, CLDR-10103
+set locale en
+begin
+pattern format output breaks
+// From the spec:
+// "0.##E0 means a max of 3 significant digits."
+0.##E0 98760 9.88E4
+// "#.##E0 also means a max of 3 significant digits."
+#.##E0 98760 9.88E4
+// "#.0#E0 means a max of 2 significant digits."
+#.0#E0 98760 9.9E4 K
+// "0E0 means a max of 1 significant digit."
+0E0 98760 1E5
+// "#E0 means infinite precision."
+#E0 98760 9.876E4 K
+// "###E0 means engineering notation with infinite precision."
+###E0 98760 98.76E3 K
+// Additional tests:
+##0.#E0 98760 99E3 K
+###.#E0 98760 99E3 K
+##0E0 98760 100E3 K
+
test percents
set locale fr
begin
@@ -247,17 +269,16 @@ $**####,##0 1234 $***1\u202f234 K
####,##0$*x;n#'*' -1234 n1\u202f234*xx K
*y%4.2###### 4.33 yyyy%432,6 K
// In J ICU adds padding as if 'EUR' is only 2 chars (2 * 0xa4)
-\u00a4\u00a4 **####0.00 433.0 EUR *433,00 HK
-// In H ICU adds padding as if 'EUR' is only 2 chars (2 * 0xa4)
+\u00a4\u00a4 **####0.00 433.0 EUR *433,00 K
// P fails this one because the test code bypasses CurrencyUsage
-\u00a4\u00a4 **#######0 433.0 EUR *433,00 HKP
+\u00a4\u00a4 **#######0 433.0 EUR *433,00 KP
test padding and currencies
begin
locale currency pattern format output breaks
// In J, JPY is considered 2 char (2 * 0xa4) even though padding is done
// after prefix. In C this test works.
-fr JPY \u00a4\u00a4 **#######0 433.22 JPY ****433 HK
+fr JPY \u00a4\u00a4 **#######0 433.22 JPY ****433 K
// JDK doesn't correct rounding for currency, shows USD (433
en USD \u00a4\u00a4 **#######0;\u00a4\u00a4 (#) -433.22 USD (433.22) K
@@ -287,9 +308,7 @@ set pattern #,##0
set minGroupingDigits 2
begin
format output breaks
-// min grouping digits not supported in any existing implementation
-// but could be easily added to the new DecimalFormat C code.
-1000 1000 HK
+1000 1000 K
10000 10,000
100000 100,000
1000000 1,000,000
@@ -328,7 +347,7 @@ minIntegerDigits maxIntegerDigits minFractionDigits maxFractionDigits output bre
// JDK gives E0 instead of allowing for unlimited precision
0 0 0 0 2.99792458E8 K
// J gives 2.9979E8
-0 1 0 5 2.99792E8 HK
+0 1 0 5 2.99792E8 K
// JDK gives 300E6
0 3 0 0 299.792458E6 K
// JDK gives 299.8E6 (maybe maxInt + maxFrac instead of minInt + maxFrac)?
@@ -345,7 +364,7 @@ minIntegerDigits maxIntegerDigits minFractionDigits maxFractionDigits output bre
// JDK gives E0
0 0 1 0 2.99792458E8 K
// J gives 2.998E8
-0 0 0 4 .29979E9 HK
+0 0 0 4 .29979E9 K
// According to the spec, if maxInt>minInt and minInt>1, then set
// Context: #13289
2 8 1 6 2.9979246E8 K
@@ -400,7 +419,7 @@ begin
format maxIntegerDigits output breaks
123 1 3
// C obeys maxIntegerDigits and prints after the decimal place
-0 0 .0 HKP
+0 0 .0 KP
// CJP ignore max integer if it is less than zero and prints "123"
123 -2147483648 0 CJP
12345 1 5
@@ -493,7 +512,7 @@ begin
output grouping grouping2 minGroupingDigits breaks
1,23,45,6789 4 2 2 K
123,456789 6 6 3
-123456789 6 6 4 HK
+123456789 6 6 4 K
test multiplier setters
set locale en_US
@@ -501,10 +520,10 @@ begin
format multiplier output breaks
23 -12 -276
23 -1 -23
-// H (ICU4J 58) and J (current ICU4J) throw exception on zero multiplier.
+// J (current ICU4J) throws exception on zero multiplier.
// ICU4C prints 23.
// Q multiplies by zero and prints 0.
-23 0 0 CHJ
+23 0 0 CJ
23 1 23
23 12 276
-23 12 -276
@@ -576,12 +595,12 @@ begin
currency currencyUsage toPattern breaks
// These work in J, but it prepends an extra hash sign to the pattern.
// K does not support this feature.
-USD standard 0.00 HK
-CHF standard 0.00 HK
-CZK standard 0.00 HK
-USD cash 0.00 HK
-CHF cash 0.05 HK
-CZK cash 0 HK
+USD standard 0.00 K
+CHF standard 0.00 K
+CZK standard 0.00 K
+USD cash 0.00 K
+CHF cash 0.05 K
+CZK cash 0 K
test currency rounding
set locale en
@@ -665,7 +684,7 @@ Inf [\u221e]
-Inf (\u221e) K
// J does not print the affixes
// K prints \uFFFD
-NaN [NaN] HK
+NaN [NaN] K
test nan and infinity with multiplication
set locale en
@@ -688,10 +707,10 @@ Inf beforeSuffix $$$\u221e $ K
Inf afterSuffix $$$\u221e$ K
// J does not print the affixes
// K prints \uFFFD
-NaN beforePrefix $$$NaN$ HK
-NaN afterPrefix $$$ NaN$ HK
-NaN beforeSuffix $$$NaN $ HK
-NaN afterSuffix $$$NaN$ HK
+NaN beforePrefix $$$NaN$ K
+NaN afterPrefix $$$ NaN$ K
+NaN beforeSuffix $$$NaN $ K
+NaN afterSuffix $$$NaN$ K
test apply formerly localized patterns
begin
@@ -719,8 +738,7 @@ begin
pattern toPattern breaks
// All of the C and S failures in this section are because of functionally equivalent patterns
// JDK doesn't support any patterns with padding or both negative prefix and suffix
-// Breaks ICU4J See ticket 11671
-**0,000 **0,000 HK
+**0,000 **0,000 K
**##0,000 **##0,000 K
**###0,000 **###0,000 K
**####0,000 **#,##0,000 CJKP
@@ -760,25 +778,24 @@ parse output breaks
+5347,,, 5347
+5347,,,d8 5347
(5,347.25) -5347.25
-// H requires prefix and suffix for lenient parsing, but C doesn't
-5,347.25 5347.25 HK
-(5,347.25 -5347.25 H
+5,347.25 5347.25 K
+(5,347.25 -5347.25
// S is successful at parsing this as -5347.25 in lenient mode
--5,347.25 -5347.25 HK
+-5,347.25 -5347.25 K
+3.52E4 35200
(34.8E-3) -0.0348
// JDK stops parsing at the spaces. JDK doesn't see space as a grouping separator
(34 25E-1) -342.5 K
(34,,25E-1) -342.5
// Trailing grouping separators are not OK.
-// H fails; C/J/P stop at the offending separator.
+// C/J/P stop at the offending separator.
(34,,25,E-1) fail CJKP
-(34,,25,E-1) -3425 HK
-(34 25 E-1) -342.5 HK
-(34,,25 E-1) -342.5 HK
+(34,,25,E-1) -3425 K
+(34 25 E-1) -342.5 K
+(34,,25 E-1) -342.5 K
// Spaces are not allowed after exponent symbol
-// C parses up to the E but H bails
-(34 25E -1) -3425 HK
+// C parses up to the E
+(34 25E -1) -3425 K
+3.52EE4 3.52
+1,234,567.8901 1234567.8901
+1,23,4567.8901 1234567.8901
@@ -795,29 +812,21 @@ parse output breaks
+ 79 79 K
+,79,,20,33 792033
+7920d3 7920
-// Whitespace immediately after prefix doesn't count as digit separator
-// in C but is does in H
-+ ,79,,20,33 792033 HK
+// Whitespace immediately after prefix doesn't count as digit separator in C
++ ,79,,20,33 792033 K
( 19 45) -1945 K
// C allows trailing separators when there is a prefix and suffix.
-// H allows trailing separators only when there is just a prefix.
-// In this case, H just bails
-( 19 45 ) -1945 HK
+( 19 45 ) -1945 K
(,,19,45) -1945
-// C parses to the space, but H bails
-(,,19 45) -19 H
-// H bails b/c comma different separator than space. C doesn't treat leading spaces
-// as a separator.
-( 19,45) -1945 HK
-// H bails. Doesn't allow trailing separators when there is prefix and suffix.
-(,,19,45,) -1945 H
-// H bails on next 4 because H doesn't allow letters inside prefix and suffix.
+// C parses to the spaces
+(,,19 45) -19
+( 19,45) -1945 K
+(,,19,45,) -1945
// C will parse up to the letter.
-(,,19,45,d1) -1945 H
-(,,19,45d1) -1945 H
-( 19 45 d1) -1945 HK
-( 19 45d1) -1945 HK
-// H does allow trailing separator before a decimal point
+(,,19,45,d1) -1945
+(,,19,45d1) -1945
+( 19 45 d1) -1945 K
+( 19 45d1) -1945 K
(19,45,.25) -1945.25
// 2nd decimal points are ignored
+4.12.926 4.12
@@ -828,18 +837,16 @@ set pattern #,##0.0###+;#-
begin
parse output breaks
// J and K just bail.
-3426 3426 HK
+3426 3426 K
3426+ 3426
// J bails; K sees -34
-34 d1+ 34 HK
+34 d1+ 34 K
// JDK sees this as -1234 for some reason
-// H bails b/c of trailing separators
-1,234,,,+ 1234 HK
+1,234,,,+ 1234 K
1,234- -1234
-// H, C, and P bail because of trailing separators
-1,234,- -1234 CHJP
-// J bails here too
-1234 - -1234 H
+// C and P bail because of trailing separators
+1,234,- -1234 CJP
+1234 - -1234
@@ -865,8 +872,7 @@ parse output breaks
(3425E-1) -342.5
// Strict doesn't allow separators in sci notation.
(63,425) -63425
-// H does not allow grouping separators in scientific notation.
-(63,425E-1) -6342.5 H
+(63,425E-1) -6342.5
// Both prefix and suffix needed for strict.
// JDK accepts this and parses as -342.5
(3425E-1 fail K
@@ -890,8 +896,7 @@ parse output breaks
+1,234.5 1234.5
// Comma after decimal means parse to a comma
+1,23,456.78,9 123456.78
-// H fails upon seeing the second decimal point
-+1,23,456.78.9 123456.78 H
++1,23,456.78.9 123456.78
+79 79
+79 79
+ 79 fail
@@ -929,8 +934,7 @@ set parseIntegerOnly 1
begin
parse output breaks
35 35
-// S accepts leading plus signs
-+35 35 HK
++35 35 K
-35 -35
2.63 2
-39.99 -39
@@ -944,8 +948,8 @@ parseNoExponent parse output breaks
0 5e2 500 K
0 5.3E2 530
// See ticket 11725
-1 5e2 5 H
-1 5.3E2 5.3 HK
+1 5e2 5
+1 5.3E2 5.3 K
test parse currency fail
set pattern 0
@@ -983,8 +987,8 @@ begin
parse output breaks
// A non-greedy parse is required to pass these cases.
// All of the implementations being tested are greedy.
-6549K 654 CHJKP
-6549N -654 CHJKP
+6549K 654 CJKP
+6549N -654 CJKP
test really strange prefix
set locale en
@@ -1053,41 +1057,41 @@ parse output outputCurrency breaks
$53.45 53.45 USD C
53.45 USD 53.45 USD
53.45 GBP 53.45 GBP
-USD 53.45 53.45 USD H
-53.45USD 53.45 USD H
+USD 53.45 53.45 USD
+53.45USD 53.45 USD
USD53.45 53.45 USD
(7.92) USD -7.92 USD
(7.92) GBP -7.92 GBP
(7.926) USD -7.926 USD
-(7.926 USD) -7.926 USD H
-(USD 7.926) -7.926 USD H
-USD (7.926) -7.926 USD H
-USD (7.92) -7.92 USD H
-(7.92)USD -7.92 USD H
-USD(7.92) -7.92 USD H
+(7.926 USD) -7.926 USD
+(USD 7.926) -7.926 USD
+USD (7.926) -7.926 USD
+USD (7.92) -7.92 USD
+(7.92)USD -7.92 USD
+USD(7.92) -7.92 USD
(8) USD -8 USD
-8 USD -8 USD
67 USD 67 USD
-53.45$ 53.45 USD CH
-US Dollars 53.45 53.45 USD H
+53.45$ 53.45 USD C
+US Dollars 53.45 53.45 USD
53.45 US Dollars 53.45 USD
-US Dollar 53.45 53.45 USD H
+US Dollar 53.45 53.45 USD
53.45 US Dollar 53.45 USD
US Dollars53.45 53.45 USD
-53.45US Dollars 53.45 USD H
+53.45US Dollars 53.45 USD
US Dollar53.45 53.45 USD
US Dollat53.45 fail USD
-53.45US Dollar 53.45 USD H
-US Dollars (53.45) -53.45 USD H
+53.45US Dollar 53.45 USD
+US Dollars (53.45) -53.45 USD
(53.45) US Dollars -53.45 USD
(53.45) Euros -53.45 EUR
-US Dollar (53.45) -53.45 USD H
+US Dollar (53.45) -53.45 USD
(53.45) US Dollar -53.45 USD
-US Dollars(53.45) -53.45 USD H
-(53.45)US Dollars -53.45 USD H
-US Dollar(53.45) -53.45 USD H
+US Dollars(53.45) -53.45 USD
+(53.45)US Dollars -53.45 USD
+US Dollar(53.45) -53.45 USD
US Dollat(53.45) fail USD
-(53.45)US Dollar -53.45 USD H
+(53.45)US Dollar -53.45 USD
test parse currency ISO negative
@@ -1100,27 +1104,27 @@ parse output outputCurrency breaks
$53.45 53.45 USD C
53.45 USD 53.45 USD
53.45 GBP 53.45 GBP
-USD 53.45 53.45 USD H
-53.45USD 53.45 USD H
+USD 53.45 53.45 USD
+53.45USD 53.45 USD
USD53.45 53.45 USD
-7.92 USD -7.92 USD
-7.92 GBP -7.92 GBP
-7.926 USD -7.926 USD
-USD -7.926 -7.926 USD H
--7.92USD -7.92 USD H
-USD-7.92 -7.92 USD H
+USD -7.926 -7.926 USD
+-7.92USD -7.92 USD
+USD-7.92 -7.92 USD
-8 USD -8 USD
67 USD 67 USD
-53.45$ 53.45 USD CH
-US Dollars 53.45 53.45 USD H
+53.45$ 53.45 USD C
+US Dollars 53.45 53.45 USD
53.45 US Dollars 53.45 USD
-US Dollar 53.45 53.45 USD H
+US Dollar 53.45 53.45 USD
53.45 US Dollar 53.45 USD
US Dollars53.45 53.45 USD
-53.45US Dollars 53.45 USD H
+53.45US Dollars 53.45 USD
US Dollar53.45 53.45 USD
US Dollat53.45 fail USD
-53.45US Dollar 53.45 USD H
+53.45US Dollar 53.45 USD
test parse currency long
@@ -1128,38 +1132,36 @@ set pattern 0.00 \u00a4\u00a4\u00a4;(#) \u00a4\u00a4\u00a4
set locale en_GB
begin
parse output outputCurrency breaks
-// H throws a NullPointerException on the first case
53.45 fail GBP
£53.45 53.45 GBP
$53.45 53.45 USD C
53.45 USD 53.45 USD
53.45 GBP 53.45 GBP
-USD 53.45 53.45 USD H
-53.45USD 53.45 USD H
+USD 53.45 53.45 USD
+53.45USD 53.45 USD
USD53.45 53.45 USD
(7.92) USD -7.92 USD
(7.92) GBP -7.92 GBP
(7.926) USD -7.926 USD
-(7.926 USD) -7.926 USD H
-(USD 7.926) -7.926 USD H
-USD (7.926) -7.926 USD H
-USD (7.92) -7.92 USD H
-(7.92)USD -7.92 USD H
-USD(7.92) -7.92 USD H
+(7.926 USD) -7.926 USD
+(USD 7.926) -7.926 USD
+USD (7.926) -7.926 USD
+USD (7.92) -7.92 USD
+(7.92)USD -7.92 USD
+USD(7.92) -7.92 USD
(8) USD -8 USD
-8 USD -8 USD
67 USD 67 USD
-// H throws a NullPointerException on the next case
-53.45$ 53.45 USD CH
-US Dollars 53.45 53.45 USD H
+53.45$ 53.45 USD C
+US Dollars 53.45 53.45 USD
53.45 US Dollars 53.45 USD
-US Dollar 53.45 53.45 USD H
+US Dollar 53.45 53.45 USD
53.45 US Dollar 53.45 USD
US Dollars53.45 53.45 USD
-53.45US Dollars 53.45 USD H
+53.45US Dollars 53.45 USD
US Dollar53.45 53.45 USD
US Dollat53.45 fail USD
-53.45US Dollar 53.45 USD H
+53.45US Dollar 53.45 USD
test parse currency short
@@ -1172,31 +1174,31 @@ parse output outputCurrency breaks
$53.45 53.45 USD C
53.45 USD 53.45 USD
53.45 GBP 53.45 GBP
-USD 53.45 53.45 USD H
-53.45USD 53.45 USD H
+USD 53.45 53.45 USD
+53.45USD 53.45 USD
USD53.45 53.45 USD
(7.92) USD -7.92 USD
(7.92) GBP -7.92 GBP
(7.926) USD -7.926 USD
-(7.926 USD) -7.926 USD H
-(USD 7.926) -7.926 USD H
-USD (7.926) -7.926 USD H
-USD (7.92) -7.92 USD H
-(7.92)USD -7.92 USD H
-USD(7.92) -7.92 USD H
+(7.926 USD) -7.926 USD
+(USD 7.926) -7.926 USD
+USD (7.926) -7.926 USD
+USD (7.92) -7.92 USD
+(7.92)USD -7.92 USD
+USD(7.92) -7.92 USD
(8) USD -8 USD
-8 USD -8 USD
67 USD 67 USD
-53.45$ 53.45 USD CH
-US Dollars 53.45 53.45 USD H
+53.45$ 53.45 USD C
+US Dollars 53.45 53.45 USD
53.45 US Dollars 53.45 USD
-US Dollar 53.45 53.45 USD H
+US Dollar 53.45 53.45 USD
53.45 US Dollar 53.45 USD
US Dollars53.45 53.45 USD
-53.45US Dollars 53.45 USD H
+53.45US Dollars 53.45 USD
US Dollar53.45 53.45 USD
US Dollat53.45 fail USD
-53.45US Dollar 53.45 USD H
+53.45US Dollar 53.45 USD
test parse currency short prefix
@@ -1209,31 +1211,31 @@ parse output outputCurrency breaks
$53.45 53.45 USD C
53.45 USD 53.45 USD
53.45 GBP 53.45 GBP
-USD 53.45 53.45 USD H
-53.45USD 53.45 USD H
+USD 53.45 53.45 USD
+53.45USD 53.45 USD
USD53.45 53.45 USD
// C and P fail these because '(' is an incomplete prefix.
-(7.92) USD -7.92 USD CHJP
-(7.92) GBP -7.92 GBP CHJP
-(7.926) USD -7.926 USD CHJP
-(7.926 USD) -7.926 USD CHJP
-(USD 7.926) -7.926 USD H
-USD (7.926) -7.926 USD CHJP
-USD (7.92) -7.92 USD CHJP
-(7.92)USD -7.92 USD CHJP
-USD(7.92) -7.92 USD CHJP
-(8) USD -8 USD CHJP
+(7.92) USD -7.92 USD CJP
+(7.92) GBP -7.92 GBP CJP
+(7.926) USD -7.926 USD CJP
+(7.926 USD) -7.926 USD CJP
+(USD 7.926) -7.926 USD
+USD (7.926) -7.926 USD CJP
+USD (7.92) -7.92 USD CJP
+(7.92)USD -7.92 USD CJP
+USD(7.92) -7.92 USD CJP
+(8) USD -8 USD CJP
-8 USD -8 USD
67 USD 67 USD
-53.45$ 53.45 USD CH
-US Dollars 53.45 53.45 USD H
+53.45$ 53.45 USD C
+US Dollars 53.45 53.45 USD
53.45 US Dollars 53.45 USD
-US Dollar 53.45 53.45 USD H
+US Dollar 53.45 53.45 USD
53.45 US Dollar 53.45 USD
US Dollars53.45 53.45 USD
-53.45US Dollars 53.45 USD H
+53.45US Dollars 53.45 USD
US Dollar53.45 53.45 USD
-53.45US Dollar 53.45 USD H
+53.45US Dollar 53.45 USD
test format foreign currency
set locale fa_IR
@@ -1348,7 +1350,7 @@ USD (7.92) fail USD
(7.92)USD fail USD
USD(7.92) fail USD
(8) USD -8 USD
--8 USD fail USD H
+-8 USD fail USD
67 USD 67 USD
53.45$ fail USD
US Dollars 53.45 fail USD
@@ -1377,7 +1379,7 @@ set minFractionDigits 0
set maxFractionDigits 0
begin
format output breaks
--0.99 -0 HK
+-0.99 -0 K
test parse decimalPatternMatchRequired
set locale en
@@ -1386,11 +1388,11 @@ begin
pattern parse output breaks
// K doesn't support this feature.
0 123 123
-0 123. fail HK
-0 1.23 fail HK
+0 123. fail K
+0 1.23 fail K
0 -513 -513
-0 -513. fail HK
-0 -5.13 fail HK
+0 -513. fail K
+0 -5.13 fail K
0.0 123 fail K
0.0 123. 123
0.0 1.23 1.23
@@ -1404,13 +1406,13 @@ set pattern #
begin
pattern parse output breaks
# -123 -123
-# - 123 -123 HK
-# -123 -123 HK
-# - 123 -123 HK
+# - 123 -123 K
+# -123 -123 K
+# - 123 -123 K
# 123- 123
# 123 - 123
#;#- 123- -123
-#;#- 123 - -123 HK
+#;#- 123 - -123 K
test parse case sensitive
set locale en
@@ -1421,19 +1423,18 @@ parse parseCaseSensitive output breaks
Aa1.23 1 1.23
Aa1.23 0 1.23
AA1.23 1 fail
-// H and K do not support case-insensitive parsing for prefix/suffix.
-// H supports it for the exponent separator, but not K.
-AA1.23 0 1.23 HK
+// K does not support case-insensitive parsing for prefix/suffix.
+AA1.23 0 1.23 K
aa1.23 1 fail
-aa1.23 0 1.23 HK
+aa1.23 0 1.23 K
Aa1.23E3 1 1230
Aa1.23E3 0 1230
-Aa1.23e3 1 1.23 H
+Aa1.23e3 1 1.23
Aa1.23e3 0 1230 K
NaN 1 NaN K
NaN 0 NaN K
nan 1 fail
-nan 0 NaN HK
+nan 0 NaN K
test parse infinity and scientific notation overflow
set locale en
@@ -1449,13 +1450,13 @@ NaN NaN K
-1E-99999999999999 -0.0
1E2147483648 Inf K
1E2147483647 Inf K
-// H, J and K get Infinity
-1E2147483646 1E+2147483646 HJK
+// J and K get Infinity
+1E2147483646 1E+2147483646 JK
1E-2147483649 0
1E-2147483648 0
-// H and K return zero here
-1E-2147483647 1E-2147483647 HJK
-1E-2147483646 1E-2147483646 HJK
+// K returns zero here
+1E-2147483647 1E-2147483647 JK
+1E-2147483646 1E-2147483646 JK
test format push limits
set locale en
@@ -1483,13 +1484,13 @@ begin
pattern lenient parse output breaks
// Groups after the first group need 2 digits to be accepted.
// JDK does not see space as grouping and parses most of these as 9.
-#,##0 1 9 9 9 H
+#,##0 1 9 9 9
#,##0 1 9 99 999 K
#,##0 1 9 999 9999 K
-#,##0 1 9 9 9 9 H
+#,##0 1 9 9 9 9
#,##0 1 ,9 9
#,##0 1 99,.0 99
-#,##0 1 9 9. 9 H
+#,##0 1 9 9. 9
#,##0 1 9 99. 999 K
0 1 9 9 9
0 1 9 99 9
@@ -1536,36 +1537,36 @@ parse output breaks
x a‎b56c df 56
x a‎b56c df 56 K
x ab56c df 56 K
-x ab56c df 56 HK
+x ab56c df 56 K
x ab56c df 56 K
-x ab56 56 HK
-x a b56 56 HK
-56cdf 56 HK
-56c df 56 HK
-56cd f 56 HK
-56c‎d‎f 56 HK
-56cdf 56 HK
-56c d‎f 56 HK
-56‎c df 56 HK
+x ab56 56 K
+x a b56 56 K
+56cdf 56 K
+56c df 56 K
+56cd f 56 K
+56c‎d‎f 56 K
+56cdf 56 K
+56c d‎f 56 K
+56‎c df 56 K
y g‎h56i jk -56
y g‎h56i jk -56 K
y gh56i jk -56 K
-y gh56i jk -56 HK
+y gh56i jk -56 K
y gh56i jk -56 K
-y gh56 -56 HK
-y g h56 -56 HK
+y gh56 -56 K
+y g h56 -56 K
// S stops parsing after the 'i' for these and returns -56
// C stops before the 'i' and gets 56
-56ijk -56 HK
-56i jk -56 HK
-56ij k -56 HK
-56i‎j‎k -56 HK
-56ijk -56 HK
-56i j‎k -56 HK
-56‎i jk -56 HK
-// S and C get 56 (accepts ' ' gs grouping); H and K get null
+56ijk -56 K
+56i jk -56 K
+56ij k -56 K
+56i‎j‎k -56 K
+56ijk -56 K
+56i j‎k -56 K
+56‎i jk -56 K
+// S and C get 56 (accepts ' ' gs grouping); K gets null
5 6 fail CJP
-5‎6 5 HK
+5‎6 5 K
test parse spaces in grouping
// This test gives the ideal behavior of these cases, which
@@ -1575,7 +1576,7 @@ set locale en
set pattern #,##0
begin
parse output breaks
-1 2 1 H
+1 2 1
1 23 123 K
// K gets 1 here; doesn't pick up the grouping separator
1 234 1234 K
@@ -1591,7 +1592,7 @@ format output breaks
// C and J get "1"
// P gets "1.0"
// K gets "1.1" (??)
-0.975 0.98 CHJKP
+0.975 0.98 CJKP
test lenient parse currency match
// This test is for #13112
@@ -1599,8 +1600,8 @@ set locale en
set pattern ¤#,##0.00
begin
parse output breaks
-// H and K get null
-1.23!@#$%^ 1.23 HK
+// K gets null
+1.23!@#$%^ 1.23 K
test percentage parsing multiplier
// This test is for #13114
@@ -1609,9 +1610,9 @@ set pattern 0%
begin
parse output breaks
55% 0.55
-// H and K get null
+// K gets null
// C and P scale by 100 even if the percent sign is not present
-55 0.55 HK
+55 0.55 K
test trailing grouping separators in pattern
// This test is for #13115
@@ -1630,8 +1631,8 @@ begin
pattern format output breaks
0 -15 -15
0; -15 -15
-// H and K still prepend a '-' even though the pattern says otherwise
-0;0 -15 15 HK
+// K still prepends a '-' even though the pattern says otherwise
+0;0 -15 15 K
test percentage multiplier parsing
// This test is for #13129
@@ -1647,9 +1648,9 @@ set pattern 0
set signAlwaysShown 1
begin
format output breaks
-// H and K do not support this feature
-42 +42 HK
-0 +0 HK
+// K does not support this feature
+42 +42 K
+0 +0 K
-42 -42
test parse strict with plus sign
@@ -1660,14 +1661,14 @@ begin
lenient parse output breaks
1 42 42
1 -42 -42
-1 +42 42 HK
+1 +42 42 K
1 0 0
-1 +0 0 HK
-0 42 fail HK
+1 +0 0 K
+0 42 fail K
0 -42 -42
-0 +42 42 HK
-0 0 fail HK
-0 +0 0 HK
+0 +42 42 K
+0 0 fail K
+0 +0 0 K
test parse with scientific-separator-affix overlap
set locale en
@@ -1685,13 +1686,13 @@ set currency USD
begin
parse output breaks
USD123 123
-USD 123 123 HK
+USD 123 123 K
usd123 123 K
-usd 123 123 HK
+usd 123 123 K
Usd123 123 K
-Usd 123 123 HK
+Usd 123 123 K
// US$ is not used for US dollars in en-US
-US$123 fail H
+US$123 fail
us$123 fail
Us$123 fail
123 US dollars 123 K
@@ -1710,11 +1711,11 @@ set currency USD
begin
parse output outputCurrency breaks
USD123 123 USD
-USD 123 123 USD H
+USD 123 123 USD
usd123 123 USD
-usd 123 123 USD H
+usd 123 123 USD
Usd123 123 USD
-Usd 123 123 USD H
+Usd 123 123 USD
US$123 123 USD C
us$123 fail fail
Us$123 fail fail
@@ -1723,10 +1724,16 @@ Us$123 fail fail
123 us dollars 123 USD
GBP123 123 GBP
gbp123 123 GBP C
-British pounds 123 123 GBP H
-british POUNDS 123 123 GBP H
-
+British pounds 123 123 GBP
+british POUNDS 123 123 GBP
+test parse scientific with bidi marks
+begin
+locale parse output breaks
+en 4E\u200E+02 400 K
+en 4E+02 400 K
+he 4E\u200E+02 400 K
+he 4E+02 400 K
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/numberpermutationtest.txt b/Build/source/libs/icu/icu-src/source/test/testdata/numberpermutationtest.txt
new file mode 100644
index 00000000000..b9c8558d1e6
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/numberpermutationtest.txt
@@ -0,0 +1,9103 @@
+# © 2019 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+compact-short percent unit-width-narrow
+ es-MX
+ 0 %
+ 92 k
+ -0.22 %
+ zh-TW
+ 0%
+ 9.2萬
+ -0.22%
+ bn-BD
+ ০%
+ ৯২ হা
+ -০.২২%
+
+compact-short percent unit-width-full-name
+ es-MX
+ 0 %
+ 92 k
+ -0.22 %
+ zh-TW
+ 0%
+ 9.2萬
+ -0.22%
+ bn-BD
+ ০%
+ ৯২ হা
+ -০.২২%
+
+compact-short currency/EUR unit-width-narrow
+ es-MX
+ €0
+ 92 k€
+ -€0.22
+ zh-TW
+ €0
+ €9.2萬
+ -€0.22
+ bn-BD
+ ০€
+ ৯২ হা€
+ -০.২২€
+
+compact-short currency/EUR unit-width-full-name
+ es-MX
+ 0 euros
+ 92 k euros
+ -0.22 euros
+ zh-TW
+ 0 歐元
+ 9.2萬 歐元
+ -0.22 歐元
+ bn-BD
+ ০ ইউরো
+ ৯২ হা ইউরো
+ -০.২২ ইউরো
+
+compact-short measure-unit/length-furlong unit-width-narrow
+ es-MX
+ 0 fur
+ 92 k fur
+ -0.22 fur
+ zh-TW
+ 0化朗
+ 9.2萬化朗
+ -0.22化朗
+ bn-BD
+ ০ ফার্লং
+ ৯২ হা ফার্লং
+ -০.২২ ফার্লং
+
+compact-short measure-unit/length-furlong unit-width-full-name
+ es-MX
+ 0 fur
+ 92 k fur
+ -0.22 fur
+ zh-TW
+ 0 化朗
+ 9.2萬 化朗
+ -0.22 化朗
+ bn-BD
+ ০ ফার্লং
+ ৯২ হা ফার্লং
+ -০.২২ ফার্লং
+
+scientific/+ee/sign-always percent unit-width-narrow
+ es-MX
+ 0E+00 %
+ 9.182736E+04 %
+ -2.2222E-01 %
+ zh-TW
+ 0E+00%
+ 9.182736E+04%
+ -2.2222E-01%
+ bn-BD
+ ০E+০০%
+ ৯.১৮২৭৩৬E+০৪%
+ -২.২২২২E-০১%
+
+scientific/+ee/sign-always percent unit-width-full-name
+ es-MX
+ 0E+00 %
+ 9.182736E+04 %
+ -2.2222E-01 %
+ zh-TW
+ 0E+00%
+ 9.182736E+04%
+ -2.2222E-01%
+ bn-BD
+ ০E+০০%
+ ৯.১৮২৭৩৬E+০৪%
+ -২.২২২২E-০১%
+
+scientific/+ee/sign-always currency/EUR unit-width-narrow
+ es-MX
+ €0.00E+00
+ €9.18E+04
+ -€2.22E-01
+ zh-TW
+ €0.00E+00
+ €9.18E+04
+ -€2.22E-01
+ bn-BD
+ ০.০০E+০০€
+ ৯.১৮E+০৪€
+ -২.২২E-০১€
+
+scientific/+ee/sign-always currency/EUR unit-width-full-name
+ es-MX
+ 0.00E+00 euros
+ 9.18E+04 euros
+ -2.22E-01 euros
+ zh-TW
+ 0.00E+00 歐元
+ 9.18E+04 歐元
+ -2.22E-01 歐元
+ bn-BD
+ ০.০০E+০০ ইউরো
+ ৯.১৮E+০৪ ইউরো
+ -২.২২E-০১ ইউরো
+
+scientific/+ee/sign-always measure-unit/length-furlong unit-width-narrow
+ es-MX
+ 0E+00 fur
+ 9.182736E+04 fur
+ -2.2222E-01 fur
+ zh-TW
+ 0E+00化朗
+ 9.182736E+04化朗
+ -2.2222E-01化朗
+ bn-BD
+ ০E+০০ ফার্লং
+ ৯.১৮২৭৩৬E+০৪ ফার্লং
+ -২.২২২২E-০১ ফার্লং
+
+scientific/+ee/sign-always measure-unit/length-furlong unit-width-full-name
+ es-MX
+ 0E+00 fur
+ 9.182736E+04 fur
+ -2.2222E-01 fur
+ zh-TW
+ 0E+00 化朗
+ 9.182736E+04 化朗
+ -2.2222E-01 化朗
+ bn-BD
+ ০E+০০ ফার্লং
+ ৯.১৮২৭৩৬E+০৪ ফার্লং
+ -২.২২২২E-০১ ফার্লং
+
+compact-short percent precision-integer
+ es-MX
+ 0 %
+ 92 k
+ -0 %
+ zh-TW
+ 0%
+ 9萬
+ -0%
+ bn-BD
+ ০%
+ ৯২ হা
+ -০%
+
+compact-short percent .000
+ es-MX
+ 0.000 %
+ 91.827 k
+ -0.222 %
+ zh-TW
+ 0.000%
+ 9.183萬
+ -0.222%
+ bn-BD
+ ০.০০০%
+ ৯১.৮২৭ হা
+ -০.২২২%
+
+compact-short percent .##/@@@+
+ es-MX
+ 0 %
+ 91.83 k
+ -0.222 %
+ zh-TW
+ 0%
+ 9.18萬
+ -0.222%
+ bn-BD
+ ০%
+ ৯১.৮৩ হা
+ -০.২২২%
+
+compact-short percent @@
+ es-MX
+ 0.0 %
+ 92 k
+ -0.22 %
+ zh-TW
+ 0.0%
+ 9.2萬
+ -0.22%
+ bn-BD
+ ০.০%
+ ৯২ হা
+ -০.২২%
+
+compact-short currency/EUR precision-integer
+ es-MX
+ EUR 0
+ 92 kEUR
+ -EUR 0
+ zh-TW
+ €0
+ €9萬
+ -€0
+ bn-BD
+ ০€
+ ৯২ হা€
+ -০€
+
+compact-short currency/EUR .000
+ es-MX
+ EUR 0.000
+ 91.827 kEUR
+ -EUR 0.222
+ zh-TW
+ €0.000
+ €9.183萬
+ -€0.222
+ bn-BD
+ ০.০০০€
+ ৯১.৮২৭ হা€
+ -০.২২২€
+
+compact-short currency/EUR .##/@@@+
+ es-MX
+ EUR 0
+ 91.83 kEUR
+ -EUR 0.222
+ zh-TW
+ €0
+ €9.18萬
+ -€0.222
+ bn-BD
+ ০€
+ ৯১.৮৩ হা€
+ -০.২২২€
+
+compact-short currency/EUR @@
+ es-MX
+ EUR 0.0
+ 92 kEUR
+ -EUR 0.22
+ zh-TW
+ €0.0
+ €9.2萬
+ -€0.22
+ bn-BD
+ ০.০€
+ ৯২ হা€
+ -০.২২€
+
+compact-short measure-unit/length-furlong precision-integer
+ es-MX
+ 0 fur
+ 92 k fur
+ -0 fur
+ zh-TW
+ 0 化朗
+ 9萬 化朗
+ -0 化朗
+ bn-BD
+ ০ ফার্লং
+ ৯২ হা ফার্লং
+ -০ ফার্লং
+
+compact-short measure-unit/length-furlong .000
+ es-MX
+ 0.000 fur
+ 91.827 k fur
+ -0.222 fur
+ zh-TW
+ 0.000 化朗
+ 9.183萬 化朗
+ -0.222 化朗
+ bn-BD
+ ০.০০০ ফার্লং
+ ৯১.৮২৭ হা ফার্লং
+ -০.২২২ ফার্লং
+
+compact-short measure-unit/length-furlong .##/@@@+
+ es-MX
+ 0 fur
+ 91.83 k fur
+ -0.222 fur
+ zh-TW
+ 0 化朗
+ 9.18萬 化朗
+ -0.222 化朗
+ bn-BD
+ ০ ফার্লং
+ ৯১.৮৩ হা ফার্লং
+ -০.২২২ ফার্লং
+
+compact-short measure-unit/length-furlong @@
+ es-MX
+ 0.0 fur
+ 92 k fur
+ -0.22 fur
+ zh-TW
+ 0.0 化朗
+ 9.2萬 化朗
+ -0.22 化朗
+ bn-BD
+ ০.০ ফার্লং
+ ৯২ হা ফার্লং
+ -০.২২ ফার্লং
+
+scientific/+ee/sign-always percent precision-integer
+ es-MX
+ 0E+00 %
+ 9E+04 %
+ -2E-01 %
+ zh-TW
+ 0E+00%
+ 9E+04%
+ -2E-01%
+ bn-BD
+ ০E+০০%
+ ৯E+০৪%
+ -২E-০১%
+
+scientific/+ee/sign-always percent .000
+ es-MX
+ 0.000E+00 %
+ 9.183E+04 %
+ -2.222E-01 %
+ zh-TW
+ 0.000E+00%
+ 9.183E+04%
+ -2.222E-01%
+ bn-BD
+ ০.০০০E+০০%
+ ৯.১৮৩E+০৪%
+ -২.২২২E-০১%
+
+scientific/+ee/sign-always percent .##/@@@+
+ es-MX
+ 0E+00 %
+ 9.18E+04 %
+ -2.22E-01 %
+ zh-TW
+ 0E+00%
+ 9.18E+04%
+ -2.22E-01%
+ bn-BD
+ ০E+০০%
+ ৯.১৮E+০৪%
+ -২.২২E-০১%
+
+scientific/+ee/sign-always percent @@
+ es-MX
+ 0.0E+00 %
+ 9.2E+04 %
+ -2.2E-01 %
+ zh-TW
+ 0.0E+00%
+ 9.2E+04%
+ -2.2E-01%
+ bn-BD
+ ০.০E+০০%
+ ৯.২E+০৪%
+ -২.২E-০১%
+
+scientific/+ee/sign-always currency/EUR precision-integer
+ es-MX
+ EUR 0E+00
+ EUR 9E+04
+ -EUR 2E-01
+ zh-TW
+ €0E+00
+ €9E+04
+ -€2E-01
+ bn-BD
+ ০E+০০€
+ ৯E+০৪€
+ -২E-০১€
+
+scientific/+ee/sign-always currency/EUR .000
+ es-MX
+ EUR 0.000E+00
+ EUR 9.183E+04
+ -EUR 2.222E-01
+ zh-TW
+ €0.000E+00
+ €9.183E+04
+ -€2.222E-01
+ bn-BD
+ ০.০০০E+০০€
+ ৯.১৮৩E+০৪€
+ -২.২২২E-০১€
+
+scientific/+ee/sign-always currency/EUR .##/@@@+
+ es-MX
+ EUR 0E+00
+ EUR 9.18E+04
+ -EUR 2.22E-01
+ zh-TW
+ €0E+00
+ €9.18E+04
+ -€2.22E-01
+ bn-BD
+ ০E+০০€
+ ৯.১৮E+০৪€
+ -২.২২E-০১€
+
+scientific/+ee/sign-always currency/EUR @@
+ es-MX
+ EUR 0.0E+00
+ EUR 9.2E+04
+ -EUR 2.2E-01
+ zh-TW
+ €0.0E+00
+ €9.2E+04
+ -€2.2E-01
+ bn-BD
+ ০.০E+০০€
+ ৯.২E+০৪€
+ -২.২E-০১€
+
+scientific/+ee/sign-always measure-unit/length-furlong precision-integer
+ es-MX
+ 0E+00 fur
+ 9E+04 fur
+ -2E-01 fur
+ zh-TW
+ 0E+00 化朗
+ 9E+04 化朗
+ -2E-01 化朗
+ bn-BD
+ ০E+০০ ফার্লং
+ ৯E+০৪ ফার্লং
+ -২E-০১ ফার্লং
+
+scientific/+ee/sign-always measure-unit/length-furlong .000
+ es-MX
+ 0.000E+00 fur
+ 9.183E+04 fur
+ -2.222E-01 fur
+ zh-TW
+ 0.000E+00 化朗
+ 9.183E+04 化朗
+ -2.222E-01 化朗
+ bn-BD
+ ০.০০০E+০০ ফার্লং
+ ৯.১৮৩E+০৪ ফার্লং
+ -২.২২২E-০১ ফার্লং
+
+scientific/+ee/sign-always measure-unit/length-furlong .##/@@@+
+ es-MX
+ 0E+00 fur
+ 9.18E+04 fur
+ -2.22E-01 fur
+ zh-TW
+ 0E+00 化朗
+ 9.18E+04 化朗
+ -2.22E-01 化朗
+ bn-BD
+ ০E+০০ ফার্লং
+ ৯.১৮E+০৪ ফার্লং
+ -২.২২E-০১ ফার্লং
+
+scientific/+ee/sign-always measure-unit/length-furlong @@
+ es-MX
+ 0.0E+00 fur
+ 9.2E+04 fur
+ -2.2E-01 fur
+ zh-TW
+ 0.0E+00 化朗
+ 9.2E+04 化朗
+ -2.2E-01 化朗
+ bn-BD
+ ০.০E+০০ ফার্লং
+ ৯.২E+০৪ ফার্লং
+ -২.২E-০১ ফার্লং
+
+compact-short percent rounding-mode-floor
+ es-MX
+ 0 %
+ 91 k
+ -0.23 %
+ zh-TW
+ 0%
+ 9.1萬
+ -0.23%
+ bn-BD
+ ০%
+ ৯১ হা
+ -০.২৩%
+
+compact-short currency/EUR rounding-mode-floor
+ es-MX
+ EUR 0
+ 91 kEUR
+ -EUR 0.23
+ zh-TW
+ €0
+ €9.1萬
+ -€0.23
+ bn-BD
+ ০€
+ ৯১ হা€
+ -০.২৩€
+
+compact-short measure-unit/length-furlong rounding-mode-floor
+ es-MX
+ 0 fur
+ 91 k fur
+ -0.23 fur
+ zh-TW
+ 0 化朗
+ 9.1萬 化朗
+ -0.23 化朗
+ bn-BD
+ ০ ফার্লং
+ ৯১ হা ফার্লং
+ -০.২৩ ফার্লং
+
+scientific/+ee/sign-always percent rounding-mode-floor
+ es-MX
+ 0E+00 %
+ 9.182736E+04 %
+ -2.2222E-01 %
+ zh-TW
+ 0E+00%
+ 9.182736E+04%
+ -2.2222E-01%
+ bn-BD
+ ০E+০০%
+ ৯.১৮২৭৩৬E+০৪%
+ -২.২২২২E-০১%
+
+scientific/+ee/sign-always currency/EUR rounding-mode-floor
+ es-MX
+ EUR 0.00E+00
+ EUR 9.18E+04
+ -EUR 2.23E-01
+ zh-TW
+ €0.00E+00
+ €9.18E+04
+ -€2.23E-01
+ bn-BD
+ ০.০০E+০০€
+ ৯.১৮E+০৪€
+ -২.২৩E-০১€
+
+scientific/+ee/sign-always measure-unit/length-furlong rounding-mode-floor
+ es-MX
+ 0E+00 fur
+ 9.182736E+04 fur
+ -2.2222E-01 fur
+ zh-TW
+ 0E+00 化朗
+ 9.182736E+04 化朗
+ -2.2222E-01 化朗
+ bn-BD
+ ০E+০০ ফার্লং
+ ৯.১৮২৭৩৬E+০৪ ফার্লং
+ -২.২২২২E-০১ ফার্লং
+
+compact-short percent integer-width/##00
+ es-MX
+ 00 %
+ 92 k
+ -00.22 %
+ zh-TW
+ 00%
+ 09.2萬
+ -00.22%
+ bn-BD
+ ০০%
+ ৯২ হা
+ -০০.২২%
+
+compact-short currency/EUR integer-width/##00
+ es-MX
+ EUR 00
+ 92 kEUR
+ -EUR 00.22
+ zh-TW
+ €00
+ €09.2萬
+ -€00.22
+ bn-BD
+ ০০€
+ ৯২ হা€
+ -০০.২২€
+
+compact-short measure-unit/length-furlong integer-width/##00
+ es-MX
+ 00 fur
+ 92 k fur
+ -00.22 fur
+ zh-TW
+ 00 化朗
+ 09.2萬 化朗
+ -00.22 化朗
+ bn-BD
+ ০০ ফার্লং
+ ৯২ হা ফার্লং
+ -০০.২২ ফার্লং
+
+scientific/+ee/sign-always percent integer-width/##00
+ es-MX
+ 00E+00 %
+ 09.182736E+04 %
+ -02.2222E-01 %
+ zh-TW
+ 00E+00%
+ 09.182736E+04%
+ -02.2222E-01%
+ bn-BD
+ ০০E+০০%
+ ০৯.১৮২৭৩৬E+০৪%
+ -০২.২২২২E-০১%
+
+scientific/+ee/sign-always currency/EUR integer-width/##00
+ es-MX
+ EUR 00.00E+00
+ EUR 09.18E+04
+ -EUR 02.22E-01
+ zh-TW
+ €00.00E+00
+ €09.18E+04
+ -€02.22E-01
+ bn-BD
+ ০০.০০E+০০€
+ ০৯.১৮E+০৪€
+ -০২.২২E-০১€
+
+scientific/+ee/sign-always measure-unit/length-furlong integer-width/##00
+ es-MX
+ 00E+00 fur
+ 09.182736E+04 fur
+ -02.2222E-01 fur
+ zh-TW
+ 00E+00 化朗
+ 09.182736E+04 化朗
+ -02.2222E-01 化朗
+ bn-BD
+ ০০E+০০ ফার্লং
+ ০৯.১৮২৭৩৬E+০৪ ফার্লং
+ -০২.২২২২E-০১ ফার্লং
+
+compact-short percent scale/0.5
+ es-MX
+ 0 %
+ 46 k
+ -0.11 %
+ zh-TW
+ 0%
+ 4.6萬
+ -0.11%
+ bn-BD
+ ০%
+ ৪৬ হা
+ -০.১১%
+
+compact-short currency/EUR scale/0.5
+ es-MX
+ EUR 0
+ 46 kEUR
+ -EUR 0.11
+ zh-TW
+ €0
+ €4.6萬
+ -€0.11
+ bn-BD
+ ০€
+ ৪৬ হা€
+ -০.১১€
+
+compact-short measure-unit/length-furlong scale/0.5
+ es-MX
+ 0 fur
+ 46 k fur
+ -0.11 fur
+ zh-TW
+ 0 化朗
+ 4.6萬 化朗
+ -0.11 化朗
+ bn-BD
+ ০ ফার্লং
+ ৪৬ হা ফার্লং
+ -০.১১ ফার্লং
+
+scientific/+ee/sign-always percent scale/0.5
+ es-MX
+ 0E+00 %
+ 4.591368E+04 %
+ -1.1111E-01 %
+ zh-TW
+ 0E+00%
+ 4.591368E+04%
+ -1.1111E-01%
+ bn-BD
+ ০E+০০%
+ ৪.৫৯১৩৬৮E+০৪%
+ -১.১১১১E-০১%
+
+scientific/+ee/sign-always currency/EUR scale/0.5
+ es-MX
+ EUR 0.00E+00
+ EUR 4.59E+04
+ -EUR 1.11E-01
+ zh-TW
+ €0.00E+00
+ €4.59E+04
+ -€1.11E-01
+ bn-BD
+ ০.০০E+০০€
+ ৪.৫৯E+০৪€
+ -১.১১E-০১€
+
+scientific/+ee/sign-always measure-unit/length-furlong scale/0.5
+ es-MX
+ 0E+00 fur
+ 4.591368E+04 fur
+ -1.1111E-01 fur
+ zh-TW
+ 0E+00 化朗
+ 4.591368E+04 化朗
+ -1.1111E-01 化朗
+ bn-BD
+ ০E+০০ ফার্লং
+ ৪.৫৯১৩৬৮E+০৪ ফার্লং
+ -১.১১১১E-০১ ফার্লং
+
+compact-short percent group-on-aligned
+ es-MX
+ 0 %
+ 92 k
+ -0.22 %
+ zh-TW
+ 0%
+ 9.2萬
+ -0.22%
+ bn-BD
+ ০%
+ ৯২ হা
+ -০.২২%
+
+compact-short currency/EUR group-on-aligned
+ es-MX
+ EUR 0
+ 92 kEUR
+ -EUR 0.22
+ zh-TW
+ €0
+ €9.2萬
+ -€0.22
+ bn-BD
+ ০€
+ ৯২ হা€
+ -০.২২€
+
+compact-short measure-unit/length-furlong group-on-aligned
+ es-MX
+ 0 fur
+ 92 k fur
+ -0.22 fur
+ zh-TW
+ 0 化朗
+ 9.2萬 化朗
+ -0.22 化朗
+ bn-BD
+ ০ ফার্লং
+ ৯২ হা ফার্লং
+ -০.২২ ফার্লং
+
+scientific/+ee/sign-always percent group-on-aligned
+ es-MX
+ 0E+00 %
+ 9.182736E+04 %
+ -2.2222E-01 %
+ zh-TW
+ 0E+00%
+ 9.182736E+04%
+ -2.2222E-01%
+ bn-BD
+ ০E+০০%
+ ৯.১৮২৭৩৬E+০৪%
+ -২.২২২২E-০১%
+
+scientific/+ee/sign-always currency/EUR group-on-aligned
+ es-MX
+ EUR 0.00E+00
+ EUR 9.18E+04
+ -EUR 2.22E-01
+ zh-TW
+ €0.00E+00
+ €9.18E+04
+ -€2.22E-01
+ bn-BD
+ ০.০০E+০০€
+ ৯.১৮E+০৪€
+ -২.২২E-০১€
+
+scientific/+ee/sign-always measure-unit/length-furlong group-on-aligned
+ es-MX
+ 0E+00 fur
+ 9.182736E+04 fur
+ -2.2222E-01 fur
+ zh-TW
+ 0E+00 化朗
+ 9.182736E+04 化朗
+ -2.2222E-01 化朗
+ bn-BD
+ ০E+০০ ফার্লং
+ ৯.১৮২৭৩৬E+০৪ ফার্লং
+ -২.২২২২E-০১ ফার্লং
+
+compact-short percent latin
+ es-MX
+ 0 %
+ 92 k
+ -0.22 %
+ zh-TW
+ 0%
+ 9.2萬
+ -0.22%
+ bn-BD
+ 0%
+ 92 হা
+ -0.22%
+
+compact-short currency/EUR latin
+ es-MX
+ EUR 0
+ 92 kEUR
+ -EUR 0.22
+ zh-TW
+ €0
+ €9.2萬
+ -€0.22
+ bn-BD
+ 0€
+ 92 হা€
+ -0.22€
+
+compact-short measure-unit/length-furlong latin
+ es-MX
+ 0 fur
+ 92 k fur
+ -0.22 fur
+ zh-TW
+ 0 化朗
+ 9.2萬 化朗
+ -0.22 化朗
+ bn-BD
+ 0 ফার্লং
+ 92 হা ফার্লং
+ -0.22 ফার্লং
+
+scientific/+ee/sign-always percent latin
+ es-MX
+ 0E+00 %
+ 9.182736E+04 %
+ -2.2222E-01 %
+ zh-TW
+ 0E+00%
+ 9.182736E+04%
+ -2.2222E-01%
+ bn-BD
+ 0E+00%
+ 9.182736E+04%
+ -2.2222E-01%
+
+scientific/+ee/sign-always currency/EUR latin
+ es-MX
+ EUR 0.00E+00
+ EUR 9.18E+04
+ -EUR 2.22E-01
+ zh-TW
+ €0.00E+00
+ €9.18E+04
+ -€2.22E-01
+ bn-BD
+ 0.00E+00€
+ 9.18E+04€
+ -2.22E-01€
+
+scientific/+ee/sign-always measure-unit/length-furlong latin
+ es-MX
+ 0E+00 fur
+ 9.182736E+04 fur
+ -2.2222E-01 fur
+ zh-TW
+ 0E+00 化朗
+ 9.182736E+04 化朗
+ -2.2222E-01 化朗
+ bn-BD
+ 0E+00 ফার্লং
+ 9.182736E+04 ফার্লং
+ -2.2222E-01 ফার্লং
+
+compact-short percent sign-accounting-except-zero
+ es-MX
+ 0 %
+ +92 k
+ -0.22 %
+ zh-TW
+ 0%
+ +9.2萬
+ -0.22%
+ bn-BD
+ ০%
+ +৯২ হা
+ -০.২২%
+
+compact-short currency/EUR sign-accounting-except-zero
+ es-MX
+ EUR 0
+ +92 kEUR
+ -EUR 0.22
+ zh-TW
+ €0
+ +€9.2萬
+ (€0.22)
+ bn-BD
+ ০€
+ +৯২ হা€
+ (০.২২ €)
+
+compact-short measure-unit/length-furlong sign-accounting-except-zero
+ es-MX
+ 0 fur
+ +92 k fur
+ -0.22 fur
+ zh-TW
+ 0 化朗
+ +9.2萬 化朗
+ -0.22 化朗
+ bn-BD
+ ০ ফার্লং
+ +৯২ হা ফার্লং
+ -০.২২ ফার্লং
+
+scientific/+ee/sign-always percent sign-accounting-except-zero
+ es-MX
+ 0E+00 %
+ +9.182736E+04 %
+ -2.2222E-01 %
+ zh-TW
+ 0E+00%
+ +9.182736E+04%
+ -2.2222E-01%
+ bn-BD
+ ০E+০০%
+ +৯.১৮২৭৩৬E+০৪%
+ -২.২২২২E-০১%
+
+scientific/+ee/sign-always currency/EUR sign-accounting-except-zero
+ es-MX
+ EUR 0.00E+00
+ +EUR 9.18E+04
+ -EUR 2.22E-01
+ zh-TW
+ €0.00E+00
+ +€9.18E+04
+ (€2.22E-01)
+ bn-BD
+ ০.০০E+০০€
+ +৯.১৮E+০৪€
+ (২.২২E-০১ €)
+
+scientific/+ee/sign-always measure-unit/length-furlong sign-accounting-except-zero
+ es-MX
+ 0E+00 fur
+ +9.182736E+04 fur
+ -2.2222E-01 fur
+ zh-TW
+ 0E+00 化朗
+ +9.182736E+04 化朗
+ -2.2222E-01 化朗
+ bn-BD
+ ০E+০০ ফার্লং
+ +৯.১৮২৭৩৬E+০৪ ফার্লং
+ -২.২২২২E-০১ ফার্লং
+
+compact-short percent decimal-always
+ es-MX
+ 0. %
+ 92. k
+ -0.22 %
+ zh-TW
+ 0.%
+ 9.2萬
+ -0.22%
+ bn-BD
+ ০.%
+ ৯২. হা
+ -০.২২%
+
+compact-short currency/EUR decimal-always
+ es-MX
+ EUR 0.
+ 92. kEUR
+ -EUR 0.22
+ zh-TW
+ €0.
+ €9.2萬
+ -€0.22
+ bn-BD
+ ০.€
+ ৯২. হা€
+ -০.২২€
+
+compact-short measure-unit/length-furlong decimal-always
+ es-MX
+ 0. fur
+ 92. k fur
+ -0.22 fur
+ zh-TW
+ 0. 化朗
+ 9.2萬 化朗
+ -0.22 化朗
+ bn-BD
+ ০. ফার্লং
+ ৯২. হা ফার্লং
+ -০.২২ ফার্লং
+
+scientific/+ee/sign-always percent decimal-always
+ es-MX
+ 0.E+00 %
+ 9.182736E+04 %
+ -2.2222E-01 %
+ zh-TW
+ 0.E+00%
+ 9.182736E+04%
+ -2.2222E-01%
+ bn-BD
+ ০.E+০০%
+ ৯.১৮২৭৩৬E+০৪%
+ -২.২২২২E-০১%
+
+scientific/+ee/sign-always currency/EUR decimal-always
+ es-MX
+ EUR 0.00E+00
+ EUR 9.18E+04
+ -EUR 2.22E-01
+ zh-TW
+ €0.00E+00
+ €9.18E+04
+ -€2.22E-01
+ bn-BD
+ ০.০০E+০০€
+ ৯.১৮E+০৪€
+ -২.২২E-০১€
+
+scientific/+ee/sign-always measure-unit/length-furlong decimal-always
+ es-MX
+ 0.E+00 fur
+ 9.182736E+04 fur
+ -2.2222E-01 fur
+ zh-TW
+ 0.E+00 化朗
+ 9.182736E+04 化朗
+ -2.2222E-01 化朗
+ bn-BD
+ ০.E+০০ ফার্লং
+ ৯.১৮২৭৩৬E+০৪ ফার্লং
+ -২.২২২২E-০১ ফার্লং
+
+compact-short unit-width-narrow precision-integer
+ es-MX
+ 0
+ 92 k
+ -0
+ zh-TW
+ 0
+ 9萬
+ -0
+ bn-BD
+ ০
+ ৯২ হা
+ -০
+
+compact-short unit-width-narrow .000
+ es-MX
+ 0.000
+ 91.827 k
+ -0.222
+ zh-TW
+ 0.000
+ 9.183萬
+ -0.222
+ bn-BD
+ ০.০০০
+ ৯১.৮২৭ হা
+ -০.২২২
+
+compact-short unit-width-narrow .##/@@@+
+ es-MX
+ 0
+ 91.83 k
+ -0.222
+ zh-TW
+ 0
+ 9.18萬
+ -0.222
+ bn-BD
+ ০
+ ৯১.৮৩ হা
+ -০.২২২
+
+compact-short unit-width-narrow @@
+ es-MX
+ 0.0
+ 92 k
+ -0.22
+ zh-TW
+ 0.0
+ 9.2萬
+ -0.22
+ bn-BD
+ ০.০
+ ৯২ হা
+ -০.২২
+
+compact-short unit-width-full-name precision-integer
+ es-MX
+ 0
+ 92 k
+ -0
+ zh-TW
+ 0
+ 9萬
+ -0
+ bn-BD
+ ০
+ ৯২ হা
+ -০
+
+compact-short unit-width-full-name .000
+ es-MX
+ 0.000
+ 91.827 k
+ -0.222
+ zh-TW
+ 0.000
+ 9.183萬
+ -0.222
+ bn-BD
+ ০.০০০
+ ৯১.৮২৭ হা
+ -০.২২২
+
+compact-short unit-width-full-name .##/@@@+
+ es-MX
+ 0
+ 91.83 k
+ -0.222
+ zh-TW
+ 0
+ 9.18萬
+ -0.222
+ bn-BD
+ ০
+ ৯১.৮৩ হা
+ -০.২২২
+
+compact-short unit-width-full-name @@
+ es-MX
+ 0.0
+ 92 k
+ -0.22
+ zh-TW
+ 0.0
+ 9.2萬
+ -0.22
+ bn-BD
+ ০.০
+ ৯২ হা
+ -০.২২
+
+scientific/+ee/sign-always unit-width-narrow precision-integer
+ es-MX
+ 0E+00
+ 9E+04
+ -2E-01
+ zh-TW
+ 0E+00
+ 9E+04
+ -2E-01
+ bn-BD
+ ০E+০০
+ ৯E+০৪
+ -২E-০১
+
+scientific/+ee/sign-always unit-width-narrow .000
+ es-MX
+ 0.000E+00
+ 9.183E+04
+ -2.222E-01
+ zh-TW
+ 0.000E+00
+ 9.183E+04
+ -2.222E-01
+ bn-BD
+ ০.০০০E+০০
+ ৯.১৮৩E+০৪
+ -২.২২২E-০১
+
+scientific/+ee/sign-always unit-width-narrow .##/@@@+
+ es-MX
+ 0E+00
+ 9.18E+04
+ -2.22E-01
+ zh-TW
+ 0E+00
+ 9.18E+04
+ -2.22E-01
+ bn-BD
+ ০E+০০
+ ৯.১৮E+০৪
+ -২.২২E-০১
+
+scientific/+ee/sign-always unit-width-narrow @@
+ es-MX
+ 0.0E+00
+ 9.2E+04
+ -2.2E-01
+ zh-TW
+ 0.0E+00
+ 9.2E+04
+ -2.2E-01
+ bn-BD
+ ০.০E+০০
+ ৯.২E+০৪
+ -২.২E-০১
+
+scientific/+ee/sign-always unit-width-full-name precision-integer
+ es-MX
+ 0E+00
+ 9E+04
+ -2E-01
+ zh-TW
+ 0E+00
+ 9E+04
+ -2E-01
+ bn-BD
+ ০E+০০
+ ৯E+০৪
+ -২E-০১
+
+scientific/+ee/sign-always unit-width-full-name .000
+ es-MX
+ 0.000E+00
+ 9.183E+04
+ -2.222E-01
+ zh-TW
+ 0.000E+00
+ 9.183E+04
+ -2.222E-01
+ bn-BD
+ ০.০০০E+০০
+ ৯.১৮৩E+০৪
+ -২.২২২E-০১
+
+scientific/+ee/sign-always unit-width-full-name .##/@@@+
+ es-MX
+ 0E+00
+ 9.18E+04
+ -2.22E-01
+ zh-TW
+ 0E+00
+ 9.18E+04
+ -2.22E-01
+ bn-BD
+ ০E+০০
+ ৯.১৮E+০৪
+ -২.২২E-০১
+
+scientific/+ee/sign-always unit-width-full-name @@
+ es-MX
+ 0.0E+00
+ 9.2E+04
+ -2.2E-01
+ zh-TW
+ 0.0E+00
+ 9.2E+04
+ -2.2E-01
+ bn-BD
+ ০.০E+০০
+ ৯.২E+০৪
+ -২.২E-০১
+
+compact-short unit-width-narrow rounding-mode-floor
+ es-MX
+ 0
+ 91 k
+ -0.23
+ zh-TW
+ 0
+ 9.1萬
+ -0.23
+ bn-BD
+ ০
+ ৯১ হা
+ -০.২৩
+
+compact-short unit-width-full-name rounding-mode-floor
+ es-MX
+ 0
+ 91 k
+ -0.23
+ zh-TW
+ 0
+ 9.1萬
+ -0.23
+ bn-BD
+ ০
+ ৯১ হা
+ -০.২৩
+
+scientific/+ee/sign-always unit-width-narrow rounding-mode-floor
+ es-MX
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+ bn-BD
+ ০E+০০
+ ৯.১৮২৭৩৬E+০৪
+ -২.২২২২E-০১
+
+scientific/+ee/sign-always unit-width-full-name rounding-mode-floor
+ es-MX
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+ bn-BD
+ ০E+০০
+ ৯.১৮২৭৩৬E+০৪
+ -২.২২২২E-০১
+
+compact-short unit-width-narrow integer-width/##00
+ es-MX
+ 00
+ 92 k
+ -00.22
+ zh-TW
+ 00
+ 09.2萬
+ -00.22
+ bn-BD
+ ০০
+ ৯২ হা
+ -০০.২২
+
+compact-short unit-width-full-name integer-width/##00
+ es-MX
+ 00
+ 92 k
+ -00.22
+ zh-TW
+ 00
+ 09.2萬
+ -00.22
+ bn-BD
+ ০০
+ ৯২ হা
+ -০০.২২
+
+scientific/+ee/sign-always unit-width-narrow integer-width/##00
+ es-MX
+ 00E+00
+ 09.182736E+04
+ -02.2222E-01
+ zh-TW
+ 00E+00
+ 09.182736E+04
+ -02.2222E-01
+ bn-BD
+ ০০E+০০
+ ০৯.১৮২৭৩৬E+০৪
+ -০২.২২২২E-০১
+
+scientific/+ee/sign-always unit-width-full-name integer-width/##00
+ es-MX
+ 00E+00
+ 09.182736E+04
+ -02.2222E-01
+ zh-TW
+ 00E+00
+ 09.182736E+04
+ -02.2222E-01
+ bn-BD
+ ০০E+০০
+ ০৯.১৮২৭৩৬E+০৪
+ -০২.২২২২E-০১
+
+compact-short unit-width-narrow scale/0.5
+ es-MX
+ 0
+ 46 k
+ -0.11
+ zh-TW
+ 0
+ 4.6萬
+ -0.11
+ bn-BD
+ ০
+ ৪৬ হা
+ -০.১১
+
+compact-short unit-width-full-name scale/0.5
+ es-MX
+ 0
+ 46 k
+ -0.11
+ zh-TW
+ 0
+ 4.6萬
+ -0.11
+ bn-BD
+ ০
+ ৪৬ হা
+ -০.১১
+
+scientific/+ee/sign-always unit-width-narrow scale/0.5
+ es-MX
+ 0E+00
+ 4.591368E+04
+ -1.1111E-01
+ zh-TW
+ 0E+00
+ 4.591368E+04
+ -1.1111E-01
+ bn-BD
+ ০E+০০
+ ৪.৫৯১৩৬৮E+০৪
+ -১.১১১১E-০১
+
+scientific/+ee/sign-always unit-width-full-name scale/0.5
+ es-MX
+ 0E+00
+ 4.591368E+04
+ -1.1111E-01
+ zh-TW
+ 0E+00
+ 4.591368E+04
+ -1.1111E-01
+ bn-BD
+ ০E+০০
+ ৪.৫৯১৩৬৮E+০৪
+ -১.১১১১E-০১
+
+compact-short unit-width-narrow group-on-aligned
+ es-MX
+ 0
+ 92 k
+ -0.22
+ zh-TW
+ 0
+ 9.2萬
+ -0.22
+ bn-BD
+ ০
+ ৯২ হা
+ -০.২২
+
+compact-short unit-width-full-name group-on-aligned
+ es-MX
+ 0
+ 92 k
+ -0.22
+ zh-TW
+ 0
+ 9.2萬
+ -0.22
+ bn-BD
+ ০
+ ৯২ হা
+ -০.২২
+
+scientific/+ee/sign-always unit-width-narrow group-on-aligned
+ es-MX
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+ bn-BD
+ ০E+০০
+ ৯.১৮২৭৩৬E+০৪
+ -২.২২২২E-০১
+
+scientific/+ee/sign-always unit-width-full-name group-on-aligned
+ es-MX
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+ bn-BD
+ ০E+০০
+ ৯.১৮২৭৩৬E+০৪
+ -২.২২২২E-০১
+
+compact-short unit-width-narrow latin
+ es-MX
+ 0
+ 92 k
+ -0.22
+ zh-TW
+ 0
+ 9.2萬
+ -0.22
+ bn-BD
+ 0
+ 92 হা
+ -0.22
+
+compact-short unit-width-full-name latin
+ es-MX
+ 0
+ 92 k
+ -0.22
+ zh-TW
+ 0
+ 9.2萬
+ -0.22
+ bn-BD
+ 0
+ 92 হা
+ -0.22
+
+scientific/+ee/sign-always unit-width-narrow latin
+ es-MX
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+ bn-BD
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+
+scientific/+ee/sign-always unit-width-full-name latin
+ es-MX
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+ bn-BD
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+
+compact-short unit-width-narrow sign-accounting-except-zero
+ es-MX
+ 0
+ +92 k
+ -0.22
+ zh-TW
+ 0
+ +9.2萬
+ -0.22
+ bn-BD
+ ০
+ +৯২ হা
+ -০.২২
+
+compact-short unit-width-full-name sign-accounting-except-zero
+ es-MX
+ 0
+ +92 k
+ -0.22
+ zh-TW
+ 0
+ +9.2萬
+ -0.22
+ bn-BD
+ ০
+ +৯২ হা
+ -০.২২
+
+scientific/+ee/sign-always unit-width-narrow sign-accounting-except-zero
+ es-MX
+ 0E+00
+ +9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0E+00
+ +9.182736E+04
+ -2.2222E-01
+ bn-BD
+ ০E+০০
+ +৯.১৮২৭৩৬E+০৪
+ -২.২২২২E-০১
+
+scientific/+ee/sign-always unit-width-full-name sign-accounting-except-zero
+ es-MX
+ 0E+00
+ +9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0E+00
+ +9.182736E+04
+ -2.2222E-01
+ bn-BD
+ ০E+০০
+ +৯.১৮২৭৩৬E+০৪
+ -২.২২২২E-০১
+
+compact-short unit-width-narrow decimal-always
+ es-MX
+ 0.
+ 92. k
+ -0.22
+ zh-TW
+ 0.
+ 9.2萬
+ -0.22
+ bn-BD
+ ০.
+ ৯২. হা
+ -০.২২
+
+compact-short unit-width-full-name decimal-always
+ es-MX
+ 0.
+ 92. k
+ -0.22
+ zh-TW
+ 0.
+ 9.2萬
+ -0.22
+ bn-BD
+ ০.
+ ৯২. হা
+ -০.২২
+
+scientific/+ee/sign-always unit-width-narrow decimal-always
+ es-MX
+ 0.E+00
+ 9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0.E+00
+ 9.182736E+04
+ -2.2222E-01
+ bn-BD
+ ০.E+০০
+ ৯.১৮২৭৩৬E+০৪
+ -২.২২২২E-০১
+
+scientific/+ee/sign-always unit-width-full-name decimal-always
+ es-MX
+ 0.E+00
+ 9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0.E+00
+ 9.182736E+04
+ -2.2222E-01
+ bn-BD
+ ০.E+০০
+ ৯.১৮২৭৩৬E+০৪
+ -২.২২২২E-০১
+
+compact-short precision-integer rounding-mode-floor
+ es-MX
+ 0
+ 91 k
+ -1
+ zh-TW
+ 0
+ 9萬
+ -1
+ bn-BD
+ ০
+ ৯১ হা
+ -১
+
+compact-short .000 rounding-mode-floor
+ es-MX
+ 0.000
+ 91.827 k
+ -0.223
+ zh-TW
+ 0.000
+ 9.182萬
+ -0.223
+ bn-BD
+ ০.০০০
+ ৯১.৮২৭ হা
+ -০.২২৩
+
+compact-short .##/@@@+ rounding-mode-floor
+ es-MX
+ 0
+ 91.82 k
+ -0.223
+ zh-TW
+ 0
+ 9.18萬
+ -0.223
+ bn-BD
+ ০
+ ৯১.৮২ হা
+ -০.২২৩
+
+compact-short @@ rounding-mode-floor
+ es-MX
+ 0.0
+ 91 k
+ -0.23
+ zh-TW
+ 0.0
+ 9.1萬
+ -0.23
+ bn-BD
+ ০.০
+ ৯১ হা
+ -০.২৩
+
+scientific/+ee/sign-always precision-integer rounding-mode-floor
+ es-MX
+ 0E+00
+ 9E+04
+ -3E-01
+ zh-TW
+ 0E+00
+ 9E+04
+ -3E-01
+ bn-BD
+ ০E+০০
+ ৯E+০৪
+ -৩E-০১
+
+scientific/+ee/sign-always .000 rounding-mode-floor
+ es-MX
+ 0.000E+00
+ 9.182E+04
+ -2.223E-01
+ zh-TW
+ 0.000E+00
+ 9.182E+04
+ -2.223E-01
+ bn-BD
+ ০.০০০E+০০
+ ৯.১৮২E+০৪
+ -২.২২৩E-০১
+
+scientific/+ee/sign-always .##/@@@+ rounding-mode-floor
+ es-MX
+ 0E+00
+ 9.18E+04
+ -2.23E-01
+ zh-TW
+ 0E+00
+ 9.18E+04
+ -2.23E-01
+ bn-BD
+ ০E+০০
+ ৯.১৮E+০৪
+ -২.২৩E-০১
+
+scientific/+ee/sign-always @@ rounding-mode-floor
+ es-MX
+ 0.0E+00
+ 9.1E+04
+ -2.3E-01
+ zh-TW
+ 0.0E+00
+ 9.1E+04
+ -2.3E-01
+ bn-BD
+ ০.০E+০০
+ ৯.১E+০৪
+ -২.৩E-০১
+
+compact-short precision-integer integer-width/##00
+ es-MX
+ 00
+ 92 k
+ -00
+ zh-TW
+ 00
+ 09萬
+ -00
+ bn-BD
+ ০০
+ ৯২ হা
+ -০০
+
+compact-short .000 integer-width/##00
+ es-MX
+ 00.000
+ 91.827 k
+ -00.222
+ zh-TW
+ 00.000
+ 09.183萬
+ -00.222
+ bn-BD
+ ০০.০০০
+ ৯১.৮২৭ হা
+ -০০.২২২
+
+compact-short .##/@@@+ integer-width/##00
+ es-MX
+ 00
+ 91.83 k
+ -00.222
+ zh-TW
+ 00
+ 09.18萬
+ -00.222
+ bn-BD
+ ০০
+ ৯১.৮৩ হা
+ -০০.২২২
+
+compact-short @@ integer-width/##00
+ es-MX
+ 00.0
+ 92 k
+ -00.22
+ zh-TW
+ 00.0
+ 09.2萬
+ -00.22
+ bn-BD
+ ০০.০
+ ৯২ হা
+ -০০.২২
+
+scientific/+ee/sign-always precision-integer integer-width/##00
+ es-MX
+ 00E+00
+ 09E+04
+ -02E-01
+ zh-TW
+ 00E+00
+ 09E+04
+ -02E-01
+ bn-BD
+ ০০E+০০
+ ০৯E+০৪
+ -০২E-০১
+
+scientific/+ee/sign-always .000 integer-width/##00
+ es-MX
+ 00.000E+00
+ 09.183E+04
+ -02.222E-01
+ zh-TW
+ 00.000E+00
+ 09.183E+04
+ -02.222E-01
+ bn-BD
+ ০০.০০০E+০০
+ ০৯.১৮৩E+০৪
+ -০২.২২২E-০১
+
+scientific/+ee/sign-always .##/@@@+ integer-width/##00
+ es-MX
+ 00E+00
+ 09.18E+04
+ -02.22E-01
+ zh-TW
+ 00E+00
+ 09.18E+04
+ -02.22E-01
+ bn-BD
+ ০০E+০০
+ ০৯.১৮E+০৪
+ -০২.২২E-০১
+
+scientific/+ee/sign-always @@ integer-width/##00
+ es-MX
+ 00.0E+00
+ 09.2E+04
+ -02.2E-01
+ zh-TW
+ 00.0E+00
+ 09.2E+04
+ -02.2E-01
+ bn-BD
+ ০০.০E+০০
+ ০৯.২E+০৪
+ -০২.২E-০১
+
+compact-short precision-integer scale/0.5
+ es-MX
+ 0
+ 46 k
+ -0
+ zh-TW
+ 0
+ 5萬
+ -0
+ bn-BD
+ ০
+ ৪৬ হা
+ -০
+
+compact-short .000 scale/0.5
+ es-MX
+ 0.000
+ 45.914 k
+ -0.111
+ zh-TW
+ 0.000
+ 4.591萬
+ -0.111
+ bn-BD
+ ০.০০০
+ ৪৫.৯১৪ হা
+ -০.১১১
+
+compact-short .##/@@@+ scale/0.5
+ es-MX
+ 0
+ 45.91 k
+ -0.111
+ zh-TW
+ 0
+ 4.59萬
+ -0.111
+ bn-BD
+ ০
+ ৪৫.৯১ হা
+ -০.১১১
+
+compact-short @@ scale/0.5
+ es-MX
+ 0.0
+ 46 k
+ -0.11
+ zh-TW
+ 0.0
+ 4.6萬
+ -0.11
+ bn-BD
+ ০.০
+ ৪৬ হা
+ -০.১১
+
+scientific/+ee/sign-always precision-integer scale/0.5
+ es-MX
+ 0E+00
+ 5E+04
+ -1E-01
+ zh-TW
+ 0E+00
+ 5E+04
+ -1E-01
+ bn-BD
+ ০E+০০
+ ৫E+০৪
+ -১E-০১
+
+scientific/+ee/sign-always .000 scale/0.5
+ es-MX
+ 0.000E+00
+ 4.591E+04
+ -1.111E-01
+ zh-TW
+ 0.000E+00
+ 4.591E+04
+ -1.111E-01
+ bn-BD
+ ০.০০০E+০০
+ ৪.৫৯১E+০৪
+ -১.১১১E-০১
+
+scientific/+ee/sign-always .##/@@@+ scale/0.5
+ es-MX
+ 0E+00
+ 4.59E+04
+ -1.11E-01
+ zh-TW
+ 0E+00
+ 4.59E+04
+ -1.11E-01
+ bn-BD
+ ০E+০০
+ ৪.৫৯E+০৪
+ -১.১১E-০১
+
+scientific/+ee/sign-always @@ scale/0.5
+ es-MX
+ 0.0E+00
+ 4.6E+04
+ -1.1E-01
+ zh-TW
+ 0.0E+00
+ 4.6E+04
+ -1.1E-01
+ bn-BD
+ ০.০E+০০
+ ৪.৬E+০৪
+ -১.১E-০১
+
+compact-short precision-integer group-on-aligned
+ es-MX
+ 0
+ 92 k
+ -0
+ zh-TW
+ 0
+ 9萬
+ -0
+ bn-BD
+ ০
+ ৯২ হা
+ -০
+
+compact-short .000 group-on-aligned
+ es-MX
+ 0.000
+ 91.827 k
+ -0.222
+ zh-TW
+ 0.000
+ 9.183萬
+ -0.222
+ bn-BD
+ ০.০০০
+ ৯১.৮২৭ হা
+ -০.২২২
+
+compact-short .##/@@@+ group-on-aligned
+ es-MX
+ 0
+ 91.83 k
+ -0.222
+ zh-TW
+ 0
+ 9.18萬
+ -0.222
+ bn-BD
+ ০
+ ৯১.৮৩ হা
+ -০.২২২
+
+compact-short @@ group-on-aligned
+ es-MX
+ 0.0
+ 92 k
+ -0.22
+ zh-TW
+ 0.0
+ 9.2萬
+ -0.22
+ bn-BD
+ ০.০
+ ৯২ হা
+ -০.২২
+
+scientific/+ee/sign-always precision-integer group-on-aligned
+ es-MX
+ 0E+00
+ 9E+04
+ -2E-01
+ zh-TW
+ 0E+00
+ 9E+04
+ -2E-01
+ bn-BD
+ ০E+০০
+ ৯E+০৪
+ -২E-০১
+
+scientific/+ee/sign-always .000 group-on-aligned
+ es-MX
+ 0.000E+00
+ 9.183E+04
+ -2.222E-01
+ zh-TW
+ 0.000E+00
+ 9.183E+04
+ -2.222E-01
+ bn-BD
+ ০.০০০E+০০
+ ৯.১৮৩E+০৪
+ -২.২২২E-০১
+
+scientific/+ee/sign-always .##/@@@+ group-on-aligned
+ es-MX
+ 0E+00
+ 9.18E+04
+ -2.22E-01
+ zh-TW
+ 0E+00
+ 9.18E+04
+ -2.22E-01
+ bn-BD
+ ০E+০০
+ ৯.১৮E+০৪
+ -২.২২E-০১
+
+scientific/+ee/sign-always @@ group-on-aligned
+ es-MX
+ 0.0E+00
+ 9.2E+04
+ -2.2E-01
+ zh-TW
+ 0.0E+00
+ 9.2E+04
+ -2.2E-01
+ bn-BD
+ ০.০E+০০
+ ৯.২E+০৪
+ -২.২E-০১
+
+compact-short precision-integer latin
+ es-MX
+ 0
+ 92 k
+ -0
+ zh-TW
+ 0
+ 9萬
+ -0
+ bn-BD
+ 0
+ 92 হা
+ -0
+
+compact-short .000 latin
+ es-MX
+ 0.000
+ 91.827 k
+ -0.222
+ zh-TW
+ 0.000
+ 9.183萬
+ -0.222
+ bn-BD
+ 0.000
+ 91.827 হা
+ -0.222
+
+compact-short .##/@@@+ latin
+ es-MX
+ 0
+ 91.83 k
+ -0.222
+ zh-TW
+ 0
+ 9.18萬
+ -0.222
+ bn-BD
+ 0
+ 91.83 হা
+ -0.222
+
+compact-short @@ latin
+ es-MX
+ 0.0
+ 92 k
+ -0.22
+ zh-TW
+ 0.0
+ 9.2萬
+ -0.22
+ bn-BD
+ 0.0
+ 92 হা
+ -0.22
+
+scientific/+ee/sign-always precision-integer latin
+ es-MX
+ 0E+00
+ 9E+04
+ -2E-01
+ zh-TW
+ 0E+00
+ 9E+04
+ -2E-01
+ bn-BD
+ 0E+00
+ 9E+04
+ -2E-01
+
+scientific/+ee/sign-always .000 latin
+ es-MX
+ 0.000E+00
+ 9.183E+04
+ -2.222E-01
+ zh-TW
+ 0.000E+00
+ 9.183E+04
+ -2.222E-01
+ bn-BD
+ 0.000E+00
+ 9.183E+04
+ -2.222E-01
+
+scientific/+ee/sign-always .##/@@@+ latin
+ es-MX
+ 0E+00
+ 9.18E+04
+ -2.22E-01
+ zh-TW
+ 0E+00
+ 9.18E+04
+ -2.22E-01
+ bn-BD
+ 0E+00
+ 9.18E+04
+ -2.22E-01
+
+scientific/+ee/sign-always @@ latin
+ es-MX
+ 0.0E+00
+ 9.2E+04
+ -2.2E-01
+ zh-TW
+ 0.0E+00
+ 9.2E+04
+ -2.2E-01
+ bn-BD
+ 0.0E+00
+ 9.2E+04
+ -2.2E-01
+
+compact-short precision-integer sign-accounting-except-zero
+ es-MX
+ 0
+ +92 k
+ -0
+ zh-TW
+ 0
+ +9萬
+ -0
+ bn-BD
+ ০
+ +৯২ হা
+ -০
+
+compact-short .000 sign-accounting-except-zero
+ es-MX
+ 0.000
+ +91.827 k
+ -0.222
+ zh-TW
+ 0.000
+ +9.183萬
+ -0.222
+ bn-BD
+ ০.০০০
+ +৯১.৮২৭ হা
+ -০.২২২
+
+compact-short .##/@@@+ sign-accounting-except-zero
+ es-MX
+ 0
+ +91.83 k
+ -0.222
+ zh-TW
+ 0
+ +9.18萬
+ -0.222
+ bn-BD
+ ০
+ +৯১.৮৩ হা
+ -০.২২২
+
+compact-short @@ sign-accounting-except-zero
+ es-MX
+ 0.0
+ +92 k
+ -0.22
+ zh-TW
+ 0.0
+ +9.2萬
+ -0.22
+ bn-BD
+ ০.০
+ +৯২ হা
+ -০.২২
+
+scientific/+ee/sign-always precision-integer sign-accounting-except-zero
+ es-MX
+ 0E+00
+ +9E+04
+ -2E-01
+ zh-TW
+ 0E+00
+ +9E+04
+ -2E-01
+ bn-BD
+ ০E+০০
+ +৯E+০৪
+ -২E-০১
+
+scientific/+ee/sign-always .000 sign-accounting-except-zero
+ es-MX
+ 0.000E+00
+ +9.183E+04
+ -2.222E-01
+ zh-TW
+ 0.000E+00
+ +9.183E+04
+ -2.222E-01
+ bn-BD
+ ০.০০০E+০০
+ +৯.১৮৩E+০৪
+ -২.২২২E-০১
+
+scientific/+ee/sign-always .##/@@@+ sign-accounting-except-zero
+ es-MX
+ 0E+00
+ +9.18E+04
+ -2.22E-01
+ zh-TW
+ 0E+00
+ +9.18E+04
+ -2.22E-01
+ bn-BD
+ ০E+০০
+ +৯.১৮E+০৪
+ -২.২২E-০১
+
+scientific/+ee/sign-always @@ sign-accounting-except-zero
+ es-MX
+ 0.0E+00
+ +9.2E+04
+ -2.2E-01
+ zh-TW
+ 0.0E+00
+ +9.2E+04
+ -2.2E-01
+ bn-BD
+ ০.০E+০০
+ +৯.২E+০৪
+ -২.২E-০১
+
+compact-short precision-integer decimal-always
+ es-MX
+ 0.
+ 92. k
+ -0.
+ zh-TW
+ 0.
+ 9.萬
+ -0.
+ bn-BD
+ ০.
+ ৯২. হা
+ -০.
+
+compact-short .000 decimal-always
+ es-MX
+ 0.000
+ 91.827 k
+ -0.222
+ zh-TW
+ 0.000
+ 9.183萬
+ -0.222
+ bn-BD
+ ০.০০০
+ ৯১.৮২৭ হা
+ -০.২২২
+
+compact-short .##/@@@+ decimal-always
+ es-MX
+ 0.
+ 91.83 k
+ -0.222
+ zh-TW
+ 0.
+ 9.18萬
+ -0.222
+ bn-BD
+ ০.
+ ৯১.৮৩ হা
+ -০.২২২
+
+compact-short @@ decimal-always
+ es-MX
+ 0.0
+ 92. k
+ -0.22
+ zh-TW
+ 0.0
+ 9.2萬
+ -0.22
+ bn-BD
+ ০.০
+ ৯২. হা
+ -০.২২
+
+scientific/+ee/sign-always precision-integer decimal-always
+ es-MX
+ 0.E+00
+ 9.E+04
+ -2.E-01
+ zh-TW
+ 0.E+00
+ 9.E+04
+ -2.E-01
+ bn-BD
+ ০.E+০০
+ ৯.E+০৪
+ -২.E-০১
+
+scientific/+ee/sign-always .000 decimal-always
+ es-MX
+ 0.000E+00
+ 9.183E+04
+ -2.222E-01
+ zh-TW
+ 0.000E+00
+ 9.183E+04
+ -2.222E-01
+ bn-BD
+ ০.০০০E+০০
+ ৯.১৮৩E+০৪
+ -২.২২২E-০১
+
+scientific/+ee/sign-always .##/@@@+ decimal-always
+ es-MX
+ 0.E+00
+ 9.18E+04
+ -2.22E-01
+ zh-TW
+ 0.E+00
+ 9.18E+04
+ -2.22E-01
+ bn-BD
+ ০.E+০০
+ ৯.১৮E+০৪
+ -২.২২E-০১
+
+scientific/+ee/sign-always @@ decimal-always
+ es-MX
+ 0.0E+00
+ 9.2E+04
+ -2.2E-01
+ zh-TW
+ 0.0E+00
+ 9.2E+04
+ -2.2E-01
+ bn-BD
+ ০.০E+০০
+ ৯.২E+০৪
+ -২.২E-০১
+
+compact-short rounding-mode-floor integer-width/##00
+ es-MX
+ 00
+ 91 k
+ -00.23
+ zh-TW
+ 00
+ 09.1萬
+ -00.23
+ bn-BD
+ ০০
+ ৯১ হা
+ -০০.২৩
+
+scientific/+ee/sign-always rounding-mode-floor integer-width/##00
+ es-MX
+ 00E+00
+ 09.182736E+04
+ -02.2222E-01
+ zh-TW
+ 00E+00
+ 09.182736E+04
+ -02.2222E-01
+ bn-BD
+ ০০E+০০
+ ০৯.১৮২৭৩৬E+০৪
+ -০২.২২২২E-০১
+
+compact-short rounding-mode-floor scale/0.5
+ es-MX
+ 0
+ 45 k
+ -0.12
+ zh-TW
+ 0
+ 4.5萬
+ -0.12
+ bn-BD
+ ০
+ ৪৫ হা
+ -০.১২
+
+scientific/+ee/sign-always rounding-mode-floor scale/0.5
+ es-MX
+ 0E+00
+ 4.591368E+04
+ -1.1111E-01
+ zh-TW
+ 0E+00
+ 4.591368E+04
+ -1.1111E-01
+ bn-BD
+ ০E+০০
+ ৪.৫৯১৩৬৮E+০৪
+ -১.১১১১E-০১
+
+compact-short rounding-mode-floor group-on-aligned
+ es-MX
+ 0
+ 91 k
+ -0.23
+ zh-TW
+ 0
+ 9.1萬
+ -0.23
+ bn-BD
+ ০
+ ৯১ হা
+ -০.২৩
+
+scientific/+ee/sign-always rounding-mode-floor group-on-aligned
+ es-MX
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+ bn-BD
+ ০E+০০
+ ৯.১৮২৭৩৬E+০৪
+ -২.২২২২E-০১
+
+compact-short rounding-mode-floor latin
+ es-MX
+ 0
+ 91 k
+ -0.23
+ zh-TW
+ 0
+ 9.1萬
+ -0.23
+ bn-BD
+ 0
+ 91 হা
+ -0.23
+
+scientific/+ee/sign-always rounding-mode-floor latin
+ es-MX
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+ bn-BD
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+
+compact-short rounding-mode-floor sign-accounting-except-zero
+ es-MX
+ 0
+ +91 k
+ -0.23
+ zh-TW
+ 0
+ +9.1萬
+ -0.23
+ bn-BD
+ ০
+ +৯১ হা
+ -০.২৩
+
+scientific/+ee/sign-always rounding-mode-floor sign-accounting-except-zero
+ es-MX
+ 0E+00
+ +9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0E+00
+ +9.182736E+04
+ -2.2222E-01
+ bn-BD
+ ০E+০০
+ +৯.১৮২৭৩৬E+০৪
+ -২.২২২২E-০১
+
+compact-short rounding-mode-floor decimal-always
+ es-MX
+ 0.
+ 91. k
+ -0.23
+ zh-TW
+ 0.
+ 9.1萬
+ -0.23
+ bn-BD
+ ০.
+ ৯১. হা
+ -০.২৩
+
+scientific/+ee/sign-always rounding-mode-floor decimal-always
+ es-MX
+ 0.E+00
+ 9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0.E+00
+ 9.182736E+04
+ -2.2222E-01
+ bn-BD
+ ০.E+০০
+ ৯.১৮২৭৩৬E+০৪
+ -২.২২২২E-০১
+
+compact-short integer-width/##00 scale/0.5
+ es-MX
+ 00
+ 46 k
+ -00.11
+ zh-TW
+ 00
+ 04.6萬
+ -00.11
+ bn-BD
+ ০০
+ ৪৬ হা
+ -০০.১১
+
+scientific/+ee/sign-always integer-width/##00 scale/0.5
+ es-MX
+ 00E+00
+ 04.591368E+04
+ -01.1111E-01
+ zh-TW
+ 00E+00
+ 04.591368E+04
+ -01.1111E-01
+ bn-BD
+ ০০E+০০
+ ০৪.৫৯১৩৬৮E+০৪
+ -০১.১১১১E-০১
+
+compact-short integer-width/##00 group-on-aligned
+ es-MX
+ 00
+ 92 k
+ -00.22
+ zh-TW
+ 00
+ 09.2萬
+ -00.22
+ bn-BD
+ ০০
+ ৯২ হা
+ -০০.২২
+
+scientific/+ee/sign-always integer-width/##00 group-on-aligned
+ es-MX
+ 00E+00
+ 09.182736E+04
+ -02.2222E-01
+ zh-TW
+ 00E+00
+ 09.182736E+04
+ -02.2222E-01
+ bn-BD
+ ০০E+০০
+ ০৯.১৮২৭৩৬E+০৪
+ -০২.২২২২E-০১
+
+compact-short integer-width/##00 latin
+ es-MX
+ 00
+ 92 k
+ -00.22
+ zh-TW
+ 00
+ 09.2萬
+ -00.22
+ bn-BD
+ 00
+ 92 হা
+ -00.22
+
+scientific/+ee/sign-always integer-width/##00 latin
+ es-MX
+ 00E+00
+ 09.182736E+04
+ -02.2222E-01
+ zh-TW
+ 00E+00
+ 09.182736E+04
+ -02.2222E-01
+ bn-BD
+ 00E+00
+ 09.182736E+04
+ -02.2222E-01
+
+compact-short integer-width/##00 sign-accounting-except-zero
+ es-MX
+ 00
+ +92 k
+ -00.22
+ zh-TW
+ 00
+ +09.2萬
+ -00.22
+ bn-BD
+ ০০
+ +৯২ হা
+ -০০.২২
+
+scientific/+ee/sign-always integer-width/##00 sign-accounting-except-zero
+ es-MX
+ 00E+00
+ +09.182736E+04
+ -02.2222E-01
+ zh-TW
+ 00E+00
+ +09.182736E+04
+ -02.2222E-01
+ bn-BD
+ ০০E+০০
+ +০৯.১৮২৭৩৬E+০৪
+ -০২.২২২২E-০১
+
+compact-short integer-width/##00 decimal-always
+ es-MX
+ 00.
+ 92. k
+ -00.22
+ zh-TW
+ 00.
+ 09.2萬
+ -00.22
+ bn-BD
+ ০০.
+ ৯২. হা
+ -০০.২২
+
+scientific/+ee/sign-always integer-width/##00 decimal-always
+ es-MX
+ 00.E+00
+ 09.182736E+04
+ -02.2222E-01
+ zh-TW
+ 00.E+00
+ 09.182736E+04
+ -02.2222E-01
+ bn-BD
+ ০০.E+০০
+ ০৯.১৮২৭৩৬E+০৪
+ -০২.২২২২E-০১
+
+compact-short scale/0.5 group-on-aligned
+ es-MX
+ 0
+ 46 k
+ -0.11
+ zh-TW
+ 0
+ 4.6萬
+ -0.11
+ bn-BD
+ ০
+ ৪৬ হা
+ -০.১১
+
+scientific/+ee/sign-always scale/0.5 group-on-aligned
+ es-MX
+ 0E+00
+ 4.591368E+04
+ -1.1111E-01
+ zh-TW
+ 0E+00
+ 4.591368E+04
+ -1.1111E-01
+ bn-BD
+ ০E+০০
+ ৪.৫৯১৩৬৮E+০৪
+ -১.১১১১E-০১
+
+compact-short scale/0.5 latin
+ es-MX
+ 0
+ 46 k
+ -0.11
+ zh-TW
+ 0
+ 4.6萬
+ -0.11
+ bn-BD
+ 0
+ 46 হা
+ -0.11
+
+scientific/+ee/sign-always scale/0.5 latin
+ es-MX
+ 0E+00
+ 4.591368E+04
+ -1.1111E-01
+ zh-TW
+ 0E+00
+ 4.591368E+04
+ -1.1111E-01
+ bn-BD
+ 0E+00
+ 4.591368E+04
+ -1.1111E-01
+
+compact-short scale/0.5 sign-accounting-except-zero
+ es-MX
+ 0
+ +46 k
+ -0.11
+ zh-TW
+ 0
+ +4.6萬
+ -0.11
+ bn-BD
+ ০
+ +৪৬ হা
+ -০.১১
+
+scientific/+ee/sign-always scale/0.5 sign-accounting-except-zero
+ es-MX
+ 0E+00
+ +4.591368E+04
+ -1.1111E-01
+ zh-TW
+ 0E+00
+ +4.591368E+04
+ -1.1111E-01
+ bn-BD
+ ০E+০০
+ +৪.৫৯১৩৬৮E+০৪
+ -১.১১১১E-০১
+
+compact-short scale/0.5 decimal-always
+ es-MX
+ 0.
+ 46. k
+ -0.11
+ zh-TW
+ 0.
+ 4.6萬
+ -0.11
+ bn-BD
+ ০.
+ ৪৬. হা
+ -০.১১
+
+scientific/+ee/sign-always scale/0.5 decimal-always
+ es-MX
+ 0.E+00
+ 4.591368E+04
+ -1.1111E-01
+ zh-TW
+ 0.E+00
+ 4.591368E+04
+ -1.1111E-01
+ bn-BD
+ ০.E+০০
+ ৪.৫৯১৩৬৮E+০৪
+ -১.১১১১E-০১
+
+compact-short group-on-aligned latin
+ es-MX
+ 0
+ 92 k
+ -0.22
+ zh-TW
+ 0
+ 9.2萬
+ -0.22
+ bn-BD
+ 0
+ 92 হা
+ -0.22
+
+scientific/+ee/sign-always group-on-aligned latin
+ es-MX
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+ bn-BD
+ 0E+00
+ 9.182736E+04
+ -2.2222E-01
+
+compact-short group-on-aligned sign-accounting-except-zero
+ es-MX
+ 0
+ +92 k
+ -0.22
+ zh-TW
+ 0
+ +9.2萬
+ -0.22
+ bn-BD
+ ০
+ +৯২ হা
+ -০.২২
+
+scientific/+ee/sign-always group-on-aligned sign-accounting-except-zero
+ es-MX
+ 0E+00
+ +9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0E+00
+ +9.182736E+04
+ -2.2222E-01
+ bn-BD
+ ০E+০০
+ +৯.১৮২৭৩৬E+০৪
+ -২.২২২২E-০১
+
+compact-short group-on-aligned decimal-always
+ es-MX
+ 0.
+ 92. k
+ -0.22
+ zh-TW
+ 0.
+ 9.2萬
+ -0.22
+ bn-BD
+ ০.
+ ৯২. হা
+ -০.২২
+
+scientific/+ee/sign-always group-on-aligned decimal-always
+ es-MX
+ 0.E+00
+ 9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0.E+00
+ 9.182736E+04
+ -2.2222E-01
+ bn-BD
+ ০.E+০০
+ ৯.১৮২৭৩৬E+০৪
+ -২.২২২২E-০১
+
+compact-short latin sign-accounting-except-zero
+ es-MX
+ 0
+ +92 k
+ -0.22
+ zh-TW
+ 0
+ +9.2萬
+ -0.22
+ bn-BD
+ 0
+ +92 হা
+ -0.22
+
+scientific/+ee/sign-always latin sign-accounting-except-zero
+ es-MX
+ 0E+00
+ +9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0E+00
+ +9.182736E+04
+ -2.2222E-01
+ bn-BD
+ 0E+00
+ +9.182736E+04
+ -2.2222E-01
+
+compact-short latin decimal-always
+ es-MX
+ 0.
+ 92. k
+ -0.22
+ zh-TW
+ 0.
+ 9.2萬
+ -0.22
+ bn-BD
+ 0.
+ 92. হা
+ -0.22
+
+scientific/+ee/sign-always latin decimal-always
+ es-MX
+ 0.E+00
+ 9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0.E+00
+ 9.182736E+04
+ -2.2222E-01
+ bn-BD
+ 0.E+00
+ 9.182736E+04
+ -2.2222E-01
+
+compact-short sign-accounting-except-zero decimal-always
+ es-MX
+ 0.
+ +92. k
+ -0.22
+ zh-TW
+ 0.
+ +9.2萬
+ -0.22
+ bn-BD
+ ০.
+ +৯২. হা
+ -০.২২
+
+scientific/+ee/sign-always sign-accounting-except-zero decimal-always
+ es-MX
+ 0.E+00
+ +9.182736E+04
+ -2.2222E-01
+ zh-TW
+ 0.E+00
+ +9.182736E+04
+ -2.2222E-01
+ bn-BD
+ ০.E+০০
+ +৯.১৮২৭৩৬E+০৪
+ -২.২২২২E-০১
+
+percent unit-width-narrow precision-integer
+ es-MX
+ 0 %
+ 91,827 %
+ -0 %
+ zh-TW
+ 0%
+ 91,827%
+ -0%
+ bn-BD
+ ০%
+ ৯১,৮২৭%
+ -০%
+
+percent unit-width-narrow .000
+ es-MX
+ 0.000 %
+ 91,827.364 %
+ -0.222 %
+ zh-TW
+ 0.000%
+ 91,827.364%
+ -0.222%
+ bn-BD
+ ০.০০০%
+ ৯১,৮২৭.৩৬৪%
+ -০.২২২%
+
+percent unit-width-narrow .##/@@@+
+ es-MX
+ 0 %
+ 91,827.36 %
+ -0.222 %
+ zh-TW
+ 0%
+ 91,827.36%
+ -0.222%
+ bn-BD
+ ০%
+ ৯১,৮২৭.৩৬%
+ -০.২২২%
+
+percent unit-width-narrow @@
+ es-MX
+ 0.0 %
+ 92,000 %
+ -0.22 %
+ zh-TW
+ 0.0%
+ 92,000%
+ -0.22%
+ bn-BD
+ ০.০%
+ ৯২,০০০%
+ -০.২২%
+
+percent unit-width-full-name precision-integer
+ es-MX
+ 0 %
+ 91,827 %
+ -0 %
+ zh-TW
+ 0%
+ 91,827%
+ -0%
+ bn-BD
+ ০%
+ ৯১,৮২৭%
+ -০%
+
+percent unit-width-full-name .000
+ es-MX
+ 0.000 %
+ 91,827.364 %
+ -0.222 %
+ zh-TW
+ 0.000%
+ 91,827.364%
+ -0.222%
+ bn-BD
+ ০.০০০%
+ ৯১,৮২৭.৩৬৪%
+ -০.২২২%
+
+percent unit-width-full-name .##/@@@+
+ es-MX
+ 0 %
+ 91,827.36 %
+ -0.222 %
+ zh-TW
+ 0%
+ 91,827.36%
+ -0.222%
+ bn-BD
+ ০%
+ ৯১,৮২৭.৩৬%
+ -০.২২২%
+
+percent unit-width-full-name @@
+ es-MX
+ 0.0 %
+ 92,000 %
+ -0.22 %
+ zh-TW
+ 0.0%
+ 92,000%
+ -0.22%
+ bn-BD
+ ০.০%
+ ৯২,০০০%
+ -০.২২%
+
+currency/EUR unit-width-narrow precision-integer
+ es-MX
+ €0
+ €91,827
+ -€0
+ zh-TW
+ €0
+ €91,827
+ -€0
+ bn-BD
+ ০€
+ ৯১,৮২৭€
+ -০€
+
+currency/EUR unit-width-narrow .000
+ es-MX
+ €0.000
+ €91,827.364
+ -€0.222
+ zh-TW
+ €0.000
+ €91,827.364
+ -€0.222
+ bn-BD
+ ০.০০০€
+ ৯১,৮২৭.৩৬৪€
+ -০.২২২€
+
+currency/EUR unit-width-narrow .##/@@@+
+ es-MX
+ €0
+ €91,827.36
+ -€0.222
+ zh-TW
+ €0
+ €91,827.36
+ -€0.222
+ bn-BD
+ ০€
+ ৯১,৮২৭.৩৬€
+ -০.২২২€
+
+currency/EUR unit-width-narrow @@
+ es-MX
+ €0.0
+ €92,000
+ -€0.22
+ zh-TW
+ €0.0
+ €92,000
+ -€0.22
+ bn-BD
+ ০.০€
+ ৯২,০০০€
+ -০.২২€
+
+currency/EUR unit-width-full-name precision-integer
+ es-MX
+ 0 euros
+ 91,827 euros
+ -0 euros
+ zh-TW
+ 0 歐元
+ 91,827 歐元
+ -0 歐元
+ bn-BD
+ ০ ইউরো
+ ৯১,৮২৭ ইউরো
+ -০ ইউরো
+
+currency/EUR unit-width-full-name .000
+ es-MX
+ 0.000 euros
+ 91,827.364 euros
+ -0.222 euros
+ zh-TW
+ 0.000 歐元
+ 91,827.364 歐元
+ -0.222 歐元
+ bn-BD
+ ০.০০০ ইউরো
+ ৯১,৮২৭.৩৬৪ ইউরো
+ -০.২২২ ইউরো
+
+currency/EUR unit-width-full-name .##/@@@+
+ es-MX
+ 0 euros
+ 91,827.36 euros
+ -0.222 euros
+ zh-TW
+ 0 歐元
+ 91,827.36 歐元
+ -0.222 歐元
+ bn-BD
+ ০ ইউরো
+ ৯১,৮২৭.৩৬ ইউরো
+ -০.২২২ ইউরো
+
+currency/EUR unit-width-full-name @@
+ es-MX
+ 0.0 euros
+ 92,000 euros
+ -0.22 euros
+ zh-TW
+ 0.0 歐元
+ 92,000 歐元
+ -0.22 歐元
+ bn-BD
+ ০.০ ইউরো
+ ৯২,০০০ ইউরো
+ -০.২২ ইউরো
+
+measure-unit/length-furlong unit-width-narrow precision-integer
+ es-MX
+ 0 fur
+ 91,827 fur
+ -0 fur
+ zh-TW
+ 0化朗
+ 91,827化朗
+ -0化朗
+ bn-BD
+ ০ ফার্লং
+ ৯১,৮২৭ ফার্লং
+ -০ ফার্লং
+
+measure-unit/length-furlong unit-width-narrow .000
+ es-MX
+ 0.000 fur
+ 91,827.364 fur
+ -0.222 fur
+ zh-TW
+ 0.000化朗
+ 91,827.364化朗
+ -0.222化朗
+ bn-BD
+ ০.০০০ ফার্লং
+ ৯১,৮২৭.৩৬৪ ফার্লং
+ -০.২২২ ফার্লং
+
+measure-unit/length-furlong unit-width-narrow .##/@@@+
+ es-MX
+ 0 fur
+ 91,827.36 fur
+ -0.222 fur
+ zh-TW
+ 0化朗
+ 91,827.36化朗
+ -0.222化朗
+ bn-BD
+ ০ ফার্লং
+ ৯১,৮২৭.৩৬ ফার্লং
+ -০.২২২ ফার্লং
+
+measure-unit/length-furlong unit-width-narrow @@
+ es-MX
+ 0.0 fur
+ 92,000 fur
+ -0.22 fur
+ zh-TW
+ 0.0化朗
+ 92,000化朗
+ -0.22化朗
+ bn-BD
+ ০.০ ফার্লং
+ ৯২,০০০ ফার্লং
+ -০.২২ ফার্লং
+
+measure-unit/length-furlong unit-width-full-name precision-integer
+ es-MX
+ 0 fur
+ 91,827 fur
+ -0 fur
+ zh-TW
+ 0 化朗
+ 91,827 化朗
+ -0 化朗
+ bn-BD
+ ০ ফার্লং
+ ৯১,৮২৭ ফার্লং
+ -০ ফার্লং
+
+measure-unit/length-furlong unit-width-full-name .000
+ es-MX
+ 0.000 fur
+ 91,827.364 fur
+ -0.222 fur
+ zh-TW
+ 0.000 化朗
+ 91,827.364 化朗
+ -0.222 化朗
+ bn-BD
+ ০.০০০ ফার্লং
+ ৯১,৮২৭.৩৬৪ ফার্লং
+ -০.২২২ ফার্লং
+
+measure-unit/length-furlong unit-width-full-name .##/@@@+
+ es-MX
+ 0 fur
+ 91,827.36 fur
+ -0.222 fur
+ zh-TW
+ 0 化朗
+ 91,827.36 化朗
+ -0.222 化朗
+ bn-BD
+ ০ ফার্লং
+ ৯১,৮২৭.৩৬ ফার্লং
+ -০.২২২ ফার্লং
+
+measure-unit/length-furlong unit-width-full-name @@
+ es-MX
+ 0.0 fur
+ 92,000 fur
+ -0.22 fur
+ zh-TW
+ 0.0 化朗
+ 92,000 化朗
+ -0.22 化朗
+ bn-BD
+ ০.০ ফার্লং
+ ৯২,০০০ ফার্লং
+ -০.২২ ফার্লং
+
+percent unit-width-narrow rounding-mode-floor
+ es-MX
+ 0 %
+ 91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0%
+ 91,827.3645%
+ -0.22222%
+ bn-BD
+ ০%
+ ৯১,৮২৭.৩৬৪৫%
+ -০.২২২২২%
+
+percent unit-width-full-name rounding-mode-floor
+ es-MX
+ 0 %
+ 91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0%
+ 91,827.3645%
+ -0.22222%
+ bn-BD
+ ০%
+ ৯১,৮২৭.৩৬৪৫%
+ -০.২২২২২%
+
+currency/EUR unit-width-narrow rounding-mode-floor
+ es-MX
+ €0.00
+ €91,827.36
+ -€0.23
+ zh-TW
+ €0.00
+ €91,827.36
+ -€0.23
+ bn-BD
+ ০.০০€
+ ৯১,৮২৭.৩৬€
+ -০.২৩€
+
+currency/EUR unit-width-full-name rounding-mode-floor
+ es-MX
+ 0.00 euros
+ 91,827.36 euros
+ -0.23 euros
+ zh-TW
+ 0.00 歐元
+ 91,827.36 歐元
+ -0.23 歐元
+ bn-BD
+ ০.০০ ইউরো
+ ৯১,৮২৭.৩৬ ইউরো
+ -০.২৩ ইউরো
+
+measure-unit/length-furlong unit-width-narrow rounding-mode-floor
+ es-MX
+ 0 fur
+ 91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0化朗
+ 91,827.3645化朗
+ -0.22222化朗
+ bn-BD
+ ০ ফার্লং
+ ৯১,৮২৭.৩৬৪৫ ফার্লং
+ -০.২২২২২ ফার্লং
+
+measure-unit/length-furlong unit-width-full-name rounding-mode-floor
+ es-MX
+ 0 fur
+ 91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0 化朗
+ 91,827.3645 化朗
+ -0.22222 化朗
+ bn-BD
+ ০ ফার্লং
+ ৯১,৮২৭.৩৬৪৫ ফার্লং
+ -০.২২২২২ ফার্লং
+
+percent unit-width-narrow integer-width/##00
+ es-MX
+ 00 %
+ 1827.3645 %
+ -00.22222 %
+ zh-TW
+ 00%
+ 1,827.3645%
+ -00.22222%
+ bn-BD
+ ০০%
+ ১,৮২৭.৩৬৪৫%
+ -০০.২২২২২%
+
+percent unit-width-full-name integer-width/##00
+ es-MX
+ 00 %
+ 1827.3645 %
+ -00.22222 %
+ zh-TW
+ 00%
+ 1,827.3645%
+ -00.22222%
+ bn-BD
+ ০০%
+ ১,৮২৭.৩৬৪৫%
+ -০০.২২২২২%
+
+currency/EUR unit-width-narrow integer-width/##00
+ es-MX
+ €00.00
+ €1827.36
+ -€00.22
+ zh-TW
+ €00.00
+ €1,827.36
+ -€00.22
+ bn-BD
+ ০০.০০€
+ ১,৮২৭.৩৬€
+ -০০.২২€
+
+currency/EUR unit-width-full-name integer-width/##00
+ es-MX
+ 00.00 euros
+ 1827.36 euros
+ -00.22 euros
+ zh-TW
+ 00.00 歐元
+ 1,827.36 歐元
+ -00.22 歐元
+ bn-BD
+ ০০.০০ ইউরো
+ ১,৮২৭.৩৬ ইউরো
+ -০০.২২ ইউরো
+
+measure-unit/length-furlong unit-width-narrow integer-width/##00
+ es-MX
+ 00 fur
+ 1827.3645 fur
+ -00.22222 fur
+ zh-TW
+ 00化朗
+ 1,827.3645化朗
+ -00.22222化朗
+ bn-BD
+ ০০ ফার্লং
+ ১,৮২৭.৩৬৪৫ ফার্লং
+ -০০.২২২২২ ফার্লং
+
+measure-unit/length-furlong unit-width-full-name integer-width/##00
+ es-MX
+ 00 fur
+ 1827.3645 fur
+ -00.22222 fur
+ zh-TW
+ 00 化朗
+ 1,827.3645 化朗
+ -00.22222 化朗
+ bn-BD
+ ০০ ফার্লং
+ ১,৮২৭.৩৬৪৫ ফার্লং
+ -০০.২২২২২ ফার্লং
+
+percent unit-width-narrow scale/0.5
+ es-MX
+ 0 %
+ 45,913.68225 %
+ -0.11111 %
+ zh-TW
+ 0%
+ 45,913.68225%
+ -0.11111%
+ bn-BD
+ ০%
+ ৪৫,৯১৩.৬৮২২৫%
+ -০.১১১১১%
+
+percent unit-width-full-name scale/0.5
+ es-MX
+ 0 %
+ 45,913.68225 %
+ -0.11111 %
+ zh-TW
+ 0%
+ 45,913.68225%
+ -0.11111%
+ bn-BD
+ ০%
+ ৪৫,৯১৩.৬৮২২৫%
+ -০.১১১১১%
+
+currency/EUR unit-width-narrow scale/0.5
+ es-MX
+ €0.00
+ €45,913.68
+ -€0.11
+ zh-TW
+ €0.00
+ €45,913.68
+ -€0.11
+ bn-BD
+ ০.০০€
+ ৪৫,৯১৩.৬৮€
+ -০.১১€
+
+currency/EUR unit-width-full-name scale/0.5
+ es-MX
+ 0.00 euros
+ 45,913.68 euros
+ -0.11 euros
+ zh-TW
+ 0.00 歐元
+ 45,913.68 歐元
+ -0.11 歐元
+ bn-BD
+ ০.০০ ইউরো
+ ৪৫,৯১৩.৬৮ ইউরো
+ -০.১১ ইউরো
+
+measure-unit/length-furlong unit-width-narrow scale/0.5
+ es-MX
+ 0 fur
+ 45,913.68225 fur
+ -0.11111 fur
+ zh-TW
+ 0化朗
+ 45,913.68225化朗
+ -0.11111化朗
+ bn-BD
+ ০ ফার্লং
+ ৪৫,৯১৩.৬৮২২৫ ফার্লং
+ -০.১১১১১ ফার্লং
+
+measure-unit/length-furlong unit-width-full-name scale/0.5
+ es-MX
+ 0 fur
+ 45,913.68225 fur
+ -0.11111 fur
+ zh-TW
+ 0 化朗
+ 45,913.68225 化朗
+ -0.11111 化朗
+ bn-BD
+ ০ ফার্লং
+ ৪৫,৯১৩.৬৮২২৫ ফার্লং
+ -০.১১১১১ ফার্লং
+
+percent unit-width-narrow group-on-aligned
+ es-MX
+ 0 %
+ 91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0%
+ 91,827.3645%
+ -0.22222%
+ bn-BD
+ ০%
+ ৯১,৮২৭.৩৬৪৫%
+ -০.২২২২২%
+
+percent unit-width-full-name group-on-aligned
+ es-MX
+ 0 %
+ 91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0%
+ 91,827.3645%
+ -0.22222%
+ bn-BD
+ ০%
+ ৯১,৮২৭.৩৬৪৫%
+ -০.২২২২২%
+
+currency/EUR unit-width-narrow group-on-aligned
+ es-MX
+ €0.00
+ €91,827.36
+ -€0.22
+ zh-TW
+ €0.00
+ €91,827.36
+ -€0.22
+ bn-BD
+ ০.০০€
+ ৯১,৮২৭.৩৬€
+ -০.২২€
+
+currency/EUR unit-width-full-name group-on-aligned
+ es-MX
+ 0.00 euros
+ 91,827.36 euros
+ -0.22 euros
+ zh-TW
+ 0.00 歐元
+ 91,827.36 歐元
+ -0.22 歐元
+ bn-BD
+ ০.০০ ইউরো
+ ৯১,৮২৭.৩৬ ইউরো
+ -০.২২ ইউরো
+
+measure-unit/length-furlong unit-width-narrow group-on-aligned
+ es-MX
+ 0 fur
+ 91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0化朗
+ 91,827.3645化朗
+ -0.22222化朗
+ bn-BD
+ ০ ফার্লং
+ ৯১,৮২৭.৩৬৪৫ ফার্লং
+ -০.২২২২২ ফার্লং
+
+measure-unit/length-furlong unit-width-full-name group-on-aligned
+ es-MX
+ 0 fur
+ 91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0 化朗
+ 91,827.3645 化朗
+ -0.22222 化朗
+ bn-BD
+ ০ ফার্লং
+ ৯১,৮২৭.৩৬৪৫ ফার্লং
+ -০.২২২২২ ফার্লং
+
+percent unit-width-narrow latin
+ es-MX
+ 0 %
+ 91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0%
+ 91,827.3645%
+ -0.22222%
+ bn-BD
+ 0%
+ 91,827.3645%
+ -0.22222%
+
+percent unit-width-full-name latin
+ es-MX
+ 0 %
+ 91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0%
+ 91,827.3645%
+ -0.22222%
+ bn-BD
+ 0%
+ 91,827.3645%
+ -0.22222%
+
+currency/EUR unit-width-narrow latin
+ es-MX
+ €0.00
+ €91,827.36
+ -€0.22
+ zh-TW
+ €0.00
+ €91,827.36
+ -€0.22
+ bn-BD
+ 0.00€
+ 91,827.36€
+ -0.22€
+
+currency/EUR unit-width-full-name latin
+ es-MX
+ 0.00 euros
+ 91,827.36 euros
+ -0.22 euros
+ zh-TW
+ 0.00 歐元
+ 91,827.36 歐元
+ -0.22 歐元
+ bn-BD
+ 0.00 ইউরো
+ 91,827.36 ইউরো
+ -0.22 ইউরো
+
+measure-unit/length-furlong unit-width-narrow latin
+ es-MX
+ 0 fur
+ 91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0化朗
+ 91,827.3645化朗
+ -0.22222化朗
+ bn-BD
+ 0 ফার্লং
+ 91,827.3645 ফার্লং
+ -0.22222 ফার্লং
+
+measure-unit/length-furlong unit-width-full-name latin
+ es-MX
+ 0 fur
+ 91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0 化朗
+ 91,827.3645 化朗
+ -0.22222 化朗
+ bn-BD
+ 0 ফার্লং
+ 91,827.3645 ফার্লং
+ -0.22222 ফার্লং
+
+percent unit-width-narrow sign-accounting-except-zero
+ es-MX
+ 0 %
+ +91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0%
+ +91,827.3645%
+ -0.22222%
+ bn-BD
+ ০%
+ +৯১,৮২৭.৩৬৪৫%
+ -০.২২২২২%
+
+percent unit-width-full-name sign-accounting-except-zero
+ es-MX
+ 0 %
+ +91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0%
+ +91,827.3645%
+ -0.22222%
+ bn-BD
+ ০%
+ +৯১,৮২৭.৩৬৪৫%
+ -০.২২২২২%
+
+currency/EUR unit-width-narrow sign-accounting-except-zero
+ es-MX
+ €0.00
+ +€91,827.36
+ -€0.22
+ zh-TW
+ €0.00
+ +€91,827.36
+ (€0.22)
+ bn-BD
+ ০.০০€
+ +৯১,৮২৭.৩৬€
+ (০.২২ €)
+
+currency/EUR unit-width-full-name sign-accounting-except-zero
+ es-MX
+ 0.00 euros
+ +91,827.36 euros
+ -0.22 euros
+ zh-TW
+ 0.00 歐元
+ +91,827.36 歐元
+ -0.22 歐元
+ bn-BD
+ ০.০০ ইউরো
+ +৯১,৮২৭.৩৬ ইউরো
+ -০.২২ ইউরো
+
+measure-unit/length-furlong unit-width-narrow sign-accounting-except-zero
+ es-MX
+ 0 fur
+ +91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0化朗
+ +91,827.3645化朗
+ -0.22222化朗
+ bn-BD
+ ০ ফার্লং
+ +৯১,৮২৭.৩৬৪৫ ফার্লং
+ -০.২২২২২ ফার্লং
+
+measure-unit/length-furlong unit-width-full-name sign-accounting-except-zero
+ es-MX
+ 0 fur
+ +91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0 化朗
+ +91,827.3645 化朗
+ -0.22222 化朗
+ bn-BD
+ ০ ফার্লং
+ +৯১,৮২৭.৩৬৪৫ ফার্লং
+ -০.২২২২২ ফার্লং
+
+percent unit-width-narrow decimal-always
+ es-MX
+ 0. %
+ 91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0.%
+ 91,827.3645%
+ -0.22222%
+ bn-BD
+ ০.%
+ ৯১,৮২৭.৩৬৪৫%
+ -০.২২২২২%
+
+percent unit-width-full-name decimal-always
+ es-MX
+ 0. %
+ 91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0.%
+ 91,827.3645%
+ -0.22222%
+ bn-BD
+ ০.%
+ ৯১,৮২৭.৩৬৪৫%
+ -০.২২২২২%
+
+currency/EUR unit-width-narrow decimal-always
+ es-MX
+ €0.00
+ €91,827.36
+ -€0.22
+ zh-TW
+ €0.00
+ €91,827.36
+ -€0.22
+ bn-BD
+ ০.০০€
+ ৯১,৮২৭.৩৬€
+ -০.২২€
+
+currency/EUR unit-width-full-name decimal-always
+ es-MX
+ 0.00 euros
+ 91,827.36 euros
+ -0.22 euros
+ zh-TW
+ 0.00 歐元
+ 91,827.36 歐元
+ -0.22 歐元
+ bn-BD
+ ০.০০ ইউরো
+ ৯১,৮২৭.৩৬ ইউরো
+ -০.২২ ইউরো
+
+measure-unit/length-furlong unit-width-narrow decimal-always
+ es-MX
+ 0. fur
+ 91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0.化朗
+ 91,827.3645化朗
+ -0.22222化朗
+ bn-BD
+ ০. ফার্লং
+ ৯১,৮২৭.৩৬৪৫ ফার্লং
+ -০.২২২২২ ফার্লং
+
+measure-unit/length-furlong unit-width-full-name decimal-always
+ es-MX
+ 0. fur
+ 91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0. 化朗
+ 91,827.3645 化朗
+ -0.22222 化朗
+ bn-BD
+ ০. ফার্লং
+ ৯১,৮২৭.৩৬৪৫ ফার্লং
+ -০.২২২২২ ফার্লং
+
+percent precision-integer rounding-mode-floor
+ es-MX
+ 0 %
+ 91,827 %
+ -1 %
+ zh-TW
+ 0%
+ 91,827%
+ -1%
+ bn-BD
+ ০%
+ ৯১,৮২৭%
+ -১%
+
+percent .000 rounding-mode-floor
+ es-MX
+ 0.000 %
+ 91,827.364 %
+ -0.223 %
+ zh-TW
+ 0.000%
+ 91,827.364%
+ -0.223%
+ bn-BD
+ ০.০০০%
+ ৯১,৮২৭.৩৬৪%
+ -০.২২৩%
+
+percent .##/@@@+ rounding-mode-floor
+ es-MX
+ 0 %
+ 91,827.36 %
+ -0.223 %
+ zh-TW
+ 0%
+ 91,827.36%
+ -0.223%
+ bn-BD
+ ০%
+ ৯১,৮২৭.৩৬%
+ -০.২২৩%
+
+percent @@ rounding-mode-floor
+ es-MX
+ 0.0 %
+ 91,000 %
+ -0.23 %
+ zh-TW
+ 0.0%
+ 91,000%
+ -0.23%
+ bn-BD
+ ০.০%
+ ৯১,০০০%
+ -০.২৩%
+
+currency/EUR precision-integer rounding-mode-floor
+ es-MX
+ EUR 0
+ EUR 91,827
+ -EUR 1
+ zh-TW
+ €0
+ €91,827
+ -€1
+ bn-BD
+ ০€
+ ৯১,৮২৭€
+ -১€
+
+currency/EUR .000 rounding-mode-floor
+ es-MX
+ EUR 0.000
+ EUR 91,827.364
+ -EUR 0.223
+ zh-TW
+ €0.000
+ €91,827.364
+ -€0.223
+ bn-BD
+ ০.০০০€
+ ৯১,৮২৭.৩৬৪€
+ -০.২২৩€
+
+currency/EUR .##/@@@+ rounding-mode-floor
+ es-MX
+ EUR 0
+ EUR 91,827.36
+ -EUR 0.223
+ zh-TW
+ €0
+ €91,827.36
+ -€0.223
+ bn-BD
+ ০€
+ ৯১,৮২৭.৩৬€
+ -০.২২৩€
+
+currency/EUR @@ rounding-mode-floor
+ es-MX
+ EUR 0.0
+ EUR 91,000
+ -EUR 0.23
+ zh-TW
+ €0.0
+ €91,000
+ -€0.23
+ bn-BD
+ ০.০€
+ ৯১,০০০€
+ -০.২৩€
+
+measure-unit/length-furlong precision-integer rounding-mode-floor
+ es-MX
+ 0 fur
+ 91,827 fur
+ -1 fur
+ zh-TW
+ 0 化朗
+ 91,827 化朗
+ -1 化朗
+ bn-BD
+ ০ ফার্লং
+ ৯১,৮২৭ ফার্লং
+ -১ ফার্লং
+
+measure-unit/length-furlong .000 rounding-mode-floor
+ es-MX
+ 0.000 fur
+ 91,827.364 fur
+ -0.223 fur
+ zh-TW
+ 0.000 化朗
+ 91,827.364 化朗
+ -0.223 化朗
+ bn-BD
+ ০.০০০ ফার্লং
+ ৯১,৮২৭.৩৬৪ ফার্লং
+ -০.২২৩ ফার্লং
+
+measure-unit/length-furlong .##/@@@+ rounding-mode-floor
+ es-MX
+ 0 fur
+ 91,827.36 fur
+ -0.223 fur
+ zh-TW
+ 0 化朗
+ 91,827.36 化朗
+ -0.223 化朗
+ bn-BD
+ ০ ফার্লং
+ ৯১,৮২৭.৩৬ ফার্লং
+ -০.২২৩ ফার্লং
+
+measure-unit/length-furlong @@ rounding-mode-floor
+ es-MX
+ 0.0 fur
+ 91,000 fur
+ -0.23 fur
+ zh-TW
+ 0.0 化朗
+ 91,000 化朗
+ -0.23 化朗
+ bn-BD
+ ০.০ ফার্লং
+ ৯১,০০০ ফার্লং
+ -০.২৩ ফার্লং
+
+percent precision-integer integer-width/##00
+ es-MX
+ 00 %
+ 1827 %
+ -00 %
+ zh-TW
+ 00%
+ 1,827%
+ -00%
+ bn-BD
+ ০০%
+ ১,৮২৭%
+ -০০%
+
+percent .000 integer-width/##00
+ es-MX
+ 00.000 %
+ 1827.364 %
+ -00.222 %
+ zh-TW
+ 00.000%
+ 1,827.364%
+ -00.222%
+ bn-BD
+ ০০.০০০%
+ ১,৮২৭.৩৬৪%
+ -০০.২২২%
+
+percent .##/@@@+ integer-width/##00
+ es-MX
+ 00 %
+ 1827.36 %
+ -00.222 %
+ zh-TW
+ 00%
+ 1,827.36%
+ -00.222%
+ bn-BD
+ ০০%
+ ১,৮২৭.৩৬%
+ -০০.২২২%
+
+percent @@ integer-width/##00
+ es-MX
+ 00.0 %
+ 2000 %
+ -00.22 %
+ zh-TW
+ 00.0%
+ 2,000%
+ -00.22%
+ bn-BD
+ ০০.০%
+ ২,০০০%
+ -০০.২২%
+
+currency/EUR precision-integer integer-width/##00
+ es-MX
+ EUR 00
+ EUR 1827
+ -EUR 00
+ zh-TW
+ €00
+ €1,827
+ -€00
+ bn-BD
+ ০০€
+ ১,৮২৭€
+ -০০€
+
+currency/EUR .000 integer-width/##00
+ es-MX
+ EUR 00.000
+ EUR 1827.364
+ -EUR 00.222
+ zh-TW
+ €00.000
+ €1,827.364
+ -€00.222
+ bn-BD
+ ০০.০০০€
+ ১,৮২৭.৩৬৪€
+ -০০.২২২€
+
+currency/EUR .##/@@@+ integer-width/##00
+ es-MX
+ EUR 00
+ EUR 1827.36
+ -EUR 00.222
+ zh-TW
+ €00
+ €1,827.36
+ -€00.222
+ bn-BD
+ ০০€
+ ১,৮২৭.৩৬€
+ -০০.২২২€
+
+currency/EUR @@ integer-width/##00
+ es-MX
+ EUR 00.0
+ EUR 2000
+ -EUR 00.22
+ zh-TW
+ €00.0
+ €2,000
+ -€00.22
+ bn-BD
+ ০০.০€
+ ২,০০০€
+ -০০.২২€
+
+measure-unit/length-furlong precision-integer integer-width/##00
+ es-MX
+ 00 fur
+ 1827 fur
+ -00 fur
+ zh-TW
+ 00 化朗
+ 1,827 化朗
+ -00 化朗
+ bn-BD
+ ০০ ফার্লং
+ ১,৮২৭ ফার্লং
+ -০০ ফার্লং
+
+measure-unit/length-furlong .000 integer-width/##00
+ es-MX
+ 00.000 fur
+ 1827.364 fur
+ -00.222 fur
+ zh-TW
+ 00.000 化朗
+ 1,827.364 化朗
+ -00.222 化朗
+ bn-BD
+ ০০.০০০ ফার্লং
+ ১,৮২৭.৩৬৪ ফার্লং
+ -০০.২২২ ফার্লং
+
+measure-unit/length-furlong .##/@@@+ integer-width/##00
+ es-MX
+ 00 fur
+ 1827.36 fur
+ -00.222 fur
+ zh-TW
+ 00 化朗
+ 1,827.36 化朗
+ -00.222 化朗
+ bn-BD
+ ০০ ফার্লং
+ ১,৮২৭.৩৬ ফার্লং
+ -০০.২২২ ফার্লং
+
+measure-unit/length-furlong @@ integer-width/##00
+ es-MX
+ 00.0 fur
+ 2000 fur
+ -00.22 fur
+ zh-TW
+ 00.0 化朗
+ 2,000 化朗
+ -00.22 化朗
+ bn-BD
+ ০০.০ ফার্লং
+ ২,০০০ ফার্লং
+ -০০.২২ ফার্লং
+
+percent precision-integer scale/0.5
+ es-MX
+ 0 %
+ 45,914 %
+ -0 %
+ zh-TW
+ 0%
+ 45,914%
+ -0%
+ bn-BD
+ ০%
+ ৪৫,৯১৪%
+ -০%
+
+percent .000 scale/0.5
+ es-MX
+ 0.000 %
+ 45,913.682 %
+ -0.111 %
+ zh-TW
+ 0.000%
+ 45,913.682%
+ -0.111%
+ bn-BD
+ ০.০০০%
+ ৪৫,৯১৩.৬৮২%
+ -০.১১১%
+
+percent .##/@@@+ scale/0.5
+ es-MX
+ 0 %
+ 45,913.68 %
+ -0.111 %
+ zh-TW
+ 0%
+ 45,913.68%
+ -0.111%
+ bn-BD
+ ০%
+ ৪৫,৯১৩.৬৮%
+ -০.১১১%
+
+percent @@ scale/0.5
+ es-MX
+ 0.0 %
+ 46,000 %
+ -0.11 %
+ zh-TW
+ 0.0%
+ 46,000%
+ -0.11%
+ bn-BD
+ ০.০%
+ ৪৬,০০০%
+ -০.১১%
+
+currency/EUR precision-integer scale/0.5
+ es-MX
+ EUR 0
+ EUR 45,914
+ -EUR 0
+ zh-TW
+ €0
+ €45,914
+ -€0
+ bn-BD
+ ০€
+ ৪৫,৯১৪€
+ -০€
+
+currency/EUR .000 scale/0.5
+ es-MX
+ EUR 0.000
+ EUR 45,913.682
+ -EUR 0.111
+ zh-TW
+ €0.000
+ €45,913.682
+ -€0.111
+ bn-BD
+ ০.০০০€
+ ৪৫,৯১৩.৬৮২€
+ -০.১১১€
+
+currency/EUR .##/@@@+ scale/0.5
+ es-MX
+ EUR 0
+ EUR 45,913.68
+ -EUR 0.111
+ zh-TW
+ €0
+ €45,913.68
+ -€0.111
+ bn-BD
+ ০€
+ ৪৫,৯১৩.৬৮€
+ -০.১১১€
+
+currency/EUR @@ scale/0.5
+ es-MX
+ EUR 0.0
+ EUR 46,000
+ -EUR 0.11
+ zh-TW
+ €0.0
+ €46,000
+ -€0.11
+ bn-BD
+ ০.০€
+ ৪৬,০০০€
+ -০.১১€
+
+measure-unit/length-furlong precision-integer scale/0.5
+ es-MX
+ 0 fur
+ 45,914 fur
+ -0 fur
+ zh-TW
+ 0 化朗
+ 45,914 化朗
+ -0 化朗
+ bn-BD
+ ০ ফার্লং
+ ৪৫,৯১৪ ফার্লং
+ -০ ফার্লং
+
+measure-unit/length-furlong .000 scale/0.5
+ es-MX
+ 0.000 fur
+ 45,913.682 fur
+ -0.111 fur
+ zh-TW
+ 0.000 化朗
+ 45,913.682 化朗
+ -0.111 化朗
+ bn-BD
+ ০.০০০ ফার্লং
+ ৪৫,৯১৩.৬৮২ ফার্লং
+ -০.১১১ ফার্লং
+
+measure-unit/length-furlong .##/@@@+ scale/0.5
+ es-MX
+ 0 fur
+ 45,913.68 fur
+ -0.111 fur
+ zh-TW
+ 0 化朗
+ 45,913.68 化朗
+ -0.111 化朗
+ bn-BD
+ ০ ফার্লং
+ ৪৫,৯১৩.৬৮ ফার্লং
+ -০.১১১ ফার্লং
+
+measure-unit/length-furlong @@ scale/0.5
+ es-MX
+ 0.0 fur
+ 46,000 fur
+ -0.11 fur
+ zh-TW
+ 0.0 化朗
+ 46,000 化朗
+ -0.11 化朗
+ bn-BD
+ ০.০ ফার্লং
+ ৪৬,০০০ ফার্লং
+ -০.১১ ফার্লং
+
+percent precision-integer group-on-aligned
+ es-MX
+ 0 %
+ 91,827 %
+ -0 %
+ zh-TW
+ 0%
+ 91,827%
+ -0%
+ bn-BD
+ ০%
+ ৯১,৮২৭%
+ -০%
+
+percent .000 group-on-aligned
+ es-MX
+ 0.000 %
+ 91,827.364 %
+ -0.222 %
+ zh-TW
+ 0.000%
+ 91,827.364%
+ -0.222%
+ bn-BD
+ ০.০০০%
+ ৯১,৮২৭.৩৬৪%
+ -০.২২২%
+
+percent .##/@@@+ group-on-aligned
+ es-MX
+ 0 %
+ 91,827.36 %
+ -0.222 %
+ zh-TW
+ 0%
+ 91,827.36%
+ -0.222%
+ bn-BD
+ ০%
+ ৯১,৮২৭.৩৬%
+ -০.২২২%
+
+percent @@ group-on-aligned
+ es-MX
+ 0.0 %
+ 92,000 %
+ -0.22 %
+ zh-TW
+ 0.0%
+ 92,000%
+ -0.22%
+ bn-BD
+ ০.০%
+ ৯২,০০০%
+ -০.২২%
+
+currency/EUR precision-integer group-on-aligned
+ es-MX
+ EUR 0
+ EUR 91,827
+ -EUR 0
+ zh-TW
+ €0
+ €91,827
+ -€0
+ bn-BD
+ ০€
+ ৯১,৮২৭€
+ -০€
+
+currency/EUR .000 group-on-aligned
+ es-MX
+ EUR 0.000
+ EUR 91,827.364
+ -EUR 0.222
+ zh-TW
+ €0.000
+ €91,827.364
+ -€0.222
+ bn-BD
+ ০.০০০€
+ ৯১,৮২৭.৩৬৪€
+ -০.২২২€
+
+currency/EUR .##/@@@+ group-on-aligned
+ es-MX
+ EUR 0
+ EUR 91,827.36
+ -EUR 0.222
+ zh-TW
+ €0
+ €91,827.36
+ -€0.222
+ bn-BD
+ ০€
+ ৯১,৮২৭.৩৬€
+ -০.২২২€
+
+currency/EUR @@ group-on-aligned
+ es-MX
+ EUR 0.0
+ EUR 92,000
+ -EUR 0.22
+ zh-TW
+ €0.0
+ €92,000
+ -€0.22
+ bn-BD
+ ০.০€
+ ৯২,০০০€
+ -০.২২€
+
+measure-unit/length-furlong precision-integer group-on-aligned
+ es-MX
+ 0 fur
+ 91,827 fur
+ -0 fur
+ zh-TW
+ 0 化朗
+ 91,827 化朗
+ -0 化朗
+ bn-BD
+ ০ ফার্লং
+ ৯১,৮২৭ ফার্লং
+ -০ ফার্লং
+
+measure-unit/length-furlong .000 group-on-aligned
+ es-MX
+ 0.000 fur
+ 91,827.364 fur
+ -0.222 fur
+ zh-TW
+ 0.000 化朗
+ 91,827.364 化朗
+ -0.222 化朗
+ bn-BD
+ ০.০০০ ফার্লং
+ ৯১,৮২৭.৩৬৪ ফার্লং
+ -০.২২২ ফার্লং
+
+measure-unit/length-furlong .##/@@@+ group-on-aligned
+ es-MX
+ 0 fur
+ 91,827.36 fur
+ -0.222 fur
+ zh-TW
+ 0 化朗
+ 91,827.36 化朗
+ -0.222 化朗
+ bn-BD
+ ০ ফার্লং
+ ৯১,৮২৭.৩৬ ফার্লং
+ -০.২২২ ফার্লং
+
+measure-unit/length-furlong @@ group-on-aligned
+ es-MX
+ 0.0 fur
+ 92,000 fur
+ -0.22 fur
+ zh-TW
+ 0.0 化朗
+ 92,000 化朗
+ -0.22 化朗
+ bn-BD
+ ০.০ ফার্লং
+ ৯২,০০০ ফার্লং
+ -০.২২ ফার্লং
+
+percent precision-integer latin
+ es-MX
+ 0 %
+ 91,827 %
+ -0 %
+ zh-TW
+ 0%
+ 91,827%
+ -0%
+ bn-BD
+ 0%
+ 91,827%
+ -0%
+
+percent .000 latin
+ es-MX
+ 0.000 %
+ 91,827.364 %
+ -0.222 %
+ zh-TW
+ 0.000%
+ 91,827.364%
+ -0.222%
+ bn-BD
+ 0.000%
+ 91,827.364%
+ -0.222%
+
+percent .##/@@@+ latin
+ es-MX
+ 0 %
+ 91,827.36 %
+ -0.222 %
+ zh-TW
+ 0%
+ 91,827.36%
+ -0.222%
+ bn-BD
+ 0%
+ 91,827.36%
+ -0.222%
+
+percent @@ latin
+ es-MX
+ 0.0 %
+ 92,000 %
+ -0.22 %
+ zh-TW
+ 0.0%
+ 92,000%
+ -0.22%
+ bn-BD
+ 0.0%
+ 92,000%
+ -0.22%
+
+currency/EUR precision-integer latin
+ es-MX
+ EUR 0
+ EUR 91,827
+ -EUR 0
+ zh-TW
+ €0
+ €91,827
+ -€0
+ bn-BD
+ 0€
+ 91,827€
+ -0€
+
+currency/EUR .000 latin
+ es-MX
+ EUR 0.000
+ EUR 91,827.364
+ -EUR 0.222
+ zh-TW
+ €0.000
+ €91,827.364
+ -€0.222
+ bn-BD
+ 0.000€
+ 91,827.364€
+ -0.222€
+
+currency/EUR .##/@@@+ latin
+ es-MX
+ EUR 0
+ EUR 91,827.36
+ -EUR 0.222
+ zh-TW
+ €0
+ €91,827.36
+ -€0.222
+ bn-BD
+ 0€
+ 91,827.36€
+ -0.222€
+
+currency/EUR @@ latin
+ es-MX
+ EUR 0.0
+ EUR 92,000
+ -EUR 0.22
+ zh-TW
+ €0.0
+ €92,000
+ -€0.22
+ bn-BD
+ 0.0€
+ 92,000€
+ -0.22€
+
+measure-unit/length-furlong precision-integer latin
+ es-MX
+ 0 fur
+ 91,827 fur
+ -0 fur
+ zh-TW
+ 0 化朗
+ 91,827 化朗
+ -0 化朗
+ bn-BD
+ 0 ফার্লং
+ 91,827 ফার্লং
+ -0 ফার্লং
+
+measure-unit/length-furlong .000 latin
+ es-MX
+ 0.000 fur
+ 91,827.364 fur
+ -0.222 fur
+ zh-TW
+ 0.000 化朗
+ 91,827.364 化朗
+ -0.222 化朗
+ bn-BD
+ 0.000 ফার্লং
+ 91,827.364 ফার্লং
+ -0.222 ফার্লং
+
+measure-unit/length-furlong .##/@@@+ latin
+ es-MX
+ 0 fur
+ 91,827.36 fur
+ -0.222 fur
+ zh-TW
+ 0 化朗
+ 91,827.36 化朗
+ -0.222 化朗
+ bn-BD
+ 0 ফার্লং
+ 91,827.36 ফার্লং
+ -0.222 ফার্লং
+
+measure-unit/length-furlong @@ latin
+ es-MX
+ 0.0 fur
+ 92,000 fur
+ -0.22 fur
+ zh-TW
+ 0.0 化朗
+ 92,000 化朗
+ -0.22 化朗
+ bn-BD
+ 0.0 ফার্লং
+ 92,000 ফার্লং
+ -0.22 ফার্লং
+
+percent precision-integer sign-accounting-except-zero
+ es-MX
+ 0 %
+ +91,827 %
+ -0 %
+ zh-TW
+ 0%
+ +91,827%
+ -0%
+ bn-BD
+ ০%
+ +৯১,৮২৭%
+ -০%
+
+percent .000 sign-accounting-except-zero
+ es-MX
+ 0.000 %
+ +91,827.364 %
+ -0.222 %
+ zh-TW
+ 0.000%
+ +91,827.364%
+ -0.222%
+ bn-BD
+ ০.০০০%
+ +৯১,৮২৭.৩৬৪%
+ -০.২২২%
+
+percent .##/@@@+ sign-accounting-except-zero
+ es-MX
+ 0 %
+ +91,827.36 %
+ -0.222 %
+ zh-TW
+ 0%
+ +91,827.36%
+ -0.222%
+ bn-BD
+ ০%
+ +৯১,৮২৭.৩৬%
+ -০.২২২%
+
+percent @@ sign-accounting-except-zero
+ es-MX
+ 0.0 %
+ +92,000 %
+ -0.22 %
+ zh-TW
+ 0.0%
+ +92,000%
+ -0.22%
+ bn-BD
+ ০.০%
+ +৯২,০০০%
+ -০.২২%
+
+currency/EUR precision-integer sign-accounting-except-zero
+ es-MX
+ EUR 0
+ +EUR 91,827
+ -EUR 0
+ zh-TW
+ €0
+ +€91,827
+ (€0)
+ bn-BD
+ ০€
+ +৯১,৮২৭€
+ (০ €)
+
+currency/EUR .000 sign-accounting-except-zero
+ es-MX
+ EUR 0.000
+ +EUR 91,827.364
+ -EUR 0.222
+ zh-TW
+ €0.000
+ +€91,827.364
+ (€0.222)
+ bn-BD
+ ০.০০০€
+ +৯১,৮২৭.৩৬৪€
+ (০.২২২ €)
+
+currency/EUR .##/@@@+ sign-accounting-except-zero
+ es-MX
+ EUR 0
+ +EUR 91,827.36
+ -EUR 0.222
+ zh-TW
+ €0
+ +€91,827.36
+ (€0.222)
+ bn-BD
+ ০€
+ +৯১,৮২৭.৩৬€
+ (০.২২২ €)
+
+currency/EUR @@ sign-accounting-except-zero
+ es-MX
+ EUR 0.0
+ +EUR 92,000
+ -EUR 0.22
+ zh-TW
+ €0.0
+ +€92,000
+ (€0.22)
+ bn-BD
+ ০.০€
+ +৯২,০০০€
+ (০.২২ €)
+
+measure-unit/length-furlong precision-integer sign-accounting-except-zero
+ es-MX
+ 0 fur
+ +91,827 fur
+ -0 fur
+ zh-TW
+ 0 化朗
+ +91,827 化朗
+ -0 化朗
+ bn-BD
+ ০ ফার্লং
+ +৯১,৮২৭ ফার্লং
+ -০ ফার্লং
+
+measure-unit/length-furlong .000 sign-accounting-except-zero
+ es-MX
+ 0.000 fur
+ +91,827.364 fur
+ -0.222 fur
+ zh-TW
+ 0.000 化朗
+ +91,827.364 化朗
+ -0.222 化朗
+ bn-BD
+ ০.০০০ ফার্লং
+ +৯১,৮২৭.৩৬৪ ফার্লং
+ -০.২২২ ফার্লং
+
+measure-unit/length-furlong .##/@@@+ sign-accounting-except-zero
+ es-MX
+ 0 fur
+ +91,827.36 fur
+ -0.222 fur
+ zh-TW
+ 0 化朗
+ +91,827.36 化朗
+ -0.222 化朗
+ bn-BD
+ ০ ফার্লং
+ +৯১,৮২৭.৩৬ ফার্লং
+ -০.২২২ ফার্লং
+
+measure-unit/length-furlong @@ sign-accounting-except-zero
+ es-MX
+ 0.0 fur
+ +92,000 fur
+ -0.22 fur
+ zh-TW
+ 0.0 化朗
+ +92,000 化朗
+ -0.22 化朗
+ bn-BD
+ ০.০ ফার্লং
+ +৯২,০০০ ফার্লং
+ -০.২২ ফার্লং
+
+percent precision-integer decimal-always
+ es-MX
+ 0. %
+ 91,827. %
+ -0. %
+ zh-TW
+ 0.%
+ 91,827.%
+ -0.%
+ bn-BD
+ ০.%
+ ৯১,৮২৭.%
+ -০.%
+
+percent .000 decimal-always
+ es-MX
+ 0.000 %
+ 91,827.364 %
+ -0.222 %
+ zh-TW
+ 0.000%
+ 91,827.364%
+ -0.222%
+ bn-BD
+ ০.০০০%
+ ৯১,৮২৭.৩৬৪%
+ -০.২২২%
+
+percent .##/@@@+ decimal-always
+ es-MX
+ 0. %
+ 91,827.36 %
+ -0.222 %
+ zh-TW
+ 0.%
+ 91,827.36%
+ -0.222%
+ bn-BD
+ ০.%
+ ৯১,৮২৭.৩৬%
+ -০.২২২%
+
+percent @@ decimal-always
+ es-MX
+ 0.0 %
+ 92,000. %
+ -0.22 %
+ zh-TW
+ 0.0%
+ 92,000.%
+ -0.22%
+ bn-BD
+ ০.০%
+ ৯২,০০০.%
+ -০.২২%
+
+currency/EUR precision-integer decimal-always
+ es-MX
+ EUR 0.
+ EUR 91,827.
+ -EUR 0.
+ zh-TW
+ €0.
+ €91,827.
+ -€0.
+ bn-BD
+ ০.€
+ ৯১,৮২৭.€
+ -০.€
+
+currency/EUR .000 decimal-always
+ es-MX
+ EUR 0.000
+ EUR 91,827.364
+ -EUR 0.222
+ zh-TW
+ €0.000
+ €91,827.364
+ -€0.222
+ bn-BD
+ ০.০০০€
+ ৯১,৮২৭.৩৬৪€
+ -০.২২২€
+
+currency/EUR .##/@@@+ decimal-always
+ es-MX
+ EUR 0.
+ EUR 91,827.36
+ -EUR 0.222
+ zh-TW
+ €0.
+ €91,827.36
+ -€0.222
+ bn-BD
+ ০.€
+ ৯১,৮২৭.৩৬€
+ -০.২২২€
+
+currency/EUR @@ decimal-always
+ es-MX
+ EUR 0.0
+ EUR 92,000.
+ -EUR 0.22
+ zh-TW
+ €0.0
+ €92,000.
+ -€0.22
+ bn-BD
+ ০.০€
+ ৯২,০০০.€
+ -০.২২€
+
+measure-unit/length-furlong precision-integer decimal-always
+ es-MX
+ 0. fur
+ 91,827. fur
+ -0. fur
+ zh-TW
+ 0. 化朗
+ 91,827. 化朗
+ -0. 化朗
+ bn-BD
+ ০. ফার্লং
+ ৯১,৮২৭. ফার্লং
+ -০. ফার্লং
+
+measure-unit/length-furlong .000 decimal-always
+ es-MX
+ 0.000 fur
+ 91,827.364 fur
+ -0.222 fur
+ zh-TW
+ 0.000 化朗
+ 91,827.364 化朗
+ -0.222 化朗
+ bn-BD
+ ০.০০০ ফার্লং
+ ৯১,৮২৭.৩৬৪ ফার্লং
+ -০.২২২ ফার্লং
+
+measure-unit/length-furlong .##/@@@+ decimal-always
+ es-MX
+ 0. fur
+ 91,827.36 fur
+ -0.222 fur
+ zh-TW
+ 0. 化朗
+ 91,827.36 化朗
+ -0.222 化朗
+ bn-BD
+ ০. ফার্লং
+ ৯১,৮২৭.৩৬ ফার্লং
+ -০.২২২ ফার্লং
+
+measure-unit/length-furlong @@ decimal-always
+ es-MX
+ 0.0 fur
+ 92,000. fur
+ -0.22 fur
+ zh-TW
+ 0.0 化朗
+ 92,000. 化朗
+ -0.22 化朗
+ bn-BD
+ ০.০ ফার্লং
+ ৯২,০০০. ফার্লং
+ -০.২২ ফার্লং
+
+percent rounding-mode-floor integer-width/##00
+ es-MX
+ 00 %
+ 1827.3645 %
+ -00.22222 %
+ zh-TW
+ 00%
+ 1,827.3645%
+ -00.22222%
+ bn-BD
+ ০০%
+ ১,৮২৭.৩৬৪৫%
+ -০০.২২২২২%
+
+currency/EUR rounding-mode-floor integer-width/##00
+ es-MX
+ EUR 00.00
+ EUR 1827.36
+ -EUR 00.23
+ zh-TW
+ €00.00
+ €1,827.36
+ -€00.23
+ bn-BD
+ ০০.০০€
+ ১,৮২৭.৩৬€
+ -০০.২৩€
+
+measure-unit/length-furlong rounding-mode-floor integer-width/##00
+ es-MX
+ 00 fur
+ 1827.3645 fur
+ -00.22222 fur
+ zh-TW
+ 00 化朗
+ 1,827.3645 化朗
+ -00.22222 化朗
+ bn-BD
+ ০০ ফার্লং
+ ১,৮২৭.৩৬৪৫ ফার্লং
+ -০০.২২২২২ ফার্লং
+
+percent rounding-mode-floor scale/0.5
+ es-MX
+ 0 %
+ 45,913.68225 %
+ -0.11111 %
+ zh-TW
+ 0%
+ 45,913.68225%
+ -0.11111%
+ bn-BD
+ ০%
+ ৪৫,৯১৩.৬৮২২৫%
+ -০.১১১১১%
+
+currency/EUR rounding-mode-floor scale/0.5
+ es-MX
+ EUR 0.00
+ EUR 45,913.68
+ -EUR 0.12
+ zh-TW
+ €0.00
+ €45,913.68
+ -€0.12
+ bn-BD
+ ০.০০€
+ ৪৫,৯১৩.৬৮€
+ -০.১২€
+
+measure-unit/length-furlong rounding-mode-floor scale/0.5
+ es-MX
+ 0 fur
+ 45,913.68225 fur
+ -0.11111 fur
+ zh-TW
+ 0 化朗
+ 45,913.68225 化朗
+ -0.11111 化朗
+ bn-BD
+ ০ ফার্লং
+ ৪৫,৯১৩.৬৮২২৫ ফার্লং
+ -০.১১১১১ ফার্লং
+
+percent rounding-mode-floor group-on-aligned
+ es-MX
+ 0 %
+ 91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0%
+ 91,827.3645%
+ -0.22222%
+ bn-BD
+ ০%
+ ৯১,৮২৭.৩৬৪৫%
+ -০.২২২২২%
+
+currency/EUR rounding-mode-floor group-on-aligned
+ es-MX
+ EUR 0.00
+ EUR 91,827.36
+ -EUR 0.23
+ zh-TW
+ €0.00
+ €91,827.36
+ -€0.23
+ bn-BD
+ ০.০০€
+ ৯১,৮২৭.৩৬€
+ -০.২৩€
+
+measure-unit/length-furlong rounding-mode-floor group-on-aligned
+ es-MX
+ 0 fur
+ 91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0 化朗
+ 91,827.3645 化朗
+ -0.22222 化朗
+ bn-BD
+ ০ ফার্লং
+ ৯১,৮২৭.৩৬৪৫ ফার্লং
+ -০.২২২২২ ফার্লং
+
+percent rounding-mode-floor latin
+ es-MX
+ 0 %
+ 91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0%
+ 91,827.3645%
+ -0.22222%
+ bn-BD
+ 0%
+ 91,827.3645%
+ -0.22222%
+
+currency/EUR rounding-mode-floor latin
+ es-MX
+ EUR 0.00
+ EUR 91,827.36
+ -EUR 0.23
+ zh-TW
+ €0.00
+ €91,827.36
+ -€0.23
+ bn-BD
+ 0.00€
+ 91,827.36€
+ -0.23€
+
+measure-unit/length-furlong rounding-mode-floor latin
+ es-MX
+ 0 fur
+ 91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0 化朗
+ 91,827.3645 化朗
+ -0.22222 化朗
+ bn-BD
+ 0 ফার্লং
+ 91,827.3645 ফার্লং
+ -0.22222 ফার্লং
+
+percent rounding-mode-floor sign-accounting-except-zero
+ es-MX
+ 0 %
+ +91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0%
+ +91,827.3645%
+ -0.22222%
+ bn-BD
+ ০%
+ +৯১,৮২৭.৩৬৪৫%
+ -০.২২২২২%
+
+currency/EUR rounding-mode-floor sign-accounting-except-zero
+ es-MX
+ EUR 0.00
+ +EUR 91,827.36
+ -EUR 0.23
+ zh-TW
+ €0.00
+ +€91,827.36
+ (€0.23)
+ bn-BD
+ ০.০০€
+ +৯১,৮২৭.৩৬€
+ (০.২৩ €)
+
+measure-unit/length-furlong rounding-mode-floor sign-accounting-except-zero
+ es-MX
+ 0 fur
+ +91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0 化朗
+ +91,827.3645 化朗
+ -0.22222 化朗
+ bn-BD
+ ০ ফার্লং
+ +৯১,৮২৭.৩৬৪৫ ফার্লং
+ -০.২২২২২ ফার্লং
+
+percent rounding-mode-floor decimal-always
+ es-MX
+ 0. %
+ 91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0.%
+ 91,827.3645%
+ -0.22222%
+ bn-BD
+ ০.%
+ ৯১,৮২৭.৩৬৪৫%
+ -০.২২২২২%
+
+currency/EUR rounding-mode-floor decimal-always
+ es-MX
+ EUR 0.00
+ EUR 91,827.36
+ -EUR 0.23
+ zh-TW
+ €0.00
+ €91,827.36
+ -€0.23
+ bn-BD
+ ০.০০€
+ ৯১,৮২৭.৩৬€
+ -০.২৩€
+
+measure-unit/length-furlong rounding-mode-floor decimal-always
+ es-MX
+ 0. fur
+ 91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0. 化朗
+ 91,827.3645 化朗
+ -0.22222 化朗
+ bn-BD
+ ০. ফার্লং
+ ৯১,৮২৭.৩৬৪৫ ফার্লং
+ -০.২২২২২ ফার্লং
+
+percent integer-width/##00 scale/0.5
+ es-MX
+ 00 %
+ 5913.68225 %
+ -00.11111 %
+ zh-TW
+ 00%
+ 5,913.68225%
+ -00.11111%
+ bn-BD
+ ০০%
+ ৫,৯১৩.৬৮২২৫%
+ -০০.১১১১১%
+
+currency/EUR integer-width/##00 scale/0.5
+ es-MX
+ EUR 00.00
+ EUR 5913.68
+ -EUR 00.11
+ zh-TW
+ €00.00
+ €5,913.68
+ -€00.11
+ bn-BD
+ ০০.০০€
+ ৫,৯১৩.৬৮€
+ -০০.১১€
+
+measure-unit/length-furlong integer-width/##00 scale/0.5
+ es-MX
+ 00 fur
+ 5913.68225 fur
+ -00.11111 fur
+ zh-TW
+ 00 化朗
+ 5,913.68225 化朗
+ -00.11111 化朗
+ bn-BD
+ ০০ ফার্লং
+ ৫,৯১৩.৬৮২২৫ ফার্লং
+ -০০.১১১১১ ফার্লং
+
+percent integer-width/##00 group-on-aligned
+ es-MX
+ 00 %
+ 1,827.3645 %
+ -00.22222 %
+ zh-TW
+ 00%
+ 1,827.3645%
+ -00.22222%
+ bn-BD
+ ০০%
+ ১,৮২৭.৩৬৪৫%
+ -০০.২২২২২%
+
+currency/EUR integer-width/##00 group-on-aligned
+ es-MX
+ EUR 00.00
+ EUR 1,827.36
+ -EUR 00.22
+ zh-TW
+ €00.00
+ €1,827.36
+ -€00.22
+ bn-BD
+ ০০.০০€
+ ১,৮২৭.৩৬€
+ -০০.২২€
+
+measure-unit/length-furlong integer-width/##00 group-on-aligned
+ es-MX
+ 00 fur
+ 1,827.3645 fur
+ -00.22222 fur
+ zh-TW
+ 00 化朗
+ 1,827.3645 化朗
+ -00.22222 化朗
+ bn-BD
+ ০০ ফার্লং
+ ১,৮২৭.৩৬৪৫ ফার্লং
+ -০০.২২২২২ ফার্লং
+
+percent integer-width/##00 latin
+ es-MX
+ 00 %
+ 1827.3645 %
+ -00.22222 %
+ zh-TW
+ 00%
+ 1,827.3645%
+ -00.22222%
+ bn-BD
+ 00%
+ 1,827.3645%
+ -00.22222%
+
+currency/EUR integer-width/##00 latin
+ es-MX
+ EUR 00.00
+ EUR 1827.36
+ -EUR 00.22
+ zh-TW
+ €00.00
+ €1,827.36
+ -€00.22
+ bn-BD
+ 00.00€
+ 1,827.36€
+ -00.22€
+
+measure-unit/length-furlong integer-width/##00 latin
+ es-MX
+ 00 fur
+ 1827.3645 fur
+ -00.22222 fur
+ zh-TW
+ 00 化朗
+ 1,827.3645 化朗
+ -00.22222 化朗
+ bn-BD
+ 00 ফার্লং
+ 1,827.3645 ফার্লং
+ -00.22222 ফার্লং
+
+percent integer-width/##00 sign-accounting-except-zero
+ es-MX
+ 00 %
+ +1827.3645 %
+ -00.22222 %
+ zh-TW
+ 00%
+ +1,827.3645%
+ -00.22222%
+ bn-BD
+ ০০%
+ +১,৮২৭.৩৬৪৫%
+ -০০.২২২২২%
+
+currency/EUR integer-width/##00 sign-accounting-except-zero
+ es-MX
+ EUR 00.00
+ +EUR 1827.36
+ -EUR 00.22
+ zh-TW
+ €00.00
+ +€1,827.36
+ (€00.22)
+ bn-BD
+ ০০.০০€
+ +১,৮২৭.৩৬€
+ (০০.২২ €)
+
+measure-unit/length-furlong integer-width/##00 sign-accounting-except-zero
+ es-MX
+ 00 fur
+ +1827.3645 fur
+ -00.22222 fur
+ zh-TW
+ 00 化朗
+ +1,827.3645 化朗
+ -00.22222 化朗
+ bn-BD
+ ০০ ফার্লং
+ +১,৮২৭.৩৬৪৫ ফার্লং
+ -০০.২২২২২ ফার্লং
+
+percent integer-width/##00 decimal-always
+ es-MX
+ 00. %
+ 1827.3645 %
+ -00.22222 %
+ zh-TW
+ 00.%
+ 1,827.3645%
+ -00.22222%
+ bn-BD
+ ০০.%
+ ১,৮২৭.৩৬৪৫%
+ -০০.২২২২২%
+
+currency/EUR integer-width/##00 decimal-always
+ es-MX
+ EUR 00.00
+ EUR 1827.36
+ -EUR 00.22
+ zh-TW
+ €00.00
+ €1,827.36
+ -€00.22
+ bn-BD
+ ০০.০০€
+ ১,৮২৭.৩৬€
+ -০০.২২€
+
+measure-unit/length-furlong integer-width/##00 decimal-always
+ es-MX
+ 00. fur
+ 1827.3645 fur
+ -00.22222 fur
+ zh-TW
+ 00. 化朗
+ 1,827.3645 化朗
+ -00.22222 化朗
+ bn-BD
+ ০০. ফার্লং
+ ১,৮২৭.৩৬৪৫ ফার্লং
+ -০০.২২২২২ ফার্লং
+
+percent scale/0.5 group-on-aligned
+ es-MX
+ 0 %
+ 45,913.68225 %
+ -0.11111 %
+ zh-TW
+ 0%
+ 45,913.68225%
+ -0.11111%
+ bn-BD
+ ০%
+ ৪৫,৯১৩.৬৮২২৫%
+ -০.১১১১১%
+
+currency/EUR scale/0.5 group-on-aligned
+ es-MX
+ EUR 0.00
+ EUR 45,913.68
+ -EUR 0.11
+ zh-TW
+ €0.00
+ €45,913.68
+ -€0.11
+ bn-BD
+ ০.০০€
+ ৪৫,৯১৩.৬৮€
+ -০.১১€
+
+measure-unit/length-furlong scale/0.5 group-on-aligned
+ es-MX
+ 0 fur
+ 45,913.68225 fur
+ -0.11111 fur
+ zh-TW
+ 0 化朗
+ 45,913.68225 化朗
+ -0.11111 化朗
+ bn-BD
+ ০ ফার্লং
+ ৪৫,৯১৩.৬৮২২৫ ফার্লং
+ -০.১১১১১ ফার্লং
+
+percent scale/0.5 latin
+ es-MX
+ 0 %
+ 45,913.68225 %
+ -0.11111 %
+ zh-TW
+ 0%
+ 45,913.68225%
+ -0.11111%
+ bn-BD
+ 0%
+ 45,913.68225%
+ -0.11111%
+
+currency/EUR scale/0.5 latin
+ es-MX
+ EUR 0.00
+ EUR 45,913.68
+ -EUR 0.11
+ zh-TW
+ €0.00
+ €45,913.68
+ -€0.11
+ bn-BD
+ 0.00€
+ 45,913.68€
+ -0.11€
+
+measure-unit/length-furlong scale/0.5 latin
+ es-MX
+ 0 fur
+ 45,913.68225 fur
+ -0.11111 fur
+ zh-TW
+ 0 化朗
+ 45,913.68225 化朗
+ -0.11111 化朗
+ bn-BD
+ 0 ফার্লং
+ 45,913.68225 ফার্লং
+ -0.11111 ফার্লং
+
+percent scale/0.5 sign-accounting-except-zero
+ es-MX
+ 0 %
+ +45,913.68225 %
+ -0.11111 %
+ zh-TW
+ 0%
+ +45,913.68225%
+ -0.11111%
+ bn-BD
+ ০%
+ +৪৫,৯১৩.৬৮২২৫%
+ -০.১১১১১%
+
+currency/EUR scale/0.5 sign-accounting-except-zero
+ es-MX
+ EUR 0.00
+ +EUR 45,913.68
+ -EUR 0.11
+ zh-TW
+ €0.00
+ +€45,913.68
+ (€0.11)
+ bn-BD
+ ০.০০€
+ +৪৫,৯১৩.৬৮€
+ (০.১১ €)
+
+measure-unit/length-furlong scale/0.5 sign-accounting-except-zero
+ es-MX
+ 0 fur
+ +45,913.68225 fur
+ -0.11111 fur
+ zh-TW
+ 0 化朗
+ +45,913.68225 化朗
+ -0.11111 化朗
+ bn-BD
+ ০ ফার্লং
+ +৪৫,৯১৩.৬৮২২৫ ফার্লং
+ -০.১১১১১ ফার্লং
+
+percent scale/0.5 decimal-always
+ es-MX
+ 0. %
+ 45,913.68225 %
+ -0.11111 %
+ zh-TW
+ 0.%
+ 45,913.68225%
+ -0.11111%
+ bn-BD
+ ০.%
+ ৪৫,৯১৩.৬৮২২৫%
+ -০.১১১১১%
+
+currency/EUR scale/0.5 decimal-always
+ es-MX
+ EUR 0.00
+ EUR 45,913.68
+ -EUR 0.11
+ zh-TW
+ €0.00
+ €45,913.68
+ -€0.11
+ bn-BD
+ ০.০০€
+ ৪৫,৯১৩.৬৮€
+ -০.১১€
+
+measure-unit/length-furlong scale/0.5 decimal-always
+ es-MX
+ 0. fur
+ 45,913.68225 fur
+ -0.11111 fur
+ zh-TW
+ 0. 化朗
+ 45,913.68225 化朗
+ -0.11111 化朗
+ bn-BD
+ ০. ফার্লং
+ ৪৫,৯১৩.৬৮২২৫ ফার্লং
+ -০.১১১১১ ফার্লং
+
+percent group-on-aligned latin
+ es-MX
+ 0 %
+ 91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0%
+ 91,827.3645%
+ -0.22222%
+ bn-BD
+ 0%
+ 91,827.3645%
+ -0.22222%
+
+currency/EUR group-on-aligned latin
+ es-MX
+ EUR 0.00
+ EUR 91,827.36
+ -EUR 0.22
+ zh-TW
+ €0.00
+ €91,827.36
+ -€0.22
+ bn-BD
+ 0.00€
+ 91,827.36€
+ -0.22€
+
+measure-unit/length-furlong group-on-aligned latin
+ es-MX
+ 0 fur
+ 91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0 化朗
+ 91,827.3645 化朗
+ -0.22222 化朗
+ bn-BD
+ 0 ফার্লং
+ 91,827.3645 ফার্লং
+ -0.22222 ফার্লং
+
+percent group-on-aligned sign-accounting-except-zero
+ es-MX
+ 0 %
+ +91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0%
+ +91,827.3645%
+ -0.22222%
+ bn-BD
+ ০%
+ +৯১,৮২৭.৩৬৪৫%
+ -০.২২২২২%
+
+currency/EUR group-on-aligned sign-accounting-except-zero
+ es-MX
+ EUR 0.00
+ +EUR 91,827.36
+ -EUR 0.22
+ zh-TW
+ €0.00
+ +€91,827.36
+ (€0.22)
+ bn-BD
+ ০.০০€
+ +৯১,৮২৭.৩৬€
+ (০.২২ €)
+
+measure-unit/length-furlong group-on-aligned sign-accounting-except-zero
+ es-MX
+ 0 fur
+ +91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0 化朗
+ +91,827.3645 化朗
+ -0.22222 化朗
+ bn-BD
+ ০ ফার্লং
+ +৯১,৮২৭.৩৬৪৫ ফার্লং
+ -০.২২২২২ ফার্লং
+
+percent group-on-aligned decimal-always
+ es-MX
+ 0. %
+ 91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0.%
+ 91,827.3645%
+ -0.22222%
+ bn-BD
+ ০.%
+ ৯১,৮২৭.৩৬৪৫%
+ -০.২২২২২%
+
+currency/EUR group-on-aligned decimal-always
+ es-MX
+ EUR 0.00
+ EUR 91,827.36
+ -EUR 0.22
+ zh-TW
+ €0.00
+ €91,827.36
+ -€0.22
+ bn-BD
+ ০.০০€
+ ৯১,৮২৭.৩৬€
+ -০.২২€
+
+measure-unit/length-furlong group-on-aligned decimal-always
+ es-MX
+ 0. fur
+ 91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0. 化朗
+ 91,827.3645 化朗
+ -0.22222 化朗
+ bn-BD
+ ০. ফার্লং
+ ৯১,৮২৭.৩৬৪৫ ফার্লং
+ -০.২২২২২ ফার্লং
+
+percent latin sign-accounting-except-zero
+ es-MX
+ 0 %
+ +91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0%
+ +91,827.3645%
+ -0.22222%
+ bn-BD
+ 0%
+ +91,827.3645%
+ -0.22222%
+
+currency/EUR latin sign-accounting-except-zero
+ es-MX
+ EUR 0.00
+ +EUR 91,827.36
+ -EUR 0.22
+ zh-TW
+ €0.00
+ +€91,827.36
+ (€0.22)
+ bn-BD
+ 0.00€
+ +91,827.36€
+ (0.22 €)
+
+measure-unit/length-furlong latin sign-accounting-except-zero
+ es-MX
+ 0 fur
+ +91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0 化朗
+ +91,827.3645 化朗
+ -0.22222 化朗
+ bn-BD
+ 0 ফার্লং
+ +91,827.3645 ফার্লং
+ -0.22222 ফার্লং
+
+percent latin decimal-always
+ es-MX
+ 0. %
+ 91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0.%
+ 91,827.3645%
+ -0.22222%
+ bn-BD
+ 0.%
+ 91,827.3645%
+ -0.22222%
+
+currency/EUR latin decimal-always
+ es-MX
+ EUR 0.00
+ EUR 91,827.36
+ -EUR 0.22
+ zh-TW
+ €0.00
+ €91,827.36
+ -€0.22
+ bn-BD
+ 0.00€
+ 91,827.36€
+ -0.22€
+
+measure-unit/length-furlong latin decimal-always
+ es-MX
+ 0. fur
+ 91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0. 化朗
+ 91,827.3645 化朗
+ -0.22222 化朗
+ bn-BD
+ 0. ফার্লং
+ 91,827.3645 ফার্লং
+ -0.22222 ফার্লং
+
+percent sign-accounting-except-zero decimal-always
+ es-MX
+ 0. %
+ +91,827.3645 %
+ -0.22222 %
+ zh-TW
+ 0.%
+ +91,827.3645%
+ -0.22222%
+ bn-BD
+ ০.%
+ +৯১,৮২৭.৩৬৪৫%
+ -০.২২২২২%
+
+currency/EUR sign-accounting-except-zero decimal-always
+ es-MX
+ EUR 0.00
+ +EUR 91,827.36
+ -EUR 0.22
+ zh-TW
+ €0.00
+ +€91,827.36
+ (€0.22)
+ bn-BD
+ ০.০০€
+ +৯১,৮২৭.৩৬€
+ (০.২২ €)
+
+measure-unit/length-furlong sign-accounting-except-zero decimal-always
+ es-MX
+ 0. fur
+ +91,827.3645 fur
+ -0.22222 fur
+ zh-TW
+ 0. 化朗
+ +91,827.3645 化朗
+ -0.22222 化朗
+ bn-BD
+ ০. ফার্লং
+ +৯১,৮২৭.৩৬৪৫ ফার্লং
+ -০.২২২২২ ফার্লং
+
+unit-width-narrow precision-integer rounding-mode-floor
+ es-MX
+ 0
+ 91,827
+ -1
+ zh-TW
+ 0
+ 91,827
+ -1
+ bn-BD
+ ০
+ ৯১,৮২৭
+ -১
+
+unit-width-narrow .000 rounding-mode-floor
+ es-MX
+ 0.000
+ 91,827.364
+ -0.223
+ zh-TW
+ 0.000
+ 91,827.364
+ -0.223
+ bn-BD
+ ০.০০০
+ ৯১,৮২৭.৩৬৪
+ -০.২২৩
+
+unit-width-narrow .##/@@@+ rounding-mode-floor
+ es-MX
+ 0
+ 91,827.36
+ -0.223
+ zh-TW
+ 0
+ 91,827.36
+ -0.223
+ bn-BD
+ ০
+ ৯১,৮২৭.৩৬
+ -০.২২৩
+
+unit-width-narrow @@ rounding-mode-floor
+ es-MX
+ 0.0
+ 91,000
+ -0.23
+ zh-TW
+ 0.0
+ 91,000
+ -0.23
+ bn-BD
+ ০.০
+ ৯১,০০০
+ -০.২৩
+
+unit-width-full-name precision-integer rounding-mode-floor
+ es-MX
+ 0
+ 91,827
+ -1
+ zh-TW
+ 0
+ 91,827
+ -1
+ bn-BD
+ ০
+ ৯১,৮২৭
+ -১
+
+unit-width-full-name .000 rounding-mode-floor
+ es-MX
+ 0.000
+ 91,827.364
+ -0.223
+ zh-TW
+ 0.000
+ 91,827.364
+ -0.223
+ bn-BD
+ ০.০০০
+ ৯১,৮২৭.৩৬৪
+ -০.২২৩
+
+unit-width-full-name .##/@@@+ rounding-mode-floor
+ es-MX
+ 0
+ 91,827.36
+ -0.223
+ zh-TW
+ 0
+ 91,827.36
+ -0.223
+ bn-BD
+ ০
+ ৯১,৮২৭.৩৬
+ -০.২২৩
+
+unit-width-full-name @@ rounding-mode-floor
+ es-MX
+ 0.0
+ 91,000
+ -0.23
+ zh-TW
+ 0.0
+ 91,000
+ -0.23
+ bn-BD
+ ০.০
+ ৯১,০০০
+ -০.২৩
+
+unit-width-narrow precision-integer integer-width/##00
+ es-MX
+ 00
+ 1827
+ -00
+ zh-TW
+ 00
+ 1,827
+ -00
+ bn-BD
+ ০০
+ ১,৮২৭
+ -০০
+
+unit-width-narrow .000 integer-width/##00
+ es-MX
+ 00.000
+ 1827.364
+ -00.222
+ zh-TW
+ 00.000
+ 1,827.364
+ -00.222
+ bn-BD
+ ০০.০০০
+ ১,৮২৭.৩৬৪
+ -০০.২২২
+
+unit-width-narrow .##/@@@+ integer-width/##00
+ es-MX
+ 00
+ 1827.36
+ -00.222
+ zh-TW
+ 00
+ 1,827.36
+ -00.222
+ bn-BD
+ ০০
+ ১,৮২৭.৩৬
+ -০০.২২২
+
+unit-width-narrow @@ integer-width/##00
+ es-MX
+ 00.0
+ 2000
+ -00.22
+ zh-TW
+ 00.0
+ 2,000
+ -00.22
+ bn-BD
+ ০০.০
+ ২,০০০
+ -০০.২২
+
+unit-width-full-name precision-integer integer-width/##00
+ es-MX
+ 00
+ 1827
+ -00
+ zh-TW
+ 00
+ 1,827
+ -00
+ bn-BD
+ ০০
+ ১,৮২৭
+ -০০
+
+unit-width-full-name .000 integer-width/##00
+ es-MX
+ 00.000
+ 1827.364
+ -00.222
+ zh-TW
+ 00.000
+ 1,827.364
+ -00.222
+ bn-BD
+ ০০.০০০
+ ১,৮২৭.৩৬৪
+ -০০.২২২
+
+unit-width-full-name .##/@@@+ integer-width/##00
+ es-MX
+ 00
+ 1827.36
+ -00.222
+ zh-TW
+ 00
+ 1,827.36
+ -00.222
+ bn-BD
+ ০০
+ ১,৮২৭.৩৬
+ -০০.২২২
+
+unit-width-full-name @@ integer-width/##00
+ es-MX
+ 00.0
+ 2000
+ -00.22
+ zh-TW
+ 00.0
+ 2,000
+ -00.22
+ bn-BD
+ ০০.০
+ ২,০০০
+ -০০.২২
+
+unit-width-narrow precision-integer scale/0.5
+ es-MX
+ 0
+ 45,914
+ -0
+ zh-TW
+ 0
+ 45,914
+ -0
+ bn-BD
+ ০
+ ৪৫,৯১৪
+ -০
+
+unit-width-narrow .000 scale/0.5
+ es-MX
+ 0.000
+ 45,913.682
+ -0.111
+ zh-TW
+ 0.000
+ 45,913.682
+ -0.111
+ bn-BD
+ ০.০০০
+ ৪৫,৯১৩.৬৮২
+ -০.১১১
+
+unit-width-narrow .##/@@@+ scale/0.5
+ es-MX
+ 0
+ 45,913.68
+ -0.111
+ zh-TW
+ 0
+ 45,913.68
+ -0.111
+ bn-BD
+ ০
+ ৪৫,৯১৩.৬৮
+ -০.১১১
+
+unit-width-narrow @@ scale/0.5
+ es-MX
+ 0.0
+ 46,000
+ -0.11
+ zh-TW
+ 0.0
+ 46,000
+ -0.11
+ bn-BD
+ ০.০
+ ৪৬,০০০
+ -০.১১
+
+unit-width-full-name precision-integer scale/0.5
+ es-MX
+ 0
+ 45,914
+ -0
+ zh-TW
+ 0
+ 45,914
+ -0
+ bn-BD
+ ০
+ ৪৫,৯১৪
+ -০
+
+unit-width-full-name .000 scale/0.5
+ es-MX
+ 0.000
+ 45,913.682
+ -0.111
+ zh-TW
+ 0.000
+ 45,913.682
+ -0.111
+ bn-BD
+ ০.০০০
+ ৪৫,৯১৩.৬৮২
+ -০.১১১
+
+unit-width-full-name .##/@@@+ scale/0.5
+ es-MX
+ 0
+ 45,913.68
+ -0.111
+ zh-TW
+ 0
+ 45,913.68
+ -0.111
+ bn-BD
+ ০
+ ৪৫,৯১৩.৬৮
+ -০.১১১
+
+unit-width-full-name @@ scale/0.5
+ es-MX
+ 0.0
+ 46,000
+ -0.11
+ zh-TW
+ 0.0
+ 46,000
+ -0.11
+ bn-BD
+ ০.০
+ ৪৬,০০০
+ -০.১১
+
+unit-width-narrow precision-integer group-on-aligned
+ es-MX
+ 0
+ 91,827
+ -0
+ zh-TW
+ 0
+ 91,827
+ -0
+ bn-BD
+ ০
+ ৯১,৮২৭
+ -০
+
+unit-width-narrow .000 group-on-aligned
+ es-MX
+ 0.000
+ 91,827.364
+ -0.222
+ zh-TW
+ 0.000
+ 91,827.364
+ -0.222
+ bn-BD
+ ০.০০০
+ ৯১,৮২৭.৩৬৪
+ -০.২২২
+
+unit-width-narrow .##/@@@+ group-on-aligned
+ es-MX
+ 0
+ 91,827.36
+ -0.222
+ zh-TW
+ 0
+ 91,827.36
+ -0.222
+ bn-BD
+ ০
+ ৯১,৮২৭.৩৬
+ -০.২২২
+
+unit-width-narrow @@ group-on-aligned
+ es-MX
+ 0.0
+ 92,000
+ -0.22
+ zh-TW
+ 0.0
+ 92,000
+ -0.22
+ bn-BD
+ ০.০
+ ৯২,০০০
+ -০.২২
+
+unit-width-full-name precision-integer group-on-aligned
+ es-MX
+ 0
+ 91,827
+ -0
+ zh-TW
+ 0
+ 91,827
+ -0
+ bn-BD
+ ০
+ ৯১,৮২৭
+ -০
+
+unit-width-full-name .000 group-on-aligned
+ es-MX
+ 0.000
+ 91,827.364
+ -0.222
+ zh-TW
+ 0.000
+ 91,827.364
+ -0.222
+ bn-BD
+ ০.০০০
+ ৯১,৮২৭.৩৬৪
+ -০.২২২
+
+unit-width-full-name .##/@@@+ group-on-aligned
+ es-MX
+ 0
+ 91,827.36
+ -0.222
+ zh-TW
+ 0
+ 91,827.36
+ -0.222
+ bn-BD
+ ০
+ ৯১,৮২৭.৩৬
+ -০.২২২
+
+unit-width-full-name @@ group-on-aligned
+ es-MX
+ 0.0
+ 92,000
+ -0.22
+ zh-TW
+ 0.0
+ 92,000
+ -0.22
+ bn-BD
+ ০.০
+ ৯২,০০০
+ -০.২২
+
+unit-width-narrow precision-integer latin
+ es-MX
+ 0
+ 91,827
+ -0
+ zh-TW
+ 0
+ 91,827
+ -0
+ bn-BD
+ 0
+ 91,827
+ -0
+
+unit-width-narrow .000 latin
+ es-MX
+ 0.000
+ 91,827.364
+ -0.222
+ zh-TW
+ 0.000
+ 91,827.364
+ -0.222
+ bn-BD
+ 0.000
+ 91,827.364
+ -0.222
+
+unit-width-narrow .##/@@@+ latin
+ es-MX
+ 0
+ 91,827.36
+ -0.222
+ zh-TW
+ 0
+ 91,827.36
+ -0.222
+ bn-BD
+ 0
+ 91,827.36
+ -0.222
+
+unit-width-narrow @@ latin
+ es-MX
+ 0.0
+ 92,000
+ -0.22
+ zh-TW
+ 0.0
+ 92,000
+ -0.22
+ bn-BD
+ 0.0
+ 92,000
+ -0.22
+
+unit-width-full-name precision-integer latin
+ es-MX
+ 0
+ 91,827
+ -0
+ zh-TW
+ 0
+ 91,827
+ -0
+ bn-BD
+ 0
+ 91,827
+ -0
+
+unit-width-full-name .000 latin
+ es-MX
+ 0.000
+ 91,827.364
+ -0.222
+ zh-TW
+ 0.000
+ 91,827.364
+ -0.222
+ bn-BD
+ 0.000
+ 91,827.364
+ -0.222
+
+unit-width-full-name .##/@@@+ latin
+ es-MX
+ 0
+ 91,827.36
+ -0.222
+ zh-TW
+ 0
+ 91,827.36
+ -0.222
+ bn-BD
+ 0
+ 91,827.36
+ -0.222
+
+unit-width-full-name @@ latin
+ es-MX
+ 0.0
+ 92,000
+ -0.22
+ zh-TW
+ 0.0
+ 92,000
+ -0.22
+ bn-BD
+ 0.0
+ 92,000
+ -0.22
+
+unit-width-narrow precision-integer sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827
+ -0
+ zh-TW
+ 0
+ +91,827
+ -0
+ bn-BD
+ ০
+ +৯১,৮২৭
+ -০
+
+unit-width-narrow .000 sign-accounting-except-zero
+ es-MX
+ 0.000
+ +91,827.364
+ -0.222
+ zh-TW
+ 0.000
+ +91,827.364
+ -0.222
+ bn-BD
+ ০.০০০
+ +৯১,৮২৭.৩৬৪
+ -০.২২২
+
+unit-width-narrow .##/@@@+ sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827.36
+ -0.222
+ zh-TW
+ 0
+ +91,827.36
+ -0.222
+ bn-BD
+ ০
+ +৯১,৮২৭.৩৬
+ -০.২২২
+
+unit-width-narrow @@ sign-accounting-except-zero
+ es-MX
+ 0.0
+ +92,000
+ -0.22
+ zh-TW
+ 0.0
+ +92,000
+ -0.22
+ bn-BD
+ ০.০
+ +৯২,০০০
+ -০.২২
+
+unit-width-full-name precision-integer sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827
+ -0
+ zh-TW
+ 0
+ +91,827
+ -0
+ bn-BD
+ ০
+ +৯১,৮২৭
+ -০
+
+unit-width-full-name .000 sign-accounting-except-zero
+ es-MX
+ 0.000
+ +91,827.364
+ -0.222
+ zh-TW
+ 0.000
+ +91,827.364
+ -0.222
+ bn-BD
+ ০.০০০
+ +৯১,৮২৭.৩৬৪
+ -০.২২২
+
+unit-width-full-name .##/@@@+ sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827.36
+ -0.222
+ zh-TW
+ 0
+ +91,827.36
+ -0.222
+ bn-BD
+ ০
+ +৯১,৮২৭.৩৬
+ -০.২২২
+
+unit-width-full-name @@ sign-accounting-except-zero
+ es-MX
+ 0.0
+ +92,000
+ -0.22
+ zh-TW
+ 0.0
+ +92,000
+ -0.22
+ bn-BD
+ ০.০
+ +৯২,০০০
+ -০.২২
+
+unit-width-narrow precision-integer decimal-always
+ es-MX
+ 0.
+ 91,827.
+ -0.
+ zh-TW
+ 0.
+ 91,827.
+ -0.
+ bn-BD
+ ০.
+ ৯১,৮২৭.
+ -০.
+
+unit-width-narrow .000 decimal-always
+ es-MX
+ 0.000
+ 91,827.364
+ -0.222
+ zh-TW
+ 0.000
+ 91,827.364
+ -0.222
+ bn-BD
+ ০.০০০
+ ৯১,৮২৭.৩৬৪
+ -০.২২২
+
+unit-width-narrow .##/@@@+ decimal-always
+ es-MX
+ 0.
+ 91,827.36
+ -0.222
+ zh-TW
+ 0.
+ 91,827.36
+ -0.222
+ bn-BD
+ ০.
+ ৯১,৮২৭.৩৬
+ -০.২২২
+
+unit-width-narrow @@ decimal-always
+ es-MX
+ 0.0
+ 92,000.
+ -0.22
+ zh-TW
+ 0.0
+ 92,000.
+ -0.22
+ bn-BD
+ ০.০
+ ৯২,০০০.
+ -০.২২
+
+unit-width-full-name precision-integer decimal-always
+ es-MX
+ 0.
+ 91,827.
+ -0.
+ zh-TW
+ 0.
+ 91,827.
+ -0.
+ bn-BD
+ ০.
+ ৯১,৮২৭.
+ -০.
+
+unit-width-full-name .000 decimal-always
+ es-MX
+ 0.000
+ 91,827.364
+ -0.222
+ zh-TW
+ 0.000
+ 91,827.364
+ -0.222
+ bn-BD
+ ০.০০০
+ ৯১,৮২৭.৩৬৪
+ -০.২২২
+
+unit-width-full-name .##/@@@+ decimal-always
+ es-MX
+ 0.
+ 91,827.36
+ -0.222
+ zh-TW
+ 0.
+ 91,827.36
+ -0.222
+ bn-BD
+ ০.
+ ৯১,৮২৭.৩৬
+ -০.২২২
+
+unit-width-full-name @@ decimal-always
+ es-MX
+ 0.0
+ 92,000.
+ -0.22
+ zh-TW
+ 0.0
+ 92,000.
+ -0.22
+ bn-BD
+ ০.০
+ ৯২,০০০.
+ -০.২২
+
+unit-width-narrow rounding-mode-floor integer-width/##00
+ es-MX
+ 00
+ 1827.3645
+ -00.22222
+ zh-TW
+ 00
+ 1,827.3645
+ -00.22222
+ bn-BD
+ ০০
+ ১,৮২৭.৩৬৪৫
+ -০০.২২২২২
+
+unit-width-full-name rounding-mode-floor integer-width/##00
+ es-MX
+ 00
+ 1827.3645
+ -00.22222
+ zh-TW
+ 00
+ 1,827.3645
+ -00.22222
+ bn-BD
+ ০০
+ ১,৮২৭.৩৬৪৫
+ -০০.২২২২২
+
+unit-width-narrow rounding-mode-floor scale/0.5
+ es-MX
+ 0
+ 45,913.68225
+ -0.11111
+ zh-TW
+ 0
+ 45,913.68225
+ -0.11111
+ bn-BD
+ ০
+ ৪৫,৯১৩.৬৮২২৫
+ -০.১১১১১
+
+unit-width-full-name rounding-mode-floor scale/0.5
+ es-MX
+ 0
+ 45,913.68225
+ -0.11111
+ zh-TW
+ 0
+ 45,913.68225
+ -0.11111
+ bn-BD
+ ০
+ ৪৫,৯১৩.৬৮২২৫
+ -০.১১১১১
+
+unit-width-narrow rounding-mode-floor group-on-aligned
+ es-MX
+ 0
+ 91,827.3645
+ -0.22222
+ zh-TW
+ 0
+ 91,827.3645
+ -0.22222
+ bn-BD
+ ০
+ ৯১,৮২৭.৩৬৪৫
+ -০.২২২২২
+
+unit-width-full-name rounding-mode-floor group-on-aligned
+ es-MX
+ 0
+ 91,827.3645
+ -0.22222
+ zh-TW
+ 0
+ 91,827.3645
+ -0.22222
+ bn-BD
+ ০
+ ৯১,৮২৭.৩৬৪৫
+ -০.২২২২২
+
+unit-width-narrow rounding-mode-floor latin
+ es-MX
+ 0
+ 91,827.3645
+ -0.22222
+ zh-TW
+ 0
+ 91,827.3645
+ -0.22222
+ bn-BD
+ 0
+ 91,827.3645
+ -0.22222
+
+unit-width-full-name rounding-mode-floor latin
+ es-MX
+ 0
+ 91,827.3645
+ -0.22222
+ zh-TW
+ 0
+ 91,827.3645
+ -0.22222
+ bn-BD
+ 0
+ 91,827.3645
+ -0.22222
+
+unit-width-narrow rounding-mode-floor sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827.3645
+ -0.22222
+ zh-TW
+ 0
+ +91,827.3645
+ -0.22222
+ bn-BD
+ ০
+ +৯১,৮২৭.৩৬৪৫
+ -০.২২২২২
+
+unit-width-full-name rounding-mode-floor sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827.3645
+ -0.22222
+ zh-TW
+ 0
+ +91,827.3645
+ -0.22222
+ bn-BD
+ ০
+ +৯১,৮২৭.৩৬৪৫
+ -০.২২২২২
+
+unit-width-narrow rounding-mode-floor decimal-always
+ es-MX
+ 0.
+ 91,827.3645
+ -0.22222
+ zh-TW
+ 0.
+ 91,827.3645
+ -0.22222
+ bn-BD
+ ০.
+ ৯১,৮২৭.৩৬৪৫
+ -০.২২২২২
+
+unit-width-full-name rounding-mode-floor decimal-always
+ es-MX
+ 0.
+ 91,827.3645
+ -0.22222
+ zh-TW
+ 0.
+ 91,827.3645
+ -0.22222
+ bn-BD
+ ০.
+ ৯১,৮২৭.৩৬৪৫
+ -০.২২২২২
+
+unit-width-narrow integer-width/##00 scale/0.5
+ es-MX
+ 00
+ 5913.68225
+ -00.11111
+ zh-TW
+ 00
+ 5,913.68225
+ -00.11111
+ bn-BD
+ ০০
+ ৫,৯১৩.৬৮২২৫
+ -০০.১১১১১
+
+unit-width-full-name integer-width/##00 scale/0.5
+ es-MX
+ 00
+ 5913.68225
+ -00.11111
+ zh-TW
+ 00
+ 5,913.68225
+ -00.11111
+ bn-BD
+ ০০
+ ৫,৯১৩.৬৮২২৫
+ -০০.১১১১১
+
+unit-width-narrow integer-width/##00 group-on-aligned
+ es-MX
+ 00
+ 1,827.3645
+ -00.22222
+ zh-TW
+ 00
+ 1,827.3645
+ -00.22222
+ bn-BD
+ ০০
+ ১,৮২৭.৩৬৪৫
+ -০০.২২২২২
+
+unit-width-full-name integer-width/##00 group-on-aligned
+ es-MX
+ 00
+ 1,827.3645
+ -00.22222
+ zh-TW
+ 00
+ 1,827.3645
+ -00.22222
+ bn-BD
+ ০০
+ ১,৮২৭.৩৬৪৫
+ -০০.২২২২২
+
+unit-width-narrow integer-width/##00 latin
+ es-MX
+ 00
+ 1827.3645
+ -00.22222
+ zh-TW
+ 00
+ 1,827.3645
+ -00.22222
+ bn-BD
+ 00
+ 1,827.3645
+ -00.22222
+
+unit-width-full-name integer-width/##00 latin
+ es-MX
+ 00
+ 1827.3645
+ -00.22222
+ zh-TW
+ 00
+ 1,827.3645
+ -00.22222
+ bn-BD
+ 00
+ 1,827.3645
+ -00.22222
+
+unit-width-narrow integer-width/##00 sign-accounting-except-zero
+ es-MX
+ 00
+ +1827.3645
+ -00.22222
+ zh-TW
+ 00
+ +1,827.3645
+ -00.22222
+ bn-BD
+ ০০
+ +১,৮২৭.৩৬৪৫
+ -০০.২২২২২
+
+unit-width-full-name integer-width/##00 sign-accounting-except-zero
+ es-MX
+ 00
+ +1827.3645
+ -00.22222
+ zh-TW
+ 00
+ +1,827.3645
+ -00.22222
+ bn-BD
+ ০০
+ +১,৮২৭.৩৬৪৫
+ -০০.২২২২২
+
+unit-width-narrow integer-width/##00 decimal-always
+ es-MX
+ 00.
+ 1827.3645
+ -00.22222
+ zh-TW
+ 00.
+ 1,827.3645
+ -00.22222
+ bn-BD
+ ০০.
+ ১,৮২৭.৩৬৪৫
+ -০০.২২২২২
+
+unit-width-full-name integer-width/##00 decimal-always
+ es-MX
+ 00.
+ 1827.3645
+ -00.22222
+ zh-TW
+ 00.
+ 1,827.3645
+ -00.22222
+ bn-BD
+ ০০.
+ ১,৮২৭.৩৬৪৫
+ -০০.২২২২২
+
+unit-width-narrow scale/0.5 group-on-aligned
+ es-MX
+ 0
+ 45,913.68225
+ -0.11111
+ zh-TW
+ 0
+ 45,913.68225
+ -0.11111
+ bn-BD
+ ০
+ ৪৫,৯১৩.৬৮২২৫
+ -০.১১১১১
+
+unit-width-full-name scale/0.5 group-on-aligned
+ es-MX
+ 0
+ 45,913.68225
+ -0.11111
+ zh-TW
+ 0
+ 45,913.68225
+ -0.11111
+ bn-BD
+ ০
+ ৪৫,৯১৩.৬৮২২৫
+ -০.১১১১১
+
+unit-width-narrow scale/0.5 latin
+ es-MX
+ 0
+ 45,913.68225
+ -0.11111
+ zh-TW
+ 0
+ 45,913.68225
+ -0.11111
+ bn-BD
+ 0
+ 45,913.68225
+ -0.11111
+
+unit-width-full-name scale/0.5 latin
+ es-MX
+ 0
+ 45,913.68225
+ -0.11111
+ zh-TW
+ 0
+ 45,913.68225
+ -0.11111
+ bn-BD
+ 0
+ 45,913.68225
+ -0.11111
+
+unit-width-narrow scale/0.5 sign-accounting-except-zero
+ es-MX
+ 0
+ +45,913.68225
+ -0.11111
+ zh-TW
+ 0
+ +45,913.68225
+ -0.11111
+ bn-BD
+ ০
+ +৪৫,৯১৩.৬৮২২৫
+ -০.১১১১১
+
+unit-width-full-name scale/0.5 sign-accounting-except-zero
+ es-MX
+ 0
+ +45,913.68225
+ -0.11111
+ zh-TW
+ 0
+ +45,913.68225
+ -0.11111
+ bn-BD
+ ০
+ +৪৫,৯১৩.৬৮২২৫
+ -০.১১১১১
+
+unit-width-narrow scale/0.5 decimal-always
+ es-MX
+ 0.
+ 45,913.68225
+ -0.11111
+ zh-TW
+ 0.
+ 45,913.68225
+ -0.11111
+ bn-BD
+ ০.
+ ৪৫,৯১৩.৬৮২২৫
+ -০.১১১১১
+
+unit-width-full-name scale/0.5 decimal-always
+ es-MX
+ 0.
+ 45,913.68225
+ -0.11111
+ zh-TW
+ 0.
+ 45,913.68225
+ -0.11111
+ bn-BD
+ ০.
+ ৪৫,৯১৩.৬৮২২৫
+ -০.১১১১১
+
+unit-width-narrow group-on-aligned latin
+ es-MX
+ 0
+ 91,827.3645
+ -0.22222
+ zh-TW
+ 0
+ 91,827.3645
+ -0.22222
+ bn-BD
+ 0
+ 91,827.3645
+ -0.22222
+
+unit-width-full-name group-on-aligned latin
+ es-MX
+ 0
+ 91,827.3645
+ -0.22222
+ zh-TW
+ 0
+ 91,827.3645
+ -0.22222
+ bn-BD
+ 0
+ 91,827.3645
+ -0.22222
+
+unit-width-narrow group-on-aligned sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827.3645
+ -0.22222
+ zh-TW
+ 0
+ +91,827.3645
+ -0.22222
+ bn-BD
+ ০
+ +৯১,৮২৭.৩৬৪৫
+ -০.২২২২২
+
+unit-width-full-name group-on-aligned sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827.3645
+ -0.22222
+ zh-TW
+ 0
+ +91,827.3645
+ -0.22222
+ bn-BD
+ ০
+ +৯১,৮২৭.৩৬৪৫
+ -০.২২২২২
+
+unit-width-narrow group-on-aligned decimal-always
+ es-MX
+ 0.
+ 91,827.3645
+ -0.22222
+ zh-TW
+ 0.
+ 91,827.3645
+ -0.22222
+ bn-BD
+ ০.
+ ৯১,৮২৭.৩৬৪৫
+ -০.২২২২২
+
+unit-width-full-name group-on-aligned decimal-always
+ es-MX
+ 0.
+ 91,827.3645
+ -0.22222
+ zh-TW
+ 0.
+ 91,827.3645
+ -0.22222
+ bn-BD
+ ০.
+ ৯১,৮২৭.৩৬৪৫
+ -০.২২২২২
+
+unit-width-narrow latin sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827.3645
+ -0.22222
+ zh-TW
+ 0
+ +91,827.3645
+ -0.22222
+ bn-BD
+ 0
+ +91,827.3645
+ -0.22222
+
+unit-width-full-name latin sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827.3645
+ -0.22222
+ zh-TW
+ 0
+ +91,827.3645
+ -0.22222
+ bn-BD
+ 0
+ +91,827.3645
+ -0.22222
+
+unit-width-narrow latin decimal-always
+ es-MX
+ 0.
+ 91,827.3645
+ -0.22222
+ zh-TW
+ 0.
+ 91,827.3645
+ -0.22222
+ bn-BD
+ 0.
+ 91,827.3645
+ -0.22222
+
+unit-width-full-name latin decimal-always
+ es-MX
+ 0.
+ 91,827.3645
+ -0.22222
+ zh-TW
+ 0.
+ 91,827.3645
+ -0.22222
+ bn-BD
+ 0.
+ 91,827.3645
+ -0.22222
+
+unit-width-narrow sign-accounting-except-zero decimal-always
+ es-MX
+ 0.
+ +91,827.3645
+ -0.22222
+ zh-TW
+ 0.
+ +91,827.3645
+ -0.22222
+ bn-BD
+ ০.
+ +৯১,৮২৭.৩৬৪৫
+ -০.২২২২২
+
+unit-width-full-name sign-accounting-except-zero decimal-always
+ es-MX
+ 0.
+ +91,827.3645
+ -0.22222
+ zh-TW
+ 0.
+ +91,827.3645
+ -0.22222
+ bn-BD
+ ০.
+ +৯১,৮২৭.৩৬৪৫
+ -০.২২২২২
+
+precision-integer rounding-mode-floor integer-width/##00
+ es-MX
+ 00
+ 1827
+ -01
+ zh-TW
+ 00
+ 1,827
+ -01
+ bn-BD
+ ০০
+ ১,৮২৭
+ -০১
+
+.000 rounding-mode-floor integer-width/##00
+ es-MX
+ 00.000
+ 1827.364
+ -00.223
+ zh-TW
+ 00.000
+ 1,827.364
+ -00.223
+ bn-BD
+ ০০.০০০
+ ১,৮২৭.৩৬৪
+ -০০.২২৩
+
+.##/@@@+ rounding-mode-floor integer-width/##00
+ es-MX
+ 00
+ 1827.36
+ -00.223
+ zh-TW
+ 00
+ 1,827.36
+ -00.223
+ bn-BD
+ ০০
+ ১,৮২৭.৩৬
+ -০০.২২৩
+
+@@ rounding-mode-floor integer-width/##00
+ es-MX
+ 00.0
+ 1000
+ -00.23
+ zh-TW
+ 00.0
+ 1,000
+ -00.23
+ bn-BD
+ ০০.০
+ ১,০০০
+ -০০.২৩
+
+precision-integer rounding-mode-floor scale/0.5
+ es-MX
+ 0
+ 45,913
+ -1
+ zh-TW
+ 0
+ 45,913
+ -1
+ bn-BD
+ ০
+ ৪৫,৯১৩
+ -১
+
+.000 rounding-mode-floor scale/0.5
+ es-MX
+ 0.000
+ 45,913.682
+ -0.112
+ zh-TW
+ 0.000
+ 45,913.682
+ -0.112
+ bn-BD
+ ০.০০০
+ ৪৫,৯১৩.৬৮২
+ -০.১১২
+
+.##/@@@+ rounding-mode-floor scale/0.5
+ es-MX
+ 0
+ 45,913.68
+ -0.112
+ zh-TW
+ 0
+ 45,913.68
+ -0.112
+ bn-BD
+ ০
+ ৪৫,৯১৩.৬৮
+ -০.১১২
+
+@@ rounding-mode-floor scale/0.5
+ es-MX
+ 0.0
+ 45,000
+ -0.12
+ zh-TW
+ 0.0
+ 45,000
+ -0.12
+ bn-BD
+ ০.০
+ ৪৫,০০০
+ -০.১২
+
+precision-integer rounding-mode-floor group-on-aligned
+ es-MX
+ 0
+ 91,827
+ -1
+ zh-TW
+ 0
+ 91,827
+ -1
+ bn-BD
+ ০
+ ৯১,৮২৭
+ -১
+
+.000 rounding-mode-floor group-on-aligned
+ es-MX
+ 0.000
+ 91,827.364
+ -0.223
+ zh-TW
+ 0.000
+ 91,827.364
+ -0.223
+ bn-BD
+ ০.০০০
+ ৯১,৮২৭.৩৬৪
+ -০.২২৩
+
+.##/@@@+ rounding-mode-floor group-on-aligned
+ es-MX
+ 0
+ 91,827.36
+ -0.223
+ zh-TW
+ 0
+ 91,827.36
+ -0.223
+ bn-BD
+ ০
+ ৯১,৮২৭.৩৬
+ -০.২২৩
+
+@@ rounding-mode-floor group-on-aligned
+ es-MX
+ 0.0
+ 91,000
+ -0.23
+ zh-TW
+ 0.0
+ 91,000
+ -0.23
+ bn-BD
+ ০.০
+ ৯১,০০০
+ -০.২৩
+
+precision-integer rounding-mode-floor latin
+ es-MX
+ 0
+ 91,827
+ -1
+ zh-TW
+ 0
+ 91,827
+ -1
+ bn-BD
+ 0
+ 91,827
+ -1
+
+.000 rounding-mode-floor latin
+ es-MX
+ 0.000
+ 91,827.364
+ -0.223
+ zh-TW
+ 0.000
+ 91,827.364
+ -0.223
+ bn-BD
+ 0.000
+ 91,827.364
+ -0.223
+
+.##/@@@+ rounding-mode-floor latin
+ es-MX
+ 0
+ 91,827.36
+ -0.223
+ zh-TW
+ 0
+ 91,827.36
+ -0.223
+ bn-BD
+ 0
+ 91,827.36
+ -0.223
+
+@@ rounding-mode-floor latin
+ es-MX
+ 0.0
+ 91,000
+ -0.23
+ zh-TW
+ 0.0
+ 91,000
+ -0.23
+ bn-BD
+ 0.0
+ 91,000
+ -0.23
+
+precision-integer rounding-mode-floor sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827
+ -1
+ zh-TW
+ 0
+ +91,827
+ -1
+ bn-BD
+ ০
+ +৯১,৮২৭
+ -১
+
+.000 rounding-mode-floor sign-accounting-except-zero
+ es-MX
+ 0.000
+ +91,827.364
+ -0.223
+ zh-TW
+ 0.000
+ +91,827.364
+ -0.223
+ bn-BD
+ ০.০০০
+ +৯১,৮২৭.৩৬৪
+ -০.২২৩
+
+.##/@@@+ rounding-mode-floor sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827.36
+ -0.223
+ zh-TW
+ 0
+ +91,827.36
+ -0.223
+ bn-BD
+ ০
+ +৯১,৮২৭.৩৬
+ -০.২২৩
+
+@@ rounding-mode-floor sign-accounting-except-zero
+ es-MX
+ 0.0
+ +91,000
+ -0.23
+ zh-TW
+ 0.0
+ +91,000
+ -0.23
+ bn-BD
+ ০.০
+ +৯১,০০০
+ -০.২৩
+
+precision-integer rounding-mode-floor decimal-always
+ es-MX
+ 0.
+ 91,827.
+ -1.
+ zh-TW
+ 0.
+ 91,827.
+ -1.
+ bn-BD
+ ০.
+ ৯১,৮২৭.
+ -১.
+
+.000 rounding-mode-floor decimal-always
+ es-MX
+ 0.000
+ 91,827.364
+ -0.223
+ zh-TW
+ 0.000
+ 91,827.364
+ -0.223
+ bn-BD
+ ০.০০০
+ ৯১,৮২৭.৩৬৪
+ -০.২২৩
+
+.##/@@@+ rounding-mode-floor decimal-always
+ es-MX
+ 0.
+ 91,827.36
+ -0.223
+ zh-TW
+ 0.
+ 91,827.36
+ -0.223
+ bn-BD
+ ০.
+ ৯১,৮২৭.৩৬
+ -০.২২৩
+
+@@ rounding-mode-floor decimal-always
+ es-MX
+ 0.0
+ 91,000.
+ -0.23
+ zh-TW
+ 0.0
+ 91,000.
+ -0.23
+ bn-BD
+ ০.০
+ ৯১,০০০.
+ -০.২৩
+
+precision-integer integer-width/##00 scale/0.5
+ es-MX
+ 00
+ 5914
+ -00
+ zh-TW
+ 00
+ 5,914
+ -00
+ bn-BD
+ ০০
+ ৫,৯১৪
+ -০০
+
+.000 integer-width/##00 scale/0.5
+ es-MX
+ 00.000
+ 5913.682
+ -00.111
+ zh-TW
+ 00.000
+ 5,913.682
+ -00.111
+ bn-BD
+ ০০.০০০
+ ৫,৯১৩.৬৮২
+ -০০.১১১
+
+.##/@@@+ integer-width/##00 scale/0.5
+ es-MX
+ 00
+ 5913.68
+ -00.111
+ zh-TW
+ 00
+ 5,913.68
+ -00.111
+ bn-BD
+ ০০
+ ৫,৯১৩.৬৮
+ -০০.১১১
+
+@@ integer-width/##00 scale/0.5
+ es-MX
+ 00.0
+ 6000
+ -00.11
+ zh-TW
+ 00.0
+ 6,000
+ -00.11
+ bn-BD
+ ০০.০
+ ৬,০০০
+ -০০.১১
+
+precision-integer integer-width/##00 group-on-aligned
+ es-MX
+ 00
+ 1,827
+ -00
+ zh-TW
+ 00
+ 1,827
+ -00
+ bn-BD
+ ০০
+ ১,৮২৭
+ -০০
+
+.000 integer-width/##00 group-on-aligned
+ es-MX
+ 00.000
+ 1,827.364
+ -00.222
+ zh-TW
+ 00.000
+ 1,827.364
+ -00.222
+ bn-BD
+ ০০.০০০
+ ১,৮২৭.৩৬৪
+ -০০.২২২
+
+.##/@@@+ integer-width/##00 group-on-aligned
+ es-MX
+ 00
+ 1,827.36
+ -00.222
+ zh-TW
+ 00
+ 1,827.36
+ -00.222
+ bn-BD
+ ০০
+ ১,৮২৭.৩৬
+ -০০.২২২
+
+@@ integer-width/##00 group-on-aligned
+ es-MX
+ 00.0
+ 2,000
+ -00.22
+ zh-TW
+ 00.0
+ 2,000
+ -00.22
+ bn-BD
+ ০০.০
+ ২,০০০
+ -০০.২২
+
+precision-integer integer-width/##00 latin
+ es-MX
+ 00
+ 1827
+ -00
+ zh-TW
+ 00
+ 1,827
+ -00
+ bn-BD
+ 00
+ 1,827
+ -00
+
+.000 integer-width/##00 latin
+ es-MX
+ 00.000
+ 1827.364
+ -00.222
+ zh-TW
+ 00.000
+ 1,827.364
+ -00.222
+ bn-BD
+ 00.000
+ 1,827.364
+ -00.222
+
+.##/@@@+ integer-width/##00 latin
+ es-MX
+ 00
+ 1827.36
+ -00.222
+ zh-TW
+ 00
+ 1,827.36
+ -00.222
+ bn-BD
+ 00
+ 1,827.36
+ -00.222
+
+@@ integer-width/##00 latin
+ es-MX
+ 00.0
+ 2000
+ -00.22
+ zh-TW
+ 00.0
+ 2,000
+ -00.22
+ bn-BD
+ 00.0
+ 2,000
+ -00.22
+
+precision-integer integer-width/##00 sign-accounting-except-zero
+ es-MX
+ 00
+ +1827
+ -00
+ zh-TW
+ 00
+ +1,827
+ -00
+ bn-BD
+ ০০
+ +১,৮২৭
+ -০০
+
+.000 integer-width/##00 sign-accounting-except-zero
+ es-MX
+ 00.000
+ +1827.364
+ -00.222
+ zh-TW
+ 00.000
+ +1,827.364
+ -00.222
+ bn-BD
+ ০০.০০০
+ +১,৮২৭.৩৬৪
+ -০০.২২২
+
+.##/@@@+ integer-width/##00 sign-accounting-except-zero
+ es-MX
+ 00
+ +1827.36
+ -00.222
+ zh-TW
+ 00
+ +1,827.36
+ -00.222
+ bn-BD
+ ০০
+ +১,৮২৭.৩৬
+ -০০.২২২
+
+@@ integer-width/##00 sign-accounting-except-zero
+ es-MX
+ 00.0
+ +2000
+ -00.22
+ zh-TW
+ 00.0
+ +2,000
+ -00.22
+ bn-BD
+ ০০.০
+ +২,০০০
+ -০০.২২
+
+precision-integer integer-width/##00 decimal-always
+ es-MX
+ 00.
+ 1827.
+ -00.
+ zh-TW
+ 00.
+ 1,827.
+ -00.
+ bn-BD
+ ০০.
+ ১,৮২৭.
+ -০০.
+
+.000 integer-width/##00 decimal-always
+ es-MX
+ 00.000
+ 1827.364
+ -00.222
+ zh-TW
+ 00.000
+ 1,827.364
+ -00.222
+ bn-BD
+ ০০.০০০
+ ১,৮২৭.৩৬৪
+ -০০.২২২
+
+.##/@@@+ integer-width/##00 decimal-always
+ es-MX
+ 00.
+ 1827.36
+ -00.222
+ zh-TW
+ 00.
+ 1,827.36
+ -00.222
+ bn-BD
+ ০০.
+ ১,৮২৭.৩৬
+ -০০.২২২
+
+@@ integer-width/##00 decimal-always
+ es-MX
+ 00.0
+ 2000.
+ -00.22
+ zh-TW
+ 00.0
+ 2,000.
+ -00.22
+ bn-BD
+ ০০.০
+ ২,০০০.
+ -০০.২২
+
+precision-integer scale/0.5 group-on-aligned
+ es-MX
+ 0
+ 45,914
+ -0
+ zh-TW
+ 0
+ 45,914
+ -0
+ bn-BD
+ ০
+ ৪৫,৯১৪
+ -০
+
+.000 scale/0.5 group-on-aligned
+ es-MX
+ 0.000
+ 45,913.682
+ -0.111
+ zh-TW
+ 0.000
+ 45,913.682
+ -0.111
+ bn-BD
+ ০.০০০
+ ৪৫,৯১৩.৬৮২
+ -০.১১১
+
+.##/@@@+ scale/0.5 group-on-aligned
+ es-MX
+ 0
+ 45,913.68
+ -0.111
+ zh-TW
+ 0
+ 45,913.68
+ -0.111
+ bn-BD
+ ০
+ ৪৫,৯১৩.৬৮
+ -০.১১১
+
+@@ scale/0.5 group-on-aligned
+ es-MX
+ 0.0
+ 46,000
+ -0.11
+ zh-TW
+ 0.0
+ 46,000
+ -0.11
+ bn-BD
+ ০.০
+ ৪৬,০০০
+ -০.১১
+
+precision-integer scale/0.5 latin
+ es-MX
+ 0
+ 45,914
+ -0
+ zh-TW
+ 0
+ 45,914
+ -0
+ bn-BD
+ 0
+ 45,914
+ -0
+
+.000 scale/0.5 latin
+ es-MX
+ 0.000
+ 45,913.682
+ -0.111
+ zh-TW
+ 0.000
+ 45,913.682
+ -0.111
+ bn-BD
+ 0.000
+ 45,913.682
+ -0.111
+
+.##/@@@+ scale/0.5 latin
+ es-MX
+ 0
+ 45,913.68
+ -0.111
+ zh-TW
+ 0
+ 45,913.68
+ -0.111
+ bn-BD
+ 0
+ 45,913.68
+ -0.111
+
+@@ scale/0.5 latin
+ es-MX
+ 0.0
+ 46,000
+ -0.11
+ zh-TW
+ 0.0
+ 46,000
+ -0.11
+ bn-BD
+ 0.0
+ 46,000
+ -0.11
+
+precision-integer scale/0.5 sign-accounting-except-zero
+ es-MX
+ 0
+ +45,914
+ -0
+ zh-TW
+ 0
+ +45,914
+ -0
+ bn-BD
+ ০
+ +৪৫,৯১৪
+ -০
+
+.000 scale/0.5 sign-accounting-except-zero
+ es-MX
+ 0.000
+ +45,913.682
+ -0.111
+ zh-TW
+ 0.000
+ +45,913.682
+ -0.111
+ bn-BD
+ ০.০০০
+ +৪৫,৯১৩.৬৮২
+ -০.১১১
+
+.##/@@@+ scale/0.5 sign-accounting-except-zero
+ es-MX
+ 0
+ +45,913.68
+ -0.111
+ zh-TW
+ 0
+ +45,913.68
+ -0.111
+ bn-BD
+ ০
+ +৪৫,৯১৩.৬৮
+ -০.১১১
+
+@@ scale/0.5 sign-accounting-except-zero
+ es-MX
+ 0.0
+ +46,000
+ -0.11
+ zh-TW
+ 0.0
+ +46,000
+ -0.11
+ bn-BD
+ ০.০
+ +৪৬,০০০
+ -০.১১
+
+precision-integer scale/0.5 decimal-always
+ es-MX
+ 0.
+ 45,914.
+ -0.
+ zh-TW
+ 0.
+ 45,914.
+ -0.
+ bn-BD
+ ০.
+ ৪৫,৯১৪.
+ -০.
+
+.000 scale/0.5 decimal-always
+ es-MX
+ 0.000
+ 45,913.682
+ -0.111
+ zh-TW
+ 0.000
+ 45,913.682
+ -0.111
+ bn-BD
+ ০.০০০
+ ৪৫,৯১৩.৬৮২
+ -০.১১১
+
+.##/@@@+ scale/0.5 decimal-always
+ es-MX
+ 0.
+ 45,913.68
+ -0.111
+ zh-TW
+ 0.
+ 45,913.68
+ -0.111
+ bn-BD
+ ০.
+ ৪৫,৯১৩.৬৮
+ -০.১১১
+
+@@ scale/0.5 decimal-always
+ es-MX
+ 0.0
+ 46,000.
+ -0.11
+ zh-TW
+ 0.0
+ 46,000.
+ -0.11
+ bn-BD
+ ০.০
+ ৪৬,০০০.
+ -০.১১
+
+precision-integer group-on-aligned latin
+ es-MX
+ 0
+ 91,827
+ -0
+ zh-TW
+ 0
+ 91,827
+ -0
+ bn-BD
+ 0
+ 91,827
+ -0
+
+.000 group-on-aligned latin
+ es-MX
+ 0.000
+ 91,827.364
+ -0.222
+ zh-TW
+ 0.000
+ 91,827.364
+ -0.222
+ bn-BD
+ 0.000
+ 91,827.364
+ -0.222
+
+.##/@@@+ group-on-aligned latin
+ es-MX
+ 0
+ 91,827.36
+ -0.222
+ zh-TW
+ 0
+ 91,827.36
+ -0.222
+ bn-BD
+ 0
+ 91,827.36
+ -0.222
+
+@@ group-on-aligned latin
+ es-MX
+ 0.0
+ 92,000
+ -0.22
+ zh-TW
+ 0.0
+ 92,000
+ -0.22
+ bn-BD
+ 0.0
+ 92,000
+ -0.22
+
+precision-integer group-on-aligned sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827
+ -0
+ zh-TW
+ 0
+ +91,827
+ -0
+ bn-BD
+ ০
+ +৯১,৮২৭
+ -০
+
+.000 group-on-aligned sign-accounting-except-zero
+ es-MX
+ 0.000
+ +91,827.364
+ -0.222
+ zh-TW
+ 0.000
+ +91,827.364
+ -0.222
+ bn-BD
+ ০.০০০
+ +৯১,৮২৭.৩৬৪
+ -০.২২২
+
+.##/@@@+ group-on-aligned sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827.36
+ -0.222
+ zh-TW
+ 0
+ +91,827.36
+ -0.222
+ bn-BD
+ ০
+ +৯১,৮২৭.৩৬
+ -০.২২২
+
+@@ group-on-aligned sign-accounting-except-zero
+ es-MX
+ 0.0
+ +92,000
+ -0.22
+ zh-TW
+ 0.0
+ +92,000
+ -0.22
+ bn-BD
+ ০.০
+ +৯২,০০০
+ -০.২২
+
+precision-integer group-on-aligned decimal-always
+ es-MX
+ 0.
+ 91,827.
+ -0.
+ zh-TW
+ 0.
+ 91,827.
+ -0.
+ bn-BD
+ ০.
+ ৯১,৮২৭.
+ -০.
+
+.000 group-on-aligned decimal-always
+ es-MX
+ 0.000
+ 91,827.364
+ -0.222
+ zh-TW
+ 0.000
+ 91,827.364
+ -0.222
+ bn-BD
+ ০.০০০
+ ৯১,৮২৭.৩৬৪
+ -০.২২২
+
+.##/@@@+ group-on-aligned decimal-always
+ es-MX
+ 0.
+ 91,827.36
+ -0.222
+ zh-TW
+ 0.
+ 91,827.36
+ -0.222
+ bn-BD
+ ০.
+ ৯১,৮২৭.৩৬
+ -০.২২২
+
+@@ group-on-aligned decimal-always
+ es-MX
+ 0.0
+ 92,000.
+ -0.22
+ zh-TW
+ 0.0
+ 92,000.
+ -0.22
+ bn-BD
+ ০.০
+ ৯২,০০০.
+ -০.২২
+
+precision-integer latin sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827
+ -0
+ zh-TW
+ 0
+ +91,827
+ -0
+ bn-BD
+ 0
+ +91,827
+ -0
+
+.000 latin sign-accounting-except-zero
+ es-MX
+ 0.000
+ +91,827.364
+ -0.222
+ zh-TW
+ 0.000
+ +91,827.364
+ -0.222
+ bn-BD
+ 0.000
+ +91,827.364
+ -0.222
+
+.##/@@@+ latin sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827.36
+ -0.222
+ zh-TW
+ 0
+ +91,827.36
+ -0.222
+ bn-BD
+ 0
+ +91,827.36
+ -0.222
+
+@@ latin sign-accounting-except-zero
+ es-MX
+ 0.0
+ +92,000
+ -0.22
+ zh-TW
+ 0.0
+ +92,000
+ -0.22
+ bn-BD
+ 0.0
+ +92,000
+ -0.22
+
+precision-integer latin decimal-always
+ es-MX
+ 0.
+ 91,827.
+ -0.
+ zh-TW
+ 0.
+ 91,827.
+ -0.
+ bn-BD
+ 0.
+ 91,827.
+ -0.
+
+.000 latin decimal-always
+ es-MX
+ 0.000
+ 91,827.364
+ -0.222
+ zh-TW
+ 0.000
+ 91,827.364
+ -0.222
+ bn-BD
+ 0.000
+ 91,827.364
+ -0.222
+
+.##/@@@+ latin decimal-always
+ es-MX
+ 0.
+ 91,827.36
+ -0.222
+ zh-TW
+ 0.
+ 91,827.36
+ -0.222
+ bn-BD
+ 0.
+ 91,827.36
+ -0.222
+
+@@ latin decimal-always
+ es-MX
+ 0.0
+ 92,000.
+ -0.22
+ zh-TW
+ 0.0
+ 92,000.
+ -0.22
+ bn-BD
+ 0.0
+ 92,000.
+ -0.22
+
+precision-integer sign-accounting-except-zero decimal-always
+ es-MX
+ 0.
+ +91,827.
+ -0.
+ zh-TW
+ 0.
+ +91,827.
+ -0.
+ bn-BD
+ ০.
+ +৯১,৮২৭.
+ -০.
+
+.000 sign-accounting-except-zero decimal-always
+ es-MX
+ 0.000
+ +91,827.364
+ -0.222
+ zh-TW
+ 0.000
+ +91,827.364
+ -0.222
+ bn-BD
+ ০.০০০
+ +৯১,৮২৭.৩৬৪
+ -০.২২২
+
+.##/@@@+ sign-accounting-except-zero decimal-always
+ es-MX
+ 0.
+ +91,827.36
+ -0.222
+ zh-TW
+ 0.
+ +91,827.36
+ -0.222
+ bn-BD
+ ০.
+ +৯১,৮২৭.৩৬
+ -০.২২২
+
+@@ sign-accounting-except-zero decimal-always
+ es-MX
+ 0.0
+ +92,000.
+ -0.22
+ zh-TW
+ 0.0
+ +92,000.
+ -0.22
+ bn-BD
+ ০.০
+ +৯২,০০০.
+ -০.২২
+
+rounding-mode-floor integer-width/##00 scale/0.5
+ es-MX
+ 00
+ 5913.68225
+ -00.11111
+ zh-TW
+ 00
+ 5,913.68225
+ -00.11111
+ bn-BD
+ ০০
+ ৫,৯১৩.৬৮২২৫
+ -০০.১১১১১
+
+rounding-mode-floor integer-width/##00 group-on-aligned
+ es-MX
+ 00
+ 1,827.3645
+ -00.22222
+ zh-TW
+ 00
+ 1,827.3645
+ -00.22222
+ bn-BD
+ ০০
+ ১,৮২৭.৩৬৪৫
+ -০০.২২২২২
+
+rounding-mode-floor integer-width/##00 latin
+ es-MX
+ 00
+ 1827.3645
+ -00.22222
+ zh-TW
+ 00
+ 1,827.3645
+ -00.22222
+ bn-BD
+ 00
+ 1,827.3645
+ -00.22222
+
+rounding-mode-floor integer-width/##00 sign-accounting-except-zero
+ es-MX
+ 00
+ +1827.3645
+ -00.22222
+ zh-TW
+ 00
+ +1,827.3645
+ -00.22222
+ bn-BD
+ ০০
+ +১,৮২৭.৩৬৪৫
+ -০০.২২২২২
+
+rounding-mode-floor integer-width/##00 decimal-always
+ es-MX
+ 00.
+ 1827.3645
+ -00.22222
+ zh-TW
+ 00.
+ 1,827.3645
+ -00.22222
+ bn-BD
+ ০০.
+ ১,৮২৭.৩৬৪৫
+ -০০.২২২২২
+
+rounding-mode-floor scale/0.5 group-on-aligned
+ es-MX
+ 0
+ 45,913.68225
+ -0.11111
+ zh-TW
+ 0
+ 45,913.68225
+ -0.11111
+ bn-BD
+ ০
+ ৪৫,৯১৩.৬৮২২৫
+ -০.১১১১১
+
+rounding-mode-floor scale/0.5 latin
+ es-MX
+ 0
+ 45,913.68225
+ -0.11111
+ zh-TW
+ 0
+ 45,913.68225
+ -0.11111
+ bn-BD
+ 0
+ 45,913.68225
+ -0.11111
+
+rounding-mode-floor scale/0.5 sign-accounting-except-zero
+ es-MX
+ 0
+ +45,913.68225
+ -0.11111
+ zh-TW
+ 0
+ +45,913.68225
+ -0.11111
+ bn-BD
+ ০
+ +৪৫,৯১৩.৬৮২২৫
+ -০.১১১১১
+
+rounding-mode-floor scale/0.5 decimal-always
+ es-MX
+ 0.
+ 45,913.68225
+ -0.11111
+ zh-TW
+ 0.
+ 45,913.68225
+ -0.11111
+ bn-BD
+ ০.
+ ৪৫,৯১৩.৬৮২২৫
+ -০.১১১১১
+
+rounding-mode-floor group-on-aligned latin
+ es-MX
+ 0
+ 91,827.3645
+ -0.22222
+ zh-TW
+ 0
+ 91,827.3645
+ -0.22222
+ bn-BD
+ 0
+ 91,827.3645
+ -0.22222
+
+rounding-mode-floor group-on-aligned sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827.3645
+ -0.22222
+ zh-TW
+ 0
+ +91,827.3645
+ -0.22222
+ bn-BD
+ ০
+ +৯১,৮২৭.৩৬৪৫
+ -০.২২২২২
+
+rounding-mode-floor group-on-aligned decimal-always
+ es-MX
+ 0.
+ 91,827.3645
+ -0.22222
+ zh-TW
+ 0.
+ 91,827.3645
+ -0.22222
+ bn-BD
+ ০.
+ ৯১,৮২৭.৩৬৪৫
+ -০.২২২২২
+
+rounding-mode-floor latin sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827.3645
+ -0.22222
+ zh-TW
+ 0
+ +91,827.3645
+ -0.22222
+ bn-BD
+ 0
+ +91,827.3645
+ -0.22222
+
+rounding-mode-floor latin decimal-always
+ es-MX
+ 0.
+ 91,827.3645
+ -0.22222
+ zh-TW
+ 0.
+ 91,827.3645
+ -0.22222
+ bn-BD
+ 0.
+ 91,827.3645
+ -0.22222
+
+rounding-mode-floor sign-accounting-except-zero decimal-always
+ es-MX
+ 0.
+ +91,827.3645
+ -0.22222
+ zh-TW
+ 0.
+ +91,827.3645
+ -0.22222
+ bn-BD
+ ০.
+ +৯১,৮২৭.৩৬৪৫
+ -০.২২২২২
+
+integer-width/##00 scale/0.5 group-on-aligned
+ es-MX
+ 00
+ 5,913.68225
+ -00.11111
+ zh-TW
+ 00
+ 5,913.68225
+ -00.11111
+ bn-BD
+ ০০
+ ৫,৯১৩.৬৮২২৫
+ -০০.১১১১১
+
+integer-width/##00 scale/0.5 latin
+ es-MX
+ 00
+ 5913.68225
+ -00.11111
+ zh-TW
+ 00
+ 5,913.68225
+ -00.11111
+ bn-BD
+ 00
+ 5,913.68225
+ -00.11111
+
+integer-width/##00 scale/0.5 sign-accounting-except-zero
+ es-MX
+ 00
+ +5913.68225
+ -00.11111
+ zh-TW
+ 00
+ +5,913.68225
+ -00.11111
+ bn-BD
+ ০০
+ +৫,৯১৩.৬৮২২৫
+ -০০.১১১১১
+
+integer-width/##00 scale/0.5 decimal-always
+ es-MX
+ 00.
+ 5913.68225
+ -00.11111
+ zh-TW
+ 00.
+ 5,913.68225
+ -00.11111
+ bn-BD
+ ০০.
+ ৫,৯১৩.৬৮২২৫
+ -০০.১১১১১
+
+integer-width/##00 group-on-aligned latin
+ es-MX
+ 00
+ 1,827.3645
+ -00.22222
+ zh-TW
+ 00
+ 1,827.3645
+ -00.22222
+ bn-BD
+ 00
+ 1,827.3645
+ -00.22222
+
+integer-width/##00 group-on-aligned sign-accounting-except-zero
+ es-MX
+ 00
+ +1,827.3645
+ -00.22222
+ zh-TW
+ 00
+ +1,827.3645
+ -00.22222
+ bn-BD
+ ০০
+ +১,৮২৭.৩৬৪৫
+ -০০.২২২২২
+
+integer-width/##00 group-on-aligned decimal-always
+ es-MX
+ 00.
+ 1,827.3645
+ -00.22222
+ zh-TW
+ 00.
+ 1,827.3645
+ -00.22222
+ bn-BD
+ ০০.
+ ১,৮২৭.৩৬৪৫
+ -০০.২২২২২
+
+integer-width/##00 latin sign-accounting-except-zero
+ es-MX
+ 00
+ +1827.3645
+ -00.22222
+ zh-TW
+ 00
+ +1,827.3645
+ -00.22222
+ bn-BD
+ 00
+ +1,827.3645
+ -00.22222
+
+integer-width/##00 latin decimal-always
+ es-MX
+ 00.
+ 1827.3645
+ -00.22222
+ zh-TW
+ 00.
+ 1,827.3645
+ -00.22222
+ bn-BD
+ 00.
+ 1,827.3645
+ -00.22222
+
+integer-width/##00 sign-accounting-except-zero decimal-always
+ es-MX
+ 00.
+ +1827.3645
+ -00.22222
+ zh-TW
+ 00.
+ +1,827.3645
+ -00.22222
+ bn-BD
+ ০০.
+ +১,৮২৭.৩৬৪৫
+ -০০.২২২২২
+
+scale/0.5 group-on-aligned latin
+ es-MX
+ 0
+ 45,913.68225
+ -0.11111
+ zh-TW
+ 0
+ 45,913.68225
+ -0.11111
+ bn-BD
+ 0
+ 45,913.68225
+ -0.11111
+
+scale/0.5 group-on-aligned sign-accounting-except-zero
+ es-MX
+ 0
+ +45,913.68225
+ -0.11111
+ zh-TW
+ 0
+ +45,913.68225
+ -0.11111
+ bn-BD
+ ০
+ +৪৫,৯১৩.৬৮২২৫
+ -০.১১১১১
+
+scale/0.5 group-on-aligned decimal-always
+ es-MX
+ 0.
+ 45,913.68225
+ -0.11111
+ zh-TW
+ 0.
+ 45,913.68225
+ -0.11111
+ bn-BD
+ ০.
+ ৪৫,৯১৩.৬৮২২৫
+ -০.১১১১১
+
+scale/0.5 latin sign-accounting-except-zero
+ es-MX
+ 0
+ +45,913.68225
+ -0.11111
+ zh-TW
+ 0
+ +45,913.68225
+ -0.11111
+ bn-BD
+ 0
+ +45,913.68225
+ -0.11111
+
+scale/0.5 latin decimal-always
+ es-MX
+ 0.
+ 45,913.68225
+ -0.11111
+ zh-TW
+ 0.
+ 45,913.68225
+ -0.11111
+ bn-BD
+ 0.
+ 45,913.68225
+ -0.11111
+
+scale/0.5 sign-accounting-except-zero decimal-always
+ es-MX
+ 0.
+ +45,913.68225
+ -0.11111
+ zh-TW
+ 0.
+ +45,913.68225
+ -0.11111
+ bn-BD
+ ০.
+ +৪৫,৯১৩.৬৮২২৫
+ -০.১১১১১
+
+group-on-aligned latin sign-accounting-except-zero
+ es-MX
+ 0
+ +91,827.3645
+ -0.22222
+ zh-TW
+ 0
+ +91,827.3645
+ -0.22222
+ bn-BD
+ 0
+ +91,827.3645
+ -0.22222
+
+group-on-aligned latin decimal-always
+ es-MX
+ 0.
+ 91,827.3645
+ -0.22222
+ zh-TW
+ 0.
+ 91,827.3645
+ -0.22222
+ bn-BD
+ 0.
+ 91,827.3645
+ -0.22222
+
+group-on-aligned sign-accounting-except-zero decimal-always
+ es-MX
+ 0.
+ +91,827.3645
+ -0.22222
+ zh-TW
+ 0.
+ +91,827.3645
+ -0.22222
+ bn-BD
+ ০.
+ +৯১,৮২৭.৩৬৪৫
+ -০.২২২২২
+
+latin sign-accounting-except-zero decimal-always
+ es-MX
+ 0.
+ +91,827.3645
+ -0.22222
+ zh-TW
+ 0.
+ +91,827.3645
+ -0.22222
+ bn-BD
+ 0.
+ +91,827.3645
+ -0.22222
+
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/pkgdataMakefile.in b/Build/source/libs/icu/icu-src/source/test/testdata/pkgdataMakefile.in
index c5916f2a148..f8a684fc280 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/pkgdataMakefile.in
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/pkgdataMakefile.in
@@ -14,9 +14,9 @@ top_builddir = ../..
## All the flags and other definitions are included here.
include $(top_builddir)/icudefs.mk
-MIDDLE_SO_TARGET=
-
OUTPUTFILE=pkgdata.inc
+MIDDLE_SO_TARGET=
+PKGDATA_TRAILING_SPACE=" "
all : clean
@echo GENCCODE_ASSEMBLY_TYPE=$(GENCCODE_ASSEMBLY) >> $(OUTPUTFILE)
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/rbbitst.txt b/Build/source/libs/icu/icu-src/source/test/testdata/rbbitst.txt
index 63ba172233d..d0533c02b1e 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/rbbitst.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/rbbitst.txt
@@ -164,6 +164,498 @@
#
#<data>•\u0e40\u0e01•\u0e44\u0301\u0e23\u0302\u0303•\u0e40•\u0e40\u0e02•\u0e02• •</data>
+#
+# ICU-13637 and CLDR-10994 - Indic Grapheme Cluster Boundary changes to support aksaras
+# New rule: LinkingConsonant ExtCccZwj* Virama ExtCccZwj* × LinkingConsonant
+# Sample Chars: LinkingConsonant: \u0915
+# Virama: \u094d [also Extend]
+# ExtCccZWJ: \u0308
+# Extend but not ExtCCCZWJ \u093A
+<char>
+<data>•\u0915\u094d\u0915•</data>
+<data>•\u0915\u0308\u0308\u094d\u0308\u0308\u0915•</data>
+<data>•\u0915\u0308\u0308\u094d\u0308\u0308•\u0041•</data>
+<data>•\u0915\u0308\u0308\u094d\u093A\u093A•\u0915•</data>
+
+#
+# From cldr/common/testData/segmentation/graphemeCluster/TestSegmenter-Bengali.txt
+#
+
+# ব্যক্তিত্বের ;
+<data>•ব্য•ক্তি•ত্বে•র•</data>
+# আত্মবিশ্বাস ;
+<data>•আ•ত্ম•বি•শ্বা•স•</data>
+# ব্যাক্টেরিয়া ;
+<data>•ব্যা•ক্টে•রি•য়া•</data>
+# সমস্যার ;
+<data>•স•ম•স্যা•র•</data>
+# মিশ্রণ ;
+<data>•মি•শ্র•ণ•</data>
+# দুর্গন্ধ ;
+<data>•দু•র্গ•ন্ধ•</data>
+# পরীক্ষার ;
+<data>•প•রী•ক্ষা•র•</data>
+# কোলেস্টেরল ;
+<data>•কো•লে•স্টে•র•ল•</data>
+# ব্যায়ামকে ;
+<data>•ব্যা•য়া•ম•কে•</data>
+# সপ্তাহে ;
+<data>•স•প্তা•হে•</data>
+# পরীক্ষার ;
+<data>•প•রী•ক্ষা•র•</data>
+# চর্বিজাতীয় ;
+<data>•চ•র্বি•জা•তী•য়•</data>
+# নিয়ণ্ত্রণ ;
+<data>•নি•য়•ণ্ত্র•ণ•</data>
+# অবশ্যই ;
+<data>•অ•ব•শ্য•ই•</data>
+# নয়াদিল্লির ;
+<data>•ন•য়া•দি•ল্লি•র•</data>
+# সমীক্ষাটা ;
+<data>•স•মী•ক্ষা•টা•</data>
+# #ভূমিকম্পের ;
+# <data>•ভূ•মি•ক•ম্পের•</data> # line 17 in TestSegmenter-Bengali.txt
+# কেন্দ্রীয় ;
+<data>•কে•ন্দ্রী•য়•</data>
+# উস্কানিই ;
+<data>•উ•স্কা•নি•ই•</data>
+# সমীক্ষকরা ;
+<data>•স•মী•ক্ষ•ক•রা•</data>
+# মুহূর্তে ;
+<data>•মু•হূ•র্তে•</data>
+# সম্পর্কে ;
+<data>•স•ম্প•র্কে•</data>
+# পৌষসংক্রান্তির ;
+<data>•পৌ•ষ•সং•ক্রা•ন্তি•র•</data>
+# মুখ্যমন্ত্রী ;
+<data>•মু•খ্য•ম•ন্ত্রী•</data>
+
+#
+# from cldr/common/testData/segmentation/graphemeCluster/TestSegmenter-Devanagari.txt
+#
+
+# संदिग्ध ;
+<data>•सं•दि•ग्ध•</data>
+# सुरक्षा ;
+<data>•सु•र•क्षा•</data>
+# टक्कर ;
+<data>•ट•क्क•र•</data>
+# सत्र ;
+<data>•स•त्र•</data>
+# दक्षिण ;
+<data>•द•क्षि•ण•</data>
+# मिश्रणाने ;
+<data>•मि•श्र•णा•ने•</data>
+# दुर्घटनाग्रस्त ;
+<data>•दु•र्घ•ट•ना•ग्र•स्त•</data>
+# मुहूर्त ;
+<data>•मु•हू•र्त•</data>
+# शर्करायुक्त ;
+<data>•श•र्क•रा•यु•क्त•</data>
+# अंतरराष्ट्रीय ;
+<data>•अं•त•र•रा•ष्ट्री•य•</data>
+# राष्ट्रपति ;
+<data>•रा•ष्ट्र•प•ति•</data>
+# फ्रांस ;
+<data>•फ्रां•स•</data>
+# ट्रैक्टर ;
+<data>•ट्रै•क्ट•र•</data>
+# सिट्रोनेलाचे ;
+<data>•सि•ट्रो•ने•ला•चे•</data>
+# टुक्रालाई ;
+<data>•टु•क्रा•ला•ई•</data>
+# इकट्ठा ;
+<data>•इ•क•ट्ठा•</data>
+# शास्त्र ;
+<data>•शा•स्त्र•</data>
+# स्त्री ;
+<data>•स्त्री•</data>
+# लक्ष्य ;
+<data>•ल•क्ष्य•</data>
+# तीक्ष्ण ;
+<data>•ती•क्ष्ण•</data>
+# Words ;
+<data>•W•o•r•d•s•</data>
+# त्रिवेदी ;
+<data>•त्रि•वे•दी•</data>
+# कृत्रिम ;
+<data>•कृ•त्रि•म•</data>
+# मात्रामा ;
+<data>•मा•त्रा•मा•</data>
+# सिद्धार्थनगर ;
+<data>•सि•द्धा•र्थ•न•ग•र•</data>
+# श्रद्धालुओं ;
+<data>•श्र•द्धा•लु•ओं•</data>
+# वृद्धिसँग ;
+<data>•वृ•द्धि•सँ•ग•</data>
+# अंतःज्ञानी ;
+<data>•अं•तः•ज्ञा•नी••</data>
+# गन्नदी॑धिम ;
+<data>•ग•न्न•दी॑•धि•म•</data>
+# प्प्रप॑द्ये॒ ;
+<data>•प्प्र•प॑•द्ये॒•</data>
+# मनस्तापः ;
+<data>•म•न•स्ता•पः•</data>
+# हविष्करोमि ;
+<data>•ह•वि•ष्क•रो•मि•</data>
+# अहर्पतिः ;
+<data>•अ•ह•र्प•तिः•</data>
+# गच्छति ;
+<data>•ग•च्छ•ति•</data>
+# अयम् ;
+<data>•अ•य•म्•</data>
+# शिवश्चोदति ;
+<data>•शि•व•श्चो•द•ति•</data>
+# मनष्टालयति ;
+<data>•म•न•ष्टा•ल•य•ति•</data>
+# अश्वष्ठक्कस्य ;
+<data>•अ•श्व•ष्ठ•क्क•स्य•</data>
+# दुष्पुत्रः ;
+<data>•दु•ष्पु•त्रः•</data>
+# द्विःपक्वम् ;
+<data>•द्विः•प•क्व•म्•</data>
+# द्विष्कामः ;
+<data>•द्वि•ष्का•मः•</data>
+# भर्तुर्भोगः ;
+<data>•भ•र्तु•र्भो•गः•</data>
+# शॆत्युल ;
+<data>•शॆ•त्यु•ल••</data>
+# महारॆन्य ;
+<data>•म•हा•रॆ•न्य•</data>
+# सॆक्युल ;
+<data>•सॆ•क्यु•ल•</data>
+# ल्यॊदुर ;
+<data>•ल्यॊ•दु•र•</data>
+# फयॊक ;
+<data>•फ•यॊ•क•</data>
+# मॊहन्युव ;
+<data>•मॊ•ह•न्यु•व•</data>
+# अन्यर ;
+<data>•अ•न्य•र•</data>
+# ख्वजि ;
+<data>•ख्व•जि•</data>
+# खॅरिन्य ;
+<data>•खॅ•रि•न्य•</data>
+# उच्छ्वास ;
+<data>•उ•च्छ्वा•स•</data>
+# व्यक्तिमत्व ;
+<data>•व्य•क्ति•म•त्व•</data>
+# दातांच्यामध्ये ;
+<data>•दा•तां•च्या•म•ध्ये•</data>
+# दुर्गंधी ;
+<data>•दु•र्गं•धी•</data>
+# दुर्गंधीपासूनसुद्धा ;
+<data>•दु•र्गं•धी•पा•सू•न•सु•द्धा•</data>
+# नित्यकर्मामध्ये ;
+<data>•नि•त्य•क•र्मा•म•ध्ये•</data>
+# आजारांपासूनसुद्धा ;
+<data>•आ•जा•रां•पा•सू•न•सु•द्धा•</data>
+# भाज्यांमध्ये ;
+<data>•भा•ज्यां•म•ध्ये•</data>
+# उच्छ्वासाच्या ;
+<data>•उ•च्छ्वा•सा•च्या•</data>
+# सुकिल्लीं ;
+<data>•सु•कि•ल्लीं•</data>
+# स्लिपां ;
+<data>•स्लि•पां•</data>
+# मिसळिल्ल्यान ;
+<data>•मि•स•ळि•ल्ल्या•न•</data>
+# रोंप्यांची ;
+<data>•रों•प्यां•ची•</data>
+# वर्सांतल्यान ;
+<data>•व•र्सां•त•ल्या•न•</data>
+# रोंप्याच्या ;
+<data>•रों•प्या•च्या•</data>
+# नाशिल्ल्यान ;
+<data>•ना•शि•ल्ल्या•न•</data>
+# जिल्ल्याच्या ;
+<data>•जि•ल्ल्या•च्या•</data>
+# कुरुक्षेत्रांतल्या ;
+<data>•कु•रु•क्षे•त्रां•त•ल्या•</data>
+# भाज्ज्यांची ;
+<data>•भा•ज्ज्यां•ची•</data>
+# सिट्रोनेलाका ;
+<data>•सि•ट्रो•ने•ला•का•</data>
+# गरिनुपर्छ ;
+<data>•ग•रि•नु•प•र्छ•</data>
+# सामान्यतः ;
+<data>•सा•मा•न्य•तः•</data>
+# वृद्धिसँग ;
+<data>•वृ•द्धि•सँ•ग•</data>
+# रिपोर्टनि ;
+<data>•रि•पो•र्ट•नि•</data>
+# टोस्टर्ज़ ;
+<data>•टो•स्ट•र्ज़•</data>
+# वक्तव्य ;
+<data>•व•क्त•व्य•</data>
+# प्रक्रिया ;
+<data>•प्र•क्रि•या•</data>
+# निर्दिष्ट ;
+<data>•नि•र्दि•ष्ट•</data>
+# अस्वीकृत ;
+<data>•अ•स्वी•कृ•त•</data>
+# प्रयोक्ता ;
+<data>•प्र•यो•क्ता•</data>
+# प्रकार्यक ;
+<data>•प्र•का•र्य•क•</data>
+# ट्रेक्टरु ;
+<data>•ट्रे•क्ट•रु•</data>
+# स्थानधारक ;
+<data>•स्था•न•धा•र•क•</data>
+# प्रकार्यक ;
+<data>•प्र•का•र्य•क•</data>
+# अनुच्छेदसँ ;
+<data>•अ•नु•च्छे•द•सँ•</data>
+# गर्मीपदु ;
+<data>•ग•र्मी•प•दु•</data>
+# शास्त्रु ;
+<data>•शा•स्त्रु•</data>
+# इन्द्री ;
+<data>•इ•न्द्री•</data>
+# श्रधालू ;
+<data>•श्र•धा•लू•</data>
+# आस्तिकु ;
+<data>•आ•स्ति•कु•</data>
+# सकार्थो ;
+<data>•स•का•र्थो•</data>
+# सन्ॿंधु ;
+<data>•स•न्ॿं•धु•</data>
+# मनुक्खो ;
+<data>•म•नु•क्खो•</data>
+# हानिफ्राय ;
+<data>•हा•नि•फ्रा•य•</data>
+# दैथाइहरग्रा ;
+<data>•दै•था•इ•ह•र•ग्रा•</data>
+# बोसोरब्रै ;
+<data>•बो•सो•र•ब्रै•</data>
+# रांखान्थियारि ;
+<data>•रां•खा•न्थि•या•रि•</data>
+# खान्थियाव ;
+<data>•खा•न्थि•या•व•</data>
+# स्लिप्स ;
+<data>•स्लि•प्स•</data>
+
+#
+# cldr/common/testData/segmentation/graphemeCluster/TestSegmenter-Gujarati.txt
+#
+
+# અંગ્રેજી ;
+<data>•અં•ગ્રે•જી•</data>
+# શબ્દકોશ ;
+<data>•શ•બ્દ•કો•શ•</data>
+# બાપ્તિસ્મા ;
+<data>•બા•પ્તિ•સ્મા•</data>
+# મિસ્ત્રી ;
+<data>•મિ•સ્ત્રી•</data>
+# સિક્કા ;
+<data>•સિ•ક્કા•</data>
+#6 ; એકત્રીસમું ; એ÷કત્રી÷સ÷મું
+
+# સ્વસ્થાને ;
+<data>•સ્વ•સ્થા•ને•</data>
+# પ્રશ્નાર્થ ;
+<data>•પ્ર•શ્ના•ર્થ•</data>
+# વર્તમાનકૃદંત ;
+<data>•વ•ર્ત•મા•ન•કૃ•દં•ત•</data>
+# વાક્યની ;
+<data>•વા•ક્ય•ની•</data>
+# સાર્વજનિક ;
+<data>•સા•ર્વ•જ•નિ•ક•</data>
+# સમાપ્તિ ;
+<data>•સ•મા•પ્તિ•</data>
+# પધાર્યા ;
+<data>•પ•ધા•ર્યા•</data>
+# વ્યક્તિત્વને ;
+<data>•વ્ય•ક્તિ•ત્વ•ને•</data>
+# આત્મવિશ્વાસ ;
+<data>•આ•ત્મ•વિ•શ્વા•સ•</data>
+# વ્યાયામથી ;
+<data>•વ્યા•યા•મ•થી•</data>
+# યુક્ત ;
+<data>•યુ•ક્ત•</data>
+# #18 ; પુરુષોત્તમ ;
+<data>•પ•રુ•ષો•ત્ત•મ•</data>
+# કેન્દ્રીય ;
+<data>•કે•ન્દ્રી•ય•</data>
+# ક્ષત્રિય ;
+<data>•ક્ષ•ત્રિ•ય•</data>
+# ફોર્મ્યુલા ;
+<data>•ફો•ર્મ્યુ•લા•</data>
+# કેન્દ્રમાં ;
+<data>•કે•ન્દ્ર•માં•</data>
+# સ્પ્રિંગ ;
+<data>•સ્પ્રિં•ગ•</data>
+# પ્રારંભ ;
+<data>•પ્રા•રં•ભ•</data>
+# વિદ્યાર્થીઓ ;
+<data>•વિ•દ્યા•ર્થી•ઓ•</data>
+# સ્વાર્થની ;
+<data>•સ્વા•ર્થ•ની•</data>
+# લોન્ગયરબ્યેન ;
+<data>•લો•ન્ગ•ય•ર•બ્યે•ન•</data>
+# સ્થાનિક ;
+<data>•સ્થા•નિ•ક•</data>
+# બિલ્ડિંગની ;
+<data>•બિ•લ્ડિં•ગ•ની•</data>
+# ઉત્પાદક ;
+<data>•ઉ•ત્પા•દ•ક•</data>
+# ઝૂકાવ્યું ;
+<data>•ઝૂ•કા•વ્યું•</data>
+# પ્રપૌત્ર ;
+<data>•પ્ર•પૌ•ત્ર•</data>
+
+
+#
+# cldr/common/testData/segmentation/graphemeCluster/TestSegmenter-Malayalam.txt
+#
+
+# സ്ഥാനമൊഴിയുക ;
+<data>•സ്ഥാ•ന•മൊ•ഴി•യു•ക•</data>
+# വ്യക്തി ;
+<data>•വ്യ•ക്തി•</data>
+# കൗമാരക്കാരി ;
+<data>•കൗ•മാ•ര•ക്കാ•രി•</data>
+# കല്യാണം ;
+<data>•ക•ല്യാ•ണം•</data>
+# റദ്ദാക്കിയ ;
+<data>•റ•ദ്ദാ•ക്കി•യ•</data>
+# വ്യാപിക്കുക ;
+<data>•വ്യാ•പി•ക്കു•ക•</data>
+# സ്തുതി ;
+<data>•സ്തു•തി•</data>
+# ഭക്ഷ്യസുരക്ഷ ;
+<data>•ഭ•ക്ഷ്യ•സു•ര•ക്ഷ•</data>
+# പൂഴ്ത്തിവെക്കുക ;
+<data>•പൂ•ഴ്ത്തി•വെ•ക്കു•ക•</data>
+# നിശ്ചയിച്ച ;
+<data>•നി•ശ്ച•യി•ച്ച•</data>
+# പ്രശ്നം ;
+<data>•പ്ര•ശ്നം•</data>
+# സംസ്ഥാനം ;
+<data>•സം•സ്ഥാ•നം•</data>
+# പ്രോത്സാഹം ;
+<data>•പ്രോ•ത്സാ•ഹം•</data>
+# ഉദ്യോഗസ്ഥ ;
+<data>•ഉ•ദ്യോ•ഗ•സ്ഥ•</data>
+# സ്ഥാപനം ;
+<data>•സ്ഥാ•പ•നം•</data>
+# അത്ഭുതം ;
+<data>•അ•ത്ഭു•തം•</data>
+# പ്രഖ്യാപനം ;
+<data>•പ്ര•ഖ്യാ•പ•നം•</data>
+
+#
+# cldr/common/testData/segmentation/graphemeCluster/TestSegmenter-Odia.txt
+#
+
+# ଅସ୍ବରାନ୍ତ ;
+<data>•ଅ•ସ୍ବ•ରା•ନ୍ତ•</data>
+# ଅକର୍ମଣ୍ୟତା ;
+<data>•ଅ•କ•ର୍ମ•ଣ୍ୟ•ତା•</data>
+# ଅକର୍ମା ;
+<data>•ଅ•କ•ର୍ମା•</data>
+# ଆକର୍ଣ୍ଣ ;
+<data>•ଆ•କ•ର୍ଣ୍ଣ•</data>
+# ଆକସ୍ମିକୀ ;
+<data>•ଆ•କ•ସ୍ମି•କୀ•</data>
+# ଇଞ୍ଚମନୌତୀ ;
+<data>•ଇ•ଞ୍ଚ•ମ•ନୌ•ତୀ•</data>
+# ଅଗତ୍ୟା ;
+<data>•ଅ•ଗ•ତ୍ୟା•</data>
+# ଇନ୍ଦ୍ରଧ୍ବଜ ;
+<data>•ଇ•ନ୍ଦ୍ର•ଧ୍ବ•ଜ•</data>
+# ଊରୁତ୍ରାଣ ;
+<data>•ଊ•ରୁ•ତ୍ରା•ଣ•</data>
+# ଐଶ୍ବର୍ଯ୍ୟ ;
+<data>•ଐ•ଶ୍ବ•ର୍ଯ୍ୟ•</data>
+# ଅଗତ୍ୟା ;
+<data>•ଅ•ଗ•ତ୍ୟା•</data>
+# ଔପନ୍ୟାସିକ ;
+<data>•ଔ•ପ•ନ୍ୟା•ସି•କ•</data>
+# ଔଷ୍ଠ୍ୟ ;
+<data>•ଔ•ଷ୍ଠ୍ୟ•</data>
+# ଯଜୁର୍ବେଦୀ ;
+<data>•ଯ•ଜୁ•ର୍ବେ•ଦୀ•</data>
+# ପକ୍ଷ୍ମ ;
+<data>•ପ•କ୍ଷ୍ମ•</data>
+# ପଞ୍ଚଭୌତିକ ;
+<data>•ପ•ଞ୍ଚ•ଭୌ•ତି•କ•</data>
+# ତନ୍ତ୍ରିକାତନ୍ତ୍ର ;
+<data>•ତ•ନ୍ତ୍ରି•କା•ତ•ନ୍ତ୍ର•</data>
+# ସ୍ନାୟୁତନ୍ତ୍ର ;
+<data>•ସ୍ନା•ୟୁ•ତ•ନ୍ତ୍ର•</data>
+# ତପ୍ତକୁଣ୍ଡ ;
+<data>•ତ•ପ୍ତ•କୁ•ଣ୍ଡ•</data>
+# ଚଣ୍ଡୋଦରୀ ;
+<data>•ଚ•ଣ୍ଡୋ•ଦ•ରୀ•</data>
+# ଝଙ୍କାର ;
+<data>•ଝ•ଙ୍କା•ର•</data>
+# କଙ୍କପୃଷ୍ଠୀ ;
+<data>•କ•ଙ୍କ•ପୃ•ଷ୍ଠୀ•</data>
+# ଖଣ୍ଡନୀୟ ;
+<data>•ଖ•ଣ୍ଡ•ନୀ•ୟ•</data>
+# ଖମ୍ଭାବତୀ ;
+<data>•ଖ•ମ୍ଭା•ବ•ତୀ•</data>
+# ଘାଣେନ୍ଦ୍ରିୟ ;
+<data>•ଘା•ଣେ•ନ୍ଦ୍ରି•ୟ•</data>
+# ଘୁଞ୍ଚାଇବା ;
+<data>•ଘୁ•ଞ୍ଚା•ଇ•ବା•</data>
+
+#
+# cldr/common/testData/segmentation/graphemeCluster/TestSegmenter-Telugu.txt
+#
+
+# అదృశ్యం ;
+<data>•అ•దృ•శ్యం•</data>
+# ఉద్యోగాలు ;
+<data>•ఉ•ద్యో•గా•లు•</data>
+# ఉన్నాయన్న ;
+<data>•ఉ•న్నా•య•న్న•</data>
+# కార్యదర్శి ;
+<data>•కా•ర్య•ద•ర్శి•</data>
+# సామర్థ్యం ;
+<data>•సా•మ•ర్థ్యం•</data>
+# అభిప్రాయం ;
+<data>•అ•భి•ప్రా•యం•</data>
+# రాష్ట్రస్థాయి ;
+<data>•రా•ష్ట్ర•స్థా•యి•</data>
+# నిర్లక్ష్యం ;
+<data>•ని•ర్ల•క్ష్యం•</data>
+# వ్యాజ్యాలన్నీ ;
+<data>•వ్యా•జ్యా•ల•న్నీ•</data>
+# న్యాయవ్యవస్థ ;
+<data>•న్యా•య•వ్య•వ•స్థ•</data>
+# వ్యాఖ్యలు ;
+<data>•వ్యా•ఖ్య•లు•</data>
+# నేతృత్వం ;
+<data>•నే•తృ•త్వం•</data>
+# ఉద్రిక్తత ;
+<data>•ఉ•ద్రి•క్త•త•</data>
+# వ్యాఖ్యలు ;
+<data>•వ్యా•ఖ్య•లు•</data>
+# అత్యున్నత ;
+<data>•అ•త్యు•న్న•త•</data>
+# మనస్పర్ధలు ;
+<data>•మ•న•స్ప•ర్ధ•లు•</data>
+# కార్యక్రమం ;
+<data>•కా•ర్య•క్ర•మం•</data>
+# గుప్పిస్తున్నారు ;
+<data>•గు•ప్పి•స్తు•న్నా•రు•</data>
+# నటిస్తున్నారు ;
+<data>•న•టి•స్తు•న్నా•రు•</data>
+# ద్వితీయార్ధం ;
+<data>•ద్వి•తీ•యా•ర్ధం•</data>
+# జీర్ణవ్యవస్థ ;
+<data>•జీ•ర్ణ•వ్య•వ•స్థ•</data>
+# ఉత్సాహం ;
+<data>•ఉ•త్సా•హం•</data>
+# హృద్రోగాలు ;
+<data>•హృ•ద్రో•గా•లు•</data>
+# పాల్గొనాల్సింది ;
+<data>•పా•ల్గొ•నా•ల్సిం•ది•</data>
+# మార్గదర్శకాలు ;
+<data>•మా•ర్గ•ద•ర్శ•కా•లు•</data>
+
########################################################################################
#
@@ -240,8 +732,7 @@
<data>•aa\N{COMBINING GRAVE ACCENT}a<200> •</data>
# fullwidth numeric, midletter characters etc should be treated like their halfwidth counterparts
-# <data>•ISN'T<200> •19<100>日<400></data>
-# why was this added with the dbbi stuff?
+<data>•ISN'T<200> •19<100>日<400></data>
# to test for bug #4098467
# What follows is a string of Korean characters (I found it in the Yellow Pages
@@ -629,9 +1120,9 @@ Calls to xxx will return an implementor of this interface. \u2029•</data>
<data>• •\u2014\u2028<100>\u2014•</data>
<data>• •\uFFFC\u2028<100>\uFFFC•</data>
<data>• \u0029\u2028<100>\u0029•</data>
-#<data>• \u0301\u2028<100>\u0301•</data> # TODO: fix.
+<data>• •\u0301\u2028<100>\u0301•</data>
<data>• \u0021\u2028<100>\u0021•</data>
-#<data>• \u00A0\u2028<100>\u00A0•</data> # TODO: fix
+<data>• •\u00A0\u2028<100>\u00A0•</data>
<data>• •\u002D\u2028<100>\u002D•</data>
<data>• •\u4E00\u2028<100>\u4E00•</data>
<data>• •\u2024\u2028<100>\u2024•</data>
@@ -650,7 +1141,7 @@ Calls to xxx will return an implementor of this interface. \u2029•</data>
<data>• •\uF8FF\u2028<100>\uF8FF•</data>
<data>• \u200B\u2028<100>\u200B•</data>
-# Regional Indicator sequences. They group in pairs. The reverse rules are tricky.
+# Regional Indicator sequences. They group in pairs.
# Sequences are long enough that the non-exaustive monkey test won't reliably pick up problems.
<data>•\U0001F1E6\U0001F1E6•\U0001F1E6\U0001F1E6•\U0001F1E6\U0001F1E6•\U0001F1E6\U0001F1E6•</data>
@@ -778,6 +1269,20 @@ between •Mae •Hong •Son •and •the •Salween •River, •the •Thano
the •Khun •Tan •Range •(ดอย•ขุน•ตาน), •the •Phi •Pan •Nam •Range •(ทิว•เขา•ผี•ปัน•น้ำ), •as •well •as •the •western •\
part •of •the •Luang •Prabang •Range •(ทิว•เขา•หลวง•พระ•บาง).•</data>
+# Breaking around numbers that begin with a decimal point.
+# Bug ICU-12017
+
+<line>
+<data>•start •.789 •end•</data>
+<data>•start .abc •end•</data>
+<data>•start •( .789 •end)•</data>
+<data>•start •.\u0301789 •end•</data> # \u0301 is a CM (COMBINING ACUTE ACCENT)
+<data>•start •.\u200D789 •end•</data> # \u200D is ZWJ
+<data>•start •.\u200D\u0301789 •end•</data>
+<data>•start •.\u0301\u200D789 •end•</data>
+<data>•start .\u0301\u200D•</data>
+<data>•start .\u0301\u200D •</data>
+<data>•start ; •end •</data>
########################################################################################
#
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/regextst.txt b/Build/source/libs/icu/icu-src/source/test/testdata/regextst.txt
index ee7bdf2227e..91356123c5b 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/regextst.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/regextst.txt
@@ -89,6 +89,28 @@
"abc(?!def)" b "<r><0>abc</0></r>xyz"
#
+# Nested Lookahead / Behind
+#
+"one(?=(?:(?!<out>).)*</out>)" "<out><0>one</0> stuff</out>"
+"one(?=(?:(?!<out>).)*</out>)" "<out>one <out></out>"
+
+# More nesting lookaround: pattern matches "qq" when not preceded by 'a' and followed by 'z'
+"(?<!a(?!...z))qq" "<0>qq</0>c"
+"(?<!a(?!...z))qq" "f<0>qq</0>c"
+"(?<!a(?!...z))qq" "aqqz"
+
+# More nested lookaround: match any two chars preceded and followed by an upper case letter.
+# With gratuitious nesting of look-arounds and capture from the look-arounds.
+
+"(?=(?<=(\p{Lu})(?=..(\p{Lu})))).." "<1>A</1><0>jk</0><2>B</2>"
+"(?=(?<=(\p{Lu})(?=..(\p{Lu})))).." "ajkB"
+"(?=(?<=(\p{Lu})(?=..(\p{Lu})))).." "Ajkb"
+
+# Nested lookaround cases from bug ICU-20564
+"(?<=(?<=((?=)){0}+))" "<0></0>abc"
+"(?<=c(?<=c((?=c)){1}+))" "c<0><1></1></0>cc"
+
+#
# Anchoring Bounds
#
"^def$" "abc<r><0>def</0></r>ghi" # anchoring (default) bounds
@@ -1419,11 +1441,50 @@
"[a-z]+" i "<0>Aa</0>" # Matches JDK behavior.
"[^a-z]+" i "Aa" # (no match) which is JDK behavior. Case fold first, then negation.
-# Random debugging, Temporary
-#
+# Bug 20385. Assertion failure while compiling a negative look-behind expression consisting of a set with
+# no contents. Meaning the [set] can never match. There is no syntax to directly express
+# an empty set, so generate it by negating (^) a set of all code points.
+# Also check empty sets in other contexts.
+
+"(?<![^[^a]a])" "<0></0>abc"
+
+"(?<![^\u0000-\U0010ffff])" "<0></0>abc"
+"x(?<![^\u0000-\U0010ffff])" "<0>x</0>abc"
+"x(?<![^\u0000-\U0010ffff]{1,5})" "<0>x</0>abc"
+"x(?<![^\u0000-\U0010ffff]{0,5})" "xabc"
+
+"(?<=[^\u0000-\U0010ffff])" "abc"
+"(x?<=[^\u0000-\U0010ffff])" "abc"
+"x(?<=[^\u0000-\U0010ffff]{1,5})" "xabc"
+"x(?<=[^\u0000-\U0010ffff]{0,5})" "<0>x</0>abc"
+
+"[^\u0000-\U0010ffff]" "a"
+"[^[^\u0000-\U0010ffff]]" "<0>a</0>"
"This is a string with (?:one |two |three )endings" "<0>This is a string with two endings</0>"
+# Bug ICU-20544. Similar to 20385, above. Assertion failure with a negative look-behind assertion containing
+# a set with no contents. Look-behind pattern includes more than just the empty set.
+
+"(?<![ⰿ&&m]c)" "<0></0>abc" # note: first 'ⰿ' is \u2c3f, hence empty set.
+"(?<![^\u0000-\U0010ffff]c)" "<0></0>abc"
+"(?<=[^[^]]†)" "abc" # Problem also exists w positive look-behind
+
+# Bug ICU-20391. Crash in computation of minimum match length with nested look-around patterns.
+#
+"(?<=(?<=((?=)){0}+)" E "aaa"
+"(?<=(?<=((?=)){0}+))" "<0></0>"
+"(?<=c(?<=b((?=a)){1}+))" "aaa"
+"abc(?=de(?=f))...g" "<0>abcdefg</0>"
+"abc(?=de(?=f))...g" "abcdxfg"
+
+# Bug ICU-20618 Assertion failure with nested look-around expressions.
+#
+"(?<=(?<=b?(?=a)))" "hello, world."
+
+
+# Random debugging, Temporary
+#
#
# Regexps from http://www.regexlib.com
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/root.txt b/Build/source/libs/icu/icu-src/source/test/testdata/root.txt
index 49185965b10..7fd5b2a8ac8 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/root.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/root.txt
@@ -13,8 +13,8 @@
root
{
Version { 44.0 }
- ExpectCLDRVersionAtLeast { 34.0 } // 'base' cldr version. Allow up to version =.=.* of this
- CurrentCLDRVersion { 34.0 } // Current CLDR version as of the test update. Warn if not an exact match.
+ ExpectCLDRVersionAtLeast { 36.0 } // 'base' cldr version. Allow up to version =.=.* of this
+ CurrentCLDRVersion { 36.0 } // Current CLDR version as of the test update. Warn if not an exact match.
ShortLanguage { xxx }
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/structLocale.txt b/Build/source/libs/icu/icu-src/source/test/testdata/structLocale.txt
index d3182edb83c..601be7dc010 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/structLocale.txt
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/structLocale.txt
@@ -1533,11 +1533,8 @@ structLocale:table(nofallback){
"",
}
}
- Currencies%variant{
- AMD{""}
- AZN{""}
- RUB{""}
- TRY{""}
+ Currencies%formal{
+ TWD{""}
}
Currencies%narrow{
AOA{""}
@@ -1636,6 +1633,12 @@ structLocale:table(nofallback){
ZAR{""}
ZMW{""}
}
+ Currencies%variant{
+ AMD{""}
+ AZN{""}
+ RUB{""}
+ TRY{""}
+ }
CurrencyPlurals{
ADP{
zero{""}
@@ -5803,6 +5806,7 @@ structLocale:table(nofallback){
mn{""}
mnc{""}
mni{""}
+ mo{""}
moh{""}
mos{""}
mr{""}
@@ -6056,6 +6060,10 @@ structLocale:table(nofallback){
Languages%long{
zh{""}
}
+ Languages%menu{
+ yue{""}
+ zh{""}
+ }
Languages%secondary{
crh{""}
fa{""}
@@ -21263,6 +21271,53 @@ structLocale:table(nofallback){
}
}
intervalFormats{
+ Bh{
+ B{""}
+ h{""}
+ }
+ Bhm{
+ B{""}
+ h{""}
+ m{""}
+ }
+ Gy{
+ G{""}
+ y{""}
+ }
+ GyM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMMMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
H{
H{""}
}
@@ -22179,6 +22234,53 @@ structLocale:table(nofallback){
}
}
intervalFormats{
+ Bh{
+ B{""}
+ h{""}
+ }
+ Bhm{
+ B{""}
+ h{""}
+ m{""}
+ }
+ Gy{
+ G{""}
+ y{""}
+ }
+ GyM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMMMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
H{
H{""}
}
@@ -22485,6 +22587,53 @@ structLocale:table(nofallback){
}
}
intervalFormats{
+ Bh{
+ B{""}
+ h{""}
+ }
+ Bhm{
+ B{""}
+ h{""}
+ m{""}
+ }
+ Gy{
+ G{""}
+ y{""}
+ }
+ GyM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMMMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
H{
H{""}
}
@@ -23499,6 +23648,53 @@ structLocale:table(nofallback){
}
}
intervalFormats{
+ Bh{
+ B{""}
+ h{""}
+ }
+ Bhm{
+ B{""}
+ h{""}
+ m{""}
+ }
+ Gy{
+ G{""}
+ y{""}
+ }
+ GyM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMMMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
H{
H{""}
}
@@ -23810,6 +24006,53 @@ structLocale:table(nofallback){
}
}
intervalFormats{
+ Bh{
+ B{""}
+ h{""}
+ }
+ Bhm{
+ B{""}
+ h{""}
+ m{""}
+ }
+ Gy{
+ G{""}
+ y{""}
+ }
+ GyM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMMMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
H{
H{""}
}
@@ -24078,6 +24321,53 @@ structLocale:table(nofallback){
}
}
intervalFormats{
+ Bh{
+ B{""}
+ h{""}
+ }
+ Bhm{
+ B{""}
+ h{""}
+ m{""}
+ }
+ Gy{
+ G{""}
+ y{""}
+ }
+ GyM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMMMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
H{
H{""}
}
@@ -24311,6 +24601,10 @@ structLocale:table(nofallback){
"",
"",
}
+ AmPmMarkersAbbr{
+ "",
+ "",
+ }
AmPmMarkersNarrow{
"",
"",
@@ -24358,88 +24652,33 @@ structLocale:table(nofallback){
yyMd{""}
yyQQQQ{""}
}
- dayNames{
- default{""}
- format{
- abbreviated{
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- }
- default{""}
- narrow{
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- }
- short{
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- }
- wide{
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- }
+ intervalFormats{
+ Bh{
+ B{""}
+ h{""}
}
- stand-alone{
- abbreviated{
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- }
- default{""}
- narrow{
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- }
- short{
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- }
- wide{
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- }
+ Bhm{
+ B{""}
+ h{""}
+ m{""}
+ }
+ GGGGGyM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GGGGGyMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GGGGGyMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
}
- }
- intervalFormats{
Gy{
G{""}
y{""}
@@ -24607,48 +24846,6 @@ structLocale:table(nofallback){
y{""}
}
}
- quarters{
- format{
- abbreviated{
- "",
- "",
- "",
- "",
- }
- wide{
- "",
- "",
- "",
- "",
- }
- narrow{
- "",
- "",
- "",
- "",
- }
- }
- stand-alone{
- abbreviated{
- "",
- "",
- "",
- "",
- }
- wide{
- "",
- "",
- "",
- "",
- }
- narrow{
- "",
- "",
- "",
- "",
- }
- }
- }
}
gregorian{
AmPmMarkers{
@@ -24922,6 +25119,15 @@ structLocale:table(nofallback){
}
}
intervalFormats{
+ Bh{
+ B{""}
+ h{""}
+ }
+ Bhm{
+ B{""}
+ h{""}
+ m{""}
+ }
Gy{
G{""}
y{""}
@@ -25282,6 +25488,53 @@ structLocale:table(nofallback){
}
}
intervalFormats{
+ Bh{
+ B{""}
+ h{""}
+ }
+ Bhm{
+ B{""}
+ h{""}
+ m{""}
+ }
+ Gy{
+ G{""}
+ y{""}
+ }
+ GyM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMMMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
H{
H{""}
}
@@ -25568,6 +25821,53 @@ structLocale:table(nofallback){
}
}
intervalFormats{
+ Bh{
+ B{""}
+ h{""}
+ }
+ Bhm{
+ B{""}
+ h{""}
+ m{""}
+ }
+ Gy{
+ G{""}
+ y{""}
+ }
+ GyM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMMMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
H{
H{""}
}
@@ -25846,6 +26146,53 @@ structLocale:table(nofallback){
}
}
intervalFormats{
+ Bh{
+ B{""}
+ h{""}
+ }
+ Bhm{
+ B{""}
+ h{""}
+ m{""}
+ }
+ Gy{
+ G{""}
+ y{""}
+ }
+ GyM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMMMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
H{
H{""}
}
@@ -26124,6 +26471,53 @@ structLocale:table(nofallback){
}
}
intervalFormats{
+ Bh{
+ B{""}
+ h{""}
+ }
+ Bhm{
+ B{""}
+ h{""}
+ m{""}
+ }
+ Gy{
+ G{""}
+ y{""}
+ }
+ GyM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMMMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
H{
H{""}
}
@@ -26377,10 +26771,10 @@ structLocale:table(nofallback){
"",
"",
"",
- "",
- "",
- "",
- "",
+ "A2",
+ "A2",
+ "A2",
+ "A2",
"",
"A4",
"A4",
@@ -27107,6 +27501,53 @@ structLocale:table(nofallback){
}
}
intervalFormats{
+ Bh{
+ B{""}
+ h{""}
+ }
+ Bhm{
+ B{""}
+ h{""}
+ m{""}
+ }
+ Gy{
+ G{""}
+ y{""}
+ }
+ GyM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMMMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
H{
H{""}
}
@@ -27242,6 +27683,10 @@ structLocale:table(nofallback){
"",
"",
}
+ AmPmMarkersAbbr{
+ "",
+ "",
+ }
AmPmMarkersNarrow{
"",
"",
@@ -27291,6 +27736,53 @@ structLocale:table(nofallback){
}
}
intervalFormats{
+ Bh{
+ B{""}
+ h{""}
+ }
+ Bhm{
+ B{""}
+ h{""}
+ m{""}
+ }
+ Gy{
+ G{""}
+ y{""}
+ }
+ GyM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMM{
+ G{""}
+ M{""}
+ y{""}
+ }
+ GyMMMEd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMMMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
+ GyMd{
+ G{""}
+ M{""}
+ d{""}
+ y{""}
+ }
H{
H{""}
}
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/testdata.mak b/Build/source/libs/icu/icu-src/source/test/testdata/testdata.mak
index c34737aa07d..2809efd0ca3 100644
--- a/Build/source/libs/icu/icu-src/source/test/testdata/testdata.mak
+++ b/Build/source/libs/icu/icu-src/source/test/testdata/testdata.mak
@@ -25,143 +25,21 @@ ALL : "$(TESTDATAOUT)\testdata.dat"
# old_e_testtypes.res is the same, but icuswapped to big-endian EBCDIC
-# the following file has $(TEST_RES_SOURCE)
-!INCLUDE "$(TESTDATA)\tstfiles.mk"
+TESTDATATMP="$(TESTDATAOUT)\testdata"
-TEST_RES_FILES = $(TEST_RES_SOURCE:.txt=.res)
+CREATE_DIRS :
+ @if not exist "$(TESTDATAOUT)\$(NULL)" mkdir "$(TESTDATAOUT)"
+ @if not exist "$(TESTDATABLD)\$(NULL)" mkdir "$(TESTDATABLD)"
+ @if not exist "$(TESTDATATMP)\$(NULL)" mkdir "$(TESTDATATMP)"
-"$(TESTDATAOUT)\testdata.dat" : $(TEST_RES_FILES) "$(TESTDATABLD)\casing.res" "$(TESTDATABLD)\conversion.res" "$(TESTDATABLD)\icuio.res" "$(TESTDATABLD)\mc.res" "$(TESTDATABLD)\structLocale.res" "$(TESTDATABLD)\root.res" "$(TESTDATABLD)\sh.res" "$(TESTDATABLD)\sh_YU.res" "$(TESTDATABLD)\te.res" "$(TESTDATABLD)\te_IN.res" "$(TESTDATABLD)\te_IN_REVISED.res" "$(TESTDATABLD)\testaliases.res" "$(TESTDATABLD)\testtypes.res" "$(TESTDATABLD)\testempty.res" "$(TESTDATABLD)\encoded.res" "$(TESTDATABLD)\idna_rules.res" "$(TESTDATABLD)\test.icu" "$(TESTDATABLD)\testtable32.res" "$(TESTDATABLD)\test1.cnv" "$(TESTDATABLD)\test1bmp.cnv" "$(TESTDATABLD)\test2.cnv" "$(TESTDATABLD)\test3.cnv" "$(TESTDATABLD)\test4.cnv" "$(TESTDATABLD)\test4x.cnv" "$(TESTDATABLD)\test5.cnv" "$(TESTDATABLD)\ibm9027.cnv" "$(TESTDATABLD)\nfscsi.spp" "$(TESTDATABLD)\nfscss.spp" "$(TESTDATABLD)\nfscis.spp" "$(TESTDATABLD)\nfsmxs.spp" "$(TESTDATABLD)\nfsmxp.spp" "$(TESTDATABLD)\testnorm.nrm" "$(TESTDATABLD)\zoneinfo64.res"
+"$(TESTDATAOUT)\testdata.dat" :
@echo Building test data
- @copy "$(TESTDATABLD)\te.res" "$(TESTDATAOUT)\$(TESTDT)\nam.typ"
- @copy "$(TESTDATA)\old_l_testtypes.res" "$(TESTDATABLD)"
- @copy "$(TESTDATA)\old_e_testtypes.res" "$(TESTDATABLD)"
- @copy "$(TESTDATABLD)\zoneinfo64.res" "$(TESTDATAOUT)\$(TESTDT)"
- "$(ICUPBIN)\pkgdata" -f -v -m common -c -p"$(TESTPKG)" -d "$(TESTDATAOUT)" -T "$(TESTDATABLD)" -s "$(TESTDATABLD)" <<
-casing.res
-conversion.res
-mc.res
-root.res
-testtable32.res
-sh.res
-sh_YU.res
-te.res
-te_IN.res
-te_IN_REVISED.res
-testtypes.res
-old_l_testtypes.res
-old_e_testtypes.res
-testempty.res
-testaliases.res
-structLocale.res
-icuio.res
-encoded.res
-test.icu
-test1.cnv
-test1bmp.cnv
-test2.cnv
-test3.cnv
-test4.cnv
-test4x.cnv
-test5.cnv
-ibm9027.cnv
-idna_rules.res
-nfscsi.spp
-nfscss.spp
-nfscis.spp
-nfsmxs.spp
-nfsmxp.spp
-testnorm.nrm
-$(TEST_RES_FILES:.res =.res
-)
-<<
-
-
-# Inference rule for creating resource bundles
-# Some test data resource bundles are known to have warnings and bad data.
-# The -q option is there on purpose, so we don't see it normally.
-{$(TESTDATA)}.txt.res::
- @echo Making Test Resource Bundle files $<
- @"$(ICUTOOLS)\genrb\$(CFG)\genrb" -q -s"$(TESTDATA)" -d"$(TESTDATABLD)" $<
-
-"$(TESTDATABLD)\encoded.res": "$(TESTDATA)\encoded.utf16be"
- @echo Making Test Resource Bundle file with encoding
- "$(ICUTOOLS)\genrb\$(CFG)\genrb" -s"$(TESTDATA)" -eUTF-16BE -d"$(TESTDATABLD)" encoded.utf16be
-
-"$(TESTDATABLD)\idna_rules.res": "$(TESTDATA)\idna_rules.txt"
- @echo Making Test Resource Bundle file for IDNA reference implementation
- @"$(ICUTOOLS)\genrb\$(CFG)\genrb" -s"$(TESTDATA)" -d"$(TESTDATABLD)" idna_rules.txt
-
-
-"$(TESTDATABLD)\test.icu" : {"$(ICUTOOLS)\gentest\$(CFG)"}gentest.exe
- "$(ICUTOOLS)\gentest\$(CFG)\gentest" -d"$(TESTDATABLD)"
-
-# testtable32 resource file
-"$(TESTDATABLD)\testtable32.txt" : {"$(ICUTOOLS)\gentest\$(CFG)"}gentest.exe
- "$(ICUTOOLS)\gentest\$(CFG)\gentest" -r -d"$(TESTDATABLD)"
-
-"$(TESTDATABLD)\testtable32.res": "$(TESTDATABLD)\testtable32.txt"
- "$(ICUTOOLS)\genrb\$(CFG)\genrb" -s"$(TESTDATABLD)" -d"$(TESTDATABLD)" testtable32.txt
-
-# Targets for nfscsi.spp
-"$(TESTDATABLD)\nfscsi.spp" : {"$(ICUTOOLS)\gensprep\$(CFG)"}gensprep.exe "$(TESTDATA)\nfs4_cs_prep_ci.txt"
- @echo Building $@
- @"$(ICUTOOLS)\gensprep\$(CFG)\gensprep" -s "$(TESTDATA)" -d "$(TESTDATABLD)\\" -b nfscsi -u 3.2.0 nfs4_cs_prep_ci.txt
-
-# Targets for nfscss.spp
-"$(TESTDATABLD)\nfscss.spp" : {"$(ICUTOOLS)\gensprep\$(CFG)"}gensprep.exe "$(TESTDATA)\nfs4_cs_prep_cs.txt"
- @echo Building $@
- @"$(ICUTOOLS)\gensprep\$(CFG)\gensprep" -s "$(TESTDATA)" -d "$(TESTDATABLD)\\" -b nfscss -u 3.2.0 nfs4_cs_prep_cs.txt
-
-# Targets for nfscis.spp
-"$(TESTDATABLD)\nfscis.spp" : {"$(ICUTOOLS)\gensprep\$(CFG)"}gensprep.exe "$(TESTDATA)\nfs4_cis_prep.txt"
- @echo Building $@
- @"$(ICUTOOLS)\gensprep\$(CFG)\gensprep" -s "$(TESTDATA)" -d "$(TESTDATABLD)\\" -b nfscis -u 3.2.0 -k -n "$(ICUTOOLS)\..\data\unidata" nfs4_cis_prep.txt
-
-# Targets for nfsmxs.spp
-"$(TESTDATABLD)\nfsmxs.spp" : {"$(ICUTOOLS)\gensprep\$(CFG)"}gensprep.exe "$(TESTDATA)\nfs4_mixed_prep_s.txt"
- @echo Building $@
- @"$(ICUTOOLS)\gensprep\$(CFG)\gensprep" -s "$(TESTDATA)" -d "$(TESTDATABLD)\\" -b nfsmxs -u 3.2.0 -k -n "$(ICUTOOLS)\..\data\unidata" nfs4_mixed_prep_s.txt
-
-# Targets for nfsmxp.spp
-"$(TESTDATABLD)\nfsmxp.spp" : {"$(ICUTOOLS)\gensprep\$(CFG)"}gensprep.exe "$(TESTDATA)\nfs4_mixed_prep_p.txt"
- @echo Building $@
- @"$(ICUTOOLS)\gensprep\$(CFG)\gensprep" -s "$(TESTDATA)" -d "$(TESTDATABLD)\\" -b nfsmxp -u 3.2.0 -k -n "$(ICUTOOLS)\..\data\unidata" nfs4_mixed_prep_p.txt
-
-
-# Targets for test converter data
-"$(TESTDATABLD)\test1.cnv": "$(TESTDATA)\test1.ucm"
- @echo Building $@
- @"$(ICUTOOLS)\makeconv\$(CFG)\makeconv" --small -d"$(TESTDATABLD)" $**
-
-"$(TESTDATABLD)\test1bmp.cnv": "$(TESTDATA)\test1bmp.ucm"
- @echo Building $@
- @"$(ICUTOOLS)\makeconv\$(CFG)\makeconv" --small -d"$(TESTDATABLD)" $**
-
-"$(TESTDATABLD)\test2.cnv": "$(TESTDATA)\test2.ucm"
- @echo Building $@
- @"$(ICUTOOLS)\makeconv\$(CFG)\makeconv" --small -d"$(TESTDATABLD)" $**
-
-"$(TESTDATABLD)\test3.cnv": "$(TESTDATA)\test3.ucm"
- @echo Building $@
- @"$(ICUTOOLS)\makeconv\$(CFG)\makeconv" --small -d"$(TESTDATABLD)" $**
-
-"$(TESTDATABLD)\test4.cnv": "$(TESTDATA)\test4.ucm"
- @echo Building $@
- @"$(ICUTOOLS)\makeconv\$(CFG)\makeconv" --small -d"$(TESTDATABLD)" $**
-
-"$(TESTDATABLD)\test4x.cnv": "$(TESTDATA)\test4x.ucm"
- @echo Building $@
- @"$(ICUTOOLS)\makeconv\$(CFG)\makeconv" --small -d"$(TESTDATABLD)" $**
-
-"$(TESTDATABLD)\test5.cnv": "$(TESTDATA)\test5.ucm"
- @echo Building $@
- @"$(ICUTOOLS)\makeconv\$(CFG)\makeconv" --small -d"$(TESTDATABLD)" $**
-
-"$(TESTDATABLD)\ibm9027.cnv": "$(TESTDATA)\ibm9027.ucm"
- @echo Building $@
- @"$(ICUTOOLS)\makeconv\$(CFG)\makeconv" --small -d"$(TESTDATABLD)" $**
-
-# Target for test normalization data
-"$(TESTDATABLD)\testnorm.nrm": "$(TESTDATA)\testnorm.txt"
- @echo Building $@
- @"$(ICUTOOLS)\gennorm2\$(CFG)\gennorm2" -s "$(TESTDATA)" testnorm.txt -o $@
+ set PYTHONPATH=$(ICUP)\source\python;%PYTHONPATH%
+ py -3 -B -m icutools.databuilder \
+ --mode windows-exec \
+ --tool_dir "$(ICUTOOLS)" \
+ --tool_cfg "$(CFG)" \
+ --src_dir "$(TESTDATA)" \
+ --tmp_dir "$(TESTDATATMP)" \
+ --out_dir "$(TESTDATABLD)"
+ "$(ICUPBIN)\pkgdata" -f -v -m common -c -p"$(TESTPKG)" -d "$(TESTDATAOUT)" -T "$(TESTDATABLD)" -s "$(TESTDATABLD)" $(TESTDATATMP)\testdata.lst
diff --git a/Build/source/libs/icu/icu-src/source/test/testdata/tstfiles.mk b/Build/source/libs/icu/icu-src/source/test/testdata/tstfiles.mk
deleted file mode 100644
index a8a5d532302..00000000000
--- a/Build/source/libs/icu/icu-src/source/test/testdata/tstfiles.mk
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright (C) 2016 and later: Unicode, Inc. and others.
-# License & terms of use: http://www.unicode.org/copyright.html
-# Copyright (C) 2007-2014, International Business Machines Corporation and others. All Rights Reserved.
-#
-# TEST_RES_SOURCE defines data driven tests and other resource files to be included with
-# the testdata package. For ordinary resource bundles, they only need to be referenced here.
-#
-# Not everything has been moved to this file yet, as this is a new facility.
-#
-
-TEST_RES_SOURCE=calendar.txt format.txt
-
diff --git a/Build/source/libs/icu/icu-src/source/tools/ctestfw/ctest.c b/Build/source/libs/icu/icu-src/source/tools/ctestfw/ctest.c
index 6b0ee9633b2..f0f665428e4 100644
--- a/Build/source/libs/icu/icu-src/source/tools/ctestfw/ctest.c
+++ b/Build/source/libs/icu/icu-src/source/tools/ctestfw/ctest.c
@@ -420,7 +420,7 @@ static void iterateTestsWithLevel ( const TestNode* root,
}
} else {
/* put -- out at 30 sp. */
- int spaces = FLAG_INDENT-(strlen(root->name)+depth);
+ int spaces = FLAG_INDENT - ((int)strlen(root->name) + depth);
if(spaces<0) spaces=0;
log_testinfo(" %*s[OK] ", spaces,"---");
}
@@ -891,18 +891,22 @@ log_data_err(const char* pattern, ...)
static int traceFnNestingDepth = 0;
U_CDECL_BEGIN
static void U_CALLCONV TraceEntry(const void *context, int32_t fnNumber) {
+ (void)context; // suppress compiler warnings about unused variable
char buf[500];
- utrace_format(buf, sizeof(buf), traceFnNestingDepth*3, "%s() enter.\n", utrace_functionName(fnNumber)); buf[sizeof(buf)-1]=0;
+ utrace_format(buf, sizeof(buf), traceFnNestingDepth*3, "%s() enter.\n", utrace_functionName(fnNumber));
+ buf[sizeof(buf)-1]=0;
fputs(buf, stdout);
traceFnNestingDepth++;
}
-static void U_CALLCONV TraceExit(const void *context, int32_t fnNumber, const char *fmt, va_list args) { char buf[500];
-
+static void U_CALLCONV TraceExit(const void *context, int32_t fnNumber, const char *fmt, va_list args) {
+ (void)context; // suppress compiler warnings about unused variable
+ char buf[500];
if (traceFnNestingDepth>0) {
traceFnNestingDepth--;
}
- utrace_format(buf, sizeof(buf), traceFnNestingDepth*3, "%s() ", utrace_functionName(fnNumber)); buf[sizeof(buf)-1]=0;
+ utrace_format(buf, sizeof(buf), traceFnNestingDepth*3, "%s() ", utrace_functionName(fnNumber));
+ buf[sizeof(buf)-1]=0;
fputs(buf, stdout);
utrace_vformat(buf, sizeof(buf), traceFnNestingDepth*3, fmt, args);
buf[sizeof(buf)-1]=0;
@@ -912,6 +916,10 @@ static void U_CALLCONV TraceExit(const void *context, int32_t fnNumber, const ch
static void U_CALLCONV TraceData(const void *context, int32_t fnNumber,
int32_t level, const char *fmt, va_list args) {
+ // suppress compiler warnings about unused variables
+ (void)context;
+ (void)fnNumber;
+ (void)level;
char buf[500];
utrace_vformat(buf, sizeof(buf), traceFnNestingDepth*3, fmt, args);
buf[sizeof(buf)-1]=0;
@@ -920,6 +928,7 @@ static void U_CALLCONV TraceData(const void *context, int32_t fnNumber,
}
static void *U_CALLCONV ctest_libMalloc(const void *context, size_t size) {
+ (void)context; // suppress compiler warnings about unused variable
/*if (VERBOSITY) {
printf("Allocated %ld\n", (long)size);
}*/
@@ -929,6 +938,7 @@ static void *U_CALLCONV ctest_libMalloc(const void *context, size_t size) {
return malloc(size);
}
static void *U_CALLCONV ctest_libRealloc(const void *context, void *mem, size_t size) {
+ (void)context; // suppress compiler warnings about unused variable
/*if (VERBOSITY) {
printf("Reallocated %ld\n", (long)size);
}*/
@@ -939,6 +949,7 @@ static void *U_CALLCONV ctest_libRealloc(const void *context, void *mem, size_t
return realloc(mem, size);
}
static void U_CALLCONV ctest_libFree(const void *context, void *mem) {
+ (void)context; // suppress compiler warnings about unused variable
free(mem);
}
diff --git a/Build/source/libs/icu/icu-src/source/tools/ctestfw/ctestfw.vcxproj b/Build/source/libs/icu/icu-src/source/tools/ctestfw/ctestfw.vcxproj
index baabf4f3814..b3b1895e7de 100644
--- a/Build/source/libs/icu/icu-src/source/tools/ctestfw/ctestfw.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/ctestfw/ctestfw.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{ECA6B435-B4FA-4F9F-BF95-F451D078FC47}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -34,128 +33,59 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\..\..\..\lib\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\..\..\..\lib\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
<!-- Options that are common to *all* project configurations -->
<ItemDefinitionGroup>
+ <Midl>
+ <TypeLibraryName>$(OutDir)/icutest.tlb</TypeLibraryName>
+ </Midl>
<ClCompile>
<AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<DisableLanguageExtensions>true</DisableLanguageExtensions>
<WarningLevel>Level3</WarningLevel>
- </ClCompile>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Midl>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MkTypLibCompatible>true</MkTypLibCompatible>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <TargetEnvironment>Win32</TargetEnvironment>
- <TypeLibraryName>.\..\..\..\lib\icutest.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>.\x86\Release/icutest.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
<CompileAs>Default</CompileAs>
+ <PrecompiledHeaderOutputFile>$(OutDir)/icutest.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)/icutest.pdb</ProgramDataBaseFileName>
</ClCompile>
<Link>
- <OutputFile>..\..\..\bin\icutest63.dll</OutputFile>
- <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\..\..\..\lib\icutest.pdb</ProgramDatabaseFile>
- <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
- <ImportLibrary>.\..\..\..\lib\icutest.lib</ImportLibrary>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Midl>
- <TypeLibraryName>.\..\..\..\lib\icutestd.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x86\Debug/icutest.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
<BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
<Link>
- <OutputFile>..\..\..\bin\icutest63d.dll</OutputFile>
+ <OutputFile>..\..\..\$(IcuBinOutputDir)\icutest65d.exe</OutputFile>
+ <ProgramDatabaseFile>.\..\..\..\$(IcuLibOutputDir)\icutestd.pdb</ProgramDatabaseFile>
+ <ImportLibrary>.\..\..\..\$(IcuLibOutputDir)\icutestd.lib</ImportLibrary>
<AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\..\..\..\lib\icutestd.pdb</ProgramDatabaseFile>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
- <ImportLibrary>.\..\..\..\lib\icutestd.lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Midl>
- <TypeLibraryName>.\..\..\..\lib64\icutest.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
- <WholeProgramOptimization>true</WholeProgramOptimization>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>.\x64\Release/icutest.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- <CompileAs>Default</CompileAs>
</ClCompile>
<Link>
- <OutputFile>..\..\..\bin64\icutest63.dll</OutputFile>
+ <OutputFile>..\..\..\$(IcuBinOutputDir)\icutest65.exe</OutputFile>
+ <ProgramDatabaseFile>.\..\..\..\$(IcuLibOutputDir)\icutest.pdb</ProgramDatabaseFile>
+ <ImportLibrary>.\..\..\..\$(IcuLibOutputDir)\icutest.lib</ImportLibrary>
<AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\..\..\..\lib64\icutest.pdb</ProgramDatabaseFile>
- <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- <ImportLibrary>.\..\..\..\lib64\icutest.lib</ImportLibrary>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Midl>
- <TypeLibraryName>.\..\..\..\lib64\icutestd.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x64\Debug/icutest.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- </ClCompile>
- <Link>
- <OutputFile>..\..\..\bin64\icutest63d.dll</OutputFile>
- <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\..\..\..\lib64\icutestd.pdb</ProgramDatabaseFile>
- <ImportLibrary>.\..\..\..\lib64\icutestd.lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/tools/escapesrc/escapesrc.cpp b/Build/source/libs/icu/icu-src/source/tools/escapesrc/escapesrc.cpp
index c90dafa4e01..ce14022bfc1 100644
--- a/Build/source/libs/icu/icu-src/source/tools/escapesrc/escapesrc.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/escapesrc/escapesrc.cpp
@@ -327,6 +327,9 @@ bool fixLine(int /*no*/, std::string &linestr) {
// start from the end and find all u" cases
size_t pos = len = linestr.size();
+ if(len>INT32_MAX/2) {
+ return true;
+ }
while((pos>0) && (pos = linestr.rfind("u\"", pos)) != std::string::npos) {
//printf("found doublequote at %d\n", pos);
if(fixAt(linestr, pos)) return true;
@@ -391,15 +394,19 @@ int convert(const std::string &infile, const std::string &outfile) {
while( getline( inf, linestr)) {
no++;
if(fixLine(no, linestr)) {
- outf.close();
- fprintf(stderr, "%s:%d: Fixup failed by %s\n", infile.c_str(), no, prog.c_str());
- cleanup(outfile);
- return 1;
+ goto fail;
}
outf << linestr << '\n';
}
- return 0;
+ if(inf.eof()) {
+ return 0;
+ }
+fail:
+ outf.close();
+ fprintf(stderr, "%s:%d: Fixup failed by %s\n", infile.c_str(), no, prog.c_str());
+ cleanup(outfile);
+ return 1;
}
/**
diff --git a/Build/source/libs/icu/icu-src/source/tools/genbrk/genbrk.cpp b/Build/source/libs/icu/icu-src/source/tools/genbrk/genbrk.cpp
index 0a4ec3c9ae6..38df3ee969c 100644
--- a/Build/source/libs/icu/icu-src/source/tools/genbrk/genbrk.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/genbrk/genbrk.cpp
@@ -262,7 +262,7 @@ int main(int argc, char **argv) {
if (status != U_BUFFER_OVERFLOW_ERROR) {
fprintf(stderr, "ucnv_toUChars: ICU Error \"%s\"\n", u_errorName(status));
exit(status);
- };
+ }
status = U_ZERO_ERROR;
UChar *ruleSourceU = new UChar[destCap+1];
@@ -275,7 +275,7 @@ int main(int argc, char **argv) {
if (U_FAILURE(status)) {
fprintf(stderr, "ucnv_toUChars: ICU Error \"%s\"\n", u_errorName(status));
exit(status);
- };
+ }
ucnv_close(conv);
@@ -296,7 +296,7 @@ int main(int argc, char **argv) {
fprintf(stderr, "createRuleBasedBreakIterator: ICU Error \"%s\" at line %d, column %d\n",
u_errorName(status), (int)parseError.line, (int)parseError.offset);
exit(status);
- };
+ }
//
diff --git a/Build/source/libs/icu/icu-src/source/tools/genbrk/genbrk.vcxproj b/Build/source/libs/icu/icu-src/source/tools/genbrk/genbrk.vcxproj
index b8aa0ab6998..dff44bc5e27 100644
--- a/Build/source/libs/icu/icu-src/source/tools/genbrk/genbrk.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/genbrk/genbrk.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{C2BE5000-7501-4E87-9724-B8D82494FAE6}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -34,195 +33,58 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
+ <!-- Options that are common to *all* configurations -->
+ <ItemDefinitionGroup>
<Midl>
- <TypeLibraryName>.\x86\Release/genbrk.tlb</TypeLibraryName>
+ <TypeLibraryName>$(OutDir)/genbrk.tlb</TypeLibraryName>
</Midl>
<ClCompile>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Release/genbrk.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
<WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <DisableLanguageExtensions>false</DisableLanguageExtensions>
+ <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderOutputFile>$(OutDir)/genbrk.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)/genbrk.pdb</ProgramDataBaseFileName>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Release/genbrk.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x86\Release/genbrk.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <OutputFile>$(OutDir)/genbrk.exe</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
+ <Command>copy "$(TargetPath)" ..\..\..\$(IcuBinOutputDir)</Command>
+ <Outputs>..\..\..\$(IcuBinOutputDir)\$(TargetFileName);%(Outputs)</Outputs>
</CustomBuildStep>
- <Midl>
- <TypeLibraryName>.\x86\Debug/genbrk.tlb</TypeLibraryName>
- </Midl>
+ </ItemDefinitionGroup>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Debug/genbrk.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
<BrowseInformation>true</BrowseInformation>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Debug/genbrk.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x86\Debug/genbrk.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Release/genbrk.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Release/genbrk.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x64\Release/genbrk.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x64\Release/genbrk.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Debug/genbrk.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Debug/genbrk.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
- </ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
- <Link>
- <OutputFile>.\x64\Debug/genbrk.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x64\Debug/genbrk.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/tools/genccode/genccode.c b/Build/source/libs/icu/icu-src/source/tools/genccode/genccode.c
index d35b5890105..91e94d7f518 100644
--- a/Build/source/libs/icu/icu-src/source/tools/genccode/genccode.c
+++ b/Build/source/libs/icu/icu-src/source/tools/genccode/genccode.c
@@ -63,6 +63,7 @@ enum {
kOptHelpH = 0,
kOptHelpQuestionMark,
kOptDestDir,
+ kOptQuiet,
kOptName,
kOptEntryPoint,
#ifdef CAN_GENERATE_OBJECTS
@@ -77,6 +78,7 @@ static UOption options[]={
/*0*/UOPTION_HELP_H,
UOPTION_HELP_QUESTION_MARK,
UOPTION_DESTDIR,
+ UOPTION_QUIET,
UOPTION_DEF("name", 'n', UOPT_REQUIRES_ARG),
UOPTION_DEF("entrypoint", 'e', UOPT_REQUIRES_ARG),
#ifdef CAN_GENERATE_OBJECTS
@@ -116,6 +118,7 @@ main(int argc, char* argv[]) {
"options:\n"
"\t-h or -? or --help this usage text\n"
"\t-d or --destdir destination directory, followed by the path\n"
+ "\t-q or --quiet do not display warnings and progress\n"
"\t-n or --name symbol prefix, followed by the prefix\n"
"\t-e or --entrypoint entry point name, followed by the name (_dat will be appended)\n"
"\t-r or --revision Specify a version\n"
@@ -159,6 +162,9 @@ main(int argc, char* argv[]) {
writeCode = CALL_WRITECCODE;
/* TODO: remove writeCode=&writeCCode; */
}
+ if (options[kOptQuiet].doesOccur) {
+ verbose = FALSE;
+ }
while(--argc) {
filename=getLongPathname(argv[argc]);
if (verbose) {
@@ -170,13 +176,15 @@ main(int argc, char* argv[]) {
writeCCode(filename, options[kOptDestDir].value,
options[kOptName].doesOccur ? options[kOptName].value : NULL,
options[kOptFilename].doesOccur ? options[kOptFilename].value : NULL,
- NULL);
+ NULL,
+ 0);
break;
case CALL_WRITEASSEMBLY:
writeAssemblyCode(filename, options[kOptDestDir].value,
options[kOptEntryPoint].doesOccur ? options[kOptEntryPoint].value : NULL,
options[kOptFilename].doesOccur ? options[kOptFilename].value : NULL,
- NULL);
+ NULL,
+ 0);
break;
#ifdef CAN_GENERATE_OBJECTS
case CALL_WRITEOBJECT:
@@ -184,7 +192,8 @@ main(int argc, char* argv[]) {
options[kOptEntryPoint].doesOccur ? options[kOptEntryPoint].value : NULL,
options[kOptMatchArch].doesOccur ? options[kOptMatchArch].value : NULL,
options[kOptFilename].doesOccur ? options[kOptFilename].value : NULL,
- NULL);
+ NULL,
+ 0);
break;
#endif
default:
diff --git a/Build/source/libs/icu/icu-src/source/tools/genccode/genccode.vcxproj b/Build/source/libs/icu/icu-src/source/tools/genccode/genccode.vcxproj
index e7dc0e535c8..f3195147b15 100644
--- a/Build/source/libs/icu/icu-src/source/tools/genccode/genccode.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/genccode/genccode.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -34,191 +33,58 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
+ <!-- Options that are common to *all* configurations -->
+ <ItemDefinitionGroup>
<Midl>
- <TypeLibraryName>.\x86\Release/genccode.tlb</TypeLibraryName>
+ <TypeLibraryName>$(OutDir)/genccode.tlb</TypeLibraryName>
</Midl>
<ClCompile>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Release/genccode.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
<WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <DisableLanguageExtensions>false</DisableLanguageExtensions>
+ <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderOutputFile>$(OutDir)/genccode.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)/genccode.pdb</ProgramDataBaseFileName>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Release/genccode.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x86\Release/genccode.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <OutputFile>$(OutDir)/genccode.exe</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
+ <Command>copy "$(TargetPath)" ..\..\..\$(IcuBinOutputDir)</Command>
+ <Outputs>..\..\..\$(IcuBinOutputDir)\$(TargetFileName);%(Outputs)</Outputs>
</CustomBuildStep>
- <Midl>
- <TypeLibraryName>.\x86\Debug/genccode.tlb</TypeLibraryName>
- </Midl>
+ </ItemDefinitionGroup>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Debug/genccode.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
<BrowseInformation>true</BrowseInformation>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Debug/genccode.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x86\Debug/genccode.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Release/genccode.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Release/genccode.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x64\Release/genccode.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x64\Release/genccode.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Debug/genccode.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Debug/genccode.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
- </ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
- <Link>
- <OutputFile>.\x64\Debug/genccode.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x64\Debug/genccode.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/tools/gencfu/gencfu.cpp b/Build/source/libs/icu/icu-src/source/tools/gencfu/gencfu.cpp
index 1ac9ad3fd8a..9bc62bdc8e9 100644
--- a/Build/source/libs/icu/icu-src/source/tools/gencfu/gencfu.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/gencfu/gencfu.cpp
@@ -236,7 +236,7 @@ int main(int argc, char **argv) {
fprintf(stderr, "gencfu: uspoof_openFromSource error \"%s\" at file %s, line %d, column %d\n",
u_errorName(status), confFileName, (int)parseError.line, (int)parseError.offset);
exit(status);
- };
+ }
//
diff --git a/Build/source/libs/icu/icu-src/source/tools/gencfu/gencfu.vcxproj b/Build/source/libs/icu/icu-src/source/tools/gencfu/gencfu.vcxproj
index fbae8f54fdc..0627f02210d 100644
--- a/Build/source/libs/icu/icu-src/source/tools/gencfu/gencfu.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/gencfu/gencfu.vcxproj
@@ -1,18 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}</ProjectGuid>
- <Keyword>Win32Proj</Keyword>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -35,175 +33,58 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
+ <!-- Options that are common to *all* configurations -->
+ <ItemDefinitionGroup>
+ <Midl>
+ <TypeLibraryName>$(OutDir)\gencfu.tlb</TypeLibraryName>
+ </Midl>
<ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\common;..\..\i18n;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>false</MinimalRebuild>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
<WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
<CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <DisableLanguageExtensions>false</DisableLanguageExtensions>
+ <AdditionalIncludeDirectories>..\..\common;..\..\i18n;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderOutputFile>$(OutDir)\gencfu.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)\gencfu.pdb</ProgramDataBaseFileName>
</ClCompile>
<Link>
- <OutputFile>.\x86\Debug\gencfu.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuucd.lib;icuind.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Console</SubSystem>
+ <OutputFile>$(OutDir)\gencfu.exe</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
+ <Command>copy "$(TargetPath)" ..\..\..\$(IcuBinOutputDir)</Command>
+ <Outputs>..\..\..\$(IcuBinOutputDir)\$(TargetFileName);%(Outputs)</Outputs>
</CustomBuildStep>
+ </ItemDefinitionGroup>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <AdditionalIncludeDirectories>..\..\common;..\..\i18n;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
- <MinimalRebuild>false</MinimalRebuild>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <BrowseInformation>true</BrowseInformation>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
<Link>
- <OutputFile>.\x86\Release\gencfu.exe</OutputFile>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuuc.lib;icuin.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <AdditionalDependencies>icuucd.lib;icuind.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64%3b</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Release/gencfu.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
- <AdditionalIncludeDirectories>..\..\common;..\..\i18n;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Release/gencfu.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x64\Release/gencfu.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuuc.lib;icuin.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x64\Release/gencfu.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64%3b</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Debug/gencfu.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\common;..\..\i18n;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Debug/gencfu.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
- </ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
- <Link>
- <OutputFile>.\x64\Debug/gencfu.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuucd.lib;icuind.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x64\Debug/gencfu.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/tools/gencmn/gencmn.vcxproj b/Build/source/libs/icu/icu-src/source/tools/gencmn/gencmn.vcxproj
index 87aeef33621..dffc4199932 100644
--- a/Build/source/libs/icu/icu-src/source/tools/gencmn/gencmn.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/gencmn/gencmn.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -34,195 +33,58 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
+ <!-- Options that are common to *all* configurations -->
+ <ItemDefinitionGroup>
<Midl>
- <TypeLibraryName>.\x86\Release/gencmn.tlb</TypeLibraryName>
+ <TypeLibraryName>$(OutDir)/gencmn.tlb</TypeLibraryName>
</Midl>
<ClCompile>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Release/gencmn.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
<WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <DisableLanguageExtensions>true</DisableLanguageExtensions>
+ <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderOutputFile>$(OutDir)/gencmn.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)/gencmn.pdb</ProgramDataBaseFileName>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Release/gencmn.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x86\Release/gencmn.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <OutputFile>$(OutDir)/gencmn.exe</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
+ <Command>copy "$(TargetPath)" ..\..\..\$(IcuBinOutputDir)</Command>
+ <Outputs>..\..\..\$(IcuBinOutputDir)\$(TargetFileName);%(Outputs)</Outputs>
</CustomBuildStep>
- <Midl>
- <TypeLibraryName>.\x86\Debug/gencmn.tlb</TypeLibraryName>
- </Midl>
+ </ItemDefinitionGroup>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Debug/gencmn.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
<BrowseInformation>true</BrowseInformation>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Debug/gencmn.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x86\Debug/gencmn.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Release/gencmn.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Release/gencmn.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x64\Release/gencmn.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x64\Release/gencmn.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Debug/gencmn.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Debug/gencmn.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
- </ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
- <Link>
- <OutputFile>.\x64\Debug/gencmn.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x64\Debug/gencmn.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/tools/gencnval/gencnval.c b/Build/source/libs/icu/icu-src/source/tools/gencnval/gencnval.c
index 04ad747e077..82cf65d6a3a 100644
--- a/Build/source/libs/icu/icu-src/source/tools/gencnval/gencnval.c
+++ b/Build/source/libs/icu/icu-src/source/tools/gencnval/gencnval.c
@@ -263,23 +263,22 @@ main(int argc, char* argv[]) {
quiet = TRUE;
}
- if(argc>=2) {
- path=argv[1];
+ if (argc >= 2) {
+ path = argv[1];
} else {
- path=options[SOURCEDIR].value;
- if(path!=NULL && *path!=0) {
- char *end;
-
- uprv_strcpy(pathBuf, path);
- end = uprv_strchr(pathBuf, 0);
- if(*(end-1)!=U_FILE_SEP_CHAR) {
- *(end++)=U_FILE_SEP_CHAR;
- }
- uprv_strcpy(end, "convrtrs.txt");
- path=pathBuf;
- } else {
- path = "convrtrs.txt";
+ path = "convrtrs.txt";
+ }
+
+ const char* sourcedir = options[SOURCEDIR].value;
+ if (sourcedir != NULL && *sourcedir != 0) {
+ char *end;
+ uprv_strcpy(pathBuf, sourcedir);
+ end = uprv_strchr(pathBuf, 0);
+ if(*(end-1)!=U_FILE_SEP_CHAR) {
+ *(end++)=U_FILE_SEP_CHAR;
}
+ uprv_strcpy(end, path);
+ path = pathBuf;
}
uprv_memset(stringStore, 0, sizeof(stringStore));
@@ -583,6 +582,7 @@ addTaggedAlias(uint16_t tag, const char *alias, uint16_t converter) {
static void
addOfficialTaggedStandards(char *line, int32_t lineLen) {
+ (void) lineLen; // suppress compiler warnings about unused variable
char *atag;
char *endTagExp;
char *tag;
@@ -854,62 +854,64 @@ resolveAliases(uint16_t *uniqueAliasArr, uint16_t *uniqueAliasToConverterArr, ui
uint16_t currConvNum, oldConvNum;
const char *lastName;
- resolveAliasToConverter(knownAliases[0], &oldTagNum, &currConvNum);
- uniqueAliasToConverterArr[uniqueAliasIdx] = currConvNum;
- oldConvNum = currConvNum;
- uniqueAliasArr[uniqueAliasIdx] = knownAliases[0] + aliasOffset;
- uniqueAliasIdx++;
- lastName = GET_ALIAS_STR(knownAliases[0]);
-
- for (idx = 1; idx < knownAliasesCount; idx++) {
- resolveAliasToConverter(knownAliases[idx], &currTagNum, &currConvNum);
- if (ucnv_compareNames(lastName, GET_ALIAS_STR(knownAliases[idx])) == 0) {
- /* duplicate found */
- if ((currTagNum < oldTagNum && currTagNum >= UCNV_NUM_RESERVED_TAGS)
- || oldTagNum == 0) {
- oldTagNum = currTagNum;
- uniqueAliasToConverterArr[uniqueAliasIdx - 1] = currConvNum;
- uniqueAliasArr[uniqueAliasIdx - 1] = knownAliases[idx] + aliasOffset;
- if (verbose) {
- printf("using %s instead of %s -> %s",
- GET_ALIAS_STR(knownAliases[idx]),
- lastName,
- GET_ALIAS_STR(converters[currConvNum].converter));
- if (oldConvNum != currConvNum) {
- printf(" (alias conflict)");
- }
- puts("");
- }
- }
- else {
- /* else ignore it */
- if (verbose) {
- printf("folding %s into %s -> %s",
- GET_ALIAS_STR(knownAliases[idx]),
- lastName,
- GET_ALIAS_STR(converters[oldConvNum].converter));
- if (oldConvNum != currConvNum) {
- printf(" (alias conflict)");
- }
- puts("");
- }
- }
- if (oldConvNum != currConvNum) {
- uniqueAliasToConverterArr[uniqueAliasIdx - 1] |= UCNV_AMBIGUOUS_ALIAS_MAP_BIT;
- }
- }
- else {
- uniqueAliasToConverterArr[uniqueAliasIdx] = currConvNum;
- oldConvNum = currConvNum;
- uniqueAliasArr[uniqueAliasIdx] = knownAliases[idx] + aliasOffset;
- uniqueAliasIdx++;
- lastName = GET_ALIAS_STR(knownAliases[idx]);
- oldTagNum = currTagNum;
- /*printf("%s -> %s\n", GET_ALIAS_STR(knownAliases[idx]), GET_ALIAS_STR(converters[currConvNum].converter));*/
- }
- if (uprv_strchr(GET_ALIAS_STR(converters[currConvNum].converter), UCNV_OPTION_SEP_CHAR) != NULL) {
- uniqueAliasToConverterArr[uniqueAliasIdx-1] |= UCNV_CONTAINS_OPTION_BIT;
- }
+ if (knownAliasesCount != 0) {
+ resolveAliasToConverter(knownAliases[0], &oldTagNum, &currConvNum);
+ uniqueAliasToConverterArr[uniqueAliasIdx] = currConvNum;
+ oldConvNum = currConvNum;
+ uniqueAliasArr[uniqueAliasIdx] = knownAliases[0] + aliasOffset;
+ uniqueAliasIdx++;
+ lastName = GET_ALIAS_STR(knownAliases[0]);
+
+ for (idx = 1; idx < knownAliasesCount; idx++) {
+ resolveAliasToConverter(knownAliases[idx], &currTagNum, &currConvNum);
+ if (ucnv_compareNames(lastName, GET_ALIAS_STR(knownAliases[idx])) == 0) {
+ /* duplicate found */
+ if ((currTagNum < oldTagNum && currTagNum >= UCNV_NUM_RESERVED_TAGS)
+ || oldTagNum == 0) {
+ oldTagNum = currTagNum;
+ uniqueAliasToConverterArr[uniqueAliasIdx - 1] = currConvNum;
+ uniqueAliasArr[uniqueAliasIdx - 1] = knownAliases[idx] + aliasOffset;
+ if (verbose) {
+ printf("using %s instead of %s -> %s",
+ GET_ALIAS_STR(knownAliases[idx]),
+ lastName,
+ GET_ALIAS_STR(converters[currConvNum].converter));
+ if (oldConvNum != currConvNum) {
+ printf(" (alias conflict)");
+ }
+ puts("");
+ }
+ }
+ else {
+ /* else ignore it */
+ if (verbose) {
+ printf("folding %s into %s -> %s",
+ GET_ALIAS_STR(knownAliases[idx]),
+ lastName,
+ GET_ALIAS_STR(converters[oldConvNum].converter));
+ if (oldConvNum != currConvNum) {
+ printf(" (alias conflict)");
+ }
+ puts("");
+ }
+ }
+ if (oldConvNum != currConvNum) {
+ uniqueAliasToConverterArr[uniqueAliasIdx - 1] |= UCNV_AMBIGUOUS_ALIAS_MAP_BIT;
+ }
+ }
+ else {
+ uniqueAliasToConverterArr[uniqueAliasIdx] = currConvNum;
+ oldConvNum = currConvNum;
+ uniqueAliasArr[uniqueAliasIdx] = knownAliases[idx] + aliasOffset;
+ uniqueAliasIdx++;
+ lastName = GET_ALIAS_STR(knownAliases[idx]);
+ oldTagNum = currTagNum;
+ /*printf("%s -> %s\n", GET_ALIAS_STR(knownAliases[idx]), GET_ALIAS_STR(converters[currConvNum].converter));*/
+ }
+ if (uprv_strchr(GET_ALIAS_STR(converters[currConvNum].converter), UCNV_OPTION_SEP_CHAR) != NULL) {
+ uniqueAliasToConverterArr[uniqueAliasIdx-1] |= UCNV_CONTAINS_OPTION_BIT;
+ }
+ }
}
return uniqueAliasIdx;
}
diff --git a/Build/source/libs/icu/icu-src/source/tools/gencnval/gencnval.vcxproj b/Build/source/libs/icu/icu-src/source/tools/gencnval/gencnval.vcxproj
index d2becad2b90..57b5f95f881 100644
--- a/Build/source/libs/icu/icu-src/source/tools/gencnval/gencnval.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/gencnval/gencnval.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{8B41752B-5A52-41E4-B7E0-07921C0CC6BF}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -34,195 +33,58 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
+ <!-- Options that are common to *all* configurations -->
+ <ItemDefinitionGroup>
<Midl>
- <TypeLibraryName>.\x86\Release/gencnval.tlb</TypeLibraryName>
+ <TypeLibraryName>$(OutDir)/gencnval.tlb</TypeLibraryName>
</Midl>
<ClCompile>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Release/gencnval.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
<WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <DisableLanguageExtensions>false</DisableLanguageExtensions>
+ <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderOutputFile>$(OutDir)/gencnval.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)/gencnval.pdb</ProgramDataBaseFileName>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Release/gencnval.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x86\Release/gencnval.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <OutputFile>$(OutDir)/gencnval.exe</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
+ <Command>copy "$(TargetPath)" ..\..\..\$(IcuBinOutputDir)</Command>
+ <Outputs>..\..\..\$(IcuBinOutputDir)\$(TargetFileName);%(Outputs)</Outputs>
</CustomBuildStep>
- <Midl>
- <TypeLibraryName>.\x86\Debug/gencnval.tlb</TypeLibraryName>
- </Midl>
+ </ItemDefinitionGroup>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Debug/gencnval.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
<BrowseInformation>true</BrowseInformation>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Debug/gencnval.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x86\Debug/gencnval.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Release/gencnval.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Release/gencnval.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x64\Release/gencnval.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x64\Release/gencnval.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Debug/gencnval.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Debug/gencnval.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
- </ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
- <Link>
- <OutputFile>.\x64\Debug/gencnval.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x64\Debug/gencnval.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/tools/gendict/gendict.vcxproj b/Build/source/libs/icu/icu-src/source/tools/gendict/gendict.vcxproj
index a419abb475e..4f369567ba1 100644
--- a/Build/source/libs/icu/icu-src/source/tools/gendict/gendict.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/gendict/gendict.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{9D4211F7-2C77-439C-82F0-30A4E43BA569}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -34,195 +33,58 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
+ <!-- Options that are common to *all* configurations -->
+ <ItemDefinitionGroup>
<Midl>
- <TypeLibraryName>.\x86\Release/gendict.tlb</TypeLibraryName>
+ <TypeLibraryName>$(OutDir)\gendict.tlb</TypeLibraryName>
</Midl>
<ClCompile>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Release/gendict.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
<WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <DisableLanguageExtensions>true</DisableLanguageExtensions>
+ <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderOutputFile>$(OutDir)\gendict.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)\gendict.pdb</ProgramDataBaseFileName>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Release/gendict.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x86\Release/gendict.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <OutputFile>$(OutDir)\gendict.exe</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
+ <Command>copy "$(TargetPath)" ..\..\..\$(IcuBinOutputDir)</Command>
+ <Outputs>..\..\..\$(IcuBinOutputDir)\$(TargetFileName);%(Outputs)</Outputs>
</CustomBuildStep>
- <Midl>
- <TypeLibraryName>.\x86\Debug/gendict.tlb</TypeLibraryName>
- </Midl>
+ </ItemDefinitionGroup>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Debug/gendict.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
<BrowseInformation>true</BrowseInformation>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Debug/gendict.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x86\Debug/gendict.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Release/gendict.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Release/gendict.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x64\Release/gendict.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x64\Release/gendict.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Debug/gendict.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Debug/gendict.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
- </ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
- <Link>
- <OutputFile>.\x64\Debug/gendict.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x64\Debug/gendict.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/tools/gennorm2/gennorm2.vcxproj b/Build/source/libs/icu/icu-src/source/tools/gennorm2/gennorm2.vcxproj
index ec408e27695..2f41299098b 100644
--- a/Build/source/libs/icu/icu-src/source/tools/gennorm2/gennorm2.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/gennorm2/gennorm2.vcxproj
@@ -1,14 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{C7891A65-80AB-4245-912E-5F1E17B0E6C4}</ProjectGuid>
<RootNamespace>gennorm2</RootNamespace>
- <Keyword>Win32Proj</Keyword>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
@@ -16,6 +11,9 @@
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -34,145 +32,58 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
- <!-- Options that are common to *all* project configurations -->
+ <!-- Options that are common to *all* configurations -->
<ItemDefinitionGroup>
+ <Midl>
+ <TypeLibraryName>$(OutDir)\gennorm2.tlb</TypeLibraryName>
+ </Midl>
<ClCompile>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
<WarningLevel>Level3</WarningLevel>
- </ClCompile>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <ClCompile>
- <Optimization>MaxSpeed</Optimization>
- <IntrinsicFunctions>true</IntrinsicFunctions>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>.\x86\Release\gennorm2.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release\</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release\</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release\</ProgramDataBaseFileName>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<CompileAs>Default</CompileAs>
+ <DisableLanguageExtensions>false</DisableLanguageExtensions>
+ <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderOutputFile>$(OutDir)\gennorm2.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)\gennorm2.pdb</ProgramDataBaseFileName>
</ClCompile>
<Link>
- <OutputFile>.\x86\Release\gennorm2.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x86\Release\gennorm2.pdb</ProgramDatabaseFile>
- <GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Console</SubSystem>
- <OptimizeReferences>true</OptimizeReferences>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <TargetMachine>MachineX86</TargetMachine>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>false</DataExecutionPrevention>
+ <OutputFile>$(OutDir)\gennorm2.exe</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
+ <Command>copy "$(TargetPath)" ..\..\..\$(IcuBinOutputDir)</Command>
+ <Outputs>..\..\..\$(IcuBinOutputDir)\$(TargetFileName);%(Outputs)</Outputs>
</CustomBuildStep>
+ </ItemDefinitionGroup>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <IntrinsicFunctions>true</IntrinsicFunctions>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x86\Debug\gennorm2.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug\</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug\</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug\</ProgramDataBaseFileName>
<BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
<Link>
- <OutputFile>.\x86\Debug\gennorm2.exe</OutputFile>
<AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x86\Debug\gennorm2.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>false</DataExecutionPrevention>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
- <Optimization>MaxSpeed</Optimization>
- <IntrinsicFunctions>true</IntrinsicFunctions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>.\x64\Release\gennorm2.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release\</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release\</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release\</ProgramDataBaseFileName>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
</ClCompile>
<Link>
- <OutputFile>.\x64\Release\gennorm2.exe</OutputFile>
<AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x64\Release\gennorm2.pdb</ProgramDatabaseFile>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <SubSystem>Console</SubSystem>
- <OptimizeReferences>true</OptimizeReferences>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>false</DataExecutionPrevention>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <ClCompile>
- <IntrinsicFunctions>true</IntrinsicFunctions>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x64\Debug\gennorm2.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug\</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug\</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug\</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- </ClCompile>
- <Link>
- <OutputFile>.\x64\Debug\gennorm2.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x64\Debug\gennorm2.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>false</DataExecutionPrevention>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/tools/genrb/Makefile.in b/Build/source/libs/icu/icu-src/source/tools/genrb/Makefile.in
index 7e2360b64ec..5e75725ec24 100644
--- a/Build/source/libs/icu/icu-src/source/tools/genrb/Makefile.in
+++ b/Build/source/libs/icu/icu-src/source/tools/genrb/Makefile.in
@@ -38,7 +38,7 @@ CPPFLAGS += -DUNISTR_FROM_CHAR_EXPLICIT=explicit -DUNISTR_FROM_STRING_EXPLICIT=e
LIBS = $(LIBICUTOOLUTIL) $(LIBICUI18N) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M)
OBJECTS = errmsg.o genrb.o parse.o read.o reslist.o ustr.o rbutil.o \
-wrtjava.o rle.o wrtxml.o prscmnts.o
+wrtjava.o rle.o wrtxml.o prscmnts.o filterrb.o
DERB_OBJ = derb.o
DEPS = $(OBJECTS:.o=.d)
diff --git a/Build/source/libs/icu/icu-src/source/tools/genrb/derb.cpp b/Build/source/libs/icu/icu-src/source/tools/genrb/derb.cpp
index ac26d95be4c..997b4001295 100644
--- a/Build/source/libs/icu/icu-src/source/tools/genrb/derb.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/genrb/derb.cpp
@@ -631,7 +631,7 @@ static const char *getEncodingName(const char *encoding) {
if (!(enc = ucnv_getStandardName(encoding, "MIME", &err))) {
err = U_ZERO_ERROR;
if (!(enc = ucnv_getStandardName(encoding, "IANA", &err))) {
- ;
+ // do nothing
}
}
diff --git a/Build/source/libs/icu/icu-src/source/tools/genrb/derb.vcxproj b/Build/source/libs/icu/icu-src/source/tools/genrb/derb.vcxproj
index d76c3d27def..43edf4c96ef 100644
--- a/Build/source/libs/icu/icu-src/source/tools/genrb/derb.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/genrb/derb.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{D3065ADB-8820-4CC7-9B6C-9510833961A3}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -34,207 +33,58 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release_derb\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release_derb\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug_derb\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug_derb\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release_derb\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release_derb\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug_derb\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug_derb\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
+ <!-- Options that are common to *all* configurations -->
+ <ItemDefinitionGroup>
<Midl>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MkTypLibCompatible>true</MkTypLibCompatible>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <TargetEnvironment>Win32</TargetEnvironment>
- <TypeLibraryName>.\x86\Release_derb/derb.tlb</TypeLibraryName>
+ <TypeLibraryName>$(OutDir)/derb.tlb</TypeLibraryName>
</Midl>
<ClCompile>
- <AdditionalIncludeDirectories>..\..\i18n;..\..\common;..\toolutil;..\..\io;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Release_derb/derb.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release_derb/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release_derb/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release_derb/</ProgramDataBaseFileName>
<WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <DisableLanguageExtensions>true</DisableLanguageExtensions>
+ <AdditionalIncludeDirectories>..\..\i18n;..\..\common;..\toolutil;..\..\io;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderOutputFile>$(OutDir)/derb.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)/derb.pdb</ProgramDataBaseFileName>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Release_derb/derb.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuuc.lib;icuin.lib;icuio.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x86\Release_derb/derb.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <OutputFile>$(OutDir)/derb.exe</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
+ <Command>copy "$(TargetPath)" ..\..\..\$(IcuBinOutputDir)</Command>
+ <Outputs>..\..\..\$(IcuBinOutputDir)\$(TargetFileName);%(Outputs)</Outputs>
</CustomBuildStep>
- <Midl>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MkTypLibCompatible>true</MkTypLibCompatible>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <TargetEnvironment>Win32</TargetEnvironment>
- <TypeLibraryName>.\x86\Debug_derb/derb.tlb</TypeLibraryName>
- </Midl>
+ </ItemDefinitionGroup>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\i18n;..\..\common;..\toolutil;..\..\io;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <BrowseInformation>true</BrowseInformation>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Debug_derb/derb.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug_derb/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug_derb/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug_derb/</ProgramDataBaseFileName>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Debug_derb/derb.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuucd.lib;icuind.lib;icuiod.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x86\Debug_derb/derb.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MkTypLibCompatible>true</MkTypLibCompatible>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Release_derb/derb.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
- <AdditionalIncludeDirectories>..\..\i18n;..\..\common;..\toolutil;..\..\io;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Release_derb/derb.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release_derb/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release_derb/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release_derb/</ProgramDataBaseFileName>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x64\Release_derb/derb.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuuc.lib;icuin.lib;icuio.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x64\Release_derb/derb.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MkTypLibCompatible>true</MkTypLibCompatible>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Debug_derb/derb.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\i18n;..\..\common;..\toolutil;..\..\io;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Debug_derb/derb.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug_derb/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug_derb/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug_derb/</ProgramDataBaseFileName>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
- </ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
- <Link>
- <OutputFile>.\x64\Debug_derb/derb.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuucd.lib;icuind.lib;icuiod.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x64\Debug_derb/derb.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/tools/genrb/filterrb.cpp b/Build/source/libs/icu/icu-src/source/tools/genrb/filterrb.cpp
new file mode 100644
index 00000000000..dcc02fc6210
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/tools/genrb/filterrb.cpp
@@ -0,0 +1,239 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include <iostream>
+#include <stack>
+
+#include "filterrb.h"
+#include "errmsg.h"
+
+
+const char* PathFilter::kEInclusionNames[] = {
+ "INCLUDE",
+ "PARTIAL",
+ "EXCLUDE"
+};
+
+
+ResKeyPath::ResKeyPath() {}
+
+ResKeyPath::ResKeyPath(const std::string& path, UErrorCode& status) {
+ if (path.empty() || path[0] != '/') {
+ std::cerr << "genrb error: path must start with /: " << path << std::endl;
+ status = U_PARSE_ERROR;
+ return;
+ }
+ if (path.length() == 1) {
+ return;
+ }
+ size_t i;
+ size_t j = 0;
+ while (true) {
+ i = j + 1;
+ j = path.find('/', i);
+ std::string key = path.substr(i, j - i);
+ if (key.empty()) {
+ std::cerr << "genrb error: empty subpaths and trailing slashes are not allowed: " << path << std::endl;
+ status = U_PARSE_ERROR;
+ return;
+ }
+ push(key);
+ if (j == std::string::npos) {
+ break;
+ }
+ }
+}
+
+void ResKeyPath::push(const std::string& key) {
+ fPath.push_back(key);
+}
+
+void ResKeyPath::pop() {
+ fPath.pop_back();
+}
+
+const std::list<std::string>& ResKeyPath::pieces() const {
+ return fPath;
+}
+
+std::ostream& operator<<(std::ostream& out, const ResKeyPath& value) {
+ if (value.pieces().empty()) {
+ out << "/";
+ } else for (auto& key : value.pieces()) {
+ out << "/" << key;
+ }
+ return out;
+}
+
+
+PathFilter::~PathFilter() = default;
+
+
+void SimpleRuleBasedPathFilter::addRule(const std::string& ruleLine, UErrorCode& status) {
+ if (ruleLine.empty()) {
+ std::cerr << "genrb error: empty filter rules are not allowed" << std::endl;
+ status = U_PARSE_ERROR;
+ return;
+ }
+ bool inclusionRule = false;
+ if (ruleLine[0] == '+') {
+ inclusionRule = true;
+ } else if (ruleLine[0] != '-') {
+ std::cerr << "genrb error: rules must start with + or -: " << ruleLine << std::endl;
+ status = U_PARSE_ERROR;
+ return;
+ }
+ ResKeyPath path(ruleLine.substr(1), status);
+ addRule(path, inclusionRule, status);
+}
+
+void SimpleRuleBasedPathFilter::addRule(const ResKeyPath& path, bool inclusionRule, UErrorCode& status) {
+ if (U_FAILURE(status)) {
+ return;
+ }
+ fRoot.applyRule(path, path.pieces().begin(), inclusionRule, status);
+}
+
+PathFilter::EInclusion SimpleRuleBasedPathFilter::match(const ResKeyPath& path) const {
+ const Tree* node = &fRoot;
+
+ // defaultResult "bubbles up" the nearest "definite" inclusion/exclusion rule
+ EInclusion defaultResult = INCLUDE;
+ if (node->fIncluded != PARTIAL) {
+ // rules handled here: "+/" and "-/"
+ defaultResult = node->fIncluded;
+ }
+
+ // isLeaf is whether the filter tree can provide no additional information
+ // even if additional subpaths are added to the given key
+ bool isLeaf = false;
+
+ for (auto& key : path.pieces()) {
+ auto child = node->fChildren.find(key);
+ // Leaf case 1: input path descends outside the filter tree
+ if (child == node->fChildren.end()) {
+ if (node->fWildcard) {
+ // A wildcard pattern is present; continue checking
+ node = node->fWildcard.get();
+ } else {
+ isLeaf = true;
+ break;
+ }
+ } else {
+ node = &child->second;
+ }
+ if (node->fIncluded != PARTIAL) {
+ defaultResult = node->fIncluded;
+ }
+ }
+
+ // Leaf case 2: input path exactly matches a filter leaf
+ if (node->isLeaf()) {
+ isLeaf = true;
+ }
+
+ // Always return PARTIAL if we are not at a leaf
+ if (!isLeaf) {
+ return PARTIAL;
+ }
+
+ // If leaf node is PARTIAL, return the default
+ if (node->fIncluded == PARTIAL) {
+ return defaultResult;
+ }
+
+ return node->fIncluded;
+}
+
+
+SimpleRuleBasedPathFilter::Tree::Tree(const Tree& other)
+ : fIncluded(other.fIncluded), fChildren(other.fChildren) {
+ // Note: can't use the default copy assignment because of the std::unique_ptr
+ if (other.fWildcard) {
+ fWildcard.reset(new Tree(*other.fWildcard));
+ }
+}
+
+bool SimpleRuleBasedPathFilter::Tree::isLeaf() const {
+ return fChildren.empty() && !fWildcard;
+}
+
+void SimpleRuleBasedPathFilter::Tree::applyRule(
+ const ResKeyPath& path,
+ std::list<std::string>::const_iterator it,
+ bool inclusionRule,
+ UErrorCode& status) {
+
+ // Base Case
+ if (it == path.pieces().end()) {
+ if (isVerbose() && (fIncluded != PARTIAL || !isLeaf())) {
+ std::cout << "genrb info: rule on path " << path
+ << " overrides previous rules" << std::endl;
+ }
+ fIncluded = inclusionRule ? INCLUDE : EXCLUDE;
+ fChildren.clear();
+ fWildcard.reset();
+ return;
+ }
+
+ // Recursive Step
+ auto& key = *it;
+ if (key == "*") {
+ // Case 1: Wildcard
+ if (!fWildcard) {
+ fWildcard.reset(new Tree());
+ }
+ // Apply the rule to fWildcard and also to all existing children.
+ it++;
+ fWildcard->applyRule(path, it, inclusionRule, status);
+ for (auto& child : fChildren) {
+ child.second.applyRule(path, it, inclusionRule, status);
+ }
+ it--;
+
+ } else {
+ // Case 2: Normal Key
+ auto search = fChildren.find(key);
+ if (search == fChildren.end()) {
+ if (fWildcard) {
+ // Deep-copy the existing wildcard tree into the new key
+ search = fChildren.emplace(key, Tree(*fWildcard)).first;
+ } else {
+ search = fChildren.emplace(key, Tree()).first;
+ }
+ }
+ it++;
+ search->second.applyRule(path, it, inclusionRule, status);
+ it--;
+ }
+}
+
+void SimpleRuleBasedPathFilter::Tree::print(std::ostream& out, int32_t indent) const {
+ for (int32_t i=0; i<indent; i++) out << "\t";
+ out << "included: " << kEInclusionNames[fIncluded] << std::endl;
+ for (auto& child : fChildren) {
+ for (int32_t i=0; i<indent; i++) out << "\t";
+ out << child.first << ": {" << std::endl;
+ child.second.print(out, indent + 1);
+ for (int32_t i=0; i<indent; i++) out << "\t";
+ out << "}" << std::endl;
+ }
+ if (fWildcard) {
+ for (int32_t i=0; i<indent; i++) out << "\t";
+ out << "* {" << std::endl;
+ fWildcard->print(out, indent + 1);
+ for (int32_t i=0; i<indent; i++) out << "\t";
+ out << "}" << std::endl;
+ }
+}
+
+void SimpleRuleBasedPathFilter::print(std::ostream& out) const {
+ out << "SimpleRuleBasedPathFilter {" << std::endl;
+ fRoot.print(out, 1);
+ out << "}" << std::endl;
+}
+
+std::ostream& operator<<(std::ostream& out, const SimpleRuleBasedPathFilter& value) {
+ value.print(out);
+ return out;
+}
diff --git a/Build/source/libs/icu/icu-src/source/tools/genrb/filterrb.h b/Build/source/libs/icu/icu-src/source/tools/genrb/filterrb.h
new file mode 100644
index 00000000000..cf547660419
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/tools/genrb/filterrb.h
@@ -0,0 +1,180 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#ifndef __FILTERRB_H__
+#define __FILTERRB_H__
+
+#include <list>
+#include <map>
+#include <memory>
+#include <ostream>
+#include <string>
+
+#include "unicode/utypes.h"
+
+
+/**
+ * Represents an absolute path into a resource bundle.
+ * For example: "/units/length/meter"
+ */
+class ResKeyPath {
+public:
+ /** Constructs an empty path (top of tree) */
+ ResKeyPath();
+
+ /** Constructs from a string path */
+ ResKeyPath(const std::string& path, UErrorCode& status);
+
+ void push(const std::string& key);
+ void pop();
+
+ const std::list<std::string>& pieces() const;
+
+ private:
+ std::list<std::string> fPath;
+};
+
+std::ostream& operator<<(std::ostream& out, const ResKeyPath& value);
+
+
+/**
+ * Interface used to determine whether to include or reject pieces of a
+ * resource bundle based on their absolute path.
+ */
+class PathFilter {
+public:
+ enum EInclusion {
+ INCLUDE,
+ PARTIAL,
+ EXCLUDE
+ };
+
+ static const char* kEInclusionNames[];
+
+ virtual ~PathFilter();
+
+ /**
+ * Returns an EInclusion on whether or not the given path should be included.
+ *
+ * INCLUDE = include the whole subtree
+ * PARTIAL = recurse into the subtree
+ * EXCLUDE = reject the whole subtree
+ */
+ virtual EInclusion match(const ResKeyPath& path) const = 0;
+};
+
+
+/**
+ * Implementation of PathFilter for a list of inclusion/exclusion rules.
+ *
+ * The wildcard pattern "*" means that the subsequent filters are applied to
+ * every other tree sharing the same parent.
+ *
+ * For example, given this list of filter rules:
+ */
+// -/alabama
+// +/alabama/alaska/arizona
+// -/fornia/hawaii
+// -/mississippi
+// +/mississippi/michigan
+// +/mississippi/*/maine
+// -/mississippi/*/iowa
+// +/mississippi/louisiana/iowa
+/*
+ * You get the following structure:
+ *
+ * SimpleRuleBasedPathFilter {
+ * included: PARTIAL
+ * alabama: {
+ * included: EXCLUDE
+ * alaska: {
+ * included: PARTIAL
+ * arizona: {
+ * included: INCLUDE
+ * }
+ * }
+ * }
+ * fornia: {
+ * included: PARTIAL
+ * hawaii: {
+ * included: EXCLUDE
+ * }
+ * }
+ * mississippi: {
+ * included: EXCLUDE
+ * louisiana: {
+ * included: PARTIAL
+ * iowa: {
+ * included: INCLUDE
+ * }
+ * maine: {
+ * included: INCLUDE
+ * }
+ * }
+ * michigan: {
+ * included: INCLUDE
+ * iowa: {
+ * included: EXCLUDE
+ * }
+ * maine: {
+ * included: INCLUDE
+ * }
+ * }
+ * * {
+ * included: PARTIAL
+ * iowa: {
+ * included: EXCLUDE
+ * }
+ * maine: {
+ * included: INCLUDE
+ * }
+ * }
+ * }
+ * }
+ */
+class SimpleRuleBasedPathFilter : public PathFilter {
+public:
+ void addRule(const std::string& ruleLine, UErrorCode& status);
+ void addRule(const ResKeyPath& path, bool inclusionRule, UErrorCode& status);
+
+ EInclusion match(const ResKeyPath& path) const override;
+
+ void print(std::ostream& out) const;
+
+private:
+ struct Tree {
+
+ Tree() = default;
+
+ /** Copy constructor */
+ Tree(const Tree& other);
+
+ /**
+ * Information on the USER-SPECIFIED inclusion/exclusion.
+ *
+ * INCLUDE = this path exactly matches a "+" rule
+ * PARTIAL = this path does not match any rule, but subpaths exist
+ * EXCLUDE = this path exactly matches a "-" rule
+ */
+ EInclusion fIncluded = PARTIAL;
+ std::map<std::string, Tree> fChildren;
+ std::unique_ptr<Tree> fWildcard;
+
+ void applyRule(
+ const ResKeyPath& path,
+ std::list<std::string>::const_iterator it,
+ bool inclusionRule,
+ UErrorCode& status);
+
+ bool isLeaf() const;
+
+ void print(std::ostream& out, int32_t indent) const;
+ };
+
+ Tree fRoot;
+};
+
+std::ostream& operator<<(std::ostream& out, const SimpleRuleBasedPathFilter& value);
+
+
+#endif //__FILTERRB_H__
diff --git a/Build/source/libs/icu/icu-src/source/tools/genrb/genrb.cpp b/Build/source/libs/icu/icu-src/source/tools/genrb/genrb.cpp
index c4fc462066a..6f3a13a0a61 100644
--- a/Build/source/libs/icu/icu-src/source/tools/genrb/genrb.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/genrb/genrb.cpp
@@ -18,6 +18,11 @@
*******************************************************************************
*/
+#include <fstream>
+#include <iostream>
+#include <list>
+#include <string>
+
#include <assert.h>
#include "genrb.h"
#include "unicode/localpointer.h"
@@ -25,13 +30,15 @@
#include "unicode/utf16.h"
#include "charstr.h"
#include "cmemory.h"
+#include "filterrb.h"
#include "reslist.h"
#include "ucmndata.h" /* TODO: for reading the pool bundle */
U_NAMESPACE_USE
/* Protos */
-void processFile(const char *filename, const char* cp, const char *inputDir, const char *outputDir,
+void processFile(const char *filename, const char* cp,
+ const char *inputDir, const char *outputDir, const char *filterDir,
const char *packageName,
SRBRoot *newPoolBundle, UBool omitBinaryCollation, UErrorCode &status);
static char *make_res_filename(const char *filename, const char *outputDir,
@@ -76,7 +83,8 @@ enum
FORMAT_VERSION,
WRITE_POOL_BUNDLE,
USE_POOL_BUNDLE,
- INCLUDE_UNIHAN_COLL
+ INCLUDE_UNIHAN_COLL,
+ FILTERDIR
};
UOption options[]={
@@ -99,9 +107,10 @@ UOption options[]={
UOPTION_DEF("language", 'l', UOPT_REQUIRES_ARG), /* 16 */
UOPTION_DEF("omitCollationRules", 'R', UOPT_NO_ARG),/* 17 */
UOPTION_DEF("formatVersion", '\x01', UOPT_REQUIRES_ARG),/* 18 */
- UOPTION_DEF("writePoolBundle", '\x01', UOPT_NO_ARG),/* 19 */
+ UOPTION_DEF("writePoolBundle", '\x01', UOPT_OPTIONAL_ARG),/* 19 */
UOPTION_DEF("usePoolBundle", '\x01', UOPT_OPTIONAL_ARG),/* 20 */
UOPTION_DEF("includeUnihanColl", '\x01', UOPT_NO_ARG),/* 21 */ /* temporary, don't display in usage info */
+ UOPTION_DEF("filterDir", '\x01', UOPT_OPTIONAL_ARG), /* 22 */
};
static UBool write_java = FALSE;
@@ -121,6 +130,7 @@ main(int argc,
const char *arg = NULL;
const char *outputDir = NULL; /* NULL = no output directory, use current */
const char *inputDir = NULL;
+ const char *filterDir = NULL;
const char *encoding = "";
int i;
UBool illegalArg = FALSE;
@@ -195,10 +205,10 @@ main(int argc,
"\t-c or --copyright include copyright notice\n");
fprintf(stderr,
"\t-e or --encoding encoding of source files\n"
- "\t-d of --destdir destination directory, followed by the path, defaults to %s\n"
- "\t-s or --sourcedir source directory for files followed by path, defaults to %s\n"
+ "\t-d or --destdir destination directory, followed by the path, defaults to '%s'\n"
+ "\t-s or --sourcedir source directory for files followed by path, defaults to '%s'\n"
"\t-i or --icudatadir directory for locating any needed intermediate data files,\n"
- "\t followed by path, defaults to %s\n",
+ "\t followed by path, defaults to '%s'\n",
u_getDataDirectory(), u_getDataDirectory(), u_getDataDirectory());
fprintf(stderr,
"\t-j or --write-java write a Java ListResourceBundle for ICU4J, followed by optional encoding\n"
@@ -224,10 +234,13 @@ main(int argc,
"\t --formatVersion write a .res file compatible with the requested formatVersion (single digit);\n"
"\t for example, --formatVersion 1\n");
fprintf(stderr,
- "\t --writePoolBundle write a pool.res file with all of the keys of all input bundles\n"
- "\t --usePoolBundle [path-to-pool.res] point to keys from the pool.res keys pool bundle if they are available there;\n"
+ "\t --writePoolBundle [directory] write a pool.res file with all of the keys of all input bundles\n"
+ "\t --usePoolBundle [directory] point to keys from the pool.res keys pool bundle if they are available there;\n"
"\t makes .res files smaller but dependent on the pool bundle\n"
"\t (--writePoolBundle and --usePoolBundle cannot be combined)\n");
+ fprintf(stderr,
+ "\t --filterDir Input directory where filter files are available.\n"
+ "\t For more on filter files, see ICU Data Build Tool.\n");
return illegalArg ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR;
}
@@ -254,6 +267,10 @@ main(int argc,
outputDir = options[DESTDIR].value;
}
+ if (options[FILTERDIR].doesOccur) {
+ filterDir = options[FILTERDIR].value;
+ }
+
if(options[ENCODING].doesOccur) {
encoding = options[ENCODING].value;
}
@@ -524,7 +541,7 @@ main(int argc,
if (isVerbose()) {
printf("Processing file \"%s\"\n", theCurrentFileName.data());
}
- processFile(arg, encoding, inputDir, outputDir, NULL,
+ processFile(arg, encoding, inputDir, outputDir, filterDir, NULL,
newPoolBundle.getAlias(),
options[NO_BINARY_COLLATION].doesOccur, status);
}
@@ -532,8 +549,14 @@ main(int argc,
poolBundle.close();
if(U_SUCCESS(status) && options[WRITE_POOL_BUNDLE].doesOccur) {
+ const char* writePoolDir;
+ if (options[WRITE_POOL_BUNDLE].value!=NULL) {
+ writePoolDir = options[WRITE_POOL_BUNDLE].value;
+ } else {
+ writePoolDir = outputDir;
+ }
char outputFileName[256];
- newPoolBundle->write(outputDir, NULL, outputFileName, sizeof(outputFileName), status);
+ newPoolBundle->write(writePoolDir, NULL, outputFileName, sizeof(outputFileName), status);
if(U_FAILURE(status)) {
fprintf(stderr, "unable to write the pool bundle: %s\n", u_errorName(status));
}
@@ -552,19 +575,17 @@ main(int argc,
/* Process a file */
void
processFile(const char *filename, const char *cp,
- const char *inputDir, const char *outputDir, const char *packageName,
+ const char *inputDir, const char *outputDir, const char *filterDir,
+ const char *packageName,
SRBRoot *newPoolBundle,
UBool omitBinaryCollation, UErrorCode &status) {
LocalPointer<SRBRoot> data;
- UCHARBUF *ucbuf = NULL;
- char *rbname = NULL;
- char *openFileName = NULL;
- char *inputDirBuf = NULL;
-
- char outputFileName[256];
+ LocalUCHARBUFPointer ucbuf;
+ CharString openFileName;
+ CharString inputDirBuf;
+ char outputFileName[256];
int32_t dirlen = 0;
- int32_t filelen = 0;
if (U_FAILURE(status)) {
return;
@@ -572,14 +593,10 @@ processFile(const char *filename, const char *cp,
if(filename==NULL){
status=U_ILLEGAL_ARGUMENT_ERROR;
return;
- }else{
- filelen = (int32_t)uprv_strlen(filename);
}
if(inputDir == NULL) {
const char *filenameBegin = uprv_strrchr(filename, U_FILE_SEP_CHAR);
- openFileName = (char *) uprv_malloc(dirlen + filelen + 2);
- openFileName[0] = '\0';
if (filenameBegin != NULL) {
/*
* When a filename ../../../data/root.txt is specified,
@@ -588,31 +605,15 @@ processFile(const char *filename, const char *cp,
* another file, like UCARules.txt or thaidict.brk.
*/
int32_t filenameSize = (int32_t)(filenameBegin - filename + 1);
- inputDirBuf = uprv_strncpy((char *)uprv_malloc(filenameSize), filename, filenameSize);
-
- /* test for NULL */
- if(inputDirBuf == NULL) {
- status = U_MEMORY_ALLOCATION_ERROR;
- goto finish;
- }
+ inputDirBuf.append(filename, filenameSize, status);
- inputDirBuf[filenameSize - 1] = 0;
- inputDir = inputDirBuf;
- dirlen = (int32_t)uprv_strlen(inputDir);
+ inputDir = inputDirBuf.data();
+ dirlen = inputDirBuf.length();
}
}else{
dirlen = (int32_t)uprv_strlen(inputDir);
if(inputDir[dirlen-1] != U_FILE_SEP_CHAR) {
- openFileName = (char *) uprv_malloc(dirlen + filelen + 2);
-
- /* test for NULL */
- if(openFileName == NULL) {
- status = U_MEMORY_ALLOCATION_ERROR;
- goto finish;
- }
-
- openFileName[0] = '\0';
/*
* append the input dir to openFileName if the first char in
* filename is not file seperation char and the last char input directory is not '.'.
@@ -625,49 +626,80 @@ processFile(const char *filename, const char *cp,
* genrb -s. icu/data --- start from CWD and look in icu/data dir
*/
if( (filename[0] != U_FILE_SEP_CHAR) && (inputDir[dirlen-1] !='.')){
- uprv_strcpy(openFileName, inputDir);
- openFileName[dirlen] = U_FILE_SEP_CHAR;
+ openFileName.append(inputDir, status);
}
- openFileName[dirlen + 1] = '\0';
} else {
- openFileName = (char *) uprv_malloc(dirlen + filelen + 1);
-
- /* test for NULL */
- if(openFileName == NULL) {
- status = U_MEMORY_ALLOCATION_ERROR;
- goto finish;
- }
-
- uprv_strcpy(openFileName, inputDir);
-
+ openFileName.append(inputDir, status);
}
}
+ openFileName.appendPathPart(filename, status);
- uprv_strcat(openFileName, filename);
+ // Test for CharString failure
+ if (U_FAILURE(status)) {
+ return;
+ }
- ucbuf = ucbuf_open(openFileName, &cp,getShowWarning(),TRUE, &status);
+ ucbuf.adoptInstead(ucbuf_open(openFileName.data(), &cp,getShowWarning(),TRUE, &status));
if(status == U_FILE_ACCESS_ERROR) {
- fprintf(stderr, "couldn't open file %s\n", openFileName == NULL ? filename : openFileName);
- goto finish;
+ fprintf(stderr, "couldn't open file %s\n", openFileName.data());
+ return;
}
- if (ucbuf == NULL || U_FAILURE(status)) {
+ if (ucbuf.isNull() || U_FAILURE(status)) {
fprintf(stderr, "An error occurred processing file %s. Error: %s\n",
- openFileName == NULL ? filename : openFileName, u_errorName(status));
- goto finish;
+ openFileName.data(), u_errorName(status));
+ return;
}
/* auto detected popular encodings? */
if (cp!=NULL && isVerbose()) {
printf("autodetected encoding %s\n", cp);
}
/* Parse the data into an SRBRoot */
- data.adoptInstead(parse(ucbuf, inputDir, outputDir, filename,
+ data.adoptInstead(parse(ucbuf.getAlias(), inputDir, outputDir, filename,
!omitBinaryCollation, options[NO_COLLATION_RULES].doesOccur, &status));
if (data.isNull() || U_FAILURE(status)) {
fprintf(stderr, "couldn't parse the file %s. Error:%s\n", filename, u_errorName(status));
- goto finish;
+ return;
}
+
+ // Run filtering before writing pool bundle
+ if (filterDir != nullptr) {
+ CharString filterFileName(filterDir, status);
+ filterFileName.appendPathPart(filename, status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+
+ // Open the file and read it into filter
+ SimpleRuleBasedPathFilter filter;
+ std::ifstream f(filterFileName.data());
+ if (f.fail()) {
+ std::cerr << "genrb error: unable to open " << filterFileName.data() << std::endl;
+ status = U_FILE_ACCESS_ERROR;
+ return;
+ }
+ std::string currentLine;
+ while (std::getline(f, currentLine)) {
+ // Ignore # comments and empty lines
+ if (currentLine.empty() || currentLine[0] == '#') {
+ continue;
+ }
+ filter.addRule(currentLine, status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+ }
+
+ if (isVerbose()) {
+ filter.print(std::cout);
+ }
+
+ // Apply the filter to the data
+ ResKeyPath path;
+ data->fRoot->applyFilter(filter, path, data.getAlias());
+ }
+
if(options[WRITE_POOL_BUNDLE].doesOccur) {
data->fWritePoolBundle = newPoolBundle;
data->compactKeys(status);
@@ -677,7 +709,7 @@ processFile(const char *filename, const char *cp,
if(U_FAILURE(status)) {
fprintf(stderr, "bundle_compactKeys(%s) or bundle_getKeyBytes() failed: %s\n",
filename, u_errorName(status));
- goto finish;
+ return;
}
/* count the number of just-added key strings */
for(const char *newKeysLimit = newKeys + newKeysLength; newKeys < newKeysLimit; ++newKeys) {
@@ -692,11 +724,11 @@ processFile(const char *filename, const char *cp,
}
/* Determine the target rb filename */
- rbname = make_res_filename(filename, outputDir, packageName, status);
+ uprv_free(make_res_filename(filename, outputDir, packageName, status));
if(U_FAILURE(status)) {
fprintf(stderr, "couldn't make the res fileName for bundle %s. Error:%s\n",
filename, u_errorName(status));
- goto finish;
+ return;
}
if(write_java== TRUE){
bundle_write_java(data.getAlias(), outputDir, outputEnc,
@@ -713,24 +745,6 @@ processFile(const char *filename, const char *cp,
if (U_FAILURE(status)) {
fprintf(stderr, "couldn't write bundle %s. Error:%s\n", outputFileName, u_errorName(status));
}
-
-finish:
-
- if (inputDirBuf != NULL) {
- uprv_free(inputDirBuf);
- }
-
- if (openFileName != NULL) {
- uprv_free(openFileName);
- }
-
- if(ucbuf) {
- ucbuf_close(ucbuf);
- }
-
- if (rbname) {
- uprv_free(rbname);
- }
}
/* Generate the target .res file name from the input file name */
diff --git a/Build/source/libs/icu/icu-src/source/tools/genrb/genrb.vcxproj b/Build/source/libs/icu/icu-src/source/tools/genrb/genrb.vcxproj
index 13c8aa855d2..166ce733b94 100644
--- a/Build/source/libs/icu/icu-src/source/tools/genrb/genrb.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/genrb/genrb.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{97521D06-EC47-45D4-8BD0-9E16B3F93B2A}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -34,199 +33,63 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
<!-- Options that are common to *all* configurations -->
<ItemDefinitionGroup>
- <ClCompile>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- </ClCompile>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
<Midl>
- <TypeLibraryName>.\x86\Release/genrb.tlb</TypeLibraryName>
+ <TypeLibraryName>$(OutDir)/genrb.tlb</TypeLibraryName>
</Midl>
<ClCompile>
- <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <StringPooling>true</StringPooling>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Release/genrb.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
<WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <DisableLanguageExtensions>true</DisableLanguageExtensions>
+ <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderOutputFile>$(OutDir)/genrb.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)/genrb.pdb</ProgramDataBaseFileName>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Release/genrb.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuuc.lib;icuin.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x86\Release/genrb.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <OutputFile>$(OutDir)/genrb.exe</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
+ <Command>copy "$(TargetPath)" ..\..\..\$(IcuBinOutputDir)</Command>
+ <Outputs>..\..\..\$(IcuBinOutputDir)\$(TargetFileName);%(Outputs)</Outputs>
</CustomBuildStep>
- <Midl>
- <TypeLibraryName>.\x86\Debug/genrb.tlb</TypeLibraryName>
- </Midl>
+ </ItemDefinitionGroup>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Debug/genrb.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
<BrowseInformation>true</BrowseInformation>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Debug/genrb.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuucd.lib;icuind.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x86\Debug/genrb.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Release/genrb.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
- <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Release/genrb.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x64\Release/genrb.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuuc.lib;icuin.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x64\Release/genrb.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Debug/genrb.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Debug/genrb.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
- </ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
- <Link>
- <OutputFile>.\x64\Debug/genrb.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuucd.lib;icuind.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x64\Debug/genrb.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="errmsg.c" />
+ <ClCompile Include="filterrb.cpp" />
<ClCompile Include="genrb.cpp" />
<ClCompile Include="parse.cpp">
<DisableLanguageExtensions>false</DisableLanguageExtensions>
@@ -251,6 +114,7 @@
<ItemGroup>
<ClInclude Include="errmsg.h" />
<ClInclude Include="genrb.h" />
+ <ClInclude Include="filterrb.h" />
<ClInclude Include="parse.h" />
<ClInclude Include="prscmnts.h" />
<ClInclude Include="rbutil.h" />
diff --git a/Build/source/libs/icu/icu-src/source/tools/genrb/genrb.vcxproj.filters b/Build/source/libs/icu/icu-src/source/tools/genrb/genrb.vcxproj.filters
index 73de73044c8..1f2f5b3b8cb 100644
--- a/Build/source/libs/icu/icu-src/source/tools/genrb/genrb.vcxproj.filters
+++ b/Build/source/libs/icu/icu-src/source/tools/genrb/genrb.vcxproj.filters
@@ -18,6 +18,9 @@
<ClCompile Include="errmsg.c">
<Filter>Source Files</Filter>
</ClCompile>
+ <ClCompile Include="filterrb.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
<ClCompile Include="genrb.cpp">
<Filter>Source Files</Filter>
</ClCompile>
@@ -53,6 +56,9 @@
<ClInclude Include="errmsg.h">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="filterrb.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
<ClInclude Include="genrb.h">
<Filter>Header Files</Filter>
</ClInclude>
diff --git a/Build/source/libs/icu/icu-src/source/tools/genrb/parse.cpp b/Build/source/libs/icu/icu-src/source/tools/genrb/parse.cpp
index 44eb0c082bc..18a8c76dbc5 100644
--- a/Build/source/libs/icu/icu-src/source/tools/genrb/parse.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/genrb/parse.cpp
@@ -274,11 +274,11 @@ expect(ParseState* state, enum ETokenType expectedToken, struct UString **tokenV
}
}
-static char *getInvariantString(ParseState* state, uint32_t *line, struct UString *comment, UErrorCode *status)
+static char *getInvariantString(ParseState* state, uint32_t *line, struct UString *comment,
+ int32_t &stringLength, UErrorCode *status)
{
struct UString *tokenValue;
char *result;
- uint32_t count;
expect(state, TOK_STRING, &tokenValue, comment, line, status);
@@ -287,14 +287,13 @@ static char *getInvariantString(ParseState* state, uint32_t *line, struct UStrin
return NULL;
}
- count = u_strlen(tokenValue->fChars);
- if(!uprv_isInvariantUString(tokenValue->fChars, count)) {
+ if(!uprv_isInvariantUString(tokenValue->fChars, tokenValue->fLength)) {
*status = U_INVALID_FORMAT_ERROR;
error(*line, "invariant characters required for table keys, binary data, etc.");
return NULL;
}
- result = static_cast<char *>(uprv_malloc(count+1));
+ result = static_cast<char *>(uprv_malloc(tokenValue->fLength+1));
if (result == NULL)
{
@@ -302,7 +301,8 @@ static char *getInvariantString(ParseState* state, uint32_t *line, struct UStrin
return NULL;
}
- u_UCharsToChars(tokenValue->fChars, result, count+1);
+ u_UCharsToChars(tokenValue->fChars, result, tokenValue->fLength+1);
+ stringLength = tokenValue->fLength;
return result;
}
@@ -537,7 +537,7 @@ parseDependency(ParseState* state, char *tag, uint32_t startline, const struct U
uint32_t line;
char filename[256] = { '\0' };
char cs[128] = { '\0' };
-
+
expect(state, TOK_STRING, &tokenValue, NULL, &line, status);
if(isVerbose()){
@@ -558,7 +558,7 @@ parseDependency(ParseState* state, char *tag, uint32_t startline, const struct U
uprv_strcat(filename, U_FILE_SEP_STRING);
}
}
-
+
u_UCharsToChars(tokenValue->fChars, cs, tokenValue->fLength);
if (U_FAILURE(*status))
@@ -570,7 +570,7 @@ parseDependency(ParseState* state, char *tag, uint32_t startline, const struct U
if(isStrict()){
error(line, "The dependency file %s does not exist. Please make sure it exists.\n",filename);
}else{
- warning(line, "The dependency file %s does not exist. Please make sure it exists.\n",filename);
+ warning(line, "The dependency file %s does not exist. Please make sure it exists.\n",filename);
}
}
if(dependencyArray==NULL){
@@ -1371,7 +1371,6 @@ parseIntVector(ParseState* state, char *tag, uint32_t startline, const struct US
int32_t value;
UBool readToken = FALSE;
char *stopstring;
- uint32_t len;
struct UString memberComments;
IntVectorResource *result = intvector_open(state->bundle, tag, comment, status);
@@ -1404,7 +1403,8 @@ parseIntVector(ParseState* state, char *tag, uint32_t startline, const struct US
return result;
}
- string = getInvariantString(state, NULL, NULL, status);
+ int32_t stringLength;
+ string = getInvariantString(state, NULL, NULL, stringLength, status);
if (U_FAILURE(*status))
{
@@ -1414,9 +1414,9 @@ parseIntVector(ParseState* state, char *tag, uint32_t startline, const struct US
/* For handling illegal char in the Intvector */
value = uprv_strtoul(string, &stopstring, 0);/* make intvector support decimal,hexdigit,octal digit ranging from -2^31-2^32-1*/
- len=(uint32_t)(stopstring-string);
+ int32_t len = (int32_t)(stopstring-string);
- if(len==uprv_strlen(string))
+ if(len==stringLength)
{
result->add(value, *status);
uprv_free(string);
@@ -1454,7 +1454,8 @@ static struct SResource *
parseBinary(ParseState* state, char *tag, uint32_t startline, const struct UString *comment, UErrorCode *status)
{
uint32_t line;
- LocalMemory<char> string(getInvariantString(state, &line, NULL, status));
+ int32_t stringLength;
+ LocalMemory<char> string(getInvariantString(state, &line, NULL, stringLength, status));
if (string.isNull() || U_FAILURE(*status))
{
return NULL;
@@ -1470,46 +1471,45 @@ parseBinary(ParseState* state, char *tag, uint32_t startline, const struct UStri
printf(" binary %s at line %i \n", (tag == NULL) ? "(null)" : tag, (int)startline);
}
- uint32_t count = (uint32_t)uprv_strlen(string.getAlias());
- if (count > 0){
- if((count % 2)==0){
- LocalMemory<uint8_t> value;
- if (value.allocateInsteadAndCopy(count) == NULL)
- {
- *status = U_MEMORY_ALLOCATION_ERROR;
- return NULL;
- }
-
- char toConv[3] = {'\0', '\0', '\0'};
- for (uint32_t i = 0; i < count; i += 2)
- {
- toConv[0] = string[i];
- toConv[1] = string[i + 1];
+ LocalMemory<uint8_t> value;
+ int32_t count = 0;
+ if (stringLength > 0 && value.allocateInsteadAndCopy(stringLength) == NULL)
+ {
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ return NULL;
+ }
- char *stopstring;
- value[i >> 1] = (uint8_t) uprv_strtoul(toConv, &stopstring, 16);
- uint32_t len=(uint32_t)(stopstring-toConv);
+ char toConv[3] = {'\0', '\0', '\0'};
+ for (int32_t i = 0; i < stringLength;)
+ {
+ // Skip spaces (which may have been line endings).
+ char c0 = string[i++];
+ if (c0 == ' ') { continue; }
+ if (i == stringLength) {
+ *status=U_INVALID_CHAR_FOUND;
+ error(line, "Encountered invalid binary value (odd number of hex digits)");
+ return NULL;
+ }
+ toConv[0] = c0;
+ toConv[1] = string[i++];
- if(len!=2)
- {
- *status=U_INVALID_CHAR_FOUND;
- return NULL;
- }
- }
+ char *stopstring;
+ value[count++] = (uint8_t) uprv_strtoul(toConv, &stopstring, 16);
+ uint32_t len=(uint32_t)(stopstring-toConv);
- return bin_open(state->bundle, tag, count >> 1, value.getAlias(), NULL, comment, status);
- }
- else
+ if(len!=2)
{
- *status = U_INVALID_CHAR_FOUND;
- error(line, "Encountered invalid binary value (length is odd)");
+ *status=U_INVALID_CHAR_FOUND;
+ error(line, "Encountered invalid binary value (not all pairs of hex digits)");
return NULL;
}
}
- else
- {
+
+ if (count == 0) {
warning(startline, "Encountered empty binary value");
return bin_open(state->bundle, tag, 0, NULL, "", comment, status);
+ } else {
+ return bin_open(state->bundle, tag, count, value.getAlias(), NULL, comment, status);
}
}
@@ -1520,9 +1520,9 @@ parseInteger(ParseState* state, char *tag, uint32_t startline, const struct UStr
int32_t value;
char *string;
char *stopstring;
- uint32_t len;
- string = getInvariantString(state, NULL, NULL, status);
+ int32_t stringLength;
+ string = getInvariantString(state, NULL, NULL, stringLength, status);
if (string == NULL || U_FAILURE(*status))
{
@@ -1541,7 +1541,7 @@ parseInteger(ParseState* state, char *tag, uint32_t startline, const struct UStr
printf(" integer %s at line %i \n", (tag == NULL) ? "(null)" : tag, (int)startline);
}
- if (uprv_strlen(string) <= 0)
+ if (stringLength == 0)
{
warning(startline, "Encountered empty integer. Default value is 0.");
}
@@ -1549,8 +1549,8 @@ parseInteger(ParseState* state, char *tag, uint32_t startline, const struct UStr
/* Allow integer support for hexdecimal, octal digit and decimal*/
/* and handle illegal char in the integer*/
value = uprv_strtoul(string, &stopstring, 0);
- len=(uint32_t)(stopstring-string);
- if(len==uprv_strlen(string))
+ int32_t len = (int32_t)(stopstring-string);
+ if(len==stringLength)
{
result = int_open(state->bundle, tag, value, comment, status);
}
@@ -1567,7 +1567,8 @@ static struct SResource *
parseImport(ParseState* state, char *tag, uint32_t startline, const struct UString* comment, UErrorCode *status)
{
uint32_t line;
- LocalMemory<char> filename(getInvariantString(state, &line, NULL, status));
+ int32_t stringLength;
+ LocalMemory<char> filename(getInvariantString(state, &line, NULL, stringLength, status));
if (U_FAILURE(*status))
{
return NULL;
@@ -1628,12 +1629,11 @@ parseInclude(ParseState* state, char *tag, uint32_t startline, const struct UStr
UCHARBUF *ucbuf;
char *fullname = NULL;
- int32_t count = 0;
const char* cp = NULL;
const UChar* uBuffer = NULL;
- filename = getInvariantString(state, &line, NULL, status);
- count = (int32_t)uprv_strlen(filename);
+ int32_t stringLength;
+ filename = getInvariantString(state, &line, NULL, stringLength, status);
if (U_FAILURE(*status))
{
@@ -1652,7 +1652,7 @@ parseInclude(ParseState* state, char *tag, uint32_t startline, const struct UStr
printf(" include %s at line %i \n", (tag == NULL) ? "(null)" : tag, (int)startline);
}
- fullname = (char *) uprv_malloc(state->inputdirLength + count + 2);
+ fullname = (char *) uprv_malloc(state->inputdirLength + stringLength + 2);
/* test for NULL */
if(fullname == NULL)
{
@@ -2000,6 +2000,8 @@ parse(UCHARBUF *buf, const char *inputDir, const char *outputDir, const char *fi
if (state.bundle == NULL || U_FAILURE(*status))
{
+ delete state.bundle;
+
return NULL;
}
diff --git a/Build/source/libs/icu/icu-src/source/tools/genrb/reslist.cpp b/Build/source/libs/icu/icu-src/source/tools/genrb/reslist.cpp
index 0493347ebe5..3186c781e93 100644
--- a/Build/source/libs/icu/icu-src/source/tools/genrb/reslist.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/genrb/reslist.cpp
@@ -28,13 +28,17 @@
#endif
#include <assert.h>
+#include <iostream>
+#include <set>
#include <stdio.h>
+
#include "unicode/localpointer.h"
#include "reslist.h"
#include "unewdata.h"
#include "unicode/ures.h"
#include "unicode/putil.h"
#include "errmsg.h"
+#include "filterrb.h"
#include "uarrsort.h"
#include "uelement.h"
@@ -42,6 +46,8 @@
#include "uinvchar.h"
#include "ustr_imp.h"
#include "unicode/utf16.h"
+#include "uassert.h"
+
/*
* Align binary data at a 16-byte offset from the start of the resource bundle,
* to be safe for any data type it may contain.
@@ -921,9 +927,6 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg,
if (f16BitUnits.length() & 1) {
f16BitUnits.append((UChar)0xaaaa); /* pad to multiple of 4 bytes */
}
- /* all keys have been mapped */
- uprv_free(fKeyMap);
- fKeyMap = NULL;
byteOffset = fKeysTop + f16BitUnits.length() * 2;
fRoot->preWrite(&byteOffset);
@@ -1037,14 +1040,15 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg,
// Swap to big-endian so we get the same checksum on all platforms
// (except for charset family, due to the key strings).
UnicodeString s(f16BitUnits);
- s.append((UChar)1); // Ensure that we own this buffer.
assert(!s.isBogus());
- uint16_t *p = const_cast<uint16_t *>(reinterpret_cast<const uint16_t *>(s.getBuffer()));
+ // .getBuffer(capacity) returns a mutable buffer
+ char16_t* p = s.getBuffer(f16BitUnits.length());
for (int32_t count = f16BitUnits.length(); count > 0; --count) {
uint16_t x = *p;
*p++ = (uint16_t)((x << 8) | (x >> 8));
}
- checksum = computeCRC((const char *)p,
+ s.releaseBuffer(f16BitUnits.length());
+ checksum = computeCRC((const char *)s.getBuffer(),
(uint32_t)f16BitUnits.length() * 2, checksum);
}
indexes[URES_INDEX_POOL_CHECKSUM] = (int32_t)checksum;
@@ -1127,7 +1131,8 @@ SRBRoot::SRBRoot(const UString *comment, UBool isPoolBundle, UErrorCode &errorCo
: fRoot(NULL), fLocale(NULL), fIndexLength(0), fMaxTableLength(0), fNoFallback(FALSE),
fStringsForm(STRINGS_UTF16_V1), fIsPoolBundle(isPoolBundle),
fKeys(NULL), fKeyMap(NULL),
- fKeysBottom(0), fKeysTop(0), fKeysCapacity(0), fKeysCount(0), fLocalKeyLimit(0),
+ fKeysBottom(0), fKeysTop(0), fKeysCapacity(0),
+ fKeysCount(0), fLocalKeyLimit(0),
f16BitUnits(), f16BitStringsLength(0),
fUsePoolBundle(&kNoPoolBundle),
fPoolStringIndexLimit(0), fPoolStringIndex16Limit(0), fLocalStringIndexLimit(0),
@@ -1232,6 +1237,9 @@ int32_t
SRBRoot::addKeyBytes(const char *keyBytes, int32_t length, UErrorCode &errorCode) {
int32_t keypos;
+ // It is not legal to add new key bytes after compactKeys is run!
+ U_ASSERT(fKeyMap == nullptr);
+
if (U_FAILURE(errorCode)) {
return -1;
}
@@ -1333,13 +1341,37 @@ compareKeyOldpos(const void * /*context*/, const void *l, const void *r) {
return compareInt32(((const KeyMapEntry *)l)->oldpos, ((const KeyMapEntry *)r)->oldpos);
}
+void SResource::collectKeys(std::function<void(int32_t)> collector) const {
+ collector(fKey);
+}
+
+void ContainerResource::collectKeys(std::function<void(int32_t)> collector) const {
+ collector(fKey);
+ for (SResource* curr = fFirst; curr != NULL; curr = curr->fNext) {
+ curr->collectKeys(collector);
+ }
+}
+
void
SRBRoot::compactKeys(UErrorCode &errorCode) {
KeyMapEntry *map;
char *keys;
int32_t i;
+
+ // Except for pool bundles, keys might not be used.
+ // Do not add unused keys to the final bundle.
+ std::set<int32_t> keysInUse;
+ if (!fIsPoolBundle) {
+ fRoot->collectKeys([&keysInUse](int32_t key) {
+ if (key >= 0) {
+ keysInUse.insert(key);
+ }
+ });
+ fKeysCount = static_cast<int32_t>(keysInUse.size());
+ }
+
int32_t keysCount = fUsePoolBundle->fKeysCount + fKeysCount;
- if (U_FAILURE(errorCode) || fKeysCount == 0 || fKeyMap != NULL) {
+ if (U_FAILURE(errorCode) || fKeyMap != NULL) {
return;
}
map = (KeyMapEntry *)uprv_malloc(keysCount * sizeof(KeyMapEntry));
@@ -1356,11 +1388,23 @@ SRBRoot::compactKeys(UErrorCode &errorCode) {
++keys; /* skip the NUL */
}
keys = fKeys + fKeysBottom;
- for (; i < keysCount; ++i) {
- map[i].oldpos = (int32_t)(keys - fKeys);
- map[i].newpos = 0;
- while (*keys != 0) { ++keys; } /* skip the key */
- ++keys; /* skip the NUL */
+ while (i < keysCount) {
+ int32_t keyOffset = static_cast<int32_t>(keys - fKeys);
+ if (!fIsPoolBundle && keysInUse.count(keyOffset) == 0) {
+ // Mark the unused key as deleted
+ while (*keys != 0) { *keys++ = 1; }
+ *keys++ = 1;
+ } else {
+ map[i].oldpos = keyOffset;
+ map[i].newpos = 0;
+ while (*keys != 0) { ++keys; } /* skip the key */
+ ++keys; /* skip the NUL */
+ i++;
+ }
+ }
+ if (keys != fKeys + fKeysTop) {
+ // Throw away any unused keys from the end
+ fKeysTop = static_cast<int32_t>(keys - fKeys);
}
/* Sort the keys so that each one is immediately followed by all of its suffixes. */
uprv_sortArray(map, keysCount, (int32_t)sizeof(KeyMapEntry),
@@ -1403,7 +1447,7 @@ SRBRoot::compactKeys(UErrorCode &errorCode) {
for (k = keyLimit; suffix < suffixLimit && *--k == *--suffixLimit;) {}
if (suffix == suffixLimit && *k == *suffixLimit) {
map[j].newpos = map[i].oldpos + offset; /* yes, point to the earlier key */
- /* mark the suffix as deleted */
+ // Mark the suffix as deleted
while (*suffix != 0) { *suffix++ = 1; }
*suffix = 1;
} else {
@@ -1437,7 +1481,7 @@ SRBRoot::compactKeys(UErrorCode &errorCode) {
keys[newpos++] = keys[oldpos++];
}
}
- assert(i == keysCount);
+ U_ASSERT(i == keysCount);
}
fKeysTop = newpos;
/* Re-sort once more, by old offsets for binary searching. */
@@ -1691,3 +1735,55 @@ SRBRoot::compactStringsV2(UHashtable *stringSet, UErrorCode &errorCode) {
// +1 to account for the initial zero in f16BitUnits
assert(f16BitUnits.length() <= (f16BitStringsLength + 1));
}
+
+void SResource::applyFilter(
+ const PathFilter& /*filter*/,
+ ResKeyPath& /*path*/,
+ const SRBRoot* /*bundle*/) {
+ // Only a few resource types (tables) are capable of being filtered.
+}
+
+void TableResource::applyFilter(
+ const PathFilter& filter,
+ ResKeyPath& path,
+ const SRBRoot* bundle) {
+ SResource* prev = nullptr;
+ SResource* curr = fFirst;
+ for (; curr != nullptr;) {
+ path.push(curr->getKeyString(bundle));
+ auto inclusion = filter.match(path);
+ if (inclusion == PathFilter::EInclusion::INCLUDE) {
+ // Include whole subtree
+ // no-op
+ if (isVerbose()) {
+ std::cout << "genrb subtree: " << bundle->fLocale << ": INCLUDE: " << path << std::endl;
+ }
+ } else if (inclusion == PathFilter::EInclusion::EXCLUDE) {
+ // Reject the whole subtree
+ // Remove it from the linked list
+ if (isVerbose()) {
+ std::cout << "genrb subtree: " << bundle->fLocale << ": DELETE: " << path << std::endl;
+ }
+ if (prev == nullptr) {
+ fFirst = curr->fNext;
+ } else {
+ prev->fNext = curr->fNext;
+ }
+ fCount--;
+ delete curr;
+ curr = prev;
+ } else {
+ U_ASSERT(inclusion == PathFilter::EInclusion::PARTIAL);
+ // Recurse into the child
+ curr->applyFilter(filter, path, bundle);
+ }
+ path.pop();
+
+ prev = curr;
+ if (curr == nullptr) {
+ curr = fFirst;
+ } else {
+ curr = curr->fNext;
+ }
+ }
+}
diff --git a/Build/source/libs/icu/icu-src/source/tools/genrb/reslist.h b/Build/source/libs/icu/icu-src/source/tools/genrb/reslist.h
index ee1ecf3d05f..07874fdbaa8 100644
--- a/Build/source/libs/icu/icu-src/source/tools/genrb/reslist.h
+++ b/Build/source/libs/icu/icu-src/source/tools/genrb/reslist.h
@@ -23,6 +23,8 @@
#define KEY_SPACE_SIZE 65536
#define RESLIST_MAX_INT_VECTOR 2048
+#include <functional>
+
#include "unicode/utypes.h"
#include "unicode/unistr.h"
#include "unicode/ures.h"
@@ -36,7 +38,9 @@
U_CDECL_BEGIN
+class PathFilter;
class PseudoListResource;
+class ResKeyPath;
struct ResFile {
ResFile()
@@ -212,6 +216,19 @@ struct SResource {
void write(UNewDataMemory *mem, uint32_t *byteOffset);
virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset);
+ /**
+ * Applies the given filter with the given base path to this resource.
+ * Removes child resources rejected by the filter recursively.
+ *
+ * @param bundle Needed in order to access the key for this and child resources.
+ */
+ virtual void applyFilter(const PathFilter& filter, ResKeyPath& path, const SRBRoot* bundle);
+
+ /**
+ * Calls the given function for every key ID present in this tree.
+ */
+ virtual void collectKeys(std::function<void(int32_t)> collector) const;
+
int8_t fType; /* nominal type: fRes (when != 0xffffffff) may use subtype */
UBool fWritten; /* res_write() can exit early */
uint32_t fRes; /* resource item word; RES_BOGUS=0xffffffff if not known yet */
@@ -231,7 +248,10 @@ public:
fCount(0), fFirst(NULL) {}
virtual ~ContainerResource();
- virtual void handlePreflightStrings(SRBRoot *bundle, UHashtable *stringSet, UErrorCode &errorCode);
+ void handlePreflightStrings(SRBRoot *bundle, UHashtable *stringSet, UErrorCode &errorCode) override;
+
+ void collectKeys(std::function<void(int32_t)> collector) const override;
+
protected:
void writeAllRes16(SRBRoot *bundle);
void preWriteAllRes(uint32_t *byteOffset);
@@ -254,9 +274,11 @@ public:
void add(SResource *res, int linenumber, UErrorCode &errorCode);
- virtual void handleWrite16(SRBRoot *bundle);
- virtual void handlePreWrite(uint32_t *byteOffset);
- virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset);
+ void handleWrite16(SRBRoot *bundle) override;
+ void handlePreWrite(uint32_t *byteOffset) override;
+ void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset) override;
+
+ void applyFilter(const PathFilter& filter, ResKeyPath& path, const SRBRoot* bundle) override;
int8_t fTableType; // determined by table_write16() for table_preWrite() & table_write()
SRBRoot *fRoot;
diff --git a/Build/source/libs/icu/icu-src/source/tools/genrb/rle.c b/Build/source/libs/icu/icu-src/source/tools/genrb/rle.c
index 91be0630665..279684aad03 100644
--- a/Build/source/libs/icu/icu-src/source/tools/genrb/rle.c
+++ b/Build/source/libs/icu/icu-src/source/tools/genrb/rle.c
@@ -91,14 +91,14 @@ encodeRunByte(uint16_t* buffer,uint16_t* bufLimit, uint8_t value, int32_t length
return buffer;
}
-#define APPEND( buffer, bufLimit, value, num, status){ \
+#define APPEND( buffer, bufLimit, value, num, status) UPRV_BLOCK_MACRO_BEGIN { \
if(buffer<bufLimit){ \
*buffer++=(value); \
}else{ \
*status = U_BUFFER_OVERFLOW_ERROR; \
} \
num++; \
-}
+} UPRV_BLOCK_MACRO_END
/**
* Encode a run, possibly a degenerate run (of < 4 values).
diff --git a/Build/source/libs/icu/icu-src/source/tools/genrb/ustr.h b/Build/source/libs/icu/icu-src/source/tools/genrb/ustr.h
index 91483d1f0fc..8a69e9d4d5c 100644
--- a/Build/source/libs/icu/icu-src/source/tools/genrb/ustr.h
+++ b/Build/source/libs/icu/icu-src/source/tools/genrb/ustr.h
@@ -22,7 +22,7 @@
#include "unicode/utypes.h"
-#define U_APPEND_CHAR32(c,target,len) { \
+#define U_APPEND_CHAR32(c,target,len) UPRV_BLOCK_MACRO_BEGIN { \
if (c <= 0xffff) \
{ \
*(target)++ = (UChar) c; \
@@ -35,9 +35,9 @@
len=2; \
target +=2; \
} \
-}
+} UPRV_BLOCK_MACRO_END
-#define U_APPEND_CHAR32_ONLY(c,target) { \
+#define U_APPEND_CHAR32_ONLY(c,target) UPRV_BLOCK_MACRO_BEGIN { \
if (c <= 0xffff) \
{ \
*(target)++ = (UChar) c; \
@@ -48,7 +48,7 @@
target[1] = U16_TRAIL(c); \
target +=2; \
} \
-}
+} UPRV_BLOCK_MACRO_END
/* A C representation of a string "object" (to avoid realloc all the time) */
struct UString {
diff --git a/Build/source/libs/icu/icu-src/source/tools/genren/README b/Build/source/libs/icu/icu-src/source/tools/genren/README
index f4cc4db0159..e2e13bc3ed1 100644
--- a/Build/source/libs/icu/icu-src/source/tools/genren/README
+++ b/Build/source/libs/icu/icu-src/source/tools/genren/README
@@ -1,5 +1,6 @@
Copyright (C) 2016 and later: Unicode, Inc. and others. License & terms of use: http://www.unicode.org/copyright.html
Copyright (c) 2002-2011, International Business Machines Corporation and others. All Rights Reserved.
+
The genren.pl script is used to generate source/common/unicode/urename.h header file, which is needed for renaming the ICU exported names.
This script is intended to be used on Linux, although it should work on any platform that has Perl and nm command. Makefile may need to be updated, it's not 100% portable.
@@ -9,6 +10,8 @@ It also does not currently work well in an out-of-source situation.
The following instructions are for Linux version.
- urename.h file should be generated after implementation is complete for a release.
- the version number for a release should be set according to the list in source/common/unicode/uvernum.h
+- Note: If you are running the script in a clean checkout, you must run the runConfigureICU at least once before
+ running the make install-header command below.
Before generating urename.h, the layout engine header files must be installed from the harfbuzz project.
This is prerequisite for the icu layoutex (Paragraph Layout) project, which is subject to renaming.
@@ -24,10 +27,11 @@ This is prerequisite for the icu layoutex (Paragraph Layout) project, which is s
- urename.h will be updated in icu/source/common/unicode/urename.h **in your original source directory**
- Warnings concerning bad namespace (not 'icu') on UCaseMap can be ignored.
+- The defines for "__bss_start", "_edata", and "_end" should be ignored/removed (See ICU-20176).
- Eyeball the new file for errors
cd icu4c/source
- svn diff common/unicode/urename.h
+ git diff common/unicode/urename.h
- Other make targets here
diff --git a/Build/source/libs/icu/icu-src/source/tools/gensprep/gensprep.c b/Build/source/libs/icu/icu-src/source/tools/gensprep/gensprep.c
index a9c9efac95b..a78a5f3e566 100644
--- a/Build/source/libs/icu/icu-src/source/tools/gensprep/gensprep.c
+++ b/Build/source/libs/icu/icu-src/source/tools/gensprep/gensprep.c
@@ -278,6 +278,8 @@ static void U_CALLCONV
normalizationCorrectionsLineFn(void *context,
char *fields[][2], int32_t fieldCount,
UErrorCode *pErrorCode) {
+ (void)context; // suppress compiler warnings about unused variable
+ (void)fieldCount; // suppress compiler warnings about unused variable
uint32_t mapping[40];
char *end, *s;
uint32_t code;
@@ -341,6 +343,7 @@ static void U_CALLCONV
strprepProfileLineFn(void *context,
char *fields[][2], int32_t fieldCount,
UErrorCode *pErrorCode) {
+ (void)fieldCount; // suppress compiler warnings about unused variable
uint32_t mapping[40];
char *end, *map;
uint32_t code;
diff --git a/Build/source/libs/icu/icu-src/source/tools/gensprep/gensprep.vcxproj b/Build/source/libs/icu/icu-src/source/tools/gensprep/gensprep.vcxproj
index 3dde2db8e86..c771a4162a4 100644
--- a/Build/source/libs/icu/icu-src/source/tools/gensprep/gensprep.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/gensprep/gensprep.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{631C23CE-6C1D-4875-88F0-85E0A42B36EA}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -34,193 +33,58 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
+ <!-- Options that are common to *all* configurations -->
+ <ItemDefinitionGroup>
<Midl>
- <TypeLibraryName>.\x86\Release/gensprep.tlb</TypeLibraryName>
+ <TypeLibraryName>$(OutDir)\gensprep.tlb</TypeLibraryName>
</Midl>
<ClCompile>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Release/gensprep.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
<WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <DisableLanguageExtensions>false</DisableLanguageExtensions>
+ <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderOutputFile>$(OutDir)\gensprep.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)\gensprep.pdb</ProgramDataBaseFileName>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Release/gensprep.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x86\Release/gensprep.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <OutputFile>$(OutDir)\gensprep.exe</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
+ <Command>copy "$(TargetPath)" ..\..\..\$(IcuBinOutputDir)</Command>
+ <Outputs>..\..\..\$(IcuBinOutputDir)\$(TargetFileName);%(Outputs)</Outputs>
</CustomBuildStep>
- <Midl>
- <TypeLibraryName>.\x86\Debug/gensprep.tlb</TypeLibraryName>
- </Midl>
+ </ItemDefinitionGroup>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <BrowseInformation>true</BrowseInformation>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Debug/gensprep.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Debug/gensprep.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x86\Debug/gensprep.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Release/gensprep.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Release/gensprep.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x64\Release/gensprep.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x64\Release/gensprep.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Debug/gensprep.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Debug/gensprep.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
- </ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
- <Link>
- <OutputFile>.\x64\Debug/gensprep.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x64\Debug/gensprep.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/tools/gensprep/store.c b/Build/source/libs/icu/icu-src/source/tools/gensprep/store.c
index 60252b9b903..3d75a39cc8c 100644
--- a/Build/source/libs/icu/icu-src/source/tools/gensprep/store.c
+++ b/Build/source/libs/icu/icu-src/source/tools/gensprep/store.c
@@ -464,7 +464,8 @@ storeMapping(uint32_t codepoint, uint32_t* mapping,int32_t length,
extern void
-storeRange(uint32_t start, uint32_t end, UStringPrepType type,UErrorCode* status){
+storeRange(uint32_t start, uint32_t end, UStringPrepType type, UErrorCode* status){
+ (void)status; // suppress compiler warnings about unused variable
uint16_t trieWord = 0;
if((int)(_SPREP_TYPE_THRESHOLD + type) > 0xFFFF){
diff --git a/Build/source/libs/icu/icu-src/source/tools/gentest/gentest.vcxproj b/Build/source/libs/icu/icu-src/source/tools/gentest/gentest.vcxproj
index 4104b485974..2c6c7685dde 100644
--- a/Build/source/libs/icu/icu-src/source/tools/gentest/gentest.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/gentest/gentest.vcxproj
@@ -1,18 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{77C78066-746F-4EA6-B3FE-B8C8A4A97891}</ProjectGuid>
<RootNamespace>gentest</RootNamespace>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -35,175 +34,55 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <!-- Options that are common to *all* configurations -->
+ <ItemDefinitionGroup>
<Midl>
- <TypeLibraryName>.\x86\Release/gentest.tlb</TypeLibraryName>
+ <TypeLibraryName>$(OutDir)/gentest.tlb</TypeLibraryName>
</Midl>
<ClCompile>
- <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Release/gentest.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
<WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <DisableLanguageExtensions>true</DisableLanguageExtensions>
+ <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderOutputFile>$(OutDir)/gentest.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)/gentest.pdb</ProgramDataBaseFileName>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Release/gentest.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuuc.lib;icutest.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x86\Release/gentest.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <OutputFile>$(OutDir)/gentest.exe</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <ProgramDatabaseFile>$(OutDir)/gentest.pdb</ProgramDatabaseFile>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Midl>
- <TypeLibraryName>.\x86\Debug/gentest.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Debug/gentest.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
<BrowseInformation>true</BrowseInformation>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Debug/gentest.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuucd.lib;icutestd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x86\Debug/gentest.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Release/gentest.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
- <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Release/gentest.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x64\Release/gentest.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>icuuc.lib;icutest.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x64\Release/gentest.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\x64\Debug/gentest.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Debug/gentest.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
- </ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
- <Link>
- <OutputFile>.\x64\Debug/gentest.exe</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuucd.lib;icutestd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x64\Debug/gentest.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX64</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/tools/icu-file-utf8-check.py b/Build/source/libs/icu/icu-src/source/tools/icu-file-utf8-check.py
index 41b5a7b3f89..86de259e883 100755
--- a/Build/source/libs/icu/icu-src/source/tools/icu-file-utf8-check.py
+++ b/Build/source/libs/icu/icu-src/source/tools/icu-file-utf8-check.py
@@ -23,6 +23,8 @@
# Only files from the ICU github repository are checked.
# No changes are made to the repository; only the working copy will be altered.
+from __future__ import print_function
+
import sys
import os
import os.path
@@ -35,13 +37,13 @@ def runCommand(cmd):
output_text = output_file.read();
exit_status = output_file.close();
if exit_status:
- print >>sys.stderr, '"', cmd, '" failed. Exiting.'
+ print('"', cmd, '" failed. Exiting.', file=sys.stderr)
sys.exit(exit_status)
return output_text
def usage():
- print "usage: " + sys.argv[0] + " [-h | --help]"
+ print("usage: " + sys.argv[0] + " [-h | --help]")
#
@@ -50,7 +52,7 @@ def usage():
# is_source: Flag, set to True if file is a source code file (.c, .cpp, .h, .java).
#
def check_file(file_name, is_source):
- f = open(file_name, 'r')
+ f = open(file_name, 'rb')
bytes = f.read()
f.close()
@@ -58,13 +60,13 @@ def check_file(file_name, is_source):
try:
bytes.decode("UTF-8")
except UnicodeDecodeError:
- print "Error: %s is a source code file but contains non-utf-8 bytes." % file_name
+ print("Error: %s is a source code file but contains non-utf-8 bytes." % file_name)
- if ord(bytes[0]) == 0xef:
+ if bytes[0] == 0xef:
if not (file_name.endswith(".txt") or file_name.endswith(".sln")
or file_name.endswith(".targets")
or ".vcxproj" in file_name):
- print "Warning: file %s contains a UTF-8 BOM: " % file_name
+ print("Warning: file %s contains a UTF-8 BOM: " % file_name)
return
@@ -72,7 +74,7 @@ def main(argv):
try:
opts, args = getopt.getopt(argv, "h", ("help"))
except getopt.GetoptError:
- print "unrecognized option: " + argv[0]
+ print("unrecognized option: " + argv[0])
usage()
sys.exit(2)
for opt, arg in opts:
@@ -80,7 +82,7 @@ def main(argv):
usage()
sys.exit()
if args:
- print "unexpected command line argument"
+ print("unexpected command line argument")
usage()
sys.exit()
@@ -91,10 +93,10 @@ def main(argv):
for f in file_list:
if os.path.isdir(f):
- print "Skipping dir " + f
+ print("Skipping dir " + f)
continue
if not os.path.isfile(f):
- print "Repository file not in working copy: " + f
+ print("Repository file not in working copy: " + f)
continue;
source_file = source_file_re.match(f)
diff --git a/Build/source/libs/icu/icu-src/source/tools/icuinfo/icuinfo.cpp b/Build/source/libs/icu/icu-src/source/tools/icuinfo/icuinfo.cpp
index 08bd87b85db..fee17cf685c 100644
--- a/Build/source/libs/icu/icu-src/source/tools/icuinfo/icuinfo.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/icuinfo/icuinfo.cpp
@@ -84,6 +84,12 @@ void cmd_version(UBool /* noLoad */, UErrorCode &errorCode)
errorCode=U_INTERNAL_PROGRAM_ERROR;
}
+#if defined(_MSC_VER)
+// Ignore warning 4127, conditional expression is constant. This is intentional below.
+#pragma warning(push)
+#pragma warning(disable: 4127)
+#endif
+
if(U_SIZEOF_WCHAR_T==sizeof(wchar_t)) {
//printf("U_SIZEOF_WCHAR_T: %d\n", U_SIZEOF_WCHAR_T);
} else {
@@ -108,6 +114,10 @@ void cmd_version(UBool /* noLoad */, UErrorCode &errorCode)
errorCode=U_INTERNAL_PROGRAM_ERROR;
}
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif
+
printf("\n\nICU Initialization returned: %s\n", u_errorName(initStatus));
diff --git a/Build/source/libs/icu/icu-src/source/tools/icuinfo/icuinfo.vcxproj b/Build/source/libs/icu/icu-src/source/tools/icuinfo/icuinfo.vcxproj
index ba332864a71..78ac7fa1ef8 100644
--- a/Build/source/libs/icu/icu-src/source/tools/icuinfo/icuinfo.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/icuinfo/icuinfo.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{E7611F49-F088-4175-9446-6111444E72C8}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -34,125 +33,58 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
- <!-- Options that are common to *all* project configurations -->
+ <!-- Options that are common to *all* configurations -->
<ItemDefinitionGroup>
+ <Midl>
+ <TypeLibraryName>$(OutDir)\icuinfo.tlb</TypeLibraryName>
+ </Midl>
<ClCompile>
- <AdditionalIncludeDirectories>..\..\common;..\..\i18n;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
<WarningLevel>Level4</WarningLevel>
- </ClCompile>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <ClCompile>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>x86\Release/icuinfo.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>x86\Release/</AssemblerListingLocation>
- <ObjectFileName>x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>x86\Release/</ProgramDataBaseFileName>
<CompileAs>Default</CompileAs>
+ <DisableLanguageExtensions>false</DisableLanguageExtensions>
+ <AdditionalIncludeDirectories>..\..\common;..\..\i18n;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderOutputFile>$(OutDir)\icuinfo.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)\icuinfo.pdb</ProgramDataBaseFileName>
</ClCompile>
<Link>
- <OutputFile>$(OutDir)icuinfo.exe</OutputFile>
- <AdditionalDependencies>icuuc.lib;icuin.lib;icutu.lib;icutest.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>x86\Release/icuinfo.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <OutputFile>$(OutDir)\icuinfo.exe</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
+ <Command>copy "$(TargetPath)" ..\..\..\$(IcuBinOutputDir)</Command>
+ <Outputs>..\..\..\$(IcuBinOutputDir)\$(TargetFileName);%(Outputs)</Outputs>
</CustomBuildStep>
+ </ItemDefinitionGroup>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>Debug/icuinfo.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>Debug/</AssemblerListingLocation>
- <ObjectFileName>Debug/</ObjectFileName>
- <ProgramDataBaseFileName>Debug/</ProgramDataBaseFileName>
<BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
<Link>
- <OutputFile>$(OutDir)icuinfo.exe</OutputFile>
<AdditionalDependencies>icuucd.lib;icuind.lib;icutud.lib;icutestd.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>$(OutDir)icuinfo.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>x64\Release/icuinfo.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>x64\Release/</AssemblerListingLocation>
- <ObjectFileName>x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>x64\Release/</ProgramDataBaseFileName>
- <CompileAs>Default</CompileAs>
</ClCompile>
<Link>
- <OutputFile>$(OutDir)icuinfo.exe</OutputFile>
<AdditionalDependencies>icuuc.lib;icuin.lib;icutu.lib;icutest.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>x64\Release/icuinfo.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <ClCompile>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>Debug/icuinfo.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>Debug/</AssemblerListingLocation>
- <ObjectFileName>Debug/</ObjectFileName>
- <ProgramDataBaseFileName>Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- </ClCompile>
- <Link>
- <OutputFile>$(OutDir)icuinfo.exe</OutputFile>
- <AdditionalDependencies>icuucd.lib;icuind.lib;icutud.lib;icutestd.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>$(OutDir)icuinfo.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/tools/icuinfo/testplug.vcxproj b/Build/source/libs/icu/icu-src/source/tools/icuinfo/testplug.vcxproj
index 058c495322d..ca81f1a7698 100644
--- a/Build/source/libs/icu/icu-src/source/tools/icuinfo/testplug.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/icuinfo/testplug.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -34,195 +33,61 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\..\..\..\lib\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release-testplug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\..\..\..\lib\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug-testplug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release-testplug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release-testplug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug-testplug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug-testplug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <!-- Options that are common to *all* project configurations -->
+ <ItemDefinitionGroup>
<Midl>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MkTypLibCompatible>true</MkTypLibCompatible>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <TargetEnvironment>Win32</TargetEnvironment>
- <TypeLibraryName>.\..\..\..\lib\testplug.tlb</TypeLibraryName>
+ <TypeLibraryName>$(OutDir)\testplug.tlb</TypeLibraryName>
</Midl>
<ClCompile>
- <WholeProgramOptimization>true</WholeProgramOptimization>
<AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PreprocessorDefinitions>T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Release-testplug/testplug.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release-testplug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release-testplug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release-testplug/</ProgramDataBaseFileName>
<WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <PrecompiledHeaderOutputFile>$(OutDir)\testplug.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)\testplug.pdb</ProgramDataBaseFileName>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>..\..\..\bin\testplug.dll</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\..\..\..\lib\testplug.pdb</ProgramDatabaseFile>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
- <ImportLibrary>.\..\..\..\lib\testplug.lib</ImportLibrary>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Midl>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MkTypLibCompatible>true</MkTypLibCompatible>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <TargetEnvironment>Win32</TargetEnvironment>
- <TypeLibraryName>.\..\..\..\lib\testplugd.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x86\Debug-testplug/testplug.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug-testplug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug-testplug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug-testplug/</ProgramDataBaseFileName>
<BrowseInformation>true</BrowseInformation>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>..\..\..\bin\testplug.dll</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\..\..\..\lib\testplugd.pdb</ProgramDatabaseFile>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
- <ImportLibrary>.\..\..\..\lib\testplugd.lib</ImportLibrary>
+ <OutputFile>..\..\..\$(IcuBinOutputDir)\testplugd.dll</OutputFile>
+ <ProgramDatabaseFile>..\..\..\$(IcuLibOutputDir)\testplugd.pdb</ProgramDatabaseFile>
+ <ImportLibrary>..\..\..\$(IcuLibOutputDir)\testplugd.lib</ImportLibrary>
+ <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Midl>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MkTypLibCompatible>true</MkTypLibCompatible>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\..\..\..\lib64\testplug.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Release-testplug/testplug.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release-testplug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release-testplug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release-testplug/</ProgramDataBaseFileName>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>..\..\..\bin64\testplug.dll</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
+ <OutputFile>..\..\..\$(IcuBinOutputDir)\testplug.dll</OutputFile>
+ <ProgramDatabaseFile>..\..\..\$(IcuLibOutputDir)\testplug.pdb</ProgramDatabaseFile>
+ <ImportLibrary>..\..\..\$(IcuLibOutputDir)\testplug.lib</ImportLibrary>
<AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\..\..\..\lib64\testplug.pdb</ProgramDatabaseFile>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- <ImportLibrary>.\..\..\..\lib64\testplug.lib</ImportLibrary>
- <TargetMachine>MachineX64</TargetMachine>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Midl>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MkTypLibCompatible>true</MkTypLibCompatible>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <TargetEnvironment>X64</TargetEnvironment>
- <TypeLibraryName>.\..\..\..\lib64\testplugd.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <BufferSecurityCheck>true</BufferSecurityCheck>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
- <PrecompiledHeaderOutputFile>.\x64\Debug-testplug/testplug.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug-testplug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug-testplug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug-testplug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <WarningLevel>Level3</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
- </ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <Culture>0x0409</Culture>
- </ResourceCompile>
- <Link>
- <OutputFile>..\..\..\bin64\testplug.dll</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\..\..\..\lib64\testplugd.pdb</ProgramDatabaseFile>
- <ImportLibrary>.\..\..\..\lib64\testplugd.lib</ImportLibrary>
- <TargetMachine>MachineX64</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/tools/icupkg/icupkg.vcxproj b/Build/source/libs/icu/icu-src/source/tools/icupkg/icupkg.vcxproj
index f75d40a4077..1af31e079c4 100644
--- a/Build/source/libs/icu/icu-src/source/tools/icupkg/icupkg.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/icupkg/icupkg.vcxproj
@@ -1,18 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}</ProjectGuid>
- <Keyword>Win32Proj</Keyword>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -35,126 +33,58 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
- <!-- Options that are common to *all* project configurations -->
+ <!-- Options that are common to *all* configurations -->
<ItemDefinitionGroup>
+ <Midl>
+ <TypeLibraryName>$(OutDir)\icupkg.tlb</TypeLibraryName>
+ </Midl>
<ClCompile>
- <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
<WarningLevel>Level4</WarningLevel>
- </ClCompile>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <ClCompile>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>x86\Release/icupkg.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>x86\Release/</AssemblerListingLocation>
- <ObjectFileName>x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>x86\Release/</ProgramDataBaseFileName>
<CompileAs>Default</CompileAs>
+ <DisableLanguageExtensions>true</DisableLanguageExtensions>
+ <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderOutputFile>$(OutDir)\icupkg.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)\icupkg.pdb</ProgramDataBaseFileName>
</ClCompile>
<Link>
- <OutputFile>$(OutDir)icupkg.exe</OutputFile>
- <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>x86\Release/icupkg.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <OutputFile>$(OutDir)\icupkg.exe</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
+ <Command>copy "$(TargetPath)" ..\..\..\$(IcuBinOutputDir)</Command>
+ <Outputs>..\..\..\$(IcuBinOutputDir)\$(TargetFileName);%(Outputs)</Outputs>
</CustomBuildStep>
+ </ItemDefinitionGroup>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>Debug/icupkg.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>Debug/</AssemblerListingLocation>
- <ObjectFileName>Debug/</ObjectFileName>
- <ProgramDataBaseFileName>Debug/</ProgramDataBaseFileName>
<BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
<Link>
- <OutputFile>$(OutDir)icupkg.exe</OutputFile>
<AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>$(OutDir)icupkg.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>x64\Release/icupkg.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>x64\Release/</AssemblerListingLocation>
- <ObjectFileName>x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>x64\Release/</ProgramDataBaseFileName>
- <CompileAs>Default</CompileAs>
</ClCompile>
<Link>
- <OutputFile>$(OutDir)icupkg.exe</OutputFile>
<AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>x64\Release/icupkg.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <ClCompile>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>Debug/icupkg.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>Debug/</AssemblerListingLocation>
- <ObjectFileName>Debug/</ObjectFileName>
- <ProgramDataBaseFileName>Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- </ClCompile>
- <Link>
- <OutputFile>$(OutDir)icupkg.exe</OutputFile>
- <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>$(OutDir)icupkg.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/tools/makeconv/gencnvex.c b/Build/source/libs/icu/icu-src/source/tools/makeconv/gencnvex.c
index dcc849d8eda..726a1e5a86d 100644
--- a/Build/source/libs/icu/icu-src/source/tools/makeconv/gencnvex.c
+++ b/Build/source/libs/icu/icu-src/source/tools/makeconv/gencnvex.c
@@ -107,12 +107,17 @@ CnvExtClose(NewConverter *cnvData) {
static UBool
CnvExtIsValid(NewConverter *cnvData,
const uint8_t *bytes, int32_t length) {
+ // suppress compiler warnings about unused variables
+ (void)cnvData;
+ (void)bytes;
+ (void)length;
return FALSE;
}
static uint32_t
CnvExtWrite(NewConverter *cnvData, const UConverterStaticData *staticData,
UNewDataMemory *pData, int32_t tableType) {
+ (void) staticData; // suppress compiler warnings about unused variable
CnvExtData *extData=(CnvExtData *)cnvData;
int32_t length, top, headerSize;
@@ -121,7 +126,7 @@ CnvExtWrite(NewConverter *cnvData, const UConverterStaticData *staticData,
if(tableType&TABLE_BASE) {
headerSize=0;
} else {
- _MBCSHeader header={ { 0, 0, 0, 0 }, 0, 0, 0, 0, 0, 0, 0 };
+ _MBCSHeader header={ { 0, 0, 0, 0 }, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
/* write the header and base table name for an extension-only table */
length=(int32_t)uprv_strlen(extData->ucm->baseName)+1;
diff --git a/Build/source/libs/icu/icu-src/source/tools/makeconv/makeconv.cpp b/Build/source/libs/icu/icu-src/source/tools/makeconv/makeconv.cpp
index 5a01e209152..37dc46203f1 100644
--- a/Build/source/libs/icu/icu-src/source/tools/makeconv/makeconv.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/makeconv/makeconv.cpp
@@ -179,6 +179,7 @@ enum {
OPT_SMALL,
OPT_IGNORE_SISO_CHECK,
OPT_QUIET,
+ OPT_SOURCEDIR,
OPT_COUNT
};
@@ -193,6 +194,7 @@ static UOption options[]={
{ "small", NULL, NULL, NULL, '\1', UOPT_NO_ARG, 0 },
{ "ignore-siso-check", NULL, NULL, NULL, '\1', UOPT_NO_ARG, 0 },
UOPTION_QUIET,
+ UOPTION_SOURCEDIR,
};
int main(int argc, char* argv[])
@@ -230,7 +232,8 @@ int main(int argc, char* argv[])
"\t-c or --copyright include a copyright notice\n"
"\t-d or --destdir destination directory, followed by the path\n"
"\t-v or --verbose Turn on verbose output\n"
- "\t-q or --quiet do not display warnings and progress\n",
+ "\t-q or --quiet do not display warnings and progress\n"
+ "\t-s or --sourcedir source directory, followed by the path\n",
argv[0]);
fprintf(stdfile,
"\t --small Generate smaller .cnv files. They will be\n"
@@ -282,11 +285,20 @@ int main(int argc, char* argv[])
#endif
UBool printFilename = (UBool) (argc > 2 || VERBOSE);
+ icu::CharString pathBuf;
for (++argv; --argc; ++argv)
{
UErrorCode localError = U_ZERO_ERROR;
const char *arg = getLongPathname(*argv);
+ const char* sourcedir = options[OPT_SOURCEDIR].value;
+ if (sourcedir != NULL && *sourcedir != 0 && uprv_strcmp(sourcedir, ".") != 0) {
+ pathBuf.clear();
+ pathBuf.appendPathPart(sourcedir, localError);
+ pathBuf.appendPathPart(arg, localError);
+ arg = pathBuf.data();
+ }
+
/*produces the right destination path for display*/
outFileName.truncate(outBasenameStart);
if (outBasenameStart != 0)
diff --git a/Build/source/libs/icu/icu-src/source/tools/makeconv/makeconv.vcxproj b/Build/source/libs/icu/icu-src/source/tools/makeconv/makeconv.vcxproj
index b5a15279e6c..73c94a7c289 100644
--- a/Build/source/libs/icu/icu-src/source/tools/makeconv/makeconv.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/makeconv/makeconv.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -34,135 +33,58 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
- <!-- Options that are common to *all* project configurations -->
+ <!-- Options that are common to *all* configurations -->
<ItemDefinitionGroup>
- <ClCompile>
- <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <DisableLanguageExtensions>false</DisableLanguageExtensions>
- <WarningLevel>Level3</WarningLevel>
- </ClCompile>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
<Midl>
- <TypeLibraryName>.\x86\Debug/makeconv.tlb</TypeLibraryName>
+ <TypeLibraryName>$(OutDir)/makeconv.tlb</TypeLibraryName>
</Midl>
<ClCompile>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x86\Debug/makeconv.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <WarningLevel>Level3</WarningLevel>
<CompileAs>Default</CompileAs>
+ <DisableLanguageExtensions>false</DisableLanguageExtensions>
+ <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderOutputFile>$(OutDir)/makeconv.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)/makeconv.pdb</ProgramDataBaseFileName>
</ClCompile>
<Link>
- <OutputFile>.\x86\Debug/makeconv.exe</OutputFile>
- <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x86\Debug/makeconv.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <OutputFile>$(OutDir)/makeconv.exe</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
+ <Command>copy "$(TargetPath)" ..\..\..\$(IcuBinOutputDir)</Command>
+ <Outputs>..\..\..\$(IcuBinOutputDir)\$(TargetFileName);%(Outputs)</Outputs>
</CustomBuildStep>
- <Midl>
- <TypeLibraryName>.\x86\Release/makeconv.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x86\Release/makeconv.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
- <CompileAs>Default</CompileAs>
- </ClCompile>
- <Link>
- <OutputFile>.\x86\Release/makeconv.exe</OutputFile>
- <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x86\Release/makeconv.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
- </Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TypeLibraryName>.\x64\Debug/makeconv.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x64\Debug/makeconv.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
<BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
<Link>
- <OutputFile>.\x64\Debug/makeconv.exe</OutputFile>
<AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x64\Debug/makeconv.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TypeLibraryName>.\x64\Release/makeconv.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x64\Release/makeconv.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- <CompileAs>Default</CompileAs>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
</ClCompile>
<Link>
- <OutputFile>.\x64\Release/makeconv.exe</OutputFile>
<AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x64\Release/makeconv.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/tools/pkgdata/pkgdata.cpp b/Build/source/libs/icu/icu-src/source/tools/pkgdata/pkgdata.cpp
index b2cd0ab5eb9..1f318ac0f3a 100644
--- a/Build/source/libs/icu/icu-src/source/tools/pkgdata/pkgdata.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/pkgdata/pkgdata.cpp
@@ -122,8 +122,9 @@ enum {
QUIET,
WITHOUT_ASSEMBLY,
PDS_BUILD,
- UWP_BUILD,
- UWP_ARM_BUILD
+ WIN_UWP_BUILD,
+ WIN_DLL_ARCH,
+ WIN_DYNAMICBASE
};
/* This sets the modes that are available */
@@ -167,7 +168,8 @@ static UOption options[]={
/*20*/ UOPTION_DEF( "without-assembly", 'w', UOPT_NO_ARG),
/*21*/ UOPTION_DEF("zos-pds-build", 'z', UOPT_NO_ARG),
/*22*/ UOPTION_DEF("windows-uwp-build", 'u', UOPT_NO_ARG),
- /*23*/ UOPTION_DEF("windows-uwp-arm-build", 'a', UOPT_NO_ARG)
+ /*23*/ UOPTION_DEF("windows-DLL-arch", 'a', UOPT_REQUIRES_ARG),
+ /*24*/ UOPTION_DEF("windows-dynamicbase", 'b', UOPT_NO_ARG),
};
/* This enum and the following char array should be kept in sync. */
@@ -258,7 +260,8 @@ const char options_help[][320]={
"Build the data without assembly code",
"Build PDS dataset (zOS build only)",
"Build for Universal Windows Platform (Windows build only)",
- "Set DLL machine type for UWP to target windows ARM (Windows UWP build only)"
+ "Specify the DLL machine architecture for LINK.exe (Windows build only)",
+ "Ignored. Enable DYNAMICBASE on the DLL. This is now the default. (Windows build only)",
};
const char *progname = "PKGDATA";
@@ -468,6 +471,10 @@ main(int argc, char* argv[]) {
#endif
}
+ if (options[WIN_DYNAMICBASE].doesOccur) {
+ fprintf(stdout, "Note: Ignoring option -b (windows-dynamicbase).\n");
+ }
+
/* OK options are set up. Now the file lists. */
tail = NULL;
for( n=1; n<argc; n++) {
@@ -504,7 +511,6 @@ main(int argc, char* argv[]) {
if (o.files != NULL) {
pkg_deleteList(o.files);
}
-
return result;
}
@@ -544,6 +550,7 @@ normal_command_mode:
int result = system(cmd);
if (result != 0) {
fprintf(stderr, "-- return status = %d\n", result);
+ result = 1; // system() result code is platform specific.
}
if (cmd != cmdBuffer && cmd != command) {
@@ -718,7 +725,13 @@ static int32_t pkg_executeOptions(UPKGOptions *o) {
if (genccodeAssembly &&
(uprv_strlen(genccodeAssembly)>3) &&
checkAssemblyHeaderName(genccodeAssembly+3)) {
- writeAssemblyCode(datFileNamePath, o->tmpDir, o->entryName, NULL, gencFilePath);
+ writeAssemblyCode(
+ datFileNamePath,
+ o->tmpDir,
+ o->entryName,
+ NULL,
+ gencFilePath,
+ sizeof(gencFilePath));
result = pkg_createWithAssemblyCode(targetDir, mode, gencFilePath);
if (result != 0) {
@@ -753,7 +766,14 @@ static int32_t pkg_executeOptions(UPKGOptions *o) {
/* Try to detect the arch type, use NULL if unsuccessful */
char optMatchArch[10] = { 0 };
pkg_createOptMatchArch(optMatchArch);
- writeObjectCode(datFileNamePath, o->tmpDir, o->entryName, (optMatchArch[0] == 0 ? NULL : optMatchArch), NULL, gencFilePath);
+ writeObjectCode(
+ datFileNamePath,
+ o->tmpDir,
+ o->entryName,
+ (optMatchArch[0] == 0 ? NULL : optMatchArch),
+ NULL,
+ gencFilePath,
+ sizeof(gencFilePath));
pkg_destroyOptMatchArch(optMatchArch);
#if U_PLATFORM_IS_LINUX_BASED
result = pkg_generateLibraryFile(targetDir, mode, gencFilePath);
@@ -1350,8 +1370,8 @@ static int32_t pkg_generateLibraryFile(const char *targetDir, const char mode, c
if (IN_STATIC_MODE(mode)) {
if (cmd == NULL) {
- length = uprv_strlen(pkgDataFlags[AR]) + uprv_strlen(pkgDataFlags[ARFLAGS]) + uprv_strlen(targetDir) +
- uprv_strlen(libFileNames[LIB_FILE_VERSION]) + uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[RANLIB]) + BUFFER_PADDING_SIZE;
+ length = static_cast<int32_t>(uprv_strlen(pkgDataFlags[AR]) + uprv_strlen(pkgDataFlags[ARFLAGS]) + uprv_strlen(targetDir) +
+ uprv_strlen(libFileNames[LIB_FILE_VERSION]) + uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[RANLIB]) + BUFFER_PADDING_SIZE);
if ((cmd = (char *)uprv_malloc(sizeof(char) * length)) == NULL) {
fprintf(stderr, "Unable to allocate memory for command.\n");
return -1;
@@ -1376,15 +1396,15 @@ static int32_t pkg_generateLibraryFile(const char *targetDir, const char mode, c
}
} else /* if (IN_DLL_MODE(mode)) */ {
if (cmd == NULL) {
- length = uprv_strlen(pkgDataFlags[GENLIB]) + uprv_strlen(pkgDataFlags[LDICUDTFLAGS]) +
+ length = static_cast<int32_t>(uprv_strlen(pkgDataFlags[GENLIB]) + uprv_strlen(pkgDataFlags[LDICUDTFLAGS]) +
((uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_VERSION_TMP])) * 2) +
uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[LD_SONAME]) +
uprv_strlen(pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION_MAJOR]) +
- uprv_strlen(pkgDataFlags[RPATH_FLAGS]) + uprv_strlen(pkgDataFlags[BIR_FLAGS]) + BUFFER_PADDING_SIZE;
+ uprv_strlen(pkgDataFlags[RPATH_FLAGS]) + uprv_strlen(pkgDataFlags[BIR_FLAGS]) + BUFFER_PADDING_SIZE);
#if U_PLATFORM == U_PF_CYGWIN
- length += uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_CYGWIN_VERSION]);
+ length += static_cast<int32_t>(uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_CYGWIN_VERSION]));
#elif U_PLATFORM == U_PF_MINGW
- length += uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_MINGW]);
+ length += static_cast<int32_t>(uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_MINGW]));
#endif
if ((cmd = (char *)uprv_malloc(sizeof(char) * length)) == NULL) {
fprintf(stderr, "Unable to allocate memory for command.\n");
@@ -1516,8 +1536,8 @@ static int32_t pkg_createWithAssemblyCode(const char *targetDir, const char mode
uprv_strcpy(tempObjectFile, gencFilePath);
tempObjectFile[uprv_strlen(tempObjectFile)-1] = 'o';
- length = uprv_strlen(pkgDataFlags[COMPILER]) + uprv_strlen(pkgDataFlags[LIBFLAGS])
- + uprv_strlen(tempObjectFile) + uprv_strlen(gencFilePath) + BUFFER_PADDING_SIZE;
+ length = static_cast<int32_t>(uprv_strlen(pkgDataFlags[COMPILER]) + uprv_strlen(pkgDataFlags[LIBFLAGS])
+ + uprv_strlen(tempObjectFile) + uprv_strlen(gencFilePath) + BUFFER_PADDING_SIZE);
cmd = (char *)uprv_malloc(sizeof(char) * length);
if (cmd == NULL) {
@@ -1685,7 +1705,13 @@ static int32_t pkg_createWithoutAssemblyCode(UPKGOptions *o, const char *targetD
printf("# Generating %s \n", gencmnFile);
}
- writeCCode(file, o->tmpDir, dataName[0] != 0 ? dataName : o->shortName, newName[0] != 0 ? newName : NULL, gencmnFile);
+ writeCCode(
+ file,
+ o->tmpDir,
+ dataName[0] != 0 ? dataName : o->shortName,
+ newName[0] != 0 ? newName : NULL,
+ gencmnFile,
+ sizeof(gencmnFile));
#ifdef USE_SINGLE_CCODE_FILE
sprintf(cmd, "#include \"%s\"\n", gencmnFile);
@@ -1758,14 +1784,12 @@ static int32_t pkg_createWithoutAssemblyCode(UPKGOptions *o, const char *targetD
#ifdef WINDOWS_WITH_MSVC
#define LINK_CMD "link.exe /nologo /release /out:"
-#define LINK_FLAGS "/DLL /NOENTRY /MANIFEST:NO /implib:"
-#ifdef _WIN64
-#define LINK_EXTRA_UWP_FLAGS "/NXCOMPAT /DYNAMICBASE /APPCONTAINER "
-#else
-#define LINK_EXTRA_UWP_FLAGS "/NXCOMPAT /SAFESEH /DYNAMICBASE /APPCONTAINER /MACHINE:X86"
-#endif
-#define LINK_EXTRA_UWP_FLAGS_ARM "/NXCOMPAT /DYNAMICBASE /APPCONTAINER /MACHINE:ARM"
-#define LINK_EXTRA_NO_UWP_FLAGS "/base:0x4ad00000 "
+#define LINK_FLAGS "/NXCOMPAT /DYNAMICBASE /DLL /NOENTRY /MANIFEST:NO /implib:"
+
+#define LINK_EXTRA_UWP_FLAGS "/APPCONTAINER "
+#define LINK_EXTRA_UWP_FLAGS_X86_ONLY "/SAFESEH "
+
+#define LINK_EXTRA_FLAGS_MACHINE "/MACHINE:"
#define LIB_CMD "LIB.exe /nologo /out:"
#define LIB_FILE "icudt.lib"
#define LIB_EXT UDATA_LIB_SUFFIX
@@ -1845,23 +1869,23 @@ static int32_t pkg_createWindowsDLL(const char mode, const char *gencFilePath, U
return 0;
}
- char *extraFlags = "";
+ char extraFlags[SMALL_BUFFER_MAX_SIZE] = "";
#ifdef WINDOWS_WITH_MSVC
- if (options[UWP_BUILD].doesOccur)
- {
- if (options[UWP_ARM_BUILD].doesOccur)
- {
- extraFlags = LINK_EXTRA_UWP_FLAGS_ARM;
- }
- else
- {
- extraFlags = LINK_EXTRA_UWP_FLAGS;
+ if (options[WIN_UWP_BUILD].doesOccur) {
+ uprv_strcat(extraFlags, LINK_EXTRA_UWP_FLAGS);
+
+ if (options[WIN_DLL_ARCH].doesOccur) {
+ if (uprv_strcmp(options[WIN_DLL_ARCH].value, "X86") == 0) {
+ uprv_strcat(extraFlags, LINK_EXTRA_UWP_FLAGS_X86_ONLY);
+ }
}
}
- else
- {
- extraFlags = LINK_EXTRA_NO_UWP_FLAGS;
+
+ if (options[WIN_DLL_ARCH].doesOccur) {
+ uprv_strcat(extraFlags, LINK_EXTRA_FLAGS_MACHINE);
+ uprv_strcat(extraFlags, options[WIN_DLL_ARCH].value);
}
+
#endif
sprintf(cmd, "%s\"%s\" %s %s\"%s\" \"%s\" %s",
LINK_CMD,
@@ -1905,7 +1929,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) {
char *tmpGenlibFlagBuffer = NULL;
int32_t i, offset;
- length = uprv_strlen(flag) + 1;
+ length = static_cast<int32_t>(uprv_strlen(flag) + 1);
tmpGenlibFlagBuffer = (char *)uprv_malloc(length);
if (tmpGenlibFlagBuffer == NULL) {
/* Memory allocation error */
@@ -1915,7 +1939,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) {
uprv_strcpy(tmpGenlibFlagBuffer, flag);
- offset = uprv_strlen(rm_cmd);
+ offset = static_cast<int32_t>(uprv_strlen(rm_cmd));
for (i = 0; i < (length - offset); i++) {
flag[i] = tmpGenlibFlagBuffer[offset + i];
@@ -1928,7 +1952,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) {
}
flag = pkgDataFlags[BIR_FLAGS];
- length = uprv_strlen(pkgDataFlags[BIR_FLAGS]);
+ length = static_cast<int32_t>(uprv_strlen(pkgDataFlags[BIR_FLAGS]));
for (int32_t i = 0; i < length; i++) {
if (flag[i] == MAP_FILE_EXT[count]) {
@@ -1988,7 +2012,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) {
int32_t length = 0;
flag = pkgDataFlags[GENLIB];
- length = uprv_strlen(pkgDataFlags[GENLIB]);
+ length = static_cast<int32_t>(uprv_strlen(pkgDataFlags[GENLIB]));
int32_t position = length - 1;
@@ -2006,7 +2030,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) {
int32_t length = 0;
flag = pkgDataFlags[GENLIB];
- length = uprv_strlen(pkgDataFlags[GENLIB]);
+ length = static_cast<int32_t>(uprv_strlen(pkgDataFlags[GENLIB]));
int32_t position = length - 1;
@@ -2117,8 +2141,8 @@ static void loadLists(UPKGOptions *o, UErrorCode *status)
fprintf(stderr, "pkgdata: Error: absolute path encountered. Old style paths are not supported. Use relative paths such as 'fur.res' or 'translit%cfur.res'.\n\tBad path: '%s'\n", U_FILE_SEP_CHAR, s);
exit(U_ILLEGAL_ARGUMENT_ERROR);
}
- tmpLength = uprv_strlen(o->srcDir) +
- uprv_strlen(s) + 5; /* 5 is to add a little extra space for, among other things, PKGDATA_FILE_SEP_STRING */
+ /* The +5 is to add a little extra space for, among other things, PKGDATA_FILE_SEP_STRING */
+ tmpLength = static_cast<int32_t>(uprv_strlen(o->srcDir) + uprv_strlen(s) + 5);
if((tmp = (char *)uprv_malloc(tmpLength)) == NULL) {
fprintf(stderr, "pkgdata: Error: Unable to allocate tmp buffer size: %d\n", tmpLength);
exit(U_MEMORY_ALLOCATION_ERROR);
diff --git a/Build/source/libs/icu/icu-src/source/tools/pkgdata/pkgdata.vcxproj b/Build/source/libs/icu/icu-src/source/tools/pkgdata/pkgdata.vcxproj
index 680cc2f799b..f2efdbd6b8f 100644
--- a/Build/source/libs/icu/icu-src/source/tools/pkgdata/pkgdata.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/pkgdata/pkgdata.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{4C8454FE-81D3-4CA3-9927-29BA96F03DAC}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -34,151 +33,58 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
- <!-- Options that are common to *all* project configurations -->
+ <!-- Options that are common to *all* configurations -->
<ItemDefinitionGroup>
- <ClCompile>
- <AdditionalIncludeDirectories>../../../include;../../common;../toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <DisableLanguageExtensions>true</DisableLanguageExtensions>
- <WarningLevel>Level3</WarningLevel>
- </ClCompile>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
<Midl>
- <TypeLibraryName>.\x86\Debug/pkgdata.tlb</TypeLibraryName>
+ <TypeLibraryName>$(OutDir)/pkgdata.tlb</TypeLibraryName>
</Midl>
<ClCompile>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x86\Debug/pkgdata.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <WarningLevel>Level3</WarningLevel>
<CompileAs>Default</CompileAs>
+ <DisableLanguageExtensions>true</DisableLanguageExtensions>
+ <AdditionalIncludeDirectories>../../../include;../../common;../toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderOutputFile>$(OutDir)/pkgdata.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(OutDir)/</AssemblerListingLocation>
+ <ObjectFileName>$(OutDir)/</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)/pkgdata.pdb</ProgramDataBaseFileName>
</ClCompile>
- <ResourceCompile>
- <Culture>0x0411</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x86\Debug/pkgdata.exe</OutputFile>
- <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>.\x86\Debug/pkgdata.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
+ <OutputFile>$(OutDir)/pkgdata.exe</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\$(IcuLibOutputDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin
-</Command>
- <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
+ <Command>copy "$(TargetPath)" ..\..\..\$(IcuBinOutputDir)</Command>
+ <Outputs>..\..\..\$(IcuBinOutputDir)\$(TargetFileName);%(Outputs)</Outputs>
</CustomBuildStep>
- <Midl>
- <TypeLibraryName>.\x86\Release/pkgdata.tlb</TypeLibraryName>
- </Midl>
- <ClCompile>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>.\x86\Release/pkgdata.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
- <CompileAs>Default</CompileAs>
- </ClCompile>
- <ResourceCompile>
- <Culture>0x0411</Culture>
- </ResourceCompile>
- <Link>
- <OutputFile>.\x86\Release/pkgdata.exe</OutputFile>
- <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x86\Release/pkgdata.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
- <DataExecutionPrevention>
- </DataExecutionPrevention>
- </Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TypeLibraryName>.\x64\Debug/pkgdata.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x64\Debug/pkgdata.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
<BrowseInformation>true</BrowseInformation>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
- <ResourceCompile>
- <Culture>0x0411</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x64\Debug/pkgdata.exe</OutputFile>
<AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x64\Debug/pkgdata.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <CustomBuildStep>
- <Command>copy "$(TargetPath)" ..\..\..\bin64
-</Command>
- <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
- </CustomBuildStep>
- <Midl>
- <TypeLibraryName>.\x64\Release/pkgdata.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>.\x64\Release/pkgdata.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <CompileAs>Default</CompileAs>
</ClCompile>
- <ResourceCompile>
- <Culture>0x0411</Culture>
- </ResourceCompile>
<Link>
- <OutputFile>.\x64\Release/pkgdata.exe</OutputFile>
<AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\x64\Release/pkgdata.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/tools/toolutil/filetools.cpp b/Build/source/libs/icu/icu-src/source/tools/toolutil/filetools.cpp
index 6e88c94b520..0f0e9c59846 100644
--- a/Build/source/libs/icu/icu-src/source/tools/toolutil/filetools.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/toolutil/filetools.cpp
@@ -65,7 +65,7 @@ isFileModTimeLater(const char *filePath, const char *checkAgainst, UBool isDir)
if (U_FAILURE(status)) {
fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, u_errorName(status));
return FALSE;
- };
+ }
if ((subDirp = opendir(newpath.data())) != NULL) {
/* If this new path is a directory, make a recursive call with the newpath. */
diff --git a/Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_genc.cpp b/Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_genc.cpp
index 0cf7a57ee11..3f71e00cb64 100644
--- a/Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_genc.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_genc.cpp
@@ -48,6 +48,8 @@
#include "uoptions.h"
#include "pkg_genc.h"
#include "filetools.h"
+#include "charstr.h"
+#include "unicode/errorcode.h"
#define MAX_COLUMN ((uint32_t)(0xFFFFFFFFU))
@@ -56,7 +58,15 @@
/* prototypes --------------------------------------------------------------- */
static void
-getOutFilename(const char *inFilename, const char *destdir, char *outFilename, char *entryName, const char *newSuffix, const char *optFilename);
+getOutFilename(
+ const char *inFilename,
+ const char *destdir,
+ char *outFilename,
+ int32_t outFilenameCapacity,
+ char *entryName,
+ int32_t entryNameCapacity,
+ const char *newSuffix,
+ const char *optFilename);
static uint32_t
write8(FileStream *out, uint8_t byte, uint32_t column);
@@ -259,13 +269,21 @@ printAssemblyHeadersToStdErr(void) {
}
U_CAPI void U_EXPORT2
-writeAssemblyCode(const char *filename, const char *destdir, const char *optEntryPoint, const char *optFilename, char *outFilePath) {
+writeAssemblyCode(
+ const char *filename,
+ const char *destdir,
+ const char *optEntryPoint,
+ const char *optFilename,
+ char *outFilePath,
+ size_t outFilePathCapacity) {
uint32_t column = MAX_COLUMN;
- char entry[64];
- uint32_t buffer[1024];
- char *bufferStr = (char *)buffer;
+ char entry[96];
+ union {
+ uint32_t uint32s[1024];
+ char chars[4096];
+ } buffer;
FileStream *in, *out;
- size_t i, length;
+ size_t i, length, count;
in=T_FileStream_open(filename, "rb");
if(in==NULL) {
@@ -273,15 +291,27 @@ writeAssemblyCode(const char *filename, const char *destdir, const char *optEntr
exit(U_FILE_ACCESS_ERROR);
}
- getOutFilename(filename, destdir, bufferStr, entry, ".S", optFilename);
- out=T_FileStream_open(bufferStr, "w");
+ getOutFilename(
+ filename,
+ destdir,
+ buffer.chars,
+ sizeof(buffer.chars),
+ entry,
+ sizeof(entry),
+ ".S",
+ optFilename);
+ out=T_FileStream_open(buffer.chars, "w");
if(out==NULL) {
- fprintf(stderr, "genccode: unable to open output file %s\n", bufferStr);
+ fprintf(stderr, "genccode: unable to open output file %s\n", buffer.chars);
exit(U_FILE_ACCESS_ERROR);
}
if (outFilePath != NULL) {
- uprv_strcpy(outFilePath, bufferStr);
+ if (uprv_strlen(buffer.chars) >= outFilePathCapacity) {
+ fprintf(stderr, "genccode: filename too long\n");
+ exit(U_ILLEGAL_ARGUMENT_ERROR);
+ }
+ uprv_strcpy(outFilePath, buffer.chars);
}
#if defined (WINDOWS_WITH_GNUC) && U_PLATFORM != U_PF_CYGWIN
@@ -302,34 +332,42 @@ writeAssemblyCode(const char *filename, const char *destdir, const char *optEntr
}
}
- sprintf(bufferStr, assemblyHeader[assemblyHeaderIndex].header,
+ count = snprintf(
+ buffer.chars, sizeof(buffer.chars),
+ assemblyHeader[assemblyHeaderIndex].header,
entry, entry, entry, entry,
entry, entry, entry, entry);
- T_FileStream_writeLine(out, bufferStr);
+ if (count >= sizeof(buffer.chars)) {
+ fprintf(stderr, "genccode: entry name too long (long filename?)\n");
+ exit(U_ILLEGAL_ARGUMENT_ERROR);
+ }
+ T_FileStream_writeLine(out, buffer.chars);
T_FileStream_writeLine(out, assemblyHeader[assemblyHeaderIndex].beginLine);
for(;;) {
- length=T_FileStream_read(in, buffer, sizeof(buffer));
+ memset(buffer.uint32s, 0, sizeof(buffer.uint32s));
+ length=T_FileStream_read(in, buffer.uint32s, sizeof(buffer.uint32s));
if(length==0) {
break;
}
- if (length != sizeof(buffer)) {
- /* pad with extra 0's when at the end of the file */
- for(i=0; i < (length % sizeof(uint32_t)); ++i) {
- buffer[length+i] = 0;
- }
- }
- for(i=0; i<(length/sizeof(buffer[0])); i++) {
- column = write32(out, buffer[i], column);
+ for(i=0; i<(length/sizeof(buffer.uint32s[0])); i++) {
+ // TODO: What if the last read sees length not as a multiple of 4?
+ column = write32(out, buffer.uint32s[i], column);
}
}
T_FileStream_writeLine(out, "\n");
- sprintf(bufferStr, assemblyHeader[assemblyHeaderIndex].footer,
+ count = snprintf(
+ buffer.chars, sizeof(buffer.chars),
+ assemblyHeader[assemblyHeaderIndex].footer,
entry, entry, entry, entry,
entry, entry, entry, entry);
- T_FileStream_writeLine(out, bufferStr);
+ if (count >= sizeof(buffer.chars)) {
+ fprintf(stderr, "genccode: entry name too long (long filename?)\n");
+ exit(U_ILLEGAL_ARGUMENT_ERROR);
+ }
+ T_FileStream_writeLine(out, buffer.chars);
if(T_FileStream_error(in)) {
fprintf(stderr, "genccode: file read error while generating from file %s\n", filename);
@@ -346,11 +384,17 @@ writeAssemblyCode(const char *filename, const char *destdir, const char *optEntr
}
U_CAPI void U_EXPORT2
-writeCCode(const char *filename, const char *destdir, const char *optName, const char *optFilename, char *outFilePath) {
+writeCCode(
+ const char *filename,
+ const char *destdir,
+ const char *optName,
+ const char *optFilename,
+ char *outFilePath,
+ size_t outFilePathCapacity) {
uint32_t column = MAX_COLUMN;
- char buffer[4096], entry[64];
+ char buffer[4096], entry[96];
FileStream *in, *out;
- size_t i, length;
+ size_t i, length, count;
in=T_FileStream_open(filename, "rb");
if(in==NULL) {
@@ -359,16 +403,35 @@ writeCCode(const char *filename, const char *destdir, const char *optName, const
}
if(optName != NULL) { /* prepend 'icudt28_' */
- strcpy(entry, optName);
- strcat(entry, "_");
+ // +2 includes the _ and the NUL
+ if (uprv_strlen(optName) + 2 > sizeof(entry)) {
+ fprintf(stderr, "genccode: entry name too long (long filename?)\n");
+ exit(U_ILLEGAL_ARGUMENT_ERROR);
+ }
+ strcpy(entry, optName);
+ strcat(entry, "_");
} else {
- entry[0] = 0;
+ entry[0] = 0;
}
- getOutFilename(filename, destdir, buffer, entry+uprv_strlen(entry), ".c", optFilename);
+ getOutFilename(
+ filename,
+ destdir,
+ buffer,
+ sizeof(buffer),
+ entry + uprv_strlen(entry),
+ sizeof(entry) - uprv_strlen(entry),
+ ".c",
+ optFilename);
+
if (outFilePath != NULL) {
+ if (uprv_strlen(buffer) >= outFilePathCapacity) {
+ fprintf(stderr, "genccode: filename too long\n");
+ exit(U_ILLEGAL_ARGUMENT_ERROR);
+ }
uprv_strcpy(outFilePath, buffer);
}
+
out=T_FileStream_open(buffer, "w");
if(out==NULL) {
fprintf(stderr, "genccode: unable to open output file %s\n", buffer);
@@ -396,7 +459,7 @@ writeCCode(const char *filename, const char *destdir, const char *optName, const
magic numbers we must still use the initial double.
[grhoten 4/24/2003]
*/
- sprintf(buffer,
+ count = snprintf(buffer, sizeof(buffer),
"#ifndef IN_GENERATED_CCODE\n"
"#define IN_GENERATED_CCODE\n"
"#define U_DISABLE_RENAMING 1\n"
@@ -408,6 +471,10 @@ writeCCode(const char *filename, const char *destdir, const char *optName, const
" const char *bytes; \n"
"} %s={ 0.0, \n",
entry);
+ if (count >= sizeof(buffer)) {
+ fprintf(stderr, "genccode: entry name too long (long filename?)\n");
+ exit(U_ILLEGAL_ARGUMENT_ERROR);
+ }
T_FileStream_writeLine(out, buffer);
for(;;) {
@@ -423,7 +490,7 @@ writeCCode(const char *filename, const char *destdir, const char *optName, const
T_FileStream_writeLine(out, "\"\n};\nU_CDECL_END\n");
#else
/* Function renaming shouldn't be done in data */
- sprintf(buffer,
+ count = snprintf(buffer, sizeof(buffer),
"#ifndef IN_GENERATED_CCODE\n"
"#define IN_GENERATED_CCODE\n"
"#define U_DISABLE_RENAMING 1\n"
@@ -435,6 +502,10 @@ writeCCode(const char *filename, const char *destdir, const char *optName, const
" uint8_t bytes[%ld]; \n"
"} %s={ 0.0, {\n",
(long)T_FileStream_size(in), entry);
+ if (count >= sizeof(buffer)) {
+ fprintf(stderr, "genccode: entry name too long (long filename?)\n");
+ exit(U_ILLEGAL_ARGUMENT_ERROR);
+ }
T_FileStream_writeLine(out, buffer);
for(;;) {
@@ -588,66 +659,84 @@ write8str(FileStream *out, uint8_t byte, uint32_t column) {
#endif
static void
-getOutFilename(const char *inFilename, const char *destdir, char *outFilename, char *entryName, const char *newSuffix, const char *optFilename) {
+getOutFilename(
+ const char *inFilename,
+ const char *destdir,
+ char *outFilename,
+ int32_t outFilenameCapacity,
+ char *entryName,
+ int32_t entryNameCapacity,
+ const char *newSuffix,
+ const char *optFilename) {
const char *basename=findBasename(inFilename), *suffix=uprv_strrchr(basename, '.');
+ icu::CharString outFilenameBuilder;
+ icu::CharString entryNameBuilder;
+ icu::ErrorCode status;
+
/* copy path */
if(destdir!=NULL && *destdir!=0) {
- do {
- *outFilename++=*destdir++;
- } while(*destdir!=0);
- if(*(outFilename-1)!=U_FILE_SEP_CHAR) {
- *outFilename++=U_FILE_SEP_CHAR;
- }
- inFilename=basename;
+ outFilenameBuilder.append(destdir, status);
+ outFilenameBuilder.ensureEndsWithFileSeparator(status);
} else {
- while(inFilename<basename) {
- *outFilename++=*inFilename++;
- }
+ outFilenameBuilder.append(inFilename, basename - inFilename, status);
}
+ inFilename=basename;
if(suffix==NULL) {
/* the filename does not have a suffix */
- uprv_strcpy(entryName, inFilename);
+ entryNameBuilder.append(inFilename, status);
if(optFilename != NULL) {
- uprv_strcpy(outFilename, optFilename);
+ outFilenameBuilder.append(optFilename, status);
} else {
- uprv_strcpy(outFilename, inFilename);
+ outFilenameBuilder.append(inFilename, status);
}
- uprv_strcat(outFilename, newSuffix);
+ outFilenameBuilder.append(newSuffix, status);
} else {
- char *saveOutFilename = outFilename;
+ int32_t saveOutFilenameLength = outFilenameBuilder.length();
/* copy basename */
while(inFilename<suffix) {
- if(*inFilename=='-') {
- /* iSeries cannot have '-' in the .o objects. */
- *outFilename++=*entryName++='_';
- inFilename++;
- }
- else {
- *outFilename++=*entryName++=*inFilename++;
- }
+ // iSeries cannot have '-' in the .o objects.
+ char c = (*inFilename=='-') ? '_' : *inFilename;
+ outFilenameBuilder.append(c, status);
+ entryNameBuilder.append(c, status);
+ inFilename++;
}
/* replace '.' by '_' */
- *outFilename++=*entryName++='_';
+ outFilenameBuilder.append('_', status);
+ entryNameBuilder.append('_', status);
++inFilename;
/* copy suffix */
- while(*inFilename!=0) {
- *outFilename++=*entryName++=*inFilename++;
- }
-
- *entryName=0;
+ outFilenameBuilder.append(inFilename, status);
+ entryNameBuilder.append(inFilename, status);
if(optFilename != NULL) {
- uprv_strcpy(saveOutFilename, optFilename);
- uprv_strcat(saveOutFilename, newSuffix);
- } else {
- /* add ".c" */
- uprv_strcpy(outFilename, newSuffix);
+ outFilenameBuilder.truncate(saveOutFilenameLength);
+ outFilenameBuilder.append(optFilename, status);
}
+ // add ".c"
+ outFilenameBuilder.append(newSuffix, status);
}
+
+ if (status.isFailure()) {
+ fprintf(stderr, "genccode: error building filename or entrypoint\n");
+ exit(status.get());
+ }
+
+ if (outFilenameBuilder.length() >= outFilenameCapacity) {
+ fprintf(stderr, "genccode: output filename too long\n");
+ exit(U_ILLEGAL_ARGUMENT_ERROR);
+ }
+
+ if (entryNameBuilder.length() >= entryNameCapacity) {
+ fprintf(stderr, "genccode: entry name too long (long filename?)\n");
+ exit(U_ILLEGAL_ARGUMENT_ERROR);
+ }
+
+ uprv_strcpy(outFilename, outFilenameBuilder.data());
+ uprv_strcpy(entryName, entryNameBuilder.data());
}
#ifdef CAN_GENERATE_OBJECTS
@@ -685,23 +774,30 @@ getArchitecture(uint16_t *pCPU, uint16_t *pBits, UBool *pIsBigEndian, const char
*pBits=32;
*pIsBigEndian=(UBool)(U_IS_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB);
#elif U_PLATFORM_HAS_WIN32_API
-/* _M_IA64 should be defined in windows.h */
-# if defined(_M_IA64)
- *pCPU=IMAGE_FILE_MACHINE_IA64;
- *pBits = 64;
-# elif defined(_M_AMD64)
-// link.exe does not really care about the .obj machine type and this will
-// allow us to build a dll for both ARM & x64 with an amd64 built tool
-// ARM is same as x64 except for first 2 bytes of object file
- *pCPU = IMAGE_FILE_MACHINE_UNKNOWN;
- // *pCPU = IMAGE_FILE_MACHINE_ARMNT; // If we wanted to be explicit
- // *pCPU = IMAGE_FILE_MACHINE_AMD64; // We would use one of these names
- *pBits = 64; // Doesn't seem to be used for anything interesting?
+ // Windows always runs in little-endian mode.
+ *pIsBigEndian = FALSE;
+
+ // Note: The various _M_<arch> macros are predefined by the MSVC compiler based
+ // on the target compilation architecture.
+ // https://docs.microsoft.com/cpp/preprocessor/predefined-macros
+
+ // link.exe will link an IMAGE_FILE_MACHINE_UNKNOWN data-only .obj file
+ // no matter what architecture it is targeting (though other values are
+ // required to match). Unfortunately, the variable name decoration/mangling
+ // is slightly different on x86, which means we can't use the UNKNOWN type
+ // for all architectures though.
+# if defined(_M_IX86)
+ *pCPU = IMAGE_FILE_MACHINE_I386;
# else
- *pCPU=IMAGE_FILE_MACHINE_I386; // We would use one of these names
+ *pCPU = IMAGE_FILE_MACHINE_UNKNOWN;
+# endif
+# if defined(_M_IA64) || defined(_M_AMD64) || defined (_M_ARM64)
+ *pBits = 64; // Doesn't seem to be used for anything interesting though?
+# elif defined(_M_IX86) || defined(_M_ARM)
*pBits = 32;
+# else
+# error "Unknown platform for CAN_GENERATE_OBJECTS."
# endif
- *pIsBigEndian=FALSE;
#else
# error "Unknown platform for CAN_GENERATE_OBJECTS."
#endif
@@ -775,7 +871,14 @@ getArchitecture(uint16_t *pCPU, uint16_t *pBits, UBool *pIsBigEndian, const char
}
U_CAPI void U_EXPORT2
-writeObjectCode(const char *filename, const char *destdir, const char *optEntryPoint, const char *optMatchArch, const char *optFilename, char *outFilePath) {
+writeObjectCode(
+ const char *filename,
+ const char *destdir,
+ const char *optEntryPoint,
+ const char *optMatchArch,
+ const char *optFilename,
+ char *outFilePath,
+ size_t outFilePathCapacity) {
/* common variables */
char buffer[4096], entry[96]={ 0 };
FileStream *in, *out;
@@ -1059,8 +1162,21 @@ writeObjectCode(const char *filename, const char *destdir, const char *optEntryP
}
size=T_FileStream_size(in);
- getOutFilename(filename, destdir, buffer, entry+entryOffset, newSuffix, optFilename);
+ getOutFilename(
+ filename,
+ destdir,
+ buffer,
+ sizeof(buffer),
+ entry + entryOffset,
+ sizeof(entry) - entryOffset,
+ newSuffix,
+ optFilename);
+
if (outFilePath != NULL) {
+ if (uprv_strlen(buffer) >= outFilePathCapacity) {
+ fprintf(stderr, "genccode: filename too long\n");
+ exit(U_ILLEGAL_ARGUMENT_ERROR);
+ }
uprv_strcpy(outFilePath, buffer);
}
diff --git a/Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_genc.h b/Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_genc.h
index 5039f27db5e..47e8304a689 100644
--- a/Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_genc.h
+++ b/Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_genc.h
@@ -75,12 +75,31 @@ U_INTERNAL UBool U_EXPORT2
checkAssemblyHeaderName(const char* optAssembly);
U_INTERNAL void U_EXPORT2
-writeCCode(const char *filename, const char *destdir, const char *optName, const char *optFilename, char *outFilePath);
+writeCCode(
+ const char *filename,
+ const char *destdir,
+ const char *optName,
+ const char *optFilename,
+ char *outFilePath,
+ size_t outFilePathCapacity);
U_INTERNAL void U_EXPORT2
-writeAssemblyCode(const char *filename, const char *destdir, const char *optEntryPoint, const char *optFilename, char *outFilePath);
+writeAssemblyCode(
+ const char *filename,
+ const char *destdir,
+ const char *optEntryPoint,
+ const char *optFilename,
+ char *outFilePath,
+ size_t outFilePathCapacity);
U_INTERNAL void U_EXPORT2
-writeObjectCode(const char *filename, const char *destdir, const char *optEntryPoint, const char *optMatchArch, const char *optFilename, char *outFilePath);
+writeObjectCode(
+ const char *filename,
+ const char *destdir,
+ const char *optEntryPoint,
+ const char *optMatchArch,
+ const char *optFilename,
+ char *outFilePath,
+ size_t outFilePathCapacity);
#endif
diff --git a/Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_gencmn.cpp b/Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_gencmn.cpp
index 423e4b7363c..29a1f7bc180 100644
--- a/Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_gencmn.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_gencmn.cpp
@@ -379,14 +379,14 @@ createCommonDataFile(const char *destDir, const char *name, const char *entrypoi
" {0, 0, 0, 0}\n"
" },\n"
" \"\", %lu, 0, {\n",
- (unsigned long)32-4-sizeof(UDataInfo),
- (unsigned long)fileCount,
+ static_cast<unsigned long>(32-4-sizeof(UDataInfo)),
+ static_cast<unsigned long>(fileCount),
entrypointName,
- (unsigned long)sizeof(UDataInfo),
+ static_cast<unsigned long>(sizeof(UDataInfo)),
U_IS_BIG_ENDIAN,
U_CHARSET_FAMILY,
U_SIZEOF_UCHAR,
- (unsigned long)fileCount
+ static_cast<unsigned long>(fileCount)
);
T_FileStream_writeLine(out, buffer);
diff --git a/Build/source/libs/icu/icu-src/source/tools/toolutil/pkgitems.cpp b/Build/source/libs/icu/icu-src/source/tools/toolutil/pkgitems.cpp
index cb23b45e633..7b86c55fa42 100644
--- a/Build/source/libs/icu/icu-src/source/tools/toolutil/pkgitems.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/toolutil/pkgitems.cpp
@@ -305,7 +305,8 @@ ures_enumDependencies(const char *itemName,
break;
}
int32_t length;
- const UChar *alias=res_getString(pResData, res, &length);
+ // No tracing: build tool
+ const UChar *alias=res_getStringNoTrace(pResData, res, &length);
checkAlias(itemName, res, alias, length, useResSuffix, check, context, pErrorCode);
}
break;
diff --git a/Build/source/libs/icu/icu-src/source/tools/toolutil/swapimpl.cpp b/Build/source/libs/icu/icu-src/source/tools/toolutil/swapimpl.cpp
index e8850cb9864..926755a2aa8 100644
--- a/Build/source/libs/icu/icu-src/source/tools/toolutil/swapimpl.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/toolutil/swapimpl.cpp
@@ -41,6 +41,7 @@
#include "uarrsort.h"
#include "ucmndata.h"
#include "udataswp.h"
+#include "ulayout_props.h"
/* swapping implementations in common */
@@ -640,6 +641,106 @@ unorm_swap(const UDataSwapper *ds,
#endif
+// Unicode text layout properties data swapping --------------------------------
+
+static int32_t U_CALLCONV
+ulayout_swap(const UDataSwapper *ds,
+ const void *inData, int32_t length, void *outData,
+ UErrorCode *pErrorCode) {
+ // udata_swapDataHeader checks the arguments.
+ int32_t headerSize = udata_swapDataHeader(ds, inData, length, outData, pErrorCode);
+ if (pErrorCode == nullptr || U_FAILURE(*pErrorCode)) {
+ return 0;
+ }
+
+ // Check data format and format version.
+ const UDataInfo *pInfo = (const UDataInfo *)((const char *)inData + 4);
+ if (!(
+ pInfo->dataFormat[0] == ULAYOUT_FMT_0 && // dataFormat="Layo"
+ pInfo->dataFormat[1] == ULAYOUT_FMT_1 &&
+ pInfo->dataFormat[2] == ULAYOUT_FMT_2 &&
+ pInfo->dataFormat[3] == ULAYOUT_FMT_3 &&
+ pInfo->formatVersion[0] == 1)) {
+ udata_printError(ds,
+ "ulayout_swap(): data format %02x.%02x.%02x.%02x (format version %02x) "
+ "is not recognized as text layout properties data\n",
+ pInfo->dataFormat[0], pInfo->dataFormat[1],
+ pInfo->dataFormat[2], pInfo->dataFormat[3],
+ pInfo->formatVersion[0]);
+ *pErrorCode = U_UNSUPPORTED_ERROR;
+ return 0;
+ }
+
+ const uint8_t *inBytes = (const uint8_t *)inData + headerSize;
+ uint8_t *outBytes = (uint8_t *)outData + headerSize;
+
+ const int32_t *inIndexes = (const int32_t *)inBytes;
+
+ if (length >= 0) {
+ length -= headerSize;
+ if (length < 12 * 4) {
+ udata_printError(ds,
+ "ulayout_swap(): too few bytes (%d after header) for text layout properties data\n",
+ length);
+ *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR;
+ return 0;
+ }
+ }
+
+ int32_t indexesLength = udata_readInt32(ds, inIndexes[ULAYOUT_IX_INDEXES_LENGTH]);
+ if (indexesLength < 12) {
+ udata_printError(ds,
+ "ulayout_swap(): too few indexes (%d) for text layout properties data\n",
+ indexesLength);
+ *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR;
+ return 0;
+ }
+
+ // Read the data offsets before swapping anything.
+ int32_t indexes[ULAYOUT_IX_TRIES_TOP + 1];
+ for (int32_t i = ULAYOUT_IX_INPC_TRIE_TOP; i <= ULAYOUT_IX_TRIES_TOP; ++i) {
+ indexes[i] = udata_readInt32(ds, inIndexes[i]);
+ }
+ int32_t size = indexes[ULAYOUT_IX_TRIES_TOP];
+
+ if (length >= 0) {
+ if (length < size) {
+ udata_printError(ds,
+ "ulayout_swap(): too few bytes (%d after header) "
+ "for all of text layout properties data\n",
+ length);
+ *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR;
+ return 0;
+ }
+
+ // Copy the data for inaccessible bytes.
+ if (inBytes != outBytes) {
+ uprv_memcpy(outBytes, inBytes, size);
+ }
+
+ // Swap the int32_t indexes[].
+ int32_t offset = 0;
+ int32_t count = indexesLength * 4;
+ ds->swapArray32(ds, inBytes, count, outBytes, pErrorCode);
+ offset += count;
+
+ // Swap each trie.
+ for (int32_t i = ULAYOUT_IX_INPC_TRIE_TOP; i <= ULAYOUT_IX_TRIES_TOP; ++i) {
+ int32_t top = indexes[i];
+ count = top - offset;
+ U_ASSERT(count >= 0);
+ if (count >= 16) {
+ utrie_swapAnyVersion(ds, inBytes + offset, count, outBytes + offset, pErrorCode);
+ }
+ offset = top;
+ }
+
+ U_ASSERT(offset == size);
+ }
+
+ return headerSize + size;
+}
+
/* Swap 'Test' data from gentest */
static int32_t U_CALLCONV
test_swap(const UDataSwapper *ds,
@@ -731,6 +832,10 @@ static const struct {
{ { 0x4e, 0x6f, 0x72, 0x6d }, unorm_swap }, /* dataFormat="Norm" */
{ { 0x4e, 0x72, 0x6d, 0x32 }, unorm2_swap }, /* dataFormat="Nrm2" */
#endif
+
+ { { ULAYOUT_FMT_0, ULAYOUT_FMT_1, ULAYOUT_FMT_2, ULAYOUT_FMT_3 },
+ ulayout_swap }, // dataFormat="Layo"
+
#if !UCONFIG_NO_COLLATION
{ { 0x55, 0x43, 0x6f, 0x6c }, ucol_swap }, /* dataFormat="UCol" */
{ { 0x49, 0x6e, 0x76, 0x43 }, ucol_swapInverseUCA },/* dataFormat="InvC" */
diff --git a/Build/source/libs/icu/icu-src/source/tools/toolutil/toolutil.cpp b/Build/source/libs/icu/icu-src/source/tools/toolutil/toolutil.cpp
index fb7263dcfe6..a035f2326a6 100644
--- a/Build/source/libs/icu/icu-src/source/tools/toolutil/toolutil.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/toolutil/toolutil.cpp
@@ -143,7 +143,7 @@ findDirname(const char *path, char *buffer, int32_t bufLen, UErrorCode* status)
resultLen = 0;
} else {
resultPtr = path;
- resultLen = basename - path;
+ resultLen = static_cast<int32_t>(basename - path);
if(resultLen<1) {
resultLen = 1; /* '/' or '/a' -> '/' */
}
@@ -243,7 +243,7 @@ struct UToolMemory {
char name[64];
int32_t capacity, maxCapacity, size, idx;
void *array;
- UAlignedMemory staticArray[1];
+ alignas(max_align_t) char staticArray[1];
};
U_CAPI UToolMemory * U_EXPORT2
diff --git a/Build/source/libs/icu/icu-src/source/tools/toolutil/toolutil.vcxproj b/Build/source/libs/icu/icu-src/source/tools/toolutil/toolutil.vcxproj
index bf379f20789..d6ab1042e4c 100644
--- a/Build/source/libs/icu/icu-src/source/tools/toolutil/toolutil.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/toolutil/toolutil.vcxproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The following import will include the 'default' configuration options for VS projects. -->
- <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
-
<PropertyGroup Label="Globals">
<ProjectGuid>{6B231032-3CB5-4EED-9210-810D666A23A0}</ProjectGuid>
</PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <!-- The following import will include the 'default' configuration options for VS projects. -->
+ <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -34,18 +33,14 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\..\..\..\lib\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\..\..\..\lib\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir>.\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>.\$(Platform)\$(Configuration)\</IntDir>
+ <!-- The ICU projects use "Win32" to mean "x86", so we need to special case it. -->
+ <OutDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Platform)'=='Win32'">.\x86\$(Configuration)\</IntDir>
+ <!-- Disable Incremental Linking for Release builds as it prevents Link-time Code Generation -->
+ <LinkIncremental Condition="'$(Configuration)'=='Debug'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)'=='Release'">false</LinkIncremental>
</PropertyGroup>
<!-- Options that are common to *all* project configurations -->
<ItemDefinitionGroup>
@@ -54,30 +49,49 @@
<PreprocessorDefinitions>U_TOOLUTIL_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<DisableLanguageExtensions>false</DisableLanguageExtensions>
<WarningLevel>Level3</WarningLevel>
+ <CompileAs>Default</CompileAs>
</ClCompile>
</ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Midl>
- <TypeLibraryName>.\..\..\..\lib\icutu.tlb</TypeLibraryName>
- </Midl>
+ <!-- Options that are common to all 'Debug' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <BrowseInformation>true</BrowseInformation>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <!-- Options that are common to all 'Release' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
- <WholeProgramOptimization>true</WholeProgramOptimization>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>.\x86\Release/toolutil.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
- <CompileAs>Default</CompileAs>
</ClCompile>
<Link>
- <OutputFile>..\..\..\bin\icutu63.dll</OutputFile>
<AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <!-- Options that are common to all 'Win32' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Platform)'=='Win32'">
+ <ClCompile>
+ <PrecompiledHeaderOutputFile>.\x86\$(Configuration)/toolutil.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>.\x86\$(Configuration)/</AssemblerListingLocation>
+ <ObjectFileName>.\x86\$(Configuration)/</ObjectFileName>
+ <ProgramDataBaseFileName>.\x86\$(Configuration)/</ProgramDataBaseFileName>
+ </ClCompile>
+ <Link>
<AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Midl>
+ <TypeLibraryName>.\..\..\..\lib\icutu.tlb</TypeLibraryName>
+ </Midl>
+ <Link>
+ <OutputFile>..\..\..\bin\icutu65.dll</OutputFile>
<ProgramDatabaseFile>.\..\..\..\lib\icutu.pdb</ProgramDatabaseFile>
- <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- <BaseAddress>0x4ac00000</BaseAddress>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<ImportLibrary>..\..\..\lib\icutu.lib</ImportLibrary>
@@ -87,48 +101,36 @@
<Midl>
<TypeLibraryName>.\..\..\..\lib\icutud.tlb</TypeLibraryName>
</Midl>
- <ClCompile>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x86\Debug/toolutil.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x86\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
- </ClCompile>
<Link>
- <OutputFile>..\..\..\bin\icutu63d.dll</OutputFile>
- <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <OutputFile>..\..\..\bin\icutu65d.dll</OutputFile>
<ProgramDatabaseFile>.\..\..\..\lib\icutud.pdb</ProgramDatabaseFile>
- <BaseAddress>0x4ac00000</BaseAddress>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<ImportLibrary>..\..\..\lib\icutud.lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
+ <!-- Options that are common to all 'x64' project configurations -->
+ <ItemDefinitionGroup Condition="'$(Platform)'=='x64'">
+ <ClCompile>
+ <PrecompiledHeaderOutputFile>.\x64\$(Configuration)/toolutil.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>.\x64\$(Configuration)/</AssemblerListingLocation>
+ <ObjectFileName>.\x64\$(Configuration)/</ObjectFileName>
+ <ProgramDataBaseFileName>.\x64\$(Configuration)/</ProgramDataBaseFileName>
+ </ClCompile>
+ <Link>
+ <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Midl>
<TypeLibraryName>.\..\..\..\lib64\icutu.tlb</TypeLibraryName>
</Midl>
<ClCompile>
<WholeProgramOptimization>true</WholeProgramOptimization>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>.\x64\Release/toolutil.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Release/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
- <CompileAs>Default</CompileAs>
</ClCompile>
<Link>
- <OutputFile>..\..\..\bin64\icutu63.dll</OutputFile>
- <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <OutputFile>..\..\..\bin64\icutu65.dll</OutputFile>
<ProgramDatabaseFile>.\..\..\..\lib64\icutu.pdb</ProgramDatabaseFile>
- <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- <BaseAddress>0x4ac00000</BaseAddress>
<ImportLibrary>..\..\..\lib64\icutu.lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
@@ -136,22 +138,78 @@
<Midl>
<TypeLibraryName>.\..\..\..\lib64\icutud.tlb</TypeLibraryName>
</Midl>
+ <Link>
+ <OutputFile>..\..\..\bin64\icutu65d.dll</OutputFile>
+ <ProgramDatabaseFile>.\..\..\..\lib64\icutud.pdb</ProgramDatabaseFile>
+ <ImportLibrary>..\..\..\lib64\icutud.lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Platform)'=='ARM'">
+ <ClCompile>
+ <PrecompiledHeaderOutputFile>.\ARM\$(Configuration)/toolutil.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>.\ARM\$(Configuration)/</AssemblerListingLocation>
+ <ObjectFileName>.\ARM\$(Configuration)/</ObjectFileName>
+ <ProgramDataBaseFileName>.\ARM\$(Configuration)/</ProgramDataBaseFileName>
+ </ClCompile>
+ <Link>
+ <AdditionalLibraryDirectories>.\..\..\..\libARM;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <Midl>
+ <TypeLibraryName>..\..\..\libARM\icutu.tlb</TypeLibraryName>
+ </Midl>
+ <Link>
+ <OutputFile>..\..\..\binARM\icutu65.dll</OutputFile>
+ <ProgramDatabaseFile>.\..\..\..\libARM\icutu.pdb</ProgramDatabaseFile>
+ <ImportLibrary>..\..\..\libARM\icutu.lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <Midl>
+ <TypeLibraryName>.\..\..\..\libARM\icutud.tlb</TypeLibraryName>
+ </Midl>
<ClCompile>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeaderOutputFile>.\x64\Debug/toolutil.pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
- <ObjectFileName>.\x64\Debug/</ObjectFileName>
- <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <CompileAs>Default</CompileAs>
</ClCompile>
<Link>
- <OutputFile>..\..\..\bin64\icutu63d.dll</OutputFile>
- <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <ProgramDatabaseFile>.\..\..\..\lib64\icutud.pdb</ProgramDatabaseFile>
- <BaseAddress>0x4ac00000</BaseAddress>
- <ImportLibrary>..\..\..\lib64\icutud.lib</ImportLibrary>
+ <OutputFile>..\..\..\binARM\icutu65d.dll</OutputFile>
+ <ProgramDatabaseFile>.\..\..\..\libARM\icutud.pdb</ProgramDatabaseFile>
+ <ImportLibrary>..\..\..\libARM\icutud.lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Platform)'=='ARM64'">
+ <ClCompile>
+ <PrecompiledHeaderOutputFile>.\ARM64\$(Configuration)/toolutil.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>.\ARM64\$(Configuration)/</AssemblerListingLocation>
+ <ObjectFileName>.\ARM64\$(Configuration)/</ObjectFileName>
+ <ProgramDataBaseFileName>.\ARM64\$(Configuration)/</ProgramDataBaseFileName>
+ </ClCompile>
+ <Link>
+ <AdditionalLibraryDirectories>.\..\..\..\libARM64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <Midl>
+ <TypeLibraryName>.\..\..\..\libARM64\icutu.tlb</TypeLibraryName>
+ </Midl>
+ <Link>
+ <OutputFile>..\..\..\binARM64\icutu65.dll</OutputFile>
+ <ProgramDatabaseFile>.\..\..\..\libARM64\icutu.pdb</ProgramDatabaseFile>
+ <ImportLibrary>..\..\..\libARM64\icutu.lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <Midl>
+ <TypeLibraryName>.\..\..\..\libARM64\icutud.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>..\..\..\binARM64\icutu65d.dll</OutputFile>
+ <ProgramDatabaseFile>.\..\..\..\libARM64\icutud.pdb</ProgramDatabaseFile>
+ <ImportLibrary>..\..\..\libARM64\icutud.lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/Build/source/libs/icu/icu-src/source/tools/toolutil/ucbuf.cpp b/Build/source/libs/icu/icu-src/source/tools/toolutil/ucbuf.cpp
index fa9edd15702..d1d4043dd4a 100644
--- a/Build/source/libs/icu/icu-src/source/tools/toolutil/ucbuf.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/toolutil/ucbuf.cpp
@@ -178,7 +178,7 @@ ucbuf_fillucbuf( UCHARBUF* buf,UErrorCode* error){
memmove(buf->buffer,buf->currentPos,offset* sizeof(UChar));
}
-#if UCBUF_DEBUG
+#ifdef UCBUF_DEBUG
memset(pTarget+offset,0xff,sizeof(UChar)*(MAX_IN_BUF-offset));
#endif
if(buf->isBuffered){
@@ -295,7 +295,7 @@ ucbuf_fillucbuf( UCHARBUF* buf,UErrorCode* error){
}
outputWritten = (int32_t)(target - pTarget);
-#if UCBUF_DEBUG
+#ifdef UCBUF_DEBUG
{
int i;
target = pTarget;
diff --git a/Build/source/libs/icu/icu-src/source/tools/toolutil/ucbuf.h b/Build/source/libs/icu/icu-src/source/tools/toolutil/ucbuf.h
index 81f8ba66333..116da37e9bc 100644
--- a/Build/source/libs/icu/icu-src/source/tools/toolutil/ucbuf.h
+++ b/Build/source/libs/icu/icu-src/source/tools/toolutil/ucbuf.h
@@ -32,11 +32,11 @@ typedef struct UCHARBUF UCHARBUF;
/**
* End of file value
*/
-#define U_EOF 0xFFFFFFFF
+#define U_EOF ((int32_t)0xFFFFFFFF)
/**
* Error value if a sequence cannot be unescaped
*/
-#define U_ERR 0xFFFFFFFE
+#define U_ERR ((int32_t)0xFFFFFFFE)
typedef struct ULine ULine;
diff --git a/Build/source/libs/icu/icu-src/source/tools/toolutil/ucmstate.cpp b/Build/source/libs/icu/icu-src/source/tools/toolutil/ucmstate.cpp
index fd461c20da9..ed1afb918eb 100644
--- a/Build/source/libs/icu/icu-src/source/tools/toolutil/ucmstate.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/toolutil/ucmstate.cpp
@@ -653,7 +653,8 @@ compactToUnicode2(UCMStates *states,
/* for each lead byte */
for(i=0; i<256; ++i) {
entry=states->stateTable[leadState][i];
- if(MBCS_ENTRY_IS_TRANSITION(entry) && (MBCS_ENTRY_TRANSITION_STATE(entry))==trailState) {
+ if(MBCS_ENTRY_IS_TRANSITION(entry) &&
+ (MBCS_ENTRY_TRANSITION_STATE(entry))==static_cast<uint32_t>(trailState)) {
/* the offset is different for each lead byte */
offset=MBCS_ENTRY_TRANSITION_OFFSET(entry);
/* for each trail byte for this lead byte */
diff --git a/Build/source/libs/icu/icu-src/source/tools/toolutil/xmlparser.cpp b/Build/source/libs/icu/icu-src/source/tools/toolutil/xmlparser.cpp
index 1ca111c0756..a9650cc5999 100644
--- a/Build/source/libs/icu/icu-src/source/tools/toolutil/xmlparser.cpp
+++ b/Build/source/libs/icu/icu-src/source/tools/toolutil/xmlparser.cpp
@@ -313,7 +313,7 @@ UXMLParser::parseFile(const char *filename, UErrorCode &errorCode) {
// reached end of file, convert once more to flush the converter
flush=TRUE;
}
- };
+ }
exit:
ucnv_close(cnv);
diff --git a/Build/source/libs/icu/icu-src/source/tools/tzcode/Makefile.in b/Build/source/libs/icu/icu-src/source/tools/tzcode/Makefile.in
index 63c9230086e..80139f79930 100644
--- a/Build/source/libs/icu/icu-src/source/tools/tzcode/Makefile.in
+++ b/Build/source/libs/icu/icu-src/source/tools/tzcode/Makefile.in
@@ -18,6 +18,28 @@ ifeq ($(TZCODE),)
TZCODE = $(firstword $(wildcard ./tzcode*.tar.gz) $(wildcard $(srcdir)/tzcode*.tar.gz))
endif
+
+PRIMARY_YDATA= africa antarctica asia australasia \
+ europe northamerica southamerica
+YDATA= $(PRIMARY_YDATA) pacificnew etcetera factory backward
+NDATA= systemv
+SDATA= solar87 solar88 solar89
+#TDATA= $(YDATA) $(NDATA) $(SDATA)
+TDATA= $(YDATA) $(NDATA)
+YEARISTYPE= ./yearistype
+
+TZDIR=zoneinfo
+
+CFLAGS+=-D_POSIX_C_SOURCE
+CPPFLAGS+= -DTZDIR=\"$(TZDIR)\"
+
+# more data
+XDATA=zone.tab yearistype.sh leapseconds iso3166.tab
+ICUDATA=ZoneMetaData.java icu_zone.txt tz2icu zoneinfo64.txt zoneinfo.txt
+
+VANGUARD_DIR= ./vanguard
+
+# For TZ DB/ICU comparison
TZORIG=./tzorig
TZORIG_TZDIR=./tzorig/tzdir
TZORIG_ABS := $(shell pwd)/tzorig
@@ -70,6 +92,10 @@ tzorig: $(TZCODE) $(TZDATA)
mkdir $(TZORIG_TZDIR)
gunzip -d < $(TZDATA) | ( cd $@ ; tar xf - )
gunzip -d < $(TZCODE) | ( cd $@ ; tar xf - )
+ for tzfile in $(TDATA) ; do \
+ mv $(TZORIG)/$$tzfile $(TZORIG)/$$tzfile.bak && \
+ awk -v DATAFORM=rearguard -f $(TZORIG)/ziguard.awk $(TZORIG)/$$tzfile.bak > $(TZORIG)/$$tzfile; \
+ done
-mv $(TZORIG)/zdump.c $(TZORIG)/zdump.c.orig
cp $(srcdir)/zdump.c $(TZORIG)/zdump.c
-mv $(TZORIG)/factory $(TZORIG)/factory.orig
@@ -103,24 +129,6 @@ $(ICUZDUMPOUT): $(ICUZDUMPEXEC)
#
-PRIMARY_YDATA= africa antarctica asia australasia \
- europe northamerica southamerica
-YDATA= $(PRIMARY_YDATA) pacificnew etcetera factory backward
-NDATA= systemv
-SDATA= solar87 solar88 solar89
-#TDATA= $(YDATA) $(NDATA) $(SDATA)
-TDATA= $(YDATA) $(NDATA)
-YEARISTYPE= ./yearistype
-
-TZDIR=zoneinfo
-
-CFLAGS+=-D_POSIX_C_SOURCE
-CPPFLAGS+= -DTZDIR=\"$(TZDIR)\"
-
-# more data
-XDATA=zone.tab yearistype.sh leapseconds iso3166.tab
-ICUDATA=ZoneMetaData.java icu_zone.txt tz2icu zoneinfo64.txt zoneinfo.txt
-
$(ZICTARG): $(OBJECTS) $(TDATA) yearistype $(srcdir)/tz2icu.h
$(CC) $(CFLAGS) $(TZORIG_EXTRA_CFLAGS) $(LFLAGS) -I$(srcdir) $(OBJECTS) $(LDLIBS) -o $@
@@ -134,7 +142,12 @@ $(ICUZDUMPTARG): $(srcdir)/icuzdump.cpp
$(TDATA): tdatamarker
tdatamarker: $(TZDATA)
+ mkdir $(VANGUARD_DIR)
gunzip -d < $(TZDATA) | tar xf - --exclude=Makefile
+ for tzfile in $(TDATA) ; do \
+ mv $$tzfile $(VANGUARD_DIR)/$$tzfile && \
+ awk -v DATAFORM=rearguard -f ziguard.awk $(VANGUARD_DIR)/$$tzfile > $$tzfile; \
+ done
touch $@
yearistype: yearistype.sh
@@ -154,10 +167,11 @@ clean:
@echo ICU specific cleanup:
-rm -f $(ICUDATA)
-rm -rf $(TZDIR)
+ -rm -rf $(VANGUARD_DIR)
-$(RMV) $(ICUZDUMPTARG) tzorig ./zdumpout/ ./icuzdumpout/
ifneq ($(TZDATA),)
-rm -rf `gunzip -d < $(TZDATA) | tar tf - --exclude=Makefile | grep -o '[^ ]*$$' | tr '\n' ' '`
- -rm tdatamarker
+ -rm -f tdatamarker
endif
checkclean:
diff --git a/Build/source/libs/icu/icu-src/source/tools/tzcode/icuzdump.vcxproj b/Build/source/libs/icu/icu-src/source/tools/tzcode/icuzdump.vcxproj
index 15c9432a6cb..4f7b96fc291 100644
--- a/Build/source/libs/icu/icu-src/source/tools/tzcode/icuzdump.vcxproj
+++ b/Build/source/libs/icu/icu-src/source/tools/tzcode/icuzdump.vcxproj
@@ -77,7 +77,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\x86\Debug/icuzdump.pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>NotSet</TargetMachine>
@@ -97,7 +96,6 @@
<SubSystem>Console</SubSystem>
<OptimizeReferences>true</OptimizeReferences>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
- <RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
diff --git a/Build/source/libs/icu/icu-src/source/tools/tzcode/icuzones b/Build/source/libs/icu/icu-src/source/tools/tzcode/icuzones
index c1ded7ba3ed..77cf71945b5 100644
--- a/Build/source/libs/icu/icu-src/source/tools/tzcode/icuzones
+++ b/Build/source/libs/icu/icu-src/source/tools/tzcode/icuzones
@@ -77,101 +77,3 @@ Link Asia/Ho_Chi_Minh VST
# ICU may also remove these aliases.
#
Link America/Regina Canada/East-Saskatchewan # removed from backward in 2017c
-
-
-# Note:
-# Following section was added for tz database 2018a and 2018b.
-# ICU has a bug handling negative DST, and we also don't want to
-# flip sumer time name and winter time name for Dublin at least for
-# now. Because the change had major impacts to tz database external
-# consumers, the tz database maintainer once reverted the Europe/Dublin
-# rules (same as 2017c or older) in 2018c. The tz database maintainer
-# thinks the changes in 2018a should be brought back when external
-# tz database consumers are ready to adopt the change. We don't know
-# what CLDR TC want to do with this for now. But if tz database brings
-# back the change, and CLDR TC (and ICU TC) want to keep the display name
-# unchanged, then we can uncomment the block below to restore ICU
-# custom override. (Yoshito 2018-01-23)
-
-#
-# tzdata2018a changed Europe/Dublin to use IST (UTC+1) as the standard time
-# of the region, and GMT (UTC) as the daylight saving time with negative
-# offset (-1 hour) in winter. ICU SimpleTimeZone rejects a zone with negative
-# daylight saving time offset. We could remove the restriction in newer version
-# of ICU, but such data does not work well with older ICU runtime without
-# fixing the issue. For now, we define our own Europe/Dubin in ICU, replacing
-# Europe/Dublin data from the tz database.
-#
-
-#
-# tzdata2018e suggests to use alternative zone definitions for use GB-Eire
-# and EU rule after Oct 27, 1968. (Yoshito 2018-05-04)
-#
-
-# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Europe/Dublin--ICU -0:25:00 - LMT 1880 Aug 2
- -0:25:21 - DMT 1916 May 21 2:00s
- -0:25:21 1:00 IST 1916 Oct 1 2:00s
- 0:00 GB-Eire %s 1921 Dec 6 # independence
- 0:00 GB-Eire GMT/IST 1940 Feb 25 2:00s
- 0:00 1:00 IST 1946 Oct 6 2:00s
- 0:00 - GMT 1947 Mar 16 2:00s
- 0:00 1:00 IST 1947 Nov 2 2:00s
- 0:00 - GMT 1948 Apr 18 2:00s
- 0:00 GB-Eire GMT/IST 1968 Oct 27
-# The next line is for when negative SAVE values are used.
-# 1:00 Eire IST/GMT
-# These three lines are for when SAVE values are always nonnegative.
- 1:00 - IST 1971 Oct 31 2:00u
- 0:00 GB-Eire GMT/IST 1996
- 0:00 EU GMT/IST
-
-Link Europe/Dublin--ICU Eire--ICU
-
-
-#
-# tzdata2018e also added another instance of negative DST to
-# Europe/Prague and Africa/Windhoek
-#
-# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Europe/Prague--ICU 0:57:44 - LMT 1850
- 0:57:44 - PMT 1891 Oct # Prague Mean Time
- 1:00 C-Eur CE%sT 1945 May 9
- 1:00 Czech CE%sT 1946 Dec 1 3:00
-# Vanguard section, for zic and other parsers that support negative DST.
-# 1:00 -1:00 GMT 1947 Feb 23 2:00
-# Rearguard section, for parsers that do not support negative DST.
- 0:00 - GMT 1947 Feb 23 2:00
-# End of rearguard section.
- 1:00 Czech CE%sT 1979
- 1:00 EU CE%sT
-
-# Slovakia
-Link Europe/Prague--ICU Europe/Bratislava--ICU
-
-# RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-# Vanguard section, for zic and other parsers that support negative DST.
-#Rule Namibia 1994 only - Mar 21 0:00 -1:00 WAT
-#Rule Namibia 1994 2017 - Sep Sun>=1 2:00 0 CAT
-#Rule Namibia 1995 2017 - Apr Sun>=1 2:00 -1:00 WAT
-# Rearguard section, for parsers that do not support negative DST.
-Rule Namibia--ICU 1994 only - Mar 21 0:00 0 WAT
-Rule Namibia--ICU 1994 2017 - Sep Sun>=1 2:00 1:00 CAT
-Rule Namibia--ICU 1995 2017 - Apr Sun>=1 2:00 0 WAT
-
-# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Africa/Windhoek--ICU 1:08:24 - LMT 1892 Feb 8
- 1:30 - +0130 1903 Mar
- 2:00 - SAST 1942 Sep 20 2:00
- 2:00 1:00 SAST 1943 Mar 21 2:00
- 2:00 - SAST 1990 Mar 21 # independence
-# Vanguard section, for zic and other parsers that support negative DST.
-# 2:00 Namibia %s
-# Rearguard section, for parsers that do not support negative DST.
- 2:00 - CAT 1994 Mar 21 0:00
-# From Paul Eggert (2017-04-07):
-# The official date of the 2017 rule change was 2017-10-24. See:
-# http://www.lac.org.na/laws/annoSTAT/Namibian%20Time%20Act%209%20of%202017.pdf
- 1:00 Namibia--ICU %s 2017 Oct 24
- 2:00 - CAT
-# End of rearguard section.